题解 | #格雷码计数器#
格雷码计数器
https://www.nowcoder.com/practice/311754bcd45d42eb8d981eeddbdf1e43
`timescale 1ns/1ns
module gray_counter(
input clk,
input rst_n,
output reg [3:0] gray_out
);
//格雷码是一种相邻数据只有1bit变化的码制
//计数器两个周期+1 ————即需要一个二分频
//1、格雷码转二进制 2、加法器 3、二进制转格雷码
//两个周期
reg clk_2;
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
clk_2 <= 0;
end
else begin
clk_2 <= ~clk_2;
end
end
//两个周期计数器加1
reg [3:0] counter;
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
counter <= 0;
end
else begin
counter <= clk_2? counter + 1 : counter;
end
end
always @(*) begin
if(!rst_n) begin
gray_out <= 0;
end
else begin
gray_out <= counter ^ (counter >> 1);
end
end
endmodule