从近似 0 基础开始 FPGA 开发——Part.18:FPGA 复位系统与可靠启动设计

本文面向 AMD/Xilinx XCKU5P-FFVB676-2-I 与 Vivado 工程,承接 Part.17 的 CDC/RDC 内容,介绍 FPGA 上电、同步/异步复位、多时钟域复位、MMCM、MIG、GTY/JESD、Ethernet PHY 的启动顺序,以及复位对时序、布局和资源推断的影响。


前言:复位不是"接到所有寄存器上的清零线"

小工程经常这样写:

verilog 复制代码
always @(posedge clk or negedge rst_n) begin
    if (!rst_n)
        data_reg <= 0;
    else
        data_reg <= data_next;
end

当工程扩展到 RGMII、UDP、DDR4 MIG、AXI、GTY/JESD 后,一个全局复位直接连接所有模块会带来新的问题:

  • 复位释放不满足 Recovery/Removal,状态机偶发跑飞;
  • 同一异步复位在不同区域、不同寄存器处释放时间不同;
  • MMCM 尚未锁定,下游逻辑已经运行;
  • MIG 尚未校准,DMA 已经发起 AXI 请求;
  • GTY PLL/Channel 尚未完成复位,JESD 状态机已经等待链路;
  • FIFO 一侧已经退出复位,另一侧仍处于 Reset Busy;
  • 复位网络扇出过大,降低时序和布局质量;
  • 给所有数据寄存器加复位,导致 SRL、BRAM、DSP 内部寄存器无法正常推断。

所以,完整的复位系统需要回答五个问题:

  1. 复位从哪里来?
  2. 复位在哪个时钟域生效和释放?
  3. 每个模块是否真的需要复位?
  4. 各 IP 按什么顺序退出复位?
  5. 复位后如何确认系统已经进入可工作状态?

1. FPGA 工程中的复位来源

#mermaid-svg-N9cU9C2BDtZYBdb3{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-N9cU9C2BDtZYBdb3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-N9cU9C2BDtZYBdb3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-N9cU9C2BDtZYBdb3 .error-icon{fill:#552222;}#mermaid-svg-N9cU9C2BDtZYBdb3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-N9cU9C2BDtZYBdb3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-N9cU9C2BDtZYBdb3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-N9cU9C2BDtZYBdb3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-N9cU9C2BDtZYBdb3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-N9cU9C2BDtZYBdb3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-N9cU9C2BDtZYBdb3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-N9cU9C2BDtZYBdb3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-N9cU9C2BDtZYBdb3 .marker.cross{stroke:#333333;}#mermaid-svg-N9cU9C2BDtZYBdb3 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-N9cU9C2BDtZYBdb3 p{margin:0;}#mermaid-svg-N9cU9C2BDtZYBdb3 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-N9cU9C2BDtZYBdb3 .cluster-label text{fill:#333;}#mermaid-svg-N9cU9C2BDtZYBdb3 .cluster-label span{color:#333;}#mermaid-svg-N9cU9C2BDtZYBdb3 .cluster-label span p{background-color:transparent;}#mermaid-svg-N9cU9C2BDtZYBdb3 .label text,#mermaid-svg-N9cU9C2BDtZYBdb3 span{fill:#333;color:#333;}#mermaid-svg-N9cU9C2BDtZYBdb3 .node rect,#mermaid-svg-N9cU9C2BDtZYBdb3 .node circle,#mermaid-svg-N9cU9C2BDtZYBdb3 .node ellipse,#mermaid-svg-N9cU9C2BDtZYBdb3 .node polygon,#mermaid-svg-N9cU9C2BDtZYBdb3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-N9cU9C2BDtZYBdb3 .rough-node .label text,#mermaid-svg-N9cU9C2BDtZYBdb3 .node .label text,#mermaid-svg-N9cU9C2BDtZYBdb3 .image-shape .label,#mermaid-svg-N9cU9C2BDtZYBdb3 .icon-shape .label{text-anchor:middle;}#mermaid-svg-N9cU9C2BDtZYBdb3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-N9cU9C2BDtZYBdb3 .rough-node .label,#mermaid-svg-N9cU9C2BDtZYBdb3 .node .label,#mermaid-svg-N9cU9C2BDtZYBdb3 .image-shape .label,#mermaid-svg-N9cU9C2BDtZYBdb3 .icon-shape .label{text-align:center;}#mermaid-svg-N9cU9C2BDtZYBdb3 .node.clickable{cursor:pointer;}#mermaid-svg-N9cU9C2BDtZYBdb3 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-N9cU9C2BDtZYBdb3 .arrowheadPath{fill:#333333;}#mermaid-svg-N9cU9C2BDtZYBdb3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-N9cU9C2BDtZYBdb3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-N9cU9C2BDtZYBdb3 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-N9cU9C2BDtZYBdb3 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-N9cU9C2BDtZYBdb3 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-N9cU9C2BDtZYBdb3 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-N9cU9C2BDtZYBdb3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-N9cU9C2BDtZYBdb3 .cluster text{fill:#333;}#mermaid-svg-N9cU9C2BDtZYBdb3 .cluster span{color:#333;}#mermaid-svg-N9cU9C2BDtZYBdb3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-N9cU9C2BDtZYBdb3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-N9cU9C2BDtZYBdb3 rect.text{fill:none;stroke-width:0;}#mermaid-svg-N9cU9C2BDtZYBdb3 .icon-shape,#mermaid-svg-N9cU9C2BDtZYBdb3 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-N9cU9C2BDtZYBdb3 .icon-shape p,#mermaid-svg-N9cU9C2BDtZYBdb3 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-N9cU9C2BDtZYBdb3 .icon-shape .label rect,#mermaid-svg-N9cU9C2BDtZYBdb3 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-N9cU9C2BDtZYBdb3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-N9cU9C2BDtZYBdb3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-N9cU9C2BDtZYBdb3 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 复位来源
上电 POR / 配置完成
板级复位按键/监控芯片
MMCM/PLL Lock 丢失
AXI-Lite 软件复位
看门狗/超时恢复
PHY、MIG、GT/JESD 故障恢复

这些复位语义不同:

来源 典型范围 注意事项
POR/外部复位 整个用户系统 必须去毛刺并在各域同步释放
MMCM/PLL Lock 对应时钟域 Lock 需要稳定若干周期后才能使用
软件复位 某模块或数据通路 不应无条件复位时钟、AXI-Lite 本身
看门狗 故障模块或系统 需要记录复位原因
MIG 校准失败 DDR 数据通路 重新初始化流程由 MIG 规范决定
GT/JESD 失锁 串行链路 应区分 PLL、Channel、协议层复位
PHY Reset 外部芯片 满足脉宽、时钟与 MDIO 初始化要求

工程中建议维护 reset_reason 寄存器,记录 POR、软件、看门狗、链路和时钟故障原因。


2. 同步复位与异步复位

2.1 同步复位

verilog 复制代码
always @(posedge clk) begin
    if (rst)
        state <= IDLE;
    else
        state <= state_next;
end

只有时钟有效边沿到来时复位才生效。

优点:

  • 置位和释放都由当前时钟采样;
  • 更容易进行常规时序分析;
  • 有利于控制集重映射和高密度布局;
  • 更容易映射到 DSP、BRAM 等硬核内部寄存器。

缺点:

  • 时钟停止时可能无法复位;
  • 复位脉冲必须足够长,确保被时钟采到;
  • 高扇出同步复位本身仍需满足 Setup/Hold。

2.2 异步复位

verilog 复制代码
always @(posedge clk or negedge arst_n) begin
    if (!arst_n)
        state <= IDLE;
    else
        state <= state_next;
end

复位不依赖时钟即可立即生效。

优点:时钟未运行时仍可将关键寄存器置于安全状态。

缺点:释放时存在 Recovery/Removal 风险;过多异步复位会增加控制集、限制打包和资源推断。

2.3 推荐原则

不是"同步一定优于异步"或"所有模块必须异步复位",而是:

  • 安全输出、同步链和必须在无时钟时复位的寄存器可异步置位;
  • 普通控制状态机优先考虑同步复位;
  • 大量数据流水寄存器通常不需要逐个复位;
  • 外部异步复位进入每个时钟域时采用"异步置位、同步释放"。

3. Recovery 与 Removal

异步复位释放同样需要避开时钟边沿:
Clock Async Reset Clock Async Reset #mermaid-svg-2qpzY8lMGWTMMdwR{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-2qpzY8lMGWTMMdwR .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-2qpzY8lMGWTMMdwR .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-2qpzY8lMGWTMMdwR .error-icon{fill:#552222;}#mermaid-svg-2qpzY8lMGWTMMdwR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-2qpzY8lMGWTMMdwR .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-2qpzY8lMGWTMMdwR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-2qpzY8lMGWTMMdwR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-2qpzY8lMGWTMMdwR .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-2qpzY8lMGWTMMdwR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-2qpzY8lMGWTMMdwR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-2qpzY8lMGWTMMdwR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-2qpzY8lMGWTMMdwR .marker.cross{stroke:#333333;}#mermaid-svg-2qpzY8lMGWTMMdwR svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-2qpzY8lMGWTMMdwR p{margin:0;}#mermaid-svg-2qpzY8lMGWTMMdwR .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-2qpzY8lMGWTMMdwR text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-2qpzY8lMGWTMMdwR .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-2qpzY8lMGWTMMdwR .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-2qpzY8lMGWTMMdwR .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-2qpzY8lMGWTMMdwR .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-2qpzY8lMGWTMMdwR #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-2qpzY8lMGWTMMdwR .sequenceNumber{fill:white;}#mermaid-svg-2qpzY8lMGWTMMdwR #sequencenumber{fill:#333;}#mermaid-svg-2qpzY8lMGWTMMdwR #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-2qpzY8lMGWTMMdwR .messageText{fill:#333;stroke:none;}#mermaid-svg-2qpzY8lMGWTMMdwR .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-2qpzY8lMGWTMMdwR .labelText,#mermaid-svg-2qpzY8lMGWTMMdwR .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-2qpzY8lMGWTMMdwR .loopText,#mermaid-svg-2qpzY8lMGWTMMdwR .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-2qpzY8lMGWTMMdwR .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-2qpzY8lMGWTMMdwR .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-2qpzY8lMGWTMMdwR .noteText,#mermaid-svg-2qpzY8lMGWTMMdwR .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-2qpzY8lMGWTMMdwR .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-2qpzY8lMGWTMMdwR .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-2qpzY8lMGWTMMdwR .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-2qpzY8lMGWTMMdwR .actorPopupMenu{position:absolute;}#mermaid-svg-2qpzY8lMGWTMMdwR .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-2qpzY8lMGWTMMdwR .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-2qpzY8lMGWTMMdwR .actor-man circle,#mermaid-svg-2qpzY8lMGWTMMdwR line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-2qpzY8lMGWTMMdwR :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 释放若靠近时钟边沿 寄存器可能进入亚稳态或分批退出复位 复位有效 复位释放 采样边沿

  • Recovery 类似异步控制相对时钟的 Setup 要求;
  • Removal 类似异步控制相对时钟的 Hold 要求。

直接把板级 reset_n 扇出到所有寄存器,无法保证整个芯片同时、安全地退出复位。


4. 异步置位、同步释放

4.1 低有效复位同步器

verilog 复制代码
module reset_sync_n #(
    parameter integer STAGES = 3
)(
    input  wire clk,
    input  wire arst_n,
    output wire srst_n
);

    (* ASYNC_REG = "TRUE" *)
    reg [STAGES-1:0] rst_pipe;

    always @(posedge clk or negedge arst_n) begin
        if (!arst_n)
            rst_pipe <= {STAGES{1'b0}};
        else
            rst_pipe <= {rst_pipe[STAGES-2:0], 1'b1};
    end

    assign srst_n = rst_pipe[STAGES-1];

endmodule

行为:

  • arst_n=0 时,输出立即为 0;
  • arst_n=1 后,输出经过若干个 clk 周期才变为 1;
  • 不同时钟域必须各自实例化一个同步器。

4.2 XPM 方案

UltraScale+ 可使用:

  • XPM_CDC_ASYNC_RST:异步置位、同步释放;
  • XPM_CDC_SYNC_RST:置位和释放都同步于目的时钟。
verilog 复制代码
xpm_cdc_async_rst #(
    .DEST_SYNC_FF    (3),
    .INIT_SYNC_FF    (0),
    .RST_ACTIVE_HIGH (0)
) u_rst_sync (
    .src_arst  (board_rst_n),
    .dest_clk  (user_clk),
    .dest_arst (user_rst_n)
);

正式工程请从当前 Vivado Language Templates 复制与版本对应的模板。


5. 多时钟域复位树

#mermaid-svg-YQnZWl1F4d9Iv8AK{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-YQnZWl1F4d9Iv8AK .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-YQnZWl1F4d9Iv8AK .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-YQnZWl1F4d9Iv8AK .error-icon{fill:#552222;}#mermaid-svg-YQnZWl1F4d9Iv8AK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-YQnZWl1F4d9Iv8AK .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-YQnZWl1F4d9Iv8AK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-YQnZWl1F4d9Iv8AK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-YQnZWl1F4d9Iv8AK .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-YQnZWl1F4d9Iv8AK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-YQnZWl1F4d9Iv8AK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-YQnZWl1F4d9Iv8AK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-YQnZWl1F4d9Iv8AK .marker.cross{stroke:#333333;}#mermaid-svg-YQnZWl1F4d9Iv8AK svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-YQnZWl1F4d9Iv8AK p{margin:0;}#mermaid-svg-YQnZWl1F4d9Iv8AK .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-YQnZWl1F4d9Iv8AK .cluster-label text{fill:#333;}#mermaid-svg-YQnZWl1F4d9Iv8AK .cluster-label span{color:#333;}#mermaid-svg-YQnZWl1F4d9Iv8AK .cluster-label span p{background-color:transparent;}#mermaid-svg-YQnZWl1F4d9Iv8AK .label text,#mermaid-svg-YQnZWl1F4d9Iv8AK span{fill:#333;color:#333;}#mermaid-svg-YQnZWl1F4d9Iv8AK .node rect,#mermaid-svg-YQnZWl1F4d9Iv8AK .node circle,#mermaid-svg-YQnZWl1F4d9Iv8AK .node ellipse,#mermaid-svg-YQnZWl1F4d9Iv8AK .node polygon,#mermaid-svg-YQnZWl1F4d9Iv8AK .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-YQnZWl1F4d9Iv8AK .rough-node .label text,#mermaid-svg-YQnZWl1F4d9Iv8AK .node .label text,#mermaid-svg-YQnZWl1F4d9Iv8AK .image-shape .label,#mermaid-svg-YQnZWl1F4d9Iv8AK .icon-shape .label{text-anchor:middle;}#mermaid-svg-YQnZWl1F4d9Iv8AK .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-YQnZWl1F4d9Iv8AK .rough-node .label,#mermaid-svg-YQnZWl1F4d9Iv8AK .node .label,#mermaid-svg-YQnZWl1F4d9Iv8AK .image-shape .label,#mermaid-svg-YQnZWl1F4d9Iv8AK .icon-shape .label{text-align:center;}#mermaid-svg-YQnZWl1F4d9Iv8AK .node.clickable{cursor:pointer;}#mermaid-svg-YQnZWl1F4d9Iv8AK .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-YQnZWl1F4d9Iv8AK .arrowheadPath{fill:#333333;}#mermaid-svg-YQnZWl1F4d9Iv8AK .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-YQnZWl1F4d9Iv8AK .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-YQnZWl1F4d9Iv8AK .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YQnZWl1F4d9Iv8AK .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-YQnZWl1F4d9Iv8AK .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YQnZWl1F4d9Iv8AK .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-YQnZWl1F4d9Iv8AK .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-YQnZWl1F4d9Iv8AK .cluster text{fill:#333;}#mermaid-svg-YQnZWl1F4d9Iv8AK .cluster span{color:#333;}#mermaid-svg-YQnZWl1F4d9Iv8AK div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-YQnZWl1F4d9Iv8AK .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-YQnZWl1F4d9Iv8AK rect.text{fill:none;stroke-width:0;}#mermaid-svg-YQnZWl1F4d9Iv8AK .icon-shape,#mermaid-svg-YQnZWl1F4d9Iv8AK .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YQnZWl1F4d9Iv8AK .icon-shape p,#mermaid-svg-YQnZWl1F4d9Iv8AK .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-YQnZWl1F4d9Iv8AK .icon-shape .label rect,#mermaid-svg-YQnZWl1F4d9Iv8AK .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YQnZWl1F4d9Iv8AK .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-YQnZWl1F4d9Iv8AK .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-YQnZWl1F4d9Iv8AK :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 板级复位/POR
去毛刺与复位控制器
100 MHz 域同步器
RGMII RX 域同步器
UDP/DMA 域同步器
MIG UI 域同步器
GTY/JESD 域同步器

错误做法是先在 100 MHz 域同步一次,再把这个输出直接当成 125 MHz、300 MHz、GT User Clock 域的同步复位。它对其他时钟域仍是异步信号。

推荐命名:

text 复制代码
arst_global_n       原始异步复位
rst_sys_100m_n      100 MHz 域同步复位
rst_rgmii_rx_n      RGMII RX 域同步复位
rst_udp_n           UDP 用户域同步复位
rst_mig_ui_n        MIG UI 域同步复位
rst_gty_rx_n        GTY RX User Clock 域同步复位

6. 不是所有寄存器都需要复位

AMD UltraFast 方法学建议逐个同步块判断是否真的需要复位。减少复位可以:

  • 降低复位网络扇出;
  • 减少路由拥塞;
  • 降低控制集数量;
  • 改善寄存器打包和最高频率;
  • 允许 SRL、BRAM、URAM、DSP 内部流水寄存器被正确使用;
  • 降低动态功耗。

6.1 必须复位的典型对象

  • 协议状态机状态;
  • valid、ready 状态与事务占用标志;
  • 外部输出使能和安全控制;
  • FIFO 指针/标志;
  • 错误 Sticky Flag;
  • 影响软件可见行为的控制寄存器。

6.2 通常可以不复位的对象

  • 在 valid=0 时没有意义的数据寄存器;
  • 纯数据流水线;
  • 后续一定会被完整覆盖的缓存数据;
  • 乘加器中由有效信号保护的数据寄存器。
verilog 复制代码
always @(posedge clk) begin
    if (rst) begin
        out_valid <= 1'b0;
    end else begin
        out_valid <= next_valid;
    end

    // 数据本身不复位,由 out_valid 决定是否有效
    if (load_data)
        out_data <= next_data;
end

7. 控制集为什么重要?

控制集由寄存器使用的 Clock、Clock Enable 和 Set/Reset 组合构成。复位极性、同步/异步类型或使能不同,都会形成不同控制集。

text 复制代码
同一个 clk + rst + ce 组合 -> 一个控制集
不同 rst/ce 组合          -> 新控制集

控制集过多会导致本可放在同一 Slice 的寄存器无法打包,造成:

  • 利用率看起来不高却出现拥塞;
  • 布线距离增加;
  • Setup 时序恶化;
  • 功耗增加。

编码时应让 Reset 优先于 Clock Enable:

verilog 复制代码
always @(posedge clk) begin
    if (rst)
        q <= 1'b0;
    else if (ce)
        q <= d;
end

若把 CE 写在 Reset 前面,可能迫使工具把复位功能映射到数据路径并增加逻辑。


8. 高扇出复位网络

全局复位可能驱动数万寄存器。常见问题:

  • 源端经过组合逻辑产生毛刺;
  • 一条复位网跨越多个 Clock Region;
  • 高扇出导致布线延时和拥塞;
  • 复位路径影响关键数据路径布局。

推荐方法:

  1. 减少不必要的复位寄存器;
  2. 每个时钟域独立同步;
  3. 在层级边界生成本地同步复位;
  4. 让 Vivado 做高扇出优化和驱动复制;
  5. 不要手工把异步复位用 LUT 随意分支;
  6. 用 report_high_fanout_nets 和 Device 视图检查。

9. 上电启动控制器

复杂系统不能只依赖一个计数器延时固定时间。应根据实际就绪信号分阶段启动。
#mermaid-svg-Xrpn3v3PEiCRCZoS{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Xrpn3v3PEiCRCZoS .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Xrpn3v3PEiCRCZoS .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Xrpn3v3PEiCRCZoS .error-icon{fill:#552222;}#mermaid-svg-Xrpn3v3PEiCRCZoS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Xrpn3v3PEiCRCZoS .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Xrpn3v3PEiCRCZoS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Xrpn3v3PEiCRCZoS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Xrpn3v3PEiCRCZoS .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Xrpn3v3PEiCRCZoS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Xrpn3v3PEiCRCZoS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Xrpn3v3PEiCRCZoS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Xrpn3v3PEiCRCZoS .marker.cross{stroke:#333333;}#mermaid-svg-Xrpn3v3PEiCRCZoS svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Xrpn3v3PEiCRCZoS p{margin:0;}#mermaid-svg-Xrpn3v3PEiCRCZoS defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-Xrpn3v3PEiCRCZoS g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-Xrpn3v3PEiCRCZoS g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-Xrpn3v3PEiCRCZoS g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-Xrpn3v3PEiCRCZoS g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-Xrpn3v3PEiCRCZoS g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-Xrpn3v3PEiCRCZoS .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-Xrpn3v3PEiCRCZoS .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-Xrpn3v3PEiCRCZoS .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-Xrpn3v3PEiCRCZoS .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-Xrpn3v3PEiCRCZoS .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-Xrpn3v3PEiCRCZoS .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-Xrpn3v3PEiCRCZoS .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-Xrpn3v3PEiCRCZoS .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Xrpn3v3PEiCRCZoS .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Xrpn3v3PEiCRCZoS .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Xrpn3v3PEiCRCZoS .edgeLabel .label text{fill:#333;}#mermaid-svg-Xrpn3v3PEiCRCZoS .label div .edgeLabel{color:#333;}#mermaid-svg-Xrpn3v3PEiCRCZoS .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-Xrpn3v3PEiCRCZoS .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-Xrpn3v3PEiCRCZoS .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-Xrpn3v3PEiCRCZoS .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-Xrpn3v3PEiCRCZoS .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-Xrpn3v3PEiCRCZoS .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Xrpn3v3PEiCRCZoS .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Xrpn3v3PEiCRCZoS #statediagram-barbEnd{fill:#333333;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Xrpn3v3PEiCRCZoS .cluster-label,#mermaid-svg-Xrpn3v3PEiCRCZoS .nodeLabel{color:#131300;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-Xrpn3v3PEiCRCZoS .note-edge{stroke-dasharray:5;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagram-note text{fill:black;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagram-note .nodeLabel{color:black;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagram .edgeLabel{color:red;}#mermaid-svg-Xrpn3v3PEiCRCZoS #dependencyStart,#mermaid-svg-Xrpn3v3PEiCRCZoS #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Xrpn3v3PEiCRCZoS :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 外部复位释放
MMCM/PLL locked
Lock 连续稳定
释放 MIG/基础设施
init_calib_complete
PHY/GT/JESD ready
严重故障/看门狗
HOLD_ALL
WAIT_CLK_LOCK
WAIT_STABLE
RELEASE_INFRA
WAIT_DDR
WAIT_LINK
RELEASE_USER
RUN

9.1 Lock 要滤波

MMCM locked 刚置位时,不建议立即释放整个系统。可以要求连续若干周期为 1:

verilog 复制代码
reg [7:0] lock_filter;

always @(posedge mgmt_clk or negedge board_rst_n) begin
    if (!board_rst_n)
        lock_filter <= 8'h00;
    else
        lock_filter <= {lock_filter[6:0], mmcm_locked};
end

wire clk_stable = &lock_filter;

9.2 不要在时钟停止域里等待自己的时钟

启动控制器应运行在始终可用的管理时钟域,例如板上稳定的 100 MHz 时钟。若目标时钟尚未建立,目标域无法自己执行状态机退出复位。


10. 当前 KU5P 工程的推荐启动顺序

#mermaid-svg-DIdRVm1btkfMhTMd{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-DIdRVm1btkfMhTMd .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DIdRVm1btkfMhTMd .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DIdRVm1btkfMhTMd .error-icon{fill:#552222;}#mermaid-svg-DIdRVm1btkfMhTMd .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DIdRVm1btkfMhTMd .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DIdRVm1btkfMhTMd .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DIdRVm1btkfMhTMd .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DIdRVm1btkfMhTMd .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DIdRVm1btkfMhTMd .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DIdRVm1btkfMhTMd .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DIdRVm1btkfMhTMd .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DIdRVm1btkfMhTMd .marker.cross{stroke:#333333;}#mermaid-svg-DIdRVm1btkfMhTMd svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DIdRVm1btkfMhTMd p{margin:0;}#mermaid-svg-DIdRVm1btkfMhTMd .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-DIdRVm1btkfMhTMd .cluster-label text{fill:#333;}#mermaid-svg-DIdRVm1btkfMhTMd .cluster-label span{color:#333;}#mermaid-svg-DIdRVm1btkfMhTMd .cluster-label span p{background-color:transparent;}#mermaid-svg-DIdRVm1btkfMhTMd .label text,#mermaid-svg-DIdRVm1btkfMhTMd span{fill:#333;color:#333;}#mermaid-svg-DIdRVm1btkfMhTMd .node rect,#mermaid-svg-DIdRVm1btkfMhTMd .node circle,#mermaid-svg-DIdRVm1btkfMhTMd .node ellipse,#mermaid-svg-DIdRVm1btkfMhTMd .node polygon,#mermaid-svg-DIdRVm1btkfMhTMd .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DIdRVm1btkfMhTMd .rough-node .label text,#mermaid-svg-DIdRVm1btkfMhTMd .node .label text,#mermaid-svg-DIdRVm1btkfMhTMd .image-shape .label,#mermaid-svg-DIdRVm1btkfMhTMd .icon-shape .label{text-anchor:middle;}#mermaid-svg-DIdRVm1btkfMhTMd .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-DIdRVm1btkfMhTMd .rough-node .label,#mermaid-svg-DIdRVm1btkfMhTMd .node .label,#mermaid-svg-DIdRVm1btkfMhTMd .image-shape .label,#mermaid-svg-DIdRVm1btkfMhTMd .icon-shape .label{text-align:center;}#mermaid-svg-DIdRVm1btkfMhTMd .node.clickable{cursor:pointer;}#mermaid-svg-DIdRVm1btkfMhTMd .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-DIdRVm1btkfMhTMd .arrowheadPath{fill:#333333;}#mermaid-svg-DIdRVm1btkfMhTMd .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DIdRVm1btkfMhTMd .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DIdRVm1btkfMhTMd .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DIdRVm1btkfMhTMd .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-DIdRVm1btkfMhTMd .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DIdRVm1btkfMhTMd .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-DIdRVm1btkfMhTMd .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DIdRVm1btkfMhTMd .cluster text{fill:#333;}#mermaid-svg-DIdRVm1btkfMhTMd .cluster span{color:#333;}#mermaid-svg-DIdRVm1btkfMhTMd div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DIdRVm1btkfMhTMd .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-DIdRVm1btkfMhTMd rect.text{fill:none;stroke-width:0;}#mermaid-svg-DIdRVm1btkfMhTMd .icon-shape,#mermaid-svg-DIdRVm1btkfMhTMd .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DIdRVm1btkfMhTMd .icon-shape p,#mermaid-svg-DIdRVm1btkfMhTMd .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-DIdRVm1btkfMhTMd .icon-shape .label rect,#mermaid-svg-DIdRVm1btkfMhTMd .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DIdRVm1btkfMhTMd .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-DIdRVm1btkfMhTMd .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-DIdRVm1btkfMhTMd :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} FPGA 配置完成 + 板级复位释放
100 MHz 管理时钟稳定
MMCM/PLL Lock 稳定
释放 AXI-Lite 与状态寄存器
释放 MIG 并等待校准
init_calib_complete=1
配置/释放 Ethernet PHY
启动 GTY/JESD 初始化
RGMII Link Up
GT reset done + JESD Link Up
释放 UDP/DMA 业务

建议区分:

  • infra_reset:时钟、互连、寄存器基础设施;
  • ddr_reset:MIG/DDR 数据通路;
  • eth_reset:MAC/UDP/PHY 管理;
  • jesd_reset:GTY、PHY、JESD Core;
  • dma_soft_reset:只清空 DMA/FIFO 和统计,不重启整个系统。

11. MIG DDR4 复位注意事项

MIG 常见信号包括系统复位、UI Clock、UI Clock Sync Reset 和 init_calib_complete。具体极性和时序以生成 IP 的端口说明为准。

工程原则:

  • MIG 输入时钟必须先稳定;
  • 不要把 init_calib_complete 当作异步信号直接用于其他域;
  • 业务 AXI Master 必须等校准完成且 AXI 域复位释放;
  • AXI Clock Converter 两侧复位应符合其时钟域要求;
  • 运行中重新复位 MIG 会破坏 DDR 中已有数据;
  • 软件程序位于 DDR 时,不能在运行过程中随意复位 MIG。
verilog 复制代码
wire ddr_ready_sync;

xpm_cdc_single #(
    .DEST_SYNC_FF(2),
    .SRC_INPUT_REG(1)
) u_sync_ddr_ready (
    .src_clk  (mig_ui_clk),
    .src_in   (init_calib_complete),
    .dest_clk (dma_clk),
    .dest_out (ddr_ready_sync)
);

12. GTY/JESD 复位注意事项

GTY 复位不是一根 reset 线能够描述的,通常涉及:

  • 参考时钟稳定;
  • QPLL/CPLL Lock;
  • TX/RX Channel Reset;
  • TX/RX Reset Done;
  • User Clock Active;
  • Buffer/Alignment;
  • JESD CGS、ILAS、Data 阶段;
  • SYSREF/LMFC 同步。

优先使用 GT Wizard/JESD IP 生成的初始化状态机。用户逻辑应在规定的 reset_done、userclk_active 和协议 Link Up 条件满足后再开放数据。

若链路掉线,先判断应该:

  • 只重启 JESD 协议层;
  • 重启 RX/TX Channel;
  • 重启 PLL;
  • 还是重新配置外部 ADC/DAC。

复位范围越大,恢复时间越长,影响也越大。


13. Ethernet PHY 与 RGMII 复位

YT8531DC-CA 等外部 PHY 的硬件复位需要满足数据手册规定的:

  • 复位有效脉宽;
  • 电源稳定到复位释放的延时;
  • 参考时钟稳定时间;
  • Strap 管脚采样时刻;
  • 复位后 MDIO 可访问时间。

推荐流程:

text 复制代码
电源稳定 -> PHY参考时钟稳定 -> 保持RESET_N
-> 释放RESET_N -> 等待PHY启动 -> MDIO配置
-> 等待Link Up -> 释放UDP业务

RGMII RX 域使用 PHY 输出的 RXC,因此 MAC RX 复位必须在 rgmii_rxc 域同步释放。不能只使用系统 100 MHz 域的同步复位。


14. FIFO 与 AXI 复位

异步 FIFO 两侧有独立时钟。复位时需要:

  • 写域停止写入;
  • 读域停止读取;
  • 按 IP 要求保持复位脉宽;
  • 等待 wr_rst_busy/rd_rst_busy 结束;
  • 清除半帧状态和 AXIS TVALID;
  • 再开放上下游流量。

AXI Interconnect、SmartConnect 和 Clock Converter 的复位通常为低有效 aresetn,并要求相对于各自 aclk 同步释放。

模块复位时,如果上游仍保持 VALID、下游仍等待响应,可能造成永久挂起。软复位必须定义清楚:

  • 未完成事务是等待结束、丢弃还是返回错误;
  • FIFO 中已有数据是否保留;
  • AXI Burst 能否在中途取消。

15. 软件复位寄存器怎么设计?

软件复位不建议让 CPU 写 1 后永久保持,而应转换为受控请求:
Target Module Reset Controller AXI-Lite/CPU Target Module Reset Controller AXI-Lite/CPU #mermaid-svg-onb3jN2nE5n9Nkzh{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-onb3jN2nE5n9Nkzh .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-onb3jN2nE5n9Nkzh .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-onb3jN2nE5n9Nkzh .error-icon{fill:#552222;}#mermaid-svg-onb3jN2nE5n9Nkzh .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-onb3jN2nE5n9Nkzh .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-onb3jN2nE5n9Nkzh .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-onb3jN2nE5n9Nkzh .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-onb3jN2nE5n9Nkzh .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-onb3jN2nE5n9Nkzh .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-onb3jN2nE5n9Nkzh .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-onb3jN2nE5n9Nkzh .marker{fill:#333333;stroke:#333333;}#mermaid-svg-onb3jN2nE5n9Nkzh .marker.cross{stroke:#333333;}#mermaid-svg-onb3jN2nE5n9Nkzh svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-onb3jN2nE5n9Nkzh p{margin:0;}#mermaid-svg-onb3jN2nE5n9Nkzh .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-onb3jN2nE5n9Nkzh text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-onb3jN2nE5n9Nkzh .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-onb3jN2nE5n9Nkzh .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-onb3jN2nE5n9Nkzh .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-onb3jN2nE5n9Nkzh .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-onb3jN2nE5n9Nkzh #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-onb3jN2nE5n9Nkzh .sequenceNumber{fill:white;}#mermaid-svg-onb3jN2nE5n9Nkzh #sequencenumber{fill:#333;}#mermaid-svg-onb3jN2nE5n9Nkzh #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-onb3jN2nE5n9Nkzh .messageText{fill:#333;stroke:none;}#mermaid-svg-onb3jN2nE5n9Nkzh .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-onb3jN2nE5n9Nkzh .labelText,#mermaid-svg-onb3jN2nE5n9Nkzh .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-onb3jN2nE5n9Nkzh .loopText,#mermaid-svg-onb3jN2nE5n9Nkzh .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-onb3jN2nE5n9Nkzh .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-onb3jN2nE5n9Nkzh .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-onb3jN2nE5n9Nkzh .noteText,#mermaid-svg-onb3jN2nE5n9Nkzh .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-onb3jN2nE5n9Nkzh .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-onb3jN2nE5n9Nkzh .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-onb3jN2nE5n9Nkzh .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-onb3jN2nE5n9Nkzh .actorPopupMenu{position:absolute;}#mermaid-svg-onb3jN2nE5n9Nkzh .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-onb3jN2nE5n9Nkzh .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-onb3jN2nE5n9Nkzh .actor-man circle,#mermaid-svg-onb3jN2nE5n9Nkzh line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-onb3jN2nE5n9Nkzh :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 写 soft_reset_req 停止接收新事务 idle/flush_done 复位保持 N 个目标时钟周期 同步释放复位 init_done reset_done + reason

推荐寄存器:

寄存器 功能
RESET_REQ 写 1 发起指定模块复位
RESET_STATUS 当前处于哪个复位阶段
RESET_REASON 最近一次复位原因
RESET_COUNT 模块累计复位次数
READY_STATUS 时钟、MIG、PHY、GT/JESD 就绪位
TIMEOUT_STATUS 哪个阶段发生超时

16. 复位约束与 Vivado 报告

外部异步复位本身不是普通数据输入,不应随意添加虚假的 Input Delay。重点是让同步释放结构被工具识别,并检查 Recovery/Removal。

常用命令:

tcl 复制代码
report_cdc
report_clock_interaction
report_timing -delay_type min_max
report_high_fanout_nets
report_control_sets
report_methodology
check_timing -verbose

对于标准异步复位同步器,例外范围必须精确。不要这样做:

tcl 复制代码
# 错误示例:可能隐藏整个设计的恢复/移除问题
set_false_path -from [get_ports board_rst_n]

应优先使用 XPM/标准同步结构及 IP 自带约束;若必须添加例外,只作用于同步链第一级的异步控制路径,并验证对象匹配数量。


17. 仿真方法

复位 Testbench 不应只在仿真开始时拉低一次。

需要覆盖:

  • 上电时钟尚未稳定;
  • 复位释放靠近时钟边沿;
  • MMCM Lock 抖动;
  • MIG 校准成功和超时;
  • PHY/GT Link Up 延迟;
  • 业务运行中软复位;
  • AXIS 背压和半帧状态下复位;
  • 多个复位原因同时出现;
  • 目标时钟暂停后恢复。

关键断言:

text 复制代码
未 ready 时不能发起 AXI/AXIS 业务
复位期间所有 valid 必须为 0
状态机退出复位后必须从合法状态开始
FIFO reset busy 期间不得读写
reset_done 必须在所有依赖 ready 后产生
每个请求必须得到 done 或 timeout

18. 上板调试

建议用 ILA 观察:

text 复制代码
board_reset
mmcm_locked / lock_stable
mig_ui_rst / init_calib_complete
phy_reset_n / link_up
gty_pll_lock / txresetdone / rxresetdone
jesd_link_up
各时钟域 reset_n
system_ready
reset_state / timeout_counter / reset_reason

不要只看 system_ready=1,还要保留每个阶段的进入时间和超时标志。若某状态只出现几个周期,使用 Sticky Flag 记录,避免 ILA 没有恰好触发。


19. 常见错误

错误 1:全工程共用一根异步复位

释放时可能在不同寄存器处产生不一致。应按时钟域同步释放。

错误 2:所有寄存器都清零

会增加扇出、控制集和拥塞,还可能阻止 SRL、BRAM、DSP 推断。只复位控制状态和有效标志。

错误 3:MMCM Lock 一拉高就立即启动

Lock 可能短暂变化。应滤波并按顺序释放下游。

错误 4:把 init_calib_complete 直接用于其他时钟域

这是 CDC。应同步后再使用。

错误 5:复位 AXI Slave,却不处理未完成事务

Master 可能永远等待响应。软复位前需要 quiesce/flush 协议。

错误 6:FIFO 一侧先运行

另一侧仍 Reset Busy 时可能出现错误标志或数据丢失。两侧均 ready 后再开放业务。

错误 7:用组合逻辑产生异步复位

多个条件的组合毛刺可能产生窄复位脉冲。复位原因应先在管理域锁存,再由控制器输出。

错误 8:复位整个系统解决局部错误

会扩大故障影响。应设计分层复位和可恢复边界。


20. 工程检查清单

  • 所有时钟域均有独立复位同步器;
  • 异步复位均同步释放;
  • 复位同步寄存器设置 ASYNC_REG;
  • 管理状态机运行在始终可用时钟域;
  • MMCM/PLL Lock 经过稳定判定;
  • MIG 校准完成后才开放 DDR 访问;
  • PHY 满足硬件复位和 Strap 采样要求;
  • GTY/JESD 使用官方复位状态机;
  • FIFO Reset Busy 结束后才允许读写;
  • 数据流水寄存器没有无意义复位;
  • 控制集数量与高扇出网络已检查;
  • 软件复位不会截断未完成 AXI 事务;
  • 复位原因、次数和超时可通过 AXI-Lite 回读;
  • 仿真覆盖运行中复位和异常恢复;
  • ILA 能观察各阶段 Ready/Reset 状态。

21. 总结

可靠复位系统的核心原则是:

  1. 异步复位可以立即置位,但必须在每个时钟域同步释放;
  2. 只复位真正需要确定初值的控制状态,不要默认清零所有数据寄存器;
  3. 复位是一套启动协议,不只是一根信号;
  4. MMCM、MIG、PHY、GTY/JESD 和业务逻辑必须按依赖关系启动;
  5. 软复位需要先停止新事务,再清理状态,最后重新开放业务;
  6. 复位网络也会影响控制集、布局、时序、功耗和资源推断;
  7. 每次复位都应有原因、状态、超时和可观测结果。

对当前 KU5P 工程,推荐把 100 MHz 稳定参考时钟作为管理域,以独立同步复位控制 RGMII、UDP/DMA、MIG UI 和 GTY/JESD 时钟域,并通过 AXI-Lite 暴露完整启动状态。


参考资料

  1. AMD UltraFast Design Methodology:Resets(UG949)
  2. AMD UltraFast Design Methodology:When and Where to Use a Reset(UG949)
  3. AMD UltraFast Design Methodology:Synchronous Reset vs. Asynchronous Reset(UG949)
  4. AMD UltraFast Design Methodology:Control Signals and Control Sets(UG949)
  5. AMD UltraScale Architecture Libraries Guide(UG974)
  6. AMD XPM_CDC_ASYNC_RST(UG974)
  7. AMD XPM_CDC_SYNC_RST(UG974)

不同 IP 和 Vivado 版本的复位端口极性、最小脉宽与启动顺序可能不同,最终必须以当前 IP Product Guide、Example Design 和生成后的端口说明为准。

相关推荐
智感子1 天前
测控链路:从传感器到上位机
人工智能·嵌入式硬件·fpga开发
szxinmai主板定制专家2 天前
基于Zynq的高精度多通道数据采集卡完整解决方案(工业振动/高速采集/边缘传输)
fpga开发·zynq·数据采集卡
szxinmai主板定制专家2 天前
基于TI AM62x+FPGA的24bit高精度数据采集卡设计(振动/风电/发动机监测)
人工智能·fpga开发·arm+fpga·rk3588+fpga
szxinmai主板定制专家2 天前
基于 ARM+FPGA 雕刻机控制系统的设计
arm开发·人工智能·fpga开发·rk3576·半导体设备
吉他英雄一里3 天前
zynq入门教程
fpga开发·zynq
XMAIPC_Robot3 天前
RK3576/RK3588+FPGA+AI数据采集系统:实时性与边缘AI算力兼顾
人工智能·fpga开发·机器人·数据采集·rk3588+fpga·rk3576+fpga
156082072194 天前
JFMRFVU3P5G的bit正常,但烧录mcs程序后加载异常
fpga开发
狂奔蜗牛(bradley)4 天前
把 EtherCAT 初始化从 FPGA 搬到 ARM:命令通道的接口设计与11个坑
arm开发·人工智能·fpga开发·架构
女神下凡5 天前
芯参谋(37):EEPROM_电路设计指南
arm开发·单片机·嵌入式硬件·fpga开发·设计规范