ARTICLE DETAIL

资讯详情

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

JESD204B与FPGA:高速ADC/DAC链路设计调试全解析

JESD204B与FPGA:高速ADC/DAC链路设计调试全解析 1. 为什么一上来就绕不开JESD204B身边不少做FPGA的朋友只要一碰到高速ADC或者高速DAC都会遇到同一个协议——JESD204B。我第一次接触这个协议的时候心里其实是抵触的因为串行接口的调试难度比并行LVDS高了一个量级什么对齐、确定性延迟、SYSREF、LMFC一堆术语堆在一起看文档看到劝退。但等到真的啃下来之后回过头看这个协议出现其实是必然的。高速转换器对接口带宽的需求涨得太快传统的并行LVDS接口在高分辨率、高采样率场景下已经撑不住了。举个例子一个14bit、1GSPS的ADC并行LVDS输出需要至少14对差分对如果还要考虑数据同步和时钟引脚数量直接爆炸而且PCB布线难度极大时序收敛也困难。而JESD204B通过高速串行收发器把数据串起来同样的场景往往只需要2到4对高速差分线引脚少、功耗低、布线友好这优势太明显了。这个part.14其实是我这个从近似0基础开始FPGA开发系列里第一个真正意义上牵涉到协议栈的章节。前面的UART、SPI、I2C、DDR4这些本质上都是相对简单的接口JESD204B完全不一样——它是一整套完整的链路协议它把数据从转换器到FPGA之间的传输拆成了物理层、链路层和传输层每一层都有各自的职责。而且实际用起来不只是IP核配置那么轻松还要配合嵌入式侧的初始化流程两者缺一不可。所以这篇文章我打算换一种写法不按照数据手册的顺序来讲而是按照我自己从零到一把JESD204B链路调通的真实路径来讲。先讲清楚链路协议里那些躲不开的关键概念再说IP核之间怎么连接、参数怎么定最后说初始化流程和调试手段。如果你正卡在JESD204B的IP核配置里不知道怎么下手这篇应该能帮你省不少时间。2. 链路层的核心参数先看懂L、M、F这几个字母2.1 链路的基本结构JESD204B链路最基本的结构是发送端和接收端。发送端一般是ADC或者DAC接收端一般是FPGA反过来也有。数据从转换器的采样核心产生之后经过量化、打包、加扰可选、8B/10B编码通过物理层的高速串行lane发出去。接收端做的工作正好相反时钟恢复、解扰、解码、解包最后还原出原始采样数据。协议定义了一组参数来描述这条链路的形状分别是L、M、F、S、N、N和K。逐个说Llane数量也就是高速串行通道的数目。M转换器通道数比如一个双通道的ADCM2。F每一帧里包含的字节数。S每个转换器在每个采样周期发送的样本数。N转换器分辨率也就是有效位数。N加上控制位和填充位之后实际打包进帧的位数。K一组多帧里包含的帧数和LMFC周期直接相关。这些参数不是随便定的它们必须满足一个帧字节数基本关系式每帧的字节数F必须等于所有lane上平均传输的字节数。由于有8B/10B编码帧结构里的每位都要映射到传输bit上。我建议新手学习的时候别一上来就背公式而是应该选一组实际参数走一遍流程。比如最常见的16bit、双通道、2 lane、1 GSPS的ADC配置M2、NN16、L2那么F算出来就是4S等于1也就是每个lane每帧传两个通道各16bit的样本刚好4字节。如果你把F选错后面IP核配置会直接报错。2.2 Lane速率是怎么算出来的Lane速率是JESD204B链路里最基础的一个数值。它的计算逻辑是把所有转换器在单位时间内产生的总比特数按照发送编码效率进行折算再除以lane数量。以我刚才那个例子来说一个14bit 1GSPS的双通道ADC总数据率是14×1G×228Gbps但JESD204B要求N取整到偶数个bit如果N14N通常取16那么实际传输的数据率直接变成16×1G×232Gbps然后8B/10B编码再引入20%的编码开销实际线速率要达到32×1.2540Gbps。如果拆成4条lane每条lane的线速率就是10Gbps。这个数值决定了你要选用什么样的GT收发器等级也决定了参考时钟的频率。如果你用的转换器是确定性延迟模式子类1那线速率还要考虑到SYSREF的采样关系但这不影响线速率的基本计算只是影响时序约束。这里有个新手经常犯的错误直接从转换器分辨率×采样率×通道数去算线速率忽略了N的取整也不同时考虑8B/10B开销结果算出来比实际低20%最后配置出来的IP核根本无法对齐。这一条当年我确实踩过后面在调试部分会详细讲。2.3 什么是LMFC为什么它如此重要LMFC全称是Local Multi-Frame Clock本地多帧时钟它是JESD204B链路里最核心的定时基准。链路的所有关键动作包括对齐、确定性延迟校准、SYSREF采样都是围绕LMFC来做的。LMFC的频率等于线速率除以每个多帧的bit数。每个多帧由K个帧组成每个帧是F个字节每个字节8bit然后8B/10B编码后是10bit所以一个多帧的bit数就是F×K×10。还是拿上面的例子线速率10GbpsF4K32那么多帧bit数是4×32×101280LMFC频率就是10G/12807.8125MHz。为什么必须关注这个频率两个原因确定性延迟要求SYSREF信号必须在LMFC的特定边沿附近被采样如果LMFC频率对应不准SYSREF的建立保持时间永远无法满足。多帧对齐序列ILAS恰好占一个多帧长度接收端的对齐逻辑以LMFC作为边界来判断多帧从哪里开始。所以你可以这样理解LMFC就是整条链路的节拍器。收发两端的LMFC必须频率一致、相位可预测否则谈不上对齐和确定性延迟。我在调试过程中经常反过来用如果链路始终报CECode Error或者无法完成CGSCode Group Sync先检查LMFC对不对再查别的。很多时候就是参考时钟分频比设置错误导致LMFC完全偏离了预期频率。3. IP核拆解三个IP怎么连成一条链路Xilinx官方提供的JESD204B方案不是单个IP核而是一组三个IP核的组合物理层、传输层和链路层。很多新人下载IP的时候都被搞晕了这里我先把三者的分工说清楚。3.1 物理层JESD204 PHY物理层IP负责和GT收发器直接对接它的核心任务是管理高速串行收发器的参数包括线速率、参考时钟、TX极性、RX极性等同时完成接收端的时钟数据恢复CDR配置。它向上给链路层提供恢复出来的并行数据和时钟向下直接驱动GT的TX/RX端口。配置PHY IP时最重要的几个选项是线速率必须和转换器配置的计算结果完全一致。参考时钟频率GT收发器需要特定频率的参考时钟这个频率范围取决于你选的GT系列和线速率。比如常见的GTX收发器在10Gbps以下经常用125MHz或者156.25MHz做参考时钟。收端极性反转PCB布线难免会交叉如果RX端差分对接反了靠这个就可以在IP里直接翻转极性不用改板子重做。数据宽度和字节模式接收端从GT出来的并行数据宽度是设计时锁定的比如32bit或者40bit模式必须保持整个链路一致。PHY IP配置完成后会输出一组状态信号其中PHY管理接口PHY_MANAGEMENT相关的状态位经常被忽略实际上如果PHY层没起来链路层永远不可能完成对齐。调试时先看PHY层是否locked、CDR是否稳定这是第一道关口。3.2 链路层JESD204 TX/RX链路层IP实现JESD204B协议的标准状态机包括代码组同步CGS、初始通道对齐序列ILAS以及正常数据模式。它不关心数据内容是什么只负责把字节流按照协议映射到每一条lane上同时完成所有协议层面的状态流转。链路层IP有几个关键端口用户侧数据接口AXI4-Stream风格TX方向是用户数据进来然后发出去RX方向是数据从协议解出来后交给用户。SYNC端口TX IP输出SYNC信号RX IP输入SYNC信号。同步信号是双向的当接收端准备好时拉低发送端检测到某些条件后启动CGS。SYSREF端口子类1时必须接入SYSREF信号用于确定性延迟。状态输出包括sync状态、链路是否处于数据模式、每个lane的对齐状态等。这是整个协议栈中最容易出错的部分因为每一个IP核的配置都必须与链路参数严格一致。如果F、K或者L设置不对ILAS阶段会永远无法结束状态机卡在某个中间态面板上报一堆错误计数。3.3 传输层数据格式转换的关键传输层在链路层和用户数据之间做格式转换。它负责把转换器的采样数据按协议规定的帧格式打包成链路层需要的样子或者反向解包。Xilinx的JESD204B方案里传输层并没有提供标准IP而是给出了一个参考设计模块你可以在这个基础上修改甚至可以直接自己写。以ADC方向为例链路层最基本的数据单元是字节传输层的工作就是把采样数据比如16bit拆开到特定的lane上并且按照规定好的S、F参数组合成帧。到了DAC方向就是反向操作。这里要注意一个问题传输层设计的核心在于搞清楚哪个字节属于哪个lane的哪个采样这完全取决于你前面定的L、M、F、S参数。参数定错了数据解出来也是错的——但是链路层可能显示完全正常所有对齐都成功输出的数据看起来却乱七八糟。我记得第一次调通链路层之后在ILA里看到RX数据全是对齐字符的时候特别兴奋结果一进数据模式出来的波形完全是花的后来把传输层的字节映射核对了一遍才发现是自己把数据和lane对应关系弄反了。3.4 三个IP的互联与配置流程从实际工程搭建的角度大概的流程是这样的在Vivado里分别例化JESD204 PHY和JESD204 RX或者TX两个IP以及作为可选模块的传输层参考设计。把PHY的TX/RX数据端口和GT收发器连接注意txp/txn和rxp/rxn必须接到GTH/GTY之类的高速收发器原语端口。给PHY IP和链路层IP分别提供一个复位信号这个复位信号应该由嵌入式侧的软件通过GPIO或者AXI_Lite寄存器控制以保证复位时序可控。把PHY IP的RX并行数据接到链路层RX IP的输入同时把RX恢复时钟也一并接到链路层。配置好SYSREF的约束路径确保SYSREF到达所有收发器的延迟都在可接受的窗口内。在同一个工程里PHY IP、链路层IP和传输层模块三者之间的时钟域关系要特别注意。链路层一般采用恢复时钟域而传输层输出给用户逻辑的数据要经过异步FIFO或者使用固定时钟域的跨时钟转换否则会出现偶发性的数据错位。4. 嵌入式初始化SYSREF、寄存器与状态机一步都不能错4.1 初始化流程的总体逻辑JESD204B不能只靠FPGA侧把IP核例化出来就完事嵌入式侧的初始化流程同样关键。由于转换器ADC/DAC与FPGA之间需要精确同步双方必须按照约定的顺序上电和配置。我在实际项目里常用的初始化流程大致如下系统上电先确保所有电源轨正常然后给转换器和FPGA的GT收发器提供参考时钟。嵌入式代码通过SPI或者其他配置接口完成转换器的寄存器配置包括采样率、PLL分频、lane速率、去扰模式、子类配置等。配置完成之后转换器和FPGA同时等待SYSREF脉冲。这里很重要的是SYSREF必须是一个干净的、与LMFC对齐的脉冲不能有毛刺或者不稳定抖动。收到SYSREF之后FPGA侧的链路层状态机会进入到CGS阶段接收端开始检测到连续的K字符后拉高SYNC信号发送端检测到SYNC后开始发送ILAS序列。ILAS完成后进入数据模式。此时FPGA侧可以通过状态信号确认链路已经up然后开始接收有效数据。这套流程看起来很简单但每一步都有细节。4.2 SYSREF为什么要这么严格SYSREF的严格性来自确定性延迟这个目标。JESD204B的子类1要求从ADC采样到FPGA数据接收的整个链路延迟是确定性的也就是说不管系统复位多少次每次上电后数据到达FPGA的时间必须是固定的这样才能保证多通道和多芯片之间的同步。要实现这个目标链路中有一个固定延迟的位置非常关键SYSREF脉冲到达每个器件的时刻必须落在每个器件各自的LMFC边界附近一个特定窗口内。如果SYSREF的上升沿与LMFC上升沿的相对相位不一致那么不同芯片或者不同次上电的链路延迟就会差一个多帧周期。实际工程上处理SYSREF的手段是首先保证SYSREF信号的质量通常用低抖动的时钟缓冲器扇出到每个器件其次在FPGA侧用一条专用的时钟路径把SYSREF送进GT收发器这条路径在Xilinx的工具里往往需要手动约束位置固定、延迟可控最后在软件上通过读取PHY IP的SYSREF捕捉状态寄存器确认每个GT收发器都成功捕捉到了SYSREF。如果这些步骤里任何一步出了问题最常见的现象就是链路第一次上电能正常出数掉电重新上电之后就怎么也对不齐或者多块板卡之间出数的相位不一致。4.3 嵌入式侧状态机的设计要点在FPGA里面JESD204B链路层IP本身有自己的协议状态机但嵌入式侧通常还要外加一个上位控制状态机用于对IP的复位、SYSREF的触发时机、转换器寄存器的写时序做统筹管理。我在实际工程里遇到过不少问题最后都是因为软件侧的复位时序不对导致的。以一个ADC采集项目为例嵌入式侧状态机大致是复位完毕等待基带锁相环锁定确认所有参考时钟稳定。对ADC芯片执行SPI寄存器配置然后读回几个关键寄存器值做校验。把FPGA侧链路层IP的复位信号从高拉低让链路层进入可运行状态。等待一个固定时间比如几个LMFC周期然后发送SYSREF。轮询链路层IP的状态寄存器等待进入数据模式。清除链路层IP的错误计数寄存器开始数据采集。这里有一个容易忽略的点链路层IP的复位和SYSREF之间的关系。如果SYSRFF还没有到来就把链路层从复位中释放链路层IP内部会先进入一个等待SYSREF的状态这个状态本身没问题但是如果你在发送SYSREF前又做了一次复位SYSREF捕捉时机可能会错乱。我的经验是复位和SYSREF的开关全部用寄存器控制并且严格按照先释放复位、再发SYSREF、再读状态的顺序执行整个过程在调试时用ILA把复位信号、SYSREF信号和链路层状态机信号一并抓出来看一目了然。5. 实测里的坑CGS过不去、数据出来是花的5.1 坑一CGS状态永远无法完成CGSCode Group Sync是JESD204B链路层的第一阶段。接收端在这个阶段要连续接收到K28.5字符然后才能认为链路物理层已经同步进而拉高SYNC信号。如果CGS一直完不成后面所有流程全部卡住。这类问题的排查顺序我建议先看物理层再看链路层用ILA观察PHY IP输出的rx_byte_aligned信号如果这个信号一直不拉高说明GT收发器的CDR没有恢复出有效数据问题大概率在线速率配置或者参考时钟上。如果rx_byte_aligned已经拉高但CGS还是过不去看看rx_char_is_k信号是否周期性出现K字符。假如K字符出现频率不对说明F或者K参数与发送端不一致。还有一个常见的原因发送端比如ADC的上电顺序不对比如它的PLL还没锁定就开始发数据导致发出的根本不是合规的K28.5字符。有一次我在实验室调一个ADC采集板CGS就是过不去查了快两天最后发现是ADC的电源时序问题——模拟电源比数字电源晚了大概几十毫秒才稳定PLL始终锁定不了输出全是乱码。换一片芯片没有任何意义先把电源时序改对就好了。5.2 坑二数据模式正常但波形完全是花的这是最让人崩溃的一类问题因为链路层状态机显示一切正常SYNC也是高错误计数也是0但用户侧看到的数据完全不对。第一种原因是传输层映射错误。我之前讲过链路层只负责对齐字节流不负责数据内容解释。如果你的L、M、F、S参数组合和采样数据的实际bit位宽不完全匹配你很可能在每个lane的字节序上出错。比如16bit数据拆成两个字节到底是高字节先发还是低字节先发如果是2个lane偶尔还会遇到数据交织的顺序反了。第二种原因是加扰/解扰没有对齐。JESD204B支持自同步加扰如果发送端开了加扰而接收端没有开链路层对齐依然没有问题但出来的数据完全是打乱的。加扰配置不仅在转换器端要设对FPGA的链路层IP里也要对应设置两边的配置必须一直。第三种原因是字节对齐或字符对齐偏移。8B/10B解码之后接收端还要做字节对齐确定bit流从哪里开始是一个完整的字节。如果GT收发器的字节对齐发生在错误的位置数据内容也会完全不可用——这类错误ILA上的字符不对齐标识有时候会显示出来但有时候也不会要反复核对接收到的初始对齐序列ILAS的字符顺序是否符合预期。5.3 用ILA和寄存器快速定位问题的思路JESD204B链路调试最怕的就是没有抓手。好在我们手上有一个非常强大的工具ILA集成逻辑分析仪。只需要把几根关键的信号拖进ILA问题的定位速度可以大幅提高。我通常会把下面这些信号全部放进ILAPHY IP提供的rx_byte_aligned、rx_comma_det、rx_cdr_stable等物理层状态。链路层IP提供的sync、state_transition之类的状态机信号。错误计数寄存器CECode Error、FCFrame Error等。SYSREF捕捉状态。在排查CGS问题时我会把采样时钟调到LMFC频率的至少4倍以上确保能捕捉到多帧边界的所有动作。在排查数据模式问题时则主要关注ILAS阶段捕捉到的第一个完整多帧对照协议里规定的字符顺序R字符、A字符、配置参数、D字符看是哪一段违背了预期。当你看到ILAS里的参数自己都能一一对应上且数据模式下的数据没有任何突变时这个问题基本上已经解决了八成。5.4 针对JTAG加载和板卡重启的注意事项还有一类容易被忽视的问题来自FPGA的配置加载过程。JTAG加载和SPI Flash加载的时序差异很大。JTAG加载往往比较慢而且加载期间GT收发器的参考时钟可能一直在跑但复位释放瞬间和SYSREF的相对关系很难保证。所以很多项目在调试阶段用JTAG能正常工作的设计烧写到Flash之后反而不行这是SYSREF时刻相对JTAG加载完成时刻的不确定性造成的。解决思路有几个方向如果条件允许尽量让嵌入式侧控制复位释放的时机不依赖FPGA配置完成后的自动复位。一般我们需要通过AXI_Lite寄存器操作IP的复位信号而不是让它上电自由运行。确认GT参考时钟在FPGA配置完成之前就已经稳定。在FPGA配置完成后等待一个固定延迟再发送SYSREF确保链路层IP已经完全就绪。这个坑相当隐蔽尤其是多人协作的项目里硬件工程师可能反复测试发现偶尔性失败最后定位在复位时序上光检查代码很难发现。6. 几个找资料和验证的好方法及初次调试的节奏建议6.1 官网文档和技术手册怎么配合着看JESD204B的学习资料官方文档永远是最权威的。Xilinx的PG0667 Series FPGAs Transceivers Wizard、PG242JESD204 PHY和PG066对应的各代GT文档以及关于JESD204的LogiCORE IP产品指南加起来可能有上千页新人不可能从头到尾读完也不需要。我的建议是反过来读先确定你的设计方案哪个转换器、多少lane、多高速率、哪种模式然后只去文档里查阅和你参数对应的章节。重点看时序图、寄存器定义和状态转移图。例如你用的是子类1就把子类1的完整时序图找出来对着芯片手册里ADC的时序要求逐一核验。另一个很好用的资料源是部分转换器厂商提供的参考设计尤其是ADI的评估板原理图、例程和FPGA工程。这些工程虽然版本可能老旧但JESD204B的链路逻辑十年来变化很小参考价值相当大。我当时就是从ADI的一个参考工程里反向扒清楚了整个初始化时序再移植到自己的设计上。6.2 原型验证平台怎么选如果你是第一次接触JESD204B我强烈不建议直接在定制板卡上调试。定制板卡的布局布线问题、电源问题、时钟质量问题会把这个协议本身的难度放大到难以承受。比较好的路径是先在厂商的评估套件上跑通。比如你先买一片自带JESD204B接口的ADC评估板配合一个成熟的FPGA开发板再把官方参考工程加载进去先别改任何参数直接跑一遍确认链路能起来。这个过程能帮你排除掉大部分我自己的设计和协议本身无关的问题。等评估板的链路跑通之后再迁移到你的目标板上。迁移的时候最容易出差错的是参数不一致比如评估板用的是2 lane 5Gbps你设计的是4 lane 10Gbps这时候最容易粗心大意漏改几个参数最后链路起不来。6.3 初次调试的时间线建议以我的个人经验来看第一次调JESD204B链路完全按照官方评估板的示例跑通可能只需要半天到一天。但是如果要自己在定制板上把链路调稳定做好心理准备一至两周的时间是很正常的。头一天最好只做一件事把PHY IP的参考时钟和线速率调对确认GT收发器的基本收发没有问题。这个阶段你可以借助IBERT集成误码率测试来验证物理层的误码率确保高温高负荷下收发稳定再做协议层。很多人上来就两手抓物理层和链路层最后问题缠在一起反而更难定位。等到物理层稳定之后再做SYSREF和链路层的调试。我的做法是分层确认GT层IBERT- PHY层rx_byte_aligned- CGS - ILAS - 数据模式。每前进一步都记录一张状态截图出现问题时回溯非常快。6.4 关于确定性延迟的最终验证链路调通之后别忘了验证它的确定性延迟。方法很简单反复进行多次完整的初始化流程上电、配置、SYSREF、对齐、数据模式每次记录从用户触发采集到第一笔有效数据的时钟周期数。如果每次的数值都完全相同说明确定性延迟达到要求如果差了一个或多个周期说明SYSREF捕捉或者LMFC相位存在问题。常见的差法有两种一种是差一个多帧周期LMFC这是SYSREF没对齐需要回头查看SYSREF信号质量和约束另一种差一个或少几个采样周期这说明数据在跨时钟域的路径上出现了不确定的等待要检查异步FIFO的复位时机。调试环节里最好把这些多次测量的延迟数据迹线截图存档。后期如果出现零星丢数问题对比这些基准数据会非常有帮助。7. 我的实际体会JESD204B这个协议本身确实不算简单但也没有传说中那么可怕。如果让我总结一个最关键的认知那就是它是分层协议你必须分层理解和调试物理层管好信号质量链路层管好协议状态机传输层管好数据映射嵌入式侧管好操作时序——每一层都有对应的验证手段和排查思路。一旦每一层分开验证整个问题就变得可解。在FPGA开发这个系列里Part.14是我认为很有代表性的一篇因为JESD204B不是一个单一的IP核而是一套完整的体系。它的学习价值不在于你配置了几个IP而在于它强迫你同时理解协议软件栈配置序列和硬件时序SYSREF、LMFC、CDR这种跨层面的思考方式对之后做PCIE、做以太网、做SerDes相关的高速接口都有直接的帮助。最后分享一个调试过程中的小技巧使用模板化的检查清单。每次上板之前把电源、参考时钟、复位信号、SYSREF存在性、GT参考时钟频率、IP核参数与转换器寄存器配置的一致性、ILA待测信号等全部列成清单逐项打勾再上电。我在没有使用清单前大概有一半的调试周期浪费在低级错误上比如参考时钟没接上、IP核某个参数没同步修改、SPI寄存器读写地址抄错。清单看起来笨但它是保证链路调试效率最直接的手段。
返回列表