alt

格雷码转化为二进制码:

Bn =Gn; Bi-1 = Bi ^ Gi-1;( i=1,2,n-1; )

二进制码转化为格雷码:

Gn = Bn; Gi-1=Bi ^ Bi-1; ( i=1,2,n-1; )

module gray_counter(
   input   clk,
   input   rst_n,
   output  reg [3:0] gray_out
);

//格雷码转二进制
reg  [3:0] bin_out;
wire [3:0] gray_wire;
 
always @(posedge clk or negedge rst_n)begin
   if(rst_n == 1'b0) begin
      bin_out <= 4'b0;
   end
   else begin
//        bin_out = {gray_wire[3], gray_wire[2]^bin_out[3], gray_wire[1]^bin_out[2], gray_wire[0]^bin_out[1]}; 
//这种写法是错误的,下面的多次赋值中bin_out的每一位是可能改变的,这种一次赋值的写法是不变的。
      bin_out[3] = gray_wire[3];
      bin_out[2] = gray_wire[2]^bin_out[3];
      bin_out[1] = gray_wire[1]^bin_out[2];
      bin_out[0] = gray_wire[0]^bin_out[1];
   end
end

//二进制加一
reg [3:0] bin_add_wire;
always @(posedge clk or negedge rst_n)begin
   if(rst_n == 1'b0) begin
      bin_add_wire <= 4'b0;
   end
   else begin
      bin_add_wire <= bin_out + 1'b1;
   end
end

//二进制转格雷码
assign gray_wire = (bin_add_wire >> 1) ^ bin_add_wire;
always @(posedge clk or negedge rst_n)begin
   if(rst_n == 1'b0) begin
      gray_out <= 4'b0;
   end
   else begin
      gray_out <= gray_wire;
   end
end

endmodule