题解 | #格雷码计数器#
格雷码计数器
https://www.nowcoder.com/practice/311754bcd45d42eb8d981eeddbdf1e43
1、将格雷值转换为二进制值。 2、根据条件递增二进制值。 3、将二进制值转换为格雷码 4、将计数器的最终格雷值保存到寄存器中。 `timescale 1ns/1ns module gray_counter( input clk, input rst_n, output reg [3:0] gray_out ); /* 1、将格雷值转换为二进制值。 2、根据条件递增二进制值。 3、将二进制值转换为格雷码 4、将计数器的最终格雷值保存到寄存器中。 */ wire [3:0] gray_bin; wire [3:0] bin_temp; reg [3:0] gray_temp; //格雷码转二进制码 genvar i; generate for(i = 0 ; i < 4 ; i = i + 1) begin:gray_to_bin assign bin_temp[i] = ^gray_out[3 : i]; end endgenerate //递增二进制值 assign gray_bin = bin_temp + 1'b1; //由于在二进制段都是采用的组合逻辑,若是下面的二进制转格雷码也是组合,那么就只有一个时序节拍,在错误中可以看到需要两个节拍,所以转码采用时序 //二进制码转格雷码 always@(posedge clk or negedge rst_n) begin if(!rst_n) gray_temp <= 4'b0; else gray_temp <= gray_bin ^ (gray_bin >> 1); end //格雷码转存寄存器 always@(posedge clk or negedge rst_n) begin if(!rst_n) gray_out <= 4'b0; else gray_out <= gray_temp; end endmodule