多 FPGA 之间如何同步与通信?
做高速信号处理、雷达系统、或者大规模 LED 显示屏的朋友应该都遇到过同一个问题一个 FPGA 算力不够得上两个、四个甚至更多。但多片 FPGA 连在一起之后麻烦就来了——时钟怎么对齐数据怎么不丢不重动不动就出现采样错位、数据乱序调试起来头都大了。不堆理论直接说工程上怎么做的、哪些坑最常见、以及什么方案最稳。一、同步问题所有通信的基础多 FPGA 协作同步是第一道坎。如果时钟不同步采样的数据就是错的再好的通信协议也没用。1. 同源时钟 全局布线最理想的情况把所有 FPGA 放在同一块板子上用同一个高精度晶振产生参考时钟再通过时钟 buffer比如 Si5338扇出到每个 FPGA。这样所有芯片的时钟边缘是确定的相位差可测可控。难点在于 PCB 走线等长。如果时钟线长度不一致到达各个 FPGA 的时间就有偏差。高速下比如 200MHz几毫米的差异就能导致采样错误。解决办法是等长走线 动态相位调整每个 FPGA 内部用 IDELAY 或 PLL 细调时钟相位配合训练序列对齐。2. 分布式同步没条件就上协议如果多 FPGA 分布在不同的板卡上比如通过背板或线缆连接无法保证同源时钟那就得用同步协议了。触发式同步主机发一个广播同步脉冲所有从机收到后对齐本地时间计数器。类似于 TDC 或 PPS 秒脉冲的做法。IEEE 1588网络环境下的精确时间协议可以在以太网上实现亚微秒级同步适合分布式采集系统。实际工程中很多团队会偷懒——直接用同步时钟 数据使能线。比如主机给出一路同步时钟和一路帧同步信号所有从机都在帧同步的上升沿开始数据采集或发送。简单粗暴但很有效。二、通信方式不同场景选不同接口同步解决了“什么时候干活”通信解决“数据怎么传”。多 FPGA 之间常用下面几种方式。1. LVDS 并行总线 —— 简单、低成本几个 FPGA 之间用一组 LVDS 差分对传数据比如 8 位数据 1 位时钟 1 位帧同步。速率能做到几百 Mbps协议可以自己定。优点几乎所有 FPGA 都支持不占用高速收发器。缺点线多PCB 布线痛苦速率上不去 Gbps 级别。适合短距离、数据量不大、成本敏感的项目。2. SerDes / GT 收发器 —— 高速王道Xilinx 叫 GTGTP、GTX、GTHIntel 叫 transceiver。一根差分线能跑到 6.25Gbps 甚至更高配上 Aurora 或 SRIO 协议非常方便。AuroraXilinx 自家的轻量协议很简单就能点对点传数据支持流模式和帧模式。我们之前做一个多 FPGA 雷达信号处理四个片子之间就用 Aurora 光纤环网稳定跑了两年。SRIO更复杂支持多对多、DMA、消息传递适合 DSPFPGA 异构系统。需要注意的是高速串行接口要做好链路训练和误码率测试。很多新手以为连上就能通实际经常遇到链路不稳定、偶尔丢包最后发现是参考时钟质量差或者线缆太长。3. PCIe 桥接 —— 适合背板架构如果是插在工控机或者服务器上的多 FPGA 板卡可以通过 PCIe 交换芯片如 PEX8748把所有 FPGA 挂到一个 PCIe 树上。主机 CPU 看到多个设备FPGA 之间也可以通过 DMA 或 Peer-to-Peer 直接传数据。这种方式上位机驱动写起来比较麻烦但一旦调通带宽巨大x8 Gen3 有 8GB/s延迟也低。4. 以太网 / UDP —— 灵活但效率稍低有些场景不想折腾专用接口直接每个 FPGA 带一个千兆或万兆网口通过交换机互联。用 UDP 或者自定义 MAC 帧传输数据。优点是布线简单、距离远、容易扩展。缺点是协议栈开销大延迟不确定以及需要处理丢包重传。不过对于实时性要求不那么严格的数据采集汇总完全够用。三、实际工程中常见的三个坑坑一忽略数据对齐多路并行数据传到另一个 FPGA 时由于走线延迟差异每条线的数据到达时间可能差几个纳秒。解决方法是用源同步时钟 每个 bit 独立 IDELAY 校准或者用 FIFO 加帧同步信号重对齐。坑二多 FPGA 同时访问同一资源造成冲突比如两个 FPGA 都要往同一个 DDR 写数据如果没有仲裁机制数据就会打架。要么设计中避免共享资源要么做集中式仲裁或分时复用。坑三复位不同步多个 FPGA 上电或复位完成的时刻不一样可能导致一方已经发数据另一方还在复位中。解决方法是设计全局复位信号并且每个 FPGA 复位释放后先进行链路握手确认双方就绪再开始正常工作。多 FPGA 同步与通信说到底是时钟、数据、控制三个维度的协作。方案没有绝对的好坏取决于你的带宽要求、距离、成本以及团队熟悉的技术栈。有些人嫌 Aurora 麻烦用 LVDS 也能跑得很稳有些人追求极致性能直接上芯片间 28G 光互连。我们由你创科技的主营业务覆盖两块上位机软件开发和FPGA 开发。也就是说从最底层的 FPGA 逻辑、多芯片同步通信到上层的驱动、数据处理、用户界面我们都能从头做到尾。这些年我们帮客户做过不少这类系统——比如多 FPGA 并行做高速 AD 采集数据汇总后通过 PCIe 或万兆网上抛到上位机上位机再实时显示、存盘、分析也有多 FPGA 协同控制大阵列 LED上位机做内容下发和状态监控。这种项目最大的痛点是FPGA 之间好不容易调通了上位机一跑起来又掉链子——卡顿、丢数、界面假死。我们正好把两头都吃透了所以能一次性把整个链路跑顺。如果你正在搞多 FPGA 协同或者需要一款不拖后腿的上位机软件来配合你的硬件欢迎来聊聊。FPGA 的事、上位机的事我们都能接住。