Aurora IP 核使用教程
—— 原理详解、参数含义与 Vivado 2017.4 实战(以 Virtex UltraScale+ xcvu9p 为例)
适用平台:Vivado Design Suite 2017.4
目标器件:xcvu9p-flga2104-2l-e(Virtex UltraScale+ VU9P,GTY 收发器)
协议对象:Aurora 8B/10B 与 Aurora 64B/66B(重点为 64B/66B)本教程从"协议是什么 → 怎么工作 → 参数怎么配 → 代码怎么写 → 问题怎么调"五个层次展开,既适合第一次接触 Aurora 的初学者,也适合需要快速上板的工程师查阅。
目录
- 第 1 章 Aurora 协议概述
- 第 2 章 Aurora 工作原理详解
- 第 3 章 Vivado 2017.4 中 Aurora IP 核配置详解
- 第 4 章 以 xcvu9p 为例的完整工程示例
- 第 5 章 常见问题与调试技巧
- 附录 A:参考资料
- 附录 B:术语表
第 1 章 Aurora 协议概述
1.1 什么是 Aurora
Aurora 是赛灵思(Xilinx,现 AMD)提出的一种可扩展、轻量级的点对点串行链路层协议,用于在两个器件之间通过 FPGA 高速收发器(GTP / GTX / GTH / GTY / GTM)建立一条透明、可靠、高带宽的数据通道。协议本身是开放的,任何 FPGA 厂商都能实现。
Aurora 的核心设计哲学是"把物理层(收发器)封装成一个简单好用的串行管道"——用户不需要关心眼图、均衡、编解码、对齐、时钟补偿这些底层细节,只需向管道里"灌数据"和"取数据"即可。
Aurora 协议规范有两个主要版本:
| 协议 | 规范编号 | 编码方式 | 主要特征 |
|---|---|---|---|
| Aurora 8B/10B | SP002 | 8B/10B 编码 | 简单、低速率(0.5~6.6 Gb/s/通道),带 K 字符同步 |
| Aurora 64B/66B | SP011 | 64B/66B 编码(加扰) | 高速率(0.5~25.78 Gb/s/通道,可聚合到 400 Gb/s 以上),开销仅约 3% |
Xilinx 官方把这两套协议做成了可直接拖拽使用的 LogiCORE IP 核,即 Aurora 8B/10B(产品指南 PG046)与 Aurora 64B/66B(产品指南 PG074)。本教程重点讲解 64B/66B,因为 xcvu9p 只有 GTY 收发器,而标准 Aurora 8B/10B 并不支持 GTY(详见 1.3 节)。
1.2 Aurora 协议分层
Aurora 协议整体可以按 OSI 的思路划分为三层,对应 FPGA 里的三部分:
┌────────────────────────────────────────────────────────────┐
│ 用户层(Application) │
│ 用户的发送逻辑 / 接收逻辑,通过 AXI4-Stream 接口收发数据帧 │
├────────────────────────────────────────────────────────────┤
│ 数据链路层(Aurora 核) │
│ · Lane Logic :单通道初始化、编解码控制字符、错误检测 │
│ · Global Logic :多通道绑定(bonding)、验证、空闲字符生成 │
│ · User I/F :AXI4-Stream 收发接口、流控 │
├────────────────────────────────────────────────────────────┤
│ 物理层(GT 收发器 GTY/GTH/GTX) │
│ · PMA:串行/并行转换、均衡、时钟恢复 │
│ · PCS:编解码(8B/10B 或 64B/66B)、弹性缓冲、通道绑定 │
└────────────────────────────────────────────────────────────┘
- 物理层:即 FPGA 内的高速串行收发器(UltraScale+ 器件为 GTY/GTH)。负责把并行数据串行化后从差分引脚(txp/txn)发出去,并从 rxp/rxn 恢复出时钟和串行数据。
- 数据链路层:即 Aurora IP 核本体。负责建链(channel up)、把用户数据封装成协议数据块、插入控制字符/空闲、做时钟补偿和通道绑定、检测错误、实现流控。
- 用户层:你自己的逻辑。通过 AXI4-Stream 接口与 Aurora 核交互。
一句话总结:Aurora 核 = “协议引擎”,它把你丢进来的用户数据,包装成符合 SP002/SP011 规范的比特流,通过收发器在物理链路上传输;另一端再解包还原给用户。
1.3 Aurora 8B/10B 与 Aurora 64B/66B 对比
| 对比项 | Aurora 8B/10B(PG046) | Aurora 64B/66B(PG074) |
|---|---|---|
| 编码方式 | 8B/10B(每 8 bit 映射为 10 bit) | 64B/66B(每 64 bit 数据加 2 bit 同步头,含加扰) |
| 编码开销 | 20%(有效吞吐 = 0.8 × 线速率) | 约 3%(2/66) |
| 单通道线速率 | 0.5 ~ 6.6 Gb/s | 0.5 ~ 25.78 Gb/s(GTY) |
| 最大通道数 | 16 条 | 16 条 |
| 总吞吐 | 0.4 ~ 84.48 Gb/s | 0.455 ~ 400 Gb/s(16×GTY) |
| 数据位宽 | 2 字节 / 4 字节 | 每通道 64 bit,多通道聚合(64/128/256/512 bit) |
| 用户接口 | AXI4-Stream(Framing / Streaming 可选) | AXI4-Stream |
| 同步机制 | 逗号字符(K28.5 等)对齐 | 2-bit 同步头 + 加扰(无需逗号字符) |
| 流控 | NFC(原生)/ UFC(用户)可选 | NFC(原生)可选 |
| CRC | 16/32-bit 可选(PDU 帧) | 32-bit 可选 |
| 支持的收发器 | 7 系 GTX/GTH、UltraScale GTH、UltraScale+ GTH、GTP | GTX / GTH / GTY / GTM(跨 7 系、UltraScale、UltraScale+、Versal) |
| 适用场景 | 中低速、低成本、简单可靠 | 10G/100G/400G 高速互联、光模块 |
⚠️ 重要提醒(选择核的决策依据):
标准 Aurora 8B/10B 官方不支持 GTY 收发器(只支持 GTX/GTH/GTP)。而 xcvu9p 全器件只有 GTY(无 GTH)。因此在 VU9P 上做高速互联,标准选择是 Aurora 64B/66B。
如果必须在 VU9P 上使用 8B/10B,需要参考应用笔记 XAPP1331(Aurora 8B/10B for GTY)做非标准的收发器定制,工程上不建议优先采用。
1.4 典型应用场景
- 芯片间 / 板卡间高速互联:两片 FPGA 之间、FPGA 与 ASIC 之间通过 PCB 走线或高速背板互连;
- 光纤传输:配合 SFP+/QSFP+/QSFP28 光模块实现 10G/40G/100G 光纤链路(10G 光模块线速率 10.3125 Gb/s,Aurora 64B/66B 可直接对接);
- 数据采集前端:ADC/DAC 与 FPGA 之间的高速数据传输(JESD204B 之外的另一种简单方案);
- 测试测量、雷达信号处理、图像传输、反射内存 等需要"透明大带宽管道"的场景。
第 2 章 Aurora 工作原理详解
2.1 系统架构与模块划分
以 Aurora 64B/66B 双工核为例,其内部结构如下:
Aurora 64B/66B 核内部结构(Duplex)
┌───────────────────────────────────────────────────────────────────┐
│ 用户层(用户逻辑) │
│ ┌───────────────┐ ┌───────────────┐ │
│ │ Frame Gen │ AXI4-Stream TX │ Frame Check │ │
│ │ (发送端) │───────►───────►│ (接收端) │ │
│ └───────────────┘ └───────────────┘ │
├───────────────────────────────────────────────────────────────────┤
│ Aurora 64B/66B 核(数据链路层) │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │
│ │ TX User I/F │ │ Global Logic │ │ RX User I/F │ │
│ │ (AXI4-Stream) │◄─►│ 建链/绑定/ │◄─►│ (AXI4-Stream) │ │
│ │ │ │ 空闲/CRC │ │ │ │
│ └───────┬───────┘ └───────┬───────┘ └───────┬───────┘ │
│ └──────┬────────────┴────────────┬──────┘ │
│ ┌──┴───┐ ┌───┴──┐ │
│ │Lane 0│ │Lane 1│ ... │
│ │Logic │ │Logic │ │
│ └──┬───┘ └───┬──┘ │
├──────────────────┼─────────────────────────┼──────────────────────┤
│ 物理层(GTY 收发器) │ │
│ ┌──────────┐ ┌────┴─────┐ ┌───┴─────┐ │
│ │QPLL/CPLL │ │ GTY CH0 │ │ GTY CH1 │ │
│ └──────────┘ └────┬─────┘ └───┬─────┘ │
└─────────────────────┼─────────────────────┼──────────────────────┘
▼ ▼
txp/txn 差分对 txp/txn 差分对
各模块职责:
| 模块 | 职责 |
|---|---|
| Lane Logic(每通道一个) | 初始化单个收发器通道;处理该通道上 64B/66B 块的同步头检查、数据/控制块识别;检测该通道的软错误;负责单通道对齐(block sync)。 |
| Global Logic | 多通道时的通道绑定(channel bonding)与验证(verification);建链完成后生成协议要求的空闲序列(idle);汇总各通道错误并上报。 |
| TX User Interface | 把用户 AXI4-Stream 数据打包成 64B/66B 数据块/控制块,分摊(stripe)到各通道。 |
| RX User Interface | 把各通道接收到的块按序重组,恢复出 AXI4-Stream 数据流,并完成时钟补偿/通道绑定 FIFO 操作。 |
| GT 收发器 | 完成并串转换、加扰/解扰(64B/66B 由 PCS 完成)、时钟恢复、均衡等。 |
2.2 建链过程(Channel Initialization)
Aurora 最重要的特性之一是上电后自动建链,无需用户干预。建链完成后会输出 channel_up 高电平,之后才能正常收发用户数据。
2.2.1 Aurora 64B/66B 建链流程
64B/66B 建链大致经历以下阶段:
复位
│
▼
① GT 初始化(PMA/PCS reset、PLL 锁定 → gt_pll_lock 拉高)
│
▼
② Lane 初始化(block sync 对齐)
在 RX 侧对每个通道做 64B/66B 块同步(连续识别有效同步头 01/10)
→ 输出 lane_up 置位
│
▼
③ 通道绑定(channel bonding)
在 TX 侧发送绑定序列(bonding sequences),
RX 侧据此对齐多条 lane 的边界,补偿 lane-to-lane 偏差
│
▼
④ 通道验证(channel verification)
交换验证序列确认两端均可正常收发
│
▼
⑤ 建链完成:channel_up 拉高,进入正常数据收发状态
对应的状态监测信号(用户可直接观察):
| 信号 | 含义 |
|---|---|
gt_pll_lock | GT 的 QPLL/CPLL 锁定,收发器时钟就绪 |
lane_up[i] | 第 i 条 lane 初始化完成 |
channel_up | 整条链路建链完成,可以收发用户数据 |
8B/10B 建链流程类似(对齐→绑定→验证→channel up),但使用的是 8B/10B 逗号字符(comma)做对齐,机制略不同,这里不再展开。
建链完成后,Aurora 核会自动维护链路:一旦检测到需要重同步的严重错误,会自动复位并重新建链(hard error 触发自动重初始化)。
2.2.2 空闲与背靠背
- 链路空闲时(无用户数据),TX 侧发送空闲序列(idle),保持通道始终有信号,方便对端做时钟恢复与对齐监测;
- 用户数据可以**背靠背(back-to-back)**连续发送,中间没有强制间隔。
2.3 数据编码与帧格式
2.3.1 Aurora 64B/66B 块格式
64B/66B 编码把数据组织成 66-bit 块(block),由 2-bit 同步头 + 64-bit 负载组成:
| 同步头 | 块类型 | 负载内容 |
|---|---|---|
01 | 数据块(data block) | 64 bit 用户数据(8 字节),经过扰码 |
10 | 控制块(control block) | 8-bit 块类型字段(BTF)+ 控制信息 |
控制块有若干类型,其中最关键的两类:
- CB(Clock Compensation):时钟补偿序列,用于吸收收发两端参考时钟的微小频率差;
- CC(Channel Bonding 序列 / 绑定):建链阶段的对齐序列。
数据块加扰(scramble)的目的是保证串行流中有足够的翻转,便于接收端时钟恢复;同时因为"无逗号字符",64B/66B 依赖 2-bit 同步头做块同步。
64B/66B 的编码开销只有 2/66 ≈ 3.03%,这是它相比 8B/10B(20%)能大幅提升有效带宽的根本原因。
2.3.2 Aurora 8B/10B 帧格式
8B/10B 编码把每 8 bit 数据映射为 10 bit 线符号,其中一部分符号被保留为控制字符(K 码),用来表示帧边界与特殊用途:
- SCP(Start Control Packet,帧头):
/K28.5/K28.2/,表示帧开始; - ECP(End Control Packet,帧尾):
/K28.5/K28.1/,表示帧结束; - CC(Clock Compensation):时钟补偿序列;
- Idle:随机空闲字符。
8B/10B 帧开销:
- 偶数长度帧:4 字节开销(2 字节 SCP + 2 字节 ECP);
- 奇数长度帧:5 字节开销(多 1 字节填充 pad);
- 时钟补偿序列每通道每 10000 字节插入 12 字节,约占带宽 0.12%。
2.3.3 Framing(帧式)与 Streaming(流式)接口
两种用户接口模式(8B/10B 核可选,64B/66B 核为 AXI4-Stream 帧式为主):
| 模式 | 说明 | 特点 |
|---|---|---|
| Framing(帧式) | 用户数据以"帧"为单位传输,每帧用 tlast 标记结束、tkeep 标记末拍有效字节数 | 支持任意长度帧、可随时暂停;适合结构化数据 |
| Streaming(流式) | 数据连续流动,无帧边界,无需 tlast/tkeep | 实现简单、资源更省;适合纯字节流 |
以 AXI4-Stream 帧式为例:发送时用户拉高
s_axi_tx_tvalid并在最后一拍拉高s_axi_tx_tlast,同时用s_axi_tx_tkeep指明最后一拍有几个有效字节;接收端会收到对应的m_axi_rx_tlast/m_axi_rx_tkeep。
2.4 时钟补偿(Clock Compensation)
为什么需要时钟补偿?
Aurora 是异步链路,两端各自使用独立的参考时钟(即使标称相同,实际频率也存在漂移,规范要求两端参考时钟差在 ±100 ppm 以内)。收发器的 TX 时钟由本端 PLL 产生,RX 时钟从串行数据中恢复。当两端频率不完全一致时,接收端弹性缓冲会慢慢累积/消耗数据,若不做处理会最终上溢/下溢。
解决方案:接收端周期性插入/删除时钟补偿(CC)序列。Aurora 核内置标准 CC 模块,周期性在数据流中插入 CC 字符(8B/10B)或 CB 块(64B/66B),对端据此调整弹性缓冲水位,从而吸收频率差。
若两端频率差超过 ±100 ppm,RX 弹性缓冲可能溢出,产生
hard_err(见 2.7 节)。这也是"两端必须用高精度参考时钟"的原因。
2.5 通道绑定(Channel Bonding)
多通道(多 lane)Aurora 链路把数据按字节分摊到多条 lane 上传输。由于 PCB 走线长度差异、收发器路径差异,各 lane 到达对端的时刻不同(lane-to-lane skew)。通道绑定的作用就是在建链阶段通过交换绑定序列,让接收端把所有 lane 对齐到同一个逻辑边界,从而正确重组数据。
- 绑定完成后,所有
lane_up置位,channel_up拉高; - 规范要求绑定后的 lane 之间偏差在特定范围内;
- 设计时建议选物理相邻的连续 lane,并保证参考时钟同源,以降低绑定难度和保证时序收敛。
2.6 流控(Flow Control)
Aurora 提供两种可选流控,用于接收端调节发送端的发送节奏:
| 流控类型 | 缩写 | 说明 |
|---|---|---|
| Native Flow Control | NFC | 接收端通过 NFC 消息请求发送端"插入 N 个空闲"或"暂停发送(XOFF)"。用于防止接收端 FIFO 溢出。有 Immediate(可在帧内插空闲)与 Completion(只在帧间插空闲)两种模式(8B/10B)。 |
| User Flow Control | UFC | 发送一条 2~16 字节的高优先级短消息,可插入到普通数据流中(不打断当前帧)。常用于紧急控制指令。 |
- 64B/66B 核:支持 NFC(可选,GUI 中勾选 Flow Control);
- 8B/10B 核:支持 NFC + UFC,GUI 中可组合选择(None / UFC / NFC / 两者)。
若不需要流控,配置为 None 即可,接口更简单。注意: 如果使能了流控但用户没有正确使用,可能导致
s_axi_tx_tvalid一直拉不高(通道被流控消息占用),这是常见"上板不发送数据"的坑之一。
2.7 错误检测与处理
Aurora 核输出两类错误信号(均为 user_clk 域):
| 信号 | 触发条件 | 处理方式 |
|---|---|---|
soft_err | · 64B/66B 同步头无效(既不是 01 也不是 10) · 控制块的 BTF(块类型字段)无法识别 | 单次软错误只报脉冲,不触发复位;但如果短时间内软错误过多,块同步状态机可能触发重新对齐 |
hard_err | · TX 数据弹性缓冲上溢/下溢(本端 user_clk 与参考时钟不同频) · RX 时钟补偿/通道绑定 FIFO 上溢/下溢(两端频率差超 ±100 ppm) · 严重硬件错误(缓冲溢出、失锁等) | 触发核自动复位并重新建链,链路恢复后自动回到 channel up |
调试要点:
- 偶发
soft_err通常与信号质量(噪声、眼图)或线缆/连接器接触不良有关; hard_err出现说明链路曾严重失步,需要检查时钟配置是否正确、两端参考时钟是否同频同源、链路是否插好;- 在用户逻辑里把
hard_err/soft_err拉出来接 LED 或 ILA 观测,是快速定位问题的基本手段。
2.8 用户接口(AXI4-Stream)与时序
以 Aurora 64B/66B 单通道(64-bit 数据)帧式接口为例,核心信号如下:
发送侧(用户 → 核)
| 信号 | 方向 | 说明 |
|---|---|---|
s_axi_tx_tdata[63:0] | 输出(用户)/输入(核) | 待发送数据 |
s_axi_tx_tvalid | 输出 | 数据有效,拉高表示请求发送一拍 |
s_axi_tx_tready | 输入 | 核准备好接收,tvalid & tready 即完成一拍传输 |
s_axi_tx_tlast | 输出 | 帧最后一拍拉高 |
s_axi_tx_tkeep[7:0] | 输出 | 末拍有效字节数(只在 tlast 时有效) |
接收侧(核 → 用户)
| 信号 | 方向 | 说明 |
|---|---|---|
m_axi_rx_tdata[63:0] | 输入 | 收到的数据 |
m_axi_rx_tvalid | 输入 | 数据有效 |
m_axi_rx_tlast | 输入 | 帧结束 |
m_axi_rx_tkeep[7:0] | 输入 | 末拍有效字节数 |
握手时序(发送):
user_clk __/‾‾\__/‾‾\__/‾‾\__/‾‾\__/‾‾\__/‾‾\__/‾‾\__
s_axi_tx_tvalid ____/‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾\_______
s_axi_tx_tready ‾‾‾‾‾‾/‾‾‾‾‾‾‾‾\____/‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
└─拍1─┘ └─────拍2(被阻塞)─────┘
- 只有
tvalid && tready同时为高的时钟沿,数据才被真正接收; - 用户可以通过拉低
tvalid在数据流中插入空闲(暂停)。
第 3 章 Vivado 2017.4 中 Aurora IP 核配置详解
3.1 IP 核的位置与版本
在 Vivado 2017.4 中,打开工程后:
IP Catalog(左侧 IP 目录,或 Flow Navigator → IP Catalog)
→ Communication & Networking
→ Serial Interfaces
→ Aurora 8B/10B (PG046,v11.x)
→ Aurora 64B/66B (PG074,v11.x)
双击 IP 名称即可打开 Customize IP 配置界面。左侧是当前配置的核结构框图,右侧是参数面板。
版本说明:Vivado 2017.4 对应的 Aurora 8B/10B 与 Aurora 64B/66B 均为 v11.x 系列。不同版本之间 GUI 组织可能略有差异,但参数含义与本文一致。
3.2 Aurora 64B/66B 配置参数详解(Core Options)
以 UltraScale+(VU9P)为例,参数通常组织在 Core Options(物理层 / 链路层)与 Shared Logic 两个区域。
3.2.1 物理层(Physical Layer)参数
| 参数 | 含义 | 取值/说明 | 本教程示例值 |
|---|---|---|---|
| Component Name | IP 顶层模块名 | 只能含字母数字下划线,非法字符会标红 | aurora_64b66b_0 |
| GT Type | 收发器类型 | UltraScale+ 下可选 GTH / GTY。VU9P 只有 GTY | GTY |
| Line Rate (Gbps) | 串行线速率(未编码的比特率) | 范围由器件/收发器/速度等级决定。GTY 一般 0.5 ~ 25.78125 Gb/s(具体以界面显示为准)。线速率决定 PLL 倍数与 user_clk | 10.3125 |
| Column Used | 使用的 GT 列 | Left / Right,与器件封装中 GT 所在列对应 | 依板卡而定 |
| Starting GT Quad | 起始 GT Quad(4 条 lane 一组) | 从哪个 Quad 开始分配 lane,如 Quad X0Y0 | 依板卡而定 |
| Starting GT Lane | 起始 lane | 在所选 Quad 内的起始 lane,如 X0Y0 | 依板卡而定 |
| Lanes | 使用的 lane 数 | 1/2/4/8/16(受器件约束) | 1 |
| GT Refclk Selection | 参考时钟来源 | 选择 Quad 的 CLK0 / CLK1 等。参考时钟必须与线速率匹配 | CLK0 |
| GT Refclk Frequency (MHz) | 参考时钟频率 | 根据线速率在下拉框中选择。经验公式:线速率 = 参考频率 × 66(64B/66B) | 156.25 |
线速率与参考时钟的对应关系(64B/66B):
常用组合——
- 6.6 Gb/s ↔ 100 MHz
- 10.3125 Gb/s ↔ 156.25 MHz(对接 10G 光模块最常用)
- 25.78125 Gb/s ↔ 156.25 MHz(100G QSFP28 常用,4×25.78)
界面会在你输入线速率后,自动列出可选/推荐的参考时钟频率。
3.2.2 链路层(Link Layer)参数
| 参数 | 含义 | 说明 |
|---|---|---|
| Dataflow Mode | 数据流方向 | Duplex(双工)/ TX-only Simplex(仅发)/ RX-only Simplex(仅收)/ TX/RX Simplex。双工两端都要配成 Duplex;单工一端配 TX-only、另一端配 RX-only |
| INIT clk (MHz) | 初始化时钟频率 | 用于收发器初始化和复位去抖。推荐 50~200 MHz。UltraScale+ 默认约 line_rate×1000/64(如 10.3125G → 约 161.13 MHz),工程上常手动设成 100 MHz |
| Flow Control | 原生流控 | 勾选启用 NFC。若不需要则关闭(接口更简单) |
| Use CRC | 32-bit CRC | 为用户数据附加 CRC 检错。注意: 使能 CRC 后线速率上限会显著下降(PG 建议较默认降低约 50%),高线速率应用一般不开 |
| Little Endian | 字节序 | 控制 AXI4-Stream 接口的字节序(大端/小端),与对端必须一致 |
3.2.3 Shared Logic(共享逻辑)
该参数决定 GT common(参考时钟缓冲 BUFG_GT、QPLL/CPLL 等) 由谁例化:
| 选项 | 含义 | 适用场景 |
|---|---|---|
| None | 每个 Aurora 核内部各自包含 GT common | 单核使用;最省事 |
| Include Shared Logic in Core | 在核内共享 GT common | 单核、但想自己控制 common;或多个核手动共享 |
| Include Shared Logic in Example Design | 由 example design 例化 GT common | 推荐:多核/多通道共享同一 QPLL 和参考时钟,节省资源、保证同源 |
工程中若使用多个 Aurora 核或核之间共享参考时钟,务必选择后两种共享方式,否则会资源浪费甚至出现时钟/GT 冲突。
3.2.4 输出时钟与复位
生成核后,关键输出时钟/复位:
| 端口 | 说明 |
|---|---|
user_clk | 用户时钟,所有用户逻辑都跑在这个时钟域。64B/66B 单通道:user_clk = 线速率 / 66。例:10.3125 Gb/s → 156.25 MHz |
user_reset | 用户时钟域复位(高有效),建链失败/复位时拉高 |
init_clk_in | 输入初始化时钟(对应 GUI 的 INIT clk) |
gt_refclk1_p/n | 参考时钟差分输入(名称在不同版本可能为 gt_refclk_p/n,以生成的 example design 为准) |
user_clk 计算公式:
- 单通道(64-bit 数据):
user_clk = line_rate / 66- N 通道(64×N bit 数据):
user_clk = line_rate / 66(数据位宽随通道数翻倍,频率不变)例如 10.3125 Gb/s:10.3125×10⁹ / 66 = 156.25 MHz。
3.3 Aurora 8B/10B 配置参数详解
虽然 VU9P 上不推荐 8B/10B,但很多中低速工程(K7、Zynq、UltraScale GTH 等)仍在使用,这里一并给出参数含义:
| 参数 | 含义 | 说明 |
|---|---|---|
| Component Name | IP 顶层模块名 | 同上 |
| Lane Width | 收发器/数据位宽 | 2(16 bit)或 4(32 bit)。决定用户接口位宽 |
| Lane Rate | 线速率 | 0.5 ~ 6.6 Gb/s(8B/10B 上限)。有效数据速率 = 0.8 × 线速率 |
| Lanes | lane 数 | 1 ~ 16 |
| Starting GT Quad / Starting GT Lane / Column Used | GT 位置 | 同 64B/66B |
| GT Refclk Selection / Frequency | 参考时钟 | 与线速率匹配 |
| Dataflow Mode | 数据流方向 | Duplex / TX-only Simplex / RX-only Simplex |
| Interface | 用户接口类型 | Framing(帧式,带 tlast/tkeep)或 Streaming(流式) |
| Flow Control | 流控类型 | None / UFC / NFC (Immediate) / NFC (Completion) / 组合 |
| Back Channel | 单工模式下的回传通道 | 仅单工需要:Sidebands(用边带信号)或 Timer(用定时器),双工不出现 |
| Scrambler | 加扰器 | 可选 16-bit 加扰,降低频谱峰值 |
| CRC | 检错 | 16-bit / 32-bit 可选(PDU 帧) |
8B/10B 线速率与数据速率换算:8B/10B 编码开销 20%,所以用户数据速率 = 0.8 × 线速率。例如 6.6 Gb/s 线速率,有效数据约为 5.28 Gb/s。
3.4 参数速查表(配置前先想清楚这 8 件事)
| # | 问题 | 决定哪个参数 |
|---|---|---|
| 1 | 用什么收发器? | GT Type(VU9P → GTY) |
| 2 | 要多快? | Line Rate |
| 3 | 板上参考时钟是多少 MHz? | GT Refclk Frequency(必须与线速率匹配) |
| 4 | 几个通道? | Lanes |
| 5 | 是双向还是单向? | Dataflow Mode |
| 6 | 传帧还是传流? | Interface(8B/10B) |
| 7 | 要不要流控/CRC? | Flow Control / CRC |
| 8 | 用哪个物理位置、时钟从哪进? | Column/Quad/Lane/Refclk Selection |
第 4 章 以 xcvu9p 为例的完整工程示例
4.1 xcvu9p 器件与板卡
| 项目 | 说明 |
|---|---|
| 器件 | xcvu9p-flga2104-2l-e(Virtex UltraScale+ VU9P,FLGA2104 封装,-2L 速度等级) |
| 逻辑单元 | 约 2586K |
| BRAM / URAM | 75.9 Mb / 270 Mb |
| 高速收发器 | 120 个 GTY,单通道最高 32.75 Gb/s |
| 常见板卡 | AMD VCU118 评估板(XCVU9P-L2FLGA2104E)等 |
以 VCU118 为例:板上 SMA 参考时钟、QSFP28 光口、FMC 等都可作为 Aurora 通道载体。本教程示例按"单 lane、10.3125 Gb/s、156.25 MHz 参考时钟"配置,对接一个 10G 光模块(SFP+/QSFP+)即可完成自环或双板互联测试。
4.2 创建 Vivado 工程
- 打开 Vivado 2017.4 →
Create New Project; - 选择工程目录与名称,勾选
RTL Project; - 在
Add Constraints步骤可先跳过; - 在 Default Part 选择
xcvu9p-flga2104-2l-e(可在搜索框输入 xcvu9p 过滤); - 完成后进入工程主界面。
4.3 配置并生成 Aurora 64B/66B IP
在 IP Catalog 中双击 Aurora 64B/66B,按如下配置:
Core Options → Physical Layer:
| 参数 | 值 |
|---|---|
| Component Name | aurora_64b66b_0 |
| GT Type | GTY |
| Line Rate (Gbps) | 10.3125 |
| Column Used | 按板卡(如 Right) |
| Starting GT Quad | 按板卡实际接线的 Quad(如 Quad X0Y0) |
| Starting GT Lane | 按板卡实际接线的 lane(如 X0Y0) |
| Lanes | 1 |
| GT Refclk Selection | 按板卡(如 CLK0) |
| GT Refclk Frequency (MHz) | 156.25 |
Core Options → Link Layer:
| 参数 | 值 |
|---|---|
| Dataflow Mode | Duplex |
| INIT clk (MHz) | 100 |
| Flow Control | 不勾选(示例简化) |
| CRC | 不勾选(高速率应用建议关闭) |
Shared Logic:
| 参数 | 值 |
|---|---|
| Shared Logic | Include Shared Logic in Example Design(单核也可选 None,示例用此便于观察) |
生成后建议先在 Sources → IP Sources → Instantiation Template 里查看
aurora_64b66b_0.veo(例化模板),端口名以此为准。
4.4 顶层设计代码(Verilog)
下面是一个完整可综合的顶层示例:Aurora 核 + 帧生成器(TX)+ 帧检测器(RX)。数据经 TX 发出后,若板上把 TX 与 RX 用光纤/同轴回环相连,RX 即可收到自己的数据用于验证。
`timescale 1ns/1ps
//====================================================================
// aurora_top.v —— Aurora 64B/66B 顶层示例(xcvu9p, 1-lane, 10.3125G)
// 数据通路:frame_gen → aurora核 → (物理链路回环) → aurora核 → frame_check
//====================================================================
module aurora_top (
input wire sys_rst_n, // 系统复位,低有效
input wire init_clk, // 初始化时钟,100 MHz
input wire gt_refclk_p, // GT 参考时钟差分 P,156.25 MHz
input wire gt_refclk_n, // GT 参考时钟差分 N
input wire rxp, // 高速接收 P
input wire rxn, // 高速接收 N
output wire txp, // 高速发送 P
output wire txn, // 高速发送 N
// ---- 状态观测输出(可接 LED / ILA)----
output wire user_clk, // 用户时钟(10.3125/66 ≈ 156.25 MHz)
output wire channel_up, // 建链指示
output wire [0:0] lane_up, // lane 状态
output wire hard_err, // 硬错误
output wire soft_err, // 软错误
output wire gt_pll_lock // PLL 锁定
);
//------------ 内部信号 -------------
wire user_reset; // 核输出的用户时钟域复位(高有效)
wire user_rst_n; // 取反后用于用户逻辑
wire [63:0] s_axi_tx_tdata;
wire s_axi_tx_tvalid;
wire s_axi_tx_tready;
wire s_axi_tx_tlast;
wire [7:0] s_axi_tx_tkeep;
wire [63:0] m_axi_rx_tdata;
wire m_axi_rx_tvalid;
wire m_axi_rx_tlast;
wire [7:0] m_axi_rx_tkeep;
assign user_rst_n = ~user_reset;
//------------ Aurora 64B/66B 核例化 -------------
aurora_64b66b_0 u_aurora_64b66b (
// 用户发送接口
.s_axi_tx_tdata (s_axi_tx_tdata),
.s_axi_tx_tvalid (s_axi_tx_tvalid),
.s_axi_tx_tready (s_axi_tx_tready),
.s_axi_tx_tlast (s_axi_tx_tlast),
.s_axi_tx_tkeep (s_axi_tx_tkeep),
// 用户接收接口
.m_axi_rx_tdata (m_axi_rx_tdata),
.m_axi_rx_tvalid (m_axi_rx_tvalid),
.m_axi_rx_tlast (m_axi_rx_tlast),
.m_axi_rx_tkeep (m_axi_rx_tkeep),
// 时钟与复位
.user_clk (user_clk),
.user_reset (user_reset),
.user_clk_active (),
.gt_refclk1_p (gt_refclk_p),
.gt_refclk1_n (gt_refclk_n),
.init_clk_in (init_clk),
.reset_pb (~sys_rst_n), // 核输入复位为高有效
.power_down (1'b0),
.loopback (3'b000), // 0=正常模式(非回环)
// 高速串行
.txp (txp),
.txn (txn),
.rxp (rxp),
.rxn (rxn),
// 状态
.channel_up (channel_up),
.lane_up (lane_up),
.hard_err (hard_err),
.soft_err (soft_err),
.gt_pll_lock (gt_pll_lock)
);
//------------ 发送帧生成器(AXI4-Stream Master)------------
frame_gen #(.DATA_WIDTH(64)) u_frame_gen (
.user_clk (user_clk),
.user_rst_n (user_rst_n),
.channel_up (channel_up),
.s_axi_tx_tdata (s_axi_tx_tdata),
.s_axi_tx_tvalid (s_axi_tx_tvalid),
.s_axi_tx_tready (s_axi_tx_tready),
.s_axi_tx_tlast (s_axi_tx_tlast),
.s_axi_tx_tkeep (s_axi_tx_tkeep)
);
//------------ 接收帧检测器(AXI4-Stream Slave)------------
frame_check #(.DATA_WIDTH(64)) u_frame_check (
.user_clk (user_clk),
.user_rst_n (user_rst_n),
.channel_up (channel_up),
.m_axi_rx_tdata (m_axi_rx_tdata),
.m_axi_rx_tvalid (m_axi_rx_tvalid),
.m_axi_rx_tlast (m_axi_rx_tlast),
.m_axi_rx_tkeep (m_axi_rx_tkeep),
.err_cnt (),
.frame_err ()
);
endmodule
帧生成器 frame_gen.v:循环发送"每帧 4 拍(32 字节)、内容为计数"的帧,帧间插入一拍空闲便于观察。
`timescale 1ns/1ps
//====================================================================
// frame_gen.v —— 简易 AXI4-Stream 帧生成器(发送端)
// 每帧 4 拍 × 8 字节 = 32 字节;帧间插入 1 拍空闲
//====================================================================
module frame_gen #(
parameter integer DATA_WIDTH = 64
)(
input wire user_clk,
input wire user_rst_n, // 低有效
input wire channel_up,
output reg [DATA_WIDTH-1:0] s_axi_tx_tdata,
output reg s_axi_tx_tvalid,
input wire s_axi_tx_tready,
output reg s_axi_tx_tlast,
output reg [DATA_WIDTH/8-1:0] s_axi_tx_tkeep
);
localparam integer BEAT_NUM = 4; // 每帧拍数
reg [$clog2(BEAT_NUM)-1:0] beat_cnt;
reg [31:0] frame_cnt;
always @(posedge user_clk) begin
if (!user_rst_n || !channel_up) begin
beat_cnt <= 0;
frame_cnt <= 32'd0;
s_axi_tx_tvalid <= 1'b0;
s_axi_tx_tlast <= 1'b0;
s_axi_tx_tdata <= {DATA_WIDTH{1'b0}};
s_axi_tx_tkeep <= {DATA_WIDTH/8{1'b1}};
end else if (s_axi_tx_tvalid && s_axi_tx_tready) begin
// 一拍被接收:推进计数
if (beat_cnt == BEAT_NUM - 1) begin
beat_cnt <= 0;
frame_cnt <= frame_cnt + 32'd1;
s_axi_tx_tvalid <= 1'b0; // 帧间插一拍空闲
s_axi_tx_tlast <= 1'b0;
end else begin
beat_cnt <= beat_cnt + 1'b1;
s_axi_tx_tvalid <= 1'b1;
s_axi_tx_tdata <= {frame_cnt, beat_cnt, 16'd0, 8'h5A};
s_axi_tx_tlast <= (beat_cnt == BEAT_NUM - 2);
end
end else if (!s_axi_tx_tvalid) begin
// 空闲结束,启动下一帧
s_axi_tx_tvalid <= 1'b1;
s_axi_tx_tdata <= {frame_cnt, beat_cnt, 16'd0, 8'h5A};
s_axi_tx_tlast <= (beat_cnt == BEAT_NUM - 1);
end
end
endmodule
说明:
tlast需在帧的最后一拍拉高;本生成器固定 4 拍/帧,beat_cnt从 0 计到 3,最后一拍(beat_cnt=3)tlast 拉高。
接收帧检测器 frame_check.v:统计接收到的帧数,并对数据做简单校验,出错则 frame_err 拉高、err_cnt 累加。
`timescale 1ns/1ps
//====================================================================
// frame_check.v —— 简易 AXI4-Stream 帧检测器(接收端)
// 统计帧数,并按发送端格式校验数据;不匹配则计数错误
//====================================================================
module frame_check #(
parameter integer DATA_WIDTH = 64
)(
input wire user_clk,
input wire user_rst_n, // 低有效
input wire channel_up,
input wire [DATA_WIDTH-1:0] m_axi_rx_tdata,
input wire m_axi_rx_tvalid,
input wire m_axi_rx_tlast,
input wire [DATA_WIDTH/8-1:0] m_axi_rx_tkeep,
output reg [31:0] frame_cnt, // 已收帧数
output reg [31:0] err_cnt, // 错误计数
output reg frame_err // 检出错误
);
localparam integer BEAT_NUM = 4;
reg [$clog2(BEAT_NUM)-1:0] beat_cnt;
always @(posedge user_clk) begin
if (!user_rst_n || !channel_up) begin
beat_cnt <= 0;
frame_cnt <= 32'd0;
err_cnt <= 32'd0;
frame_err <= 1'b0;
end else if (m_axi_rx_tvalid) begin
// 校验当前拍数据是否与发送端格式一致
if (m_axi_rx_tdata[7:0] != 8'h5A) begin
frame_err <= 1'b1;
err_cnt <= err_cnt + 32'd1;
end
// 帧边界处理
if (m_axi_rx_tlast) begin
if (beat_cnt != BEAT_NUM - 1) begin
frame_err <= 1'b1; // 帧长不对
err_cnt <= err_cnt + 32'd1;
end
frame_cnt <= frame_cnt + 32'd1;
beat_cnt <= 0;
end else begin
beat_cnt <= beat_cnt + 1'b1;
end
end
end
endmodule
4.5 约束文件(XDC)
约束的核心是给时钟和串行引脚做约束。GT 的位置(LOC)约束由 IP 根据 Starting GT Quad/Lane 自动生成,无需手写。
#====================================================================
# aurora_top.xdc
#====================================================================
# 1) 初始化时钟 100 MHz(板上时钟源,示例为单端)
create_clock -name init_clk -period 10.000 [get_ports init_clk]
# 2) GT 参考时钟 156.25 MHz(差分)
create_clock -name gt_refclk -period 6.400 [get_ports gt_refclk_p]
# 3) user_clk 由 Aurora 核内部输出,IP 已在 OOC 约束中处理,一般无需在此约束。
# 若需在顶层约束,可写:
# create_clock -name user_clk -period 6.400 [get_pins u_aurora_64b66b/user_clk]
# 4) 差分串行引脚(包络/引脚按板卡原理图填写,示例占位)
set_property PACKAGE_PIN <TX_P_PIN> [get_ports txp]
set_property PACKAGE_PIN <TX_N_PIN> [get_ports txn]
set_property PACKAGE_PIN <RX_P_PIN> [get_ports rxp]
set_property PACKAGE_PIN <RX_N_PIN> [get_ports rxn]
set_property IOSTANDARD LVDS [get_ports txp]
set_property IOSTANDARD LVDS [get_ports txn]
set_property IOSTANDARD LVDS [get_ports rxp]
set_property IOSTANDARD LVDS [get_ports rxn]
⚠️ 重要:串行引脚的具体 package pin / IOSTANDARD 必须以板卡原理图为准(GTY 通常用差分标准,可配内部端接与共模)。
<...>占位处需替换为实际值。
4.6 编译与综合流程
Add Sources加入aurora_top.v、frame_gen.v、frame_check.v;Add Constraints加入aurora_top.xdc;- 依次运行 Synthesis → Implementation → Generate Bitstream;
- 综合/实现阶段重点检查:
- Timing:user_clk、init_clk、gt_refclk 是否正常约束、有无时序违例;
- Resource:GTY 是否按预期占用(VU9P 资源报告会列出使用的 GTY Quad/Lane);
- Warnings:重点关注与时钟、GT 位置相关的 critical warning。
4.7 仿真验证
用 IP 自带的 example design 仿真最快。也可以自己写 TB:
`timescale 1ns/1ps
module tb_aurora_top;
reg init_clk, sys_rst_n;
reg gt_refclk_p, gt_refclk_n;
wire txp, txn, rxp, rxn, channel_up, user_clk, hard_err, soft_err, gt_pll_lock;
wire [0:0] lane_up;
// 时钟:init_clk 100MHz
initial init_clk = 0;
always #5 init_clk = ~init_clk;
// 参考时钟 156.25MHz
initial gt_refclk_p = 0;
always #3.2 gt_refclk_p = ~gt_refclk_p;
assign gt_refclk_n = ~gt_refclk_p;
// 复位
initial begin
sys_rst_n = 0;
#200;
sys_rst_n = 1;
end
// 物理层回环:TX 直接接 RX(仿真验证数据通路)
assign rxp = txp;
assign rxn = txn;
aurora_top dut (
.sys_rst_n (sys_rst_n),
.init_clk (init_clk),
.gt_refclk_p (gt_refclk_p),
.gt_refclk_n (gt_refclk_n),
.rxp (rxp),
.rxn (rxn),
.txp (txp),
.txn (txn),
.user_clk (user_clk),
.channel_up (channel_up),
.lane_up (lane_up),
.hard_err (hard_err),
.soft_err (soft_err),
.gt_pll_lock (gt_pll_lock)
);
// 打印建链状态
always @(posedge user_clk) begin
if (channel_up) $display("CHANNEL UP at %0t", $time);
end
endmodule
仿真中通过
assign rxp = txp; assign rxn = txn;做物理层回环,可以无硬件地验证"发送→建链→接收"整条通路。
4.8 上板验证
- 下载 bitstream;
- 观察
gt_pll_lock→lane_up→channel_up依次拉高; - 若板上用光纤/同轴把 TX 回环到 RX,
frame_check的err_cnt应为 0,frame_cnt持续增长; - 用 ILA(集成逻辑分析仪) 抓
channel_up、hard_err、soft_err、s_axi_tx_tready、m_axi_rx_tvalid等信号定位问题; - 用 IBERT(同系列收发器眼图测试 IP)实测链路眼图和误码率,评估信号质量。
第 5 章 常见问题与调试技巧
5.1 建链失败(channel_up 一直为低)
按优先级排查:
| 现象 | 可能原因 | 对策 |
|---|---|---|
gt_pll_lock 为低 | 参考时钟未接入/频率不对/极性反 | 检查 GT Refclk Selection、频率,用示波器确认参考时钟输入 |
gt_pll_lock 高但 lane_up 低 | 对端未上电/未配置/线缆未接 | 确认对端也配置了相同参数的 Aurora 核并已下载;检查连接 |
lane_up 高但 channel_up 低 | 多通道绑定/验证失败;两端参数不一致 | 核对两端 Line Rate、Lanes、Dataflow Mode 一致;检查绑定时钟 |
| 偶发掉链 | 信号质量差、接触不良 | 检查线缆/光模块/连接器;用 IBERT 测眼图 |
| 复位异常 | 复位信号抖动/未释放 | 检查 reset_pb、pma_init 的接法与去抖 |
5.2 hard_err / soft_err
- soft_err 偶发:多为信号噪声、线缆干扰。建议检查链路物理质量,或降低线速率验证;
- hard_err 频繁:
- 检查两端参考时钟是否同频同源、精度足够(频率差 ≤ ±100 ppm);
- 检查 user_clk 与参考时钟是否满足核的要求;
- 检查电源/地质量(GTY 对电源纹波敏感)。
5.3 数据不通但建链正常
| 现象 | 可能原因 | 对策 |
|---|---|---|
s_axi_tx_tvalid 一直为低 | · 用户逻辑没启动发送 · 使能了流控但没正确操作(NFC/UFC 占用通道) | 检查用户逻辑;若使能流控,确认请求信号处理正确 |
s_axi_tx_tready 一直为低 | 核内部 FIFO 满 / 链路未就绪 | 确认 channel_up;确认 user_clk 频率正确 |
| 收到数据但内容不对 | 字节序(大端/小端)不一致、两端口径不一致 | 两端 Little Endian 配置保持一致;核对数据位宽 |
| 帧边界不对 | Framing/Streaming 模式不一致 | 核对两端 Interface 配置 |
5.4 常用调试技巧
- 先用自环:物理回环(TX→RX 短接/光回环)验证单板,再上双板;
- 先低速后高速:先把 Line Rate 降到较低值(如 1.25G)验证逻辑,再逐步提速;
- 用好 example design:IP 自带完整的 frame_gen/frame_check/ILA/VIO 示例,先在 example design 上跑通,再替换自己的用户逻辑;
- 看时序报告:实现后重点看 user_clk 域与 GT 相关路径是否收敛;
- IBERT 做体检:上板前用 IBERT 对 GTY 通道做 PRBS 误码与眼图测试,排除物理层问题。
附录 A:参考资料
| 文档 | 编号 | 内容 |
|---|---|---|
| Aurora 64B/66B Product Guide | PG074 | 64B/66B 核功能、参数、端口、时序、调试 |
| Aurora 8B/10B Product Guide | PG046 | 8B/10B 核功能、参数、端口、时序、调试 |
| Aurora 8B/10B Protocol Spec | SP002 | 8B/10B 协议规范(帧格式、流控、CC) |
| Aurora 64B/66B Protocol Spec | SP011 | 64B/66B 协议规范(块格式、建链) |
| UltraScale Architecture GTY Transceivers User Guide | UG578 | GTY 收发器原理与配置 |
| Vivado 使用入门 | UG910 / UG896 | 工程与 IP 集成 |
| Aurora 8B/10B for GTY App Note | XAPP1331 | VU9P 等 GTY 器件上用 8B/10B 的参考实现 |
版本提示:PG074/PG046 的最新版面向新版本 Vivado,v11.x(对应 2017.4) 的具体差异请以安装目录下
Vivado/2017.4/data/ip/xilinx/aurora_64b66b_v11_x/doc中的 PDF 为准。
附录 B:术语表
| 术语 | 说明 |
|---|---|
| GT / GTY | 高速串行收发器(Transceiver),UltraScale+ 高端器件为 GTY(32.75 Gb/s) |
| Lane | 一条收发器通道(一对 txp/txn、rxp/rxn 差分对) |
| Quad | 4 条 GT lane 及其 common(参考时钟、QPLL)组成的组 |
| QPLL / CPLL | Quad PLL / Channel PLL,产生串行时钟 |
| PCS / PMA | 物理编码子层 / 物理介质接入子层(收发器内部) |
| Channel Up | 建链完成状态信号 |
| SCP / ECP | 8B/10B 帧头 / 帧尾控制字符 |
| CC / CB | 时钟补偿序列 / 通道绑定序列 |
| NFC / UFC | 原生流控 / 用户流控 |
| BTF | 64B/66B 控制块的块类型字段 |
| IBERT | 收发器眼图与误码测试 IP |
| ILA / VIO | Vivado 集成逻辑分析仪 / 虚拟输入输出调试 IP |
本文档由公开技术资料整理,用于 Aurora IP 核学习与工程参考。参数与端口以实际 Vivado 2017.4 生成的 IP 为准。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/pingping_TEL/article/details/164340806



