题解 | #格雷码计数器#
格雷码计数器
http://www.nowcoder.com/practice/311754bcd45d42eb8d981eeddbdf1e43
在我理解中格雷码计数器是指输入是格雷码,输出也是格雷码。 1️⃣以二进制计算器为例,cnt<=cnt+1;输入可以理解为上一态的二进制cnt,输出可以理解为下一态二进制的cnt,可以看出输入输出都为二进制。这里可有构成一个反馈,也就是上一态的cnt输出,就是下一态的输入 2️⃣根据别人的回答,该题答案是两个周期变化一次,于是我设计了如下电路图,一个组合电路:格雷码转二进制,两个时序电路:二进制计数器和二进制码转格雷码 `timescale 1ns/1ns
module gray_counter( input clk, input rst_n,
output reg [3:0] gray_out ); wire [3:0] bin_out; reg [3:0] s1_bin_out;
//格雷码转二进制码
assign bin_out[3]=gray_out[3];
genvar i;
generate
for(i=2;i>=0;i=i-1)
begin : gray2bin
assign bin_out[i] = bin_out[i+1]^gray_out[i];
end
endgenerate
//二进制计数器+1
always@(posedge clk or negedge rst_n)
if(!rst_n)
s1_bin_out <= 0;
else
s1_bin_out <= bin_out+1;
//二进制转格雷码寄存一拍
always@(posedge clk or negedge rst_n)
if(!rst_n)
gray_out <= 0;
else
gray_out <= s1_bin_out^(s1_bin_out>>1);
endmodule