FPGA设计中复位的总结

一.为什么需要复位?

        ①主要是为了确保FPGA在启动时处于已知状态,以便正确地执行其功能。

        ②复位还可以用于在FPGA运行时重新启动系统或清除错误状态。同时,复位的存在也会对FPGA的综合面积产生影响,需要在设计中合理考虑复位电路的设计,避免资源的浪费和消耗。

二.复位的方式

FPGA设计过程中,分为外部复位和内部复位:

相同点:

      内部复位和外部复位都是用来实现FPGA的复位功能的。

不同点:

  外部复位是指复位信号主要来自外部引脚的输入,如复位按钮,电源模块输出等;

  内部复位主要由FPGA内部电路产生。

总的来说:内部复位可以更加精确地控制复位的时序和复位的范围,而外部复位则受限于外部电路的设计和实现。

三.同步复位和异步复位

同步复位

异步复位

特点

复位信号只有时钟上升沿或者下降沿到来时才有效

无论时钟边沿是否到来,只要复位信号有效,就进行复位

Verilog描述

always@posedge clk

always@posedge clknegedge rst_n

优点

1.有利于仿真
2.整个电路都是同步电路,时序分析较为简单,综合得到的时钟频率也较高
3.有利于消除毛刺信号

1.大多数的逻辑器件的目标库内的DFF都有异步复位端口,可以节省资源

2.设计相对简单

3异步复位信号识别方便,而且可以很方便的使用FPGA的全局复位端口

缺点

1.复位信号的有效时长必须大于时钟周期,才能真正的被系统识别并完成复位任务。
2.由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,耗费较多的逻辑资源

1.复位信号容易受到毛刺的影响

2.复位信号释放的过程中容易出现问题(若复位释放在时钟有效沿附近时,很容易使寄存器输出出现亚稳态

总结

推荐使用异步复位,同步释放,而且复位信号为低电平有效

(1)同步复位

同步复位是指在时钟上升沿或下降沿时,根据复位信号的状态确定是否对系统进行复位。

(2)异步复位

异步复位是指无论时钟信号处于何种状态,只要复位信号有效,就对系统进行复位。

复位信号释放的随机性,可能导致时序违规,倘若复位释放时恰恰在时钟有效沿附近,就很容易使电路处于亚稳态

(3)同步复位异步释放

异步复位同步释放是一种FPGA设计方法,通常用于确保电路在重新启动后能够正常工作。在异步复位同步释放的设计中,一组异步复位信号用于重置电路的状态,而另一组同步释放信号则用于释放电路的状态。这种设计方法是在采用复杂的操作逻辑或时钟信号时,需要保证电路的可靠性和可重复性的一种必要措施。

在异步复位同步释放设计中,当发生复位时,电路中所有的寄存器和状态都会被清零,以保证电路的初始状态是正确的。然而,由于信号延迟和时序问题,复位信号可能无法同步到电路中的每个寄存器和状态中。这就可能导致一些不稳定性或不可预期的问题,因此需要同步释放信号来释放电路的状态。同步释放信号通常用来告诉电路,所有的复位操作已经完成,可以在正确的时刻重新启动电路。

总之,异步复位同步释放是一种FPGA设计方法,用于确保电路在重新启动后能够保持正确的状态,并在正确的时刻重新启动。它是保证电路可靠性和可重复性的必要措施,在复杂的操作逻辑或时钟信号时使用。

下面是仿真测试的代码:

module reset_test(
    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

TB文件:

module tb_reset_test;
    reg                 clk            ;
    reg                 rst_async      ;
    reg                 rst_sync       ;
//模块例化
 reset_test u_reset_test(
    /*input*/            .clk        (clk),
    /*input*/            .rst_async  (rst_async),
    /*output reg*/       .rst_sync   ( rst_sync)
    );


//时钟
    localparam CLK_PERIOD = 20;
     initial  clk = 1'b1;
     always #(CLK_PERIOD/2) 
     assign clk=~clk;
//激励
    initial begin
      rst_async = 1'b0;
      #(32);
      rst_async = 1'b1;
      #(59);
      rst_async = 1'b0;

      #(31);
       rst_async = 1'b1;
      #(63);
       rst_async = 1'b0;
    end

endmodule

仿真波形:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值