📖 人物与词源:乔治·布尔(George Boole) 1854 年,自学成才的英国数学家乔治·布尔出版了《思维规律的研究》,提出:逻辑推理可以像算术一样用符号演算,其中变量只有两个值——真(true)和假(false)。他当时大概想不到,这套「思维代数」会在一个多世纪后,成为每一台计算机的地基。Boolean(布尔)这个形容词,就是他的名字。
🎯 本章学习目标
- 理解「布尔逻辑」:为什么「真/假」能成为一种可运算的代数。
- 掌握与(AND)、或(OR)、非(NOT)三种基本门的真值表。
- 看懂晶体管如何搭出「非门」和「与非门」。
- 理解「与非门完备性」:一个门为什么能搭出所有其他门。
- 会用德摩根定律对逻辑表达式「整体取反、算符互换」,并用于工程告警逻辑的翻译。
- 能从工程需求(联锁、告警、表决)出发,写出真值表,再落到门级组合。
4.1布尔逻辑:真与假也能做代数
计算机处理的是「二选一」——0 和 1。但光有 0 和 1 还不够,我们要能对它们做运算。早在 19 世纪,一位英国数学家就为「真/假」这类两值问题建立了一套完整的代数,这就是 布尔代数(Boolean algebra)。
布尔代数的核心是:变量只有 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:
| 定律 | 或版本 | 与版本 |
|---|---|---|
| 交换律 | A+B = B+A | A·B = B·A |
| 结合律 | (A+B)+C = A+(B+C) | (A·B)·C = A·(B·C) |
| 分配律 | A·(B+C) = A·B+A·C | A+B·C = (A+B)·(A+C) |
| 幂等律 | A+A = A | A·A = A |
| 互补律 | A+Ā = 1 | A·Ā = 0 |
| 零一律 | A+1 = 1 | A·0 = 0 |
| 吸收律 | A+A·B = A | A·(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)。
与门(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。
把本章认识(和打过照面)的门整理成一张速查表,随身携带:
| 门 | 表达式 | 一句话行为 | 工程角色 |
|---|---|---|---|
| 非 NOT | NOT A | 翻面:0↔1 | 信号取反、泡泡 |
| 与 AND | A AND B | 都 1 才 1 | 安全联锁 |
| 或 OR | A OR B | 有 1 就 1 | 故障汇总 |
| 与非 NAND | NOT(A AND B) | 有 0 就 1,全 1 才 0 | 万能积木 |
| 或非 NOR | NOT(A OR B) | 全 0 才 1 | 镜像万能积木 |
| 异或 XOR | A ≠ 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 | 与 AND | 或 OR | 非 NOT(A) |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 0 |
| 1 | 1 | 1 | 1 | 0 |
真值表看起来简单,却是数字电路设计的第一工具:任何复杂的逻辑,都可以先用真值表精确描述,再一步步转化成电路。后面每一章,你都会反复见到它。
核心思想 真值表 = 逻辑的「完全说明书」。它把「输入的所有组合 → 对应输出」一张表列全,是设计和验证电路的基石。
输入变多,表怎么长?——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 型管(栅压高时导通)。输出点接在两者之间。
顺便收编两个高频黑词:「上拉」指把输出点拉向电源(高电平),「下拉」指把输出点拉向地(低电平)——上面这只 P 管、下面这只 N 管干的就是这两件事。CMOS 里由晶体管亲自出面拉;更简单的电路也可以用电阻拉,代价是持续漏电。以后见到「上拉电阻」「下拉管」,默念「把电位拉向哪一边」就不会迷路。
关键在「一个通,另一个就断」的接力逻辑:
- 输入 A = 1(高电压):N 管导通、P 管截止。输出 Y 通过 N 管连到「地」(0),所以 Y = 0。
- 输入 A = 0(低电压):P 管导通、N 管截止。输出 Y 通过 P 管连到「电源」(1),所以 Y = 1。
输入被翻了个面——这就是非门。
与非门(NAND):先与后非
与非门(NAND)就是「与门 + 非门」的组合:只有当两个输入都为 1 时输出才为 0,其余情况输出都是 1。它等于把与门的结果取反。为什么单挑它出来讲?因为下一节你会发现——它是万能的门。
| A | B | A AND B | NAND(取反后) |
|---|---|---|---|
| 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 |
| 1 | 0 | 0 | 1 |
| 1 | 1 | 1 | 0 |
与非门的晶体管版:「上并下串」
非门是 1 个输入对 2 个管子;与非门有 2 个输入,晶体管数也翻倍:2 个 P 管 + 2 个 N 管,共 4 只。结构口诀是「上并下串」:两个 P 管并联在电源与输出之间,两个 N 管串联在输出与地之间。输入 A 接「一个 P 管栅极 + 一个 N 管栅极」,输入 B 接另外一对。为什么恰好这么接?把 4 种输入组合代进去走一遍,你会看到「并联/串联」与「都/任一」的对应关系天衣无缝——这正是下一道例题要做的。
打个对台:或非门(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)。
看它是怎么做到的:
- 搭非门:把与非门的两个输入接成同一个信号(A 和 A)。于是输出 = NOT(A AND A) = NOT A。
- 搭与门:先 NAND,再过一个「非门」(也由 NAND 搭成)取反,就还原成 AND。
- 搭或门:由德摩根定律,A OR B = NOT( NOT A AND NOT B ),用三个 NAND 就能搭出来。
幕后的功臣:德摩根定律
三条搭法里最费解的是「或门怎么来的」,它的底气是布尔代数里最重要的一条变换规则——德摩根定律(De Morgan's laws):
| A | B | NOT(A AND B) | (NOT A) OR (NOT B) |
|---|---|---|---|
| 0 | 0 | 1 | 1 |
| 0 | 1 | 1 | 1 |
| 1 | 0 | 1 | 1 |
| 1 | 1 | 0 | 0 |
一句话概括:「非」横穿 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 搭出或门」水到渠成。
📐 例题 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 数 | 搭法要点 |
|---|---|---|
| 非门 NOT | 1 | 两输入短接:NAND(A, A) |
| 与门 AND | 2 | NAND 后再取反一次 |
| 或门 OR | 3 | 先各自取反,再 NAND(德摩根) |
| 与非门 NAND | 0 | 它本身就是 |
📐 例题 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 节的传播延迟,在这里落成了参数表上的两个数字。
本章小结
- 布尔代数在 {0,1} 上做运算,是连接「开关」与「计算」的桥梁。
- 三种基本门:非(取反)、与(都 1 才 1)、或(有 1 就 1)。
- 真值表穷尽所有输入组合,是逻辑电路的设计与验证工具。
- 非门由「上 P 下 N」两个 MOSFET 接力搭成,输入一变输出必反。
- 与非门是功能完备的「万能门」,单靠它就能搭出一切逻辑。
- 德摩根定律:「非」横穿 AND/OR 时算符互换——NOT(A AND B) = Ā OR B̄,NOT(A OR B) = Ā AND B̄。翻译「整体否定」类需求(红灯不亮、禁止启动)全靠它。
- n 个输入的完整真值表共 2ⁿ 行(3 输入 8 行、4 输入 16 行);行数指数增长,组合一多就交给程序穷举。
读完本章,你应该能……
- 解释「布尔代数」是什么,以及乔治·布尔是谁。
- 默写出与、或、非三种门的真值表。
- 说明「真值表」为什么能完整定义一个逻辑门。
- 描述两个 MOSFET 如何接力实现非门。
- 解释为什么「与非门是万能门」,并举一个例子。
- 用德摩根定律把「NOT(超温 AND 超压)」翻译成日常语言,并说清算符为什么互换。
- 说出 3 输入、4 输入的真值表各有多少行,并解释为什么是 2ⁿ。
思考题
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 就能搭出与门。既然非、与、或都造得出来,一切逻辑就都造得出来。