FPGA实战(43):Xilinx SRIO Gen2高速串行通信(一)——顶层系统集成与调试架构设计
一、引言
在FPGA高速串行通信设计中,顶层集成模块承担着系统时钟管理、复位分发、调试接口以及多通道协同工作的核心职责。一个好的顶层架构不仅需要保证各子模块稳定运行,还需为调试和验证提供便利。
本系列文章基于XC7Z035平台,采用Xilinx SRIO Gen2 IP核实现双通道高速通信。本文作为系列第一篇,重点剖析顶层模块XC7Z035_TOP的设计思路,涵盖系统时钟生成、可配置复位逻辑、VIO调试控制、双通道SRIO_Engine实例化以及与底层通信模块的衔接。后续文章将深入SRIO_Module与Channel的封装设计,以及IP核、时钟和复位管理的具体实现。
二、顶层整体架构
XC7Z035_TOP是系统的最高层模块,其核心架构如下:
| 功能单元 | 实现模块 | 职责 |
|---|---|---|
| 系统时钟输入 | IBUFDS | 将差分系统时钟转为单端,作为复位逻辑的时钟源 |
| GT参考时钟输入 | IBUFDS_GTE2 | 提供SRIO物理层的高速参考时钟(125MHz/156.25MHz) |
| 复位生成 | rst_gen_module | 产生系统上电复位信号,复位周期可配置 |
| VIO调试控制 | VIO_O1 | 提供软件可控制的复位信号,便于调试 |
| SRIO_Engine(通道0) | SRIO_Engine_u0 | 实现事务发起与响应的自动化状态机 |
| SRIO_Engine(通道1) | SRIO_Engine_u1 | 与通道0完全独立,可并行工作 |
| SRIO_Module | SRIO_Module_u0 | 封装两个物理通道(SRIO_Channel)和共享QPLL |
| SFP控制 | 直接赋值 | 使能SFP光模块 |
顶层信号流如下图所示(文字描述):
- 差分时钟输入→
IBUFDS→w_sys_clk→rst_gen_module→w_sys_rst - GT参考时钟→
IBUFDS_GTE2→w_gtref_clk→SRIO_Module SRIO_Engine_u0通过AXI4-Stream接口与SRIO_Module的通道0相连SRIO_Engine_u1与SRIO_Module的通道1相连VIO输出w_vio_p0_rst_n(低有效)可软件复位- 两个Engine的复位由
log_rst和port_initialized组合产生
三、创新点分析
创新点一:双通道并行独立事务处理架构
设计实现:
顶层模块例化了两个完全独立的SRIO_Engine,分别对应两个物理通道。每个Engine拥有自己独立的时钟域(w_1_log_clk和w_2_log_clk)和复位信号,互不干扰。
SRIO_Engine SRIO_Engine_u0( .i_clk (w_1_log_clk), .i_rst (w_1_log_rst | ~w_1_port_initialized), // ... AXI4-Stream接口 ); SRIO_Engine SRIO_Engine_u1( .i_clk (w_2_log_clk), .i_rst (w_2_log_rst | ~w_2_port_initialized), // ... AXI4-Stream接口 );创新价值:
- 双通道可同时独立运行,互不阻塞,实现真正的并行通信
- 每个通道的复位条件独立,单个通道异常不影响另一通道
- 为未来扩展更多通道提供了清晰的模板
创新点二:VIO(Virtual I/O)软复位集成
设计实现:
在顶层中例化了Xilinx VIO IP核,通过w_vio_p0_rst_n输出低有效复位信号。用户可通过Vivado Hardware Manager在线控制该信号,无需重新编译即可对逻辑进行复位。
VIO_O1 VIO_O1_U0 ( .clk (w_1_log_clk), .probe_out0 (w_vio_p0_rst_n) );创新价值:
- 调试效率提升:传统方式需要按键或外部信号复位,VIO可实现软件触发复位
- 远程调试:配合JTAG,可在不接触硬件的情况下复位指定逻辑
- 灵活组合:可将VIO复位与系统复位逻辑组合,实现分级复位策略
创新点三:Engine复位条件精细化设计
设计实现:
每个Engine的复位信号并非简单的log_rst,而是组合了log_rst和port_initialized:
.i_rst = w_1_log_rst | ~w_1_port_initialized逻辑含义:
- 当SRIO物理层尚未完成初始化(
port_initialized=0)时,Engine保持复位状态 - 当逻辑层复位有效时,Engine被复位
- 只有当两者都无效(
log_rst=0且port_initialized=1)时,Engine才能开始工作
创新价值:
- 安全启动:确保物理链路就绪后再开始事务,避免发送无效报文
- 自动恢复:若链路因故断开(
port_initialized变低),Engine自动复位,链路恢复后自动重启 - 无需用户干预:简化用户逻辑,提高系统可靠性
创新点四:调试信号集中标记策略
设计实现:
顶层中所有关键的AXI4-Stream信号均添加了(* MARK_DEBUG = "TRUE" *)属性:
(* MARK_DEBUG = "TRUE" *) wire s_1_axis_ireq_tvalid; (* MARK_DEBUG = "TRUE" *) wire [63:0] s_1_axis_ireq_tdata; // ... 其他信号创新价值:
- 在Vivado的ILA(Integrated Logic Analyzer)中可直接观测这些内部信号,无需修改底层代码
- 统一在顶层标记,便于集中管理调试信号,避免遗漏
- 当需要缩小调试范围时,可快速注释或取消标记
四、功能点详解
4.1 系统时钟与GT参考时钟输入
系统时钟采用差分LVDS输入,通过IBUFDS转换为单端:
IBUFDS #( .DIFF_TERM ("FALSE"), .IBUF_LOW_PWR ("TRUE"), .IOSTANDARD ("DEFAULT") ) IBUFDS_U0 ( .O (w_sys_clk), .I (i_sys_clk_p), .IB (i_sys_clk_n) );GT参考时钟通过IBUFDS_GTE2专用原语输入:
IBUFDS_GTE2 IBUFDS_GTE2_U0( .O (w_gtref_clk), .I (i_gtref_clk_p), .IB (i_gtref_clk_n), .CEB (1'b0), .ODIV2() );4.2 可配置复位生成模块(rst_gen_module)
rst_gen_module产生系统上电复位信号,复位持续时间通过参数P_RST_CYCLE配置:
rst_gen_module#( .P_RST_CYCLE (50) ) rst_gen_module_u0 ( .i_clk (w_sys_clk), .o_rst (w_sys_rst) );其内部实现如下(参考源码):
- 使用8位计数器
r_cnt计数 - 复位输出
ro_rst在计数未达到指定周期前为1,达到后为0 - 特殊处理
P_RST_CYCLE=0时保持复位状态
功能特点:
- 支持长复位周期,满足各IP核的上电初始化时序要求
- 参数化设计,便于调整
4.3 SFP光模块使能控制
顶层输出o_sfp_diseable直接赋值为2'b00,表示使能两个SFP光模块(低有效):
assign o_sfp_diseable = 2'b00;4.4 通道与Engine的信号连接
顶层中,SRIO_Module与两个SRIO_Engine之间的信号连接遵循AXI4-Stream协议:
- IREQ通道:Engine → Module(发起请求)
- IRESP通道:Module → Engine(接收响应)
- TREQ通道:Module → Engine(接收目标请求)
- TRESP通道:Engine → Module(发送目标响应)
这种标准化的握手协议使得模块间接口清晰,便于跨层调试。
五、设计亮点总结
| 设计特性 | 实现方式 | 工程价值 |
|---|---|---|
| 双通道并行 | 两个独立Engine实例 | 提高吞吐量,支持并行处理 |