---- 整理自B站UP主 踌躇月光 的视频
1. 实验目标
- 将 RAM 中 0 地址内容和 1 地址内容相加,结果存入 2 地址。
-
- 需要从 RAM 读取数据
-
- 需要寄存器暂存数据
-
- 需要从 ROM 中读取控制程序
-
- 3 + 4 => 7
2. 实验过程
【17 - 微程序控制】
2.1 改造 ALU
2.2 程序计数器 PC
- 对应修改使用 ALU 实现的程序计数器 PC
2.3 实现电路总览
2.3.1 第 0 步:控制程序实现
- 通过读取 ROM 的数据实现对几个寄存器和 PC 计数器以及内存 RAM 的控制。
-
- 通过手动开关 MAN 和点击 脉冲信号 PUL 的方式,给电路上电 POW,CLOCK 信号给每个器件提供时钟信号
-
- 实现电路中的红色矩形框中的 PC 计数器,初始状态为 0,从 ROM 的 0 地址读取出的内容,实际上就是上面几个器件的控制指令的集合,即通过不同 bit 位的组合来控制上述的器件
-
- 在时钟的下降沿,红色框内的 PC 计数器完成一次加一计数,输出变为 1,从 ROM 的 1 地址读取出下一个指令集合进行下一次控制操作
-
- 依次类推
-
- 这里先给出 ROM 中存储的内容的实现。
import os
dirname = os.path.dirname(__file__)
filename = os.path.join(dirname, 'ins.bin')
WE_A = 2 ** 0 # 寄存器A的WE,使能为1
CS_A = 2 ** 1 # 寄存器A的CS,使能为1
WE_B = 2 ** 2 # 同理
CS_B = 2 ** 3
WE_C = 2 ** 4 # 同理
CS_C = 2 ** 5
ALU_ADD = 0
ALU_SUB = 2 ** 6
ALU_OUT = 2 ** 7
WE_M = 2 ** 8
CS_M = 2 ** 9
WE_PC = 2 ** 10
EN_PC = 2 ** 11
CS_PC = 2 ** 12
HLT = 2 ** 15
micro = [
CS_M | CS_A | WE_A | WE_PC | EN_PC | CS_PC, # 内存中值移到寄存器A,同时PC加一
CS_M | CS_B | WE_B | WE_PC | EN_PC | CS_PC, # 内存中值移到寄存器B,同时PC加一
ALU_OUT | CS_C | WE_C,
CS_C | WE_M | CS_M | WE_PC | EN_PC | CS_PC,
HLT,
]
with open(filename, 'wb') as file:
for value in micro:
result = value.to_bytes(2, byteorder='little')
file.write(result)
print(value, result)
print('Finish complete!!!')
2.3.2 第 1 步:0 地址内容指令的目的
0 地址的内容为 0x1E03,对应的二进制为 0001 1110 0000 0011,对应到上图中的 15~0 位的控制端,就是对相应的器件的控制。
由上图可知,初始状态 PC 计数器的值为 0,与其相连的内存 RAM 中的 0 地址的数据内容,在第一个时钟上升沿被写入到寄存器 A,同时 PC 计数器加一。
2.3.3 第 2 步:1 地址内容指令的目的
这里不再贴出图片,可自行通过工程文件进行查看。1 地址指令的目的是:将内存 RAM 中的 1 地址数据读出后写入到寄存器 B 中。
2.3.4 第 3 步:2 地址内容指令的目的
将 ALU 中相加得到的结果写入到寄存器 C 中。
2.3.5 第 4 步:3 地址内容指令的目的
寄存器 C 中的内容写入到内存 RAM 中的 3 地址处。
2.3.5 第 5 步:4 地址内容指令的目的
进入 HLT 。