FPGA实战(45):Xilinx SRIO Gen2高速串行通信(三)——时钟网络、复位策略与IP核深度解析

📅 2026/7/11 18:05:58 👁️ 阅读次数 📝 编程学习
FPGA实战(45):Xilinx SRIO Gen2高速串行通信(三)——时钟网络、复位策略与IP核深度解析

一、引言

前两篇文章分别介绍了顶层系统集成(XC7Z035_TOP)和通道封装层(SRIO_ModuleSRIO_Channel)。作为系列第三篇,我们将深入SRIO_Channel内部,剖析其三大核心子模块的设计原理与工程实现:

  • srio_gen2_0_srio_clk:基于MMCM(混合模式时钟管理器)的多时钟域生成,包括log_clkphy_clkgt_pcs_clkgt_clkdrpclk
  • srio_gen2_0_srio_rst:多时钟域可靠复位同步策略,以及用户可控的force_reinit链路重初始化状态机。
  • srio_gen2_0IP核:SRIO Gen2 IP核的关键接口、HELLO包格式解析与AXI4-Stream握手时序。

这三部分共同构成了SRIO通道的“时钟-复位-协议”基础底座,是理解整个SRIO通信系统稳定运行的核心。


二、整体架构

SRIO_Channel内部结构如下:

三者之间的依赖关系:

  1. srio_clk为IP核和rst模块提供所有时钟及clk_lock指示。
  2. srio_rst接收clk_lockport_initialized,产生各时钟域的同步复位信号(log_rstphy_rst等),馈送给IP核。
  3. IP核在时钟和复位就绪后开始链路训练,初始化完成后输出port_initialized

这种“时钟先稳定 → 复位释放 → IP核初始化”的顺序保证了系统上电的可靠性。


三、创新点分析

创新点一:MMCM多时钟域单参考时钟分频网络

设计实现:

srio_clk模块通过一个MMCM,将输入的GT参考时钟(如156.25MHz)分频产生五个独立时钟域:

时钟分频比(以156.25MHz为例)典型频率用途
gt_clk÷1(直接)156.25MHzGT收发器高速时钟
log_clk÷352.083MHz逻辑层用户时钟
phy_clk÷1213.02MHz物理层状态机时钟(用于低速控制)
gt_pcs_clk÷626.04MHzGT PCS(物理编码子层)时钟
drpclk÷12(与phy_clk同源)13.02MHz动态重配置端口时钟

MMCM配置参数示例(来自源码):

MMCME2_ADV #( .DIVCLK_DIVIDE (1), .CLKFBOUT_MULT_F (6.000), .CLKOUT0_DIVIDE_F (3.000), // gt_clk = 156.25MHz .CLKOUT1_DIVIDE (12), // phy_clk / drpclk = 13.02MHz .CLKOUT2_DIVIDE (6), // gt_pcs_clk = 26.04MHz .CLKIN1_PERIOD (6.400) // 156.25MHz周期 (1/156.25e6) )

创新价值:

  • 单参考源驱动多域:仅需一个外部GT参考时钟,即可产生SRIO协议栈所需的全部时钟,简化了板级时钟设计。
  • 频率灵活性:通过调整CLKIN1_PERIOD和分频参数,可适配125MHz、156.25MHz等常见GT参考时钟频率。
  • 相位对齐:所有输出时钟来自同一MMCM,具有确定的相位关系,简化了跨时钟域同步设计。

创新点二:四级移位寄存器跨时钟域复位同步释放

设计实现:

rst模块对每个时钟域采用独立的4级移位寄存器,将异步复位条件同步到对应时钟域并展宽脉宽:

always @(posedge log_clk or posedge reset_condition) begin if (reset_condition) log_rst_srl <= 4'b1111; else if (clk_lock) log_rst_srl <= {log_rst_srl[2:0], 1'b0}; end assign log_rst = log_rst_srl[3];

reset_condition = sys_rst || phy_rcvd_link_reset || sys_rst_int

创新价值:

  • 可靠同步:异步复位信号通过移位寄存器同步到目标时钟域,消除了亚稳态风险。
  • 保证最小脉宽:四级寄存器的移出过程确保复位信号至少持续4个时钟周期,满足各模块的复位宽度要求。
  • 时钟锁定保护:仅在clk_lock=1时释放复位,避免在MMCM未锁定时误释放导致逻辑异常。
  • 统一复位源:将所有复位条件(系统复位、链路复位、内部强制复位)合并为一个reset_condition,简化管理。

创新点三:用户可控的force_reinit链路重初始化状态机

设计实现:

rst模块内置了一个有限状态机(FSM),专门处理用户通过force_reinit发起的链路重初始化请求:

状态输出转移条件
IDLEsys_rst_int=0,controlled_force_reinit=0检测到force_reinit=1→ LINKRESET
LINKRESETsys_rst_int=0,controlled_force_reinit=1port_initialized=0→ PHY_RESET1
PHY_RESET1sys_rst_int=1,controlled_force_reinit=0立即 → PHY_RESET2
PHY_RESET2sys_rst_int=1,controlled_force_reinit=0force_reinit=0→ IDLE

创新价值:

  • 应用层可触发复位:用户逻辑无需操作底层GT复位,只需拉高force_reinit即可触发完整的链路重建流程。
  • 自动链路恢复:FSM自动完成“拉低链路 → 复位PHY → 重新初始化”的完整周期,用户无需关心时序细节。
  • 防误触保护:在PHY_RESET2状态时,若force_reinit仍为高,则保持在PHY_RESET2状态,避免反复复位。

创新点四:GT错误指示的OR聚合输出

设计实现:

IP核输出gtrx_disperr_orgtrx_notintable_or作为两个独立的错误指示信号,在SRIO_Channel中直接上推到外部端口:

assign o_gtrx_disperr_or = w_gtrx_disperr_or; assign o_gtrx_notintable_or = w_gtrx_notintable_or;

创新价值:

  • 全局错误指示:这两个OR信号聚合了IP核内部所有通道的错误事件,便于系统级快速判断通信质量。
  • 减少调试信号:省去用户逻辑自行OR组合的步骤,直接使用即可。
  • 与Xilinx IP一致:符合Xilinx SRIO Gen2 IP核的错误报告惯例。