← 返回知识卡片总目录

DS1号 · 自学教材系列 | 计算机软硬件

第 4 章 逻辑门:与、或、非

上一章,我们把「开关」落实成了晶体管。但单个开关只能表达一个 bit,还不能「做判断」。这一章,我们把开关拼起来,组成能对 0 和 1 做运算的最小电路——逻辑门。它们是计算机一切「思考」的细胞。

🎯 本章学习目标

  1. 理解「布尔逻辑」:为什么「真/假」能成为一种可运算的代数。
  2. 掌握与(AND)、或(OR)、非(NOT)三种基本门的真值表。
  3. 看懂晶体管如何搭出「非门」和「与非门」。
  4. 理解「与非门完备性」:一个门为什么能搭出所有其他门。
  5. 会用德摩根定律对逻辑表达式「整体取反、算符互换」,并用于工程告警逻辑的翻译。
  6. 能从工程需求(联锁、告警、表决)出发,写出真值表,再落到门级组合。

4.1布尔逻辑:真与假也能做代数

计算机处理的是「二选一」——0 和 1。但光有 0 和 1 还不够,我们要能对它们做运算。早在 19 世纪,一位英国数学家就为「真/假」这类两值问题建立了一套完整的代数,这就是 布尔代数(Boolean algebra)。

📖 人物与词源:乔治·布尔(George Boole) 1854 年,自学成才的英国数学家乔治·布尔出版了《思维规律的研究》,提出:逻辑推理可以像算术一样用符号演算,其中变量只有两个值——真(true)和假(false)。他当时大概想不到,这套「思维代数」会在一个多世纪后,成为每一台计算机的地基。Boolean(布尔)这个形容词,就是他的名字。

布尔代数的核心是:变量只有 0 和 1 两个值,运算规则只有少数几条。我们把「真」记作 1,「假」记作 0——于是「逻辑」和「二进制」完美合一。

核心思想 布尔代数 = 只在 {0, 1} 上做运算的代数。它把「且、或、非」这些日常逻辑判断,变成了可以用电路实现的数学运算。这是连接「开关」与「计算」的那座桥。

它和「普通代数」哪里不一样?

刚接触布尔代数,最容易犯的错是把它当成算术。试试这个「怪题」:在布尔代数里,1 + 1 = 1,不是 2,也不是 10(二进制进位)。这里的「+」是「或」:两个真命题,任一为真结果就为真;两个都真,结果还是真——「真上加真」并不会更真。同理,1 × 1 = 1、1 + 0 = 1、0 × 1 = 0,乘法对应「与」。数值没有大小、不能累加,只有「真/假」两种状态。一旦习惯这一点,布尔运算就会变得像查表一样确定。

布尔代数把「算术」从数值搬到了逻辑上:
「与」≈ 乘法(1×1=1,有 0 得 0)  「或」≈ 加法封顶(1+1=1,有 1 得 1)  「非」≈ 没有算术对应物,是纯粹的「翻面」

为什么这套「怪代数」能落地成电路?因为布尔变量只有两个值,而上一章我们看到,MOSFET 这类开关恰好也只有两种稳定状态——导通与截止、高与低、1 与 0。变量的取值范围和开关的状态范围严丝合缝,这是布尔代数能被电路「实体化」的根本原因。

📖 人物与时刻:香农的硕士论文(1937) 把布尔代数和电路正式接通的,是 21 岁的克劳德·香农(Claude Shannon)。他在麻省理工的硕士论文《继电器与开关电路的符号分析》里证明:继电器的串并联,恰好对应布尔代数的「与」「或」「非」——从此,设计电路可以先在纸上做逻辑演算。这篇被称为「20 世纪最重要的硕士论文」的作品,开启了数字电路设计的时代。香农后来还给「信息」定了量(下一章会再遇到他)。

从纸面到金属:真假即高低电压

布尔的「真/假」落到电路里,就是我们熟悉的高电平/低电平。工程上通行的是正逻辑约定:高电压代表 1,低电压代表 0——上一章 CMOS 非门里 Vdd=1、GND=0 用的正是这一套。(用低电压代表 1 的「负逻辑」也存在,本套书不采用。)为什么高/低能稳稳当当地表达真/假?第 2 章讲过噪声容限:CMOS 高电平至少 4.5V、低电平至多 0.5V,判 1 判 0 各有约 1V 的余量,中间的「无人区」由门电路主动制造。逻辑世界的「非黑即白」,是靠电路的电压纪律买来的。

📐 例题 1 给逻辑表达式求值

某测试台的动作条件写作布尔表达式:Y = (A AND B) OR (A AND C)。其中 A 表示「电源已接通」,B 表示「油泵已启动」,C 表示「手动旁路已接通」。当 A = 1、B = 0、C = 1 时,Y 是多少?这个台子在什么条件下会动作?

思路 布尔表达式求值和算术一样:先乘后加,先算括号。只是要记住 AND 的规则是「有 0 得 0」,OR 的规则是「有 1 得 1」。

解 第一步,代入 A=1、B=0、C=1:
A AND B = 1 AND 0 = 0(有 0 得 0)
A AND C = 1 AND 1 = 1(都 1 才 1)
第二步,做 OR:Y = 0 OR 1 = 1(有 1 就 1)。
所以 Y = 1,台子会动作。再读一遍表达式的含义:「电源通 且 油泵转」或者「电源通 且 旁路接」,即:电源是前提,油泵与旁路二选一。顺带验证另一种情形 A=0、B=1、C=1:两个 AND 都是 0,Y = 0——电源没通,谁来都不动作,符合直觉。

答:Y = 1。动作条件是「A 通 且(B 或 C 至少一个)」。 ⚠ 易错点:不要把 AND 算成「1 AND 0 = 1」——AND 是「都真才真」,一个假就全盘假。

延伸:布尔代数与集合论是同一张脸

布尔代数与集合论结构相同:AND 对应「交集」(两个集合都包含的元素),OR 对应「并集」(任一集合所含),NOT 对应「补集」(全集里剩下的部分)。文氏图里两个圆圈相交的那块,就是 A AND B。这层对应很有用:对某条逻辑表达式拿不准时,把它翻译成集合语言在图上画一画,对错常常一眼可见。布尔当年研究的是概念与类,{0,1} 在他那里只是特例;香农把这个特例焊到电路上,反而成就了整门数字技术。

布尔代数的「九九表」:常用运算律

算术有九九乘法表,布尔代数也有自己的口诀。设 Ā 表示 NOT A,「+」表示 OR、「·」表示 AND:

布尔代数常用运算律(第 5 章化简电路的主要工具)
定律或版本与版本
交换律A+B = B+AA·B = B·A
结合律(A+B)+C = A+(B+C)(A·B)·C = A·(B·C)
分配律A·(B+C) = A·B+A·CA+B·C = (A+B)·(A+C)
幂等律A+A = AA·A = A
互补律A+Ā = 1A·Ā = 0
零一律A+1 = 1A·0 = 0
吸收律A+A·B = AA·(A+B) = A

特别看一眼分配律的或版本 A+B·C = (A+B)·(A+C)——它在普通代数里完全不成立(算术的 a+bc ≠ (a+b)(a+c)),但在布尔代数里八种组合逐行验证成立:逻辑没有大小,只有真假的叠加。这张表不必背,第 5 章化简电路时它会自然长在手上——比如吸收律能把 A+A·B 直接缩成 A,一半的电路就省下来了。

几条定律值得单独点名:幂等律 A+A=A 说「真加上真还是真」——重复的告警条件不必装两盏灯;互补律 A+Ā=1 说「命题与它的否定至少一个成立」——正是上一章补码圆环「非负数右半圈、负数左半圈」那种二分世界的逻辑版;吸收律则专门砍冗余电路。定律不是装饰,每一条都对应一处真实的省工。

4.2三种基本门:与、或、非

布尔代数里最基本的三种运算,对应三种最基本的电路,统称 逻辑门(logic gate)。「门」这个名字很形象:输入信号从一侧进来,经过「门」的判断,决定输出是 0 还是 1。

先回答一个常见的疑问:变量为什么只留 0 和 1 两个值?电压明明可以分三档、四档,信息量更大。三值逻辑确实被造出来过——第 2 章介绍过的三进制计算机 Сетунь 性能不俗,但工程代价压倒了信息优势:状态越多,各状态之间的判别窗口越窄、噪声容限越小,每种门的组合数还翻着倍地涨。二值是把「容错」推到极致的选择——宁可每个符号少带点信息,也要每次判断都稳如磐石。本章所有内容都建立在这个前提上:每个变量、每根线、每个门,都只认 0 和 1。

非门(NOT):取反

非门最简单:输入 0 输出 1,输入 1 输出 0。它把信号「翻个面」,所以也叫反相器(inverter)。

非门符号与输入输出 非门三角形符号,输入A经过取反,输出为A的相反值。 A Ā(A 的取反) A=0 → Ā=1;A=1 → Ā=0
图 4-1非门(反相器):圆圈代表「取反」,输出永远是输入的相反值。

与门(AND):都真才真

与门对应日常的「且」:只有两个输入都是 1,输出才是 1;只要有一个是 0,输出就是 0。好比「门要两把钥匙都插上才开」。

或门(OR):有真就真

或门对应日常的「或」:只要两个输入里有任意一个是 1,输出就是 1;只有两个都是 0,输出才为 0。好比「两扇门,打开任意一扇都能进去」。

🧠 一句话记忆 非 = 翻面;与 = 都 1 才 1;或 = 有 1 就 1。用英文记更顺:AND 要「all」、OR 要「any」。

看懂「门」的符号语言

翻开任何一份数字电路图,你都会看到三种基本形状:D 形(平背圆弧,代表与门)、盾形(尖背圆弧,代表或门)、三角加小圆圈(非门)。符号的规律极其简单:小圆圈(泡泡)= 取反。D 形加个泡泡就是与非门(NAND),盾形加个泡泡就是或非门(NOR),三角加个泡泡就是非门。记住「形状定功能、泡泡定取反」,你就能看懂绝大多数电路图,不必死记硬背每种门的画法。

另外,门的输入不止两个。工业标准库里有两输入、三输入、四输入乃至八输入的与门、或门——符号还是那个形状,只是多几条「腿」;行为规则不变,3 输入 AND 就是「三个都 1 才 1」。多输入门内部仍是标准结构的组合(或直接做成多管 CMOS 阵列),所以看图时不必被「腿多」吓住。

还有一件事值得留心:中文里说「或」,多数时候指的是二选一——「咖啡或茶」,默认不能两个都要。但逻辑里的「或」是兼容或(inclusive OR):两个都为真时,结果照样为真。想要「二选一、不许多」的逻辑,得用另一种门——异或门(XOR):A ≠ B 时输出 1,A = B 时输出 0。它专门负责「不同才真」的判断,比如比较两个 bit 是否一致。XOR 我们先记下名字,它在本套书后面讲加法器和校验时会反复登场。

XOR 的「异」就是「相异」:A、B 相异才输出 1。给你一个马上能用的例子:两台设备各自报送同一个状态 bit,把两个 bit 送进 XOR,输出 1 就说明两边数据不一致,触发复检——它天生是最小的「不一致探测器」。第 7 章加法器、第 9 章校验位,全靠它串场。

顺带注意:XOR 没有专属自己的四管 CMOS 结构——它由 AND、OR、NOT 组合而成。这也从侧面印证了下一节的断言:几种基本门,搭得出一切。

📐 例题 2 从需求到门:三种门各管一件工程事

某试验台有三条控制逻辑:
① 「电机允许启动 = 台架锁定 且 液压就绪」;
② 「告警灯亮 = 油温超限 或 油压超限」;
③ 「手动模式有效 = 非自动模式」。请为每条逻辑选出对应的门,并对输入组合逐一预判输出。

思路 「且」→ AND,「或(任一)」→ OR,「非」→ NOT。然后分别代入 0/1 组合验证。

解 ① 是 AND:锁定 L=1 且就绪 R=1 才启动。四组输入:L=0,R=0→0;L=0,R=1→0;L=1,R=0→0;只有 L=1,R=1→1。四个组合只有一个放行——与门天然是「安全联锁」:任何一环掉链子都拦下。
② 是 OR:超温 T、超压 P 任一为 1 灯就亮:T=0,P=0→0;T=0,P=1→1;T=1,P=0→1;T=1,P=1→1。四组里三组告警——或门天然是「故障汇总」:宁滥勿缺,一个异常也别漏。
③ 是 NOT:自动信号 A=1 时手动无效;A=0 时手动模式开放。输出永远是输入的反面。

答:①AND(4 组里 1 组放行,联锁用);②OR(4 组里 3 组亮灯,告警用);③NOT(信号翻面)。 ⚠ 易错点:把「或」误当二选一——工程告警恰恰要求「两个都超也必须亮」,兼容或才是对的;若真要二选一,得用 XOR。

把本章认识(和打过照面)的门整理成一张速查表,随身携带:

常用逻辑门一览(本套书全部用到)
门表达式一句话行为工程角色
非 NOTNOT A翻面:0↔1信号取反、泡泡
与 ANDA AND B都 1 才 1安全联锁
或 ORA OR B有 1 就 1故障汇总
与非 NANDNOT(A AND B)有 0 就 1,全 1 才 0万能积木
或非 NORNOT(A OR B)全 0 才 1镜像万能积木
异或 XORA ≠ B不同才 1比较、校验

前五种本章都正面讲过;XOR 在 4.2 打过照面。它们之间的换算关系(谁能用谁搭出来),4.5 节会给出完整答案。

看这张表还有个习惯值得养成:扫一眼「输出 1 的行数」。AND 只在 1 行输出 1(最挑剔),OR 在 3 行输出 1(最宽容),XOR 恰好一半一半(2 行)——同一张 4 行真值表,输出 1 的分布就是门的「性格」。以后拿到陌生的真值表,先数输出 1 有几行、再看它们落在哪些组合上,门的行为往往一眼定性;这一手「先数后读」,下一章设计组合逻辑时天天用得上。

4.3真值表:穷尽所有可能

逻辑门的行为,可以用一张 真值表(truth table)完全说清:把输入的所有组合都列出来,对应写出输出。因为输入只有 0/1,两个输入的组合一共就 2×2 = 4 种,一张小表就能「穷尽一切」。

三种基本门的真值表(A、B 为输入,Y 为输出)
AB与 AND或 OR非 NOT(A)
00001
01011
10010
11110

真值表看起来简单,却是数字电路设计的第一工具:任何复杂的逻辑,都可以先用真值表精确描述,再一步步转化成电路。后面每一章,你都会反复见到它。

核心思想 真值表 = 逻辑的「完全说明书」。它把「输入的所有组合 → 对应输出」一张表列全,是设计和验证电路的基石。

输入变多,表怎么长?——2ⁿ 行

每个输入都有 0/1 两种取值,彼此独立,所以 n 个输入的完整真值表共 2ⁿ 行:2 输入 4 行,3 输入 8 行,4 输入 16 行。行数随输入个数指数增长——这是真值表「穷尽一切」的威力,也是它的软肋:输入到十几二十个时,手工列全一张表已经不现实,工程师就要改用化简法(第 5 章会见到)。但在本套书面对的 2~4 输入场景,列真值表永远是最可靠的第一步:不怕遗漏、不怕想偏,照表施工就行。

「2ⁿ」从哪儿来?每个新输入都是一个独立的「0/1 二选一」:每多一个输入,就要把原有每一行各复制一次、一次填 0、一次填 1——行数翻倍。2 输入 4 行,3 输入 8 行,4 输入 16 行,逐级翻番。写程序穷举时,两层 for 循环恰好把这件事做干净——下面的代码例题就带你走一遍。

真值表和门电路之间可以双向翻译:给需求列真值表,就能照表搭出门电路;反过来,拿到一张陌生的门电路图,逐组代入输入画出真值表,它的行为也立刻原形毕露。下面这道例题走一遍「从需求到真值表」的全过程。

📐 例题 3 三人表决器:从需求列真值表

某机务评审小组由三人组成,一项检查记录是否「通过」,采用多数决:两人及以上同意即通过。以三人意见 A、B、C 为输入(1=同意),表决结果 M 为输出(1=通过)。请列出完整真值表,并数出输出为 1 的组合数。

思路 3 个输入,共 2³ = 8 行,按二进制计数顺序从 000 排到 111,一行不漏。判定规则只有一条:数「1」的个数,≥2 即通过。

解 逐行清点同意人数:
000(0 人)→ 不通过,M=0; 001(1 人)→ M=0; 010(1 人)→ M=0;
011(2 人)→ 通过,M=1; 100(1 人)→ M=0; 101(2 人)→ M=1;
110(2 人)→ M=1; 111(3 人)→ M=1。
输出为 1 的共 4 行:011、101、110、111——恰好是「至少两个 1」的全部组合。注意 111 这行:三人全票也通过,说明表决用的是「兼容或」式多数,而不是「恰好两人」。

答:8 行真值表中 4 行通过(011、101、110、111),4 行否决。 ⚠ 易错点:漏行——3 输入必须列满 2³=8 行,从 000 到 111 按序写最不易漏;另外别把 111 漏掉或排除,三人全同意当然通过。

真值表不止能「验」,还能「翻」——把表中输出为 1 的行各写成一个「与项」,再用「或」连起来,就得到这个逻辑的表达式。以上面的表决器为例,输出为 1 的前三行各对应一个「两人同意」的与项:011 对应 B·C,101 对应 A·C,110 对应 A·B;最后一行 111(三人全同意)已被前三项覆盖——三人全同意时,任何「两人组合」自然都同意。于是表决器可以写成 M = A·B + B·C + A·C,读作「任意两人同意即通过」。这个把真值表翻译成表达式的方法叫「最小项之和」,是下一章从表走向电路的正式路线,这里先见它一面。

把本章过手的方法收拢成一条四步流水线:① 定义变量(明确 1 代表什么);② 列全 2ⁿ 行真值表;③ 读表写出表达式(最小项之和);④ 用门实现,并逐行验证。第 ③④ 步之间还藏着一门手艺——化简:同一个真值表可以写出许多等价表达式,电路代价却天差地别;怎样用最少的门、最短的延迟实现同一张表,正是下一章的正题。

还有一句行规:四步里的「验证」最常被新手省略,工程上却恰恰相反——电路每改一次,就把真值表对照重跑一遍,这是防止「改一处、坏两处」的最低成本保险。

📐 例题 4 用程序替你列真值表(代码例题)

手工列真值表易漏易错,让程序来穷举:对两个输入 A、B,把 AND、OR、XOR 三种运算的真值表一次性打印出来。

思路 两个嵌套的 for 循环恰好穷举 2×2=4 种组合;^ 是 Python 的异或运算符,其余 & | 就是与、或。

解 运行下面的程序:

print("A B | AND OR XOR")
for A in (0, 1):
    for B in (0, 1):
        print(f"{A} {B} |  {A & B}    {A | B}    {A ^ B}")

实际输出(可以逐行核对与 4.2 节的记忆口诀):

A B | AND OR XOR
0 0 |  0    0    0
0 1 |  0    1    1
1 0 |  0    1    1
1 1 |  1    1    0

答:4 行输出与手推完全一致;XOR 一列的最后一行是 0——两输入相同异或为 0,「不同才真」。 ⚠ 易错点:Python 中 & | ^ 是位运算符,对 0/1 恰好就是逻辑与、或、异或;但写 and or 则不返回 0/1 而返回操作数本身,混用容易出隐蔽 bug。

4.4晶体管如何搭出「非门」和「与非门」

逻辑门不是抽象符号,它是由真实晶体管搭出来的。最容易理解的是用 MOSFET 搭非门。

非门:一个「上拉」加一个「下拉」开关

一个非门由两个 MOSFET串联「接力」组成:上面一个 P 型管(栅压低时导通),下面一个 N 型管(栅压高时导通)。输出点接在两者之间。

CMOS 非门电路 上方P管接电源,下方N管接地;输入A接两个栅极;输出Y取两者之间。A为高时N管导通、P管截止,Y接地为0;A为低时相反,Y接电源为1。 Vdd(电源 = 1) P 管 Y(输出) N 管 GND(地 = 0) 输入 A
图 4-2CMOS 非门:A 为高时,N 管导通、P 管截止,Y 被拉低到 0;A 为低时相反,Y 被拉高到 1。

顺便收编两个高频黑词:「上拉」指把输出点拉向电源(高电平),「下拉」指把输出点拉向地(低电平)——上面这只 P 管、下面这只 N 管干的就是这两件事。CMOS 里由晶体管亲自出面拉;更简单的电路也可以用电阻拉,代价是持续漏电。以后见到「上拉电阻」「下拉管」,默念「把电位拉向哪一边」就不会迷路。

关键在「一个通,另一个就断」的接力逻辑:

输入被翻了个面——这就是非门。

与非门(NAND):先与后非

与非门(NAND)就是「与门 + 非门」的组合:只有当两个输入都为 1 时输出才为 0,其余情况输出都是 1。它等于把与门的结果取反。为什么单挑它出来讲?因为下一节你会发现——它是万能的门。

与非门 NAND 真值表
ABA AND BNAND(取反后)
0001
0101
1001
1110

与非门的晶体管版:「上并下串」

非门是 1 个输入对 2 个管子;与非门有 2 个输入,晶体管数也翻倍:2 个 P 管 + 2 个 N 管,共 4 只。结构口诀是「上并下串」:两个 P 管并联在电源与输出之间,两个 N 管串联在输出与地之间。输入 A 接「一个 P 管栅极 + 一个 N 管栅极」,输入 B 接另外一对。为什么恰好这么接?把 4 种输入组合代进去走一遍,你会看到「并联/串联」与「都/任一」的对应关系天衣无缝——这正是下一道例题要做的。

CMOS 与非门:上并下串 两个P管并联在电源与输出Y之间,两个N管串联在Y与地之间;输入A接左P管和上N管栅极,输入B接右P管和下N管栅极。 Vdd(电源 = 1) P 管 P 管 Y(输出) N 管 N 管 GND(地 = 0) A B P 管并联在上 N 管串联在下
图 4-3CMOS 与非门「上并下串」:P 管任一导通就把 Y 拉向电源,N 管必须全部导通 Y 才能落地——这恰好实现了 NAND 的真值表。

打个对台:或非门(NOR)的 CMOS 结构恰好倒个个儿——上串下并:P 管串联在电源与输出之间,N 管并联在输出与地之间。为什么互换得如此整齐?NAND 要「N 管都导通才拉低」,所以 N 走串联;NOR 要「N 管任一导通就拉低」,所以 N 走并联——串联配「都」,并联配「任一」,规则完全对称。这也顺带解释了工艺偏爱:P 管里的空穴跑得比 N 管里的电子慢,NOR 把两只慢 P 管串在一条路上,速度吃亏;NAND 把慢家伙放进了并联路——同工艺下 NAND 更快、更省面积,这就是「工程师选 NAND 当标准积木」的电路层原因。

📐 例题 5 CMOS 与非门的四管接力分析

图 4-3 的 CMOS 与非门一共用了几只晶体管?请分析输入 A=1、B=1 和输入 A=0、B=1 两种情形下,四只管子各自的通断状态与输出 Y 的值,并说明稳态时电源到地有没有直流通路。

思路 记住两条规则:N 管「栅高导通」、P 管「栅低导通」;串联「一断全断」、并联「一通就通」。先判断 N 串(下拉路)再判断 P 并(上拉路)。

解 晶体管数:2 个 P 管 + 2 个 N 管 = 4 只。
情形一 A=1、B=1:两只 N 管栅极都是高,都导通——串联成通路,Y 接地 → Y = 0。两只 P 管栅极都是高,都截止——并联的两条上拉路全断。与非门真值表里唯一的「00 组合输出 0」就是这么来的。
情形二 A=0、B=1:N 管 A 栅极是低 → 截止,串联路「一断全断」,Y 落不了地;P 管 A 栅极是低 → 导通,并联路「一通就通」,Y 被拉到电源 → Y = 1。(P 管 B 此时截止,但并联结构里有一条通路就足够。)
两种情形下,上拉路和下拉路总有一边是全断的——电源到地没有直流通路,稳态电流几乎为零。

答:4 只(2P+2N)。A=1,B=1 → N 串全通、P 并全断 → Y=0;A=0,B=1 → N 串被 N管A 掐断、P 并靠 P管A 接通 → Y=1;稳态无电源—地直流通路,静态功耗≈0。 ⚠ 易错点:① P 管方向别套反——它和 N 管相反,栅压「低」才导通;② 串联路上有一只管子截止整条路就断,并联路反过来——分析 CMOS 时先找「断」的那条边,最快。

门不是瞬时的:传播延迟

还有一件实物的事必须交代:信号穿过一个门不是瞬时的,需要一点时间——传播延迟(propagation delay),CMOS 门典型在皮秒到几十皮秒量级。单个门看着无所谓,但信号串联穿过十个门,延迟就乘十;下一章做多位加法器时,「低位算完、进位才传到高位」的进位延迟就是整机速度的瓶颈。名字先记住,第 5 章正面遭遇它。

顺带回答一个常见疑问:CMOS 静态几乎不耗电(上一章的结论),那电都花在哪儿?主要就花在这亿万次的开关翻转上——每次翻转都要给线路的寄生电容充放电,翻转越频繁、时钟越高,动态功耗越大。这就是同款处理器降频能显著省电的电路根源,也是数据中心把「每瓦性能」当第一指标的物理原因。

🧠 一句话记忆 非门 = 一上一下两个开关「对着干」,输入一变,输出必反。

4.5与非门的完备性:一个门搭出一切

这是本章最「震撼」的一节。数学家证明了:只用与非门(NAND)一种门,就能搭出非门、与门、或门——进而搭出任何逻辑电路。这种「用一个门搞定一切」的性质,叫 功能完备性(functional completeness)。

看它是怎么做到的:

幕后的功臣:德摩根定律

三条搭法里最费解的是「或门怎么来的」,它的底气是布尔代数里最重要的一条变换规则——德摩根定律(De Morgan's laws):

NOT(A AND B) = (NOT A) OR (NOT B)  |  NOT(A OR B) = (NOT A) AND (NOT B)
德摩根定律第一条的真值表证明:两列逐行相同即等式成立
ABNOT(A AND B)(NOT A) OR (NOT B)
0011
0111
1011
1100

一句话概括:「非」横穿 AND/OR 时,算符要跟着互换——「非与」变「或非」,「非或」变「与非」。它为什么成立?用真值表一验便知:NOT(A AND B) 一列,与「NOT A OR NOT B」一列在全部 4 行上一模一样——两列完全相同,等式自然成立。德摩根定律是逻辑世界的「分配律」,后面化简表达式、翻译告警逻辑时都会反复用到。

把定律套进或门的搭法:A OR B = NOT(NOT A AND NOT B)。注意等号右边恰好是一个「与非门」的表达式——两个输入分别是 NOT A 和 NOT B,先 AND 再整体取反,正是 NAND 的定义。而 NOT A、NOT B 又各自能用「短接的 NAND」造出来。于是「三只 NAND 搭出或门」水到渠成。

用与非门搭出三种基本门 三个小图:非门用与非门两输入短接;与门用与非门加非门;或门用三个与非门。 非门:输入短接 Ā 或门:三个 NAND A OR B
图 4-4只用与非门就能搭出非门、与门、或门,所以与非门是「万能门」。

📐 例题 6 用与非门搭出或门:推导 + 逐行验证

只用与非门,搭出「或门」:要求输出满足 A OR B 的真值表(0,0→0;其余→1)。请给出接法、推导过程,并逐行验证。

思路 德摩根定律给出等式 A OR B = NOT(NOT A AND NOT B)。等号右边是「两个取反后的信号做 NAND」——NOT A 和 NOT B 各用一只短接的 NAND 生成,最后再 NAND 一次。共 3 只。

解 第一步,两只 NAND 输入端各自短接,得到 NOT A 与 NOT B(短接的 NAND 就是非门:NAND(A,A) = NOT(A AND A) = NOT A)。
第二步,把 NOT A、NOT B 送进第三只 NAND:输出 = NOT( NOT A AND NOT B )。
第三步,按德摩根定律展开:NOT( NOT A AND NOT B ) = A OR B——正是或门。
逐行验证(四组输入,左边是搭出的电路,右边是或门应有的行为):
A=0,B=0:NOT A=1,NOT B=1,NAND(1,1)=0 ↔ 0 OR 0 = 0 ✓
A=0,B=1:NOT A=1,NOT B=0,NAND(1,0)=1 ↔ 0 OR 1 = 1 ✓
A=1,B=0:NOT A=0,NOT B=1,NAND(0,1)=1 ↔ 1 OR 0 = 1 ✓
A=1,B=1:NOT A=0,NOT B=0,NAND(0,0)=1 ↔ 1 OR 1 = 1 ✓
四行全部一致,搭法成立。

答:3 只与非门:两只短接做取反,一只收尾做 NAND,等价于 A OR B。 ⚠ 易错点:最容易错在第一行的直觉——「输入都是 0,取反后都成 1,NAND(1,1) = 0」,这正是或门 00→0 的来源;若忘了 NAND 见「1 和 1」要输出 0,就会推出错误结果。

📐 例题 7 程序验证「NAND 搭或门」(代码例题)

用程序穷举验证上例的搭法:对 A、B 的全部四种组合,比较「(A NAND A) NAND (B NAND B)」与「A OR B」是否逐行相等。

思路 先用 lambda 定义与非门(仅当两输入全为 1 时输出 0),再双重循环穷举四种组合,逐行对照。

解 运行下面的程序:

nand = lambda x, y: 0 if (x and y) else 1   # 与非门:仅当 x、y 全为 1 时输出 0
print("A B | NAND搭出 | A OR B | 一致?")
for A in (0, 1):
    for B in (0, 1):
        built = nand(nand(A, A), nand(B, B))   # (A NAND A) NAND (B NAND B)
        print(f"{A} {B} |     {built}     |   {A | B}    |", "✓" if built == (A | B) else "✗")

实际输出:

A B | NAND搭出 | A OR B | 一致?
0 0 |     0     |   0    | ✓
0 1 |     1     |   1    | ✓
1 0 |     1     |   1    | ✓
1 1 |     1     |   1    | ✓

答:四种组合全部 ✓,程序验证与手推一致——三只 NAND 确实等价于一只或门。 ⚠ 易错点:lambda 里的条件表达式必须写成「全 1 才 0」;若写成 0 if (x or y) else 1 就变成了或非门(NOR),一行都对不上。

用与非门搭出各种门,各需要几只?
要搭的门需要的 NAND 数搭法要点
非门 NOT1两输入短接:NAND(A, A)
与门 AND2NAND 后再取反一次
或门 OR3先各自取反,再 NAND(德摩根)
与非门 NAND0它本身就是

📐 例题 8 德摩根定律实战:翻译维修手册里的「灯不亮」

某试验台规定:红灯亮 = 油温超限 且 油压超限(记超温为 T、超压为 P)。维修手册上写着:「红灯不亮,说明至少有一项不超限。」请用德摩根定律证明这句话,并列真值表核验;再推广:若「启动允许 = 三个舱门全关」,那么「禁止启动」等于什么?

思路 「红灯不亮」就是整体取反:NOT(T AND P)。对它套德摩根定律第一条:NOT 穿过去,AND 换成 OR。三变量同理。

解 第一步,翻译条件:NOT(T AND P) = (NOT T) OR (NOT P)——「非超温 或者 非超压」,也就是至少有一项不超限。手册的说法正确。
第二步,列真值表核验(两列应逐行相同):
T=0,P=0:红灯 = 0,不亮;「非超温或非超压」= 1 OR 1 = 1,成立 ✓
T=0,P=1:红灯 = 0;1 OR 0 = 1,成立 ✓
T=1,P=0:红灯 = 0;0 OR 1 = 1,成立 ✓
T=1,P=1:红灯 = 1,亮;0 OR 0 = 0,成立 ✓
四行全对,德摩根成立。
第三步,推广到三变量:NOT(A AND B AND C) = (NOT A) OR (NOT B) OR (NOT C)。若「启动允许 = 门₁关 且 门₂关 且 门₃关」,那么「禁止启动 = 门₁没关 或 门₂没关 或 门₃没关」——至少一扇门没关。取反穿过 AND 时算符换成了 OR,三个条件从「同时满足」翻转成「至少一个不满足」。

答:NOT(T AND P) = NOT T OR NOT P,手册说法正确;「禁止启动」= 三门中至少一扇未关。 ⚠ 易错点:取反穿过时必须互换算符——写成「非超温 且 非超压」就错了(那是 NOT(T OR P) 的展开式,含义变成「两项都不超限」)。一句话:非穿 AND 变 OR,非穿 OR 变 AND。

德摩根定律的价值远不止翻译手册,它是逻辑「等价变形」的总开关。往后有三种高频场景都靠它押阵:给整组条件取反(禁止、失效、灯不亮);把深层嵌套的 NOT 推到最内层;在 AND 型与 OR 型电路之间互换实现。见到「整体否定」就条件反射「算符互换」,这门手艺就算练成了。

顺带一提:与门的「孪生兄弟」或非门(NOR)同样功能完备——把上面的推导全部对称地翻转(NOR 短接即非门,两只 NOR 先各自取反再 NOR 就得到与门)。事实上,宇宙第一台真正的计算机所依赖的继电器逻辑,两种门都能胜任。工程师最终选 NAND 做标准积木,更多是工艺原因:同样工艺下 NAND 的 CMOS 版本比 NOR 更快、占硅面积更小。

「万能」的门槛:为什么 AND 和 OR 不够用?

「万能」这顶帽子不是谁都能戴。试试只用 AND 和 OR(不许用 NOT)能不能搭出非门?不能——而且有个漂亮的证明:任何只由 AND、OR 组成的表达式,把全部输入置 1 后输出必然是 1(1 AND 1 = 1,1 OR 1 = 1,怎么算都是 1);而非门在输入为 1 时必须输出 0。矛盾,所以 {AND, OR} 这个集合不完备,缺的是「能产生 0」的取反能力。NAND 和 NOR 之所以万能,正因为它们天生「输出里带反」——一只门同时握有取反和组合两股力量。完备的门槛并不低,而 NAND 恰好跨了过去。

最后把本章放进全局坐标:门是计算机的第一层积木——门拼成组合电路(加法器、选择器,下一章),组合电路加上时钟变成能记住状态的时序电路(第 6 章),时序电路再组织成 CPU 的运算器与控制器。回头看,本章的八道例题其实已经把「需求 → 真值表 → 门」这条路走了个来回;下一章,就让门开始「真正地做事」。

再感受一次尺度:一枚现代处理器里的晶体管以百亿计,但其中每一只的导通与截止,逻辑上都和本章例题里那只四管 NAND 一样朴素。数字世界的复杂性不在单个开关变复杂,而在同样简单的开关被重复了亿万次。硬件工程师用硬件描述语言(如 Verilog)写下逻辑,综合工具自动把它翻译成海量标准单元——这些单元绝大多数就是 NAND。

为什么这对工业如此重要? 因为生产一种门,比生产三种门简单太多。芯片制造厂只需在同一颗硅片上重复造出同一种 NAND 结构,就能通过布线拼出任意逻辑。这不仅简化了制造工艺,还让设计可以模块化、可复用。现代闪存(SSD)甚至直接用海量 NAND 结构来存数据——这个伏笔,第 10 章再揭开。

🧠 一句话记忆 与非门是「万能门」——只靠它一个,就能搭出非、与、或,进而搭出整台计算机。

辨析:扇入与扇出——门的「饭量」与「带动力」 读门电路数据手册时最先碰到这两个参数。扇入(fan-in)是一个门的输入端个数——NAND 做成 2 输入还是 8 输入;扇入不能无限加:以 NAND 为例,下方串联的 NMOS 管越多,导通时等效电阻越大,输出被拉低得越慢,8 输入的门已经明显拖沓,工程上高扇入逻辑常拆成两级树(两个 4 输入门拼一个 2 输入门),用多一级的延迟换回每级的干脆。扇出(fan-out)是一个门的输出能带动几个下游门——CMOS 静态下输入几乎不取电流,扇出的瓶颈不在「吸不吸得起电流」而在「充不放得动电容」:每个下游门都是一份负载电容,带 10 个就是 10 份并联,边沿被拖缓、传播延迟变差;手册上的「最大扇出」是「时序还兜得住」的上限,不是接上就能亮。一句话收拢:扇入说的是这扇门自己吃几路输入,扇出说的是它出门推得动几家下游——4.4 节的传播延迟,在这里落成了参数表上的两个数字。

本章小结

  1. 布尔代数在 {0,1} 上做运算,是连接「开关」与「计算」的桥梁。
  2. 三种基本门:非(取反)、与(都 1 才 1)、或(有 1 就 1)。
  3. 真值表穷尽所有输入组合,是逻辑电路的设计与验证工具。
  4. 非门由「上 P 下 N」两个 MOSFET 接力搭成,输入一变输出必反。
  5. 与非门是功能完备的「万能门」,单靠它就能搭出一切逻辑。
  6. 德摩根定律:「非」横穿 AND/OR 时算符互换——NOT(A AND B) = Ā OR B̄,NOT(A OR B) = Ā AND B̄。翻译「整体否定」类需求(红灯不亮、禁止启动)全靠它。
  7. n 个输入的完整真值表共 2ⁿ 行(3 输入 8 行、4 输入 16 行);行数指数增长,组合一多就交给程序穷举。

读完本章,你应该能……

思考题

1. 用「且」「或」的日常含义,解释为什么 AND 要「都 1 才 1」,OR 要「有 1 就 1」。

提示:AND=并且(两个条件都满足);OR=或者(任一条件满足即可)。

2. 一个 CMOS 非门,输入是高电压时,哪个管子导通?输出点接到哪?

提示:输入高 → N 管导通、P 管截止 → 输出通过 N 管接地 → 输出 0。

3. 只用与非门,怎么搭出一个非门?

提示:把与非门的两个输入接成同一个信号,NOT(A AND A) = NOT A。

4. 为什么「与非门完备性」对芯片制造如此重要?

提示:只需生产一种门结构即可拼出任意逻辑,简化制造、便于复用。

5. 异或门(XOR)和或门(OR)的真值表只差一行——差在哪一行?这条差异让 XOR 最适合做什么?

提示:差在 A=1、B=1 这一行——OR 输出 1(有 1 就 1),XOR 输出 0(A ≠ B 才输出 1,两输入相同则清零)。这让 XOR 天生是「比较器」:判断两个 bit 是否一致,第 7 章讲加法器、第 9 章讲奇偶校验时它都是主角。

6. 一个 4 输入的逻辑函数,完整真值表要列多少行?如果一个设计有 20 个输入呢?

提示:2⁴ = 16 行。20 输入是 2²⁰ ≈ 100 万行——真值表「穷尽一切」的威力在输入多时变成负担,所以工程上要用化简工具(第 5 章预告的卡诺图等)代替手工列表。

7. 只用「或非门 NOR」一种门,也能搭出一切吗?

提示:能——NOR 与 NAND 是镜像,同样功能完备:NOR 两输入短接就是非门(NOT(A OR A) = NOT A);由德摩根定律,A AND B = NOT(NOT A OR NOT B),用 3 只 NOR 就能搭出与门。既然非、与、或都造得出来,一切逻辑就都造得出来。