湘攸客

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

0
阅读(2532)

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

点击看大图

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


modulereset_gen(

outputrst_sync_n,

inputclk,rst_async_n);

logicrst_s1, rst_s2;

always_ff@ (posedgeclk,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

assignrst_sync_n= rst_s2;

endmodule

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

下:

点击看大图

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

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

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

modulereset_gen(

outputrst_sync_n,

inputclk,rst_async_n);

logicrst_s1, rst_s2;

always_ff@ (posedgeclk,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

assignrst_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’有效)

Baidu
map