0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

异步FIFO-格雷码

芯司机 来源:芯司机 2023-08-26 14:20 次阅读

异步FIFO常用于跨时钟域之间的数据传输,其可以实现数据的存储,也可以处理异步时钟数据传输的亚稳态问题。异步FIFO的设计其关键点:通过格雷码对内部读写指针进行编码,然后比较产生空满标志,以维护FIFO的正常工作。

很多人在面试时被问到为什么异步FIFO中需要用到格雷码,可能大部分的答案是格雷码可以消除亚稳态。这种回答比较模糊,今天我们就针对这个来深入探讨一下。如下图所示:

ef419bb8-43c9-11ee-a2ef-92fbcf53809c.jpg

Push信息产生的连续写指针wpt, 通过同步后,在rclk域与rpt进行比较,以产生rclk域的Empty信号。Empty信号用于控制读操作,以避免在FIFO为空时仍然进行读操作而导致的错误,并影响后续所有的FIFO读操作。

Pop 信息产生的连续读指针rpt, 通过同步后,在wclk域与wpt进行比较,以产生wclk域的Full信号。Full信号用于控制写操作,以避免在FIFO为满时仍然进行写操作而导致的错误,并影响后续的所有的FIFO写操作。

异步时钟产生的亚稳态发生在不同时钟域信号wpt和rpt的比较上。对于多bit的读写指针信号,在跨时钟域传输时会存在bit之前不同延时导致的毛刺,比如写地址在从0111到1000转换时4条地址线都会跳变,这样在写地址同步到读时钟域后得到的写地址可能是0000-1111的某个值,因此本来wpt = rpt的情况变成了wpt > rpt的情况,本来应该出现空状态,因为亚稳态导致未被发现,读操作继续进行,从而影响了整个FIFO的功能。

我们知道,格雷码编码的连续数值之间只有1bit会发生变化,这种特性其实不能消除异步时钟数据传输出现的亚稳态。假设格雷码编码的写地址从001(2)->011(3),读时钟域同步出错,写地址为001->001,也就是地址没有跳变,此时用这个错误的写地址与读地址进行比较,出现虚假的空标志,但这种虚空只是提前阻止了后续的读操作,不会发生读空的情况,因此不会影响后续的操作及整个FIFO的功能。同样对于读地址同步到写时钟域时也会出现虚满的情况,这种虚空和虚满,不会影响FIFO的功能,因此gray码保证的是在出现亚稳态的情形下,FIFO依然能够正常的工作。



声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • fifo
    +关注

    关注

    3

    文章

    390

    浏览量

    43930
  • 编码
    +关注

    关注

    6

    文章

    959

    浏览量

    54982
  • 格雷码
    +关注

    关注

    2

    文章

    34

    浏览量

    13242

原文标题:异步FIFO-格雷码

文章出处:【微信号:芯司机,微信公众号:芯司机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    什么是

    (Gray code),又叫循环二进制或反射二进制 在数字系统中只能识别0和1,各种数据要转换为二进制代码才能进行处理,
    发表于 11-11 09:34 7440次阅读
    什么是<b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>码</b>

    异步FIFO设计之

    相邻的只有1bit的差异,因此常常用于异步
    的头像 发表于 11-01 17:37 1491次阅读
    <b class='flag-5'>异步</b><b class='flag-5'>FIFO</b>设计之<b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>码</b>

    简介及格与二进制的转换程序

    简介及格与二进制的转换程序
    发表于 04-22 09:00

    什么是BCD、8421、余三

    的是8421BCD,无权用得较多的是余三,我们通常所说的BCD
    发表于 11-03 17:36

    介绍

    介绍
    发表于 08-14 09:44

    详细讨论异步FIFO的具体实现???

    我在网上看到一篇利用来设计异步FIFO,但是看他们写的一些源码,小弟有些不是很理解,在设计时为什么会出现Waddr和wptr两个关于写
    发表于 05-19 11:04

    的规则和应用问题?

    今天看到一个计数的程序,搜了下定义,觉得还是云里雾里,定义写的是若任意两个相邻的代码只有一位二进制数不同,则这种编码为
    发表于 08-20 14:41

    异步FIFO的VHDL设计

    给出了一个利用对地址编码的羿步FIFO 的实现方法,并给出了VHDL 程序,以解决异步读写时钟引起的问题。
    发表于 07-16 15:15 26次下载

    简介及格与二进制的转换程序

    简介及格与二进制的转换程序
    发表于 01-16 11:52 5064次阅读

    运算研究

    运算研究 在数字系统中只能识别0和1,各种数据要转换为二进制代码才能进行处理,是一
    发表于 03-18 14:07 1485次阅读

    循环VHDL源程序

    我们知道计数的特点就是相邻的码字只有一个比特不同,那么我们在设计计数时找到这个比特取
    发表于 11-11 09:32 2127次阅读

    辨析

    讨论了Gray Code 的由来,剖析了关于的一些不合理说法,明确了其正宗的发明者应该是弗兰克·,正确的英文名称是Gray Cod
    发表于 11-28 16:04 5805次阅读
    <b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>码</b>辨析

    编码规则_有什么规律

    典型的二进制简称,因1953年公开的弗兰克·
    的头像 发表于 03-02 14:29 5.6w次阅读
    <b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>码</b>编码规则_<b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>码</b>有什么规律

    如何把二进制转换为是如何判断读空写满呢?

    在传递读写时钟域的指针使用来传递,如何把二进制转换为
    的头像 发表于 09-15 09:38 8407次阅读
    如何把二进制转换为<b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>码</b>?<b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>码</b>是如何判断读空写满呢?

    异步FIFO的原因有哪些

    异步FIFO通过比较读写地址进行满空判断,但是读写地址属于不同的时钟域,所以在比较之前需要先将读写地址进行同步处理,将写地址同步到读时钟域再和读地址比较进行FIFO空状态判断(同步后的写地址一定
    的头像 发表于 08-04 14:05 4495次阅读