格雷码与二进制码的互换

1、前言

        格雷码和二进制码有所不同,它是一种无权码,其在一组数的编码中,任意两个相邻的数码之间只有一位二进制数不同。在硬件电路中,当许多位同时发生跳变时,大量晶体管会发生翻转,导致电路中可能出现很大的尖峰脉冲,从而导致数据不稳定。格雷码的编码特征可以有效避免亚稳态而导致数据变化发生错误。实际很多场合也用到格雷码。(比如用格雷码实现FIFO的读写指针)

下表展示了四位格雷码、四位二进制码以及十进制码的对应关系:

格雷码二进制十进制
000000000
000100011
001100102
001000113
011001004
011101015
010101106
010001117
110010008
110110019
1111101010
1110101111
1010110012
1011110113
1001111014
1000111115

可以看出相邻的格雷码只相差1bit。

2、二进制码转格雷码(bin2gray)

转换规则:

(1)最高位保持不变

(2)二进制码当前bit位与高一bit位进行异或得到当前bit位格雷码

即:

gray_{n-1} = bin_{n-1}

               gray_{i} = bin_{i}\oplus bin_{i+1}       i < n-1

eg. 

\\gray[0] = bin[0] \oplus bin[1]\\gray[1] = bin[1]\oplus bin[2]\\gray[2] = bin[2] \oplus bin[3]\\gray[3] = bin[3]

 所以输入bin[10110] = gray [11101]

RTL代码实现:

a for循环实现

module bin2gray (
    input [size - 1 : 0] bin,
    output[size - 1 : 0] gray,
);
always@(*)
begin
    parameter size = 4;
    interger i ;
    for(i=0;i<size-1;i=i+1)
    begin
        if(i=size-1)
            gray[i] = bin[i];
        else
            gray[i] = bin[i+1] ^ bin[i];
    end
end 

b 移位寄存器实现

module bin2gray (
    input [size - 1 : 0] bin,
    output[size - 1 : 0] gray,
);
    parameter size = 4;

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

2、格雷码转二进制码(gray2bin)

转换规则:

(1)最高位保持不变

(2)当前bit位格雷码与二进制的高一bit位进行异或得到当前bit位二进制码

bin_{n-1} = gray_{n-1}

              bin_{i} = gray_{i}\oplus bin_{i+1}   i < n-1

eg.

\\bin[3] = gray[3] \\ bin[2] = gray[2] \oplus bin[3] = gray[2]\oplus gray[3]\\bin[1] = gray[1] \oplus bin[2] = gray[1] \oplus gray[2]\oplus gray[3]\\bin[0] = gray[0] \oplus bin[1] = gray[0] \oplus gray[1] \oplus gray[2]\oplus gray[3]

 所以gray[11101] = bin[10110]

RTL代码实现:

for循环实现

module gray2bin(
    input [size - 1 : 0] bin,
    output[size - 1 : 0] gray,
);
always@(*)
begin
    parameter size = 4;
    interger i ;
    for(i=0;i<size-1;i=i+1)
    begin
        if(i = size-1)
            bin[i] = gray[i];
        else
            bin[i] = gray[i] ^ bin[i+1];
    end
end 


//  or

module gray2bin(
    input [size - 1 : 0] bin,
    output[size - 1 : 0] gray,
);
always@(*)
begin
    parameter size = 4;
    interger i ;
    for(i=0;i<size-1;i=i+1)
    begin
        bin[i] = ^[gray >> i];
    end
end 
  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值