FPGA复位模块设计思路参考

项目概述:

  在FPGA开发中,第一步就是需要设计时钟复位管理模块,系统的复位树可分为硬件复位和软件复位,软件复位又可以通过打拍产生每个时钟的复位,这样一来,每个时钟均有自己的同步复位信号,这对于时序和程序稳定性有很大帮助。


设计思路

  时钟管理IP核锁上后,locked拉高,一般用该信号驱动硬件复位,这里设置复位时间1s。然后开始进行软件复位,软件系统复位sys_rst_n_r通过寄存器信号sw_reset_n和VIO信号vio_rst_n共同控制。然后使用该系统复位信号继续产生每个时钟的同步复位信号。
  部分代码如下:

    localparam                          time_1s                   = 32'd49_999_999;
//---------------------------------------------------------------------
// PLL
//---------------------------------------------------------------------  
PLL PLL_inst
    (
    // Clock out ports
    .clk_100m                           (clk_100m                  ),// output clk_out1
    .clk_50m                            (clk_50m                   ),// output clk_out2
    // Status and control signals
    .reset                              (1'b0                      ),// input reset
    .locked                             (locked                    ),// output locked
    // Clock in ports
    .clk_in1_p                          (SYSCLK100_P               ),// input clk_in1_p
    .clk_in1_n                          (SYSCLK100_N               ) // input clk_in1_n
    );
//---------------------------------------------------------------------  
//  FPGA硬件复位 
//---------------------------------------------------------------------  
always@(posedge clk_50m or negedge locked) begin
    if(!locked)begin
        hw_reset_n_r <= 1'b0;
        hw_rst_cnt   <= 32'd0;
    end
    else if(hw_rst_cnt >= time_1s) begin
        hw_reset_n_r <= 1'b1;
        hw_rst_cnt   <= hw_rst_cnt;
    end
    else begin
        hw_reset_n_r <= 1'b0;
        hw_rst_cnt   <= hw_rst_cnt + 1'b1;
    end
end
//---------------------------------------------------------------------    
//  FPGA系统复位
//--------------------------------------------------------------------- 
//  软件和VIO复位
always@(posedge clk_50m or negedge hw_reset_n) begin
    if(!hw_reset_n)
        sys_rst_n_r <= 1'b0;
    else
        sys_rst_n_r <= sw_reset_n && vio_rst_n;
end
//  100M时钟复位
always@(posedge clk_100m) begin
    clk_100m_rst_n_r1 <= sys_rst_n_r;
    clk_100m_rst_n_r2 <= clk_100m_rst_n_r1;
end
//  axi_250m时钟复位
always@(posedge axi_250m) begin
    axi_250m_rst_n_r1 <= sys_rst_n_r;
    axi_250m_rst_n_r2 <= axi_250m_rst_n_r1;
end

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值