取程序微指令, 完成
commit
f99fe9e7b2
@ -0,0 +1,17 @@
|
|||||||
|
import pin
|
||||||
|
|
||||||
|
|
||||||
|
FETCH = [
|
||||||
|
# 把 pc(当前是0) 的值 输出到偏移地址寄存器中,
|
||||||
|
pin.PC_OUT | pin.MAR_IN,
|
||||||
|
# 内存根据上方修改后的偏移地址寄存器找到数据输出到总线上, IR 写入, 给PC 增加1
|
||||||
|
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,
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
print(FETCH)
|
@ -0,0 +1,64 @@
|
|||||||
|
|
||||||
|
from assembly import FETCH
|
||||||
|
import pin
|
||||||
|
|
||||||
|
META_DATA = "v3.0 hex words addressed\n"
|
||||||
|
|
||||||
|
def chunk(l, n):
|
||||||
|
for i in range(0, len(l), n):
|
||||||
|
yield l[i:i + n]
|
||||||
|
|
||||||
|
def get_hex_str(codes, width):
|
||||||
|
width = int(width)
|
||||||
|
data = []
|
||||||
|
for _code in codes:
|
||||||
|
hex_str = hex(_code)[2:]
|
||||||
|
zero_str = ""
|
||||||
|
for _ in range(width - len(hex_str)):
|
||||||
|
zero_str += "0"
|
||||||
|
data.append(zero_str + hex_str)
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
def save_hex_str(hex_str_lis, chunk_count: int):
|
||||||
|
lines = []
|
||||||
|
for line in chunk(hex_str_lis, chunk_count):
|
||||||
|
print(line)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
data_width = 32
|
||||||
|
addr_width = 16
|
||||||
|
|
||||||
|
# 我们现在只支持16个指令
|
||||||
|
code_hex_str = get_hex_str(FETCH, data_width / 4)
|
||||||
|
base_bin_data = get_hex_str([pin.HLT for _ in range(1 << addr_width)], data_width / 4)
|
||||||
|
for addr in range(1 << addr_width):
|
||||||
|
ir = addr >> 8
|
||||||
|
psw = (addr >> 4) & 0xf
|
||||||
|
cyc = addr & 0xf
|
||||||
|
if cyc < len(code_hex_str):
|
||||||
|
base_bin_data[addr] = code_hex_str[cyc]
|
||||||
|
|
||||||
|
# 写入数据到 bin文件
|
||||||
|
addr_chunk = int(64 / (32 / 4)) # bin文件每行有多少个数据
|
||||||
|
lines = [META_DATA, ]
|
||||||
|
idx = 0
|
||||||
|
for slice in chunk(base_bin_data, addr_chunk):
|
||||||
|
hex_idx_str = hex(idx)[2:]
|
||||||
|
zero_str = ""
|
||||||
|
for _ in range(4 - len(hex_idx_str)):
|
||||||
|
zero_str += "0"
|
||||||
|
hex_idx_str = zero_str + hex_idx_str
|
||||||
|
line = f"{hex_idx_str}:"
|
||||||
|
|
||||||
|
for _ in slice:
|
||||||
|
line += f" {_}"
|
||||||
|
line += "\n"
|
||||||
|
lines.append(line)
|
||||||
|
|
||||||
|
idx += addr_chunk # 下一行的地址
|
||||||
|
with open("./ROM.bin", "w") as f:
|
||||||
|
f.writelines(lines)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,92 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
MSR = 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 = 22
|
||||||
|
|
||||||
|
MSR_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 = 5
|
||||||
|
|
||||||
|
|
||||||
|
MSR_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_SHIFT
|
||||||
|
|
||||||
|
|
||||||
|
SRC_R = 2 ** 10
|
||||||
|
SRC_W = 2 ** 11
|
||||||
|
DST_R = 2 ** 12
|
||||||
|
DST_W = 2 ** 13
|
||||||
|
|
||||||
|
PC_WE = 2 ** 14
|
||||||
|
PC_CS = 2 ** 15
|
||||||
|
PC_EN = 2 ** 16
|
||||||
|
|
||||||
|
|
||||||
|
PC_OUT = PC_CS
|
||||||
|
PC_IN = PC_CS | PC_WE
|
||||||
|
PC_INC = PC_CS | PC_WE | PC_EN
|
||||||
|
|
||||||
|
HLT = 2 ** 31
|
Loading…
Reference in New Issue