基于veirlog格雷码与二进制码之间的相互转换

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仿真

 与预期结果一致,实验很好完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值