嵌入式学习-04_嵌入式技术之从零搭建计算机
1 添加立即数
现有系统的数据RAM存储方式(操作码+操作数)。
地址 | 指令 | opcode(操作码) | addr(操作数) | 新代码 /数据 |
---|---|---|---|---|
000 | ld_a | 0b00001 | 0b100 | 0b0000100000000100 |
001 | add | 0b00010 | 0b101 | 0b0001000000000101 |
010 | sub | 0b00011 | 0b110 | 0b0001100000000110 |
011 | str | 0b00110 | 0b111 | 0b0011000000000111 |
100 | 0b0000000000010011 | |||
101 | 0b0000000001000101 | |||
110 | 0b0000000000011011 | |||
111 |
现有我们的RAM中,操作数指的是数据RAM的地址。也就是在执行指令的过程中,需要操作数指定的地址到RAM中读取数据运算所需要的数据。这个数据获取的过程是间接的。
我们希望增加一个直接获取运算的数据的方式,也就是说操作数不是数据ROM的地址,而是表示具体的要参与运算的数据。这样的操作数称为立即数。我们举例说明:比如我们要计算19+69-27。
地址 | 指令 | opcode(操作码) | addr(操作数) | 新代码 /数据 |
---|---|---|---|---|
000 | ld_a | 0b00001 | 0b00000010011(19) | 0b0000100000010011 |
001 | add | 0b00010 | 0b00001000101(69) | 0b0001000001000101 |
010 | sub | 0b00011 | 0b00000011011(27) | 0b0001100000011011 |
011 | str | 0b00110 | 0b00000000011(3) | 0b0011000000000011 |
以上就是操作码+立即数的方式。
1.1 增加立即数后的指令
opname | opcode | 操作 |
---|---|---|
halt | 00000 | 停止时钟 |
ld_a | 00001 | 将数据RAM的数据载入寄存器A |
add | 00010 | 数据RAM的数据+寄存器A再存入寄存器A |
sub | 00011 | 寄存器A-数据RAM再存入寄存器A |
or | 00100 | 寄存器A||数据RAM再存入寄存器A |
and | 00101 | 寄存器A&&数据RAM再存入寄存器A |
str | 00110 | 将寄存器A中数据存入数据RAM |
jmp | 00111 | 无条件跳转到指定地址 |
je | 01000 | 比较相等时跳转到指定地址 |
ld_ia | 01001 | 将立即数存入寄存器A |
add_ia | 01010 | 将立即数+寄存器A中的数再存到寄存器A |
sub_ia | 01011 | 寄存器A-立即数再存到寄存器A |
or_ia | 01100 | 寄存器A||立即数再存到寄存器A |
and_ia | 01101 | 寄存器A&&立即数再存到寄存器A |
1.2 电路改造
立即数就是将操作码当做数直接进入ALU计算,我们的操作码addr原来表示的是RAM的地址,位数是11。因此,头部补5位的0,就凑成了11位的Din,作为ALU的B信号的输入了。
将指令寄存器输出的11bit地址补全到16位接入地址总线。通过en_i信号控制。
整体电路如下图:
1.3 控制器改造
1)增加en_i控制信号
2)修改控制器查找表
1.4 测试立即数功能
我们要