尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

基于VU190的UltraScale FPGA板卡开发实战:从电源树到GTY高速接口调试

基于VU190的UltraScale FPGA板卡开发实战:从电源树到GTY高速接口调试 如果你想找一颗在逻辑规模、高速收发器数量和工程可玩性上都站得住脚的FPGA这块基于 Xilinx UltraScale VU190 的新板卡属于那种一眼就能相中的选择。VU190 是 Virtex UltraScale 家族里的高配成员约 235 万逻辑单元、3672 个 DSP Slice、120 条 GTY 收发器通道单 lane 线速最高 16.3Gbps无论你要做无线通信的数字中频、多通道 JESD204B 采集、PCIe Gen3 原型验证还是图像处理和加密算法的硬件加速这块板子都能给你一个非常舒服的起步平台。写这篇文章的起因是我最近完整过手了这块新板卡的评估流程从电源设计、时钟树一直走到 IBERT 点亮、DDR 读写和 JESD204B 环路中间踩了不少坑也陆续整理出了一整套可以直接抄作业的流程。如果你正准备基于 VU190 出自己的板子或者刚拿到一块类似的 UltraScale 开发板不知道该从哪里下手这篇内容按顺序看下来应该能帮你省下至少两周的试错时间。1. VU190 到底是一颗什么样的器件1.1 从资源表看它的真实定位很多人说起 VU190第一反应就是“大”。但大在哪里大到什么程度最好还是看资源表。我给这块板子选型的时候把 Xilinx 官方的产品选型手册翻出来对着 VU190 的参数逐行核对过一遍资源项XCUVU190 典型参数实际设计中的意义逻辑单元 Logic Cells约 2,352,240可以塞下大型通信物理层算法比如多通道 DVB-S2 解调器、信道估计、波束成形矩阵DSP Slice3,672 个做 FIR/FFT/CIC 这类乘加密集型处理时非常充裕跑图像卷积也不紧张Block RAM约 67.5 Mb多路大缓存、FIFO、查找表随便用GTY 高速收发器120 个 lane最高 16.3Gbps支持 PCIe Gen3、10G/25G 以太网、JESD204B、SRIO 等主流高速接口集成 PCIe 硬核PCIe Gen3 x16做原型验证板时可以直接把 CPU 和 FPGA 之间的接口跑满注意一个细节VU190 属于第一代 Virtex UltraScale不是 UltraScale。它的 GTY 收发器上限是 16.3Gbps而后来 UltraScale 上的 GTY 能跑到 32.75Gbps。但 16.3Gbps 覆盖绝大部分实际项目需求PCIe Gen3 是 8GT/s10G 以太网是 10.3125GbpsJESD204B 跑到 12.5Gbps 甚至 15Gbps 都能支持并不会成为瓶颈。1.2 选它做新板卡图的是什么我在给这块板子做器件选型时其实对比过几个方向Kintex UltraScale 的 KU115、Zynq UltraScale 的 ZU 系列、以及更大号的 Virtex UltraScale。最终定在 VU190核心原因有三条。第一是逻辑密度和收发器数量平衡得好。KU115 大概有 145 万逻辑单元和 64 个 GTY对很多项目够用但遇到同时挂多路 JESD204B 高速 ADC、又要做 PCIe 和 SRIO 的场景GTY 数量就开始紧张。VU190 有 120 个 GTY可以做 16 路以上的 JESD204B 或 12 路以上 10G 以太网剩余 lane 还能留给 PCIe 和调试口。第二是生态成熟。VU190 出来这么多年Vivado 对它的支持非常稳定各种 IP 核、板级参考设计、社区资料都很齐全。相比用最新一代器件VU190 的时序收敛难度更低尤其是做原型验证时省心很重要。第三是成本。同样逻辑规模下VU190 比 UltraScale 的同档器件便宜不少而性能对绝大多数应用已经足够。做开发板或者小批量原型验证这个性价比很有吸引力。当然如果你的项目明确要求 25G/32G 高速串行接口或者需要更高带宽的 HBM 内存VU190 就不合适了那得往 UltraScale 或者 Versal 方向走。选型这件事永远是需求先行的。2. 板卡设计的几个关键模块怎么搭才靠谱2.1 电源树235 万逻辑单元的饭量得喂饱一颗 VU190 全速跑起来核心供电 VCCINT 的电流可以到 30A 甚至更高再加上 VCCBRAM、VCCAUX、VCCO、GTY 的 AVTT/AVCC整块板子的电源树非常复杂。设计这块新板卡时我第一件事就是把电源树画出来而不是急着画原理图。VU190 上电顺序在数据手册里有明确要求先 VCCINT然后 VCCBRAM再 VCCAUX最后 VCCO。这个顺序不能乱乱了一是有可能电流过大损坏器件二是可能导致配置失败。实际设计中我用的是多路 DC-DC 加电源监控芯片每路输出都有 Power Good 信号串成一个使能链确保每一级的启动都等上一级稳定之后再进行。这里有个实操细节VCCINT 的瞬态响应一定要关注。VU190 在做大逻辑切换时内核电流会突然拉高如果 DC-DC 的环路响应跟不上电压跌落超过 3%时序可能直接崩掉。建议在 VCCINT 管脚附近放足够的去耦电容至少是 100uF 钽电容加 0.1uF/0.01uF 陶瓷电容的组合同时 DC-DC 尽量选带远程采样引脚的型号把采样点直接接到 FPGA 管脚附近而不是电源芯片输出端。2.2 时钟方案全局时钟和 GT 参考时钟要分开规划FPGA 板卡设计里时钟是灵魂。VU190 上有两种时钟要特别对待一是给逻辑用的全局时钟二是给高速收发器用的参考时钟。全局时钟一般从板上可编程时钟芯片输出接到 MRCC 或 SRCC 引脚。我在板子上用了 Si5345 这类可编程时钟发生器好处是板子贴好后可以通过 I2C 调整频率不用改贴片电阻。比如调试时需要在 122.88MHz 和 125MHz 之间切换软件改一下寄存器就行非常方便。注意全局时钟要靠近 FPGA 时钟引脚走线尽量短不要穿过嘈杂的数字区域。GT 参考时钟则要严格遵守 Xilinx 的要求。每个 GTY bank 有一组专用参考时钟引脚通常命名为 MGTREFCLK。这块板子上我把每个高速接口区域的参考时钟都用独立时钟源驱动并且加了 AC 耦合电容。实际测试发现参考时钟的抖动直接影响高速链路的眼图所以参考时钟芯片一定选低抖动型号走线也要和旁边的 LVDS 信号保持距离。说到 LVDSVU190 的普通 IO 和高速收发器信号经常混在同一个连接器区域比如 FMC 连接器上既有 LVDS 引脚也有 GTY lane。设计时一定要把差分对的 P/N 极性核对清楚VU190 的引脚名是 DXP/DXN 这种格式习惯上有人叫 P/N但原理图符号里经常写成 DXP 对应正端、DXN 对应负端别接反了。2.3 配置与启动不要只留一种启动方式FPGA 板卡最容易忽略的是配置电路。VU190 支持 JTAG、QSPI Flash、BPI Flash 等配置模式。新板卡上建议至少留两种JTAG 用于开发调试QSPI Flash 用于固化程序。QSPI Flash 我选的是 128Mbit 的型号如果 Bitstream 太大也可以选 256Mbit。注意 UltraScale 系列 QSPI 支持 x1/x2/x4 模式但使用 x4 模式需要把 Flash 的 WP 和 HOLD 引脚处理干净不能悬空否则配置可能间歇性失败。这个坑我见过不少人踩过原理图上看不出来的问题最后查出来是 Flash 的 HOLD 引脚悬空导致的上拉冲突。配置模式引脚 M[2:0] 在 UltraScale 上是复用引脚需要加上下拉电阻固定电平。调试时我最喜欢的是 001 模式也就是 JTAG 优先这样即使 QSPI 里固化了错误的程序JTAG 也能覆盖进去。如果直接固化成一个无脑从 QSPI 启动的模式一旦 Bitstream 写错就得先擦除 Flash 才能继续调试麻烦得很。2.4 高速接口布局连接器不是越多越好板卡的接口布局非常考验硬件工程师的功力。很多新设计的板子恨不得把所有接口都堆上去结果走线绕得乱七八糟高速信号质量一塌糊涂。这块 VU190 板卡最终定了这几个高速接口一个 PCIe x16 金手指两个 QSFP 光口一个 FMC 连接器用于外接高速 ADC/DAC 子卡另外留了几组 SMA 对用于时钟和低速收发器测试。选择这些接口是因为它们正好覆盖了 VU190 最常见的应用场景。PCIe 负责和主机通信QSFP 用于网络数据收发FMC 用于接 JESD204B 子卡SMA 做调试。摆放位置上也有一点讲究PCIe 金手指和 QSFP 之间的 GTY lane 不要交叉尽量用同一侧的收发器 bank。FMC 连接器周围要留足空间给去耦电容和 AC 耦合电容。高速差分走线的等长控制也很重要比如 GTY 的 TX 和 RX 差分对对内等长控制在 5mil 以内对外等长控制在 50mil 以内同时保证参考层连续。背钻工艺如果成本允许建议加上能明显减少过孔残桩对高速信号的影响。3. 新板卡第一次上电按这个顺序来3.1 上电前的静态检查千万别省第一块 PCB 贴片回来我花了一个下午做上电前的检查。这一步能帮你省掉很多返工的痛苦。先用数字万用表测各电源轨对地阻抗正常情况 VCCINT 对地阻抗应该在几十欧到几百欧之间太小说明有短路太大可能供电没接上。测完之后再检查配置引脚的电平如果配置模式是 001M[2:0] 应该分别量到对应的高/低电平。还有一个不能漏的步骤检查 JTAG 链路的 TCK、TMS、TDI、TDO 是否连通特别是 TDO 的驱动方向有些新手会把 TDO 接到地导致 Vivado 根本识别不到器件。检查没问题后上电先不要烧写任何程序用示波器看各路电源纹波确认没有异常振荡。新板子最常见的现场事故就是某个 DC-DC 自激振荡输出电压波形变成正弦波这种情况一旦直接配置 FPGA轻则配置失败重则损坏逻辑。3.2 第一个工程点亮时钟和 LED元件检查通过后我的习惯是先做一个“最小工程”只例化一个时钟管理单元把板上的 100MHz 差分时钟接进来然后分频输出到 LED同时把锁定信号也引到一颗 LED 上。这个工程很简单但能一次性验证好几件事全局时钟信号是否到达 FPGA、MMCM 是否正常锁定、IO 引脚约束是否正确。在 Vivado 中新建工程时器件型号直接搜 XCUVU190。建完工程后我写了下面这样的约束把时钟引脚和 LED 引脚约束好set_property PACKAGE_PIN AK27 [get_ports clk_p] set_property PACKAGE_PIN AJ27 [get_ports clk_n] set_property IOSTANDARD LVDS [get_ports clk_p] set_property IOSTANDARD LVDS [get_ports clk_n] set_property PACKAGE_PIN AH32 [get_ports led0] set_property IOSTANDARD LVCMOS12 [get_ports led0]注意时钟差分对要约束为 LVDS并且把 create_clock 写清楚。如果 MMCM 的锁定信号一直拉不起来大概率是输入时钟没有到达对应的 MRCC 引脚需要回头查原理图和 PCB 走线。这一步看似简单却是验证整个时钟树和基础 IO 的最快路径。3.3 IBERT 核用高速串行收发器自检 GTY板上基础逻辑跑通之后就要进入高速信号验证了。这一步的核心工具就是 IBERT也就是 Integrated Bit Error Ratio Tester。Vivado 里提供了现成的 IBERT IP 核可以直接生成一个只用 JTAG 连接就能控制的测试工程对 GTY 做回环测试、眼图扫描和误码率统计。创建 IBERT 工程时最关键的选择是参考时钟。每个 GTY bank 的参考时钟从哪来必须和原理图上的连接关系一致。我在板上用了两组参考时钟一组给 PCIe 相关 bank一组给 QSFP 和 FMC 相关 bank所以在 IBERT IP 配置界面里要把这两组时钟分别加进来频率设成 156.25MHz 或者 125MHz。如果这里配置错了生成出来的 Bitstream 无论如何都锁不住 GTY 的 TX/RX 时钟。配置完成后生成 Bitstream在 Vivado Hardware Manager 里加载。IBERT 界面里能看到每个 GTY lane 的 TX、RX 状态。我最常用的测试方式是先做近端回环也就是把 TX 直接回环到同一颗 FPGA 的 RX这种模式下如果误码率不为零说明 GTY 的配置有问题然后再做外部回环通过连接器上的 SMA 线或者光模块回环这时候考验的是 PCB 走线质量和连接器性能。调 IBERT 参数时有个技巧不要一上来就用固定的 TX 预加重和 RX 均衡参数先让 RX 自适应均衡跑一遍看到眼图稳定后再微调。GTY 的 RX 自适应均衡在 UltraScale 上是默认支持的很多工程师不知道结果手动调均衡参数调了整整一天。先自适应再手动微调效率会高很多。4. 从点亮到能干活的几个验证步骤4.1 DDR4 存储子系统读写回环是最基本的试金石这块 VU190 板卡上设计了 DDR4 内存容量 4GB数据位宽 64bit。DDR4 控制器的初始化是很多工程的第一个拦路虎也是最能暴露硬件问题的环节。在 Vivado 中例化 MIGMemory Interface GeneratorIP 时需要注意几个参数器件选择 VU190 后DDR4 的接口速率我设置成 2400MT/s这是 UltraScale 原生支持的上限。引脚分配尽量让 MIG 自动做但如果原理图上 FPGA 引脚接了 DDR4 颗粒需要把 MIG 自动生成的 XDC 和原理图逐一核对特别是 DQS 和 DM 的引脚错一个就是读写失败。MIG 配置完成后先做仿真也许可以但新板卡直接上板测试更直接。加载 Bitstream 后用 ILA 观察 MIG 的 init_calib_complete 信号这个信号拉高说明 DDR4 物理层校准通过。校准失败的话常见原因有时钟和地址信号的质量不佳、VREF 电压不对、PCB 走线等长没控制好。校准通过后就可以跑读写测试了。我在板子上写了一个简单的 AXI 协议读写测试模块从地址 0 开始写递增数据再读回来比对。这个测试不复杂但能把数据线、地址线、控制信号的问题基本暴露出来。如果读写出现错误优先检查 DQS 与时钟的相对相位可以用 MIG 的 DRAM 内部控制器寄存器做微调也可以回到硬件检查 PCB 走线。4.2 JESD204B 链路高速数据采集场景的核心验证VU190 这块板卡预留的 FMC 连接器主要就是给 JESD204B 高速 ADC/DAC 子卡用的。JESD204B 是当前高速数据转换器和 FPGA 之间的主流接口替代了传统的并行 LVDS 接口特点是 lane 数少、速率高、支持确定性延迟。在调试 JESD204B 之前建议先确认 GTY 的收发器链路是通的这一步直接用 IBERT 验证过就没问题了。接下来要保证的是 SYSREF 信号和 DEVICE_CLK 的对齐关系。JESD204B 的 subclass 1 模式依赖 SYSREF 来实现确定性延迟SYSREF 的时序如果和 DEVICE_CLK 对不齐链路建立了也拿不到稳定的采样数据。我调试时遇到过一种典型情况JESD204B 链路能建立但数据一直有随机错位。查到最后发现是 SYSREF 信号在 PCB 上走线太长导致相对 DEVICE_CLK 的建立时间不够。解决方法是调整 FPGA 内部 IDELAY 的延迟档位或者重新约束 SYSREF 引脚来改变内部路径。这里我花了整整两个晚上经验就是JESD204B 出问题十有八九是 SYSREF 和时钟对齐的问题而不是高速 lane 的问题。4.3 PCIe 和 SRIO验证集成硬核与外部接口VU190 集成了 PCIe Gen3 x16 硬核这块板卡上的 PCIe 金手指可以直接插到主机主板上做原型验证场景非常方便。在 Vivado 中例化 Xilinx PCIe IP 核时选择 UltraScale 架构下的 Integrated Block然后按照硬核的对应关系设置 lane 数和速率。PCIe 调试有个特点是先看链路训练状态机LTSSM的状态。加载 Bitstream 后用 ChipScope ILA 观察 LTSSM 的状态如果停在 Polling 状态说明链路训练没完成常见原因是参考时钟抖动太大或者 TX/RX 差分极性接反。PCIe 协议允许链路自动做极性反转但前提是寄存器配置正确。我遇到过一块板卡所有 lane 都训练不上最后量了参考时钟发现是从有源晶振出来之后经过了太长走线眼图都关掉了换成更低抖动的时钟源后问题解决。SRIO 也是 VU190 上常用的接口尤其是在雷达信号处理和数据交换场景。Xilinx 提供了 Serial RapidIO Gen2 IP 核底层同样是 GTY 收发器。SRIO 调试验证的核心也是链路训练可以先用 Ibert 确认收发器物理层打开再用 SRIO IP 自带的回环模式验证链路层。唯一要注意的是 SRIO 的参考时钟频率通常是 125MHz 或 156.25MHz和 PCIe 不一样板卡设计时如果没有单独布参考时钟SRIO 就无法正常工作。5. 那些不会写在手册里的坑我这里帮你踩完了5.1 MMCM 级联不能随便用在 VU190 上做时钟设计时由于 UltraScale 的时钟资源比 7 系列更灵活很多人喜欢用 MMCM 级联来生成多种频率。级联本身是允许的但一定要清楚代价。每级 MMCM 都会引入一定的抖动级联级数越多输出时钟的抖动越大。对于普通逻辑还好如果这个时钟要送给 GTY哪怕是作为低速辅助时钟抖动超标也会导致收发器性能下降。我的经验是能用一个 MMCM 解决的多输出频率就用一个 MMCMUltraScale 的 MMCM 本身支持多个时钟输出每个输出可以有不同的分频系数。只有当频率关系太复杂比如既要 122.88MHz 又要 10MHz 还要 245.76MHz一个 MMCM 实在分配不出来的时候才考虑级联。级联时第二级输入最好用全局时钟缓冲器 BUFG 转一下避免直接通过内部路径把第一级输出交给第二级减少信号质量损失。另外要注意 MMCM 级联后时序收敛分析里会出现新的时钟域XDC 约束里要写清楚否则工具可能默认它们相关导致优化路径不合理。5.2 时钟约束里的快慢时钟域问题FPGA 开发中很多人只在综合时加了 create_clock但异步跨时钟域和快慢时钟交接的地方没有做约束导致 Vivado 时序报告里出现一堆 Unconstrained Path或者更麻烦的是产生亚稳态导致偶发的数据错误。UItraScale 工程里约束内部时钟信号很重要。比如用 MMCM 生成了一个 250MHz 的内部时钟需要在 XDC 里用 create_generated_clock 描述它的来源和分频关系否则 Vivado 不知道这个时钟的存在跨时钟路径就不会有约束。热词里提到的“FPGA 快时钟到慢时钟 1.2 倍怎么设置时序约束”这种问题本质上是同步跨时钟域的约束问题。比如 FPGA 内部从 250MHz 时钟域到 200MHz 时钟域如果这两个时钟都来自同一个 MMCM并且相位关系固定可以用 set_clock_groups -asynchronous 把它们设为异步或者用 set_max_delay 做数据路径约束。如果数据还需要保证连续性最好用异步 FIFO 或者握手信号处理而不是依赖时序约束解决一切。这里分享一下我常用的处理方法遇到快慢时钟域数据交换优先考虑用 XPM 异步 FIFO 原语也就是 Xilinx Parameterized Macro。它把跨时钟域的同步问题都封装好了直接用最稳妥。只有传输简单控制信号这种低频率、单 bit 的变化才用两级寄存器同步处理。不要试图用时序约束去约束没有同步逻辑的跨时钟域路径那样即使时序报告干净实际运行也可能翻车。5.3 上电时序相关的隐蔽问题前面说了电源树的上电顺序很重要但有一个隐蔽问题容易被忽略部分电源轨虽然使能顺序正确但掉电时序没管导致反复上下电后 FPGA 配置偶尔失败。我在板卡调试中遇到过一次表现为第一次上电配置正常断电再上电配置失败率约 30%。示波器抓 VCCINT 和 VCCAUX 的波形发现断电时 VCCAUX 掉得比 VCCINT 快重新上电时 VCCAUX 还没有完全放干净VCCINT 又起来了这时 FPGA 内部某些逻辑可能处于不确定状态。解决方法是调整电源模块的软启动和放电电阻确保所有电源轨在上电和掉电时都保持合理顺序。如果电源芯片支持输出放电功能建议打开。如果不行可以在大电容旁边并联一个大电阻帮助放电但注意放电太慢反而不好要试验找到一个合适的值。5.4 IBERT 眼图不张开的几个高概率原因最后集中说下高速收发器眼图的问题。IBERT 扫描出来的眼图如果是闭合的很多工程师第一反应是加预加重或者调整均衡但硬件上的原因更常见。按我排查的经验频率从高到低排列第一参考时钟的抖动。GTY 的参考时钟要干净mS级的抖动影响很大。如果参考时钟来自 PLL 的通用时钟而不是专用低抖动时钟源眼图大概率不行。第二板上 AC 耦合电容不正确。GTY 的 AC 耦合电容通常要求 100nF 左右太大或太小都会影响高频分量。第三走线阻抗不连续。如果连接器处和过孔处的阻抗不匹配反射会直接体现在眼图上。第四电源噪声。GTY 的 AVCC 如果纹波偏大眼图的高频抖动会很严重。如果以上都排除了再回到参数调整上。TX 预加重和 RX 均衡参数可以在 IBERT 里实时改边改边看眼图。注意 RX 均衡参数不要一下子拉满拉满虽然眼图张开但噪声也会放大误码率可能反而变差。调到一个中间档位让眼图的横纵两个方向都比较平衡才是最佳状态。踩过这一圈坑之后我的体会是VU190 这块板卡和大多数高性能 FPGA 板卡一样最难的不是逻辑设计而是硬件和软件的协同验证。从电源树规划到 IBERT 参数微调每一步都在和 PCB 上的物理特性打交道。如果你手上正好在评估类似的 UltraScale 平台建议先花时间把电源、时钟、配置这三件事彻底验证清楚再开始跑业务逻辑。否则后面每调一次问题都会发现根源早在这些基础环节里埋下了。最后再分享一个小技巧调试 GTY 相关问题时在 Vivado 里打开 IBERT 的 eye scan 时把扫描步进调小一点数据量确实大点但眼图的细节会清楚很多对判断问题来源非常有帮助。
返回列表