Aurora ip核的使用详解

Aurora ip核的使用详解

前言

近期完成了Aurora的光纤传输的单板验证,以及在集成其他模块完成数据从FPGA上通过PCIE传到上位机,对该IP核的使用有一定的了解,在此用自己的经验以简洁的语言分享给大家一些要点。主要的参考文档都来源Xilinx官网的文档,包括PG074,PG046,UG476等,大家可以去官网自行下载。限于作者能力,如发现错误或者有建议,大家可以在评论区提出。

概念

首先我们需要了解该IP核是什么,有什么功能。Xilinx公司的FPGA在片上集成了固化的GTX模块,以提供高速串行通信支持。同时Xilinx公司提供有多种串行通信协议IP核,便于用户进行开发。Aurora ,PCI Express 和Serial RapidIO 都是其中较为常用的协议,也就是说我们使用Aurora核本质上就是使用已经封装好较为简易的IP核,完成数据在板内或者板间的高速信号传输。Aurora有两个版本,分别为8B/10B,64B/66B,使用起来大同小异,只是编码方式不一样,8B/10B表示传输的数据中10位有8位为有效位,类似64B/66B表示传输的数据中66位有64位为有效位,这会影响到传输数据的有效带宽,我们后续再讨论。下面我也分享几篇觉得好的文章:

https://www.cnblogs.com/chengqi521/p/6868224.html
https://cloud.tencent.com/developer/article/1549640

开发流程

XILINX较为复杂的ip核,在使用VIVADO对其开发时会提供示例程序,方便我们学习和使用该ip核。我们只需要在设计程序中例化一个核,根据自己的需求设计通道数、时钟频率、相关功能的选择,这部分内容大家可以自行参考文档或者其他人的博客,不再赘述,然后就可以Open example design,生成的工程会根据你上述设置产生对应的示例使用方案。另外需要注意的是ip核的两种模式,Streaming和Framing模式,后者有帧结构的概念,即可以通过keep和last信号控制数据流完成类似数据切割生成一组组数据帧,该keep信号只在last信号有作用时有效可以对最后一个数据的位进行操作旨在完成非整数倍的数据帧。前者使用更为简单,满足握手机制,无帧结构概念。以下的内容都基于Framing模式,特此说明。生成的文件目录如下图:Aurora ip核的使用详解_第1张图片
我们从目录中可以看到生成了多个文件,由上往下,exdes结尾的文件是顶层文件,support结尾的文件是使用Aurora的主要文件,打开它下面的目录,包括有封装、时钟和复位,这部分文件的语言较为底层,和使用者本身没有太大关系。需要关注的是GEN和CHECK结尾的文件,设计文件中采用伪随机码的生成和验证方式,我们不需要关心,使用者在了解AXI的基础上可以自己产生数据或者检验数据的数据流信息。LL-TO-AXI和AXI-TO_LL是采用了一个同步FIFO并完成握手信号的转换(本质上都是握手信号只是命名不同)

管脚配置及约束

实际上对于我这样的新手而言,这部分的调试花费了我大量的时间,也是本文的干货所在。首先,该ip核有三个时钟输入,分别为:init_clk,drp_clk_in, refclk1_in。refclk1_in要求为GTX bank上的时钟,可以来自一个QUAD的参考时钟,也可以来自于南北相邻的参考时钟,需要用原语IBUFDS_GTE2。但是一个Quad的参考时钟源不能驱动超过3个Quad上的收发器(只能驱动当前Quad和南北方相邻两个Quad)。init_clk和drp_clk_in没有明确要求,可以根据你的硬件条件来源于PLL或者MMCM产生或者板子上的时钟,如果你直接使用示例工程在上面开发,就需要对support下面的程序修改,因为示例程序默认你这些时钟都来源于GTX BANK上的。IP核产生的USER_CLK作为产生测试数据的时钟以及FIFO、ILA的时钟。
第二个需要注意的就是复位,你应该仔细阅读手册PG074,PG046,根据你选用的ip核类型和单双工方式等信息完成两个复位信号的软件复位,它们是有一定的时序关系的。虽然我在调试过程中,发现不完全满足这些条件ip核也能正常工作,但仍应该遵循参考文档。
约束过程中,可以只约束对应管脚,无需对收发器通道位置进行约束。其他的时钟等管脚正常约束就行,可以参考示例工程的约束语句。XDC文件默认所有的时钟具有时序关系,set_clock_groups -async是一种设置伪路径的方式,不过结构远比set_false_path简洁。细节参考https://zhuanlan.zhihu.com/p/89817877。

测试数据速率及是否丢数

采用64B/66B一通道的ip核,Framing模式下但是没有引入帧,即tlast信号一直没发挥作用。以下的测试结果在一块子板上带有两个sfp端口的k7上完成。当然如果你的板子上没有光纤口,你也可以用loopback模式,完成开发。

测试数据的生成,从channel_up拉高开始,先产生高电平和低电平宽度都由VIO控制的方波信号,在信号为高电平时计数器不断计数,且使s_axi_tx_tvalid有效,为低电平时计数器保持不变,使s_axi_tx_tvalid无效,方便后续调试测试上板之后的传输速率最高值。由于板子上的参考时钟为156.25M,所以理论上最高传输速率为156.25*64=10Gbps(64为1个通道的数据宽度)IP核设置line rate为3.125Gbps,此时IP核产生的USER_CLK为3.125G/64=48.828Mhz,对应周期20.48ns。

测试过程中,控制低电平宽度为0X40不变,发现当高电平的宽度为0X7B4时恰好不丢数,当高电平的宽度为0X7B5时丢数被检测到,可以计算出单通道的最大传输速率为3.0268Gbps,协议的通信效率为96.858%。另外,我们也可以从ILA中抓取的m_axi_rx_tvalid中发现,每165个周期中有5个无效周期,换算过来通信效率为96.96%,完全符合理论值。所以,Aurora 64B/66B协议单向传输速率为3.0268Gbps,协议的通信效率为96.858%。我传输的是计数器,所以测试模块也可容易写,经过测试也没有出现过错误。

最后

写这篇文章比较匆忙,又没有相关的截图,还请见谅。另外,由于我的应用场景要确保数据传输过程数据不能出错,而该IP核还有预加重和均衡的功能(我没来得及研究),来提高信号质量,如果有过相关开发经验的人也可以与我交流。

以上。

你可能感兴趣的:(FPGA,嵌入式)