当前位置:   article > 正文

异步FIFO_如果 fifo 的写指针不是连续变化而是 0,2,4,6…间隔为 2 递增该怎么处理?

如果 fifo 的写指针不是连续变化而是 0,2,4,6…间隔为 2 递增该怎么处理?

当写指针超过最后的FIFO地址时,写指针将使未使用的MSB(Most Significant Bit的缩写,指最高有效位)递增,同时将其余的位设置为零,如图1所示(FIFO已经回环并翻转指针的MSB位)。

如果两个指针的MSB相同,则意味着两个指针都回环了相同的次数。

使用n位指针,其中(n-1)是访问整个FIFO存储器缓冲区所需的地址位数,将写时钟域的写指针同步到读时钟域,当两个指针(包括MSB)相等时,FIFO为空。 将读时钟域的读指针同步到写时钟域,当两个指针(MSB除外)相等时,FIFO就会满(面试陷阱:请各位童鞋思考为什么是这样,反之是否可以)。

尝试将二进制指针值从一个时钟域同步到另一个时钟域是有问题的,因为n位指针的每个位可以同时改变。例如,二进制数中的7-> 8是0111->1000,所有位都改变了,实际中可能出现的情形有16种,即0111-> 1000的变化可能出现0111-> 1001、0111->1011等(请童鞋们思考原因哦,这是Cisco 19年的面试题)。

 

  格雷码的最大优势是任何两个相邻字之间的代码距离只有1(在n位码的递增变化中只有1位可以变化)。

回到之前二进制数中的7-> 8变化的例子,二进制数变化为0111->1000,此时使用了格雷码的变化是0100->1100,即只有最高位发生了变化。使用了格雷码后的递增变化可能的情形有2种,即0100->1100或0100->0100,异常情形为0100->0100。异常情形为指针未发生正常跳变,带来的影响为判断空满状态时出现了“假空”或者“假满”。

假设写指针为为7->8跳转,读指针为6->7跳转。写指针由于异常情形出现了7->7的跳转,将写指针同步到读时钟域,读写指针都指向7,出现了“假空”。“假满”与之类似,不再赘述。“假空”和“假满”的出现降低了FIFO的性能,但是避免了亚稳态的问题,是可以接受的。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/1009861
推荐阅读
相关标签
  

闽ICP备14008679号