锁存器latch,在数字电路中经常遇到,它和触发器FF有着本质的区别。
这里为读者介绍FPGA中避免锁存器的方法。
-
在组合逻辑进程中,if语句一定要有else。并且所有的信号都要在if的所有分支中被赋值。
always @( * )
begin
if ( sig_a == 1‘b1 )
sig_b = sig_c;
end
这个是绝对会产生latch的。
这种情况要想避免锁存器的出现,应当为if语句增加else语句。
-
下面也会产生latch。也就是说在组合逻辑进程中不能出现自己赋值给自己或者间接出现自己赋值给自己的情况。
always @( * )
begin
if ( rst == 1‘b1 )
counter = 32’h00000000;
else
counter = counter + 1;
end
但如果是时序逻辑进程,则不存在该问题。
-
case语句的default一定不能少!
原因和if语句相同,这里不再多说了。
需要提醒的是,在时序逻辑进程中,default语句也一定要加上,这是一个很好的习惯。
-
组合逻辑进程敏感变量不能少也不能多。
verilog2001语法中可以直接用 * 。latch有弊就一定有利。在FPGA的LE中,总存在一个latch和一个D触发器,在支持DDR的IOE(IOB)中也存在着一个latch来实现DDIO。在我们平时的设计中,对latch还是要尽可能的敬而远之。
版权所有权归卿萃科技 杭州FPGA事业部,转载请注明出处
作者:杭州卿萃科技ALIFPGA
原文地址:杭州卿萃科技FPGA极客空间 微信公众号
扫描二维码关注杭州卿萃科技FPGA极客空间