一、鎖存器(Latch)
- SR鎖存器(基本鎖存器):
由兩個或非門或者兩個與非門組成,電路結構、圖形符號和特性表如下所示。
此時,輸出狀態(次態)與輸入狀態、鎖存器初態都有關。
- 電平觸發SR觸發器(門控SR鎖存器):
當CLK=0時(無效),輸出狀態(次態)保持不變;只有當CLK=1時(有效),輸出狀態才隨輸入、初態的不同而改變,且與SR鎖存器的特性一樣。
當門控鎖存器的控制信號有效時,鎖存器就變成了一個組合電路,若此時輸入信號發生多次變化,輸出狀態也可能發生多次變化,這一現象稱爲鎖存器的空翻。此時,時序邏輯電路的模型就等效爲兩個各組合電路互爲反饋的反饋系統,因此,系統有可能會因爲瞬態特性不穩定而產生振盪現象,抗干擾能力差。
- 電平觸發D觸發器(D型鎖存器):
在CLK的有效電平期間,輸出狀態始終隨輸入狀態變化,輸出與輸入狀態保持相同,所以這個電路又叫“透明的D型鎖存器”。
二、觸發器(flip-floph)
- 邊沿觸發D觸發器:
由兩個D型鎖存器組成,次態僅取決時鐘有效邊沿到達時輸入的邏輯狀態,且值保持不變到下次觸發到達時(保持n個時鐘週期)。
電路抗干擾能力強,工作可靠性更高。
三、寄存器(Register)
寄存器能夠存寄一組二值代碼,即由N個觸發器組成。
四、基於Verilog的鎖存器&觸發器的分析
鎖存器(Latch)具有如下特點:
(1)對毛刺敏感(使能信號有效電平時,輸出狀態可能隨輸入多次變化,產生空翻,對下一級電路很危險),不能異步復位,因此在上電後處於不確定的狀態。
(2)鎖存器會使靜態時序分析變得非常複雜,不具備可重用性。(首先,鎖存器沒有時鐘參與信號傳遞,無法做STA;其次,綜合工具會將latch優化掉,造成前後仿真結果不一致)
(3)在FPGA中基本的單元是由查找表和觸發器組成的,若生成鎖存器反而需要更多的資源。根據鎖存器的特點可以看出,在電路設計中,要對鎖存器特別謹慎,如果設計經過綜合後產生出和設計意圖不一致的鎖存器,則將導致設計錯誤,包括仿真和綜合。因此,在設計中需要避免產生意想不到的鎖存器。如果組合邏輯的語句完全不使用 always 語句塊,就可以保證綜合器不會綜合出鎖存器。
(4)但如果鎖存器和觸發器兩者都由與非門搭建的話,鎖存器耗用的邏輯資源要比D觸發器少(D觸發器需要12個MOS管,鎖存器只需6個MOS管),鎖存器的集成度更高,所以在的ASIC設計中會用到鎖存器。但鎖存器對毛刺敏感,無異步復位端,不能讓芯片在上電時處在確定的狀態;另外,鎖存器會使靜態時序分析變得很複雜,不利於設計的可重用。所以,在ASIC設計中,除了CPU這高速電路,或者RAM這種對面積很敏感的電路,一般不提倡用鎖存器。
鎖存器(Latch)的出現及解決辦法
在基於always的組合邏輯描述語句中容易綜合出鎖存器的地方:
(1)在賦值表達式右邊參與賦值的信號未在always@(敏感電平列表)中列出完整,生成透明鎖存器;
(2)if語句的使用中缺少else語句(前提不是始終時鐘觸發);
(3)case語句沒有給出全部情況。
舉例說明:
(1)時序電路中if...else不完整不會生出latch,而組合邏輯就會產生latch:
左上的電路是時序邏輯,生成觸發器,而觸發器是有使能端(enable)的,使能端無效時就可以保存數據,無需鎖存器。右上的電路是組合邏輯,在enable爲低電平時,輸出q要保持不變,而組合邏輯沒有存儲元件,只能生成鎖存器來保持數據。所以在時序邏輯中,不完整的 if…else… 結構並不會生成鎖存器,而組合邏輯中不完整的 if…else… 結構就會生成鎖存器。爲了避免我們設計的組合邏輯中出現不想要的鎖存器,在使用 if…else… 結構時一定要寫完整。
module ex1(
// input clk,
input enable,data,
output reg q
);
always @(*)
// always @(posedge clk) // 方法1:將鎖存器改爲帶使能的觸發器
begin
// q = 0; // 方法2:給輸出變量賦初始值
if(enable)
q = data;
// else // 方法3:補全if...else語句
// q = 0;
end
endmodule
解決方法:
①將鎖存器改爲帶使能的觸發器(變爲時序電路);
②給輸出變量賦初始值;
③補全if...else語句。
感悟:
①在always模塊內被賦值的每一個信號都必須定義成reg型,但不一定就會生成寄存器。
②組合邏輯一般使用assign語句。
③當組合邏輯使用always模塊時,@(*)或敏感信號列表需寫完整,都屬於電平觸發。另外,if...else以及case情況(必要時加上default)需寫完整,或者輸出狀態賦初始值。
④時序邏輯中“always @(posedge clk)”屬於同步時鐘,而“always @(posedge clk,negedge rst)”屬於同步時鐘,異步復位。
⑤“=”阻塞賦值表示組合邏輯,“<=”非阻塞賦值表示時序邏輯。
另外,可以參考FPGA 中的latch 鎖存器。