二进制(Binary)与格雷码(Gray)之间的相互转换

本文参考明天20度的文章,在其基础上进行总结,并书写自己的代码。

1.格雷码介绍

格雷码最大特点是相邻两数间只有一个位元改变,为无权数码。
格雷码的构造方法:
直接排列以二进制为0值的格雷码为第零项,第一项改变最右边的位元,第二项改变右起第一个为1的位元的左边位元,第三、四项方法同第一、二项,如此反覆,即可排列出n个位元的格雷码。

格雷码(Gray code)是1880年由法国工程师Jean-Maurice-Emlle Baudot发明的一种编码,是一种绝对编码方式,典型格雷码是一种具有反射特性和循环特性的单步自补码,它的循环、单步特性消除了随机取数时出现重大误差的可能,它的反射、自补特性使得求反非常方便。格雷码属于可靠性编码,是一种错误最小化的编码方式,因为,虽然自然二进制码可以直接由数/模转换器转换成模拟信号,但在某些情况,例如从十进制的3转换为4时二进制码的每一位都要变,能使数字电路产生很大的尖峰电流脉冲。而格雷码则没有这一缺点,它在相邻位间转换时,只有一位产生变化。它大大地减少了由一个状态到下一个状态时逻辑的混淆。由于这种编码相邻的两个码组之间只有一位不同,引起数字量发生变化时,格雷码仅改变一位,这样与其它编码同时改变两位或多位的情况相比更为可靠,即可减少出错的可能性。

2.自然二进制码转换为格雷码

自然二进制码转换成二进制格雷码,其法则是保留自然二进制码的最高位作为格雷码的最高位,而次高位格雷码为二进制码的高位与次高位相异或,而格雷码其余各位与次高位的求法相类似。实际操作时将只需将二进制码右移一位再与原值异或就行。只需一行代码:

wire	Gray[7:0], Bin[7:0];
//二进制码转换为格雷码
assign Gray[7:0] = Bin[7:0] ^ (Bin[7:0] >> 1)

3.格雷码转换为二进制码

保留格雷码的最高位作为自然二进制码的最高位,二进制码的次高位为格雷码的次高位与二进制码的(次高位+1)进行异或,其余各位采用类似的方法。代码如下:

assign Bin[7] = Gray[7];
assign Bin[6] = BIn[7] ^ Gray[6];
assign Bin[5] = BIn[6] ^ Gray[5];
assign Bin[4] = BIn[5] ^ Gray[4];
assign Bin[3] = BIn[4] ^ Gray[3];
assign Bin[2] = BIn[3] ^ Gray[2];
assign Bin[1] = BIn[2] ^ Gray[1];
assign Bin[0] = BIn[1] ^ Gray[0];