自然二进制数与格雷码的相互转换



数字IC经典电路设计
经典电路设计是数字IC设计里基础中的基础,盖大房子的第一部是打造结实可靠的地基,每一篇笔者都会分门别类给出设计原理、设计方法、verilog代码、Testbench、仿真波形。然而实际的数字IC设计过程中考虑的问题远多于此,通过本系列希望大家对数字IC中一些经典电路的设计有初步入门了解。能力有限,纰漏难免,欢迎大家交流指正。

快速导航链接如下:

1.数字分频器设计
2.序列检测器设计
3.序列发生器设计
4.序列模三检测器设计
5.奇偶校验器设计



在这里插入图片描述

一、前言

什么是格雷码?

格雷码(Gray code)是一种二进制数码系统,格雷码的特点是从一个数变为相邻的一个数时,只有一个数据位发生跳变,由于这种特点,就可以避免二进制编码计数组合电路中出现的亚稳态。在某些应用中,格雷码具有排除歧义和减少数据传输错误的功能。
在这里插入图片描述

那么格雷码相较于自然二进制数有哪些优势?

避免计数器状态的冗余转换,在格雷码中,两个连续的数值仅仅只有一位不同,而在二进制码中两个连续的数值可能会有多位不同,这会导致在计数器发生器中产生大量的冗余状态转换。格雷码可以通过降低状态转换次数来设计出更简单的计数器。

降低传输干扰和误差。在数据传输过程中,如果使用二进制码,由于两个相邻的数值可能会有多位不同,数据在传输过程中可能会因为电磁干扰等原因而发生错误。而使用格雷码则能够避免这种情况,因为任何相邻的两个数值之间只有一位不同。

格雷码广泛应用在FIFO、跨时钟域的通信(CDC)、RAM地址寻址计数器、数据纠错等电路设计中。

二、自然二进制数转格雷码

2.1 自然二进制数转格雷码原理

从自然二进制码到格雷码的转换具体方法是:从二进制的最低位起,依次起与相邻左边的一位数进行异或逻辑运算,并且作为对应格雷码该位的值,最高位保持不变。简而言之就是,将二进制码与逻辑右移的二进制码进行异或可得到格雷码。
在这里插入图片描述

如图所示,根据图示可以写出的代码。

2.2 verilog代码

//自然二进制数转格雷码
module bin2gray #(
    parameter width = 4	//定义数据的位宽参数为4
    )(
    input   [width - 1 : 0]  bin,
    output  [width - 1 : 0]  gray
    );

//二进制数逻辑右移与自身进行异或逻辑运算
assign gray = (bin >> 1) ^ bin;

endmodule

2.3 Testbench

`timescale 1ns/1ps;	//仿真时间单位1ns 仿真时间精度1ps
module bin2gray_tb();

parameter width = 4;	//定义数据的位宽参数为4

//信号申明
reg   [width - 1 : 0]  bin;
wire  [width - 1 : 0]  gray;

//模块实例化(将申明的信号连接起来即可)
bin2gray u_bin2gray(
    .bin	(bin),
    .gray	(gray)
    );

//为输入数据赋值
initial begin
    bin = 4'd0;
    repeat(15) #10
    bin = bin + 1'b1;
end

endmodule

2.4 仿真结果

在这里插入图片描述

三、格雷码转自然二进制数

2.1 格雷码转自然二进制数

从格雷码到二进制码的转换具体的方法就是:从格雷码左边第二位(次高位),将每一位与其左边一位解码后的值进行异或,作为当前格雷码的值,而最左边一位(最高位)的解码结果就是它本身。简而言之就是,最高位不变,与二进制数左边一位数异或可得到当前位二进制数。
在这里插入图片描述
如图所示,根据图示可以写出的代码。

2.2 verilog代码

//格雷码转自然二进制数
module gray2bin #(
    parameter width = 4	//定义数据的位宽参数为4
    )(
    input   [width - 1 : 0]  gray,
    output  [width - 1 : 0]  bin
);

//利用generate...for逐位循环输出最低位至次高位二进制数
genvar i;
generate
    for(i = width - 2; i >= 0; i = i - 1) begin: gray_2_bin
        assign bin[i] = bin[i + 1] ^ gray[i];  //格雷码与二进制数前一位进行异或逻辑运算
    end
endgenerate

//二进制数最高位为格雷码最高位
assign bin[width - 1] = gray[width - 1];

endmodule

2.3 Testbench

`timescale 1ns/1ps;	//仿真时间单位1ns 仿真时间精度1ps
module gray2bin_tb();

parameter width = 4;	//定义数据的位宽参数为4

//信号申明
reg    [width - 1 : 0]  gray;
wire   [width - 1 : 0]  bin;

//模块实例化(将申明的信号连接起来即可)
gray2bin u_gray2bin(
    .bin	(bin),
    .gray	(gray)
    );

//为输入数据赋值
initial begin
    #10 gray = 4'd0000; 
    #10 gray = 4'd0001; 
    #10 gray = 4'd0011; 
    #10 gray = 4'd0010; 
    #10 gray = 4'd0110; 
    #10 gray = 4'd0111; 
    #10 gray = 4'd0101; 
    #10 gray = 4'd0100; 
    #10 gray = 4'd1100; 
    #10 gray = 4'd1101; 
    #10 gray = 4'd1111; 
    #10 gray = 4'd1110; 
    #10 gray = 4'd1010; 
    #10 gray = 4'd1011; 
    #10 gray = 4'd1001; 
    #10 gray = 4'd1000; 
end

endmodule

2.4 仿真结果

在这里插入图片描述

四、总结

自然二进制数与格雷码转换:

  • 从自然二进制码到格雷码的转换具体方法是:从二进制的最低位起,依次起与相邻左边的一位数进行异或逻辑运算,并且作为对应格雷码该位的值,最高位保持不变。简而言之就是,将二进制码与逻辑右移的二进制码进行异或可得到格雷码。
  • 从格雷码到二进制码的转换具体的方法就是:从格雷码左边第二位(次高位),将每一位与其左边一位解码后的值进行异或,作为当前格雷码的值,而最左边一位(最高位)的解码结果就是它本身。简而言之就是,最高位不变,与二进制数左边一位数异或可得到当前位二进制数。

自然二进制数与格雷码两者优势:

  • 自然二进制数的编码方式简单明了,容易理解,在加减运算中能够直接进行,同时十分方便进行一些位运算操作(如移位、取反等)。
  • 格雷码计数时只有一位变化,可有效减少计数器状态的冗余转换,同时在传输数据时能够减小传输错误的概率,此外带权重编码处理更加方便。

在一定程度上自然二进制数与格雷码优缺点基本相反,综上所述,自然二进制数和格雷码各有优劣之处,需要根据具体应用场景选择合适的编码方式。简单来说,在计数器和编码器中,倾向于使用格雷码;而在进行加减运算时,则倾向于使用自然二进制数。

不定期检查、补充、纠错,欢迎随时交流纠错
最后修改日期:2023.5.07

软件版本:

仿真软件:Modelsim 10.6c
绘图软件:亿图图示
描述语言:verilog

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值