首页
题库
面试
求职
学习
竞赛
More+
所有博客
搜索面经/职位/试题/公司
搜索
我要招人
去企业版
登录 / 注册
首页
>
试题广场
>
异步FIFO当中为什么要使用格雷码?
[问答题]
异步FIFO当中为什么要使用格雷码?
查看答案及解析
添加笔记
求解答(0)
邀请回答
收藏(54)
分享
纠错
15个回答
添加回答
23
失神却不失魂
经过学习,我发现
这个解析
,前部分对亚稳态的解释是对的,但
后部分对格雷码的作用是错的!
我开始还信了,气抖冷。都是小白,我来给大伙提个醒吧。
可以查看异步FIFO的电路示意图,有一点很重要:
判满时,是将 r_addr 转为 r_addr_gray,然后在“写时钟域” 打两拍后,直接和 “写时钟域” 的 w_addr_gray 进行 check 是否 “满”;
即:
判满时,写指针不需要跨时钟域。 故写指针的格雷码不会发生发生亚稳态,只有读指针的格雷码可能会因为亚稳态,采到错误的值,但这只会造成 “假满” 现象,并不会造成解析中的错误。
以解析中的例子,进行解释:
若此时写指针为010(二进制非格雷码,方便叙述),那么写入数据后,写指针将变为011,并且为满的状态,即读指针的地址此时也是011。
但写指针在自己的时钟域,因此不可能发生亚稳态;亚稳态的发生必须是跨时钟域的采样才会触发;故若此时写入新数据,写地址必然、安全的sample到 011;故解析的情况不成立。
因为亚稳态造成的
“假满” 现象
如下:
若此时写指针和读指针都是 010, 读了新数据,则读指针应该变成 011;
但读指针到 写时钟域转换时出现了亚稳态,亚稳态稳定后,读指针恢复成 011,那没事,一切ok;
倘若亚稳态稳定后,读指针恢复成 010,那异步FIFO就会说 full了,但其实没有 full,这就是“假满”。
判空,同理。
网上还有解释因为引入打两拍,导致的“假满”、“假空”的例子,可以自行搜寻。
总结,异步FIFO不会因为亚稳态,导致解析中的数据覆盖情况的出现。
发表于 2022-09-08 11:32:18
回复(0)
10
牛客623779521号
异步FIFO要解决跨时钟问题,此时会产生亚稳态。为了满足fifo在判定写满和读空的状态下不出现致命问题,因此一般用两级同步触发器+格雷码去解决。
发表于 2022-06-30 10:57:40
回复(0)
6
俺会拿到offer的
由于布线等导致的时延原因,导致多比特信号不是同时翻转,会产生亚稳态现象。使用格雷码可以保证前后只有1bit变化,即使未采集到当前状态值,也会保持在上一状态,对FIFO不会产生功能上的实质性影响。
发表于 2023-09-22 21:43:01
回复(0)
0
桑尼若
格雷码每一位只有一位翻转,首先能够消除毛刺,其次即使读写数据时指针出错,其误差也在相邻位上,对fifo的功能不会产生致命影响。也就是说fifo使用格雷码是选择了一种保守的寻址方式,能够避免亚稳态的产生。
发表于 2025-10-23 16:27:41
回复(0)
0
欧月
格雷码可以最小化跨时钟域传输的亚稳态风险
发表于 2025-04-09 09:20:22
回复(0)
0
zimayin
是为了防止亚稳态
发表于 2025-03-05 21:42:33
回复(0)
0
杨丑丑
格雷码能防止亚稳态的产生
发表于 2024-10-25 11:11:04
回复(0)
0
磨洋工匠人1
解决 异步时钟带来的亚稳态问题,读写 时钟不同在数据传输过程中会出现时钟抖动或延迟,导致亚稳态问题,格雷码特点是 相邻两位中只有一位不同,最大限度的减少数据传输位指针切换。降低亚稳态带来的问题,提高fifo的可靠性。
发表于 2024-08-15 15:21:40
回复(0)
0
旧话
异步FIFO中对于满空标志信号的判断不能用同步FIFO中的计数器来进行判断,因为不同的时钟计数值不能进行比较,会产生错误。所以采用了各自时钟域下的指针信号,对于该指针信号每读写1bit,就会+1,但对于二进制来说,很多位就会发生变化,容易造成亚稳态,所以采用格雷码,格雷码特点是相邻两个数之间二进制只有1位发生变化,减少了亚稳态的概率。
发表于 2024-08-06 17:38:30
回复(0)
0
shock_shock
异步fifo要处理跨时钟域容易出现亚稳态,所以一般要采用格雷码来解决该问题
发表于 2024-07-17 15:57:10
回复(0)
0
薛一哲
1
发表于 2024-07-13 12:25:57
回复(0)
0
想顺利毕业躺平后又起来了
在异步 FIFO中使用格雷码是为了解决潜在的同步问题和减少传输错误。 异步 FIFO 是一种用于在不同时钟域之间传输数据的数据缓冲区。由于时钟的不同步,可能会出现数据传输过程中的元数据捕获问题。这种问题可能导致数据损坏或错误。使用格雷码作为异步 FIFO 的状态编码可以减少传输错误的可能性。格雷码是一种二进制编码,其中每个相邻的数值只有一个位的差异。这意味着在状态转换过程中只有一个比特位会发生改变,减少了由于时钟不同步而引起的多个位同时改变的风险。通过使用格雷码,异步 FIFO 能够在不同时钟域之间准确地捕获和传输数据,从而提高了可靠性和正确性。总结起来,异步 FIFO 使用格雷码是为了解决时钟不同步引起的传输错误和数据捕获问题,确保可靠的数据传输。
发表于 2024-05-28 09:26:28
回复(0)
0
认真勤奋好学
格雷码每次变换一次,防止亚稳态
发表于 2024-03-04 14:01:13
回复(0)
0
在炒股的牛油很想被叫靓仔
格雷码每次变换都只会变换一位,防止产生亚稳态
发表于 2023-08-10 13:59:01
回复(0)
0
牛客157553532号
防止产生亚稳态
发表于 2022-11-08 14:42:39
回复(0)
这道题你会答吗?花几分钟告诉大家答案吧!
提交观点
问题信息
Verilog
上传者:
real1993
难度:
15条回答
54收藏
2276浏览
热门推荐
相关试题
下面哪个选项中,不会综合出latch?
Verilog
评论
(1)
在verilog设计时,我们应当避...
Verilog
评论
(29)
下面关于 Kotlin 中异常处理...
Kotlin
评论
(1)
在Verilog中,若用如下代码实...
Verilog
评论
(1)
在聚类任务中,DBSCAN算法常用...
数据挖掘
评论
(1)
扫描二维码,关注牛客网
意见反馈
下载牛客APP,随时随地刷题