首页 > 解决方案 > 如何在verilog中实现“posedge异步复位逻辑”?

问题描述

我知道可以像这样实现高级异步重置:

always@(posedge clk or posedge rst)
begin
  if (rst==1)

但是如何实现posedge异步复位,即在复位沿出现的那一刻,总是立即阻塞复位的逻辑?

我写了下面的逻辑:

always@(posedge clk or posedge rst)
begin
  rst_pre<=rst;
  if(!rst_pre && rst) // to test if rst is posedge
      //execute reset logic here...

但问题是,always 块是在一个意想不到的高频下触发的,我终于发现,虽然只有 1 个 rst posege,但 always 块被 rst 信号触发的次数远远超过 1 次。(使用 Altera cyclone 10LP 和 quartus 18 进行测试)

我认为我用来实现posedge异步重置的方法不稳定,谁能告诉我我该怎么做才能解决这个问题?

标签: verilogfpgaintel-fpga

解决方案


您要实现的是异步重置。它可以是posedgenegedge

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

除此之外,重置没有什么复杂的。在这两种情况下, on posedge/ negedgeofrst都会触发块并进行重置。


推荐阅读