学过晶体管知识的朋友们都知道,数据位跳变就相当于硬件电路中的晶体管翻转。许多位同时跳变就相当于多个晶体管同时翻转,会导致电路中出现很大的尖峰电流脉冲,从而导致0 或1 电平的数字信号不稳定。
格雷码(Gray Code)不同于我们常用的二进制编码,它只是一种无权码,连算术编码都算不上。其重要特征是一个数变为相邻的另一个数时,只有一个数据位发生跳变,由于这种特点,就可以避免电路中出现亚稳态。
简而言之,格雷码的一位改变特征减小了电路出错概率,实际很多场合也用到了格雷码。
下表举例了4位格雷码、4位二进制码以及十进制码的对应关系
十进制 |
二进制 |
格雷码 |
十进制 |
二进制 |
格雷码 |
0 |
0000 |
0000 |
8 |
1000 |
1100 |
1 |
0001 |
0001 |
9 |
1001 |
1101 |
2 |
0010 |
0011 |
10 |
1010 |
1111 |
3 |
0011 |
0010 |
11 |
1011 |
1110 |
4 |
0100 |
0110 |
12 |
1100 |
1010 |
5 |
0101 |
0111 |
13 |
1101 |
1011 |
6 |
0110 |
0101 |
14 |
1110 |
1001 |
7 |
0111 |
0100 |
15 |
1111 |
1000 |
二进制到格雷码转换的固定规律为:
1)格雷码中的最高有效位(最左边)等同于二进制数中相应的最高有效位。
2)从左到右,加上每一对相邻的二进制编码位,从而得到下一个格雷码位,舍去进位。
例如二进制数10110到格雷码的转换如下,格雷码是11101:
下面博主小飞给出任意位宽的二进制转格雷码verilog代码:
格雷码到二进制转换的固定规律为:
1)二进制码的最高有效位(最左边)等同于格雷码中相应的最高有效位。
2)将所产生的每个二进制码位加下一个相邻位置的格雷码位,从而得到下一个二进制位。舍去进位。
例如格雷码11011到二进制数转换如下,二进制数是10010:
下面博主小飞给出任意位宽的格雷码转二进制verilog代码: