mov指令完成完成, 可以手动在ram中前三个地址填入84 08 30表示mov A, 30

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

8193
ROM.bin

File diff suppressed because it is too large Load Diff

Binary file not shown.

@ -10,10 +10,9 @@ 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
MOV = 0 << pin.ADDR_2_SHIFT | pin.ADDR_2 # 左移 留出来操作数位 然后再加上 ADDR_2的标志
ADD = 1 << pin.ADDR_2_SHIFT | pin.ADDR_2
NOP = 0b0
@ -21,11 +20,11 @@ HLT = 0b11_1111
INSTRUCTIONS = {
2: {
MOV: {
MOV: { # 0b10000000
# mov X, 5
(pin.AM_REG, pin.AM_INS): [
# 目的任意寄存器的控制线的编号X, 保存在了DST寄存器中中, 输出到读写控制器控制使X寄存器打开写
pin.DST_W | pin.SRC_OUT,
pin.DST_W | pin.SRC_OUT, # 0b10000000000111
]
}
},

@ -1,4 +1,4 @@
from assembly import FETCH
from assembly import FETCH, INSTRUCTIONS
import pin
META_DATA = "v3.0 hex words addressed\n"
@ -20,39 +20,10 @@ def get_hex_str(codes, width):
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个指令
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 # 最大支持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文件每行有多少个数据
lines = [META_DATA, ]
idx = 0
for slice in chunk(base_bin_data, addr_chunk):
for slice in chunk(hex_str_lis, chunk_count):
hex_idx_str = hex(idx)[2:]
zero_str = ""
for _ in range(4 - len(hex_idx_str)):
@ -70,4 +41,100 @@ if __name__ == "__main__":
f.writelines(lines)
def compile_addr2(addr, ir, psw, idx):
# addr: 0b10000100_0000_0110
# ir psw cyc
# ir: 1xxx[aa][bb]
# idx: 当前指令周期的下标
global base_bin_data
op = ir & 0b1111_0000 # 需要进行的操作
amd = (ir >> 2) & 0b0000_0011 # 目的操作数 也是就是 aa
ams = ir & 0b0000_0011 # 原地址操作数 bb
INST = INSTRUCTIONS[2]
# 如果还未实现该指令
if op not in INST:
base_bin_data[addr] = pin.CYC # 当前指令周期清零, 执行下个指令周期吧
return
# print(bin(addr), hex(addr), bin(op), bin(list(INST.keys())[0]), list(INST.keys()))
am = (amd, ams) # 寻址方式判断 [aa][bb]
if am not in INST[op]:
base_bin_data[addr] = pin.CYC # 当前指令周期清零, 执行下个指令周期吧
return
# print(bin(addr), hex(addr), bin(op), bin(amd), bin(ams))
EXEC = INST[op][am]
# 当前指令周期 长度塞不下了
if idx < len(EXEC):
print(f"{hex(addr)} 写入指令: {bin(EXEC[idx])}")
base_bin_data[addr] = EXEC[idx]
else: # 这个指令周期放不下了
base_bin_data[addr] = pin.CYC # 当前指令周期清零, 执行下个指令周期吧
return
def compile_addr1(addr, ir, psw, idx):
# 01xxxx[aa]
pass
def compile_addr0(addr, ir, psw, idx):
# 00xxxxxx
op = ir & 0b1111_0000 # 需要进行的操作
INST = INSTRUCTIONS[0]
# 如果还未实现该指令
if op not in INST:
base_bin_data[addr] = pin.CYC # 当前指令周期清零, 执行下个指令周期吧
return
EXEC = INST[op]
# 当前指令周期 长度塞不下了
if idx < len(EXEC):
base_bin_data[addr] = EXEC[idx]
else: # 这个指令周期放不下了
base_bin_data[addr] = pin.CYC # 当前指令周期清零, 执行下个指令周期吧
return
if __name__ == "__main__":
data_width = 32
addr_width = 16
# 我们现在只支持16个指令
# fetch_hex_str_lis = get_hex_str(FETCH, data_width / 4)
base_bin_data = [pin.HLT for _ in range(1 << addr_width)]
for addr in range(1 << addr_width):
# addr: 0b10000100_0000_0110
ir = addr >> 8
psw = (addr >> 4) & 0b1111
cyc = addr & 0b1111 # 最大支持2的4次方个指令
# 取指令周期
if cyc < len(FETCH):
base_bin_data[addr] = FETCH[cyc]
continue
idx = cyc - len(FETCH) # 从取指令周期之后开始计数, 直接减去去指令周期的大小即可, 因为cyc是 addr来的
# 数据都就位, 处理IR寄存器的值
if ir & 0b1000_0000 == pin.ADDR_2:
compile_addr2(addr, ir, psw, idx)
elif ir & 0b0100_0000 == pin.ADDR_2:
compile_addr1(addr, ir, psw, idx)
else:
compile_addr0(addr, ir, psw, idx)
addr_chunk = int(64 / (32 / 4)) # bin文件每行有多少个数据
save_hex_str(get_hex_str(base_bin_data, data_width / 4), addr_chunk)

7685
cpu.circ

File diff suppressed because it is too large Load Diff

@ -89,10 +89,10 @@ PC_INC = PC_CS | PC_WE | PC_EN
CYC = 1 << 30 # 当前指令周期 清零, 执行下一个指令周期
HLT = 1 << 31
ADDR_2 = 1 << 7 # 2指令
ADDR_1 = 1 << 6 # 1指令
ADDR_2 = 1 << 7 # 2指令标志 1xxx[aa][bb]
ADDR_1 = 1 << 6 # 1指令标志 01xxxx[aa]
ADDR_2_SHIFT = 4 # 指令需要左移4位 留出来操作数位
ADDR_2_SHIFT = 4 # 指令需要左移4位 留出来操作数位
ADDR_1_SHIFT = 2
AM_INS = 0 # 立即数寻址

Loading…
Cancel
Save