在進行fpga設計的過程中,經常會在編譯程式時發現有一些warning提示生成了一些latch,而且一般fpga的設計規則也不建議有latch生成。那麼,latch究竟是什麼東西呢?如果在fpga設計中不允許latch中現,又如何避免呢?
1 鎖存器、觸發器和暫存器的比較
(1)鎖存器
鎖存器(latch)是電平觸發的儲存單元,資料儲存的動作(狀態轉換)取決於輸入時鐘(或者使能)訊號的電平值,僅當鎖存器處於使能狀態時,輸出才會隨著資料輸入發生變化。
分為普通鎖存器和門控鎖存器。普通鎖存器無控制訊號,輸出狀態始終直接由輸入決定。在實際的數字系統中,為了協調各部分的工作,往往需要有乙個特定的控制訊號去控制鎖存器狀態轉換的時間,在控制訊號無效時,輸出保持不變,不隨輸入變換;當控制訊號有效時,輸出由輸入決定,跟隨輸入變化。
①正是因為門控鎖存器在控制訊號有效的期間內,都可以接收輸入訊號,所以,激勵訊號的任何變化,都將直接引起鎖存器輸出狀態的改變。這時輸入訊號若發生多次變化,輸出狀態也可能發生多次變化,這一現象稱為鎖存器的空翻。
②其次,當門控鎖存器的控制訊號有效時,鎖存器就變成了乙個組合電路,時序邏輯電路的模型就等效為兩個各組合電路互為反饋的反饋系統,因此,系統有可能會因為瞬態特性不穩定而產生振盪現象。
(2) 觸發器(flip-flop)
觸發器(flip-flop)是邊沿敏感的儲存單元,資料儲存的動作(狀態轉換)由某一訊號的上公升或者下降沿進行同步的(限制儲存單元狀態轉換在乙個很短的時間內)。(鐘控d觸發器其實就是 d 鎖存器,邊沿 d 觸發器才是真正的 d 觸發器)
觸發器分為兩種,一種是主從觸發器和邊沿觸發器。主從觸發器在時鐘有效期內(主觸發器)接收資料,在時鐘邊沿輸出狀態轉換。 邊沿觸發器在時鐘邊沿期間, 觸發器才接收資料並使輸出狀態轉換。目前,主從觸發器基本上已經很少見了,實際使用的大都是邊沿觸發器。
(3)暫存器(register)
暫存器(register)用來暫時存放參與運算的資料和運算結果。在實際的數字系統中,通常把能夠用來儲存一組二進位制**的同步時序邏輯電路稱為暫存器。
區別與聯絡:由於觸發器內有記憶功能,因此利用觸發器可以方便地構成暫存器。由於乙個觸發器能夠儲存一位二進位製碼,所以把 n 個觸發器的時鐘埠連線起來就能構成乙個儲存 n 位二進位製碼的暫存器。
從寄存資料的角度來講,暫存器和鎖存器的功能是相同的;它們的區別在於暫存器是同步時鐘控制,而鎖存器是電位訊號控制。 一般的設計規則是:在絕大多數設計中避免產生鎖存器。它會讓您設計的時序完蛋,並且它的隱蔽性很強,非老手不能查出。
2 鎖存器具備的特點
(1)對毛刺敏感(使能訊號有效時,輸出狀態可能隨輸入多次變化,產生空翻,對下一級電路很危險),不能非同步復位,因此在上電後處於不確定的 狀態。
(2)鎖存器會使靜態時序分析變得非常複雜,不具備可重用性。 (首先, 鎖存器沒有時鐘參與訊號傳遞,無法做 sta;其次,綜合工具會將 latch 優化掉,造成前後**結果不一致)
(3)在fpga中基本的單元是由查詢表和觸發器組成的,若生成鎖存器反而需要更多的資源。根據鎖存器的特點可以看出,在電路設計中,要對鎖存器特別謹慎,如果設計經過綜合後產生出和設計意圖不一致的鎖存器,則將導致設計錯誤,包括**和綜合。因此,在設計中需要避免產生意想不到的鎖存器。如果組合邏輯的語句完全不使用 always 語句塊,就可以保證綜合器不會綜合出鎖存器。
(4)但如果鎖存器和觸發器兩者都由與非門搭建的話,鎖存器耗用的邏輯資源要比d觸發器少(d觸發器需要12個mos管,鎖存器只需6個mos管),鎖存器的整合度更高。
所以在的asic設計中會用到鎖存器。但鎖存器對毛刺敏感,無異步復位端,不能讓晶元在上電時 處在確定的狀態;另外,鎖存器會使靜態時序分析變得很複雜,不利於設計的可重用,所以,在asic設計中,除了cpu這高速電路,或者ram這種對面積很敏感的電路,一般不提倡用鎖存器。
3 鎖存器的出現以及解決辦法
在基於always的組合邏輯描述語句中容易綜合出鎖存器的地方:
在fpga程式設計過程中,出現latch絕大多數情況是因為if和case語句的不完全描述,導致程式在綜合過程**現了latch的功能行為。舉個簡單的例子,寫個解碼器,輸入為a,輸出為b,其中a為2位輸入,b為8位輸出,若如下所寫:
always@(*)
case
(a)2
'b00: b = 8'd1;
2'b01: b = 8'd5;
2'b10: b = 8'd8;
2'b11: b = 8'd17;
endcase
但是若將a的位數改為3,如下所寫:
always@(*)
case
(a)3
'b000: b = 8'd1;
3'b001: b = 8'd5;
3'b010: b = 8'd8;
3'b011: b = 8'd17;
endcase
可以看到,第二張綜合圖裡面出現了latch。然而,兩段程式的不同僅僅是a的位數從2變到了3,這究竟是為什麼?
其實這就是因為case的不完全描述所致。在第一段程式中,輸入a可能的四種取值都窮舉到了,所以是完全描述的。而第二段程式中,a變為了3位數,而取值只有3』b000、3』b001、3』b010、3』b011四個,而3』b100到3』b111之間的資料並沒有列舉出,雖然在實際執行過程中輸入並不會出現未列舉出的數值,但是系統在編譯時並不知情,所以它會在3』b100到3』b111之間的值出現時將b的輸出鎖存,也就是出現了latch的功能行為。
之所以在硬體設計中避免latch的出現,主要原因是latch會產生毛刺(glitch),這種毛刺對下一級電路是很危險的。並且其隱蔽性很強,不易查出。因此,在設計中,應盡量避免latch的使用。
從其產生原因可以看出,為了防止出現latch,對於if語句和case語句一定要做到完全描述,最常用的方法就是總是加上else和default。
總結:鎖存器產生的根本原因:當組合邏輯需要保持時,就會綜合出鎖存器。
鎖存器的危害:
(1)latch會產生毛刺(glitch),這種毛刺對下一級電路是很危險的;
(2)不能非同步復位,因此在上電後處於不確定的 狀態;
(3)鎖存器會使靜態時序分析變得非常複雜,不具備可重用性。
參考:(1)
(2)
Latch的產生和避免
designer fpga 1 人贊同了該文章 在fpga設計或者ic設計中,latch是一種對脈衝電平敏感的儲存單元路徑,可以在特定輸入脈衝作用下改變電平。但由於往往設計為同步設計,latch不可避免的毛刺是不願意看到的 這種毛刺對下一級電路及時序收斂很不利,因而在設計中需要避免。關於latch的...
FPGA 中的latch 鎖存器
到底什麼是鎖存器,它是怎麼產生的,它到底和暫存器有多少區別,它怎麼消除。為什麼說他不好?一,是什麼 鎖存器是一種在非同步時序電路系統中,對輸入訊號電平敏感的單元,用來儲存資訊。乙個鎖存器可以儲存1bit的資訊,通常,鎖存器會多個一起出現,如4位鎖存器,8位鎖存器。鎖存器在資料未鎖存時,輸出端的訊號隨...
FPGA 中的latch 鎖存器
一直都知道fpga中有latch這麼一回事,但是一直都不太清楚到底什麼是鎖存器,它是怎麼產生的,它到底和暫存器有多少區別,它怎麼消除。為什麼說他不好?一,是什麼 鎖存器是一種在非同步時序電路系統中,對輸入訊號電平敏感的單元,用來儲存資訊。乙個鎖存器可以儲存1bit的資訊,通常,鎖存器會多個一起出現,...