跳转至

布尔逻辑、组合电路与时序电路

表示方案规定了位串的意义,数字逻辑则让位真正流动起来。最重要的分界不是“简单门”和“复杂芯片”,而是电路是否保存状态。

布尔逻辑是硬件的代数

逻辑变量只有 0 和 1。NOT、AND、OR 是基本运算,NAND 或 NOR 单独也能构造任意布尔函数,因此称为功能完备。

布尔代数用于化简电路。例如:

\[ A B + A \overline{B}=A(B+\overline{B})=A. \]

化简可减少门数、延迟和功耗,但现代综合工具还要同时考虑扇出、布线与时序,表达式最短不一定版图最好。

组合电路:输出只看当前输入

组合电路没有记忆。多路选择器依据选择信号从多个输入中选一个;译码器把编码展开为独热信号;比较器判断大小;ALU 把多个算术逻辑功能放在一个部件中。

最小完整例子:一位全加器

输入是 \(a\)\(b\) 和低位进位 \(c_{in}\),输出和位 \(s\) 与高位进位 \(c_{out}\)

\[ s=a\oplus b\oplus c_{in}, \]
\[ c_{out}=ab+c_{in}(a\oplus b). \]

把多个全加器串起来得到行波进位加法器。结构直观,但最高位必须等待进位逐级传播,位宽越大关键路径越长。超前进位、前缀加法器用更多面积和连线换更低延迟。

时序电路:状态让机器拥有“下一步”

时序电路的输出取决于当前输入和内部状态。D 触发器在有效时钟边沿采样输入 \(D\),之后把值保持在 \(Q\)。多个触发器组成寄存器,寄存器加组合逻辑就形成状态转移:

\[ S_{t+1}=F(S_t,X_t),\qquad Y_t=G(S_t,X_t). \]

这就是有限状态机。程序计数器是状态,控制器也可用状态机表示“取指—译码—执行—访存—写回”。

一个两状态控制器

假设按钮按下后 LED 点亮,松开后保持,复位才熄灭:

OFF --button--> ON
ON  --reset-->  OFF

仅靠组合电路无法“记住曾经按过按钮”;一个状态位就足以补上记忆。

时钟、关键路径与流水

两个寄存器之间的组合逻辑必须在一个时钟周期内稳定。粗略约束为:

\[ T_{clk}\ge t_{cq}+t_{logic}+t_{setup}+t_{skew}. \]

\(t_{cq}\) 是前级寄存器输出延迟,\(t_{logic}\) 是组合逻辑最长延迟,\(t_{setup}\) 是后级建立时间,\(t_{skew}\) 表示时钟偏差。决定最高频率的是最慢的关键路径

在长路径中插入寄存器可提高频率并形成流水线,但会增加延迟、控制复杂度和寄存器功耗。后续 CPU 流水线正是同一思想的大规模应用。

异步输入与亚稳态

若输入在采样边沿附近变化,触发器可能短暂落入既非稳定 0 也非稳定 1 的亚稳态。它不能被逻辑上彻底消除,只能用同步器给它足够恢复时间,把故障概率降到工程可接受范围。按钮、网络信号和不同钟域之间的输入都需要谨慎同步。

与编程模型的直觉联系

组合逻辑像纯函数:同样输入产生同样输出;时序逻辑像带内部变量的对象:下一次行为依赖过去状态。时钟边沿则像全系统约定的“提交点”,让大量部件在离散步骤上协作。

自测

  1. 多路选择器和译码器分别解决什么数据流问题?
  2. 为什么加深流水线可能提高吞吐量,却不一定降低单条操作延迟?
  3. 组合环路为何危险?触发器怎样把反馈变成可控状态机?