目錄
- 前言
- 單周期資料通路
- 算數邏輯指令(R 型指令)
-
- 取指令階段
- 譯碼階段
- 執行階段
- 記憶體通路階段
- 寫回階段
- 下一條指令
- 記憶體通路指令
- 分支跳轉指令
- 總結(重要⚠)
前言
昨天複(yu)習了:計組複習(一):乘法器,除法器與浮點加法器,鞏固了硬體事如何實作運算操作的。
今天複習 cpu 資料通路,也是很複雜的圖。一步一步來吧。

唔。。。。現在是淩晨 1:42,人快蕪了,是以部落格内容可能會出現一些纰漏 dbq 我爬 Orz
才不是打了一天 lol 導緻沒時間複習。還有,有沒有懂哥知道男刀這版本怎麼玩?出暗爪還是幕刃還是渴血?征服者 or 電刑?
編輯下:我的我的 還真漏了。。。
課本上的圖有一個多路複用器 01 接口畫反了,但是我所有圖檔都是按照課本的圖描圖畫的,于是也反了,來不及改了,算了(擺爛
就是 Jump 控制信号對應的複用器:
Jump 為 1 時才使用 Jump 的跳轉,否則使用 beq 或者 PC+4 作為下一條指令位址。
單周期資料通路
單周期即一個指令的執行,不包括流水線并行,是一種簡單(霧)的資料通路。由之前的學習知曉 mips 的指令也分為幾個階段:
- 取指令 IF
- 譯碼 ID
- 執行 EX
- 通路記憶體 MEM
- 寫回 WB
硬體正是根據這幾個步驟進行設計的,且看 cpu 如何實作。
按照慣例先上圖,盡管這個圖非常吓人,但是待會我們一步一步來分析它。
單周期資料通路的硬體從左到右對應了 mips 的 5 個階段:
- 最左邊首先是位址記憶體,對應取指令與譯碼階段(IF / ID)
- 随後是寄存器檔案和 ALU,對應執行階段(EX)
- 再右邊是資料記憶體,對應記憶體通路階段(MEM)
- 最後是寫回(RW)。
同樣的,資料按照從左到右的順序進行通路周遊,來啦來看就知道了↓
這裡以 R 型指令舉例。
算數邏輯指令(R 型指令)
算數邏輯指令一般指 add,and 這些指令。他們都是 R 型指令
注:
R 型指令一般指有三個操作寄存器的指令:
![]()
計組複習(二):單周期資料通路與控制信号前言單周期資料通路算數邏輯指令(R 型指令)記憶體通路指令分支跳轉指令總結(重要⚠)
這意味着我們需要從兩個源寄存器(rs,rt)讀取資料,同時将結果寫回目的寄存器(rd)。接下來看各個階段的資料通路:
取指令階段
首先是取指令階段,将指令取給控制單元,同時 PC+=4,如下圖:
IF 階段不需要任何的控制資料。
譯碼階段
然後是譯碼階段,這裡需要用到 RegDst 控制信号,以确定目的寄存器是哪個。因為 R 型指令和資料存取指令有着不同的目的寄存器:
通過 RegDst 置 1 控制信号(下圖黃色箭頭)指揮多路複用器(mux),我們取 [15-11] 作為目的寄存器:
執行階段
然後是執行(EX)階段,首先從寄存器中讀取兩個操作數并且傳入 ALU。
此外,需要額外的控制信号(對應下圖黃色箭頭)來決定資料源是來自寄存器還是由指令給出的立即數給出。
值得注意的是,ALUOp 控制信号告訴 ALU 要執行何種運算,因為不同指令需要做不同的運算,比如 add 就是按位相加,and 就是按位與運算。
因為執行的是 R 型指令,這裡 ALUSrc 置 0 來確定從寄存器中讀取資料,而不是來自于立即數,如下圖:
記憶體通路階段
再然後是記憶體通路階段(MEM),因為 R 型指令都是算數邏輯指令,不涉及記憶體通路,通過兩個控制信号:
- MemRead,置 0,表示不需要從記憶體中讀取資料
- MemWrite,置 0,表示不需要将資料寫入記憶體
通過兩個控制信号,直接跳過這個階段(對應下圖紅色箭頭繞路):
寫回階段
最後是寫回階段。這裡需要兩個控制信号:
- MemtoReg,置 0,表示寫回到寄存器的資料不是從記憶體中來
- RegWrite,置 1,表示需要将結果寫回寄存器
控制信号如下圖黃色箭頭所示:
下一條指令
最後需要完成指令的跳轉,這裡通過控制信号:
- Branch,置 0,表示不需要進行分支跳轉
- Jump,置 0,表示這不是一條 j 指令,按照 beq 或者 PC+4 來跳轉
注:圖中 Jump 的複用器畫反了。
于是 PC+4 的值被寫回 PC,完成下一條指令的跳轉,如下圖:
注:
這不是 mips 流水線裡面的一個階段
這裡單獨寫出來是因為不想把圖畫的太複雜,否則很難看清
事實上這應該發生在寫回階段,畢竟寫 PC 也是一種寫回(霧
記憶體通路指令
和上面的 R 型指令的推導過程類似,這裡我就不畫分解圖了 dbp 我是懶狗我爬,但是大體思路都是一緻的。
回想 mips 每一個階段都需要 贛神魔 幹什麼,就能很快得出答案!
首先來看 lw 指令。lw 指令需要 4 個關鍵的控制信号置 1,他們分别是:
- MemRead:置 1,需要讀取記憶體
- MemtoReg:置 1,需要将記憶體資料寫回寄存器
- RegWrite:置 1,需要寫寄存器
- ALUSrc:置 1,需要從指令立即數讀取 ALU 運算資料
四個關鍵控制信号由黃色箭頭标記,而紅色箭頭則表示了資料的流向,如下圖:
再來看 sw 指令。sw 指令隻需兩個關鍵控制信号置 1 即可:
- ALUSrc:置 1,表示從立即數讀取操作數
- MemWrite:置 1,表示要向記憶體中寫資料
兩個關鍵控制信号由黃色箭頭标記,而紅色箭頭則表示了資料的流向,如下圖:
分支跳轉指令
分支跳轉指令也需要兩個關鍵控制信号,他們分别是:
- Branch:置 1,表示需要執行分支跳轉
- Jump:置 0,表示這不是一條 j 指令,按照 beq 或者 PC+4 來跳轉
注:圖中 Jump 的複用器畫反了。
看圖:
一步一步來看,就是:
- 首先根據立即數,計算分支指令跳轉的目的位址(由上圖藍色箭頭表示),此外注意位址計算乘以 4,因為一條指令占 4 位元組
- 然後 ALU 會判斷讀取的兩個寄存器(rs,rt)是否相等
- 如果相等,則給出一個控制信号(上圖橙色箭頭),并且和 Branch 控制信号進行與運算,決定最終是否執行分支
- 執行 beq / PC+4,寫回 PC
總結(重要⚠)
在了解了幾種指令的資料通路概要之後,老師給出的真值表似乎不那麼棘手了:
此外,附一張内鬼給的控制信号含義表:![]()
計組複習(二):單周期資料通路與控制信号前言單周期資料通路算數邏輯指令(R 型指令)記憶體通路指令分支跳轉指令總結(重要⚠) 主要記憶兩個:
ALUSrc:為 0 表示第二個操作數來自寄存器 rt,為 1 表示來自立即數
RegDst:為 0 表示目的寄存器是 rt,為 1 表示目的寄存器号為 rd
此外,注意 ALUOp 是 2 bit 的控制信号,它告訴 ALU 該做什麼運算,加 or 減:
控制信号真值表: