FPGA的复位

关于FGPA的复位

当初开始学FPGA的时候,总是疑惑:FPGA不是没有复位管教么,但总在always看到有复位信号。这个复位信号(我们暂且称为rst_n)从哪里来?

实际上是可以从两个方面获得的,这与我们的MCU一样。

  1. 上电自动复位
  2. 手动按键复位

考虑到系统的初始化可能需要一定的时间,需要写一段Verilog代码进行延时复位,这段代码综合后就是上电自动复位的过程,上电自动复位也要外部硬件提供一个低电平脉冲,第二种方法要求有按键复位的按键电路。作为一个正常的系统,上电自动复位和手动的按键复位都是必须的,且两者实际上是不可分割的。

上电自动复位

原理上很简单,写一个复位模块,等待一段稳定时间,将复位信号拉低一段足够长的时间,再将复位信号拉高。

如下Verilog源码,外部按键复位也将作为模块的一个引脚输入,用于异步的全局复位操作,正常的复位操作要进行,必须要求外部有一个短暂的脉冲作用在rst_n信号上,这可以通过按键电路中的RC电路实现。

/**************************************
*  功能:上电复位模块
*  输入参数:
*         clk: 50M 时钟输入
*         rst_n:外部按键全局复位信号
*  输出参数:
*         sys_rst_n:系统全局同步复位信号
***************************************/
module    reset
(
    input    clk,
    input    rst_n,
    output   sys_rst_n
);

//------------------------------------------
// Delay 100ms for steady state
reg    [22:0] cnt;
always@(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        cnt <= 0;
    else
        begin
        if(cnt < 23'd50_00000) //100ms
            cnt <= cnt+1'b1;
        else
            cnt <= cnt;
        end
end

//------------------------------------------
//rst_n synchronism
reg    rst_nr0;
reg    rst_nr1;
always@(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        begin
        rst_nr0 <= 0;
        rst_nr1 <= 0;
        end
    else if(cnt == 23'd50_00000)
        begin
        rst_nr0 <= 1;
        rst_nr1 <= rst_nr0;
        end
    else
        begin
        rst_nr0 <= 0;
        rst_nr1 <= 0;
        end
end

assign    sys_rst_n = rst_nr1;

endmodule

按键手动复位电路

不使用专用芯片的参考低电平复位电路如下:

reset1

电路中的复位管脚一端连接到FPGA的某个普通通用管脚,这样电路中的RC电路将产生上面Verilog代码中的rst_n上电低脉冲,这就是本文开头说自动上电复位和硬件按键复位相辅相成。

请注意两个电阻的值,R21要是R22的两个数量级以上,这样才能保证按键按下后被识别为低电平。

手动复位过程中为保证按键复位的稳定性,还可以修改上面的Verilog代码进行按键消抖检测。下面是抓到的按键在闭合的时候的波形:

key_bounce

按键在几个us之内就能达到低电平,该期间触点抖动比较严重。

module RMV_BJ (
    BJ_CLK,    //采集时钟,40Hz
    RESET,     //系统复位信号
    BUTTON_IN, //按键输入信号
    BUTTON_OUT //消抖后的输出信号
);
input B_CLK;
input RESET;
input BUTTON_IN;
output BUTTON_OUT;
reg BUTTON_IN_Q, BUTTON_IN_2Q, BUTTON_IN_3Q;

always @(posedge BJ_CLK or negedge RESET)
begin
    if(~RESET)
    begin
        BUTTON_IN_Q <= 1'b1;
        BUTTON_IN_2Q <= 1'b1;
        BUTTON_IN_3Q <= 1'b1;
    end
    else
    begin
        BUTTON_IN_Q <= BUTTON_IN;
        BUTTON_IN_2Q <= BUTTON_IN_Q;
        BUTTON_IN_3Q <= BUTTON_IN_2Q;
    end
end

wire BUTTON_OUT = BUTTON_IN_2Q | BUTTON_IN_3Q;

endmodule

除了上面简单的复位电路,还可使用CAT811/TPS3823-33等专门的复位芯片,可以免去按键按键消抖的操作。

### FPGA复位实现与故障排除 在设计FPGA项目时,复位电路的设计至关重要。它直接影响到系统的稳定性和可靠性。以下是关于FPGA复位的一些关键点以及可能遇到的问题及其解决方案。 #### 1. 同步复位 vs 异步复位 同步复位信号通过时钟域控制,在时钟边沿触发器采样复位信号并执行相应的动作。这种方法的优点在于可以减少毛刺的影响,并且更容易满足时序约束[^1]。然而,如果复位路径过长或者存在竞争冒险,则可能导致部分模块未能正确初始化。 异步复位则不依赖任何特定时钟周期即可立即生效。尽管这种方式能够快速响应紧急情况下的硬件重启需求,但由于缺乏统一的时间基准,可能会引发亚稳态问题或其他潜在风险[^2]。 因此,在实际应用过程中需根据具体应用场景权衡选择合适的复位方式: - 对于高性能计算单元建议采用同步机制; - 而对于安全性要求较高的场合可考虑加入异步选项作为额外保护层。 #### 2. 复位脉冲宽度与时延调整 为了确保所有寄存器都能接收到有效的低电平信号完成清零过程,通常需要设置一定长度的复位脉冲。一般而言,该持续时间应至少覆盖两个完整的系统工作频率周期以上[^3]。此外还需注意不同芯片型号之间可能存在差异化的最小有效时限规定,请参照对应数据手册获取精确数值。 当面对复杂SoC架构中的多级联组件时,还应当考虑到各级间传递延迟所带来的累积效应。可以通过增加缓冲区、优化布线策略等方式来缓解这一矛盾。 #### 3. 去抖动处理措施 外部按钮开关往往伴随着机械颤振现象,这会干扰正常逻辑判断流程。针对这种情况推荐实施软件算法过滤或是利用专用IC器件来进行前级净化预处理后再送入目标设备内部参与运算决策环节之中。 ```verilog // Verilog example for synchronous reset implementation module sync_reset ( input wire clk, input wire rst_n, // Active low asynchronous reset signal output reg q_out ); always @(posedge clk or negedge rst_n) begin : proc_sync_reset if (!rst_n) begin q_out <= 1'b0; // Reset value when active-low async reset is asserted end else begin q_out <= ... ; // Normal logic operation here end end endmodule ``` 上述代码片段展示了一个典型的同步复位Verilog描述方法。其中`rst_n`表示的是一个激活状态为低电平的有效输入端口;而在组合条件语句块内分别定义了两种情形下输出变量应有的取值规律。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值