`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