322 lines
15 KiB
Markdown
322 lines
15 KiB
Markdown
|
|
# 第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版 - 唐朔飞
|
|||
|
|
- 复习资料:计算机组成原理知识点总结
|
|||
|
|
- 习题:作业三、作业四
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
*本章难度:⭐⭐⭐⭐⭐ 困难*
|
|||
|
|
*重要程度:⭐⭐⭐⭐⭐ 重点*
|
|||
|
|
*补充版本:增加了通俗解释、实际例子和例题*
|