NAND 门看起来只是一个非常小、非常简单的数字电路。
它接收两个二进制输入,并产生一个二进制输出。
但是,这个看似简单的逻辑门却有一个非常特别的性质:
从理论上来说,一台完整的数字计算机可以只使用 NAND 门构建出来。
这听起来可能有些不可思议。
因为一台计算机需要算术电路、寄存器、存储器、控制逻辑,以及许多其他复杂的组成部分。
这么多东西,怎么可能全部来自一种逻辑门?
答案就在于:
NAND 门是一种通用逻辑门(Universal Gate)。
如果我们能够使用 NAND 门重新实现最基本的逻辑运算,那么这些基本逻辑就可以进一步组合,构成越来越复杂的数字电路。
下面我们一步一步来看。
1. 什么是 NAND 门?
NAND 门和 AND 门的关系非常密切。
AND 门只有在两个输入都为 1 的时候,输出才是 1。
对于 AND 门:
0 AND 0 → 0
0 AND 1 → 0
1 AND 0 → 0
1 AND 1 → 1
NAND 的意思就是:
NOT AND
也就是说,NAND 门先执行 AND 运算,然后把结果反转。
因此,它的行为是:
0 NAND 0 → 1
0 NAND 1 → 1
1 NAND 0 → 1
1 NAND 1 → 0
只有当两个输入都是 1 的时候,NAND 门的输出才是 0。
其他所有输入组合,输出都是 1。
如果只看一个 NAND 门,它似乎并没有多么强大。
真正有意思的地方,是当多个 NAND 门连接在一起以后会发生什么。
2. NAND 可以构建 NOT 门
第一个非常有用的方法其实很简单。
一个 NAND 门通常有两个输入。
但是,如果我们把这两个输入连接在一起,让它们接收同一个信号,会发生什么?
如果输入是 0:
0 NAND 0 → 1
如果输入是 1:
1 NAND 1 → 0
这正好就是 NOT 门的行为。
因此:
把 NAND 门的两个输入连接在一起 = NOT 门
这一点非常重要。
因为这说明 NAND 已经可以实现逻辑取反。
但这还只是开始。
3. NAND 可以构建 AND 门
前面已经讲过,NAND 本质上就是 AND 的反结果。
所以,如果我们把 NAND 的输出再反转一次,就会得到 AND。
第一个 NAND 门执行:
A NAND B
然后,再使用另一个 NAND 门,把它当作 NOT 门,对第一个 NAND 的结果进行反转。
最终得到:
A AND B
因此,只需要两个 NAND 门,就可以构建出一个 AND 门。
这意味着 NAND 已经能够实现:
NOT
以及:
AND
接下来,还差另一个非常基础的逻辑操作。
4. NAND 也可以构建 OR 门
乍一看,OR 和 NAND 似乎差别很大。
但是在布尔逻辑中,我们可以使用 NOT 和 AND 来构建 OR。
这个关系来自著名的德摩根定律(De Morgan’s Law)。
从概念上可以表示为:
A OR B = NOT of NOT A AND NOT B
也就是说:
先对 A 取反。
再对 B 取反。
然后对两个反转后的信号进行组合。
因为 NAND 已经可以实现 NOT,也可以实现 AND,所以它同样可以实现 OR。
最终,只使用 NAND 门,我们就可以构建:
NOT
AND
OR
这就是整个问题的关键。
5. 为什么 NAND 被称为通用逻辑门?
AND、OR 和 NOT 是最基本的布尔逻辑运算。
许多更加复杂的逻辑功能,都可以通过组合这三种基本操作构建出来。
如果 NAND 可以重新实现 AND、OR 和 NOT,那么 NAND 也就可以进一步实现任何由 AND、OR、NOT 构成的布尔逻辑电路。
这就是为什么 NAND 被称为:
通用逻辑门(Universal Gate)
这里的“通用”,并不是说一个 NAND 门自己就可以完成所有工作。
它真正的含义是:
只要有足够多的 NAND 门,并且按照正确的方法连接,就可以实现任意布尔逻辑功能。
这赋予了 NAND 非常重要的理论能力。
一旦我们能够实现任意布尔逻辑,就可以开始构建计算机内部真正使用的各种电路。
6. 从 NAND 门到算术运算
考虑计算机最重要的工作之一:
二进制加法。
一个二进制加法器,可以使用 XOR、AND 和 OR 等逻辑门构建。
但是 XOR 本身也可以使用 NAND 门构建。
AND 和 OR 前面已经证明,同样可以用 NAND 门构建。
这意味着:
一个二进制加法器,最终完全可以只使用 NAND 门实现。
多个加法器还可以继续连接起来,从而对更大的二进制数字进行加法运算。
这些加法电路可以进一步成为**算术逻辑单元(Arithmetic Logic Unit,ALU)**的一部分。
ALU 可以执行很多基本运算,例如:
加法,
减法,
逻辑 AND,
逻辑 OR,
比较,
以及其他基础计算。
于是,我们就可以看到这样一条逐渐向上的构建路径:
NAND 门 → 逻辑功能 → 加法器 → ALU
到这里,我们已经开始接近处理器内部最重要的组件之一了。
7. NAND 门也可以构建存储和控制逻辑
计算机不仅需要进行计算。
它还需要保存信息。
某些特殊的逻辑门连接方式,可以让电路保持某种状态。
这类电路进一步发展,就可以形成:
锁存器,
触发器,
寄存器,
以及各种存储结构。
这些电路同样可以使用 NAND 门构建。
例如,一个简单的锁存器,就可以通过两个交叉连接的 NAND 门实现。
这意味着 NAND 门不仅可以参与计算,还可以参与二进制信息的存储。
基于 NAND 的逻辑还可以构建:
多路选择器,
译码器,
计数器,
控制电路,
寄存器选择逻辑,
以及许多其他数字组件。
这些组件还可以继续组合成更大的系统。
于是,整个层次结构可以变成:
NAND 门
↓
逻辑门
↓
加法器、多路选择器、译码器和触发器
↓
寄存器、ALU 和控制逻辑
↓
从理论上来说,一台计算机所需要的全部数字逻辑,都可以按照这样的方式构建出来。
8. 真实计算机真的只使用 NAND 门吗?
通常并不是。
现代处理器并不是通过人工连接数十亿个完全相同的 NAND 门符号设计出来的。
真实的芯片设计会使用很多不同类型的优化电路结构。
设计人员会根据不同需求选择合适的电路,例如:
速度,
功耗,
芯片面积,
时序,
以及制造工艺。
在晶体管层面,现代处理器的真实电路,也远比入门教材中的简单逻辑图复杂得多。
因此,当我们说:
一台计算机可以完全使用 NAND 门构建
这里主要讨论的是一种逻辑能力。
它说明 NAND 门本身具有足够强的表达能力,可以重新实现数字计算所需要的全部布尔逻辑。
但这并不意味着,在真实芯片制造中,只使用 NAND 门一定是效率最高或者性能最好的方案。
Conclusion
NAND 门是数字电子技术中最简单的基本组件之一。
它的行为非常容易描述:
只有当两个输入都是 1 时,输出才是 0。
但当大量 NAND 门连接在一起以后,就会产生非常强大的能力。
NAND 可以构建 NOT。
NAND 可以构建 AND。
NAND 可以构建 OR。
在这些基本逻辑操作之上,我们又可以继续构建更加复杂的数字电路。
这些电路可以进一步变成:
加法器,
多路选择器,
译码器,
触发器,
寄存器,
ALU,
以及控制逻辑。
最终,这些组件还可以组合成一个处理器。
因此,当我们说 NAND 是一种通用逻辑门时,其实是在描述数字计算机背后一个非常重要的基本原理:
极其复杂的计算系统,可以从极其简单的逻辑组件中逐步构建出来。
现代 CPU 可能包含数十亿个晶体管,并拥有极其复杂的内部结构。
但在这些复杂结构的最底层,依然是围绕两个状态展开的简单逻辑运算:
0 和 1。
而 NAND 门,拥有表达这些逻辑运算所需要的全部能力。
下一篇数字逻辑教程,我们继续来看另一个非常重要的逻辑门:
为什么 XOR 门在计算机内部如此重要?
