Verilog——格雷码与二进制码的相互转换

Verilog——格雷码与二进制码的相互转换

定义与作用

  • 格雷码是一种相邻数值仅有一个数位发生变化的编码。

  • 格雷码被广泛应用于异步FIFO的数据传输中。当数值从一个时钟域传递到另一个时钟域时,仅有一个比特位的翻转十分重要。

格雷码与二进制码的转换

  • 3bit位宽数据,二进制和格雷码的对应关系
二进制码 000 001 010 011 100 101 110 111
格雷码 000 001 011 010 110 111 101 100
  • 4bit位宽数据,二进制和格雷码的对应关系
二进制码 0000 0001 0010 0011 0100 0101 0110 0111
格雷码 0000 0001 0011 0010 0110 0111 0101 0100
二进制码 1000 1001 1010 1011 1100 1101 1110 1111
格雷码 1100 1101 1111 1110 1010 1011 1001 1000
  • 二进制码转换为格雷码

位宽W的数据:

  1. 最高位相同:graycode[W-1] = bincode[W-1]

  2. 其它数位:graycode[i] = bincode[i] ^ bincode[i+1], i∈[0, W-2]

  • 格雷码转换为二进制码

位宽W的数据:

  1. 最高位相同:bincode[W-1] = graycode[W-1]

  2. 其它数位:bincode[i] = graycode[i] ^ bincode[i+1], i∈[0, W-2]

代码实现

1. 二进制码转换为格雷码

//bin2gray.v
`timescale 1ns/1ps

module bin2gray
#(
    parameter   W = 8           //位宽
)
(
    input   [W-1:0]     bincode,
    output  [W-1:0]     graycode
);

assign graycode = bincode ^ (bincode >> 1);

endmodule

2. 格雷码转换为二进制码

//gray2bin.v
`timescale 1ns/1ps
module gray2bin
#(
    parameter   W = 8   //位宽
)
(
    input [W-1 : 0]     graycode    ,
    output[W-1 : 0]     bincode

);
assign bincode[W-1] = graycode[W-1];
generate
    genvar i;
    for(i = 0; i < W-1; i = i + 1) begin
        assign bincode[i] =  bincode[i+1] ^ graycode[i];
    end
endgenerate

endmodule

3. 联合仿真

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

localparam WIDTH = 8;
reg     [WIDTH-1 : 0] bin_in;
wire    [WIDTH-1 : 0] gray_out;
wire    [WIDTH-1 : 0] bin_out;


bin2gray 
#(
    .W          (WIDTH      )//位宽
)
bin2gray_inst
(
    .bincode    (bin_in     ),
    .graycode   (gray_out   )
);

gray2bin 
#(
    .W          (WIDTH      )//位宽
)
gray2bin_inst
(
    .graycode   (gray_out   ),
    .bincode    (bin_out    )

);


integer i;
initial begin
    for(i = 0; i < (1<<WIDTH); i = i +1) begin
        bin_in = i;
        #10;
    end
end

endmodule

4. 仿真结果

posted @ 2022-04-22 15:22  fxz_abc  阅读(1343)  评论(0编辑  收藏  举报