数据通路的基本结构

零件备齐了,这一节讨论怎么把它们连起来。

连法只有三种:单总线、多总线、专用通路。三者提供的功能完全相同——同一条指令在三种结构下都能执行——区别只在要几拍。所以这一节的核心是一个可计算的量:同一个操作,在三种结构下分别需要多少个时钟周期。

机制

一、CPU 内部单总线

所有寄存器的输入和输出都挂在同一根内部总线上。

flowchart TB
    BUS(["内部总线(一条)"])
    R["R0 R1 R2 R3<br/>PC IR MAR MDR"]
    Y["暂存器 Y"]
    ALU["ALU"]
    Z["暂存器 Z"]

    R -->|Xout 三态门| BUS
    BUS -->|Xin 写使能| R
    BUS --> Y
    Y --> ALU
    BUS --> ALU
    ALU --> Z
    Z --> BUS

    classDef bus fill:#fde68a,stroke:#d97706,stroke-width:3px
    classDef reg fill:#dbeafe,stroke:#2563eb,stroke-width:2px
    classDef alu fill:#dcfce7,stroke:#16a34a,stroke-width:2px
    class BUS bus
    class R,Y,Z reg
    class ALU alu

结构上只有一条约束,但后果很大:

一拍之内,总线上只能出现一个值。

一次 ALU 运算 (R1) + (R2) → R3 因此必须拆成三拍:

拍微操作控制信号为什么不能合并
T0(R1) → YR1out, YinR1 的值先上总线,被暂存器接住
T1(Y) + (R2) → ZR2out, ALUop=add, ZinR2 现在才能上总线——T0 已被 R1 占用
T2(Z) → R3Zout, R3in结果经 Z 回到总线再写入

三拍里有两拍是被总线逼出来的:T0 存在是因为两个操作数不能同拍上总线(这就是暂存器 Y 的理由),T2 存在是因为 ALU 输出直接接回总线会形成组合环路(暂存器 Z 的理由)。

优点:连线最少、结构最规整、控制器最简单。 缺点:拍数最多, 高。

二、CPU 内部多总线

设两条或三条内部总线,让多个值能同时传送。

以三总线为例:总线 A 和 B 各送一个操作数给 ALU,总线 C 送回结果。于是:

拍微操作
T0(R1) → A,(R2) → B,ALU 运算,结果 → C → R3

一拍完成。 代价是连线数量成倍增加,而且每个寄存器要有多套三态门(分别通向不同总线)。

双总线是折中:两个源可以同时上不同总线,但结果回写还要一拍,或者需要一条到某总线的旁路。题目给”双总线”时要按图判断,不能套模板——双总线的具体连法在不同教材里不统一。

三、专用数据通路

不设通用总线,按数据实际流动的方向单独拉线。

典型例子就是 MIPS 五级流水线的数据通路:PC → 指令存储器 → 寄存器堆 → ALU → 数据存储器 → 写回,一条主干道加若干旁路,每一段只往一个方向走。

优点:速度最快,没有总线争用,天然适合流水线切分。 缺点:连线最多、面积最大、通用性差——加一条新指令可能要重新布线。

为什么流水线一定用专用通路:流水线要求各段同时工作(5.6.2),而总线结构下各段会互相争总线,结构冒险会严重到流水线失去意义。这就是 4.4.2 说”RISC 采用 Load/Store 结构让流水段整齐”的硬件配套条件。

三种结构的对比

单总线多总线专用通路
一次寄存器间 ALU 运算3 拍1~2 拍1 拍
连线数量最少中最多
需要暂存器必须(Y、Z)可少设一般不需要(用段间寄存器)
控制器复杂度最简单中最复杂
适合早期 CISC、微程序控制中档机流水线 / RISC
高中低

这张表的读法:三种结构不是”好坏排序”,而是5.2.3 那个 与硬件成本之间取舍的又一次出现。 单总线用拍数换连线,专用通路用连线换拍数。

「找线」到底是怎么个找法

疑问点:数据通路书上讲得很少,感觉就是找线;印象里做过一道题,数据通路要从 ALU 穿过去

两句都对,而且第二句正是这一节最值得记住的那个结构特征。先说第二句。

你记得的那道题应该是 2015 年真题那道单总线 CPU 大题(本章 5.3.4 会完整拆开)。它的结构是:

  • 通用寄存器 R0~R3 和暂存器 T 的输出只通向 ALU 的输入端
  • ALU 的输出经移位器 SR 才回到内总线
  • 内总线再写回各寄存器

也就是说,寄存器的输出根本没有直达内总线的路。于是 (R1) → R2 这种最普通的传送,也必须绕道 ALU。

这就解释了 ALU 功能表里那个看起来毫无用处的「直送 A(mova)」为什么存在——它不是给程序员用的,是给数据通路用的:当唯一的回路穿过 ALU 时,就需要一个”什么都不做地穿过去”的功能。 同理,移位器的三种功能里也有一个”直送(mov)“,理由完全一样。

一句话判据:ALU 功能表里出现”直送”,几乎可以断定这台机器的寄存器间传送必须穿过 ALU。

再说第一句。「就是找线」抓住了操作的本质,但它有一套确定的算法,不是碰运气。

完整的读图五步(5.3.4 会逐条演示):

  1. 先给每根线定性——实线走数据,虚线走控制。控制线的起点只能是控制部件(5.3.1 的判据)。
  2. 数出总线有几条——这决定”一拍能传几个值”,是拍数的上限约束。
  3. 找出每个寄存器的入口和出口——出口有没有三态门(Xout)、入口有没有写使能(Xin)。只有出口能上总线,只有入口能收。
  4. 把要完成的操作写成数据流(就是 5.2.2 那四组),再对着图检查每一步的路是否存在。
  5. 排拍:把数据流的每一步按”总线冲突 / 部件冲突 / 数据依赖”三条规则分组,能塞进同一拍的塞在一起。

书上讲得少是真的,但少的是例题不是知识点。 这一节的知识点就是上面那张三结构对比表,剩下全是把它用在具体图上的熟练度——所以”等做题”这个判断是对的,而做题前要带着的是这五步和三条排拍规则,不是更多的概念。

排拍的三条规则

第 5 步用到的三条规则,单独摆出来(5.3.4 反复使用):

规则内容来源
总线冲突同一拍内,同一条总线上只能有一个 Xout 有效三态门,见 5.3.2
部件冲突同一拍内,ALU / 移位器 / 主存端口各自只能被用一次组合部件不能同时算两件事
数据依赖后一步要用前一步的结果,必须排在后一拍结果要等寄存器时钟沿才稳定

反过来,Xin 可以同拍多个有效——这是唯一能”白赚”的并行,排拍时要主动去找。典型例子:取指周期里 PC → MAR 的同时把 PC 也送去做加法。

边界

层次辨析:单总线 / 多总线 / 专用通路

三者功能相同、拍数不同。判据:

  • 图上只有一条贯穿所有寄存器的竖线 → 单总线
  • 图上有两三条并行的总线 → 多总线
  • 图上没有总线,只有点对点的箭头 → 专用通路

拍数:单总线一次运算 3 拍,专用通路 1 拍。

边界辨析:暂存器 Y、Z 是结构的产物,不是必需品

单总线必须有 Y(接住第一个操作数)和 Z(打断 ALU 输入输出的组合环路)。

多总线和专用通路可以不设——两个操作数走不同总线同时到达,结果走第三条总线直接写回。所以”CPU 里一定有暂存器”是错的,正确说法是”单总线结构下必须有”。

关联对照:CPU 内部总线 / 系统总线

内部总线的争用由控制器排拍解决(本节三条规则);系统总线的争用由总线仲裁解决(6.2.1)。

区别的根源:内部总线的所有使用者都听同一个控制器指挥,冲突可以在设计时静态排除;系统总线的使用者(CPU、DMA 控制器)是相互独立的主设备,冲突只能在运行时动态判优。

对照速查

现象说明这是什么结构
ALU 功能表里有”直送 A”寄存器间传送要穿 ALU → 单总线
图上有暂存器 T / Y / Z大概率单总线
一次寄存器间加法要 3 拍单总线
各段有独立的指令存储器和数据存储器专用通路(流水线)
一拍能同时读两个寄存器并写回多总线或专用通路
操作单总线拍数说明
(R1) → R2(若有直达总线的路)1R1out, R2in
(R1) → R2(须穿 ALU)2 或 3视 ALU 输出端有无暂存器
(R1) + (R2) → R33存 Y、算、回写
取指周期3送地址、读存储器、送 IR(PC 自增可并入)

考点

  • “为什么要设暂存器 T”:答单总线一拍只能传一个值,ALU 需要两个操作数同时到位;再补避免 ALU 输入输出成组合环路。
  • 数一次运算要几拍:单总线记 3 拍。题目若给具体图,按三条排拍规则实算。
  • 判断结构类型:看总线条数,或看有没有暂存器、有没有”直送”功能。
  • 三种结构的优劣对比:拍数、连线、控制复杂度三项,方向相反。
  • 流水线为什么要专用通路:答总线结构下各段争总线会造成严重结构冒险。

链接