Title: 跨時(shí)鐘域的亞穩(wěn)態(tài)處理、為什么要打兩拍不是打一拍、為什么打兩拍能有效?
-
前言
個(gè)人顏色習(xí)慣:
黑色加粗:突出顯示;
紅色:重要;
洋紅色:產(chǎn)生的疑問(wèn) question;
藍(lán)色:個(gè)人思考 或 針對(duì)問(wèn)題的Solution
1 個(gè)人疑惑
在學(xué)習(xí) “跨時(shí)鐘域的亞穩(wěn)態(tài)的應(yīng)對(duì)措施” 時(shí),常會(huì)看到有三種解決方案:
- 單bit信號(hào),用:打兩拍
- 多bit信號(hào),用:異步FIFO
- 多bit信號(hào),用:格雷碼
- 多bit信號(hào),用:握手
記是記住了,但我有好幾個(gè)疑惑一直沒(méi)理解,網(wǎng)上沖浪卻搜不到答案、還是非常困惑…
以下是我的疑惑:
-
為什么用“打兩拍”來(lái)應(yīng)對(duì)跨時(shí)鐘域的亞穩(wěn)態(tài),“打一拍” 不行嗎?
-
為什么說(shuō),用“打兩拍”只是降低了亞穩(wěn)態(tài)的概率,但也有可能導(dǎo)致亞穩(wěn)態(tài)的傳遞呢?
若后接了個(gè)FF,隨著posedge clk的出現(xiàn),觸發(fā)器不應(yīng)該直接就采到0或1了嗎,為啥亞穩(wěn)態(tài)還有一定概率傳遞呢?
-
假設(shè)是DFF(D觸發(fā)器),其亞穩(wěn)態(tài)穩(wěn)定后的值,會(huì)恢復(fù)為正確的預(yù)期輸出值嗎? 還是就算穩(wěn)定了也是無(wú)效輸出?
-
即使 “打兩拍”能阻止“亞穩(wěn)態(tài)的傳遞”,但亞穩(wěn)態(tài)導(dǎo)致后續(xù)FF sample到的值依然不一定是符合預(yù)期的值,那 “錯(cuò)誤的值” 難道不依然會(huì)向后傳遞,從而造成錯(cuò)誤的后果嗎?
-
多bit的跨時(shí)鐘域情況用 異步FIFO處理,好理解;格雷碼有啥用嘞?
格雷碼可以讓相鄰二進(jìn)制數(shù)變化只改變1位,但在多bit的data傳輸過(guò)程中,data value不都是隨機(jī)變化么,格雷碼有啥用嘞?
主要是前面關(guān)于打兩拍的疑惑,網(wǎng)上沖浪找不到解答的帖子。
網(wǎng)上只有兩個(gè)核心的回答,但對(duì)我這樣的數(shù)電小白,完全是沒(méi)有回答到我個(gè)人解惑的點(diǎn)子上,但解惑后再看,會(huì)有新的收獲:
-
打兩拍的目的:第一拍是異步信號(hào)轉(zhuǎn)同步,第二拍是防止亞穩(wěn)態(tài)的傳遞。
我聽(tīng)了還是很迷。( ̄▽ ̄)"
-
打一拍和打兩拍和打三拍的區(qū)別:用觸發(fā)器進(jìn)入亞穩(wěn)態(tài)的平均故障時(shí)間間隔MTBF進(jìn)行計(jì)算,證明打拍數(shù)增加,產(chǎn)生亞穩(wěn)態(tài)的可能性遞減:打一拍直接用,很可能出現(xiàn)亞穩(wěn)態(tài)輸出;打兩拍再直接用,出現(xiàn)亞穩(wěn)態(tài)的概率是109年出現(xiàn)一次(具體計(jì)算參數(shù)見(jiàn)reference);打三拍再直接俄用,出現(xiàn)的概率更低,但是除非超高頻率不然沒(méi)必要。
可見(jiàn)reference:跨時(shí)鐘域同步,為什么兩級(jí)寄存器結(jié)構(gòu)能夠降低亞穩(wěn)態(tài)? —— 知乎 龔黎明
那我個(gè)人疑惑呢,最后在外網(wǎng) stack exchange 上解答了——這個(gè)老哥居然和我的疑問(wèn)一毛一樣! 實(shí)在是欣慰,久旱逢甘霖…( ̄▽ ̄)"
Stack Exchange上的回答:How does 2-ff synchronizer ensure proper synchonization?
(不知為什么用firefox不顯示問(wèn)題圖片,用chrome才顯示圖片…)
于是,我打算用自己的話,記錄一下它的問(wèn)題與回答,也回答我個(gè)人的疑惑~
2 概念補(bǔ)充
什么是亞穩(wěn)態(tài) metastable state?
首先要闡述一下亞穩(wěn)態(tài)的概念。
元器件在現(xiàn)實(shí)運(yùn)行時(shí),觸發(fā)器輸出的邏輯0/1需要時(shí)間跳變,而不是瞬發(fā)的。因此,若未滿足此cell的建立時(shí)間、保持時(shí)間,其輸出值則為中間態(tài),那在logic上可能算成0也可能算成1很難講(波形顯示上可能是毛刺、振蕩、固定值等),這就是亞穩(wěn)態(tài)。
一般波形圖像上,1是高電平,0是低電平;但微觀的亞穩(wěn)態(tài)波形如下:
如圖所示:亞穩(wěn)態(tài)的輸出波形會(huì)卡在中間,過(guò)一段時(shí)間后,可能穩(wěn)定成1,也可能穩(wěn)定成0,但都和原預(yù)期值沒(méi)啥關(guān)系了,是無(wú)效的!
單bit信號(hào),應(yīng)用“打兩拍”的電路結(jié)構(gòu)圖
這張圖,給出了兩個(gè)點(diǎn):
-
“打兩拍”后可以直接接組合邏輯電路。
我之前以為后面必接時(shí)序電路,相當(dāng)于后面的電路也是觸發(fā)器,于是產(chǎn)生了:“把打兩拍改成打一拍,算上后面的時(shí)序電路,不也是相當(dāng)于打兩拍嗎” 這樣的愚蠢困惑…( ̄▽ ̄)"
-
下方的波形給了“打兩拍能大概率防止亞穩(wěn)態(tài)傳遞”的圖示:
由于異步data變的太突然,第一拍sample后出現(xiàn)亞穩(wěn)態(tài),第三拍sample后把亞穩(wěn)態(tài)堵住了,得到正常電平(但值不一定和原預(yù)期相同)。
3 解惑環(huán)節(jié)
綜上,可以解答我之前的3個(gè)疑惑了:
-
為什么用“打兩拍”來(lái)應(yīng)對(duì)跨時(shí)鐘域的亞穩(wěn)態(tài),“打一拍” 不行嗎?
如打兩拍的電路結(jié)構(gòu)圖所示:打一拍的話,若第一拍sample到亞穩(wěn)態(tài),則后續(xù)組合邏輯電路的輸入直接就是亞穩(wěn)態(tài)波形,肯定會(huì)把亞穩(wěn)態(tài)傳遞下去,就完?duì)僮恿恕?/font>
-
為什么說(shuō),用“打兩拍”只是降低了亞穩(wěn)態(tài)的概率,但也有可能導(dǎo)致亞穩(wěn)態(tài)的傳遞呢?
如前面的兩張亞穩(wěn)態(tài)的波形所示,亞穩(wěn)態(tài)如果在1T內(nèi)穩(wěn)定成高電平或低電平了(概率80%),那第2拍就sample到正常的0或1;若亞穩(wěn)態(tài)1T最后還是中間態(tài),那第2拍還是可能出現(xiàn)亞穩(wěn)態(tài)的,但概率低。
亞穩(wěn)態(tài)穩(wěn)定需要多久,具體時(shí)間由工藝決定。
-
假設(shè)是DFF(D觸發(fā)器),其亞穩(wěn)態(tài)穩(wěn)定后的值,會(huì)恢復(fù)為正確的預(yù)期輸出值嗎? 還是就算穩(wěn)定了也是無(wú)效輸出?
如前面的亞穩(wěn)態(tài)微觀波形所說(shuō):即使亞穩(wěn)態(tài)穩(wěn)定了,值也無(wú)效。
剩下倆疑惑,大頭講。見(jiàn)下文。
打兩拍的sample到錯(cuò)誤數(shù)據(jù)怎么辦
-
sample亞穩(wěn)態(tài),結(jié)果可能多樣
sample亞穩(wěn)態(tài),得到的結(jié)果可能取決于亞穩(wěn)態(tài)最后穩(wěn)定于什么狀態(tài),如下圖表示出各種sample的可能:
如圖所示,adat是實(shí)際的異步data、bq1_dat是兩級(jí)觸發(fā)器中的第一個(gè)寄存器sample的數(shù)據(jù)、bq2_dat是第二個(gè)寄存器sanple到的數(shù)據(jù),bclk是同步時(shí)鐘。
則:
a)中,異步data持續(xù)2T;FF1 sample到亞穩(wěn)態(tài)時(shí),F(xiàn)F2在下一cycle 對(duì)亞穩(wěn)態(tài)的sample是0;但最終sample到了正確的data值。
b)中,異步data持續(xù)2T;FF1 sample到亞穩(wěn)態(tài)時(shí),F(xiàn)F2在下一cycle 對(duì)亞穩(wěn)態(tài)的sample是1;但最終sample到了正確的data值。
c)中,異步data馬上結(jié)束,等價(jià)于只持續(xù)1T(相當(dāng)于沒(méi)sample到就錯(cuò)過(guò)了);FF1 sample到亞穩(wěn)態(tài)時(shí),F(xiàn)F2在下一cycle 對(duì)亞穩(wěn)態(tài)的sample是1;運(yùn)氣好,最終sample到了正確的data值。
d)中,異步data馬上結(jié)束,等價(jià)于只持續(xù)1T;FF1 sample到亞穩(wěn)態(tài)時(shí),F(xiàn)F2在下一cycle 對(duì)亞穩(wěn)態(tài)的sample是0;相當(dāng)于最終錯(cuò)過(guò)了data值,沒(méi)sample到…
那咋辦,豈不是說(shuō)明“打兩拍”的方法不行???
-
答案:
因?yàn)?“打兩拍” 的目的,是為了在單bit傳輸時(shí),盡可能的防止亞穩(wěn)態(tài)的傳遞,至于這個(gè)sample的正確性,本來(lái)就不是重點(diǎn)。這種“sample的正確性如何保證”得根據(jù)信號(hào)的具體類型、目的、應(yīng)用場(chǎng)景,來(lái)進(jìn)行具體的討論。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-816978.html
- Trigger Signals:一個(gè)脈沖信號(hào),用來(lái)開(kāi)機(jī)、啟動(dòng)什么的。它沒(méi)什么數(shù)據(jù)信息量,早一個(gè)clk、晚一個(gè)clk都o(jì)k,反正能起作用就行。那上面這個(gè)問(wèn)題就無(wú)所謂了。唯一要保證的是,原始異步脈沖信號(hào)至少保持2T!(保證打兩拍后,能sample到有效信號(hào))
- Control Buses:因?yàn)橛卸郻it數(shù)據(jù)需要進(jìn)行同步,關(guān)系比較復(fù)雜。那就不能用 “打兩拍” 的方法,得用 “握手機(jī)制“。
- Data Buses:這種情況,非常在乎上面提到的正確性問(wèn)題。所以就 更不應(yīng)該用 ”打兩拍“方法,得用 異步FIFO的好吧… 在異步FIFO中的指針使用格雷碼,可以降低指針在跳變時(shí)出現(xiàn)的亞穩(wěn)態(tài)風(fēng)險(xiǎn)、冒險(xiǎn)現(xiàn)象。也就說(shuō),格雷碼和異步FIFO是結(jié)合使用的… ( ̄▽ ̄)"
-
總結(jié):文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-816978.html
- 當(dāng)你在乎跨時(shí)鐘域 “用打兩拍解決亞穩(wěn)態(tài),導(dǎo)致后續(xù)sample可能未sample到正確結(jié)果” 的case,那就不該用 “打兩拍” 的方案,可以考慮異步FIFO和握手機(jī)制!而格雷碼,和異步FIFO是聯(lián)合使用的。
- “打兩拍”的方法,若應(yīng)用于“從快速時(shí)鐘域同步到慢速時(shí)鐘域”,數(shù)據(jù)得多保持幾T,不然會(huì)漏采數(shù)據(jù)。
到了這里,關(guān)于【Chips】跨時(shí)鐘域的亞穩(wěn)態(tài)處理、為什么要打兩拍不是打一拍、為什么打兩拍能有效?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!