
马上就要正式进入电路设计了,再来看最后一个知识点:逻辑设计吧。
之前我们花了两章,探讨了逻辑运算是什么,怎么算;但还有最后一个大问题,巧妇难为无米之炊,我们得先有一个逻辑式,才能对它化简,并基于结果做电路设计。所以,如何把实际生活中的问题转化为逻辑函数式呢?
先介绍两种比较标准的函数的形式:
- 最小项表达式,是若干单项式相加,可以类比成代数式展开后的样子,形式类似
,得名于其因为项中用乘法连接而使得每一项为1的概率都很小。
- 最大项表达式,是若干多项式相乘,可以类比成代数式因式分解后的样子,形式类似
,得名于其因为项中加法连接而使得每一项为1的概率都很大
其中实际中用得比较多的是最小项表达式。本文也将在此式的基础上讨论。
进一步地,我们还会再看逻辑函数与其他表现形式的转化关系,并正式介绍两个工具:逻辑图和卡诺图。
一、从对问题的描述得出函数式
我们开篇的问题中,就是利用了把问题转化为比较“标准”的逻辑命题,加以处理的。一般地说,通过自然语言表述得出方程,首先要把任务写成“只有...且...时,才...”(最大项表达式)或“只要...或...时,就...”(最小项表达式)的形式。它要求该问题不能包含太复杂的嵌套关系,变量也不能太多,所以局限比较大。但用这种方法得出的函数式往往可以省去化简的步骤。
二、从真值表得出函数式
假设我们有这样一个真值表:

如何方便地写出它的表达式?
先试试把它转述为自然语言后照着写:“只要A,B,C,D分别为0000,或者0101,或者0110,或者......时,X就为1”。这样,的确可以写出方程。
那么,能不能直接通过真值表写出函数式呢?想一想,之前提到,所有的描述都可以转化为所谓“最小项表达式”,其中每一个项都是一个单项式,A、B、C、D分别取原变量或反变量。比如先看第一行,当ABCD取0000时,最终结果为1。——这对应了A’B’C’D’=1。所以,从真值表写出最小项表达式的方法是先找出所有使得因变量为1的自变量值的组合,再把每一个组合对应的乘积项写出来,每个变量取值为0则写上反变量,1则写上原变量,这样使得取这组值时该项为1,最后把这些项用加法相连即可。
举个例子:我们至今没有推导过异或逻辑如何用与或非表达。现在让我们证明一遍。

有了真值表,就可以直接看使得X=1的A,B取值组合,发现有01,10两个;接着,分别写出它们对应的乘积项,即A'B和AB';最后把它们连在一起:AB'+A'B,即可。
三、从函数式得出真值表
要画真值表,首先必须把所有自变量可能的取值都填在前几列中。建议使用二进制排列,即0000,0001,0010……等,不容易缺漏。
接下来,把函数式化成最小项表达式。比如,如果初始式为

如果说这种方法是反向填表,那自然还有另一种正向方法——把每一行的A,B,C的值依次代入函数式,求出X的值。这种方法适用于变量较多,而且原式比较简单,如果完全展开很费时间的式子。
四、逻辑图与函数式的转化
什么是逻辑图?我们知道,任何一个函数,比如

只要输入一个x,一个y,一个z,这个黑箱就会返回一个对应的a的值。而如果我们想查看它的内部逻辑,我们可能会看到这样的:

“+”把x和y连接起来,作m=x+y运算;“/”又连接了“+”的输出和z,作a=m/z运算,并输出a。所以,这个图就可以表示
同样地,还记得七个基本逻辑的逻辑符号么?

如果我们有式子

上半部分,得到A'B;下半部分,是AB'。两个再用或连接,就有了A'B+AB'。这样,便可以把一个函数式直观地表达出来。并且,在实际的电路制作中,这样的设计图也可以成为抽象的逻辑式与实际的电路板间的桥梁。
所以,要想绘出逻辑图,一般来说,只要先理清函数的运算顺序,再把对应的逻辑符号用线连接起来即可。再看一个例子:经典的档案室开门问题,已有函数式:
一步步看它的运算顺序:B与C相乘;A与乘积相加;D的反变量与这个和相乘。最后输出X。因此,可以画出对应的逻辑图。

反向地,如果有了这个逻辑图,就可以通过沿着逻辑图走向分析,最终得出函数式。
还可以发现,逻辑图和计算机中的运算树本质上是相同的。所以,我们可以用中序遍历的思路,写出函数式。
五、卡诺图
在最小项表达式的化简中,我们本质上在做什么呢?比如,
如果我们有n变量最小项表达式,那么它至多可以有
而

这是卡诺图的一般形式。先把所有相关变量分为数量大致相等的两部分,一部分(AB)沿行布置,一部分(CD)沿列布置。再把它们以格雷码编码——00,01,11,10等;这样,每个格子就对应了最小项表达式中的唯一一个项,比如

则它们在卡诺图上必定相邻。它背后的原理是当BCD=111时,无论A为0还是1,结果都为1,所以A就成了无关项,可以消去。按照这个道理,只要是圈起的区域是大小为

圈起的区域覆盖了所有A、B的值,所以A、B都是无关项;同时还覆盖了CD=01与11,所以C也是无关项,最终结果为D。
卡诺图并不是二维的,而是循环的,可以从一个边界来到另一个边界,形成一个空间中闭合的形状。比如:

也是可以合并的。
使用卡诺图化简时,先把所有最小项在表中对应的位置打勾,再用圈覆盖这些勾。具体有三个原则:
- 圈可以相互重叠交错,但必须覆盖所有勾,且不能覆盖空白格,否则会使函数发生改变。
- 每个圈必须尽量大,这样可以尽可能多地消去无关变量。
- 圈要尽量少,这样会使最终的项的数量最少,因为每个圈会对应最简式中的一个项。
比如,化简函数

再把它们全部圈起来,尽量扩大圈的大小和减少圈的数量:

圈起来的区域有:(0000,0010), (0010,0110), (1010,0010), (0101,1101,0111,1111)。所以化简之后,剩下的项分别为:A'B'D', A'CD', B'CD', BD。所以,我们最终的化简结果便是
卡诺图的使用需要一定技巧,所以不是非常常用。但是,卡诺图和真值表都可以作为函数的可视化表达。在“时序电路”一部分,我们将会看到它的作用。