异步FIFO格雷码及同步相关问题?

零、前言

关于异步FIFO如何设计请参考之前的一篇文章:手写异步FIFO。

关于异步FIFO的空满现象可以参考:你真的理解异步FIFO读写中的空满现象吗?

一、格雷码的作用

格雷码的每两个相邻码字只有1bit的变化,将多bit的地址转换成对应的格雷码然后进行跨时钟域的传递,就可以直接使用两级flop进行同步。并且由于只有一个bit变化,那么即使采样错误也只有一种错误的可能,也即1变成了0或者0变成了1,不会出现其他各种不稳定的状态。

而且应用到异步FIFO的地址指针中,采样到的只有一个bit不同的错误值,其实也是正确的。例如在使用格雷码时,假设写指针从001->011,那么在读时钟域采样到的写指针的值只可能是001->001-011, 或者001->011->011,而不会出现除了这两个值以外的值。如果采样到011,那么采样是正确的;如果采样到001,其实也就是和读时钟域上一次同步到的写指针的值是一样的,最多只是出现假空现象,这是不影响FIFO的正常工作的。

二、如果现在同步到读时钟域的格雷码写指针是011,而写时钟快很多,写时钟域的格雷码写指针已经发生变化:011→010→110,在读时钟域这边,就需要直接同步110,那么,读时钟域的格雷码写指针就会从011变为110,第0位和第2位都发生变化,这会在采样时造成影响吗?

可以参考这篇文章:跨时钟域传输的黄金搭档:异步FIFO与格雷码

posted @ 2021-12-20 15:39  耐心的小黑  阅读(275)  评论(0编辑  收藏  举报