KaiSpace
tech

circuit Simplification

Karnaugh 图与 Quine–McCluskey 算法详解

在数字逻辑设计中,对布尔函数进行最小化是优化电路、降低成本和提高速度的重要步骤。本文将从理论和实践两方面详细阐述如何利用 Karnaugh 图(K-Map)和 Quine–McCluskey 算法对 SoP(Sum of Products)表达式进行最简化处理。通过阅读本文,你将深入理解两种方法的基本原理、具体步骤以及各自的优缺点。


引言

在实际的数字电路设计中,设计者往往面对复杂的布尔表达式。如果不进行合理的化简,所得到的电路可能会冗余且效率低下。Karnaugh 图和 Quine–McCluskey 算法分别提供了直观和系统化的解决方案。前者利用图形化的方法帮助工程师快速找到可合并的项;后者则是通过一系列的计算步骤,确保在变量较多时也能找到全局最优的最简表达式。


数字逻辑与 SoP 表达式

SoP 表达式(Sum of Products)是布尔函数的一种标准形式,它将函数表示为多个乘积项(AND 项)的和(OR)。例如,对于两个变量的函数,可以写成:

F=AB+ABF = A \cdot B + A' \cdot B

这种表达方式在硬件实现时具有直观性,然而直接使用时可能存在冗余项,优化后的最简表达式则能大幅减少所需的逻辑门数。


Karnaugh 图(K-Map)详解

K-Map 的构造与基本原理

Karnaugh 图是一种二维图形工具,用来表示所有可能的 minterm(或 maxterm)。对于 n 个变量,其对应的 K-map 有 2n2^n 个格子。每个格子对应一个 minterm,其填入 1 或 0 表示该组合下函数的输出值。

例如,4 变量 K-map 的示意图如下:

image-20250304001101036

Gray Code 排列与邻接性

为了确保图中相邻的两个格子只在一个变量上不同,K-map 的行和列标签通常采用 Gray Code 排列。这种排列使得每两个相邻格子的汉明距离为 1。也就是说,当你从一个格子跳到相邻格子时,仅有一个输入变量发生了变化。

这种特性对于合并操作至关重要:

  • 合并原则:当两个或多个 minterm 相邻且均为 1 时,可以合并这些项,消去变化的变量,从而得到更简化的表达式。

此外,K-map 的边界是“环形”的,意味着最左边和最右边的格子也被视为相邻;最上面和最下面的格子也同样相邻,这进一步增加了合并的可能性。

分组方法及示例

在 K-map 化简过程中,我们通常进行如下操作:

  1. 标记所有 1:将函数真值表中输出为 1 的 minterm 填入 K-map 相应的格子。
  2. 寻找相邻群组:查找能够合并的相邻 1 的区域。这些区域必须包含 2 的幂(如 1, 2, 4, 8…)个格子。找到所有最大可能区域(不被其他区域完全覆盖);然后提取出所有包含exclusive格子的区域;提取出后可能存在有1格子没有覆盖到,枚举找到对应的最大格子进行覆盖。
  3. 生成合并项:对于每个群组,很容易找到对应的Product项。

例如,一个 4 变量 K-map 中,若某一组四个相邻格子的 1 可以合并为一个项,则该项中消去了其中变化的变量,只保留不变部分。

优缺点与应用场景

优点

  • 直观易懂,便于手工化简小规模问题。
  • 图形化的表示方式能快速找到可合并项。
  • 环形结构提高了合并的可能性。

缺点

  • 当变量较多时(超过 6 个变量),K-map 图形将变得非常复杂,难以直观操作。

应用场景

  • 适用于教学和初学者进行简单逻辑化简。
  • 在小规模组合逻辑设计中,常用 K-map 作为辅助工具。

数学思想(重要!)

  • 这里gray code的使用保证了任意一个格子四周的格子都是正好改了一个01的,同样,每一个区块旁边的一个整的区块也是正好改了一个01。这样就可以保证同一个区块内一定可以简化。

  • 给定f(x, y, z, w)的SOP求最简SOP,本质上就是用truth table找到01完全相同的映射。在写成SOP形式后,每一种(x, y, z, w)只可能导致一个product为1,而其他都为0。因此,kmap只是将truth table进行重新排列。

  • 如果给定f(x, y, z, w)的SOP要求最简POS,则:

    f =& \sum{m}\\ \bar f =& \sum{m_{rest}}\\ f =& \prod{M_{rest}} =& \sum{\bar m_{rest}}

    所以操作步骤就是先用kmap求出mrestm_{rest}(不在m中的所有元素)的最简形式,然后将所有m取反就是POS形式了。

  • 但是kmaps并不能对POS应用,所以当给了POS形式要化最简先要转化为POS形式,也就是M=mˉ\prod M = \sum \bar m ,或者也可以是填充所有mrestm_{rest},然后进行计算。


Quine–McCluskey 算法详解

Quine–McCluskey 算法是一种基于表格的系统化方法,适用于变量较多的布尔函数最小化问题。它可以视为 K-map 化简方法的扩展,能够通过计算机程序自动化求解最简表达式。

算法基本步骤

  1. 列出所有 minterm:根据真值表,将所有输出为 1 的 minterm 列出,并根据 minterm 中 1 的个数分组。
  2. 初步合并:对相邻组(相差一位)的 minterm 进行比较,合并出能消去的变量,并记录合并时消去的位置(用“–”或空白符号表示)。
  3. 迭代合并:将新合并的项再次按照同样的方法进行合并,直到无法再合并为止。最后留下的不可再合并项就是 Prime Implicants(质蕴涵项)。

Prime Implicants 与 Essential Prime Implicants

  • Prime Implicants(质蕴涵项):是那些不能再进一步合并的项,它们覆盖了部分或全部原始 minterm。
  • Essential Prime Implicants(本质质蕴涵项):在所有覆盖方案中,如果某个 minterm 仅被一个 Prime Implicant 覆盖,则该项必然是 Essential Prime Implicant。

覆盖表法详解

覆盖表法用于从所有 Prime Implicants 中选出最少的那一组以覆盖所有的 minterm。步骤如下:

  1. 建立覆盖表:表的行代表所有 Prime Implicants,列代表所有 minterm。
  2. 标记覆盖关系:如果某个 Prime Implicant 能覆盖某个 minterm,则在对应表格位置标记 1。
  3. 选择 Essential Prime Implicants:首先找出那些唯一覆盖某个 minterm 的项,将它们选入解集。
  4. 解决剩余 minterm:对于未覆盖的 minterm,利用贪心算法或穷举法从剩下的 Prime Implicants 中选取最少数量的项。

算法复杂度与改进

  • 复杂度:Quine–McCluskey 算法在最坏情况下的复杂度为指数级,因此对于变量数较多的函数(超过 6 个变量)会变得计算量巨大。
  • 改进方法:在实际应用中,通常结合启发式算法(如 Petrick's Method)或借助现代计算机辅助设计工具来处理大规模问题。

案例分析:实际布尔函数的最小化过程

以下是一个具体的例子,展示如何利用 K-map 与 Quine–McCluskey 算法对同一个布尔函数进行最小化。

例子

假设有布尔函数 F(A,B,C,D)F(A,B,C,D),其真值表中输出为 1 的 minterm 为:m(1,3,7,11,15)m(1,3,7,11,15)

使用 Karnaugh 图

  1. 绘制 K-map:按照 4 变量 K-map 格式,将所有 16 个格子按 Gray Code 排列。
  2. 填入 1:在对应的 m(1,3,7,11,15) 位置填入 1。
  3. 查找邻近项:观察 K-map,找到相邻且均为 1 的格子组合(考虑边界的环形连接)。
  4. 合并生成表达式:例如,可能合并为若干个群组,最终得到表达式 F=BD+ACF = B \cdot D' + A' \cdot C(仅为示例,实际表达式视具体合并结果而定)。

使用 Quine–McCluskey 算法

  1. 分组

    :将 m(1,3,7,11,15) 按照 1 的个数分组:

    • 1 个 1:m(1)
    • 2 个 1:m(3)
    • 3 个 1:m(7,11)
    • 4 个 1:m(15)
  2. 初步合并:比较相邻组 minterm,合并得到中间项。

  3. 迭代合并:不断合并直到获得 Prime Implicants。

  4. 覆盖表法:构造覆盖表,选择 Essential Prime Implicants,最终得到最简 SoP 表达式。

通过这两种方法,你可以验证最终得到的表达式是否一致,并比较它们在实际问题中各自的优劣。


编程实现与工具推荐

对于实际工程应用,手工化简仅适用于变量较少的情况。对于复杂的布尔函数,推荐使用以下工具:

  • Espresso:经典的逻辑最简化工具,基于启发式算法。
  • Logic Friday:图形化的逻辑最简化软件,支持 K-map 与 Quine–McCluskey 算法。
  • MATLABPython 脚本:许多开源代码库(如 pyeda)中实现了 Quine–McCluskey 算法,可以方便地进行自动化求解。

例如,在 Python 中,你可以利用 pyeda 库来自动最简化布尔表达式,并生成相应的 K-map 与覆盖表。

(本文大多为AI生成,经由我修改和验证正确性)

Comments

No comments yet.