跨時鐘域傳輸總結

2021-10-24 05:43:29 字數 2587 閱讀 7081

多 bit 傳輸

雖然以前也看過一些關於跨時鐘域傳輸(下稱cdc)的文章,但那時由於認識所限,對於不同型別的cdc更像是照本宣科,沒有進行深入的思考。現在看的資料多了,再回過頭來看這些關於cdc的文章,又有新的收穫。因此決定寫一篇部落格總結一下我目前對於cdc的理解。

強烈推薦大家先看ic_learner的這篇關於cdc的文章:

講得非常全面,我的總結會以這篇文章為基礎,做一些引申和補充。

首先明確一點:組合邏輯中的競爭與冒險會導致電路**現毛刺,因此我們採用時序邏輯來過濾掉這些毛刺,避免其直接對電路的輸出產生影響。只要我們使用了滿足時序約束的時序電路,因組合邏輯的競爭與冒險而產生的毛刺是一定不會被傳輸到下一級的。

然而時序邏輯的使用也帶來了這樣乙個約束:時鐘取樣時必須滿足建立時間和保持時間的要求,否則就會使得取樣到的資料進入亞穩態。

參見下圖,傳統的同步時鐘域中的各個時鐘要麼是同頻的,要麼是不同頻但有固定的相位關係的。對於這種情況,只要保證資料滿足建立時間和保持時間的要求,那麼就一定不會產生亞穩態。

然而對於非同步時鐘域,寫時鐘和讀時鐘之間沒有固定的相位關係,那麼如果不採取任何措施,隨著工作時間的推移,電路中就一定會出現亞穩態。在讀時鐘的每個時鐘有效沿,產生亞穩態的概率為:(建立時間 + 保持時間) / 時鐘週期。亞穩態有可能會被下一級的暫存器捕捉到,再傳遞向更下一級的各模組,造成亞穩態的傳播,這是我們所不能容忍的。因此,我們必須採取某些措施來防止亞穩態傳播向下一級。

對於單 bit 資料的傳輸,我們的關注點主要在這兩個方面:

如何保證資料被檢測到?

如何防止出現亞穩態?

單 bit 的資料很多都是控制訊號,保證其能夠傳輸到下一級,正確地傳輸到下一級是十分重要的。

保證資料被檢測到,也即是保證資料能順利地從乙個時鐘域被傳輸到另乙個時鐘域。對於慢時鐘域對快時鐘域的傳輸,快時鐘域的時鐘是一定可以檢測到慢時鐘域想要傳輸的資料的,如下圖所示,因此可以不用擔心這些問題。

對於快時鐘域向慢時鐘域的傳輸,是無法保證慢時鐘域一定可以取樣到快時鐘域想要傳輸的資料的。比如說下圖的這種情況,clk1的第2個上公升沿把 signal 拉高,與 clk1 處於同乙個時鐘域的慢時鐘 clk2就剛好錯過了這個 signal ,造成了資料的漏採。

為了防止出現漏採,在快時鐘域向慢時鐘域進行傳輸時,我們通常採用的方式是對想要傳輸的資料進行展寬,具體步驟為:

快時鐘域檢測到將要傳輸的 data_a,產生乙個展寬訊號 pulse_a。

慢時鐘域檢測到 pulse_a,將 pulse_a 在慢時鐘域打兩拍後生成的 pulse_b_rr 輸出。

快時鐘域檢測到 pulse_b_rr 為高電平,將其在快時鐘域打兩拍,生成 pulse_a_rr。

快時鐘域檢測到 pulse_a_rr 被拉高,知道傳輸已經結束了,於是拉低展寬訊號 pulse_a,傳輸結束。

具體的**請見這篇部落格。

ic_learner 的部落格中的展寬方式與上面講的稍有不同,但他們的思想是相同的。

上面說到了,非同步時鐘域的資料傳輸不可避免地會出現亞穩態。亞穩態在讀時鐘的有效沿產生,持續時間不定。但如果我們給資料乙個週期的時間緩衝,等到下個讀時鐘的有效沿再對資料進行取樣,那麼這次取樣到亞穩態的概率就會大大減小。如果給資料兩個週期的時間緩衝,那麼取樣到亞穩態的概率就會更小。這就是我們避免亞穩態傳播的第乙個方法:電平同步器。

clk2 接收到 clk1 發來的資料後並不直接輸出,而是使用兩級暫存器打兩拍後再輸出,大大降低了輸出亞穩態的概率。

如果仔細觀察,就會發現上面的例子往往僅適用於單 bit 傳輸。對於多 bit 傳輸,有以下幾種方法:

使用非同步 fifo 可以很好地解決多 bit 資料跨時鐘域傳輸的問題。由於 fifo 本身有儲存功能,因此如果寫時鐘域是快時鐘域,讀時鐘域沒採到的那些資料也會存在 fifo 裡,就不用擔心漏採的問題了。

需要注意的一點就是非同步 fifo 中判斷空滿時位址資料也要進行讀寫時鐘域之間的相互傳輸,這時候要先將位址轉換為格雷碼,防止空滿判斷出現錯誤。

握手法的基本流程可以概括為:

寫時鐘域傳送乙個開始訊號,讀時鐘域檢測到後準備進行資料傳輸。

進行寫時鐘域向讀時鐘域的資料傳輸,這個過程可以是序列的,也可以是並行的。

資料傳輸完畢後,讀時鐘域向寫時鐘域傳送乙個 ack 訊號,表示自己已經成功收到了資料。

寫時鐘域停止本次資料傳輸,等待下一次的資料傳輸。

準備進行資料傳輸時,讀時鐘域檢測到寫時鐘域的開始訊號,可能也需要向寫時鐘域返回乙個開始的反饋訊號。這是乙個兩個時鐘域之間進行互動的方法,因此被稱為握手法。

也有人認為非同步時鐘域中多 bit 資料的傳輸也可以採用打兩拍的方式,前提是資料要提前轉換為格雷碼。

更正:這種說法不完全對,具體請看我的這篇文章。

跨時鐘域處理

需要做的事情 使能訊號txe to eth由時鐘122.88m時鐘輸出 另一使能訊號vde dv由25m時鐘輸出,計算兩個使能訊號之間的時間間隔,即兩個訊號上公升沿之間的時鐘計數。由於兩個訊號屬於不同的時鐘域,因此要先進行跨時鐘域處理,這裡對vde dv進行處理 在122.88m時鐘下將vde dv...

跨時鐘域處理

討論 今天華為面試題 非同步fifo讀時鐘是寫時鐘的100倍,或者寫是讀的100倍會出現什麼問題?今天華為面試題 非同步fifo讀時鐘是寫時鐘的100倍,或者寫是讀的100倍會出現什麼問題?答得 如果是瞬態資料中間有足夠間隔,則不會出現問題。如果是連續資料,則很快輸出空滿標誌位。面試官不滿意,請教下...

FIFO跨時鐘域讀寫

今天面試,要走時問了我乙個問題 如果兩個時鐘乙個時鐘慢乙個時鐘快,來讀寫fifo,其中讀出的資料是 連續的一段一段的。圖1 圖1為寫時序控制,可以看出資料是兩個時鐘週期的長度,當然實際中可以是任意週期的長度。圖2 圖2為讀時序,ren使能的長度也可以是任意,但是我以為一點是必須保證的,那就是讀寫資料...