使用verilog完成异步复位,同步释放电路的设计
原理
假如一个D类触发器的复位值为0,那么当rst_n=0的信号到来时,D触发器发生复位,当rst_n=1信号到来时,D触发器正常工作。
当rst_n信号重新回到1的时间和clk上升沿到来的信号非常接近时,D触发器可能会输出亚稳态,造成信号无法识别是1还是0。
解决办法
异步复位:对为0的复位信号不做处理,让其正常异步复位
同步释放:对为1的复位信号打两拍,使其拉高时对齐时钟边沿,避免亚稳态
时序图
代码
module rst_asy(
input clk,
input rst_n,
output rst_out
);
reg rst_r1;
always@(posedge clk or negedge rst_n) begin // 异步复位
if(rst_n == 1'b1) begin
rst_out <= 1'b0;
rst_r1 <= 1'b0;
end
else begin
rst_r1 <= rst_n; // 时序电路非阻塞赋值,当rst_n拉高时,先将rst_r1拉高
rst_out <= rst_r1; // 等到下一拍采样时,rst_r1为1,再将rst_out拉高,实现延迟两拍
end
end
endmodule
当rst_n拉高之后,rst_out等了被寄存器存了两次才输出,避免亚稳态,生成电路如图