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