`timescale 1ns/100ps module gray_counter (clk, aclr, ena, gray_code); parameter SIZE = 2; input clk, aclr, ena; output [SIZE-1:0] gray_code; reg [SIZE-1:0] gray_code,tog; integer i,j,k; always @(posedge clk or negedge aclr) if (aclr==1'b0) begin gray_code <= 0; end else begin //sequential update if (ena==1'b1) begin //enabled tog = 0; for (i=0; i<=SIZE-1; i=i+1) begin //i loop // // Toggle bit if number of bits set in [SIZE-1:i] is even // XNOR current bit up to MSB bit // for (j=i; j<=SIZE-1; j=j+1) tog[i] = tog[i] ^ gray_code[j]; tog[i] = !tog[i]; // // Disable tog[i] if a lower bit is toggling // for (k=0; k<=i-1; k=k+1) tog[i] = tog[i] && !tog[k]; end //i loop // //Toggle MSB if no lower bits set (covers code wrap case) // if (tog[SIZE-2:0]==0) tog[SIZE-1] = 1; // //Apply the toggle mask // gray_code <= gray_code ^ tog; end //enabled end //sequential update endmodule