组合数据通路:把运算元件连成一条干活的通道
更新时间:2026-09-12。本文是「集成电路大类 · 芯片设计」入门层(beginner)数字逻辑基础第二十一篇。前面我们攒了一袋零件——门、加法器/ALU、比较器/校验、乘法器/桶形移位、MUX。这一篇看它们怎么连成一条真正在搬数、算数的通道。
本文要回答的问题
- 什么是数据通路(datapath)?它和控制逻辑怎么分工?
- MUX 为什么被称作「数据路由」,又为什么能当通用函数发生器?
- 一个 2ⁿ 选 1 的 MUX 怎么实现任意 n 输入函数?它和 LUT、ROM 是什么关系?
- ALU 内部怎样用一排 MUX 在「加/减/与/或/移位」之间选结果?
- 一条组合数据通路的「关键路径」怎么找,为什么深组合链跑不快?
一、数据通路与控制:搬数算数 vs 发号施令
数字系统在结构上几乎都能拆成两部分:
- 数据通路(datapath):一条由「寄存器 + 运算元件 + 选择布线」组成、数据真正流过的通道。寄存器打拍暂存,运算元件(加法器、乘法器、比较器、移位器)对数做变换,MUX 负责把数据路由到该去的地方。
- 控制逻辑(control):通常是有限状态机,根据当前状态、指令操作码、运算标志(零标志、比较结果)产生一组控制信号——选哪个 MUX 输入、寄存器要不要写、ALU 做哪种运算。
一句话:数据通路回答「数据能怎么流、能算什么」,控制回答「这一步让它流哪条路、算哪个运算」。数据通路要宽(总线位宽)、要快(组合延迟小),控制要窄(几根选择/使能线)但要严密。这种「datapath + FSM 控制」的二分,从最简单的串行累加器到 CPU、再到 AI 加速器 MAC 阵列,结构完全同构,只是规模不同。
二、MUX 是数据路由,也是通用函数发生器
MUX 在数据通路里有两副面孔。第一副:数据路由器。一个 2 选 1 MUX 就是一个「岔路口」,sel 决定让 a 还是 b 通过;把 MUX 串并联,就能在多个数据源、反馈环、常量之间灵活布线。带同步置数的计数器「保持/加一/载入」三选一、通用寄存器「写回哪个值」,本质都是 MUX 选路——这也是为什么 RTL 里 if/case 大量综合成 MUX(见 组合与时序逻辑)。
第二副更强大:通用布尔函数发生器。回忆 MUX 的定义:n 个选择端在 2ⁿ 个数据输入里选一个输出。如果把函数的 n 个变量接选择端,再把 2ⁿ 个数据输入端按真值表接成 0/1,输出恰好就是该函数真值表对应行的值!
以用 8 选 1 MUX 实现 3 变量函数 F = Σm(1,2,4,7) 为例:选择端接 A、B、C,数据端 D0…D7 按真值表填 0,1,1,0,1,0,0,1——被选中的最小项为 1 时对应 Di 接 1。任何 n 输入组合函数都能这样用一个 2ⁿ 选 1 MUX 实现,不需要化简、不需要门,真值表本身就是「程序」。
这正是 **FPGA 查找表 LUT(Look-Up Table)**的原理:一个 6 输入 LUT 本质是 64 个配置位加一个 64 选 1 MUX,你综合出的任何 ≤6 输入函数被填进那 64 个 bit,运行时 MUX 按输入查表输出(见 FPGA LUT 与 FF 深入)。同理,把固定 0/1 换成预先烧好的内容,用地址当选择端、数据当输出,就是一块 ROM——所以「MUX 实现函数」「LUT」「ROM 查表」在底层是同一件事:以输入为地址、查一张预先写好的真值表。微码、常数表(三角函数、码制转换)都能这么实现,代价是容量随输入数指数增长,所以只适合输入不多的函数。
三、ALU 内部:并行算、MUX 选
加法器那篇介绍了 ALU 是什么,这里从「数据通路怎么搭」再往里看一层。一个能做多种运算的 ALU,并不是把各运算串起来,而是所有功能单元并行地各自算一遍,最后用 MUX 选这一拍真正要的那个结果:
操作码 op 同时扮演 MUX 选择端:op=ADD 选加法器那一路,op=AND 选按位与那一路。功能单元的标志输出(零 Z、负 N、进位/借位 C、溢出 V)也送出去供控制 FSM 做分支。这种「空间上铺开、时间上选一」叫空间并行:多花硬件换一拍内出结果。代价是关键路径由「最慢的那个被选功能单元 + 最后那只大 MUX」决定,所以位宽大的加法器/移位器往往就是 ALU 的频率瓶颈。
四、一个串到片的最小数据通路
把零件装起来看。需求:对一串连续输入做「带使能的累加」,en 有效时 sum ← sum + x,否则保持,并在结果超阈值时拉标志。最小通路:
// 数据通路:寄存器 sum 存累加值,加法器算下一值,MUX 决定保持还是累加
always @(posedge clk or negedge rst_n)
if (!rst_n) sum <= '0;
else sum <= en ? (sum + x) : sum; // 2:1 MUX + 加法器 + 寄存器
// 控制/标志:比较器判断阈值(纯组合)
assign over = (sum >= TH);综合出的结构是:一个宽位寄存器、一个加法器、一个 2 选 1 MUX(保持走 sum 自己、累加走 sum+x)、一个比较器。数据沿 sum(Q) → 加法器 → MUX → sum(D) 形成反馈环,每拍转一圈;en、over 是控制/状态。这就是一切时序数据通路的胚胎——寄存器存状态,寄存器之间夹组合运算,时钟沿把新状态拍进去。
五、关键路径:数据为什么跑不快
既然寄存器之间夹着组合逻辑,那么「从一个寄存器 Q 出发、穿过组合网络、到达下一个寄存器 D」的最长延迟路径决定了时钟能跑多快——这就是关键路径(critical path)。在 ALU 里它可能是「输入 → 行波进位加法器的进位一路传到最高位 → 穿过多选一 MUX → 建立时间」;在累加器里,它是「sum 出来 → 加法 → MUX → 回到 sum 的 D 端」的反馈环。这条环的延迟必须小于一个时钟周期(加上建立时间余量),否则数据来不及在下次拍照前算稳。
顺着这条直觉,优化数据通路频率的三板斧很好懂:
- 换更快的运算结构:行波进位换超前进位、二进制计数换先行进位、压缩树减少加法层数;
- 插流水线(pipelining):在长组合链中间切开、加一级寄存器,把「一拍算完一大段」改成「每拍算一小段、数据像流水一样过站」,单拍路径变短、频率上去(代价是延迟和控制复杂度);
- 减少 MUX 级联和扇入:深嵌套
if会级联出一长串 MUX,改成互斥case或 one-hot 选择可降低深度。
这些正是时序为什么不满足、STA和 timing closure 要解决的问题,这里先建立「关键路径 = 寄存器到寄存器间最深的那条组合链」的物理图景。判断一段 RTL 快不快,养成在脑子里把它还原成「加法器/MUX/比较器连成的网络」、用眼扫出最长链的习惯,比死记约束命令重要——这也正是本系列反复强调的「看代码即看电路」。
与现有篇目的衔接
- 散件:逻辑门、编码器/译码器/MUX、加法器与 ALU、比较器/校验、乘法器/桶形移位
- 存储视角:寄存器/计数器/移位寄存器、片上存储器
- FPGA 对应:LUT/FF 深入、微架构入门
- 时序落点:时序为什么不满足、时序收敛基本手法
总结
一句话总结:数字系统可拆成数据通路与控制逻辑——数据通路是寄存器打拍、运算元件变换、MUX 路由布线的宽而快通道,控制(通常 FSM)依状态、操作码和标志产生选择/使能信号,从累加器到 CPU 到 MAC 阵列同构;MUX 既是数据岔路口(使能寄存器、计数器保持/载入靠它选路,故 RTL 的 if/case 大量综合成 MUX),又是通用函数发生器:把 n 个变量接选择端、2ⁿ 个数据端按真值表接 0/1 即可无需门与化简实现任意 n 输入函数,这正是 FPGA 的 LUT(64 配置位加 64 选 1)和 ROM 查表的同一本质,代价是容量随输入数指数增长;多运算 ALU 让加减、逻辑、比较、移位各单元并行算再由 op 驱动 MUX 选结果,属空间并行,关键路径由最慢单元加末尾 MUX 决定;任何时序通路的关键路径都是寄存器 Q 到下一寄存器 D 间最深的组合链,延迟须小于周期,提速靠换更快结构(CLA/压缩树)、插流水线切链、压平 MUX 层级——看 RTL 时把它还原成运算与选择连成的网并眼扫最长链,就是「看代码即看电路」的核心功夫。