在進行FPGA設計的過程中,經常會在編譯程序時發(fā)現(xiàn)有一些warning提示生成了一些latch,而且一般FPGA的設計規(guī)則也不建議有l(wèi)atch生成。那么,latch究竟是什么東西呢?如果在FPGA設計中不允許latch中現(xiàn),又如何避免呢?
1 鎖存器、觸發(fā)器和寄存器的比較
(1)鎖存器
鎖存器(latch)是電平觸發(fā)的存儲單元,數(shù)據(jù)存儲的動作(狀態(tài)轉換)取決于輸入時鐘(或者使能)信號的電平值,僅當鎖存器處于使能狀態(tài)時,輸出才會隨著數(shù)據(jù)輸入發(fā)生變化。
分為普通鎖存器和門控鎖存器。普通鎖存器無控制信號,輸出狀態(tài)始終直接由輸入決定。在實際的數(shù)字系統(tǒng)中,為了協(xié)調各部分的工作,往往需要有一個特定的控制信號去控制鎖存器狀態(tài)轉換的時間,在控制信號無效時,輸出保持不變,不隨輸入變換;當控制信號有效時,輸出由輸入決定,跟隨輸入變化。
①正是因為門控鎖存器在控制信號有效的期間內,都可以接收輸入信號,所以,激勵信號的任何變化,都將直接引起鎖存器輸出狀態(tài)的改變。這時輸入信號若發(fā)生多次變化,輸出狀態(tài)也可能發(fā)生多次變化,這一現(xiàn)象稱為鎖存器的空翻。
②其次,當門控鎖存器的控制信號有效時,鎖存器就變成了一個組合電路,時序邏輯電路的模型就等效為兩個各組合電路互為反饋的反饋系統(tǒng),因此,系統(tǒng)有可能會因為瞬態(tài)特性不穩(wěn)定而產生振蕩現(xiàn)象。
(2) 觸發(fā)器(flip-flop)
觸發(fā)器(flip-flop)是邊沿敏感的存儲單元,數(shù)據(jù)存儲的動作(狀態(tài)轉換)由某一信號的上升或者下降沿進行同步的(限制存儲單元狀態(tài)轉換在一個很短的時間內)。(鐘控D觸發(fā)器其實就是 D 鎖存器,邊沿 D 觸發(fā)器才是真正的 D 觸發(fā)器)
觸發(fā)器分為兩種,一種是主從觸發(fā)器和邊沿觸發(fā)器。主從觸發(fā)器在時鐘有效期內(主觸發(fā)器)接收數(shù)據(jù),在時鐘邊沿輸出狀態(tài)轉換。邊沿觸發(fā)器在時鐘邊沿期間, 觸發(fā)器才接收數(shù)據(jù)并使輸出狀態(tài)轉換。目前,主從觸發(fā)器基本上已經很少見了,實際使用的大都是邊沿觸發(fā)器。
(3)寄存器(register)
寄存器(register)用來暫時存放參與運算的數(shù)據(jù)和運算結果。在實際的數(shù)字系統(tǒng)中,通常把能夠用來存儲一組二進制代碼的同步時序邏輯電路稱為寄存器。
區(qū)別與聯(lián)系:由于觸發(fā)器內有記憶功能,因此利用觸發(fā)器可以方便地構成寄存器。由于一個觸發(fā)器能夠存儲一位二進制碼,所以把 n 個觸發(fā)器的時鐘端口連接起來就能構成一個存儲 n 位二進制碼的寄存器。
從寄存數(shù)據(jù)的角度來講,寄存器和鎖存器的功能是相同的;它們的區(qū)別在于寄存器是同步時鐘控制,而鎖存器是電位信號控制。一般的設計規(guī)則是:在絕大多數(shù)設計中避免產生鎖存器。它會讓您設計的時序完蛋,并且它的隱蔽性很強,非老手不能查出。
2 鎖存器具備的特點
(1)對毛刺敏感(使能信號有效時,輸出狀態(tài)可能隨輸入多次變化,產生空翻,對下一級電路很危險),不能異步復位,因此在上電后處于不確定的 狀態(tài)。
(2)鎖存器會使靜態(tài)時序分析變得非常復雜,不具備可重用性。(首先, 鎖存器沒有時鐘參與信號傳遞,無法做 STA;其次,綜合工具會將 latch 優(yōu)化掉,造成前后仿真結果不一致)
(3)在FPGA中基本的單元是由查找表和觸發(fā)器組成的,若生成鎖存器反而需要更多的資源。根據(jù)鎖存器的特點可以看出,在電路設計中,要對鎖存器特別謹慎,如果設計經過綜合后產生出和設計意圖不一致的鎖存器,則將導致設計錯誤,包括仿真和綜合。因此,在設計中需要避免產生意想不到的鎖存器。如果組合邏輯的語句完全不使用 always 語句塊,就可以保證綜合器不會綜合出鎖存器。
(4)但如果鎖存器和觸發(fā)器兩者都由與非門搭建的話,鎖存器耗用的邏輯資源要比D觸發(fā)器少(D觸發(fā)器需要12個MOS管,鎖存器只需6個MOS管),鎖存器的集成度更高。
所以在的ASIC設計中會用到鎖存器。但鎖存器對毛刺敏感,無異步復位端,不能讓芯片在上電時 處在確定的狀態(tài);另外,鎖存器會使靜態(tài)時序分析變得很復雜,不利于設計的可重用,所以,在ASIC設計中,除了CPU這高速電路,或者RAM這種對面積很敏感的電路,一般不提倡用鎖存器。
3 鎖存器的出現(xiàn)以及解決辦法
在基于always的組合邏輯描述語句中容易綜合出鎖存器的地方:
在FPGA程序設計過程中,出現(xiàn)latch絕大多數(shù)情況是因為if和case語句的不完全描述,導致程序在綜合過程中出現(xiàn)了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的位數(shù)改為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
可以看到,第二張綜合圖里面出現(xiàn)了latch。然而,兩段程序的不同僅僅是a的位數(shù)從2變到了3,這究竟是為什么?
其實這就是因為case的不完全描述所致。在第一段程序中,輸入a可能的四種取值都窮舉到了,所以是完全描述的。而第二段程序中,a變?yōu)榱?位數(shù),而取值只有3’b000、3’b001、3’b010、3’b011四個,而3’b100到3’b111之間的數(shù)據(jù)并沒有列舉出,雖然在實際執(zhí)行過程中輸入并不會出現(xiàn)未列舉出的數(shù)值,但是系統(tǒng)在編譯時并不知情,所以它會在3’b100到3’b111之間的值出現(xiàn)時將b的輸出鎖存,也就是出現(xiàn)了latch的功能行為
。 之所以在硬件設計中避免latch的出現(xiàn),主要原因是latch會產生毛刺(glitch),這種毛刺對下一級電路是很危險的。并且其隱蔽性很強,不易查出。因此,在設計中,應盡量避免latch的使用。
從其產生原因可以看出,為了防止出現(xiàn)latch,對于if語句和case語句一定要做到完全描述,最常用的方法就是總是加上else和default。
總結:
鎖存器產生的根本原因:當組合邏輯需要保持時,就會綜合出鎖存器。
鎖存器的危害:
(1)latch會產生毛刺(glitch),這種毛刺對下一級電路是很危險的;
(2)不能異步復位,因此在上電后處于不確定的 狀態(tài);
(3)鎖存器會使靜態(tài)時序分析變得非常復雜,不具備可重用性
審核編輯 :李倩
-
寄存器
+關注
關注
31文章
5336瀏覽量
120250 -
觸發(fā)器
+關注
關注
14文章
2000瀏覽量
61134 -
Latch
+關注
關注
1文章
48瀏覽量
16213
原文標題:FPGA設計中如何才能不出現(xiàn)Latch鎖存器
文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設計論壇】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論