metastable(亚稳态)
https://reurl.cc/4RZbbV
有两个 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 都是使用相同的解决方式来进行
Asynchronous FIFO
https://reurl.cc/QdzV2b
如上图
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 的状况
Qualifier
https://reurl.cc/ex1pOj
遇到一条上千个 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 的稳定讯号