← 返回博客德摩根定律

德摩根定律实践:只用 NAND 设计电路

德摩根定律可把 NAND 转换为输入带反相的 OR,把 NOR 转换为输入带反相的 AND。运用它们构建纯 NAND 或纯 NOR 电路,并优化多级逻辑。

DennyDenny
阅读约需 8 分钟
Chalkboard feature illustration for “德摩根定律实践:只用 NAND 设计电路”

概要: 德摩根的两个恒等式——A⋅B‾=A‾+B‾\overline{A \cdot B} = \overline{A} + \overline{B} 与 A+B‾=A‾⋅B‾\overline{A + B} = \overline{A} \cdot \overline{B}——可通过分配反相在 AND 与 OR 之间进行等价变换。由此,任意逻辑函数均可采用纯 NAND 或纯 NOR 形式实现;CMOS 芯片设计与 FPGA 综合均会利用这一性质。

德摩根的两个恒等式——A⋅B‾=A‾+B‾\overline{A \cdot B} = \overline{A} + \overline{B} 与 A+B‾=A‾⋅B‾\overline{A + B} = \overline{A} \cdot \overline{B}——很容易记住。更难的问题是,实际工作的工程师究竟如何运用它们。答案涵盖 CMOS 晶体管级设计、FPGA 综合、纯 NAND 与纯 NOR 实现,以及多级电路优化。

本文聚焦于把德摩根定律投入真实设计:它们如何减少实际电路的逻辑门数量,如何让任何逻辑都能只用 NAND 或 NOR 实现,以及仿真器如何直观展示这些等价关系。

快速回顾:两条定律

德摩根的两个恒等式是:

A⋅B‾=A‾+B‾(NAND = Bubbled OR)\overline{A \cdot B} = \overline{A} + \overline{B} \quad \text{(NAND = Bubbled OR)} A+B‾=A‾⋅B‾(NOR = Bubbled AND)\overline{A + B} = \overline{A} \cdot \overline{B} \quad \text{(NOR = Bubbled AND)}

它们可以推广到 nn 个变量:

X1⋅X2⋅…⋅Xn‾=X1‾+X2‾+…+Xn‾\overline{X_1 \cdot X_2 \cdot \ldots \cdot X_n} = \overline{X_1} + \overline{X_2} + \ldots + \overline{X_n} X1+X2+…+Xn‾=X1‾⋅X2‾⋅…⋅Xn‾\overline{X_1 + X_2 + \ldots + X_n} = \overline{X_1} \cdot \overline{X_2} \cdot \ldots \cdot \overline{X_n}

NAND 门元件

探索 NAND 门行为

应用一:转换为纯 NAND 实现

在静态 CMOS 中,两输入 NAND 门使用四只晶体管;非反相 AND 门可由 NAND 后接反相器实现。因此,NAND 是一种实用的基本单元,但这并不意味着整个设计都应只使用 NAND 门。ASIC 综合将逻辑映射到经过特性表征的单元库所提供的单元;FPGA 综合则主要映射到查找表(LUT)和专用资源。

转换过程

任何积之和(SOP)表达式都能分两步转换为 NAND-NAND 形式:

  1. 从 SOP 开始:Y=AB+CDY = AB + CD
  2. 应用双重否定:Y=AB+CD‾‾Y = \overline{\overline{AB + CD}}
  3. 对外层横线应用德摩根定律:Y=AB‾⋅CD‾‾Y = \overline{\overline{AB} \cdot \overline{CD}}

结果是一套两级 NAND-NAND 电路:第一级 NAND 分别计算 AB‾\overline{AB} 与 CD‾\overline{CD},第二级 NAND 再将两者组合。

计算示例:三变量函数

把 Y=AB‾C+A‾BCY = A\overline{B}C + \overline{A}BC 转换为纯 NAND:

第 1 步:双重否定:Y=AB‾C+A‾BC‾‾Y = \overline{\overline{A\overline{B}C + \overline{A}BC}}

第 2 步:对外层横线应用德摩根定律:

Y=AB‾C‾⋅A‾BC‾‾Y = \overline{\overline{A\overline{B}C} \cdot \overline{\overline{A}BC}}

实现方式:

  • 门 1(NAND):输入 AA、B‾\overline{B}、CC,输出 AB‾C‾\overline{A\overline{B}C}
  • 门 2(NAND):输入 A‾\overline{A}、BB、CC,输出 A‾BC‾\overline{\overline{A}BC}
  • 门 3(NAND):输入为门 1 与门 2 的输出,最终输出 YY

A‾\overline{A} 与 B‾\overline{B} 所需的 NOT 门通过将 NAND 门的两个输入端连接在一起来实现。

本原理图中的门数量:3 只 NAND 门加 2 只基于 NAND 的反相器,共计 5 只 NAND 门。直接绘制的 AND-OR 电路同样使用五只门,但包含三种门类型。单一门型的构造适用于器件封装库存受限的场景;硅实现则应依据目标单元库的面积、延迟和功耗数据进行评估。

试用 NAND 通用逻辑模板

应用二:转换为纯 NOR 实现

NAND-NAND 转换的对偶形式适用于和之积(POS)表达式,会得到 NOR-NOR 电路。

转换过程

  1. 从 POS 开始:Y=(A+B)(C+D)Y = (A + B)(C + D)
  2. 双重否定:Y=(A+B)(C+D)‾‾Y = \overline{\overline{(A+B)(C+D)}}
  3. 对外层横线应用德摩根定律:Y=(A+B)‾+(C+D)‾‾Y = \overline{\overline{(A+B)} + \overline{(C+D)}}

结果是一套两级 NOR-NOR 电路:第一级 NOR 分别计算 A+B‾\overline{A+B} 与 C+D‾\overline{C+D},第二级 NOR 将两者组合。

NOR 门可能天然适合和之积逻辑,也可能适合提供相应复合单元的单元库。NAND、NOR 与混合门形式之间的选择取决于扇入、驱动能力、负载、布局和目标工艺,并不存在普遍适用的优先选择。

NOR 门元件

应用三:多级电路优化

实际电路通常包含多级逻辑。当反相分布在多个逻辑级时,可利用德摩根定律在电路中进行“气泡推动”,抵消冗余反相并减少逻辑门数量。

计算示例:化简四门表达式

化简:Y=A⋅B‾+C⋅D‾‾Y = \overline{\overline{A \cdot B} + \overline{C \cdot D}}

第 1 步——对外层横线应用德摩根定律(内部表达式是两项之和):

Y=A⋅B‾‾⋅C⋅D‾‾Y = \overline{\overline{A \cdot B}} \cdot \overline{\overline{C \cdot D}}

第 2 步——抵消双重否定:

Y=(A⋅B)⋅(C⋅D)=A⋅B⋅C⋅DY = (A \cdot B) \cdot (C \cdot D) = A \cdot B \cdot C \cdot D

起初看似复杂的表达式需要 2 只 NAND、1 只 NOR 与一只输出反相器。两次运用德摩根定律后,它简化为一只四输入 AND 门。

计算示例:在三级电路中推气泡

给定:Y=(A+B)‾⋅(C+D)‾⋅E‾Y = \overline{\overline{(A + B)} \cdot \overline{(C + D)} \cdot E}

第 1 步——对外层 NAND 应用德摩根定律:

Y=(A+B)‾‾+(C+D)‾‾+E‾Y = \overline{\overline{(A+B)}} + \overline{\overline{(C+D)}} + \overline{E}

第 2 步——抵消双重否定:

Y=(A+B)+(C+D)+E‾=A+B+C+D+E‾Y = (A + B) + (C + D) + \overline{E} = A + B + C + D + \overline{E}

在布尔符号层面,该表达式可化简为一只带一个反相输入的五输入 OR 门。实际硬件是否面积更小、速度更快或功耗更低,则取决于可用单元或 LUT、扇入、布线及负载。

应用四:FPGA 综合与技术映射

编写 Verilog 或 VHDL 时,综合工具不会把代码直接逐字转换成 AND 与 OR 门。它会执行技术映射——把逻辑转换为目标 FPGA 或 ASIC 单元库提供的特定原语。德摩根定律是这个过程中的核心变换。

综合工具如何使用德摩根定律

  1. LUT 映射:在不超过输入容量的前提下,FPGA 查找表(LUT)可以实现任意布尔函数。综合工具会先化简并因式分解逻辑,再将函数装入 LUT;德摩根变换是其可能采用的等价改写之一。

  2. 极性优化:许多单元库中的门天然提供反相输出或反相输入。通过“推气泡”,综合工具可以保留有用的反相信号,避免另行增加反相器。

  3. 关键路径优化:当经过特性表征的单元库和布局结果预测能够改善时序时,工具可能选择等价的 NAND、NOR 或复合单元形式。最优形式取决于目标工艺。

一个具体的 Verilog 示例

考虑以下 RTL 代码:

assign y = ~(a & b) | ~(c & d);

综合工具会识别出 AB‾+CD‾=ABCD‾\overline{AB} + \overline{CD}=\overline{ABCD}。它可能采用分立逻辑门、复合库单元;如果输入容量允许,也可能使用一个 FPGA LUT。RTL 只规定行为,所选目标的实现报告才能确定实际面积与时序。

应用五:旧式硬件与逻辑门替换

维修老式硬件或器件库存受限时,德摩根定律是替换逻辑门的首要工具。

通用门构造

只用 NAND 门,可以构建其他每一种逻辑门:

目标逻辑门NAND 实现门数量
非 ANAND(A, A)1
A 与 B 的与运算NAND(NAND(A,B), NAND(A,B))2
A 与 B 的或运算NAND(NAND(A,A), NAND(B,B))3
A 与 B 的或非运算NAND(NAND(NAND(A,A), NAND(B,B)), NAND(NAND(A,A), NAND(B,B)))5

OR 构造直接来自德摩根定律:A+B=A‾⋅B‾‾A + B = \overline{\overline{A} \cdot \overline{B}},也就是 NAND(NOT A, NOT B)。

这对于器件库存受限的场景同样有用。如果手头只有 74LS00 中的可用单元,三组 NAND 单元可以实现一个 OR 功能,但替代方案必须满足原电路的电压、扇出、时序、功耗以及未使用输入端处理要求。

使用示波器验证

在 DigiSim 中构建德摩根变换时,可比较原始电路与变换后电路的输出。OSCILLOSCOPE_8CH 能够同时显示两路输出及其输入信号。

穷举检查所有稳定输入组合可以验证真值表。切换输入还可以观察仿真器传播延迟模型所呈现的差异,但这不能证明某一具体物理实现的时序特性。

逻辑等价的电路不一定在时序上等价。NAND-NAND 与 AND-OR 原理图可能同为两个逻辑级,但单元延迟、输入转换时间、扇出、负载和布线仍可能不同。额外的反相级可能延长路径;只有针对目标实现的时序分析,才能支持对物理速度的判断。

NAND 通用逻辑模板

应用德摩根定律的常见陷阱

只翻转一部分

学生经常记得把每一项取反,却忘记同时翻转运算符,于是写出错误的 A⋅B‾=A‾⋅B‾\overline{A \cdot B} = \overline{A} \cdot \overline{B}。必须始终把 AND 改为 OR,或把 OR 改为 AND。

NAND/NOR 电路中的悬空输入

在 DigiSim 中构建纯 NAND 电路时,应为每个相关输入提供确定的信号源。真实 CMOS 输入悬空时可能呈现不可预测的电压,因耦合噪声而翻转,并增大电源电流。物理器件的未使用输入应按照器件数据手册连接到适当的有效逻辑电平;在原理图练习中,应使用对应的 CONSTANT 信号源。

混淆逻辑等价与时序等价

两套真值表相同的电路,传播延迟可能截然不同。使用德摩根定律转换电路时,务必检查变换是否增加或减少了逻辑门级数。

挑战:多级优化

把以下表达式化简为最少的逻辑门:

Y=A+B‾‾⋅A‾+B‾‾Y = \overline{\overline{A + \overline{B}} \cdot \overline{\overline{A} + B}}

提示:对外层 NAND 应用德摩根定律,抵消双重否定,然后观察剩下什么。(答案:Y=(A+B‾)+(A‾+B)=A+A‾+B+B‾=1Y = (A + \overline{B}) + (\overline{A} + B) = A + \overline{A} + B + \overline{B} = 1。整个表达式恒为真,甚至不需要任何逻辑门。)

这是一个非常有力的例子:德摩根定律与互补律结合后,有时能够消除整套电路。

后续可阅读卡诺图,从图形角度理解同类化简;也可回顾布尔代数基础,并通过 NAND 元件参考对其中一种变换进行接线验证。

将想法变成真正可运行的电路。