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,自然走到下一條。
填錯一格會怎麼壞
控制表錯一格,症狀常常出現在別的地方,因為錯誤的值要等到有人用它才看得到。除錯時要回頭找「第一個不一樣的那一拍」,不是最後畫面出錯的那一拍。
下面的控制表是正確的,但你可以用「故障注入」選單把其中一格改壞。先猜會發生什麼,再跑。
硬接線與微程式
控制表要怎麼變成真的電路?有兩種做法。
硬接線(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 位元。
確認一下
控制單元這個有限狀態機的輸入是哪些?
JZ 的 E1 這一拍,Z=0 時發生什麼事?
F3 這一拍開了 MDR_OUT、IR_IN、PC_INC。如果少了 IR_IN,下一拍解碼會看到什麼?
UC8 要增加一條新指令,兩種控制單元各要改什麼?
微指令的寬度由什麼決定(像 UC8 這樣每條控制線一個位元的設計)?
重點整理
- 控制單元是一個有限狀態機:依現在的微步驟、IR 的運算碼與旗標,決定這一拍的控制訊號。
- 每條指令都是擷取(3 拍)、解碼(1 拍)、再走自己的執行步驟(1~3 拍)。
- 控制表寫清楚了整顆 CPU 的行為;錯一格的症狀常常出現在很後面,要找第一個不一樣的那一拍。
- 一支程式跑得過,不代表控制表全對,測試只能抓到走得到的路徑。
- 硬接線快但難改,微程式慢一點但有條理也好改;現代 x86 兩者並用。
資料路徑與控制單元都有了。下一課把它們合起來,看整顆 UC8 跑一段真的程式,也算算它有多快。