题解 | #格雷码计数器#

格雷码计数器

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

全部评论
最清晰简单的方法,感谢
点赞 回复 分享
发布于 2023-06-27 22:29 英国

相关推荐

后端彭于晏:你无敌了
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务