
如果你正在学数字电路或者复习到逻辑化简这一块卡诺图化简法一定绕不开。很多同学第一次接触它时觉得不过是“画格子、圈1、写式子”三步结果真上手做题才发现要么圈出来的项不对要么化简结果比原来还长要么根本不知道从哪下手。这篇文章就把卡诺图化简法掰开揉碎讲清楚它到底在干什么、为什么要这样画、实操时每一步怎么走以及新手最容易在哪几个地方翻车。这篇内容不是单纯给你背规则而是按“原理—画图—圈组—排错—扩展”这条线走适合正在学数字逻辑的学生、准备考试和面试的求职者以及刚接触逻辑设计的工程师。读完你应该能做到拿到一个逻辑表达式或最小项编号列表能又快又稳地画出卡诺图给出最简与或式并且能自查结果对不对。1. 卡诺图到底在做什么1.1 公式法化简为什么让人头疼逻辑化简的本质是把布尔代数式变成项数更少、变量更少的形式。上课时先学的是代数法比如并项法用 AB AB A吸收法用 A AB A还有配项法这类技巧。这些方法好不好用好用但前提是你得“看得出来”。举个例子F ABC ABC ABC ABC如果只用代数法你得先观察哪两项能合并。第一眼往往看不出来得尝试不同的分组方式试错成本很高。而且表达式中项数一多漏合并、重复合并的问题就来了。考试时时间紧张越急越看不出来最后写出一个“化简了但没完全化简”的答案扣分很冤。公式法还有一个隐藏问题它不系统。两个最小项能不能合并靠的是你在脑中判断它们是否只差一个变量。这种判断对三变量还行四变量就开始吃力五变量以上基本靠直觉没有可复现的流程。卡诺图出现就是为了把这种“靠经验、靠眼力”的判断变成一套任何人在图上都能直接执行的机械操作。1.2 把逻辑相邻翻译成几何相邻卡诺图的核心思想只有一句话逻辑相邻的项在图上物理位置相邻。什么叫逻辑相邻两个最小项之间只有一个变量不同比如 ABC 和 ABC差在 A 上其余 B、C 都一样。这两个项可以合并成 BC消掉变量 A。传统的代数做法是人去识别这种关系而卡诺图把最小项按特殊顺序摆进格子后逻辑相邻就变成了格子紧挨着。这里要解释一下为什么“位置相邻”能让人快速合并。人脑对图形的识别能力比对符号的识别能力强得多。你看到四个格子连成一个方块一眼就知道它对应一个乘积项但你盯着 ABCD ABCD ABCD ABCD 这四项可能得想一会儿才能反应过来它们能合成 BC。卡诺图充分利用了视觉模式识别所以一旦画对化简速度快到离谱。卡诺图还有一个身份你可以把它理解为“真值表的二维重排”。真值表是一列一列列最小项卡诺图是把这些最小项摆成一个矩阵并且相邻格子的编码刻意做到“只能有一位变化”。2. 先从画图开始变量、格子和编号规则2.1 格子数与行列顺序卡诺图的格子数量取决于变量个数。n 个变量有 2^n 个最小项所以图里就有 2^n 个格子。两个变量 4 格三个变量 8 格四个变量 16 格五个变量 32 格。日常手算和考试最常见的是三变量、四变量两个变量太简单五变量以上人工画图性价比低后面我会专门说替代方案。画图第一件要命的事是行和列的取值顺序。很多人习惯性地写 00、01、10、11也就是二进制递增这在卡诺图里是大忌。必须用格雷码顺序00、01、11、10。为什么必须这样因为格雷码相邻两组取值只差一位。比如 01 和 11差的是最高位从 0 变 111 和 10差的是最低位从 1 变 0。如果用二进制递增 00、01、10、11那 01 和 10 相邻时差了两位这就破坏了“相邻格子只能有一个变量不同”的根基。我给学生的记忆方法是把格雷码序列当成“镜子对称”来写。两位格雷码就是 00、01、然后往下翻 11、10先按 0 开头写 00、01再按 1 开头把低位镜像。三变量、四变量的行和列都按这个规矩来。2.2 三变量图填值演示三变量卡诺图通常用 A、B 做行变量C 做列变量也可以反过来不影响结果。行顺序是 AB 00、01、11、10列顺序是 C 0、1。每个格子对应一个最小项编号一般用 m0、m1 这种编号表示。比如三变量图里第一行第一列是 ABC也就是 m0第一行第二列是 ABC也就是 m1第二行第一列是 ABC也就是 m4这里注意编号不是按图顺序排的是按二进制真值表编号来的。m0 是 000m1 是 001m2 是 010m3 是 011m4 是 100m5 是 101m6 是 110m7 是 111。把编号填进卡诺图时要严格按照行、列对应的格雷码来找位置。我建议初学者先画一张空表把每个格子的最小项编号写在左上角。这样后面填 1 的时候对着编号抄就行比自己临时推算快得多也不容易错。等熟练之后再尝试不看编号直接填。2.3 四变量图的循环相邻关系四变量图有 16 格行变量 AB、列变量 CD行和列都用格雷码。除了普通相邻四变量图多了几组“循环相邻”关系这是新手最容易忽略的。循环相邻指的是最左边和最右边相邻最上边和最下边相邻。也就是说第一列和最后一列是邻居第一行和最后一行也是邻居。更狠的是四个角左上角、右上角、左下角、右下角彼此相邻可以圈成一个跨越边界的四格块。为什么会这样因为格雷码首尾也满足“只差一位”。比如 CD 列顺序 00、01、11、10最左边的 00 和最右边的 10 只差 C 一位所以它们逻辑相邻。这个特性如果不注意就会漏掉很多可以大幅化简的大圈。3. 圈组与化简一套能直接照抄的操作流程3.1 圈组的三条硬规则图填好 1 和 0 之后化简就变成了圈 1 的游戏。圈组时有几条规则必须严格遵守。第一圈里的 1 的个数必须是 2 的幂。也就是只能圈 1 个、2 个、4 个、8 个、16 个不能圈 3 个、5 个、6 个。因为每圈一次 2^k 个格子就能消掉 k 个变量这是由卡诺图的几何结构决定的不是人为规定。第二圈要尽可能大。同一个 1 可以出现在多个圈里可以重复用。圈得越大消掉的变量越多化简结果越短。第三圈的数量要尽可能少。在保证每个圈都尽量大的前提下用最少的圈覆盖所有 1。这样得到的就是最简或最接近最简的结果。圈组还有一个很容易被忽略的条件每个圈至少包含一个“只属于它自己”的 1。如果一个圈里的所有 1 都已经被别的圈覆盖了这个圈就是冗余圈删掉它不影响覆盖所有 1只影响结果长度。判断冗余圈是后期优化最关键的环节。3.2 一个完整化简案例三变量逐步做光讲规则太抽象我们来完整走一遍三变量的例子。设 F(A,B,C) ABC ABC ABC ABC。第一步把表达式展开成最小项编号。四个项分别对应 m0、m1、m4、m6。画三变量图。行 AB 按 00、01、11、10 排列列 C 按 0、1 排列。先填 1m0 在行 00、列 0m1 在行 00、列 1m4 在行 10、列 0m6 在行 11、列 0。现在开始圈。m0 和 m1 上下相邻组成一个二格圈。这个圈里变量 C 从 0 变到 1被消掉了AB 保持 00 不变所以对应乘积项是 AB。再看 m4 和 m6它们在同一列C0行 AB 分别是 10 和 11差的是 B 一位组成另一个二格圈。这个圈里 B 被消掉A1、C0 保持不变对应乘积项是 AC。结果就是 F AB AC。验证一下AB 覆盖 m0、m1AC 覆盖 m4、m6正好是原式的四个最小项一个不多一个不少。这个例子很简单但三变量卡诺图的完整化简流程就是这样填 1、找相邻、圈最大、写乘积项。3.3 四变量跨边界圈法演示再来看一个专门考“循环相邻”的四变量例子F(A,B,C,D) Σm(0,2,8,10)。这四个最小项分别落在m0 在行 00、列 00m2 在行 00、列 10m8 在行 10、列 00m10 在行 10、列 10。从图上位置看它们正好是四变量图的四个角。按普通思维四个角不挨在一起没法圈。但利用循环相邻关系左边的两个格m0、m8和最右边的两个格m2、m10跨边界相邻上边的两个格m0、m2和下面的两个格m8、m10也跨边界相邻。最后这四个角可以圈成一个跨越四条边的四格圈。这个圈很大能消掉两个变量。具体消谁看变量变化AB 行从 00 到 10A 变化CD 列从 00 到 10C 变化。B 和 D 始终为 0保持不变。所以结果是 BD。如果不会用跨边界圈法至少要圈成两个二格圈得到 ABD ABD还能合并成 BD过程繁琐。直接用四角大圈一步到位这就是掌握循环相邻的价值。3.4 冗余圈怎么判断化简做到最后经常会出现“多圈了一个”的情况。怎么判断一个圈是不是冗余标准很简单你圈完一个块之后看它包含的所有 1 是否都已经在其他圈里出现过。如果是这个圈就是冗余的对应的项必须从结果中删除。如果它里面哪怕有一个 1 是别的圈没覆盖的那这个圈就保留。实际操作中我习惯每圈完一个块就在格子左上角做个标记或者给这个 1 打个小点。最后检查时只看每个块有没有“独有的点”。没有独有点的块直接划掉。有一种很典型的冗余情况你已经用两个二格圈覆盖了四个 1然后觉得“这四个 1 凑成一个四格圈不是更好吗”又加了一个四格圈。结果这个四格圈里的四个 1 全被之前的两个二格圈覆盖了这个四格圈就是多余的写出的乘积项会让最终表达式长出多余的一项。4. 新手最容易踩的坑与自查清单4.1 六个高频错误第一个错误也是最常见的行列顺序写错。把卡诺图的行列按 00、01、10、11 来排这样相邻格子的编码不再是只差一位圈组规则直接失效化简结果肯定是错的。这个错特别隐蔽因为画出来的图看着很整齐填的 1 位置可能也没问题但圈到的“相邻”项实际上根本不能合并。第二个错误圈里混进 0。圈组时只看 1但有时候为了圈得更大会不小心把旁边的 0 也圈进来。这是硬伤圈住的 0 会让乘积项覆盖到不该覆盖的最小项导致化简结果和原函数不等价。考试时这种错基本是致命的整个小题的分都保不住。第三个错误圈不够大。比如四个 1 明明能圈成 2x2 的块有人却按两个二格圈处理或者分成四个单格。这样逻辑上没错结果也等价但不是最简要扣分。圈得不够大通常是因为没有注意到跨边界的相邻关系。第四个错误漏掉孤立 1。某格是 1但它周围一圈都是 0没法跟任何人合并这时它要单独一个圈对应最小项原样写出来。很多人容易忘。第五个错误圈不规则。圈组必须是矩形或方形并且边必须跨越完整的行或列。不能圈成 L 形、对角线形、三角形。有些同学为了让圈变大画了一个像小楼梯一样的边这在卡诺图里是无效圈。第六个错误写乘积项时变量看反。圈好后剩下哪些变量、取原变量还是反变量得按圈内这些变量的“恒定值”来写是 0 写反变量是 1 写原变量。方向错了整个项就变味了。4.2 自查三步法化简完成后别急着交用三分钟做一次自查能避开绝大多数低级失误。第一步数 1。回到原式数清楚一共有多少个最小项也就是卡诺图里应该有多少个 1。然后检查卡诺图里是否每一个 1 都被至少一个圈覆盖没有漏网的。第二步逐个圈展开验证。每个圈对应一个乘积项把这个乘积项展开成最小项看它是否恰好等于圈内那些 1 的最小项编号。比如一个四格圈写出 BD展开就是 m0、m2、m8、m10跟圈里的编号对得上就说明写对了。第三步核对等价性。把最终最简表达式展开成最小项集合和初始表达式的最小项集合做对比应该完全一致。如果多了一个或少了一个返回去重新找问题。4.3 问题速查表错误类型典型表现后果检查方法行列顺序错误按二进制顺序写行列相邻关系失效化简结果错误确认序列为00、01、11、10圈中包含0圈的边界把0包进去结果与原函数不等价检查每个圈的边界是否只覆盖1圈不够大四格可并却用两个二格圈表达式不是最简检查是否存在更大矩形圈漏圈孤立1某个1无任何圈覆盖表达式漏项计数比对1的总数圈形不规则L形、斜线、缺口矩形无效圈结果错误只圈完整矩形或方形冗余圈圈的1全部被其他圈覆盖表达式多出多余项寻找每个圈独有的1变量写反0写成原变量、1写成反变量乘积项错误按圈内恒定值重新取反/原这个表格是我在批改作业时总结出来的高频雷区建议存一份每次做完题对照查一遍。5. 还能怎么用或与式、多输出与工具替代5.1 圈0法化简或与式卡诺图不只能化简“与或式”还能反过来求“或与式”。思路是把 0 当作要圈的对象而不是 1。具体做法是在卡诺图上圈 0按圈 1 同样的规则处理得到的是 F 的最简与或式也就是原函数的反函数。然后再对这个反函数取反就能得到原函数的或与式。如果不想绕一圈也可以直接按圈 0 的方式写“或项”。圈 0 时变量为 0 写原变量变量为 1 写反变量每个圈对应一个或项最后把这些或项相与。什么时候用圈 0 法当 1 的个数远多于 0 的个数或者题目明确要求写出最简或与式时。圈 0 往往能让图上的圈更少、更大。比如一个函数的 1 占了 15 格只有 1 个 0那圈 0 只需要一个单格反函数就是一个最小项再取反得到巨大的或项非常省事。5.2 多输出逻辑中的共享圈卡诺图在单输出函数里是基本功多输出函数里还能玩出花来。多个输出函数常常有交叠的最小项集合。比如 F1 需要圈某个 4 格块F2 也需要圈同一个 4 格块这在分别化简时就是两个重复的与门。如果放在一起化简这个圈可以同时给 F1 和 F2 使用只要保证每个圈里至少有一个 1 是该输出独有的就不会破坏各函数的正确性。这个技巧在实际逻辑设计里能明显减少门数。考试中如果遇到多输出卡诺图化简记住核心原则一个圈可以被多个函数共享但每个函数必须单独保证覆盖完整。共享圈带来的好处是资源复用代价是可能让单个函数不是绝对最简但从整体电路看更省。5.3 五变量以上怎么办五变量卡诺图还能画通常用两个四变量图叠加分别对应某个变量为 0 和为 1 的两半。两半中位置对称的格子是相邻的圈组时可以跨图操作。这种图画起来麻烦圈起来更麻烦很容易看走眼。六变量、七变量的卡诺图不是不能画而是画出来之后人眼几乎无法有效处理画圈的正确率断崖式下降。这时候有两种替代方案。第一种是用 Quine-McCluskey 算法也叫列表法。它是一种系统化的表格化简方法不依赖图形适合编程实现手工做多变量化简时也比卡诺图可靠。第二种是直接用逻辑综合工具比如数字电路课程里常用的 Logisim或者工业界的 EDA 工具。输入真值表或表达式工具内部会自动用类 Quine-McCluskey 算法完成化简。这不代表卡诺图没用了。对三变量、四变量这类日常规模的问题卡诺图依然是最快、最直观的方法而且理解卡诺图能帮你建立“逻辑相邻”的直觉这对后续学习时序电路、状态化简都有很大帮助。最后分享一点个人经验。我带过的学生里卡诺图学得好的都不是死记硬背规则的人而是真的理解了“相邻消变量”这一本质的人。建议初学阶段每圈完一个圈都把对应的乘积项展开成最小项和圈里的格子对一遍。这个过程看起来很慢但对建立正确直觉特别有效。熟练之后再尝试直接看图写结果。另外化简完不要嫌麻烦用真值表或者逻辑代数验算一下花不了两分钟却能避免整道题白做。做几个完整练习之后你会发现卡诺图化简法成了数字电路里最让人放心的一个环节。