# 第10章 控制单元设计（详细补充版）

> 📖 本章介绍控制单元的两种设计方法：组合逻辑设计和微程序设计。
> 🎯 重点理解微程序设计方法

---

## 📋 本章目录

- [[#10.1 组合逻辑设计]]
- [[#10.2 微程序设计]]
- [[#本章小结]]
- [[#例题与解析]]

---

## 10.1 组合逻辑设计

### 10.1.1 组合逻辑控制单元框图

```mermaid
graph TB
    subgraph "组合逻辑控制单元"
        IR[IR<br/>指令寄存器] --> |"操作码"| DEC[操作码译码器]
        CLK[时钟] --> |"时钟信号"| TG[节拍发生器]
        DEC --> |"译码输出"| CU[控制单元]
        TG --> |"节拍信号"| CU
        FLAG[标志] --> CU
        CU --> |"控制信号"| CTRL[控制信号输出]
    end
```

组合逻辑控制单元由三个核心部件组成。操作码译码器负责把指令的操作码翻译成具体的控制信号——比如加法指令的码进来，就输出"做加法"的信号。节拍发生器产生时序信号，控制微操作的先后顺序，就像节拍器控制乐队的节奏。控制单元则是核心，它综合译码结果、节拍信号和标志位，在正确的时刻发出正确的控制信号。

这种设计方式的特点是速度快——信号通过逻辑门直接产生，不需要访问存储器。但缺点也很明显：电路复杂，修改困难，每增加一条指令可能都要重新设计电路。

### 10.1.2 微操作的节拍安排

安排微操作的节拍时，需要遵循三个原则。

**顺序原则**：有些微操作的次序不能改变。比如必须先送地址到MAR才能读内存，必须先读到MDR才能送到IR——这些顺序是硬件决定的，不能颠倒。

**并行原则**：不同控制对象的微操作可以同时执行。比如ALU做加法的同时，寄存器可以读数据——因为它们控制的是不同的硬件部件，互不干扰。

**紧凑原则**：时间短的微操作可以安排在同一节拍。比如PC送MAR和发读命令可以同时进行，因为它们的操作对象不同，而且都很快速。

#### 取指周期节拍安排

| 节拍 | 微操作 | 说明 |
|------|--------|------|
| T₀ | PC → MAR, 1 → R | 地址送MAR，发读命令 |
| T₁ | M(MAR) → MDR, (PC)+1 → PC | 读指令，PC加1 |
| T₂ | MDR → IR, OP(IR) → ID | 指令送IR，译码 |

```mermaid
sequenceDiagram
    participant T0 as 节拍T0
    participant T1 as 节拍T1
    participant T2 as 节拍T2

    Note over T0: PC → MAR, 1 → R
    Note over T1: M(MAR) → MDR, (PC)+1 → PC
    Note over T2: MDR → IR, OP(IR) → ID
```

三个节拍就完成了取指。T₀节拍同时做两件事：送地址和发读命令，因为它们操作的对象不同（MAR和控制总线），可以并行。T₁节拍也是两件事并行：从内存读指令到MDR，同时PC加1——读内存是主存的操作，PC加1是CPU内部操作，互不影响。T₂节拍把指令从MDR搬到IR，同时操作码送到译码器。

#### 间址周期节拍安排

| 节拍 | 微操作 | 说明 |
|------|--------|------|
| T₀ | Ad(IR) → MAR, 1 → R | 形式地址送MAR |
| T₁ | M(MAR) → MDR | 读有效地址 |
| T₂ | MDR → Ad(IR) | 有效地址送IR |

间址周期和取指周期结构类似，但目的不同——这里是为了获取有效地址。T₀送形式地址并发读命令，T₁从内存读有效地址到MDR，T₂把有效地址写回指令的地址字段。这样后续执行周期就知道该去哪操作了。

#### 执行周期节拍安排

**非访存指令**不需要访问内存，所以很多只需要用到T₂节拍：

| 指令 | T₀ | T₁ | T₂ |
|------|----|----|-----|
| CLA | 空 | 空 | 0 → ACC |
| COM | 空 | 空 | $\overline{ACC}$ → ACC |
| SHR | 空 | 空 | L(ACC) → R(ACC) |
| CSL | 空 | 空 | R(ACC) → L(ACC) |
| STP | 空 | 空 | 0 → G |

这些指令都是CPU内部操作，不需要去内存取数据，所以T₀和T₁空闲，只在T₂执行一个操作。这也是为什么非访存指令通常比访存指令快。

**访存指令**需要访问内存，三个节拍都用满了：

**加法指令 ADD X**：

| 节拍 | 微操作 |
|------|--------|
| T₀ | Ad(IR) → MAR, 1 → R |
| T₁ | M(MAR) → MDR |
| T₂ | (ACC) + (MDR) → ACC |

T₀送地址并发读命令，T₁从内存读操作数到MDR，T₂把累加器的值和MDR的值送到ALU做加法，结果写回累加器。

**存数指令 STA X**：

| 节拍 | 微操作 |
|------|--------|
| T₀ | Ad(IR) → MAR, 1 → W |
| T₁ | ACC → MDR |
| T₂ | MDR → M(MAR) |

STA X 和 ADD X 的区别在于方向：ADD 是从内存读到CPU，STA 是从CPU写到内存。所以T₀发的是写命令（1→W），T₁把累加器的值送到MDR，T₂把MDR的内容写入内存。

**取数指令 LDA X**：

| 节拍 | 微操作 |
|------|--------|
| T₀ | Ad(IR) → MAR, 1 → R |
| T₁ | M(MAR) → MDR |
| T₂ | MDR → ACC |

LDA X 和 ADD X 的前三步完全一样，区别在T₂：ADD 是做加法后送回累加器，LDA 是直接把MDR的值送到累加器（累加器原来的值被覆盖）。

---

## 10.2 微程序设计

### 10.2.1 微程序设计的基本概念

> [!info] 定义
> 微程序设计是用程序的方法来设计控制单元，把控制信号编成微指令，存放在控制存储器中。

组合逻辑设计虽然速度快，但电路复杂、修改困难。微程序设计的思路完全不同——它把控制信号看成"数据"，存到一个ROM（只读存储器）里，执行指令时从ROM中读取控制信号。这样设计控制单元就变成了编写"微程序"，和写软件的思路类似。

三个核心概念：**微指令**是一组控制信号的集合，一条微指令可以同时激活多个控制信号；**微程序**是微指令的有序序列，一条机器指令对应一个微程序；**控制存储器**（CS）是存放微程序的ROM，通常在CPU内部。

举个例子，执行一条加法指令，它的微程序可能包含三条微指令：第一条完成取指（PC→MAR、1→R等），第二条完成取操作数（Ad(IR)→MAR、M(MAR)→MDR），第三条完成加法运算（(ACC)+(MDR)→ACC）。每条微指令里的控制信号可以并行发出。

### 10.2.2 微指令的格式

微指令由两部分组成：**操作控制字段**产生各种控制信号，**顺序控制字段**决定下一条微指令的地址。

根据操作控制字段的编码方式，微指令分为两种格式。

**水平型微指令**的操作控制字段很长，每一位（或每几位）对应一个控制信号，可以同时激活多个信号，实现并行操作。优点是执行速度快（一条微指令就能完成很多操作），缺点是微指令很长，占用存储空间大。现代高性能CPU通常采用水平型微指令。

**垂直型微指令**的操作控制字段很短，采用编码方式，一条微指令只能控制一个或少数几个操作。优点是微指令短、节省空间，缺点是执行速度慢（需要更多微指令才能完成一条机器指令）。简单处理器常用垂直型微指令。

### 10.2.3 微程序设计的步骤

微程序设计可以分为四步。

第一步是**分析指令**：把每条机器指令分解成微操作序列，确定需要哪些控制信号。比如加法指令需要PC→MAR、1→R、M(MAR)→MDR、(ACC)+(MDR)→ACC这些控制信号。

第二步是**设计微指令格式**：确定操作控制字段和顺序控制字段的宽度和编码方式。操作控制字段要能表示所有需要的控制信号，顺序控制字段要能表示微程序的地址范围。

第三步是**编写微程序**：为每条机器指令编写对应的微程序。取指周期的微程序是所有指令共用的，执行周期的微程序因指令而异。

第四步是**实现控制存储器**：把微程序固化到ROM中。ROM的内容在制造时就确定了，不能修改（除非用可擦写的EPROM）。

### 10.2.4 微程序设计的优缺点

微程序设计最大的优点是**规整性和灵活性**。用程序的方法设计控制单元，逻辑清晰、容易理解；需要增加新指令时，只需要在ROM中添加对应的微程序，不需要重新设计电路；调试和维护也方便，可以通过修改微程序来修复bug。

缺点主要是**速度**。每条微指令都要从控制存储器读取，增加了访存时间，比组合逻辑直接产生信号要慢。另外需要额外的控制存储器，增加了硬件成本。

实际应用中，现代复杂CPU（如x86系列）通常采用微程序设计，因为指令集复杂、需要灵活扩展。而简单处理器（如一些嵌入式处理器）可能采用组合逻辑设计，追求更高的执行速度。

---

## 📝 本章小结

### 核心概念

1. **组合逻辑设计**：用组合逻辑电路直接产生控制信号，速度快但设计复杂
2. **微程序设计**：把控制信号存到ROM中，用读取ROM的方式产生控制信号，灵活但速度较慢
3. **微指令**：一组控制信号的集合
4. **微程序**：微指令的有序序列，一条机器指令对应一个微程序
5. **控制存储器**：存放微程序的ROM

### 关键术语

| 术语 | 英文 | 含义 |
|------|------|------|
| 组合逻辑 | Combinational Logic | 用逻辑电路实现 |
| 微程序 | Microprogram | 用程序实现 |
| 微指令 | Microinstruction | 控制信号的集合 |
| 控制存储器 | Control Storage | 存放微程序的ROM |

### 重点图示

> [!summary] 必须掌握的图
> 1. 组合逻辑控制单元框图
> 2. 微程序控制单元框图
> 3. 微指令格式图
> 4. 取指周期的节拍安排图

---

## 🧪 例题与解析

### 例题1：取指周期节拍安排

**题目**：写出取指周期的节拍安排。

**答案**：

| 节拍 | 微操作 | 说明 |
|------|--------|------|
| T₀ | PC → MAR, 1 → R | 地址送MAR，发读命令 |
| T₁ | M(MAR) → MDR, (PC)+1 → PC | 读指令，PC加1 |
| T₂ | MDR → IR, OP(IR) → ID | 指令送IR，译码 |

每个节拍都安排了两个可以并行的操作：T₀送地址和发读命令操作对象不同，可以同时进行；T₁读内存和PC加1一个是主存操作、一个是CPU内部操作，互不干扰；T₂送指令和译码也是类似道理。这样三个节拍就完成了取指，效率很高。

### 例题2：加法指令节拍安排

**题目**：写出加法指令 ADD X 的节拍安排。

**答案**：

| 节拍 | 微操作 |
|------|--------|
| T₀ | Ad(IR) → MAR, 1 → R |
| T₁ | M(MAR) → MDR |
| T₂ | (ACC) + (MDR) → ACC |

ADD X 的执行周期需要三次访存操作中的两次（送地址、读数据），然后做加法。T₀送地址并发读命令，T₁等待内存响应并把数据读到MDR，T₂把累加器的值和MDR的值送到ALU做加法，结果写回累加器。如果X是间接寻址的，还需要在前面加一个间址周期。

### 例题3：微程序设计步骤

**题目**：简述微程序设计的步骤。

**答案**：

微程序设计的步骤：

1. **分析指令**：把每条机器指令分解成微操作序列，确定需要哪些控制信号
2. **设计微指令格式**：确定操作控制字段和顺序控制字段的宽度和编码方式
3. **编写微程序**：为每条机器指令编写对应的微程序，取指周期的微程序是共用的
4. **实现控制存储器**：把微程序固化到ROM中

这四步的核心思想是"用数据代替逻辑"——把原本需要复杂电路实现的控制逻辑，变成存储在ROM中的数据，通过读取ROM来产生控制信号。这样设计更灵活，但代价是速度稍慢。

### 例题4：组合逻辑与微程序比较

**题目**：比较组合逻辑设计和微程序设计的优缺点。

**答案**：

| 特性 | 组合逻辑设计 | 微程序设计 |
|------|--------------|------------|
| **设计方法** | 用逻辑电路直接实现 | 用程序（ROM）实现 |
| **优点** | 速度快 | 规整性好，灵活，易修改 |
| **缺点** | 设计复杂，不灵活，难修改 | 速度较慢，需要额外的ROM |
| **应用** | 简单CPU、RISC处理器 | 复杂CPU、CISC处理器 |

选择哪种方式取决于设计目标：追求极致速度就用组合逻辑，追求灵活性和可扩展性就用微程序。现代CPU往往混合使用——简单常用的指令用组合逻辑加速，复杂指令用微程序实现。

### 例题5：微指令格式设计

**题目**：设计一个简单的微指令格式，支持8种控制信号。

**答案**：

**操作控制字段**：8种控制信号，如果采用水平型编码（每位对应一个信号），需要8位。如果采用垂直型编码（用3位二进制编码选择8种信号之一），只需要3位，但一次只能激活一个信号。

**顺序控制字段**：需要支持顺序执行和跳转。假设微程序最多16条微指令，地址需要4位；再加1位跳转标志（是否跳转），共5位。

**水平型微指令格式**（16位）：
- 操作控制字段：8位（每位控制一个信号，可同时激活多个）
- 顺序控制字段：4位地址 + 1位跳转标志 + 3位备用 = 8位

**垂直型微指令格式**（8位）：
- 操作控制字段：3位（编码选择8种信号之一）
- 顺序控制字段：4位地址 + 1位跳转标志 = 5位

水平型微指令更灵活（一条指令可以同时控制多个操作），但占用更多空间；垂直型微指令更紧凑，但需要更多条微指令才能完成同样的功能。

---

## ⚡ 知识点速记卡

> 考前快速过一遍，30秒回忆整章核心

**两种CU设计方法**：组合逻辑（硬连线，快但难改）vs 微程序（ROM存控制信号，灵活但慢）。

**组合逻辑CU三部件**：操作码译码器（指令→控制信号）、节拍发生器（产生时序）、控制单元（综合输出）。

**节拍安排三原则**：顺序原则（先MAR后读内存）、并行原则（不同部件可同时工作）、紧凑原则（短操作放同一节拍）。

**取指周期三拍**：T₀=PC→MAR+1→R，T₁=M(MAR)→MDR+(PC)+1→PC，T₂=MDR→IR+OP(IR)→ID。

**微程序核心三概念**：微指令（一组控制信号）、微程序（微指令序列，一条机器指令对应一个微程序）、控制存储器CS（存微程序的ROM）。

**水平型 vs 垂直型微指令**：水平型（位长，可并行多信号，快但占空间）vs 垂直型（位短，编码方式，省空间但慢）。

**微程序设计四步**：分析指令→设计微指令格式→编写微程序→固化到ROM。核心思想：用数据（ROM）代替逻辑（电路）。

**选择策略**：追求速度→组合逻辑（RISC），追求灵活→微程序（CISC）。现代CPU常混合使用。

---

## 🔗 相关链接

- [[00_计算机组成原理学习指南]] - 返回主目录
- [[09_控制单元功能]] - 上一章
- [[01_计算机系统概论]] - 返回第一章

---

## 📚 参考资料

- 教材：《计算机组成原理》第3版 - 唐朔飞
- 复习资料：计算机组成原理知识点总结
- 习题：作业三、作业四

---

*本章难度：⭐⭐⭐⭐⭐ 困难*
*重要程度：⭐⭐⭐⭐⭐ 重点*
*补充版本：增加了通俗解释、实际例子和例题*