• latch的产生和消除


      一直都知道fpga中有latch这么一回事,但是一直都不太清楚到底什么是锁存器,它是怎么产生的,它到底和寄存器有多少区别,它怎么消除。为什么说他不好?

                   一,是什么

                       锁存器是一种在异步时序电路系统中,对输入信号电平敏感的单元,用来存储信息。一个锁存器可以存储1bit的信息通常,锁存器会多个一起出现,如4位锁存器,8位锁存器。

                   锁存器在数据未锁存时,输出端的信号随输入信号变化,就像信号通过一个缓冲器,一旦锁存信号有效,则数据被锁存,输入信号不起作用。因此,锁存器也被称为透明锁存器,指的是不锁存时输出对于输入是透明的。

           二   锁存器与寄存器的区别:

                          两者都是基本存储单元,单锁存器是电平触发的存储器,触发器是边沿触发的存储器。本质是,两者的基本功能是一样的,都可以存储数据。意思是说一个是组合逻辑的,一个是在时序电路中用的,时钟出发的。

          三,锁存器的危害:          

             对毛刺敏感,不能异步复位,所以上电以后处于不确定的状态;

            Latch会使静态时序分析变得非常复杂;

            在PLD芯片中,基本的单元是由查找表和触发器组成的,若生成锁存器反而需要更多的资源。

            第三条也是最基本的原因。

          四,产生的原因  ********ps重重之重

                 上面说了那没多只是觉得网上的没把锁存器说明白。下面的才是重点。

                1,case

                 2,if-------else if

                 3,always@(敏感信号表

              五 解决

                  1.case——————加default:

                                          关于defalut的情况:一是可以 default:data=1‘bx;这个x表示未知,在综合时可以避免产生锁存器。在仿真时是红线表示。

                                                                              二是   default:data=0;这样产生一个默认的情况。

                   2.if-----------------------一定要有else语句。

                   3.always---------如是说道:在赋值表达式右边参与赋值的信号都必须在always@(敏感电平列表)中列出。

    如果在赋值表达式右端引用了敏感电平列表中没有列出的信号,那么在综合时,将会为该没有列出的信号隐含地产生一个透明锁存器。

                4. 付初值。好用的

             六,怎么看到锁存器。

                    其实我挺讨厌网上说了好多的废话,到最后我都不知道是啥。所以我建议大家自己编成,在看看综合后的RTL图,以及技术RTL图,看看到底有什么不同,到底锁存器长啥样,漂亮不漂亮,嘿嘿。以下是我的截图。供参考:

    这个是我在case语句中加入了default语句的综合结果。

    以上两个图是没有加入的情况,可以看出明显不同。在上面的图中有由组合电路产生的与门,提供了电平触发锁存器。同时在技术RTL中多了一个LUT查找表,是为了锁存器提供使能的,当使能输出为1时锁存,使能为0时,输出正常。

        不好意思代码我就不贴了。嘿嘿。ps:关键是我忘了是啥了,我就是一坑货呀。

    其实挺简单地就是啊,a,b为输入,y输出。由a和b组成case({a,b})决定状态。

             七,我们讨论一下到底锁存器是不是就是没用的

     

    1. Latch的本质

     

    Latch作为一种电路单元,必然有其存在的理由及应用场景,在实际应用中,有些设计不可避免的要使用Latch,特别是总线应用上,例如,地址锁存器,数据锁存器,复位信号锁存器等。但是在更多的情况下,很容易产生未预料到的锁存器,使逻辑功能不满足要求,浪费大量时间。比较好的应用规则是:要学会分析是否需要Latch以及代码是否会产生意外的Latch。

    通过Verilog HDL实现序列最大值搜索程序,并保持检测到的最大值

    [plain] view plaincopy
     
    1. module two_max(  
    2.         a,rst_n,abmax  
    3.     );  
    4.   
    5.         input   [7:0]  a;  
    6.         input          rst_n;  
    7.         output  [7:0]  abmax;  
    8.   
    9.         reg     [7:0]  abmax_tmp;  
    10.   
    11.        always @ (a or rst_n) begin  
    12.                if (!rst_n)  
    13.                    abmax_tmp = 8'h00;  
    14.                else  
    15.                   if (a>abmax_tmp)  
    16.                       abmax_tmp = a;  
    17.        end  
    18. endmodule  

    上述代码在ISE中的综合结果会给出设计中包含Latch的警告。但实际上,abmax_tmp锁存器正是我们需要的,所以,虽然有警告,但是代码设计是没有问题的。将上述代码的if语句补全:

    [plain] view plaincopy
     
    1. if (a > abmax_tmp)  
    2.     abmax_tmp = a;  
    3. else  
    4.     abmax_tmp = abmax_tmp;  

    经过综合后,仍然有Latch的警告。无论Latch是否是用户需要的,ISE都会给出警告,主要原因就是Latch对整个设计的时序性能影响较大。所以,在设计中要尽量避免Latch,但是确实需要使用的情况,也可以使用。

     

    2. “不期望”latch

     

    指的是与设计意图不符,产生的Latch。主要问题在于设计人员没有合理使用Verilog HDL语言,常见的原因是对条件语句(if、casse)的分支描述不完整。典型例子:用Verilog HDL实现一个锁存器,当输入数据大于127时,将输入数据输出,否则输出0

    [plain] view plaincopy
     
    1. module latch_demo(  
    2.         din,dout  
    3.     );  
    4.     input   [7:0] din;  
    5.     output [7:0] dout;  
    6.   
    7.     reg      [7:0] dout;  
    8.   
    9. always @ (din) begin  
    10.      if (din>127)  
    11.           dout <= din;  
    12. end  
    13.   
    14. endmodule  

    综合后的结果,在比较器后面级联了锁存器,这是因为if语句缺少else分支造成的。查看仿真结果,当输入小于127时,输出保持了上次的127,不是0,没有达到设计要求。修改方法很简单,就是讲if-else补全。

    [plain] view plaincopy
     
    1. if (din > 127 )  
    2.     dout = din;  
    3. else  
    4.     dout = 0;  

    在ISE中综合后的结果中,可以看到补全if-else后,在比较器后面级联了与门,代替原来的锁存器,仿真结果也正确。

     

     

    至此,可以得到一个结论:Latch作为一种基本电路单元,会影响到电路的时序性能,应该尽量避免使用,但出现Latch造成设计与意图不符的情况,是由于设计人员代码不正确造成的。

    嘿嘿本文参考了http://blog.csdn.net/guqian110/article/details/10189301。谢谢

  • 相关阅读:
    细菌 状态压缩
    素数
    骑士问题(knight)
    魔法石的诱惑
    平面上的最接近点对
    救援行动(save)
    优先队列
    leetcode 92. 反转链表 II
    leetcode 91. 解码方法
    leetcode 39. 组合总和
  • 原文地址:https://www.cnblogs.com/lianjiehere/p/3788334.html
Copyright © 2020-2023  润新知