FPGA如果没有外部复位信号,如何产生复位信号,初始化所有寄存器?

对于FPGA,没有专用的复位引脚。它的任意一个I/O口都可以用作复位引脚。但是,作为if复位,最希望该引脚由全局时钟驱动,到达每个寄存器的时间时间是一样的。

如果没有外部复位信号,该如何对所有寄存器初始化?有两种方法,第一种使用PLL的locked信号;第二种是写一个自复位信号。

一、可以使用PLL的locked信号。使用PLL锁相环倍频时钟时,PLL锁相环的locked信号上电为低;当PLL输出信号稳定的时候,locked信号会被拉高。也可以设置多少个时钟之后,locked被拉高。此时,PLL锁相环的输入时钟为全局时钟。即完成上电复位操作。

PLL实例化如下:

wire sys_rst_n;

PLL_Control PLL_Control_inst(
.CLK_IN1(sys_clk_i), 
		 
.CLK_OUT1(clk_100M),     
.LOCKED(sys_rst_n)
);      

其中sys_rst_n作为全局复位信号。 

PLL锁相环的设置参考博客:《锁相环PLL》https://blog.youkuaiyun.com/weixin_38621214/article/details/83757242

二、自复位信号

module RST_INER(
clk_100M,
	   
Rst_n 
   );
	 
input clk_100M;
output Rst_n;
//==============================================================
wire clk_100M;
reg Rst_n;
//==============================================================
parameter INNER_CNT_END=9'd128;
reg [8:0] rst_inner_cnt;

always @(posedge clk_100M)
if(rst_inner_cnt<INNER_CNT_END)begin 
    rst_inner_cnt <= rst_inner_cnt +1'd1;
end else if(rst_inner_cnt==INNER_CNT_END) begin 
    rst_inner_cnt <= rst_inner_cnt; 
end else begin 
    rst_inner_cnt <=0;
end
//==============================================================	
always @(posedge clk_100M)
if(rst_inner_cnt==INNER_CNT_END) begin 
    Rst_n <= 1;
end else begin 
    Rst_n <= 0;
end
//==============================================================

endmodule

 上电之后,通过计数器控制复位信号Rst_n的转换。

### FPGA 初始化复位过程及配置方法 #### 1. 复位的基本概念 FPGA初始化复位是一个重要的环节,用于确保设备在启动或运行过程中能够进入稳定的工作状态。理论上,在正常工作流程中,FPGA 不需要频繁执行全局复位操作[^1]。然而,由于实际应用中的复杂性以及潜在的不确定性因素(如亚稳态),局部复位寄存器初始化仍然是必要的。 #### 2. 全局复位的作用 当 FPGA 上电时,其内部所有的存储单元(包括触发器和 Block RAM)会被自动初始化到默认状态。这种行为类似于一次全局复位的效果,因为所有存储元件都被设置为已知的状态[^3]。尽管如此,为了进一步提高系统的可靠性,通常会在设计中加入显式的复位逻辑来补充这一过程。 #### 3. 局部复位的重要性 即使全局复位可以覆盖大部分情况,但在特定场景下仍需依赖局部复位机制。例如: - **寄存器初始化**:某些 IP 核可能要求在其激活之前先经历一次复位动作; - **处理异常状况**:如果系统因外部干扰或其他原因陷入不稳定状态,则可以通过触发复位事件恢复正常的运作路径。 #### 4. 同步 vs 异步复位 针对不同的应用场景可以选择合适的复位方式——同步或者异步复位: - **同步复位**:只有当时钟边沿到达时才会生效,这种方式有助于减少毛刺的影响并简化测试验证难度[^2]。 - **异步复位**:不受时钟周期约束即可立即响应,适合快速退出错误条件的情形。不过需要注意的是,解除异步复位时最好配合去抖动电路以避免竞态问题的发生。 #### 5. 实现高效的复位策略 为了达到最佳性能同时兼顾资源利用率,应遵循以下原则构建复位方案: - 尽量只对确实需要用到该功能的部分模块施加复位信号,从而降低整体功耗与延迟开销[^5]; - 考虑引入专门用来监测复位完成状态的指示标志,以便于后续阶段的操作得以顺利衔接。 以下是基于 Verilog 的简单示例代码展示如何实现带同步复位的功能模型: ```verilog module example ( input wire clk, // Clock signal input wire reset_n, // Active-low synchronous reset output reg q // Output register ); always @(posedge clk or negedge reset_n) begin : proc_q if (!reset_n) begin q <= 0; // Reset value assigned here end else begin q <= some_logic_expression; end end endmodule ``` 此片段定义了一个典型的 D 型触发器结构,并展示了如何利用 `if` 条件语句区分普通数据更新还是处于复位期间的行为差异。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值