Verilog hdl 实现单周期cpu

参考计组实验测试指令 - 简书,添加了一些细节。

1.添加 bne指令

修改 ctrl.v


 

 

 

之后修改mipstestloopjal_sim.asm,mars dump 为 bnetest.dat


 

修改sccomp_tb


 

modelsim编译,模拟。信号添加sccomp_tb: u_ctrl -> i_bne ,npc,  pc


 

可见i_bne控制信号为1时,npc变为44。添加bne成功

2.添加jr指令

先看其格式。


 

R型指令。

故在ctrl.v如下修改。


 

ctrl.v又两处修改


 

然后在NPC.v修改。注意添加参数和input


 

 

 

=RD1的原因可见sccpu.v


 

在ctrl_encode_def 定义NPC_JR


 

在sccpu.v添加参数  .RD1


 

然后写测试程序

$ra先赋值为4.这样应该会不断循环。

导出测试


 

勿忘修改sccomp_tb


 

波形图可见PC从1c变到设定的4。添加成功


 

3.添加JALR


 

ctrl.v


 

 

 

 

 

JALR指令格式为 jalr rs

无条件跳转到由寄存器rs指定的指令,并将下一条指令的地址保存到寄存器$ra中

测试代码


 

可见从14跳到4,


 

并且$ra 记录 18


 

4.添加NOR指令


 

 

 

在alu.v中


 

测试代码


 

波形:


 

寄存器:


 

5.添加sll & sra & srl指令

注意这里做了扩展


 

注意同时修改了input ALUOp的宽度


 

然后在ctrl.v中

写寄存器

注意只改了RegWrite,下面的RD没改


 

 

添加输出


 

 

 

 

在sccpu.v中


 

 

 

 

 

测试代码:


 

波形:可以看到ALUop对应 sll,srl,sra的1000,1001,1010


 

寄存器值:


 

6.sllv和srlv

这里sllv使用的是rs低五位 自己动手写CPU之第五阶段(3)——MIPS指令集中的逻辑、移位与空指令 - yxwkaifa - 博客园

sllv $t1,$t2,$t3。

则t1值为t2左移t3的低五位

但是这里不太懂,没搞明白是怎么实现的逻辑左右移,位数可变

这里犯了一次错误。复制粘贴后忘了改数字了


 

 

 

 

 

 

测试代码:


 

波形:


 

寄存器变化


 

7.stli指令

小于则置一


 

 

 

 

测试代码:


 

波形:


 

寄存器值:


 

8.lui指令

取高十六位


 

 

 

 

 

 

 

测试代码:


 

波形图:


 

寄存器值:


 

9.andi指令


 

 

别忘了RT


 

 

aluop同and


 

测试代码:


 

波形图:


 

寄存器:


 

以上。nice!

学号后八位排序

01510029

lui 0x0151

ori 0x0029


 

记得改sccomp_tb


 

跑完看result.txt


 

大概是完成了排序。

猜你喜欢

转载自www.cnblogs.com/lqerio/p/11117623.html