[分享] [IC设计] Metastability?

metastable(亚稳态)

https://reurl.cc/4RZbbV

http://img2.58codes.com/2024/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

http://img2.58codes.com/2024/20128019gQfZR8HJfQ.png

当 bdat1 处于 meta stable 时

后面如果分接到三个 not gate

根本不能保证每个 not gate 的输出会是高电位还是低电位

因为输入源处于 metastable

所以输入的电流不稳定

有的 gate 认为接收到的是高电位,有的却认为接收到低电位

当 bdat1 接到多个组合电路(combination circuit)时,电路的功能就可能会出错,造成系统故障

所以这种 clock domain crossing (跨时脉域)的问题势必需要解决


解决的方法

只要在 bdat1 后面不要接上任何组合电路

直接再接一级由 bclk 所驱动的 DFF 即可

http://img2.58codes.com/2024/20128019vu7nNlUTSM.png

这种方法叫做 two flip-flop synchronizer

从图中可看到 bdat2 的值可确定为1

后面的组合电路也就正常运作了

此方法为最重要的观念

之后探讨的 qualifier、asynchronous FIFO 都是使用相同的解决方式来进行


Asynchronous FIFO

https://reurl.cc/QdzV2b

http://img2.58codes.com/2024/20128019cDNDLej6WU.png

如上图

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 来跨时域

http://img2.58codes.com/2024/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 的稳定讯号


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章