计算机组成原理 · 2027 考研计算机 408

第 5 章 中央处理器

目标院校:四川大学 / 电子科技大学 | 建议用时:概念 4 小时 + 例题练习 4 小时

本章地位:组成原理分值最重、大题最集中的一章(选择题 + 大题合计常达 8~13 分)。三大主战场:① 数据通路微操作序列——给出单总线结构,写出 MOV / ADD / LOAD / JMP 的执行步骤,每一步写清「谁上总线、谁接收」;② 微指令格式与控存容量计算——控制字段 + 判别测试字段 + 下地址字段逐段求位数,须代具体数验证;③ 流水线性能计算——总时间 \(T=(k+n-1)\Delta t\)、吞吐率、加速比、效率四件套,再叠加停顿与 load-use 冒险。概念题主考寄存器可见性、四个周期的微操作、硬布线与微程序对比、编码方式辨析。本章所有计算全部代具体数值逐步演算。

5.1 CPU 的功能与结构 高频考点

CPU 的功能CPU = 运算器 + 控制器,根本任务是周而复始地取出并执行指令。其功能可归纳为五项:
  1. 指令控制:控制程序的执行顺序(取指、PC 自增、转移);
  2. 操作控制:按指令要求产生完成一条指令所需的全部微操作命令(控制信号);
  3. 时间控制:把各种微操作安排在恰当的时序位置(哪个周期、哪个节拍)上;
  4. 数据加工:由 ALU 对数据进行算术运算与逻辑运算;
  5. 中断处理:响应并处理异常和 I/O 中断。

5.1.1 运算器与控制器:CPU 的两大部件

运算器(数据通路 DP 的核心)完成数据加工,核心组成:
  1. 算术逻辑单元 ALU:执行加、减、与、或、移位等运算,是组合逻辑电路(无记忆);
  2. 累加寄存器 ACC / 通用寄存器组 R0~R(n−1):存放操作数与运算结果;
  3. 暂存寄存器 Y / Z:暂存不能同时上总线的两个操作数与 ALU 的输出(见 5.3);
  4. 程序状态字寄存器 PSW:记录进位 CF、溢出 OF、零 ZF、负 SF 等标志位,是条件转移指令的判断依据;
  5. 内部总线:连接各寄存器与 ALU,传送数据。
控制器(控制单元 CU 的核心)解释指令、发命令,核心组成:
  1. 程序计数器 PC:存放下一条欲执行指令的主存地址;
  2. 指令寄存器 IR:存放当前正在执行的指令;
  3. 指令译码器 ID:对 IR 中的操作码译码,识别指令类型(不译地址码);
  4. 时序系统:产生节拍与脉冲,为微操作定时;
  5. 微操作信号发生器(控制单元 CU):综合「操作码译码结果 + 时序信号 + 状态标志」,发出每一步的微操作命令——它是硬布线与微程序两种设计方式的分水岭。
一句话分工运算器管「算」(数据加工:ALU + 寄存器们),控制器管「指挥」(取指、译码、定时、发微操作命令)。MAR、MDR 是 CPU 与主存之间的接口寄存器,从属关系上常画在 CPU 内部、由控制器协同使用——判断「是否属于 CPU」时算 CPU 一部分,判断「属于运算器还是控制器」时不必强行归类。
CPU 运算器(数据加工) 通用寄存器 R0~R3 暂存器 Y/Z ALU算术逻辑运算 PSWCF/OF/ZF/SF ACC 控制器(解释指令、发命令) PC IR 指令译码器 ID只译操作码 时序系统(节拍/脉冲) 微操作信号发生器CU(硬布线/微程序)发微操作命令 内部总线(任意时刻只能有一个部件发送数据) MAR MDR 微操作命令(控制信号) 主存储器存指令与数据 地址 / 数据(经 MAR、MDR) 实线 = 数据流 红虚线 = 控制流 PC 给地址、IR 存指令、CU 发命令、ALU 算数据
图 5-1 CPU 内部结构框图:运算器(蓝区:ALU、通用寄存器、暂存器、PSW)+ 控制器(红区:PC、IR、译码器、时序、CU)+ 内部总线 + MAR/MDR 接主存
易错① PC 存的是地址不是指令,指令本身取回后放 IR;
② 指令译码器只对操作码译码,形式地址→有效地址的变换在执行周期由 ALU / 寻址机构完成;
③ ALU 是组合逻辑,一撤输入输出就消失,所以输出必须落进 Z 寄存器;
④ PSW(条件码)属运算器一侧,时序系统、译码器属控制器——归类选择题常在这里挖坑。

5.1.2 寄存器大盘点:用户可见 vs 不可见

寄存器所属作用汇编程序员可见性
PC控制器存下一条指令的地址不可直接访问(转移 / 调用指令可修改,考题一般判为不可见)
IR控制器存当前执行的指令不可见
MARCPU 内、主存接口存欲访问主存单元的地址不可见
MDRCPU 内、主存接口存与主存交换的数据 / 指令不可见
通用寄存器 / ACC运算器存操作数与结果可见(指令能直接点名)
PSW 标志位运算器CF / OF / ZF / SF可见(条件转移的依据)
暂存器 Y / Z运算器暂存 ALU 的操作数与结果不可见(硬件自用)
基址 / 变址寄存器、SP地址寄存器寻址与栈管理可见
判可见性口诀「能用指令直接点名读写的 = 可见;硬件自己在幕后倒腾的 = 不可见」。MAR / MDR / IR / 暂存器 / μIR 都是幕后角色;通用寄存器、条件码、基址变址、栈指针站在台前。PC 是「半幕后」——不能用传送指令读写,但转移、转子、中断返回会改它,按教材口径通常归入不可见。
例 1 高频考点 寄存器可见性

下列寄存器中,对汇编语言程序员完全透明(不可见)的是( )
A. 通用寄存器 R0 B. PSW 中的零标志 ZF C. 存储器数据寄存器 MDR D. 变址寄存器 IX

查看解答

C。逐项分析:

A 可见:MOV 指令可直接指定 R0;B 可见:JZ / JNZ 等条件转移直接测试 ZF;D 可见:变址寻址指令显式使用 IX;

C 不可见:MDR 是 CPU 与主存交换数据的中转站,由硬件自动装卸,任何指令都无法点名访问它——对程序员完全透明。同理透明的还有 MAR、IR、暂存器 Y/Z。

练习 1

判断下列说法的正误:(1) 指令译码器既译操作码又译地址码;(2) PSW 属于运算器的组成部分;(3) PC 的内容是当前正在执行的指令本身;(4) 时序系统属于控制器。

查看答案

(1) 错:译码器只对操作码译码;地址码经寻址机构在执行周期形成有效地址。

(2) 对:条件码由 ALU 运算产生,PSW 划归运算器一侧。

(3) 错:PC 存的是下一条指令的主存地址,指令本身在 IR 中。

(4) 对:时序系统(时钟、节拍、脉冲发生器)为控制器提供时间基准,属控制器。

5.2 指令执行过程 高频考点

5.2.1 三级时序:指令周期 → 机器周期 → 时钟周期

三级时序系统
  1. 指令周期:CPU 取出并执行完一条指令所需的全部时间,常由若干机器周期组成;
  2. 机器周期(CPU 周期):完成一个基本操作(如访存一次)的时间,通常等于一个存取周期,由若干时钟周期组成;
  3. 时钟周期(节拍):CPU 操作的最小时间单位,等于主频的倒数 \(T_{\text{clk}} = 1/f\)。
层级关系:指令周期 ⊇ 机器周期 ⊇ 时钟周期。一个机器周期常含 4 个时钟周期(4 个节拍),但现代 CPU 中机器周期概念已弱化,直接用「指令周期 = 若干时钟周期(CPI)」计量。
时序计算设一条指令经历 \(a\) 个机器周期、每个机器周期含 \(b\) 个时钟周期,主频为 \(f\),则 \[ \text{指令周期} = a \times b \times \frac{1}{f},\qquad \text{CPI} = a \times b \] 不同指令所需机器周期数不同:指令周期是不定长的——简单指令(寄存器型)只需取指 + 执行,访存指令更长,间接寻址再长。
易错① 时钟周期是三级中最小单位,不是节拍组合;机器周期 ≠ 指令周期;
② 「所有指令的指令周期都相同」是错的,唯有取指周期完全相同(每条指令都必须先取指);
③ 完成一条指令的三步「取指 → 分析 → 执行」中,分析(译码)不含访存,可与取指的后半重叠。

5.2.2 四个周期及其微操作

指令周期的四种形态一条指令的执行最多经历四个周期:取指周期(必有)→ 间址周期(仅间接寻址类指令有)→ 执行周期(必有)→ 中断周期(仅 CPU 响应中断时有)。每个周期由若干节拍组成,每个节拍完成一个或一组可并行的微操作(最细粒度的不可再分操作,如「(PC) 送 MAR」)。
取指周期微操作(所有指令统一)
C1: (PC) → MAR,  1 → R          ; PC 内容送 MAR,同时发读命令
C2: M(MAR) → MDR, (PC) + 1 → PC ; 读出指令送 MDR,PC 自动加"1"指向下条
C3: (MDR) → IR,  OP(IR) → ID    ; 指令送 IR 保存,操作码送译码器译码
间址周期微操作(一重间接寻址:把形式地址变换为有效地址)
C1: Ad(IR) → MAR, 1 → R         ; 指令中的形式地址送 MAR,发读命令
C2: M(MAR) → MDR                 ; 从主存读出有效地址 EA
C3: (MDR) → Ad(IR)               ; EA 送回指令的地址码字段,供执行周期用
中断周期微操作(响应中断时由中断隐指令即硬件自动完成)
C1: 0 → EInt                      ; 关中断(硬件强制,防保存断点期间再被中断)
C2: (SP) - 1 → SP, (SP) → MAR    ; 栈指针减"1",断点存放地址送 MAR
C3: (PC) → MDR, 1 → W            ; 断点(返回地址)送 MDR,发写命令
C4: (MDR) → M(MAR)               ; 断点压入堆栈保存
C5: 向量地址 → PC                 ; 中断服务程序入口地址送 PC,转服务程序
中断周期三件事① 关中断;② 保存断点(PC 压栈或存指定单元);③ 引出中断服务程序(向量地址送 PC)。三件事都由中断隐指令(硬件)完成——它不是指令系统中一条真实的指令,周期内 CPU 不取指。
例 2 真题风格 指令周期四阶段辨析

下列关于指令周期的叙述中,错误的是( )
A. 取指周期结束时,指令本身已存放于 IR,PC 已指向下一条指令
B. 间址周期结束时,取得的有效地址存放在指令的地址码字段(MDR 送 Ad(IR))
C. 中断周期内关中断、保存断点、引出服务程序均由中断隐指令(硬件)自动完成
D. 任何一条指令的指令周期都由取指、间址、执行、中断四个周期顺序组成

查看解答

D。逐项分析:

A 对:取指三步走完,指令进 IR、PC 已加 1;B 对:这是间址周期的标准收尾——EA 回填地址码字段,执行周期直接用它访存;C 对:「隐指令」即靠硬件完成的虚拟指令;

D 错:四个周期中只有取指与执行是每条指令必有的——间址周期仅间接寻址指令需要,中断周期仅在该指令执行后恰有中断请求并被响应时才插入。「都有四个周期」把可选说成必选。

练习 2 计算

某机主频 8 MHz,每个机器周期含 4 个时钟周期,一条指令平均经历 3 个机器周期。求时钟周期、平均指令周期、CPI 与 MIPS。

查看答案

时钟周期:

\[ T_{\text{clk}}=\frac{1}{8\times10^{6}}=125\ \text{ns}\quad(\checkmark) \]

CPI \(=3\times4=12\) 个时钟周期;平均指令周期:

\[ 12\times125\ \text{ns}=1500\ \text{ns}=1.5\ \mu\text{s}\quad(\checkmark) \]

\[ \text{MIPS}=\frac{f}{\text{CPI}\times10^{6}}=\frac{8\times10^{6}}{12\times10^{6}}\approx0.67\quad(\checkmark) \]

5.3 数据通路与微操作序列 大题重点

数据通路数据在 CPU 内部流动的路径,即寄存器之间、寄存器与 ALU 之间传送数据的通路,由内部总线 + 各类寄存器 + ALU + 移位器构成。数据通路的形态决定微操作序列怎么写:常见内部单总线(一条共享总线,结构简单、任一时刻只能传一个数)、多总线、专用通路三种。408 大题默认考单总线。

5.3.1 单总线结构:为什么必须设暂存器 Y、Z

内部单总线 (任一时刻只允许一个寄存器向总线发送数据) PC IR 通用寄存器 R0~R3 MAR MDR (PC)→MAR 前可双向 主存储器地址↔MAR 数据↔MDR 暂存器 Y 操作数1 先下总线 ALU组合逻辑·无记忆 操作数2 后上总线 暂存器 Z 结果先落 Z,再回总线 Y、Z 是成功使用 ALU 的代价, 也是「ADD 为何要 3 拍」的原因
图 5-2 内部单总线数据通路:各寄存器挂一条共享总线;ALU 不能直接用总线上的两个数——操作数 1 先锁入 Y,操作数 2 再上总线,结果先存 Z 再回总线
两条铁律① 总线同一时刻只能有一个发送者(否则线与冲突):每拍至多一个寄存器内容上总线,若干个寄存器可同时接收;
② ALU 是组合逻辑,输入端不能接总线两份——两个操作数不能同拍从总线进 ALU,故设 Y 暂存前一个操作数;输出若直接回总线会与输入形成不稳定回路,故结果先落 Z,下一拍再送目的寄存器。
易错① 写微操作序列时「(R1)→Y」与「(R0)+Y→Z」是两拍,合成一步就违反铁律 ①;
② 一个节拍内可以完成「数据上总线 + 若干寄存器接收」,如 C1 拍 (PC)→MAR 与 1→R(发读命令)同时进行;
③ 含访存的微操作(M(MAR)→MDR)要等存储器读/写完成,一般独占一拍。

5.3.2 典型指令的微操作序列(大题模板)

解题三步法① 判断寻址方式,确定「取指 +(间址?)+ 执行」各需哪些周期;② 按节拍顺序写微操作,每拍只让一个数据上总线,需两个操作数的运算必经 Y/Z;③ 目的寄存器最后接收。下面 4 组序列背熟,考场只需按指令功能拼装。
寄存器传数 MOV R0, R1(功能:R1 的内容送 R0)
取指周期 C1~C3:同 5.2.2 节((PC)→MAR→读存→MDR→IR,PC+1)
执行周期:
C4: (R1) → R0                    ; R1 内容上总线,R0 同拍接收,一步完成
取数 LOAD R0, ADDR(直接寻址:R0 ← M[ADDR])完整序列
取指周期:
C1: (PC) → MAR,  1 → R           ; 指令地址送 MAR,发读命令
C2: M(MAR) → MDR, (PC) + 1 → PC  ; 取出指令,PC 加"1"
C3: (MDR) → IR,  OP(IR) → ID     ; 指令进 IR,译码
执行周期(直接寻址,无需间址周期):
C4: Ad(IR) → MAR, 1 → R          ; 形式地址=有效地址,送 MAR,发读命令
C5: M(MAR) → MDR                  ; 从主存读出操作数
C6: (MDR) → R0                    ; 数据上总线,R0 接收
例 3 大题模板 一重间接寻址的取数指令

某单总线 CPU 结构如图 5-2,主存按字编址。指令 LOAD R0, @ADDR(一重间接寻址,功能 R0 ← M[M[ADDR]])。写出该指令从取指到执行结束的全部微操作序列。

查看解答

一重间接寻址需经历取指 + 间址 + 执行三个周期:

取指周期:

C1: (PC) → MAR, 1 → R  C2: M(MAR) → MDR, (PC)+1 → PC  C3: (MDR) → IR, OP(IR) → ID

间址周期(把形式地址 ADDR 变换为有效地址 EA):

C4: Ad(IR) → MAR, 1 → R  C5: M(MAR) → MDR  C6: (MDR) → Ad(IR)

执行周期(按 EA 取数送 R0):

C7: Ad(IR) → MAR, 1 → R  C8: M(MAR) → MDR  C9: (MDR) → R0

套路总结:间接寻址 = 多一次「读地址」的访存循环,间址与执行两个周期结构完全相同,只是第一次取出的是地址、第二次取出的是数据;每拍都只一个数据上总线。

加法 ADD R0, R1(功能:(R0) + (R1) → R0)执行周期
C4: (R1) → Y                     ; 第一个操作数 R1 上总线,锁入暂存器 Y
C5: (R0) + (Y) → Z               ; 第二个操作数 R0 上总线进 ALU,与 Y 相加,结果锁入 Z
C6: (Z) → R0                     ; 上一拍结果 Z 上总线,写回 R0
例 4 大题模板 为什么 ADD 不能两拍完成

在图 5-2 的单总线数据通路上,有同学把 ADD R0, R1 的执行周期写成两拍:C4: (R0)+(R1) → Z;C5: (Z) → R0。指出错误原因,并给出正确写法。

查看解答

错误在 C4:(R0) 与 (R1) 同拍上总线,违反「单总线同一时刻只能有一个发送者」的铁律;且 ALU 若两个输入端都接总线,同一条线上的同一个数不可能既是 R0 又是 R1。

正确写法必须三拍:

C4: (R1) → Y(先锁一个操作数)  C5: (R0) + (Y) → Z(另一个操作数这时才上总线)  C6: (Z) → R0(结果回写)

套路总结:单总线上一次运算 = 「送 Y → 运算进 Z → 送目的」三步。若题目是 ADD R0, R1, R2(三地址,结果送第三寄存器),只是最后一拍目的改为 R2。

练习 3 必练

在图 5-2 数据通路上写出下列指令执行周期的微操作序列:(1) STORE R0, ADDR(直接寻址:M[ADDR] ← (R0));(2) JMP ADDR(直接寻址转移);(3) JZ ADDR(零标志 ZF = 1 才转移)。

查看答案

(1) STORE 执行周期(先给地址、再给数据、后写存):

C4: Ad(IR) → MAR, 1 → W  C5: (R0) → MDR  C6: (MDR) → M(MAR)

(2) JMP 直接寻址只要一拍:

C4: Ad(IR) → PC(下一取指周期即从 ADDR 开始)

(3) 条件转移需先测标志:

C4: 若 ZF = 1,则 Ad(IR) → PC;否则 PC 不变(顺序执行下一条)

注意对比:LOAD 用读命令 1→R,STORE 用写命令 1→W;转移类指令执行周期只动 PC,不访存取数据。

5.4 控制器的设计:硬布线与微程序 高频考点

微操作信号发生器(CU)有两种实现路线:硬布线(用组合逻辑电路直接产生控制信号,快但难改)与微程序(把控制信号编成微指令存入控存,慢但规整)。408 对二者均考概念与对比,微程序侧再加编码与容量计算。

5.4.1 硬布线控制器

设计原理每一个微操作命令都是操作码译码信号、时序信号(机器周期、节拍、脉冲)与状态标志的逻辑函数: \[ \text{微操作命令} = f(\text{操作码译码输出},\ \text{时序(周期 / 节拍 / 脉冲)},\ \text{状态标志 ZF / CF / \dots}) \] 设计步骤:① 列出全部指令在各机器周期、各节拍下的微操作时间表;② 对每个微操作写出逻辑表达式并化简;③ 用与或门阵列实现。本质是把 5.3 节的微操作序列「翻译」成门电路。
对比项硬布线控制器微程序控制器
实现方式组合逻辑电路(门电路)直接产生微操作命令微指令存于控制存储器 CM,逐条读出产生微命令
速度快(无需访控存)慢(每条机器指令需多次读控存)
规整性 / 扩展性电路庞杂,难修改、难扩展规整,增改指令只需改微程序
应用RISC CPU、高速机器CISC CPU(x86 直到现在仍保留微程序层)
一句话记忆硬布线像「固定电路」——快而死板;微程序像「存在 ROM 里的程序」——灵活而慢一拍。指令系统越复杂(CISC),越倾向微程序。

5.4.2 微程序控制器:原理与组成

四级概念链
  1. 微命令(微操作控制信号):控制部件发出的最细粒度控制命令,如「MDR → 总线」「1 → R」,是执行部件动作的「开关」;
  2. 微指令:同一节拍(一个时钟周期)内可并行发出的一组微命令的编码,再加顺序控制信息;
  3. 微程序:解释一条机器指令的微指令序列;
  4. 控制存储器 CM:存放全部微程序的专用 ROM(在 CPU 内),其一个字就是一条微指令。
对应关系:机器指令 —(解释)— 微程序;一条机器指令的一个节拍 —(对应)— 一条微指令。执行一条机器指令就是执行一段微程序。
控制存储器 CM(ROM) 取指微程序(公用) LOAD 的微程序 STORE 的微程序 ADD 的微程序… 每个字 = 一条微指令 微指令 = 操作控制字段 +判别测试字段+下地址字段 微地址寄存器 CMAR(μPC,可 +1) 读指定单元 微指令寄存器 μIR存放刚读出的微指令 微指令 操作控制字段→微命令(控制信号)发往运算器/存储器 微地址形成逻辑判别测试 P:按标志/操作码决定去向 判别/下址 形成的下条微指令地址送 CMAR 启动:取指微程序入口地址(如全 0)→ CMAR 操作码译码 工作节奏:CMAR 给地址 → CM 读出微指令 → μIR → 发微命令;同时形成下地址 → CMAR
图 5-3 微程序控制器组成:控制存储器 CM + 微地址寄存器 CMAR(μPC)+ 微指令寄存器 μIR + 微地址形成逻辑;μIR 的操作控制字段发微命令,顺序控制字段(判别测试 + 下地址)决定下一条微指令地址
易错① 控存 CM 是 ROM、位于 CPU 内部——「控存是 CPU 外的高速缓存」「可用 RAM 随时改写」都错;
② 执行一条机器指令要多次读控存(每个节拍读一条微指令),所以微程序控制器的速度慢于硬布线;
③ 「微程序」与「机器语言程序」分属两级:程序员写机器指令序列,CPU 用微程序解释每条机器指令——微程序对程序员透明。

5.4.3 微指令的编码方式

四种编码
  1. 直接编码(直接控制):操作控制字段中每一位就是一个微命令,1 表示发出。n 个微命令需 n 位——速度最快(无需译码),但字长过长;
  2. 字段直接编码:把微命令分成若干字段,互斥的微命令放在同一段(留一种状态表示「都不发出」),字段内经译码器产生微命令,各字段并行工作。字长缩短,速度略降,是最常用的折中;
  3. 字段间接编码:一个字段的微命令需由另一个字段(解释字段)参与解释才能确定——字长更短,速度更慢、更不直观;
  4. 混合编码:直接编码 + 字段编码混合使用,常用的微命令用直接位,其余分组。
字段位数公式(大题核心)某字段含 \(m\) 个互斥微命令,需再留一个「不发出」状态,故该字段位数 \[ b = \lceil \log_2 (m+1) \rceil \] 控制字段总位数 = 各字段位数之和(各字段同时译码、并行输出)。
易错① 分组原则是「互斥的微命令放同一段、可并行的微命令放不同段」——不是「功能相近放一段」;
② +1 别忘了:7 个互斥微命令要 \( \lceil\log_2 8\rceil=3 \) 位而不是 \( \lceil\log_2 7\rceil=3 \) 位恰好相同,但 8 个互斥微命令必须 4 位(\( 2^3=8 \) 个状态被 8 个命令占满,没有「都不发」了);
③ 直接编码不需要译码器,字段编码每字段后接一个译码器。

5.4.4 微地址形成方式与水平型/垂直型微指令

下条微指令地址(后继微地址)的形成
  1. 增量方式:由 CMAR(μPC)自动 +1 得到后继地址(与 PC 同理),遇转移时把转移微地址装入 CMAR——微指令中可省去「下地址」字段,但需微程序计数器,且分支能力弱;
  2. 断定方式(下址字段方式):每条微指令的顺序控制字段直接给出后继微地址,无需计数器,分支灵活——代价是每条微指令都要带下地址字段,字长增加;
  3. 测试网络(地址转移逻辑):后继地址由设计者指定的判别测试字段 P 和状态反馈(标志位、操作码)共同修改形成,用于条件分支微地址的多路选择。
实际机器常三者结合:顺序执行用 +1,分支处用断定 + 测试。
对比项水平型微指令垂直型微指令
一条微指令定义多个并行微命令一个微操作(类似机器指令风格)
微指令字长长短
并行能力 / 速度强、快弱、慢(只能串行)
微程序长度短长
掌握难度难以掌握(要了解数据通路细节)与机器指令相似,易掌握

5.4.5 微指令格式设计计算(大题重点)

字长三段式微指令字长 = 操作控制字段 + 判别测试字段(有几种判别测试,需 \( \lceil\log_2(\text{种数}+1)\rceil \) 位,或按题目直接给定)+ 下地址字段(= \( \lceil\log_2 \text{控存单元数} \rceil \))。 控存容量 = 控存单元数 × 微指令字长(bit)。
例 5 必考题型 微指令字长与控存容量

某机采用字段直接编码的微程序控制器,共有微命令 26 个,划分为 4 个互斥组,各组分别含 8、7、6、5 个互斥微命令(组间可并行);判别测试字段 2 位;控制存储器共 128 个存储单元。求:(1) 操作控制字段位数;(2) 微指令字长;(3) 控存容量。

查看解答

(1) 逐组按 \( b=\lceil\log_2(m+1)\rceil \) 求位:

组 1(8 个命令):\( 8+1=9 \) 状态 → \( \lceil\log_2 9\rceil=4 \) 位

组 2(7 个命令):\( 7+1=8 \) 状态 → \( \lceil\log_2 8\rceil=3 \) 位

组 3(6 个命令):\( 6+1=7 \) 状态 → \( \lceil\log_2 7\rceil=3 \) 位

组 4(5 个命令):\( 5+1=6 \) 状态 → \( \lceil\log_2 6\rceil=3 \) 位

操作控制字段 \( =4+3+3+3=13 \) 位。

(2) 下地址字段:\( \lceil\log_2 128\rceil=7 \) 位(\( \checkmark \):\( 2^7=128 \));判别测试 2 位。微指令字长:

\[ 13+2+7=22\ \text{位} \]

(3) 控存容量:

\[ 128\times22=2816\ \text{bit}=352\ \text{B}\quad(\checkmark:\ 2816/8=352) \]

验算 4 位 ≥ log₂9 ≈ 3.17 ✓、3 位 ≥ log₂8 = 3 ✓。套路总结:先分组求控制字段,下地址永远等于「控存单元数的地址位数」,容量 = 单元数 × 字长,单位写成 bit 再换 B。

练习 4

下列关于微指令编码的说法中,正确的是( )
A. 字段直接编码中,同一字段内的微命令必须可以并行执行 B. 互斥的微命令应编排在同一字段内 C. 字段间接编码比字段直接编码速度更快 D. 直接编码方式字长最短

查看答案

B。逐项分析:

A 错:字段直接编码的分组原则是「同段互斥、异段可并行」,同一字段内的微命令互斥,不能同时发出;B 对:正是分组原则本身;

C 错:间接编码要经过解释字段的二次译码,更慢,但省位;D 错:直接编码每个微命令占一位,n 个命令就 n 位,字长最长(换来的是无需译码、速度最快)。

5.5 指令流水线 大题必考

5.5.1 五段流水线与时空图

流水线思想把指令的解释过程分成若干独立的功能段,各段执行时间相等(一个时钟周期 \(\Delta t\)),多条指令在时间上错开重叠——如同工厂流水线:不缩短单件产品工时,却成倍提高日产量。408 标准模型是 MIPS 风格五段指令流水线。
五段流水线各段功能(每段 1 个时钟周期)
IF   取指段 | 指令 ← M[PC],同时 PC 自动加"1"指向下一条指令
ID   译码段 | 指令译码,并从寄存器堆读出所需的源操作数
EX   执行段 | ALU 运算 / 计算访存有效地址 / 计算转移目标地址并判断分支条件
MEM  访存段 | LOAD:从主存读数;STORE:把数写回主存;其余指令空过
WB   写回段 | 运算结果或读出的数据写回寄存器堆
时钟周期 → 1 2 3 4 5 6 7 8 9 10 I1 IF ID EX MEM WB I2 IF ID EX MEM WB I3 IF ID EX MEM WB I4 IF ID EX MEM WB I5 IF ID EX MEM WB I6 IF ID EX MEM WB 第 1~5 拍为装入时间(流水线填充),第 6~10 拍每拍流出一条指令,第 10 拍为排空段 n = 6 条指令、k = 5 段:总时间 T = (k + n − 1)Δt = (5 + 6 − 1)Δt = 10Δt 同一列(同一拍):五个部件各忙一段——IF 取 I6 时,WB 正在写回 I2 沿对角线看:一条指令的五段依次错开一拍;沿一行看:同一指令推进的过程
图 5-4 五段指令流水线时空图(n = 6 条指令):每行一条指令沿 IF→ID→EX→MEM→WB 推进,相邻指令错开一拍,稳态下每拍完成一条指令

5.5.2 性能指标:总时间、吞吐率、加速比、效率

四大公式(k 段,n 条指令,每段 Δt,无停顿) \[ T=(k+n-1)\Delta t \qquad\text{(装入 } k-1 \text{ 拍 + 稳态 } n \text{ 拍)} \] \[ \text{吞吐率 } TP=\frac{n}{(k+n-1)\Delta t},\qquad TP_{\max}=\lim_{n\to\infty}TP=\frac{1}{\Delta t} \] \[ \text{加速比 } S=\frac{nk\Delta t}{(k+n-1)\Delta t}=\frac{nk}{k+n-1}\;(S = k × E(用于验算)。n→∞ 时 S→k、E→1。
例 6 必考题型 流水线四指标计算

五段流水线,每段时间 Δt = 10 ns,连续执行 10 条无冒险的指令。求总时间、实际吞吐率(用 MIPS 表示)、加速比与效率。

查看解答

① 总时间(k = 5,n = 10):

\[ T=(5+10-1)\times10=140\ \text{ns}\quad(\checkmark) \]

② 吞吐率:

\[ TP=\frac{10}{140\ \text{ns}}=\frac{10}{140\times10^{-9}\ \text{s}}\approx7.14\times10^{7}\ \text{条/s}=71.4\ \text{MIPS}\quad(\checkmark) \]

③ 加速比(串行需 \(10\times5=50\) 拍):

\[ S=\frac{10\times5}{5+10-1}=\frac{50}{14}\approx3.57\quad(\checkmark) \]

④ 效率:

\[ E=\frac{10}{14}\approx71.4\%\quad(\checkmark) \]

验算:S = k × E = 5 × 0.714 = 3.57 ✓。套路总结:先代 T=(k+n−1)Δt,其余三个量全由 T 派生;S=kE 是最稳的交叉验证。

5.5.3 冒险(Hazard)与对策

三类冒险
  1. 结构冒险(硬件资源冲突):不同指令同一拍争用同一部件。典型:取指(IF)与取数(MEM)同时访存。对策:指令与数据分开放(哈佛结构 / 一体机中取指 Cache 与数据 Cache 分离,即「存储器一半放指令一半放数据」);或后一条指令暂停一拍。
  2. 数据冒险(数据相关):后续指令要用前面指令尚未写回的结果。按读写顺序分 RAW(读后写,真相关,按序流水中最常见)、WAR(写后读)、WAW(写后写)、RAR(无冲突)。对策:转发 / 旁路(forwarding:把 EX 段末的结果直接从流水线寄存器送往需要它的段,不等 WB)、暂停(插气泡 stall)、编译器调整指令顺序。
  3. 控制冒险(转移冒险):转移 / 分支指令要等判断结果出来才知道下条指令地址,已预取的指令可能作废。对策:分支预测(静态按「总是不转移」/ 动态按历史方向预测)、延迟分支(延迟槽里放一条无论转移与否都要执行的指令)、尽早判分支 / 暂停等判。
load-use 冒险(必考结论)LOAD 的数据在 MEM 段末才从主存取出,而紧跟其后的指令在 EX 段初(即 LOAD 的 MEM 拍)就要用它——缺口比转发覆盖范围多一拍,所以:紧随 LOAD 使用其结果的指令,即使有转发也必须先暂停 1 拍,再由 MEM/WB 转发。而「上一条 ALU 指令的结果被下一条用」可被 EX/MEM 转发完全消除,0 拍损失。
例 7 大题高频 含停顿的流水线性能

在例 6 的五段流水线(Δt = 10 ns)上执行 10 条指令,其中发生 2 次 load-use 冒险(各暂停 1 拍)、1 次转移预测失败(损失 3 拍),其余冒险均由转发消除。重求总时间、加速比与效率。

查看解答

① 总时间 = 理想时间 + 各类停顿:

\[ T=\big[(5+10-1)+2\times1+1\times3\big]\Delta t=19\Delta t=190\ \text{ns}\quad(\checkmark) \]

② 加速比(串行仍为 \(10\times5=50\) 拍):

\[ S=\frac{50}{19}\approx2.63\quad(\checkmark) \]

③ 效率:

\[ E=\frac{50}{5\times19}=\frac{10}{19}\approx52.6\%\quad(\checkmark) \]

验算:S = k × E = 5 × 0.526 = 2.63 ✓。套路总结:含停顿的题只在 T 上加停顿拍数,分母里的「理想 50 拍」不变;停顿越密集,流水线越退向串行。

例 8 分析 转发能消除这次停顿吗

五段流水线(带完整转发通路)顺序执行下列指令:

指令序列
I1: ADD R1, R2, R3    ; R1 ← (R2) + (R3)
I2: SUB R4, R1, R5    ; R4 ← (R1) − (R5)
I3: LOAD R6, 100(R7)  ; R6 ← M[(R7)+100]
I4: OR  R8, R6, R9    ; R8 ← (R6) OR (R9)

问:哪些相邻指令对存在 RAW 数据冒险?转发能否完全消除?全程共损失几拍?

查看解答

I2 与 I1 关于 R1 RAW:I1 在 EX 段末(第 3 拍)已算出 R1,I2 在第 4 拍才进 EX——结果在 EX/MEM 流水寄存器里等着,转发可完全消除,0 拍损失。

I4 与 I3 关于 R6 RAW 且是 load-use:I3 的 R6 在第 4 拍(MEM 段)末才读出,而 I4 在第 5 拍初的 EX 段就要用——此时数据尚未进入任何流水寄存器,转发路径接不上,必须先停 1 拍(I4 的 EX 推迟到第 6 拍),再由 MEM/WB 寄存器转发。

结论:共损失 1 拍。区分两类情况就是两句话:ALU 结果「早一拍」转发行;LOAD 结果「恰好晚一拍」停一拍再转发。

5.5.4 高级流水技术辨析

技术思想并行方式关键特征
超标量每个时钟周期发射多条指令到多条流水线空间并行(多套部件)不能缩短单条指令时间;CPI 可小于 1;依赖编译优化 + 硬件调度
超流水线把流水段分得更细(段数更多、每段更短)时间并行(提高主频)Δt 更小、吞吐率更高;段多则冒险代价更大、功耗高
动态调度硬件在运行时重排指令执行顺序(乱序执行、保留站 / 记分板)时间并行不改变程序语义;让后续不相关指令先执行,填充分析停顿
VLIW(超长指令字)编译器把多个可并行操作打包成一条超长指令空间并行(静态打包)并行性由编译器静态挖掘,硬件简单;代码膨胀、依赖编译器
辨析口诀超标量「一拍多发」(宽),超流水「一段更短」(深),动态调度「硬件乱序」,VLIW「编译器打包」。四者都只提高吞吐率,都不能缩短单条指令的执行时间。
练习 5 易错

判断下列说法的正误:(1) 五段流水线把每条指令的执行时间缩短为原来的 1/5;(2) 超标量处理机一个时钟周期内可发射多条指令;(3) 超流水线通过细分流水段、缩短时钟周期来提高吞吐率;(4) VLIW 的并行调度由编译器静态完成;(5) 动态调度改变程序的语义。

查看答案

(1) 错:流水线提高的是吞吐率,单条指令仍要走完五段(5Δt,还可能更长);「缩短为 1/5」混淆了吞吐率与延迟。

(2) 对:超标量的定义即每拍发射多条,CPI 可低于 1。

(3) 对:段分细 → Δt 变短 → 主频与吞吐率上升。

(4) 对:VLIW 靠编译器把并行操作打包,与动态调度(硬件乱序)相对。

(5) 错:乱序执行只改变执行顺序,数据相关与控制相关仍被保证,程序结果(语义)不变。

5.6 章末自测 真题风格

限时 50 分钟,先做后看答案。难度:★★ 基础 / ★★★ 强化 / ★★★★ 冲刺。计算题全部要求代入具体数值逐步演算并用第二种方式验算。

自测 1(选择 · ★★)

下列部件中,不属于运算器组成的是( )
A. 算术逻辑单元 ALU B. 累加寄存器 ACC C. 程序状态字寄存器 PSW D. 指令译码器 ID

查看答案

D。译码器属控制器(对操作码译码);ALU、ACC、PSW(条件码由运算产生)均属运算器。

自测 2(选择 · ★★★ 高频考点)

对汇编语言程序员完全透明(不可见)的寄存器组是( )
A. 通用寄存器、变址寄存器 B. MAR、MDR、IR C. PSW 标志位、栈指针 SP D. 基址寄存器、条件码寄存器

查看答案

B。MAR / MDR / IR 都是硬件幕后中转站,指令无法点名访问;A、C、D 中所列寄存器都能被指令直接或间接使用(传送、寻址、条件转移),对程序员可见。

自测 3(选择 · ★★★)

取指周期结束后,下列说法正确的是( )
A. 指令存放在 PC 中 B. PC 已自动加 1,指向下一条指令 C. 操作码已完成译码并算出有效地址 D. 指令的执行结果已存放于 ACC

查看答案

B。A 错:指令在 IR,PC 只存地址;C 错:译码在其后一拍或与取指末拍重叠,「算出有效地址」属执行周期;D 错:执行还没开始。取指周期唯一确定发生的两件事:指令进 IR、PC 加 1。

自测 4(选择 · ★★★)

单总线数据通路中设置暂存器 Y、Z 的根本原因是( )
A. 增大通用寄存器容量 B. ALU 是组合逻辑且总线每拍只能传一个数据 C. 提高主存的读写速度 D. 保存中断断点

查看答案

B。两个操作数不能同拍上总线 → 先送 Y;ALU 输出不能直接回总线(组合逻辑、会与输入构成回路)→ 先落 Z。与 A、C、D 均无关。

自测 5(填空 · ★★★★ 计算 大题题型)

某机微指令采用字段直接编码,共 18 个微命令,分为 3 组,各组互斥微命令数均为 6;判别测试字段 2 位;控制存储器共 512 个单元。则操作控制字段为 \(\underline{\hspace{1cm}}\) 位,微指令字长 \(\underline{\hspace{1cm}}\) 位,控存容量 \(\underline{\hspace{1cm}}\) bit。

查看答案

每组 \(6+1=7\) 状态 → \( \lceil\log_2 7\rceil=3 \) 位,控制字段 \(3\times3=9\) 位;

下地址 \(=\lceil\log_2 512\rceil=9\) 位(\(\checkmark\):\(2^9=512\));字长:

\[ 9+2+9=20\ \text{位} \]

控存容量 \(=512\times20=10240\) bit(\(\checkmark\):\(512\times20=2^9\times20=10240\),即 1280 B)。

自测 6(选择 · ★★★)

与硬布线控制器相比,微程序控制器的特点是( )
A. 速度更快,且易于扩展指令 B. 速度较慢,但设计规整、易于扩展指令 C. 控制存储器位于 CPU 之外,可用 RAM 改写 D. 每条机器指令只读一次控存

查看答案

B。微程序靠逐条读控存产生微命令,速度慢于门电路,但「改 ROM 里的微程序」即可增改指令,规整灵活。C 错:控存是 CPU 内的 ROM;D 错:每个节拍读一条微指令,一条机器指令要多次读控存。

自测 7(填空 · ★★★ 计算)

五段流水线每段 Δt = 2 ns,连续执行 20 条无停顿指令。总时间为 \(\underline{\hspace{1cm}}\) ns,加速比约为 \(\underline{\hspace{1cm}}\),效率约为 \(\underline{\hspace{1cm}}\)。

查看答案

\[ T=(5+20-1)\times2=48\ \text{ns}\quad(\checkmark) \]

\[ S=\frac{20\times5}{24}=\frac{100}{24}\approx4.17\quad(\checkmark) \]

\[ E=\frac{20}{24}\approx83.3\%\quad(\checkmark) \]

验算:S = k × E = 5 × 0.833 ≈ 4.17 ✓。

自测 8(填空 · ★★★★ 计算 含停顿)

五段流水线 Δt = 1 ns,执行 10 条指令,其中 3 次 load-use 冒险各停 1 拍,其余相关全部由转发消除。求总时间(ns)、实际吞吐率(MIPS)与效率。

查看答案

\[ T=\big[(5+10-1)+3\big]\times1=17\ \text{ns}\quad(\checkmark) \]

\[ TP=\frac{10}{17\ \text{ns}}=\frac{10}{17\times10^{-9}}\approx5.88\times10^{8}\ \text{条/s}=588\ \text{MIPS}\quad(\checkmark) \]

\[ E=\frac{10\times5}{5\times17}=\frac{10}{17}\approx58.8\%\quad(\checkmark) \]

自测 9(选择 · ★★★★ 高频考点)

下列数据冒险中,仅靠转发(旁路)技术无法完全消除、必须配合暂停的是( )
A. 相邻两条 ALU 运算指令的 RAW 相关 B. LOAD 指令之后紧跟一条立即使用其装入数据的指令 C. 相隔两条指令的 RAW 相关 D. 两条指令读同一寄存器的 RAR 相关

查看答案

B。load-use:数据在 MEM 段末才可用,与需求时刻差一拍,转发路径覆盖不到,必须停 1 拍后再转发。A、C 的 ALU 结果可从 EX/MEM、MEM/WB 流水寄存器转发(0 拍);D 读读不冲突,无冒险。

自测 10(解答 · ★★★★)

分别举一例说明结构冒险、数据冒险、控制冒险,并各给出两种对策;再说明为什么「指令 Cache 与数据 Cache 分离」能消除结构冒险,而「转发」却消除不了 load-use 冒险。

查看解答

① 结构冒险:第 i 条指令 MEM 段访存取数与第 i+1 条指令 IF 段取指同拍争用同一个主存。对策:指令与数据分开存储(分体 Cache);争用方暂停一拍。

② 数据冒险:ADD R1,R2,R3 后紧跟 SUB R4,R1,R5(RAW)。对策:EX/MEM、MEM/WB 转发;编译器调度指令顺序(拉开距离);必要时暂停。

③ 控制冒险:BEQ 分支指令在 EX/ID 段才判出方向,已取入的错误路径指令作废。对策:静态 / 动态分支预测;延迟分支;尽早计算转移目标地址。

原理辨析:结构冒险是空间资源冲突——再加一套资源(指令 / 数据 Cache 分离)即可根除;而 load-use 是时间缺口——数据 MEM 段末才从主存到达,比需求时刻晚一拍,转发只能搬运「已存在的结果」,不能让主存提前读出,故必须停一拍等待。

5.7 本章考点总结

考点常考题型热度核心方法
CPU 功能与寄存器选择题★★★★ 高频五项功能;运算器 = ALU + 通用寄存器 + Y/Z + PSW;控制器 = PC + IR + ID + 时序 + CU;能被指令点名 = 可见,幕后中转(MAR / MDR / IR / Y / Z)= 不可见
三级时序与四周期选择 / 判断★★★★指令周期 ⊇ 机器周期 ⊇ 时钟周期(=1/主频);取指、间址、执行、中断按需出现;中断周期三件事(关中断、存断点、引出服务程序)由中断隐指令完成
微操作序列大题★★★★★ 必考单总线每拍只一个发送者;运算走「送 Y → 算入 Z → 送目的」三拍;LOAD 用 1→R,STORE 用 1→W;间接寻址多一轮读地址;转移只改 PC
硬布线 vs 微程序选择 / 简答★★★★硬布线 = 门电路,快、难改(RISC);微程序 = 控存 ROM(CPU 内)存微指令,规整、易扩展、慢;微命令→微指令→微程序→控存四级链
微指令编码与格式设计大题★★★★★ 必考互斥微命令放同段,段位 \( \lceil\log_2(m+1)\rceil \);字长 = 控制字段 + 判别测试 + 下地址(\( \lceil\log_2 \text{控存字数} \rceil \));容量 = 字数 × 字长
流水线性能计算选择 / 大题★★★★★ 必考\( T=(k+n-1)\Delta t \);TP、S、E 全由 T 派生;S = k × E 验算;含停顿时 T 加停顿拍数、串行拍数不变
冒险与对策选择 / 分析★★★★★ 高频结构冒险→资源分体;数据 RAW→转发 / 暂停 / 调度;load-use 必停一拍再转发;控制冒险→分支预测 / 延迟分支
高级流水辨析选择题★★★超标量一拍多发(CPI<1)、超流水段更细提主频、动态调度硬件乱序、VLIW 编译器打包;都提吞吐不降单条延迟
下一步本章过关标准:例题 8 道全部独立重做(尤其例 3~例 6 的大题模板);自测 10 题至少 8 题正确;能默写取指 / 间址 / 中断周期的微操作与 ADD 三拍序列;能一口气算出「k=5、n=10、含 3 拍停顿」的 T / TP / S / E。然后进入 第 6 章 总线——总线仲裁、定时方式与常见总线标准,篇幅不长但概念题密集。