National Central University
Uedu Main Site
Explore Uedu
Student Console
Register as Member/Login
Research Informed Consent Center
Survey Center
Educational Big Data Challenge
Claim or create a course
Try an AI Scenario Task
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

3

Local AI

--

Uedu Code

--

中央大學 AQI 80 24°C PM2.5 21
AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

Unit 12

控制單元

指令怎麼變成控制訊號:有限狀態機控制整顆 CPU
Interaction 35 minute(s)

Learning Objectives

  • 說明控制單元怎麼依照「現在第幾步」與 IR 產生控制訊號
  • 讀懂控制表,補完指令的微步驟並用程式驗證
  • 看見控制表填錯時,程式從哪一拍開始出問題
  • 比較硬接線與微程式兩種控制單元的取捨

誰來按這些控制訊號

上一課你用 18 拍做完 3 條指令,每一拍都自己決定開什麼訊號,還要自己讀 IR 判斷下一步。這些判斷規則其實很固定:

  • 每條指令開頭都一樣:把 PC 指的那一格抓到 IR,PC 加 1。這是擷取(fetch)。
  • 接著看 IR 是哪條指令。這是解碼(decode)。
  • 依照指令走它固定的幾步。這是執行(execute)。

既然是「現在在第幾步,加上輸入是什麼,決定輸出與下一步」,這就是第 9 課的有限狀態機。控制單元(control unit)就是這樣一個狀態機:

有限狀態機的部分 在控制單元裡
狀態 現在是哪個微步驟(F1、F2、F3、D、E1、E2、E3)
輸入 IR 的運算碼、旗標 Z 與 N
輸出 這一拍的所有控制訊號

狀態怎麼走:

LDA、ADD、SUB、STA:
F1 → F2 → F3 → D → E1 → E2 → E3 → 回到 F1

JMP、JZ、JN、IN、OUT:
F1 → F2 → F3 → D → E1 → 回到 F1

HLT:
F1 → F2 → F3 → D → E1 → 停止

一個微步驟就是一個時脈週期,也就是上一課說的一拍。

用程式走一次控制單元的狀態

把「每個微步驟開哪些訊號」寫成表,控制單元要做的事就只剩下依序查表。看每條指令開頭為什麼都一樣,以及 LDA 和 JMP 的拍數差在哪裡。

控制表

把全部的「指令 × 微步驟」列成一張表,就是控制表。整顆 UC8 的行為都寫在這張表裡。

每一格要回答的問題都一樣:這一拍,誰送上匯流排、誰接收、記憶體要不要動作? 上一課的限制還在:同一拍只能有一個來源,MDR 不能同時收記憶體和匯流排的值。

條件跳躍有一點特別:JZ 的 E1 只有 Z=1 時才開訊號。狀態機的「輸入」包含旗標就是為了這一格。Z=0 時這一拍什麼都不做,PC 在擷取時已經加過 1,自然走到下一條。

互動練習:補完控制表

黃底的格子空著。按「填這一格」選控制訊號,選好就會顯示成暫存器轉移。填完按「跑完並比對」:程式會同時用正確的控制表和你的控制表跑,每條指令結束時比較 PC、ACC、旗標、記憶體與輸出,比對出不一樣就告訴你從哪一拍開始。也可以用「下一個微步驟」一拍一拍看。

填錯一格會怎麼壞

控制表錯一格,症狀常常出現在別的地方,因為錯誤的值要等到有人用它才看得到。除錯時要回頭找「第一個不一樣的那一拍」,不是最後畫面出錯的那一拍。

下面的控制表是正確的,但你可以用「故障注入」選單把其中一格改壞。先猜會發生什麼,再跑。

互動練習:故障注入

程式是「存進記憶體再讀回來輸出」,正確的輸出是 42。每個任務選對應的故障,按「跑完並比對」看哪一拍開始不一樣;想看後面的發展,可以按「重設」再用「執行一條指令」慢慢走。

硬接線與微程式

控制表要怎麼變成真的電路?有兩種做法。

硬接線(hardwired):把控制表當成真值表,用第 3 課的方法化簡成閘。每個控制訊號都有一個布林式,例如「MEM_RD 在 F2,或在 LDA、ADD、SUB 的 E2 時是 1」。優點是快,缺點是改一格就要重新設計電路。

微程式(microprogramming):把控制表原封不動存進控制單元裡一塊小 ROM,每一列叫一條微指令(microinstruction),每個位元對應一條控制線。電路只負責「依序讀 ROM 的下一列」。這個想法由 Maurice Wilkes 在 1951 年 7 月曼徹斯特大學的計算機會議上提出(論文題目是 The Best Way to Design an Automatic Calculating Machine),當時的動機是讓控制單元的設計有條理,也讓指令集可以修改。

硬接線 微程式
速度 快,訊號直接由閘算出 較慢,每拍要讀一次 ROM
指令變多變複雜時 電路快速變大,也難除錯 ROM 多幾列就好
出廠後修改 做不到 ROM 改成可覆寫就能修

兩者不是非選一個不可。現代 x86 處理器的解碼器就是混合的:常用指令由硬接線處理,複雜或少用的指令走晶片內的微碼 ROM,而且微碼可以在執行時更新來修正錯誤。

微指令就是一串 0 和 1

把幾列控制表編碼成二進位,看一條微指令長什麼樣子。UC8 有 18 條控制線,所以每條微指令 18 位元。

確認一下

1.

控制單元這個有限狀態機的輸入是哪些?

2.

JZ 的 E1 這一拍,Z=0 時發生什麼事?

3.

F3 這一拍開了 MDR_OUT、IR_IN、PC_INC。如果少了 IR_IN,下一拍解碼會看到什麼?

4.

UC8 要增加一條新指令,兩種控制單元各要改什麼?

5.

微指令的寬度由什麼決定(像 UC8 這樣每條控制線一個位元的設計)?

第 1 次作答

重點整理

  • 控制單元是一個有限狀態機:依現在的微步驟、IR 的運算碼與旗標,決定這一拍的控制訊號。
  • 每條指令都是擷取(3 拍)、解碼(1 拍)、再走自己的執行步驟(1~3 拍)。
  • 控制表寫清楚了整顆 CPU 的行為;錯一格的症狀常常出現在很後面,要找第一個不一樣的那一拍。
  • 一支程式跑得過,不代表控制表全對,測試只能抓到走得到的路徑。
  • 硬接線快但難改,微程式慢一點但有條理也好改;現代 x86 兩者並用。

資料路徑與控制單元都有了。下一課把它們合起來,看整顆 UC8 跑一段真的程式,也算算它有多快。

這一課完成了!
Next lesson:組出一顆簡單的 CPU
你目前沒有登入,學習進度只存在這個瀏覽器。 Login 後,進度會跟著帳號,換電腦也看得到。