精简版 · 小杯2026-08 冻结,已停止更新(发布前修订了 4 处已知错误)。后续勘误与新增内容只在正式版。看正式版(中杯)→
Skip to content

单总线数据通路:统考大题主战场

大纲定位

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

大纲对这两条的要求落到题面上,就是:给一张单总线 CPU 结构图和一套自定义的控制信号约定,能读懂图上每个门控的位置,写出指定指令每个节拍的微操作和有效控制信号

考情分析

这是 408 计组综合题的主战场:2009 年(给定数据通路写执行阶段节拍表)、2015 年(单总线 + 移位寄存器 SR 的通路设计)、2022 年(数据通路分析 + 标志位逻辑 + 取指信号序列)的大题都长在这个结构上。前面单周期/多周期两篇用的 MIPS 教学模型帮你建立直觉,但真题答题用的是本篇这套写法。

单总线结构长什么样

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

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

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

教材图与真题图的一处差别

教材这张图画的是单累加器模型(只有一个 AC)。而 2015、2022 两年的真题画的是通用寄存器组(GPRs / R0~R3)模型。两者的结构骨架、Y 和 Z 的作用、节拍拆分规则完全一致,差别只在"运算的一方是固定的 AC,还是任选的某个通用寄存器"。按本篇的规则做题,两种图都能应付。

两个关键约束决定了一切:

  1. 每个节拍总线上只能传送一个数据——两个数据要传就得拆成两拍
  2. ALU 是组合逻辑电路、自身不存数——运算过程中必须保持两个输入端不变,所以一个输入从暂存器 Y 取,另一个从内部总线取;输出也不能直接接内部总线,否则输出会经总线反馈回 ALU 输入影响运算正确性,故用暂存器 Z 暂存结果

Y 和 Z 的存在理由,考试要求分开答

2022 年那道题直接问"为什么要设置暂存器 Y 和 Z",判分要求两者的动机分别答到,含混地答一句"用来暂存数据"是要扣分的:

暂存器存在理由
YALU 双输入端需要两个操作数同时有效,而单总线一拍只能送一个 → 必须先把第一个操作数暂存进 Y,下一拍再送第二个
ZALU 算完时总线可能正被"送第二个操作数"占用;且输出直接接总线会反馈回输入端 → 用 Z 暂存运算结果,等总线空出再送目的寄存器

编者注(结构对比):三总线结构下源操作数、目的操作数、结果各走一条总线,不存在"一拍只能传一个"的瓶颈,Y、Z 可以省掉,节拍数也随之减少。"为什么单总线需要 Y、Z 而三总线不需要"是这一块的核心辨析点。

控制信号的写法

命名逐年不同,要抓的是不变量

同一套结构,不同年份的题面用的符号并不一样:

出处门控写法暂存器命名
教材下标 i / o(PCoMARiY、Z
2009 年真题Xout / XinA(ALU 暂存器)、AC(累加器)
2015 年真题Xout / XinT(暂存器)、SR(移位寄存器)
2022 年真题Xout / XinY、Z

不变量只有三条:源寄存器给 out,目的寄存器给 in;访存另给读写命令;ALU 操作单独给一个信号

考场铁律

一律照抄题面给定的信号名,不要用自己背下来的那套。题面写 Read/Write 你就写 Read/Write,写 MemR/MemW 你就写 MemR/MemW;把暂存器叫成 Y 而题目叫 T,判分是不认的。

MDR 是双端口,别混——2009 年的送分点

MDR 一头连内部总线、一头连数据总线 DB(要和主存交换数据),所以它的门控信号是四个而不是两个。2009 年题面明确定义了这套记号:

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

E 的是外部(External,即 DB 侧),不带 E 的是内部总线侧。访存那两拍如果写成不带 E 的 MDRin/MDRout,数据根本没到主存那一侧,这是直接扣分的错。

访存不是一拍就完事

前面的模板为了讲清数据流,把"M(MAR)MDR"写成一个节拍。但真题会明确给出主存的读写延迟:2022 年那道题就设定"从发出主存读命令到数据送到 MDR 共需 5 个时钟周期",于是取指阶段的时钟周期数是

1 (送地址)+5 (主存读)+1 (送 IR)=7 个时钟周期

问"几个节拍/几步微操作"和问"几个时钟周期"是两个问题,后者必须把访存的延迟拍数算进去。

取指周期:所有指令共用的三拍

这里直接用 2009 年题面给出的范本(它把译码单列为 C4):

时钟功能有效控制信号
C1MAR(PC)PCout, MARin
C2MDRM(MAR)PC(PC)+1MemR, MDRinE, PC+1
C3IR(MDR)MDRout, IRin
C4指令译码

注意 C2 里 (PC)+1PC 不占总线——PC 自增由专门的加 1 逻辑完成,所以能和访存挤在同一拍。这就是"哪些操作可以并行"的判断标准:不抢总线、不抢部件的操作才能同拍

三类指令的执行周期模板

① 寄存器-寄存器型: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

对照 ② 和 ③ 的 T5:取数是 DB 把数据打进 MDR,用 MDRinE;存数是内部总线把数据打进 MDR,用 MDRin。同一个"MDR",信号不一样。

例题一:访存加法,结果回寄存器

:写出 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 两拍(取指一次 + 取操作数一次)。

例题二:结果写回主存(2009 年真题原型)

这道题的功能是 (R0)+((R1))(R1)——结果存回主存,比例题一多了"回写"这一段,也是 MDR 四个信号全都用上的完整样本。题面用 A 作 ALU 暂存器、AC 作累加器(对应本篇的 Y 和 Z)。取指译码 C1~C4 由题目给出,只需补执行阶段:

时钟功能有效控制信号说明
C5MAR(R1)R1out, MARin先把 R1 装的地址送 MAR 才能访存
C6MDRM(MAR)MemR, MDRinE从 DB 读出操作数
C7A(MDR)MDRout, Ain被加数送入 ALU 暂存器
C8AC(A)+(R0)R0out, Add, ACin另一操作数走内总线,运算
C9MDR(AC)ACout, MDRin结果送 MDR,内总线侧
C10M(MAR)(MDR)MDRoutE, MemW写回主存,DB 侧;MAR 一直没变,仍指向 (R1)

两个容易丢分的细节:C9 用 MDRin(内总线 → MDR)、C10 用 MDRoutE(MDR → DB),一个都不能写反;MAR 从 C5 装入后全程不用重装,因为读和写的是同一个单元。

教材例题:间接寻址的加法 ADD @X

教材给的是带间址周期的完整三周期样本,考纲里的间接寻址正是从这里来的:

周期微操作有效控制信号
取指(PC)MAR;发读命令;主存 → MDR;(MDR)IR(PC)+1PCPCo,MARi1RMDRo,IRi
间址(MDR)MAR(形式地址);发读命令;主存 → MDR(有效地址);(MDR)Ad(IR)MDRo,MARi1RMDRo
执行(MDR)MAR(有效地址);发读命令;主存 → MDR(操作数);(MDR)Y(AC)+(Y)Z(Z)ACMDRo,MARi1RMDRo,YiACo,ALUi+ADD → Zo,ACi

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

答题套路(四步)

  1. 取指三拍照抄(除非题目说明取指已完成或已给出)
  2. 执行段先写数据流:操作数从哪来 → 经不经过 ALU → 结果到哪去
  3. 按"一拍一个总线传送"拆拍:双操作数运算必有"先进 Y、再运算进 Z、最后 Z 写回"三拍;结果回主存的再加"进 MDR、写主存"两拍
  4. 控制信号照"out / in 配对"翻译:源寄存器 out + 目的寄存器 in,访存拍加 MemR/MemW 并注意 MDR 用带 E 的那一侧,运算拍加 ALU 操作

常见丢分点

  • 忘了 Y/Z,让 ALU 两个输入同时走总线
  • 访存拍把 MDR 写成不带 E 的 MDRin/MDRout(数据没到主存那一侧)
  • 写回主存时把 MemW 写在数据还没进 MDR 的那一拍
  • (PC)+1 单独占一拍(它有专用加 1 逻辑,可并入取指第二拍)
  • 问"几个时钟周期"却按"几个节拍"答,漏算主存访问的延迟拍数
  • 答 Y、Z 的作用时只笼统说"暂存数据",没把两者的动机分开
  • 用自己背的信号名,而不是题面给定的那套
加载可视化中...

真题练习

建议按"先自己写节拍表、再对答案"的方式练:

教材出处

  • 数据通路结构图与门控信号命名(图 9.4):唐朔飞《计算机组成原理》(第 3 版)§9.2 控制单元的功能,印刷页 p381
  • ADD @X 间址加法指令的三周期微操作序列:同书,印刷页 p382