初学者可能无需关注同步复位还是异步复位,但当深入项目细节时,复位方式是一个不得不考虑的问题,特别是一个模块中存在多个时钟时,复位的方式决定了系统的稳定性甚至功能性。
关于同步复位和异步复位的介绍有空再补充。
一个简单的异步复位同步释放的例子如下:
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
波形图补充。