题解 | #格雷码计数器#
格雷码计数器
http://www.nowcoder.com/practice/311754bcd45d42eb8d981eeddbdf1e43
仿真波形出来发现是计数器2个周期变一次,可以对时钟二分频得clk2。 一般这种转格雷码用在时钟域同步,将转换得到的格雷码打两拍进行同步。由于格雷码相邻两个状态只有1bit改变,这样能减少不同时钟域导致的亚稳态。
完整代码:
`timescale 1ns/1ns
module gray_counter(
input clk,
input rst_n,
output reg [3:0] gray_out
);
reg[3:0] cnt;
reg clk2;
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
clk2 <= 0;
else
clk2 <= ~clk2;
end
always@(negedge clk2 or negedge rst_n)begin
if(!rst_n)
cnt <= 0;
else
cnt <= cnt + 1;
end
always@(*)begin
if(!rst_n)
gray_out <= 0;
else
gray_out <= (cnt>>1)^cnt;
end
endmodule