mov指令完成了一半

main
阳光少年 5 months ago
parent 2c7f71ce77
commit 2b8165ee9c

@ -1,6 +1,6 @@
import pin
# 一个指令周期
FETCH = [
# 把 pc(当前是0) 的值 输出到偏移地址寄存器中,
pin.PC_OUT | pin.MAR_IN,
@ -10,8 +10,38 @@ FETCH = [
pin.RAM_OUT | pin.DST_IN | pin.PC_INC,
pin.PC_OUT | pin.MAR_IN,
pin.RAM_OUT | pin.SRC_IN | pin.PC_INC,
pin.SRC_R | pin.DST_IN,
]
MOV = 0 << pin.ADDR_2_SHIFT | pin.ADDR_2
ADD = 1 << pin.ADDR_2_SHIFT | pin.ADDR_2
NOP = 0b0
HLT = 0b11_1111
INSTRUCTIONS = {
2: {
MOV: {
# mov X, 5
(pin.AM_REG, pin.AM_INS): [
# 目的任意寄存器的控制线的编号X, 保存在了DST寄存器中中, 输出到读写控制器控制使X寄存器打开写
pin.DST_W | pin.SRC_OUT,
]
}
},
1: {
},
0: {
NOP: [
pin.CYC,
],
HLT: [
pin.HLT,
]
}
}
if __name__ == "__main__":
print(FETCH)

@ -1,4 +1,3 @@
from assembly import FETCH
import pin
@ -25,19 +24,29 @@ def save_hex_str(hex_str_lis, chunk_count: int):
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)
fetch_hex_str_lis = 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]
cyc = addr & 0xf # 最大支持2的4次方个指令
# 取指令周期
if cyc < len(fetch_hex_str_lis):
base_bin_data[addr] = fetch_hex_str_lis[cyc]
continue
# 处理IR寄存器的值
# 写入数据到 bin文件
addr_chunk = int(64 / (32 / 4)) # bin文件每行有多少个数据

7684
cpu.circ

File diff suppressed because it is too large Load Diff

@ -1,6 +1,3 @@
MSR = 1
MAR = 2
MDR = 3
@ -75,18 +72,32 @@ 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
SRC_R = 1 << 10 # 读取 SRC 寄存器中的值的内代表的 寄存器
SRC_W = 1 << 11
DST_R = 1 << 12
DST_W = 1 << 13
PC_WE = 2 ** 14
PC_CS = 2 ** 15
PC_EN = 2 ** 16
PC_WE = 1 << 14
PC_CS = 1 << 15
PC_EN = 1 << 16
PC_OUT = PC_CS
PC_IN = PC_CS | PC_WE
PC_INC = PC_CS | PC_WE | PC_EN
HLT = 2 ** 31
CYC = 1 << 30 # 当前指令周期 清零, 执行下一个指令周期
HLT = 1 << 31
ADDR_2 = 1 << 7 # 2指令
ADDR_1 = 1 << 6 # 1指令
ADDR_2_SHIFT = 4 # 指令需要左移4位 留出来操作数位
ADDR_1_SHIFT = 2
AM_INS = 0 # 立即数寻址
AM_REG = 1 # 寄存器寻址
AM_DIR = 2 # 直接寻址
AM_RAM = 3 # 寄存器间接寻址

Loading…
Cancel
Save