异步复位和同步复位各有优缺点,两者结合能够使系统更加稳定;
目前这边总结编写了一个自认为比较通用的模块,分享给大家:
参数ACTIVE_HI 表示系统高复位有效还是低复位有效;高复位有效传1’b1,低复位有效传1’b0;
clk 系统时钟;
async 异步复位输入;
sync 同步复位输出;
通过仿真验证,sync输出至少2个clk时钟周期;可以满足同步复位要求,clk至少一次采到sync信号有效;
module async2sync
#(
parameter ACTIVE_HI = 1'b1
)
(
input clk ,
input async ,
output reg sync
);
generate
if(ACTIVE_HI == 1'b1)begin
reg async_flop0;
always@(posedge clk or posedge async)
if(async)
async_flop0 <= 1'b1;
else
async_flop0 <= 1'b0;
reg async_flop1;
always@(posedge clk or posedge async)
if(async)
async_flop1 <= 1'b1;
else
async_flop1 <= async_flop0;
always@(posedge clk)
sync <= async_flop1;
end
else begin
reg async_flop0;
always@(posedge clk or negedge async)
if(!async)
async_flop0 <= 1'b0;
else
async_flop0 <= 1'b1;
reg async_flop1;
always@(posedge clk or negedge async)
if(!async)
async_flop1 <= 1'b0;
else
async_flop1 <= async_flop0;
always@(posedge clk)
sync <= async_flop1;
end
endgenerate
endmodule