首页 > 试题广场 >

异步FIFO当中为什么要使用格雷码?

[问答题]
异步FIFO当中为什么要使用格雷码?
经过学习,我发现这个解析,前部分对亚稳态的解释是对的,但后部分对格雷码的作用是错的!
我开始还信了,气抖冷。都是小白,我来给大伙提个醒吧。
可以查看异步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)
异步FIFO要解决跨时钟问题,此时会产生亚稳态。为了满足fifo在判定写满和读空的状态下不出现致命问题,因此一般用两级同步触发器+格雷码去解决。
发表于 2022-06-30 10:57:40 回复(0)
由于布线等导致的时延原因,导致多比特信号不是同时翻转,会产生亚稳态现象。使用格雷码可以保证前后只有1bit变化,即使未采集到当前状态值,也会保持在上一状态,对FIFO不会产生功能上的实质性影响。
发表于 2023-09-22 21:43:01 回复(0)
格雷码每一位只有一位翻转,首先能够消除毛刺,其次即使读写数据时指针出错,其误差也在相邻位上,对fifo的功能不会产生致命影响。也就是说fifo使用格雷码是选择了一种保守的寻址方式,能够避免亚稳态的产生。
发表于 2025-10-23 16:27:41 回复(0)
格雷码可以最小化跨时钟域传输的亚稳态风险
发表于 2025-04-09 09:20:22 回复(0)
是为了防止亚稳态
发表于 2025-03-05 21:42:33 回复(0)
格雷码能防止亚稳态的产生
发表于 2024-10-25 11:11:04 回复(0)
解决 异步时钟带来的亚稳态问题,读写 时钟不同在数据传输过程中会出现时钟抖动或延迟,导致亚稳态问题,格雷码特点是 相邻两位中只有一位不同,最大限度的减少数据传输位指针切换。降低亚稳态带来的问题,提高fifo的可靠性。
发表于 2024-08-15 15:21:40 回复(0)
异步FIFO中对于满空标志信号的判断不能用同步FIFO中的计数器来进行判断,因为不同的时钟计数值不能进行比较,会产生错误。所以采用了各自时钟域下的指针信号,对于该指针信号每读写1bit,就会+1,但对于二进制来说,很多位就会发生变化,容易造成亚稳态,所以采用格雷码,格雷码特点是相邻两个数之间二进制只有1位发生变化,减少了亚稳态的概率。
发表于 2024-08-06 17:38:30 回复(0)
异步fifo要处理跨时钟域容易出现亚稳态,所以一般要采用格雷码来解决该问题
发表于 2024-07-17 15:57:10 回复(0)
1
发表于 2024-07-13 12:25:57 回复(0)
在异步 FIFO中使用格雷码是为了解决潜在的同步问题和减少传输错误。 异步 FIFO 是一种用于在不同时钟域之间传输数据的数据缓冲区。由于时钟的不同步,可能会出现数据传输过程中的元数据捕获问题。这种问题可能导致数据损坏或错误。使用格雷码作为异步 FIFO 的状态编码可以减少传输错误的可能性。格雷码是一种二进制编码,其中每个相邻的数值只有一个位的差异。这意味着在状态转换过程中只有一个比特位会发生改变,减少了由于时钟不同步而引起的多个位同时改变的风险。通过使用格雷码,异步 FIFO 能够在不同时钟域之间准确地捕获和传输数据,从而提高了可靠性和正确性。总结起来,异步 FIFO 使用格雷码是为了解决时钟不同步引起的传输错误和数据捕获问题,确保可靠的数据传输。
发表于 2024-05-28 09:26:28 回复(0)
格雷码每次变换一次,防止亚稳态
发表于 2024-03-04 14:01:13 回复(0)
格雷码每次变换都只会变换一位,防止产生亚稳态
发表于 2023-08-10 13:59:01 回复(0)
防止产生亚稳态
发表于 2022-11-08 14:42:39 回复(0)