一、什么是锁存器?锁存器与触发器的区别
锁存器与触发器最大区别在于,锁存器是电平触发,而触发器是边沿触发。锁存器在不锁存数据时,输出随输入变化,但一旦数据锁存时,输入对输出不产生任何影响。
latch的危害:
1.输入状态可能多次变化,容易产生毛刺,增加了下一级电路的不确定性;
2.在大部分 FPGA 的资源中,可能需要比触发器更多的资源去实现 Latch 结构;
3.锁存器的出现使得静态时序分析变得更加复杂
在组合逻辑中,不完整的if-else结构,会产生latch。
避免此类latch的方法主要有两种,一种是补全if-else结构,或者对信号赋初值。
但是在时序逻辑中,不完整的if-else结构,不会产生latch,这是因为,q寄存器具有存储功能,且其值在时钟的边沿下才会改变。
case 语句产生 Latch 的原理几乎和 if 语句一致。在组合逻辑中,当 case 选项列表不全且没有加 default 关键字,或有多个赋值语句不完整时,也会产生 Latch。
消除此种 latch 的方法也是 2 种,将 case 选项列表补充完整,或对信号赋初值。
补充完整 case 选项列表时,可以罗列所有的选项结果,也可以用 default 关键字来代替其他选项结果。
总之,为避免 latch 的产生,在组合逻辑中,需要注意以下几点:
1)if-else 或 case 语句,结构一定要完整
2)不要将赋值信号放在赋值源头,或条件判断中
3)敏感信号列表建议多用 always@(*)