2.4 两级电路的优化
用于实现布尔函数的逻辑电路的复杂度直接取决于实现该函数的代数表达式的形式。虽然函数的真值表是唯一的,但当用代数表达式表达时,函数却可以有许多不同的形式。布尔表达式可以通过代数运算来化简,如2.2节所讨论的那样。然而,化简过程并不是那么容易,因为在化简的过程中没有任何规则能告诉你下一步应该怎样做,而且也很难判断现在是否已经化简到了最简单的形式。与此相反,用画图来对不多于4个变量的布尔函数进行化简却是一种直截了当的方法。对五变量和六变量也可以使用画图的方法,但使用起来有点麻烦。这种图也称作卡诺图(Karnaugh map)或K-图(K-map)。卡诺图由很多方格组成,每个方格代表真值表中的一行或一个单输出函数的一个最小项。因为任何布尔函数可以由最小项之和来表示,所以函数在卡诺图中可以被看成是所有那些使函数取值为1的方格,它们所对应的最小项包含在函数中。从一个更为复杂的观点来看,画图的方法是对一个函数所有可能标准表示方式的图形化,函数最优的积之和表达式就在这些方式当中。通过卡诺图化简之后的表达式通常是积之和或者和之积的形式,因此卡诺图可用于两级电路的优化,但是不能够直接用于三级或者更多级电路的优化。首先我们来讨论积之和的化简,然后再把它应用到和之积的化简中。
**2.4.1 成本标准
**在前面的章节中已经提到,对变量和函数项进行计数是衡量一个逻辑电路是否简单的一种方法。现在我们引入两种标准来形式化地描述这个概念。
第一个标准是文字成本(literal cost),即与逻辑图一一对应的布尔表达式中文字的个数。例如,图2-10所示电路对应的布尔表达式为
F=AB+C(D+E)和F=AB+CD+CE
可以看到第一个等式中有5个文字,第二个等式中有6个文字,所以如果用文字成本来衡量,则第一个等式最好。文字成本的优点是计算方法很简单,通过对表达式中的文字进行计数即可。但是,并不是在所有情况下,这种方法都能精确地表示电路的复杂度,即便是用于同一逻辑函数的不同实现方式的比较。下面用两种不同的布尔表达式来表示函数G,可以举例说明这一状况:
G=ABCD+ABCD和G=(A+B)(B+C)(C+D)(D+A)
这两个表达式的实现成本用文字成本来衡量都是8,但第一个等式有2个函数项,第二个等式有4个函数项,这表示第一个等式比第二个等式的成本低。
为了能够反映这些不同,我们定义另外一种成本标准,即门输入成本(gate-input cost),它是与给定等式一一对应的实现中所用门的输入端的个数。这个成本很容易从逻辑图中得出,只要对逻辑图中门的输入端进行计数即可得到。对于和之积等式或者积之和等式,可以从等式中查找出下列情况来获得门输入成本:
1)全部文字数;
2)除单个文字之外的全部项数,或者再加上;
3)不同的取反值的单个文字总数。
1)表示来自电路外部的全部门输入个数;2)表示电路内部除反相器之外的所有门输入个数;而3)则表示当外部不提供反变量时需要将变量取反所用的反相器的个数。对于前面两个等式,如果不计算第3)项,则两个等式的门输入数分别为8+2=10和8+4=12。如果包括对第3)项的计算,考虑反相器的输入,则两个等式的门输入数分别为14和16。虽然G的两个等式的变量成本相同,但是第一个等式的门输入成本较低。
门输入成本是目前评价相同工艺逻辑电路实现方法的一种好的指标,因为它与逻辑电路中晶体管和连接导线的数量成正比。在计算两级以上电路的成本时,采用门输入成本尤为重要。通常,随着电路级数的增加,文字成本只占实际电路成本的很小一部分,因为越来越多的门不从电路外部获得输入。在配套网站上,我们将介绍复杂的门类型,通过等式来计算门输入成本对于这些门将失去意义,因为等式中的与、或和非运算与电路中的门再也没有一一对应的关系。在这种情况下,对于那些比积之和、和之积复杂得多的等式,门输入计数也只能直接由实现方法来决定。
无论使用什么样的成本标准,我们之后将看到最简单的表达式不是唯一的,有时候可能得到两个或者更多的表达式符合所使用的成本标准。在这种情况下,任何一种答案都满足成本要求。
2.4.2 卡诺图结构
我们将讨论图2-12所示的两变量、三变量和四变量的卡诺图。每个图中的小方格数量等于函数最小项的数量。在对最小项的讨论中,我们定义最小项mi与真值表中的第i行一致,i是真值表中变量取值的二进制形式。这种用i来表示最小项mi的方法被用到卡诺图的单元(即方格—译者注)中,每一个单元对应一个最小项。对于2、3、4个变量,分别有4、8和16个方格。每一个卡诺图都可以用两种方法来标记:1)行变量和列变量位于卡诺图的左上方,每一行每一列都标有这些变量的一个二进制组合;2)将单行单列或双行双列单元用方括号括起来,并在括号的旁边标有一个变量,标有变量的区域对应卡诺图中该变量的取值均为1,变量取值为0的区域则隐含地用变量取反来标记。这两种标记方法只需要选择一种,但是书中给出了两种以便读者根据需要选择其中的一种。
先来看二进制组合方式,我们发现卡诺图左边从上到下采用了1.7节中介绍过的格雷码。在这里使用格雷码很恰当,因为它表示相邻的二进制组合和对应的最小项,这些都是卡诺图的基础。如果两个二进制组合中只有一个变量的值不同,则称它们是相邻(adjacent)的。如果两个乘积项(包括最小项)中只有一个变量不同,且这个变量在一个乘积项中未取反,而在另一个乘积项中取反,则称它们为相邻项。例如,组合(X,Y,Z)=011和010是相邻的,因为它们中只有变量Z的值不同。进一步说,最小项XYZ和XYZ是相邻项,因为它们中除了文字Z不同外,其余文字都相同,而Z在一个最小项中取反,在另一个最小项中不取反。在卡诺图中使用格雷码的原因是,任何两个有相同边缘的方格,它们对应于一对相邻的二进制组合和一对相邻的最小项,这种对应关系可以用于对用卡诺图表示的逻辑函数的乘积项进行化简。这样的化简基于布尔代数定理:
AB+AB=A
将例中的A和B进行代换A=XY和B=Z,得
(XY)Z+(XY)Z=XY
观察图2-12c中的卡诺图,我们可以看到两个对应的方格位于(X,Y,Z)=011(3)和010(2),即它们分别在行为“0”、列为“11”的位置和行为“0”、列为“10”的位置。注意这两个方格是相邻的(有共同的边缘)并且可以组合,如图2-12c中黑色矩形所标出的那样。卡诺图中的矩形包含Z=0和Z=1,也就是不再与Z有关系,可以写成XY。这就证明了,当表示函数最小项的两个方格有相同的边缘时,这些方格就可以组合到一起形成一个少了一个变量的乘积项。
对于三变量和四变量的卡诺图,关于相邻的概念有一个新的问题需要进行说明。对于三变量的卡诺图,图2-12c中的最小项0和2没有共同的边缘,所以看起来它们不是相邻的。然而,这两个最小项XYZ和XYZ根据定义是相邻的。为了识别卡诺图中这种相邻情况,我们应该把卡诺图的左边界和右边界看成是同一条边。从几何角度来看,可以将卡诺图卷成一个圆柱,卡诺图的左边界和右边界重合在一起,因此卡诺图的左边界和右边界事实上是一条公共的边缘。这个圆柱的图形如图2-12d所示,这里的最小项m0和m2有相同的边缘,从卡诺图中来看,它们是相邻的。同样,m4和m6在卡诺图中也有相同的边缘,所以它们也是相邻的。图2-12c和图2-12d中用灰色线标出的两个矩形就是这样两种相邻情况。
图2-12e所示的四变量卡诺图同样可以形成一个圆柱体,可以用来解释四对相邻的方格,m0和m2、m4和m6、m12和m14、m8和m10。最小项m0和m8,WXYZ和WXYZ是相邻的,这说明卡诺图的顶层边界和底层边界共享同一边缘。可以通过弯曲由卡诺图得到的圆柱的方法来实现这两条边界邻接,这就变成了如图2-12f所示的圆环(甜甜圈)形状。卡诺图中其他的相邻方格还有m1和m9、m3和m11、m2和m10。
不幸的是,圆柱和圆环的方法并不方便使用,但是它们可以帮助我们记住共享边缘的位置。对于水平式的三变量卡诺图,共享边缘位于左边界和右边界上。而对于四变量卡诺图,共享边缘分别位于左边界和右边界上以及顶层边界和底层边界上。使用平面式的卡诺图需要把矩形拆分成对,这些矩形跨越边界对。
最后一个细节就是将给定的函数F画到卡诺图中。假设函数用真值表方式给出,表中的行用十进制数i来表示,并且i与输入变量的二进制取值相等。根据卡诺图左边和顶端二进制变量组合的排列顺序,我们可以标记每一个与i一致的单元格。这样就很容易将真值表中的0和1转换到卡诺图中,基于这一目的的i的取值情况如图2-12中的三个卡诺图所示。通过观察i值在以格雷码形式表示的行和列中所对应的位置顺序关系,来快速填写i的值是个不错的方法。例如,对于四变量的卡诺图,以行和列顺序排列的i值是:0、1、3、2、4、5、7、6、12、13、15、14、8、9、11、10。二变量和三变量卡诺图中i值的行和列顺序分别是该序列的前4个值和前8个值。这些值还可以用在缩写方式表示的最小项之和表达式中。注意,i的位置是由变量位置决定的,四变量卡诺图中变量的位置依次在左下侧、右侧中间、顶部右边和中间底部。对于二变量和三变量的卡诺图,除不存在的“中间”位置外,其他排列顺序相同。改变这样一种排列顺序将得到另一种形式的卡诺图结构。
2.4.3 二变量卡诺图
使用卡诺图有4个基本步骤。首先,我们用一个二变量函数F(A,B)来举例说明这几个步骤。
第一步是将函数画到卡诺图中。函数可以是真值表形式、m最小项之和的缩写形式或者是积之和表达式。函数F(A,B)的真值表如表2-12所示。函数F取值为1的每一行中,A和B的值可以决定卡诺图中何处标记1。例如,当A=0和B=0时函数的值为1,因此图2-13a的卡诺图中对应A=0且B=0的左上方格标记1。对真值表中的行(0,1)和(1,1)重复这样的操作,在卡诺图中各自所表示的位置标记1。
如果在真值表中增加最小项的十进制数下标,并像前面所讨论的那样在卡诺图上进行标记,则可以更快地将函数用卡诺图表示出来。被标记的函数最小项的下标对应着函数取值为1的那些行,所以卡诺图中方格0、1和3被标记为1。对于这两种标记方法,包括其他一些方法,我们都默认剩下的每一个方格均为0,但在卡诺图中却没有表示出来。
真值表所给出的函数F用m符号表示为F(A, B)=m(0, 1, 3),这可以在卡诺图的方格0、1和3中简单地写入1。另外,也可以用积之和表达式,例如F=A+AB来表示函数,它可以转换成最小项并画到卡诺图中。更简单的办法是,在卡诺图中找出乘积项所对应的区域并将其标记1。因为AB是一个最小项,我们可以简单地在方格3中标记1。对于A,我们可以看到它在卡诺图的区域是“非”A,该区域由方格0和1组成,所以A可以通过对这两个方格标记1来表示。总之,一旦我们掌握了卡诺图中矩形的概念,最后这个过程就变得简单,就像我们接下来讨论的那样。
第二步是确定用来表示简化表达式的乘积项在卡诺图中所对应的方格块。我们称这些块为矩形(rectangle),因为它们的形状是一个矩形的形状(当然包括方格)。与乘积项对应的矩形所包含的方格数必须是2的幂次方,例如1、2、4和8,这也意味着矩形任意一边的长度是2的幂次方。我们的目的是要找出最少的这样的矩形来包含或覆盖所有标记为1的方格,这样就可以得到最少的乘积项,当把这些乘积项加起来时输入成本最小。我们得到的每一个矩形都应该越大越好,为的是覆盖尽可能多的1方格,一个大矩形也意味着低输入成本。
例如有两个最大的矩形,一个由方格1和0组成,另一个由方格3和1组成。方格1和0表示的最小项分别为AB和AB,它们可以组合形成矩形A。方格3和1表示的最小项分别为AB和AB,它们可以组合形成矩形B。
第三步是判断为卡诺图中的1方格而产生的矩形中是否有多余的。在这个例子中我们可以看到,为覆盖最小项0矩形A是必要的,为覆盖最小项3矩形B是必要的。通常情况下,如果一个矩形可以被删去而且卡诺图中余下的矩形覆盖了所有的1方格,那么这个矩形是不需要的。如果两个不同大小的矩形需要删去一个,那么最大的那个应该保留。
最后一步就是从卡诺图中读出积之和表达式,确定卡诺图所需矩形的相关乘积项。在这个例子中,我们可以通过矩形和变量如A和B在卡诺图中的界限来读出相关的乘积项,得到F的积之和表达式为:
F=A+B
例2-4 另一个二变量的卡诺图举例
二变量函数G(A,B)=m(1, 2)的卡诺图如图2-13b所示。观察卡诺图,我们发现两个矩形是简单的最小项1和2。由图可得
G(A, B)=AB+AB ■
由图2-13a和图2-13b我们可以看到二变量的卡诺图含有:1)对应最小项的1×1矩形;2)由一对相邻最小项组成的2×1矩形。一个1×1矩形可以表示卡诺图中任何方格,一个2×1矩形可以呈水平状态或垂直状态,而2×2矩形覆盖了整个卡诺图,所对应的函数F=1。
2.4.4 三变量卡诺图
我们将通过两个例子来介绍三变量卡诺图的化简,从而对二变量卡诺图中未曾涉及的新概念进行讨论。
例2-5 三变量卡诺图化简1
化简布尔函数
F(A, B, C)=m(0, 1, 2, 3, 4, 5)
函数的卡诺图如图2-14a所示,方格0~5都标记了1。在卡诺图中,两个最大的矩形每一个都覆盖了4个1方格。注意0和1方格,它们都被这两个矩形覆盖。因为这两个矩形覆盖了所有的1方格,而且任何一个都不能删除,所以这两个乘积项的逻辑和是函数F优化后的表达式:
F=A+B
为了用代数方法来解释4×4矩形如B是如何得到的,可以看一下两个相邻的矩形AB和AB,它们分别被两对相邻的最小项连接了起来。利用定理XY+XY=X,这里X=B,Y=A,可以将这两个黑色矩形合并,从而来得到B。 ■
例2-6 三变量卡诺图化简2
化简布尔函数
G(A, B, C)=m(0, 2, 4, 5, 6)
函数的卡诺图如图2-14b所示,括号中数字表示的方格都标记1。在某些情况下,卡诺图中的两个方格尽管相互不接触,但它们是相邻的并组成一个大小为两个方格的矩形。例如在图2-14b和图2-12d中,m0与m2相邻,因为这两个最小项只有一个变量不同。这容易通过代数方法验证:
m0+m2=ABC+ABC=AC(B+B)=AC
这个矩形在图2-14b中用黑色线表示,在图2-12d所示的圆柱体中用灰色线表示,其相邻关系是显而易见的。同样,在两个图中都有一个矩形AC覆盖了方格4和6。从前面的例子中可以明显地看出,这两个矩形又可以合并成一个更大的矩形C,它覆盖了方格0、2、4和6。为了覆盖方格5,我们需要另外一个矩形,最大的这样一个矩形覆盖方格4和5,在卡诺图中表示的是AB。化简后的函数为
G(A, B, C)=AB+C ■
从图2-14a和图2-14b,我们可以发现三变量的卡诺图包含了所有二变量卡诺图中的矩形,再加上1)2×2矩形,2)1×4矩形,3)2×1在左右边缘“分离的矩形”,2×2在左右边缘“分离的矩形”。注意,一个2×4矩形覆盖了整个卡诺图,对应的函数G=1。
例2-7 三变量卡诺图化简3
化简布尔函数
H(A, B, C)=m(1, 3, 4, 5, 6)
函数的卡诺图如图2-14c所示,括号中数字表示的方格都标记1。在这个例子中,我们特意把工作目标定为寻找最大的矩形,以便强调化简过程中的第三个步骤,这在前面的例子中没有明显提及。根据上述思想,我们找出可以合并成矩形的方格对:(3, 1)、(1, 5)、(5, 4)和(4, 6)。这些矩形中是否可以删去某一个,而同时又保证所有的1方格仍然被覆盖呢?因为只有(3, 1)覆盖方格3,所以它不可以删除。对于覆盖了方格6的(4, 6)也是这样。在这些都被包含之后,唯一没有被覆盖的方格只有5了,它可以被(1, 5)或者(5, 4)覆盖,但不需要同时被这两者覆盖。假设保留(5, 4),则从卡诺图得到的结果为
H(A, B, C)=AC+AB+AC ■
例2-8 四变量卡诺图化简1
化简布尔函数
F(A, B, C, D)=m(0, 1, 2, 4, 5, 6, 8, 9, 10, 12, 13)
函数的卡诺图如图2-15所示,函数的最小项都标记了1。左边两列的8个方格合并成一个矩形得到一个变量项C,余下的三个1方格不能合并为一个简化了的乘积项,但它们必须合并成两个分离的2×2矩形。顶端右边的两个1与顶端左边的两个1合并得到函数项AD。再次提醒一下,我们允许同一个方格被使用多次。现在只剩下一个位于第4行、第4列的方格(最小项1010)标记为1。如果让这个方格单独成为一项,则需要使用4个文字来表示,但如果将它与已经使用过的一些方格合并,可以在4个角上形成一个含有4个方格的矩形,得到函数项BD,这个二变量的函数项可用来代替4变量的函数项。
这个矩形在图2-15和图2-12e中用4个直角来表示,4个方格的相邻关系表示得很明显。优化后的表达式是三个函数项的逻辑和形式:
F=C+AD+BD ■
例2-9 四变量卡诺图化简2
化简布尔函数
G(A, B, C, D)=ACD+AD+BC+CD+ABD
这个函数有4个变量:A、B、C和D,其积之和表达式有点复杂。为了用卡诺图表示G,我们先将乘积项表示的区域画到卡诺图中,并用1标记,然后复制所有的1方格到另一个新的卡诺图用来化简。图2-16a所示的是函数的卡诺图。ACD表示标记为1的方格0和4,AD表示标记为1的方格1、3、5和7,BC新增标记为1的方格2、10和11,CD新增标记为1的方格15,而ABD新增标记为1的最后一个方格8。所得到的函数
G(A, B, C, D)=m(0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 15)
用卡诺图表示的结果如图2-16b所示。检查一下四角的矩形BD是否出现,是首先应该做的一件事。现在这里需要一个矩形覆盖方格8、0、2、10,在这些方格被覆盖后,很容易看出只要两个矩形AC和CD就可以覆盖余下的方格,我们因此可以得到函数的结果为
G=BD+AC+CD
注意,这样得到的函数比原来给出的积之和表达式要简单很多。
■