iT邦幫忙

1

[分享] [IC設計] Metastability?

metastable(亞穩態)

https://reurl.cc/4RZbbV

https://ithelp.ithome.com.tw/upload/images/20200728/20128019I4aWVQyrTw.png

有兩個 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

https://ithelp.ithome.com.tw/upload/images/20200728/20128019gQfZR8HJfQ.png

當 bdat1 處於 meta stable 時

後面如果分接到三個 not gate

根本不能保證每個 not gate 的輸出會是高電位還是低電位

因為輸入源處於 metastable

所以輸入的電流不穩定

有的 gate 認為接收到的是高電位,有的卻認為接收到低電位

當 bdat1 接到多個組合電路(combination circuit)時,電路的功能就可能會出錯,造成系統故障

所以這種 clock domain crossing (跨時脈域)的問題勢必需要解決


解決的方法

只要在 bdat1 後面不要接上任何組合電路

直接再接一級由 bclk 所驅動的 DFF 即可

https://ithelp.ithome.com.tw/upload/images/20200728/20128019vu7nNlUTSM.png

這種方法叫做 two flip-flop synchronizer

從圖中可看到 bdat2 的值可確定為1

後面的組合電路也就正常運作了

此方法為最重要的觀念

之後探討的 qualifier、asynchronous FIFO 都是使用相同的解決方式來進行


Asynchronous FIFO

https://reurl.cc/QdzV2b

https://ithelp.ithome.com.tw/upload/images/20200728/20128019cDNDLej6WU.png

如上圖

interface 可切分為左半邊 write 端

  1. wdata : write data,寫入資料的bus

  2. wfull : write full, FIFO已經滿的訊號

  3. winc : write data valid,寫入資料的有效訊號

  4. wclk : write clk,寫入端的 clk domain

  5. wrst_n : write rst_n,寫入端clk的rst_n

右半邊的 read 端

  1. rdata : read data,讀取資料的bus

  2. rempty : read empty, FIFO已經空的訊號

  3. rinc : read data enable,讀取一筆資料的有效訊號

  4. rclk : read clk,讀取端的 clk domain

  5. 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 的狀況


Qualifier

https://reurl.cc/ex1pOj

遇到一條上千個 bits 的 bus 單向傳輸到另外一個時域

如果將整條 bus 的訊號都使用 two flip-flop synchronizer ,那電路DFF的使用量將會暴增

那如果使用 Asynchronous FIFO ,由於只是需要單向跨 clock domain ,而不是雙向的來回 handshaking

使用非同步 FIFO 同樣會產生大量沒用到的 DFF 造成電路面積上升

這個時候就要使用 Qualifier 也就是 Mux synchronizer 來跨時域

https://ithelp.ithome.com.tw/upload/images/20200728/201280198vZw215LHy.png

想要跨時域的是圖中的 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 的穩定訊號


尚未有邦友留言

立即登入留言