#学习记录#
1 格雷码
格雷码是一种循环二进制码或者叫作反射二进制码。格雷码的特点是从一个数变为相邻的一个数时,只有一个数据位发生跳变,由于这种特点,就可以避免二进制编码计数组合电路中出现的亚稳态。格雷码常用于通信,FIFO 或者 RAM 地址寻址计数器中。表1给出了4bit二进制码与格雷码的对照。
数值 | 二进制编码 | 格雷编码 |
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 |
2 格雷码应用
格雷编码被广泛应用于使用两个不同时钟的异步FIFO(first in first out)。当数值从一个时钟域传递到另一个时钟域时,单bit的翻转变得尤为重要。如当数值由1变为2时,对于二进制编码会有两个bit发生变化,而对于格雷码只有一个bit发生变化。
在异步FIFO中,写地址与读地址均是由二进制计数器进行标识的。首先我们使用转换公式将二进制转化为格雷码,并使格雷码编码值从一个时钟域传递到另外一个时钟域,然后使用另一个转换公式将格雷码转换为二进制码如图1所示。
图1 FIFO指针同步
下面通过例子来分析不使用这一转化方法会存在的问题。在例子中在clkA时钟中,一个值从5d变为6d。
十进制数值 | 二进制数值 | 格雷码值 | 同步之后的值 | 二进制值 |
5d | 101 | 111 | 111 | 5d |
6d | 110 | 101 | 111/101 | 5d/6d |
十进制数值 | 二进制数值 | 同步之后的值 | 二进制值 |
5d | 101 | 101 | 5d |
6d | 110 | 101/110/100/111 | 5d/6d/4d/7d |
可以看出使用格雷码编码,经过同步器之后目的时钟域中的值变为101,或者保持111,待下一时钟变为101。不使用格雷码编码,经同步器后可能是101、110、100、111,虽然最终所有bit会变成110,但在转变过程中可能产生非法数值,从而使FIFO产生错误的状态。
参考文献
[1] Verilog高级数字系统设计技术与实例分析. Kishore Mishra. 电子工业出版社.