觸發器:flipflop
鎖存器:latch
寄存器:register
鎖存器是電平觸發的存儲單元,數據存儲的動作取決於輸入時鍾(或者使能)信號的電平值,盡當鎖存器處於使能狀態時輸出才會隨着數據輸入發生變化。
觸發器是邊沿敏感的存儲單元,數據存儲的動作有某一信號的上升或者下降沿進行同步的。
寄存器用來存放數據的一些小型存儲區域,用來暫時存放參與運算的數據和運算結果。其實寄存器就是一種常用的時序邏輯電路,但這種時序邏輯電路只包含存儲電路。寄存器的存儲電路是由鎖存器或觸發器構成的,因為一個鎖存器或觸發器能存儲1位二進制數,所以由N個鎖存器或觸發器可以構成N位寄存器。 觸發器是在時鍾的沿進行數據的鎖存的,而鎖存器是用電平使能來鎖存數據的。所以觸發器的Q輸出端在每一個時鍾沿都會被更新,而鎖存器只能在使能電平有效器件才會被更新。 有一些教科書里的觸發器實際是鎖存器。在FPGA設計中建議如果不是必須那么應該盡量使用觸發器而不是鎖存器。
鍾控D觸發器其實就是D鎖存器,邊沿D觸發器才是真正的D觸發器,鍾控D觸發器在使能情況下輸出隨輸入變化,邊沿觸發器只有在邊沿跳變的情況下輸出才變化。
20、D 觸發器和D 鎖存器的區別。
兩個鎖存器可以構成一個觸發器,歸根到底還是dff是邊沿觸發的,而latch是電平觸發的。鎖存器的輸出對輸入透明的,輸入是什么,輸出就是什么,這就是鎖存器不穩定的原因,而觸發器是由兩個鎖存器構成的一個主從觸發器,輸出對輸入是不透明的,必須在時鍾的上升/下降沿才會將輸入體現到輸出,所以能夠消除輸入的毛刺信號。
21、latch和filp-flop的異同
都是時序邏輯,但latch受所有的輸入信號控制,只要輸入信號變化,latch就變化。也正因為如此,latch很容易出毛刺。flip-flop是觸發器,只有在被時鍾觸發時才采樣當前的輸入,產生輸出。如果使用門電路來搭建latch和ff,則latch消耗的門資源比ff要少。但是你用的如果是 fpga,那么內部一般帶DFF單元,反而用觸發器更好。
22、latch與register的區別,
為什么現在多用register.行為級描述中latch如何產生的行為級描述中latch一般是由於if貨case邏輯表述不完全產生的。
異同:
1、 latch由電平觸發,非同步控制。在使能信號有效時latch相當於通路,在使能信號無效時latch保持輸出狀態。DFF由時鍾沿觸發,同步控制。
2、 latch容易產生毛刺(glitch),DFF則不易產生毛刺。
3、 如果使用門電路來搭建latch和DFF,則latch消耗的門資源比DFF要少,這是latch比DFF優越的地方。所以,在ASIC中使用 latch的集成度比DFF高,但在FPGA中正好相反,因為FPGA中沒有標准的latch單元,但有DFF單元,一個LATCH需要多個LE才能實現。
4、 latch將靜態時序分析變得極為復雜。
一般的設計規則是:在絕大多數設計中避免產生latch。它會讓您設計的時序完蛋,並且它的隱蔽性很強,非老手不能查出。latch最大的危害在於不能過濾毛刺。這對於下一級電路是極其危險的。所以,只要能用D觸發器的地方,就不用latch。有些地方沒有時鍾,也只能用latch了。比如現在用一個clk接到latch的使能端(假設是高電平使能),這樣需要的setup時間,就是數據在時鍾的下降沿之前需要的時間,但是如果是一個DFF,那么setup時間就是在時鍾的上升沿需要的時間。這就說明如果數據晚於控制信號的情況下,只能用 latch,這種情況就是,前面所提到的latch timing borrow。基本上相當於借了一個高電平時間。也就是說,latch借的時間也是有限的。
關 於latch的討論 latch和flip-flop都是時序邏輯,區別為:latch同其所有的輸入信號相關,當輸入信號變化時latch就變化,沒有時鍾端;flip- flop受時鍾控制,只有在時鍾觸發時才采樣當前的輸入,產生輸出。當然因為二者都是時序邏輯,所以輸出不但同當前的輸入相關還同上一時間的輸出相關。
1、沒有時鍾端,不受系統同步時鍾的控制,無法實現同步操作;
2、對輸入電平敏感,受布線延遲影響較大,很難保證輸出沒有毛刺產生;
在 xilinx和altera器件的slice和LE中都能夠同時支持生產d-latch和d-ff,在這一層面上二者有什么區別暫時沒有想到。如果使用門電路來搭建latch和ff,則latch消耗的門資源比ff要少,這是latch比ff優越的地方。 latch的最大缺點就是沒有時鍾端,和當前我們盡可能采用時序電路的設計思路不符。 latch是電平觸發,相當於有一個使能端,且在激活之后(在使能電平的時候)相當於導線了,隨輸出而變化,在非使能狀態下是保持原來的信號,這就可以看出和flip-flop的差別,其實很多時候latch是不能代替ff的
1.latch對毛刺敏感
2.在ASIC中使用latch的集成度比DFF高,但在FPGA中正好相反,因為FPGA中沒有標准的latch單元,但有DFF單元,一個LATCH需要多個LE才能實現
3.latch將靜態時序分析變得極為復雜
4. 目前latch只在極高端電的路中使用,如intel 的P4等CPU。 FPGA中有latch單元,寄存器單元就可以配置成latch單元,在xilinx v2p的手冊將該單元成為register/latch單元,附件是xilinx半個slice的結構圖。其它型號和廠家的FPGA沒有去查證。——個人認為xilinx是能直接配的而altera或許比較麻煩,要幾個LE才行,然而也非xilinx的器件每個slice都可以這樣配置altera的只有DDR接口中有專門的latch單元,一般也只有高速電路中會采用latch的設計。altera的LE是沒有latch的結構的又查了sp3和sp2e,別的不查了,手冊上說支持這種配置。有關altera的表述wangdian說的對,altera的ff不能配置成latch,它使用查找表來實現latch,
一般的設計規則是:在絕大多數設計中避免產生LATCH.它會讓您設計的時序完蛋,並且它的隱蔽性很強,非老手不能查出.latch最大的危害在於不能過濾毛刺。這對於下一級電路是極其危險的。所以,只要能用D觸發器的地方,就不用latch。有些地方沒有時鍾,也只能用latch了。
對latch進行STA的分析其實也是可以,但是要對工具相當熟悉才行.不過很容易出錯.當前PrimeTime,是支持進行latch分析的.現在一些綜合工具內置的STA分析功能也支持比如RTL compiler, Design Compiler. 除了ASIC里可以節省資源以外。我感覺latch這個東西在同步設計里出現的可能還是挺小的吧,現在處理過程中大都放在ff里打一下,影響不太大吧
標簽: 無標簽latch與DFF的區別收集了一下網上資源,總結如下:
1、latch由電平觸發,非同步控制。在使能信號有效時latch相當於通路,在使能信號無效時latch保持輸出狀態。DFF由時鍾沿觸發,同步控制。
2、latch容易產生毛刺(glitch),DFF則不易產生毛刺。
3、如果使用門電路來搭建latch和DFF,則latch消耗的門資源比DFF要少,這是latch比DFF優越的地方。所以,在ASIC中使用latch的集成度比DFF高,但在FPGA中正好相反,因為FPGA中沒有標准的latch單元,但有DFF單元,一個LATCH需要多個LE才能實現。
4、latch將靜態時序分析變得極為復雜。一般的設計規則是:在絕大多數設計中避免產生latch。它會讓您設計的時序完蛋,並且它的隱蔽性很強,非老手不能查出。latch最大的危害在於不能過濾毛刺。這對於下一級電路是極其危險的。所以,只要能用D觸發器的地方,就不用latch。有些地方沒有時鍾,也只能用latch了。比如現在用一個clk接到latch的使能端(假設是高電平使能),這樣需要的setup時間,就是數據在時鍾的下降沿之前需要的時間,但是如果是一個DFF,那么setup時間就是在時鍾的上升沿需要的時間。這就說明如果數據晚於控制信號的情況下,只能用 latch,這種情況就是,前面所提到的latch timing borrow。基本上相當於借了一個高電平時間。也就是說,latch借的時間也是有限的。在if語句和case不全很容易產生latch,需要注意。VIA題目這兩個代碼哪個綜合更容易產生latch:
代碼1
always@(enable or ina or inb)
begin
if(enable) begin
data_out = ina;
end
else begin
data_out = inb;
end
end
代碼2
input[3:0] data_in;
always@(data_in)
begin
case(data_in)
0 : out1 = 1'b1;
1,3 : out2 = 1'b1;
2,4,5,6,7 : out3 = 1'b1;
default: out4 = 1'b1;
endcase
end
答案是代碼2在綜合時更容易產生latch。
使用條件語句不當在設計中生成了原本沒有想到的鎖存器:、
例1:在一個always語句中不正確使用if語句
Always @ (al or d) always @ (al or d)
begin begin
if(al) q<= d; if(al) q <= d;
end else q <= 0;
end
在這個always塊中,if語句只保證了當al=1時q才取d的值。這段程序並沒有給出當al=0時q的取值,那么當al=0時q取何值?在always塊中在給定的條件下變量沒有被賦值,那么變量將保持原值,也就是說將會生成一個鎖存器。
如果當設計人員希望當al=0時,q的值為0,則else項就必不可少了。請注意看右邊的always塊,整個verilog程序模塊綜合出來后,always塊對應的部分不會生成鎖存器。
Verilog HDL程序的另一種偶然生成鎖存器是在使用case語句時缺少default項的情況下發生的。
Case語句的功能是:在某個信號取不同的值時,給另一個信號賦不同的值。如下,如果sel=00,q取a值,而sel=11,q取b值。這個例子不清楚的是:如果sel取00和11以外的值時q將賦予什么值?在這個例子中,默認q保持原值,這就會自動生成鎖存器。
always @ (sel[1:0] or a or b) always @ (sel[1:0] or a or b)
case(sel[1:0]) case(sel[1:0])
2’b00: q <= a; 2’b00: q <= a;
2’b11: q <= b; 2’b11: q <= b;
endcase default: q <= ‘b0;
endcase
有鎖存器 無鎖存器
避免生成鎖存器的方法:如果用到if語句,最好寫上sles項;如果用case語句,最好寫上default項。遵循上面兩條原則,就可以避免發生這種錯誤,使設計者更加明確設計目標,同時也增強了verilog程序的可讀性。
