关于异步复位同步释放
在此之前可以先了解异步复位造成的亚稳态现象,后采用本文的方法进行消除。
一 概念:
异步置位和复位与时钟无关,可以解释为只要置位和复位信号有效,不需要等到时钟沿到来,也能进行置位和复位。
事件控制语法:
@(<沿关键词 时钟信号> or<沿关键词 复位信号> or <沿关键词 置位信号> )
同步置位和复位是指只有在时钟的有效跳变沿时才能进行置位和复位。
事件控制语法:
1.正沿触发:
@(posedge clk)
2.负沿触发:
@(negedge clk)
二.
异步: always @(posedge clk or negedge rst_n )
if(!rst_n)
采用异步复位方式节约资源,但是容易产生竞争冒险。
同步:always @(posege clk )
If(!rst_n)
占用的逻辑资源较多,但是不容易产生竞争
三:采用波形图进行原理解释
第一黄色圆圈:表示异步复位,可看到复位与时钟无关;紫色波形rst_n低电平复位有效,当拉低时可直接完成复位,无需等待时钟上升沿的到来,输出此时直接变化。
第二个黄色圆圈:表示同步置位(释放复位信号),当置位信号有效(reset_asyn拉高),不能立即释放复位,需要等到时钟上升沿到来时才进行复位,因此输出在下一时钟上升沿的时候才变化。
以上为异步复位同步释放,好处:防止复位信号释放时产生亚稳态事件。
module Sys_Rst(
input clk,
input rst_n,
output sys_rst
);
reg rst_r0;
reg rst_r1;
always @(posedge clk or negedge rst_n)
if(!rst_n) begin
rst_r0 <= 1'b0;
rst_r1 <= 1'b0;
end
else begin
rst_r0 <= 1'b1;
rst_r1 <= rst_r0;
end
assign sys_rst = rst_r1;
endmodule
module Sys_Rst(
input clk,
input rst_n,
output sys_rst
);
reg [1:0] rst_r0;
always @(posedge clk or negedge rst_n)
if(!rst_n)
rst_r0 <= 2'b0;
else
rst_r0 <= {rst_r0[0],1'b1};
assign sys_rst = rst_r0[1];
endmodule