轉載 http://guqian110.github.io/pages/2014/09/23/latch_versus_flip_flop.html
根據 Wiki: Flip-flop (electronics) 上的介紹
In electronics, a
flip-flop
orlatch
is a circuit that has two stable states and can be used to store state information. A flip-flop is abistable multivibrator
. The circuit can be made to change state by signals applied to one or more control inputs and will have one or two outputs. It is the basic storage element in sequential logic. Flip-flops and latches are a fundamental building block of digital electronics systems used in computers, communications, and many other types of systems.
區別一下名字:
Flip-flops can be either simple (transparent or opaque) or clocked (synchronous or edge-triggered). Although the term flip-flop has historically referred generically to both simple and clocked circuits, in modern usage it is common to reserve the term flip-flop exclusively for discussing clocked circuits; the simple ones are commonly called latches.
Using this terminology, a latch is level-sensitive, whereas a flip-flop is edge-sensitive. That is, when a latch is enabled it becomes transparent, while a flip flop's output only changes on a single type (positive going or negative going) of clock edge.
所以按照現在的約定習慣區分,latch 指的是電平觸發的觸發器,翻譯為 “鎖存器”;flip-flop 指邊沿觸發的觸發器,就叫 “觸發器”。
[TOC]
History
翻譯自 wiki:
第一個電子觸發器(electronic flip-flop) 由 William Eccles 和 F. W. Jordan 於 1918 年發明的。它最早被稱為 : Eccles–Jordan trigger circuit
, 由兩個真空管組成。雖然現在由邏輯門 (logic gates)組成的觸發器很常見,但是在集成電路(intergrated circuits)中,這種元件及它的晶體管版本仍然也很常見。早期的觸發器常用來構成觸發電路或者多諧振盪器(multivibrators)。
根據一個 JPL 的工程師,P. L. Lindley介紹,Montgomery Phister 於 1954 年在 UCLA 的 computer design 的課程上第一次對觸發器進行了分類的討論(RS、D、T、JK),然后在他的書 Logical Design of Digital Computers 中也進行了討論。Lindley 當時在 Hughes Aircraft 的 Eldred Nelson 手下工作,而Nelson 命名了 JK 觸發器。其他的名字則是 Phister 命名的。Lindley 解釋說他是從 Nelson 口中得知 JK 觸發器的故事的,當時 Hughes Aircraft 使用的觸發器都是 JK 觸發器。在設計邏輯系統時,Nelson 給觸發器的輸入命名為 A&B、C&D、E&F、G&H、J&K。在 1953 年 Nelson 申請專利時,采用了 J&K 的命名方案。
Implementation
Flip-flops can be either simple (transparent or asynchronous) or clocked (synchronous); the transparent ones are commonly called latches. The word latch is mainly used for storage elements, while clocked devices are described as flip-flops.
不會翻譯了...大意就是說 flip-flop 可以分為兩類:
-
simple
也可以說是 透明的(transparent) 或者是 異步的(asynchronous),通常稱為
鎖存器Latch
-
clocked
也可以說是 同步的(synchronous),稱為
觸發器flip-flop
下面分類討論:
Latch
Latch 可以由一對真空管、三極管、場效應管組成,在實際應用中也可以用邏輯門組成 latch。
SR Latch
當使用邏輯門搭建模塊時,最基本的 latch 就是 SR latch
(set-reset latch),所有的 latch 和 flip-flop 都是建立在它的基礎之上。
SR latch 的實現可以有兩種方案:
-
SR NOR Latch
使用或非門搭建:
功能表:
-
S'R' NAND Latch
使用與非門搭建:
功能表:
D Latch
Latch 是 透明的(transparent)
,就是說輸入的變換立即就能傳遞到輸出端口,當幾個透明的 latch 級聯時,輸入端的信號也能立即傳遞到輸出端。當給 latch 添加額外的邏輯電路(比如使能信號 enable 無效時),就會使它變為 不透明的(non-transparent)
。下面的 D latch 就是這樣的例子。
仔細觀察 SR latch 的功能表,就可以發現,R 的取值為 S 的補。D latch 利用了這一特點,而且避免了 SR latch 中的禁止狀態的出現。
因為 SR latch 的實現有兩種,所以 D latch
的實現也對應有兩種:
-
NOR D Latch
-
NAND D Latch
D latch 的功能表:
D latch 也稱為 non-transparent、data latch、gated latch。它有一個數據輸入端和一個使能端 enable(clock、control)。之所以叫透明,是因為當它使能時,輸入端口的信號立刻就能傳遞到輸出端口。
Flip-Flop
如果 D latch 的控制端口加入時鍾信號,就得到了基本觸發器,只要時鍾信號 CP = 1,則觸發器就會受到觸發,當 CP 保持為 1 時,數據輸入端口的任何變化都將影響到 latch 的狀態。
latch 的這個特點應用到 時序電路中,就會出現比較嚴重的問題:
一般時序邏輯的輸出會經過組合電路的反饋通道,返回到時序邏輯的輸入。當時鍾信號有效時,latch 的輸出通過組合電路反饋到 latch 的輸入端,如果經過組合邏輯后,反饋的信號和之前的信號不同,則反饋信號會導致 latch 的輸出變為新的值。在時鍾信號有效的期間內,latch 的輸出一直在變化,出現了不可預測的結果,這是不可靠的工作。
latch 的問題就在於:它在時鍾有效期間內一直在被觸發,這種觸發時間過長。
這個問題的解決方法就是:將觸發條件變為時鍾沿觸發,這樣就得到了觸發器 flip-flop
D flip-flop
將 latch 改造為邊沿敏感的觸發器,最簡單的就是 D flip-flop
(data or delay),搭建電路最經濟有效的方法就是使用 DFF,因為它需要的門電路最少,其他類型的觸發器都是在 DFF 的基礎上得到的。
實現 DFF 可以有兩種方法:
-
Classical positive-edge-triggered D flip-flop
-
Master–slave edge-triggered D flip-flop
clk = 1 時,master D-latch 使能,D 傳遞到輸出端 Q;
clk = 0 時,slave D-latch 使能,輸入 D (master D-latch 的輸出 Q) 傳遞到輸出 Q;
可以看到,當 clk 從 1 變為 0 時,輸入端的 D 才傳遞到輸出端 Q,也就是說在時鍾的下降沿才觸發,其他時刻都保持輸出不變。(如果需要上升沿觸發,只需要在 clk 輸入端鍵入一個反相器)
DFF 的特點就是在時鍾信號的特定點觸發(上升沿 or 下降沿),功能表:
JK flip-flop
在 DFF 的基礎上,可以得到 JK FF。
JK FF 的特點和 SR latch 類似,可以將 J 看作是 S,K 看作是 R,它和 SR latch 的區別在於它是邊沿觸發,並且將 S = R = 1 狀態設置為 翻轉 (toggle)
,也就是在下一個時鍾邊沿,輸出取反。當 J = K = 0 時,得到的並不是 DFF,而是保持輸出不變。
功能表:
T flip-flop
將 JK FF 的輸入端 J 和 K 連接到一起,就可以得到 T FF
(toggle flip-flop)。
當 T = 0 (J = K = 0) 時,輸出保持不變,時鍾邊沿不影響狀態;當 T = 1 (J = K = 1) 時,在時鍾邊沿輸出反相,也就是翻轉。
功能表:
可以看到 TFF 有 1/2 分頻的作用,這一特點在很多電路中得到了應用。
Timing considerations
Metastability
伴隨着 flip-flop 的一個問題是 亞穩態 Metastability
。當兩個輸入端口 (比如 data 和 clk,或者 reset 和 clk)同時變化時,就會發生亞穩態的問題,需要消耗更長的時間來使輸出達到穩定狀態,而且這個穩定狀態是不可預測的,有可能是 1,也有可能是 0。
在計算機系統中,如果發生亞穩態,如果在下一個時鍾使用數據時,還沒有達到穩定狀態,會導致數據傳輸錯誤或者程序崩潰。如果有兩條路徑同時用到了這個數據,有可能一條將它當作 1,另一條把它當作 0,這樣會導致系統進入不一致的狀態。
Setup, hold, recovery, removal times
Setup time is the minimum amount of time the data signal should be held steady before the clock event so that the data are reliably sampled by the clock. This applies to synchronous input signals to the flip-flop.
Hold time is the minimum amount of time the data signal should be held steady after the clock event so that the data are reliably sampled. This applies to synchronous input signals to the flip-flop.
Synchronous signals (like Data) should be held steady from the set-up time to the hold time, where both times are relative to the clock signal.
如圖所示,對於同步信號 (同步信號的意思是想對於時鍾信號而言,它的變化和時鍾是同步的,比如 data),必須滿足 setup time
和 hold time
要求。
在有效時鍾沿到來之前的 setup time 時間段內,同步信號必須保持穩定,在有效時鍾沿到來之后的 hold time 時間段內,同步信號也必須保持穩定,也就是說從 setup time 到 hold time 之間,它必須保持穩定不變化,這樣才能讓時鍾信號采樣到正確的值。
同理,對於異步信號,有類似的要求:
Recovery time is like setup time for asynchronous ports (set, reset). It is the time available between the asynchronous signals going inactive and the active clock edge.
Removal time is like hold time for asynchronous ports (set, reset). It is the time between active clock edge and asynchronous signal going inactive.
找到一個更清晰的解釋:
Recovery time is the minimum length of time an asynchronous control signal, for example, and preset, must be stable before the next active clock edge. The recovery slack time calculation is similar to the clock setup slack time calculation, but it applies asynchronous control signals.
Removal time is the minimum length of time an asynchronous control signal must be stable after the active clock edge. The TimeQuest analyzer removal time slack calculation is similar to the clock hold slack calculation, but it applies asynchronous control signals.
recovery time specifies the time the inactive edge of the asynchronous signal has to arrive before the closing edge of the clock.
Removal time specifies the length of time the active phase of the asynchronous signal has to be held after the closing edge of the clock.
也就是說 Recovery / Removal time 類似於 Setup / Hold Time,不過是用於異步信號,比如 set,reset 信號。
如圖所示,在時鍾沿到來之前的 recovery time 之前,異步信號必須釋放 (變無效),在時鍾沿到來之后的 removal time 之后,異步信號才能變有效,也就是說在從 recovery time 到 removal time 這段時間內,異步信號是不能有效的。
如果使 flip-flop 的輸入滿足 setup time 和 hold time,那么就可以避免亞穩態的出現,一般器件的手冊上都會標明這些參數,從幾 ns 到幾百 ps 之間。根據 flip-flop 內的組織情況而定,有時候可以將 setup time 或者 hold time 兩者中的一個(只能是其中之一)變為 0 甚至是負數。
但是,並不是總能滿足這一標准,因為有可能 flip-flop 的輸入端連到了外界的,設計者無法控制的一個不斷變化的信號,這時候設計者所能做的事就是根據電路要求,將發生錯誤的概率降低到一個確定的水平。通常使用 的方法就是將信號通過一條鏈在一起的 flip-flop 組,這樣子可以將發生亞穩態的概率降低到一個可以忽略的程度,但是還是不等於 0。鏈中的 flip-flop 越多,這個概率就越趨近於 0,通常的情況是采用 1 個或者兩個 flip-flop。
即使現在出現了所謂的 metastable-hardened flip-flops
,它可以盡可能地減小 setup time 和 hold time,但是仍然無法完全避免問題的出現。這是因為亞穩態並不是簡單的設計方法上的問題。當時鍾信號和其他信號在相隔很近的時間內變化,flip-flop 必須判斷哪一個先發生變化,哪一個后發生變化,無論我們的器件速度有多快,仍然有可能出現兩者相隔的太近,以至於無法判斷。所以理論上是不可能造出一個完美避免亞穩態的 flip-flop。
Propagation delay
flip-flop 還有一個參數叫做 clock-to-output delay (common symbol in data sheets: tco
) 或者是 propagation delay (tp
), 表示的是 flip-flop 從有效時鍾沿開始到輸出發生變化所消耗的時間。有時候從高電平變為低電平的時間 (high-to-low transition, tPHL))和從低電平變為高電平的時間 (low-to-high transition, tPLH) 不相等。
當用同一時鍾來驅動級聯的 flip-flop (比如移位寄存器 shift register)時,必須保證前一級的 tco 要大於后一級的 th。這是因為必須要保證前一級的數據能夠正確移位到后一級中。當有效時鍾沿到來時,前后兩級的 ff 在同時變化,采樣前一級的輸出作為本級的輸入,然后經過 tco 輸出更新的值。當后一級 ff 在 tsu 到 th 段內采樣時,必須保證前一級的輸出保持不變,也就是說前一級 ff 的響應速度不能太快,至少要等后一級正確采樣完成之后才能變化,即 tco > th
。如果采用物理構造完全相同的 ff,那么通常是可以保證這一條件的。
in FPGA
latch 和 flip-flop 的特點決定了它們各自的應用場景
latch 的優點:
-
面積比 ff 小
門電路是構建組合邏輯電路的基礎,而鎖存器和觸發器是構建時序邏輯電路的基礎。門電路是由晶體管構成的,鎖存器是由門電路構成的,而觸發器是由鎖存 器構成的。也就是 晶體管->門電路->鎖存器->觸發器,前一級是后一級的基礎。latch完成同一個功能所需要的門較觸發器要少,所以在asic中用 的較多。
-
速度比 ff 快
用在地址鎖存是很合適的,不過一定要保證所有的latch信號源的質量,鎖存器在CPU設計中很常見,正是由於它的應用使得CPU的速度比外部IO部件邏輯快許多。
latch 的缺點:
-
電平觸發,非同步設計,受布線延遲影響較大,很難保證輸出沒有毛刺產生
-
latch將靜態時序分析變得極為復雜
flip-flop 的優點:
-
邊沿觸發,同步設計,不容易受毛刺的印象
-
時序分析簡單
flip-flop 的缺點:
- 面積比 latch 大,消耗的門電路比 latch 多
目前 latch 只在極高端的電路中使用,如 intel 的 P4 等 CPU。而在 PLD / FPGA 中,基本單元 LE 是查找表 LUT 和觸發器 FF 組成的,如果要實現 latch,反而需要更多的資源。
一般的設計規則是:
在絕大多數設計中避免產生 latch。它會讓您設計的時序完蛋,並且它的隱蔽性很強,非老手不能查出。latch 最大的危害在於不能過濾毛刺。這對於下一級電路是極其危險的。所以,只要能用 DFF 的地方,就不用 latch。
Reason & Solution to unexpected latch
在電路設計中,要對Latch特別謹慎,如果綜合出和設計意圖不一致的 Latch,會導致設計錯誤,包括仿真和綜合。因此,要避免產生意外的 Latch。
Reason
如果組合邏輯完全不使用 always 語句,那么就不會產生 latch,比如
1 |
assign dout = din ? x : y;
|
電路不需要保存 dout 的前一個值,所以不會產生 latch。
如果組合邏輯使用了 always 語句,那么就有可能產生 Latch :
-
不完整的 if-else
code:
1 2 3 4 5
always @(din_a or din_b) begin if (din_a) begin dout = din_b; end end
RTL Schematic:
-
不完整的 case
code:
1 2 3 4 5 6
always @(din_c or din_a or din_b) begin case (din_c) 2'b00: dout = din_a; 2'b01: dout = din_b; endcase end
RTL Schematic:
Solution
知道了原因,那么解決方法也就顯而易見了:
-
使用完整的 if-else
code:
1 2 3 4 5 6 7 8
always @(din_a or din_b) begin if (din_a) begin dout = din_b; end else begin dout = din_a; end end
RTL Schematic:
-
使用完整的 case,添加 default 分支
code:
1 2 3 4 5 6 7
always @(din_c or din_a or din_b) begin case (din_c) 2'b00: dout = din_a; 2'b01: dout = din_b; default: dout = 2'b00; endcase end
RTL Schemtatic:
Application
latch 作為一種電路單元,必然有其存在的理由以及應用場景,並不像目前的很多書籍簡單地將鎖存器列為“頭等敵人”。其實在實際中,有些設計是不可避免地要用到鎖 存器,特別是在總線應用上,鎖存器能提高驅動能力、隔離前后級。例如,常見的應用包括地址鎖存器、數據鎖存器以及復位信號鎖存器等。但在更多的情況下,很 容易在代碼中產生未預料到的鎖存器,使得邏輯功能不滿足要求,浪費了大量的調試時間,從而使得大多數設計人員“聞虎色變”。
因此較好的應用規則是:要學會分析是否需要鎖存器以及代碼是否會產生意想不到的鎖存器。只有這樣才能靈活運用鎖存器。
下面通過實例來給予說明。
example1: 通過Verilog HDL實現序列最大值搜索程序,並保持檢測到的最大值
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
上述代碼在ISE中的綜合結果會給出設計中包含Latch的警告。但實際上,abmax_tmp鎖存器正是我們需要的,所以,雖然有警告,但是代碼設計是沒有問題的。將上述代碼的if語句補全:
if (a > abmax_tmp) abmax_tmp = a; else abmax_tmp = abmax_tmp;
經過綜合后,仍然有Latch的警告。無論Latch是否是用戶需要的,ISE都會給出警告,主要原因就是Latch對整個設計的時序性能影響較大。所以,在設計中要盡量避免Latch,但是確實需要使用的情況,也可以使用。
example2: 用Verilog HDL實現一個鎖存器,當輸入數據大於127時,將輸入數據輸出,否則輸出0
不期望的 latch 指的是與設計意圖不符,產生的 Latch。主要問題在於設計人員沒有合理使用Verilog HDL語言,常見的原因是對條件語句(if、casse)的分支描述不完整,導致電路的功能不是預期的,發生了錯誤。
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補全。
if (din > 127 ) dout = din; else dout = 0;
在ISE中綜合后的結果中,可以看到補全if-else后,在比較器后面級聯了與門,代替原來的鎖存器,仿真結果也正確。
Conclusion
鎖存器 latch 是一種基本電路單元,會影響到電路的時序性能,應該盡量避免使用,但出現鎖存器造成設計和原始意圖不符的情況,則是由於設計人員代碼輸入不正確造成的。