【轉載】FPGA 中的latch 鎖存器

   如下這篇文章講述了鎖存器的一些概念和注意事項。原文標題及連接:html

FPGA 中的latch 鎖存器 - 快樂至永遠上的博客 - 與非博客 - 與網 http://www.eefocus.com/liuyuxue/blog/13-11/300280_d7008.html異步

  一直都知道fpga中有latch這麼一回事,可是一直都不太清楚到底什麼是鎖存器,它是怎麼產生的,它到底和寄存器有多少區別,它怎麼消除。爲何說他很差?性能

一,是什麼spa

       鎖存器是一種在異步時序電路系統中,對輸入信號電平敏感的單元,用來存儲信息。一個鎖存器能夠存儲1bit的信息一般,鎖存器會多個一塊兒出現,如4位鎖存器,8位鎖存器。鎖存器在數據未鎖存時,輸出端的信號隨輸入信號變化,就像信號經過一個緩衝器,一旦鎖存信號有效,則數據被鎖存,輸入信號不起做用。所以,鎖存器也被稱爲透明鎖存器,指的是不鎖存時輸出對於輸入是透明的。.net

二   鎖存器與寄存器的區別:設計

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

三,鎖存器的危害:          blog

  對毛刺敏感,不能異步復位,因此上電之後處於不肯定的狀態;資源

       Latch會使靜態時序分析變得很是複雜;get

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

       第三條也是最基本的緣由。

四,產生的緣由  ********ps重重之重

  上面說了那沒多隻是以爲網上的沒把鎖存器說明白。下面的纔是重點。

       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. 付初值。好用的

六,怎麼看到鎖存器。

  其實我挺討厭網上說了好多的廢話,到最後我都不知道是啥。因此我建議你們本身編成,在看看綜合後的RTL圖,以及技術RTL圖,看看到底有什麼不一樣,到底鎖存器長啥樣,漂亮不漂亮。這個是我在case語句中加入了default語句的綜合結果。

  以上兩個圖是沒有加入的狀況,能夠看出明顯不一樣。在上面的圖中有由組合電路產生的與門,提供了電平觸發鎖存器。同時在技術RTL中多了一個LUT查找表,是爲了鎖存器提供使能的,當使能輸出爲1時鎖存,使能爲0時,輸出正常。

    很差意思代碼我就不貼了。嘿嘿。ps:關鍵是我忘了是啥了,我就是一坑貨呀。

其實挺簡單地就是啊,a,b爲輸入,y輸出。由a和b組成case({a,b})決定狀態。

七,咱們討論一下到底鎖存器是否是就是沒用的

1. Latch的本質

  Latch做爲一種電路單元,必然有其存在的理由及應用場景,在實際應用中,有些設計不可避免的要使用Latch,特別是總線應用上,例如,地址鎖存器,數據鎖存器,復位信號鎖存器等。可是在更多的狀況下,很容易產生未預料到的鎖存器,使邏輯功能不知足要求,浪費大量時間。比較好的應用規則是:要學會分析是否須要Latch以及代碼是否會產生意外的Latch。

經過Verilog HDL實現序列最大值搜索程序,並保持檢測到的最大值

[plain] view plaincopy
 
  1. module two_max(  
  2.         a,rst_n,abmax  
  3.     );  
  4.   
  5.         input   [7:0]  a;  
  6.         input          rst_n;  
  7.         output  [7:0]  abmax;  
  8.   
  9.         reg     [7:0]  abmax_tmp;  
  10.   
  11.        always @ (a or rst_n) begin  
  12.                if (!rst_n)  
  13.                    abmax_tmp = 8'h00;  
  14.                else  
  15.                   if (a>abmax_tmp)  
  16.                       abmax_tmp = a;  
  17.        end  
  18. endmodule  

  上述代碼在ISE中的綜合結果會給出設計中包含Latch的警告。但實際上,abmax_tmp鎖存器正是咱們須要的,因此,雖然有警告,可是代碼設計是沒有問題的。將上述代碼的if語句補全:

[plain] view plaincopy
 
  1. if (a > abmax_tmp)  
  2.     abmax_tmp = a;  
  3. else  
  4.     abmax_tmp = abmax_tmp;  

  通過綜合後,仍然有Latch的警告。不管Latch是不是用戶須要的,ISE都會給出警告,主要緣由就是Latch對整個設計的時序性能影響較大。因此,在設計中要儘可能避免Latch,可是確實須要使用的狀況,也可使用。

2. 「不指望」latch

  指的是與設計意圖不符,產生的Latch。主要問題在於設計人員沒有合理使用Verilog HDL語言,常見的緣由是對條件語句(if、casse)的分支描述不完整。典型例子:用Verilog HDL實現一個鎖存器,當輸入數據大於127時,將輸入數據輸出,不然輸出0

[plain] view plaincopy
 
  1. module latch_demo(  
  2.         din,dout  
  3.     );  
  4.     input   [7:0] din;  
  5.     output [7:0] dout;  
  6.   
  7.     reg      [7:0] dout;  
  8.   
  9. always @ (din) begin  
  10.      if (din>127)  
  11.           dout <= din;  
  12. end  
  13.   
  14. endmodule  

  綜合後的結果,在比較器後面級聯了鎖存器,這是由於if語句缺乏else分支形成的。查看仿真結果,當輸入小於127時,輸出保持了上次的127,不是0,沒有達到設計要求。修改方法很簡單,就是講if-else補全。

[plain] view plaincopy
 
  1. if (din > 127 )  
  2.     dout = din;  
  3. else  
  4.     dout = 0;  

  在ISE中綜合後的結果中,能夠看到補全if-else後,在比較器後面級聯了與門,代替原來的鎖存器,仿真結果也正確。

  至此,能夠獲得一個結論:Latch做爲一種基本電路單元,會影響到電路的時序性能,應該儘可能避免使用,但出現Latch形成設計與意圖不符的狀況,是因爲設計人員代碼不正確形成的。

嘿嘿本文參考了http://blog.csdn.net/guqian110/article/details/10189301。謝謝

相關文章
相關標籤/搜索