FPGA:同步复位、异步复位与异步复位同步释放

以下皆以低电平有效的复位信号为例,内容参考 @数字逻辑君Zlaker


同步复位

QQ20250830-104135

module sync_rest(
  input        sys_clk,
  input        sys_rst_n,
  input        i_din,
  output wire  o_dout
);

reg r_dout;
assign o_dout = r_dout;//方便例化

always @(posedge sys_clk) begin
  if (!sys_rst_n)
    r_dout <= 1'd0;
  else
    r_dout <= i_din;
end

endmodule

特点说明:
  当复位信号有效时,只能在时钟上升沿的时候更新,能有效避免毛刺干扰,但对复位信号的脉宽有一定的要求(至少大于一个周期)


异步复位

QQ20250830-105651

module async_rest(
  input        sys_clk,
  input        sys_rst_n,
  input        i_din,
  output wire  o_dout
);

reg r_dout;
assign o_dout = r_dout;//方便例化

always @(posedge sys_clk or negedge sys_rst_n) begin
  if (!sys_rst_n)
    r_dout <= 1'd0;
  else
    r_dout <= i_din;
end

endmodule

特点说明:
  在复位信号有效时立即更新,但是抗干扰能力弱,容易被毛刺误触发


异步复位同步释放

QQ20250830-110019

module async_rest_sync_release(
  input sys_clk,
  input i_sys_async_rst_n,
  output sys_rst_n
);
reg [1:0] r_sync_rest_n;
assign sys_rst_n=r_sync_rest_n[1];
always @(posedge sys_clk or negedge i_sys_async_rst_n) begin
  if (!i_sys_async_rst_n)
    r_sync_rest_n<=2'b00;
  else begin
    r_sync_rest_n[0]<=1'b1;
    r_sync_rest_n[1]<=r_sync_rest_n[0];
  end
end
endmodule

仿真
image
特点说明:
  与异步复位类似,在复位信号有效时立即更新,但是通过寄存器打一拍拓宽了复位信号,这样同步释放后,后续的模块都可以使用同步复位,无需担心捕捉不到脉宽小的复位信号。

posted @ 2025-08-30 11:52  薄荷BH  阅读(15)  评论(0)    收藏  举报