基于FPGA实现Aurora协议,概念篇!!!
https://pan.baidu.com/s/1rDsLAXGj8WbX82teSkhuIw?pwd=1234
这份FPGA 系统学习详细资料包是个人花大量时间精心整理的,超多干货全覆盖,从基础到实战一站式搞定,不用再到处薅资料!网盘链接 随时可能失效,提取码 1234,先保存再学习,别等失效拍大腿!🔗链接:https://pan.baidu.com/s/1rDsLAXGj8WbX82teSkhuIw?pwd=1234
————————————————
FPGA实现Aurora协议完整指南
Aurora协议是Xilinx开发的一种轻量级、可扩展的高速串行通信协议,专为FPGA之间的点对点数据传输而设计。本文将极其详细地讲解如何基于FPGA实现Aurora协议,从原理到实战,让你彻底掌握这一关键技术。
一、Aurora协议概述
1.1 什么是Aurora协议?
Aurora是一个用于在点对点串行链路间移动数据的可扩展轻量级链路层协议。它由Xilinx开发,为物理层提供透明接口,让专有协议或业界标准协议能方便地使用FPGA的高速收发器资源。
核心特点:
- 高带宽,仅受限于收发器的数据速率
- 支持1~16个通道绑定,实现更高的总带宽
- 支持全双工和单工通信模式
- 无限帧尺寸,灵活组帧
- 小型逻辑封装,采用标准的AXI4-Stream接口
- 内置流控和热插拔支持
1.2 Aurora的两种编码方式
Aurora协议在Xilinx FPGA上有两种实现方式:
| 特性 | Aurora 8B/10B | Aurora 64B/66B |
|---|---|---|
| 编码效率 | 80%(20%开销) | 约96.97%(3.125%开销) |
| 线速率范围 | 0.5 Gbps ~ 6.6 Gbps | 更高(可达10Gbps+) |
| DC平衡 | 通过编码本身保证 | 通过加扰保证 |
| 适用场景 | 芯片间、板间短距离通信 | 背板、长距离传输 |
Aurora 8B/10B将8bit数据编码成10bit码字传输,尽量平衡数据中"0"和"1"的个数以实现DC平衡,连续的"1"或"0"不超过5位。这种编码方式的效率是80%,意味着线速率3.125Gbps时,有效数据带宽为2.5Gbps。
二、Aurora协议架构深度解析
2.1 分层架构
Aurora协议建立在GT高速收发器之上,可分为两个核心层次:
┌─────────────────────────────────────┐ │ 用户应用层 │ ├─────────────────────────────────────┤ │ Aurora 链路层协议 │ │ (帧封装/解封、流控、初始化) │ ├─────────────────────────────────────┤ │ PCS (物理编码子层) │ │ (8B/10B编解码、通道绑定、对齐) │ ├─────────────────────────────────────┤ │ PMA (物理介质适配层) │ │ (串并转换、时钟恢复、驱动) │ ├─────────────────────────────────────┤ │ GT收发器硬核 │ └─────────────────────────────────────┘PMA层(Physical Media Attachment):
- 串行器/解串器(SerDes):将并行数据转换为高速串行流
- 时钟数据恢复(CDR):从串行数据中提取时钟
- 差分驱动与接收:处理实际电信号
PCS层(Physical Coding Sublayer):
- 8B/10B编解码:保证DC平衡,提供足够边沿密度
- 通道绑定:多通道对齐
- 帧封装:添加帧头(SCP)、帧尾(ECP)和空闲码
2.2 数据发送与接收流程
发送流程(用户数据 → 串行信号):
用户数据 → Padding填充 → 链路层封装 → 8B/10B编码 → 串行化 → 差分输出- Padding填充:数据以2个symbols为基础发送,若数据为奇数个字节,需填充1个字节(通常为0x9C)
- 链路层封装:添加帧头SCP(Start of Channel Protocol,2字节)和帧尾ECP(End of Channel Protocol,2字节)
- 8B/10B编码:8位数据编码为10位码字,保持DC平衡
- 串行化与时钟编码:将并行数据转为串行比特流发送
接收流程(串行信号 → 用户数据):
差分输入 → 解串 → 8B/10B解码 → 链路层剥离 → Padding剥离 → 用户数据三、Aurora IP核的两种数据接口
Aurora IP核提供两种数据传输接口:Framing接口(帧接口)和Streaming接口(流接口)。
3.1 Framing接口(帧接口)
Framing接口保留帧的概念,IP核自动处理帧边界,适合需要明确帧结构的数据传输。
发送端信号:
| 信号 | 方向 | 含义 |
|---|---|---|
s_axi_tx_tdata | 用户→IP | 发送数据 |
s_axi_tx_tvalid | 用户→IP | 数据有效标志 |
s_axi_tx_tready | IP→用户 | IP准备好接收数据 |
s_axi_tx_tlast | 用户→IP | 当前是帧最后一个数据 |
s_axi_tx_tkeep | 用户→IP | 最后一个数据的有效字节指示 |
接收端信号:
| 信号 | 方向 | 含义 |
|---|---|---|
m_axi_rx_tdata | IP→用户 | 接收数据 |
m_axi_rx_tvalid | IP→用户 | 数据有效标志 |
m_axi_rx_tlast | IP→用户 | 当前是帧最后一个数据 |
m_axi_rx_tkeep | IP→用户 | 最后一个数据的有效字节指示 |
Framing接口帧结构:
- 帧开始(SOF):添加2字节SCP码组
- 帧结束(EOF):添加2字节ECP码组
- 数据不可用时插入空闲码组
3.2 Streaming接口(流接口)
Streaming接口去掉了帧的概念,数据像流水一样连续传输,更加简洁高效。
发送端信号:
s_axi_tx_tdata:发送数据s_axi_tx_tvalid:数据有效s_axi_tx_tready:IP准备好
接收端信号:
m_axi_rx_tdata:接收数据m_axi_rx_tvalid:数据有效
使用场景对比:
- Framing接口:适合需要明确帧边界的应用(如网络数据包)
- Streaming接口:适合连续数据流(如视频、采集数据)
四、IP核配置详细步骤
4.1 新建工程与IP核定制
步骤1:创建Vivado工程
打开Vivado,创建新工程,选择对应FPGA型号(如xcvu9p-flga2104-2L-e)或开发板(如VCU118)。
步骤2:添加Aurora IP核
在IP Catalog中搜索"Aurora 8B/10B",双击打开配置界面。
4.2 第一页配置:核心参数
物理层(Physical Layer)配置:
| 参数 | 选项 | 说明 |
|---|---|---|
| Lane Width | 2 bytes / 4 bytes | 链路位宽,4字节可降低用户时钟频率 |
| Line Rate | 0.5~6.25 Gbps | 线速率,根据PCB和连接器能力选择 |
| GT Refclk | 125MHz / 156.25MHz等 | GT收发器参考时钟,与板卡匹配 |
| INIT clk | ≤ Refclk | 初始化时钟,推荐50-100MHz |
| DRP clk | 50MHz | 动态重配置时钟 |
链路层(Link Layer)配置:
| 参数 | 选项 | 说明 |
|---|---|---|
| Dataflow Mode | Duplex / Simplex TX / Simplex RX | 全双工/单工 |
| Interface | Framing / Streaming | 数据接口类型 |
| Flow Control | None / Native / User | 流控模式(Streaming不可选) |
| Scrambler | 可选 | 加扰,减少EMI |
| Little Endian Support | 可选 | 小端模式,建议勾选 |
4.3 第二页配置:GT位置选择
根据FPGA芯片实际布局选择GT Quad和Channel:
- Quad选择:FPGA有多个GT Quad,每个Quad包含4个通道
- Channel选择:在Quad内选择具体通道
- Refclk选择:每个Quad有2路参考时钟输入
4.4 第三页配置:共享逻辑位置
这是影响工程结构的关键选项:
| 选项 | 说明 | 适用场景 |
|---|---|---|
| Include Shared Logic in core | 共享逻辑在IP核内部 | 单核设计,简化操作 |
| Include Shared Logic in example design | 共享逻辑在例程中 | 多核设计,需要精细控制 |
关键理解:同一个Quad下的多个通道必须共用GT Common资源。如果需要在一个Quad中使用多个Aurora通道,必须配置为一个"主核"带多个"从核"。
4.5 生成示例设计
IP核定制完成后,右键点击IP核,选择"Open IP Example Design"。Vivado会自动生成完整的示例工程,包含:
- 数据生成模块(frame_gen)
- 数据检查模块(frame_check)
- Support模块(时钟、复位管理)
- Testbench(回环测试)
五、官方例程深度解析
5.1 例程架构分析
官方例程的层次结构如下:
aurora_8b10b_0_exdes (顶层) ├── support (核心模块) │ ├── clock_module # 时钟生成 │ ├── support_reset_logic # 复位逻辑 │ ├── gt_common_support # GT公共资源 │ └── aurora_8b10b_0 # IP核例化 ├── frame_gen (发送模块) # 生成测试数据 ├── frame_check (接收模块) # 校验接收数据 ├── LL_AXI (总线转换) # LL→AXI └── AXI_LL (总线转换) # AXI→LLTestbench结构:例化两个Aurora模块,形成回环测试:
- 模块A发送 → 模块B接收
- 模块B发送 → 模块A接收
5.2 Support模块解析
Support模块是IP核例化的核心,封装了:
clock_module:处理用户时钟(user_clk)、初始化时钟(init_clk)、GT参考时钟support_reset_logic:管理复位时序,包括PMA初始化复位和软复位gt_common_support:GT Quad公共资源(QPLL等)
5.3 数据生成模块(frame_gen)
frame_gen模块使用LFSR生成伪随机测试数据:
关键逻辑:
// 等待通道初始化完成 if (CHANNEL_UP) begin channel_up_cnt <= channel_up_cnt + 1; if (channel_up_cnt == 5'b11111) dly_data_xfer <= 1'b1; end // LFSR生成伪随机序列 lfsr_data <= {lfsr_data[14:0], lfsr_data[15] ^ lfsr_data[13]};5.4 数据检查模块(frame_check)
frame_check模块接收数据并与本地生成的LFSR序列比较:
// 数据校验 if (rx_data != lfsr_data) begin error_flag <= 1'b1; ERR_COUNT <= ERR_COUNT + 1; end5.5 用户时钟频率计算
用户时钟频率由线速率、编码效率和总线宽度决定:
用户时钟 = 线速率 × 编码效率 / 总线宽度(bits)示例计算(线速率3.125Gbps,4字节宽度):
编码效率 = 80% (8B/10B) 总线宽度 = 4 × 8 = 32 bits 用户时钟 = 3.125Gbps × 0.8 / 32 = 78.125 MHz 时钟周期 = 12.8ns这个计算结果可以在仿真中验证,与实际波形一致。
六、复位序列与时序
6.1 上电复位序列
Aurora IP核需要正确的复位时序才能正常工作:
上电 时钟稳定 ↓ ↓ ┌───┐ ┌───┐ PMA_INIT: ──┘ └─── ┌───┐ RESET_PB: ──┘ └─── ┌───────┐ CHANNEL_UP: ───┘正确操作步骤:
- 上电时,pma_init和reset_pb信号保持高电平
- 等待INIT_CLK和GT_REFCLK稳定
- 将pma_init置为低电平
- 将reset_pb置为低电平
- 等待channel_up和lane_up变为高电平,表示链路建立成功
6.2 复位注意事项
- INIT_CLK在GT复位期间必须保持稳定
- GT_REFCLK在上电期间需稳定,频率偏差应小于±300ppm
- 复位释放顺序:先释放pma_init,再释放reset_pb
七、多核配置与GT主从概念
7.1 问题场景
当一个Quad中有多个通道需要配置为独立的Aurora核时,不能简单地分别配置——因为同一个Quad下的通道必须共用GT Common资源。
7.2 主从核配置
主核(Master)配置:
- Shared Logic选择"Include Shared Logic in core"
- 负责例化GT Common资源
从核(Slave)配置:
- Shared Logic选择"Include Shared Logic in example design"
- 不例化GT Common,直接使用主核提供的时钟资源
连接方式:
主核提供: gt_qpllclk, gt_qpllrefclk, gt_qplllock ↓ ↓ ↓ 从核1 从核2 ... 从核N7.3 配置示例
以ZCU106的FMC接口4路GTH为例,需要配置为1个主核+3个从核:
- 在Vivado中分别创建4个Aurora IP核实例
- 将第一个实例的Shared Logic设为"in core"(主核)
- 其余三个实例设为"in example design"(从核)
- 在顶层手动连接主核输出的QPLL时钟到各从核
八、仿真与调试
8.1 仿真避坑指南
1. 器件选择影响仿真速度
不同FPGA系列的仿真模型差异很大:
- Artix-7 (A7):channel_up可能需要长达1ms才能建立
- Kintex-7 (K7):约50μs建立
- Virtex-7 (V7):约50μs建立
如果仿真时间过长,建议改用K7或V7器件模型测试。
2. 仿真观察要点:
- 确认channel_up信号在合理时间内变高
- 确认user_clk频率符合计算值
- 确认发送数据和接收数据一致
8.2 硬件调试
信号完整性检查:
- 使用示波器测量GT参考时钟频率和抖动
- 检查差分信号眼图是否张开
- 确认电源纹波在可接受范围
状态指示信号:
lane_up:单条Lane初始化完成channel_up:整个通道初始化完成hard_err:硬错误(物理层)soft_err:软错误(编解码错误)
8.3 回环测试
官方例程默认配置为外部回环测试:
- 模块A的TX连接模块B的RX
- 模块B的TX连接模块A的RX
- 验证数据收发一致性
通过ILA观察波形,确认发送数据与接收数据匹配。
九、实际应用案例:Aurora光纤通信
9.1 系统架构
以两个FPGA通过SFP光模块进行光纤通信为例:
FPGA-A FPGA-B ┌──────────────┐ ┌──────────────┐ │ 用户数据源 │ │ 用户数据接收 │ │ ↓ │ │ ↑ │ │ TX FIFO │ │ RX FIFO │ │ ↓ │ │ ↑ │ │ Aurora IP │───光纤───→ │ Aurora IP │ │ (Master) │←───光纤─── │ (Slave) │ └──────────────┘ └──────────────┘9.2 时钟设计要点
- 参考时钟:SFP光模块通常需要125MHz或156.25MHz参考时钟
- 用户时钟:由Aurora IP核的tx_out_clk提供,通过BUFG缓冲后驱动用户逻辑
- 跨时钟域:用户逻辑时钟与系统时钟可能不同,需使用异步FIFO隔离
9.3 延迟评估
实测3.125Gbps Aurora链路的延迟组成:
- TX FIFO:约84ns
- Aurora IP核处理:约424ns
- RX FIFO:约52ns
- 总延迟:约560ns(单程)
十、总结与最佳实践
10.1 配置清单
| 步骤 | 关键操作 | 注意事项 |
|---|---|---|
| 1 | 选择线速率和Lane宽度 | 考虑编码开销(20%) |
| 2 | 配置GT参考时钟 | 必须与板卡匹配 |
| 3 | 选择接口模式 | Streaming更简单,Framing有帧边界 |
| 4 | 决定共享逻辑位置 | 多核必须正确配置主从 |
| 5 | 生成示例设计 | 学习参考 |
| 6 | 添加用户数据源 | 替换frame_gen模块 |
10.2 常见问题排查
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| channel_up不拉高 | 复位时序错误 | 检查pma_init/reset_pb释放顺序 |
| 仿真时间过长 | 器件模型差异 | 换用K7/V7仿真 |
| 误码率高 | 信号完整性差 | 调整GT均衡参数 |
| 多核冲突 | 共享逻辑配置错误 | 设置主从核模式 |
10.3 最佳实践建议
- 始终从官方例程开始:Xilinx提供的例程是最可靠的起点
- 优先使用Streaming接口:除非需要明确的帧边界,否则Streaming更简洁
- 正确设计复位时序:上电后先释放pma_init,再释放reset_pb
- 注意时钟域隔离:用户逻辑与Aurora接口可能在不同时钟域,需使用FIFO
- 多核务必用主从模式:同一个Quad的多个通道必须共享GT Common
Aurora协议作为Xilinx FPGA上的轻量级高速串行通信方案,学习曲线平缓,官方支持完善。掌握了本文的内容,你已经具备了独立实现Aurora通信的能力。如果在实践中遇到问题,建议从官方例程开始调试,逐步添加自定义功能,这是最稳妥的开发路径。
