有兩個 D flip-flop
分別由兩個不同的 clk 所驅動(並不一定誰的頻率快誰慢)
當 adat 隨著 aclk 產生一個 cycle 的訊號時
bclk 需要在一個 cycle 內將訊號鎖進 DFF
但由於兩個 clk frequency 不同
當 adat 在最後拉為0的瞬間時
bclk 發生 positive trigger 將要把值鎖進 DFF
由於 adat 的訊號驟降讓 bDFF 沒有足夠的準備時間來完成鎖值
此時就會發生 metastable (亞穩態)
Flip-flop 這個元件其實是由許多 Cmos 所組成
Cmos 要儲存值就需要足夠的"充電"時間
我們通常會把這段所需的時間叫做 setup time
當 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 都是使用相同的解決方式來進行
如上圖
interface 可切分為左半邊 write 端
wdata : write data,寫入資料的bus
wfull : write full, FIFO已經滿的訊號
winc : write data valid,寫入資料的有效訊號
wclk : write clk,寫入端的 clk domain
wrst_n : write rst_n,寫入端clk的rst_n
右半邊的 read 端
rdata : read data,讀取資料的bus
rempty : read empty, FIFO已經空的訊號
rinc : read data enable,讀取一筆資料的有效訊號
rclk : read clk,讀取端的 clk domain
rrst_n : read rst_n,讀取端clk的rst_n
最主要儲存資料的 FIFO memory 可以使用 register 或是 dual port(two clk) sram
wptr 和 rptr 分別是 write pointer 和 read pointer
為了避免 crossing clock domain 造成同時超過一筆訊號 metastable 的情況
wptr 和 rptr 必須要以 gray code 來做轉變
而 wptr 需要經過兩級 read clk domain 的 DFF 傳遞到 read 端
rptr 需要經過兩級 write clk domain 的 DFF 傳遞到 write端
再透過 rq2_wptr 和 rptr 的比較來做出 read empty 訊號
同時也透過 wq2_eptr 和 wptr 的比較來做出 write full 訊號
這樣外部就可以根據這兩個訊號來判斷是否可讀和可寫
在寫入端可以使用一個 and gate 將 winc 和 ~wfull and 起來
以避免外部 overwrite 的狀況
遇到一條上千個 bits 的 bus 單向傳輸到另外一個時域
如果將整條 bus 的訊號都使用 two flip-flop synchronizer ,那電路DFF的使用量將會暴增
那如果使用 Asynchronous FIFO ,由於只是需要單向跨 clock domain ,而不是雙向的來回 handshaking
使用非同步 FIFO 同樣會產生大量沒用到的 DFF 造成電路面積上升
這個時候就要使用 Qualifier 也就是 Mux synchronizer 來跨時域
想要跨時域的是圖中的 Data bus
想要將 data bus 從 clkA 轉到 clkB(不論誰的頻率快慢都一樣)
我們透過 data bus 的 valid 訊號(屬於clkA)
也就是圖中的 data enable A
將 data enable A 使用 two flip-flop synchronizer 跨到 clkB
也就是 data enable B
並且使用 data enable B當作最右邊DFF的 flip-flop enable 訊號(在圖中使用mux來示意)
由於data enable A 的時序等同於 data bus
跨到data enable B 時也就保證了 data bus 穿過 DFF 的訊號已經穩定
即可拿來鎖入最後一級DFF
最後一級的 DFF 的 Q 即是 data bus 存在於 clk B domain 的穩定訊號