在Verilog的环形计数器

时间:2015-12-07 04:03:15

标签: verilog circuit digital-logic iverilog

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

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 

响铃计数器测试台

active

我对数字逻辑仍然很陌生,所以请耐心等待。我对如何修改这个响铃计数器感到有些困惑。任何形式的帮助,或解释这将如何工作,将不胜感激。

2 个答案:

答案 0 :(得分:1)

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

首先,永远不要在两个不同的 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;

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

这些是我想澄清的一些观点。我在EDAPlayground here处模拟了代码,也许您希望看到波形,这似乎是根据相关描述的那个。

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

有关详细信息,请参阅Always block hardware implementationDifference in negation operators链接。

答案 1 :(得分:0)

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

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