本文主要是介绍24 - 取指令微程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
---- 整理自B站UP主 踌躇月光 的视频
1. CPU 电路
2. 实验
2.1 目标
将 RAM 中 0 地址、1 地址、2 地址中的数据分别取出放入 IR、DST、SRC 三个寄存器中
2.2 指令设计
// pin.pyMSR = 1
MAR = 2
MDR = 3
RAM = 4
IR = 5
DST = 6
SRC = 7
A = 8
B = 9
C = 10
D = 11
DI = 12
SI = 13
SP = 14
BP = 15
CS = 16
DS = 17
SS = 18
ES = 19
VEC = 20
T1 = 21
T2 = 22MSR_OUT = MSR
MAR_OUT = MAR
MDR_OUT = MDR
RAM_OUT = RAM
IR_OUT = IR
DST_OUT = DST
SRC_OUT = SRC
A_OUT = A
B_OUT = B
C_OUT = C
D_OUT = D
DI_OUT = DI
SI_OUT = SI
SP_OUT = SP
BP_OUT = BP
CS_OUT = CS
DS_OUT = DS
SS_OUT = SS
ES_OUT = ES
VEC_OUT = VEC
T1_OUT = T1
T2_OUT = T2_DST_SHIFT = 5MSR_IN = MSR << _DST_SHIFT
MAR_IN = MAR << _DST_SHIFT
MDR_IN = MDR << _DST_SHIFT
RAM_IN = RAM << _DST_SHIFT
IR_IN = IR << _DST_SHIFT
DST_IN = DST << _DST_SHIFT
SRC_IN = SRC << _DST_SHIFT
A_IN = A << _DST_SHIFT
B_IN = B << _DST_SHIFT
C_IN = C << _DST_SHIFT
D_IN = D << _DST_SHIFT
DI_IN = DI << _DST_SHIFT
SI_IN = SI << _DST_SHIFT
SP_IN = SP << _DST_SHIFT
BP_IN = BP << _DST_SHIFT
CS_IN = CS << _DST_SHIFT
DS_IN = DS << _DST_SHIFT
SS_IN = SS << _DST_SHIFT
ES_IN = ES << _DST_SHIFT
VEC_IN = VEC << _DST_SHIFT
T1_IN = T1 << _DST_SHIFT
T2_IN = T2 << _DST_SHIFTSRC_R = 2 ** 10
SRC_W = 2 ** 11
DST_R = 2 ** 12
DST_W = 2 ** 13PC_WE = 2 ** 14
PC_CS = 2 ** 15
PC_EN = 2 ** 16PC_OUT = PC_CS
PC_IN = PC_CS | PC_WE
PC_INC = PC_CS | PC_WE | PC_ENHLT = 2 ** 31
// assembly.py
import pinFETCH = [pin.PC_OUT | pin.MAR_IN,pin.RAM_OUT | pin.IR_IN | pin.PC_INC,pin.PC_OUT | pin.MAR_IN,pin.RAM_OUT | pin.DST_IN | pin.PC_INC,pin.PC_OUT | pin.MAR_IN,pin.RAM_OUT | pin.SRC_IN | pin.PC_INC,
]
import os
import pin
import assembly as ASMdirname = os.path.dirname(__file__)
filename = os.path.join(dirname, 'micro.bin')micro = [pin.HLT for _ in range(0x10000)]for addr in range(0x10000):ir = addr >> 8psw = (addr >> 4) & 0xfcyc = addr & 0xfif cyc < len(ASM.FETCH):micro[addr] = ASM.FETCH[cyc]with open(filename, 'wb') as file:for var in micro:value = var.to_bytes(4, byteorder='little')file.write(value)print('Compile micro instruction finish!!!')
2.3 指令讲解
FETCH = [pin.PC_OUT | pin.MAR_IN,pin.RAM_OUT | pin.IR_IN | pin.PC_INC,pin.PC_OUT | pin.MAR_IN,pin.RAM_OUT | pin.DST_IN | pin.PC_INC,pin.PC_OUT | pin.MAR_IN,pin.RAM_OUT | pin.SRC_IN | pin.PC_INC,
]
2.3.1 第 1 条指令分析
- 一共有 6 条微指令,这里的示例图解是第一条指令:
-
- ROM 中存放程序,地址 16 位,高 8 位代表指令,中间 4 位代表 PSW,后 4 位代表微程序的周期,即
|指令 IR 8 位 | PSW | 微程序周期 |
- ROM 中存放程序,地址 16 位,高 8 位代表指令,中间 4 位代表 PSW,后 4 位代表微程序的周期,即
-
- pin.PC_OUT | pin.MAR_IN ==> 0x0000 8040
-
- 根据图中红色箭头方向
-
- 控制单元,即图中 CONTROL UNIT 的 PC 输出2,二进制 10,对应 PC 寄存器的 IO 为 2,也就是将 PC 寄存器内的数据通过 DO 输出,此时 PC 寄存器的内容是 0。
-
- 控制单元,即图中 CONTROL UNIT 的 MAR 输出 3,二进制 11,对应 MAR 寄存器的 IO 为 3,也就是将 MAR 寄存器上的 DI 输入存入寄存器内部,此时 MAR 的 DI 为 PC 寄存器的输出 DO。
- 第一条指令之后的结果:
2.3.2 后续指令分析
分析过程和第一条相同,这里只给出每一条指令之后的结果。
2.4 实验工程
【24 - 取指令微程序】
这篇关于24 - 取指令微程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!