Altera教程里System Verilog 异步复位同步释放疑问(转自本人EDN)
0赞在看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
elsebegin
rst_s1 <= 1'b0;
rst_s2 <= rst_s1;
end
assign rst_sync_n = rst_s2;
Map View形式如下:
(上述代码的意义:外部异步复位0有效,异步复位同步释放以后进入系统,复位信号是‘1’有效)