課程:Introduction to Computer Organization (CCIT4026) 主題:MIPS 單周期處理器的構建模組與資料路徑
目錄
- 學習目標
- MIPS 處理器架構回顧
- 三大類 MIPS 指令的執行步驟
- CPU 基本功能元件
- 主要硬體模組詳解
- 單周期處理器(更多建構模組)
- 各類指令的資料路徑範例
- 完整的單周期資料路徑
- 重點整理與小結
學習目標
完成本章後,你應該能夠:
- 回顧 MIPS 指令集核心子集的語義(add / sub / and / or / slt / lw / sw / beq / j)。
- 說明 CPU 中的主要功能單元(Functional Units)及其角色。
- 理解 Register File、Memory、ALU、Multiplexer、Sign Extender、Adder、PC 的內部結構與介面。
- 針對 R-type、lw、sw、beq 指令,繪製並描述其資料路徑(Datapath)。
- 將各種指令的資料路徑合併為單一的單周期資料路徑。
MIPS 處理器架構回顧
MIPS 是甚麼?
MIPS = Microprocessor without Interlocked Pipeline Stages (沒有互鎖管線階段的微處理器)
MIPS 採用 RISC(Reduced Instruction Set Computer,精簡指令集)設計理念:指令格式統一、長度固定、執行流程簡單,非常適合作為教學用的處理器架構。
我們要實作的指令子集
本章僅針對 MIPS 核心指令集的子集設計處理器,分成三類:
| 類型 | 範例指令 | 功能 |
|---|---|---|
| 算術邏輯指令 (R-type) | add, sub, and, or, slt |
暫存器之間的運算 |
| 記憶體存取指令 (I-type) | lw, sw |
載入 / 儲存記憶體 |
| 分支指令 (I/J-type) | beq, j |
改變程式控制流 |
注意:此子集不包含 shift(移位)、multiply(乘法)、divide(除法)等指令。
三大類 MIPS 指令的執行步驟
(1) 算術邏輯指令(R-type)
指令範例:sub $reg1, $reg2, $reg3
語義:$reg1 ← $reg2 - $reg3
執行步驟:
- 從暫存器檔案讀取
$reg2與$reg3。 - ALU 執行減法:
$reg2 - $reg3。 - 將結果寫回
$reg1。
add、and、or、slt的步驟相同,只是 ALU 執行的運算不同。
(2) 記憶體存取指令(I-type)
Load Word:lw $reg1, const_num($reg2)
語義:$reg1 ← Memory[$reg2 + const_num]
執行步驟:
- 讀取暫存器
$reg2。 - ALU 執行加法:
$reg2 + const_num(計算記憶體位址)。 - 以該位址存取記憶體取得資料。
- 將資料寫回
$reg1。
Store Word:sw $reg1, const_num($reg2)
語義:Memory[$reg2 + const_num] ← $reg1
執行步驟:
- 讀取
$reg1與$reg2。 - ALU 執行加法:
$reg2 + const_num(計算位址)。 - 將
$reg1的值寫入該記憶體位址。
注意:
sw不會寫回任何暫存器。
(3) 分支指令
Branch on Equal:beq $reg1, $reg2, const_num
語義:if ($reg1 == $reg2) PC ← PC + 4 + (const_num × 4)
執行步驟:
- 讀取
$reg1與$reg2。 - 比較兩者是否相等(通常以
$reg1 - $reg2看是否為零)。 - 若相等,更新
PC = PC + 4 + (const_num × 4);否則PC = PC + 4。
Jump:j const_num
語義:PC ← (PC & 0xF0000000) | (const_num × 4)
說明:
PC & 0xF0000000保留 PC 的最高 4 位元。const_num為 26 位元(J-format)。- 將
const_num左移 2 位(× 4)後,與 PC 上 4 位元連接,得到完整的 32 位元跳躍位址。
CPU 基本功能元件
設計處理器需要以下基本元件:
- Register File:通用暫存器(32 個 32-bit 暫存器)。
- Memory:儲存指令與資料。
- ALU:執行 add、sub、AND、OR、比較等運算。
- Program Counter (PC):儲存目前指令位址的特殊暫存器。
- Adder(加法器):用以計算
PC + 4、PC + 4 + (const_num × 4)、(PC & 0xF0000000) | (const_num × 4)等。 - Control Unit:控制其他功能單元的協調器。
- 其他輔助單元:MUX(多工器)、Sign Extender(符號擴展器)、Decoder(解碼器)等。
Datapath 元件功能總覽
+-------------------+ +----------------+
| Register File | | Memory |
| (32 × 32-bit) | | (Cache) |
+-------------------+ +----------------+
| |
v v
(Bus A, Bus B) (Data Bus)
| |
+-----------+--------------+
v
+------+------+
| ALU |
| (Arithmetic |
| Logic Unit)|
+-------------+
用途:
(a) 位址計算(lw/sw)
(b) 算術-邏輯運算(R-type)
(c) 比較運算(beq)
設計原則:CPU 由「Datapath」(資料路徑)和「Control Unit」(控制單元)組成。Datapath 負責資料的流動與處理,Control Unit 則負責產生控制訊號(如 RegWrite、MemRead 等)來決定 Datapath 的行為。
主要硬體模組詳解
1. Multiplexer(多工器,MUX)
定義:一種組合邏輯電路,根據控制訊號從多個輸入中選擇一個作為輸出。
┌─────────┐
I0 ──┤ │
I1 ──┤ MUX ├──── Q (Output)
I2 ──┤ │
I3 ──┤ │
└────┬────┘
│
S (Select)
2-to-1 MUX 範例
- 兩個資料輸入:A、B
- 一個控制輸入:S
- 一個資料輸出:C
布林函式:
C = A·S' + B·S
| S | C |
|---|---|
| 0 | A |
| 1 | B |
MUX 在資料路徑中極為重要,例如:選擇是用「立即數」還是「暫存器值」作為 ALU 的第二輸入;選擇
PC + 4還是「分支目標位址」作為下一個 PC。
2. Register File(暫存器檔案)
Bus A (Read Data 1) ─────► (32-bit)
▲
┌───────┴───────┐
│ │
┌────┴─────────┐ ┌───┴────────┐
│ 32 × 32-bit │ │ │
│ Registers │ │ │
│ │ │ │
└──────────────┘ └────────────┘
▼
Bus B (Read Data 2) ─────► (32-bit)
Bus W (Write Data) ◄─── 由外部寫入
控制訊號:
- Ra (5-bit):Bus A 讀取位址
- Rb (5-bit):Bus B 讀取位址
- Rw (5-bit):Bus W 寫入位址
- RegWr (1-bit):寫致能
- Clk:時脈訊號(同步寫入)
重要設計細節
| 項目 | 說明 |
|---|---|
| 大小 | 32 個 32-bit 暫存器 |
| Bus A / Bus B | 兩個讀取埠,可同時讀取兩個暫存器 |
| Bus W | 一個寫入埠 |
| Ra, Rb, Rw | 5-bit 位址(因為 2⁵ = 32) |
| RegWr | 設為 1 才會寫入 Bus W 上的資料 |
| Clk | 寫入是同步的;讀取是非同步的 |
讀取埠的實作(Read Ports)
要實作 n 個暫存器的兩個讀取埠,需要兩個 n-to-1 多工器,每個寬度為 32 位元:
Read register ┌─────────┐
number 1 ──►──┤ MUX ├──── Read data 1 (32-bit)
│ n-to-1 │
Reg 0 ──►──┤ │
Reg 1 ──►──┤ │
... │ │
Reg n-1 ──►─┤ │
└─────────┘
注意:每個 MUX 需要 log₂(n) 條控制訊號(例如 n=32 時需要 5 條)
寫入埠的實作(Write Port)
使用一個 n-to-1 解碼器(Decoder)產生選擇訊號,決定寫入哪一個暫存器:
Write data ──────────────► (送到所有暫存器)
Register ┌──────────┐
number ──► │ n-to-1 │── ┬──► Reg 0 (C 致能)
│ Decoder │ ├──► Reg 1
└──────────┘ ├──► ...
└──► Reg n-1
3. Memory(記憶體)
用於存放資料(lw 與 sw 指令存取的對象):
┌──────────────┐
Address ────►│ │
(32-bit) │ │── Read Data ────►
│ Memory │ (32-bit)
Write ────►│ │
Data │ │
(32-bit) │ │
└──────────────┘
▲ ▲
│ │
MemWrite MemRead
| 控制訊號 | 功能 |
|---|---|
MemRead |
設為 1 時從指定位址讀取資料 |
MemWrite |
設為 1 時將 Write Data 寫入指定位址 |
限制:記憶體不能同時讀寫(在同一個時脈周期內 MemRead 與 MemWrite 不能同時為 1)。
4. Arithmetic Logic Unit(ALU)
ALU 執行二元算術與邏輯運算。
ALU 操作表
| ALU Control | Function (功能) |
|---|---|
0000 |
AND |
0001 |
OR |
0010 |
add(加法) |
0110 |
subtract(減法) |
0111 |
set-on-less-than(slt) |
1100 |
NOR |
ALU 介面
┌─────────────────┐
a ──32──►│ │
│ ALU │── Result ──► (32-bit)
b ──32──►│ │
│ │── Zero ──► (1-bit, 結果是否為零)
└────┬────────────┘
▲
│
ALU Control (4-bit)
(= ALUOp signal)
| 訊號 | 寬度 | 說明 |
|---|---|---|
| a, b | 2 × 32-bit | 兩個運算元 |
| Control | 4-bit | 決定 ALU 執行的運算(即 ALUOp) |
| Result | 32-bit | 運算結果 |
| Zero | 1-bit | Result 是否為 0(用於 beq) |
ALU 設計原則
- 第一步:理解功能(要支援哪些運算)。
- 第二步:定義單元的輸入/輸出端口。
- 第三步:以組合邏輯實作內部電路。
- 方法:先設計「1-bit ALU」,然後串接 32 個即可組成 32-bit ALU。
- 支援運算:AND、OR、NOR、ADD、SUB、SLT。
1-bit ALU 概念:
a ──┬─► AND gate ─┐
│ ├─► MUX ─► Result
b ──┼─► OR gate ──┤ ▲
│ │ │
└─► Adder ──┘ Operation
▲ Select
│
CarryIn
單周期處理器(更多建構模組)
除了上述模組,單周期處理器還需要以下支援單元:
1. Instruction Memory(指令記憶體)
Address ─32─►┌──────────────┐
│ Instruction │── Instruction (32-bit)
│ Memory │ bits 0-31
└──────────────┘
- 提供:給定一個位址,回傳該位址處的指令。
2. Program Counter(程式計數器,PC)
┌──────────────┐
│ PC │── Current Address (32-bit)
│ (32-bit) │
└──────────────┘
▲
│
新位址(來自 Adder 或 Branch / Jump 計算)
- 是一個 32-bit 的特殊暫存器,存放正在執行的指令位址。
3. Adder(加法器)
Address ─32─►┌──────────────┐
│ Adder │── (Address + 4)(32-bit)
4 (常數)─────►│ │
└──────────────┘
- 用途:將 PC 加 4,得到下一個指令位址(每條 MIPS 指令為 4 bytes)。
- 新位址 = 目前位址 + 4。
4. Sign Extend(符號擴展器)
將 16-bit 立即數轉換為 32-bit:
16-bit input ──► [b15 b14 ... b0]
Sign Extend 後:
31 16 15 0
[bbbb...b][b15 b14 ... b0]
▲
│
把第 15 位元(最高位元、即符號位)複製 16 次填入
| 原始 16-bit | 擴展後 32-bit |
|---|---|
0x0001 |
0x00000001 |
0xFFFF |
0xFFFFFFFF(−1) |
0x8000 |
0xFFFF8000 |
為何要符號擴展? 因為 MIPS 指令的 immediate field 為 16-bit 補碼數,但要與 32-bit 暫存器值做運算時必須擴展為 32-bit,且要保留有號數的數值意義。
各類指令的資料路徑範例
Example #1:R-type 指令 add $t0, $s1, $s2
指令格式(R-type):
| opcode | $s1 (rs) | $s2 (rt) | $t0 (rd) | shamt | funct |
|---|---|---|---|---|---|
| 6 bits | 5 bits | 5 bits | 5 bits | 5 bits | 6 bits |
資料路徑流程:
1. Instruction Fetch + PC update
PC ──► Instruction Memory ──► Instruction
PC + 4 ──► PC
2. Register Read(從控制單元啟動 RegWrite)
rs ($s1) ──► Read register 1 ──► Read data 1
rt ($s2) ──► Read register 2 ──► Read data 2
3. ALU operation(Control 選擇 add)
Read data 1 + Read data 2 ──► ALU Result
即:$s1 + $s2
4. Write back
ALU Result ──► Write Data ──► $t0
(RegWrite = 1)
關鍵控制訊號:
RegWrite = 1(啟動寫回),ALU 執行 add。
Example #2:Load Word 指令 lw $t0, 1200($t1)
指令格式(I-type):
| opcode | $t1 (rs) | $t0 (rt) | immediate = 1200 |
|---|---|---|---|
| 6 bits | 5 bits | 5 bits | 16 bits |
資料路徑流程:
1. 取指令、PC + 4
2. Register Read
rs ($t1) ──► Read register 1 ──► Read data 1 = ($t1)
(rt 不必讀,因為這是 lw)
3. Sign Extend
1200 (16-bit) ──► Sign Extend ──► 1200 (32-bit)
4. ALU 計算位址(Control 選擇 add)
($t1) + 1200 ──► ALU Result(記憶體位址)
5. Memory Read
MemRead = 1
Memory[($t1) + 1200] ──► Read Data
6. Write back
Read Data ──► Write Data ──► $t0
(RegWrite = 1)
在 lw 中,ALU 執行的是位址計算(base + offset),不是真正的算術運算。
Example #3:Store Word 指令 sw $t0, 1200($t1)
資料路徑流程:
1. 取指令、PC + 4
2. Register Read
rs ($t1) ──► Read register 1 ──► Read data 1
rt ($t0) ──► Read register 2 ──► Read data 2 (要存入記憶體的資料)
3. Sign Extend:1200 (16-bit) ──► 1200 (32-bit)
4. ALU 計算位址
($t1) + 1200 ──► ALU Result
5. Memory Write
Address = ALU Result
Write Data = Read data 2 (即 $t0)
MemWrite = 1, MemRead = 0
sw 不寫回任何暫存器(RegWrite = 0),但必須讀取
rt(要存的資料)。
Example #4:Branch on Equal beq $s1, $s2, 25
指令格式:
| opcode | $s1 (rs) | $s2 (rt) | offset = 25 |
|---|---|---|---|
| 6 bits | 5 bits | 5 bits | 16 bits |
資料路徑流程:
1. 取指令、計算 PC + 4
2. Branch Target Calculation
offset (16-bit) ──► Sign Extend ──► 32-bit
Sign-extended offset ◄─── Shift Left 2 ───► × 4
(PC + 4) + (25 × 4) ──► Branch Target Address
3. Register Read
rs ($s1) ──► Read data 1
rt ($s2) ──► Read data 2
4. ALU 執行 SUBTRACT(用減法檢查是否相等)
Read data 1 - Read data 2 ──► Result
Zero = (Result == 0) ? 1 : 0
5. PC update
if (Zero == 1):PC ← Branch Target Address
else:PC ← PC + 4
關鍵想法:要判斷兩數是否相等,做減法看結果是否為 0(用 ALU 的
Zero輸出)。
完整的單周期資料路徑
將上述四種指令的資料路徑合併為一個單一的資料路徑,需要:
- 共享資源:例如 ALU 在不同指令中執行不同運算(add 用於位址計算、subtract 用於 beq、其他運算用於 R-type)。
- 多工器(MUX):用以根據指令類型「選擇」資料來源(例如 ALU 第二輸入是來自 Read data 2 還是來自 Sign-extended immediate)。
- 控制訊號:產生 RegWrite、MemRead、MemWrite、ALUSrc、MemtoReg 等訊號來控制 Datapath 行為。
完整單周期 Datapath(高階概念圖)
┌────────────────────┐
│ Branch Address Gen │
┌─────────────────┤ (PC+4) + offset×4 │
│ └─────────┬──────────┘
│ │
┌───┐ │ │ ┌─PCSrc
│PC ├──┐ │ ▼ ▼
└───┘ │ │ ┌─────┐
▲ │ │ │ MUX │ ──► 新 PC
│ ▼ │ └──┬──┘
│ ┌──────┐│ │
│ │ Add ││ +4 │
│ │ ├┘ │
│ └──┬───┘ │
└────┘ │
┌──────────┐ │
PC──►│Instr Mem │── Inst[31:0] ────────┘
└──────────┘
│
▼
┌──────────────────────┐
│ Instr[25:21] (rs) │──► Read register 1 ─┐
│ Instr[20:16] (rt) │──► Read register 2 │
│ Instr[15:11] (rd) │ │ │
└──────────────────────┘ ▼ ▼
┌─────────────────────┐
│ Register File │
│ │── Read data 1 ─┐
RegWrite─►│ │── Read data 2 ─┼──┐
└─────────────────────┘ │ │
▲ │ │
│ Write data │ │
│ ▼ ▼
┌─────┐
ALUSrc──►│ MUX │
Instr[15:0] ──► Sign Extend (32-bit) ─────────►│ │
└──┬──┘
▼
┌────────┐
│ ALU │ ── Zero
│ │ ── Result ──┐
└────────┘ │
▲ │
│ ALUOp │
▼
┌────────────┐
│ Data │── Read data ─┐
MemRead ───►│ Memory │ │
MemWrite ──►│ │ │
└────────────┘ │
▼
┌──────────┐
MemtoReg ──►│ MUX │
│ │── Write data
└──────────┘ (回到 Reg File)
主要控制訊號(將於第 8 章詳細說明)
| 訊號 | 作用 |
|---|---|
RegDst |
選擇寫回的目標暫存器(rt 或 rd) |
RegWrite |
啟動暫存器寫入 |
ALUSrc |
選擇 ALU 第二輸入(暫存器值或立即數) |
ALUOp |
控制 ALU 執行的運算 |
MemRead |
啟動記憶體讀取 |
MemWrite |
啟動記憶體寫入 |
MemtoReg |
選擇寫回暫存器的資料來源(ALU 結果或記憶體資料) |
Branch |
標記是否為分支指令 |
PCSrc |
選擇下一個 PC(PC+4 或 Branch Target) |
設計原則總結
「結合(Combine)+ 共享(Share)+ 控制(Control)」
- 將不同指令所需的資料路徑合併到一個統一的架構中。
- 通過多工器讓不同指令在不同情況下共享功能單元(如 ALU、Register File、Memory)。
- 由控制單元根據指令的 opcode 產生控制訊號,決定資料如何流動。
重點整理與小結
核心觀念
- 單周期處理器:每條指令在一個時脈周期內完成所有動作(取指、解碼、執行、存取記憶體、寫回)。
- MIPS 指令子集:本章只實作 R-type、lw/sw、beq/j 等核心指令。
- 資料路徑由功能單元組成:Register File、ALU、Memory、PC、Adder、MUX、Sign Extender 等。
- MUX 是合併不同指令路徑的關鍵:透過控制訊號選擇來源,使單一資料路徑可服務於多種指令。
各類指令的資料路徑差異
| 指令 | 是否讀 rs | 是否讀 rt | ALU 動作 | 是否存取記憶體 | 是否寫回暫存器 |
|---|---|---|---|---|---|
| R-type | ✓ | ✓ | 算術/邏輯 | ✗ | ✓(寫到 rd) |
| lw | ✓ | ✗ | add(位址計算) | 讀 | ✓(寫到 rt) |
| sw | ✓ | ✓ | add(位址計算) | 寫 | ✗ |
| beq | ✓ | ✓ | sub(比較) | ✗ | ✗ |
重要記憶要點
- PC + 4:指令長度為 4 bytes,因此每次取指後 PC 增加 4。
- Branch Target = PC + 4 + (offset × 4):因為 offset 是以「指令」為單位,要先 ×4 才是位元組偏移量。
- ALU 不只做運算,也計算位址:lw / sw 用 ALU 算 base + offset。
- Sign Extend 必須保留有號數的意義:將 16-bit immediate 擴展為 32-bit 時,重複符號位元。
下一章預告
第 7 章建立了單周期 Datapath 的雛型;第 8 章將深入討論: - 控制訊號的詳細產生機制(兩級解碼:Main Control + ALU Control) - 各種指令的完整控制訊號值 - 控制單元的硬體實作(邏輯閘層級) - 完整的單周期執行範例