初学者可能无需关注同步复位还是异步复位,但当深入项目细节时,复位方式是一个不得不考虑的问题,特别是一个模块中存在多个时钟时,复位的方式决定了系统的稳定性甚至功能性。

关于同步复位和异步复位的介绍有空再补充。

一个简单的异步复位同步释放的例子如下:

module async_reset_sync_release (
    input wire clk,       // 时钟信号
    input wire rst_n,     // 异步低电平有效复位信号
    output reg sync_reset // 同步复位信号
);

    reg reset_ff1, reset_ff2; // 用于同步的寄存器

    // 异步复位同步释放
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            // 异步复位时,寄存器置零
            reset_ff1 <= 1'b0;
            reset_ff2 <= 1'b0;
            sync_reset <= 1'b1; // 输出复位信号为高(有效)
        end else begin
            // 同步释放复位
            reset_ff1 <= 1'b1;
            reset_ff2 <= reset_ff1;
            sync_reset <= ~reset_ff2;
        end
    end

endmodule

波形图补充。