在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
楼主: come_on_sn

[求助] 请问异步FIFO中为什么需要使用格雷码来表示指针呢

[复制链接]
 楼主| 发表于 2021-10-12 11:17:46 | 显示全部楼层


innovation 发表于 2021-10-11 20:32
以3-bit宽度指针为例,采用二进制自然码编码,当值由011 --> 100时,你想象一下,目的时钟域的三个触发器 ...



非常感谢您的耐心答复,回复有些迟,契为见谅!

采用二进制自然码编码的话,011 --> 100时,目的时钟域的三个触发器可能会输出错误的值比如010、110等,从而导致没有读取到正确的数据

格雷码编码的话,当010  --> 110时,我的理解是,最高位也有可能出现亚稳态。难道是因为即使采用格雷码小概率发生亚稳态,即010——>010,也不会出现错误读取数据的情况?

发表于 2021-10-12 12:40:24 | 显示全部楼层
本帖最后由 innovation 于 2021-12-3 17:18 编辑


come_on_sn 发表于 2021-10-12 11:17
非常感谢您的耐心答复,回复有些迟,契为见谅!

采用二进制自然码编码的话,011 --> 100时,目的时钟域 ...


再想想,格雷码的时候,010 --> 110时(2021-10-15 PS:此处原文笔误为011 --> 110,特此更正),目的域的输出在出错的情况下,也只可能是010或110。
010的话,目的域认为没有新的数据,不读取,数据不出错,但读出时间延迟;
110的话,目的域获得新的并且是正确的指针,无错地读取新数据。
所以采用格雷码不是解决错误概率的问题,而是解决错误容忍的问题,即,即便地址指针出错(事实上,在目的域看来,地址指针在逻辑上并没有出错,目的域看到的地址指针要么是原值,要么是新的并且是正确的值。也就是说,触发器亚稳态这一物理错误并未转化为地址指针出错这样的逻辑错误),也不引起读错数据。当然,这不是没有代价的,要注意出错时会增加数据读出延迟时间。
或者我们可以说,利用格雷码“相邻码字之间只有一个bit不同”的这一特点,成功地将FIFO地址指针跨时钟域多比特传输转化为单比特传输



 楼主| 发表于 2021-10-15 16:12:27 | 显示全部楼层


innovation 发表于 2021-10-12 12:40
再想想,格雷码的时候,011 --> 110时,目的域的输出在出错的情况下,也只可能是011或110。
011的话,目的 ...



再想想,格雷码的时候,011 --> 110时,目的域的输出在出错的情况下,也只可能是011或110。

您好,想请问下格雷码不是每次1个bit变化吗?为什么会有011 --> 110的情况呢?而且为什么从011到110地址是正确的呢?




或者我们可以说,利用格雷码“相邻码字之间只有一个bit不同”的这一特点,成功地将FIFO地址指针跨时钟域多比特传输转化为单比特传输。

这个理解可以说很准确了,感谢大神的指点

发表于 2021-10-15 16:31:40 | 显示全部楼层


come_on_sn 发表于 2021-10-15 16:12
您好,想请问下格雷码不是每次1个bit变化吗?为什么会有011 --> 110的情况呢?而且为什么从011到110地址 ...


哎呀,不好意思,写错了,不是011 --> 110,是010 --> 110,已修改。
发表于 2021-10-21 14:48:19 | 显示全部楼层
异步fifo的精髓
 楼主| 发表于 2021-10-21 15:10:18 | 显示全部楼层


innovation 发表于 2021-10-15 16:31
哎呀,不好意思,写错了,不是011 --> 110,是010 --> 110,已修改。


感谢回复,感恩!
 楼主| 发表于 2021-11-4 15:38:26 | 显示全部楼层


innovation 发表于 2021-10-15 16:31
哎呀,不好意思,写错了,不是011 --> 110,是010 --> 110,已修改。


您好,想请问下为什么一般在设计时,指针bit数比实际fifo深度多1位呢?
发表于 2021-11-4 17:03:49 | 显示全部楼层


innovation 发表于 2021-10-15 16:31
哎呀,不好意思,写错了,不是011 --> 110,是010 --> 110,已修改。


虽说是很基础的概念但是层主解释的很好,赞一个
发表于 2021-11-4 21:07:43 | 显示全部楼层


come_on_sn 发表于 2021-11-4 15:38
您好,想请问下为什么一般在设计时,指针bit数比实际fifo深度多1位呢?


你想问的是,比如说1个深度为8的FIFO,为什么不用3-bits的读写指针(明明2^3=8呀),而要用4-bits的读写指针,多出来的这一位是用来解决什么问题的?

咱们就以深度为8的FIFO来说,就用3-bits指针,那么计数范围就是:0~7,从0开始计数的话,计到7后,回到0。。。如此循环。设计一个小游戏:
1)有一个8格的跑道,甲、乙二人同向站到同一起步格子(比如0),二人每次只能跳一格,跳到终点后返回,回到起点后又折返往终点跳,如此循环。。。
2)要求甲先跳至少一格后,乙才能开始跳,
3)过程中,乙追上甲,要求乙停止;甲追上乙,要求甲停止
现在的问题是:甲乙二人能否只根据自己和对方所处的格子号来判断自己是否能继续跳?


你在纸上简单画一画呢
发表于 2021-11-5 13:16:55 | 显示全部楼层
建议看一下cummings的文章。
grey code只有一个数据变化,通过cdc后,可以保证指针传递后的正确性(要么是变化前的值,要么是变化后的值)。

还得记住,所有去cdc的数据,都需要flop输出(文章里也写了)。也就是转grey code后需要打一拍。组合逻辑的grey code一样会出错。

Simulation and Synthesis Techniques for Asynchronous FIFO Design with Asynchrono.pdf

120.8 KB, 下载次数: 13 , 下载积分: 资产 -2 信元, 下载支出 2 信元

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-3-29 23:58 , Processed in 0.027684 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表