在之前,我们使用卡诺图来找到一个系统的布尔表达式,但这只适用于变量较少的情况,如果遇见大量的变量,使用卡诺图化简的方式就会变得非常复杂,之前从四个变量升到五个变量就使得卡诺图多了整整一层,难以想象继续下去会是多么庞大的工作量
奎因麦克劳斯基法(Quine-McCluskey method)就是用于简化大量变量的一种手段,因为用的并非图表,这也是相对来说比较适合计算机编程的方式,接下来,我们将逐步介绍这种方法的应用流程
1. 找到所有的一次蕴含项
假设我们现在有一个系统:
根据蕴含项中“1”的数量将其分组,这样可以避免不必要的比较,它的所有一次蕴含项就可以表示为:
2. 一次合并
得到一次蕴含项后,我们需要尽可能将他们合并,如果两个项有三个位置是相同的,就可以合并成一个项,不同的位置用“-”代替
举个例子,group 0 中的 0000 与 group 1 中的 0001 只有最后一个位置不一样,那么他们就可以合并为 000-
这种合并理论的表达式为:
X
Y
+
X
Y
′
=
X
XY+XY'=X
XY+XY′=X
在合并时,我们可以通过一些技巧来减少不必要的比较,方法如下:
- 只有相邻的两个组需要比较,如果组不相邻,那么他们一定不可能合并,比如组0就只需要和组1比较,组1只需要和组0和组2比较
- 同一个组内的项不用比较,他们也一定不可能合并
将所有可能的合并完成后,把得到的合并项仍旧按照“1”的数量分组并列出来,结果如下:
如果有无法与任何其它项合并的项,它就是质蕴含项,会出现在最终表达式中
3. 二次合并
接着,我们需要进一步合并刚才得到的含一个“-”的项
如果某两个项“-”的位置一样,且只有一个变量不同,就可以合并成一个项,不同的变量用"-"代替,最终结果含有两个“-”
举个例子,000- 与 100- 中“-”的位置一样,且只有第一个变量不同,他们就可以合并为 -00-
合并的技巧与一次合并相同
完成所有可能的合并后,将内容重复的项删掉,按照“1”的数量分组,得到结果如下:
这种合并可以一直持续下去,直到没有任何项可以被合并为止,这时我们就得到了所有质蕴含项
对于四个变量的系统,目前的结果就无法继续合并了,但变量越多,合并的步骤就可能越多
这对于人来说可能仍然繁琐,但对于计算机编程来说,实现奎因麦克劳斯基算法比卡诺图要简单得多
最后,我们将所有得到的质蕴含项写成表达式:
现在,我们可以试着将奎因算法与卡诺图联系起来
奎因算法实质上就是先找出卡诺图中所有一次蕴含项,然后将所有相邻的一次蕴含项合并成二次蕴含项,再将相邻的二次蕴含项合并成四次蕴含项,以此类推
这种方法其实有一个问题,那就是最终得出的项的数量不一定是最小的,对应成卡诺图,就是说画出的圈的数量不一定最小
这个问题就要交给素项表解决
4. 素项表
首先,将之前得到的所有质蕴含项列成一列,然后将项中包含的所有可能的值写在上方
接着,在质蕴含项和值的对应处画X,画完后,如果某个X是一列中唯一的X,则圈出来,如图:
这个被圈出来的X就是实质本源蕴含项(essential prime implicant),它必须被包含在最终的SOP中
下面,可以试着在被圈出来的X处画一条横线,将其所在行的X都串上,再以每个被串上的X为出发点,连接同一列内的X,成果如下:
最后,尽量用最少的线连接剩下的几个X,最终成品如下:
将横线代表的表达式写出来,就是最小SOP了,图中所代表的最小SOP为
针对don’t cares,可以直接将其作为普通的项来对待,即
对应的算法为:
但要注意的是,最后画线的时候,不要将don’t cares对应的数字写在上方,如下图:
可以看到,上方并没有列出1,10,15