问题描述
我知道可以通过以下方式实现高级异步重置:
always@(posedge clk or posedge rst)
begin
if (rst==1)
但是如何实现posege异步重置,这意味着一旦出现重置边缘,总是阻塞的逻辑会立即重置?
我写了下面的逻辑:
always@(posedge clk or posedge rst)
begin
rst_pre<=rst;
if(!rst_pre && rst) // to test if rst is posedge
//execute reset logic here...
但是问题是,始终阻止是在意外的高频下触发的,我终于弄清楚了,尽管只有 1个摆姿势的第一个姿势,但始终是阻止被第一个信号触发的时间超过1次。 (使用Altera气旋10LP和quartus 18进行测试)
我认为我用于实现posege异步重置的方法不稳定,有人可以告诉我该怎么做才能解决此问题?
解决方法
您要实现的是异步重置。可以是posedge
或negedge
。
always@(posedge clk or posedge rst)
begin
if (rst)
// do the reset
else begin
// your normal execution logic
end
end
如果您想使用negedge
重置,则可以使用:
always@(posedge clk or negedge rst)
begin
if (~rst)
// do the reset
else begin
// your normal execution logic
end
end
除此之外,重置没有什么复杂的。在这两种情况下,posedge
的{{1}} / negedge
上的块都会被触发并进行重置。
您称为“高级异步重置”逻辑的第一个代码段是“ posege异步重置逻辑”。
该代码段指定了一个有效的高异步复位信号rst
。 “高电平有效” +“异步”表示always
置为有效后,此rst
块生成的信号立即被重置。
只要在敏感列表中包含“ posege / negedge reset”,并且Always块中的reset条件优先于其余顺序逻辑,则它是异步的:
always @ (posedge clk_i,posedge arst_i) begin
if(arst_i) begin
...this condition has to be first
end
else begin
...normal sequential logic
end
end
将“ posege”用于高电平有效复位,将“ negedge”用于低电平有效复位。
额外说明:有时,使用重置同步器也很有用。此同步的“软复位”应包含在常规顺序逻辑中,这将有助于使所有内容与时钟同步。这样,您将拥有第一个异步重置条件,而最后一次同步重置将避免有关异步条件的任何稳态问题。