二进制和格雷码之间的转换

格雷码特点
  • 格雷码属于可靠性编码,是一种错误最小化的编码方式。因为,虽然自然二进制码可以直接由数/模转换器转换成模拟信号,但在某些情况,例如从十进制的3转换为4时二进制码的每一位都要变,能使数字电路产生很大的尖峰电流脉冲。而格雷码则没有这一缺点,它在相邻位间转换时,只有一位产生变化。它大大地减少了由一个状态到下一个状态时逻辑的混淆。由于这种编码相邻的两个码组之间只有一位不同,因而在用于方向的转角位移量-数字量的转换中,当方向的转角位移量发生微小变化(而可能引起数字量发生变化时,格雷码仅改变一位,这样与其它编码同时改变两位或多位的情况相比更为可靠,即可减少出错的可能性。
  • 格雷码是一种绝对编码方式,典型格雷码是一种具有反射特性和循环特性的单步自补码,它的循环、单步特性消除了随机取数时出现重大误差的可能,它的反射、自补特性使得求反非常方便。
  • 由于格雷码是一种变权码,每一位码没有固定的大小,很难直接进行比较大小和算术运算,也不能直接转换成液位信号,要经过一次码变换,变成自然二进制码,再由上位机读取。
  • 典型格雷码是一种采用绝对编码方式的准权码,其权的绝对值为2^i-1(设最低位i=1)。
  • 格雷码的十进制数奇偶性与其码字中1的个数的奇偶性相同。
二进制和格雷码对照表

在这里插入图片描述

二进制转格雷码HDL实现

转换原理:N位二进制转换得到N位格雷码,二进制第N位补0,二进制第N位和第N-1位异或,得到格雷码第N-1位数据,依次异或。
在这里插入图片描述

HDL代码实现:

gray[0] = bin[0] ^ bin[1];
gray[1] = bin[1] ^ bin[2];
gray[2] = bin[2] ^ bin[3];
gray[3] = bin[3];		//bin[3] ^ 0;

模块实现:

module bin2gray(
    //inputs
    input [SIZE-1:0] bin,
    //outputs
    input [SIZE-1:0] gray
);

parameter SIZE = 4;

assign gray = (bin>>1) ^ bin;

endmodule
格雷码转二进制HDL实现

从左边第二位起,将每位与左边一位解码后的值异或,作为该位解码后的值(最左边一位依然不变)。依次异或,直到最低位。依次异或转换后的值(二进制数)就是格雷码转换后二进制码的值。

HDL代码实现:

bin[0]= gray[3] ^ gray[2] ^ gray[1] ^ gray[0];
bin[1] = gray[3] ^ gray[2] ^ gray[1];
bin[2] = gray[3] ^ gray[2];
bin[3] = gray[3];

等效于:

bin[0] = gray[3] ^ gray[2] ^ gray[1] ^ gray[0] ; // gray>>0
bin[1] =   1'b0  ^ gray[3] ^ gray[2] ^ gray[1] ; // gray>>1
bin[2] =   1'b0  ^   1'b0  ^ gray[3] ^ gray[2] ; // gray>>2
bin[3] =   1'b0  ^   1'b0  ^   1'b0  ^ gray[3] ; // gray>>3

模块实现:

module gray2bin(
    //inputs
    input [SIZE-1:0] gray,
    //outputs
    output reg [SIZE-1:0] bin
);

parameter SIZE = 4;

reg [SIZE-1:0] bin;

integer i;
always @ (gray)
    for (i = 0; i < SIZE; i = i + 1)
        bin[i] = ^(gray >> i);
endmodule
镜像对称

Gray码除了MSB外,具有镜像对称的特点
在这里插入图片描述

参考资料
  • http://www.sliu.info/2020/FIFO-%E4%BB%8B%E7%BB%8D1/
  • https://baike.baidu.com/item/%E6%A0%BC%E9%9B%B7%E7%A0%81
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

whik1194

如果对你有帮助,欢迎打赏。谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值