一、是什么
鎖存器是一種在異步時序電路系統中,對輸入信號電平敏感的單元,用來存儲信息。一個鎖存器可以存儲1bit的信息,通常,鎖存器會多個一起出現,如4位鎖存器,8位鎖存器。
鎖存器在數據未鎖存時,輸出端的信號隨輸入信號變化,就像信號通過一個緩沖器,一旦鎖存信號有效,則數據被鎖存,輸入信號不起作用。因此,鎖存器也被稱為透明鎖存器,指的是不鎖存時輸出對於輸入是透明的。
二、鎖存器與寄存器的區別:
兩者都是基本存儲單元,單鎖存器是電平觸發的存儲器,觸發器是邊沿觸發的存儲器。本質是,兩者的基本功能是一樣的,都可以存儲數據。意思是說一個是組合邏輯的,一個是在時序電路中用的,時鍾觸發的。
三、鎖存器的危害:
- 對毛刺敏感,不能異步復位,所以上電以后處於不確定的狀態;
- Latch會使靜態時序分析變得非常復雜;
- 在PLD芯片中,基本的單元是由查找表和觸發器組成的,若生成鎖存器反而需要更多的資源。
第三條也是最基本的原因。
四、產生的原因
上面說了那沒多只是覺得網上的沒把鎖存器說明白。下面的才是重點。
在時序邏輯中,不完整的 if…else… 結構並不會生成鎖存器,而組合邏輯中不完整的 if…else… 結構就會生成鎖存器。
1,case
2,if-------else if
3,always@(敏感信號表)
五、解決
1.case——————加default:
關於defalut的情況:一是可以 default:data=1‘bx;這個x表示未知,在綜合時可以避免產生鎖存器。在仿真時是紅線表示。 二是 default:data=0;這樣產生一個默認的情況。
2.if——————一定要有else語句。
3.always————如是說道:在賦值表達式右邊參與賦值的信號都必須在always@(敏感電平列表)中列出。
如果在賦值表達式右端引用了敏感電平列表中沒有列出的信號,那么在綜合時,將會為該沒有列出的信號隱含地產生一個透明鎖存器。
4. 賦初值。
六、怎么看到鎖存器


當然,ISE會對鎖存提出警告。
一位網友指出:FPGA是一種基於查找表形式工作的,而鎖存器相當於存在一個沒有直接說明的狀態,保持之前的值造成了鎖存。
七、只要語句完整就不會有鎖存器嗎
在很多情況下,我們希望某個值保值其原有值,既不一定是0,也不一定是1,只需要保持。比如下面代碼:
always @ (a or data_in) if(a) data_out=data_in; else data_out=data_out;
這個時候if/else文件是完整,但是依然產生了鎖存器,因為我們這個電路所描述的功能就是一個鎖存器。其實語句不完整和else data_out=data_out;是一樣的。在這里,我所希望的就是保持數值,但這種情況可以通過增加一個寄存器來保持,也不應該生成一個鎖存器。
最后,鎖存器只存在於組合電路中,在時序電路上是不存在的。
