• 沒有找到結果。

Multiplier 分成兩個部分:controlUnit & dataUnit。

在文檔中 實作CPU與系統整合 (頁 42-46)

元件 2. FD_Register: 儲存 fetch stage 之 output,裡面是由多個 and gate 所 組成,當 pipeEn 這個訊號為’1’時,fetch stage 的所有 output 就會

3. Multiplier 分成兩個部分:controlUnit & dataUnit。

controlUnit: 是一個 finatestate machine,送出兩個控制訊號 ld,sh;ld 控制何時讀入x 的初始值,ld&sh 做成一個兩個 bit 的訊號,控制要 輸出的結果,01=>選取初始值 yResult (補了 n 個’0’後的);10=>選取 sumResult(算完乘法的最後結果)。當狀態為 idle 時僅表示把值 hold 住,實際上並無做任何動作,為load 時,把乘數和被乘數載入 register,在 act 時,則進行真正的運算

DataUnit; 裡用了兩個暫存器分別包在一個加法器的前後,由於使用 booth 演算法來做乘法,所以在加法器前要加一個 booth 演算法的 block。(請參閱附錄八)

Divider 內有兩個 block 分別為 dividerCtrl 和 dividerData;

1. DividerCtrl: 為一個 finate state machine,由 7 個 state 分別表示 stateOp 的訊號,用來控制目前 dividerData 的狀態;

Idle => 僅表示把值 hold 住,實際上並無做任何動作 Load => 把除數和被除數載入 register;

CorrectD、correctS => 由於我們使用 restoring 的演算法,

因此需要這兩個state,將除數與被除數取絕對值,當作 unsign 的除法;

act state => 就真正進入除法的運算過程;

correctR, correctQ =>由於前面的 state 取了絕對值,所以要 根據原本除數與被除數的正負號,去更正餘數及商的正 負。

2. DividerData: 中有 divSignalUnit 與 crtUnit 兩個 block。

DivSignalUnit => 是一個 turth table,利用上述 7 個 states 來控 制stateOp 以及所要做的動作。

CrtUnit => 則是用來判斷 correctR 及 correctQ 時所需做的更 正。一開始的regMUX 是用來 hold 住除數的值或是預算過 程中的結果。中間利用一個加法器與兩多工器來做除法所需 要的運算,最後再利用equal component 以及 AND 邏輯閘去 判斷餘數是否為零。(請參閱附錄十)

整合mipsALU

在 mipsALU 中把 logic_shift、add_sub、Mutiplier、divider,各自包成 component,並利用 func 這個訊號,去決定此時會使用到哪一個

component。由於乘法與除法的 component 都是做 sign 的運算,但是指令 中有分sign 與 unsign,因此需要分別補零或做 signextend 再送入 component 中。此外,Multiplier 的積會分別送到 hi 與 low register,divoder 的商和 餘數也分別送入low 與 high register,因此另設兩個 register 來存放結果。

在Jump and Branch 指令的特別運算,以邏輯閘分別表示不同的 brench 指令,並在 brhDecoder block 內建一個 truth table 來判斷是否 brench taken。(請參閱附錄十)

(此圖為 pipeline 中的 ALU stage)

元件8. EM_Register : 儲存 execution stage 的 output 訊號並在下一個 clock cycle 給 memory stage。(請參閱附錄十一)

元件9. MemoryUint:包含 memByteUnit 和 memSelUnit 兩個 block,皆為 truth table,提供 memory function 處理(byte,half word ,word 與 angle…)以及 把其相關之內部訊號送給 cupCore 的 input 與 output。

1. MemByteUnit =>在這個 Unit 中,由 bytefunc ( memfunc 和 mem address 組成的訊號 )來判別 memory function,輸出 byteSel0~3 選定data 內容;當我們在做 load 的指令時,是將 memory 中的 data 存入register 內;sotre 的指令則是由 register 的內容入 memory 中。

* 因為 LWL,LWR,SWL,SWR 這些指令都是以四個 byte 為單位,

所以我們把一個byte 視為一個單位,再用四個 MUX5s 去選出一個 新的資料內容,並利用memByteUnit 做控制,其中 output 訊號 lsMemByteEn 決定對 memory 做存取的 byte 個數。

2. memSelUnit =>由 memFunc 與 lsMemByteEn 這兩個訊號來 送出對memory 的控制訊號,如輸入或輸出的位置,byte 個數及排 列方式。(請參閱附錄十二)

元件 10. MW_Register: 儲存 memory stage 的 output 訊號並在下一個

在文檔中 實作CPU與系統整合 (頁 42-46)

相關文件