参考来源:
- https://blog.csdn.net/llxxyy507/article/details/82811992
- https://blog.csdn.net/tianyake_1/article/details/79031582
- https://blog.csdn.net/perfect_lun/article/details/51818886
- https://zhuanlan.zhihu.com/p/34408492?from_voters_page=true
- https://www.cnblogs.com/chengqi521/p/6721250.html
- https://m.newsmth.net/article/METech/44491
Latch的四种写法及为何要避免其产生,以及Latch与DFF的区别?
1. Latch写法
法一:if_else不完整,缺else分支;
法二:case语句不完整;
注意:if_esle_,case语句完整仍会产生Latch的原因
代码1:
代码2:
原因:
- 未在所有的情况下给每个信号变量赋值;
解决办法:
在所有的情况下给每个信号变量都赋值,或者在case或者if前给每个变量赋初值;
法三:组合逻辑中自己自己赋值;
法四:always块的敏感列表未列全;
2. 为何要避免Latch的产生
之所以在硬件设计中避免latch的出现,主要原因是latch会产生毛刺(glitch),这种毛刺对下一级电路是很危险的。并且其隐蔽性很强,不易查出。因此,在设计中,应尽量避免latch的使用。
==latch 就是因为电平触发,所以很容易产生glitch,如果后面接了边沿触发的东西,可能会出问题。==如果确认这些glitch没有负作用,当然可以用latch,毕竟要小接近一半的面积和Flip flop相比。
总结:
- 对毛刺敏感,可能会将毛刺锁存住,以致影响下一级电路。
- 无法做静态时序分析;
- FPGA上:浪费资源,latch比DFF大(ASIC上:Latch是DFF面积的一半)。
3. Latch与DFF的区别
锁存器与触发器最大的区别在于,锁存器是电平触发,而触发器是边沿触发。锁存器在不锁存数据时,输出随输入变化;但一旦数据锁存时,输入对输出不产生任何影响。
register在同一时钟边沿触发下工作,符合同步电路的设计思想,而latch则属于异步电路设计,往往导致时序分析困难,不适当的应用latch则会大量浪费芯片资源。