FPGA实战(45):Xilinx SRIO Gen2高速串行通信(三)——时钟网络、复位策略与IP核深度解析
一、引言
前两篇文章分别介绍了顶层系统集成(XC7Z035_TOP)和通道封装层(SRIO_Module与SRIO_Channel)。作为系列第三篇,我们将深入SRIO_Channel内部,剖析其三大核心子模块的设计原理与工程实现:
srio_gen2_0_srio_clk:基于MMCM(混合模式时钟管理器)的多时钟域生成,包括log_clk、phy_clk、gt_pcs_clk、gt_clk和drpclk。srio_gen2_0_srio_rst:多时钟域可靠复位同步策略,以及用户可控的force_reinit链路重初始化状态机。srio_gen2_0IP核:SRIO Gen2 IP核的关键接口、HELLO包格式解析与AXI4-Stream握手时序。
这三部分共同构成了SRIO通道的“时钟-复位-协议”基础底座,是理解整个SRIO通信系统稳定运行的核心。
二、整体架构
SRIO_Channel内部结构如下:
三者之间的依赖关系:
srio_clk为IP核和rst模块提供所有时钟及clk_lock指示。srio_rst接收clk_lock和port_initialized,产生各时钟域的同步复位信号(log_rst、phy_rst等),馈送给IP核。- IP核在时钟和复位就绪后开始链路训练,初始化完成后输出
port_initialized。
这种“时钟先稳定 → 复位释放 → IP核初始化”的顺序保证了系统上电的可靠性。
三、创新点分析
创新点一:MMCM多时钟域单参考时钟分频网络
设计实现:
srio_clk模块通过一个MMCM,将输入的GT参考时钟(如156.25MHz)分频产生五个独立时钟域:
| 时钟 | 分频比(以156.25MHz为例) | 典型频率 | 用途 |
|---|---|---|---|
gt_clk | ÷1(直接) | 156.25MHz | GT收发器高速时钟 |
log_clk | ÷3 | 52.083MHz | 逻辑层用户时钟 |
phy_clk | ÷12 | 13.02MHz | 物理层状态机时钟(用于低速控制) |
gt_pcs_clk | ÷6 | 26.04MHz | GT 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发起的链路重初始化请求:
| 状态 | 输出 | 转移条件 |
|---|---|---|
| IDLE | sys_rst_int=0,controlled_force_reinit=0 | 检测到force_reinit=1→ LINKRESET |
| LINKRESET | sys_rst_int=0,controlled_force_reinit=1 | port_initialized=0→ PHY_RESET1 |
| PHY_RESET1 | sys_rst_int=1,controlled_force_reinit=0 | 立即 → PHY_RESET2 |
| PHY_RESET2 | sys_rst_int=1,controlled_force_reinit=0 | force_reinit=0→ IDLE |
创新价值:
- 应用层可触发复位:用户逻辑无需操作底层GT复位,只需拉高
force_reinit即可触发完整的链路重建流程。 - 自动链路恢复:FSM自动完成“拉低链路 → 复位PHY → 重新初始化”的完整周期,用户无需关心时序细节。
- 防误触保护:在PHY_RESET2状态时,若
force_reinit仍为高,则保持在PHY_RESET2状态,避免反复复位。
创新点四:GT错误指示的OR聚合输出
设计实现:
IP核输出gtrx_disperr_or和gtrx_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核的错误报告惯例。