3、Aurora IP核配置:Vivado中Aurora IP核的生成与参数设置

好,咱们进入正题。这一章我带你亲手把Aurora IP核在Vivado里搭起来。说实话,IP核配置这个环节,看着选项多,其实核心就那么几个。你只要抓住了关键参数,剩下的都是水到渠成的事。

3.1 打开IP Catalog,找到Aurora

打开Vivado工程后,左侧Flow Navigator里找到IP Catalog,点进去。在搜索框里输入"Aurora",你会看到两个选项:

  • Aurora 8B/10B —— 这是最常用的,8B/10B编码,适合中低速场景
  • Aurora 64B/66B —— 这是高速版本,编码效率更高,但逻辑资源也更多

我个人习惯,如果线速率在6.6Gbps以下,优先选8B/10B。超过这个速率,比如10Gbps以上,那就得上64B/66B了。我在一个项目里试过用8B/10B跑10Gbps,结果眼图惨不忍睹,后来老老实实换了64B/66B才搞定。

小提示: 如果你不确定选哪个,先看你的GTX/GTH/GTY能支持多高速率。8B/10B最高也就6.6Gbps左右,再高就得上64B/66B。

3.2 核心参数配置:Line Rate与GT Refclk

双击Aurora 8B/10B,进入配置界面。第一个要填的就是Line Rate(线速率)。这个值决定了你的SerDes跑多快。

举个例子,你想让Aurora跑在5Gbps,那Line Rate就填5.0。然后系统会自动算出需要的参考时钟频率。这里有个公式:

GT Refclk = Line Rate / (内部串行化因子 × PLL倍频系数)

对于8B/10B:内部串行化因子 = 20(因为10位并行转1位串行,再考虑8B/10B编码)
对于64B/66B:内部串行化因子 = 32或40(取决于具体配置)

嗯,这里要注意,参考时钟不是随便选的。Vivado会给你推荐几个标准频率,比如125MHz、156.25MHz、250MHz。我建议你优先选156.25MHz,因为这个频率在大多数板卡上都有,而且抖动性能不错。

避坑指南: 我曾经在一个项目里选了125MHz的参考时钟,结果发现板子上没有这个频率的晶振,最后不得不用PLL从别的时钟分频出来,搞得时序很紧张。所以,选参考时钟前,一定先看看你的板卡上有什么晶振。

3.3 数据接口模式:Framing还是Streaming?

接下来是数据接口模式。Aurora提供了两种:

模式 特点 适用场景
Framing 带帧头,有用户自定义的帧起始/结束信号 需要分包传输、数据包长度不固定
Streaming 纯数据流,没有帧结构 连续数据流,比如视频、ADC采样数据

怎么选?说白了,如果你传的是以太网包、PCIe TLP这种有头有尾的数据,用Framing。如果你只是想把一堆数据从A点搬到B点,中间不需要分包,用Streaming。

我做过一个高速数据采集项目,ADC采样率是1GSPS,数据连续不断。当时选了Streaming模式,接口简单,延迟也低。后来另一个项目要传自定义协议包,就换成了Framing,因为需要帧起始信号来对齐包边界。

3.4 数据宽度与用户接口

数据宽度决定了你的用户逻辑和Aurora核之间一次能传多少数据。常见选项有:

  • 2字节 —— 适合低速、窄带应用
  • 4字节 —— 最常用,平衡了带宽和资源
  • 8字节 —— 适合高速、宽带应用

这里有个经验:数据宽度越大,用户时钟频率越低。比如线速率5Gbps,选4字节宽度时用户时钟是125MHz,选8字节宽度时用户时钟就降到62.5MHz。你想想看,如果你的后端逻辑跑不了太高频率,那就选宽一点的数据宽度。

核心要点: 用户时钟频率 = (Line Rate × 编码效率) / 数据宽度。8B/10B的编码效率是80%,所以5Gbps线速率下,4字节宽度的用户时钟 = 5G × 0.8 / (4×8) = 125MHz。

3.5 时钟与复位选项

这一页配置的是时钟和复位。我重点说几个容易踩坑的地方:

  • GT Refclk Source:选哪个Quad的参考时钟?这个要和你板卡上的物理连接对应。别选错了,否则GTX/GTH根本锁不住。
  • User Clock Source:用户时钟是从GT恢复时钟来,还是用外部时钟?我建议用GT恢复时钟,因为这样用户逻辑和SerDes是同步的,跨时钟域处理简单很多。
  • Reset Polarity:复位极性,默认是高有效。这个看你的系统设计,保持一致就行。

我曾经犯过一个低级错误:复位极性选了低有效,但板卡上的复位信号是高有效,结果IP核一直处于复位状态,折腾了两天才发现。嗯,这种细节最坑人。

3.6 生成IP核与例化模板

所有参数配好后,点Generate。Vivado会生成IP核的网表和例化模板。生成完成后,在Sources窗口里找到你的Aurora IP核,右键选择Open IP Example Design,Vivado会给你生成一个完整的测试工程。

这个测试工程非常有用。它包含了:

  • GTX/GTH的参考设计
  • 时钟管理模块
  • 复位逻辑
  • 简单的数据收发测试逻辑

我每次新做一个Aurora项目,都会先跑一遍这个Example Design。如果仿真和硬件测试都通过,说明我的IP核配置没问题。然后再在这个基础上改自己的用户逻辑。

小技巧: 例化模板里有个叫aurora_8b10b_0_support的模块,这个模块把GT的复位、时钟、初始化都封装好了。你直接例化这个模块,比自己从头写GT控制逻辑省事多了。

3.7 验证配置:检查关键信号

IP核生成后,有几个关键信号你一定要检查:

// 状态信号
wire channel_up;        // 通道建立成功,高有效
wire lane_up;           // 每个lane的初始化完成
wire hard_err;          // 硬错误,比如CRC校验失败
wire soft_err;          // 软错误,比如8B/10B解码错误

// 数据接口
wire [0:31] s_axi_tx_tdata;   // 发送数据
wire s_axi_tx_tvalid;         // 发送数据有效
wire s_axi_tx_tready;         // 发送准备好
wire [0:31] m_axi_rx_tdata;   // 接收数据
wire m_axi_rx_tvalid;         // 接收数据有效

上电后,先看lane_up是否拉高。如果这个信号没起来,说明GTX/GTH的初始化有问题。再看channel_up,这个信号拉高说明两端Aurora核已经建立了连接。如果channel_up一直不拉高,多半是线速率不匹配或者参考时钟有问题。

我记得有一次调试,lane_up起来了但channel_up死活不拉高。查了半天,发现是两端的GT参考时钟频率差了50ppm。嗯,时钟精度这个坑,真的很容易忽略。

3.8 总结:配置清单

最后,我给你列一个配置检查清单,每次配完IP核后对照着查一遍:

  1. 线速率:是否在GTX/GTH的支持范围内?
  2. 参考时钟:频率是否正确?板卡上有没有这个时钟?
  3. 数据接口模式:Framing还是Streaming?和你的应用匹配吗?
  4. 数据宽度:用户时钟频率是否在你的逻辑可接受范围内?
  5. GT Refclk Source:是否选对了Quad?
  6. 复位极性:和系统复位信号一致吗?
  7. Example Design:仿真和硬件测试都通过了吗?

这七步走完,你的Aurora IP核配置基本就稳了。下一章,咱们聊聊怎么把Aurora核和你的用户逻辑对接起来,实现真正的数据传输。