Skip to content

单总线数据通路

2026 大纲 五(三)数据通路的功能和基本结构五(四)控制器的功能和工作原理

整篇只有一条约束,其余全是它的推论

单总线数据通路的规则只有一句:

🔴 每个节拍,内部总线上只能传送一个数据。 两个数据要传,就必须拆成两拍。

这条约束是本篇所有节拍拆分规则的唯一来源,也是 CO 大题里"写出每个节拍的功能与有效控制信号"那一问的判分依据。用内部总线的好处是大大节省芯片内寄存器之间的连线、让布局更合理,代价就是这一条。

从这一条立刻能推出两个暂存器为什么必须存在——而且两者的动机不同,答题时要分开写

🔴 根源是 ALU 是组合逻辑电路、自身不存数Y 解决的是"输入凑不齐":ALU 的两个输入端要求两个操作数同时有效,而总线一拍只能送一个,所以先把第一个存进 Y(Y 送 ALU 不经过总线),第二个直接从总线送。Z 解决的是"输出回灌":ALU 的输出若直接接到总线上,会经总线反馈回它自己的输入端影响运算,所以要先落进 Z。

含混地答一句"用来暂存数据",等于两个理由都没答到。

顺着同一条约束还能回答一个常见追问:为什么三总线结构下 Y、Z 都可以省掉——源操作数、目的操作数、结果各走一条总线,根本不存在"一拍只能传一个"的瓶颈,节拍数也随之减少。

由此还定死了一个节拍模板:双操作数运算固定三拍——先进 Y、再运算进 Z、最后 Z 写回。这是单总线结构的直接后果,不是某道题的特例。

⚠️ 最后提一句:Y、Z 对程序员不可见,纯属单总线结构的实现细节,换成三总线结构它们就不存在了。

交互可视化

加载可视化中...

一、单总线结构

CPU 内部所有部件挂在一条内部总线上,每个寄存器与总线之间都有一个门控信号(图中的小圈):

采用 CPU 内部总线方式的数据通路和控制信号
图 9.4 采用 CPU 内部总线方式的数据通路和控制信号
(唐朔飞《计算机组成原理》第 3 版,见文末教材出处)

图上的下标 i / o 就是输入 / 输出控制:IRi 表示"内部总线 → IR"的输入控制门,PCo 表示"PC → 内部总线"的输出控制门。

二、控制信号的写法

不同教材和不同的通路图,门控信号的符号并不统一:下标式写作 PCoMARi,后缀式写作 PCout / MARin;暂存器的命名也有 Y/Z、A/AC、T/SR 好几套。符号不必记,要记的是三条不变量

🔴 寄存器给 out目的寄存器给 in访存另给读写命令(MemR / MemW);ALU 操作单独给一个信号(如 Add)。读一张陌生的通路图时,先把这三类信号分别叫什么找出来,剩下的就是套模板。

还有一条 ALU 输入端的约定,是大题里最隐蔽的失分点:

🔴 ALU 的两个输入端并不对称——一个固定接 Y,另一个接内部总线。教材把运算写成 (总线上的操作数) op (Y)Z写在前面的是走总线的那个。加、与、或可交换,看不出这条约定;减法和比较不行——被减数走总线、减数进 Y,摆反了算出来的是相反数。遇到陌生通路图时,图上标的约定优先于任何记忆

MDR 是双端口,有四个门控信号

数据方向典型信号名用在哪一拍
DB → MDRMDRinE主存读,与 MemR 同拍
MDR → 内部总线MDRout把读回的数据送 IR / 送 Y / 送寄存器
内部总线 → MDRMDRin写主存前把待写数据装进 MDR
MDR → DBMDRoutE主存写,与 MemW 同拍

E 的是外部(External,即 DB 一侧),不带 E 的是内部总线一侧。

🔴 MDR 是跨在两条总线之间的桥,一头连内部总线、一头连数据总线 DB,所以才有这四个门控信号。把访存那两拍写成不带 E 的信号,数据根本没到主存那一侧——这是大题里最典型的一处扣分。

三、取指周期:所有指令共用

节拍微操作有效控制信号
T1MAR(PC)PCout, MARin
T2MDRM(MAR)PC(PC)+1MemR, MDRinE, PC+1
T3IR(MDR)MDRout, IRin
T4指令译码

译码不占总线也不传数据,因此这一拍没有有效的门控信号。

四、三类指令的执行周期

① 寄存器–寄存器型:ADD R0, R1,功能 (R0)+(R1)R0

节拍微操作控制信号
T4(R0)YR0out, Yin
T5(R1)+(Y)ZR1out, ALU(add), Zin
T6(Z)R0Zout, R0in

② 取数型:LOAD R0, (R1),功能 M[(R1)]R0

节拍微操作控制信号
T4(R1)MARR1out, MARin
T5M(MAR)MDRMemR, MDRinE
T6(MDR)R0MDRout, R0in

③ 存数型:STORE (R1), R0,功能 (R0)M[(R1)]

节拍微操作控制信号
T4(R1)MARR1out, MARin
T5(R0)MDRR0out, MDRin
T6(MDR)M(MAR)MDRoutE, MemW

对照 ② 和 ③ 的第二拍

同样是"MDR",信号完全不同:取数是 DB 把数据打进 MDR,用 MDRinE;存数是内部总线把数据打进 MDR,用 MDRin数据从哪一侧进来,就用哪一侧的门控信号。

五、一条指令要几个节拍

没有固定答案,取决于指令要做多少次总线传送。按指令的实际数据流把下面几段拼起来即可:

动作占用节拍
取指3 拍(送地址、访存、送 IR)
每访存一次2 拍(送 MAR、访存)
双操作数运算3 拍(进 Y、运算进 Z、Z 写回)
结果回主存2 拍(进 MDR、写主存)

拼的时候有两条判据:

🔴 两个微操作能不能挤在同一拍,判据是"不抢总线、不抢部件"。 典型例子是 PC 自增——(PC)+1PC 由 PC 旁边专门的加 1 逻辑完成,全程不碰内部总线,所以可以和访存挤在同一拍。

🔴 节拍数不等于时钟周期数。 "M(MAR)MDR"写成一个节拍,但一次主存访问远不止一个时钟周期。设主存读需 5 个时钟周期,则取指的时钟周期数 =1+5+1=7,而节拍数只有 3。题目问哪个就算哪个。

顺带说清间址周期的作用:它把形式地址换成有效地址——读一次主存,把读回来的有效地址填回 IR 的地址码字段,执行周期再拿它去访存取真正的操作数。所以间接寻址比直接寻址多一次访存

不可交换运算的逐拍走查:SUB (R0), R1 为什么必须"被减数走总线、减数进 Y"(想确认摆反了差在哪时展开)

SUB (R0), R1(功能 M[(R0)](R1)M[(R0)])的执行周期为例:

节拍微操作控制信号说明
T4(R0)MARR0out, MARin目的地址送 MAR
T5M(MAR)MDRMemR, MDRinE取出被减数
T6(R1)YR1out, Yin减数进 Y
T7(MDR)(Y)ZMDRout, ALU(sub), Zin被减数走总线
T8(Z)MDRZout, MDRin结果送 MDR,内总线侧
T9M(MAR)(MDR)MDRoutE, MemW写回主存,DB 侧

若按加法的习惯把 (MDR) 送 Y、(R1) 走总线,得到的是 (R1)M[(R0)]符号正好反掉

三条完整指令的逐拍微操作序列:访存加法回寄存器、结果写回主存、带间址周期的加法(想把速查里的几条规则串成一条完整时序时展开)

(一)ADD R0, (R1),功能 (R0)+M[(R1)]R0,从取指到执行完毕:

节拍微操作控制信号说明
T1(PC)MARPCout, MARin取指
T2M(MAR)MDR(PC)+1PCMemR, MDRinE, PC+1取指
T3(MDR)IRMDRout, IRin取指、译码
T4(R1)MARR1out, MARin送操作数地址
T5M(MAR)MDRMemR, MDRinE取操作数
T6(MDR)YMDRout, Yin一个操作数进暂存器
T7(R0)+(Y)ZR0out, ALU(add), Zin另一个操作数走总线,运算
T8(Z)R0Zout, R0in结果写回

共 8 拍,其中访问主存的是 T2、T5 两拍(取指一次 + 取操作数一次)。

(二)结果写回主存:功能 (R0)+M[(R1)]M[(R1)] 的执行周期(取指周期已完成)。与(一)的区别只在结果的去向,因此 MDR 的四个信号全都会用上:

节拍微操作控制信号说明
T4(R1)MARR1out, MARin先把地址送 MAR 才能访存
T5M(MAR)MDRMemR, MDRinE从 DB 读出操作数
T6(MDR)YMDRout, Yin被加数送入暂存器
T7(R0)+(Y)ZR0out, ALU(add), Zin另一操作数走内总线,运算
T8(Z)MDRZout, MDRin结果送 MDR,内总线侧
T9M(MAR) 写入MDRoutE, MemW写回主存,DB 侧

两个关键点:T8 用 MDRin(内总线 → MDR)、T9 用 MDRoutE(MDR → DB),方向不能写反;MAR 从 T4 装入后全程不用重装,因为读和写的是同一个存储单元。

(三)教材给出的带间址周期的加法 ADD @X,是完整的三周期样本:

周期微操作序列
取指(PC)MAR → 发读命令 → 主存 MDR → (MDR)IR(PC)+1PC
间址(MDR)MAR(形式地址)→ 发读命令 → 主存 MDR(有效地址)→ (MDR)Ad(IR)
执行(MDR)MAR(有效地址)→ 发读命令 → 主存 MDR(操作数)→ (MDR)Y(AC)+(Y)Z(Z)AC

考点速记

  1. 单总线的核心约束是每个节拍总线上只能传一个数据:由此逼出 Y(解决 ALU 输入凑不齐)与 Z(解决输出回灌输入),也由此得到"双操作数运算固定三拍";三总线结构下 Y、Z 都可省掉
  2. MDR 是双端口,四个门控信号中带 E 的通向数据总线、不带 E 的通向内部总线;同拍判据是不抢总线、不抢部件,而节拍数不等于时钟周期数,后者要算入主存访问延迟。
  3. ALU 两个输入端不对称,运算写成 (总线) op (Y)Z,不可交换的运算按被减数走总线、减数进 Y 摆;间址周期把形式地址换成有效地址,间接寻址比直接寻址多一次访存。

这一节在真题里被考过的形式(co 的数据通路大题清一色是单总线结构,下方「真题练习」里的大题基本都归本篇):

  • 按给定表格的格式,写出执行阶段每个节拍的功能与有效控制信号:这是最标准的一问。做法是按"取指 3 拍 + 每访存 2 拍 + 双操作数运算 3 拍 + 结果回主存 2 拍"拼,逐拍写清out / 目的 in / 访存命令 / ALU 操作四类信号。⚠️ 访存那两拍必须用带 E 的 MDR 信号。
  • 问图中哪些寄存器是程序员可见的、为什么要设置暂存器 T(或 Y、Z):可见性用"指令能否读写它"判;暂存器要分两条答——一条解决 ALU 输入凑不齐,一条解决输出回灌。
  • 问某控制信号的位数至少是多少log2(该信号要区分的操作个数)。ALUop 看 ALU 支持几种运算,SRop 看移位器支持几种移位。
  • 问哪些端点须连接到控制部件的输出端:凡是门控信号、读写命令、ALU / 移位操作选择都来自控制部件;数据线不是。
  • 问控制信号由什么部件产生、哪些寄存器的输出会连到它的输入端:由控制器(CU)产生;连到它输入端的是 IR(操作码)与标志寄存器 FR(条件码)——前者决定做什么,后者决定条件转移走哪支。
  • 问取指令阶段至少需要几个时钟周期:把节拍展开成时钟周期,访存那一拍要按题给的主存访问周期数算(如"从发出读命令到数据送到 MDR 需 5 个时钟周期",则取指 =1+5+1=7)。
  • 问某条指令的执行阶段至少需要多少个时钟周期:同上,先按数据流拼节拍,再把访存拍替换成实际周期数。

易错:访存那两拍写成不带 E 的 MDRin / MDRout。数据根本没到主存一侧。

易错:减法把被减数送 Y。(总线) op (Y),被减数必须走总线。

易错:把节拍数当成时钟周期数交卷。题面给了主存访问周期数就是要你换算。

易错:答"设置 Y、Z 是为了暂存数据"。两个暂存器的动机不同,要分开写。

教材出处
  • 采用 CPU 内部总线方式的数据通路、门控信号命名、Y 与 Z 的引入理由(图 9.4):唐朔飞《计算机组成原理》第 3 版 §9.2 控制单元的功能,印刷页 p381
  • ADD @X 间址加法指令三个周期的完整微操作序列:同上,印刷页 p382

相关知识

单周期数据通路硬布线控制器指令执行过程

真题练习