FPGA基礎——鎖存器latch


一、是什么

       鎖存器是一種在異步時序電路系統中,對輸入信號電平敏感的單元,用來存儲信息。一個鎖存器可以存儲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;是一樣的。在這里,我所希望的就是保持數值,但這種情況可以通過增加一個寄存器來保持,也不應該生成一個鎖存器。

最后,鎖存器只存在於組合電路中,在時序電路上是不存在的。

 

原文鏈接:關於verilog中if與case語句不完整產生鎖存器的問題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM