`timescale 1ns/1ns module gray_counter( input clk, input rst_n, output reg [3:0] gray_out ); //参照讨论区的说法 格雷码计数器是两个周期+1 所以需要构造一个时钟二分频的使能信号 来控制二进制计数器的自加,然后再通过二进制转格雷码进行输出, //=========================================================================\\ //*****************************define sinals*******************************\\ //=========================================================================\\ reg count_en ; reg [3:0] bin_counter ; //=========================================================================\\ //*****************************main code***********************************\\ //=========================================================================\\ always@(posedge clk or negedge rst_n)begin if(!rst_n) count_en <= 1'b0 ; else count_en <= ~count_en ; end always@(posedge clk or negedge rst_n)begin if(!rst_n) bin_counter <= 'd0 ; else if(count_en) bin_counter <= bin_counter + 1'b1; else bin_counter <= bin_counter ; end always@(*)begin if(!rst_n) gray_out <= 'd0 ; else gray_out <= (bin_counter >> 1) ^ bin_counter ; end endmodule