模块说明
本次分享是笔者发现单纯采用两个时钟周期的异步复位同步释放无法满足一些ip的初始化需要导致ip工作不正常,正常来说基本所有的ip再ms级复位的情况下均能够满足复位条件,因此采用上电计时复位,计时周期为10ms;
同时选择编译对仿真和上板进行区分,在仿真中,生成10ms仿真的时间远超现实时间的10ms,为了不影响上板功能同时不影响仿真效率,采用IS_SIM
来区别;
源程序
说明
clk :
200Mhz的输入时钟
arst_n:
异步复位输入
rst_n :
系统全局同步复位信号
// **************************************************************
// COPYRIGHT(c)2022
// All rights reserved.
//
// IP LIB INDEX :
// IP Name :
// File name :async_reset_sync_dereset.v
// Module name :async_reset_sync_dereset
// Full name :
//
// Author :xishengcier
// Email :
// Date :2024.6.24
// Version :
//
// Abstract :
// Called by :
//
// Modification history
// ****************************************************************
module async_reset_sync_dereset #(
parameter IS_SIM = 1'b1
)(
input clk ,
input arst_n ,
output rst_n
) ;
reg rst_n_r1 ;
reg rst_n_r2 ;
// delay 10ms for steady state
generate
if(IS_SIM)begin
always @(posedge clk or negedge arst_n) begin
if(!arst_n) begin
rst_n_r1 <= 1'b0 ;
rst_n_r2 <= 1'b0 ;
end
else begin
rst_n_r1 <= 1'b1 ;
rst_n_r2 <= rst_n_r1 ;
end
end
end
else begin
reg [23:0] cnt = 'b0;
always @(posedge clk or negedge arst_n) begin
if(!arst_n)
cnt <= 'b0;
else if(cnt < 24'd200_0000) begin // 10ms
cnt <= cnt + 1'b1;
end
else begin
cnt <= cnt;
end
end
always @(posedge clk or negedge arst_n) begin
if(!arst_n) begin
rst_n_r1 <= 1'b0 ;
rst_n_r2 <= 1'b0 ;
end
else if(cnt == 24'd200_0000)begin
rst_n_r1 <= 1'b1 ;
rst_n_r2 <= rst_n_r1 ;
end
else begin
rst_n_r1 <= 1'b0 ;
rst_n_r2 <= 1'b0 ;
end
end
end
endgenerate
assign rst_n = rst_n_r2 ;
endmodule