1、鎖存器和觸發器的定義和比較
鎖存器(latch)---對脈沖電平敏感,在時鐘脈沖的電平作用下改變狀態,當Gate輸入為高電平時,輸入D透明傳輸到輸出Q;當Gate從高變低或者保持低電平時,輸出Q被鎖存保持不變。鎖存器是電平觸發的存儲器。
應用場合:數據有效遲后于時鐘信號有效。這意味著時鐘信號先到,數據信號后到。在某些運算器電路中有時采用鎖存器作為數據暫存器。
觸發器(flip-flop)---對脈沖邊沿敏感,其狀態只在時鐘脈沖的上升沿或下降沿的瞬間改變。當時鐘信號C上升沿時刻(或者下降沿時刻),輸入D被賦值到輸出Q,其他情況保持鎖存。觸發器是邊沿觸發的存儲器。
應用場合:時鐘有效遲后于數據有效。這意味著數據信號先建立,時鐘信號后建立。在CP上升沿時刻打入到寄存器。
比較:
1)、latch和flip-flop都是時序邏輯,所以輸出不但同當前的輸入相關還同上一時間的輸出相關;
2)、latch由電平觸發,異步控制。在使能信號有效時latch相當于通路,在使能信號無效時latch保持輸出狀態。觸發器由時鐘沿觸發,同步控制。所以說,觸發器是一個同步版鎖存器;
3)、FPGA主要有觸發器和查找表組成,沒有標準的latch單元,一個latch需要更多資源才能實現;
4)、一般的設計規則是:在絕大多數設計中避免產生latch。latch最大的危害在于不能過濾毛刺。這對于下一級電路是極其危險的。所以,只要能用D觸發器的地方,就不用latch;
5)、if語句或者case語句不全很容易產生latch。在RTL描述中,如果一個信號在一個條件的分支中被賦值,而不是在所有分支中被賦值,則該信號的前一個值就要被保留。
同步情況下(敏感列表時時鐘邊沿)用觸發器實現,保留到下一個時鐘邊沿為止,異步情況下(即敏感列表中是電平而非時鐘的邊沿)需要由鎖存器來實現,保留到下一個已列出的分支情況的電平有效為止。
2、鎖存器的有與無
推導出鎖存器的一般規則是:
1)、如果在電平觸發的always語句所有可能的執行過程(如if/case語句)中變量沒有全部被賦值,就會產生鎖存器;
2)、如果在邊沿觸發的always語句所有的可執行過程中變量沒有被全部復制,會產生觸發器;
3)、如果在always語句中變量在if/case的所有分支中都被賦值則綜合成組合邏輯;
always @ (Toggle)
case (Toggle) //synthesis full_case
2‘b01: NextToggle = 2’b10;
2‘b10: NextToggle = 2’b01;
endcase
always @ (Toggle)
case (Toggle)
2‘b01: NextToggle = 2’b10;
2‘b10: NextToggle = 2’b01;
endcase
第一種寫法用編譯命令synthesis full_case把case語句補全,效果和default語句或將case列舉出所有情況類似。
此時沒有鎖存器,只用兩個2輸入的LUT完成2輸入2輸出的邏輯功能,純粹的組合邏輯。
第二種寫法沒有將case的所有情況列舉出,就產生了鎖存器LD。
查看Xilinx的庫手冊,LD是透明鎖存器,當G使能的時候,Q輸出D的值;當G不使能的時候,Q保持上一狀態的值。
以下改用的時鐘的上調沿觸發,生成了兩個D觸發器,當時鐘上調沿來臨時用輸入端D更新輸出端Q的數據。
always @ (posedge clk)
case (Toggle)
2‘b01: NextToggle = 2’b10;
2‘b10: NextToggle = 2’b01;
endcase
這說明邊沿觸發的always塊中,即使if.。.else或者case沒寫全也不會出現鎖存器。
評論
查看更多