> 技术文档 > 多个FPGA之间如何实现通信_两个fpga之间如何进行以太网通讯

多个FPGA之间如何实现通信_两个fpga之间如何进行以太网通讯


通信方案

1. GPIO

适用场景:传输几个控制信号(比如状态机握手)。

操作指南:

分配两片FPGA的普通IO引脚直连,上拉电阻防浮空。

写个心跳包协议,每秒发个0x55确认对方活着。

// FPGA1发送端  always @(posedge clk_50m) begin      if (cnt == 49_999_999) begin  // 1秒计时          tx_data <= 8\'h55;          cnt <= 0;      end else begin          cnt <= cnt + 1;      end  end  

注意事项:超过10MHz大概率时序违例,记得在Vivado里 set_max_delay -datapath_only 约束跨FPGA路径

2. LVDS差分对

适用场景:传输百兆级数据流(比如摄像头Raw Data)。

核心操作:

启用FPGA的差分IO(如Xilinx的OBUFDS原语)。

自定义串并转换协议,比如16bit数据+1bit校验位,用LVDS传。

技巧:PCB走线必须等长+阻抗匹配,差分对误差控制在5mil以内,否则眼图裂开。

3. GTX高速收发器组网

适用场景:激光雷达点云、4K视频流等Gbps级传输。

核心配置:调用Xilinx的Aurora 64B/66B IP核,绑定GTX Quad。配置CRC校验+通道绑定(Channel Bonding),抗干扰能力拉满,适用于多对一场景。如果需要片间互联建议使用SRIO,SRIO更适用于这一场景

同步难题

1. PLL全局时钟

用同一颗晶振给多片FPGA提供参考时钟,通过PLL生成同源时钟。

致命细节:晶振到各FPGA的走线长度差必须小于1/6波长(比如100MHz时钟走线差<5cm)

2. 异步(用FIFO)

在跨FPGA接口处塞异步FIFO,比如Xilinx的FIFO。

参数设置:写时钟用FPGA1的clk_tx,读时钟用FPGA2的clk_rx,深度至少64。

注意事项:如果两时钟频率差超过5%,FIFO会溢出或读空,建议用 almost_full 信号反压。

调试方法

1. 逐步测试

先单独验证每片FPGA的基础功能(比如FPGA1发0xAA,FPGA2收到后点亮LED)。

用Vivado ILA同时抓取两片FPGA的信号,通过JTAG链触发同步(需要两个调试器)。

2. 调参优先级

先调通低速模式(比如10MHz),再逐步提频。

优先保证电源纹波(<50mV),噪声大了直接通信中断。

最后怼眼图:用高速示波器看信号完整性,调整终端匹配电阻。