对于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.csdn.net/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的转换。