题解 | #格雷码计数器#

格雷码计数器

https://www.nowcoder.com/practice/311754bcd45d42eb8d981eeddbdf1e43

    1、将格雷值转换为二进制值。
    2、根据条件递增二进制值。
    3、将二进制值转换为格雷码
    4、将计数器的最终格雷值保存到寄存器中。

`timescale 1ns/1ns

module gray_counter(
   input   clk,
   input   rst_n,

   output  reg [3:0] gray_out
);
    
    /*
    1、将格雷值转换为二进制值。
    2、根据条件递增二进制值。
    3、将二进制值转换为格雷码
    4、将计数器的最终格雷值保存到寄存器中。
    */
    
    wire    [3:0]    gray_bin;
    wire    [3:0]    bin_temp;
    reg    [3:0]    gray_temp;
    
    
    //格雷码转二进制码
    genvar i;
    generate
        for(i = 0 ; i < 4 ; i = i + 1)
            begin:gray_to_bin
                assign bin_temp[i] = ^gray_out[3 : i];
            end
    endgenerate
    
    
    //递增二进制值
    assign    gray_bin = bin_temp + 1'b1;    //由于在二进制段都是采用的组合逻辑,若是下面的二进制转格雷码也是组合,那么就只有一个时序节拍,在错误中可以看到需要两个节拍,所以转码采用时序

    
    //二进制码转格雷码
    always@(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            gray_temp <= 4'b0;
        else
            gray_temp <= gray_bin ^ (gray_bin >> 1); 
    end
    
    
    //格雷码转存寄存器
    always@(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            gray_out <= 4'b0;
        else
            gray_out <= gray_temp;
    end
    
endmodule

全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务