更新于 

卡诺图与编译码器

使用卡诺图化简表达式

我们接下来回忆总结一下卡诺图化简逻辑函数的过程,首先有以下几个概念:

  1. 卡诺图上的每一个圈都代表一个蕴含项
  2. 主蕴含项:扩展到最大的蕴含项
  3. 奇异“1单元”:卡诺图中仅能被单一主蕴含项覆盖的方格
  4. 质主蕴含项:包含着一个或者多个奇异”1“单元的主蕴含项

最终我们是要将逻辑表达式化简为最简与或式,最简与或式就要求化简时:

  1. 项数最少,意味着卡诺图中圈数最少
  2. 每一项中的变量数最少,意味着卡诺图中的圈尽可能大

有时候可能会存在某个奇异“1”单元,他只能自己单独成一个圈:

或者也有可能一个卡诺图用两个不同的思路化简会得到两个最简式:

但是无论怎样化简我们都要遵循以下规则:

  1. 每一个1的方格必须至少被圈一次

  2. 每一个圈中包含的相邻小方格数必须为2的整数次幂

  3. 为了得到尽可能大的圈,圈和圈之间可以重叠

  4. 若某个圈中的所有1方格,已经完全被其他圈所覆盖,则改圈就是多余的,即每一个圈中至少应该有一个标1方格是他特有的。

练习

上面的式子进行化简后可以表示成下方的最简与或式。我们来分析一下:首先四个角被红色框圈起来得到¬B¬D,然后两侧的蓝圈圈出四个方块得到¬A¬D,然后中间竖着的绿色圈圈出四个方格得到¬CD,最后橘色圈圈中两个方法得到ABD。将四个项相加记得到最简式子,我们可以看出每一个标1方格都至少被圈中了一次,并且每一个圈都是尽可能大的,并且每一个圈都有自己圈中的独有的标1方格。

无关项的化简

我们前面所讲的卡诺图化简时要求,一个方格要么是1,要么是0。但是我们之前学到过无关项,他对结果不产生决定作用,因此无论取何值都可以,即你可以把他看成是0也可以把他看成是1。在卡诺图中当输出的值不重要或者相应的输入组合从不处显示,就可以由设计者决定这些输出时0还是1。充分利用无关项,我们可以进一步化简逻辑表达式。比如下图中:

我们发现对于某些组合,其结果是无关项,那么我们就在相应的方格表标记X,由于无关项既可以是0也可以是1,所以我们在化简时就可以用圈尽可能的圈最多的1,同时圈也可以圈X,也可以不圈。如上图,这样在化简时明显就更加简单了。

那么讲了这么多,我们都是在学习卡诺图的构件简化过程,他具体是如何应用的呢?实际上他通常是用来设计某一个复杂功能的元件的电路逻辑的,如下面几个我们分别来介绍卡诺图的应用:

7段数码管驱动电路

7段数码管常用来表示一个十进制数,由于一共是十个数0-9,所以我们使用四个位就可以表示了。

一般7段数码管有两种连接方法,共阴极和共阳极:

无论是哪一种实际上设计思路都是一样的。首先我们列出不同数字对应的应该亮的数码管编号:

然后用D0D1D2D3表示十进制数的0-9,对应的就要使得输出端Sa-Sg输出不同的值:

那么我们列出真值表以后使用卡诺图画出不同数对应的电路,这里以Sa为例:

那么用卡诺图得到Sa的最简表达式以后我们就可以画出电路图了:

编码器

我们前面学习了优先级线路,他的输出信号总是和最高级输入信号的值相同,那么我们之前用了一个很复杂的图来实现这个功能的,那么有没有更好的方法呢?当然有,此时我们就可以使用编码器,那么编码器是如何实现的呢,看下图:

上面是一个4线-2线编码器(因为输入信号是4个线编号0~3,所以只需要2个位就可以表示4个输入线,所以只需要两个输出线,因此叫做4线-2线编码器)。其中X0,X1,X2,X3是输入信号线,输出A0,A1是用来输出有效信号的编号的,EO是用来判断是否存在有效输入的。

我们用编码器模拟了优先级线路,他的工作原理如上图,当没有有效输入时,那么EO=1,此时无论A0,A1是何值都是没有用的。但是当EO=0,那么就说明此时有有效输入了,具体是哪个输入为有效输入,就需要A0,A1来输出表示有效输入的编号了,例如当X3位有效输入时,那么A0=A1=1,即此时二进制编号11即10进制的3号输入信号是有效输入。当然上面的表格我们也可以使用无关项来描述:

表示的意思是一样的。

注意编码器不仅可以用来表示优先级线路,他也可以用来表示更加复杂的有效线路情况,我们需要透彻理解编码器的工作原理。

那么同样的我们也可以使用卡诺图来写出最简逻辑表达式来表示A0,A1和EO,首先EO只有当所有的输入信号都是无效输入0时他才输出1,所以很明显

EO=X0+X1+X2+X3EO=\overline{X_0+X_1+X_2+X_3}

A0和A1我们根据真值表先对卡诺图进行标1填写:

然后化简我们就得到了A0和A1的最简表达式,这样我们就可以画出编码器的实现电路图了:

当然上面仅是一个4线-2线编码器的电路图,更加复杂的电路图我们需要按照上面的步骤重新推导。

译码器

译码器我们并不陌生,在《机组原理》中我们学习了译码器是用来解析生成片选信号用的,那么译码器到底是如何通过电路实现的呢?实际上译码就是编码的逆过程,所以对于4线-2线的编码器生成的指令,我们需要使用2线-4线译码器来进行译码。并且由于是逆过程,编码器是接收的有效输入信号然后输出有效输入信号的编号,那么译码器就是接受有效输入信号的编号,然后相应的将对应编号的输出端输出信号1。如下:

当接收到10编号,那么就是Y2应该输出有效信号1。那么我们同样可以使用卡诺图进行化简写出表达式然后画出译码器的电路:

思考:编码器和译码器的合作使用有什么优点?

我们思考一下如果不使用编码器和译码器实际上也可以表示这个有效输出和有效输入之间的关系,只是中间需要许多的复杂线路来实现,逻辑复杂同时功耗大,但是使用编码器和移码以后逻辑简单了许多,同时两者之间的传输信号线也很少,功耗少。实际上编码器和译码器的实现都是卡诺图的应用体现。

当然我们也可以使用译码器实现更加复杂的逻辑,例如实现同或门:

只需要将输出端的输出信号进行更改即可。

多路选择器

多路选择器的功能是可以从选择信号的值从N个可能的输入中选择一个作为输出,他一般需要使用log2N位选择信号作为输入来表示编号X输入信号,控制输入信号的选择,比如:

最简单的就是二选一电路,那么当S=0时说明输出信号Y和输入信号D0相同,当S=1时说明输出信号Y和输入信号D1相同。这种选择器的实现我们也可以使用卡诺图化简得到他的电路表达式:

或者使用三态缓冲器实现:

当然对于更加复杂的多路选择器,我们也需要按照先列真值表,画卡诺图再化简的步骤得到电路表达式甚至可以借用其他组件:

我们回忆一下这四个复杂器件,他们的电路设计都离不开卡诺图的应用,其中设计思路都是以下几个步骤:
  1. 对实际问题进行抽象,然后定义输入和输出 2. 由实际逻辑问题列出真值表 3. 由真值表写出表达式并构建卡诺图 4. 使用卡诺图化简表达式得到最简式 5. 画出原理图

组合逻辑电路的时序问题

我们发现在设计电路时并不仅仅需要考虑式子的简单与否,还要考虑延迟等外界因素,这就涉及到了组合逻辑电路的时序问题。在实际电路中,输出相应输入的改变是需要一定的时间,而不是理想情况下的立刻改变:

所以我们在设计电路时还要考虑时序问题,即怎样设计电路使得整体的延迟最小。这里我们先学习几个概念:

  • 传播延迟:t_pd即为输入改变直到一个或多个输出改变为最终值所经历的最长时间延迟
  • 最小延迟:t_cd即为输入发生变化直到任何一个输出开始改变的最短时间

如刚才的A->Y电路,传播延迟就是A开始改变到Y改变稳定所需要的时间,而最小延迟就是A开始改变到Y开始改变的时间,很明显传播延迟总是要大于等于最小延迟。

思考:延迟产生的原因?
  • 电路中的电阻和电容的充放电
  • 光速的上限

首先我们知道许多门是由mos管实现的,而mos管的原理是PN结偏置实现的,这肯定是有延迟的,同时伴随着科技的发展,速度最大不能快于光速,由于这种速度上限,会产生延迟。

思考:传播延迟总是大于等于最小延迟的原因?

实际上最理想的情况就是输出端同时改变同时迅速稳定为改变后的值,那么此时最小延迟和传播延迟就会相等,但是实际电路中以下几个原因会造成传播延迟总是更大:

  • 上升沿与下降沿的延迟可能不同(即上升和下降的幅度不同,毕竟我们前面学习了低电平信号和高电平信号都是一个区间范围)
  • 电路存在多个输入和输出时,不同输出的延迟可能不同
  • 电路对温度敏感,电路较热时速度会变慢、

根据不同路径的延迟不同,我们定义:

很明显,一般门越多的电路延迟越大,并且由于我们的目的是为了提升整体的运行性能,即降低整体的延迟,我们一般关注的是关键路径的延迟,降低关键路径的延迟才能大幅提升整体的性能。

毛刺

在电路中还会涉及到“毛刺”的问题,这种问题在电路图中不易察觉,但是在实际电路中却很明显很有可能造成整体电路的错误。那么什么是毛刺呢?实际上就是指一个输入的一个变化可能会引起后面多个输出的多次变化。比如:

当A=0,C=1时,B突然由1变成0,从电路图和卡诺图中我们通常会认为Y不会发生变化还是维持信号1,但是实际上我们分析一下电路信号的传输速度,由于B信号需要经过非门再和非A相或才能得到¬A¬B,而得到BC则不需要经过非门,所以BC会先发生变化变成0,而此时¬A¬B还没有从0变成1,所以有一段时间Y会变成0,待¬A¬B变化完成后变成1了,此时Y才会变回1。所以实际上Y的变化时1->0->1,而不是保持1不变。此时如果Y后面还有其他逻辑操作,那么这种微小的变化可能会被无限放大从而造成整体电路的异常。因此毛刺是一种风险,究其原因产生毛刺是因为输入端的变化不能同时到达逻辑门从而可能造成输出端的多次变化:

为了防止毛刺的产生,我们不能一味追求电路的表达式最简,而要同时保证没有毛刺产生。当信号的变化在卡诺图中穿越两个主蕴含项的边缘时就会产生“毛刺”:

如上图两个圈的边缘没有过渡。为了避免,我们只需要增加多余的蕴含项来盖住这些边缘以避免毛刺:

我们发现此时得到的表达式就不是最简式了,但是这样做的意义很重要,他可以有效避免毛刺对整体电路的影响。

注意,毛刺是大多数电路中都存在的现象,但是不用每一个毛刺都避免,毕竟毛刺只是有可能引起输出端的多次变化,

实际上大多数情况下这种多次变化都是瞬间的,我们只需要在产生异常时再修改电路避免毛刺即可。同时还要注意多输入(几乎)同时改变也会产生毛刺,这种情况不能通过上面这种增加硬件的方法来避免。

使用卡诺图化简表达式我们接下来回忆总结一下卡诺图化简逻辑函数的过程,首先有以下几个概念:

  1. 卡诺图上的每一个圈都代表一个蕴含项
  2. 主蕴含项:扩展到最大的蕴含项
  3. 奇异“1单元”:卡诺图中仅能被单一主蕴含项覆盖的方格
  4. 质主蕴含项:包含着一个或者多个奇异”1“单元的主蕴含项

最终我们是要将逻辑表达式化简为最简与或式,最简与或式就要求化简时:

  1. 项数最少,意味着卡诺图中圈数最少
  2. 每一项中的变量数最少,意味着卡诺图中的圈尽可能大

有时候可能会存在某个奇异“1”单元,他只能自己单独成一个圈:

或者也有可能一个卡诺图用两个不同的思路化简会得到两个最简式:

但是无论怎样化简我们都要遵循以下规则:

  1. 每一个1的方格必须至少被圈一次

  2. 每一个圈中包含的相邻小方格数必须为2的整数次幂

  3. 为了得到尽可能大的圈,圈和圈之间可以重叠

  4. 若某个圈中的所有1方格,已经完全被其他圈所覆盖,则改圈就是多余的,即每一个圈中至少应该有一个标1方格是他特有的。

练习

上面的式子进行化简后可以表示成下方的最简与或式。我们来分析一下:首先四个角被红色框圈起来得到¬B¬D,然后两侧的蓝圈圈出四个方块得到¬A¬D,然后中间竖着的绿色圈圈出四个方格得到¬CD,最后橘色圈圈中两个方法得到ABD。将四个项相加记得到最简式子,我们可以看出每一个标1方格都至少被圈中了一次,并且每一个圈都是尽可能大的,并且每一个圈都有自己圈中的独有的标1方格。