8位寄存器
- WE : Write Enable 写入使能 (1 bit)
- OE : Output Enable 输出使能 (1 bit)
- Din : Data in 数据输入 (8 bit)
- clock : 时钟
- Dout : Data out 数据输出 (8 bit)
- Stored data : 方便调试使用,实际上是没有的 (8 bit)
- 驱动器 : 相当于一个继电器开关 (8 bit)
4位寄存器
与8位寄存器完全一致,只需要将Din、Dout、Stored data和驱动器改为4位即可
ALU模块
下面搭建的是只含加法的ALU模块
- RegA : 操作数1 (8位)
- RegB : 操作数2 (8位)
- OE : Output Enable 输出使能 (1 bit)
- Dout : Data out 数据输输出 (8 bit)
- carry : carray (1 bit)
- ALU Result : 方便调试使用,实际上是没有的 (8 bit)
- 驱动器 : 相当于一个继电器开关 (8 bit)
CPU总架构
下图是一个CPU的简易架构图
手动计算
自动计算
将所有元件的WE和OE引脚全部(共17个引脚)通过隧道连接到一个17位的查找表中,按排列顺序依次点亮某一个引脚,并把点亮引脚的固定操作值存放在查找表中,其中由于每条指令的操作步骤次数不一样,为了保证相同的时钟周期,不足4个步骤的全部使用空操作补齐。而后接入时钟输入设置位10HZ代表时钟输入1s变换10次,统一控制所有元件的时钟频率。
执行过程
取指阶段
- 把PC(程序位置计数器)的值放入MAR(内存地址寄存器)
- PC的值加1,指向吓一条程序指令
- 把MAR地址指向的内存中的数据取出来(4位操作码+4位操作数)放入MBR(内存缓存寄存器)
- 把MBR中的数据放入IR(指令寄存器)
具体实操过程如下(每一步都需要拍一下clock):
- 清除全部状态,打开PC的OE,打开MAR的WE
- 清除全部状态,打开PC的EN
- 清除全部状态,打开MAR的OE,打开内存的OE,打开MBR的WE
- 清除全部状态,打开MBR的OE,打开IR的WE
译码和执行
OPCODE为0000,意味着MOVE_A把内存地址的值放入A寄存器
- 清除全部状态,打开IR的OE,打开MAR的WE
- 清除全部状态,打开MAR的OE,打开内存的OE,打开MBR的WE
- 清除全部状态,打开MBR的OE,打开RegA的WE
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 生活中的tree!