恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
FPGA高速串行接口实战:Aurora 64B/66B配置与上板调试避坑指南
首页
资讯中心
/
FPGA高速串行接口实战:Aurora 64B/66B配置与上板调试避坑指南
FPGA高速串行接口实战:Aurora 64B/66B配置与上板调试避坑指南
发布时间:2026/10/6 14:38:08
搞过FPGA高速串行接口的兄弟应该都有这种经历调了半天收发数据不对最后发现是复位时序的问题仿真跑得飞起一上板子就拉不起通道翻了无数文档却被Xilinx那句“请参考PG046”气得没脾气。Aurora 64B/66B这个IP核说难不难说简单也不简单配置界面就那么几个选项但背后牵扯到GT收发器、时钟架构、复位握手、帧对齐一堆东西任何一个环节没搞对板子上就是不通。这篇东西我尽量按实际项目一步步来不说废话直接拆解Vivado里Aurora 64B/66B IP核的完整配置过程把仿真怎么跑、上板怎么查、哪些坑我踩过也帮你们填平了一次性讲清楚。1. 为什么是Aurora 64B/66B而不是8B/10B很多刚接触高速串行接口的人会问Aurora协议明明还有8B/10B版本为什么非要选64B/66B这是个好问题答案也很直接编码效率差太多了。1.1 编码效率的账要算清楚8B/10B编码的意思是把8位有效数据扩成10位在链路上传输多出来的2位用来保证DC平衡和提供足够的跳变沿给时钟恢复电路用。代价就是有效带宽只有80%比如你配置线速率3.125Gbps实际用户数据吞吐最多只有2.5Gbps。64B/66B编码则聪明很多只把64位有效数据变成66位多出2位同步头。同步头用来做帧对齐剩下的64位数据通过扰码器处理兼顾DC平衡和时钟恢复需求。编码效率一下子跳到97%这意味着同样跑10Gbps线速率用户可用的数据带宽大约有9.7Gbps比8B/10B版本多出将近2Gbps。做项目的人听到这里应该两眼放光了。特别是传输带宽紧张的场景比如图像传感器数据回传、ADC采样数据搬运、或者两个FPGA之间互联交换数据64B/66B版本几乎是必选。1.2 没有DC平衡怎么解决——扰码器的角色有人可能疑问了8B/10B靠查表法做编码保证DC平衡和最大游程长度64B/66B明没有这种查表它怎么保证接收端不出错答案在扰码器。Aurora 64B/66B用的是自同步扰码器多项式是1 X39 X58。发送端先把数据过一遍扰码器接收端对收到的比特流做同样的解扰处理。因为扰码器的反馈结构只要收发两端同步了解扰就能恢复出原始数据。这样整条链路上传输的比特是随机化的不会出现长时间连续0或连续1的情况时钟恢复电路就有足够的跳变沿可用。但各位注意这里面藏着一个关键的坑扰码器依赖收发端精确同步。如果两端对齐出了问题解扰出来的数据全是乱的而且这种乱是“看起来很有规律但实际不对”的乱排查起来特别头疼。后面我讲到上板调试时会细说。2. Vivado中的IP核配置逐页拆解项目流程一般是先在Vivado里创建工程然后从IP Catalog里找到Aurora 64B/66B双击打开配置界面。不同版本界面可能略有差异但核心选项基本稳定我这里以Vivado 2021.2和2022.2为例。2.1 创建IP核与Protocol页面打开配置窗口第一页是Protocol。这里要选的是线速率Line Rate和参考时钟频率Reference Clock Frequency。这两个参数必须匹配实际硬件设计。比如你的板子上GT参考时钟晶振是125MHz那线速率和参考时钟之间必须满足倍频关系。以GTY收发器为例如果线速率是10.3125Gbps参考时钟125MHz这组参数是常见的10G Ethernet CPRI映射关系Aurora可以直接参考。这里有一个从文档里看不出来、但我实际操作中确认过很多次的经验参考时钟不能随便选一个接近的值。比如你板上是125MHz晶振想在配置里填一个128MHz的参考时钟IP核生成后综合时大概率会报时钟约束错误因为时钟频率不满足GT内部PLL的整数倍关系。PLL VCO频率范围和分频系数有硬约束不是任意组合都能锁定。在Aurora 64B/66B配置中线速率也不是想填多少就填多少。要确认当前器件系列支持的速率档位UltraScale的GTY能跑到16.3Gbps以上但7系列的GTX只有12.5Gbps左右GTH大约13.1Gbps。选高了IP核直接报不合法选低了性能和带宽又不够用。还有GT Type选择一般自动匹配但如果器件上有GTX和GTH两种需要手动指定。此时要打开器件手册确认你要用的Bank到底是哪类收发器。2.2 GT页面与物理位置规划第二页是GT主要选GT Reference Clock源和位置。GT Reference Clock一般是外部差分时钟需要约束到专用引脚上。在IP核配置界面里能看到当前器件可选的GT位置列表这个列表跟你绑定的引脚XDC约束是对应的。比如你的时钟从Bank 227的MGTREFCLK0P/N进入那就对应选择对应的GTClock位置。很多人在这里忽略了一个细节GT参考时钟进入芯片后要走专用的时钟布线资源到达各GT的PLL不是随便一个Bank的参考时钟都能驱动所有位置的GT。每个参考时钟能驱动的GT范围在器件手册里有明确说明通常叫clocking region。如果跨了region综合和布局布线会报错或者即便能跑时序和抖动也无法保证。建议的方法很朴素打开器件的Package Pinout文件找到参考时钟引脚所在的Bank再把Aurora IP要用的GT位置选在同Bank或相邻Bank。如果布局实在受限制宁可外面多分一路时钟也别硬跨时钟域。另外如果你打算在同一个Bank里塞多个Aurora核还要注意共享参考时钟的能力以及同一Bank最多能容纳的GT数量。Xilinx的文档里有Bank内GT资源的使用规则最简单的方法是配置多个Aurora核时让工具自动分配位置一般情况下它能找到合适的方案但性能敏感场景最好还是自己根据Bank布局来固定位置。2.3 用户接口和速率匹配下一页是用户接口Aurora 64B/66B支持Framing和Streaming两种模式。Framing模式数据组织成帧带User K码控制字符适合需要消息边界的场景。发送方可以周期性发送帧接收方根据K码定位帧边界适合多通道同步传输。Streaming模式没有帧结构就是一条用户数据管道适合单纯的数据流传输。从项目实现来说Streaming模式在很多场景下更省事收发逻辑直接对接FIFO即可。不过当需要传输控制命令和有效数据区分时Framing模式反而更实用因为它允许在数据流中插入用户控制字这类控制字不会被打到数据侧而是通过单独的控制信号通知接收端。数据接口宽度也要在这里设置常用的有32bit、64bit。它跟线速率共同决定了用户时钟频率。比如线速率10.3125Gbps数据宽度64bit因为64B/66B编码开销约3%用户时钟大约是10.3125 / 66 * 64再除以某个整数因子具体的值IP核会自动算出来界面上会直接显示。不用自己算但要理解这个用户时钟是接收端恢复出来的时钟域发送端如果不同源需要考虑跨时钟域处理。最后一个重要选项是Flow Control。不需要时千万不要开开了会引入额外的控制逻辑和延迟不仅浪费资源还会带来很多调试时不必要的麻烦。除非你的应用对拥塞控制有硬性要求否则保持默认关闭。3. 仿真用Example Design快速验证配置完IP核下一步不是急着写自己的用户逻辑而是先用IP核自带的Example Design跑通整个链路。3.1 从Example Design出发在Vivado的IP源窗口里右键点击Aurora IP核选择Open IP Example Design。工具会新建一个独立的工程里面包含了IP核实例化、可用的GT参考时钟模块、用户接口的Frame Generator和Frame Checker以及完整的约束文件和测试平台。这一步为什么关键因为Aurora IP核内部有不少复位、初始化状态机手写顶层时少接一个信号都可能导致链路起不来而Example Design里这些都已经验证过相当于官方给了一个能直接运行的参考实现在其中做增量修改总比从零开始要稳得多。打开工程后几个关键模块要眼熟aurora_64b66b_..._support时钟和复位处理逻辑包括GT的复位、初始化时钟等保留即可。aurora_64b66b_..._exdes示例顶层将IP核Wrapper例化进来并接上用户接口测试模块。Frame Generator发送固定模式的数据帧。Frame Checker接收并检测数据是否与预期一致。跑仿真的操作很简单直接在Flow Navigator里选Run Simulation的Behavioral Simulation即可。Vivado会自动编译IP核的仿真模型提供相关的仿真库支持然后弹出波形窗口几毫秒之内就能看到结果。3.2 关键信号与测试序列仿真波形里要关注几个关键信号组。我一条条说清楚channel_up和lane_up或gt_pll_lockAurora链路初始化完成后lane_up会拉高表示物理层的每个通道训练成功channel_up拉高表示Aurora协议层链路就绪。如果仿真跑完一直看不到channel_up说明GT初始化或复位有问题。这两个信号是排查问题的第一标杆优先检查它们。user_clk这是用户接口的工作时钟由IP核内部产生一般是GT恢复时钟的分频结果。如果user_clk一直不产生或者频率不对链路大概率起不来。仿真时可以直接看这个时钟是否在正确翻转。s_axi_tx_tdata和s_axi_rx_tdata发送侧的数据在Frame Generator的控制下先发一个固定的同步模式然后发送递增数据或PRBS模式。接收侧的Frame Checker会校验数据。仿真中如果tx侧数据正常输出、rx侧校验不通过往往说明链路误码较高需要回查通道或编码配置。gt_rxdata和gt_txdata如果单纯想看底层GT收发器的数据是否正常可以直接监控这两组信号。正常情况下发送和接收的GT数据应该是镜像关系——接收数据等于发送数据。如果这里就已经对不上问题大概率出在物理层或者参考时钟配置上和用户逻辑无关。3.3 常见仿真失败原因结合我自己的经验仿真跑不通的典型原因有下面这几个复位信号没释放有些仿真模型中IP核的复位引脚必须持续拉低足够长时间才能完成GT的PLL锁定和复位序列。Vivado示例设计里复位逻辑已经写好但如果你在自定义顶层中没有正确连接复位一直处于有效状态链路当然起不来。缺少必要的共享逻辑Aurora IP核依赖一些共享的GT复位和时钟资源比如GT_DRP、GT_RX_CDR等在Example Design中已经通过Wrapper处理完毕。删减这些逻辑会导致仿真卡在某个状态不再推进。不完整的数据通道连接用户接口的tready/tvalid握手信号如果发送侧只给数据不握手接收侧可能一直收不到有效数据。仿真时不要觉得这些信号可以随便接AXI4-Stream的握手规则必须严格遵守。测试平台超时时间太短IP核启动需要一次完整的PLL锁定和复位序列释放在仿真模型中这个过程可能在微秒级别。如果你自定义的testbench设置了个极短的全局超时可能链路还没起来就停了。示例设计的testbench一般设置得很宽松这点不用改。4. 上板调试避坑实录仿真跑通了只代表IP核逻辑行为正确。真实板子上有信号完整性、有电源噪声、有参考时钟的质量问题还有XDC约束是否完善的问题这些都是仿真里看不出来的。下面是我自己在不同项目里踩过的坑按排查优先级列出来。4.1 复位顺序和Channel Up的纠缠关系上板后最常见的现象程序烧进去了但是channel_up一直不拉高或者偶尔拉高后又掉下来。根据我踩过的坑第一个要查的是复位时序。Aurora 64B/66B IP核的复位机制比较讲究PMA物理介质附加子层复位和PCS物理编码子层复位有严格顺序复位释放太早会打断GT的初始化状态机复位释放太晚则可能让初始化超时。Xilinx在Example Design里给的复位逻辑基本靠谱但它依赖外部输入给一个足够宽的复位脉冲这个脉冲如果来自按键一定要在FPGA配置完成后至少等待几百毫秒再触发。实际项目中我建议在FPGA内部加一个上电延时计数器把复位拉低至少1ms后再释放给GT的PLL和CDR足够的稳定时间。第二个要查的是不同GT之间的复位去抖。如果你用的是多通道Aurora所有通道的reset必须同步释放某些通道复位早、某些通道复位晚会导致通道间初始化状态不齐lane_up虽然能一个一个起来但channel_up会因为通道间未对齐而一直等待。这时候去读IP核的channel_up寄存器通过DRP或状态接口能看到到底卡在哪个阶段。如果全部lane_up都拉高了唯独channel_up不拉高说明问题出在通道对齐阶段要检查参考时钟是否有毛刺、线速率配置是否支持当前参考时钟的抖动指标。4.2 DRCE RTSTAT错误与边界约束有阵子我新建工程总是报一个叫[DRC RTSTAT-2]的错误查了半天发现是GT参考时钟引脚约束不对。具体来说Aurora IP核生成的XDC文件里对GT参考时钟有一组LOC约束必须保证你实际PCB上的时钟连接到对应的引脚并且这些引脚的所在Bank和IP核分配的GT位置一致。这个DRC错误在Implementation阶段报出通常是GT参考时钟的引脚约束或GT位置的location约束与设计不符。解决方法是检查两条约束参考时钟必须约束在专用MGTREFCLK引脚上用get_ports能查到对应的引脚名。GT位置例如GTYE4_CHANNEL_X1Y10必须与参考时钟可驱动范围一致这个范围在器件文档里有明确的clock region映射表。有一个实操小技巧当DRC报错指向GT时钟资源时在Vivado里打开Device视图把Report里的错误选中工具会高亮显示具体是哪组GT通道或引脚不满足要求比直接看文字日志直观得多。我曾经遇到过这样的情况参考时钟的XDC约束写的引脚名和工程顶层端口名不一致DRC报的错莫名其妙的。原因是我在顶层为了统一命名把参考时钟端口叫clk_ref_p但IP核生成的XDC里写的是gt_ref_clk_p名字对不上导致约束没挂上。解决方式很简单要么统一端口命名要么改XDC但要注意别把IP核生成的XDC直接覆盖掉建议在自定义XDC里追加修正约束用set_property重新定义引脚位置。4.3 数据收发不正常的数据链路排查channel_up拉高之后接下来是数据正确性问题。最典型的场景channel_up已经正常拉高数据能收发但收到数据错误或者根本收不到数据。先看GT RX侧的信号完整性如果使用的是自制板子或者较长的SMA连接线GT接收端可能信号质量不好。上板后用IBERTIntegrated Bit Error Ratio Tester测一下误码率这是排查GT物理层问题的标准工具。如果IBERT测试误码率太高超过1e-12说明物理层就有问题IP核怎么调都白搭。如果IBERT正常但Aurora数据错误重点看时钟恢复质量。GT的CDR对参考时钟质量很敏感如果参考时钟抖动超标会导致恢复出来的时钟带有较大抖动继而影响数据采样。看看是不是字节顺序的问题Aurora 64B/66B在接收端恢复出的数据低字节和高字节的位置由GT收发器的极性决定。如果FPGA和FPGA之间连接时TX的P/N极性接反了数据链路可能起不来或者起来后数据全错。这种问题一般通过配置GT的TX/RX极性反转来解决Aurora IP核不会自动处理。还有一个常见问题是发送端和接收端的数据位宽不一致。假如发送端配置的是64bit数据接口接收端配置的是32bit链路虽然能起来但接收数据的排列方式会完全错乱。仿真时因为两边都是同一个IP配置看不出来上板对接不同的FPGA时就要特别注意两端的数据接口宽度必须一致。最后检查用户接口的握手信号有次我调一个图像传输项目Aurora的channel_up一直正常数据接口也有信号翻转但接收端DDR里存的图像就是花的。查了半天发现发送端在tvalid拉高的同时tready信号没来得及拉高导致有些像素数据被丢弃了。Aurora IP核的发送接口会等tready为高才开始发送数据如果tready不稳定数据就会断断续续。这种情况在仿真里很难发现因为仿真模型里的tready永远是拉高的。所以在上板调试时建议在发送端先加一个FIFO把用户数据和Aurora发送接口解耦让tready抖动不会直接丢数据。接收端同样加FIFO处理tvalid和tready的背压。4.4 关于GT_RESET、POWER_DOWN和时钟的一些补充在Xilinx的Aurora IP核设计中gt_reset、power_down这类信号经常被初学者忽略。很多人觉得GT的power_down只要初始化完成就可以不管了实际上如果这个信号在运行过程中被意外拉低GT会进入低功耗模式链路会瞬间断开。如果power_down信号被当成了普通复位信号在系统复位时被一起触发那么恢复时间可能会比较长。正确做法是让power_down信号在链路稳定后一直保持为正常值不要跟着系统复位走。比如系统复位时只复位IP核的reset引脚不要碰power_down。另外Aurora IP核的GT复位信号在上电初始化阶段需要拉低一段较长时间这个时间一般在数据手册里有明确规定。有些FPGA里会有全局复位逻辑在配置完成后拉低几百微秒但GT PLL锁定需要的时间可能比这个更长所以实测时如果发现channel_up在第一次配置后起不来按一次外部复位往往就好了。这种“第一次不行手动复位一下就好”的现象十有八九是GT初始化时间不足。解决方案是在顶层加一个专门的上电复位延时模块确保释放GT复位之前参考时钟和电源都已经稳定。推荐的做法是让init_clk一般由外部时钟分频而来启动后计数至少1ms再释放gt_reset。1ms这个值不是拍脑袋定的7系列和UltraScale系列GT的PLL锁定时间典型值在几百微秒到1毫秒之间留够余量才能保证上电即通。5. 关键参数速查和常见报错映射为了方便现场调试我把这次项目中涉及的常用参数和报错处理方式整理成表格贴在这里可以收藏备用。参数/现象参考值/含义现场处理建议Lane Rate时钟频率与线速率满足PLL倍频关系不要硬填以器件手册PLL分频表为准init_clk频率推荐50MHz-200MHz用于复位状态机低于或高于范围会导致复位逻辑时序异常channel_up链路就绪指示拉高代表协议层握手完成持续不拉高先查复位时序lane_up各通道初始化完成部分通道不拉高说明对应GT通道物理层有问题gt_pll_lockGT PLL锁定不锁定基本是参考时钟问题先查时钟有无进来DRCE RTSTAT-2时钟资源约束错误检查GT参考时钟引脚和GT位置是否匹配拉大时钟region数据一帧错几个字节多半是通道边界对齐问题用PRBS数据模式跑一下确认误码位置在用户接口还是GT物理层tready一直为低接收端FIFO满了检查接收侧用户逻辑是否及时读取数据否则会反压发送端上板调试时手里有这张表能省掉很多翻文档的时间。不过要提醒一下表里只是常见情况遇到问题还是要结合具体器件手册和IP核的日志信息来定位。6. 最后说点实在的Aurora 64B/66B这个IP核官方文档会给你完整的功能描述、接口时序和寄存器列表但真正把它用到一个项目里需要踩过无数个细节的坑才会顺手。我个人的体会是配置IP核本身是最快的一步仿真也相对容易真正耗时的是上板调试中那些看起来“不可能出错”的东西——一个没接的复位信号、一条没对齐的约束、一个没考虑到的时钟region限制都可能让整个工程看起来像是坏了一样。所以如果你正在被Aurora折腾我建议先按这个顺序排查物理层GT的PLL有没有锁定复位时序有没有给够时间约束有没有真正生效再去看用户逻辑。大部分问题在物理层和复位部分而不是Aurora协议的帧格式和数据排列。最后分享一个小技巧如果你手上有多块同型号的FPGA板子优先用两块做回环对接测试直接让Aurora的TX接RX在例化IP核时就开启内部回环Loopback。内部回环通过后再改成外部线缆回环这样能快速区分是FPGA内部配置问题还是外部物理链路问题。这个分层排查法能帮你少走很多弯路。