异步复位同步释放+上电自动复位

异步复位同步释放+上电自动复位

模块说明

本次分享是笔者发现单纯采用两个时钟周期的异步复位同步释放无法满足一些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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值