二进制与格雷码相互转换

本文详细介绍了如何使用Verilog语言实现二进制到格雷码以及格雷码到二进制的转换。通过提供具体的代码示例,包括Bin2Gray模块和Gray2Bin模块,展示了转换的原理和过程。通过仿真验证,转换结果正确无误,证明了设计的正确性。

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


前言

  格雷码属于一种可靠性编码,是一种错误最小化的编码方式,因此格雷码在通信和测量技术中得到广泛应用。今天的任务是通过verilog实现二进制和格雷码之间的相互转换。

在这里插入图片描述

一、二进制转格雷码

  1. 原理图
    在这里插入图片描述
  2. 编写Bin2Gray.v代码,代码如下
module Bin2Gray#(parameter PTR=3)(

	input wire [PTR : 0] bin,//输入二进制
	output wire [PTR : 0] gray//输出格雷码
);
	
	generate//generate for 固定使用
		genvar i;
		for(i=0; i < PTR; i = i+1)begin:bin_gray
			assign gray[i] = bin[i] ^ bin[i+1];//转换规则
		end 
	endgenerate
	assign gray[PTR] = bin[PTR];//高位一致
endmodule 
  1. 编写Bin2Gray_tb.v测试文件,代码如下
`timescale 1ns/1ns
module Bin2Gray_tb();
parameter PTR = 3;//4位PTR+1
reg  [PTR:0]  bin;//4位二进制
wire [PTR:0]  gray;//4位格雷码

always #1 bin = bin + 1'b1;//二进制不断加1

initial begin
	bin = {(PTR+1){1'b0}};//初始化
	#((PTR+1)**2);//观察,位宽的平方
	$stop;//停止
end 

Bin2Gray#(PTR)	u_Bin2Gray(
.bin  (bin),

.gray (gray)
);
endmodule 
  1. 仿真结果

在这里插入图片描述

二、格雷码转二进制

  1. 原理图

在这里插入图片描述

  1. 编写Bin2Gray.v文件,代码与第一章节中的Bin2Gray.v文件一致,把二进制转换为格雷码,代码如下
module Bin2Gray#(parameter PTR=3)(

	input wire [PTR : 0] bin,//输入二进制
	output wire [PTR : 0] gray//输出格雷码
);
	
	generate//generate for 固定使用
		genvar i;
		for(i=0; i < PTR; i = i+1)begin:bin_gray
			assign gray[i] = bin[i] ^ bin[i+1];//转换规则
		end 
	endgenerate
	assign gray[PTR] = bin[PTR];//高位一致
endmodule 
  1. 编写Gray2Bin.v文件,把格雷码转换为二进制,代码如下
module Gray2Bin#(parameter PTR=3)(

	input wire [PTR : 0] gray,//输入格雷码
	output wire [PTR : 0] bin//输出二进制
);
	
	generate//generate for 固定使用
		genvar i;
		for(i=0; i < PTR; i = i+1)begin:bin_gray
			assign bin[i] = gray[i] ^ bin[i+1];//转换规则
		end 
	endgenerate
	assign bin[PTR] = gray[PTR];//高位一致
endmodule 


  1. Bin2Gray2Bin.v文件,调用2、3模块,代码如下
module Bin2Gray2Bin#(parameter PTR=3)(
	input wire [PTR:0] bin,//输入二进制
	
	output wire [PTR:0] bin_same//输出格雷码转换后的二进制
);

wire [PTR:0] gray;//格雷码转换后的二进制

//实例化二进制转格雷码模块,输出格雷码
Bin2Gray#(PTR)	u_Bin2Gray(

.bin	(bin),//输入二进制

.gray	(gray)//输出格雷码
);

//实例化格雷码转二进制模块,观察bin和bin_same是否一致
Gray2Bin#(PTR)	u_Gray2Bin(
.gray	(gray),

.bin (bin_same)
);
endmodule 
  1. 编写Gray2Bin_tb.v测试文件,测试4中的模块,观看输入输出信号是否一致,代码如下
`timescale 1ns/1ns
module Gray2Bin_tb();
parameter PTR = 3;//4位PTR+1
reg  [PTR:0]  bin;//4位二进制
wire [PTR:0]  bin_same;//转换后的二进制
always #1 bin = bin + 1'b1;//二进制不断加1

initial begin
	bin = {(PTR+1){1'b0}};//初始化
	#((PTR+1)**2);//观察,位宽的平方
	$stop;//停止
end 


Bin2Gray2Bin#(PTR) u_Bin2Gray2Bin(
.bin		(bin),//输入二进制
			
.bin_same(bin_same)//输出格雷码转换后的二进制
);

endmodule 
  1. 仿真结果

在这里插入图片描述
  结果显示,完美!

总结

  Who is gray? Don’t talk too much about gray,show me the code and simmulation!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值