计组实验-添加指令

2019-03-30  本文已影响0人  持之以蘅

需要添加的指令:

sll /srl/sllv/ srlv/bne/ nor /jr/ jalr/andi/ lui/ slti/

bne 不相等则分支 I型

bne rs, rt, label1 形式为6 5 5 16(offeset)

func[5:0]:000101


image.png

指令译码

由于bne指令要跳转,所以要修改npc

image.png

用到ALU计算

image.png

用Mars添加bne,检测

image.png

观察波形图信号量pc npc

image.png

pc=18,npc=44,说明bne指令添加成功

sll & srl & sllv & srlv

在此说明一下,shamt是在A端口,imm是在B端口,(我们原本的ALUsrc注释中,ALU A应该是B)
所以需要添加一个多路选择器,来选择rs和shamt

sll 逻辑左移 R型 funct 000000

sll rd, rt, shamt rd =rt << shamt 655556形式

srl 逻辑右移 R型 funct 000010

srl rd, rt, shamt rd =rt >> shamt 655556形式

sllv 逻辑左移变量 R型 funct 000100

srllv rd, rt, rs rd =rt << rs 655556

srlv 逻辑右移变量 R型 funct 000110

srlv rd, rt, rs rd =rt >> rs 65556

添加译码

image.png

由于ALU中没有移位,所以要扩展ALU

image.png
image.png

增添多路选择器

加一个信号对多路选择器进行选择(判断选择rs还是shamt)

image.png

接着绑定信号

image.png

增添信号

image.png

补充shamt信号

image.png

补充ALU A 信号

image.png

定义shamt的格式

前27位为0,取6到10位指令(至于为什么这样子取,还未明白)


image.png

补充多路选择器

image.png

修改ALU的输入端口

image.png

仿真运行

sllv和srlv 在原来的基础上只需要修改译码和操作数

image.png

运行成功后,如下


image.png

slti 小于立即数则置位 I型 001010

slti rt, rs, imm
65516

指令译码

寄存器写

ALUOp和slt一样

仿真运行

image.png

nor 异或 R型 funct100111

nor rd, rs, rt 0 rs rt rd 0 0x27(6 5 5 5 5 6)
rd = ~(rs|rt)

扩充ALU

image.png
image.png

添加译码

image.png

修改ALUOp的控制

image.png

添加nor指令

image.png

仿真运行

观察ALUA/B/C端口的情况


image.png

A=c, B=4,C=fffffff3,结果正确,添加指令成功

lui 立即数高16位放进一个寄存器 I型 funct001111

lui rt, imm RT={imm,16'b0}
6 5 5 16
需要16位立即数符号扩展,再左移16位

译码

image.png

ALU扩展

image.png

写寄存器

image.png

写回rt寄存器

image.png

ALU运算,来自一个立即数

image.png

符号扩展

image.png

ALUOp修改

image.png

仿真运行

image.png

jr & jalr

jr 寄存器跳转 R型 001000

jr rs(无条件跳转到由寄存器rs指定的指令) 0 rs 0 8(6 5 15 6)
pc=GPR[rs]

指令译码

image.png

修改npc

image.png 修改定义 修改npc定义

添加指令

image.png

仿真运行

jr指令来到上升沿,调用成功


image.png

jalr 跳转并链接到寄存器 R型 001001

jalr rs rd 0 rs 0 rd 0 9(6 5 5 5 5 6)
pc=GPR[rs]; GPR[rd]=pc+4

指令译码

image.png

需要写寄存器

image.png 选择寄存器

选择需要写的数据-来自PC

image.png

对NPC选择

image.png

添加指令

image.png

运行仿真

image.png

观察波形图有jalr的跳跃信号

andi 立即数与 I型 op:001100

andi rt rs imm oxc rs rt imm(6 5 5 16)

添加译码

image.png

需符号扩展

image.png

需写寄存器

image.png

需对ALU进行选择

image.png

对ALU端口选择

image.png

运行仿真

观察ALUOp的值为3,添加指令成功


image.png

运行学号

01510008
8421码译码之后:
0000 0001 0101 0001 0000 0000 0000 1000

最后想说明一下,做完,我简直要爆炸,仿真运行,底下的框出不来数据,只能看波形图,中间认认真真地添完了指令,却在仿真运行的时候出现了error loading design,以及运行学号,可以在别人电脑上跑,我的却不行,所以待续。
另外,参考了萍水间人的文章,大家都可以去观摩!

上一篇下一篇

猜你喜欢

热点阅读