ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

卡诺图:数字电路逻辑化简的核心工具与工程实践

卡诺图:数字电路逻辑化简的核心工具与工程实践 1. 项目概述为什么卡诺图是数字电路设计的“瑞士军刀”如果你已经跟着前两篇内容从逻辑代数基础走到了逻辑函数的公式化简法那么恭喜你你已经迈入了数字电路设计的核心地带。但公式化简这事儿是不是总觉得有点“玄学”面对一堆复杂的逻辑表达式尤其是变量多起来的时候怎么并项、怎么吸收全凭经验和眼力一不小心就绕晕了化简结果是不是最简的心里也没底。这时候你就需要一件更直观、更可靠的“武器”——卡诺图。卡诺图本质上是一种图形化的逻辑函数化简工具。它把逻辑函数的所有最小项按照一种特殊的几何相邻规则排列在一个方格图中。这种“相邻”不是随便排的它巧妙地对应了逻辑代数中“相邻最小项可以合并”这一核心原理。我从业十几年带过无数新手发现很多人一开始对卡诺图是抗拒的觉得画格子、填格子太“低级”不如公式推导显得“高级”。但真正在项目里尤其是需要快速验证逻辑、优化中小规模电路比如设计一个控制器、状态机或者接口逻辑时卡诺图的效率是公式法无法比拟的。它能让你一眼看出哪些项可以合并避免冗余确保得到最简的“与或”表达式或“或与”表达式。对于五变量及以下的逻辑函数它几乎是手算化简的终极答案。这篇内容我就带你彻底搞懂这套方法让你在面对逻辑化简时手里有图心里不慌。2. 卡诺图的核心原理与构建规则要玩转卡诺图不能只学画图步骤必须理解它背后的“为什么”。它的威力全部源于其精巧的设计规则。2.1 几何相邻与逻辑相邻的等价性这是卡诺图所有魔力的根源。在逻辑代数中如果两个最小项只有一个变量不同这个变量在一个最小项中是原变量在另一个中是反变量那么这两个最小项就称为逻辑相邻项。例如对于三变量函数最小项m5(ABC101) 和m7(ABC111) 就是逻辑相邻的因为它们只有变量B不同一个是0一个是1。卡诺图的神奇之处在于它通过一种特殊的编码方式——格雷码循环码来标注行和列使得在几何位置上相邻的方格其对应的最小项必定是逻辑相邻的。格雷码的特点是相邻两个编码之间只有一位发生变化。这就完美地将“逻辑相邻”映射到了“几何相邻”上。因此在图中相邻的两个“1”格代表函数值为1的最小项它们对应的乘积项就可以合并消去那个不同的变量。2.2 不同变量数卡诺图的画法详解知道原理后我们来看具体怎么画。卡诺图是一个二维表格行和列分别代表一部分输入变量的所有可能组合。二变量卡诺图最简单就是一个2x2的方格。行代表A列代表B。通常的排列是行0(A非), 1(A)列0(B非), 1(B)。四个格子分别对应最小项 m0(A’B’), m1(A’B), m2(AB’), m3(AB)。三变量卡诺图通常用2行4列来表示。行变量是A列变量是BC。这里的关键是BC的排列必须采用格雷码00, 01, 11, 10。注意这个顺序01后面是1111后面是10而不是二进制的10。这样能保证左右相邻以及首尾相邻把图想象成一个圆柱体最左和最右也是相邻的。八个格子对应m0到m7。四变量卡诺图最常用是一个4x4的方格。行变量是AB列变量是CD。AB和CD都需要按照格雷码排列00, 01, 11, 10。这样不仅左右相邻、上下相邻四个角的格子也是相邻的把图想象成一个球面或环面。十六个格子对应m0到m15。五变量卡诺图可以理解为两个四变量卡诺图上下叠放分别代表第五个变量E0和E1。此时相邻关系除了在每个4x4图内部成立外上下两个图对应位置镜像位置的格子也是相邻的。这需要一点空间想象力。注意填写卡诺图时一定要根据逻辑函数的标准形式最小项之和或最大项之积在对应的格子中填入“1”对于最小项或“0”对于最大项。通常我们更常用“1”格化简与或式。2.3 实操心得快速定位最小项格子的技巧新手常犯的错误是填图时找错格子。这里分享一个我常用的“坐标法”把行和列的格雷码看成二进制数尽管它不是顺序二进制然后组合。例如四变量图行AB01列CD11那么组合起来就是0111这就是二进制数7所以这个格子对应的是 m7。反之如果给你m1313的二进制是1101那么前两位11对应行后两位01对应列去找行标为11格雷码第三行列标为01格雷码第二列的格子即可。这个方法能极大减少出错概率尤其是在变量较多时。3. 卡诺图化简法的详细步骤与核心技巧有了正确的卡诺图化简过程就像是在玩一个“圈格子”的合并游戏。但怎么圈大有学问。3.1 合并最小项的核心规则圈“1”格合并最小项的目标是用尽可能少、尽可能大的圈覆盖图中所有的“1”格。每个圈对应化简后的一个乘积项。圈的形状必须是矩形或正方形可以圈2^n个“1”格即1个、2个、4个、8个、16个……因为合并2^n个最小项可以消去n个变量。圈要尽可能大在能圈住2^n个“1”格的前提下圈越大越好。大圈意味着消去的变量多得到的乘积项更简单。圈的个数要尽可能少每个圈对应一个乘积项圈越少最终表达式中的项数就越少。每个“1”格至少被圈一次可以多次被圈这涉及到冗余项后面讲。但首要目标是保证所有“1”格都被覆盖。利用相邻性卡诺图的上下、左右、四角都是相邻的圈的时候要有立体空间的思维敢于“跨边界”画圈。3.2 分步化简实战演练我们以一个具体的四变量逻辑函数为例F(A, B, C, D) Σm(0, 2, 3, 5, 7, 8, 10, 11, 13, 15)。这是它的最小项列表。第一步画出4x4卡诺图并填“1”。行AB00, 01, 11, 10列CD00, 01, 11, 10。将序号0,2,3,5,7,8,10,11,13,15对应的格子填入1。第二步寻找最大的可能圈。首先看中间四个“1”格m3, m7, m11, m15。它们构成一个2x2的正方形。这个圈覆盖了四个格。观察这四个格A在01和11行间变化B在11和10行间变化不对我们应该看变量。更系统的方法是这四格的行AB分别是01, 11, 11, 10列CD分别是11, 11, 01, 11。我们发现A和B都在变化但C始终为1D始终为1仔细核对m3(0011)的C1,D1m7(0111)C1,D1m11(1011)C1,D1m15(1111)C1,D1。所以这个圈合并后变量A和B被消去只保留C和D且因为它们都是1所以这个乘积项就是CD。再看四个角m0, m2, m8, m10。它们也构成一个“矩形”在循环相邻意义上。这四格行AB为00,00,10,10列CD为00,10,00,10。A和C在变化B始终为0D始终为0。所以这个圈合并后得到B’D’。现在还剩下两个孤立的“1”格m5和m13。m5(0101)可以和谁合并它和m7(0111)是左右相邻但m7已经被第一个大圈覆盖了。它和m13(1101)是上下相邻吗在图中m5在第二行第二列m13在第四行第二列并不直接上下相邻因为行编码不是格雷码相邻。实际上m5(0101)和m13(1101)只有A不同所以它们是逻辑相邻的在卡诺图上它们的位置是AB01和AB11CD01。AB从01到11是格雷码相邻吗01的下一个是11在格雷码序列中所以它们在图中的位置是上下相邻的这是一个关键的“跨行”相邻。因此m5和m13可以组成一个2格圈。这个圈中A变化B1我们仔细写m5: A’BC’D m13: ABC’D。只有A不同所以合并后消去A得到BC’D。第三步写出最简表达式。将每个圈对应的乘积项相加或运算。F CD B’D’ BC’D。检查是否所有“1”格都被覆盖m3,7,11,15被CD圈覆盖m0,2,8,10被B’D’圈覆盖m5,13被BC’D圈覆盖。全部覆盖完毕。3.3 高级技巧利用无关项Don‘t Care优化设计在实际电路中某些输入组合可能永远不会出现或者即使出现输出是0是1我们并不关心。这些最小项称为无关项在卡诺图中用“X”表示。无关项是化简的“万能牌”我们可以根据化简的需要灵活地将它们当作“1”或者“0”来处理目的就是为了画出更大、更少的圈。例如一个函数F其最小项为 Σm(1,3,5,7,9)无关项为 Σd(10,11,12,13,14,15)。在画圈时右上角一大片都是X。如果我们把其中一些X当作1就可以和原有的1格组成一个巨大的圈比如覆盖所有高四位为1的格子从而极大地简化表达式。处理无关项的原则是对化简有利则取为1不利则取为0。这是卡诺图化简中能获得更优结果的关键也是体现设计者优化能力的地方。4. 常见问题与避坑指南实录卡诺图看似简单但新手甚至有些经验的人都会踩一些坑。下面是我总结的“血泪教训”。4.1 问题一化简结果不是最简式这是最常见的问题。通常由两个原因导致有更优的圈法未被发现特别是忽略了“循环相邻”特性没有把边沿或角落的格子与另一侧的格子圈在一起。解决方案画完圈后养成检查习惯对于每一个圈试着看能否再扩大纳入更多相邻的“1”格或“X”格同时检查是否有任何一个圈是多余的即它覆盖的所有“1”格都已经被其他圈覆盖过了。“冗余圈”问题即画了一个圈但它没有覆盖任何独有的“1”格该圈里所有的“1”格都同时属于其他圈。这个圈就是冗余的应该去掉。最简式的每个乘积项圈都必须至少包含一个“本质1格”只被这个圈覆盖的“1”格。避坑技巧采用“先找本质1格”的方法。首先找出那些只与一个其他“1”格相邻或无法与其他格形成更大圈的孤立“1”格或者那些虽然相邻格多但只有一种唯一圈法能覆盖它的“1”格。从覆盖这些“本质1格”的必要圈开始画然后再用大圈去覆盖剩下的“1”格。这个顺序能有效避免冗余。4.2 问题二多输出函数的化简顾此失彼当需要同时化简多个具有相同输入变量的逻辑函数时如果各自独立化简可能会浪费资源。因为某些乘积项与门可以在多个输出函数中共享。卡诺图在这里的用法是尽量寻找多个函数卡诺图中“1”格的重叠区域尝试画出能同时覆盖多个函数中“1”格的公共圈。这个公共圈对应的与门就可以被共享从而减少整体电路的与门数量。这需要将几个卡诺图并列放置进行比较和权衡是卡诺图应用的高级阶段但对优化复杂组合电路至关重要。4.3 问题三圈“0”格化简与或非式不熟练我们通常圈“1”格得到最简“与或式”。但有时电路设计需要“与或非”形式。这时可以圈“0”格即函数值为0的最小项得到的是F’的最简“与或式”然后再对整个表达式取反并用德摩根定律展开即可得到F的“与或非式”。新手容易混淆的是圈“0”格时合并规则和读图规则与圈“1”格完全一样只是对象不同。关键点圈“0”格得到的是F’的表达式。例如圈出一个4个“0”格的大圈读出的乘积项是P那么意味着 F’ 中包含P即 F’ P …那么 F (P …)’ P’ · …这就自然导出了与或非结构。4.4 问题排查速查表问题现象可能原因检查与解决步骤化简结果项数很多1. 圈太小没有尽可能扩大。2. 忽略了循环相邻四角、边沿。3. 没有利用无关项。1. 复查每个圈看能否与相邻的“1”或“X”合并成更大的2^n格矩形。2. 检查四个角是否可合并最左最右列是否可合并最上最下行是否可合并。3. 将有利于组成大圈的无关项“X”当作“1”重新圈图。某个“1”格被漏圈画圈时遗漏或视觉疏忽。化简完成后逐一核对最小项列表中的每个序号在图中确认其已被至少一个圈覆盖。读出的乘积项错误合并后变量取舍判断错误。对圈内所有格子列出其对应的变量取值。变化的变量消去恒定不变的变量保留并以恒定值0取反1取原变量写入乘积项。面对五变量图无从下手空间想象力不足对重叠相邻理解不深。将上下两层图分别视为E0和E1。记住不仅每层内部相邻上下两层对应坐标的格子也相邻。可以尝试先独立化简每一层再寻找两层之间可以合并的公共项这些项将不包含变量E。我个人在实际使用中的体会是卡诺图的价值远不止于课堂作业。在FPGA或CPLD开发中当你需要快速手写一小段组合逻辑或者复查综合工具生成的方程是否最优时卡诺图能给你最直接的洞察。它强迫你去思考所有输入组合下的输出这是一种非常好的逻辑思维训练。最后分享一个习惯在化简完成后如果不是特别有把握可以随机选几组输入值分别代入原函数和化简后的函数验证输出是否一致。这是保证设计正确的最后一道也是最可靠的一道手工防线。
返回列表