ARTICLE DETAIL

资讯详情

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

国产FPGA JFM7VX690T80实现8通道光纤采集与GTX绑定实战

国产FPGA JFM7VX690T80实现8通道光纤采集与GTX绑定实战 1. 为什么选JFM7VX690T80来做8通道光纤采集1.1 这颗芯片到底适合什么场景复旦微JFM7VX690T80属于国产FPGA里定位比较高的一档逻辑资源、DSP Slice和高速收发器数量都够撑起中等规模的数据采集与预处理系统。我最初接触这颗芯片是因为一个光纤传感项目前端有8路光纤通道每路需要做ADC采样、数据打包、缓存和上传后端还要跟主机做高速数据交互。当时评估过几款方案最后选它主要看中三点一是GTX收发器数量足够8通道并行采集时每路都能分到独立的收发资源不用做时分复用二是逻辑单元规模在690T这个量级跑多通道FIFO加仲裁逻辑不会太紧张三是FMC接口的引脚分布比较规整方便做子卡扩展。很多人一上来就问“这颗芯片性能怎么样”其实更该问的是“我的数据吞吐量和通道数需不需要它”。8通道光纤采集如果每通道线速率在3.125Gbps左右8路加起来就是25Gbps的原始数据量这个量级用低端FPGA根本扛不住。JFM7VX690T80的GTX支持到10Gbps以上留了足够的余量而且它的BRAM资源做乒乓缓存很宽裕这是选型的核心逻辑。1.2 8通道光纤平台的整体数据流整个平台的数据流可以拆成四段光纤前端接收、GTX解串、通道级预处理、汇总上传。光纤通道进来的串行数据先经过GTX的CDR恢复时钟然后做8b/10b解码如果协议用了的话接着进入每个通道独立的FIFO做跨时钟域处理。8个通道的数据在仲裁模块里做轮询或者优先级调度合并成一路数据流写入DDR3缓存最后由PCIe或者以太网上传。这里有个容易忽略的点8通道并行时跨时钟域处理是最大的坑。每个GTX恢复出来的时钟都是独立的如果直接用一个全局时钟去采亚稳态概率会高得离谱。我的做法是每个通道单独做异步FIFO读写时钟完全隔离FIFO深度至少能扛住一次突发包的长度。实测下来FIFO深度设成2048×32bit时8通道同时突发基本不会溢出。1.3 FMC接口在这个平台里的角色FMCFPGA Mezzanine Card接口在这里承担的是“前端模拟与光模块的物理连接”任务。标准FMC有400个引脚包含高速差分对、单端IO和电源。8通道光纤平台一般用FMC子卡来放光模块和ADC主卡只负责FPGA和存储。这样设计的好处是子卡可以换今天做光纤采集明天换成AD采集主卡不用动。但FMC的引脚分配有讲究。高速差分对必须走GTX的专用引脚不能随便映射到普通IO。JFM7VX690T80的GTX Bank分布在芯片的特定区域画PCB时要把FMC的DP对和这些Bank对齐。我见过有人把FMC差分对接到普通LVDS IO上结果速率上不去还以为是芯片问题其实是引脚选错了。2. 硬件搭建阶段从原理图到上电检查2.1 电源树设计与上电时序JFM7VX690T80的电源需求比一般FPGA复杂核心电压、辅助电压、DDR电压、GTX的模拟电压各有各的要求。核心电压一般是0.9V或1.0V具体看速度等级GTX的模拟电压对纹波特别敏感纹波超过30mV就可能出现误码。我的经验是GTX的电源单独用一颗LDO供不要跟数字电源共用DCDC否则开关噪声会直接耦合到收发器上。上电时序也不能乱。一般要求核心电压先上IO电压后上GTX的模拟电压最后上。如果顺序反了可能出现IO先有电、核心还没起来的情况芯片内部会有大电流。我习惯在电源树上加一个时序控制芯片或者用FPGA的电源管理引脚做级联使能。上电后用示波器逐路量电压和纹波确认没问题再插子卡。2.2 FMC连接器的焊接与检查FMC连接器是细间距的手工焊接难度不小。我建议用回流焊如果非要手工焊一定要用放大镜逐脚检查。虚焊在FMC上特别隐蔽因为很多引脚在连接器内侧肉眼看不到。上电前用万用表量一下相邻引脚有没有短路特别是电源脚和地脚之间。还有一个细节FMC的DP对在PCB上要走等长误差控制在5mil以内。如果不等长高速信号的眼图会变差误码率上升。我一般会在Layout阶段就让PCB工程师把FMC区域单独标出来走线规则单独设。2.3 时钟方案参考时钟与系统时钟8通道光纤平台至少需要两类时钟GTX的参考时钟和系统逻辑时钟。GTX参考时钟一般由外部晶振提供频率根据线速率来定比如3.125Gbps对应125MHz。参考时钟的抖动要求很严普通晶振不行要用低抖动的差分晶振。系统时钟可以用另一颗晶振频率低一些比如50MHz或100MHz给逻辑和DDR用。我踩过一个坑GTX参考时钟走线太长而且靠近DCDC电感结果误码率一直下不来。后来把晶振挪到FPGA旁边走线控制在500mil以内问题就解决了。所以时钟走线要短、要远离干扰源这是硬规矩。3. GTX收发器配置与8通道绑定3.1 GTX IP核的关键参数设置在Vivado里配置GTX IP核时有几个参数必须跟硬件对上。线速率、参考时钟频率、编码方式、均衡器设置这四个错了任何一个链路都起不来。线速率根据光模块的规格来比如SFP一般是10.3125Gbps但很多光纤传感用的是3.125Gbps。参考时钟频率要跟板上晶振一致这个不能猜要看原理图。均衡器设置容易被忽略。短距离背板通信可以关掉均衡但光纤链路一般要开DFE或LPM。我一般先按默认值跑如果误码率高再调。TX预加重和RX均衡是配合使用的调的时候要两边一起看不能只调一边。3.2 8通道绑定的时钟与复位策略8个GTX通道如果要做绑定必须共用一个参考时钟而且复位要同步。如果每个通道独立复位通道间的延迟会不一致绑定就会失败。我的做法是用一个全局复位信号经过同步器后同时给8个通道的复位端口。参考时钟用同一个IBUFDS输出分8路给每个GTX。绑定模式一般用X0Y0作为Master其他通道做Slave。Master通道的时钟会分给Slave所以Master的参考时钟质量最关键。实测下来8通道绑定后通道间偏斜能控制在几个UI以内满足大部分采集协议的要求。3.3 眼图扫描与误码率测试链路调通后一定要做眼图扫描。Vivado的IBERT工具可以直接在FPGA上跑眼图不需要外部仪器。扫描时看眼高和眼宽眼高至少要有100mV眼宽要大于0.3UI。如果眼图闭合先查参考时钟抖动再查PCB走线最后调均衡参数。误码率测试至少跑1e-12时间不够的话跑1e-10也能说明问题。我一般用PRBS31图案跑10分钟以上。如果误码率在1e-9量级说明链路基本可用但还有优化空间如果到1e-6那肯定有问题要逐段排查。4. 光纤数据接收与通道级预处理4.1 光纤协议解析与帧同步光纤进来的数据一般有固定帧头比如0xAA55或者自定义的同步字。帧同步的做法是用移位寄存器不断比对匹配到帧头后启动状态机收数据。这里要注意如果数据里恰好出现跟帧头一样的图案会误同步。解决办法是用更长的同步字或者加校验字段。我一般用32位同步字加一个8位校验误同步概率能降到可忽略。状态机设计成IDLE、SYNC、DATA、CHECK四个状态CHECK状态校验帧尾和CRC不对就回IDLE重新同步。这个逻辑每个通道都要独立跑8个通道就是8个状态机资源消耗不小但JFM7VX690T80的逻辑资源够用。4.2 跨时钟域FIFO的设计细节每个通道的GTX恢复时钟跟系统时钟不同源必须做跨时钟域处理。异步FIFO是最常用的方案但深度和宽度要算清楚。深度取决于突发包的最大长度和两个时钟的频率差。如果恢复时钟是125MHz系统时钟是100MHz频率差25%FIFO深度至少要能扛住一个完整包。我的经验是FIFO深度设成最大包长的2倍留足余量。宽度一般跟数据位宽一致32位或64位。读写指针用格雷码跨时钟域空满标志用组合逻辑生成。这里有个坑空满标志如果直接用二进制指针比较跨时钟域时会出错必须用格雷码。4.3 8通道数据仲裁与缓存策略8个通道的数据要合并成一路仲裁策略有两种轮询和优先级。轮询公平但延迟不确定优先级延迟低但可能饿死低优先级通道。我一般用加权轮询每个通道给一个权重权重根据数据率来定。仲裁器输出一个通道号然后从对应FIFO读数据。缓存用DDR3做乒乓一个Bank写一个Bank读。DDR3的带宽要算够8通道×3.125Gbps25GbpsDDR3如果跑800MHz、位宽32位带宽是25.6Gbps刚好够用但没余量。所以我一般用64位位宽带宽翻倍留出余量给刷新和仲裁开销。5. FMC接口的引脚约束与IO配置5.1 FMC引脚到FPGA Bank的映射规则FMC的DP对必须映射到GTX Bank普通IO映射到HP Bank或HR Bank。JFM7VX690T80的Bank分布要看具体封装不同封装的Bank位置不一样。画原理图时就要确定好哪个FMC引脚接哪个Bank不能等到PCB画完再改。我一般把FMC的LA对普通IO接到HR Bank因为HR Bank支持更宽的电压范围方便接不同电平的子卡。DP对接到GTX Bank注意GTX Bank的参考时钟也要从FMC引过来或者板上单独提供。5.2 约束文件里的时序例外FMC接口的约束要写清楚输入输出延迟。如果子卡上有ADCADC的建立保持时间要写到约束里否则时序可能不满足。我一般用set_input_delay和set_output_delay值根据子卡手册来。如果手册没给就按经验值估然后跑时序报告看余量。跨时钟域路径要设false path或者max delay不能让它按同步路径去分析否则时序永远过不了。异步FIFO的读写指针之间就是典型的false path约束里要明确标出来。5.3 子卡热插拔的防护设计FMC子卡如果支持热插拔IO上要加防护。热插拔时瞬间电流可能很大IO口可能被拉低或过压。我一般会在FMC的电源脚加TVS管IO脚加限流电阻。FPGA的IO如果配置成三态热插拔时先拉高阻等电源稳定后再使能。软件上也要配合检测到子卡插入后先复位GTX和IO等电源稳定再初始化。这个逻辑可以用FPGA内部的电源监测模块实现或者用子卡上的ID引脚判断。6. 系统联调与常见问题排查6.1 链路起不来的排查顺序链路起不来时按这个顺序查先看参考时钟有没有再看GTX的复位有没有释放然后看CDR有没有锁定最后看有没有收到数据。IBERT工具可以看CDR锁定状态和误码率如果CDR不锁说明参考时钟或线速率不对。我遇到过参考时钟频率设错的情况IP核里设的是125MHz板上晶振是100MHz结果CDR一直不锁。改过来就好了。所以IP核参数一定要跟硬件核对不能凭记忆。6.2 数据错乱的典型原因数据错乱一般是帧同步或FIFO的问题。先看帧同步状态机有没有频繁跳转如果频繁跳转说明同步字匹配不可靠。再看FIFO的空满标志如果满标志频繁置起说明读端太慢要加快仲裁或提高系统时钟。还有一个隐蔽的原因GTX的8b/10b解码如果没开但协议用了8b/10b数据会完全错乱。这个要看协议文档不能想当然。6.3 长时间运行的稳定性验证跑通不等于稳定。我一般会做24小时连续运行测试看误码率有没有漂移FIFO有没有溢出DDR有没有出错。如果24小时没问题基本可以交付。如果中间出错要抓错误发生时的状态用ILA抓波形分析。温度也是影响因素。GTX的误码率会随温度变化高温下可能变差。如果产品要在宽温下工作要做高低温测试-40度到85度都要跑一遍。7. 几个让我印象深刻的踩坑记录7.1 参考时钟走线过长导致误码率居高不下第一次做这个平台时GTX参考时钟的晶振放在板子边缘走线将近2000mil。跑IBERT时眼图还行但误码率一直在1e-9下不去。查了很久最后用示波器量参考时钟的相位噪声发现抖动很大。把晶振挪到FPGA旁边走线缩到400mil误码率直接降到1e-13。这个教训是参考时钟的走线长度比什么都重要宁可布局挤一点也要让晶振靠近FPGA。7.2 FMC差分对极性接反的隐蔽故障有一次子卡回来8个通道里有2个死活不通。查了GTX配置、参考时钟、电源都没问题。最后用IBERT看发现这2个通道的CDR能锁但数据全是错的。量PCB发现差分对的正负接反了。GTX的差分对极性可以在IP核里翻转改一下配置就好了。但这个故障很隐蔽因为CDR能锁容易误判为数据逻辑问题。7.3 异步FIFO空满标志的亚稳态问题早期版本里异步FIFO的空满标志偶尔会出错导致数据丢失。查波形发现是空满标志的生成逻辑用了二进制指针直接比较跨时钟域时采到了亚稳态。改成格雷码指针后问题消失。这个坑很经典但新手容易忽略因为仿真时不一定能复现只有上板跑长时间才会暴露。8. 这套平台还能怎么扩展8通道光纤采集跑通后扩展方向有几个。一是提高通道数JFM7VX690T80的GTX数量支持更多通道但仲裁和缓存的压力会线性增长DDR带宽可能成为瓶颈。二是加实时处理比如在FPGA里做FFT或滤波把原始数据先处理再上传减少主机负担。三是换协议把光纤协议从自定义换成Aurora或JESD204B复用现成的IP核开发周期能缩短不少。我个人觉得最有价值的是加实时预处理。8通道原始数据25Gbps主机根本处理不过来如果在FPGA里先做降采样或特征提取上传数据量能降一个数量级。JFM7VX690T80的DSP Slice做FFT绰绰有余这是它比低端FPGA值钱的地方。
返回列表