深刻理解跨時鐘域:三個主要問題和解決方案
上圖信號A由C1時鐘域觸發(fā),被C2時鐘域采樣。根據(jù)這兩個時鐘之間的關(guān)系,在將數(shù)據(jù)從源時鐘傳輸?shù)侥繕?biāo)時鐘時,可能會出現(xiàn)不同類型的問題,并且這些問題的解決方案也有所不同。
本文討論了不同類型的跨時鐘域,以及每種類型中可能遇到的問題及其解決方案。在接下來的所有部分中,都直接使用了上圖所示的信號名稱。例如,C1和C2分別表示源時鐘和目標(biāo)時鐘。類似地,A和B分別被用作源觸發(fā)器輸出和目標(biāo)觸發(fā)器輸出。此外,源和目標(biāo)觸發(fā)器被假定為正沿觸發(fā)。
跨時鐘域問題本節(jié)描述了在出現(xiàn)跨時鐘域時可能出現(xiàn)的三個主要問題,然后還描述了這些問題的解決方案。
A.亞穩(wěn)態(tài)問題。如果信號A上的翻轉(zhuǎn)發(fā)生在非常接近時鐘C2的邊沿處,它可能會導(dǎo)致在目標(biāo)觸發(fā)器“FB”處的setup 或hold 違反。結(jié)果,輸出信號B進(jìn)行無限振蕩。因此,輸出是不穩(wěn)定的,在C2的下一個時鐘邊緣到達(dá)之前也可能會穩(wěn)定到某個穩(wěn)定的值。這種現(xiàn)象被稱為亞穩(wěn)態(tài),或者說觸發(fā)器“FB”已經(jīng)進(jìn)入亞穩(wěn)態(tài)。
從設(shè)計的角度來看,亞穩(wěn)態(tài)又會產(chǎn)生以下后果:1、如果不穩(wěn)定的數(shù)據(jù)被輸入到設(shè)計中的其他幾個地方,它可能會導(dǎo)致大電流,在最壞的情況下甚至導(dǎo)致芯片燒壞。2、不同的 fan-out可能會讀取不同的信號值,并可能導(dǎo)致設(shè)計進(jìn)入未知的功能狀態(tài),導(dǎo)致設(shè)計出現(xiàn)功能問題。3、目標(biāo)時鐘域輸出可能穩(wěn)定到新值或返回到舊值。然而,傳播延遲可能很高,會導(dǎo)致時序問題。
如下圖,如果輸入信號A在非常接近C2時鐘的上升沿翻轉(zhuǎn),則目標(biāo)觸發(fā)器的輸出可以是亞穩(wěn)態(tài)的。因此,它可以不穩(wěn)定,并可能最終穩(wěn)定到信號B1和B2所描述的1或0。
可以通過在目標(biāo)域中添加同步器來避免亞穩(wěn)態(tài)問題。同步器允許振蕩在足夠的時間穩(wěn)定下來,并確保在目標(biāo)時鐘域獲得穩(wěn)定的輸出。一個常用的同步器是一個級聯(lián)觸發(fā)器,如下圖所示。
該結(jié)構(gòu)主要用于設(shè)計中的控制信號和單比特數(shù)據(jù)信號。多位的數(shù)據(jù)信號需要其他類型的同步方案,如MUX recirculation、握手和FIFO。
B.數(shù)據(jù)丟失
每當(dāng)生成一個新的源數(shù)據(jù)時,由于亞穩(wěn)態(tài)性,它可能不會在目標(biāo)時鐘的第一個周期中被目標(biāo)域捕獲。只要源信號上的每個翻轉(zhuǎn)都在目標(biāo)域中被捕獲,數(shù)據(jù)就不會丟失。為了確保這一點,源數(shù)據(jù)應(yīng)在一段最短的時間內(nèi)保持穩(wěn)定,以便滿足對目標(biāo)時鐘的至少一個邊沿的setup 和hold 時間的要求。
如果C1和C2的時鐘邊沿非常靠近,則在源數(shù)據(jù)A翻轉(zhuǎn)之后的C2的第一個時鐘邊沿?zé)o法捕獲它。該數(shù)據(jù)最終被時鐘C2的第二個時鐘邊沿捕獲,如下圖所示。?但是,如果在數(shù)據(jù)A翻轉(zhuǎn)和時鐘C2的邊沿之間有足夠的時間,則在C2的第一個周期捕獲數(shù)據(jù)。因此,源時鐘域數(shù)據(jù)和目標(biāo)時鐘域數(shù)據(jù)之間可能不會一一對應(yīng)。無論如何,一般情況下源數(shù)據(jù)上的每個翻轉(zhuǎn)都應(yīng)該在目標(biāo)時鐘域中被捕獲。
假設(shè)源時鐘C1的速度是目標(biāo)時鐘C2的兩倍,并且這兩個時鐘之間沒有相位差。進(jìn)一步假設(shè)在時鐘C1的正邊沿生成的輸入數(shù)據(jù)序列“A”為“00110011”。在時鐘C2的正邊沿捕獲的數(shù)據(jù)B將為“0101”。在這里,由于信號A上的所有翻轉(zhuǎn)都被B捕獲了,所以數(shù)據(jù)不會丟失。但是,如果輸入序列為“00101111”,則目標(biāo)域中的輸出將為“0011”。這里輸入序列中的第三個數(shù)據(jù)值“1”丟失。
為了防止數(shù)據(jù)丟失,數(shù)據(jù)應(yīng)該在源時鐘域中保持足夠長的時間不變,以便在目標(biāo)時鐘域中正確捕獲。換句話說,在源數(shù)據(jù)上的每次轉(zhuǎn)換之后,至少有一個目標(biāo)時鐘邊沿應(yīng)該到達(dá)沒有違反setup或hold的地方,以便在目標(biāo)時鐘域中正確地捕獲源數(shù)據(jù)。
C. 數(shù)據(jù)一致性如前一節(jié)所示,每當(dāng)在源時鐘域中生成新數(shù)據(jù)時,可能需要1個或多個目標(biāo)時鐘周期來捕獲它。考慮這樣一種情況,即多個信號從一個時鐘域傳輸?shù)搅硪粋€時鐘域,并且每個信號使用多級觸發(fā)器同步器分別進(jìn)行同步。如果所有信號同時發(fā)生變化,并且源時鐘和目標(biāo)時鐘邊沿接近,那么一些信號可能在第一個時鐘周期中在目標(biāo)域中被捕獲,而另一些信號可能通過亞穩(wěn)態(tài)在第二個時鐘周期中被捕獲。這可能會導(dǎo)致目標(biāo)端信號上的值組合無效。也就是說,在這種情況下,數(shù)據(jù)的一致性已經(jīng)丟失了。
?如果這些信號一起控制著設(shè)計的某些功能,那么這種無效的狀態(tài)可能會導(dǎo)致功能錯誤。
例如:假設(shè)“00”和“11”是由時鐘C1生成的信號X[0:1]的兩個有效值。最初在X的兩個位上都有一個從1->0的過渡。這兩個轉(zhuǎn)變在第一個周期本身都被時鐘C2捕獲。因此,信號Y變成了“00”。
接下來,在信號X的兩個比特位上都有一個從0->1的轉(zhuǎn)換。在這里,時鐘C2的上升沿接近于信號X的翻轉(zhuǎn)。X[0]上的翻轉(zhuǎn)在第一個時鐘周期中被捕獲,而X[1]上的翻轉(zhuǎn)在C2的第二個時鐘周期中被捕獲。這將導(dǎo)致Y[0:1]上的一個中間值為“10”,這是一個無效的狀態(tài)。在這種情況下,數(shù)據(jù)的一致性丟失了。
在上面的示例中,問題的原因是所有比特沒有在相同的目標(biāo)時鐘周期中捕獲。如果所有比特在同一周期中保留其原始值或更新值,則設(shè)計要么保持原始狀態(tài),要么進(jìn)入正確的新狀態(tài)(參考異步FIFO)。
如果電路的設(shè)計方式是,在將設(shè)計從一種狀態(tài)更改到另一種狀態(tài)時,只需要更改一個位,那么該位將更改為一個新值或者保留原始值。由于所有其他位在這兩種狀態(tài)下都有相同的值,所以在這種情況下,完整的總線要么變?yōu)樾轮?,要么保留原始值?/span>
這反過來又意味著,如果總線是格雷編碼的,那么這個問題將會得到解決,并且將永遠(yuǎn)不會得到一個無效的狀態(tài)。
但是,這僅適用于控制總線,因為無法對數(shù)據(jù)總線進(jìn)行格雷編碼。在這種情況下,可以使用握手、FIFO和MUX recirculation(如下圖)等其他技術(shù)來生成一個公共的控制邏輯來正確地傳輸數(shù)據(jù)。
這里,在源時鐘域中產(chǎn)生的控制信號EN使用多級觸發(fā)器同步器在目標(biāo)域中進(jìn)行同步。同步控制信號EN_Sync驅(qū)動mux的選擇引腳,從而控制總線A所有位的數(shù)據(jù)傳輸。通過這種方式,總線的各個位不會單獨(dú)同步,因此不存在數(shù)據(jù)不一致性。但是,重要的是要確保當(dāng)控制信號被激活時,源域數(shù)據(jù)A[0:1]應(yīng)保持不變。