在很多地方都能看到,verilog中if與case語句必須完整,即if要加上else,case后要加上default語句,以防止鎖存器的發生,接下來就來說說其中原因。
一,什么是鎖存器?鎖存器與觸發器的區別。
鎖存器與觸發器最大的區別在於,鎖存器是電平觸發,而觸發器是邊沿觸發。鎖存器在不鎖存數據時,輸出隨輸入變化;但一旦數據鎖存時,輸入對輸出不產生任何影響。
二,為什么語句的不完整會導致鎖存器的產生?
語句不完整即有某些情況的輸入對輸出無任何影響,根據鎖存器的特征,反映到硬件電路即會產生鎖存器。
舉例說明:
圖一
圖二
這是一段簡單的組合邏輯代碼。圖一是缺少default的case語句,圖二是完整的case語句。
圖一綜合后的的RTL級電路為
即產生了鎖存器,而且ISE也會給出警告:
而圖二完整的case語句綜合后的RTL級電路為:
產生的是普通的門電路,且警告消失。
三,為什么要避免產生鎖存器?
關於這個問題,我在網上看到很多資料說是因為鎖存器對毛刺敏感。但其實不是這個原因,因為在組合電路中,即便語句完整了,也會對毛刺敏感。而如果你加一個時鍾變為時序電路的話,即便你的語句不完整,產生了鎖存器(其實在時序電路中,即便語句不完整,也不會產生鎖存器),那么也不會對毛刺敏感。
真正的原因在於FPGA中根本沒有鎖存器這種東西,也就是說,如果你產生了鎖存器的話,將耗費更多的資源來構成它。
轉載自:https://zhidao.baidu.com/question/2053479616852574707.html