VHDL硬件描述语言与数字逻辑电路设计-(10)[175页]_第1页
VHDL硬件描述语言与数字逻辑电路设计-(10)[175页]_第2页
VHDL硬件描述语言与数字逻辑电路设计-(10)[175页]_第3页
VHDL硬件描述语言与数字逻辑电路设计-(10)[175页]_第4页
VHDL硬件描述语言与数字逻辑电路设计-(10)[175页]_第5页
已阅读5页,还剩170页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第10章 数字系统的实际设计技巧10.1 数字系统优化的基本方法10.2 数字系统设计中的工程实际问题习题与思考题10.1 数字系统优化的基本方法10.1.1 相同电路的处理在系统设计的前期,设计人员不一定预先知道有多处存在着相同的运算电路,只有在画出电路框图后才会发现它们的存在。例如在图10-1(a)中,2个状态都需进行B+1运算,要正确实现其功能需要3个B+1的运算电路。但是,进行优化以后实际上只要用1个B+1的运算电路就可以实现正确的逻辑功能,如图10-1(b)所示。有多个相同运算的电路;(b) 优化后采用一个运算电路图10-1 多个相同运算电路优化实例如图10-1(a)所示,未优化的V

2、HDL程序清单如下:如图10-1(b)所示,优化后的VHDL程序清单如下:10.1.2 运算顺序的改变在设计电路时适当地改变运算顺序就可以达到优化电路的目的。如图10-2(a)所示,为了进行node (ba)+(bc)的运算,按常规的运算顺序画出的数据流图如图10-2(a)中的左图所示。为实现该运算,需要2个乘法器和1个加法器。现在用因式分解的方法来改变原式的运算顺序,即先作加法后再进行乘法运算,即nodeb(a+c),其数据流图如图10-2(a)中的右图所示。修改运算顺序后,实现该运算只需1个乘法器和1个加法器。显然,这样就减少了电路的规模。图10-2(b)示出了另一种改变计算顺序的方法。原

3、式node(a+b)+c)+d)经改变后变为node(a+b)+(c+d),这样做可使运算电路的级数减少,(a+b)和(c+d)可以进行并行运算,从而提高了电路的运算速度。图10-2 改变运算顺序优化电路(a) 缩小了电路规模;(b) 提高了运算速度10.1.3 常数运算的运用在前面已经提到,计算机工作时状态有Fetch、Decode等,在形成门级电路时通常将这些状态名赋以常数值,如Fetch赋以0,Decode赋以1等。在运算式中使用布尔代数性质对常数进行操作可简化运算电路。例如:x AND 1 = xx AND 0 = 0 x OR 1 = 1x OR 0 = x这种情况下,EDA软件在编

4、译时都能进行自动化处理,其原因也就在于此。10.1.4 相同运算电路的使用在设计电路时,即使参与运算的数据不同,只要不是进行同时运算,两个不同的运算就可以由一个运算电路来实现。例如,图10-3(a)是一个未经优化的数据流图,图中需要使用2个乘法电路。考虑到AB在S0状态下进行运算,CD在S1状态下进行运算,这2个乘法器运算操作是在不同时间内进行的,因此该电路可以同用一个乘法器,优化后的数据流图如图10-3(b)所示。 优化前的数据流图;(b) 优化后的数据流图图10-3 相同的运算电路实例在图10-3 (b)中利用S0和S1进行选择,在S0时乘法器输入为A和B,在S1时乘法器输入为C和D;其输

5、出也同样由S0和S1进行选择,送到不同的选择器,以实现正确的算术运算。在进行这样的优化以后,该电路只要一个乘法器即可。如图10-3(a)所示,优化前的程序清单如下: 如图10-3(b)所示,优化后的VHDL程序清单如下:上面讨论的是多个运算相同的操作采用同一个运算电路的情况。其实,有时候不同的运算操作也可以用一个运算电路来实现。图10-4(a)中有一个加法器和一个减法器,如果减法操作用A+(-1B)来代替,那么就可以将减法器变为加法器,不过操作数B在加法前应先乘以-1。当然,这样做的前提是:如图10-4(b)所示,增加的选择器和乘以-1所需要的电路其规模应比加法器小才合理。(a) 优化前的数据

6、流图;(b) 优化后的数据流图图10-4 不同运算操作用同一个运算电路的实例如图10-4(a)所示,优化前的VHDL程序清单如下:如图10-4(b)所示,优化后的VHDL程序清单如下:10.1.5 优化的必要性及其工程实际意义当前随着半导体及集成电路技术的发展,几十万至几百万门的单片电路已非常普遍,那么设计人员是否还有必要像以前那样关注电路的冗余问题呢?答案是肯定的。首先,尽管ASIC和FPGA芯片的价格不只由门的数目来确定,但是门数多了必定会增加芯片的价格。另外,冗余的电路会使电源消耗增加,电路工作速度降低,同样也会增加布线困难。其次,无论使用什么样的EDA软件工具,总希望综合得到性能良好的

7、电路。不同的EDA软件综合所得到的电路会有一些差别。但是,只要使用上述方法进行优化,去除整体部分的冗余电路,最后得到的优化结果就不会相差太远。最后,根据实践表明,电路规模愈大,其存在的冗余也会愈大。例如,在对数据进行处理时,要对几十至几百行的C语言程序进行硬化,这对于程序来说可能是小规模的,但是对于硬件来说其规模就不小了。假设该程序有几十个数组,含有100个32位的整数变量。这些变量用硬件寄存器来实现,那么需要的门数量为32位1006门/位=19200门这里,每位寄存器用6个门进行计算。在对位数长的数据进行运算时,去除少量的冗余就会节约大量的门电路。另外,在设计时用多个运算电路进行并发运算是允

8、许的,但是如果其个数达到了几十个,那么就应该考虑冗余问题。因为此时存在的冗余可能会对电路性能产生不利影响。剔除冗余是设计人员为提高电路性能所必须要做的事情,一般应尽可能在电路或系统的框图设计阶段去除冗余,这样可以达到事半功倍的效果,而门级的电路化简或优化可以留给EDA软件去实现。10.2 数字系统设计中的工程实际问题10.2.1 提高系统工作速度的方法1影响系统工作速度的主要因素所谓系统的工作速度,是指系统以何种时钟频率工作。系统的处理时间可以表示为处理时间=时钟周期处理所需的时钟周期数1) 临界路径长度在数字系统中,临界路径长度(Critical Path)决定了系统的工作速度。所谓临界路径

9、,是指从系统输入到系统输出的各条路径中信号通过时间最长的那一条路径。该路径长度将决定系统的最高工作速度。某一系统的VHDL程序描述如例10-1所示。【例10-1】 系统临界路径确定实例。从程序中可以看出,aReg = aReg*(bReg*cReg) 的路径最长,因此,该系统的工作速度由该路径中信号传送的时间所确定。假设每个乘法器的运算时间需要100 ns,每个选择器的时间延时需要1ns,那么只考虑2个乘法器所需的运算处理时间就不能小于200ns。由此推断,时钟频率一定不能高于5 MHz。2) 门电路之间延时时间的计算数字系统的延时也包含门电路之间的延时。门电路之间的延时由两部分组成:门电路本

10、身所产生的延时和连线所产生的传输延时。门电路之间的延时时间如图10-5所示。图10-5 门电路之间的延时时间一般来说,连线长度和门的扇出数成正比,当然也就和连线的延时时间成正比。如果某系统都是由门电路组成的,那么其系统总的延时时间应为在ASIC芯片中,标准单元和门阵列的每个门延时约为0.10.5 ns;FPGA芯片中1个单元的延时约为几个ns;LSTTL芯片每个门延时约为10 ns;ASIC芯片如果按1 ns延时计算,则时钟频率可达1GHz。由此可知,这就是ASIC芯片的工作速度比一般电路高得多的原因。3) 系统延时时间的评估在用EDA软件工具对系统进行综合时,软件会自动寻找系统的临界路径,并

11、为设计者指出系统所能工作的最高频率。由于没有考虑系统的动态工作特性,只以电路图或网表为依据来寻找临界路径,因此把这种分析称为静态定时分析。例如,下面的VHDL程序清单中,EDA软件把经过2个乘法器的路径认定为该系统的临界路径,但是实际的信号传输路径是经过一个加法器和一个乘法器(见图10-6)。图10-6 实际信号传输路径示意图这就表明系统的实际工作速度比EDA软件的仿真速度快。这样,EDA软件寻找的临界路径就没有实际意义,这种情况就称为出现了错误的临界路径。2在RTL级上提高工作速度的方法在RTL级上改变处理的内容、各部件的连接方法并适当地调整数据流图或状态图就可以使系统在构建基本结构时达到数

12、据路径最短。这一点在门级是很难达到的。在一般设计中,由VHDL程序生成门级网表,这一步骤是由EDA软件来完成的,设计人员一般不进行人工干预。除非综合结果有问题时,设计人员才在门级对电路进行适当的人工调整。因此,RTL级设计对提高系统的速度至关重要。1) 缩短临界路径长度(1) 减少临界路径上的处理内容。减少临界路径上的处理内容是指把可以在别的通路上进行处理的内容移走,使各通路的处理时间尽可能均衡。在设计时为了确定哪条路径是临界路径,最好用数据流图来描述系统的工作过程,这样比较直观,也易识别临界路径。在例10-1中,状态S1要进行2次乘法运算aReg*bReg*cReg,它是系统的临界路径。从例

13、10-2所示的程序中可以看到,系统从S0S1S2,最终的aReg值应为aReg=2in0in1in23个状态分别进行不同的运算。如果要保证最后的aReg值不变,只需把运算操作的内容进行适当调整,如将S1状态中cReg的运算放在S2状态中进行,那么此时的VHDL程序描述就应修改为例10-2所示。经修改后,临界路径变为aReg = aReg*(cReg*2)。显然,乘2操作可以用左移1位来实现,电路比较简单,延时比一般乘法小,故减少了系统的临界路径长度,达到了提高系统工作速度的目的。表10-1示出了EDA软件对例10-1和例10-2进行分析比较的结果。表中的信号用16位二进制表示。从表10-1中可

14、以看到,例10-1中的程序经修改后,使工作速度和电路规模都有了较大的变化。(2) 增加状态数或寄存器数。除了上述减少临界路径上的处理内容外,在必要时增加处理的时钟周期(状态数)个数和寄存器数也可以达到缩短临界路径长度的目的。图10-7是增加状态、缩短临界路径长度的实例。图10-7(a)是某一系统的状态图。不难发现,该系统的临界路径是A=ABC。现在在S0和S1状态之间增加一个状态S0,并且将某些运算内容分摊给该S0状态来完成,如图10-7(b)所示。这样处理以后临界路径长度就缩短了。应该说,增加状态会使整个处理时间拉长,但是由于临界路径长度缩短,时钟频率增加,使得每个状态的处理时间缩短,在大多

15、数情况下,系统整体的工作速度将得到提高。图10-8是增加寄存器、缩短系统临界路径的实例。图10-8(a)是系统原来的状态图。图10-8(b)是修改后的状态图。在该图的S0状态中增加了一个C寄存器,并将S0状态中的C操作放到S1状态中进行。这样修改以后使系统的临界路径由A=ABC变为A=AC2。显然,后者的临界路径长度要比前者短,即提高了系统的工作速度。(a) 系统原状态图;(b) 添加状态后的状态图图10-7 增加状态、缩短临界路径长度的实例(a) 系统原状态图;(b) 增加寄存器后的状态图图10-8 增加寄存器、缩短临界路径的实例2) 改变临界路径上的处理顺序在计算中,加法和乘法运算所需要的

16、时间是不一样的,为了提高系统的速度,通常把运算速度慢的计算放在运算树的短枝上,以充分发挥并发运算所带来的好处。如图10-9是改变临界路径上的处理顺序以提高系统速度的实例。图10-9(a)是乘法运算比加法运算慢的(a+b)cde运算数据流程图;图10-9(b)是加法比乘法运算慢的(a+b)cde运算数据流图。(a) 加法运算1 ns,乘法运算5 ns情况下的数据流图;(b) 加法运算5 ns,乘法运算1 ns情况下的数据流图图10-9 改变临界路径上的处理顺序以提高系统速度的实例3) 提高各个运算器的速度前面所提到的方法都假设在各运算器工作速度一定的情况下,对运算内容、次序进行适当调度和安排来达

17、到提高系统速度的目的。如果提高各运算器本身的速度,那么无论在任何情况下,都可以达到提高系统速度的目的。这个工作必须在门级设计时进行。4) 利用多周期路径提高系统的工作速度当运算操作在一个时钟周期内不能完成时,就用2个时钟周期来完成,其中间结果通过寄存器来取得。下面就是利用多周期路径来提高系统工作速度的实例。【例10-3】 利用多周期路径来提高系统工作速度的实例。未修改前VHDL程序描述如下:在例10-3修改前的S0状态中,aReg*bReg在1个时钟周期中是无法完成的,因此,在S0和S1状态之间插入一个中间状态Sadd。aReg*bReg在S0状态开始时就进行运算,到Sadd状态结束,aReg

18、*bReg的中间值node形成,在S1状态开始时node值被赋予aReg,然后完成最后的运算。由VHDL语法知道,node = aReg*bReg语句和PROCESS语句是并发执行的,引入的Sadd状态是为了拉长乘法时间,并使node = aReg*bReg运算与PROCESS同步。假设aReg*bReg需要2个时钟周期,那么这种修改是有效的。这样就缩短了临界路径长度,提高了系统的整体工作速度。5) 减少临界路径上部件的扇出数众所周知,一个部件的扇出数愈多,负载愈重,该部件对信号所产生的延时也就愈大。因此,减少临界路径上部件的扇出数无疑会提高系统的工作速度。图10-10是减少临界路径上部件的扇

19、出数来提高系统工作速度的实例。图10-10(a)中,系统临界路径上部件的扇出数为3。将2个乘法器合并后,如图10-10(b)所示,部件的扇出数变为2。(a) 系统原部件连接情况;(b) 利用共享乘法器减少扇出数情况图10-10 减少临界路径上部件的扇出数来提高系统工作速度的实例利用计算系统的临界路径长度来评估系统的工作速度,在大多数情况下是可行的,但是也有例外。例如,当组合电路跨模块进行连接时,有可能使优化效果变差。也就是说,多个组合电路模块合并成一个模块进行优化,其临界路径肯定会更短。另外,多模块连接后的实际路径长度有可能比各模块临界路径长度之和要长。10.2.2 缩小电路规模和降低功耗的方

20、法1缩小电路规模的方法缩小电路规模的最基本方法是在设计时尽可能共享资源。1) 共享组合电路的部件使用EDA软件达到理想的资源(部件)共享效果,这种情况大多是存在的。例如,在计算A+(BC)和(BC)2时,(BC)是相同的,可以用一个电路来实现。2) 共享寄存器在用VHDL语言设计电路时,要尽可能减少变量和信号量的设置,能共享的尽可能共享,因为冗余的寄存器将会增大电路规模和功耗,特别是位数较长的寄存器更是如此。假如现有100个32位的冗余寄存器,那么就需要3200个触发器。这样大的规模在当前条件下是不能忽视的。3) 共享连线连线也是一种资源。利用三态门使多个输出共享一条总线,这是共享总线的一种形

21、式。当然,在CMOS电路中为了防止总线浮动,通常在输出端要接上拉电阻或者下拉电阻。为了降低功耗有时也不采用三态总线。4) 展开处理时间实现资源共享如果在一个状态中有几次相同种类的运算或译码,那么将几个相同运算依次分散到几个状态中进行处理,此时可以利用共享部件的方法使多个相同运算的电路用一个电路进行分时处理。5) 展开处理空间实现资源共享对数据流图的处理顺序进行适当调整就可以缩小数据流图的规模。(1) 通过改变处理顺序来缩小电路规模。图10-11是通过改变处理顺序来缩小电路规模的数据流图。图10-11(a)是未进行修改的数据流图;图10-11(b)是修改处理顺序后的数据流图。两个图的不同点是后者

22、先作加法,后作乘法。这样修改以后可以节省3个乘法器和1个加法器,从而缩小了电路规模。未进行修改的数据流图;(b) 修改处理顺序后的数据流图图10-11 通过改变处理顺序来缩小电路规模的数据流图(2) 通过串行处理来缩小电路规模。图10-12是通过串行处理来缩小电路规模的数据流图。图10-12(a)是未进行修改前的数据流图,图10-12(b)是进行串行处理后的数据流图。(a) 未修改前的数据流图;(b) 进行串行处理后的数据流图图10-12 通过串行处理缩小电路规模的数据流图图10-12(a)的运算公式为f1=3a+b, f2=a+3b, f3=f1+f2完成此运算需要2个乘法器和3个加法器。如

23、果直接对f3进行运算:f3=3a+b+a+3b=4a+4b=4(a+b)那么完成4(a+b)运算只要1个加法器和进行2次移位操作即可,如图10-12(b)所示。这样就大大缩小了电路的规模。(3) 复杂运算化简成简单运算。复杂的运算通过适当改变顺序可以变成简单的运算。例如,(a+1)+b)+2)可以用(a+b)+3)来替代。这样就可以省掉1个加法器。(4) 利用数据流图中的已有结果。在数据流图中某些分支可能会得到相同的结果,此时可省掉1个分支,利用1个分支已得到的结果参与下一级运算,从而减少重复的运算电路。2在RTL级上降低系统功耗的方法功耗是单片系统的一个很重要的指标,功耗愈低,系统的寿命、可

24、靠性和体积也愈低。1) 缩小电路的规模电路规模愈小,功耗也就愈小。前述的缩小电路规模的方法对降低功耗都有实际意义。2) 停止不必要的运算处理下面是某系统的VHDL程序描述清单,它由S0S3四个状态组成。上述程序中,S0进行加法运算,S1进行减法运算,S2进行乘法运算。经编译综合后,其电路的基本结构如图10-13所示。这样结构的电路无论在何种状态下,所有运算电路都要进行工作。但是实际上S0状态下只要加法运算器工作,S1状态下乘法器就没有必要进行工作。这些运算器没有选择的无用工作会增加电路的功耗。采用下面方法可以停止不必要的运算处理。图10-13 某系统的基本电路结构(1) 只允许必要的运算电路工

25、作。为了降低电路的功耗,只选择必要的运算电路进行工作,对图10-13进行修改后电路结构如图10-14所示。图10-14中,在各个运算器的输入端插入一个“与门”,在没有工作必要时使该电路输出为“0”。由此可知,S0状态下乘法运算器和减法运算器不工作,S1状态下乘法器不工作。图10-14 图10-13修改后的电路结构(2) 尽可能在数据流的前部分屏蔽数据流。数据流图中的一个管道增加的控制“与门”像一个阀门,不需要进行运算的数据流应尽可能早地在数据流的前部分屏蔽,这样可以降低功耗。在进行流水线操作时,在没有有效数据的情况下管道的输入侧如果屏蔽数据,则会停止后阶段的操作。如果控制数据流入的信号(如“与

26、门”的输入)与数据信号相比滞后,则会出现竞争冒险现象,从而降低减小功耗的效果。因此,必须消除这种竞争冒险现象。有关细节将在10.2.3节详述。(3) 寄存器的值没有必要改变时不要改变。若每个时钟到来时寄存器的输出值都要变化,那么它后面连接的组合电路也会随之工作。另外,像移位寄存器等那样的电路,即使没有和组合电路相连接,只要数据被移位,就会增加功耗。在运算器输入端设置专用的寄存器是一种降低功耗的方法。例如在图10-14中,各运算器在一个时钟周期内有2次动作:第一次是当数据输入时,第二次是当状态切换时。要使运算器在一个时钟周期只进行一次动作,就必须在运算器输入端设置专用寄存器。只有当需要进行运算时

27、,才将其数据写入该寄存器。这样动作减少了,当然功耗也就降低了。3) 减少竞争冒险的总量由于组合电路的信号在多条路径中的传输延时不同,因而就会产生竞争冒险现象。譬如,冒险在信号流图的前部分发生,就会向后面部分传播,数量也会增加。特别地,多个处理串行连接时问题就会更大。图10-15是多个加法器串行连接的电路。图中,加法器产生的冒险现象从前面向后面传播,最后一个输出node6out比第一级加法器输出 node1out的冒险量增加了11倍。由此可见,这种串行工作的电路其最后一级输出的冒险量与串联的级数成正比。事实上,要完全消除冒险现象是困难的,但是使其减少却是完全可以做到的。图10-15对应的串接加法

28、器的VHDL描述清单如下:通常减少串接电路数目就可以减少冒险总量。将图10-15所示的串接加法器的结构改为树型,结果使其级数从6级减少为3级,那么冒险总量就会减少一半。树型加法器连接的冒险现象如图10-16所示。图10-15 多个加法器串行连接的电路图10-16 树型加法器连接的冒险现象图10-16对应的树型加法器连接的VHDL程序清单如下:4) 控制时钟通过降低时钟频率,用“与门”控制某些工作单元,使其在不工作期间不提供时钟等措施,同样也可以降低系统的功耗。10.2.3 系统误操作的成因及其消除方法系统在工作过程中有可能出现误操作,其产生原因是多方面的。由于设计不当或存在的缺陷诱发的误操作大

29、致有以下几种:(1) 冒险现象。冒险现象通常在信号发生变化时产生,其产生原因主要是输入信号经不同路径传输而出现不同的延时所引起的。冒险的传播将危及后续的电路,特别是时序电路的正确工作。(2) 不遵守既定的定时关系。在用边沿触发器作为数据寄存器时,触发器的数据输入端和时钟触发边沿应保持严格的定时关系。图10-17示出了寄存器的定时关系,在时钟上升沿到来之前,触发器的数据输入端(D端)所加的信号必须有一段稳定的时间,这段时间称为建立时间。在时钟上升沿到来以后,D端的输入信号仍需稳定地保持一段时间,该段时间称为保持时间。建立时间和保持时间对不同的触发器和不同工艺的电路都有明确不同的要求。如果在设计电

30、路时破坏了这种定时关系,如建立时间不够或保持时间不够,则可能导致寄存器输出值不稳定,即“0”或“1”无法确定,从而使系统出现误操作。图10-17 寄存器的定时关系(3) 数据和时钟的临界竞争。图10-18是数据和时钟的临界竞争实例及定时关系。电路输入信号在时钟上升沿到来时,多个寄存器或寄存器各位之间的值出现了参差不齐的变化,从而使输出出现不稳定,这种现象称为数据时钟的临界竞争,也称为竞争。(a) 临界竞争电路实例;(b) 定时关系图10-18 数据和时钟的临界竞争实例及定时关系1设计时应重点注意的地方1) 必须消除冒险现象的地方在与非同步电路的连接线上必须消除冒险现象。(1) 控制存储器和触发

31、器的控制信号。对于存储器或触发器,无论是边沿控制还是电平控制,如DRAM的RAS、CAS、WE及触发器的置位/复位端和锁存控制端,都不能有冒险信号出现,否则就会破坏存储器和触发器的正常数据。另外,边沿触发的触发器时钟端和CPU边沿触发的中断输入信号同样也不应混入冒险信号。(2) 应保持数个时钟周期的信号。当CPU和存储器等设备连接时,对建立/保持时间都有严格规定。如果系统的时钟频率比较高,则建立/保持时间要跨越几个时钟周期。此时如果信号中混有冒险信号,那么有可能破坏这种定时关系。例如,所设计芯片与110ns建立时间的存储器相连,芯片时钟为100 MHz(周期为10 ns),如果数据总线混入了周

32、期为10ns的冒险信号,那么就会使存储器产生读/写错误。2) 必须消除亚稳定和竞争的地方需要接收来自非同步系统信号的地方必须考虑消除亚稳定和竞争。这里所说的非同步系统是指同一芯片内时钟不同的模块或芯片外连接的电路,而不是非同步电路。即使同一个时钟驱动的电路,如果位于其他芯片或端口上,也应看作非同步系统。这是因为芯片的输入和输出驱动等会使时钟和数据的相位产生延时。2消除冒险现象的方法消除冒险现象的方法很多,这里只举几个常用的方法。(1) 利用专用寄存器输出信号。电路的输出信号不由组合电路输出,而是通过专用寄存器直接输出。图10-19是未使用专用寄存器出现冒险现象的实例。该实例的电路由一个八进制计

33、数器和1个3-8译码器组成。当八进制计数器工作时,在其译码器输出端y(0)y(7)就会轮流出现1个时钟周期的低电平。图10-19 未使用专用寄存器出现冒险现象的实例从图10-19的仿真图中可以发现,在译码器的输出端出现了不应有的负向尖脉冲,也就是说出现了冒险现象。这些负向尖峰脉冲可能会对后接电路产生不利影响。为了消除这种冒险现象,在其各输出端加一个锁存寄存器,使它们通过寄存器输出,以消除冒险现象。图10-19对应的VHDL程序清单如下:下面是经过修改的VHDL程序。该程序和图10-19对应程序的区别就是进程受clk时钟上升沿控制。也就是说,只有在时钟上升沿到来时,译码器的输出才会发生变化。这种

34、描述经EDA软件综合后,会在组合译码电路输出端插入1个寄存器,从而屏蔽了冒险现象的向后传播。输出端插入专用寄存器的VHDL描述如下:图10-20是输出端插入专用寄存器清除冒险现象的实例。从图10-20中可以看出,在图10-19中所出现的冒险现象被专用寄存器屏蔽掉了。寄存器之所以能屏蔽冒险现象,是因为寄存器的输出值只在时钟上升沿到来时采样,在该时刻寄存器的数据输入端处于稳定的数据状态,从而避开了数据动态的变化过程。图10-20 输出端插入专用寄存器消除冒险现象的实例(2) 输入至输出只经过一条传输路径。冒险现象是由于变化信号经过不同的路径,产生不同延时而引起的。因此,在组合电路设计时使变化信号只

35、通过一条路径就可以消除冒险现象。图10-21(a)是输入至输出只经过一条传输路径消除冒险现象的实例。图10-21(a)中,输入信号b到达输出端有2条路径,这必定会发生冒险现象。现在假设只有输入信号b发生变化或a、b、c 3个信号只有一个信号发生变化,经调整后的逻辑电路如图10-21(b)所示,此时输入信号b从输入到输出只有一条传输路径,因此该电路就不会发生冒险现象。当然,如果c和a(或b)同时发生变化,则在输出端仍有可能发生冒险现象。(a) 原电路图;(b) 修改后的电路图图10-21 输入至输出只经过一条传输路径消除冒险现象的实例(3) 组合电路输入信号同时只变化1位。如上所述,如果组合电路

36、的多个输入信号只有1位同时发生变化,那么在逻辑设计时就容易做到无冒险现象出现。例如,数字系统中的状态机有多个状态,许多控制信号是对状态机不同的状态进行译码产生的。图10-22是8个状态的状态机编码实例。图10-22(a)是一般编码情况,从000111;图10-22(b)则是汉明距离为1的编码情况。前者在一个状态向另一个状态转移时有可能同时使编码值发生1位以上的变化,例如,111000就发生了3位变化;后者编码按000000010011110010000000的规律进行改变,状态在转移时状态编码只发生1位变化。当然,这种方法并不能完全消除冒险现象,通常要对状态译码电路进行分析,看在什么情况出现冒

37、险。得到确定出现冒险现象的条件后,对逻辑电路进行适当修改,使其信号变化的输入只有一条传输路径,即可消除冒险现象。(a) 通常的编码;(b) 汉明距离为1的编码图10-22 8个状态的状态机编码实例在某些情况下,状态编码不能保证只有1位发生变化(即汉明距离超过1)时,有2种编码方法保证状态图编码仍维持1位变化,如图10-23所示。第一种方法是一个状态分配多个编码,如图10-23(b)所示。原001状态再分配1个010编码,这样可以保证汉明距离为1。例如,原110状态转移至001状态,状态编码发生了3位变化。现在加了010编码,那么该状态编码为001和010。110与该状态的010编码对照,只改变

38、1位编码。其余依次类推,也可得到相似的结果。第二种方法是在状态译码时采用分组译码,如图10-23(c)所示。1011转移至0001时只对低2位译码,这样就保证了只有1位发生变化。(a) 汉明距离超过1的状态图;(b) 多编码状态图;(c) 分组译码状态图图10-23 状态编码汉明距离超过1时的处理方法 (4) 在译码输出端加选通电路。冒险现象通常发生在译码电路输入发生变化的时刻。如果待输入信号稳定以后,再输出译码信号,那么就可以屏蔽冒险现象。例如,在图10-19所示的仿真图中如果加上选通信号STB,那么此时译码输出就消除了,如图10-24所示。图10-24中,STB信号应相对clk前沿延时几十

39、纳秒才行。在这里引入了一个比clk时钟信号频率高5倍的clk信号。图10-24 加选通信号消除冒险现象的实例 2个D触发器U1、U2连接产生一个周期为clk/5的选通脉冲STB。该STB在clk上升沿时变高,在经历一个clk/5的周期之后变低。将该信号与译码输出信号相“或”,即可屏蔽掉在clk上升沿之后出现的“1”冒险现象。同理,如果译码输出是“1”有效,那么可以将NOT STB与译码输出信号相“与”,从而消除“0”冒险现象。图10-24对应的加选通信号STB的VHDL程序清单如下: (5) 在译码逻辑中增加冗余项。若单个译码输入发生变化,则可以在译码逻辑电路中增加冗余项,从而达到消除冒险现象

40、的目的。图10-25是增加冗余项消除“1”冒险现象的实例,其表达式为F=AB+AC。这是因为,当B=C=“1”时,F=A+A。若电路在某些输入组合情况下出现F=AA,那么该电路会产生“0”冒险现象。图10-25所示电路的逻辑表达式中如增加冗余项BC,则为F=AB+AC+BC。当B=C=1时,F=1,从而消除了“1”冒险现象(产生负向干扰脉冲)。(a) 产生“1”冒险的电路;(b) 增加冗余项消除“1”冒险的电路图10-25 增加冗余项消除“1”冒险现象的实例10.2.4 非同步信号的控制方法数字系统的外部输入和内部不同时钟模块之间连接的信号都属于非同步信号,系统只有采用适当的非同步信号控制方法

41、才能保证可靠的工作。1将非同步信号变为同步信号的方法将非同步信号变为同步信号的最简单办法是用D触发器锁存非同步信号,如图10-26所示。图10-26中,非同步输入信号与D触发器的D端相连,时钟端clk与系统时钟相连。这样,在时钟脉冲上升沿到来时就将非同步输入信号锁存于D触发器的Q输出端。在用VHDL描述时,表示锁存的代入语句应位于IF (clkEVENT AND clk=1)语句的内侧。图10-26 非同步信号同步的实例 2同步时的亚稳定现象及其影响如图10-26所示,为了正确地锁存非同步信号,非同步信号在clk上升沿到来之前的一段时间(称为建立时间)和到来后的一段时间(称为保持时间)必须保持

42、稳定。如果在这两段时间内非同步信号有变化,则会使锁存输出发生振荡现象,使信号出现高或低电平无法确定的状态,这种状态称为亚稳定现象。一般亚稳定状态大约要维持11ns。如果这种亚稳定状态向后续电路传播,则会使系统产生误操作。如果时钟频率过高,则会由于亚稳定现象传播而发生误操作。图10-27是电路产生亚稳定现象传播的实例。图中,clk的频率为100 MHz,其周期为10 ns。非周期信号在建立时间之内发生了从“0”到“1”的变化,这就导致同步D触发器输出信号a发生亚稳定现象,其持续时间为11ns。图10-27 电路产生亚稳定现象传播的实例 a点信号经电路1ns的延时(b点)作为D触发器DFF1的输入

43、。另一路经4 ns延时(c点)作为D触发器DFF2的输入。从波形图中可以看出,a点波形亚稳定引起的振荡信号对DFF1不会产生什么影响,因为在10 ns以后,b点波形有3 ns的稳定时间,为下一个时钟前沿到来做好了准备;c点波形由于电路延时较长,在下一个时钟前沿到来前只有1ns的稳定时间,这就违反了必须有2ns建立时间的定时关系,因而导致了DFF2的误操作。因此,为了防止亚稳定现象的传播,在电路设计时必须满足:亚稳定持续时间+组合电路延时时间+触发器的建立时间时钟周期如果同步触发器后面所接的组合电路其延时时间较长,那么可以在同步触发器后再插入一个D触发器。这样做可以切断亚稳定现象的向下传播。当然

44、,这种接法会使非同步输入信号延时2个时钟周期。 3省略同步装置的场合亚稳定现象是由于用同步装置对非同步信号进行同步所引起的。在某种情况下,如果没有同步装置,电路仍能正常工作,那么就可以不要同步装置。例如:(1) 同步装置后续电路只接一个触发器。当后续电路只接一个触发器时,加同步触发器就没有什么意义,可以不插入同步触发器。 (2) 任何时刻只有一个触发器连接非同步信号。即使后续电路中连接有多个触发器,但是在任何时刻只有一个触发器与非同步信号相连接,则也可以省去同步触发器,如图10-28所示。图10-28中,inp是非同步信号,在S0状态时,选通触发器DFFA的输入值;在S1状态时,与触发器DFF

45、B连接。图10-28 任何时刻只有一个触发器与非同步信号连接的情况该电路用VHDL程序描述如下:这种情况可以等效为后续电路只与一个触发器连接的情况。因此,在这种电路中同步触发器也可以省略。 (3) 非同步信号是一个稳定的信号。如果从非同步系统传送过来的信号在有效使用期间其值是稳定的,那么对这种非同步信号可以不使用同步装置进行同步。例如,复位信号一般只在系统上电时使用,平常总是无效状态,对这种信号,一般不需要进行同步。 4对非同步信号控制时应注意的问题对非同步信号控制时应注意以下几个问题:(1) 多个输入信号之间的相位差。从非同步系统输入的数据总线信号是一组非同步的并行信号,有时由于路径长度不同

46、,相互之间可能存在相位差。如果处理不当,则有可能采样不到正确的值,此时必须采用“握手”的数据传送协议,在确认数据值稳定后,再将其读入寄存器。 (2) 芯片的I/O端的建立时间和保持时间的计算。芯片的I/O端的建立时间和保持时间与单独的触发器的建立时间和保持时间是一样的,如图10-29所示。图10-29 芯片的建立时间和保持时间若芯片数据输入引脚到D触发器的D端有tpd的延时时间,芯片时钟输入引脚到D触发器的时钟端(clk)有tck的延时时间,那么从芯片外部来看,该芯片的建立时间和保持时间应为芯片的建立时间=触发器的建立时间+tpdmax tckmin芯片的保持时间=触发器的保持时间+tckma

47、x tpdmin由此可知,芯片的建立时间和保持时间比单独的触发器的建立时间和保持时间都长,在芯片设计时应充分考虑这种实际情况。 (3) 节省同步触发器与消除冒险现象矛盾。在状态机中可以不经同步装置,而使用直接输入的非同步信号。此时,状态寄存器中那些以非同步信号作为输入的触发器的输出端就有可能出现亚稳定现象。若芯片译码器输入部分以这些触发器输出为译码输入信号,那么在其译码输出端就可能产生冒险现象。 (4) 尽可能减少与非同步信号的连接端口。在进行数字系统设计时,应尽可能减少与非同步信号连接的端口,因为这种连接是引起系统误操作的原因之一。为此,设计时应对系统模块的结构及通信协议作一些详细的研究,做

48、到尽可能少的非同步信号端口连接;在必须与非同步信号进行连接时,应制定合理、可靠的通信协议,使其在最恶劣的环境下仍能满足要求的定时关系。10.2.5 典型状态机状态编码的选择状态机的状态编码情况对综合后的状态机电路的操作性能会产生很大影响。例如在前面提到的,当前一个状态向后一个状态转移时,状态编码只改变1位比编码改变多位的情况要好,因为前者出现冒险现象的可能性要小得多,所以选择好的状态编码也是一种减少系统误操作及改善系统性能的重要方法之一。 1系统状态机的状态分解和合并一个数字系统内部可能有多个模块和多个状态机,在对系统进行状态分配选择前应先对这些状态机和状态进行分解或合并。一般处理原则是:一个

49、状态机的状态数应尽可能少,如果不这样做,则状态分配时的难度就会增加。图10-30是状态机状态合并的实例。图10-30 状态机状态合并的实例(a) 3个状态的FSMA;(b) 2个状态的FSMB;(c) 6个状态的FSMAB图中,FSMA和FSMB在同一个时钟驱动下并发工作,它们是相互独立的。如果将2个状态机合并,用一个状态图来描述,则结果如图10-30(c)所示。图10-30(c)所示是一个2状态数的状态机FSMAB,状态分别为SA0SB0、SA0SB1、SA1SB0、SA1SB1、SA2SB0、SA2SB1。状态转移箭头的画法是:凡是有相同状态编码元素的状态,相互之间不会发生转移,故没有箭头

50、连接。例如SA2SB1和SA2SB0 2个状态中SA2是相同的,故没有箭头连接。另外,SA2SB1和SA1SB1及SA0SB0和SA1SB0等都如此。状态中双箭头线表明可能发生双向转移,例如SA0SB1和SA1SB0,因为SA0SA1或SB1SB0都会使这2个状态发生转移。图10-30(c)所示的状态机图较复杂,因此综合后的电路也会复杂得多。图10-30(a)和(b)分别综合得到的电路比较简单。当然,为了解决独立性差或共享部件的问题,也可以采用状态机合并的方法。 2典型的状态编码典型的状态编码方式及其优缺点如表10-2所示。设计者可以根据实际需要选择编码。最佳的编码是不存在的,只能是各种条件的折中。对应表10-2中各状态编码的电路示意图如图10-31(a)、(b)、(c)、(d)所示。二进制码;(b) 格雷码;(c) 单“1”编码;(d) 约翰逊计数码图10-31 典型的状态编码的电路示意图 3选择状态编码时要考虑的问题1) 电路的速度和规模为了提高电路速度,状态寄存器的各位值应尽可能由少数位的值

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论