目錄
10.1 組合邏輯設計
10.1.1 組合邏輯控制單元框圖
10.1.2 微操作的節拍安排
10.1.3 組合邏輯設計步驟
10.2 微程序設計
10.2.1 微程序設計思想的產生
10.2.2 微程序控制單元框圖及工作原理
10.2.3 微指令的編碼方式
1. 直接編碼(水平型)
2. 字段間接編碼
10.2.4 微指令序列地址的形成
10.2.5 微指令格式
10.2.6 靜態微程序設計和動態微程序設計
10.2.7 毫微程序設計(分級微程序)
10.2.8 串行微程序控制和并行微程序控制
10.2.9 微程序設計舉例:ADD 指令執行流程
微指令代碼示例(簡化版)
📌 總結對比
📚 擴展資源
10.1 組合邏輯設計
組合邏輯控制單元通過硬連線邏輯實現指令操作控制,適用于簡單指令系統。其核心是根據當前指令、狀態信號和時序信號生成固定的控制信號序列。
10.1.1 組合邏輯控制單元框圖
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?組合邏輯控制單元結構框圖
10.1.2 微操作的節拍安排
微操作需按 CPU 周期(機器周期)和節拍電位 / 脈沖進行時序劃分。假設采用四節拍模型(T0-T3),示例如下:
// 假設CPU周期為4個節拍,每個節拍處理不同微操作
public class TimingUnit {private int currentCycle; // 當前機器周期private int currentBeat; // 當前節拍(0-3)// 生成節拍信號public void generateBeatSignal() {switch (currentBeat) {case 0: // 節拍1:取指令操作碼System.out.println("T0: 從IR中提取操作碼");break;case 1: // 節拍2:計算操作數地址System.out.println("T1: 地址計算邏輯工作");break;case 2: // 節拍3:執行數據讀寫System.out.println("T2: 存儲器/IO讀寫控制");break;case 3: // 節拍4:結果回寫與狀態更新System.out.println("T3: 運算結果寫入寄存器");break;default:throw new IllegalArgumentException("無效節拍");}}
}
10.1.3 組合邏輯設計步驟
- 確定指令集微操作:列出每條指令的微操作序列(如 ADD 指令需取指、取源操作數、運算、存結果)。
- 分配時序節拍:為每個微操作指定執行的節拍(如取指固定在 T0-T1)。
- 邏輯表達式推導:根據微操作與指令碼 / 狀態 / 節拍的關系,寫出控制信號邏輯式(如?
ALU_op = (IR_op==ADD) && (T==T2)
)。 - 電路實現:用門電路、編碼器等搭建硬連線邏輯。
10.2 微程序設計
微程序控制將控制邏輯存儲為微指令序列,通過讀取微程序實現動態控制,靈活性遠超組合邏輯。
10.2.1 微程序設計思想的產生
由英國劍橋大學 M.V.Wilkes 提出,核心思想:將每條機器指令拆解為若干微指令,存儲在控制存儲器中,通過微指令計數器(μPC)順序執行。
10.2.2 微程序控制單元框圖及工作原理
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 微程序控制單元工作流程
10.2.3 微指令的編碼方式
1. 直接編碼(水平型)
微命令字段每位獨立表示一個控制信號,無需譯碼,執行速度快但編碼長度長。
// 直接編碼示例:32位微指令,每位對應一個控制信號
public class DirectEncodingMicroinstruction {private boolean regWrite; // 寄存器寫(第0位)private boolean memRead; // 存儲器讀(第1位)private boolean aluAdd; // ALU加法(第2位)// ... 其他30個控制信號
}
2. 字段間接編碼
字段內部分位組合表示微命令,需通過字段譯碼器解析。
// 字段間接編碼示例:3位ALU操作字段(000-111對應8種操作)
public class IndirectEncodingMicroinstruction {private int aluOpCode; // 3位字段,0-7表示加法/減法/邏輯與等private boolean memOp; // 1位存儲器操作(讀/寫)public String getAluOperation() {String[] ops = {"加法", "減法", "邏輯與", "邏輯或", "移位", "比較", "取反", "直通"};return ops[aluOpCode];}
}
10.2.4 微指令序列地址的形成
- 順序執行:
μPC = μPC + 1
- 條件轉移:根據狀態標志(如 ZF=1 時跳轉)
// 條件轉移邏輯示例
public class MicroPC {private int currentAddress;private boolean zf; // 零標志public int nextAddress(boolean isConditional, int targetAddress) {if (isConditional && zf) { // 條件滿足時跳轉return targetAddress;} else { // 順序執行或無條件跳轉return currentAddress + 1;}}
}
10.2.5 微指令格式
典型格式:
微命令字段 | 判別測試字段 | 下地址字段 |
---|---|---|
控制信號輸出 | 條件判斷依據 | 下條微指令地址 |
10.2.6 靜態微程序設計和動態微程序設計
- 靜態:微程序固化在 ROM 中,不可修改(如早期 CPU)。
- 動態:微程序存儲在可寫存儲器(如 EEPROM),支持程序運行中修改(如微程序動態加載升級)。
10.2.7 毫微程序設計(分級微程序)
引入兩級微程序:
- 垂直型微指令:用于控制基本操作(如寄存器傳輸)。
- 水平型微指令:用于解析垂直微指令,生成具體控制信號。
10.2.8 串行微程序控制和并行微程序控制
類型 | 特點 |
---|---|
串行 | 微指令按順序執行,下一條微指令需等待前一條完成(控制簡單,速度慢)。 |
并行 | 允許同時執行多個微操作(如同時讀寫寄存器和啟動 ALU),需復雜時序控制。 |
10.2.9 微程序設計舉例:ADD 指令執行流程
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ADD 指令微程序流程圖
微指令代碼示例(簡化版)
// 控制存儲器模擬(存儲微指令序列)
public class ControlMemory {private Microinstruction[] cmemory;public ControlMemory() {// 初始化ADD指令微程序(假設地址0-3)cmemory = new Microinstruction[4];// 0號微指令:取指令(PC→MAR,讀存儲器)cmemory[0] = new Microinstruction("regWrite=0, memRead=1, aluOp=0", // 控制信號0, // 無測試條件,順序執行1 // 下地址1);// 1號微指令:譯碼(IR→操作碼寄存器)cmemory[1] = new Microinstruction("regWrite=1, memRead=0, aluOp=0","opCodeTest", // 測試操作碼2 // 操作碼為ADD時跳轉至2,否則跳轉至其他地址);// 2號微指令:取源操作數(R1→ALU)cmemory[2] = new Microinstruction("regRead=R1, aluOp=LOAD_A",0,3);// 3號微指令:執行加法(ALU=ADD,結果→R2)cmemory[3] = new Microinstruction("aluOp=ADD, regWrite=R2",0,0 // 返回取指周期);}
}// 微指令類
class Microinstruction {String controlSignals; // 控制信號字段String testCondition; // 判別測試字段int nextAddress; // 下地址字段public Microinstruction(String ctrl, String test, int nextAddr) {this.controlSignals = ctrl;this.testCondition = test;this.nextAddress = nextAddr;}
}
📌 總結對比
設計方法 | 優點 | 缺點 | 適用場景 |
---|---|---|---|
組合邏輯控制 | 速度快、無需存儲 | 靈活性差、修改困難 | 簡單指令集、高性能 CPU |
微程序控制 | 可編程性強、易維護 | 存在取微指令開銷 | 復雜指令集、可擴展架構 |
📚 擴展資源
- 推薦教材:《計算機組成原理(第 2 版)》唐朔飛
- 仿真工具:Logisim(組合邏輯設計)、MARS MIPS Simulator(微程序模擬)
如需進一步探討具體實現細節,歡迎在評論區留言!🚀