在看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如下:
上面两个图是一致的,但是问题是我之前了解的异步复位同步释放方法应该象下面代码描述一样:
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为:
个人觉得还是Altera教程里介绍有错误,欢迎高手来讨论!
~~~~~~~~~~~~~~~~~~~~~~~~
11:07:44 UTC+0800
更改代码的写法,以作为比较,ilove的建议很好,为了提高代码的可阅读性,一般原则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为:
从代码和map view都可以看出异步复位是‘1’有效。
当然参考前面两个代码也可以改成复位‘0’有效。
现在关心的问题是不管复位信号‘0’或者‘1’有效,进程里对于异步信号敏感列表的两种方式是否有区别?!
#########################################
把最后一种情况也写出来吧:
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形式如下:
记得riple说过,为了符合Altera器件内D触发器清零端‘1’有效特性,建议复位信号一般‘1’有效。免得工具insert not gate。
ilove314_323192455 2009-11-19 15:06
ash_riple_768180695 2009-11-17 13:54
coyoo 2009-11-16 12:30
coyoo 2009-11-16 11:02
ash_riple_768180695 2009-11-15 15:55
ilove314_323192455 2009-11-14 22:37
用户36516 2006-11-3 11:07
投一票说话,学习中...
我也请你去我的BLOG看看.