湘攸客

Altera教程里System Verilog 异步复位同步释放疑问(转自本人EDN)

0
阅读(2783)

在看System Verilog with QII的时候,有两个胶片介绍了异步复位同步释放,下图是原理图:

 

点击看大图

 

Altera官方教程给出的代码如下:


 

module reset_gen ( 

 

  output rst_sync_n, 

 

  input  clk, rst_async_n);

 

 

 

logic rst_s1, rst_s2;

 

 

always_ff @ (posedge clk, posedge

 

rst_async_n)

 

 

 

  if (rst_async_n) begin         

 

  rst_s1 <= 1'b0;

 

  rst_s2 <= 1'b0;

 

  end

 

  else begin

 

  rst_s1 <= 1'b1;

 

  rst_s2 <= rst_s1;

 

  end

 

assign rst_sync_n = rst_s2; 

 

endmodule

 

 

 

经过这QuartusII软件中编译,其fit后map view如

 

下:

 

点击看大图

 

(上述代码的意义:外部异步复位1有效,异步复位同步释放以后进入系统,复位信号是‘0’有效)

 

 

上面两个图是一致的,但是问题是我之前了解的异步复位

 

 

同步释放方法应该象下面代码描述一样:

 

 

 

 

 

module reset_gen ( 

 

  output rst_sync_n, 

 

  input  clk, rst_async_n);

 

 

 

logic rst_s1, rst_s2;

 

 

 

always_ff @ (posedge clk, posedge

 

rst_async_n)

 

  if (rst_async_n) begin         

 

  rst_s1 <= 1'b1;

 

  rst_s2 <= 1'b1;

 

  end

 

  else begin

 

  rst_s1 <= 1'b0;

 

  rst_s2 <= rst_s1;

 

  end

 

assign rst_sync_n = rst_s2; 

 

endmodule

 

 

 

上面代码编译后的map view为:

 

点击看大图

 

 

 

(上述代码的意义:外部异步复位1有效,异步复位同步释放以后进入系统,复位信号是‘1’有效)

 

 

 

~~~~~~~~~~~~~~~~~~~~~~~~

 

11:07:44 UTC+0800

 

 

为了提高代码的可阅读性,一般原则reset表示复位是

 

‘1’有效,reset_n表示复位是‘0’有效;不过,本文暂

 

时不作区分,到底0有效还是1有效,以代码为准:

 

logic rst_s1, rst_s2;

 

always_ff @ (posedge clk, negedge

 

rst_async_n)


 if (!rst_async_n) begin 

        
  rst_s1 <= 1'b0;

 

      rst_s2 <= 1'b0;


 end


 else begin


  rst_s1 <= 1'b1;


  rst_s2 <= rst_s1;


  end


assign rst_sync_n = rst_s2; 

 

上述代码编译后map view为:

 

点击看大图

 

(上述代码的意义:外部异步复位0有效,异步复位同步释放以后进入系统,复位信号是‘0’有效)

 

 

 

现在关心的问题是不管复位信号‘0’或者‘1’有效,进程里

 

 

对于异步信号敏感列表的两种方式是否有区别?!

即:什么时候使用"posedge rst_async",何时使用negedge rst_async"是否有区别?!!

 

 

#########################################

 

 

 

把最后一种情况也写出来吧:

 

logic rst_s1, rst_s2;

 

always_ff @ (posedge clk, negedge

 

rst_async_n)


 if (!rst_async_n) begin 

        
  rst_s1 <= 1'b1;


  rst_s2 <= 1'b1;


  end


 else
begin


  rst_s1 <= 1'b0;


  rst_s2 <= rst_s1;


  end


assign rst_sync_n = rst_s2;

 

 

Map View形式如下:

 

点击看大图

 

(上述代码的意义:外部异步复位0有效,异步复位同步释放以后进入系统,复位信号是‘1’有效)