一直都知道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. input   [7:0]  a;
  5. input          rst_n;
  6. output  [7:0]  abmax;
  7. reg     [7:0]  abmax_tmp;
  8. always @ (a or rst_n) begin
  9. if (!rst_n)
  10. abmax_tmp = 8'h00;
  11. else
  12. if (a>abmax_tmp)
  13. abmax_tmp = a;
  14. end
  15. 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. reg      [7:0] dout;
  7. always @ (din) begin
  8. if (din>127)
  9. dout <= din;
  10. end
  11. 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。谢谢

latch的产生和消除的更多相关文章

  1. [转载】——故障排除:Shared Pool优化和Library Cache Latch冲突优化 (文档 ID 1523934.1)

    原文链接:https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrlstate=23w4l35u5_4&id=152393 ...

  2. 关于Latch争用

    Latch是什么     Latch是SQL Server引擎保证内存中的结构的一致性的轻量同步机制.比如索引,数据页和内部结构(比如非叶级索引页).SQL Server使用Buffer Latch保 ...

  3. latch:cache buffers chains的优化思路

    数据块在buffer cache存放是以linked list方式存放的.当一个session想要访问/修改buffer cache的block,首先需要通过hash算法检查该block是否存在于bu ...

  4. 关于Latch

    Latch是什么 Latch是SQL Server引擎保证内存中的结构的一致性的轻量同步机制.比如索引,数据页和内部结构(比如非叶级索引页).SQL Server使用Buffer Latch保护缓冲池 ...

  5. 【每日一摩斯】-Shared Pool优化和Library Cache Latch冲突优化 (1523934.1)-系列3

    减轻Shared Pool负载 Parse一次并执行多次        在OLTP类型的应用中,最好的方法是只让一个语句被解析一次,然后保持这个cursor的打开状态,在需要的时候重复执行它.这样做的 ...

  6. 【转载】FPGA 中的latch 锁存器

    以下这篇文章讲述了锁存器的一些概念和注意事项.原文标题及链接: FPGA 中的latch 锁存器 - 快乐至永远上的博客 - 与非博客 - 与网 http://www.eefocus.com/liuy ...

  7. Latch free等待事件

    Latch free等待事件的三个参数:p1-latch的地址:p2-latch编号:p3-请求次数.从oracle10g起,latchfree不再包含所有的latch等待,有些latch等待可能表现 ...

  8. 生产上数据库大量的latch free 导致的CPU资源耗尽的问题的解决

    中午的时候,我们生产上的某个数据库,cpu一直居高不下 通过例如以下的sql语句,我们查看当时数据库的等待,争用的情况: select s.SID, s.SERIAL#, 'kill -9 ' || ...

  9. PMON failed to acquire latch, see PMON dump

    前几天,一台Oracle数据库(Oracle Database 10g Release 10.2.0.4.0 - 64bit Production)监控出现"PMON failed to a ...

随机推荐

  1. python的垃圾回收机制 继承的顺序C3算法

    Python垃圾回收    -- 引用计数        -- Python为每个对象维护一个引用计数        -- 当引用计数为0的 代表这个对象为垃圾    -- 标记清除        - ...

  2. 在Linux系统下使用Github的基本教程

    1. 安装git: sudo apt-get install git-core git-gui git-doc 2.到https://github.com/ 注册一个帐号,一会儿客户端登录的时候要使用 ...

  3. Linux系统故障-Repair filesystem

    fsck /dev/hddn (代表根目录所在的区) fsck -A -y 重启系统可以进去了:- ) fsck命令的主要选项如下: -A 检查所有列在etc/fstab文件中的文件系统.带有这个选项 ...

  4. [Bzoj]5343: [Ctsc2018]混合果汁

    5343: [Ctsc2018]混合果汁 题目描述 小 R 热衷于做黑暗料理,尤其是混合果汁. 商店里有 \(n\) 种果汁,编号为 \(0,1,\cdots,n-1\) .\(i\) 号果汁的美味度 ...

  5. spring整合redis配置

    第一步:添加需要的jar包 <!-- redis --> <dependency> <groupId>redis.clients</groupId> & ...

  6. DevExpress的GridControl选择一行,不显示单元格焦点的设置

    grid控件默认选择一行时,focused的cell并不是蓝色的,而是白色的 要想实现一次选择一行全都是蓝色的只要改一个属性就可以了 this.gridView1.OptionsSelection.E ...

  7. Reverse Nodes In K Group,将链表每k个元素为一组进行反转---特例Swap Nodes in Pairs,成对儿反转

    问题描述:1->2->3->4,假设k=2进行反转,得到2->1->4->3:k=3进行反转,得到3->2->1->4 算法思想:基本操作就是链表 ...

  8. C语言中链接影响程序的细节

    参考:<深入理解计算机系统>  7.61节  链接器如何解析多重定义的全局符号 基本的原则是这样的:对于所有的全局符号,函数和已初始化的全局变量是强符号,未初始化的全局变量是弱符号. Un ...

  9. CSS3 网格布局(grid-layout)基础知识 - 网格模板属性(grid-template)使用说明

    CSS3引入了新的网格布局(grid layout),以适应显示和设计技术的发展(尤其是移动设备优先的响应式设计). 主要目标是建立一个稳定可预料且语义正确的网页布局模式,用来替代过往表现不稳定且繁琐 ...

  10. flask学习(一):环境的安装

    一. 安装python2.7 从python官网下载python2.7的版本 双击python2.7,然后选择安装路径,一直下一步就可以了 设置环境变量,把python和pip的安装路径添加到PATH ...