查看: 1780|回复: 0

[讨论] Verilog基本功--flipflop和latch以及register的区别

[复制链接]
  • TA的每日心情

    2018-8-2 13:58
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2019-8-27 09:40:37 | 显示全部楼层 |阅读模式
    分享到:
    触发器:flipflop

    锁存器:latch

    寄存器:register

         锁存器是电平触发的存储单元,数据存储的动作取决于输入时钟(或者使能)信号的电平值,尽当锁存器处于使能状态时输出才会随着数据输入发生变化。

         触发器是边沿敏感的存储单元,数据存储的动作有某一信号的上升或者下降沿进行同步的。
         寄存器用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。其实寄存器就是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路。寄存器的存储电路是由锁存器或触发器构成的,因为一个锁存器或触发器能存储1位二进制数,所以由N个锁存器或触发器可以构成N位寄存器。 触发器是在时钟的沿进行数据的锁存的,而锁存器是用电平使能来锁存数据的。所以触发器的Q输出端在每一个时钟沿都会被更新,而锁存器只能在使能电平有效器件才会被更新。 有一些教科书里的触发器实际是锁存器。在FPGA设计中建议如果不是必须那么应该尽量使用触发器而不是锁存器。

    钟控D触发器其实就是D锁存器,边沿D触发器才是真正的D触发器,钟控D触发器在使能情况下输出随输入变化,边沿触发器只有在边沿跳变的情况下输出才变化。

    1、D 触发器和D 锁存器的区别。

         两个锁存器可以构成一个触发器,归根到底还是dff是边沿触发的,而latch是电平触发的。锁存器的输出对输入透明的,输入是什么,输出就是什么,这就是锁存器不稳定的原因,而触发器是由两个锁存器构成的一个主从触发器,输出对输入是不透明的,必须在时钟的上升/下降沿才会将输入体现到输出,所以能够消除输入的毛刺信号。

    2、latch和filp-flop的异同

          都是时序逻辑,但latch受所有的输入信号控制,只要输入信号变化,latch就变化。也正因为如此,latch很容易出毛刺。flip-flop是触发器,只有在被时钟触发时才采样当前的输入,产生输出。如果使用门电路来搭建latch和ff,则latch消耗的门资源比ff要少。但是你用的如果是 fpga,那么内部一般带DFF单元,反而用触发器更好。

    3、latch与register的区别,

          为什么现在多用register.行为级描述中latch如何产生的行为级描述中latch一般是由于IF货case逻辑表述不完全产生的。

    异同:

    1、 latch由电平触发,非同步控制。在使能信号有效时latch相当于通路,在使能信号无效时latch保持输出状态。DFF由时钟沿触发,同步控制。

    2、 latch容易产生毛刺(glitch),DFF则不易产生毛刺。

    3、 如果使用门电路来搭建latch和DFF,则latch消耗的门资源比DFF要少,这是latch比DFF优越的地方。所以,在ASIC中使用 latch的集成度比DFF高,但在FPGA中正好相反,因为FPGA中没有标准的latch单元,但有DFF单元,一个LATCH需要多个LE才能实现。

    4、 latch将静态时序分析变得极为复杂。

    一般的设计规则是:在绝大多数设计中避免产生latch。它会让您设计的时序完蛋,并且它的隐蔽性很强,非老手不能查出。latch最大的危害在于不能过滤毛刺。这对于下一级电路是极其危险的。所以,只要能用D触发器的地方,就不用latch。有些地方没有时钟,也只能用latch了。比如现在用一个clk接到latch的使能端(假设是高电平使能),这样需要的setup时间,就是数据在时钟的下降沿之前需要的时间,但是如果是一个DFF,那么setup时间就是在时钟的上升沿需要的时间。这就说明如果数据晚于控制信号的情况下,只能用 latch,这种情况就是,前面所提到的latch timing borrow。基本上相当于借了一个高电平时间。也就是说,latch借的时间也是有限的。

    关 于latch的讨论 latch和flip-flop都是时序逻辑,区别为:latch同其所有的输入信号相关,当输入信号变化时latch就变化,没有时钟端;flip- flop受时钟控制,只有在时钟触发时才采样当前的输入,产生输出。当然因为二者都是时序逻辑,所以输出不但同当前的输入相关还同上一时间的输出相关。
    1、没有时钟端,不受系统同步时钟的控制,无法实现同步操作;

    2、对输入电平敏感,受布线延迟影响较大,很难保证输出没有毛刺产生;
    在 xilinx和altera器件的slice和LE中都能够同时支持生产d-latch和d-ff,在这一层面上二者有什么区别暂时没有想到。如果使用门电路来搭建latch和ff,则latch消耗的门资源比ff要少,这是latch比ff优越的地方。 latch的最大缺点就是没有时钟端,和当前我们尽可能采用时序电路的设计思路不符。 latch是电平触发,相当于有一个使能端,且在激活之后(在使能电平的时候)相当于导线了,随输出而变化,在非使能状态下是保持原来的信号,这就可以看出和flip-flop的差别,其实很多时候latch是不能代替ff的

    1.latch对毛刺敏感
    2.在ASIC中使用latch的集成度比DFF高,但在FPGA中正好相反,因为FPGA中没有标准的latch单元,但有DFF单元,一个LATCH需要多个LE才能实现
    3.latch将静态时序分析变得极为复杂
    4. 目前latch只在极高端电的路中使用,如intel 的P4等CPU。 FPGA中有latch单元,寄存器单元就可以配置成latch单元,在xilinx v2p的手册将该单元成为register/latch单元,附件是xilinx半个slice的结构图。其它型号和厂家的FPGA没有去查证。——个人认为xilinx是能直接配的而altera或许比较麻烦,要几个LE才行,然而也非xilinx的器件每个slice都可以这样配置altera的只有DDR接口中有专门的latch单元,一般也只有高速电路中会采用latch的设计。altera的LE是没有latch的结构的又查了sp3和sp2e,别的不查了,手册上说支持这种配置。有关altera的表述wangdian说的对,altera的ff不能配置成latch,它使用查找表来实现latch,

          一般的设计规则是:在绝大多数设计中避免产生LATCH.它会让您设计的时序完蛋,并且它的隐蔽性很强,非老手不能查出.latch最大的危害在于不能过滤毛刺。这对于下一级电路是极其危险的。所以,只要能用D触发器的地方,就不用latch。有些地方没有时钟,也只能用latch了。

          对latch进行STA的分析其实也是可以,但是要对工具相当熟悉才行.不过很容易出错.当前PrimeTime,是支持进行latch分析的.现在一些综合工具内置的STA分析功能也支持比如RTL compiler, Design Compiler. 除了ASIC里可以节省资源以外。我感觉latch这个东西在同步设计里出现的可能还是挺小的吧,现在处理过程中大都放在ff里打一下,影响不太大吧

    标签: 无标签latch与DFF的区别收集了一下网上资源,总结如下:

    1、latch由电平触发,非同步控制。在使能信号有效时latch相当于通路,在使能信号无效时latch保持输出状态。DFF由时钟沿触发,同步控制。

    2、latch容易产生毛刺(glitch),DFF则不易产生毛刺。

    3、如果使用门电路来搭建latch和DFF,则latch消耗的门资源比DFF要少,这是latch比DFF优越的地方。所以,在ASIC中使用latch的集成度比DFF高,但在FPGA中正好相反,因为FPGA中没有标准的latch单元,但有DFF单元,一个LATCH需要多个LE才能实现。

    4、latch将静态时序分析变得极为复杂。一般的设计规则是:在绝大多数设计中避免产生latch。它会让您设计的时序完蛋,并且它的隐蔽性很强,非老手不能查出。latch最大的危害在于不能过滤毛刺。这对于下一级电路是极其危险的。所以,只要能用D触发器的地方,就不用latch。有些地方没有时钟,也只能用latch了。比如现在用一个clk接到latch的使能端(假设是高电平使能),这样需要的setup时间,就是数据在时钟的下降沿之前需要的时间,但是如果是一个DFF,那么setup时间就是在时钟的上升沿需要的时间。这就说明如果数据晚于控制信号的情况下,只能用 latch,这种情况就是,前面所提到的latch timing borrow。基本上相当于借了一个高电平时间。也就是说,latch借的时间也是有限的。在if语句和case不全很容易产生latch,需要注意。VIA题目这两个代码哪个综合更容易产生latch:

    代码1
    always@(enable or ina or inb)
    begin
      if(enable) begin
        data_out = ina;
      end
      else begin
       data_out = inb;
      end
    end
    代码2
    input[3:0] data_in;
    always@(data_in)
    begin
    case(data_in)
      0 : out1 = 1'b1;
      1,3 : out2 = 1'b1;
      2,4,5,6,7 : out3 = 1'b1;
      default: out4 = 1'b1;
    endcase
    end
    答案是代码2在综合时更容易产生latch。



    使用条件语句不当在设计中生成了原本没有想到的锁存器:、

    例1:在一个always语句中不正确使用if语句

    Always @ (al or d)                            always @ (al or d)

    begin                                              begin

      if(al)  q<= d;                                    if(al) q <= d;

    end                                                   else q <= 0;

                                                          end

           在这个always块中,if语句只保证了当al=1时q才取d的值。这段程序并没有给出当al=0时q的取值,那么当al=0时q取何值?在always块中在给定的条件下变量没有被赋值,那么变量将保持原值,也就是说将会生成一个锁存器。     

    如果当设计人员希望当al=0时,q的值为0,则else项就必不可少了。请注意看右边的always块,整个verilog程序模块综合出来后,always块对应的部分不会生成锁存器。

    Verilog HDL程序的另一种偶然生成锁存器是在使用case语句时缺少default项的情况下发生的。

    Case语句的功能是:在某个信号取不同的值时,给另一个信号赋不同的值。如下,如果sel=00,q取a值,而sel=11,q取b值。这个例子不清楚的是:如果sel取00和11以外的值时q将赋予什么值?在这个例子中,默认q保持原值,这就会自动生成锁存器。

    always @ (sel[1:0] or a or b)       always @ (sel[1:0] or a or b)

    case(sel[1:0])                             case(sel[1:0])

    2’b00:  q <= a;                            2’b00:  q <= a;

    2’b11:  q <= b;                            2’b11:  q <= b;

    endcase                                     default: q <= ‘b0;      

                                                    endcase

    有锁存器                                  无锁存器

          避免生成锁存器的方法:如果用到if语句,最好写上sles项;如果用case语句,最好写上default项。遵循上面两条原则,就可以避免发生这种错误,使设计者更加明确设计目标,同时也增强了verilog程序的可读性。
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-26 14:28 , Processed in 0.121506 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.