分享

FPGA数字逻辑设计中一些重要的基本概念

 goandlove 2019-10-22

一、关于建立时间与保持时间

    建立时间(Tsu:Setup time)是指在触发器的时钟信号上升沿到来以前,数据稳定不变的时间,建立时间不够,数据将不能在这个上升沿被打入触发器;保持时间(Th:Hold time)是指在触发器的时钟信号上升沿到来以后,数据稳定不变的时间,如果保持时间不够,数据同样不能被打入触发器。首先:建立时间和保持时间都是器件要求的特性,其中建立时间是器件输入端在时钟信号有效沿到来前,要求输入信号稳定不变的时间,保持时间是器件输入端要求输入信号在时钟信号有效沿到来后保持稳定不变的时间,如果输入信号不满足建立时间和保持时间的要求,就可能导致数据锁存错误。延迟时间是器件本身或布线的物理特性,其含义是信号从器件或布线经过所需的时间。示意图如下:

                                                

                                                                                          图1:建立时间和保持时间示意图

二、数字电路设计中的竞争与冒险

     信号在FPGA器件内部通过连线和逻辑单元时,都有一定的延时。延时的大小与连线的长短和逻辑单元的数目有关,同时还受器件的制造工艺、工作电压、温度等条件的影响。信号的高低电平转换也需要一定的过渡时间。由于存在这两方面因素,多路信号的电平值发生变化时,在信号变化的瞬间,组合逻辑的输出有先后顺序,并不是同时变化,往往会出现一些不正确的尖峰信号,这些尖峰信号称为'毛刺'。如果一个组合逻辑电路中有'毛刺'出现,就说明该电路存在'冒险'。与分立元件不同,由于PLD内部不存在寄生电容电感,这些毛刺将被完整的保留并向下一级传递,因此毛刺现象在FPGA设计中尤为突出,我们无法保证所有连线的长度一致,所以即使多路输入信号在输入端同时变化,但经过FPGA内部的走线,到达门电路的时间也是不一样的,毛刺必然产生,可以概括的讲,只要输入信号同时变化,经过内部走线,组合逻辑必将产生毛刺。将它们的输出直接连接到时钟输入端、清零或置位端口的设计方法是错误的,这可能会导致严重的后果。所以我们必须检查设计中所有时钟、清零、置位等对毛刺敏感的输入端口,确保输入不会含有任何毛刺。冒险往往会影响到逻辑电路的稳定性。时钟端口、清零和置位端口对毛刺信号十分敏感,任何一点毛刺都可能会使系统出错,因此判断逻辑电路中是否存在冒险以及如何避免冒险是设计人员必须要考虑的问题。

毛刺处理:

方案一:在数字电路设计中,常常采用格雷码计数器取代普通的二进制计数器,这是因为格雷码计数器的输出每次只有一位跳变,消除了竞争冒险的发生条件,避免了毛刺的产生。采用。

方案二:毛刺并不是对所有的输入都有危害,例如D触发器的D输入端,只要毛刺不出现在时钟的上升沿并且满足数据的建立和保持时间,就不会对系统造成危害,我们可以说D触发器的D输入端对毛刺不敏感。根据这个特性,我们应该在系统中尽可能采用同步时钟,这是因为同步时钟的变化发生在时钟沿,只要毛刺不出现在时钟的沿口并且不满足数据的建立和保持时间,就不会对系统造成危害,由于毛刺很短,多为几纳秒,基本上都不可能满足建立和保持时间。去除毛刺的一种常见的方法是利用D触发器的D输入端对毛刺信号不敏感
的特点,在输出信号的保持时间内,用触发器读取组合逻辑的输出信号,这种方法类似于将异步电路转化为同步电路。

如前所述,采用格雷码计数器,同步电路等,可以大大减少毛刺,但它并不能完全消除毛刺。毛刺并不是对所有输入都有危害,例如D触发器的D输入端,只要毛刺不出现在时钟的上升沿并且满足数据的建立和保持时间,就不会对系统造成危害。因此我们可以说D触发器的D输入端对毛刺不敏感。但对于D触发器的时钟端,置位端,清零端,则都是对毛刺敏感的输入端,任何一点毛刺就会使系统出错,但只要认真处理,我们可以把危害降到最低直至消除。下面我们就对几种具体的信号进行探讨。

清除和置位信号的处理方案:

在FPGA的设计中,全局的清零和置位信号必须经过全局的清零和置位管脚输入,因为他们也属于全局的资源,其扇出能力大,而且在FPGA内部是直接连接到所有的触发器的置位和清零端的,这样的做法会使芯片的工作可靠、性能稳定,而使用普通的IO脚则不能保证该性能。在FPGA的设计中,除了从外部管脚引入的全局清除和置位信号外在FPGA内部逻辑的处理中也经常需要产生一些内部的清除或置位信号。清除和置位信号要求象对待时钟那样小心地考虑它们,因为这些信号对毛刺也是非常敏感的。在同步电路设计中,有时候可以用同步置位的办法来替代异步清0。在用硬件描述语言的设计中可以用如下的方式来描述:

异步复位:

always @ (posedge clk or negedge rst_n)

         if(!rst_n) b <= 1'b0;

         else b <= a;

同步复位:

always @ (posedge clk)

         if(!rst_n) b <= 1'b0;

         else b <= a;

二者的区别分析:


同步复位sync

异步复位async


特点

复位信号只有在时钟上升沿到来时才能有效。

无论时钟沿是否到来,只要复位信号有效,就进行复位。



Verilog描述

always@(posedge CLK)

always@(posedge CLK , negedge Rst_n)


优点

1)利于仿真器仿真。
2)因为只有在时钟有效电平到来时才有效,所以可以滤除高于时钟频率的毛刺。
3)可以使所设计的系统成为100%的同步时序电路,有利于时序分析。

1)设计相对简单。
2)因为大多数目标器件库的dff都有异步复位端口,因此采用异步复位可以节省资源。
3)异步复位信号识别方便,而且可以很方便的使用FPGA的全局复位端口GSR。







缺点

1) 复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务。同时还要考虑,诸如:clk skew,组合逻辑路径延时,复位延时等因素。
2) 由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,所以,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,这样就会耗费较多的逻辑资源。

1)复位信号容易受到毛刺的影响。
2)在复位信号释放(release)的时候容易出现问题。具体就是说:若复位释放刚好在时钟有效沿附近时,很容易使寄存器输出出现亚稳态,从而导致亚稳态。










总结

推荐使用异步复位,同步释放的方式,而且复位信号低电平有效。


三、关于触发器与锁存器

         触发器是在时钟的沿进行数据的锁存的,而锁存器是用电平使能来锁存数据的。所以触发器的Q输出端在每一个时钟沿都会被更新,而锁存器只能在使能电平有效期间才会被更新。在FPGA设计中建议如果不是必须那么应该尽量使用触发器而不是锁存器。一般的设计规则是:在绝大多数设计中避免产生锁存器。它会让您设计的时序完蛋,并且它的隐蔽性很强,非老手不能查出。锁存器最大的危害在于不能过滤毛刺,使能信号有效时,输出状态可能随输入多次变化,产生空翻。这对于下一级电路是极其危险的。所以,只要能用D触发器的地方,就不用锁存器。

关于锁存器:

         锁存器不同于触发器,锁存器在不锁存数据时,输出端的信号随输入信号变化,就像信号通过一个缓存器一样;一旦锁存信号起锁存作用,则数据被锁住,输入信号不起作用。因此锁存器也称为透明锁存器,值得是不锁存是输出对输入是透明的。


锁存器具备下列三个缺点:
(1)对毛刺敏感,不能异步复位,因此在上电后处于不确定的状态。
(2)锁存器会使静态时序分析变得非常复杂,不具备可重用性。

(3)在 PLD  芯片中,基本的单元是由查找表和触发器组成的,若生成锁存器反而需要更多的资源。根据锁存器的特点可以看出,在电路设计中,要对锁存器特别谨慎,如果设计经过综合后产生出和设计意图不一致的锁存器,则将导致设计错误,包括仿真和综合。因此,在设计中需要避免产生意想不到的锁存器。如果组合逻辑的语句完全不使用 always  语句块,就可以保证综合器不会综合出锁存器,
例如:
assign a = din ? x : y;
上述语句不需要保持信号 a  的前一个状态,因此肯定不会产生锁存器。在基于 always 的组合逻辑描述语句中容易综合出锁存器的地方:1:if 语句的使用中缺少 else 语句(前提是不是始终边沿触发);2:case 语句中没有给出全部的情况。

欢迎通信工程师和FPGA工程师关注公众号

FPGA微信技术群

欢迎大家加入全国FPGA微信技术群,这里有一群热爱技术的工程师,在这里可以一起交流讨论技术!

用手指按住就可以加入FPGA全国技术群哦

FPGA IP核服务:各类优质IP核服务商,服务到位,有保障!有需求的可以直接联系群主!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多