cpu制作
cpu的制作
cpu制作在最开始听起来是一个非常复杂的项目,但其实其所需要的基础非常简单,只需要一些简单的数字电路基础即可完成搭建。
而且自己制作cpu是一件非常有趣的一件事情,去理解身边的电脑,手机等等的一些运作的底层原理。
那么现在,我们就从最开始最简单的电路开始搭建吧。
电路搭建
与或非门,同或异或门
与或非是计算机逻辑门的最基础的部件,其他任意的部件都可以通过与或非三种门来表示。
八位加法器
1 | module eight_bit_full_adder ( |
锁存器
与门可以存储下来0,或门可以存储下来1,我们把与门和或门进行一个组合,就能做出来第一个有用的电路结构。
引脚 | 解释 |
---|---|
Dindatain | 数据输入 |
WE | write enable |
当WE为高电平的时候,Din的数据可以被存储起来当WE为低电平的时候,out的值不发生变化。
1 | module latch ( |
寄存器
寄存器=8位锁存器/16/32位
一次可以存储8位数据。
引脚 | 解释 |
---|---|
Dindatain | 数据输入 |
WE | write enable |
当WE为高电平的时候,Din的数据可以被存储起来当WE为低电平的时候,out的值不发生变化。
带边缘触发的锁存器
为什么需要时钟
大家都见过划船的,划船需要一个喊口号的主要原因是为了保证协调。通过喊口号,船员们可以同步动作,确保船在平稳且有效率地前进。
CPU需要clock来同步内部操作,如执行指令、进行数据传输等。Clock提供了精确的时间控制,确保每个内部操作在正确的顺序与速度内执行,从而确保CPU的正常工作。另外,Clock还与CPU的频率相关,通过控制Clock频率,可以控制CPU的速度。
时钟信号是什么
时钟信号就是周期性的高低电平变化的信号
我们可以用两个普通的寄存器加上一个非门,组成一个带有边缘触发的寄存器。
在按钮按下的一瞬间,电压从低电平到高电平的一瞬间,Din的数据被存储起来。
寄存器REG
引脚 | 解释 | |
---|---|---|
D | 数据输入 | |
C | 时钟信号 | |
en | 使能端口,高电平工作 |
存储器-寄存器
可以做的扩展,增加输入使能WE和输出使能OE
寄存器访问速度快,因为寄存器的每一条数据线都是直接接出来的。
十六位的内存
内存地址:从并行到串行
内存单元格要自己自己在哪一行和哪一列,需要有row和column
内存单元要有ld(load)读的控制
内存单元要有str(store)有存的控制
内存单元要有数据的输入
引脚 | 解释 |
---|---|
row&column | 确定需要储存的地址 |
ld(load) | 读的控制 |
str(store) | 存的控制 |
内存地址:从并行到串行
内存地址的作用主要是为了节省数据线,简化电路数量有了内存地址的概念后,输入和输出只需要1条数据线了先选中需要读写的内存单元,再输入输出
8位的寄存器
设计8位(bit)的寄存器,用于CPU存储的临时计算的数据
1 | module DIG_Register_BUS #( |
基于上面的原理图,我们分别设计4位和8位的寄存器4位的寄存器用于程序计数器(PC)和MAR(内存地址寄存器)
8位的寄存器用于指令寄存器(IR),CPU通用临时寄存器(RegA)(RegB),内存缓存寄存器(MBR)等。分别测试4位和8位的寄存器。
逻辑和算数运算单元(ALU)
引脚 | 解释 |
---|---|
RegA | 8位的寄存器数据 |
RegB | 8位的寄存器数据 |
OE | 输出允许 |
ALUResult | ALU内部计算结果,方便观察调试 |
Carry | 溢出位引出1位信号线 |
Dout | 输出数据8位,默认高阻态 |
1 | * module DIG_Add |