合成具有异步边沿触发复位的计数器

Synthesizing a counter with an asynchronous edge-triggered reset

我想合成一个具有异步边沿触发复位的时钟计数器:计数器在每个 clk 上升沿递增,并在 [=13] 的上升沿复位到 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 的值是不确定的。

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

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

"Connected to multiple drivers" 错误不是竞争条件 - 无法将值分配给多个 always 块中的同一个网络。此外,请记住 HDL 不是按顺序执行的 - 将分配放在文件中的较早位置不会赋予它更高的优先级。

相反,您的 always 块需要多个灵敏度。试试这个:

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。但是,这个与更简单的设计相比,设计对时序约束更敏感(并且更有可能 setup/hold 违规)。