312 lines
14 KiB
Markdown
312 lines
14 KiB
Markdown
|
|
# 第9章 控制单元功能(详细补充版)
|
|||
|
|
|
|||
|
|
> 📖 本章分析控制单元为完成不同指令所发出的各种微操作命令。
|
|||
|
|
> 🎯 重点理解微操作命令和指令执行过程
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📋 本章目录
|
|||
|
|
|
|||
|
|
- [[#9.1 微操作命令的分析]]
|
|||
|
|
- [[#9.2 控制单元的功能]]
|
|||
|
|
- [[#本章小结]]
|
|||
|
|
- [[#例题与解析]]
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 9.1 微操作命令的分析
|
|||
|
|
|
|||
|
|
### 9.1.1 微操作命令的概念
|
|||
|
|
|
|||
|
|
> [!info] 定义
|
|||
|
|
> 微操作命令是控制单元发出的最基本控制信号,控制计算机各部件完成相应操作。
|
|||
|
|
|
|||
|
|
要理解微操作命令,可以把它想象成工厂里最细粒度的工作指令——"拿起零件"、"转动螺丝"这样的最小动作,不能再拆分了。整个计算机的工作,就是由控制单元不断发出这些最基础的信号,指挥数据通路和各个功能部件协同配合。
|
|||
|
|
|
|||
|
|
比如 `PC → MAR` 就是一条微操作命令,意思是把程序计数器的值送到地址寄存器;`1 → R` 是向主存发出读命令。每一条都很简单,但组合起来就能完成复杂的指令执行。
|
|||
|
|
|
|||
|
|
### 9.1.2 指令周期的四个阶段
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
graph LR
|
|||
|
|
A[指令周期] --> B[取指周期]
|
|||
|
|
A --> C[间址周期]
|
|||
|
|
A --> D[执行周期]
|
|||
|
|
A --> E[中断周期]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
一条指令从开始执行到完成,要经历四个阶段,就像完成一个任务需要"拿任务单→确认地址→干活→处理突发情况"这几个步骤。
|
|||
|
|
|
|||
|
|
**取指周期**是每条指令都有的,负责从内存把指令取到CPU里。**间址周期**只有间接寻址的指令才需要——就像你拿到的纸条上写的是"去3号柜找",但3号柜里放的才是真正的东西的地址,你需要先去3号柜拿到真实地址。**执行周期**是真正干活的阶段,不同指令做的事情不同,花的时间也不同。**中断周期**不是每条指令都有,只有发生了中断(比如键盘按键、打印机完成)才会进入这个阶段去处理紧急事件。
|
|||
|
|
|
|||
|
|
### 9.1.3 取指周期的微操作
|
|||
|
|
|
|||
|
|
取指周期是所有指令共有的阶段,它的微操作序列是固定的:
|
|||
|
|
|
|||
|
|
| 步骤 | 微操作 | 说明 |
|
|||
|
|
|------|--------|------|
|
|||
|
|
| 1 | PC → MAR | 现行指令地址送MAR |
|
|||
|
|
| 2 | 1 → R | 向主存发读命令 |
|
|||
|
|
| 3 | M(MAR) → MDR | 指令从主存读至MDR |
|
|||
|
|
| 4 | MDR → IR | 指令送指令寄存器 |
|
|||
|
|
| 5 | OP(IR) → CU | 操作码送CU译码 |
|
|||
|
|
| 6 | (PC) + 1 → PC | 程序计数器加1 |
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
sequenceDiagram
|
|||
|
|
participant PC
|
|||
|
|
participant MAR
|
|||
|
|
participant MEM as 主存
|
|||
|
|
participant MDR
|
|||
|
|
participant IR
|
|||
|
|
participant CU
|
|||
|
|
|
|||
|
|
PC->>MAR: PC → MAR
|
|||
|
|
Note over MAR: 1 → R(发读命令)
|
|||
|
|
MEM->>MDR: M(MAR) → MDR
|
|||
|
|
MDR->>IR: MDR → IR
|
|||
|
|
IR->>CU: OP(IR) → CU
|
|||
|
|
Note over PC: (PC) + 1 → PC
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
这个过程很直白:先把PC里的地址送到MAR,告诉主存"我要读这个地址的东西",主存把指令送到MDR,再从MDR搬到IR,同时把操作码送给CU去译码,最后PC加1指向下一条指令。整个流程就像从货架上取货——先告诉仓库你要哪个货架的东西(PC→MAR),仓库把东西放到传送带上(M(MAR)→MDR),你从传送带上拿过来(MDR→IR),然后看看是什么东西(OP(IR)→CU),同时记一下下一个要取的位置((PC)+1→PC)。
|
|||
|
|
|
|||
|
|
### 9.1.4 间址周期的微操作
|
|||
|
|
|
|||
|
|
间址周期只在间接寻址时出现,目的是把形式地址转换成有效地址:
|
|||
|
|
|
|||
|
|
| 步骤 | 微操作 | 说明 |
|
|||
|
|
|------|--------|------|
|
|||
|
|
| 1 | Ad(IR) → MAR | 形式地址送MAR |
|
|||
|
|
| 2 | 1 → R | 向主存发读命令 |
|
|||
|
|
| 3 | M(MAR) → MDR | 有效地址从主存读至MDR |
|
|||
|
|
| 4 | MDR → Ad(IR) | 有效地址送IR地址字段 |
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
sequenceDiagram
|
|||
|
|
participant IR
|
|||
|
|
participant MAR
|
|||
|
|
participant MEM as 主存
|
|||
|
|
participant MDR
|
|||
|
|
|
|||
|
|
IR->>MAR: Ad(IR) → MAR
|
|||
|
|
Note over MAR: 1 → R(发读命令)
|
|||
|
|
MEM->>MDR: M(MAR) → MDR
|
|||
|
|
MDR->>IR: MDR → Ad(IR)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
间接寻址就像你拿到一张纸条写着"去3号柜找",3号柜里放的才是真正的目标地址。间址周期做的事情就是:先把纸条上的地址(形式地址)送去查,然后从那个位置拿到真正的地址(有效地址),再把有效地址写回指令的地址字段,这样后面执行周期就知道该去哪取数据了。
|
|||
|
|
|
|||
|
|
### 9.1.5 执行周期的微操作
|
|||
|
|
|
|||
|
|
执行周期的微操作取决于指令类型,不同指令差异很大。
|
|||
|
|
|
|||
|
|
**非访存指令**不需要访问内存,操作直接在CPU内部完成:
|
|||
|
|
|
|||
|
|
| 指令 | 微操作 | 说明 |
|
|||
|
|
|------|--------|------|
|
|||
|
|
| CLA | 0 → ACC | 清除累加器 |
|
|||
|
|
| COM | $\overline{ACC}$ → ACC | 累加器取反 |
|
|||
|
|
| SHR | L(ACC) → R(ACC), ACC₀ → ACC₀ | 算术右移 |
|
|||
|
|
| CSL | L(ACC) → R(ACC), ACC₀ → ACCₙ | 循环左移 |
|
|||
|
|
| STP | 0 → G | 停机指令 |
|
|||
|
|
|
|||
|
|
这些指令都很简单——CLA就是把累加器清零,COM是把每一位取反(0变1、1变0),SHR是算术右移一位(相当于除以2),CSL是循环左移,STP是停机。它们不需要去内存取数据,所以执行周期很短。
|
|||
|
|
|
|||
|
|
**访存指令**需要访问内存,执行周期包含访存操作:
|
|||
|
|
|
|||
|
|
| 指令 | 微操作 | 说明 |
|
|||
|
|
|------|--------|------|
|
|||
|
|
| ADD X | Ad(IR) → MAR, 1 → R, M(MAR) → MDR, (ACC) + (MDR) → ACC | 加法指令 |
|
|||
|
|
| STA X | Ad(IR) → MAR, 1 → W, ACC → MDR, MDR → M(MAR) | 存数指令 |
|
|||
|
|
| LDA X | Ad(IR) → MAR, 1 → R, M(MAR) → MDR, MDR → ACC | 取数指令 |
|
|||
|
|
|
|||
|
|
ADD X 是把内存地址X处的数取出来加到累加器;STA X 是把累加器的值存到内存地址X;LDA X 是把内存地址X处的数取到累加器。它们都需要先送地址、再读写内存、最后在CPU内部完成数据操作。
|
|||
|
|
|
|||
|
|
**转移指令**改变程序的执行顺序:
|
|||
|
|
|
|||
|
|
| 指令 | 微操作 | 说明 |
|
|||
|
|
|------|--------|------|
|
|||
|
|
| JMP X | Ad(IR) → PC | 无条件转移 |
|
|||
|
|
| BAN X | A₀ · Ad(IR) + $\overline{A₀}$ · (PC) → PC | 条件转移(负则转) |
|
|||
|
|
|
|||
|
|
JMP X 就是无条件跳转到地址X,直接把X送到PC。BAN X 是条件转移——如果累加器最高位(符号位)为1(表示负数),就跳转到X;否则继续执行下一条指令。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 9.2 控制单元的功能
|
|||
|
|
|
|||
|
|
### 9.2.1 控制单元的外特性
|
|||
|
|
|
|||
|
|
控制单元是整个CPU的指挥中心,它接收各种输入信号,然后发出控制信号指挥各部件工作。
|
|||
|
|
|
|||
|
|
**输入信号**包括四类:时钟信号让CU按节拍工作,就像乐队指挥跟着节拍器;指令寄存器送来操作码,告诉CU当前要执行什么指令;标志位(条件码)提供运算结果的状态信息,帮助CU决定是否跳转;外来信号包括中断请求、总线请求等外部事件。
|
|||
|
|
|
|||
|
|
**输出信号**分两类:CPU内部控制信号控制ALU、寄存器等内部部件的操作;到控制总线的信号则控制主存和I/O设备的读写。
|
|||
|
|
|
|||
|
|
### 9.2.2 控制信号的时序
|
|||
|
|
|
|||
|
|
控制信号不是随意发出的,必须按照严格的时序来。时钟周期是CPU的最小时间单位(比如1GHz CPU的时钟周期是1ns),机器周期完成一个基本操作(通常包含几个时钟周期),指令周期完成一条指令(包含一个或几个机器周期)。
|
|||
|
|
|
|||
|
|
在取指周期,每个时钟周期发出一组控制信号,按固定顺序完成取指操作。在执行周期,根据指令类型的不同,CU会发出不同的控制信号组合——加法指令需要ALU做加法,存数指令需要向内存发写命令,转移指令需要修改PC的值。
|
|||
|
|
|
|||
|
|
### 9.2.3 控制信号的组成
|
|||
|
|
|
|||
|
|
控制信号按控制对象可以分为四类:ALU控制信号决定ALU做什么运算(加法、减法、逻辑与、逻辑或等);寄存器控制信号控制寄存器的读写(哪些寄存器要读、哪些要写);数据通路控制信号控制数据在CPU内部的传输方向(比如从ALU输出送到哪个寄存器);总线控制信号控制总线的读写操作(读内存还是写内存)。
|
|||
|
|
|
|||
|
|
这些信号配合时序,在正确的时刻发出,就能指挥整个计算机协调工作。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📝 本章小结
|
|||
|
|
|
|||
|
|
### 核心概念
|
|||
|
|
|
|||
|
|
1. **微操作命令**:控制单元发出的最基本控制信号,不可再分
|
|||
|
|
2. **指令周期**:取指周期→间址周期→执行周期→中断周期
|
|||
|
|
3. **控制单元功能**:根据指令和时序,发出各种控制信号
|
|||
|
|
|
|||
|
|
### 关键术语
|
|||
|
|
|
|||
|
|
| 术语 | 英文 | 含义 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| 微操作 | Micro-operation | 最基本的操作 |
|
|||
|
|
| 控制单元 | Control Unit | 发出控制信号的部件 |
|
|||
|
|
| 指令周期 | Instruction Cycle | 完成一条指令的时间 |
|
|||
|
|
| 机器周期 | Machine Cycle | 完成一个基本操作的时间 |
|
|||
|
|
|
|||
|
|
### 重点图示
|
|||
|
|
|
|||
|
|
> [!summary] 必须掌握的图
|
|||
|
|
> 1. 指令周期的四个阶段图
|
|||
|
|
> 2. 取指周期的微操作序列图
|
|||
|
|
> 3. 间址周期的微操作序列图
|
|||
|
|
> 4. 各种指令的微操作序列图
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🧪 例题与解析
|
|||
|
|
|
|||
|
|
### 例题1:取指周期分析
|
|||
|
|
|
|||
|
|
**题目**:写出取指周期的微操作序列。
|
|||
|
|
|
|||
|
|
**答案**:
|
|||
|
|
|
|||
|
|
取指周期的微操作序列:
|
|||
|
|
|
|||
|
|
1. **PC → MAR**:现行指令地址送MAR
|
|||
|
|
2. **1 → R**:向主存发读命令
|
|||
|
|
3. **M(MAR) → MDR**:指令从主存读至MDR
|
|||
|
|
4. **MDR → IR**:指令送指令寄存器
|
|||
|
|
5. **OP(IR) → CU**:操作码送CU译码
|
|||
|
|
6. **(PC) + 1 → PC**:程序计数器加1
|
|||
|
|
|
|||
|
|
这六步是所有指令共有的,顺序不能变——必须先送地址才能读内存,必须先读到MDR才能送到IR,必须先送到IR才能译码。唯一可以和其他操作重叠的是最后一步PC加1,它和前面的译码操作可以并行。
|
|||
|
|
|
|||
|
|
### 例题2:间址周期分析
|
|||
|
|
|
|||
|
|
**题目**:写出间址周期的微操作序列。
|
|||
|
|
|
|||
|
|
**答案**:
|
|||
|
|
|
|||
|
|
间址周期的微操作序列:
|
|||
|
|
|
|||
|
|
1. **Ad(IR) → MAR**:形式地址送MAR
|
|||
|
|
2. **1 → R**:向主存发读命令
|
|||
|
|
3. **M(MAR) → MDR**:有效地址从主存读至MDR
|
|||
|
|
4. **MDR → Ad(IR)**:有效地址送IR地址字段
|
|||
|
|
|
|||
|
|
间址周期的目的就是把形式地址变成有效地址。形式地址是指令里给出的地址,但它不是最终地址——那个位置存放的才是真正的有效地址。所以需要额外访问一次内存,把有效地址取出来,写回指令的地址字段,这样后续的执行周期就知道该去哪操作了。
|
|||
|
|
|
|||
|
|
### 例题3:加法指令分析
|
|||
|
|
|
|||
|
|
**题目**:写出加法指令 ADD X 的微操作序列。
|
|||
|
|
|
|||
|
|
**答案**:
|
|||
|
|
|
|||
|
|
加法指令 ADD X 的微操作序列:
|
|||
|
|
|
|||
|
|
1. **Ad(IR) → MAR**:形式地址送MAR
|
|||
|
|
2. **1 → R**:向主存发读命令
|
|||
|
|
3. **M(MAR) → MDR**:操作数从主存读至MDR
|
|||
|
|
4. **(ACC) + (MDR) → ACC**:累加器内容与MDR内容相加,结果送ACC
|
|||
|
|
|
|||
|
|
前三步和取数指令一样,都是把内存地址X处的操作数取到MDR。第四步是关键——把累加器里原来的值和MDR里的值送到ALU做加法,结果写回累加器。如果X是间接寻址的,还需要在前面加一个间址周期来获取有效地址。
|
|||
|
|
|
|||
|
|
### 例题4:存数指令分析
|
|||
|
|
|
|||
|
|
**题目**:写出存数指令 STA X 的微操作序列。
|
|||
|
|
|
|||
|
|
**答案**:
|
|||
|
|
|
|||
|
|
存数指令 STA X 的微操作序列:
|
|||
|
|
|
|||
|
|
1. **Ad(IR) → MAR**:形式地址送MAR
|
|||
|
|
2. **1 → W**:向主存发写命令
|
|||
|
|
3. **ACC → MDR**:累加器内容送MDR
|
|||
|
|
4. **MDR → M(MAR)**:MDR内容写入主存
|
|||
|
|
|
|||
|
|
STA X 和 LDA X 的区别在于方向相反:LDA 是从内存读到累加器,STA 是从累加器写到内存。注意第二步发的是写命令(1→W)而不是读命令(1→R),数据流方向也反过来——从ACC到MDR再到内存。
|
|||
|
|
|
|||
|
|
### 例题5:控制单元功能分析
|
|||
|
|
|
|||
|
|
**题目**:简述控制单元的功能和输入输出信号。
|
|||
|
|
|
|||
|
|
**答案**:
|
|||
|
|
|
|||
|
|
**控制单元的功能**:发出各种控制信号,控制计算机各部件在正确的时刻完成正确的操作。
|
|||
|
|
|
|||
|
|
**输入信号**:
|
|||
|
|
- **时钟**:CU按节拍工作,每个时钟周期发出一组控制信号
|
|||
|
|
- **指令寄存器**:操作码决定CU要发出什么控制信号
|
|||
|
|
- **标志**:条件码决定是否需要跳转
|
|||
|
|
- **外来信号**:中断请求、总线请求等外部事件
|
|||
|
|
|
|||
|
|
**输出信号**:
|
|||
|
|
- **CPU内控制信号**:控制ALU、寄存器等内部部件
|
|||
|
|
- **到控制总线的信号**:控制主存、I/O设备的读写
|
|||
|
|
|
|||
|
|
CU的工作可以这样理解:它看着指令(操作码),结合当前状态(标志),按照时钟节拍,在每个时刻发出正确的控制信号,指挥数据在各个部件之间流动,完成指令的功能。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ⚡ 知识点速记卡
|
|||
|
|
|
|||
|
|
> 考前快速过一遍,30秒回忆整章核心
|
|||
|
|
|
|||
|
|
**微操作命令** = 控制单元发出的最基本控制信号,不可再分。如 PC→MAR、1→R。
|
|||
|
|
|
|||
|
|
**指令周期四阶段**:取指(所有指令)→ 间址(间接寻址才要)→ 执行(所有指令)→ 中断(有中断才要)。
|
|||
|
|
|
|||
|
|
**取指周期六步**(必须背):PC→MAR → 1→R → M(MAR)→MDR → MDR→IR → OP(IR)→CU → (PC)+1→PC。
|
|||
|
|
|
|||
|
|
**间址周期四步**:Ad(IR)→MAR → 1→R → M(MAR)→MDR → MDR→Ad(IR)。目的:形式地址→有效地址。
|
|||
|
|
|
|||
|
|
**访存指令执行周期**:ADD X(读+加)、STA X(写)、LDA X(读+送ACC)。先送地址,再读写内存,最后CPU内部操作。
|
|||
|
|
|
|||
|
|
**非访存指令**:CLA清零、COM取反、SHR右移、CSL循环左移、STP停机,不访存所以快。
|
|||
|
|
|
|||
|
|
**控制单元输入**:时钟、操作码(IR)、标志、外来信号(中断/总线请求)。**输出**:CPU内部控制信号 + 控制总线信号。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔗 相关链接
|
|||
|
|
|
|||
|
|
- [[00_计算机组成原理学习指南]] - 返回主目录
|
|||
|
|
- [[08_CPU结构与功能]] - 上一章
|
|||
|
|
- [[10_控制单元设计]] - 下一章
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📚 参考资料
|
|||
|
|
|
|||
|
|
- 教材:《计算机组成原理》第3版 - 唐朔飞
|
|||
|
|
- 复习资料:计算机组成原理知识点总结
|
|||
|
|
- 习题:作业三、作业四
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
*本章难度:⭐⭐⭐⭐ 中等*
|
|||
|
|
*重要程度:⭐⭐⭐⭐ 重要*
|
|||
|
|
*补充版本:增加了通俗解释、实际例子和例题*
|