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

 


 

大概是完成了排序。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM