(1)競爭與冒險的概念(產生原因)
①信號在組合邏輯電路內部通過連線和邏輯單元時,都有一定的延時。延時的大小與連線的長短和邏輯單元的數目有關,同時還受器件的制造工藝、工作電壓、溫度等條件的影響。此外,信號的高低電平轉換也需要一定的過渡時間。由於存在這兩方面因素,多路信號的電平值發生變化時,在信號變化的瞬間,組合邏輯的輸出有先后順序,並不是同時變化,這種現象叫做競爭。
由於競爭往往會出現一些不正確的尖峰信號,這些尖峰信號稱為“毛刺”。 如果一個組合邏輯電路中有“毛刺”出現,就說明該電路存在“冒險”。
②冒險信號的脈沖寬度很小,常常只有數納秒或數十納秒,其頻帶帶寬可達數百兆赫茲或更寬。在板級調試時,如果示波器的上限頻率較低,會將幅度較大的毛刺顯示為幅度較小的毛刺,甚至不易被察覺。
③冒險按產生形式的不同可以分為靜態冒險和動態冒險兩大類。
·靜態冒險是指輸入有變化,而輸出不應變化時產生的單個窄脈沖;
·動態冒險則指的是輸入變化時,輸出也應變化時產生的冒險。
動態冒險是由靜態冒險引起的,因此存在動態冒險的電路也存在靜態冒險。
④靜態冒險根據產生條件的不同,分為功能冒險和邏輯冒險兩大類。
·當有兩個或兩個以上輸入信號同時產生變化時,在輸出端產生毛刺,這種冒險稱為功能冒險。
·如果只有一個變量產生變化時出現的冒險則是邏輯冒險。
冒險往往會影響到邏輯電路的穩定性,因此要注意冒險的消除。
(2)靜態冒險產生的判斷
①判斷一個邏輯電路在某些輸入信號發生變化時是否會產生冒險,首先要判斷信號是否會同時變化,然后判斷在信號同時變化的時候,是否會產生冒險,這可以通過邏輯函數的卡諾圖或邏輯函數表達式來進行判斷。
②功能冒險的檢查
功能冒險是由電路的邏輯功能引起的,只要輸入信號不是按照循環碼的規律變化,組合邏輯就可能產生功能冒險,且不能通過修改設計加以消除,只能通過對輸出采用時鍾采樣來消除。
③邏輯冒險的檢查
檢查電路是否產生邏輯冒險的方法有兩種:代數法和卡諾圖法。
代數法:
如果一個組合邏輯函數表達式 F,在某些條件下能化簡成F = A+ A或F = AA的形式,在A 產生變化時,就可能產生靜態邏輯冒險。
卡諾圖法:
在組合邏輯的卡諾圖中,若存在素項圈相切,則可能會產生邏輯冒險,如下圖所示的卡諾圖中,AC 和AB兩個素項環相切,在B = C = 1時,A 由1 變為0 時,將產生邏輯冒險:
(3)毛刺的消除
毛刺並不是對所有的輸入都有危害,例如D 觸發器的D 輸入端,只要毛刺不出現在時鍾的上升沿並且滿足數據的建立和保持時間,就不會對系統造成危害,我們可以說D 觸發器的D 輸入端對毛刺不敏感。
根據這個特性,我們應當在系統中盡可能采用同步電路,這是因為同步電路信號的變化都發生在時鍾沿,只要毛刺不出現在時鍾的沿口並且不滿足數據的建立和保持時間,就不會對系統造成危害。(由於毛刺很短,多為幾納秒,基本上都不可能滿足數據的建立和保持時間)因此我們可以通過改變設計,破壞毛刺產生的條件,來減少毛刺的發生。
例如,在數字電路設計中,常常采用格雷碼計數器取代普通的二進制計數器,這是因為格雷碼計數器的輸出每次只有一位跳變,消除了競爭冒險的發生條件,避免了毛刺的產生。
目前,主要有兩種基本的采樣方法:脈沖選擇法和時序邏輯保持法。
①脈沖選擇法
該方法在輸出信號的保持時間內,用一定寬度的高電平脈沖與輸出信號做邏輯“與”運算,由此獲取輸出信號的電平值。
這種方法大大減少毛刺,但它並不能完全消除毛刺,我們通常使用“采樣”的方法。一般說來,冒險出現在信號發生電平轉換的時刻,也就是說在輸出信號的建立時間內會發生冒險,而在輸出信號的保持時間內是不會有毛刺信號出現的。如果在輸出信號的保持時間內對其進行“采樣”,就可以消除毛刺信號的影響。但是這種方法必須產生在合適的時候產生高電平,因此有一定的難度。
②時序邏輯保持法
其利用D 觸發器的D 輸入端對毛刺信號不敏感的特點,在輸出信號的保持時間內,用觸發器讀取組合邏輯的輸出信號,這種方法類似於將異步電路轉化為同步電路。舉例如下:
1 module maoxian( 2 input clk, 3 input A, B, C, D, 4 output reg Out, 5 output Tout 6 ); 7 8 wire aandb, candd, tmp; 9 10 assign aandb = A && B; 11 assign candd = C && D; 12 assign tmp = aandb || candd; 13 14 15 always @(posedge clk) begin 16 Out <= tmp; 17 end 18 19 assign Tout = tmp; 20 21 endmodule