0

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

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 

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

4

2 回答 2

1

这个问题在这里不是很清楚。但是有几点需要修改

首先,永远不要在两个不同的块中使用相同的变量。只需添加到敏感列表中。如下所示: alwaysrst

// 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的代码,也许你想看看波形,这似乎是根据问题描述的。

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

有关详细信息,请参阅始终阻止硬件实现和否定运算符链接中的差异。

于 2015-12-07T04:47:14.403 回答
0

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

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

于 2015-12-07T04:27:42.763 回答