---- 整理自B站UP主 踌躇月光 的视频
1. 程序计数器 PC 改造
- 原来的 PC
- 由于后续的 ALU 会较频繁的变动,因而会经常修改 PC,所以将 PC 中的 ALU 换成 8 位加法器。改造后的 PC:
2. 寄存器控制器的实现
我们控制器主要通过 ROM 实现,ROM 最多支持输出 32 位,也就是最多可以控制 32 个端,但我们有时需要两位来控制一个寄存器,寄存器的数量比较多,32 位肯定不够用。
2.1 准备
我们分别用 5 位来控制寄存器的读和写。
2.1.1 532译码器
用 ROM 实现 5 到 32 位的译码器。一根总线,我们同时只能有一个读或者一个写。避免同一个寄存器既读又写。
import os
dirname = os.path.dirname(__file__)
filename = os.path.join(dirname, '532decoder.bin')
with open(filename, 'wb') as file:
for var in range(32):
value = 1 << var
result = value.to_bytes(4, byteorder='little')
file.write(result)
# 0 - 0000 0000 0000 0000 0000 0000 0000 0001
# 1 - 0000 0000 0000 0000 0000 0000 0000 0010
# ...
# 31 - 1000 0000 0000 0000 0000 0000 0000 0000
2.1.2 32 位异或
2.2 实现
寄存器说明: |
---|
PC 程序计数器 |
ALU |
PSW/FLAG 程序状态字 |
A 寄存器 |
B 寄存器 |
C 寄存器 |
D 寄存器 |
IR 指令寄存器 |
DST 目的操作数寄存器 |
SRC 目的操作数寄存器 |
MSR 存储器段寄存器 |
MAR 存储器地址寄存器 |
MDR 存储器数据寄存器 |
MC 内存寄存器 |
SP 堆栈指针寄存器 |
BP 基址寄存器 |
SI 源变址寄存器 |
DI 目的变址寄存器 |
CS 代码段寄存器 |
DS 数据段寄存器 |
SS 堆栈段寄存器 |
ES 附加段寄存器 |
T1 临时寄存器 |
T2 临时寄存器 |