2.5 逻辑化简算法
K图化简是一种图形的方式,只能适用于很小数目的变量,例如4个变量的表达式中。当变量数大于4时,在20世纪50年代中期发明的叫作奎因-麦克拉斯基算法的数学方式更合适于表达式化简。这个算法使用比K图更少的步骤来寻找最小逻辑表达式。最小项被划分成不同的集合,每一个集合都只包含一个在二进制表达中有特殊个1的个数的最小项。考虑例2-5中的表达式f (w, x, y, z) = Σ (0, 2, 3, 4, 5, 6, 7, 8, 10, 12, 13)。在二进制中,最小项为0000, 0010, 0011, 0100, 0101, 0110, 0111, 1000, 1010, 1100和1101。这些最小项可以分组成下列4个集合:
每一次比较一对最小项,集合1中的一个最小项与集合2中的一个最小项比较。在每一对最小项比较中,一位数字的改变意味着一个蕴含。改变位可以用一条横杠(-)表示,从而省略对应的变量。
例如,集合1中的最小项0000与集合2中的0010比较,可以生成蕴含00 - 0,变量y被省略。最小项0000可以再与最小项0100比较,生成蕴含0 - 00,变量x被省略,等等。这个过程(每一次比较一对最小项)可以用于所有最小项。集合2和集合3,集合3和集合4可以生成用于结果的一个蕴含的集合。初始集合1到集合4标记为表2-4列Ⅰ中的Ⅰ.1到Ⅰ.4。
使用集合Ⅰ.1到Ⅰ.4生成的蕴含列表标记为集合Ⅱ.1到Ⅱ.3,写在表2-4的列Ⅱ中。接下来,对于集合Ⅰ.1到Ⅰ.4中的最小项,如果在列Ⅱ的最小项可以生成一个蕴含,就用一个“x”标记;否则,就用星号(*)标记,识别出一个素蕴含(在这个例子中没有)。当列Ⅱ中的蕴含生成之后,重复之前的步骤;每一次比较一对集合Ⅱ.1和集合Ⅱ.2中的一对蕴含。在这个例子中,在每一对蕴含之间的横杠必须排列起来。
例如,集合Ⅱ.1中的蕴含00 - 0与集合Ⅱ.2中的蕴含10 - 0比较。生成的蕴含写在表中的列Ⅲ下的集合Ⅲ.1和Ⅲ.2。同样,如果列Ⅱ中的蕴含对生成的不是素蕴含,用“x”标记;否则,用星号()标记,在这个例子中没有素蕴含。这个过程在列Ⅲ中重复一次,但是这次,没有更多的步骤可以走了,因为集合Ⅲ.1和集合Ⅲ.2中的蕴含一一比较之后,不能再生成新的蕴含;这样,所有从集合Ⅲ.2和集合Ⅲ.3中产生的蕴含都标记为星号(),与其对应的逻辑项在图2-17中列出。
程序的下一步是要在素蕴含列表a到f用一个最小集合算法来选择基本蕴含。图2-17是素蕴含和它们对应最小项的组织图。如果一个素蕴含包含一个最小项,则在方格中用“x”标记。例如,有两个横杠的素蕴含0 -- 0包含了最小项0 = (0000)2,2 = (0010)2,4 = (0100)2和6 = (0110)2,这些最小项方格中在行1中标记为“x”,如表格所示。
最小集合算法也是一个迭代的过程,最开始在任意列中选择只有一个有“x”标记的素蕴含,这样可以生成一个EPI。在这个例子中,最小项3、10和13相关的列中只有一个“x”标记;这些类似的例子在表格中用粗体和下划线表示出来。
假设在表2-5中从左往右处理最小项。在迭代1中,最小项3相关的列只包含一个“x”,这样对应的素蕴含0 - 1 -可以作为一个EPI,因为其只包含最小项3。它也可以包含最小项2、3、6和7,这样相关的列和行被标记为删除(D),如表格中所示。这个过程可以有效地消掉下一个迭代中表格的规模。在迭代2中,素蕴含- 0 - 0在最小项10相关的列中只有一个“x”标记,我们选择其为下一个EPI。这样,列0、8和10,行2标记为D。最后,在迭代3中,与最小项13相关的素蕴含- 10 -,被选作为下一个EPI,这样则需要删掉表中所有的剩余列,以及EPI = - 10 -对应的行。
当所有与最小项有关的列都删除之后,算法结束。在这个例子中,经过三轮迭代后算法结束,并产生三个EPI,- 0 - 0、0 - 1 -和- 10 -,“迭代”部分对应的行标记为D。EPI生成了最小SOP表达式,在例2-6中,我们使用K图的方法也得到了这个表达式。
如果在最小集合算法过程中,没有发现有一列只有一个“x”标记,以下的规则可以用来选择下一个候选的素蕴含:
1)找到至少有一个“x”标记的列,然后选择其对应的素蕴含作为候选项。
2)在第1)步素蕴含列表中选择那些在剩下的最多最小项的素蕴含(不包括有D标记的列)。
3)如果在第2)步中得到多个素蕴含,选择那个包含横杠最多的素蕴含;其对应的逻辑项应该包含较少变量。
4)如果在第3)步中得到多个素蕴含,则可得到两个或以上的等价最小表达式。
除了在表2-4和表2-5中需要用最大项来替换最小项求最小POS表达式的算法过程也是相似的。
如果一个逻辑电路有多个输出,每个输出的最小表达式通常不会独立地确定。相反,此时化简的目标是选择在不同表达式之间相同的素蕴含,从而可以减少实现多个表达式电路中所需的逻辑门数目。一些逻辑门的输出信号可以被共享和连接为其他逻辑门的输入。Espresso优化软件[1]可以解决需要同时化简多个逻辑表达式的情况。逻辑设计的CAD工具通常包含这个软件和其他化简软件。
化简软件
例2-9展示了用函数f (w, x, y, z) = Σ (0, 2, 3, 4, 5, 6, 7, 8, 10, 12, 13)最小项来进行Espresso操作的输入和输出文件。第一列中的点(•)代表一个参数。例如,“.i 4”表示输入的个数,在这个例子中为4,“.o 1”表示输出的位数,这个例子中为1。标记“.ilb w x y z”列出输入的变量,这个例子中为4个变量;“.ob f”列出输出变量,在这个例子中为1个变量;“.e”表示输入文件的结尾。符号“#”表示一行注释。在输出文件中,“.p”表示EPI的数目。
例2-9 用Espresso化简函数f (w, x, y, z) = Σ (0, 2, 3, 4, 5, 6, 7, 8, 10, 12, 13)。
解:
a)输入文件
b)输出文件:所有注释行首先打印
输出文件列出了3个EPI:- 10 -、- 0 - 0和0 - 1 -。这3个EPI与之前手工步骤求出的相同,在表2-4和表2-5中列出。
下列的Espresso输出列出了两个输出信号f和g的EPI。“11”、“11”和“10”打印在EPI之后,这三个EPI都是属于输出信号f的,而前两个(- 10 -和-0 - 0)是共享的并属于输出变量g。
表2-6展示了表达式f (w, x, y, z) = Σ (1, 9, 14) + Σd (3, 7, 11),运用化简算法后的结果,这个表达式也在2.4.2小节中化简过。在列Ⅰ中,每一个无关项都标记为“d”。之前讨论过的化简算法也是一样的,只是在一对最小项中只能有一个无关项;两个无关项不能进行比较。例如,集合Ⅰ.2中最小项(0011)2和集合Ⅰ.3中的最小项(0111)2,两个都为无关项,不能进行比较来产生素蕴含0 - 11。
算法产生三个素蕴含(以星号为标记),每一个在一行中。表2-7是表2-6运用最小集合算法之后的素蕴含组织表。集合Ⅰ.3素蕴含(1110)2是一个EPI。在剩下的两个素蕴含- 0 - 1和- 001中都包含最小项1和9,由于- 0 - 1有比- 001更多的横杠,所以选择- 0 - 1。这些EPI也可以在例2-10中用Espresso算法实现,输入文件中的横杠(-)代表无关的候选项。
例2-10 用Espresso算法化简f (w, x, y, z) = Σ (1, 9, 14) + Σd (3, 7, 11)。
(a)输入文件
(b)输出文件