第三章 CPU 設計
本研究將實作一 32 位元的 Multiple Cycle MIPS CPU 含單精度浮點運 算並將 24 位元的 CORDIC 運算單元整合在 CPU 的架構當中,利用 MIPS 原有的協同處理器指令來控制浮點運算單元及 CORDIC 運算單元。以下將 依序介紹本研究所實作的 32 位元 MIPS CPU、浮點運算器及 CORDIC 運 算器。
壹、模組規劃並定義功能需求
為遵循模組化設計、由上而下設計的原則,將系統中每一單元功 能向下拆分為各個小模組,整體 MIPS CPU 設計模組架構規劃為 4 個 層級(Layer),如圖 3-1 所示。最上層為完整 32 Bits 之 MIPS CPU,第 二層則由 Mano[12]對於 CPU 架構規劃的概念,將 MIPS CPU 區分為 資料路徑單元與控制單元二個模組,其下再定義資料路徑單元所需之 各分支模組,其中包含了基本算術邏輯運算單元、ALU 控制單元(ALU Control)、指令暫存器單元(Instruction Register)、記憶體單元(Memory)、
暫存器堆(Register File)、浮點運算單元及 CORDIC 運算單元。
32 Bits MIPS
Data_Path
ALU Control
ALU Instruction
Register Memory Control Unit
Register File
Basic Functions
Barrel
Shifter Mem.xco
Floating Point
CORDIC
圖 3-1 MIPS CPU 模組架構圖 各模組詳細說明如下:
一、 ALU:
依指令集規劃下,設計具備 MIPS CPU 基本算術及邏輯運算功 能,此單元除了做暫存器及立即值之算術邏輯運算外,亦須扮演計算 程式計數器的角色,負責計算下一道指令的記憶體位址或程式分支位 址。ALU 模組其下又分為 Basic Function 模組及 Barrel Shifter 模組。
Basic Function 模組負責執行指令集中的 ADD、SUB、AND、OR、XOR、
NOR 等相關運算,如圖 3-2;Barrel Shifter 模組負責執行指令集中的 移位指令運算,如 SLL、SRL、SRA 指令。
0
1
2
3 FA
0 1
OP
Sum
Carry Out Carry In Binvert
a
b
less
圖 3-2 左圖為文獻[11]建議的 1bit ALU 架構,右圖為修改過後的架構
在 ALU 中最重要的單元,也是最耗時間的是加減器的進位,一般 加減器常用的漣波進位(Ripple Carry)在連接的位元數越長的情況下,
進位的延遲時間越長。因此,本研究在這邊使用了快速進位邏輯,使 用的是前瞻進位(Carry Look-ahead)的方法,1 Bit ALU 的修改如上圖。
FA
OP
Sum Carry In
Binvert
a
b
less
0 1
0
1
2
3 4 5
P0 G0
圖 3-3 為本研究所使用的 4 位元前瞻進位邏輯及其圖形表示(.表 示邏輯 AND, + 表示邏輯 OR)
Generate G = ( A AND B ) Propagate P = ( A XOR B ) P0-3 = (P3.P2.P1.P0)
G0-3 =( G3 + P3.G2 + P3.P2.G1 + P3.P2.P1.G0 )
圖 3-3 四位元的全加器(PFA)與其前瞻進位邏輯連接圖
本研究一開始是使用傳統的漣波進位方法所做成的加減器,但是 在經過合成之後發現進位延遲約接近 90ns;於是打算使用快速進位邏 輯來改善其延遲,在加入了三階層的四位元快速進位邏輯之後,進位
延遲已經減少到約 60ns,時間延遲約改善了三分之一。
移位器:
ALU 運算單位 裡面包含了一個 32 位 元的桶型移位器(Barrel Shifter),可以執行左移或右移的邏輯或算術移位達 31 位元。其設計如 圖 3-4;使用 Mano[12]中提到的階層式的移位器設計,並以右旋 (Rotation)的方式來執行左移和右移。A 為資料輸入,Left/Right 為控制 訊號來選擇左移或右移,shamt 為 5 位元移位量的選擇。
Shift right(0,16,32,48)
Shift right(0,4,8,12)
Shift right(0,1,2,3) Alternative
2's complement
shamt Left/right `0'
0 || A A(31) || A
圖 3-4 三十二位元桶形移位器設計
二、ALU Control:依每道指令之不同,分別產生控制 ALU 執行算術或邏 輯運算之訊號產生單元。
三、Instruction Register:暫存由記憶體送出之指令,並依下級運算所需 將指令依指令格式解碼並分送至下一級的模組。
四、Memory:記憶體為指令及資料儲存所在,在本研究中使用四個 8 x 256 Bits 大小之 Block RAM。Block RAM 係利用 Xilinx ISE 中之 Core
Generator 產生。
如圖 3-5 所示,因為本研究所實作的記憶體指令分別有 byte 控 制,halfword 控制及 word 控制,所以記憶體區塊以 8 位元為一個單位 做存取的控制。記憶體區塊上方的電路是儲存指令使用到的部份,而 下方的電路則是載入暫存器指令需用到的部份,同樣的也有三種載入 的方式,最後再由一個多工器做輸出的選擇。
Store Word
Store Halfword Store
byte
Slt[1:0]
MEM0 MEM1
MEM2 MEM3
Add[7:0] Add[7:0] Add[7:0] Add[7:0]
w w w w
15 0 31 16
Sign Extension Or Zero
7 0 31 8
Sign Extension Or Zero
Slt[1:0]
Slt[1]
31 0
Output Select
Data in Data in Data in Data in
D[31:24]
D[ 7: 0]
D[15:8]
Sw,Sb 10 01 00
D[ 7: 0]
D[23:16]
Sw 0
1
D[15:8]
D[7:0]
Sb 0
1
D[7:0]
圖 3-5 記憶體控制電路
五、Register File:
如圖 3-6 為 MIPS CPU 之暫存器,包含有 32 個 32 位元的一般用 途 暫 存 器 (General Purpose Registers) , 當 中 除 了 有 兩 組 位 址 選 擇 (Rreg_in1 & Rreg_in2)可以選擇所要輸出的暫存器內容(Rd_out1 &
Rd_out2)之外,還有一組可供資料寫入的位址端(Wreg_in)及資料輸入 端(Wdata_in),並有一個寫入的控制訊號(RegWrite)供控制單元使用。
兩組輸出位址端及輸入位址端為 5 位元寬度,資料寫入端及兩組資料 輸出為 32 位元。
Register Bank Rreg_in1
Rreg_in2
Wreg_in
Wdata_in
Rd_out1
Rd_out2 RegWrite
CLK
圖 3-6 MIPS 的 32 個暫存器區及輸出入控制 六、Floating Point:
為 32 位元單精度浮點運算單元,規劃有加、減、乘、除四道浮 點運算指令。以下將介紹 32 位元浮點運算器之設計,在 MIPS 裡面是 照 IEEE 754 標準做設計,所以在此本研究亦參考其格式[17]:
(一)IEEE754 浮點數格式
IEEE754 是 由 美 國 電 機 電 子 工 程 協 會 (Institute of Electrical Electronic Engineers, IEEE) 針對浮點數的格式所制訂的一個標準,也 是最廣泛被使用的浮點數標準,此標準格式有兩種格式,分別為三十 二位元的「單精準度」 (Single Precision)與六十四位元的「雙精準度」
(Double precision),本研究的浮點數是使用三十二位元的單精準度。格 式如圖 3-7 所示。
) 1 2(exp
) 1
( ) 1
(− s × + significand × onent−bias+
s:為 sign bit,共 1bit,用來表示正負數用的。
exponent:為指數部分,共 8its,指數範圍為2−126~2127。 significand:為有效數字,共 23bits,放小數用的。
bias:偏差值,IEEE754 單精度的偏差值為 127 = (0111 1111)bin。
有 效 數 ( Significan d ) 指 數 ( E x po nen t)
符 號 ( S ig n )
0 2 2
2 3 3 0
3 1
1 B its 8 B its 2 3 B its
圖 3-7 IEEE754 單精度浮點數格式 (二)浮點加減法器設計
在浮點的算術中,加減法的複雜度高於乘除法,是因為要先兩運 算數的指數部分調整為相等,才可以進行浮點加減法運算,浮點加減 法演算法流程如圖 3-8,浮點加減法演算法有四個基本步驟:
1 運算元零檢查:兩個運算元中,當有任何一個運算元為零時,
則運算結果可以直接輸出另一個非零運算元的值,若兩運算元皆 為零,則運算結果即為零,不需運算。
2 對齊有效數(校正指數):浮點數要進行加減法運算前,要先將 兩方指數部分調整為一樣才可進行運算。
3 加減法有效數:指數調整完畢後,接下來進行有效數的加或減,
運算完畢後需判斷結果(有效數)是否為零,以及有效數、指數 是否有發生溢位,一旦發生必須離開整個浮點運算的流程。
4 將運算結果正規化:運算結束後,得到的結果可能不符合標準 表示法,因此必須將運算結果轉換為正規化的格式。
改變B的符號 A = 0 ?B = 0 ? C BC A 返回是
否 是
指數 相等? 遞增較小 的指數 有效數右移 有效數 =0? 放入其他 數值於C
是
否
否
將帶符號的 有效數相加 C 0有效數 =0? 有效數 溢位? 指數遞增 指數 溢位? 回報溢位否
是 是 是
結果 正規化?有效數左移 指數遞減 指數 欠位? 回報欠位
是
結果作捨入
是
否 否返回 返回
返回 返回 返回
加法
減法 否 有效數右移 否
是
圖 3-8 浮點加減法運算流程
(三)浮點乘除法器設計
浮點乘法運算為,如果任一輸入值為零,結果便為零,下一步將 指數相加,因為指數是以偏移值的形式儲存,則相加之後會使偏移值 加倍,所以必須將指數相加完後的結果減去偏移值,若有發生指數欠 位、溢位的情形,則離開整個浮點運算的流程,接下來將有效數相乘,
並將結果做正規化與捨入的動作,如圖 3-9。
A = 0 ?
C 0 是
否 乘法
B= 0 ? 是
否 指數相加
減去偏移量
指數
溢位? 是 回報溢位
返回 否
指數
欠位? 回報欠位
否
是
正規化 相乘有效數
將結果捨入 返回
返回
圖 3-9 浮點乘法運算流程圖
浮點除法運算為,首先如果除數為零則結果無窮大,被除數為零 則令結果為零,下一步將指數相減,這個動作會移走偏移值所以接下 來必須將偏移值加回去,然後觀察指數是否發生欠位或溢位,最後將 有效數相除,並做正規化與捨入的動作,如圖 3-10。
A = 0 ?
C 0 是
否 除法
B= 0 ? (除數)
是
否 指數相減
加上偏移量
指數
溢位? 是 回報溢位
返回 否
指數
欠位? 回報欠位
否
是
正規化 相除有效數
將結果捨入 返回
返回 C 無窮大
圖 3-10 浮點除法運算流程圖
七、CORDIC:
為 24 位元三角函數運算單元,能執行 Cos 與 Sin 的運算。
根據第二章的相關知識可知,CORDIC 演算法如下:
} ,..., 2 , 1 , 0 { , )
2 ( tan
} 1 , 1 { ,
2 2 1 1
1 1
n i
d Z Z
d X
d Y Y
Y d
X X
i i i i
i i i
i i i
i i i i i
=
⋅
−
=
+
−
∈
⋅
⋅ +
=
⋅
⋅
−
=
− + −
+ − + −
依演算法,可規劃其硬體架構如下
圖 3-11 CORDIC 硬體架構
其硬體架構大致可分成兩個部份,一個是左邊的向量計算路徑,
右邊的是角度計算路徑。向量計算路徑根據目前的殘留角度決定加減 器的加或減,角度計算路徑則是剩餘角度為正就減,為負就加,使角 度漸趨為零,當 n+1 次旋轉(Iteration)完成後就可得到答案。
位元寬度及精準度:
根據 Kota[18]的分析,要達到 N 位元的精準度,則 CORDIC 的
位元寬度至少要(n+log2n+2)位元,且進行 n+1 次旋轉。本研究欲設 計一個達 16 位元精準度的 CORDIC 運算器,則至少須使用 22 位元寬 度及 17 次旋轉,本研究使用 24 位元寬度已足矣。
CORDIC 的資料表示法:
21 4
3 2 1 0
12 2 2 2 2 ...2
2 • − − − − −
S (a)
16 4
3 2 1 0 1 2 3 4 5
62 2 2 2 2 2 2 2 2 2 ...2
2 • − − − − −
S (b)
上面為 CORDIC 的 24 位元表示法,(a)為向量路徑(X,Y path)的 表示法,(b)為角度路徑(Z path)的表示法;(•)代表小數點,其左邊位 元代表整數右邊位元代表小數,S 代表符號位元。
長度因子 i
n
Kn =∏ 1+2−2 :
當 n=16 時,1/Kn 約等於 0.607240,將其轉成 24 位元 CORDIC 格式為 136E9E (Hex)。所以要做 Cos 或 Sin 運算時,將 X 的初始值設 為 1/Kn,Y 設為零,運算後即可同時得到 Cos 跟 Sin 的值。因此本研 究所使用的補償方式可歸類為預補償。1/Kn 的編碼轉換如下,格式可 對照上面之資料表示法(a)。
Ex:設 n=16
則 1/Kn = 0.60725288166
= 000.1 0011 0110 1110 1001 1101 10 = 136E9E (Hex)
儲存角度:
在角度計算路徑中,需有一儲存角度值的記憶體空間,執行 n+1 次旋轉理論上需要預先計算 n+1 個角度值,並儲存在記憶體裡供角度 運算使用。表 3-1 為角度計算路徑中所儲存的角度值及其編碼格式對 照表。
表 3-1tan−1(2−N)角度編碼對照表
N tan−1(2−N) in Z PATH tan−1(2−N) 0 0010 1101. 0000 0000 0000 0000 = 2D0000 45
1 0001 1010. 1001 0000 1010 0111 = 1A90A7 26.56505117 2 0000 1011. 0000 1001 0100 0111 = 0B0947 14.03624346 3 0000 0111. 0010 0000 0000 0001 = 072001 7.125016348 4 0000 0011. 1001 0011 1000 1010 = 03938A 3.576334374 5 0000 0001. 1100 1010 0011 0111 = 01CA37 1.789910608 6 0000 0000. 1110 0101 0010 1010 = 00E52A 0.895173710 7 0000 0000. 0111 0010 1001 0110 = 007296 0.447614170 8 0000 0000. 0011 1001 0100 1011 = 00394B 0.223810500 9 0000 0000. 0001 1100 1010 0101 = 001CA5 0.111905670 10 0000 0000. 0000 1110 0101 0010 = 000E52 0.055952891 11 0000 0000. 0000 0111 0010 1001 = 000729 0.027976452 12 0000 0000. 0000 0011 1001 0100 = 000394 0.0139882271 13 0000 0000. 0000 0001 1100 1010 = 0001CA 0.0069941136 14 0000 0000. 0000 0000 1110 0101 = 0000E5 0.0034970568 15 0000 0000. 0000 0000 0111 0010 = 000072 0.0017485284 16 0000 0000. 0000 0000 0011 1001 = 000039 0.0008742642
貳、資料路徑
MIPS 的指令類型分為三種,分別是 R-Type、I-Type 及 J-Type。
本 研 究 在 此 又 將 跳 躍 (B-Type) 指 令 及 記 憶 體 相 關 (M-Type) 指 令 從 I-Type 中獨立出來以方便分析,另外再加上浮點指令及 CORDIC 指 令。以下將分別說明其指令格式及資料路徑。
一、R-Type
(一)指令格式:
31 26 25 21 20 16 15 11 10 6 5 0 0 Rs Rt Rd Shamt Func
上方為 R-Type 的指令格式,在 OP Code 的部份是為 0,利 用第 0 至 5 bit 的 Function Code 來做不同指令的判別,第 6 至 10 bit 是 5 位元的移位量設定欄,僅在移位指令被使用到,最多可達到 31 個位元的移位量。Rs 與 Rt 欄位分別可控制兩個不同的暫存器 至 ALU 做運算,運算後的結果再存回 Rd 欄位所選擇的暫存器。
(二)資料路徑
R-Type 指令運算執行資料路徑如圖 3-12 所示。R-Type 指令 的指令解碼需使用到 OP Code、及 Function Code 來共同解碼。
Function Code 主要決定 ALU 進行何種算術邏輯運算,此部分的功 能由 ALU Control 解碼後對 ALU 進行運算控制。而 SLL、SRL、
SRA 三個移位指令,運算資料來源為 Rt、SHAMT,運算結果回存 暫存器為 Rd,所以在 Rt_Addr 的輸入端利用多工器做位址切換選 擇,並建置 ALU 運算結果回寫至 Rd 暫存器的路徑。
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
圖 3-12 R-Type 指令資料路徑
二、I-Type
(一)指令格式:
31 26 25 21 20 16 15 0 OP Rs Rt Immediate Value
上方為 I-Type 的指令格式,根據 OP 欄位的不同來對不同的 I-Type 指令做解碼。此指令的動作為,將 Rs 欄位所選擇的暫存器 內容值與 16 位元的 Immediate Value(立即值)送到 ALU 做運算後,
再存入 Rt 欄位所選擇的暫存器。
(二)資料路徑:
I-Type 指令運算執行資料路徑如圖 3-13 所示。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 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
圖 3-13 I-Type 指令資料路徑
三、J-Type
(一)指令格式:
31 26 25 0 2 Jump Address
上面是 J-Type 的格式,第 31 至 26 bit 的 OP Code 欄位固定 是 2,後面的欄位則是所要跳躍的目的位址。要注意的是此跳躍指 令的跳躍位址是指絕對位址,即程式計數器(PC)中的值。
(二)資料路徑:
J-Type 指令資料路徑如圖 3-14 所示。在 J-Type 指令格式中,
除了 OP Code 的 6 個位元外,其餘皆為立即值輸入,在 MIPS 架 構圖中,由於每次 PC 遞增加 4,所以跳躍位址需先移 2 個位元,
再與 PC 作 OR 運算。而 Jump 指令最大的跳躍範圍為((PC &
0xf0000000)|Jump_Addr)。JumpAddrExtend 模組將原本只有 26 個 位元的 Jump_Addr,與目前 PC 的前六個位元做 OR 運算,成為記 憶體目標位址並存於 PC Buffer。
PC
Memory
Instruction Register
Addr
Write Data
Mem_Dout Inst_in
Rs_Addr Rt_Addr
Jump_Addr JumpAddr Extend
圖 3-14 J-Type 指令資料路徑
四、B-Type
(一)指令格式:
31 26 25 21 20 16 15 0 OP Rs Rt Branch Address
上面是 B-Type 的指令格式,欄位與 I-Type 是一樣的,差別 是在後面的是分支跳躍位址(Branch Address),而跳躍的目的位址 是目前的 PC 加上 Branch Address,即相對位址。
(二)資料路徑:
B-Type 指令是條件分支指令,在 B-Type 指令格式中,ALU 執行 Rs 暫存器與 Rt 暫存器資料的減法運算所產生的各項旗標 (FLAGs),ALU 運算後產生的各項旗標,經由 PC Control 模組進 行條件判斷,控制 PC Buffer 是否載入新的記憶體位址。在指令提 取週期時,ALU 已 預先將下一道指令 的位址計算出來(PC = PC+1),並儲存於 ALUOut Buffer 及 PC Buffer,所以在記憶體目 標位址的計算上會再偏移一個位址為(PC = (PC+1)+offset),將會跳 到目標位址的下一個位址,如圖 3-15。
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
ALUOut Buffer
圖 3-15 B-Type 指令資料路徑
五、M-Type
(一)指令格式:
31 26 25 21 20 16 15 0 OP Rs Rt Offset Address
上面的是 M-Type 的指令格式,與 I-Type 是相同的。載入 (Load)的動作是,將 Rs 暫存器的內容值加上偏移位址(Offset Address)的和,作為記憶體的目標位址,然後把相對的記憶體內容 提出並載入 Rt 暫存器,而儲存(Store)的指令動作則與載入相反。
(二)資料路徑:
通常 M-Type 指令中的 LW(Load Word)、LB(Load Byte)…等,
記憶體載入指令會花費最長的時脈週期,因為 M-Type 指令資料路 徑需使用記憶體模組。
LW 指令之資料路徑如圖 3-16 所示。LW 指令的意義是取出 指定之記憶體位址儲存的資料,寫入某指定的目標暫存器(Rt)。ALU
執行下一個 PC 位址計算外,另計算記憶體目標位址(立即值資料 經 Signed Extend 模組,執行符號位元擴充),接著等待一個時脈週 期由記憶體取出所存資料,最後回寫至暫存器堆,其他類指令就 不需等待記憶體資料存取的時間。
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
圖 3-16 M-Type 指令(LW)資料路徑
SW(Store Word)、SB(Store Byte)記憶體儲存指令資料路徑如 3-17 所示。資料路徑與 LW 指令類似,SW 指令的意義是將指定 的目的暫存器資料(Rt)回存至記憶體目標位址。因此在記憶體位址 輸入端之前,使用多工器來切換下一道指令所在位址(來源為 PC Buffer)以及記憶體目標位址(來源為 ALUOut Buffer)。
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
圖 3-17 M-Type 指令(SW)資料路徑
六、浮點指令 (一)指令格式:
31 26 25 21 20 16 15 11 10 6 5 0 OP(17) 16 Rs Rt Rd Func
上面為 MIPS 中的浮點指令格式,OP 欄位固定是 17,代表 將使用浮點運算器指令,而第 25 至 21 的欄位則是用來選擇使用 單精度浮點運算器或雙精度浮點運算器,在此使用單精度浮點運 算器,所以此欄位固定為 16。之後的三個欄位關係跟 R-Type 一 樣,將 Rs 及 Rt 暫存器的內容值送至浮點運算器做運算後存入 Rd 暫存器。運算的類型則是由 Func 欄位選擇,其功能選擇如下:
FUNCTION
CODE 代表指令
0 1 2 3
ADD.F SUB.F MUL.F DIV.F
[19]中有提到,在使用浮點運算器的時候,可另外規劃浮點 運算暫存器堆(Register Files)供輔助運算器使用,以免跟一般運算 資料混淆。但本研究在此僅實作單精度浮點運算器,而在考慮並 無迫切需要且控制資源消耗之下並沒有另外規劃浮點運算暫存器 堆,僅與 ALU 共用原來的一般暫存器堆。在此必需說明的是,兩 者的指令控制在硬體上是有衝突的,但經觀察比較浮點運算指令 後發現,在經過一些修改之後,可共用相同的硬體架構及控制單 元。其說明如下:
31 26 25 21 20 16 15 11 10 6 5 0 OP(17) Rs Rt Rd
修改後的浮點指令
上面為修改後的浮點指令,主要是將原本第 25 位元至 21 位 元的欄位取消,並將後面的三個欄位往前移動 5 個位元,以符合 R-Type 的格式。可以取消第 25 至 21 位元欄位的理由是,此欄位 原來的作用為選擇單精度或雙精度浮點運算器,而本研究在此僅 實作單精度浮點運算器,所以此選擇欄位事實上並沒有使用到的 需要,故可省略之。
(二)資料路徑:
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
Write_Data Rt_Dout Rs_Dout
ALU_Ctrl SHAMT
Register File
FP_ALU FP_X
FP_Y FUNC
M U X M U X
FP_OUT 32
32
2
32
圖 3-18 浮點指令資料路徑
如圖 3-18 所示,為浮點運算指令的資料路徑,由指令暫存 器中的最低兩位元直接連接到浮點運算器做運算指令選擇,其兩 筆運算資料輸入由 Rs 及 Rt 控制,運算完後再儲存到 Rd 所指定的 暫存器。其中 PC 值依然由原本的 ALU 計算後產生。
七、CORDIC 運算指令 (一)指令格式:
31 26 25 21 20 16 15 0 (20)dec Rs Rd
Cos 指令
31 26 25 21 20 16 15 0 (21)dec Rs Rd
Sin 指令
上面為自行設計的 Cos 與 Sin 指令,其硬體為利用 CORDIC 演算法所完成的處理器。兩個指令的差別在前面 OP Code 的欄位,
Cos 是利用 20,而 Sin 是用 21,此 OP Code 位址與原有的指令並 沒有衝突,是利用空的 OP Code 來做編碼。這個指令的動作設計 是,將 Rs 暫存器的內容值(角度值)送到 CORDIC 運算器做運算,
完成後再存入 Rd 暫存器所指定的暫存器位置。
(二)資料路徑:
PC
M em ory
A_IN
B_IN
ALU _O U T ALU
Instruction R egister
ALU C ontrol Addr
W rite D ata
M em _D out Inst_in
R s_Addr R t_Addr SH AM T
R d_Addr
ALU _FU N C
R s_Addr R t_Addr
R d_Addr
W rite_D ata R t_D out R s_D out
ALU _C trl SH AM T
R egister File
M U X M U X
C O R D IC AN G LE
IN
G O
C O S
SIN 1
6
3 2
圖 3-19 CORDIC 運算資料路徑
如圖 3-19 所示,將 Rs 所選擇的暫存器內容送至 CORDIC 運算器,
完成後再存入 Rd 暫存器,而 PC 值依然是由 ALU 計算後產生。
參、控制單元
控制單元是整個 MIPS CPU 運作排程的核心,產生各種時序控制 訊號進行資料路徑資料傳遞與運算。Multiple Clock Cycles MIPS CPU 之控制單元設計採用狀態機(State Machine)設計方式。在每一個對應狀 態,產生該狀態運作功能相關控制訊號。
每個指令控制單元狀態機設計如圖 3-20。
圖 3-20 Multiple Clock Cycles MIPS CPU 狀態機
各狀態執行工作說明如下:
一、IDLE:閒置狀態。閒置狀態的作用有二,一為當 RESET=1 時,重設 整個 MIPS CPU 狀態及控制訊號;二為執行 M-Type 中的 SW 指令、
B-Type 指令和 J-Type 指令完畢後,必須存取記憶體,而使用 FPGA 內部之 Block Memory 來設計記憶體,在送入指定記憶體位址後,必 須等待一個 CLOCK 的時間,記憶體才會將正確的儲存內容送出來,
因為在執行上述指令時,需先設計一個等待狀態,才能取得正確的記 憶體位址的內容,相關於 FPGA 內部的 Block Memory 資料可參考[18]。
二、FETCH:指令提取狀態。指令提取狀態執行工作有二,一為由記憶 體載入欲執行的指令;另一為執行 PC 遞增(PC=PC+1)。因此在 MIPS CPU 中,執行指令提取工作時,亦同時進行將程式計數器指向下一道 指令所在的記憶體位址。
三、DECODE:指令解碼/暫存器提取狀態。在這個狀態執行的工作有三,
一為判斷指令型態為 M-Type、R-Type、I-Type、B-Type 或 J-Type;二 為提取指令中所指定的暫存器內容;三為預先計算 Branch 目標位址,
並將目標位址計算結果存於 ALUOut Buffer 中,假設指令為 B-Type 指令,即能在下一個狀態完成 B-Type 指令的執行。
四、MEM_EXEC:記憶體位址計算狀態。當指令解碼狀態(ST_ID)判斷到 此道指令是 M-Type 指令時,則進入此狀態,執行記憶體參考位址計 算,表示這道指令須進行記憶體存取。M-Type 實作指令有二個,為 SW、LW,故而在此狀態亦須再進行 M-Type 進階指令解碼。
五、MEM_END:如過是 STORE 指令,設定記憶體位址來源為 ALU 的運 算結果,將資料存回指定的記憶體位址。反之,如為 LOAD 指令,設 定記憶體位址來源為 ALU 的運算結果,由指定的記憶體位址將資料 提取出來。
六、WRITE_BACK:回存狀態。為 LOAD 指令最後一道執行的步驟。將 MEM_END 狀態提取出的資料寫入暫存器堆中指定的暫存器。
七、R_EXEC:R-Type 指令狀態。R-Type 實作指令有 11 個,在此狀態進 行 R-Type 指令進階判斷,並執行 R-Type 指令中的算術邏輯運算指令。
八、R_END:R-Type 指令結束狀態。R-Type 指令運算完成態,並將運算 結果存回到 R-Type 指令中指定的 Rd 暫存器。
九、I_EXEC:I-Type 指令狀態。I-Type 實作指令計有 8 個,因此在此狀 態必須進行 I-Type 指令進階判斷,決定 ALU 所應執行算術邏輯運算 類別,並指定 ALU 的第二個運算元輸入的來源。
十、I_END:I-Type 指令執行結束狀態。I-Type 指令運算完成狀態,並將 運算結果存回到 I-Type 指令中指定的 Rt 暫存器。
十一、B_EXEC:B-Type 指令狀態。B-Type 實作指令計有 4 個,在此狀態 進 行 B-Type 指 令 進 階 判 斷 , 依 指 令 判 斷 結 果 及 旗 標 狀 態 決 定 CU_PC_WRITE_COND[5:0],同時決定下一個 PC 值的來源。
十二、J_EXEC:J-Type 指令狀態。J-Type 實作指令只有 1 個,即無條件 跳躍指令(J),跳躍 目的位址為 J-Type 指令中所指定的跳 躍位址 (PC=PC[31:26] || IR[25:0]) , 在 這 個 狀 態 下 須 設 定 PC 的 來 源 (CU_PC_SRC)。
十三、FP_EXEC:浮點指令狀態。此時將資料送至浮點運算器做運算,
並等待其完成。
十四、FP_WAIT:浮點指令的等待狀態。浮點指令通常需要五至八個時脈 周期左右的等待時間,完成後將結果儲存至 Rd 暫存器。
十五、COD_EXEC:CORDIC 演算法指令狀態。此時將資料送至 CORDIC 運算器做運算,並等待其輸出完成,完成後將結果儲存至 Rt 暫存器。
十六、COD_WAIT:CORDIC 指令的等待狀態。CORDIC 指令需要 21 個 時脈周期的等待時間。
以上為控制單元各狀態設定的說明。
肆、實作指令集
在本研究中實作的記憶體相關指令、算術、邏輯運算指令、分支 指令,已包含 MIPS 指令集中的主要指令。在指令集編碼方面,遵循 MIPS CPU 指令集編碼並未做任何修改,實作指令集如表 3-2 所示,
有 37 道固定點指令,4 道浮點指令,2 道 CORDIC 指令,共 43 道指 令。
表 3-2 實作指令表編碼
J-Type OP Code
J 00 0010 (2) Jal 00 0011 (3)
I-Type OP Code
Beq 00 0100 (4) Bne 00 0101 (5)
Blez 00 0110 (6) Bgtz 00 0111 (7)
Addi 00 1000 (8) Lb 10 0000 (32)
Addiu 00 1001 (9) Lh 10 0001 (33)
Slti 00 1010 (10) Lw 10 0011 (35)
Sltiu 00 1011 (11) Lbu 10 0100 (36)
Andi 00 1100 (12) Lhu 10 0101 (37)
Ori 00 1101 (13) Sb 10 1000 (40)
Xori 00 1110 (14) Sh 10 1001 (41)
Lui 00 1111 (15) Sw 10 1011 (43)
Cos 01 0100 (20) Sin 01 0101 (21) Floating Point 01 0001 (17)
Instructions Function Code Instructions Function Code
Add.f 00 0001 (1) Sub.f 00 0010 (2)
Mul.f 00 0011 (3) Div.f 00 0100 (4)
R-Type 00 0000 (0) Instructions Function Code Instructions Function Code Slt 10 1010 (42)
Add 10 0000 (32) Sltu 10 1011 (43)
Addu 10 0001 (33) Nor 10 0111 (39)
Sub 10 0010 (34) Sll 00 0000 (0)
Subu 10 0011 (35) Srl 00 0010 (2)
And 10 0100 (36) Sra 00 0011 (3)
Or 10 0101 (37) Jalr 00 1001 (9)
Xor 10 0110 (38) Jr 00 1000 (8)
結合資料路徑與控制時序之完整 MIPS CPU 架構如圖 3-21。
圖 3-21 MIPS 實作架構
表 3-3 MIPS CPU 實作效能結果
MIPS CPU
DATA PATH CONTROL UNIT
ALU CORDIC FLOATING
POINT VIRTEX
XCV800-6
Slices: 318(3%) 4 input LUTs: 574(3%) Maximum combinational
path delay: 48.576ns
Slices: 597(6%) 4 input LUTs:1069(5%) BRAMs: 2(7%) Minimum period: 20.618ns Frequency: 48.501MHz
Slices: 3189(33%) 4 input LUTs: 4620(24%) Minimum period:186.620ns Frequency: 5.358MHz
Slices: 5221(55%) BRAMs: 6(21%) 4 input LUTs: 8481(45%)
Slices: 47(0%) 4 input LUTs: 83(0%) Minimum period: 6.079ns Frequency: 164.501MHz
Slices: 5291(56%) BRAMs: 6(21%) 4 input LUTs: 8587 (45%)
Minimum period: 186.620ns Maximum Frequency: 5.358MHz
Minimum period: 186.620ns Maximum Frequency: 5.358MHz
如表 3-3 所示,整個 CPU 設計使用了約百分之五十五的資源,其中浮點運 算器佔約百分之三十,而 CORDIC 運算器佔約百分之六(詳見表 4-4),這 也代表了在扣除浮點運算器與 CORDIC 運算器之後,原 MIPS CPU 的 37 道指令架構僅使用約百分之十五的資源。而在最大頻率的部份要說明的 是,在未加入浮點運算器前 CPU 整體最大頻率可達約 30MHz,但最後的 結果由於受到浮點運算器的除法部份拖累,使得整體的效能降至約 5MHz。