数据通路的操作举例

这一节没有新概念,全是把前三节的东西用在具体图上。它是第 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) → YPCout, MARin, Yin
T1M(MAR) → MDR;(Y) + 1 → ZRead, MDRin; ALUop=inc, Zin
T2(MDR) → IR;(Z) → PCMDRout, IRin; Zout, PCin

T2 有问题:MDRout 和 Zout 同拍冲突。 这正是排拍题最常见的失分点——发现冲突后要拆开:

拍微操作控制信号
T0(PC) → MAR,(PC) → YPCout, MARin, Yin
T1M(MAR) → MDRRead, MDRin
T2(Y) + 1 → ZALUop=inc, Zin
T3(MDR) → IRMDRout, IRin
T4(Z) → PCZout, PCin

注意 T0 那一拍的白赚并行:MARin 和 Yin 同时有效,两个寄存器接收同一个总线值——这是合法的,也是省下一拍的关键。

很多教材把 PC 自增画成一条不经 ALU 的专用加法通路,那样 T2 可以并入 T1,取指只要 3 拍。读图时以题目给的图为准:图上 PC 旁边有独立的 +1 部件就走专用路,没有就必须借 ALU。

通用例子二:ADD R1, (R2)(寄存器间接寻址)

语义:把 R2 指向的主存单元的内容加到 R1。取指之后:

拍微操作说明
T0(R2) → MARR2 里是地址
T1M(MAR) → MDR取回操作数
T2(R1) → Y第一个操作数进暂存器
T3(MDR) + (Y) → ZMDR 上总线做另一个操作数
T4(Z) → R1回写

五拍。数一下访存:取指 1 次 + 取数 1 次 = 2 次,与 4.2.2 那张访存次数表对得上(寄存器间接寻址执行阶段访存 1 次)。

通用例子三:条件转移 BEQ offset

拍微操作说明
T0查 ZF这一步不占数据通路,标志位直接进控制器
T1(PC) → YPC 已是下一条的地址
T2Ad(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

三条评分要点:

  1. 每一拍都要检查总线冲突——同拍两个 out 必扣分
  2. 访存要写 Read / Write,且要留够主存响应的拍数(题目给了就按题目算)
  3. 不要漏 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, R23
ADD R1, (R2)5
相对转移(条件成立)3~4

考点

  • 2009 年单总线大题:本节全文即其解法。六问对应六个知识点,每一问都能独立成题。
  • “为何设置暂存器 T”:两句话都要写全。
  • 控制信号位数:数功能个数取对数,别漏”直送”。
  • 写微操作序列:按拍分行,逐拍查总线冲突。
  • 判断端点是否接控制部件:用”吃值还是吃命令”这一条判据。
  • MUX 常数输入的含义:指令字长 ÷ 编址单位。

链接