队伍选了安路EG4做电赛信号采集题,目标100Msps但实测只有30Msps出头,波形还偶尔丢点。队友说国产FPGA高速收发不行要换Xilinx,也有人说是ADC时钟和FPGA采样时钟没做同源设计。想问问做过高速采集的,国产FPGA到底能不能扛这个采样率,还是我们时钟树设计本身就有问题?
2026年电赛用国产安路FPGA做高速ADC采集,采样率上不去是芯片选错了还是时钟方案没设计对?
6 个回答

先说结论:30Msps 这个数,八成不是芯片的锅,是时钟和 CDC 的锅。EG4 这类国产 FPGA 的普通 IO 跑 DDR LVDS 到几百 Mbps 是没问题的,100Msps 的 ADC 数据线(假设 12bit DDR)也就 1.2Gbps 左右的总线带宽,分摊到多对差分对上完全够。真正卡你的通常是三件事:ADC 的采样时钟和 FPGA 内部接收时钟不同源,接收侧用了本地 PLL 去凑一个「差不多」的频率;跨时钟域没做握手或者异步 FIFO,直接打两拍甚至不打拍;还有就是引脚约束里没把输入时钟放到全局时钟网络(BUFG),被工具塞进了普通布线资源。
排查顺序建议这样走:第一步,用示波器或者 FPGA 内部 ILA 抓一下 ADC 输出的 DCO/随路时钟,看它和你的采样时钟是不是同一个源分出来的。如果 ADC 给的是 DCO,那接收必须用它,别自己另起炉灶。第二步,把 DCO 通过 IBUFDS 加 BUFG 进全局时钟,检查综合报告里到底有没有上 BUFG,这一步很多人栽跟头。第三步,数据跨到系统时钟域时用异步 FIFO,别用简单的双触发器同步整条总线。
风险提示一下:如果你们时间只剩一两天,换 Xilinx 反而更危险,板子要重画、约束要重写,来不及。先在现有板子上把时钟链路理顺,大概率能救回来。你们现在 ADC 是并行 LVDS 输出还是串行?这个决定了后面怎么调。

这个问题我想从「先怀疑设计,再怀疑器件」这条线往下捋,因为电赛场景下换芯片的代价实在太大,而时钟方案的问题往往一查一个准。
先说器件能力这件事。安路 EG4 系列里不同型号的 LVDS 速率上限差别挺大,具体能跑多少得翻对应型号的 datasheet 和器件手册里的 IO 电气特性表,一般来说普通 bank 的 LVDS 接收在几百 Mbps 量级,专用高速 bank 会更高。100Msps、12bit 的 ADC,如果走 DDR,单对线 1.2Gbps,通常需要拆成多对并行,或者用串行 LVDS 加解串器。所以第一件事不是问「国产行不行」,而是算清楚你们实际需要多少对线、每对多少速率,再去手册里对号入座。
再说时钟方案。高速采集里最经典的坑就是:ADC 给了一个随路时钟(DCO 或者 FCO),FPGA 这边却用自己晶振分频出来的时钟去采,两个时钟频率标称一样,但相位和抖动完全独立,采着采着就错位,表现就是偶尔丢点、偶尔错位。正确做法是接收侧完全用 ADC 送来的时钟,经过 IBUFDS 进 BUFG,再拿它去驱动 IDDR 或者 ISERDES。
还有一层是跨时钟域。ADC 域的数据要交给系统逻辑处理,中间必须过异步 FIFO 或者握手同步,直接打两拍只适用于单比特控制信号,多比特数据总线打两拍是无效的。
工程上的取舍是这样的:如果确认是 CDC 问题,改代码半天就能见效;如果是时钟没同源,改约束和接线一两天;如果是器件速率真的不够,那才轮到换平台,但那时候你们基本也没时间了。所以优先级很清楚,先软后硬。你们 ADC 输出的到底是 DCO 还是普通数据时钟,这个先确认下?

先别急着换芯片。丢点 + 采样率上不去,典型就是接收时钟没走全局、跨时钟域没同步。查一下 DCO 有没有进 BUFG,数据跨域有没有用异步 FIFO,这两条改完大概率就上去了。

先算一笔账,再决定要不要换板子。100Msps、12bit,如果ADC输出是DDR LVDS,单对差分线的数据率就是100M×2×1 = 200Mbps(12bit拆成若干对的话每对更低);如果ADC是串行LVDS输出,那单对可能就是1.2Gbps甚至更高。这两种情况对FPGA的要求完全不是一个量级。所以第一步不是问国产行不行,而是翻你们ADC的datasheet,看清楚它到底是并行LVDS、串行LVDS还是别的接口,输出几对线、每对多少速率、随路时钟是DCO还是FCO。这一步做完,你才知道瓶颈在哪。
接着是最容易被忽略的一环:时钟树。很多队伍的做法是FPGA本地PLL生成一个「差不多」的采样时钟给ADC,或者ADC自己有时钟但FPGA这边用另一个PLL去凑。这样两个时钟虽然标称频率一样,实际相位关系是漂的,采着采着就丢点,采样率也上不去。正确做法是让ADC的随路时钟(DCO/FCO)进FPGA后先走全局时钟网络(IBUFDS + BUFG/BUFIO),用它来采样数据,而不是用本地PLL硬凑。约束里也要把这对时钟写成create_clock,让工具知道它是真的时钟源。
然后是跨时钟域。ADC数据用DCO采进来,后面要送到系统时钟域做处理,这中间必须有异步FIFO或者握手同步,不能直接打两拍就完事。丢点十有八九出在这里,尤其是FIFO深度不够或者读写指针同步没做好的时候。
排查顺序我建议这样:先用ILA抓DCO和采样时钟的关系,确认同源;再看约束报告里时钟有没有进全局网络;然后查CDC路径有没有被工具报时序违例。这三步走完,大概率能定位到问题。安路EG4具体能跑多快,得看你们用的是哪个型号、哪个bank,手册里的LVDS电气特性表写得很清楚,普通bank和高速bank差别不小,这个只能自己对着型号查。
你们ADC具体是并行输出还是串行输出?这个决定了后面往哪个方向查。

先别换芯片。丢点加采样率上不去,九成是DCO没进BUFG、跨时钟域没做异步FIFO。把这两条改了再测。

我做过类似的事,说个反直觉的点:30Msps这个数字本身可能不是「采不到」,而是「采到了但没存住」。
什么意思呢?就是ADC其实在按100Msps吐数据,但FPGA这边接收逻辑跟不上,FIFO满了溢出,或者CDC同步没做好导致部分数据被吞掉,最后你看到的有效数据率就只有30M出头。这种情况下你换Xilinx也一样丢,因为问题不在器件速率,在数据通路。
怎么验证?用ILA抓ADC的DCO时钟频率,看它是不是真的在跑100MHz。如果DCO是100M而你的有效数据只有30M,那基本可以确定是接收侧的问题。然后再看FIFO的满标志有没有频繁拉高,有的话就是后端处理太慢或者FIFO太浅。
至于安路EG4能不能扛100Msps,这个得看具体型号和接口方式。并行LVDS的话,几百Mbps的速率国产FPGA是能跑的,关键是约束和时钟方案要对。串行LVDS加解串器那种就另说了,得查手册确认SerDes能力。
你们用的ADC是哪个型号?输出接口是什么形式?这个信息很关键。
发表回答
登录后可在本页底部提交回答