【问题标题】:Synthesizing a counter with an asynchronous edge-triggered reset使用异步边沿触发复位合成计数器
【发布时间】:2020-10-19 05:16:37
【问题描述】:

我想合成一个带有异步边沿触发复位的时钟计数器:计数器在每个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 的值是不确定的。

我相信,如果有一种方法可以优先处理边沿触发的复位操作,使其优先于典型的计数器递增之前发生。

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

【问题讨论】:

  • @toolic rst 信号与 clk 信号异步。
  • 如果您希望 rst 在正常操作期间有效,它应该与 clk 同步。否则,您可能会遇到亚稳态问题(异步删除/恢复)并破坏您的电路。将第一个信号重新同步到 clk 应该很容易,只要它足够长。
  • @Vilhelm Gray,您希望 count 对 2 个边缘敏感。它是不可合成的,并且与您的目标 FPGA 无关,因为没有硬件来实现它。
  • @VilhelmGray:rst 高时间是否有最短持续时间,例如总是 3 clk
  • @VilhelmGray:用通用的元件在FPGA中实现这个,标准的方法是使用普通时钟作为计数器触发器时钟,然后将rst(Bob)clk(Alice)同步到带有双电平触发器的普通时钟。同步的rst(Bob)clk(Alice) 则在普通时钟域中,您可以对它们进行简单的0 到1 检测,并进行普通同步设计,与工具和FPGA 配合得很好。 rst(Bob)clk(Alice) 脉冲的持续时间必须至少为 2 个普通时钟周期才能正常工作。

标签: verilog fpga


【解决方案1】:

“连接到多个驱动程序”错误不是竞争条件 - 不能将值分配给多个 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。但是,这种设计对时序更敏感与更简单的设计相比,约束(并且更有可能违反建立/保持)。

【讨论】:

  • VilhelmGray 在评论中写道,rstclk异步,所以这个建议不起作用,因为使用了rst 和派生的rst_prevclk为身份。
  • 虽然这个解决方案在复位操作发生在rst 的上升沿之后确实有效,但 Morten Zilmer 是对的:如果rst 信号在两个时间之间来回切换clk上升沿,可能会错过复位操作。
  • 我不同意。是的,rst 是异步的,但 rst_prev 将是异步的。此外,我确实试图提到该设计将更加危险,因为如果 rst 更改为接近 clk 的位姿,则建立/保持违规的可能性非零。缓冲/同步 rst 会有所帮助。这是在检测rst 的边缘或有可能出现计时错误之间的权衡。
  • @Wilcroft:如果rst要同步到clk域中的rst_prev,那么它至少应该与两级触发器同步以避免元稳定性rst_prev.
  • @VilhelmGray - 可能是因为同一个问题的结果,只是表现形式略有不同 - 综合工具在同一个 if-block 子句中检测来自不同域的信号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-03
  • 2016-09-07
  • 1970-01-01
相关资源
最近更新 更多