格雷码在异步FIFO中的应用(转)

来源:互联网 发布:知乎 许嵩 李荣浩 编辑:程序博客网 时间:2024/06/11 17:26

1.格雷码的介绍

        在介绍格雷码之前,我们先说说自然二进制码,也就是我们经常说的二进制数。我们用二进制数表示一个变化的数值,例如,用一个8位的二进制数表示热水壶的温度,温度是不断连续变化的,36°C、37°C、38°C......,那么温度每升高一度,二进制数就加1。这时候,二进制数有可能是多个位同时变化的:当温度由119°C变成120°C时,二进制数由01110111变化成01111000,有四个位发生变化;当二进制数由177°C变化成178°C时,二进制数由01111111变化成10000000,有8个位发生了变化。也就是说,自然二进制数在表示一个连续变化的数值时,可能会有多个位同时发生变化,每个位翻转(变化)的频率是比较高的,这在某些应用场合,如在FPGA内部跨时钟域传输数据时,是十分不利的。

        而格雷码,由于具有循环特性和单步特性,当用它表示一个连续变化的数值时,仅有一个位会翻转,大大的降低了位翻转的频率,因而可以保证传输的稳定性,较少传输误码率。格雷码的单步特性是指,当格雷码表示的一个数值,连续变化时,格雷码只有一个位会变化。例如,当十进制数由7变成8时,自然二进制数是由0111变成1000,格雷码是由0100变成1100。自然二进制数有4位发生翻转,格雷码只有一位发生翻转。格雷码的循环特性是指,当一个格雷码表示的数,由最大值变为最小值时,也只有一个位发生翻转。例如,一个4位的格雷码,能表示的最大十进制数是15,能表示的最小十进制数是0,当十进制数由15变成0时,自然二进制数由1111变成0000,格雷码由1000变成0000。自然二进制数有4位翻转,格雷码只有1位翻转。



2.格雷码与自然二进制数的转换

      二进制码->格雷码:
      从最右边一位起,依次将每一位与左边一位异或(XOR),作为对应格雷码该位的值,最左边一位不变(相当于左边是0);

      格雷码->二进制码:
      从左边第二位起,将每位与左边一位解码后的值异或,作为该位解码后的值(最左边一位依然不变)。

      以下给出四位格雷码与二进制数、十进制数的对照表:

 十进制数 二进制数 格雷码
 0 0000 0000
 1 0001 0001
 2 0010 0011
 3 0011 0010
 4 0100 0110
 5 0101 0111
 6 0110 0101
 7 0111 0100
 8 1000 1100
 9 1001 1101
 10 1010 1111
 11 1011 1110
 12 1100 1010
 13 1101 1011
 14 1110 1001
 15 1111 1000
3.格雷码在异步FIFO中的应用

        在异步FIFO中,写操作和读操作工作在不同的时钟域,需要跨时钟域来传递FIFO的空满状态信息。一般是通过传递读写的地址来实现空满状态控制的。写地址减去读地址(如果写地址小于读地址,则写地址先加上FIFO深度再减去读地址),即为FIFO中存放的数据个数,由此产生FIFO的空满判断。不管是读地址还是写地址,每次变化都是加1,溢出后从0开始重新累加。当写地址跨越时钟域到达读操作一侧时,需要用读时钟去采样由写时钟产生的数据(即写地址)。由于是异步操作,有可能会出现竞争和冒险,采样过程不满足建立保持时间,导致亚稳态。写地址变化的位越多,出现亚稳态的位就越多,用读时钟采样时出错的概率越高。同理,当读地址跨越时钟域到达写操作侧时,读地址变化的位越多,写时钟采样时出错的概率越高。因为,必须采用有效的编码,降低读写地址在连续变化时的位翻转率。采用格雷码就能有效的降低连续变化数值的位翻转率。所以,可以在将地址跨越时钟域之前,先转换成格雷码,然后跨越时钟域。到达另一时钟域后,通过两级寄存器消除亚稳态,再将格雷码转换成二进制数。这样,每次地址变化,跨越时钟域时只有一位可能出错,可以大幅降低出错概率,提高FIFO运行的可靠性。

4.设计实例

       对于使用格雷码实现异步FIFO的实例,可参阅:异步FIFO的实现 。

5.知识扩展


       格雷码虽然也是用0和1表示,但它并不是二进制数,格雷码是一种变权码,每个位码没有固定的大小。在各种进制数的表示方法中,每一位有一个大小,称之为权,一个数的大小不仅与它的数字(十进制为0~9,十六进制为0~f,二进制为0和1)有关,还有数字的位置有关,数值放在权比较大位置,数就比较大。如同样是使用数字0和1,十进制数1000就比0001要大。十进制数的位权是以10为底的幂,二进制数的位权是以2为底的幂,十六进制数的位权是以16为底的幂。幂的指数从右到左依次增加。例如,在自然二进制数0100中,右边开始数第一个位码的大小(位权)是2的0次方,第二个位码的大小是2的1次方,第三个位码的大小是2的2次方。而格雷码的每一个位不具有固定的权(大小)。

      另外,格雷码编码方式不是唯一的,本文介绍的是最常用的一种。



        
原创粉丝点击