二進制和格雷碼的互相轉換
二進制 格雷碼
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
[email protected](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