二进制与格雷码相互转换的Verilog代码

本文详细解析了格雷码与自然二进制数之间的转换逻辑,通过具体的数值对比,阐述了格雷码的特性及其在电子工程中的应用。同时,提供了基于Verilog的格雷码与二进制互转的代码实现,包括模块设计和测试代码,有助于读者深入理解并实际操作这一转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

十进制数自然二进制数格雷码
000000000
100010001
200100011
300110010
401000110
501010111
601100101
701110100
810001100
910011101
1010101111
1110111110
1211001010
1311011011
1411101001
1511111000

格雷码转换二进制码的逻辑关系为:
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]

通过上述4个计算可以等效为:
bin[0] = bin[1] ^ gray[0]
bin[1] = bin[2] ^ gray[1]
bin[2] = bin[3] ^ gray[2]
bin[3] = gray[3]

设计代码

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2020/07
// Design Name: 
// Module Name: Test1103
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
//////////////////////////////////////////////////////////////////////////////////


module Test1103(gray,bin,clk,inc,rst_n);
parameter size=4;
output [size-1:0] gray,bin;
input clk,inc,rst_n;
reg [size-1:0] gnext,gray,bnext,bin;
integer i;
///////////////////////////////////////////////////////
//时序逻辑
always @(posedge clk or negedge rst_n) begin
   if(!rst_n) begin
      gray <= 0;
   end
   else begin
      gray <= gnext;
   end
end
///////////////////////////////////////////////////////
//组合逻辑
always @(gray or inc) begin
	for(i=0;i<size;i=i+1) begin
    	bin[i] = ^(gray>>i);
    	bnext = bin + inc;
        gnext = (bnext>>1) ^ bnext;
    end
end

endmodule
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2025/08
// Design Name: 
// Module Name: GRAY转二进制
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
//////////////////////////////////////////////////////////////////////////////////


module Test2508(gray,bin,clk,inc,rst_n);
parameter WIDTH= NUM;

input clk,rst_n;
input [WIDTH-1 : 0] gray;
output [WIDTH-1 : 0] bin;

reg [WIDTH-1 : 0] bin_d;

///////////////////////////////////////////////////////
//组合或者时序都可以,异或位置调换即为bin转gray
integer i;
always @(*) begin
	for (i=0; i<WIDTH-2; i++) begin
		bin_d[i] = gray[i+1] ^ gray[i];
	end
end

assign bin = bin_d;

endmodule

测试代码(Testbench)

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2020/07
// Design Name: 
// Module Name: Test1110
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description:  
//////////////////////////////////////////////////////////////////////////////////


module Test1110;
reg clk;
reg rst_n;
reg inc;
wire [3:0] gray,bin;
always begin
   #10 clk=0;
   #10 clk=1;
end

initial begin
   clk=0;
   inc=0;
   rst_n=0;
   #100;
   rst_n=1;
   #20;
   inc=1;
end
Test1103 x1(.gray (gray ),
            .bin  (bin  ),
            .clk  (clk  ),
            .inc  (inc  ),
            .rst_n(rst_n));
endmodule

仿真波形如下
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值