其中信號說明如下:
m2reg:把存儲器數據寫到寄存器 PCsource:下一條指令的來源
wmem:寫存儲器信號 aluc:運算器控制信號
Shift:移位信號 aluimm:操作數b的數據來源
Wreg:寫寄存器信號 regrt:寫到rd/rt
sext:符號擴展/0擴展
一、實驗方法
1.設計ALU
設計一個32位ALU,能夠實現基本的算術運算、邏輯運算和移位運算。ALU物理結構如下圖。
(1)功能描述:ALU是負責運算的電路模塊,該ALU的輸入為兩個32位的操作數a和b,輸出結果是32位r。ALU的操作是由ALUctr控制信號產生,即為圖中的aluc[3:0],z是零標志。此次設計的ALU主要可進行9種運算。
(2)操作說明:在設計中,KEY按下為0,不按為1。KEY[0]按下為a和b賦初值,之后可用於計算,運算方式aluc[3:0]由SW[3:0]控制,共支持9種運算。撥動開關后運算方式會改變。
- 設計寄存器
寄存器邏輯結構如下:
功能描述:給alu提供運算需要的數據;將alu運算產生的數據保存在寄存器中。用5位作為地址選擇32個32位寄存器。
3.設計控制器
功能描述:根據op,func產生正確的運算控制信號。
4.指令存儲器設計
功能描述:采用存儲程序的設計思想,將待執行的指令放在一組寄存器中,根據PC的變化執行相應的指令。
5.數據存儲器設計
功能描述:存放數據的存儲器,即內存單元。當指令為Load/Store時,需要訪問內存單元的內容,即訪問該寄存器組。
二、實驗結果
完全編譯,編譯完成后下載.sof 文件到開發板,下載完成后點擊一次運行按鈕,按KEY[0]鍵抓取信號。運用Signal TapⅡ抓取到的部分信號如下:
通過觀察指令與PC時鍾周期的變化,判斷實驗結果的正確性,結果正確。
編譯步驟:
- 打開Quartus14.0,點擊file,點擊open project,打開自己文件中的.qpf,運行(需要大概五分鍾)
- 運行完成后,打開tools點擊signal tapII,等待彈出界面
- 點擊驅動,連接驅動,下載到開發板
- 點擊一次運行按鈕,按key[0],捕捉到信號
- 結束
三、分析討論
(1)開發板的處理芯片是Altera的FPGA芯片,選擇器件的時候差一個字符也不可以,選擇5CSEMA5F31C6。
(2)增加PLL時一定注意把operation Mode設為normal,不然在后續會出錯,管腳建立不正確,在建立LPM_MUX時,要注意點擊第二個create,否則在Project中找不到對應項目。
(3)分配管腳前應運行processing>start>start analysis &Elaboration,否則找不到管腳。
(4)命名時注意與頂層文件相同以及擴展類型。
(5)在Signal Tap II的節點欄中添加節點后可以觀察到節點的類型,名字,數據使能,觸發使能(撥動開關或按下按鈕等)和觸發器的狀態。
(6)再查看Sccpu代碼時首先從頂層文件DE1_SOC_golden_top.v中開始看,最重要的是例化數據通路sccpu_dataflow,於是應該看文件sccpu_dataflow .v,在該文件中倒數第二行有alu的例化,於是應該看alu.v,打開該文件發現正是我們之前的實驗用到的alu(a,b,aluc,r,z) ,參數含義和實現方法都已經知道。
(7)回到sccpu_dataflow .v可以看到控制器的例化sccu_dataflow cu 打開sccu_dataflow.v 的參數表如下:(op,func,z,wmem,wreg,regrt,m2reg,aluc,shift,aluimm,pcsource,jal,sext)
其中op,func,z為輸入,其余為輸出的控制信號。
(8)在結合Signal TapII波形圖查看代碼時,sccpu_dataflow.slpc[31..0]隨着時鍾周期的變化可以准確的反映出具體實現到哪一行代碼,可以通過時鍾的變化對比查看代碼的執行過程。由波形圖可知,順序執行代碼則每一條代碼運行之后PC=PC+4,這是因為每一條指令是4個字節。
(9)每一個操作第一步時取指令,分析指令,最后一步是PC+4。
(10)在執行LOAD指令時,wmem的信號為1,則m2reg的信號也為1。
(11)I型指令中操作數immediate只有16位,所以進行運算的時候需要擴展為16為,在進行邏輯運算時進行0擴展(邏輯運算操作數沒有負數),進行LOAD/STORE和Branch指令時進行符號擴展。
(12)Beq的指令運算方式為:PC+4+(sign(imm))*4。