数字逻辑

组合逻辑(combinational logic)

想象一台自动售货机的投币计数器:投进几枚硬币,显示屏立刻显示出总额。你一分钟前投了什么、机器已经开了一个小时还是刚开机,都无关紧要——输出完全是此刻投币口里这些硬币的函数。这就是组合逻辑的本质:一种输出只取决于当前输入的电路,对之前发生过什么没有任何记忆。改变一个输入,输出会在极小的传播延迟后稳定到新值;让输入保持不变,输出也保持不变。

严格地说,组合电路实现的是输入的一个纯布尔函数——同样的输入组合永远产生同样的输出组合。你用逻辑门(与、或、非、异或)搭建它们,再连成更大的模块:从几路输入中选出一路的多路复用器、把两个数相加的加法器、译码器、比较器,以及各种查表式的逻辑。关键在于:没有反馈回路,也没有存储元件,所以电路里没有任何东西会记住过去的状态。

这是与时序逻辑刻意相反的一面——时序逻辑会把输出经由触发器这类存储元件反馈回去,因此确实取决于历史,也取决于时钟。真实芯片把两者交织在一起:一团团组合逻辑算出下一拍的值,寄存器在每个时钟沿把这些值锁存下来。一个实际后果是时序——信号以有限的速度逐级穿过各个门,所以寄存器之间每一条组合路径的延迟,正是静态时序分析要拿来和时钟相比对的;其中最慢的那条便成了限制芯片能跑多快的关键路径。

// A 2-to-1 multiplexer: output is a pure function of sel, a, b
assign y = sel ? b : a;

连续赋值 `assign` 描述的就是组合逻辑——只要任一输入一变,`y` 立刻重新计算,没有时钟,也不保存任何状态。

「combinational(组合)」和「combinatorial」在实践中可以互换使用,不过多数工程师和 IEEE 标准更偏好「combinational」——这种电路是把输入组合起来,而不是在数学意义上去数有多少种组合。

又称
combinatorial logiccombinational circuitcombinational circuitry组合逻辑組合邏輯组合电路組合電路