課程:Introduction to Computer Organization (CCIT4026) 主題:MIPS 單周期處理器的構建模組與資料路徑


目錄

  1. 學習目標
  2. MIPS 處理器架構回顧
  3. 三大類 MIPS 指令的執行步驟
  4. CPU 基本功能元件
  5. 主要硬體模組詳解
  6. 單周期處理器(更多建構模組)
  7. 各類指令的資料路徑範例
  8. 完整的單周期資料路徑
  9. 重點整理與小結

學習目標

完成本章後,你應該能夠:

  • 回顧 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

執行步驟

  1. 從暫存器檔案讀取 $reg2$reg3
  2. ALU 執行減法:$reg2 - $reg3
  3. 將結果寫回 $reg1

addandorslt 的步驟相同,只是 ALU 執行的運算不同

(2) 記憶體存取指令(I-type)

Load Word:lw $reg1, const_num($reg2)

語義$reg1 ← Memory[$reg2 + const_num]

執行步驟

  1. 讀取暫存器 $reg2
  2. ALU 執行加法:$reg2 + const_num(計算記憶體位址)。
  3. 以該位址存取記憶體取得資料。
  4. 將資料寫回 $reg1

Store Word:sw $reg1, const_num($reg2)

語義Memory[$reg2 + const_num] ← $reg1

執行步驟

  1. 讀取 $reg1$reg2
  2. ALU 執行加法:$reg2 + const_num(計算位址)。
  3. $reg1 的值寫入該記憶體位址。

注意:sw 不會寫回任何暫存器。

(3) 分支指令

Branch on Equal:beq $reg1, $reg2, const_num

語義if ($reg1 == $reg2) PC ← PC + 4 + (const_num × 4)

執行步驟

  1. 讀取 $reg1$reg2
  2. 比較兩者是否相等(通常以 $reg1 - $reg2 看是否為零)。
  3. 若相等,更新 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 基本功能元件

設計處理器需要以下基本元件:

  1. Register File:通用暫存器(32 個 32-bit 暫存器)。
  2. Memory:儲存指令與資料。
  3. ALU:執行 add、sub、AND、OR、比較等運算。
  4. Program Counter (PC):儲存目前指令位址的特殊暫存器。
  5. Adder(加法器):用以計算 PC + 4PC + 4 + (const_num × 4)(PC & 0xF0000000) | (const_num × 4) 等。
  6. Control Unit:控制其他功能單元的協調器。
  7. 其他輔助單元: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(記憶體)

用於存放資料(lwsw 指令存取的對象):

                ┌──────────────┐
   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 輸出)。


完整的單周期資料路徑

將上述四種指令的資料路徑合併為一個單一的資料路徑,需要:

  1. 共享資源:例如 ALU 在不同指令中執行不同運算(add 用於位址計算、subtract 用於 beq、其他運算用於 R-type)。
  2. 多工器(MUX):用以根據指令類型「選擇」資料來源(例如 ALU 第二輸入是來自 Read data 2 還是來自 Sign-extended immediate)。
  3. 控制訊號:產生 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 選擇寫回的目標暫存器(rtrd
RegWrite 啟動暫存器寫入
ALUSrc 選擇 ALU 第二輸入(暫存器值或立即數)
ALUOp 控制 ALU 執行的運算
MemRead 啟動記憶體讀取
MemWrite 啟動記憶體寫入
MemtoReg 選擇寫回暫存器的資料來源(ALU 結果或記憶體資料)
Branch 標記是否為分支指令
PCSrc 選擇下一個 PC(PC+4 或 Branch Target)

設計原則總結

「結合(Combine)+ 共享(Share)+ 控制(Control)」

  • 將不同指令所需的資料路徑合併到一個統一的架構中。
  • 通過多工器讓不同指令在不同情況下共享功能單元(如 ALU、Register File、Memory)。
  • 控制單元根據指令的 opcode 產生控制訊號,決定資料如何流動。

重點整理與小結

核心觀念

  1. 單周期處理器:每條指令在一個時脈周期內完成所有動作(取指、解碼、執行、存取記憶體、寫回)。
  2. MIPS 指令子集:本章只實作 R-type、lw/sw、beq/j 等核心指令。
  3. 資料路徑由功能單元組成:Register File、ALU、Memory、PC、Adder、MUX、Sign Extender 等。
  4. 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) - 各種指令的完整控制訊號值 - 控制單元的硬體實作(邏輯閘層級) - 完整的單周期執行範例