fpga和verilog设计中的latch锁存器的问题

上传人:今*** 文档编号:105684135 上传时间:2019-10-13 格式:DOC 页数:75 大小:1.39MB
返回 下载 相关 举报
fpga和verilog设计中的latch锁存器的问题_第1页
第1页 / 共75页
fpga和verilog设计中的latch锁存器的问题_第2页
第2页 / 共75页
fpga和verilog设计中的latch锁存器的问题_第3页
第3页 / 共75页
fpga和verilog设计中的latch锁存器的问题_第4页
第4页 / 共75页
fpga和verilog设计中的latch锁存器的问题_第5页
第5页 / 共75页
点击查看更多>>
资源描述

《fpga和verilog设计中的latch锁存器的问题》由会员分享,可在线阅读,更多相关《fpga和verilog设计中的latch锁存器的问题(75页珍藏版)》请在金锄头文库上搜索。

1、FPGA和Verilog设计中的latch锁存器的问题一直都知道fpga中有latch这么一回事,但是一直都不太清楚到底什么是锁存器,它是怎么产生的,它到底和寄存器有多少区别,它怎么消除。为什么说他不好? 一,是什么 锁存器是一种在异步时序电路系统中,对输入信号电平敏感的单元,用来存储信息。一个锁存器可以存储1bit的信息,通常,锁存器会多个一起出现,如4位锁存器,8位锁存器。 锁存器在数据未锁存时,输出端的信号随输入信号变化,就像信号通过一个缓冲器,一旦锁存信号有效,则数据被锁存,输入信号不起作用。因此,锁存器也被称为透明锁存器,指的是不锁存时输出对于输入是透明的。 二 锁存器与寄存器的区别

2、: 两者都是基本存储单元,单锁存器是电平触发的存储器,触发器是边沿触发的存储器。本质是,两者的基本功能是一样的,都可以存储数据。意思是说一个是组合逻辑的,一个是在时序电路中用的,时钟出发的。 三,锁存器的危害: 对毛刺敏感,不能异步复位,所以上电以后处于不确定的状态; Latch会使静态时序分析变得非常复杂; 在PLD芯片中,基本的单元是由查找表和触发器组成的,若生成锁存器反而需要更多的资源。 第三条也是最基本的原因。 四,产生的原因 *ps重重之重 上面说了那没多只是觉得网上的没把锁存器说明白。下面的才是重点。 1,case 2,if-else if 3,always(敏感信号表) 五 解决

3、 1.case加default: 关于defalut的情况:一是可以default:data=1bx;这个x表示未知,在综合时可以避免产生锁存器。在仿真时是红线表示。 二是 default:data=0;这样产生一个默认的情况。 2.if-一定要有else语句。 3.always-如是说道:在赋值表达式右边参与赋值的信号都必须在always(敏感电平列表)中列出。如果在赋值表达式右端引用了敏感电平列表中没有列出的信号,那么在综合时,将会为该没有列出的信号隐含地产生一个透明锁存器。 4. 付初值。好用的 六,怎么看到锁存器。 其实我挺讨厌网上说了好多的废话,到最后我都不知道是啥。所以我建议大家自

4、己编成,在看看综合后的RTL图,以及技术RTL图,看看到底有什么不同,到底锁存器长啥样,漂亮不漂亮,嘿嘿。以下是我的截图。供参考:这个是我在case语句中加入了default语句的综合结果。以上两个图是没有加入的情况,可以看出明显不同。在上面的图中有由组合电路产生的与门,提供了电平触发锁存器。同时在技术RTL中多了一个LUT查找表,是为了锁存器提供使能的,当使能输出为1时锁存,使能为0时,输出正常。 不好意思代码我就不贴了。嘿嘿。ps:关键是我忘了是啥了,我就是一坑货呀。其实挺简单地就是啊,a,b为输入,y输出。由a和b组成case(a,b)决定状态。 七,我们讨论一下到底锁存器是不是就是没用

5、的1. Latch的本质Latch作为一种电路单元,必然有其存在的理由及应用场景,在实际应用中,有些设计不可避免的要使用Latch,特别是总线应用上,例如,地址锁存器,数据锁存器,复位信号锁存器等。但是在更多的情况下,很容易产生未预料到的锁存器,使逻辑功能不满足要求,浪费大量时间。比较好的应用规则是:要学会分析是否需要Latch以及代码是否会产生意外的Latch。通过Verilog HDL实现序列最大值搜索程序,并保持检测到的最大值plainview plaincopy1. moduletwo_max(2. a,rst_n,abmax3. );4. 5. input7:0a;6. inputr

6、st_n;7. output7:0abmax;8. 9. reg7:0abmax_tmp;10. 11. always(aorrst_n)begin12. if(!rst_n)13. abmax_tmp=8h00;14. else15. if(aabmax_tmp)16. abmax_tmp=a;17. end18. endmodule上述代码在ISE中的综合结果会给出设计中包含Latch的警告。但实际上,abmax_tmp锁存器正是我们需要的,所以,虽然有警告,但是代码设计是没有问题的。将上述代码的if语句补全:plainview plaincopy1. if(aabmax_tmp)2. a

7、bmax_tmp=a;3. else4. abmax_tmp=abmax_tmp;经过综合后,仍然有Latch的警告。无论Latch是否是用户需要的,ISE都会给出警告,主要原因就是Latch对整个设计的时序性能影响较大。所以,在设计中要尽量避免Latch,但是确实需要使用的情况,也可以使用。2. “不期望”latch指的是与设计意图不符,产生的Latch。主要问题在于设计人员没有合理使用Verilog HDL语言,常见的原因是对条件语句(if、casse)的分支描述不完整。典型例子:用Verilog HDL实现一个锁存器,当输入数据大于127时,将输入数据输出,否则输出0plainview

8、plaincopy1. modulelatch_demo(2. din,dout3. );4. input7:0din;5. output7:0dout;6. 7. reg7:0dout;8. 9. always(din)begin10. if(din127)11. dout127)2. dout=din;3. else4. dout=0;在ISE中综合后的结果中,可以看到补全if-else后,在比较器后面级联了与门,代替原来的锁存器,仿真结果也正确。至此,可以得到一个结论:Latch作为一种基本电路单元,会影响到电路的时序性能,应该尽量避免使用,但出现Latch造成设计与意图不符的情况,是由

9、于设计人员代码不正确造成的。整理一下-觉得还不错-其实latch就是在生成rtl图的时候,意想不到的寄存器,比如说if else或者case语句没有赋值完整,这样会有别的分支存在的时候,会导致一些寄存器会保留前一时刻的值,所以会多出一些寄存器。例如always(posedge clk)begincase(in_s)2b11: out=2b11;2b10: out=2b10;endcase假如没有default语句的话,当为00或者01 的时候out就会保留前一个时钟的值,也就是hold住,所以rtl图的时候会多出来两个寄存器,专门对应11和10时候的寄存器。如果变量没有在IF语句的每个分支中进

10、行赋值,将会产生latch。比如:always (*)beginif(condition)b=a;end这是一个基本的Latch。如果IF的条件中用到算术操作,如下面的例子reg condition131:0;always (*)beginif(& condition1)b=a;end则当condition1的多个位同时变化时,可能& condition1的值在发生变化时会产生一个瞬间的不稳定过程,所以尽量不要使用算术操作作为条件。在一个好的设计中,condition应该是触发器的输出。如果一个变量在同一个IF条件分支中先赎值然后读取,则不会产生latch,如下面的例子:reg condition;reg a;always (*)begin:no_latchif(condition) begina=c1;b=a;endelseb=c2;end上面显然不会产生latch,因为a只是一个中间变量,a的值不必记录下来。如果先读取,后赎值,则会产生latch,如下面的例子:reg a;always (*)begin:has_latchif(condition)beginb=a;a=c1;endelseb=c2;end上面会产生latch,因为a的值必

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号