控制單元(control unit)
如果資料路徑是一座滿是機器與輸送帶的工廠地面,控制單元就是那位工頭:他讀每一張工單,扳下對的開關——開這台機器、把輸送帶導向那邊、關住那個閥門。控制單元是 CPU 中察看目前指令、並產生控制訊號去導引資料路徑、使這道指令做對事情的部分。
就機制而言,控制單元以被提取指令的運算碼(以及少數相關位元)為輸入,輸出一束控制訊號:RegWrite(要不要寫某暫存器?)、MemRead 與 MemWrite(要不要碰資料記憶體?)、ALUSrc(ALU 第二輸入來自暫存器還是立即值?)、MemToReg(寫回的資料來自 ALU 還是記憶體?)、Branch(這是不是分支?),以及一個 ALU 運算提示,由小小的 ALU 控制轉成確切的 ALU 功能。對單週期 CPU 而言,這是純組合邏輯:運算碼進、訊號束出,不記憶過去的指令。
更深的重點是它造成的那道接縫。因為控制單元與資料路徑分開,你可以改變機器「做什麼」(控制),而不必重接資料「怎麼流」(資料路徑),反之亦然。硬接線控制把這套邏輯實作成固定的邏輯閘;微程式控制則把訊號樣式存在一塊微小的內部記憶體裡。無論哪種,控制單元都是指令的意義(其運算碼)被翻譯成實體動作的地方。
餵入載入的運算碼,控制單元輸出 ALUSrc = 1(用立即值)、MemRead = 1、MemToReg = 1(從記憶體寫回)、RegWrite = 1、Branch = 0。餵入 R-type 運算碼,它則輸出 ALUSrc = 0、MemRead = 0、MemToReg = 0、RegWrite = 1、Branch = 0。
運算碼進、控制訊號出:控制單元把一道指令翻譯成資料路徑的開關設定。
控制單元不搬移資料,它只設定開關。有人想像「控制器執行程式」,但它只是把每道指令解碼成訊號——真正的搬移與運算由資料路徑完成。