至芯陈老师 发表于 2020-4-29 18:08:34

关于锁存器,应该要知道

锁存器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还是要尽可能的敬而远之。
————————————————
版权声明:本文为CSDN博主「ALIFPGA」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/woshifennu1234/article/details/81805163

aokema124 发表于 2020-4-29 18:28:23

907321 发表于 2020-4-30 07:51:16

半对金筷子 发表于 2020-4-30 23:39:16

已阅

frode 发表于 2020-5-1 08:41:13

页: [1]
查看完整版本: 关于锁存器,应该要知道