CPU 的基本结构
上一节把 CPU 的职责拆成五项功能,这一节把这五项功能落到硬件上:哪些部件、怎样连、谁给谁发信号。
这一节的输出是一张图。读这张图的能力,就是 5.3 数据通路大题的全部起手式——那类题给的图和这张图是同一类东西,只是画得更具体、并且故意留几处空白让考生补。所以本节不满足于”认识每个方框叫什么”,而要建立一个更基本的区分:图上的线分两种,一种走数据,一种走控制。
机制
两张网叠在一起
CPU 结构图上所有的连线,都属于且只属于以下两类之一:
| 数据通路(实线) | 控制信号(虚线/箭头) | |
|---|---|---|
| 线上跑的是 | 数据本身——指令、地址、操作数、结果 | 开关的开合命令——1 位或几位 |
| 宽度 | 与机器字长同量级(16 位、32 位……) | 1 位(使能)或 |
| 起点 | 某个寄存器的输出端、ALU 的输出端、MDR | 只能是控制部件的输出端 |
| 终点 | 某个寄存器的输入端、ALU 的输入端、MAR | 寄存器的使能端、MUX 的选择端、ALU 的 ALUop 端 |
| 本章哪一节 | 5.3 | 5.4 |
这个二分是本章第一条主线的判据。 拿到任何一张 CPU 结构图,先给每根线归类,图立刻就变得可读了。而归类的方法只有一句话:看它传的是”值”还是”要不要”。
一个立刻能用的推论:控制部件不生产数据。 控制器能决定”把某个值送上总线”,但那个值本身必须来自某个寄存器;控制器不可能凭空造出一个地址或一个操作数交给数据通路。这条推论会在 5.3.4 用来判断一道单总线题里”哪个端点该接控制部件”。
运算器部分
运算器 = 加工数据的部件 + 存放数据的寄存器 + 它们之间的连线。
| 部件 | 作用 | 在题里的常见形式 |
|---|---|---|
| ALU | 算术逻辑运算,产生结果和标志 | 由 ALUop 选功能,位数 |
| 移位器 | 左移、右移、直送 | 可独立(SRop)也可并入 ALU |
| 通用寄存器组 GPRs | 存放操作数与中间结果 | 读端口 / 写端口、rs / rd 编号,见 5.3.2 |
| 标志寄存器(PSW / FR) | 存放 ZF、SF、CF、OF | 由 ALU 写,由转移指令读,见 4.3.2 |
| 暂存器(T、Y、Z) | 存放总线上传来的、还不能立即用掉的中间值 | 单总线结构的必需品,理由见下 |
| 多路选择器 / 内部总线 | 决定”这一拍谁的输出送到 ALU 输入端” | 结构选型,见 5.3.3 |
暂存器为什么必须存在,是本节唯一一处需要论证而不是记忆的地方,也是历年真题的固定问法。
ALU 需要两个操作数同时到位才能运算。而单总线结构下,一根内部总线一拍只能传一个值。于是两个操作数不可能在同一拍上总线,第一个必须先被接住、存住,等第二个上来时再一起送进 ALU——接住它的就是暂存器。
同样的道理还有输出侧:ALU 的输出如果直接接回内部总线,而它的输入又来自内部总线,就形成了组合逻辑环路,结果会在一拍内不停自激。所以 ALU 输出端也要先进一个暂存器(常画作 Z 或 Y),下一拍再送上总线。
暂存器不属于 ISA 状态——程序员看不见它,没有任何指令能命名它。它纯粹是为了迁就总线的时序而存在的实现细节。这一点在 5.1.3 展开。
控制器部分
控制器 = 拿到指令 + 拿到状态 → 算出这一拍该发哪些信号。
| 部件 | 作用 |
|---|---|
| PC | 存放下一条指令的地址,具有自动加”1”的功能(“1” 指一条指令的长度) |
| IR | 存放当前正在执行的指令 |
| 指令译码器 ID | 对 IR 的操作码字段译码,识别出这是哪条指令 |
| 微操作信号发生器(CU) | 控制器的核心:由操作码、时序信号、状态标志共同决定输出哪组控制信号 |
| 时序系统 | 产生时钟、节拍,给”什么时候发”提供基准 |
| MAR / MDR | CPU 与主存之间的地址、数据界面 |
CU 的输入有三类,缺一不可:
- 操作码(来自 IR)——决定”这是什么指令”
- 时序信号(来自时序系统)——决定”现在是第几拍”
- 状态/标志(来自 PSW、来自主存的 Ready 等)——决定”要不要转、要不要等”
第三类输入常被忽略,但它是条件转移能工作的原因。 Jcc 的控制信号在”转”和”不转”两种情况下不同,而区别的依据是 ZF/SF 这些标志——所以标志位必须接进 CU。同理,“等主存把数据送回来”需要 Ready 信号接进 CU。
CU 的实现方式有两种(硬布线、微程序),那是 5.4.2 和 5.4.3 的内容。注意这两节讲的是同一个方框的两种做法,不是两个不同的部件。
内部总线与系统总线
CPU 结构图上那根贯穿各寄存器的线叫CPU 内部总线,它和第 6 章讲的系统总线是两个东西:
| CPU 内部总线 | 系统总线 | |
|---|---|---|
| 连接 | CPU 内部各寄存器、ALU | CPU、主存、I/O 接口 |
| 范围 | 芯片内 | 芯片外(现代已片内集成,但逻辑上仍在 CPU 外) |
| 谁管仲裁 | 控制器直接排拍,不需要仲裁 | 需要总线仲裁,见 6.2.1 |
| 出口 | MAR / MDR 就是它的出口 | —— |
MAR 和 MDR 是两条总线的交界点:内部总线的数据经 MDR 送上系统总线的数据线,内部总线的地址经 MAR 送上系统总线的地址线。这个”界面”角色决定了它们的位数取法,见 5.1.3。
Cache 算不算 CPU 的一部分
现代处理器的 L1、L2 Cache 都在 CPU 芯片内。但 408 讲”CPU 的基本结构”时不把 Cache 列进去,因为这一节讨论的是执行指令所必需的部件,而 Cache 是存储层次的优化,逻辑上属于”主存的加速”,拿掉它程序照样能跑。
“物理上在哪”和”逻辑上属于哪一层”是两件事——这个区分在 4.1.1 讨论 ISA 与微体系结构时已经用过一次。
边界
层次辨析:数据通路上的线 / 控制信号线
判据是**“传的是值还是要不要”**:
- 传值(地址、操作数、指令)→ 数据线,起点是寄存器或 ALU 的输出端
- 传开合命令 → 控制线,起点只能是控制部件的输出端
控制部件不产生数据。 一道题问”某端点是否应接到控制部件的输出端”,先判断该端点吃进去的是数据还是命令。
边界辨析:暂存器 / 通用寄存器
都在运算器里,都存数据,区别在可见性:
- 通用寄存器有编号、有指令能读写它 → ISA 状态
- 暂存器无编号、任何指令都不能命名它 → 微体系结构状态
暂存器存在的唯一理由是总线一拍只能传一个值,属于对实现方式的迁就。多总线结构里暂存器可以少设甚至不设。
关联对照:微操作信号发生器 CU / 指令译码器 ID
二者常被合画成一个方框,但职责不同:
- ID 只看操作码,输出”这是哪条指令”(
条指令 → 根线,只有一根有效) - CU 看操作码 + 时序 + 状态,输出”这一拍发哪些信号”
ID 的输出是 CU 的输入之一。 硬布线控制器里,CU 就是接在 ID 输出线上的一大片组合逻辑。
对照速查
| 部件 | 属于 | 是否 ISA 可见 | 位数怎么定 |
|---|---|---|---|
| ALU | 运算器 | —— | 与机器字长一致 |
| GPRs | 运算器 | ✅ 可见 | 字长;编号位数 |
| PSW / FR | 运算器 | ✅ 可见 | 按标志位个数 |
| 暂存器 T/Y/Z | 运算器 | ❌ 不可见 | 与字长一致 |
| PC | 控制器 | ✅ 可见 | 主存地址位数 |
| IR | 控制器 | ❌ 不可见 | 指令字长 |
| MAR | 接口 | ❌ 不可见 | 主存地址位数 |
| MDR | 接口 | ❌ 不可见 | 存储字长 |
| ID / CU / 时序系统 | 控制器 | ❌ 不可见 | —— |
考点
- 给结构图判断部件归属:问某方框属运算器还是控制器。暂存器、GPRs、ALU、移位器、PSW 归运算器,其余归控制器;MAR/MDR 按”接口”处理,题目一般不会拿它设陷阱。
- “为什么要设暂存器 T”:标准答案两句——单总线一拍只传一个值,ALU 需要两个操作数同时到位;以及避免 ALU 输出直接绕回输入形成环路。2009 年真题原题,见 5.3.4。
- 判断某端点是否接控制部件输出端:用”传值还是传命令”这一条判据逐个过。
- CU 的输入有哪几类:操作码、时序信号、状态标志。漏掉状态标志是最常见的失分点。
- 辨析题:CPU 内部总线 ≠ 系统总线;Cache 物理上在片内但不列入 CPU 基本结构。
链接
- 🏠 返回总览:计算机组成原理第 5 章:中央处理器总览
- ⬅️ 上一节:5.1.1 CPU 的功能
- ➡️ 下一节:5.1.3 CPU 的寄存器
- 🔧 图的具体形态:5.3.3 数据通路的基本结构
- 🔧 控制器内部:5.4.1 控制器的结构和功能
- 📖 名词库:第 5 章名词库