题解 | #格雷码计数器#
格雷码计数器
https://www.nowcoder.com/practice/311754bcd45d42eb8d981eeddbdf1e43
本题目中gray_code是两个周期改变一次!
看到揭发中有两种方法。
法一:
计数器2个周期变一次,可以设置一个5bit的二进制计数器,忽略最低位。
想到了这一道题目:使用cnt进行分频:VL37 时钟分频(偶数)https://www.nowcoder.com/practice/49a7277c203a4ddd956fa385e687a72e
法二:
设置flag,每clk改变一次状态。
下面参考https://blog.nowcoder.net/n/deb4d589e22444f794708bbaee2a88ec?f=comment
使用自然二进制码计数时,相邻数据之间可能会产生多bit的变化。比如,从0111→11110111→1111
,四个bit全部发生了变化。这会产生较大的尖峰电流以及其他问题。格雷码是一种相邻数据只有1bit变化的码制
最后一点,根据波形图,计数器两个周期变化一次。
`timescale 1ns/1ns module gray_counter( input clk, input rst_n, output reg [3:0] gray_out ); reg [3:0] binary_cnt; reg flag; always@(posedge clk or negedge rst_n) if(~rst_n) flag <= 0; else flag <= ~flag; always@(posedge clk or negedge rst_n) if(~rst_n) binary_cnt <= 0; else binary_cnt <= flag? binary_cnt+1:binary_cnt; always@(*) gray_out <= binary_cnt^(binary_cnt>>1); endmodule