在CSDN上学习异步复位同步释放的体会
学习笔记要点:
1、防止信号撤除时产生亚稳态
2、复位信号的发生与clk无关,复位信号的撤除也与clk无关,但是之后的输出取决于clk上升沿时候的输入
3、当复位信号rst_async_n撤除时,由于双缓冲电路(双寄存器)的作用,rst_sync_n复位信号不会随着rst_async_n的撤除而撤除。(两级同步原因)
4、假设rst_async_n撤除时发生在clk上升沿,如果不加此电路则可能发生亚稳态事件,但是加上此电路以后,假设第一级D触发器clk上升沿时rst_async_n正好撤除,则D触发器1输出高电平“1”,此时第二级触发器也会更新输出,但是输出值为前一级触发器clk来之前时的Q1输出状态。显然Q1之前为低电平,第二级触发器输出保持复位低电平,直到下一个clk来之后,才随着变为高电平。即同步释放。(亚稳态”1“会不会传递?)
module reset_sync(
input clk,
input rst_async_n,
output rst_sync_n
);
reg rst_s1;
reg rst_s2;
wire rst_sync_n;
always @(posedge clk, posedge rst_async_n) begin
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
end
assign rst_sync_n <= rst_s2;
endmodule