FPGA 中的latch 鎖存器

2021-08-18 06:01:28 字數 3648 閱讀 4813

一直都知道fpga中有latch這麼一回事,但是一直都不太清楚到底什麼是鎖存器,它是怎麼產生的,它到底和暫存器有多少區別,它怎麼消除。為什麼說他不好?

一,是什麼

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

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

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

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

三,鎖存器的危害:

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

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

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

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

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

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

1,case

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

3,always@(敏感訊號表)

五 解決

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

關於de****t的情況:一是可以 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()決定狀態。

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

latch作為一種電路單元,必然有其存在的理由及應用場景,在實際應用中,有些設計不可避免的要使用latch,特別是匯流排應用上,例如,位址鎖存器,資料鎖存器,復位訊號鎖存器等。但是在更多的情況下,很容易產生未預料到的鎖存器,使邏輯功能不滿足要求,浪費大量時間。比較好的應用規則是:要學會分析是否需要latch以及**是否會產生意外的latch。

通過verilog hdl實現序列最大值搜尋程式,並保持檢測到的最大值

[plain]view plain

copy

module two_max(  

a,rst_n,abmax  

);  

input   [7:0]  a;  

input          rst_n;  

output  [7:0]  abmax;  

reg     [7:0]  abmax_tmp;  

always @ (a or rst_n) begin  

if (!rst_n)  

abmax_tmp = 8'h00;  

else  

if (a>abmax_tmp)  

abmax_tmp = a;  

end  

endmodule  

上述**在ise中的綜合結果會給出設計中包含latch的警告。但實際上,abmax_tmp鎖存器正是我們需要的,所以,雖然有警告,但是**設計是沒有問題的。將上述**的if語句補全:

[plain]view plain

copy

if (a > abmax_tmp)  

abmax_tmp = a;  

else  

abmax_tmp = abmax_tmp;  

經過綜合後,仍然有latch的警告。無論latch是否是使用者需要的,ise都會給出警告,主要原因就是latch對整個設計的時序效能影響較大。所以,在設計中要盡量避免latch,但是確實需要使用的情況,也可以使用。

指的是與設計意圖不符,產生的latch。主要問題在於設計人員沒有合理使用verilog hdl語言,常見的原因是對條件語句(if、casse)的分支描述不完整。典型例子:用verilog hdl實現乙個鎖存器,當輸入資料大於127時,將輸入資料輸出,否則輸出0

[plain]view plain

copy

module latch_demo(  

din,dout  

);  

input   [7:0] din;  

output [7:0] dout;  

reg      [7:0] dout;  

always @ (din) begin  

if (din>127)  

dout <= din;  

end  

endmodule  

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

[plain]view plain

copy

if (din > 127 )  

dout = din;  

else  

dout = 0;  

在ise中綜合後的結果中,可以看到補全if-else後,在比較器後面級聯了與門,代替原來的鎖存器,**結果也正確。

至此,可以得到乙個結論:latch作為一種基本電路單元,會影響到電路的時序效能,應該盡量避免使用,但出現latch造成設計與意圖不符的情況,是由於設計人員**不正確造成的。

FPGA 中的latch 鎖存器

到底什麼是鎖存器,它是怎麼產生的,它到底和暫存器有多少區別,它怎麼消除。為什麼說他不好?一,是什麼 鎖存器是一種在非同步時序電路系統中,對輸入訊號電平敏感的單元,用來儲存資訊。乙個鎖存器可以儲存1bit的資訊,通常,鎖存器會多個一起出現,如4位鎖存器,8位鎖存器。鎖存器在資料未鎖存時,輸出端的訊號隨...

FPGA中鎖存器和觸發器

到底什麼是鎖存器,它是怎麼產生的,它到底和暫存器有多少區別,它怎麼消除。為什麼說他不好?鎖存器是一種在非同步時序電路系統中,對輸入訊號電平敏感的單元,用來儲存資訊。乙個鎖存器可以儲存1bit的資訊,通常,鎖存器會多個一起出現,如4位鎖存器,8位鎖存器。鎖存器在資料未鎖存時,輸出端的訊號隨輸入訊號變化...

Verilog設計中的鎖存器

問題 什麼是鎖存器?什麼時候出現鎖存器?鎖存器對電路有什麼影響?如何在fpga設計中避免鎖存器?在fpga設計中應該避免鎖存器.實際上,鎖存器與d觸發器實現的邏輯功能基本相同,都有暫存資料的功能。但如果兩者都由與非門搭建的話,鎖存器耗用的邏輯資源要比d觸發器少 d觸發器需要12個mos管,鎖存器只需...