FPGA开发中的复位问题

一、为什么需要复位?
在FPGA上电时,需要对reg、fifo等器件进行复位,以确保系统处于已知的状态,同时可以通过复位清除系统的错误异常状态。
二、复位的方式

  1. 从是否与时钟同步与否可以分为异步复位和同步复位。
点击查看代码
`
//  同步复位方式:
always@(posedge sys_clk) begin
  if(~sys_rst_n) begin
    //复位逻辑
  end

  end`
点击查看代码
//异步复位方式:
always@(posedge sys_clk or negedge sys_rst_n) begin
  if(~sys_rst_n) begin
    //复位逻辑
  end

  end`
2. 从电路角度上有以下几种方式: 1.通过外部复位引脚:通过FPGA的引脚输入高低电平状态,可通过按键/主控模块控制/及专门的复位芯片等方式; 2.上电自复位:系统上电后,在PLL前端添加delay_reset模块,实现上电后,复位一段时间;
点击查看代码
module delayed_nReset(
    input wire CLK,
    output wire nRst
);

	reg  [13:0] r_pow_rst = 14'b0 ;
	always @(posedge CLK) begin
		if(!r_pow_rst[13])begin
			r_pow_rst	<= r_pow_rst + 14'b1 ;
		end
	end

    assign nRst = r_pow_rst[13];

endmodule
三、同步复位和异步复位的利弊 1.同步复位 复位动作与时钟边沿同步,能够保证系统的时序稳定,便于仿真和分析。 2.异步复位 对于xilinx等期间厂商,其fpga内部大多数的逻辑器件的目标库内的DFF都只有异步复位端口,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,耗费较多的逻辑资源。 但是复位信号释放的过程中容易出现问题(若复位释放在时钟有效沿附近时,很容易使寄存器输出出现亚稳态)。 xilinx等厂家更推荐同步高电平复位的方式,因此,目前大多数设计中经常采用“异步复位,同步释放”的方式。 module reset_sync( input clk, input rst_async, output reg rst_sync ); reg rst_1; reg rst_2;
always@(posedge clk or negedge rst_async)begin
    if(!rst_async)begin
        rst_1 <= 1'b0 ;
        rst_2 <= 1'b0 ;
        rst_sync <= 1'b0 ;
    end
    else begin
        rst_1 <= 1'b1 ;
        rst_2 <= rst_1;
        rst_sync <= rst_2; 
    end
end

endmodule
五、参考链接
https://blog.csdn.net/s1072935274/article/details/134378849

posted @ 2024-10-26 10:58  羊的第七章  阅读(54)  评论(0编辑  收藏  举报