【FPGA基础】同步复位与异步复位-FPGA常见问题社区-FPGA CPLD-ChipDebug

【FPGA基础】同步复位与异步复位

一、何时何处需要复位

参考Xilinx官方文档《UltraFast Design Methodology Guide for FPGAs and SoCs (UG949)》:

Xilinx器件具有专用的全局置位/复位信号 (global set/reset signal,GSR)。在器件配置结束时,此信号会对硬件中所有时序逻辑电路做初始化的赋值。 如果未指定初始状态,将为时序原语分配默认值。在大多数情况下,默认值为 0。FDSE 和 FDPE 原语是例外,其默认为逻辑 1。每个寄存器在配置结束时都将处于已知状态。因此无需编写仅用于在上电时初始化器件的全局复位代码。(作者补:有时也需要软复位,可以可控的复位FPGA器件内部的逻辑电路,这时通过外部定义的引脚,或者当使用zynq系列FPGA时由PS端复位,需要专门设计复位电路)

  Xilinx强烈建议您谨慎判断何时设计需要复位以及何时不需要复位。大多数情况下,控制电路逻辑上可能需要复位以确保正常运行,数据电路逻辑上通常不需要复位。(作者补:因为数据信号的有效与否通常是由控制信号,比如使能信号或有效信号,来决定的)

  复位的使用限制如下:

  • 限制复位信号线的总体扇出。
  • 减少复位布线所需的互连数量。
  • 简化复位路径的时序。
  • 在大多数情况下,这样即可整体改进性能、面积和功耗。

 

二、同步复位与异步复位

参考Xilinx官方文档《UltraFast Design Methodology Guide for FPGAs and SoCs (UG949)》:

  如需复位,Xilinx建议使用同步复位。同步复位相比于异步复位具有如下优势:

  • 在Xilinx的器件结构中,同步复位可以直接映射至器件架构中的更多资源元件。
  • 异步复位会影响通用逻辑结构的性能。由于所有Xilinx器件的通用寄存器均可将置位/复位编程为异步或同步,可能看似使用异步复位不会受到任何惩罚。使用全局异步复位虽然并不会增加控制集,但由于需要将此复位信号布局到所有寄存器元件,因此会增加布线复杂性。
  • 需要更高密度或者微调布局时,同步复位会为控制集重新映射提供更多的灵活性。如果在布局更优化的 slice 中发现不兼容的复位,那么可将同步复位重新映射到寄存器的数据路径。这样即可根据需要减少布线资源利用率并增加布局密度,从而实现正确的适配并改进性能。
  • 异步复位可能需要多周期断言(multi-cycle assertion),以确保电路正确复位并稳定。同步复位没有这个要求。
  • 复位断言有效期间,异步复位导致 block RAM、LUTRAM、以及 SRLs的存储器内容损坏的可能性更高。
  • 对于含异步复 位(用于驱动 block RAM、LUTRAM 和 SRL 的输入管脚)的寄存器尤其如此。DSP48 和 block RAM 等部分资源仅包含同步复位以供块内的寄存器元件使用。在与这些元件关联的寄存器元件上使用 异步复位时,可能无法在不影响功能的前提下直接将这些寄存器推断到这些块中。
//同步复位,敏感变量表中只有clk
always @ (posedge clk) begin
    if(rst) ......
    else ......
end

//异步复位,敏感变量表中除有clk外,还有复位信号
always @ (posedge clk or posedge rst) begin
    if(rst) ......
    else ......
end

 

三、异步复位的同步处理

“异步”的复位信号一般不建议作为FPGA逻辑的全局异步复位信号使用。(1)异步复位的“异步”很可能导致各个逻辑的复位“异步”,引起设计问题;(2)异步复位可能占用更多的FPGA布局布线资源,难以满足时序性能要求。

若设计中一定要做异步复位,那么推荐对异步复位信号先做“同步处理”,再做异步复位信号使用。

//对复位信号做同步处理,产生新的异步复位信号
//input i_rst_n;
reg r_rst_n;

always @ (posedge i_clk)
    r_rst_n <= i_rst_n;

 

请登录后发表评论

    没有回复内容