当前位置:   article > 正文

异步fifo知识点_异步fifo格雷码

异步fifo格雷码

1.格雷码

(1)二进制码转换成格雷码,其法则是保留二进制码的最高位作为格雷码的最高位,而次高位格雷码为二进制码的高位与次高位相异或(异或:两个数相同为0,不同为1),而格雷码其余各位与次高位的求法相类似。

d9b7a874f7c44413bb5c615a61222c70.png
(2)格雷码转换成二进制码,其法则是保留格雷码的最高位作为自然二进制码的最高位,而次高位自然二进制码为高位自然二进制码与次高位格雷码相异或,而自然二进制码的其余各位与次高位自然二进制码的求法相类似。

8ce93a8886fe43ce9ca5a0554738e0dd.png

 

 

异步FIFO的写指针和读指针分属不同时钟域,这样指针在进行同步过程中很容易出错,比如写指针在从0111到1000(一般来说地址都是顺序往上加的)跳变时4位同时改变,这样读时钟在进行写指针同步后得到的写指针可能是0000-1111的某个值,一共有2^4个可能的情况,而这些都是不可控制的,并不能确定会出现哪个值,那出错的概率非常大(导致系统异常,亚稳态问题),怎么办呢?

到了格雷码发挥作用的时候了,而格雷码的编码特点是相邻位每次只有 1 位发生变化, 这样在进行指针同步的时候,只有两种可能出现的情况:1.指针同步正确,正是我们所要的;2.指针同步出错。举例假设格雷码写指针从000->001,将写指针同步到读时钟域同步出错,出错的结果只可能是000->000,因为相邻位的格雷码每次只有一位变化,这个出错结果实际上也就是写指针没有跳变保持不变,那么这个错误会不会导致读空判断出错?答案是不会,最多是让空标志在FIFO不是真正空的时候产生,而不会出现空读的情形(本来应该写入一个数据了,但是格雷码出错,还是000不变,这时候就会表现出虚空,但是这样只会带来写操作的延迟,不会对逻辑产生影响)。所以gray码保证的是同步后的读写指针即使在出错的情形下依然能够保证FIFO功能的正确性。

675ba0cea5944e599a1026ed7caf2d93.png

 

如何写格雷码?
        格雷码的性质:当第N位从0变到1的时候,之后的数的N-1位会关于前半段轴对称,而比N位高的位是相同的。
        我们看一下8bit格雷码的前四位的例子。示意图如下:

281d91a3bed247d3a93cd40fabc1fade.png
后4位就是关于第四位镜像对称,然后再高一位改为1即可,后面可以这样类推。

a6d7580b9df6478f8e2035bdd930ee2f.png

 

 2、

对于异步FIFO而言,这里会引入一个新的问题,就是读写指针位于不同的时钟域,二者需要同步后才可以比较,同步的过程有两个:
 
(1)将读时钟域的读指针同步到写时钟域,将同步后的读指针与写时钟域的写指针进行比较产生写满信号;

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

闽ICP备14008679号