pingping_TEL头像
关注

Aurora_IP核使用教程

Aurora IP 核使用教程

—— 原理详解、参数含义与 Vivado 2017.4 实战(以 Virtex UltraScale+ xcvu9p 为例)

适用平台:Vivado Design Suite 2017.4
目标器件:xcvu9p-flga2104-2l-e(Virtex UltraScale+ VU9P,GTY 收发器)
协议对象:Aurora 8B/10BAurora 64B/66B(重点为 64B/66B)

本教程从"协议是什么 → 怎么工作 → 参数怎么配 → 代码怎么写 → 问题怎么调"五个层次展开,既适合第一次接触 Aurora 的初学者,也适合需要快速上板的工程师查阅。


目录


第 1 章 Aurora 协议概述

1.1 什么是 Aurora

Aurora 是赛灵思(Xilinx,现 AMD)提出的一种可扩展、轻量级的点对点串行链路层协议,用于在两个器件之间通过 FPGA 高速收发器(GTP / GTX / GTH / GTY / GTM)建立一条透明、可靠、高带宽的数据通道。协议本身是开放的,任何 FPGA 厂商都能实现。

Aurora 的核心设计哲学是"把物理层(收发器)封装成一个简单好用的串行管道"——用户不需要关心眼图、均衡、编解码、对齐、时钟补偿这些底层细节,只需向管道里"灌数据"和"取数据"即可。

Aurora 协议规范有两个主要版本:

协议规范编号编码方式主要特征
Aurora 8B/10BSP0028B/10B 编码简单、低速率(0.5~6.6 Gb/s/通道),带 K 字符同步
Aurora 64B/66BSP01164B/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/s0.5 ~ 25.78 Gb/s(GTY)
最大通道数16 条16 条
总吞吐0.4 ~ 84.48 Gb/s0.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(原生)可选
CRC16/32-bit 可选(PDU 帧)32-bit 可选
支持的收发器7 系 GTX/GTH、UltraScale GTH、UltraScale+ GTH、GTPGTX / 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_lockGT 的 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 ControlNFC接收端通过 NFC 消息请求发送端"插入 N 个空闲"或"暂停发送(XOFF)"。用于防止接收端 FIFO 溢出。有 Immediate(可在帧内插空闲)与 Completion(只在帧间插空闲)两种模式(8B/10B)。
User Flow ControlUFC发送一条 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 NameIP 顶层模块名只能含字母数字下划线,非法字符会标红aurora_64b66b_0
GT Type收发器类型UltraScale+ 下可选 GTH / GTYVU9P 只有 GTYGTY
Line Rate (Gbps)串行线速率(未编码的比特率)范围由器件/收发器/速度等级决定。GTY 一般 0.5 ~ 25.78125 Gb/s(具体以界面显示为准)。线速率决定 PLL 倍数与 user_clk10.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 CRC32-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 NameIP 顶层模块名同上
Lane Width收发器/数据位宽2(16 bit)或 4(32 bit)。决定用户接口位宽
Lane Rate线速率0.5 ~ 6.6 Gb/s(8B/10B 上限)。有效数据速率 = 0.8 × 线速率
Laneslane 数1 ~ 16
Starting GT Quad / Starting GT Lane / Column UsedGT 位置同 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 / URAM75.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 工程

  1. 打开 Vivado 2017.4 → Create New Project
  2. 选择工程目录与名称,勾选 RTL Project
  3. Add Constraints 步骤可先跳过;
  4. Default Part 选择 xcvu9p-flga2104-2l-e(可在搜索框输入 xcvu9p 过滤);
  5. 完成后进入工程主界面。

4.3 配置并生成 Aurora 64B/66B IP

IP Catalog 中双击 Aurora 64B/66B,按如下配置:

Core Options → Physical Layer:

参数
Component Nameaurora_64b66b_0
GT TypeGTY
Line Rate (Gbps)10.3125
Column Used按板卡(如 Right
Starting GT Quad按板卡实际接线的 Quad(如 Quad X0Y0
Starting GT Lane按板卡实际接线的 lane(如 X0Y0
Lanes1
GT Refclk Selection按板卡(如 CLK0
GT Refclk Frequency (MHz)156.25

Core Options → Link Layer:

参数
Dataflow ModeDuplex
INIT clk (MHz)100
Flow Control不勾选(示例简化)
CRC不勾选(高速率应用建议关闭)

Shared Logic:

参数
Shared LogicInclude 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 编译与综合流程

  1. Add Sources 加入 aurora_top.vframe_gen.vframe_check.v
  2. Add Constraints 加入 aurora_top.xdc
  3. 依次运行 Synthesis → Implementation → Generate Bitstream
  4. 综合/实现阶段重点检查:
    • 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 上板验证

  1. 下载 bitstream;
  2. 观察 gt_pll_locklane_upchannel_up 依次拉高;
  3. 若板上用光纤/同轴把 TX 回环到 RX,frame_checkerr_cnt 应为 0,frame_cnt 持续增长;
  4. ILA(集成逻辑分析仪)channel_uphard_errsoft_errs_axi_tx_treadym_axi_rx_tvalid 等信号定位问题;
  5. 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_pbpma_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 常用调试技巧

  1. 先用自环:物理回环(TX→RX 短接/光回环)验证单板,再上双板;
  2. 先低速后高速:先把 Line Rate 降到较低值(如 1.25G)验证逻辑,再逐步提速;
  3. 用好 example design:IP 自带完整的 frame_gen/frame_check/ILA/VIO 示例,先在 example design 上跑通,再替换自己的用户逻辑;
  4. 看时序报告:实现后重点看 user_clk 域与 GT 相关路径是否收敛;
  5. IBERT 做体检:上板前用 IBERT 对 GTY 通道做 PRBS 误码与眼图测试,排除物理层问题。

附录 A:参考资料

文档编号内容
Aurora 64B/66B Product GuidePG07464B/66B 核功能、参数、端口、时序、调试
Aurora 8B/10B Product GuidePG0468B/10B 核功能、参数、端口、时序、调试
Aurora 8B/10B Protocol SpecSP0028B/10B 协议规范(帧格式、流控、CC)
Aurora 64B/66B Protocol SpecSP01164B/66B 协议规范(块格式、建链)
UltraScale Architecture GTY Transceivers User GuideUG578GTY 收发器原理与配置
Vivado 使用入门UG910 / UG896工程与 IP 集成
Aurora 8B/10B for GTY App NoteXAPP1331VU9P 等 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 差分对)
Quad4 条 GT lane 及其 common(参考时钟、QPLL)组成的组
QPLL / CPLLQuad PLL / Channel PLL,产生串行时钟
PCS / PMA物理编码子层 / 物理介质接入子层(收发器内部)
Channel Up建链完成状态信号
SCP / ECP8B/10B 帧头 / 帧尾控制字符
CC / CB时钟补偿序列 / 通道绑定序列
NFC / UFC原生流控 / 用户流控
BTF64B/66B 控制块的块类型字段
IBERT收发器眼图与误码测试 IP
ILA / VIOVivado 集成逻辑分析仪 / 虚拟输入输出调试 IP

本文档由公开技术资料整理,用于 Aurora IP 核学习与工程参考。参数与端口以实际 Vivado 2017.4 生成的 IP 为准。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/pingping_TEL/article/details/164340806

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--