ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Vivado实战:BR3109国产芯片JESD204B链路调试与多通道同步

Vivado实战:BR3109国产芯片JESD204B链路调试与多通道同步 1. 为什么要在 Vivado 里啃 JESD204B 这块硬骨头如果你手头有一块 FPGA 开发板上面焊了一颗国产的 BR3109 芯片而项目又要求你把高速 ADC 或者 DAC 的数据通过 JESD204B 协议跟 FPGA 对接起来那你大概率已经体会过那种“资料少、坑多、调试全靠猜”的滋味了。BR3109 是一颗国产的高速数据转换器配套芯片支持 JESD204B 子类 1 的确定性延迟机制常见于雷达、医疗成像、无线基础设施这类对多通道同步要求极高的场景。而 JESD204B 本身说白了就是一条高速串行链路协议用 SerDes 代替传统的并行 LVDS 走线把数据从转换器搬到 FPGA 里或者反过来。我之所以想把这套东西从零到实战地写一遍是因为网上关于 JESD204B 的资料要么停留在协议层讲 8B/10B 编码和链路建立状态机要么就是 Xilinx 官方 PG066 那种手册式的平铺直叙真正把“国产芯片 Vivado 收发链路”串起来、告诉你每一步为什么这么做的内容少得可怜。这篇博文面向的是有一定 FPGA 基础、但没怎么碰过 JESD204B 的工程师或者正在用 BR3109 做项目的同行。我会从 IP 核的选型与配置讲起一路走到收发链路的仿真、上板调试和常见报错处理尽量把每个参数背后的逻辑说清楚让你看完能直接抄作业也能明白为什么这么抄。需要提前说明的是JESD204B 的调试极度依赖硬件环境我下面给出的参数和步骤是基于常见的 4 通道、子类 1、线速率 5Gbps 左右的配置来展开的你实际项目里的 Lane 数、线速率、参考时钟频率可能不同但思路和排查方法是可以迁移的。2. BR3109 与 JESD204B 的链路角色拆解2.1 BR3109 在链路里到底扮演什么角色BR3109 在 JESD204B 链路中通常作为转换器端的 JESD204B 发射器或者接收器。如果它是一颗 ADC 配套芯片那它就是把采样数据打包成 JESD204B 帧通过 SerDes Lane 发给 FPGA如果它配合 DAC 使用那就是反过来接收 FPGA 发来的数据。不管是哪个方向FPGA 这边都需要例化 Xilinx 的 JESD204 IP 核配置成对应的发送或者接收模式。这里有个容易混淆的点很多人以为 JESD204B 就是一个单纯的串行协议配好 IP 就能通。实际上它是一整套链路层机制包括代码组同步、初始通道对齐、帧对齐、多帧对齐这几个阶段每个阶段都有对应的状态机和错误标志。BR3109 作为链路的一端它的寄存器配置决定了链路参数比如 LLane 数量、M转换器数量、F每帧字节数、K每多帧的帧数、S每帧每转换器的采样数。这些参数必须和 FPGA 侧 IP 核的配置完全一致差一个数字链路就起不来。2.2 子类 1 的确定性延迟为什么重要JESD204B 有三个子类子类 0 不支持确定性延迟子类 1 用 SYSREF 信号实现确定性延迟子类 2 用 SYNC 信号实现。BR3109 一般支持子类 1这也是多通道同步采集场景里最常用的。确定性延迟的意思是从转换器采样到 FPGA 收到数据这个延迟是固定且可重复的不会因为每次上电或者链路重建立而变化。对于相控阵雷达或者多通道示波器这类应用通道间的 skew 必须可控否则波束成形或者通道对齐就无从谈起。实现子类 1 的关键在于 SYSREF 信号。SYSREF 是一个低频的参考脉冲它和器件时钟同源用来对齐链路各端的本地多帧时钟。FPGA 侧需要把 SYSREF 捕获进来经过内部逻辑产生 LMFC本地多帧时钟然后链路状态机根据 LMFC 的相位来决定什么时候发送或者接收数据。如果 SYSREF 的时序没处理好比如建立保持时间不够链路就会间歇性报错而且这种错误往往很难复现调试起来非常头疼。2.3 FPGA 侧 IP 核的选型逻辑在 Vivado 里JESD204 相关的 IP 核主要有两个来源一个是 Xilinx 官方的 JESD204 IPPG066另一个是 JESD204 PHYPG198。前者负责链路层和传输层后者负责物理层的 SerDes 配置。对于 BR3109 这种国产芯片只要它的 SerDes 电气特性兼容 Xilinx GT 的收发器标准就可以用这套 IP 组合。选型的时候要注意版本匹配。Vivado 不同版本里 JESD204 IP 的界面和参数略有差异我建议用 2020.2 之后的版本因为早期版本对子类 1 的 SYSREF 处理有些已知问题。另外JESD204 PHY IP 需要和 GT 收发器配合使用如果你的 FPGA 型号里 GT 通道数量不够或者 BR3109 的 Lane 速率超过了 GT 的支持范围那就得考虑换 FPGA 或者降低线速率。3. Vivado 工程搭建与 IP 核参数配置实战3.1 工程创建与器件选型打开 Vivado新建工程器件选你实际使用的 FPGA 型号。这里假设你用的是 Xilinx Kintex-7 或者 Zynq-7000 系列因为这两类器件在国产化项目里比较常见GTX 收发器也足够支撑 5Gbps 左右的线速率。工程创建好之后先别急着加 IP把 BR3109 的 datasheet 和寄存器手册翻出来确认几个关键参数Lane 数、线速率、参考时钟频率、SYSREF 频率、以及链路参数 L/M/F/K/S。我一般会先在纸上画一个链路参数表把转换器端和 FPGA 端的参数一一对应写清楚然后再去配 IP。这样做的好处是配 IP 的时候不会因为记混了某个参数而反复返工。3.2 JESD204 PHY IP 的配置要点先例化 JESD204 PHY IP。在 IP Catalog 里搜 “JESD204 PHY”双击打开配置界面。第一页是 “Configuration”这里要选 “Include Shared Logic in core” 还是 “Include Shared Logic in example design”。如果你是自己搭工程建议选 “Include Shared Logic in core”这样 GT 的共享逻辑比如 QPLL、CPLL会集成在 IP 里省得你手动去连。接下来是 Lane 数和线速率。Lane 数填 BR3109 实际使用的 Lane 数量比如 4。线速率填你计算好的值比如 5.0 Gbps。参考时钟频率要和你板上实际供给 GT 的时钟一致常见的是 125MHz 或者 156.25MHz。这里有个细节JESD204 PHY 的参考时钟和 SYSREF 是分开的SYSREF 一般走普通 IO 或者 GT 的专用时钟引脚配置的时候别搞混。3.3 JESD204 IP 核的链路参数填写再例化 JESD204 IP。这个 IP 的配置界面参数比较多我挑几个最容易出错的讲。首先是 “Subclass” 选 1“Lane” 数填 4“M” 填转换器数量比如 2“F” 填每帧字节数比如 2“K” 填每多帧帧数比如 32“S” 填每帧每转换器采样数比如 1。这些参数必须和 BR3109 寄存器里的值完全一致否则链路状态机会卡在某个阶段不动。还有一个 “Scrambler” 选项BR3109 一般支持扰码建议开启因为扰码可以改善频谱特性减少 EMI。但要注意如果转换器端没开扰码FPGA 端开了那链路肯定通不了。所以配之前一定要确认 BR3109 的寄存器默认值或者你写入的值。3.4 时钟架构与 SYSREF 捕获逻辑JESD204B 子类 1 的时钟架构是整个工程里最绕的部分。简单来说你需要一个器件时钟给 GT 的参考时钟一个 SYSREF 信号给链路状态机做多帧对齐。SYSREF 的频率通常是 LMFC 频率的整数倍而 LMFC 频率等于线速率除以 10 再除以 (FK)具体公式是LMFC LaneRate / 40 / (FK)。比如线速率 5GbpsF2K32那 LMFC 5e9 / 40 / 64 1.953125 MHz。SYSREF 一般取 LMFC 的 1 倍或者 2 倍。在 FPGA 里SYSREF 需要通过一个专门的捕获逻辑来采样通常是用器件时钟去采 SYSREF然后产生一个内部的 LMFC 复位信号。Xilinx 的 JESD204 IP 里有一个 “SYSREF Capture” 模块你可以直接用也可以自己写一段逻辑。我建议用 IP 自带的因为它的时序约束已经帮你处理好了自己写容易在跨时钟域上翻车。4. 收发链路的仿真验证与上板调试4.1 用 Example Design 快速跑通仿真IP 配好之后别急着生成比特流。右键 JESD204 IP选 “Open IP Example Design”Vivado 会自动生成一个包含测试激励的仿真工程。这个 Example Design 里有一个 BR3109 的行为模型如果你没有官方模型可以用 IP 自带的 JESD204 对端模型代替它会模拟链路建立的过程。跑一遍仿真看波形里 “sync” 信号是否拉高“rx_tvalid” 是否在链路建立后开始输出数据。仿真的时候重点关注几个信号sync、rx_sync、rx_tvalid、rx_data。如果sync一直不拉高说明代码组同步没成功可能是线速率或者参考时钟配错了。如果sync拉高了但rx_tvalid不输出那可能是帧对齐或者多帧对齐阶段出了问题需要检查 F、K、S 这些参数。4.2 上板前的引脚约束与时序检查仿真跑通之后开始上板。先把 GT 的引脚约束写好包括参考时钟引脚、SYSREF 引脚、以及 SerDes 的收发差分对。GT 的引脚位置在 FPGA 的 bank 里是固定的不能随便分配必须查你板子的原理图。SYSREF 如果走普通 IO要注意它的电平标准一般是 LVDS 或者 LVCMOS取决于 BR3109 的输出类型。时序约束方面最重要的是 SYSREF 的输入延迟约束。你需要告诉 VivadoSYSREF 相对于器件时钟的建立保持时间是多少。这个值可以从 BR3109 的 datasheet 里查到一般是几百皮秒。如果约束写得太松Vivado 可能不会去优化这条路径上板后 SYSREF 采样就会出错。4.3 上板调试从 SYNC 信号开始排查上板之后先别急着看数据。用 ILA集成逻辑分析仪抓几个关键信号sync、rx_sync、rx_tvalid、rx_data还有 GT 的tx_reset_done和rx_reset_done。如果tx_reset_done和rx_reset_done都是高说明 GT 的复位完成了。然后看sync如果sync一直是低说明 FPGA 在向 BR3109 请求同步但 BR3109 没响应。这时候要检查 BR3109 的寄存器配置确认它的 JESD204B 发射器已经使能并且链路参数和 FPGA 侧一致。如果sync拉高了但rx_tvalid不输出那就要看rx_sync的状态。rx_sync是 FPGA 内部的状态机信号它拉高表示链路已经进入数据阶段。如果rx_sync拉高了但rx_tvalid还是低可能是数据缓冲或者时钟域 crossing 出了问题需要检查 IP 的 FIFO 配置。4.4 常见报错与 DRC 警告的处理Vivado 在实现阶段经常会报一些 DRC 警告比如 “RTSTAT-2” 这种。这个警告通常和 GT 的复位或者时钟有关不一定是致命错误但最好查一下。如果是 “Implement Design 变红”先看 Critical Warning 里有没有 “unconstrained path” 或者 “no clock” 之类的提示。JESD204 工程里最常见的时序问题是 SYSREF 路径没约束或者 GT 的参考时钟没接对。还有一个坑是 “Vivado 生成比特流失败”报错信息可能是 “DRC RTSTAT-2” 或者 “GT 未复位”。这时候先检查 GT 的复位逻辑确保tx_reset_done和rx_reset_done在 ILA 里能看到拉高。如果 GT 复位一直不完成可能是参考时钟没进来或者 QPLL 没锁定。用 ILA 抓一下qpll_lock信号如果它是低说明参考时钟有问题。5. 链路稳定性优化与多通道同步经验5.1 SYSREF 时序余量的实测调整链路能通不代表稳定。我遇到过好几次仿真和上板初期都正常但跑几个小时之后偶尔报错。后来用示波器量 SYSREF 和器件时钟的相位关系发现 SYSREF 的建立时间余量只有几十皮秒温度一变就漂了。解决办法是在 FPGA 侧加一个 IDELAY 或者调整 PCB 上的走线长度把 SYSREF 的采样点挪到时钟周期的中间。具体操作是在 Vivado 里给 SYSREF 输入加一个IDELAYCTRL和IDELAYE2然后通过 ILA 或者 VIO 动态调整延迟值观察链路错误计数器。当错误计数器降到零并且稳定时记下这个延迟值固化到约束里。这个过程有点像调 DDR 的读写延迟需要耐心试。5.2 多通道同步的 LMFC 对齐检查如果你的项目里有多颗 BR3109 或者多个 JESD204B 链路那 LMFC 的对齐就至关重要。所有链路的 LMFC 必须同相否则通道间的采样数据会有固定的 skew。检查方法是在 FPGA 里把每个链路的 LMFC 信号引到 ILA看它们的上升沿是否对齐。如果不对齐说明 SYSREF 到各个链路的延迟不一致需要分别调整。Xilinx 的 JESD204 IP 支持多链路同步配置的时候要选 “Multi-Link” 模式并且确保所有链路的 SYSREF 来自同一个源。如果 BR3109 支持 SYSREF 级联输出那就把第一颗的 SYSREF 输出接到第二颗的输入这样能保证所有芯片看到同一个 SYSREF 脉冲。5.3 数据吞吐量与实际采样率的匹配JESD204B 的线速率决定了链路能承载的最大数据吞吐量。计算公式是吞吐量 LaneRate * L * 8 / 10因为 8B/10B 编码有 20% 的开销。比如 4 Lane、5Gbps吞吐量就是 5e9 * 4 * 0.8 16 Gbps。然后你要算实际需要的吞吐量采样率 * 分辨率 * 通道数。如果实际需求接近或者超过链路容量那就得提高线速率或者增加 Lane 数。我见过有人把线速率设得很高但 BR3109 的 SerDes 根本跑不到那个速率结果链路时通时断。所以配参数之前一定要查 BR3109 的 SerDes 最大速率留 10% 到 20% 的余量。5.4 调试工具链的搭配使用除了 ILAVivado 里的 VIO虚拟 IO也非常有用。你可以用 VIO 动态修改 BR3109 的寄存器值比如调整 SYSREF 延迟、切换扰码开关、复位链路状态机而不用重新生成比特流。这样调试效率会高很多。另外如果板子上有 SPI 或者 I2C 接口连到 BR3109可以用 Vivado 的 ILA 抓 SPI 时序确认寄存器写入是否正确。还有一个小技巧在 JESD204 IP 里有一个错误计数器可以统计链路建立过程中的错误帧数。把这个计数器引到 ILA上板后观察它的变化。如果计数器在链路稳定后还在涨说明链路有间歇性错误需要回头检查 SYSREF 或者电源噪声。6. 我个人在 BR3109 项目里踩过的几个坑第一个坑是 SYSREF 的电平标准。BR3109 的 SYSREF 输出是 LVDS但我在 FPGA 侧约束成了 LVCMOS结果链路死活起不来。后来用示波器一量发现 FPGA 收到的 SYSREF 幅度只有几百毫伏根本达不到 LVCMOS 的阈值。改成 LVDS 输入之后链路一次就通了。所以引脚约束里的电平标准一定要和转换器端严格匹配。第二个坑是 GT 的参考时钟。我一开始用了一个 125MHz 的普通时钟给 GT 做参考结果 QPLL 一直不锁定。后来查手册才发现GT 的参考时钟必须走专用的时钟引脚而且 jitter 要足够低。换到专用时钟引脚之后QPLL 立刻就锁了。这个坑让我明白高速 SerDes 的参考时钟不能随便找个时钟源凑合。第三个坑是链路参数里的 K 值。我一开始把 K 设成了 16但 BR3109 的默认值是 32结果链路能建立但数据错位。后来把 K 改成 32数据就对了。K 值决定了多帧的长度它影响 LMFC 的频率和链路状态机的对齐周期必须和转换器端一致。第四个坑是 Vivado 的版本兼容性。我用 2019.1 的 JESD204 IP 配好之后换到 2020.2 打开工程IP 自动升级了但升级后的参数和原来不完全一样导致链路又不通了。后来我干脆锁定 Vivado 版本不轻易升级。如果非要升级升级后一定要重新检查 IP 的每个参数。7. 后续可以继续深挖的方向这套链路跑通之后其实还有很多可以优化的地方。比如你可以把 JESD204B 的数据直接接到 FFT IP 核做频谱分析或者接到 DDR 控制器做高速存储。如果项目里有多块 FPGA还可以用 Aurora 8B/10B 协议做板间互联把 JESD204B 采集到的数据转发出去。另外BR3109 的寄存器配置可以通过 MicroBlaze 软核来管理这样上电初始化就不用依赖外部 SPI 主机了。我在实际项目里还遇到过一种情况BR3109 的 SYSREF 和 FPGA 的 SYSREF 不同源导致每次上电的确定性延迟都不一样。后来加了一个时钟分配芯片把同一个 SYSREF 分给两边问题才解决。所以如果你的项目对确定性延迟要求很高时钟树的设计一定要提前规划好别等到上板才发现问题。
返回列表