赞
踩
1.格雷码
(1)二进制码转换成格雷码,其法则是保留二进制码的最高位作为格雷码的最高位,而次高位格雷码为二进制码的高位与次高位相异或(异或:两个数相同为0,不同为1),而格雷码其余各位与次高位的求法相类似。
(2)格雷码转换成二进制码,其法则是保留格雷码的最高位作为自然二进制码的最高位,而次高位自然二进制码为高位自然二进制码与次高位格雷码相异或,而自然二进制码的其余各位与次高位自然二进制码的求法相类似。
异步FIFO的写指针和读指针分属不同时钟域,这样指针在进行同步过程中很容易出错,比如写指针在从0111到1000(一般来说地址都是顺序往上加的)跳变时4位同时改变,这样读时钟在进行写指针同步后得到的写指针可能是0000-1111的某个值,一共有2^4个可能的情况,而这些都是不可控制的,并不能确定会出现哪个值,那出错的概率非常大(导致系统异常,亚稳态问题),怎么办呢?
到了格雷码发挥作用的时候了,而格雷码的编码特点是相邻位每次只有 1 位发生变化, 这样在进行指针同步的时候,只有两种可能出现的情况:1.指针同步正确,正是我们所要的;2.指针同步出错。举例假设格雷码写指针从000->001,将写指针同步到读时钟域同步出错,出错的结果只可能是000->000,因为相邻位的格雷码每次只有一位变化,这个出错结果实际上也就是写指针没有跳变保持不变,那么这个错误会不会导致读空判断出错?答案是不会,最多是让空标志在FIFO不是真正空的时候产生,而不会出现空读的情形(本来应该写入一个数据了,但是格雷码出错,还是000不变,这时候就会表现出虚空,但是这样只会带来写操作的延迟,不会对逻辑产生影响)。所以gray码保证的是同步后的读写指针即使在出错的情形下依然能够保证FIFO功能的正确性。
如何写格雷码?
格雷码的性质:当第N位从0变到1的时候,之后的数的N-1位会关于前半段轴对称,而比N位高的位是相同的。
我们看一下8bit格雷码的前四位的例子。示意图如下:
后4位就是关于第四位镜像对称,然后再高一位改为1即可,后面可以这样类推。
2、
对于异步FIFO而言,这里会引入一个新的问题,就是读写指针位于不同的时钟域,二者需要同步后才可以比较,同步的过程有两个:
(1)将读时钟域的读指针同步到写时钟域,将同步后的读指针与写时钟域的写指针进行比较产生写满信号;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。