数据通路的操作举例
这一节没有新概念,全是把前三节的东西用在具体图上。它是第 5 章唯一一个稳定出大题的位置,题型高度固定:给一张数据通路图,问四类问题——哪些寄存器可见、某控制信号几位、某端点接哪、写出微操作序列。
本节按”方法 → 通用例子 → 真题”三段展开。方法就是 5.3.3 立的读图五步和排拍三规则,这里逐条演示。
机制
读图五步的演示
拿到一张图,按顺序做五件事:
第一步:给每根线定性。 实线走数据、虚线走控制。控制线的起点只能是控制部件的输出端——这条判据反过来用,就能回答”哪些端点须连到控制部件”。
第二步:数总线。 一条 → 单总线,一拍只能传一个值;两三条 → 多总线。这一步决定拍数的下限。
第三步:找每个寄存器的出入口。
出口有 Xout(三态门)才能上总线,入口有 Xin(写使能)才能收。图上没画三态门的寄存器,它的值就上不了总线——这是”必须穿 ALU”那类结构的识别方法。
第四步:把目标操作写成数据流。 就是 5.2.2 的四组数据流,按题目的具体指令改写。
第五步:排拍。 按三条规则分组:
| 规则 | 判断 |
|---|---|
| 总线冲突 | 同拍同总线只能一个 Xout |
| 部件冲突 | 同拍 ALU / 移位器 / 主存端口各用一次 |
| 数据依赖 | 用到前一步结果的,必须排下一拍 |
再主动去找一处白赚的并行:Xin 可以同拍多个有效。
通用例子一:取指周期(单总线)
数据流:PC → MAR,M(MAR) → MDR,MDR → IR,PC + "1" → PC。
| 拍 | 微操作 | 控制信号 |
|---|---|---|
| T0 | (PC) → MAR,同时 (PC) → Y | PCout, MARin, Yin |
| T1 | M(MAR) → MDR;(Y) + 1 → Z | Read, MDRin; ALUop=inc, Zin |
| T2 | (MDR) → IR;(Z) → PC | MDRout, IRin; Zout, PCin |
T2 有问题:MDRout 和 Zout 同拍冲突。 这正是排拍题最常见的失分点——发现冲突后要拆开:
| 拍 | 微操作 | 控制信号 |
|---|---|---|
| T0 | (PC) → MAR,(PC) → Y | PCout, MARin, Yin |
| T1 | M(MAR) → MDR | Read, MDRin |
| T2 | (Y) + 1 → Z | ALUop=inc, Zin |
| T3 | (MDR) → IR | MDRout, IRin |
| T4 | (Z) → PC | Zout, PCin |
注意 T0 那一拍的白赚并行:MARin 和 Yin 同时有效,两个寄存器接收同一个总线值——这是合法的,也是省下一拍的关键。
很多教材把 PC 自增画成一条不经 ALU 的专用加法通路,那样 T2 可以并入 T1,取指只要 3 拍。读图时以题目给的图为准:图上 PC 旁边有独立的 +1 部件就走专用路,没有就必须借 ALU。
通用例子二:ADD R1, (R2)(寄存器间接寻址)
语义:把 R2 指向的主存单元的内容加到 R1。取指之后:
| 拍 | 微操作 | 说明 |
|---|---|---|
| T0 | (R2) → MAR | R2 里是地址 |
| T1 | M(MAR) → MDR | 取回操作数 |
| T2 | (R1) → Y | 第一个操作数进暂存器 |
| T3 | (MDR) + (Y) → Z | MDR 上总线做另一个操作数 |
| T4 | (Z) → R1 | 回写 |
五拍。数一下访存:取指 1 次 + 取数 1 次 = 2 次,与 4.2.2 那张访存次数表对得上(寄存器间接寻址执行阶段访存 1 次)。
通用例子三:条件转移 BEQ offset
| 拍 | 微操作 | 说明 |
|---|---|---|
| T0 | 查 ZF | 这一步不占数据通路,标志位直接进控制器 |
| T1 | (PC) → Y | PC 已是下一条的地址 |
| T2 | Ad(IR) + (Y) → Z | 偏移量来自 IR,走数据线 |
| T3 | (Z) → PC | 写回 PC |
若 ZF 不满足,T1~T3 全部不执行——控制器直接跳回取指。
T2 是本节最值得盯住的一拍:偏移量从 IR 出发,沿数据线送到 ALU 的一个输入端。它不经过控制部件。 控制部件在这里做的事只有一件:决定 ALU 的另一个输入选谁(PC 增量的常数?还是 IR 的偏移量?)——那是 MUX 的选择信号,是一根控制线。
这个区分正是下面那道真题的核心。
真题拆解:2015 年单总线 CPU
题目条件(摘):16 位机,主存按字节编址、存取单位 16 位,16 位定长指令字;单总线结构;R0~R3 为通用寄存器,T 为暂存器;SR 为移位寄存器,可做直送(mov)、左移一位(left)、右移一位(right)三种操作,控制信号 SRop,输出由 SRout 控制;ALU 可做 mova、add、sub、and、or、not、inc 七种操作,控制信号 ALUop。
(1) 哪些寄存器程序员可见?为何要设置暂存器 T?
- 可见:R0~R3 和 PC。
- 不可见:IR、MAR、MDR、T、SR。
- T 的理由(两句都要答):单总线一拍只能传送一个值,而 ALU 需要两个操作数同时到位,所以先把一个操作数经总线存入 T,下一拍另一个操作数上总线时二者一起送进 ALU;同时 T 也隔开了 ALU 的输入与输出,避免形成组合逻辑环路。
判据来自 5.1.3:可见 = ISA 状态 = 有指令能命名它。T 没有编号,任何指令都写不出它。
(2) ALUop 和 SRop 至少各几位?
注意”直送”也算一种功能,不能漏数。 而”直送”出现在这两个部件的功能表里,本身就是这台机器寄存器间传送必须穿过 ALU 和 SR 的证据(5.3.3)。
(3) SRout 控制的是什么部件?
三态门(三态输出电路)。 作用是控制移位器 SR 的输出是否驱动内总线——SRout 有效时 SR 的值上总线,无效时 SR 与总线断开(高阻态)。
这是 5.3.2 那条规则的具体化:凡是 Xout 形式的信号,控制的都是三态门。
(4)(5) 哪些端点接控制部件、怎样连线
这两问靠的是同一条判据,逐个端点问一句:它吃进去的是”值”还是”开合命令”?
- 吃命令(写使能、三态门使能、MUX 选择端、
ALUop/SRop)→ 接控制部件的输出端 - 吃值(地址、操作数、偏移量)→ 接某个寄存器或部件的输出端,走数据线
疑问点:为什么端点 ⑨ 要连到 ⑥?⑨ 应该是跳转指令的偏移地址,它在指令里,也就是在 IR 里,然后交给控制部件,由控制部件给出——不是吗?
两个识别都对:⑨ 确实是 IR 中偏移量字段的输出,⑥ 确实在 MUX 那一侧。要纠正的是中间那步推理——偏移量不经过控制部件。
判据只有一句:控制部件不生产数据(5.3.1)。
偏移量是一个值——它是 16 位指令里的一段二进制数,要参与加法算出转移目标地址。值只能沿数据线走。 控制部件的输出全是 1 位或几位的开合命令,它没有任何一条输出端能承载一个 16 位的地址。
把 IR 里的两个字段分开看,混淆就消失了:
IR 的字段 送到哪 线的类型 为什么 操作码 控制部件(指令译码器) 数据 → 控制的入口 控制部件需要知道”这是哪条指令” 偏移量 / 地址码 MUX 的一个数据输入端(⑨ → ⑥) 数据线 它要参与加法,是被加数 控制部件在这件事里确实起了作用,但作用是”选”而不是”给”:
- 顺序执行时,控制部件让 MUX 选常数 2
- 转移成立时,控制部件让 MUX 选⑨ 送来的偏移量
控制部件输出的是那根 1 位的 MUX 选择线,偏移量本身始终走 ⑨→⑥ 这条数据线。 两条线都存在、缺一不可,但它们是不同类型的线。
一个反证:如果偏移量真由控制部件给出,那控制部件就得把 IR 的 16 位地址字段整个读进来再原样输出——它就成了一个数据通路部件,“控制器 / 数据通路”这条分工线也就不存在了。而这条分工线正是本章第一条主线。
同一个混淆在 5.4.1 还会以另一种面目出现:微指令里的”下地址字段”是控制部件产生的,而机器指令里的”地址码”不是——前者是控制存储器内部的地址,后者是主存地址,两者层次不同。
(6) 为什么 MUX 的一个输入端是常数 2?
因为主存按字节编址、指令字长 16 位(即 2 个字节),所以顺序执行时 PC 每次要加 2。
这就是 5.1.3 说的”PC 的加 1 到底加多少”:
MUX 的两个输入端 = PC 的两种更新方式:顺序执行选常数 2,相对转移选 ⑨ 送来的偏移量。这个 MUX 就是”顺序寻址 / 跳跃寻址”在硬件上的那个岔路口(4.2.1)。
微操作序列的书写格式
大题要求”写出微操作序列”时,按拍分行,每行给微操作和控制信号两列:
T0: (PC) → MAR, (PC) → T PCout, MARin, Tin
T1: M(MAR) → MDR Read, MDRin
T2: (T) + 2 → SR MUX=2, ALUop=add, SRop=mov
T3: (MDR) → IR MDRout, IRin
T4: (SR) → PC SRout, PCin
三条评分要点:
- 每一拍都要检查总线冲突——同拍两个
out必扣分 - 访存要写
Read/Write,且要留够主存响应的拍数(题目给了就按题目算) - 不要漏 PC 自增——它属于取指周期,不是执行周期
边界
边界辨析:偏移量走数据线 / MUX 选择端走控制线
同一次相对转移里,两条线都参与:
- 偏移量(IR 地址字段 → MUX 数据输入端):数据线,宽度 = 地址位数
- MUX 选择信号(控制部件 → MUX 选择端):控制线,宽度 1 位
控制部件不产生数据,它只决定选哪一路。
边界辨析:
Xout是三态门 /Xin是写使能
Xout:控制三态门,决定该寄存器要不要驱动总线。同拍只能一个有效。Xin:控制寄存器的写使能,决定要不要在时钟沿接收总线上的值。同拍可以多个有效。排拍时先按
Xout分组,再看能否把多个Xin塞进同一拍。
关联对照:ALU 的"直送" / 移位器的"直送"
两处”直送”的存在理由相同:当唯一的数据回路穿过该部件时,需要一个”原样通过”的功能。
反过来当判据用:功能表里出现”直送”,说明这个部件在数据回路上是必经之地。
对照速查
| 问法 | 答法 |
|---|---|
| 哪些寄存器程序员可见 | 通用寄存器 + PC(+ PSW,若图上有);T、IR、MAR、MDR、SR 不可见 |
| 为何设暂存器 T | 单总线一拍只传一个值 + 隔断 ALU 输入输出环路 |
ALUop 几位 | |
SRout 控制什么 | 三态门,控制移位器输出是否上总线 |
| MUX 的常数输入为何是 2 | 按字节编址 + 16 位指令 → PC 每次加 2 |
| ⑨ 该连到哪 | MUX 的数据输入端,走数据线,不经控制部件 |
| 哪些端点接控制部件 | 吃”开合命令”的:各 in/out 使能、MUX 选择端、ALUop、SRop |
| 操作 | 单总线拍数 |
|---|---|
| 取指(PC 自增借 ALU) | 5 |
| 取指(PC 有专用加法器) | 3 |
ADD R1, R2 | 3 |
ADD R1, (R2) | 5 |
| 相对转移(条件成立) | 3~4 |
考点
- 2009 年单总线大题:本节全文即其解法。六问对应六个知识点,每一问都能独立成题。
- “为何设置暂存器 T”:两句话都要写全。
- 控制信号位数:数功能个数取对数,别漏”直送”。
- 写微操作序列:按拍分行,逐拍查总线冲突。
- 判断端点是否接控制部件:用”吃值还是吃命令”这一条判据。
- MUX 常数输入的含义:指令字长 ÷ 编址单位。
链接
- 🏠 返回总览:计算机组成原理第 5 章:中央处理器总览
- ⬅️ 上一节:5.3.3 数据通路的基本结构
- ➡️ 下一节:5.4.1 控制器的结构和功能
- 🔗 数据流模板:5.2.2 指令周期的数据流
- 🔗 顺序 / 跳跃寻址:4.2.1 指令寻址和数据寻址
- 📖 名词库:第 5 章名词库