Verilog 中的环形计数器

Ring Counter in Verilog

我需要修改此环形计数器以从最高有效位移至最低有效位,然后重置回最高有效位。输出应如下所示:

100000 
010000 
001000 
000100  
000010 
000001 
100000 

环形计数器

module ringcounter(clk, rst, count);  
    input clk, rst; 
    output [5:0] count; 
    wire clk, rst; 
    reg [5:0] count = 6'b1;  
    // Respond to the positive-going pulse edge     
    always @ ( posedge clk ) 
        begin   
        if ( ~rst )   
            begin     
            count <= count << 1;    
            count[0] <= count[5];   
        end 
    end  
    // Respond to the positive-going reset signal 
    always @ ( posedge rst ) 
    begin   
        count <= 6'b1; 
    end  
endmodule 

环形计数器测试平台

module ringcounter_tb();  
    reg clk = 0, rst = 0; 
    wire [5:0] count;  
    always #1 clk = !clk; // Create a clock pulse  

    initial begin   
    $monitor("At time %4t, count = %b", $time, count );  
        #20 rst = 1;   
        #1  rst = 0;
        #20 $finish; 
    end  

    ringcounter cntr01 ( .clk(clk), .rst(rst), .count(count) );  
endmodule 

我对数字逻辑还很陌生,所以请多多包涵。对于如何修改这个环形计数器,我只是有点困惑。任何形式的帮助或解释这究竟是如何工作的,将不胜感激。

https://gist.github.com/vividvilla/4605985

这应该可以,它包含测试平台和程序的输出:)

这里的问题不是很清楚。但有几件事需要修改

首先,永远不要在两个不同的 always块中使用相同的变量。只需将 rst 添加到 敏感度列表 。类似如下:

// sensitive to clock and reset both
always @ ( posedge clk, posedge rst )
        begin   
        if ( ~rst )   
            begin     
            count <= count << 1;    
            count[0] <= count[5];   
        end 
          else 
            count <= 8'b1;
    end  

使用边沿敏感 always块导致触发器创建。如果这是在 两个 不同的块中完成的,那么 综合问题 应该发生。这可以通过你想要的门和寄存器逻辑来形象化。

此外,在时钟生成期间,建议使用按位取反(~)。

! 符号代表布尔值或逻辑非。而~符号代表按位求反

// Replace this
always #1 clk = !clk;
// With this
always #1 clk = ~clk;

20ns之后应用rst并在20ns之后终止模拟应该不是你想要的。您可能想改用 #200 $finish;

这些是我想阐明的一些要点。我在EDAPlayground here处模拟了代码,也许你想看波形,这似乎是根据问题描述的

更多关于合成的指南可以从this PDF获得。

请参阅 Always block hardware implementation and Difference in negation operators 链接以获取更多信息。