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, ] MOV = 0 << pin.ADDR_2_SHIFT | pin.ADDR_2 # 左移 留出来操作数位 然后再加上 ADDR_2的标志 ADD = 1 << pin.ADDR_2_SHIFT | pin.ADDR_2 SUB = 2 << pin.ADDR_2_SHIFT | pin.ADDR_2 CMP = 3 << pin.ADDR_2_SHIFT | pin.ADDR_2 AND = 4 << pin.ADDR_2_SHIFT | pin.ADDR_2 OR = 5 << pin.ADDR_2_SHIFT | pin.ADDR_2 XOR = 6 << pin.ADDR_2_SHIFT | pin.ADDR_2 INC = 0 << pin.ADDR_1_SHIFT | pin.ADDR_1 DEC = 1 << pin.ADDR_1_SHIFT | pin.ADDR_1 NOT = 2 << pin.ADDR_1_SHIFT | pin.ADDR_1 JMP = 3 << pin.ADDR_1_SHIFT | pin.ADDR_1 JO = 4 << pin.ADDR_1_SHIFT | pin.ADDR_1 # 溢出跳转 JNO = 5 << pin.ADDR_1_SHIFT | pin.ADDR_1 # 不溢出跳转 JZ = 6 << pin.ADDR_1_SHIFT | pin.ADDR_1 # 如果为0跳转 JNZ = 7 << pin.ADDR_1_SHIFT | pin.ADDR_1 # 非0跳转 JP = 8 << pin.ADDR_1_SHIFT | pin.ADDR_1 # 奇数跳转 JNP = 9 << pin.ADDR_1_SHIFT | pin.ADDR_1 # 偶数跳转 NOP = 0b0 HLT = 0b11_1111 INSTRUCTIONS = { 2: { MOV: { # 0b10000000 # mov X任意寄存器, 5, 如果是mov a, 5 这个指令对应的前3个内存地址就是 1000_01_00 00000008(dst中保存的a寄存器编号是8) 00000101(src保存的数值是5, 等下SRC_OUT会输出到总线上) (pin.AM_REG, pin.AM_INS): [ # 1000_01_00 这是IR寄存器上保存的指令 # 目的任意寄存器的控制线的编号X, 保存在了DST寄存器中中, 输出到读写控制器控制使X寄存器打开写 # 写入 SRC寄存器中保存的立即数 # 这是控制读写寄存器操作寄存器控制器的值 pin.DST_W | pin.SRC_OUT, ], (pin.AM_REG, pin.AM_REG): [ # mov a, b pin.DST_W | pin.SRC_R # SRC_R 和 SRC_OUT的区别是: # - SRC_R 是被读写控制器控制的表示, SRC_R内保存的值是一个寄存器编号, 此时把这个编号传到 寄存器控制器中然后把这个指定的寄存器数据传到总线上 # - SRC_OUT 是把直接SRC寄存器中的数据输出到总线 ], (pin.AM_REG, pin.AM_DIR): [ # mov a, [0x5] pin.SRC_OUT | pin.MAR_IN, # 把0x5从src寄存器, 通过偏移地址寄存器传到 内存控制器中 pin.DST_W | pin.RAM_OUT # 把上面传到内存控制器中的地址, 输出到DST_W中的a寄存器中 ], (pin.AM_REG, pin.AM_RAM): [ # mov a, [b] pin.SRC_R | pin.MAR_IN, # 把SRC_R中的b寄存器编号, 通过偏移地址寄存器MAR传到 内存控制器中 pin.DST_W | pin.RAM_OUT ], (pin.AM_DIR, pin.AM_INS): [ # mov [0x2f], 5 pin.DST_OUT | pin.MAR_IN, # 把0x2f这个地址, 从dst寄存器, 通过偏移地址寄存器传到 内存控制器中 pin.SRC_OUT | pin.RAM_IN ], (pin.AM_DIR, pin.AM_REG): [ # mov [0x0], a pin.DST_OUT | pin.MAR_IN, pin.SRC_R | pin.RAM_IN ], (pin.AM_DIR, pin.AM_DIR): [ # mov [0x0], [0x2f] pin.SRC_OUT | pin.MAR_IN, pin.T1_IN | pin.RAM_OUT, pin.DST_OUT | pin.MAR_IN, pin.T1_OUT | pin.RAM_IN ], (pin. AM_DIR, pin.AM_RAM): [ # mov [0x0], [a] pin.SRC_R | pin.MAR_IN, pin.T1_IN | pin.RAM_OUT, pin.DST_OUT | pin.MAR_IN, pin.T1_OUT | pin.RAM_IN ], (pin.AM_RAM, pin.AM_INS): [ # mov [a], 0x5 pin.DST_R | pin.MAR_IN, pin.SRC_OUT | pin.RAM_IN ], (pin.AM_RAM, pin.AM_REG): [ # mov [a], c pin.DST_R | pin.MAR_IN, pin.SRC_R | pin.RAM_IN ], (pin.AM_RAM, pin.AM_DIR): [ # mov [a], [0x5] pin.SRC_OUT | pin.MAR_IN, pin.T1_IN | pin.RAM_OUT, pin.DST_R | pin.MAR_IN, pin.T1_OUT | pin.RAM_IN ], (pin.AM_RAM, pin.AM_RAM): [ # mov [a], [b] pin.SRC_R | pin.MAR_IN, pin.T1_IN | pin.RAM_OUT, pin.DST_R | pin.MAR_IN, pin.T1_OUT | pin.RAM_IN ], }, ADD: { (pin.AM_REG, pin.AM_INS): [ # add b, 5 pin.DST_R | pin.A_IN, # 将b寄存器内的值 转移到 A寄存器 pin.SRC_OUT | pin.B_IN, # 将 src中的值 转移到 b寄存器 pin.OP_ADD | pin.ALU_OUT | pin.DST_W | pin.ALU_PSW # 打开alu输出计算之后 写入到 DST中的编号为 b寄存器中, 并记录 psw ], (pin.AM_REG, pin.AM_REG): [ # add a, b pin.DST_R | pin.A_IN, pin.SRC_R | pin.B_IN, pin.OP_ADD | pin.ALU_OUT | pin.DST_W | pin.ALU_PSW ], }, SUB: { (pin.AM_REG, pin.AM_INS): [ # sub b, 5 pin.DST_R | pin.A_IN, # 将b寄存器内的值 转移到 A寄存器 pin.SRC_OUT | pin.B_IN, # 将 src中的值 转移到 b寄存器 pin.OP_SUB | pin.ALU_OUT | pin.DST_W | pin.ALU_PSW ], (pin.AM_REG, pin.AM_REG): [ # sub a, b pin.DST_R | pin.A_IN, pin.SRC_R | pin.B_IN, pin.OP_SUB | pin.ALU_OUT | pin.DST_W | pin.ALU_PSW ], }, CMP: { (pin.AM_REG, pin.AM_INS): [ # cmp b, 5 pin.DST_R | pin.A_IN, # 将b寄存器内的值 转移到 A寄存器 pin.SRC_OUT | pin.B_IN, # 将 src中的值 转移到 b寄存器 pin.OP_SUB | pin.ALU_PSW # 相减, 只更新状态字即可 ], (pin.AM_REG, pin.AM_REG): [ # cmp a, b pin.DST_R | pin.A_IN, pin.SRC_R | pin.B_IN, pin.OP_SUB | pin.ALU_PSW ], }, AND: { (pin.AM_REG, pin.AM_INS): [ # and b, 5 pin.DST_R | pin.A_IN, # 将b寄存器内的值 转移到 A寄存器 pin.SRC_OUT | pin.B_IN, # 将 src中的值 转移到 b寄存器 pin.OP_AND | pin.ALU_OUT | pin.DST_W | pin.ALU_PSW ], (pin.AM_REG, pin.AM_REG): [ # and a, b pin.DST_R | pin.A_IN, pin.SRC_R | pin.B_IN, pin.OP_AND | pin.ALU_OUT | pin.DST_W | pin.ALU_PSW ], }, OR: { (pin.AM_REG, pin.AM_INS): [ # or b, 5 pin.DST_R | pin.A_IN, # 将b寄存器内的值 转移到 A寄存器 pin.SRC_OUT | pin.B_IN, # 将 src中的值 转移到 b寄存器 pin.OP_OR | pin.ALU_OUT | pin.DST_W | pin.ALU_PSW ], (pin.AM_REG, pin.AM_REG): [ # or a, b pin.DST_R | pin.A_IN, pin.SRC_R | pin.B_IN, pin.OP_OR | pin.ALU_OUT | pin.DST_W | pin.ALU_PSW ], }, XOR: { (pin.AM_REG, pin.AM_INS): [ # xor b, 5 pin.DST_R | pin.A_IN, # 将b寄存器内的值 转移到 A寄存器 pin.SRC_OUT | pin.B_IN, # 将 src中的值 转移到 b寄存器 pin.OP_XOR | pin.ALU_OUT | pin.DST_W | pin.ALU_PSW ], (pin.AM_REG, pin.AM_REG): [ # xor a, b pin.DST_R | pin.A_IN, pin.SRC_R | pin.B_IN, pin.OP_XOR | pin.ALU_OUT | pin.DST_W | pin.ALU_PSW ], }, }, 1: { INC: { pin.AM_REG: [ # inc b pin.DST_R | pin.A_IN, pin.OP_INC | pin.ALU_OUT | pin.DST_W | pin.ALU_PSW ], }, DEC: { pin.AM_REG: [ # dec b pin.DST_R | pin.A_IN, pin.OP_DEC | pin.ALU_OUT | pin.DST_W | pin.ALU_PSW ], }, NOT: { pin.AM_REG: [ # not b pin.DST_R | pin.A_IN, pin.OP_NOT | pin.ALU_OUT | pin.DST_W | pin.ALU_PSW ], }, JMP: { # jmp 0x5 跳转到立即数的地址 pin.AM_INS: [ pin.DST_OUT | pin.PC_IN, ] }, JO: { pin.AM_INS: [ pin.DST_OUT | pin.PC_IN, ] }, JNO: { pin.AM_INS: [ pin.DST_OUT | pin.PC_IN, ] }, JZ: { pin.AM_INS: [ pin.DST_OUT | pin.PC_IN, ] }, JNZ: { pin.AM_INS: [ pin.DST_OUT | pin.PC_IN, ] }, JP: { pin.AM_INS: [ pin.DST_OUT | pin.PC_IN, ] }, JNP: { pin.AM_INS: [ pin.DST_OUT | pin.PC_IN, ] }, }, 0: { NOP: [ pin.CYC, ], HLT: [ pin.HLT, ] } } if __name__ == "__main__": print(FETCH)