關於鎖存器、觸發器、寄存器

一、鎖存器(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 鎖存器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章