計算機組成原理課程設計_微程式控制的簡單模型機設計
微程式控制的簡單模型機設計
要求
基本要求
完成一個簡單主機的設計,模型機應具備如下能力:在自行設計的指令集基礎上,執行自行編寫的簡單使用者程式,實現特定運算功能。
彈性要求
在此基礎上,完成必要的擴充套件,實現模型機的功能擴充套件設計,包括:實現多種運算功能(指令集的擴充)、支援更為豐富的定址方式、有更為完善的微程式設計等。
實驗軟體和硬體環境
QuartusII, FPGA計算機組成實驗箱
winxp系統,記憶體8G,CPU i7-5500U
實驗原理和方法
利用所學過的理論知識,寫出要設計的指令系統的微程式。隨後確認總體結構,進行邏輯設計,再確定控制方式,編制指令流程,最後將所設計的微程式寫入計算機組成原理教學實驗系統環境中進行測試,
在設計的過程中,我們首先要確定所設計計算機的功能和用途,設計中根據功能和用途確定指令系統,資料的表示格式,位數,指令的編碼,型別,需要設計那些指令和定址方式。確定相對應指令所包含的微操作以及總體結構設計之間的資料通路結構,在此基礎上,就可以擬出各種資訊傳輸路徑,以及實現這些傳輸所需要的微指令。
實驗步驟
擬定指令系統
基本字長:
模型機基本字長定位8位,儲存容量為256*8位,
指令型別:
指令型別有三種:無運算元指令、單運算元指令和雙運算元指令。操作碼OP共四位,最多可以定義16條指令。
基本字長:8位
指令格式:
指令格式有單字長指令、雙字長指令(16位)和三字長指令(24位,僅用於乘法)三種;
在雙字長指令和三字長指令中中,第二位元組和第三位元組被定義為運算元或運算元地址
定址方式:
採用了立即數定址、直接定址兩種定址方式。
10:是立即數定址,運算元在指令的下一個單元;
20:是直接定址,運算元地址在指令的下一個單元。
基本指令集:
LOAD 取指指令
LOAD A 立即數定址
LOAD A# 直接定址
MOVE AC,R1 轉移指令(AC->R1)
MOVE R1,AC 轉移指令(R1->AC)
STORE 存數指令(AC->RAM立即數)
STORE 存數指令(AC->RAM直接定址)
ADD AC,R1 加法指令(AC+Y->AC)
ADD AC,A 加法指令(立即數定址+AC->AC)
ADD AC,A# 加法指令(直接定址+AC->AC)
MUTI AC,R1 乘法指令(AC*R1->AC/R1)
MUTI AC,R1 STORE 乘法指令(AC*R1->RAM立即數)
MUTI AC,R1 STORE 乘法指令(AC*R1->RAM直接定址)
HALT 停機指令
確定總體結構
暫存器設定:
AC、Z為帶有三態門的移位暫存器,8位
MDR,R1為帶有三態門的通用暫存器,8位
Y為暫存器,8位
IR為帶有三態門的指令暫存器,8位。
uPC,PC程式計數器,8位。
MAR為地址暫存器,8位。
運算器ALU的設定:
ALU僅提供加法運算,採用兩個74181晶片和一個74182晶片製成,並附帶一個8位移位器,用於實現乘法。
資料通路:
模型機的資料通路是以匯流排為基礎,以CPU為核心構成的。
基本指令流程舉例:
(新增控制訊號和流程)
送指令地址:
取指令:
程式計數器加1:
R0 → R1 :
R1 → RAM :
邏輯設計
ALU的邏輯設計:
由兩片74181和一片74182組成。
觸發功能:
暫存器的設計
Z和AC為八位帶三態門的移位暫存器,每個暫存器由8個D觸發器組成,每個輸入通過三個二位與門和一個三位或門組成選擇器,並在每個輸出端接三態門。
觸發功能:略
而帶三態門的通用暫存器為將移位暫存器中的移位觸發管腳接低電平直接封裝而成。
AC為累加暫存器,可存放運算元或結果、中間結果
Y為加暫存器,用於參與ALU運算。
Z為部分積暫存器,用於存放ALU得到的結果
MDR為資料暫存器,用於存放從RAM取得的運算元或地址。
MAR為地址暫存器,用於存放指向某個資料的地址。
IR為指令暫存器,用於存放微程式的基地址。
程式計數器:
也是一個帶復位和Load訊號的八位暫存器,PC加1是通過加法器實現的。復位訊號RET 的作用是有復位訊號時,計數器PC清零。
啟動器:
部件之間的連線:
由系統結構圖可看出,部件之間的連線是為單匯流排連線方式。除Z以外所有暫存器都能通過匯流排輸入,除Y的輸出連線ALU,地址暫存器MAR的輸出連線RAM地址管腳,其餘輸出都與匯流排相連。
控制方式
控制方式採用微程式控制器時序
P脈衝的低電平用做控制儲存器讀命令μRD
P脈衝的上升邊沿將讀出的微指令送 μIR
微指令格式:
微指令字長24位即 μIR23~ μIR0。
微指令欄位定義:
uIR23-uIR17:分別對應AC,IR,MAR,MDR,R1,Y,Z的觸發
1:觸發對應暫存器
0:不觸發uIR16-uIR11:分別對應AC,IR,MDR,PC,R1,Z的三態輸出的使能端
1:允許對應暫存器輸出
0:不允許輸出
(一次指令輸出僅有一個可置1)uIR10,uIR9:ALU的a輸入與b輸入的與門端,只有相應欄位為高電平才會輸入正
確欄位,否則輸入為全0。
00:00000000+00000000->ALU
01:00000000+bus->ALU
10:Y+00000000->ALU
11:Y+bus->ALUuIR8:標誌乘法的指令欄位,通過該欄位控制移位和補位
uIR7-uIR5:uPC控制的指令欄位,用來控制微程式執行的位置
100:uPC+1->uPC
010:0->uPC
001:bus->uPCuIR4:PC+1
- uIR3-uIR2:RAM讀寫控制(10讀,01寫)
- uIR1:停機指令
- uIR0:乘法最後一步標誌位
微命令形成邏輯:
略
後繼微地址產生邏輯:
使用了三種後繼微地址生成方式:
增量方式、無條件轉移方式、按操作碼轉移方式
當upc_add=1時,微程式計數 μPC執行加1操作。
當uPC_clr=1時,微程式計數器uPC清零,僅執行完一條非取指指令需要重新進入取指週期的時候使用。
當uPC_Load=1時,按IR指令暫存器的地址的高四位(低四位為0)轉移。
編制指令流程
微程式名稱 | 入口地址 |
---|---|
LOAD0 | 00H |
LOAD1 | 10H |
LOAD2 | 20H |
MOVE0 | 30H |
MOVE1 | 40H |
STORE | 50H |
STORE | 60H |
ADD | 70H |
MUTI | 80H |
MUTI | 90H |
HALT | B0H |
編制微程式
根據指令流程和微指令格式就可以編制微程式。
指令流程中每行對應一條微指令,結合總體結構框圖,寫出這個流程所對應的資料通路的控制命令。
所需的控制命令在表中的相應位置填寫上“1”,不需要的命令填寫“0”。
另外每一條微指令都要確定下條微指令地址的生成方式。
寫出取指令、每條指令對應的微程式碼,並用16進位制數表示。
除錯
單元測試部分
ALU測試:
an,bn,in_a,in_b,m,s0-s3,cn
各自分配開關
f1-f7,f8
(即進位)連線燈泡
通過控制開關檢視燈泡的方式驗證alu的加法包括進位沒有問題。
移位暫存器測試:
測試1:
c-(右移補位),c8(左移補位),c0-c7,move2low,movedirect,move2high,en
各自分配開關
cp
接單脈衝
clr
接清零脈衝
通過改變開關,使用單脈衝來測試左移右移,置數和使能端是否有效,以及有效時候的電平是否為高電平。
測試2:
將兩個移位暫存器以一個暫存器的低位接到另一個暫存器的右移的補位的方式,其他分配方式同測試1,進行16位擴充套件暫存器的測試,用來驗證一次脈衝能否實現移位和正常的補位以及。
整機測試
測試程式編寫
1.實現存取
Load1
Move1
Move2
Store
Halt
2.實現加法和結果的存放
Load1
move
Load1
Add
Store
Halt
3.實現乘法和結果的存放(兩位)
Load1
Move
Load1
MUTI
Store
測試方式
①微程式經過檢查無誤後通過“計算機組成原理與系統結構安裝軟體”以十六進位制寫入3#ROM2#ROM和1#ROM的相應單元中去。
②按復位鍵RET使MAR清0、指令計數器PC清0,保證從儲存器0號單元取指令。使微程式計數器UPC清0,保證從3#RAM、2#ROM、1# ROM的0#單元取出取指令微程式的第一條微指令。
③按一次脈衝鍵產生一負脈衝(作為 μRD ),將ROM1# 、ROM2# 0號單元的16位微指令程式碼讀出,用上升沿將微指令送入µIR15-0。
④在電路圖CP端接上連續脈衝,去掉所有路線上的燈,點選實驗平臺上的脈衝按鈕後,程式自動執行到停機指令結束。觀察F0-F5的數值是否正確。
問題分析
對整機的測試問題
為了確保不犯低階錯誤,以及不因為一些疏忽導致錯誤,我對每一個部件都做了相應的測試,通過連線開關和燈,對ALU,程式計數器,啟動器,移位暫存器,以及移位暫存器的補位都做了相應的測試。並在整機中分批次連線了大量的燈泡用來判斷當時的狀態,這樣就保證不會因為一些低階錯誤沒有發現而浪費大量的除錯時間。連續脈衝下不能正常工作
測試和除錯的過程中,我在很多地方都加了燈,以燈的變化來看資料通路里的資料內容,在單步執行的時候沒有問題,但是當處於連續脈衝狀態下就會產生影響。把燈的連線線斷開後即可解決這個問題,猜測這可能是與脈衝的頻率,機器的運算速度等相關。對於指令的簡化:
由於對本次實驗而言,ALU只用到了加法功能,因此對其m,s0-s3直接連線高低電平,以及Cn端接高電平,這樣就節省了6個管腳,從而不需要譯碼器就可以完成對機器的控制。cp脈衝的分配問題:
因為uIR和CPuRD是下降沿有效,而各個CP為上升沿有效,而單脈衝為負脈衝,因此在各個cp脈衝門之前都要加一個非門,才能確保指令的正確執行。乘法的實現:
乘法的實現原理是原碼一位乘,其中1位是符號位,7位是數值位,在乘法的時候通過acc_ml表示乘法,應該在加的過程同時左移,將結果存入Z(高8位)和AC(低8位),一共左移8次,其中數值位相加(需要判斷乘數末位)7次,最後一次通過異或門來實現符號位相乘,並置入Z的最高位。這樣就實現了8步乘法。各運算指令的實現:
各運算指令由IR的高四位形成(RAM → IR),RAM中的資料高四位寫入的是各個運算指令和操作指令。
實驗感悟
略