|
消除組合邏輯的毛刺 本文節選自特權同學的圖書《FPGA設計實戰演練(邏輯篇)》 配套例程下載鏈接:http://pan.baidu.com/s/1pJ5bCtt 在章節3.2的最后部分對于組合邏輯和時序邏輯的基本概念做了較詳細的介紹,并且列舉了一個實例說明時序邏輯在大多數設計中更由于組合邏輯。組合邏輯在實際應用中,的確存在很多讓設計者頭疼的隱患,例如這里要說的毛刺。(特權同學,版權所有) 任何信號在FPGA器件內部通過連線和邏輯單元時,都有一定的延時,正是我們通常所說的走線延時和門延時。延時的大小與連線的長短和邏輯單元的數目有關,同時還受器件本身的制造工藝、工作電壓、溫度等條件的影響。信號的高低電平轉換也需要一定的上升或下降時間。由于存在這些因素的影響,多個信號的電平值發生變化時,在信號變化的瞬間,組合邏輯的輸出并非同時,而是有先有后,因此往往會出現一些不正確的信號,例如一些很小的脈沖尖峰信號,我們稱之為“毛刺”。如果一個組合邏輯電路中有毛刺出現,就說明該電路存在“冒險”。(特權同學,版權所有) 下面我們可以列舉一個簡單例子來看看毛刺現象是如何產生和消除的。如圖5.14所示,這里在圖5.10所示實例的基礎上對這個組合邏輯的各條走線延時和邏輯門延時做了標記。每個門延時的時間是2ns,而不同的走線延時略有不同。(特權同學,版權所有)
圖5.14 組合邏輯路徑的延時標記 在這個實例模型中,我們不難計算出輸入信號a、b、c、d、e從輸入到輸出信號y所經過的延時。通過計算,可以得到a、b、c信號到達輸出y的延時是12ns,d到達輸出y的延時是9ns,而e到達輸出y的延時是7ns。從這些傳輸延時中,我們可以推斷出,在第一個輸入信號到達輸出端y之前,輸出y將保持原來的結果;而在最后一個輸入信號到達輸出端之后,輸出y將獲得我們期望的新的結果。從本實例來看,7ns之前輸出y保持原結果,12ns之后輸出y獲得新的結果。那么這里就存在一個問題,在7ns和12ns之間的這5ns時間內,輸入y將會是什么狀態呢? 如圖5.15所示,這里列舉一種出現毛刺的情況。假設在0ns以前,輸入信號a、b、c、d、e取值均為0,此時輸出y=1;在0ns時,b、c、d由0變化為1,輸出y=1。在理想情況下,輸出y應該一直保持1不變。但從我們的延時模型來看,實際上在9ns到12ns期間,輸出y有短暫的低脈沖出現,這不是電路應該的狀態,它也就是這個組合邏輯的毛刺。(特權同學,版權所有)
圖5.15 邏輯延時波形 既然我們的多個輸入信號的變化前后取值都保持高電平,那么這個低脈沖的毛刺其實不是我們希望看到的,也很可能在后續電路中這個毛刺導致后續的采集出現錯誤,甚至使得一些功能被誤觸發。(特權同學,版權所有) 好了,言歸正傳,要消除這個毛刺,通常有兩個辦法,一個辦法是硬辦法,如果在y信號上并聯一個電容,便可輕松的將這類脈沖寬度很小的干擾濾除。但是,我們現在是在FPGA器件內部,還真沒有這樣的條件和可能性這么處理,那么只能放棄這種方案。另一種辦法其實也就是引入時序邏輯,用寄存器多輸出信號打一拍,這其實也是時序邏輯明顯優于組合邏輯的特性。(特權同學,版權所有) 如圖5.16所示,在原有組合邏輯的基礎上,我們添加了一個寄存器用于鎖存最終的輸出信號y。(特權同學,版權所有)
圖5.16 寄存器鎖存組合邏輯輸出 如圖5.17所示,在引入了寄存器后,新的最終的輸出yreg不再隨意的改變,而是在每個時鐘clk的上升沿鎖存當前的輸出值。(特權同學,版權所有)
圖5.17 寄存器鎖存波形 引入時序邏輯后,并不是說完全就不會產生錯誤的數據采集或鎖存。在時序邏輯中,我們只要遵循一定的規則就可以避免很多問題,如保證時鐘clk有效沿前后的數據建立時間和保持時間內待采集的數據是穩定的。(特權同學,版權所有) |