目錄
一. 實驗內容
二. 實驗步驟
(1)七段數碼管顯示模塊
(2)指令模塊
(3)控制模塊
(4)ALU模塊
(5)CPU模塊
三. 實現效果
四. 實驗環境
五. 實驗小結及思考
一. 實驗內容
設計一個簡易的計算器:
????????在上一個實驗當中,你已經成功設計好了一個cpu,在該cpu基礎之上,請你利用軟硬件協同設計思想,在此基礎之上設計一個簡單的整數“加,減,乘,除”計算器,對于計算器計算的結果,你需要用七段數碼管進行展示。
二. 實驗步驟
(1)七段數碼管顯示模塊
????????在這個簡易計算器中,我們最終需要將結果顯示七段數碼管上面。在這里我們首先需要設計一個譯碼器,使得輸入0~9可以顯示在七段數碼管上面。
????????利用一個真值表,輸入一個4bit的數,可以表達0~9,并且成功點亮七段數碼管8個LED燈的相應LED燈。真值表如下:
????????(10~15不顯示結果)
????????利用如上的真值表,就可以設計出以下電路:
????????來實現輸入對應的0~9可以在數碼管上面顯示出來。
????????由于輸出的結果是16進制的數,且是32bit的,需要轉化為兩個十進制的數來顯示。可以將得到的結果利用分隔線這個運算器來實現除A(10)的操作,把商的低4位給第一個數碼管(十位)。把余數的低4位給第二個數碼管(個位)。電路連接如下:
(2)指令模塊
????????我們需要重新寫一段代碼,翻譯成機器碼,存儲到ROM中。
????????以上是在venus仿真器中編寫的代碼。實現每次從內存中取兩個數據,分別進行加減乘除運算后,再把結果寫回到內存中的運算。我們將以上代碼翻譯為機器碼后,再復制到CPU的ROM中。
(3)控制模塊
????????因為在實驗二中,并沒有用到sub和div這兩條指令。所以在這個模塊中,我們需要添加這兩條指令。查詢RISC-V指令集手冊,可以補全實現二的表格。如下:
????????然后需要在control模塊中添加這兩條模塊的識別電路,通過opcode、fun3、fun7來共同實現。再添加一個復用器,選擇位設定為2,來控制當識別為sub或div指令的時候,選擇ROM中的第8和第9條機器碼來識別一些控制信號。電路如下:
(4)ALU模塊
????????在ALU模塊中,原本沒有除法運算,所以需要添加除法運算的電路模塊。在實驗二里,AULSel的0011是未使用的,在這里就可以用于除法的使用。利用一個分隔器來實現除法運算,電路如下:
(5)CPU模塊
????????由于將四則運算的結果分別存到t4、t5、t6、s0寄存器里,所以在在CPU中,只需要將對應寄存器的值傳輸給譯碼器后,再連接七段數碼管即可。電路如下:
三. 實現效果
????????將機器碼加載到ROM中,將數據加載到RAM中,開始運行,即可得到如下效果:
????????在RAM中:
????????數碼管顯示:
????????此結果與venus仿真器中的結果一致:
四. 實驗環境
????????使用Logisim完成RISC-V處理器的設計和調試。
????????使用Venus仿真器完成測試程序的運行和調試、內存轉儲(memory dump)。
五. 實驗小結及思考
1.了解了ALUSel是什么。
????????ALUSel信號用于ALU中,選擇對應的運算。它的值需要根據我們具體設置的ALU來設定。
2.在匯編語言中懂得了.word?和?.space?是兩種常用的偽指令(pseudo-instruction),它們用于在數據段中定義和初始化數據。
????????.word?用于在內存中定義一個或多個32位(或根據目標處理器架構可能是其他位寬)的整數。
????????這些整數可以是立即數(即直接給出的數值),也可以是標簽(代表另一個內存位置的值,但這在?.word?中不常見,通常用于其他類型的指令或偽指令中)。
????????.space?用于在內存中分配一定大小的空間,但不初始化這些空間(即這些空間的內容是未定義的,可能是隨機的或零,取決于系統的內存管理)。.space?通常需要一個參數,指定要分配的空間大小(以字節為單位)。
3.學會了如何讀入外設,以及如何把數據輸出到外設中。
????????可以通過設置使能端和其他控制信號將外設數據輸入寄存器文件中和把數據輸出到外設中。