鎖存器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極客空間 微信公眾號
閱讀更多 卿萃科技FPGA 的文章