【发布时间】: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 是“连接到多个驱动程序”,因此我无法合成该实现。我怀疑这是由于设计中的竞争条件造成的:如果rst 和clk 同时上升,count 的值是不确定的。
我相信,如果有一种方法可以优先处理边沿触发的复位操作,使其优先于典型的计数器递增之前发生。
有没有办法在两个边缘触发的操作之间区分优先级?
【问题讨论】:
-
@toolic
rst信号与clk信号异步。 -
如果您希望 rst 在正常操作期间有效,它应该与 clk 同步。否则,您可能会遇到亚稳态问题(异步删除/恢复)并破坏您的电路。将第一个信号重新同步到 clk 应该很容易,只要它足够长。
-
@Vilhelm Gray,您希望
count对 2 个边缘敏感。它是不可合成的,并且与您的目标 FPGA 无关,因为没有硬件来实现它。 -
@VilhelmGray:
rst高时间是否有最短持续时间,例如总是 3clk? -
@VilhelmGray:用通用的元件在FPGA中实现这个,标准的方法是使用普通时钟作为计数器触发器时钟,然后将
rst(Bob)和clk(Alice)同步到带有双电平触发器的普通时钟。同步的rst(Bob)和clk(Alice)则在普通时钟域中,您可以对它们进行简单的0 到1 检测,并进行普通同步设计,与工具和FPGA 配合得很好。rst(Bob)和clk(Alice)脉冲的持续时间必须至少为 2 个普通时钟周期才能正常工作。