CPU 的基本结构

上一节把 CPU 的职责拆成五项功能,这一节把这五项功能落到硬件上:哪些部件、怎样连、谁给谁发信号。

这一节的输出是一张图。读这张图的能力,就是 5.3 数据通路大题的全部起手式——那类题给的图和这张图是同一类东西,只是画得更具体、并且故意留几处空白让考生补。所以本节不满足于”认识每个方框叫什么”,而要建立一个更基本的区分:图上的线分两种,一种走数据,一种走控制。

机制

两张网叠在一起

CPU 结构图上所有的连线,都属于且只属于以下两类之一:

数据通路(实线)控制信号(虚线/箭头)
线上跑的是数据本身——指令、地址、操作数、结果开关的开合命令——1 位或几位
宽度与机器字长同量级(16 位、32 位……)1 位(使能)或 位( 选一)
起点某个寄存器的输出端、ALU 的输出端、MDR只能是控制部件的输出端
终点某个寄存器的输入端、ALU 的输入端、MAR寄存器的使能端、MUX 的选择端、ALU 的 ALUop 端
本章哪一节5.35.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 / MDRCPU 与主存之间的地址、数据界面

CU 的输入有三类,缺一不可:

  • 操作码(来自 IR)——决定”这是什么指令”
  • 时序信号(来自时序系统)——决定”现在是第几拍”
  • 状态/标志(来自 PSW、来自主存的 Ready 等)——决定”要不要转、要不要等”

第三类输入常被忽略,但它是条件转移能工作的原因。 Jcc 的控制信号在”转”和”不转”两种情况下不同,而区别的依据是 ZF/SF 这些标志——所以标志位必须接进 CU。同理,“等主存把数据送回来”需要 Ready 信号接进 CU。

CU 的实现方式有两种(硬布线、微程序),那是 5.4.2 和 5.4.3 的内容。注意这两节讲的是同一个方框的两种做法,不是两个不同的部件。

内部总线与系统总线

CPU 结构图上那根贯穿各寄存器的线叫CPU 内部总线,它和第 6 章讲的系统总线是两个东西:

CPU 内部总线系统总线
连接CPU 内部各寄存器、ALUCPU、主存、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 基本结构。

链接