1.1基本转换原理
数字电路中,如果有采用二进制之间的状态转化可能会造成电路出现亚稳态状态,二进制进行数制状态转换的时候,容易产生多位数字的状态之间的跳变,容易产生竞争和冒险,因此在电路设计的时候应该尽量的规避这种情况的生并且设计出更为合理的结构状态转换关系;格雷码就很好的解决了这种问题,格雷码在状态转换的时候,,每个状态之间的状态变换,只有相邻一位之间不同,可以很好的解决竞争和冒险这个问题;
1.1.1格雷码转换为二进制码原理
使用格雷码的最高位作为二进制的最高位,二进制次高位产生过程是使用二进制的高位和次高位格雷码相异或得到,其他位的值与次高位产生过程类似。 假设二进制和格雷码各个位分别使用如下字符表示:
n 位的二进制: Bn, Bn-1, Bn-2。。。 B2, B1 , B0;
n 位的格雷码: Gn, Gn-1, Gn-2。。。 G2, G1, G0;
转换公式: Bn =Gn;
Bi-1 = Bi ^ Gi-1; ( i=0,1,2,n-1; )
其运算过程的示意图如下图所示(这里以 8 位的数据位宽为例):
下面我们演示一个 4bit 的格雷码和二进制转换的例子。
1.1.2veirlog程序设计
//file name : grey_bin_code.v
//file function : 格雷码转换成为二进制码
//file version : 1.0version
//file date : 2023/4/4
//Author : ZihangNie
//***************************
module grey_bin_code (
//输入信号
input grey_code, //输入格雷码
//输出信号
output bin_code
) ;
// 定义位长
parameter WIDTH = 4;
//输入数据
input [WIDTH-1:0] grey_code;
//输出数据
output [WIDTH-1:0] bin_code;
//************************main code****************************
//*************************************************************
//第一种写法,简单粗暴法
always@(*) begin
assign bin_code[3] = grey_code[3];
assign bin_code[2] = grey_code[2] ^bin_code[3] ;
assign bin_code[1] = grey_code[1] ^bin_code[2] ;
assign bin_code[0] = giey_code[0] ^bin_code[1] ;
end
endmodule//******************
这是一种最为简单的写法按照数学公式直接推倒,格雷码和二进制码的最高位码元进行保留,然后格雷码的次高位和二进制的高位进行异或得到,优点简单粗暴,缺点是只能用于有限或者位数有限的码元。
第二种设计
//file name : grey_bin_code.v
//file function : 格雷码转换成为二进制码
//file version : 1.0version
//file date : 2023/4/4
//Author : ZihangNie
//***************************
module grey_bin_code (
//输入信号
input grey_code, //输入格雷码
//输出信号
output bin_code
) ;
// 定义位长
parameter WIDTH = 4;
//输入数据
input [WIDTH-1:0] grey_code;
//输出数据
output [WIDTH-1:0] bin_code;
//************************main code****************************
//*************************************************************
assign bin_code[WIDTH-1] = grey_code[WIDTH-1] ;
genvar i;
generate
for( i = 0 ; i <= WIDTH-2 ; i=i+1)
begin : grey
assign bin_code[i] = grey_code[i] ^ bin_code[i+1];
end
endgenerate
endmodule
采用for循环,保留高位,然后循环异或
1.1.3 testbench 文件仿真
//file name : tb_grey_bin_code.v
//file function : 格雷码转换成为二进制码的仿真文件
//file version : 1.0version
//file date : 2023/4/4
//Author :ZihangNie
//***********************************************
`timescale 1ns/1ps //仿真时间1ns和仿真精度为1ps
module tb_grey_bin_code() ; // 仿真模块
//input signal
reg [3 : 0] a;
//output signal
wire [3 : 0] y ;
//
initial begin
a = 4'd0;
#100
a = 4'd1;
#100
a = 4'd2;
#100
a = 4'd3;
#100
a = 4'd4;
#100
a = 4'd5;
#100
a = 4'd6;
#100
a = 4'd7;
#100
a = 4'd8;
#100
a = 4'd9;
#100
a = 4'd10;
#100
a = 4'd11;
#100
a = 4'd12;
#100
a = 4'd13;
#100
a = 4'd14;
#100
a = 4'd15;
end
//对模块进行例化
grey_bin_code u_grey_bin_code(
.bin_code(y),
.grey_code(a)
);
endmodule
1.1.4modelsim仿真
实现了预期功能
2.1 二进制码转化成格雷码原理
二进制的最高位作为格雷码的最高位,次高位的格雷码为二进制的高位和次高位相异或得到,其他位与次高位类似。 假设二进制和格雷码各个位分别使用如下字符表示:
n 位的二进制: Bn, Bn-1,Bn-2。。。 B2,B1,B0;
n 位的格雷码: Gn, Gn-1,Gn-2。。。 G2,G1,G0;
转换公式: Gn = Bn;
Gi-1=Bi ^ Bi-1; ( i=0,1,2,n-1; )
其运算过程的示意图如下图所示(这里以 8 位的数据位宽为例
2.1.1程序设计
//file name : bin_grey_code.v
//file funciton : 设计一个二进制码转换成格雷码的设计电路
//file version : 1.0version
//file date : 2023/4/4
//Author : ZihangNie
//*******************************************************
module bin_grey_code (
//input signal
input bin_code ,
//output signal
output grey_code
);
//定义位长
parameter WIDTH = 1'd4 ; //定义位长为四位
//定义输入数据
//定义输出数据
input [WIDTH-1 ,0] bin_code ;
output [WIDTH-1 ,0] grey_code;
assign grey_code = (bin_code >> 1) ^ ( bin_code );
endmodule
2.1.2 testbench文件
//file name : tb_bin_grey_code.v
//file function : 二进制码转换成格雷码的仿真文件
//file version : 1.0version
//file date : 2023/4/4
//Author :ZihangNie
//***********************************************
`timescale 1ns/1ps //仿真时间1ns和仿真精度为1ps
module tb_bin_grey_code() ; // 仿真模块
//input signal
reg [3 : 0] a;
//output signal
wire [3 : 0] y ;
//
initial begin
a = 4'd0;
#100
a = 4'd1;
#100
a = 4'd2;
#100
a = 4'd3;
#100
a = 4'd4;
#100
a = 4'd5;
#100
a = 4'd6;
#100
a = 4'd7;
#100
a = 4'd8;
#100
a = 4'd9;
#100
a = 4'd10;
#100
a = 4'd11;
#100
a = 4'd12;
#100
a = 4'd13;
#100
a = 4'd14;
#100
a = 4'd15;
end
//对模块进行例化
bin_grey_code u_bin_grey_code(
.bin_code(a),
.grey_code(y)
);
endmodule
2.1.3modelsim仿真
与预期结果一致,实验很好完成