☰
Vivado实战:BR3109国产芯片JESD204B链路调试与多通道同步
2026/10/6 11:10:23 网站建设 项目流程

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 作为链路的一端,它的寄存器配置决定了链路参数,比如 L(Lane 数量)、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 IP(PG066),另一个是 JESD204 PHY(PG198)。前者负责链路层和传输层,后者负责物理层的 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)。比如线速率 5Gbps,F=2,K=32,那 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 的输入延迟约束。你需要告诉 Vivado,SYSREF 相对于器件时钟的建立保持时间是多少。这个值可以从 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 调试工具链的搭配使用

除了 ILA,Vivado 里的 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 分给两边,问题才解决。所以如果你的项目对确定性延迟要求很高,时钟树的设计一定要提前规划好,别等到上板才发现问题。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询