天天看點

二進制和格雷碼的互相轉換-附verilog代碼及仿真結果二進制和格雷碼的互相轉換

二進制和格雷碼的互相轉換

二進制	格雷碼
 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
           

仿真結果

二進制和格雷碼的互相轉換-附verilog代碼及仿真結果二進制和格雷碼的互相轉換