概述

组合逻辑电路的特点

  • 任一时刻的输出仅取决于这一时刻的输入
  • 信号从输入向输出单方向传输,不含记忆(存储)原件

组合逻辑电路的设计与分析

组合逻辑电路的分析方法

基本分析步骤

  1. 根据电路图写逻辑表达式
  2. 有必要时进行化简
  3. 列出真值表
  4. 分析电路功能

例1:分析逻辑电路的功能
在这里插入图片描述
1.根据电路图写逻辑表达式,并进行必要的化简
在这里插入图片描述
2.写真值表
在这里插入图片描述
其实第一个问题是真值表为什么要这么写。首先输入,既然给了A和B,那应该A0A1是一组,B0B1是一组。再看给的电路图,按照一般的逻辑,从上到下,发现输入是先1后0,输出是4321,所以也就顺着来,按照这个顺序来写真值表。

3.分析电路功能
可能乍一看比较懵。观察一下输出,既然不是01的布尔输出,那么肯定是某种编码。直接猜想,应该是8421编码。从0000的输出会比较好入手:只要A组或者B组中有一个全为0,输出就为0。再看输出的值,有1,2,3,4,6,9。那就分析A组B组相同的几种情况:同为0,输出为0;同为01,输出为1;同为10,输出为4;同为11,输出为9。现在应该能发现一点关系了。AB两组分别代表一个二进制数,输出是两个数的乘积。再验证一下其他值,发现确实如此。因此这个电路是一个两位二进制乘法电路。

说明:最后一步分析电路的功能往往需要经验积累和灵感迸发,如果考试的时候实在想不出来,就写功能如真值表所示吧,肯定比空着强(doge

组合逻辑电路的设计方法

逻辑函数的变换

逻辑函数有很多形式,相信在学习第三章的时候已经有了解了。当时为了表达简便直观,统一化简成最简与或式。但是在实际工程中,可能不一定有合适的器件来满足按与或式搭建电路的需要。这个时候就需要根据所使用的逻辑器件来变换逻辑函数的形式。
与或、与非、与或非式比较重要,其他的了解即可

与或式

最简与或式的特点是:式中乘积项最少,乘积项中含的变量最少。所以实现电路所用的与门少,或门的输入端数少
在这里插入图片描述

与非式

与非门是一种很神奇的门。只要有了它就可以搭出任何组合逻辑电路。为了解决怎么搭的问题,就需要化简成与非式。
变换方法:先求最简与或式,再取反两次运用摩根定理。
在这里插入图片描述
直接看最终的化简结果,诶不是还有非门吗?把与非门的两个输入短接就相当于非门啦。
与非式电路的内层、外层均只有与非运算。

与或非式

与非门可以完成所有的组合逻辑运算,那为什么还需要别的形式呢?想一想,门电路是不是还有一个很特殊的“运算”叫做线与?
首先看看线与和与或非式的关系吧:
在这里插入图片描述
线与关系是很容易写成与或非式的,反过来说,与或非式很容易通过OC门OD门的线与连接来实现。
除此之外,在之前介绍的时候也提到过一个叫做与或非门的东西。化成与或非式,也方便直接使用与或非门来实现逻辑功能。
变换方法:先取反,化简成与或式,再取反回来
在这里插入图片描述
除了OC门、OD门之外,还有专门的与或非门,也可以处理与或非式的逻辑函数。

或与式

与或式是从最小项之和出来的,而或与式就是从最大项之积出来的。不过由于最大项本身也不常用,所以在教材里并不重要。
变换方法:先求与或非式,再运用摩根定理展开
在这里插入图片描述

或非式

和与非式对应,使用或非门完成整个逻辑电路。但是由于或非本身也是可以通过与非实现的,所以也不常用。
变换方法1:先求与或非式,两次取反,应用摩根定理
在这里插入图片描述
变换方法2:先求或与式,两次取反,应用摩根定理
在这里插入图片描述

基本设计步骤

  1. 根据需要,确定输入输出,列出真值表
  2. 写出表达式并化简,根据设计要求进行形式变换
  3. 画出逻辑电路图

例2
在这里插入图片描述
1.确定输入输出,画真值表
在这里插入图片描述
这个真值表并不是完全标准的。因为水位不可能高于2m又低于1m,所以无关项直接用x表示了。

2.写逻辑式,化简变形
在这里插入图片描述
3.画逻辑电路图
在这里插入图片描述
这道题是我自己出自己做的,所以不一定完全正确,也不一定是最简单的画法。欢迎大佬们批评指正。

常用组合逻辑电路

加法器

计算机的基本功能就是做算术。而算术运算的基础就是加法运算。减法可以通过补码统一到加法,乘法相当于多次加法,除法相当于多次减法。
实现加法运算,使用加法器。

1位二进制加法电路

半加器

如果两个一位二进制数相加,那么就是加数+被加数=本位和进位。(如图左上)
在这里插入图片描述
如图右侧列出真值表,分别写出S0和C0的逻辑表达式。因为很简单所以就不画内部电路图了。使用时可以直接画电路符号,如图左下。

全加器

一位二进制的加法用途实在太有限了。所以本质上还是想要多位的。而多位运算本质上是每一位运算后向上进位。所以我们需要加法器不仅能接收加数和被加数,还要能接收后面一位的进位Ci-1。所以运算就变成了三个数的相加,如图左上。
在这里插入图片描述
列出真值表。首先观察Si,是m1 m2 m4 m7,对这个组合敏感的话应该能知道这是三个量的异或、同或的结果。
再看Ci,写最小项化简,这里就不再赘述了。为什么化成与或式之后还要再做别的变化呢?因为前面看的Si使用了异或门,为了整体电路的最简,应该尽量复用这些门电路,所以尝试化成带有异或的式子。这个电路也不复杂,与门或门异或门很容易画出来。

这里就补充一下使用半加器构成全加器
首先看Si,三变量的异或,根据结合律可以变成先两个再两个。为什么先AiBi呢,因为半加器就是这两个输入,输出了S0,可以直接用。这个输出的S0和Ci-1再异或,就是另外一个半加器的S0了。因此电路画出了一半。
在这里插入图片描述
另外一半,Ci经过变换的带有异或的形式。AB相与是半加器的C0或当然只能通过外加的或门来实现。后半,AB异或这是之前用过的第一个半加器的S0,现在这里与上Ci-1,也就是另外一个半加器的C0
在这里插入图片描述

多位加法电路

两个多位数码的加法运算,先从低位开始,计算加法后,这一位保持本位和,并向上进位。之后的位,除了计算两个数码都应位的加和,还要加上进位的信号。

串行进位加法电路

最直接的想法就是一位一位算,第一位算好了把进位信号输出到下一位,依次计算出答案。
在这里插入图片描述
这个电路结构简单,但是存在两个问题。第一,最终的输出需要等待每一位依次计算。计算的位数越多,等待的时间越长。第二,在低位的进位信号没有生成时,高位依然在执行计算,因此在得到最终结果之前高位数字会发生跳变,如果输出给下一级电路可能造出错误。

并行进位(超前进位)加法电路

串行进位等就在等待一个进位信号,那么我们把每一个进位信号单独计,再输入加法器加和,就可以几乎同时得到答案了。
由于每一个进位信号的计算都需要考虑比其低的每一位,所以电路复杂程度大幅上升。
不过,内部结构可以不考虑啦。感兴趣的话可以搜索一下74LS283集成四位加法器的内部电路图。这里就只讲集成芯片的使用了。
在这里插入图片描述

加法器的拓展

加法器除了可以用来做加法,还可以有很多其他功能。

级联——将四位加法器扩展为八位加法器

在这里插入图片描述
首先举个例子,十进制加法:1024+2048,可以先计算24+48=72,再计算10+20=30。对于高位的和,我们左移两位,空出来的低位填上之前低位的和,就得到了四位数3072,通过两位数的加法计算了四位数的加法。
如果低位有进位呢?1024+4096,24+96=120,10+40+1=51,所以得到5120。也就是低位的进位在高位当作1处理。
所以就可以简单的把两个四位加法器串起来,分别计算低4位和高4位,再按照从高到低的顺序输出。

减法——使用补码统一加法和减法

正数的补码还是它本身,所以被减数不做处理。减数处理成一个负数,求补码,方法是取反加1。在前面提到过,低位的进位在高位当作1处理,所以加1的1就从进位输入来。取反需要自己外加电路。
在这里插入图片描述
在这里插入图片描述

代码转换

代码转换最简单就是8421码转余三码了吧,两个输入,一个输入8421码,一个输入3,也就是0011,输出和就是余三码了。
来看这个例子:
在这里插入图片描述
一个输入是DCBA四位二进制数,另外一个经过化简,是跟DCBA有关的一个四位二进制数。首先列加数A和被加数B的真值表,然后再把两数相加看输出。
在这里插入图片描述
看输出没有格雷码的特征,所以考虑是权值的区别。如果按照8421码计算,发现前面很巧出现了01234,顺着这个走下去,那么后面应该是56789,反过来计算第一位权值是2,所以可以推断这是一个8421转2421码的代码转换电路。
这里补充一下,由于2421码高位权值小,所以编码形式不唯一,比如1001和0011都表示3,所以一般不要求设计2421码的输出,只需要会识别就行。不管是8421,还是5421,2421,低三位的权值都是一样的,只需要通过最高位就能判别。

乘法——使用左移表示×2

先看十进制,0001,左移一位,空位补0,变成0010,扩大了十倍。二进制也是一样。只不过从0001到0010扩大了两倍。所以在输入的时候错位输入,就能实现乘法。两个输入搭配,就能实现不同倍数的乘法。
来看这个例子:
在这里插入图片描述
第一步把Y=5X拆分成Y=X+4X,X直接输入就好,高位补0。4X需要把X左移两位,也就是原本输入B1B0,现在输入B3B2,低位补0。

编码器

首先明确什么叫做编码。举个例子,学校为了告诉你下节课在哪里上,会告诉你,第一教学楼,401教室。这就是编码。把物理信息变成了数字。一栋楼被编号为“一”,一个房间被编号为“401”,这就是编码的过程。
而在数字电路中,物理量首先转化为一个电平,电平输入编码器,得到输出的编码。

普通编码器

也就是同一时刻只允许输入一个信号。这是物理限制,如果输入多了是无法工作的,需要我们在输入的时候格外注意。
在这里插入图片描述
现在对四个输入进行编码。按理说2位二进制数就可以编码4种状态了。但是,一定要注意,除了四个输入对应的四种状态以外,还有一种无编码的状态,所以总共是五种状态。这里通过加入指示位INT0来编码无编码这个状态。
观察电路发现这是低电平有效的电路。也就是开关闭合请求编码时发送给编码器的是一个低电平。这个要和负逻辑区分开。低电平有效的意思是用低电平触发电路的功能。而负逻辑是说低电平表示1高电平表示0。
设计过程还是那个过程,列真值表,化简,画电路。
在这里插入图片描述

优先编码器

普通编码器存在一个很大的问题,同时只允许一个输入。对于简单的系统还好控制,但真实情况是很多输入会同时到来。所以就需要优先编码器。优先编码器的每个输入都有对应的优先级。当多个输入同时到来时,只对优先级最高的输入进行编码。
在这里插入图片描述
现在我们规定S3的优先级最高,S0最低。那么会发生什么呢?同样列真值表:
在这里插入图片描述
最大的不同是,普通编码器由于物理限制,只有五种状态。而优先编码器有四变量完整的16种状态。只不过由于优先级限制,只有五种对应的输出。
设计步骤还是完全相同的。

集成优先编码器

常用的优先编码器之一:8-3线编码器148
在这里插入图片描述
从这个框图可以看出,这个芯片是全低电平有效的。也就是输入低电平代表需要编码,输出低电平代表有编码。而输出1是闲置、无编码的状态。

编码器的扩展

八个输入不够用怎么办,多几片芯片连一块就行了。如何将8-3编码器扩展成16-4呢?
输入端很简单,两个8加起来就是16了,不用任何处理。主要看输出。如果按照顺序排I0-I16,我们会发现,一张芯片上排了低一半而另一张排了高一半。也就是说,高一半要编码的话,低一半不管有没有输入都不许动。只有高一半全没输入,才轮到低一半说话。也就是高片工作时低片不工作。把高片的指示端接入低片的使能端。
输出,是一个比较复杂的问题。看原来的三位输出:如果低片工作,那么该输出多少就输出多少,仍然指代I0-I7,而如果高片工作,输出是5,但实际上是应该8+5了。三位二进制数加8怎么办?8对应1000,不影响低三位。所以加8只需要首位加1就行了。也就是,当高片工作时,首位输出1,高片不工作,首位输出0.用一个指示端完成了输出的最高位。而剩下的位,按照原来的输出出来就好。由于无输出是高电平1,所以要保留输出,应该用与非门。
在这里插入图片描述
由于取反和与非门的作用,这里的输出不再是低电平有效了,而回归到高电平有效,直观理解也就是原码了。

译码器

译码器就是把编码信息转换回物理信息。就像你问看门的大爷,401在哪?他会告诉你,电梯上四楼,左转走到头。也就是把401这个编码重新变回到指向一个房间的路径。
物理信息既可以是高低电平的信号,也可以是另外一个编码,输入到另外的系统里面发挥作用。因此译码器也就分为了通用译码器和显示译码器。

二进制译码器

输入一个二进制数信号,给出一个相对应的输出。这么说可能比较抽象。就这例子来讲:
两位二进制数编码四种状态。四个状态对应四个输出。要求前面输入数码,后面对应的输出有效。这样的芯片叫做2线-4线译码器。这里以74HC139为例。这个芯片输入高电平为有效,输出低电平为有效。
列出真值表,写逻辑式
在这里插入图片描述
就着这个真值表可能更好讲解译码器的功能。比如说给出10这个二进制编码,对应的Y2这个输出,由于每个编码仅对应一个输出,也就还原成了相互隔离的物理量。
顺着逻辑式画电路图。
在这里插入图片描述
这里解释一下,为了得到输入的原变量和反变量,为什么采用了一次取反和两次取反,而不是原输入和一次取反。有点像门电路里面的保护级,因为译码部分需要驱动的门电路很多,如果输入质量不高很可能在大负载下出错。为了避免因为外界输入质量不高导致的问题,所以自己动手丰衣足食,先经过非门处理再输入译码。
在画电路图的时候,增加了使能端。因为实际上,这是2线-4线译码器74HC139的内部电路图。

集成二进制译码器

这里着重介绍集成3位二进制译码器。也称作3线-8线译码器。典型芯片是74HC138。
在这里插入图片描述
对比74HC139和74HC138,发现他们都有三个使能端。这是因为译码器的使用实在是太普遍了,为了实现各种各样的逻辑功能,完成多片合作,需要更加精细的控制各个芯片的开启,所以就设置了三个使能端,方便后期扩展。

译码器的扩展

还是以最简单的扩展举例:级联。
在这里插入图片描述
数字电路级联的基本思路都是一样的。使用一位信号作为片选输入,区分高位芯片和低位芯片,其他部分复用就行。这里就可以看出,高位芯片使用了E3作为片选输入,低位芯片使用了E2作为片选输入。这样就省去了一个非门。

使用译码器设计任意组合逻辑电路

回归一下概念:

  1. 任意逻辑函数都能化成最小项之和的形式
  2. 译码器可以输出任意的最小项

所以使用译码器可以实现任意的组合逻辑电路。看这个例子:
在这里插入图片描述
使用译码器实现组合逻辑电路的时候,大概步骤是:

  • 将函数化简为最小项之和
  1. 将对应的最小项原变量取或(在这个例子里就是Y3Y5Y7分别取反,得到原变量然后取或)
  2. 将对应的最小项的反变量取与非(也就是例子里使用的方法)
  3. 将对应的最小项的反变量的互补变量取与(在这个例子里就是Y0Y1Y2Y4Y6取与)

显示译码器

所谓显示译码器,是一种特殊的译码器。输入原编码(地址),经过处理,产生专用与显示器件的新编码。
目前常用的显示器件分为LED和LCD。LED是发光二极管直接发光,显示图像。本质上就是控制电灯泡。LCD是利用液晶特性来显示图像,控制比较复杂。所以一般使用LED作为示例。
首先介绍一下二极管的共阴和共阳。
在这里插入图片描述
显示编码有很多。当然高像素的屏幕有很多LED,需要复杂的编码。但是如果只需要表示数字而且不要求显示精细,那么七段字符显示是一个很好的选择。
在这里插入图片描述
算上小数点,总共八个输出。编码0-9十个数四位就足够。如果有除了显示0-9的需求,可能更少的位数就足够了。
在这里插入图片描述
如果把abcdefg分别连接到对应的LED,那么就构成了一个基础的显示译码器。

中规模显示译码器

一般七段字符显示主要应用在0-9几个数字上。这里介绍的中规模显示译码器也是用于显示数字的。ABCD输入8421码,点亮对应的数字字形。值得一提的是,部分显示译码器对于1010-1111的编码是无输出,也有部分给这些位置编码了其他字符。在进行实验的时候要注意。
在这里插入图片描述
显示译码器因为涉及比较多的实际应用场景,所以输入输出会比较复杂。
R B I ‾ \overline {RBI} RBI这个脚叫做动态灭零输入。也就是当显示器应当显示0,但是实际上不需要这个0的时候,我们在这个脚输入低电平,将灯关闭。举个例子也就是显示0123的时候,不需要0,只需要显示123。那就把这个动态灭零接低电平。
B I ‾ / R B O ‾ \overline {BI}/\overline{RBO} BI/RBO当这里外接下拉到0,是强制灭灯输入,把所有灯都熄灭。如果没有外接下拉,这个脚是输出脚,表示灭灯的状态。也就是如果本来显示0,但是被动态灭零输入灭掉了,这里就给出低电平指示。用于电路的级联。
L T ‾ \overline{LT} LT就比较简单了,试灯输入。也就是,拿到显示器件的时候想要测试一下是不是所有LED灯都能正常点亮。这个脚接低电平就是点亮所有灯。

显示译码器的级联

显示译码器的级联问题本质上就是动态灭零的问题。
举个例子,像012.300,第一个0和最后两个0都是可以不显示的,12.3对应的灯亮就可以了。
在这里插入图片描述
因此控制逻辑是:小数点前最高位和小数点后最低位,只要是0就应当灭灯。其他位置,应当在更高位都是0的情况下才能灭灯。比如010.001,第一个0可以灭灯,但其他0都是不能灭掉的。

数据选择器

数据分配器

用作输出。只有一路数据通道,有多路输出通道。根据输入的地址,把数据送到对应的输出。并没有专门的芯片,但是可以通过译码器方便的实现。
在这里插入图片描述
因为数据只有一条线,也就是只有01,那就不拘泥于01了,可以是工作和不工作。所以通过译码器的地址输入选择端口,通过使能端控制开关传输数据。

数据选择器

这就刚好跟数据分配器反过来了。有多个数据输入,而只有一个输出。根据输入的地址选择相应的输入,传输到输出。
在这里插入图片描述
以四选一的数据选择器为例,数据选择器的基本思路就是通过全译码搭配与门,当地址对应时,输出取决于数据输入,当地址不匹配,与门就输出0。

中规模数据选择器

在这里插入图片描述
虽然扩展了八选一出来,但其实是有专门芯片的:
在这里插入图片描述

使用数据选择器设计任意组合逻辑电路

看上面数据选择器的输出函数,发现数据选择器同样可以输出所有的最小项组合,因此也可以通过它来实现任意的组合逻辑电路。
数据选择器和译码器的不同在于,译码器指示了地址,对应地址的输出就有效;而数据选择器指示了地址,还要根据地址对应的数据来决定输出。
因此如果数据选择器有n位地址,可以处理n+1位变量的组合逻辑函数。下面举例说明:

在这里插入图片描述
数据选择器的级联和拓展依旧是典型的高位芯片和低位芯片的套路,就不再赘述了。

数值比较器

输入两个数,比较大小,输出大于,小于,或等于。
首先看一位的情况:
在这里插入图片描述
而多位的数值比较器,就是一个套娃的过程。先比较最高位,如果不同就能直接得到结果。如果相同再依次向低位去比较。

中规模数值比较器

这里需要提醒一个点,在使用数值比较器的时候要特别注意三个前级输入。如果是作为最低位,后面没有数的情况下,要给“=”输入接有效,其他输入接无效。不能随意悬空或者上拉下拉。
在这里插入图片描述

竞争-冒险现象

在这里插入图片描述

关于竞争冒险现象应该有两个说法。第一个是左边这个。在信号发生变化的时候,会从有效区间逐渐变化到无效区间再变回有效。那么在变化的过程中,就可能会出现不希望的取值,造成尖峰脉冲。比如从10变成01,但是中间就可能出现11和00的组合。
第二个是右边这个。由于电路中存在延迟,导致两个反方向跳变的信号并不是完全同时到达。也就产生了不希望的组合。看右边这个电路图,还有一个重要的结论:有竞争不一定产生冒险。比如那个下降沿。

竞争-冒险现象的判别

在这里插入图片描述
这里要注意的是,判别也只是判别到有可能产生竞争-冒险现象,至于是不是会产生,还需要实验或者仿真验证。

竞争-冒险现象的消除

在这里插入图片描述
第一个消除方法是被动的,既然有干扰,我就想办法把干扰滤除。加一个电容滤掉尖峰脉冲。不过这种方法有一个问题,那就是正常的跳变也会被影响,方波不方,而是呈现出电容的充放电曲线。
第二个方法属于眼不见心不烦。既然有干扰,我们就不看干扰,等一会,干扰过去了再看。问题是需要引入时钟而且还是和主时钟错开的异步时钟。
第三个方法是通过增加冗余项使电路不再出现竞争。问题是在复杂的逻辑情况下难以完全消除竞争冒险现象。
实际工程中一般使用触发器来滤除这个干扰。在之后的章节中会有讲解。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐