計算機組成原理實驗三【計算機組成原理實驗報告材料1-單周期】
時間:2020-06-30 07:45:57 來源:勤學考試網 本文已影響 人
計算機組成原理實驗報告
單周期處理器開發
Q:1064950364
2015.05.12
文檔目錄:
功能設計說明
模塊化和層次化設計說明
具體模塊定義
測試代碼及結果
實驗完成時間安排
心得體會
功能設計說明
1. 完成的指令集:
a) add,sub,and,or,slt,lw,sw,beq 和J 指令。
b) 不支持溢出。
2. 處理器為單周期設計。
3. 功能模塊統一采用書上201頁的圖4-24設計,信號控制采用書上的193頁圖4-12和200頁圖4-22的真值表進行化簡。
模塊化和層次化設計說明
具體模塊定義
數據通路:
1)PC模塊定義:
(1) 基本描述
PC 主要功能是完成輸出當前指令地址。復位后,PC指向0x0000_0000,此處為第一條指令的地址。
(2) 模塊接口
信號名
方向
描述
[31:0]address
I
輸入的指令地址
clk
I
時鐘信號
rst
I
復位信號
[31:0]out
O
輸出的指令地址
?。?)功能定義
序號
功能名稱
功能描述
1
復位
rst=1時,將out置為0X0000_0000
2
輸出指令地址
時鐘信號到來時,將address賦給out
2)NPC模塊定義:
(1) 基本描述
NPC 主要功能是根據當前指令是否為beq指令,輸出下一條指令的地址。該模塊調用了MUX模塊。
(2) 模塊接口
信號名
方向
描述
[15:0]imaddr
I
指令的低16位
zero
I
ALU計算結果:
1表示當前兩寄存器(rs,rt)值相等;
0表示不相等。
br
I
是否為beq指令。1是0否
[31:0]pc
I
輸入當前指令地址
[31:0]npc
O
輸出下一條指令地址
?。?)功能定義
序號
功能名稱
功能描述
1
輸出指令地址
根據zero與br的值輸出下一條指令的地址。
3)ALU模塊定義:
(1) 基本描述
實現加、減、與、或、小于則賦1五種計算。
(2) 模塊接口
信號名
方向
描述
[2:0]aluctrl
I
ALU控制信號
[31:0]A
I
rs寄存器的值
[31:0]B
I
rt寄存器的值
zero
O
B=0,則zero=1;
否則zero=0.
[31:0]result
O
Alu計算輸出的結果。
?。?)功能定義
序號
功能名稱
功能描述
1
輸出計算結果
根據alu控制信號,輸出A與B的計算結果
2
輸出zero
若result=0
則輸出zero=1,否則輸出zero=0。
4)MUX模塊定義:
(1) 基本描述
實現32位和5位二選一數據選擇器
(2) 模塊接口
信號名
方向
描述
S
I
MUX控制信號
[31:0]d0/
[4:0]d0
I
MUX輸入
[31:0]d1/
[4:0]d1
I
MUX輸入
[31:0]y/
[4:0]y
O
MUX輸出
?。?)功能定義
序號
功能名稱
功能描述
1
輸出d0,或d1的值
S為0,y=d0;
S為1,y=d1.
5)EXT模塊定義:
(1) 基本描述
將輸入的16位地址按符號位擴展為32位。
(2) 模塊接口
信號名
方向
描述
[15:0]addrin
I
輸入的16位地址
[31:0]addrout
O
輸出的32位地址
?。?)功能定義
序號
功能名稱
功能描述
1
輸出擴展的32位地址.
將addrin擴展為32位的addrout.
6)regfile模塊定義:
(1) 基本描述
根據輸入的兩個寄存器地址,輸出相應寄存器的值,根據寄存器寫信號和寄存器地址,將輸入的數據選擇寫入寄存器。
(2) 模塊接口
信號名
方向
描述
clk
I
時鐘信號
[4:0]rreg1
I
Rs寄存器地址
[4:0]rreg2
I
Rt寄存器地址
[31:0]rdata1
O
Rs寄存器值
[31:0]rdata2
O
Rt寄存器值
regw
I
寫寄存器信號
[4:0]wreg
I
Rt寫寄存器地址
[31:0]wdata
I
寫入寄存器的信號
?。?)功能定義
序號
功能名稱
功能描述
1
讀寄存器數據
讀rs、rt寄存器的數據
2
向寄存器寫入數據
根據寫信號向寄存器選擇寫入數據
7)im_4k模塊定義:
(1) 基本描述
指令存大小為4K,初始化從code.txt載入指令。根據輸入的指令地址,輸出當前位置存儲的指令。
(2) 模塊接口
信號名
方向
描述
[9:0]addr
I
指令地址
[31:0]dout
O
指令
?。?)功能定義
序號
功能名稱
功能描述
1
載入指令
初始化載入code.txt中的指令
2
輸出指令
根據輸入的指令地址,輸出當前指令
8)dm_4k模塊定義:
(1) 基本描述
“數據存”大小為4K,根據輸入的地址讀出“數據存”中的數據,并根據數據寫信號,將輸入的數據選擇寫入“數據存”中。
(2) 模塊接口
信號名
方向
描述
clk
I
時鐘信號
[9:0]addr
I
數據地址
[31:0]din
I
寫入的數據
we
I
數據存寫信號
[31:0]dout
O
讀出的數據
?。?)功能定義
序號
功能名稱
功能描述
1
讀數據存數據
根據輸入的數據地址,讀出數據存的數據,讀出的數據不一定被使用,只有lw指令才會使用。
2
向數據存寫入數據
在時鐘信號到來時,根據寫數據信號,將輸入的數據選擇寫入數據存中。
9)Jump模塊定義:
(1) 基本描述
將輸入的低26位指令左移兩位,高四位加上pc+4的高4位,組成32位地址輸出。
(2) 模塊接口
信號名
方向
描述
[25:0]addrin
I
低26位指令
[31:0]pc
I
當前PC
[31:0]addrout
O
計算出的32位地址
?。?)功能定義
序號
功能名稱
功能描述
1
輸出J跳轉地址
輸出計算得到的32位地址,為J指令要跳轉的地址。
10) ALUCtrl模塊定義:
(1) 基本描述
根據指令的低6位(function字段)和輸入的aluop控制信號,利用真值表化簡輸出三位的ALU控制信號。真值表利用書上193頁圖4-12.
(2) 模塊接口
信號名
方向
描述
[5:0]func
I
指令低6位
[1:0]aluop
I
Aluop控制信號
[2:0]aluctrl
O
Alu控制信號
?。?)功能定義
序號
功能名稱
功能描述
1
輸出ALU控制信號
利用真值表化簡輸出ALU控制信號。
11) controller模塊定義:
(1) 基本描述
根據輸入的指令高6位(Op字段),利用真值表化簡,輸出RegDst,ALUSrc,MemtoReg,RegWrite,MemWrite,
Branch,J,ALUOp控制信號。真值表采用書上200頁圖4-22,再加上J指令的輸入輸出。其中高阻狀態設為0。MemRead信號可以省略。
(2) 模塊接口
信號名
方向
描述
[5:0]Op
I
指令高6位
RegDst
O
Rd寄存器控制信號
ALUSrc
O
ALU數據來源控制信號
MemtoReg
O
數據存數據寫入寄存器控制信號
RegWrite
O
寄存器寫控制信號
MemWrite
O
數據存寫控制信號
Branch
O
Beq指令控制信號
J
O
J指令控制信號
[1:0]ALUOp
O
ALUOp控制信號
?。?)功能定義
序號
功能名稱
功能描述
1
輸出各種控制信號
根據輸入的OP,利用真值表化簡,輸出各種控制信號。
測試代碼及結果
測試代碼及結果:
在regfile模塊初始化了17($s1),18($s2),20($s4)號寄存器的值分別為8、4、12.
add $s3,$s2,$s1 //$s3=4+8=12
sub $s5,$s4,$s3 //$s5=12-12=0
beq $s3,$s4,LI //$s3==$s4,跳到LI
sw $s2,1($s1)
lw $s3,1($s1)
LI:and $s5,$s4,$s3 //$s5=$s4 & $s3=12
or $s5,$s3,$s1 //$s5=$s4 | $s3=12
slt $s5,$s3,$s1 //$s3>$s1,$s5=0
sw $s2,1($s1) //存入4
lw $s3,1($s1) //載入4到$s3
j LI //跳轉
生成的16進制文件(code.txt): // add $s3,$s2,$s1
0293a822 // sub $s5,$s4,$s3 // beq $s3,$s4,LI
ae320001 // sw $s2,1($s1)
8e330001 //lw $s3,1($s1)
0293a824 // LI:and $s5,$s4,$s3
0271a825 // or $s5,$s3,$s1
0271a82a // slt $s5,$s3,$s1
ae320001 // sw $s2,1($s1)
8e330001 // lw $s3,1($s1) //j LI
實驗完成時間安排
實驗前2小時看了Verilog語法,并用ModelSim跑了PPT給的counter程序。
實驗課上跟著老師寫了各個模塊,至此各個模塊已經基本寫完。
中午用了不到1小時寫了控制信號及頂層模塊,只剩下測試工作。
中午用了大概半小時時間測試程序可以運行,完成調試。
總體完成時間在10小時以。
6、心得體會
通過該實驗,對硬件編程有了更深入的理解。之前參加學校的PLD比賽賽前培訓(后來時間太緊,比賽放棄),使用過Vivado跑了一段測試程序,當時對仿真一塊還不太懂,此次實驗更加深了理解。對單周期處理器的認識也更深刻了。開發初期,受c語言開發的限制,老是想不通這些模塊的調用參數是如何傳遞的。后來想到Verilog有wire型變量,其實就可以將其想象成一條條真實的線,各個模塊就是各個真實的器件,這些器件用線連接起來才可以工作。于是,便突破了思想局限,順利完成了實驗。使用開發工具多了,漸漸就會發現這些工具都小異,所以上手也會很快。