赞
踩
本文是基于由阎石主编、高等教育出版社2016年出版的教材
《数字电子技术基础(第六版)》 的学习笔记
特点:根据逻辑功能的不同特点,可以将数字电路分成两大类,一类称为组合逻辑电路(Combinational Logic Circuit,简称组合电路),另一类称为时序逻辑电路(Sequential Logic Circuit,简称时序电路)在组合逻辑电路中,任意时刻的输出仅仅取决于该时刻的输入,与电路原来的状态无关,这就是组合逻辑电路在逻辑功能上的共同特点。
例子:
逻辑函数式为:
从组合电路逻辑功能的特点不难想到,既然它的输出与电路的历史状况无关,那么电路中就不能包含有存储单元,这就是组合逻辑电路在电路结构上的共同特点。
就是要通过分析找出电路的逻辑功能来通常采用的分析方法是从电路的输人到输出逐级写出逻辑函数式,最后得到表示输出与输 入关系的逻辑函数式。然后用公式化简法或卡诺图化简法将得到的函数式化简或变换,以使逻 辑关系简单明了为了使电路的逻辑功能更加直观,有时还可以将逻辑函数式转换为真值表的形式。
一、 进行逻辑抽象
需要通过逻辑抽象的方法,用一个逻辑函数来描述这一因果关系。
逻辑抽象的工作通常是这样进行的:
(1) 分析事件的因果关系,确定输人和输出变量。一般总是把引起事件的原因定为输入,而把事件的结果作为输出。
(2) 对输入变量和输出变量进行二进制编码,其编码的规则和含义由设计者根据事件选定。
(3) 对给定的因果关系列出真值表。在完成输入和输出变量的二进制编码后,根据给定的因果关系,进行逻辑关系的描述。
至此,便将一个实际的逻辑问题抽象成了一个逻辑函数。而且,这个逻辑函数通常首先是以真值表的形式给出的。
二、写出逻辑函数式
为便于对逻辑函数进行化简和变换,需要把真值表转换为对应的逻辑函数式。
三、 选定器件类型
可以采用不同类型的器件实现逻辑函数。按集成度的分类,目前的数字电路可以分为小规模集成电路、中规模集成电路以及大规模集成电路。
既可以用小规模集成的门电路组成逻辑电路,也可以用中规模集成的常用组合逻辑器件或
大规模集成的可编程逻辑器件实现设计电路。在设计实现中,应该根据对电路的具体要求和器
件的资源情况决定采用哪一种类型的器件。
四、 将逻辑函数化简或转换成适当的描述形式
在使用小规模集成的逻辑门电路进行电路实现时,为获得最简单的设计结果,应将函数式化成最简形式,即函数式相加的乘积项最少,而且每个乘积项中的因子也最少。如果对所用器件的种类有附加的限制(例如只允许用单一类型的与非门),则还应将函数式变换成与器件种类相适应的形式(例如将函数式化作与非-与非形式)。
五、根据化简或转换后的逻辑式,画出逻辑电路的连接图
至此,原理性设计(或称逻辑没计)已经完成。
六、 设计验证
对已经得到的原理图进行分析,或借助计算机仿真软件进行功能和动态特性仿真,验证其是否符合设计要求。
七、工艺设计
为了将逻辑电路实现为具体的电路装置,还需要做一系列的工艺设计工作,包括设计印刷电路板、机箱、面板、电源、显示电路等。最后还必须完成组装、调试。
图以方框图的形式总结了逻辑设计的基本方法。应当指出,上述的设计步骤并不是一成不变的。
例子:使用逻辑门电路没计一个监视交通信号灯工作状态的逻辑电路。
(1)首先进行逻辑抽象。取红、黄、绿三盏灯的状态为输入变量,分别用R.A.G表示,并规定灯亮时为1,不亮时为0。 取故障信号为输出变量,以Z表示之,并规定正常工作状态下Z为0,发生故障吋Z为1。逻辑真值表如下:
(2) 写出逻辑函数式:Z = R‘A’G‘+R’AG+RA‘G+RAG’+RAG
(3) 选定器件类型为小规模集成门电路。
(4) 将式化简后得到:Z = R‘A’G‘+RA+RG+AG
(5) 根据式子的化简结果画出逻辑电路图,得到图所示的电路
在要求全部用与非门组成这个逻辑电路时,就应当将函数式化为最简与非-与非表达式。这种形式通常可以通过将与或表达式两次求反得到。在上例中,将式两次求反后得到
Z =((R’A‘G’+RA+RG+AG)‘)’= ((R‘A’G‘)‘(RA)’(RG)‘(AG)’)’
如果要求用与或非门实现这个逻辑电路,那么就必须将式化为最简与或非表达式。 最简的与或非表达式可以通过合并卡诺图上的0 , 然后求反而得到。 为此,将函数Z的卡诺图画出,将图中的0合并、求反得到:Z=(RA’G‘+R’AG’+R’A’G)’
有些逻辑功能电路经常、大量地出现在各种数字系统当中。这些逻辑功能电路包括编码器、泽码器、数据选择器、数值比较器、 运算器等。在设计实现复杂的电路时,可以调用这些已有的、经过使用验证的电路模块,作为设计电路的组成部分。下面从设计或分析的角度分别介绍这些常用的组合逻辑模块。
在数字系统中,为了区分一系列不同的事务,将其中的每个事物用一个二值代码表示,这就是编码的含义。在二值逻辑电路中,信号都是以高、低电平的形式给出的。因此,编码器(Encoder) 的逻辑功能就是将输入的每一个高、低电平信号编成一个对应的二进制代码。
一、普通编码器
目前经常使用的编码器有普通编码器和优先编码器两类。在普通编码器中,任何时刻只允许输入一个编码信号,否则输出将发生混乱。现以3位二进制普通编码器为例,分析一下普通编码器的工作原理。图是3位二进制编码器的框图,它的输入是八个高电平信号,输出是3位二进制代码Y1Y2Y3。为此,又将它称为8线-3线编码器。输出与输人的对应关系由表给出。
写成对应的逻辑式得到:
输人变量为其他取值下其值等于1 的那些最小项均为约束项。利用这些约束项将式化简,得到:
得到的编码器电路为三个或门组成的:
二、优先编码器
在优先编码器(priority encoder )电路中,允许同时输入两个以上的编码信号。不过在设计优先编码器时已经将所有的输入信号按优先顺序排了队,当几个输入信号同时出现时,只对其中优先权最高的一个进行编码。图给出了 8线-3线优先编码器74HC148的逻辑图。如果不考虑由门G1、G2和G3构成的附加控制电路,则编码器电路只有图中虚线框以内的这一部分。
写出输出逻辑式为:
为了扩展电路的功能和增加使用的灵活性,在74HC148 的逻辑电路中附加了由门G1、G2 和 G3组成的控制电路。其中S‘为选通输入端,只有在S ’ = 0 的条件下,编码器才能正常工作。而在 S’ = l时,所有的输出端均被封锁在高电平。选通输出端Y’S和扩展端Y’EX。用于扩展编码功能。由图可知
上式表明,只有当所有的编码输入端都是高电平(即没有编码输人),而且S = 1 时,K 才是低电平。因此,K的低电平输出信号表示“电路工作,但无编码输入”。
这说明只要任何一个编码输人端有低电平信号输人,且S = 1,Y’EX即为低电平。因此,的Y’EX低电平输出信号表示“电路工作,而且有编码输人”。
它的输人和输出均以低电平作为有效信号。为了强调说明以低电平作为有效输人信号,有时也将反相 器图形符号中表示反相的小圆圈画在输入端,如图中左边一列反相器的画法。功能表为:
由表中不难看出,在S’ = 0电路正常工作状态下,I’7的优先权最高,I’0的优先权最低。
表中出现的三种Y2’Y1’Y0’ = 111的情况可以用YS’和YEX’的不同状态加以区分。
在中规模集成电路设计实现后,习惯上采用逻辑框图来表示中规模集成电路器件,在逻辑框图内部只标注输入、输出原变量的名称。如果以低电平作为有效的输入或输出信号,则于框图外部相应的输人或输出端处加画小圆圈,并在外部标注的输入或输出端信号名称上加非“'”。
在常用的优先编码器电路中,除了二进制编码器以外,还有一类称为二-十进制优先编码器。它能将个输人信号分别编成10个BCD代码。如下所示
由表可知,编码器的输出是反码形式的BCD码。其中I9‘的优先权最高,I1’最低
译码器( Decoder ) 的逻辑功能是将每个输入的二进制代码译成对应的输出高、低电平信号或另外一个代码。因此译码是编码的反操作。常用的译码器电路有二进制译码器、二-十进制译码器和显示译码器三类。
假定电源电压Vcc= 5 V,输入信号的高、低电平分别为3 V和0 V,二极管的导通压降为0. 7 V。当A2A1A0 = 000时,这时只有Y0输出高电平(3. 7 V),其余的输出端均为低电平(0.7V),对应关系如下表:
用二极管与门阵列构成的译码器虽然比较简单,但也存在两个严重的缺点。其一是电路的输入电阻较低而输出电阻较高,其二是输出的高、低电平信号发生偏移(偏离输入信号的高、低电平)。因此,通常只在一些大规模集成电路内部采用这种结构,而在一些中规模集成电路译码器中多半采用三极管集成门电路结构。
74HC138就是用CMOS门电路组成的3线-8线译码器,它如图所示:
通过逻辑图写出
由上式可以看出,Y0’~Y7’;同时又是A2、A1、A0这三个变量的全部最小项的译码输出,所以也将这种译码器称为最小项译码器,74HC138有3个附加的控制端S1、S2‘和S3’。当S1=1,S2’+S3‘=0时,Gs输出为高电平(S=1),译码器处于工作状态。否则,译码器被禁止,所有的输出端被封锁在高电平,如表所示。这3个控制端也称为“片选”输入端,利用片选的作用可以将多片连接起来以扩展译码器的功能。
带控制输入端的译码器又是一个完整的数据分配器。在图(a)所示电路中如果将S1作为“数据”输人端(同时令S2’=S3’=0)。作为“地址”输人端,那么从S1送来的数据只能通过由A2A1A0所指定的一根输出线送出去。这就不难理解为什么把A2A1A0称为地址输入了。例如,当A2A1A0=101时,门G5的输人端除了接至GS输出端的一个以外全是高电平,因此S1的数据以反码的形式从输出,而不会被送到其他任何一个输出端上。
二-十进制译码器的逻辑功能是将输入BCD码的10个代码译成10个高、低电平输出信号。
根据逻辑图得到:
真值表:
对于BCD 代码以外的伪码均无低电平信号产生,译码器拒绝“翻译”,所以这个电路结构具有拒绝伪码的功能。
1.七段字符显示器
为了能以十进制数码直观地显示数字系统的运行数据,目前广泛使用了七段字符显示器,或 称为七段数码管。这种字符显示器由七段可发光的线段拼合而成。常见的七段字符显示器有半导体数码管和液晶显示器两种。
图是半导体数码管BS20IA的外形图和等效电路。这种数码管的每个线段都是一个发光二极管(Light Emitting Diode,简称LED ),因而也将它称为LED数码管或LED七段显示器。
另一种常用的七段字符显示器是液晶显示器 ,液晶显示器的最大优点是功耗极小,每平方厘米的功耗在1 uw以下。它的工作电压也很低,在1 V 以下仍能工作。因此,液晶显示器在电子表以及各种小型、便携式仪器、仪表中得到了广泛的应用。但是,由于它本身不会发光,仅仅靠反射外界光线显示字形,所以亮度很差。此外,它的响应速度较低(在1 0 - 2 0 0 m s 范围),这就限制了它在快速系统中的应用。
2.BCD-七段显示译码器
半导体数码管和液晶显示器都可以用TTL或 CMOS集成电路直接驱动。为此,就需要使用显示译码器将BCD代码译成数码管所需要的驱动信号,以便使数码管用十进制数字显示出BCD代码所表示的数值。
今以A3A2A1A0表示显示译码器输入的BCD代 码,以表示输出的7位二进制代码,并规定用1表示数码管中线段的点亮状态,用0表示线段的熄灭状态,则根据显示字形的要求便得到了表所示的真值表。
卡诺图:
在卡诺图上采用合并0然后求反的化简方法将Ya-Yg化简得到:
附加控制电路用于扩展电路功能。下面介绍一下附加控制端的功能和用法。
灯测试输入LT’
当有LT’ = 0的信号输入时,G4、G5 、G6 和G7 的输出同时为高电平,使A10= =A11 = A12 = 0 对后面的译码电路而言,与输人为A0=A1=A2=0 一样。由式可知Ya - Yg将全部为高电平。 同时,由于G19的两组输人中均含有低电平输入信号,因而Yg也处于高电平。可见,只要令LT’ = 0,便可使被驱动数码管的七段同时点亮,以检查该数码管各段能否正常发光。平时应置LT’ 为高电平。
灭零输入RBI’:
设置灭零输入信号的目的是为了能把不希望显示的零熄灭。例如,有一个8位的数码显示电路,整数部分为5 位,小数部分为3 位,在显示1 3 . 7 这个数时将呈现0 0 0 1 3 . 7 0 0 字样。如果将前、后多余的零熄灭,则显示的结果将更加醒目,由图可知,当输入A 3 = A2 = A1 = A0 = 0 吋,本应显示出0 。如果需要将这个零熄灭,则 可加人RBI’ = 0的输入信号。这时G3 的输出为低电平,并经过G 4 输出低电平使A13 =A12 =A11 = A10 = 1。 由于G13 〜G19 每个与或非门都有一组输人全为高电平,所以Ya ~ Yg 全为低电平,使本来应该显示的0熄灭。
在数字信号的传输过程中,有时需要从一组输入数据中选出某一个来,这时就要用到一种称为数据选择器(DataSelector)或多路开关(Multiplexer,MUX)的逻辑电路。数据选择器是一种常用模块,最小的是二选一数据选择器。其逻辑图形符号如图所示。该符号表示通过SEL确定Y从A和B中选哪一个数据,真值表如表:
可以得到,二选一数据选择器的逻辑表达式为:Y=SEL*A+SEL’*B
实现逻辑图:
4选1数据选择器则是从4个输人数据中选出一个送到输出端。下面以双4选1数据选择器74HC153为例,分析它的工作原理。图是74HC153的逻辑图,它包含两个完全相同的4选1数据选择器。两个数据选择器有公共的地址输人端,而数据输入端和输出端是各自独立的。通过给定不同的地址代码(即A1A0 的状态),即可从4个输入数据中选出所要的一个,并送至输出端Y0图中的S1’和S2’是附加控制端,用于控制电路工作状态和扩展功能。
由图(a)可见,当A0 = 0吋传输门TG1和TG3导通,而TG2和TG4截止。当A0= 1时TG1和TG3截止,而TG2 TG4导通。同理,当A1 =0时TG5导通、TG6截止。而= 1时TG5截止、TG6导通。因此,在A1A0的状态确定以后,D10~D13当中只有一个能通过两级导通的传输门到达输出端。例如,当吋,第一级传输门中的丁02和TG4导通,第二级传输门的TG5导通,只有D11端的输入数据能通过传输门TG2和TG5到达输出端Y1。输出的逻辑式可写成:
同时,上式也表明S’ = 0时数据选择器工作,S’ = 1吋数据选择器被禁止工作,输出被封锁为低电平。
两个二进制数之间的算术运算无论是加、减、乘、除,目前在数字计算机中都是化做若干步加法运算进行的。因此,加法器是构成算术运算器的基本单元。
一、1位加法器
1.半加器
如果不考虑有来自低位的进位将两个1位二进制数相加,称为半加。实现半加运算的电路称为半加器。按照二进制加法运算规则可以列出如表所示的半加器真值表,其中A、B是两个加数,S是相加的和,CO是向高位的进位。将S、CO和A、B的关系写成逻辑表达式则得到
因此,半加器是由一个异或门和一个与门组成的,如图所示:
2.全加器
在将两个多位二进制数相加时,除了最低位以外,每一位都应该考虑来自低位的进位,即将两个对应位的加数和来自低位的进位3个数相加。这种运算称为全加,所用的电路称为全加器。根据二进制加法运算规则可列出1位全加器的真值表,如表所示:
画出卡诺图并合并0再求反化简得:
二、多位加法器
1.串行进位加法器
两个多位数相加时每一位都是带进位相加的,因而必须使用全加器。只要依次将低位全加器的进位输出端CO接到高位全加器的进位输人端CI,就可以构成多位加法器了。图就是根据上述原理接成的4 位加法器电路。显然,每一位的相加结果都必须等到低一位的进位产生以后才能建立起来,因此将这种结构的电路称为串行进位加法器(或称为行波进位加法器)。
这种加法器的最大缺点是运算速度慢。在最不利的情况下,做一次加法运算需要经过4 个全加器的传输延迟时间(从输入加数到输出状态稳定建立起来所需要的时间)才能得到稳定可靠的运算结果。
2.超前进位加法器
加到第i位的进位输人信号是这两个加数第i位以下各位状态的函数,所以第i 位的进位输入信号(CI)i一定能由Ai-1Ai-2…A0和Bi-1Bi-2…B0唯一地确定。根据这个原理,就可以通过逻辑电路事先得出每一位全加器的进位输入信号,而无需再从最低位开始向高位逐位传递进位信号了,这就有效地提高了运算速度。采用这种结构形式的加法器称为超前进位(Carry Look-ahead)加法器,也称为快速进位(Fast Carry)加法器。
下面具体分析一下这些超前进位信号的产生原理。从表所示的全加器的真值表中可以看到,在两种情况下会有进位输出信号产生。第一种情况是A+B=1,这时CO=1。第二种情况是A+B=1且(CI)= 1,也产生(CO)= 1的信号,这时可以把来自低位的进位输人信号(CI) 直接传送到进位输出端(C0)。事实上在AB= 1时同样也可以将CI直接传送到输出端。于是两个多位数中第i位相加产生的进位输出(CO)i可表示为:
若将AiBi定义为进位生成函数Gi,同时将(Ai+Bi)定义为进位传送函数Pi,则式可改写为
展开后得:
从全家器的真值表写出第i位和第Si的逻辑式:
也可以变换为异或函数
可以得到构成的4位超前进位加法器74HC283如图:
以第1位(i=1)为例,分析一下它的逻辑功能:
可以看出,从两个加数送到输入端到完成加法运算只需三级门电路的传输延迟时间,而获得进位输出信号仅需一级反相器和一级与或非门的传输延迟时间。然而必须指出,运算时间得以缩短是用增加电路复杂程度的代价换取的。当加法器的位数增加时,电路的复杂程度也随之急剧上升。
比较两个数值的大小。为完成这一功能所设计的各种逻辑电路统称为数值比较器。
一、1位数值比较器
首先讨论两个1位二进制数A和B相比较的情况。这时有三种可能:
(1) A>B(即A = 1、B=0),则 AB’ = 1,故可以用 AB’作为A>B的输出信号Y(A>B)。
(2) 小于相反A’B
(3) A = B,则AOB = 1,故可以用AOB作为A=B的输出信号
图给出的是一种实用的1位数值比较器电路:
二、多位数值比较器
在比较两个多位数的大小时,必须自高而低地逐位比较,而且只有在高位相等时,才需要比较低位。
例如,A、B是两个4位二进制数A3A2A1A0和B3B2B1B0进行比较时应首先比较A3和B3。如果那么不管其他几位数码各为何值,肯定是A3>B3,那么不管其他为何值,肯定是A>B , 反之亦然。如果A3 = B3,这就必须通过比较下一位A2和B2来判断4和B的大小了。 依此类推,定能比出结果。
得到表示A>B.A<B和A = B的逻辑函数式为:
没有来自低位的比较结果时,只有大于、小于和等于三种情况,所以可以得到关系式:
4位数值比较器74HC85的逻辑图:
对于较复杂的组合逻辑电路,往往不适合用一组方程式直接描述它们的逻辑功能,因而需要用层次化和模块化的设计方法。
层次化的设计方法是指“自顶向下”对整个设计任务进行分层和分块的划分,降低每层的复杂度,简化每个模块的功能;或“自底向上”地对每一个有限复杂度的模块进行实现或调用。模块化的设计方法是指将经过设计和验证的能完成一定功能的逻辑电路封装成为模块,在后续的设计中都可反复使用。
这两种方法核心是首先将电路逐级分解为若干个简单的模块,然后再将这些模块设计好并连接起来。两种方法在设计实现中往往一起使用,
本节将介绍自底向上的方法。把上一节介绍的一些常用中规模模块作为已有的电路模块, 利用它们进行一些电路设计和实现。最常见的一类设计方法是应用附加的控制端实现功能扩展,如下面例子:
从逻辑功能的特点上将数字集成电路分类,可以分为通用型和专用型两类。前面介绍到的中、小规模数字集成电路(如7 4 系列及其改进系列、C C 4 0 0 0 系列、7 4 H C 系列等)都属于通用型数字集成电路。它们的逻辑功能都比较简单,而且是固定不变的。由于它们的这些逻辑功能在组成复杂数字系统时经常要用到,所以这些器件有很强的通用性。从理论上讲,用这些通用型的中、小规模集成电路可以组成任何复杂的数字系统。随着集成电路集成度越来越大,如果能把所设计的数字系统做成一片大规模集成电路,则不仅能减小电路
的体积、重量、功耗,而且会使电路的可靠性大为提高。这种为某种专门用途而设计的集成电路称为专用集成电路,即所谓的ASIC( Application Specific Integrated Circuit的缩写)。然而,在用量不大的情况下,设计和制造这样的专用集成电路不仅成本很高,而且设计、制造的周期也太长这是一个很大的矛盾。可编程逻辑器件( ProgrammableLogicDevice, 简称P L D) 的研制成功解决了这个矛盾。可编程逻辑器件P L D 是作为一种通用器件生产,但它的逻辑功能由用户通过对器件编程来设定的,而且,有些P L D 的集成度很高,足以满足设计一般数字系统的需要。这样就可以由设计人员自行编程而将一个数字系统“集成”在一片PLD上,作成“片上系统”(System on Chip,简称SoC ), 而不必去请芯片制造厂商设计和制作专用集成电路芯片了。在描述可编程器件的内部结构时采用了图中所示的逻辑图形符号这也是目前国际、国内通行的画法:
其中图(a ) 表示多输人端与门,图(b ) 是与门输出恒等于与门输出恒等于0的简化画法, 是三态输出缓0 时的简化画法,图(c ) 是多输人端或门,图(d ) 是互补输出的缓冲器,图( e)是三态输出缓冲器。我们已经知道,任何一个逻辑函数式都可以变换成与-或表达式,因而任何一个逻辑函数都能用一级与逻辑电路和一级或逻辑电路来实现。PLD的最初的研制思想就是源于此。最早使用的P L D 是现场可编程逻辑阵列(ProgrammableLogicArray, 简称为P L A )。
可编程逻辑阵列PLA由可编程的与逻辑阵列和可编程的或逻辑阵列以及输出缓冲器组成,如图所示:
图中的与逻辑阵列最多可以产生8个可编程的乘积项,或逻辑阵列最多能产生4个组合逻辑函数。如果编程后的电路连接情况如图中所表示的那样,则当OE’=0时可得到:
从图可以看到,P L A 的基本结构提供了一定规模的与阵列和或阵列,生产时并未定义逻辑功能,只是为实现一定规模的逻辑运算提供了资源和可能。用户根据设计需要对与阵列和或阵列进行编程设定,从而得到某种特定的逻辑功能。P L A 是P L D 中电路结构最简单的一种。
随着集成度的提高,可编程逻辑器件(PLD)及专用集成电路(AS1C)的出现,数字电路的设计手段也发生了变化,由传统的手工设计方式,逐渐转变为以计算机辅助设计为主要手段的“电子设计自动化”,即通常所说的“EDA”。硬件描述语言(HDL)就是设计人员利用EDA工具描述电子电路的一种方法利用硬件描述语言并借助EDA工具,可以完成从系统、算法、协议的抽象层次对电路进行建模、电路的仿真、性能分析直到IC版图或PCB版图生成的全部设计工作。针对数字电子电路,硬件描述语言可以在不同的层次对结构、功能和行为进行描述。常见的硬件描述语言包括Verilog、VHDL等,硬件描述语言发展至今已有近30年的历史,已经成功地应用于电子电路设计和分析的各个阶段:建模、仿真、验证和综合等。自20世纪80年代以来,出现了由各个公司自行开发和使用的多种硬件描述语言,这些语言各自面向特定的设计领域和层次。但众多的语言使用户无所适从,也降低了电路设计的可移植性和通用性。因此,需要一种面向设计的多领域、多层次并得到普遍认同的标准硬件描述语言、VHDL和VerilogHDL语言适应了这种趋势的要求,先后被确定为IEEE标准。下面简单介绍一下VerilogHDL以及用来对组合
逻辑电路进行描述的方法。VerilogHDL从C语言中继承了多种操作符和结构,源文本文件由空白符号分隔的词法符号流组成。词法符号的类型有空白符、注释、操作符、数字、字符串、标识符和关键字等,从形式上看和C语言有许多相似之处。
和其他高级语言一样,VerilogHDL语言采用模块化的结构,以模块集合的形式来描述数字电路系统。模块(module)是VerilogHDL语言中描述电路的基本单元。模块对应硬件上的逻辑实体,描述这个实体的功能或结构,以及它与其他模块的接口。它所描述的可以是简单的逻辑
门,也可以是功能复杂的系统。模块的基本语法结构如下:
module<模块名>(<端口列表>)
<定义>
<模块条目>
endmodule
根据<定义〉和<模块条目>的描述方法不同,可将模块分成行为描述模块、结构描述模块或者是二者的组合。行为描述模块通过编程语言定义模块的状态和功能。结构描述模块将电路表达为互相连接的子模块,各个子模块必须是VerilogHDL支持的基元或已定义过的模块。
行为描述方式和其他软件编程语言的描述方式类似,通过行为语句来描述电路要实现的功能,表示输人与输出间转换的行为,不涉及具体结构,是一种行为建模的描述方式。以图所示的2选1数据选择器为例:
若用Verilog HDL对它作行为描述,则可写成下面的程序模块:
modulemux_2_to_l(a,b,out,outbar,sei);
//这是一个2选1数据选择器,名为mux_2_to_l
inputa,b,sei;
outputout,outbar;
assignout=sei?a:b;//如果sel=1,将a赋值给out 如果sel=0,将b赋值给out
assignoutbar=-out;//将out取反后赋值给outbar
endmodule//模块描述结束
结构描述方式是将硬件电路描述成一个分级子模块相互连的结构。通过对组成电路的各个子模块间相互连接关系的描述来说明电路的组成。各个模块还可以对其他模块进行调用,也就是模块的实例化。其中调用模块成为层次结构中的上级模块,被调用模块成为下级模块。从结构上而言,任何硬件电路都是由一级级不同层次的若干单元组成,因此结构描述方式很适合对电路的层次化结构描述。在结构描述中,门和MOS 开关是电路最低层的结构。在Verilog HDL 中 有26个内置的基本单元,又称基元,见表:
仍以2选1数据选择器为例,若给出它的门级电路原理如图:
采用结构描述方式可以写成下面的程序模块:
module muxgate ( a,b,out,outbar,sei);
input a, b, sei;
output out, outbar;
wire out 1, out2 , selb;//定义内部的三个连接点outl,out2, selb
and al ( outl, a,sei); //调用一个与门al
not il (selb,sei);//调用一个反相器i1
and a2 (out2, b,selb); //调用一个与门a2
or ol (out, outl,out2 ); //调用一个或门ol
assign outbar = - out ;
endmodule
例子:用Verilog HDL的结构描述方式对图所示的4位加法器进行描述。
//对4位串行进位加法器的顶层结构的描述 //4 位全加器模块名称和端口名 //定义参数 module Four_bit_f ulladd ( A,B, CI, S, CO); parameter size = 4; input [size:l] A, B; output [size:1] S; input CI; output CO; wire [ 1 :size-l] Ctemp //定义模块内部的连接线 onebit_fulladd //调用1位全加器 add1(A[1] , B[1], CI,S[1],Ctemp[1]),//实例化,调用 1 位全加器 add2(A[2] , B[2] , Ctemp[1], S[2],Ctemp[2]),// 实例化,调用 1 位全加器 add3(A[3], B[3], Ctemp[2] , S[3], Ctemp[ 3]) ,//实例化,调用 1 位全加器 add4(A[4] , B[4], Ctemp[3] , S[4] , CO);//实例化 4 endmodule
上面的程序仅对图电路进行了顶层描述,在程序中调用1位全加器onebit_fulladd。如图中的1位全加器采用图所示的电路结构:
则可以用下面的程序模块进行描述:
//对1位全加器的内部结构的描述
module onebit_fulladd (A, B, CI, Sum, Cout) ; //1 位全加器模块名称和端口名
input A, B, CI;
output Sum, Cout ;
wire Sum_temp, C_1, C_2 , C_3 ; //定义模块内部的连接线
xor
XOR1 ( Sum_temp, A, B),
XOR2 ( Sum, Sum_temp, CI) ; //两次调用异或门实现 Sum = A®B㊉CI
and //调用 3 个与门 ANDI, AND2, AND3
AND3 ( C_3,A,B),
AND2( C_2, B, CI);
AND1( C_l, A, CI),
or
OR1( Cout, C_l. C_2, C_3);
endmodule
用Verilog HDL的行为描述方式对4位加法器进行描述:
module Four_bit_fulladd (A, B, CI, S, CO); //4位全加器模块名称和端口名
parameter size = 4;
input [ size:1] A, B; //定义加数和被加数的位数为4
output [size:1] S; //定义和的位数为4
input CI;
output CO;
assign | CO, S | = A + B + CI 加运算后的结果为5位
endmodule
PLD开发工具包括软件和硬件两部分。
软件是指PLD专用的编程语言和相应的汇编程序或编译程序。
功能更强、效率更高、兼容性更好的编译型开发系统软件很快地得到了推广应用。其中比较流行的有DataI/O公司研制的ABEL和LogicalDevice公司的CUPLO这类软件输入的源程序采用专用的高级编程语言——硬件描述语言HDL编写,有自动化简和优化设计功能。除了能自动完成设计以外,还有电路模拟和自动测试等附加功能。
20世纪80年代后期又出现了功能更强的开发系统软件.这种软件不仅可以用高级编程语言输入,而且可以用电路原理图输入。这对于想把已有的电路(例如用中、小规模集成器件组成的一个数字系统)写人PLD的人来说,提供了最便捷的设计手段。例如,DataI/O公司的Synario就属于这样的软件。
20世纪90年代以来,PLD开发系统软件开始向集成化方向发展。为了给用户提供更加方便的设计手段,一些生产PLD产品的主要公司都推出了自己的集成化开发系统软件(软件包)。这些集成化开发系统软件通过一个设计程序管理软件将一些已经广为应用的优秀PLD开发软件集成为一个大的软件系统,在设计时技术人员可以灵活地调用这些资源完成设计工作属于这种集成化的软件系统有Altera公司Quaturs II、Lattice公司的Lattice Diamond、Xilinx公司的ISE Design Suite等。
开发系统的硬件部分包括计算机和编程器。编程器是对PLD进行写入和擦除操作的专用装置,能提供写入或擦除操作所需要的电源电压和控制信号,并通过串行接口从计算机接收编程数据,最终写进PLD中。早期生产的编程器往往只适用于一种或少数几种类型的PLD产品,而目前生产的编程器都有较强的通用性。
PLD的编程工作大体上可按如下步骤进行。
为方便用户使用,又将编程器中的控制电路与原来PLD的电路集成于一体,开发出了在系统可编程(InSystemProgrammable,简称ISP)的可编程逻辑器件,简称ispPLD。在使用ispPLD进行设计时,不再需要使用编程器,只要从它的通信接口直接将计算机生成的编程数据写入其中就行了。
举例说明如何用硬件描述语言设计一个较复杂的组合逻辑电路:
图是某化工厂的化学液体罐。在罐体上安装了 9 个液位检测传感器,每隔1 m 间隔安装1 个、,该种液位检测传感器的工作原理是:液面高于传感器时,传感器输出逻 辑高电平1 ; 当液位低于传感器时,传感器输出逻辑低电平0 。请按照如下要求分别设计监测电 路模块和报警接口电路模块,以便随吋监测液面高度并完成液位超高报警:
当监测电路检测到液面高度后,实时地将高度显示在一位共阴极的七段显示数码管上(1~9 m); 当液面高度超出最高检测传感器的位置9 m后,点亮发光二极管D报警。
解:整个设计可以分两层设计,顶层为两个模块,编码模块和译码模块。编码模块完成9个液位感器信号S1-S9的4位二进制的编F3F2F1FO;译码模块将优先编码器的输出F3F2F1F0作为输入,输出7段显示码YaYbYcYdYeYfYg。
//顶层设计 //模块一:编码模块 module code_9to4 (F,S); //定义编码模块的名字和接口 output [ 3 :0] F; input [ 9 : 1 ] S; reg [3 :0] F; always© (S) //优先编码的真值表 case ( S) 9‘b000000111: F=4’b0001;//液面超过 S1,编码 1(0001) 9‘b000000111: F=4’b0010; 9‘b000000111: F=4’b0011; 9‘b000000111: F=4’b0100; 9‘b000000111: F=4’b0101; 9‘b000000111: F=4’b0110; 9‘b000000111: F=4’b0111; 9‘b000000111: F=4’b1000; 9‘b000000111: F=4’b1001; default: F = 4‘bx; endcase endmodule //模块二:7段显示译码模块 module bin27seg(data,y); input [ 3: 0 ] data; output [6:0]y; reg [6:0] y ; always @ (data) begin y = 7'b0000000; case (data ) 4’bOOOO: y = 7'b0111111;//显示 0 4’b0001: y = 7'b0000110;//显示 1 4’b0010: y = 7'b1011011;//显示 2 4’b0011: y = 7'b1001111;//显示 3 4’b0100: y = 7'b1100110;//显示 4 4’b0101: y = 7'b1101101;//显示 5 4’b0110: y = 7'b1111100;//显示 6 4’b0111: y = 7'b0000111;//显示 7 4’b1000: y = 7'b1111111;//显示 8 4’b1001: y = 7'b1100111;//显示 9 default: y = 7'b0000000;//熄灭 endcase endmodule
完成设计描述后,借助E D A 工具迸行功能仿真和时序仿真进行设计验证,验证完毕后进行电路综合和下载。
在图所示的与门电路中,但是在输人信号4从1跳变为0时,如果B从0跳变为1,而B首先上升到VIL(max)以上,这样在极短的时间▶️t内将出现A、B同时高于V1L(max)的状态,于是便在门电路的输出端产生了极窄的Y=1的尖峰脉冲,或称为电压毛刺,如图中所示(在画波形时考虑了门电路的传输延迟时间)。显然,这个尖峰脉冲不符合门电路稳态下的逻辑功能,因而它是系统内部的一种噪声
我们将门电路两个输入信号同时向相反的逻辑电平跳变(一个从1变为0,另一个从0变为1)的现象称为竞争。应当指出,有竞争现象时不一定都会产生尖峰脉冲。例如,在图所示的与门电路中,如果在B上升到VIL(max)之前A已经降到了以下VIL(max)(如图中虚线所示),这吋输出端不会产生尖峰脉冲。
在设计时往往难于准确知道A、B到达次序的先后,以及它们在上升时间和下降时间上的细微差异。因此,我们只能说只要存在竞争现象,输出就有可能出现违背稳态下逻辑关系的尖峰脉冲。由于竞争而在电路输出端可能产生尖峰脉冲的现象就称为竞争-冒险。
倘若译码器的负载是一个对尖峰脉冲敏感的电路(例如下一章将要讲到的触发器),那么这种尖峰脉冲将可能使负载电路发生误动作。对此应在设计时采取措施加以避免。
在输入变量每次只有一个改变状态的简单情况下,可以通过逻辑函数式判断组合逻辑电路中是否有竞争-冒险现象存在。
如果输出端门电路的两个输人信号A和A’是输入变量A经过两个不同的传输途径而来的 ,那么当输人变量A的状态发生突变时输出端便有可能产生尖峰脉冲。因此,只要输出端的逻辑函数在一定条件下能简化成Y=A+A, 或 Y=AA’,则可判定存在竞争-冒险现象。这种方法虽然简单,但局限性太大,因为多数情况下输人变量都有两个以上同时改变状态的可能性如果输人变量的数目又很多,就更难于从逻辑函数式上简单地找出所有产生竞争-冒险现象的情况了。将计算机辅助分析的手段用于分析数字电路以后,为我们从原理上检查复杂数字电路的竞 争-冒险现象提供了有效的手段。通过在计算机上运行数字电路的模拟程序,能够迅速查出电路是否会存在竞争-冒险现象 目前已有这类成熟的程序可供选用。另一种方法是用实验来检查电路的输出端是否有因为竞争-冒险现象而产生的尖峰脉冲。 这时加到输人端的信号波形应该包含输入变量的所有可能发生的状态变化。即使是用计算机辅助分析手段检查过的电路,往往也还需要经过实验的方法检验,方能最后确定电路是否存在竞争-冒险现象。因为在用计算机软件模拟数字电路时,只能采用标准化的典型参数,有时还要做一些近似,所以得到的模拟结果有时和实际电路的工作状态会有出入。因此可以认为,只有实验检查的结果才是最终的结论。
一、 接入滤波电容
由于竞争-冒险而产生的尖峰脉冲一般都很窄(多在几十纳秒以内),所以只要在输出端并接一个很小的滤波电容C1如图所示:
就足以把尖峰脉冲的幅度削弱至门电路的阈值电压以下,在T T L 电路中,Cf 的数值通常在几十至几百皮法的范围内。对于输出电阻较高的
CMOS电路,Cf的数值可以选得更小一些。这种方法的优点是简单易行,而缺点是增加了输出电压波形的上升时间和下降时间,使波形变坏。
二、引入选通脉冲
第二种常用的方法是在电路中引人一个选通脉冲P ,如图(a )所示。因为p的高电平出现在电路到达稳定状态以后,所以G0 ~ G3 每个门的输出端都不会出现尖峰脉冲。但需注意,这时G0 ~G 3 正常的输出信号也将变成脉冲信号,而且它们的宽度与选通脉冲相同。例如,当输入信号AB变成11以后,Y3并不马上变成高电平,而要等到p端的正脉冲出现时才给出一个正脉冲。
三、修改逻辑设计
以上图(a)所示电路为例,我们已经得到了它输出的逻辑函数式为Y=AB+A’C而且知道在B = C= 1的条件下,当A改变状态时存在竞争-冒险现象。根据逻辑代数的常用公式可知
Y=AB+A’C=AB+A’C+BC
我们发现,在增加了BC项以后,在B = C= 1时无论4如何改变,输出始终保持Y=1。因此,A的状态变化不再会引起竞争-冒险现象。因为BC 一项对函数Y来说是多余的,所以将它称为 Y 的冗余项,同时将这种修改逻辑设计的方法称为增加冗余项的方法。增加冗余项以后的电路如图所示:
用增加冗余项的方法消除竞争-冒险现象适用范围是很有限的。由图所示电路中不难发现,如果A和B同时改变状态,即AB从10变为01时,电路仍然存在竞争-冒险现象。
将上述三种方法比较一下不难看出,接滤波电容的方法简单易行,但输出电压的波形随之变坏。因此,只适用于对输出波形的前、后沿无严格要求的场合。引入选通脉冲的方法也比较简单,而且不需要增加电路元件。但使用这种方法时必须设法得到一个与输入信号同步的选通脉
冲,对这个脉冲的宽度和作用的时间均有严格的要求。至于修改逻辑设计的方法,倘能运用得当,有时可以收到令人满意的效果。例如,在图所示的电路中,如果门G5 在电路中本来就已存在,那么只需增加一根连线,把它的输出引到门G4的一个输入端就行了,既不必增加门电路,又不给电路的工作带来任何不利的影响。然而,这样有利的条件并不是任何时候都存在,而且这种方法能解决的问题也是很有限的。
end
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。