1. 程式人生 > 實用技巧 >時序分析基礎:Setup/hold,跨時鐘域處理和亞穩態

時序分析基礎:Setup/hold,跨時鐘域處理和亞穩態

一、 建立時間和保持時間Setup/hold

部落格https://blog.csdn.net/seuwilson/article/details/52383184中大佬描述的很詳細。建立時間Tsetup是觸發器的時鐘訊號上升沿到來之前,資料必須保持穩定的時間;保持時間Thold是觸發器的時鐘訊號上升沿到來之後,資料還需保持不變的時間。如下圖

Tsetup和Thold內資料都穩定時,data1和data2才會正常被D觸發器取樣

二、 什麼是亞穩態

百度百科上說亞穩態是指觸發器無法在某個規定時間段內達到一個可確認的狀態。當一個觸發器進入亞穩態時,既無法預測該單元的輸出電平,也無法預測何時輸出才能穩定在某個正確的電平上。

講人話就是,亞穩態就是在建立時間或保持時間裡資料處於不夠穩定的狀態、正在變化的狀態,下面以單bit跨時鐘域處理為例子。

三、 單bit跨時鐘域中的亞穩態處理

先說什麼是時鐘域,打個比方,FPGA的主控晶片工作在系統時鐘之下,系統時鐘由晶振產生為50MHz,如果不分頻,板內的所有資源都工作在系統時鐘之下,那麼這就是一個時鐘域clk_a。同一個時鐘域下的訊號,綜合以及佈線工具可以在data路徑或者clock路徑上插入buffer使得每一個D觸發器的setup/hold時間都滿足,這個時候可以簡化一下模型,把系統時鐘看成clk_a域的理想時鐘,並在時鐘上升沿D觸發器取樣(實際上是建立時間這個時間段取樣的)。

那麼當另一個時鐘域的訊號data_b來了(一般是外設的標誌位或者資料組),就是跨時鐘域了,就可能發生下圖情況。

這時就產生了亞穩態,這個資料是不穩定的,可能取樣到0,也可能取樣到1。可能會導致訊號毛刺、邏輯判斷混亂、振盪等問題。

消除亞穩態有三種方法,一是用多級DFF來延時,俗稱打兩拍。

打一拍的verlog程式碼如下

always@(posedge clk or negedge rst_n)

if(!rst_n)

       data_r<=0;

else

       data_r<=data_b;
View Code

這樣就會發生下圖情況

在時鐘的上升沿對clk_b域的data_b取樣,並將其值賦給clk_a域的data_r。亞穩態判讀出的是1值,data_r就像上圖中的data_r,是一個穩態值,亞穩態已經消去;亞穩態判讀出的是0值,data_r就像上圖中的data_r‘,也是一個穩態值,亞穩態已經消去。之後可以用data_r做判斷了。這樣打一拍能消去85%的亞穩態,打兩拍能消去99%的亞穩態。

打兩拍的程式碼如下

always@(posedge clk or negedge rst_n)

if(!rst_n)

begin

       data_r<=0;

    data_r1<=0;

end

else

begin

       data_r<=data_b;

       data_r1<=data_r;

end
View Code

如果是多bit跨時鐘域處理一般用非同步fifo或非同步RAM處理,高速環境下的多bit跨時鐘域處理一般用格雷碼處理,可以看這篇文章http://dengkanwen.com/238.html