前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自然二进制数与格雷码的相互转换(verilog代码|Testbench|仿真结果)

自然二进制数与格雷码的相互转换(verilog代码|Testbench|仿真结果)

原创
作者头像
Loudrs
修改2023-05-18 16:48:07
3K0
修改2023-05-18 16:48:07
举报


数字IC经典电路设计

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

个人主页链接

1.数字分频器设计

2.序列检测器设计

3.序列发生器设计

4.序列模三检测器设计

5.奇偶校验器设计

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

7.线性反馈移位寄存器LFSR

8.四类九种移位寄存器总结

9.串并转换



一、前言

什么是格雷码?

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

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

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

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

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

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

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

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

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

2.2 verilog代码

代码语言:c
复制
//自然二进制数转格雷码
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

代码语言:c
复制
`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代码

代码语言:c
复制
//格雷码转自然二进制数
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

代码语言:c
复制
`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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二、自然二进制数转格雷码
    • 2.1 自然二进制数转格雷码原理
      • 2.2 verilog代码
        • 2.3 Testbench
          • 2.4 仿真结果
          • 三、格雷码转自然二进制数
            • 2.1 格雷码转自然二进制数
              • 2.2 verilog代码
                • 2.3 Testbench
                  • 2.4 仿真结果
                  • 四、总结
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档