FPGA中的競爭與冒險
2018-06-25 16:46:52
作者:電氣事業部 鄔若愚 指導:電氣事業部 杜萬金
FPGA(Field-Programmable Gate Array)即現場可編程門陣列,在結構上由邏輯功能塊排列為陣列,并且由可編程的內部連線來連接這些功能塊來實現一定的邏輯功能。
信號在傳輸和處理過程中,通過FPGA內部的連線和邏輯單元時,都有一定的延時。延時的大小和連線的長短,邏輯單元的數目有關,同時也受到器件的制造工藝、工作電壓、溫度等條件的影響,信號的電平轉換也需要一定的過渡時間。造成信號的原變量和反變量狀態改變的時刻不一致,這種現象稱為競爭。
由于競爭而引起電路輸出信號中出現了非預期信號,產生瞬間錯誤的現象稱為冒險。表現為輸出端出現了原設計中沒有的窄脈沖,常稱為毛刺。
圖1 邏輯冒險
即使是在最簡單的邏輯運算中,如果出現多路信號同時跳變的情況,在通過內部走線以后,也一定會產生毛刺。如上圖所示,A、B、C、D四個輸入信號經過布線延時后,高低電平變換不是同時發生的,這導致輸出信號出現了毛刺。
和分立元件不同,FPGA內部不存在寄生電容和電感,所以無法過濾電路中的毛刺,從而使得毛刺將被完整保留下來,并且逐級傳遞,對電路的影響更加突出。冒險往往會影響到邏輯電路的穩定性,而時鐘端口、清零和置位端口對毛刺信號十分敏感,任何一點毛刺都有可能導致系統出錯,因此判斷邏輯電路中是否存在冒險以及如何避免冒險是設計人員必須要考慮的問題。
可以利用冗余項來消除毛刺,函數式和真值表所描述的是靜態邏輯,而競爭則是從一種穩態到另一種穩態的過程。因此競爭是動態過程,它發生在輸入變量變化時。此時,修改卡諾圖,增加多余項,在卡諾圖的兩圓相切處增加一個圓,可以消除邏輯冒險。
也可以通過改變設計,破壞毛刺產生的條件來完成。由于格雷碼計數器的輸出每次都只有一位的跳變,消除了競爭冒險的條件,所以在數字電路的設計過程中往往采用格雷碼計數器來代替普通的二進制計數器來避免毛刺的產生。
毛刺并不是對所有輸入都有危害,例如D觸發器的輸入端,只要毛刺不出現在時鐘的上升沿并且滿足一定時間,就不會對系統造成危害,也就是說D觸發器的D輸入端對毛刺不敏感。根據這個特性我們應該在系統中盡可能的采用同步時鐘,由于毛刺持續時間很短,一般不會滿足數據的建立和保存時間,從而降低毛刺對系統的危害。
但是以上方法并不能完全消除毛刺,所以我們需要采取“采樣”的方法。一般冒險都出現在信號發生電平轉換的時刻,也就是說毛刺是在輸出信號產生的時候出現的,而在輸出信號保持的期間不會有毛刺產生,所以我們可以通過在輸出信號保持期間對其進行采樣,從而消除毛刺的影響。
有兩種基本采樣方法,一種是在輸出信號保持期間,用一定寬度的高電平脈沖與輸出信號做邏輯“與”運算,由此采樣得到輸出信號的電平值。如圖二所示,加入“SAMPLE”采樣信號,從而消除毛刺影響。這種方法的缺點是必須人為的保證SAMPLE信號必須在合適的時間中產生。
圖2 采樣方法一
另一種更常見的方法是利用之前提到的D觸發器的D輸入端對毛刺信號不敏感的特點,在輸出信號的保持時間內,用觸發器讀取組合邏輯的輸出信號,這種方法類似于將異步電路轉化為同步電路。如圖三所示,在電路中增加了采樣時鐘和D觸發器,在時鐘上升沿時進行采樣從而減少毛刺的影響。
圖3 采樣方法二
除此以外消除毛刺還有吸收法和延遲法等。其中吸收法是通過增加輸出濾波完成,但是會破壞輸出波形,因此該方法不宜在中間級使用。延遲法是通過找到產生延遲的支路,加上毛刺寬度的延遲來消除毛刺。
在FPGA設計的時候就應該考慮到毛刺的影響,因此需要注意以下幾點:采用寄存器和觸發器來設計電路,盡量不選用鎖存器,因為鎖存器對毛刺十分敏感;盡量避免隱含RS觸發器的出現,一般要控制輸出被直接反饋到輸入端,采用反饋環路會出現隱含RS觸發器,其對輸入尖峰和假信號很敏感,輸入端有任何變化都有可能使輸出值立刻改變,此時易造成毛刺的產生,導致時序的嚴重混亂;注意譯碼邏輯電路,因為譯碼器和比較器本身會產生尖峰,容易產生毛刺,如果把譯碼器或比較器的輸出直接連到時鐘輸入端或異步清除端,會造成嚴重的后果;每一個模塊中只用一個時鐘,避免使用多時鐘設計,對所有模塊的輸入時鐘、輸入信號、輸出信號都用D觸發器或寄存器進行同步處理,即輸出信號直接來自觸發器或寄存器的輸出端。
毛刺是FPGA設計中不可忽視的問題,只有在設計時就注意避免產生毛刺,后期做好消除毛刺的工作,才能夠解決FPGA競爭冒險的問題,從而增強電路的穩定性和可靠性,并為實際電路的測試帶來方便。