個人疑惑
在學習 “跨時鐘域的亞穩態的應對措施” 時,常會看到有三種解決方案:
單bit信號,用:打兩拍
多bit信號,用:異步FIFO
多bit信號,用:格雷碼
多bit信號,用:握手
記是記住了,但我有好幾個疑惑一直沒理解,網上沖浪卻搜不到答案、還是非常困惑…
以下是我的疑惑:
為什么用“打兩拍”來應對跨時鐘域的亞穩態,“打一拍” 不行嗎?
為什么說,用“打兩拍”只是降低了亞穩態的概率,但也有可能導致亞穩態的傳遞呢?
若后接了個FF,隨著posedge clk的出現,觸發器不應該直接就采到0或1了嗎,為啥亞穩態還有一定概率傳遞呢?
假設是DFF(D觸發器),其亞穩態穩定后的值,會恢復為正確的預期輸出值嗎?還是就算穩定了也是無效輸出?
即使 “打兩拍”能阻止“亞穩態的傳遞”,但亞穩態導致后續FF sample到的值依然不一定是符合預期的值,那 “錯誤的值” 難道不依然會向后傳遞,從而造成錯誤的后果嗎?
多bit的跨時鐘域情況用 異步FIFO處理,好理解;格雷碼有啥用嘞?
格雷碼可以讓相鄰二進制數變化只改變1位,但在多bit的data傳輸過程中,data value不都是隨機變化么,格雷碼有啥用嘞?
主要是前面關于打兩拍的疑惑,網上沖浪找不到解答的帖子。
網上只有兩個核心的回答,但對我這樣的數電小白,完全是沒有回答到我個人解惑的點子上,但解惑后再看,會有新的收獲:
打兩拍的目的:第一拍是異步信號轉同步,第二拍是防止亞穩態的傳遞。
我聽了還是很迷。( ̄▽ ̄)"
打一拍和打兩拍和打三拍的區別:用觸發器進入亞穩態的平均故障時間間隔MTBF進行計算,證明打拍數增加,產生亞穩態的可能性遞減:打一拍直接用,很可能出現亞穩態輸出;打兩拍再直接用,出現亞穩態的概率是109年出現一次(具體計算參數見reference);打三拍再直接俄用,出現的概率更低,但是除非超高頻率不然沒必要。
可見reference:跨時鐘域同步,為什么兩級寄存器結構能夠降低亞穩態?
那我個人疑惑呢,最后在外網 stack exchange 上解答了——這個老哥居然和我的疑問一毛一樣!實在是欣慰,久旱逢甘霖…( ̄▽ ̄)"
Stack Exchange上的回答:How does 2-ff synchronizer ensure proper synchonization?
(不知為什么用firefox不顯示問題圖片,用chrome才顯示圖片…)
于是,我打算用自己的話,記錄一下它的問題與回答,也回答我個人的疑惑~
概念補充
什么是亞穩態 metastable state?
首先要闡述一下亞穩態的概念。
元器件在現實運行時,觸發器輸出的邏輯0/1需要時間跳變,而不是瞬發的。因此,若未滿足此cell的建立時間、保持時間,其輸出值則為中間態,那在logic上可能算成0也可能算成1很難講(波形顯示上可能是毛刺、振蕩、固定值等),這就是亞穩態。
一般波形圖像上,1是高電平,0是低電平;但微觀的亞穩態波形如下:
如圖所示:亞穩態的輸出波形會卡在中間,過一段時間后,可能穩定成1,也可能穩定成0,但都和原預期值沒啥關系了,是無效的!
單bit信號,應用“打兩拍”的電路結構圖
這張圖,給出了兩個點:
“打兩拍”后可以直接接組合邏輯電路。
我之前以為后面必接時序電路,相當于后面的電路也是觸發器,于是產生了:“把打兩拍改成打一拍,算上后面的時序電路,不也是相當于打兩拍嗎” 這樣的愚蠢困惑…( ̄▽ ̄)"
下方的波形給了“打兩拍能大概率防止亞穩態傳遞”的圖示:
由于異步data變的太突然,第一拍sample后出現亞穩態,第三拍sample后把亞穩態堵住了,得到正常電平(但值不一定和原預期相同)。
解惑環節
綜上,可以解答我之前的3個疑惑了:
為什么用“打兩拍”來應對跨時鐘域的亞穩態,“打一拍” 不行嗎?
如打兩拍的電路結構圖所示:打一拍的話,若第一拍sample到亞穩態,則后續組合邏輯電路的輸入直接就是亞穩態波形,肯定會把亞穩態傳遞下去,就完犢子了。
為什么說,用“打兩拍”只是降低了亞穩態的概率,但也有可能導致亞穩態的傳遞呢?
如前面的兩張亞穩態的波形所示,亞穩態如果在1T內穩定成高電平或低電平了(概率80%),那第2拍就sample到正常的0或1;若亞穩態1T最后還是中間態,那第2拍還是可能出現亞穩態的,但概率低。
亞穩態穩定需要多久,具體時間由工藝決定。
假設是DFF(D觸發器),其亞穩態穩定后的值,會恢復為正確的預期輸出值嗎?還是就算穩定了也是無效輸出?
如前面的亞穩態微觀波形所說:即使亞穩態穩定了,值也無效。
剩下倆疑惑,大頭講。見下文。
打兩拍的sample到錯誤數據怎么辦
sample亞穩態,結果可能多樣
sample亞穩態,得到的結果可能取決于亞穩態最后穩定于什么狀態,如下圖表示出各種sample的可能:
如圖所示,adat是實際的異步data、bq1_dat是兩級觸發器中的第一個寄存器sample的數據、bq2_dat是第二個寄存器sanple到的數據,bclk是同步時鐘。
則:
a)中,異步data持續2T;FF1 sample到亞穩態時,FF2在下一cycle 對亞穩態的sample是0;但最終sample到了正確的data值。
b)中,異步data持續2T;FF1 sample到亞穩態時,FF2在下一cycle 對亞穩態的sample是1;但最終sample到了正確的data值。
c)中,異步data馬上結束,等價于只持續1T(相當于沒sample到就錯過了);FF1 sample到亞穩態時,FF2在下一cycle 對亞穩態的sample是1;運氣好,最終sample到了正確的data值。
d)中,異步data馬上結束,等價于只持續1T;FF1 sample到亞穩態時,FF2在下一cycle 對亞穩態的sample是0;相當于最終錯過了data值,沒sample到…
那咋辦,豈不是說明“打兩拍”的方法不行???
答案:
因為 “打兩拍” 的目的,是為了在單bit傳輸時,盡可能的防止亞穩態的傳遞,至于這個sample的正確性,本來就不是重點。這種“sample的正確性如何保證”得根據信號的具體類型、目的、應用場景,來進行具體的討論。
Trigger Signals:一個脈沖信號,用來開機、啟動什么的。它沒什么數據信息量,早一個clk、晚一個clk都ok,反正能起作用就行。那上面這個問題就無所謂了。唯一要保證的是,原始異步脈沖信號至少保持2T!(保證打兩拍后,能sample到有效信號)
Control Buses:因為有多bit數據需要進行同步,關系比較復雜。那就不能用 “打兩拍” 的方法,得用 “握手機制“。
Data Buses:這種情況,非常在乎上面提到的正確性問題。所以就 更不應該用 ”打兩拍“方法,得用 異步FIFO的好吧… 在異步FIFO中的指針使用格雷碼,可以降低指針在跳變時出現的亞穩態風險、冒險現象。也就說,格雷碼和異步FIFO是結合使用的… ( ̄▽ ̄)"
總結
當你在乎跨時鐘域 “用打兩拍解決亞穩態,導致后續sample可能未sample到正確結果” 的case,那就不該用 “打兩拍” 的方案,可以考慮異步FIFO和握手機制!而格雷碼,和異步FIFO是聯合使用的。
“打兩拍”的方法,若應用于“從快速時鐘域同步到慢速時鐘域”,數據得多保持幾T,不然會漏采數據。
審核編輯 :李倩
-
邏輯電路
+關注
關注
13文章
494瀏覽量
42632 -
亞穩態
+關注
關注
0文章
46瀏覽量
13290
原文標題:跨時鐘域的亞穩態處理、為什么要打兩拍不是打一拍、為什么打兩拍能有效?
文章出處:【微信號:Hack電子,微信公眾號:Hack電子】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論