計算機組成原理CPU單周期數據通路(MIPS)
【計算機組成原理】CPU:單周期數據通路(MIPS)
寄存器傳送語言RTL
1)R(r)表示寄存器r的內容
2)M(address)表示主存儲器地址address的內容
3)傳輸方向“←”表示,從右向左傳輸
4)程序計數器PC的內容直接用PC表示
輸出信號改變時機
1)setup建立時間:觸發時鐘邊緣之前保持穩定一段時間
2)hold保持時間:觸發時鐘邊緣之后保持穩定一段時間
3)clk-2-Q time鎖存延遲:觸發時鐘邊緣之后不能立即變化,有一點點延遲
即:輸入的信號(1或0)在輸入之前(下跳沿到達之前)要穩住自己,不能出差錯,在到達下調沿時輸入信號不會立刻影響輸出,而是經歷一點點延遲(clk2Q)輸出才改變,而與此同時輸入信號會保持更長一段時間。
寄存器組解讀
1)ReadinA\RB兩個讀入接口,符合組合邏輯,輸入5-bit寄存器編號,選擇32個寄存器之一的內容,耗費一小段時間(取數時間AccessTime),從BusA\busB輸出(2^5=32)。
2)busWrite是寫入接口,是時序邏輯,在(WriteEnable=1)&&(時鐘下降沿到達)的情況下經過延遲(CLK2Q)將busW的值寫入RW讀入接口指定的寄存器中;WE=0時即使下降沿到來也不會寫入。
內部結構圖
3)理想數據存儲器
① add指令(R-type)
指令:add rd,rs,rt
RTL:
1)M[PC];
2)R[rd]←R[rs]+R[rt];
3)PC ← PC + 4
設計思路:不考慮1)3)兩個公共操作:
(1)Rs、Rt表示兩個源寄存器編號,故與RA、RB相連,讀取這兩個寄存器的值,分別由busA、busB送入ALU計算,由func控制ALUctr進行add操作;
(2)結果送入busW寫入RW指定的寄存器,故RW連接Rd,只有當結果不溢出且RegWr=1的情況下才將結果寫入,結果溢出(OF=1)則送出到溢出處理通路。
花費時間:PC的CLK2Q時間+指令存儲器取指令時間+寄存器組取數時間+ALU延遲+寄存器建立時間+時鐘偏移
ALUctr=add,RegWr=1
② ori指令(I-type)
指令:ori rt,rs,imm16
RTL:
1)M[PC];
2)R[rt] ← R[rs] or ZeroExt(imm16);
3)PC ← PC + 4
設計思路:不考慮1)3)兩個公共操作:
(1)因為目的寄存器是rt,跟R-type的rd不一樣,所以得在RW裝個多路選擇器,用RegDst控制是用哪個做目的寄存器(R-type用0,I-type用1);
(2)由于要進行立即數零擴展(32位才能送入ALU),添加一個擴展器,用ExtOp=1控制進行符號擴展,ExtOp=0控制進行零擴展;
(3)由于R-type是兩個寄存器數運算,I-type有一個來自立即數,所以要在ALU一個輸入接口裝一個多路選擇器,用ALUSrc=0控制寄存器輸入,ALUSrc=1控制立即數輸入。
時間:PC的CLK2Q時間+指令存儲器取數時間+寄存器組取數時間+ALU延遲+寫寄存器的建立時間+時鐘偏移
ALUctr=or,RegWr=1,RegDst=1,ExtOp=0,ALUSrc=1
③lw、sw指令(I-type)
指令:lw:lw rt,rs,imm16;sw:sw rt, rs,imm16
RTL:
1)M[PC];
2)Addr←R[rs]+SignExt(imm16);
3)lw:R[rt]←M[Addr];sw:M[Addr]←R[rt];
4)PC ← PC + 4)
設計思路:不考慮1)4)兩個公共操作:
(1)因為寫入目的寄存器的數據來源不是ALU結果,而是存儲器的輸出,所以要在busW加一個多路選擇器,用MemtoReg=0控制ALU結果寫入,MemtoReg=1控制存儲器讀出數據寫入;
(2)因為要從數據存儲器取數,所以添加了一個數據存儲器部件,存儲器的取數地址由ALU計算R[rs]+SignExt(imm16)得到,所以ALU結果連接Adr端,圖中busB輸出端連接DataIn將數據寫入實現的是指令sw的功能,注意該寫入是時序邏輯。
花費時間:
lw:PC的CLK2Q時間+指令存儲器取數時間+寄存器組取數時間+ALU延遲+數據存儲器取數時間+寫寄存器的建立時間+時鐘偏移
sw:PC的CLK2Q時間+指令存儲器取數時間+寄存器組取數時間+ALU延遲+寫存儲器的建立時間+時鐘偏移
ALUctr=addu,RegWr=1,RegDst=1,ExtOp=1,ALUSrc=1,
MemWr=1,MemtoReg=1
④beq指令(I-type)
指令:beq rs,rt,imm16
RTL:
1)M[PC];
2)Cond ←R[rs]-R[rt];
3)if (Cond = 0) {PC ← PC + 4 + (SignExt(imm16) x 4)} else{PC ← PC + 4}
設計思路:不考慮1)4)兩個公共操作:
(1)因為PC下地址產生不同,所以增加了下地址邏輯,輸出下一條指令地址,用Branch=1使用分支功能,Branch=0不使用;
(2)Zero為R[rs]-R[rt]的零標志,在Branch=1啟用分支功能時,Zero=0表示兩個源寄存器內容相等,應該走PC ← PC + 4 + ( SignExt(imm16)x4)這一路,反之走普通的PC←PC + 4,Branch=0時不用考慮Zero的值,因為沒有啟用分支。注意這里的立即數是相對偏移指令數,前面的立即數是相對偏移存儲單元數。
時間:PC的CLK2Q時間+指令存儲器取數時間+寄存器組取數時間+ALU延遲+寄存器建立時間(寫入PC)+時鐘偏移
ALUctr=subu,RegWr=0,RegDst=1/0,ExtOp=1/0,MemWr=0,MemtoReg=1/0,ALUSrc=1,Branch=1
因為指令長度32-bit,主存按字節編址,所以指令的地址總是4的倍數,所以低兩位總是00,所以PC只用存放前30位,即PC<31:2>,所以下條指令的計算方法如下:
順序執行時:PC<31:2> = PC<31:2> + 1
轉移執行時:PC<31:2> = PC<31:2> + 1 + SignExt[imm16]
取指令時:指令地址=PC<31:2> 串接“00”
另外:這里用Adder是因為無需ALUctr
⑤Jump指令(J-type)
指令:j target
RTL:
1)M[PC];
2)PC<31:2>←PC<31:28>串接 target<25:0>
設計思路:不考慮1)4)兩個公共操作:
(1)因為功能是無條件將目標地址寫到PC中,所以主要修改的是取指令部件;
(2)因為送到下一個PC的值不再僅僅是計算結果,也可能是直接跳越的結果,所以在PC的寫入端加一個多路選擇器,用Jump=1控制寫入跳躍目的地址,Jump=0控制寫入計算結果。
時間:PC的CLK2Q時間+指令存儲器取數時間+寄存器建立時間(寫入PC)+時鐘偏移
ALUctr=1/0,RegWr=0,RegDst=1/0,ExtOp=1/0,ALUSrc=1/0,MemWr=1,MemtoReg=0,Jump=1
跳轉指令的范圍:2^28=256MB的內存
【計算機組成原理】CPU:單周期數據通路(MIPS)
加我一起學習
公眾號:凡古一往
計算機組成原理CPU單周期數據通路(MIPS)相關教程