1. 程式人生 > >關於verilog中if與case語句不完整產生鎖存器的問題

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

一、是什麼

       鎖存器是一種在非同步時序電路系統中,對輸入訊號電平敏感的單元,用來儲存資訊。一個鎖存器可以儲存1bit的資訊通常,鎖存器會多個一起出現,如4位鎖存器,8位鎖存器。

        鎖存器在資料未鎖存時,輸出端的訊號隨輸入訊號變化,就像訊號通過一個緩衝器,一旦鎖存訊號有效,則資料被鎖存,輸入訊號不起作用。因此,鎖存器也被稱為透明鎖存器,指的是不鎖存時輸出對於輸入是透明的。

二、鎖存器與暫存器的區別:

        兩者都是基本儲存單元,單鎖存器是電平觸發的儲存器,觸發器是邊沿觸發的儲存器。本質是,兩者的基本功能是一樣的,都可以儲存資料。意思是說一個是組合邏輯的,一個是在時序電路中用的,時鐘出發的。

 三、鎖存器的危害:          

        對毛刺敏感,不能非同步復位,所以上電以後處於不確定的狀態;

        Latch會使靜態時序分析變得非常複雜;

       在PLD晶片中,基本的單元是由查詢表和觸發器組成的,若生成鎖存器反而需要更多的資源。

            第三條也是最基本的原因。

四、產生的原因  ********ps重重之重

      上面說了那沒多隻是覺得網上的沒把鎖存器說明白。下面的才是重點。

       1,case

       2,if-------else if

       3,[email protected]

敏感訊號表

五、解決

      1.case——————加default:

      關於defalut的情況:一是可以 default:data=1‘bx;這個x表示未知,在綜合時可以避免產生鎖存器。在模擬時是紅線表示。  二是   default:data=0;這樣產生一個預設的情況。

       2.if-----------------------一定要有else語句。

      3.always---------如是說道:在賦值表示式右邊參與賦值的訊號都必須在[email protected](敏感電平列表)中列出。

如果在賦值表示式右端引用了敏感電平列表中沒有列出的訊號,那麼在綜合時,將會為該沒有列出的訊號隱含地產生一個透明鎖存器。

     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;是一樣的。在這裡,我所希望的就是保持數值,但這種情況可以通過增加一個暫存器來保持,也不應該生成一個鎖存器。

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