你搬进一栋老宅,客厅天花板挂着一盏复古吊灯,墙上并排有两个开关。房东留下一本泛黄的《接线秘籍》:同样的两个开关,用不同的“接线秘方”,灯会呈现出完全不同的明暗规律——有时两个都打开灯才亮,有时一开就亮,有时两个都打开灯反而灭了。这些秘方在数字世界里叫逻辑门:基本门(与、或、非)负责最朴素的判断,而复合门(与非、或非、同或)就像在基本判断之上叠加了“反转”或“配对”的魔法。本篇我们沿着秘籍一页页翻下去:先学会读“规则表”(真值表),再逐一认识三种复合门,搞懂为什么与非门能成为“万能积木”,并用它造出密码锁和记忆单元。你会发现,一盏灯的明灭,最终通向整个数字芯片的地基。
看懂复合逻辑,你就解锁了从“灯泡明灭”到“CPU 芯片”之间最重要的思维跳板——这也是数字电路设计、存储器和底层优化的共同语言,是 AI 从业者理解硬件加速器的基础。
可视化演示
展示NAND、NOR、XNOR三种复合逻辑门的真值表信号流、通用门完备性构建及CMOS晶体管级实现对比,交互切换三种模式。
本节配有交互动效(进入视口后自动加载,约 3KB)。
'+CAPS.mode1+'
概念入门
《接线秘籍》第一页写着一行“阅读约定”:开关向上拨记为 1,向下拨记为 0;灯亮记为 1,灯灭记为 0。客厅吊灯的状态,永远只取决于两个开关当前的数字组合——就像给灯写了一张只有 4 行的“规则表”。例如“只有当两个开关都向上时灯才亮”,其实就是这张表里唯一一行输出 1 的规则。
这张规则表在数字电路里有一个正式名字:真值表。任何一位“只会做 0/1 判断”的数字管家,判断依据都是真值表。上一讲你已经认识了三位最基础的管家——与门(两个都要“是”才放行)、或门(有一个“是”就放行)、非门(把结果反过来)。复合逻辑,就是把这几位的技能叠加:先做与或判断,再在输出端接一个非门,或者让多个门协同回答,从而生成全新的规则。
因为每个输入只有 0/1 两种取值,两个输入的全部组合只有 2²=4 种:00、01、10、11。真值表按这个固定顺序列出四种情况,再把输出列在右边。之后讲的与非门、或非门、同或门,本质上都是“真值表层面”的独特规则,而不是靠猜电路图得到的幻觉。约定俗成:1 表示成立、亮、高电平;0 表示不成立、灭、低电平。
读懂规则表,你就掌握了解读《接线秘籍》的语法:每一个秘方,不过是一张 4 行的小表。三种复合门,就是三张性格迥异的表情。
与非门
秘籍第七条写着“环保灯秘方”:只有当两个开关同时向上拨(都等于 1)时,灯反而熄灭;其余三种情况灯都亮着。房东在旁批注:两个开关分别代表“窗帘拉开”和“阳光充足”,当两者都成立时自然光足够,吊灯自动休假。这条“双开才灭、其余全亮”的规则,就是与非门(NAND)。
与非门的名字可以拆成“与 + 非”:先让两个输入做一次与运算,再把结果整体取反。它真正否定的,是“两个条件同时满足”这件事。真值表按 00、01、10、11 排列,输出列 1、1、1、0——只有一个组合输出 0,其余全是 1。等价的说法是:“只要有一个输入为 0,输出就是 1。”
工程里它最典型的用法是当“停止信号”:比如电梯门正在关闭(输入 1 表示正在关门),同时传感器检测到有人(输入 1 表示有人),此时与非门输出 0,触发立刻重新开门;只要“正在关门”或“有人”任一不成立,输出保持 1,门继续执行关门。表达式和等价式如下:
环保灯教会我们第一句复合逻辑心法:与非门是“默认开,双确认才关”。它这种“反着来”的个性,之后会成为万能门的主角。
- 先算与括号里 A·B 只有当 A=B=1 时才为 1,其余三种组合全是 0。
- 整体取反长横线把整个与运算的结果取反,所以 1,1 那一行输出 0,其余行输出 1。
- 等价展开根据德摩根定律(后面章节详述),整体取反等价于两个输入分别取反后再相加。
或非门
秘籍第九条写着“安心灯”:只有两个开关都向下拨(0,0)时,小夜灯才亮;任何一个开着,灯都灭。这就像巡夜保安的逻辑:只有当“门已锁好”和“走廊无人”都为真时,他才点亮那盏表示“放心”的绿灯;只要还有一点动静,指示灯就必须熄灭。
或非门(NOR)就是“先或后非”:两个输入只要有一个为 1,输出就是 0;只有输入全为 0 时才输出 1。按 00、01、10、11 排列的真值表输出列为 1、0、0、0,与与非门恰好镜像互补。它等价的说法是:“两边都取反后再相与”——两个输入都等于 0,结果才成立。
或非门是“全零检测”专家:当一组信号全部为 0 时输出 1。这在工程中常被用来做安全联锁、空闲状态检测、故障复位判断——比如设备的“急停状态”指示灯,只有当启动信号和运行信号都为 0 时才允许点亮。表达式如下:
安心灯与环保灯正好相反:一个“只要全 0 就亮”,一个“只要全 1 就灭”。规则越有个性,对应的工程巧思往往越精确。
- 先算或括号里 A+B 只要有一个 1 结果就是 1,只有 0,0 那一行为 0。
- 整体取反取反后只有 0,0 输出 1,其余组合全部输出 0。
- 等价展开取反后的“或”等价于各自取反后的“与”,正好对应“两个都为 0”这一条件。
同或门
秘籍第十条写着“默契灯”:两个开关状态一致(都向上或都向下)时灯亮,一上一下时灯灭。这就像“情侣装检票口”:两人穿着相同才放行——一致,灯光亮起;不一致,闸机紧闭。这条规则就是同或门(XNOR)。
同或门的规则一句话:输入相同输出 1,输入不同输出 0。它与上一讲的异或门是天生一对——异或门“不同则 1”,同或门“相同则 1”,两者的输出恰好互为取反。按 00、01、10、11 排列,同或门真值表输出列为 1、0、0、1,正好是异或门(0、1、1、0)的镜像。
同或门的看家本领是“相等比较”:把两个数的对应位分别送入同或门,每一位相同就输出 1,于是整个数字是否相等就一目了然。密码校验、缓存一致性比对,背后都是它在工作。表达式如下:
默契灯就是一把“数字标尺”:密码对不上,灯就灭。它是后面密码校验器最底层的地基。
- 两条通路AB 负责“两个都是 1”,ĀB̄ 负责“两个都是 0”,两条路正好覆盖所有“相同”的组合。
- 或运算合并任意一条路成立输出就是 1,所以输入相同时必然输出 1。
- 与异或互补前面证明异或输出 1 的情形恰好是输入不同,所以同或就是异或整体取反。
万能门
秘籍最后一页,房东用大写字母写了一行得意的话:其实你只需要一种开关——“万能与非盒”——就能搭出前面所有秘方。这就像乐高最基础的那块砖,看似普通,却能拼出整座城堡。与非门为什么有这种本事?因为它天生同时带着“与”和“非”两种能力。
任何逻辑函数都可以用“与、或、非”三种基本运算表达,而德摩根定律(下一节)又能把“或”翻译成“与非”的形式。于是理论上只需要与非门一种积木,就能构造出全部逻辑电路。或非门作为与非门的“双胞胎”,也同样万能。
三个经典拼法需要记住:第一,把与非门的两个输入并接同一个信号,它就变成反相器(非门);第二,先用与非做一次,再把结果送到第二个“并接模式”的与非门,双层取反抵消,就得到与门;第三,把两个输入各自取反后再与非,就得到或门。核心变换如下:
为什么芯片工厂的库房里堆满与非门?因为它便宜、好造,又能以一敌三。下一节的“换装术”会告诉你翻译的全部语法。
- 输入并联取反把与非门的两个输入接到同一个信号 A 上,A·A 就等于 A,再取反就是非门。
- 两级串联抵消先对 A·B 做一次与非得到中间量 M,再把 M 送入“并接模式”的与非门,相当于再取反一次。
- 双层取反还原一个量取反两次会回到它本身,所以最终结果就是 A·B,与门拼装完成。
逻辑变换
秘籍边角有用红笔写下的口诀:“长杠劈两半,乘号变加号。”这句话的来历像安检规则:公告说“禁止同时携带液体和打火机”,你只要放弃其中一样就合规,翻译过来就是“要么不许带液体,要么不许带打火机”。否定一整个组合,等价于否定其中的任何一项——这就是逻辑世界最重要的语法规则:德摩根定律。
德摩根定律一共有两条:对“与”整体取反,等价于各项取反后再“或”;对“或”整体取反,等价于各项取反后再“与”。简单说,把长杠从括号上拆下来分配到每个变量上时,里面的符号必须跟着翻转:乘号变加号,加号变乘号。
掌握它有什么好处?第一,能把与非门、或非门写成“与或式”或“或与式”,方便化简布尔表达式;第二,它是“全与非化”的理论依据——任何表达式都可以翻译成只用与非门的网络,从而节约芯片成本;第三,化简电路时,它就是那把最顺手的剪刀。两条定律如下:
有了换装术,任何逻辑表达式都能自由翻译成“与非语言”——这正是万能门能成为万能的原因,也是我们化简电路时最顺手的工具。
- 与运算取反对“两个都满足”取否定,等价于“至少有一个不满足”,写成两个取反相加。
- 或运算取反对“至少一个满足”取否定,等价于“两个都不满足”,写成两个取反相乘。
- 代入验证例如 A=1、B=0 时,左边 ¬(1·0)=1,右边 ¬1+¬0=1,两边完全一致。
工程应用
你把《接线秘籍》彻底用活了:地下室有一扇密码门,需要输入 4 位密码。你设计了一个“口令核对器”:每一位密码各接一个同或门,同或门输出再汇入一个与门——只有四个位全部一致,开门灯才会点亮。用到的正是同或门“相同则 1”的脾气。
这个核对器在工程上叫数字比较器,它无处不在:密码校验、CPU 判断两个寄存器是否相等、网络数据包的重合比对。同或负责“相等”判断,异或负责“不同”判断,把一串异或门串联起来还能计算奇偶校验位——发送方把 1 的个数补成偶数,接收方重新计算,若不一致就说明数据传输出错。
另一个大杀器是用两个与非门交叉连接组成 SR 锁存器:电路能“记住”上一次的状态,不会因为输入消失而丢失记忆。这是寄存器、缓存和一切存储器的雏形,再往上层叠,就能造出 SRAM 存储单元。4 位比较器的数学表达如下:
从一盏灯的明灭,到能记忆、能校验的数字单元,复合逻辑就是这趟旅程的核心引擎。
- 逐位同或把密码的每一位 A_i 和输入 B_i 送入同一个同或门,相同出 1、不同出 0。
- 结果求积四个位的结果送入与门,只有全部为 1,F 才为 1。
- 失败即拉零任何一位不一致,该位输出 0,整个与门输出被拉低为 0,代表比对失败。
实现与性能
房东在秘籍最后画了几张电路草图:同样实现“两个都开才亮”,用“与非门 + 反相”只需 4 只小开关(晶体管),直接做与门反而要 6 只。省下的 2 只,乘以芯片上几亿个门,就是肉眼可见的成本与功耗差距。走进芯片内部,CMOS 工艺中与非门、或非门天然是 4 管结构,与门、或门却要“基本门 + 反相器”共 6 管。
由此引出三个重要性能概念。扇入:一个门最多能接几个输入,输入端接得太多,内部管子并联的门会被拖慢;扇出:一个门的输出能带动几个下一级门,带太多会因电流不足导致信号失真;传播延迟:信号从输入到输出需要的时间,门级联的层数越多,延迟累积越大。所以在设计流水线时,工程师会尽量减少“门深度”。
还有一个经典的坑:输入端悬空。TTL 工艺的门电路,悬空输入端往往因内部上拉效应等效为高电平,很多初学者焊好电路后发现输出“莫名其妙”不对,多半就是某个输入脚悬空了。为此,工程上要么把不用输入端接高/低电平,要么并联到已用输入端。复合门的选择,本质是算“成本账”:每省一只管子、每减少一级延迟,芯片就更便宜一点、更快一点。
AI 应用场景
场景一:AI 芯片的逻辑综合与后端优化
阶段:芯片设计 / 部署优化
解决的问题:神经网络加速器里的控制逻辑、状态机、译码器如果全用与门和或门实现,综合工具会生成面积大、功耗高的电路;利用与非门、或非门的 4 管优势并配合德摩根化简,能把关键路径的门数和晶体管数同时降下来,这在功耗受限的边缘 AI 芯片上尤为关键。
具体案例:某 NPU 的流水线控制单元原先用与或式表达式综合出 600 个标准单元,工程师先用卡诺图化简,再统一转换成 NAND-NAND 两级电路,单元数降到 420 个,关键路径延迟缩短约 18%。
场景二:AI 服务器的数据校验与一致性比对
阶段:数据存取 / 训练稳定性保障
解决的问题:大模型训练时,多块 GPU 之间要频繁交换梯度数据,任何一位翻转都可能导致训练发散。传统做法靠软件校验,速度慢且占 CPU;硬件上用同或门阵列做逐位相等比较,再用异或门链计算奇偶校验位,可以在一个时钟周期内完成数据链路自检。
具体案例:某训练集群在 GPU 显存与主机之间的 DMA 链路上加入基于 XNOR 的比较器,检测到两次读取不一致时自动触发重传,训练任务的异常中断率降低了 90% 以上。
场景三:AI 加速器内部的寄存器文件设计
阶段:推理加速 / 处理器微架构
解决的问题:AI 芯片里的临时变量、累加结果都需要大量寄存器来保存,寄存器的最小单元就是由两个与非门交叉组成的 SR 锁存器。理解 NAND 锁存器的真值表和禁忌输入,是设计稳定寄存器文件、避免亚稳态问题的起点。
具体案例:某 RISC-V AI 协处理器的寄存器堆采用 NAND 构成的标准 D 触发器阵列,工程师通过约束 SR 锁存的“双 0 非法状态”并插入同步复位,在 7nm 工艺下实现了低功耗寄存器文件设计。
Python 演示
def nand(a, b): return 0 if (a & b) else 1 def nor(a, b): return 0 if (a | b) else 1 def xnor(a, b): return 1 if a == b else 0 def not_gate(x): return nand(x, x) def and_gate(a, b): t = nand(a, b) return nand(t, t) def or_gate(a, b): return nand(nand(a, a), nand(b, b)) def print_truth(name, fn): print('%s 真值表:' % name) for a in (0, 1): for b in (0, 1): print(' A=%d B=%d -> Y=%d' % (a, b, fn(a, b))) def verify_de_morgan(): ok = True for a in (0, 1): for b in (0, 1): if nand(a, b) != or_gate(not_gate(a), not_gate(b)): ok = False if nor(a, b) != and_gate(not_gate(a), not_gate(b)): ok = False return ok def nibble_equal(a, b): same = 0 for i in range(4): same += xnor((a >> i) & 1, (b >> i) & 1) return same == 4 def main(): print_truth('NAND', nand) print_truth('NOR', nor) print_truth('XNOR', xnor) print('用 NAND 搭 NOT(1):', not_gate(1)) print('用 NAND 搭 AND(1,0):', and_gate(1, 0)) print('用 NAND 搭 OR(0,1):', or_gate(0, 1)) print('德摩根定律验证:', verify_de_morgan()) print('4位密码比对 1010 vs 1010:', nibble_equal(10, 10)) print('4位密码比对 1010 vs 1001:', nibble_equal(10, 9)) if __name__ == '__main__': main()
def nand(a, b):定义与非门:先算与,再整体取反。return 0 if (a & b) else 1与非门的唯一 0 出现在两个输入都为 1 时。def not_gate(x):用与非门当反相器:两个输入并联同一个信号。return nand(t, t)与门 = 与非后再取反一次,双层非抵消。return nand(nand(a, a), nand(b, b))或门 = 两个输入各自取反后再与非。if nand(a, b) != or_gate(not_gate(a), not_gate(b)):验证德摩根定律:¬(A·B) 等于 ¬A 或 ¬B。if nor(a, b) != and_gate(not_gate(a), not_gate(b)):验证第二条定律:¬(A+B) 等于 ¬A 与 ¬B。same += xnor((a >> i) & 1, (b >> i) & 1)逐位取出密码的每一位,送入同或门累计相同个数。nibble_equal(10, 10)四位二进制 1010 与 1010 完全一致,比对器应判真。
常见误区
误区我觉得与非门就是与门,只要有一个输入是 0,输出就肯定是 0,毕竟它名字里带个“非”字。
正解名字里的“非”作用于整体结果,而不是单个输入。与非门的规则恰恰是:只要有一个输入为 0,输出就是 1;唯一输出 0 的情形是“两个输入都为 1”。记住口诀“先算与、再取反”,取反永远发生在最后,不能中途插到输入上。
为何常见:人对与门“全 1 才 1”的印象太深,于是把“非”的优先级理解错了,把整体取反误当成对每个输入取反。
误区或非门平时输出 0,看起来很“消极”,我觉得它比与非门弱,能不用就不用。
正解或非门只是“全 0 才出 1”的警惕型门,地位和与非门完全对等——它同样是万能门,能搭出任意电路。觉得它弱,是因为拿“输出 1 的个数”衡量价值;而工程上“全零检测”“安全联锁”“急停判断”恰恰全部依赖这种规则。
为何常见:从与门、或门“正向成立”的思维习惯出发,人们容易低估那些“默认归零、特殊才亮”的异类规则。
误区同或门应该跟与门差不多,两个输入都为 1 时输出 1,其他情况输出 0。
正解同或的“相同”既包含两个 1 相同,也包含两个 0 相同,所以按 00、01、10、11 排序的真值表输出为 1、0、0、1,与与门(0、0、0、1)完全不同。“都为 0 也输出 1”正是同或门能做相等比对的原因,丢了这一点就等于把标尺换成了橡皮筋。
为何常见:生活中说“一样”时总默认指的是“好的东西一样”,忽略了“什么都没有”也是一种完全一致的状态。
误区NOT(A AND B) 拆开就是 NOT A AND NOT B,每个变量各自取反肯定没错。
正解拆长杠时符号必须翻转:与变或、或变与,口诀“拆杠必换号”。可以用代入法验证:A=0、B=1 时,左边 ¬(0·1)=1,而 NOT A AND NOT B 等于 0,两边不等,说明拆错了;正确的 ¬A 或 ¬B 代入才等于 1。
为何常见:初中数学乘法分配律的印象太深,被错误地搬到了逻辑代数中,忽略了取反操作的特殊语法。
误区与非门能构造所有逻辑,那芯片设计就应该全部只用与非门,其他门都多余。
正解“万能”指的是逻辑完备性,不等于工程最优性。实际标准单元库里与非门、或非门、反相器、传输门多种单元混用,综合工具会按面积、功耗、时序综合权衡。只是在处理复杂布尔式时,化简后统一转成 NAND-NAND 两级实现,确实是经典的成本优化手段。
为何常见:把“理论上可构造”夸大成“实践上唯一方案”,忽略了延迟、扇出、布线等多元约束。
面试题
Q1. 与非门两个输入为 1 和 0,输出是多少?
- A.输出为 0
- B.输出为 1← 正确答案
- C.输出不确定
- D.输出高阻态
答案:B。与非门只有“两个输入都为 1”时才输出 0,其余三种组合都输出 1。A=1、B=0 不是“全 1”,所以输出 1。C、D 是模拟电路层面的概念,与逻辑真值无关。
Q2. 或非门的两个输入都为 0 时,输出是?
- A.输出高电平← 正确答案
- B.输出低电平
- C.输出会浮空
- D.输出看负载
答案:A。或非门是“先或后非”,输入 0,0 时或的结果是 0,取反后输出 1,即高电平。只要有任何输入为 1,输出才会被拉低为 0。
Q3. 同或门在 A 与 B 不相等时,输出为?
- A.输出恒为 0← 正确答案
- B.输出恒为 1
- C.输出等于 A
- D.输出等于取反
答案:A。同或门“相同则 1、不同则 0”,所以输入不相等时输出恒为 0。它与异或门恰好相反——异或门在不同时输出 1,二者互为取反关系。
Q4. 想让一个二输入与非门当反相器使用,以下哪些接法正确?
- A.两输入并联同一信号← 正确答案
- B.一端接高电平一端接信号← 正确答案
- C.一端接低电平一端接信号
- D.两个输入全部悬空
答案:AB。两输入并接时 NAND(A,A)=¬A,是反相器;一端接 1 时 NAND(1,x)=¬x,也是反相器。一端接 0 时输出恒为 1,无法取反;悬空输入在 TTL 中等效高电平,但依赖工艺特性,不能算可靠接法。
Q5. 根据德摩根定律,NOT(A AND B) 等价于?
- A.¬A 与 ¬B 相与
- B.¬A 与 ¬B 相或← 正确答案
- C.A 与 ¬B 相与
- D.¬A 与 B 相与
答案:B。拆长杠时“乘号变加号”,¬(A·B)=¬A+¬B,即“非 A 或非 B”。选项 A 是第二条定律 ¬(A+B) 的展开,C、D 缺少对整体取反的正确分配。
Q6. 用与非门构造一个与门,最少需要多少个与非门?
- A.两个与非门← 正确答案
- B.一个与非门
- C.三个与非门
- D.四个与非门
答案:A。第一个与非门得到 ¬(A·B),第二个把该结果两输入并接再取反一次,双层取反抵消后得到 A·B。一个不够,因为没有取反输出的来源;三四个虽然也能实现,但不是最少。
Q7. 以下哪些门属于“万能门”,可以构造出任意逻辑电路?
- A.与非门← 正确答案
- B.或非门← 正确答案
- C.同或门
- D.与门
答案:AB。与非门和或非门都是“万能门”,逻辑完备,可以组合出与、或、非乃至任意布尔函数;同或门和与门缺少必要的能力(无法单独实现取反),不构成万能门。
Q8. 关于同或门(XNOR),下列说法正确的是?
- A.输入相同输出为 1← 正确答案
- B.是异或门输出取反← 正确答案
- C.输入不同输出为 1
- D.可以做逐位比对← 正确答案
答案:ABD。同或门“相同则 1”、不同则 0,且与异或门互为取反,因此常用来做逐位相等比对。选项 C 描述的是异或门的规则,方向完全相反。
Q9. 由两个与非门交叉连接组成的 SR 锁存器,当 S=0、R=0 时电路处于什么状态?
- A.Q=0,Q̄=1 稳定保持
- B.Q=1,Q̄=0 稳定保持
- C.Q=1,Q̄=1 输入非法← 正确答案
- D.Q=0,Q̄=0 电路烧毁
答案:C。对 NAND 构成的 SR 锁存器,S=0、R=0 会强制两个输出都变为 1,破坏“Q 与 Q̄ 互补”的约束,是禁止输入的保持状态,不会稳定在 0/1 互补状态,也不会烧毁电路。
Q10. 在 TTL 与非门中,某个输入端悬空(未接任何信号),其等效逻辑电平通常是?
- A.等效为高电平← 正确答案
- B.等效为低电平
- C.等效为高阻态
- D.等效为损坏态
答案:A。TTL 门输入端悬空时,由于输入晶体管的基极电流会被内部电阻“上拉”,悬空端往往读作逻辑高电平。这会造成电路行为与预期不符,工程上应把不用的输入端固定接到 1 或 0,或并联到已用输入。