第四章 MIPS CPU 模組設計
以圖 3-1 的基本架構圖為設計藍圖,由於架構限制可實現的指令甚 少。以 B-Type 指令而言,圖 3-1 僅能實現 BEQ(Branch when Equal)指令;
以未帶符號運算的 R-Type、I-Type(Immediate Type)指令來看,Sign-Extend 模組沒有未帶符號擴充功能,因此無法實現 ADDU、ADDIU 等類的未帶 符號立即值運算指令。因為實作指令集的需要,需適當修改圖 3-1 的 MIPS CPU 基本架構。
以下說明各指令類別之資料路徑。要增加一道新指令前,先了解指令 運作的資料路徑,再由原始架構作資料路徑擴充與修改,最後設計控制單 元流程控制訊號。
第一節 資料路徑
壹、程式計數器資料路徑
於第三章第一節 MIPS 相關知識中曾提到,Multiple Clock Cycles MIPS CPU 充分利用 ALU 模組執行程式計數器的功能,因此 Multiple Clock Cycles MIPS CPU 利用 ALU 及一個 PC Buffer 來計算程式記憶體位址,達 到功能模組共享的目的。而程式計數器資料路徑如圖 4-1 所示。原始 MIPS CPU 結構中,完整的 32 Bits 指令分別被存於 4 個記憶體位址,因此程式 計數器每次進行遞增加 4 的運算。
在研究中,記憶體模組為完整的 256x32 Bits Block RAM,每道 32 Bits 的指令能完整被存於一個記憶體位址之中,因此程式計數器的遞增運算只 需每次加 1。
下一道指令的記憶體位址在指令提取週期即先被計算出來,保留於 PC Buffer 中,待適當的 PC Buffer 控制訊號,載入下一道指令的位址,並送至 記憶體。
圖 4-1 程式計數器資料路徑
貳、R-Type 指令資料路徑
R-Type 指令運算執行資料路徑如圖 4-2 所示。
R-Type 指令的指令解碼需使用到 OP Code、及 Function Code 來共同 解碼,參考附錄 A。Function Code 主要決定 ALU 進行何種算術邏輯運算,
此部分的功能由 ALU Control 解碼後對 ALU 進行運算控制。而 SLL、SRL、
SRA 三個移位指令,運算資料來源為 Rt、SHAMT,運算結果回存暫存器 為 Rd,所以在 Rt_Addr 的輸入端利用多工器做位址切換選擇,並建置 ALU 運算結果回寫至 Rd 暫存器的路徑。
圖 4-2 R-Type 指令資料路徑
參、I-Type 指令資料路徑
I-Type 指令運算執行資料路徑如圖 4-3 所示。I-Type 指令為暫存器與 立即值資料運算,立即值輸入在指令格式中僅 16 Bits,經由符號擴充(Sign Extend)模組擴充為 32 Bits 再與暫存器運算。Sign Extend 可執行帶符號位 元擴充及不帶符號位元擴充,I-Type 指令之 Signed、Unsigned 運算,用多 工器切換 Signed Immediate 或 Unsigned Immediate 為運算元輸入。Rt_Addr 為目的暫存器位址,由 ALU 運算結果回存路徑存至 Rt 暫存器。
PC
Memory
A_IN
B_IN
ALU_OUT
ALU Instruction
Register
ALU Control
Addr
Write Data
Mem_Dout Inst_in
Rs_Addr Rt_Addr SHAMT
Rd_Addr
ALU_FUNC
Rs_Addr Rt_Addr
Rd_Addr
MUX
Write_Data Rt_Dout Rs_Dout
ALU_Ctrl SHAMT
Register File
PC
1
A_IN
B_IN
ALU_OUT
ALU
圖 4-3 I-Type 指令資料路徑
肆、J-Type 指令資料路徑
J-Type 指令資料路徑如圖 4-4 所示。在 J-Type 指令格式中,除了 OP Code 的 6 個位元外,其餘皆為立即值輸入,在圖 3-1 的 MIPS 架構圖中,
由於每次 PC 遞增加 4,所以跳躍位址需先移位 2 個位元,再與 PC 作 OR 運算。先前提到本研究用 32 Bits 資料寬度的記憶體,每個記憶體位址能儲 存一個完整的 32 Bits 指令,所以 Jump 指令最大的跳躍範圍為((PC &
0xf0000000)|Jump_Addr)。JumpAddrExtend 模組將原本只有 26 個位元的 Jump_Addr,與目前 PC 的前六個位元做 OR 運算,成為記憶體目標位址並 存於 PC Buffer。
圖 4-4 J-Type 指令資料路徑
伍、B-Type 指令資料路徑
B-Type 指令是條件分支指令,在 B-Type 指令格式中,ALU 執行 Rs 暫存器與 Rt 暫存器資料的減法運算所產生的各項旗標(FLAGs),ALU 運算 後產生的各項旗標,經由 PC Control 模組進行條件判斷,控制 PC Buffer 是否載入新的記憶體位址。
在指令提取週期時,ALU 已預先將下一道指令的位址計算出來(PC = PC
Memory
Instruction Register
Addr
Write Data
Mem_Dout Inst_in
Rs_Addr Rt_Addr
Jump_Addr JumpAddr Extend
PC
Memory
A_IN
B_IN
ALU_OUT ALU
Instruction Register Addr
Write Data
Mem_Dout Inst_in
Rs_Addr Rt_Addr
Immed
Rs_Addr Rt_Addr
Rd_Addr
Write_Data Rt_Dout Rs_Dout
Register File
Sign Extend
MUX
PC+1),並儲存於 ALUOut Buffer 及 PC Buffer,所以在記憶體目標位址的 計算上會再偏移一個位址為(PC = (PC+1)+offset),將會跳到目標位址的下 一個位址。為解決這個問題,資料路徑的設計可以有 2 種解決方式:一為 由 ALUOut Buffer 取得的記憶體位址再作減 1 的運算,如圖 4-5 所示;另 一種解決方式是將再設計一個 PC 位址暫存器,儲存前一個 PC 位址值,
將前一個 PC 位址提取出來再與偏移位址運算,如圖 4-6 所示。在本研究 中採用圖 4-5 的解決方式。
圖 4-5 B-Type 指令資料路徑(一)
備註:-1 的修正是受 MIPS SPIM 模擬程式影響
圖 4-6 B-Type 指令資料路徑(二) 備註:PC-1 模組的修正是受 MIPS SPIM 模擬程式影響
陸、M-Type 指令資料路徑
通常 M-Type 指令中的 LW(Load Word)、LB(Load Byte)…等記憶體載
PC
Memory
A_IN
B_IN
ALU_OUT
ALU Instruction
Register
Addr
Write Data
Mem_Dout Inst_in
Rs_Addr Rt_Addr
Immed
Rs_Addr Rt_Addr
Rd_Addr
Write_Data Rt_Dout Rs_Dout
Register File
Sign Extend
MUX
-1 PC
Control
FLAGs
MUX
ALUOut Buffer
PC
Memory
A_IN
B_IN
ALU_OUT
ALU Instruction
Register
Addr
Write Data
Mem_Dout Inst_in
Rs_Addr Rt_Addr
Immed
Rs_Addr Rt_Addr
Rd_Addr
Write_Data Rt_Dout Rs_Dout
Register File
Sign Extend
MUX
PC Control
FLAGs
MUX
PC-1
入指令會花費最長的時脈週期,因為 M-Type 指令資料路徑需使用記憶體 模組。
LW 指令之資料路徑如圖 4-7 所示。LW 指令的意義是取出指定之記憶 體位址儲存的資料,寫入某指定的目標暫存器(Rt)。ALU 執行下一個 PC 位址計算外,另計算記憶體目標位址(立即值資料經 Signed Extend 模組,
執行符號位元擴充),接著等待一個時脈週期由記憶體取出所存資料,最後 回寫至暫存器堆,其他類指令就不需等待記憶體資料存取的時間。
圖 4-7 M-Type 指令(LW)資料路徑
SW(Store Word)、SB(Store Byte)記憶體儲存指令資料路徑如圖 4-8 所 示。資料路徑與 LW 指令類似,SW 指令的意義是將指定的目的暫存器資 料(Rt)回存至記憶體目標位址。因此在記憶體位址輸入端之前,使用多工 器來切換下一道指令所在位址(來源為 PC Buffer)以及記憶體目標位址(來 源為 ALUOut Buffer)。
圖 4-8 M-Type 指令(SW)資料路徑
PC
Memory
A_IN
B_IN
ALU_OUT
ALU Instruction
Register Addr
Write Data
Mem_Dout Inst_in
Rs_Addr Rt_Addr
Rs_Addr Rt_Addr
Rd_Addr
Write_Data Rt_Dout Rs_Dout Register File
MUX
ALUOut Buffer
MUX
Sign Extend
MUX
Immed
Memory
A_IN
B_IN ALU Instruction
Register Addr
Write Data
Mem_Dout Inst_in
Rs_Addr Rt_Addr
Rs_Addr Rt_Addr
Rd_Addr
Write_Data Rt_Dout Rs_Dout Register File
MUX
ALU_OUT
ALUOut Buffer PC MU
X
Sign Extend Immed
MUX
第二節 控制單元
控制單元是整個 MIPS CPU 運作排程的核心,產生各種時序控制訊號 進行資料路徑資料傳遞與運算。Multiple Clock Cycles MIPS CPU 之控制單 元設計採用狀態機(State Machine)設計方式。在每一個對應狀態,產生該狀 態運作功能相關控制訊號。
每個指令控制單元狀態機設計如圖 4-9 所示。
圖 4-9 Multiple Clock Cycles MIPS CPU 狀態機 各狀態執行工作說明如下:
一、ST_IDLE:閒置狀態。閒置狀態的作用有二,一為當 RESET=1 時,
重設整個 MIPS CPU 狀態及控制訊號;二為執行 M-Type 中的 SW 指 令、B-Type 指令和 J-Type 指令完畢後,必須存取記憶體,而使用 FPGA 內部之 Block Memory 來設計記憶體,在送入指定記憶體位址後,必
ST_IF
ST_ID
ST_MEM_
ADDR
ST_
MEM_LW
ST_RT_
EXEC
ST_
MEM_SW ST_RT_
END ST_WB
OP_M_TYPE
OP_R_TYPE
OP_SW OP_LW
ST_IT_
EXEC
ST_IT_
END
OP_I_TYPE
ST_BT_
COMP
OP_B_TYPE
ST_JT_
COMP
OP_J_TYPE
Reset
ST_IDLE
須等待一個 CLOCK 的時間,記憶體才會將正確的儲存內容送出來,
因為在執行上述指令時,需先設計一個等待狀態,才能取得正確的記 憶體位址的內容,相關於 FPGA 內部的 Block Memory 資料可參考 Xilinx 公司網站(http://www.xilinx.com)。
二、ST_IF:指令提取狀態。指令提取狀態執行工作有二,一為由記憶體 載入欲執行的指令;另一為執行 PC 遞增(PC=PC+1)。因此在 MIPS CPU 中,執行指令提取工作時,亦同時進行將程式計數器指向下一道指令 所在的記憶體位址。
三、ST_ID:指令解碼/暫存器提取狀態。在這個狀態執行的工作有三,一 為判斷指令型態為 M-Type、R-Type、I-Type、B-Type 或 J-Type;二為 提取指令中所指定的暫存器內容;三為預先計算 Branch 目標位址,並 將目標位址計算結果存於 ALUOut Buffer 中,假設指令為 B-Type 指 令,即能在下一個狀態完成 B-Type 指令的執行。
四、ST_MEM_ADDR:記憶體位址計算狀態。當指令解碼狀態(ST_ID)判 斷到此道指令是 M-Type 指令時,則進入此狀態,執行記憶體參考位 址計算,表示這道指令須進行記憶體存取。M-Type 實作指令有二個,
為 SW、LW,故而在此狀態亦須再進行 M-Type 進階指令解碼。
五、ST_MEM_SW:SW 指令執行狀態。設定記憶體位址來源為 ALU 的運 算結果,將資料存回指定的記憶體位址。
六、ST_MEM_LW:LW 指令執行狀態。設定記憶體位址來源為 ALU 的運 算結果,由指定的記憶體位址將資料提取出來。
七、ST_WB:回寫狀態。為 LW 指令最後一道執行的步驟。將 ST_MEM_LW 狀態提取出的資料寫入暫存器堆中指定的暫存器。
八、ST_RT_EXEC:R-Type 指令執行狀態。R-Type 實作指令有 11 個,在 此狀態進行 R-Type 指令進階判斷,並執行 R-Type 指令中的算術邏輯 運算指令。
九、ST_RT_END:R-Type 指令執行結束狀態。R-Type 指令運算完成態,
並將運算結果存回到 R-Type 指令中指定的 Rd 暫存器。
十、ST_IT_EXEC:I-Type 指令執行狀態。I-Type 實作指令計有 5 個,因 此在此狀態必須進行 I-Type 指令進階判斷,決定 ALU 所應執行算術 邏輯運算類別,並指定 ALU 的第二個運算元輸入的來源。
十一、ST_IT_END:I-Type 指令執行結束狀態。I-Type 指令運算完成狀態,
並將運算結果存回到 I-Type 指令中指定的 Rt 暫存器。
十二、ST_BT_COMP:B-Type 指令執行狀態。B-Type 實作指令計有 6 個,
在此狀態進行 B-Type 指令進階判斷,依指令判斷結果及旗標狀態決 定 CU_PC_WRITE_COND[5:0],同時決定下一個 PC 值的來源。
十三、ST_JT_COMP:J-Type 指令執行狀態。J-Type 實作指令只有 1 個,
即無條件跳躍指令(J),跳躍目的位址為 J-Type 指令中所指定的跳躍位 址 (PC=PC[31:26] || IR[25:0]) , 在 這 個 狀 態 下 須 設 定 PC 的 來 源 (CU_PC_SRC)。
以上為控制單元各狀態設定的說明,各狀態對應產生的控制訊號列 表,如表 4-1、表 4-2 所示。
表 4-1 各狀態對應控制訊號表
State
Control Signal ST_IDLE ST_IF ST_ID ST_MEM_ADDR ST_MEM_LW ST_MEM_SW CU_IORD 0 0 0 0 1 1 CU_MEM_WE 0 0 0 0 0 1
CU_IR_WE 0 1 0 0 0 0 CU_REG_DST 0 0 0 0 0 0 CU_MEM_TO_REG 0 0 0 0 0 0
CU_REG_WE 0 0 0 0 0 0 CU_ALU_SRCA 0 0 0 1 0 0 CU_ALU_SRCB 00 01 11 11 0 0
CU_ALU_OP 0000 0000 0000 0000 0000 0000 CU_PC_SRC 00 00 00 00 00 00 CU_PC_WE_COND 000000 000000 000000 000000 000000 000000
CU_PC_WE 0 1 0 0 0 0
表 4-2 各狀態對應控制訊號表(續)
State Control Signal
ST_RT_
EXEC
ST_RT_
END
ST_IT_
EXEC
ST_IT_
END
ST_BT_
COMP
ST_JT_
COMP
ST_WRITE_
BACK
CU_IORD 0 0 0 0 0 0 0 CU_MEM_WE 0 0 0 0 0 0 0 CU_IR_WE 0 0 0 0 0 0 0 CU_REG_DST 0 1 0 0 0 0 0 CU_MEM_TO_REG 0 0 0 0 0 0 1 CU_REG_WE 0 1 0 1 0 0 1 CU_ALU_SRCA 1 0 1 0 1 0 0 CU_ALU_SRCB 00 00 FUNC1 00 00 00 00
CU_ALU_OP 0010 0000 FUNC2 0000 0001 0000 0000 CU_PC_SRC 00 00 00 00 11 10 00 CU_PC_WE_COND 000000 000000 000000 000000 FUNC3 000000 000000
CU_PC_WE 0 0 0 0 0 1 0
結合資料路徑與控制時序之完整 MIPS CPU 實作指令擴充架構圖如圖 4-10 所示。
圖 4-10 MIPS CPU 實作指令擴充架構
Memory
ALU Control Sign Extend
ALUOut Buffer
Register File InstructionR
egister
3
1
0
2
A
B
PC 0
M U X 1
Addr
Write_
Data_in
Inst_in
RS_Addr
RT_Addr
RD_Addr
Write_Data
A_IN
B_IN ALU
ALU_Out
0 M U X 1
0 M U X 1 Mem_
Dout
0 M U X 1 RS_Addr
RT_Addr
RD_Addr IMMED ALU_FUNC
SHAMT JUMP_Addr
RS_Dout
RT_Dout 0
1 2 3
M U X
SHAMT FLAGs
1
ALU_
CTRL
CU_IORD
CU_MEM_WE CU_IR_WE
CU_REG_DST
CU_REG_WE
CU_ALU_SRC
A CU_PC_SRC
CU_ALU_OP CU_ALU_SRC
B CU_MEM_TO_REG
CU_PC_WE
CU_PC_WRITE_COND[5:0]
FLAGs PC
Controller
Unsigned_exetend Sign_exetnd
-1
PC_LOAD
MUX
REG_Sel REG_SEL
REG_Dout REG_DOUT
Reg_We
JumpAddrExtend