多个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),噪声大了直接通信中断。
最后怼眼图:用高速示波器看信号完整性,调整终端匹配电阻。