Appearance
单总线数据通路
2026 大纲 五(三)数据通路的功能和基本结构、五(四)控制器的功能和工作原理。
整篇只有一条约束,其余全是它的推论
单总线数据通路的规则只有一句:
🔴 每个节拍,内部总线上只能传送一个数据。 两个数据要传,就必须拆成两拍。
这条约束是本篇所有节拍拆分规则的唯一来源,也是 CO 大题里"写出每个节拍的功能与有效控制信号"那一问的判分依据。用内部总线的好处是大大节省芯片内寄存器之间的连线、让布局更合理,代价就是这一条。
从这一条立刻能推出两个暂存器为什么必须存在——而且两者的动机不同,答题时要分开写:
🔴 根源是 ALU 是组合逻辑电路、自身不存数。Y 解决的是"输入凑不齐":ALU 的两个输入端要求两个操作数同时有效,而总线一拍只能送一个,所以先把第一个存进 Y(Y 送 ALU 不经过总线),第二个直接从总线送。Z 解决的是"输出回灌":ALU 的输出若直接接到总线上,会经总线反馈回它自己的输入端影响运算,所以要先落进 Z。
含混地答一句"用来暂存数据",等于两个理由都没答到。
顺着同一条约束还能回答一个常见追问:为什么三总线结构下 Y、Z 都可以省掉——源操作数、目的操作数、结果各走一条总线,根本不存在"一拍只能传一个"的瓶颈,节拍数也随之减少。
由此还定死了一个节拍模板:双操作数运算固定三拍——先进 Y、再运算进 Z、最后 Z 写回。这是单总线结构的直接后果,不是某道题的特例。
⚠️ 最后提一句:Y、Z 对程序员不可见,纯属单总线结构的实现细节,换成三总线结构它们就不存在了。
交互可视化
一、单总线结构
CPU 内部所有部件挂在一条内部总线上,每个寄存器与总线之间都有一个门控信号(图中的小圈):

(唐朔飞《计算机组成原理》第 3 版,见文末教材出处)
图上的下标 i / o 就是输入 / 输出控制:
二、控制信号的写法
不同教材和不同的通路图,门控信号的符号并不统一:下标式写作 PCout / MARin;暂存器的命名也有 Y/Z、A/AC、T/SR 好几套。符号不必记,要记的是三条不变量:
🔴 源寄存器给
out、目的寄存器给in;访存另给读写命令(MemR/MemW);ALU 操作单独给一个信号(如Add)。读一张陌生的通路图时,先把这三类信号分别叫什么找出来,剩下的就是套模板。
还有一条 ALU 输入端的约定,是大题里最隐蔽的失分点:
🔴 ALU 的两个输入端并不对称——一个固定接 Y,另一个接内部总线。教材把运算写成
,写在前面的是走总线的那个。加、与、或可交换,看不出这条约定;减法和比较不行——被减数走总线、减数进 Y,摆反了算出来的是相反数。遇到陌生通路图时,图上标的约定优先于任何记忆。
MDR 是双端口,有四个门控信号
| 数据方向 | 典型信号名 | 用在哪一拍 |
|---|---|---|
| DB → MDR | MDRinE | 主存读,与 MemR 同拍 |
| MDR → 内部总线 | MDRout | 把读回的数据送 IR / 送 Y / 送寄存器 |
| 内部总线 → MDR | MDRin | 写主存前把待写数据装进 MDR |
| MDR → DB | MDRoutE | 主存写,与 MemW 同拍 |
带 E 的是外部(External,即 DB 一侧),不带 E 的是内部总线一侧。
🔴 MDR 是跨在两条总线之间的桥,一头连内部总线、一头连数据总线 DB,所以才有这四个门控信号。把访存那两拍写成不带 E 的信号,数据根本没到主存那一侧——这是大题里最典型的一处扣分。
三、取指周期:所有指令共用
| 节拍 | 微操作 | 有效控制信号 |
|---|---|---|
| T1 | PCout, MARin | |
| T2 | MemR, MDRinE, PC+1 | |
| T3 | MDRout, IRin | |
| T4 | 指令译码 | 无 |
译码不占总线也不传数据,因此这一拍没有有效的门控信号。
四、三类指令的执行周期
① 寄存器–寄存器型:ADD R0, R1,功能
| 节拍 | 微操作 | 控制信号 |
|---|---|---|
| T4 | R0out, Yin | |
| T5 | R1out, ALU(add), Zin | |
| T6 | Zout, R0in |
② 取数型:LOAD R0, (R1),功能
| 节拍 | 微操作 | 控制信号 |
|---|---|---|
| T4 | R1out, MARin | |
| T5 | MemR, MDRinE | |
| T6 | MDRout, R0in |
③ 存数型:STORE (R1), R0,功能
| 节拍 | 微操作 | 控制信号 |
|---|---|---|
| T4 | R1out, MARin | |
| T5 | R0out, MDRin | |
| T6 | MDRoutE, MemW |
对照 ② 和 ③ 的第二拍
同样是"MDRinE;存数是内部总线把数据打进 MDR,用 MDRin。数据从哪一侧进来,就用哪一侧的门控信号。
五、一条指令要几个节拍
没有固定答案,取决于指令要做多少次总线传送。按指令的实际数据流把下面几段拼起来即可:
| 动作 | 占用节拍 |
|---|---|
| 取指 | 3 拍(送地址、访存、送 IR) |
| 每访存一次 | 2 拍(送 MAR、访存) |
| 双操作数运算 | 3 拍(进 Y、运算进 Z、Z 写回) |
| 结果回主存 | 2 拍(进 MDR、写主存) |
拼的时候有两条判据:
🔴 两个微操作能不能挤在同一拍,判据是"不抢总线、不抢部件"。 典型例子是 PC 自增——
由 PC 旁边专门的加 1 逻辑完成,全程不碰内部总线,所以可以和访存挤在同一拍。
🔴 节拍数不等于时钟周期数。 "
"写成一个节拍,但一次主存访问远不止一个时钟周期。设主存读需 5 个时钟周期,则取指的时钟周期数 ,而节拍数只有 3。题目问哪个就算哪个。
顺带说清间址周期的作用:它把形式地址换成有效地址——读一次主存,把读回来的有效地址填回 IR 的地址码字段,执行周期再拿它去访存取真正的操作数。所以间接寻址比直接寻址多一次访存。
不可交换运算的逐拍走查:SUB (R0), R1 为什么必须"被减数走总线、减数进 Y"(想确认摆反了差在哪时展开)
以 SUB (R0), R1(功能
| 节拍 | 微操作 | 控制信号 | 说明 |
|---|---|---|---|
| T4 | R0out, MARin | 目的地址送 MAR | |
| T5 | MemR, MDRinE | 取出被减数 | |
| T6 | R1out, Yin | 减数进 Y | |
| T7 | MDRout, ALU(sub), Zin | 被减数走总线 | |
| T8 | Zout, MDRin | 结果送 MDR,内总线侧 | |
| T9 | MDRoutE, MemW | 写回主存,DB 侧 |
若按加法的习惯把
三条完整指令的逐拍微操作序列:访存加法回寄存器、结果写回主存、带间址周期的加法(想把速查里的几条规则串成一条完整时序时展开)
(一)ADD R0, (R1),功能
| 节拍 | 微操作 | 控制信号 | 说明 |
|---|---|---|---|
| T1 | PCout, MARin | 取指 | |
| T2 | MemR, MDRinE, PC+1 | 取指 | |
| T3 | MDRout, IRin | 取指、译码 | |
| T4 | R1out, MARin | 送操作数地址 | |
| T5 | MemR, MDRinE | 取操作数 | |
| T6 | MDRout, Yin | 一个操作数进暂存器 | |
| T7 | R0out, ALU(add), Zin | 另一个操作数走总线,运算 | |
| T8 | Zout, R0in | 结果写回 |
共 8 拍,其中访问主存的是 T2、T5 两拍(取指一次
(二)结果写回主存:功能
| 节拍 | 微操作 | 控制信号 | 说明 |
|---|---|---|---|
| T4 | R1out, MARin | 先把地址送 MAR 才能访存 | |
| T5 | MemR, MDRinE | 从 DB 读出操作数 | |
| T6 | MDRout, Yin | 被加数送入暂存器 | |
| T7 | R0out, ALU(add), Zin | 另一操作数走内总线,运算 | |
| T8 | Zout, MDRin | 结果送 MDR,内总线侧 | |
| T9 | MDRoutE, MemW | 写回主存,DB 侧 |
两个关键点:T8 用 MDRin(内总线 → MDR)、T9 用 MDRoutE(MDR → DB),方向不能写反;MAR 从 T4 装入后全程不用重装,因为读和写的是同一个存储单元。
(三)教材给出的带间址周期的加法 ADD @X,是完整的三周期样本:
| 周期 | 微操作序列 |
|---|---|
| 取指 | |
| 间址 | |
| 执行 |
考点速记
- 单总线的核心约束是每个节拍总线上只能传一个数据:由此逼出 Y(解决 ALU 输入凑不齐)与 Z(解决输出回灌输入),也由此得到"双操作数运算固定三拍";三总线结构下 Y、Z 都可省掉。
- MDR 是双端口,四个门控信号中带 E 的通向数据总线、不带 E 的通向内部总线;同拍判据是不抢总线、不抢部件,而节拍数不等于时钟周期数,后者要算入主存访问延迟。
- ALU 两个输入端不对称,运算写成
,不可交换的运算按被减数走总线、减数进 Y 摆;间址周期把形式地址换成有效地址,间接寻址比直接寻址多一次访存。
这一节在真题里被考过的形式(co 的数据通路大题清一色是单总线结构,下方「真题练习」里的大题基本都归本篇):
- 按给定表格的格式,写出执行阶段每个节拍的功能与有效控制信号:这是最标准的一问。做法是按"取指 3 拍
每访存 2 拍 双操作数运算 3 拍 结果回主存 2 拍"拼,逐拍写清源 out/ 目的in/ 访存命令 / ALU 操作四类信号。⚠️ 访存那两拍必须用带 E 的 MDR 信号。 - 问图中哪些寄存器是程序员可见的、为什么要设置暂存器 T(或 Y、Z):可见性用"指令能否读写它"判;暂存器要分两条答——一条解决 ALU 输入凑不齐,一条解决输出回灌。
- 问某控制信号的位数至少是多少:
。ALUop 看 ALU 支持几种运算,SRop 看移位器支持几种移位。 - 问哪些端点须连接到控制部件的输出端:凡是门控信号、读写命令、ALU / 移位操作选择都来自控制部件;数据线不是。
- 问控制信号由什么部件产生、哪些寄存器的输出会连到它的输入端:由控制器(CU)产生;连到它输入端的是 IR(操作码)与标志寄存器 FR(条件码)——前者决定做什么,后者决定条件转移走哪支。
- 问取指令阶段至少需要几个时钟周期:把节拍展开成时钟周期,访存那一拍要按题给的主存访问周期数算(如"从发出读命令到数据送到 MDR 需 5 个时钟周期",则取指
)。 - 问某条指令的执行阶段至少需要多少个时钟周期:同上,先按数据流拼节拍,再把访存拍替换成实际周期数。
易错:访存那两拍写成不带 E 的
MDRin/MDRout。数据根本没到主存一侧。
易错:减法把被减数送 Y。
,被减数必须走总线。
易错:把节拍数当成时钟周期数交卷。题面给了主存访问周期数就是要你换算。
易错:答"设置 Y、Z 是为了暂存数据"。两个暂存器的动机不同,要分开写。
教材出处
- 采用 CPU 内部总线方式的数据通路、门控信号命名、Y 与 Z 的引入理由(图 9.4):唐朔飞《计算机组成原理》第 3 版 §9.2 控制单元的功能,印刷页 p381
ADD @X间址加法指令三个周期的完整微操作序列:同上,印刷页 p382