将计数器与异步边沿触发的重置相结合



我想合成一个具有异步边沿触发复位的时钟计数器:计数器在每个上升沿clk递增,并在rst信号的上升沿复位为0

计数器复位至0必须由边沿触发,因为rst信号可能无限期地保持高电平。

这是我所拥有的:

module clk_counter(input clk, input rst, output reg [7:0] count);
always @ (posedge rst) begin
    count <= 0;
end
always @ (posedge clk) begin
    if(count < 255) begin
        count <= count + 1;
    end
end
endmodule

我在合成实现时遇到问题,因为根据我的合成器吐出的错误消息count"连接到多个驱动程序"。我怀疑这是由于设计中的竞争条件:如果rstclk同时上升,count的值是不确定的。

我相信,如果有一种方法可以在典型的计数器增量之前确定边缘触发的重置操作的优先级,则可以解决竞争条件。

有没有办法在两个边缘触发的操作之间确定优先级?

"连接到多个驱动程序"错误不是争用条件 - 值不能在多个始终块中分配给同一网络。此外,请记住,HDL 不是按顺序执行的 - 将赋值放在文件中的前面不会赋予它更高的优先级。

相反,您的始终阻止需要多个灵敏度。试试这个:

reg rst_prev;
always @(posedge clk)
     rst_prev <= rst;
always @(posedge clk or posedge rst)
begin
    if (rst)
    begin
        if (!rst_prev)
            count <= 0;
    end
    else begin
        if (count < 255)
            count <= count + 1;
    end
end

这与其他人提出的解决方案之间的主要区别在于,根据需要,它只会在 rst 的边缘触发,因为rst_prev将为 0,而 rst 将包含 1。但是,与更简单的设计相比,这种设计对时序约束更敏感(并且更有可能出现设置/保持违规)。

最新更新