本文移植於tutortecho 2019年12月13日 撰寫
網路上有非常多討論 meta stable 的文章
甚至有一些書還將此觀念大作文章
但其實所謂的 metastable(亞穩態)並沒有那麼複雜
與其看大篇的文字不如直接看下圖

有兩個 D flip-flop
分別由兩個不同的 clk 所驅動(並不一定誰的頻率快誰慢)
當 adat 隨著 aclk 產生一個 cycle 的訊號時
bclk 需要在一個 cycle 內將訊號鎖進 DFF
但由於兩個 clk frequency 不同
當 adat 在最後拉為0的瞬間時 (圖 data changing)
bclk 發生 positive trigger 將要把值鎖進 DFF
由於 adat 的訊號驟降讓 bDFF 沒有足夠的準備時間來完成鎖值
此時就會發生 meta stable (亞穩態)
至於什麼叫做沒有足夠的準備時間
其實 Flip-flop 這個元件其實是由許多 Cmos 所組成
C mos 要儲存值就需要足夠的"充電"時間
我們通常會把這段所需的時間叫做 setup time
所以到底是什麼造成 meta stable (亞穩態)
meta stable (亞穩態)指的就是訊號在某段時間內不能保證為1或是為0
如下圖

當 bdat1 處於 meta stable 時
後面如果分接到三個 not gate
我們根本不能保證每個 not gate 的輸出會是高電位還是低電位
因為他們的輸入源處於 metastable
所以輸入的電流不穩定
有的 gate 認為接收到的是高電位
有的卻認為接收到低電位
當 bdat1 接到多個組合電路(combination circuit)時
電路的功能就可能會出錯造系系統故障
所以這種 clock domain crossing (跨時脈域)的問題勢必要解決的
解決的方法其實並不難
如下圖
只要在 bdat1 後面不要接上任何組合電路
直接再接一級由 bclk 所驅動的 DFF 即可

這種方法叫做 two flip-flop synchronizer
從圖中可看到 bdat2 的值可確定為1
後面的組合電路也就正常運作了
此方法為最重要的觀念
之後探討的 qualifier、asynchronous FIFO 都是使用相同的解決方式來進行

發表留言