FPGA 的 复位

FPGA设计的复位方式有两大类,同步复位和异步复位:

1、同步复位:

        复位信号在时钟有效边沿到来时刻有效,执行一次复位动作,因此同步复位 是 瞬间的、离散的。

        复位动作是离散的非常有利于防真。其次,复位信号只有在时钟有效的边沿有效,可以过滤高于时钟频率的矛刺。

       使用  同步复位逻辑 的系统可以被设计成纯粹的同步时序电路,有利于时序约束和时序分析,综合出来的FPGA有更好的性能。

        同步复位也有如下的缺点:

        复位信号 的 有效长度必须大于一个clk,否则会被当做毛刺过滤

        同步复位信号和时钟相关,需要考虑时序问题,综合时也会消耗更多逻辑资源(大多数寄存器只有异步复位端口)

2、异步复位:

        只要复位信号到来,就立即执行复位操作,直到复位信号结束才停止复位,异步复位是持续的。

        异步复位信号和时钟没有相关,不需要考虑时钟,大多数寄存器只有异步复位端口,综合更加节省资源,设计简单。

        但由于异步复位是持续的,无法过滤毛刺。

        同时异步复位信号在释放的时候会导致出现不定态,原因如下:

        1、当异步复位信号释放的时刻和时钟有效边沿比较接近,可能会导致寄存器出现亚稳态,亚稳态 下 电平信号的电压比较弱。

        2、异步复位 的 复位信号控制的各个寄存器和复位信号信号源之间的 data_path delay层次不齐,当异步复位信号释放的时候,一部分寄存器在时钟有效沿之前完成复位,另一部分寄存器在时钟有效沿之后完成复位,会出现一个clk的偏差。

复位设计方法

        1、同步信号同步复位

always@(posedge clk)
begin
    if(rst == 1'b1)
    begin
        //执行复位动作
    end
    else
    begin
        //执行工作动作
    end
end

        2、异步信号异步复位

always@(posedge clk or posedge rst)
begin
    if(rst == 1'b1)
    begin
        //执行复位动作
    end
    else
    begin
        //执行工作动作
    end
end

        3、异步信号同步复位

//异步复位信号 的 同步
always@(posedge clk)
begin
    ibuf_aRst     <=    aRst         ;
    rst           <=    ibuf_aRst    ;    
end

//动作描述
always@(posedge clk)
begin
    if(rst == 1'b1)
    begin
        //复位动作
    end
    else
    begin
        //工作动作
    end
end

        4、异步信号异步复位

//异步复位信号 的 同步
always@(posedge clk)
begin
    ibuf_aRst     <=    aRst         ;
    rst           <=    ibuf_aRst    ;    
end

//动作描述
always@(posedge clk or posedge rst)
begin
    if(rst == 1'b1)
    begin
        //复位动作
    end
    else
    begin
        //工作动作
    end
end

        5、复位高扇出的解决方案

        在FPGA设计中,可以通过寄存器的复制来解决复位信号大扇出,假设FPGA中有1000个寄存器需要复位,可以对复位信号复制10个,每个衍生复位信号去复位附近的100个寄存器。

        按照上述,只要让复位信号在FPGA中被一个寄存器驱动,至于创建多少,如何分布,综合工具就可以代替完成。操作如下:

always@(posedge clk)
begin
    rst <= reser    ;
end

这个rst就是衍生复位信号 ,直接使用这个衍生复位信号去复位逻辑就可。

        如果是异步信号作为复位信号,就需要将原有的二级采样扩展为三级采样

//异步复位信号 的 同步、复制
always@(posedge clk)
begin
    ibuf_aRst     <=    aRst         ;
    reset         <=    ibuf_aRst    ;  
    rst           <=    reset        ;  
end

寄存器的复制只会多消耗一些寄存器资源,是推荐的复位方式。

        6、全局时钟树 资源也可以解决复位信号高扇出

BUFG    CLKontree(.O(clk),.I(clock))    ;
BUFG    RSTontree(.O(rst),.I(reset))    ;

        7、减少不必要的复位扇出信号,不需要复位的寄存器可以不用做复位,如一些零时中间变量。

        8、全局复位和 局部复位,针对不同的逻辑使用不同的复位信号,不需要全部逻辑都采用全局复位。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值