【FPGA/verilog -入门学习8】verilog格雷码与二进制互相转换-公式法

本文参考:

数字电路基础知识——格雷码和二进制码的转换的算法和Verilog实现_格雷码和二进制的转换电路-CSDN博客

需求:熟悉二进制与格雷码的互转方法

1,4位格雷码转二进制

【FPGA/verilog -入门学习8】verilog格雷码与二进制互相转换-公式法_第1张图片

使用公式法,按位列出二进制的每一位的对应关系

发现

bin3 = gray3

bin2 = gray3 xor gray2 =bin3 xor gray2

bin1 = gray3 xor gray2 xor gray1 = bin2 xor gray1

bin0 = gray3 xor gray2 xor gray1 xor gray0 = bin1 xor gray1

gray2bin

/
/*
组合逻辑 实现格雷码转二进制
 */
/
`timescale 1ns/1ps
module gray2bin  #(
    parameter  WIDTH = 8
    )
(
    input [WIDTH-1:0] gray_data, 
    output  [WIDTH-1:0] bin_data
    );
    
 
assign bin_data[WIDTH-1] = gray_data[WIDTH-1];
 

/*
generate for 中使用组合逻辑
*/
genvar i;
generate 
    for(i = WIDTH-2;i >= 0;i = i-1) begin:gray2bin_label
     assign     bin_data[i] = (gray_data[i] ^ bin_data[i+1]);
     end
endgenerate 

endmodule

2,4位二进制转格雷码

gray3 = bin3

gray2 = bin 2 xor bin3

gray1 = bin 1 xor bin2

gray0 = bin 0 xor bin1

bin2gray

/
/*
  公式法 二进制转格雷码
 */
/
`timescale 1ns/1ps
module bin2gray #(
    parameter  WIDTH = 8
    )
    (
    input [WIDTH-1:0] i_data, 
    output  [WIDTH-1:0] o_datas
    );
    



assign o_datas[WIDTH-1] = i_data[WIDTH-1];

genvar i;
generate 
    for(i = WIDTH-2;i >= 0;i = i-1) begin :bin2gray_lable
        assign o_datas[i] = i_data[i] ^ i_data[i+1];
    end
endgenerate 
    

3,仿真代码

使用for 生成 1-2**WIDTH_T 的 二进制数

将二进制数转成格雷码

再将格雷码还原成二进制

testbench_top

`timescale 1ns/1ps
module testbench_top();
    

//参数定义
     


localparam WIDTH_T = 8;
localparam number = 2**WIDTH_T;

//接口申明
reg[WIDTH_T-1:0]bin_data_init;
wire[WIDTH_T-1:0]gray_data_init;
wire[WIDTH_T-1:0]bin_data;

gray2bin     #(
    .WIDTH(WIDTH_T)
    )
    uut_vlg_design(
    .gray_data(gray_data_init),
    .bin_data(bin_data) 
    );    
    
bin2gray #(
    .WIDTH(WIDTH_T)
    )
    bin2gray_design(
    .i_data(bin_data_init),
    .o_datas(gray_data_init) 
    );        
  
    
integer i;
//产生
initial begin
    $display("%d\n",number);
    for (i = 0;i <= number-1;i = i+1) begin
        bin_data_init <= i;
        #10;
    end
    
    #2000;
    $stop;
end

endmodule

4,仿真结果

5,总结注意事项

1,操作步骤,可以先从4位的二进制/格雷码互相转换熟悉公式法方法

2,完成初步的熟悉过程后,再通过端口定义常量方法将位数传递出去

module gray2bin  #(
    parameter  WIDTH = 8
    )
(
 input [WIDTH-1:0] gray_data, 
    output  [WIDTH-1:0] bin_data
)

localparam WIDTH_T = 8;
localparam number = 2**WIDTH_T;
gray2bin     #(
    .WIDTH(WIDTH_T)
    )
    uut_vlg_design(
    .gray_data(gray_data_init),
    .bin_data(bin_data) 
    );    
    

3,在generate for 语句中,赋值为组合逻辑的写法

assign bin_data[i] = (gray_data[i] ^ bin_data[i+1]);

4,异或和次方的写法

异或:c = a ^ b;

次方: d = 2**3; //2的3次方

d = $pow(2, 3); // 计算2的4次方,并将结果存储在d中

你可能感兴趣的:(verilog,&FPGA,fpga开发,学习)