二进制和格雷码的相互转换
二进制 格雷码
000 000
001 001
010 011
011 010
100 110
101 111
110 101
111 100
(1)二进制转格雷码:
原数右移一位再与原数异或
(2)格雷码转二进制:
二进制最高位取格雷码最高位,然后循环做二进制高位与低一位的格雷码异或
verilog代码
module GRAY_tb();
// 定义函数 完成 二进制和格雷码的相互转换
function [WIDTH:0] data_out(input op, input [WIDTH:0] data_in);
integer i;
begin
if(op == 1'b0) // ENCODE = 1'b0 二进制转为格雷码
data_out = (data_in >> 1) ^ data_in;
else if(op == 1'b1) begin // DECODE = 1'b1 格雷码转为二进制
data_out[WIDTH] = data_in[WIDTH];
for(i=WIDTH-1; i>=0; i=i-1)
data_out[i] = data_out[i+1] ^ data_in[i];
end
end
endfunction
parameter WIDTH = 4;
parameter ENCODE = 1'b0;
parameter DECODE = 1'b1;
reg clk;
reg rst;
reg [WIDTH-1:0] data_in;
wire [WIDTH-1:0] data_encode;
wire [WIDTH-1:0] data_decode;
initial begin
clk = 0;
rst = 1;
#5 rst = 0;
#15 rst = 1;
end
initial begin
forever #2 clk = ~clk;
end
always@(posedge clk or negedge rst) begin
if(!rst)
data_in <= 0;
else begin
data_in = data_in + 1'b1;
end
end
assign data_encode = data_out(ENCODE, data_in);
assign data_decode = data_out(DECODE, data_encode);
endmodule