二进制与格雷码相互转换

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


前言

  格雷码属于一种可靠性编码,是一种错误最小化的编码方式,因此格雷码在通信和测量技术中得到广泛应用。今天的任务是通过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!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值