1 引言
基於FPGA的數字系統設計中大都推薦採用同步時序的設計,也就是單時鐘系統。但是實際的工程中,純粹單時鐘系統設計的情況很少,特別是設計模塊與外圍晶片的通信中,跨時鐘域的情況經常不可避免。如果對跨時鐘域帶來的亞穩態、採樣丟失、潛在邏輯錯誤等等一系列問題處理不當,將導致系統無法運行。本文總結出了幾種同步策略來解決跨時鐘域問題。
2 異步設計中的亞穩態
觸發器是FPGA設計中最常用的基本器件。觸發器工作過程中存在數據的建立(setup)和保持(hold)時間。對於使用上升沿觸發的觸發器來說,建立時間就是在時鐘上升沿到來之前,觸發器數據端數據保持穩定的最小時間。而保持時間是時鐘上升沿到來之後,觸發器數據端數據還應該繼續保持穩定的最小時間。我們把這段時間成為setup-hold時間(如圖1所示)。在這個時間參數內,輸入信號在時鐘的上升沿是不允許發生變化的。如果輸入信號在這段時間內發生了變化,輸出結果將是不可知的,即亞穩態 (Metastability)。
一個信號在過渡到另一個時鐘域時,如果僅僅用一個觸發器將其鎖存,那麼採樣的結果將可能是亞穩態。這也就是信號在跨時鐘域時應該注意的問題。如圖2所示。
信號dat經過一個鎖存器的輸出數據為a_dat。用時鐘b_clk進行採樣的時候,如果a_dat正好在b_clk的setup-hold時間內發生變化,此時b_ dat就既不是邏輯「1」,也不是邏輯「0」,而是處於中間狀態。經過一段時間之後,有可能回升到高電平,也有可能降低到低電平。輸出信號處於中間狀態到恢復為邏輯「1」或邏輯「0」的這段時間,我們稱之為亞穩態時間。
觸發器進入亞穩態的時間可以用參數MTBF(Mean Time Between Failures)來描述,MTBF即觸發器採樣失敗的時間間隔,表示為:
其中fclock表示系統時鐘頻率,fdata代表異步輸入信號的頻率,tmet代表不會引起故障的最長亞穩態時間,C1和C2分別為與器件特性相關的常數。如果MTBF很大,就認為這個設計在實際工作中是能夠正常運行的,不會因為亞穩態導致整個系統的失效。當觸發器處於亞穩態,且處於亞穩態的時間超過了一個時鐘周期,這種不確定的狀態還會影響到下一級的觸發器,最終導致連鎖反應,從而使整個系統功能失常。
3 同步策略
在異步設計中,完全避免亞穩態是不可能的。因此,設計的基本思路應該是:首先儘可能減少出現亞穩態的可能性,其次是儘可能減少出現亞穩態並給系統帶來危害的可能性。以下是根據實際工作總結出來的幾種同步策略。
3.1 雙鎖存器法
為了避免進入亞穩態,應當使參數MTBF儘可能大。通常採用的方法是雙鎖存器法,即在一個信號進入另一個時鐘域之前,將該信號用兩個鎖存器連續鎖存兩次(如圖3所示)。理論研究表明這種設計可以將出現亞穩態的機率降低到一個很小的程度,但這種方法同時帶來了對輸入信號的一級延時,需要在設計時鐘的時候加以注意。
對於上面的雙鎖存器法,如果a_clk的頻率比b_clk的頻率高,將可能出現因為dat變化太快,而使b_clk無法採樣的問題。即在信號從快時鐘域向慢時鐘域過渡的時候,如果信號變化太快,慢時鐘將可能無法對該信號進行正確的採樣,所以在使用雙鎖存器法的時候,應該使原始信號保持足夠長的時間,以便另一個時鐘域的鎖存器可以正確地對其進行採樣。