格雷码-数字设计应用

背景

由于人为或非人为的原因,代码在计算机或其他数字系统中形成、传送和运算过程中都有可能出现错误。于是人们在提高计算机本身的可靠性的同时,也创造了一些可靠性编码。它们令代码本身具有一种特征或能力,使得代码在形成中不容易出错,或代码在出错时容易被发现,甚至能查出出错的位置并予以纠正。

格雷码就是一种可靠性编码。在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码,另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码。在数字系统中,常要求代码按一定顺序变化。例如,按自然数递增技术,若采用8421码,则数0111变到1000时四位均要变化,而在实际电路中,4位的变化不可能绝对同时发生,则计数中可能出现短暂的其他代码(1100、1111等)。在特定情况下可能导致电路状态错误或输入错误。使用格雷码可以避免这种错误。

 

二进制到格雷码转换:

1,格雷码中的最高有效位(最左边)等同于二进制数中相应的最高有效位。

2,从左到右,加上每一对相邻的二进制编码位,从而得到下一个格雷码位,舍去进位。

例如二进制数10110到格雷码的转换如下,格雷码是11101:

       代码:gray = binary ^ (binary >> 1) 

 二进制到格雷码转换器

module  bin_to_gray (bin , gray);
    parameter SIZE = 4;
    input   [SIZE - 1 :0] bin;
    output  [SIZE - 1 :0] gray;
    assign gray = (bin >> 1) ^ bin ;
endmodule 
    

格雷码到二进制转换器

module  gray_to_bin (bin , gray);
    parameter SIZE = 4;
    input   [SIZE - 1 :0] gray;
    output  [SIZE - 1 :0] bin;
    always@(gray)begin
        for(i = 0 ; i <= SIZE ; i++)
            bin[i] = ^(gray >> i);
    end
endmodule 
    

格雷码主要应用

减低误码率,减少毛刺现象(异步FIFO设计)

同步格雷码计数器很少会导致取样计数器值出现亚稳态,此外取样后的值最多只有一位出现错误

由于翻转位数少,能耗低(状态编码与解码,格雷码是最适合低功耗设计的)

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值