大猪蹄子的个人博客

大猪蹄子

【技术 FPGA-5】调试FPGA网口(UDP)常见问题

2026 / 8 / 12

简介

当你想要手搓FPGA UDP的时候,建议看完UDP数据结构后,看一下下面可能会遇到的坑。

  • 测试环境:Xilinx XC7A50T开发板(猪蹄板 XI050CD)

  • 测试接口:RGMII(GMII会简单一步接口转换)

  • 测试内容:ARP、ICMP(Ping通)、用户数据回环

常见问题

1-一次完整的PC端数据收发流程是什么?

假设板子已经跑起来回环例程了,第一次打开调试助手

  1. 选择指定的网口(如果你有两三个网口+WIFI的话,或者FPGA和PC直连就选直连那个)

  2. 输入PC端的通信端口、FPGA的IP地址和通信端口(这个一般会在代码里写死,支持动态的不多)

  3. 输入一个任意长度数据,点击发送(数据框显示 几点几分几秒:TX XXX

    • PC向指定IP发送ARP包(Who has 192.xx.xx.xx?TMD把你的MAC发过来

    • FPGA响应ARP包(你爷爷在此

    • PC发送UDP数据包(拿着!

    • FPGA回UDP数据包(拿着!

  4. 数据框显示 几点几分几秒:RX XXX

  5. 再次点击发送数据,不再有ARP过程

2-为什么PC向FPGA第一次发数据需要ARP?ARP到底有什么用?

网络通信需要三个东西,IP地址、MAC地址和端口号。

  1. 端口号(16位)基本是指定的。比如A应用就是通过100端口收发数据,B应用通过200端口。A设备A应用要访问B设备的B应用就一定是通过A设备的100端口对接B设备的200端口。

  2. IP地址是当前设备在当前网络下的临时身份证。注意条件、当前(明天可能IP就变了)、当前设备(换个设备插进来IP可能也不一样)、当前网络(插别的路由器可能就分到另一个IP了)。

  3. MAC地址(64位)是全球唯一编码,也是区分设备的最重要的手段,经常IP变了MAC没变。像电脑网卡的MAC都是写死不可更改的,那些打游戏封号的也有封MAC的先例——当然对于FPGA来说,你想写啥MAC都行,网卡PHY只负责收发数据,MAC\IP\TCP\UDP它都不知道传的啥。

理论上可以通过MAC来作为设备标识通信,但是这样并不好区分网段——所以一般用IP来访问设备,可以清晰白表示要访问哪一个网段的哪个设备。问题就在于新设备接入后,你在A设备看得到A的IP,你在B设备也看得到B的IP,但是A\B之间互相不知道,当A第一次发起通信时,首先会发个ARP包(在Wireshark里会看到一个Who has 192.168.1.100?这种),然后B回复这个ARP包。

  1. 发送的ARP包包含A的IP、要使用的端口和MAC,B的IP、要使用的端口

  2. 回复的ARP包包含A的IP、要使用的端口和MAC,B的IP、要使用的端口和MAC

这样AB会保存这个ARP信息(在Windows里可以在CMD里打arp -a查询),然后才能正常收发数据(包括Ping)。也就是说,如果没有ARP,你不管发什么指令、数据,在Wireshark里都看不到,只会看到一堆ARP。

3-FPGA向PC发数据不需要ARP?

一般在FPGA代码里直接写死了目的IP、MAC、端口号,直接发就完了。电脑又不能这么干,人家要走正规流程的。当然有些FPGA代码的目的IP、MAC、端口号也会跟着ARP更改,谁来ARP FPGA,FPGA就跟谁通信。

4-你的意思如果我只需要FPGA向PC发UDP数据,其实很简单?

是的,写死IP MAC和端口号后,直接发就完了。

5-那这个ICMP又是干嘛的?

准确来说ICMP有好几个测试项目,Ping只是其中最常见的一种。当你没有对应上位机或者怀疑上位机读写有问题的时候,直接在CMD ping一下FPGA的IP,通了,说明基本是没啥问题的——接下来压力给到开发上位机的人。

6-为什么开着Wireshark能通讯成功,关了就不行了?

Wireshark能改变网卡接收数据的某些行为,比如本应该丢弃数据错误的包,但是Wireshark能给你抓回来,这个时候你的上位机就收到了,常见的错误如下:

  1. Wireshark提示的各种错误(比如数据长度和包头不对、类型不对等)

  2. Wireshark不提示,可能Checksum错了(这个在Wireshark里是Disabled的,网卡给你丢了,软件又给你捞回来了

  3. Wireshark不提示,可能FCS错了(FCS是最底层的校验,他不会出现在Wireshark可显示范围里,需要在FPGA那儿采集原始数据+FCS丢给GPT AI分析一下就知道错了

  4. Wireshark不提示,可能数据长度不够(以太网帧要求最小60个字符(包含包头,对应数据部分不低于18字节),虽然你能看到发出去42个字符的帧,但是这个帧经过网卡会自动补0,这一点可以通过在FPGA采集相同帧验证;然后FPGA发回来的帧补0又不会过滤掉,就会形成发出去42个字节的帧,回来60个字节的帧,然后上位机还是显示42字节对应帧,不会显示补0。因为包头里有实际数据长度,补0自动忽略了)

7-FPGA和PC直连测试,需要把WIFI等其他网口关了吗?

不需要,因为IP有网段限制,都不处在同一个圈子,测试数据(ARP、Ping等)只会从直连网口发出去。这个你要去搜子网掩码和IP的关系

8-FPGA和PC直连测试,需要网关\DNS吗?

不需要填,填了它还要老是去ARP网关,不填就干净多了;DNS只在访问外网有用,这就填个通用8888就行

9-Wireshark有好多不相关数据怎么办?

你需要知道一个东西叫过滤规则,比如udp.port == 900,这样Wireshark就只会显示UDP包,且端口号为900的(不过这样你就看不到ARP和ICMP的包了)。比如ip.addr == 192.168.1.100,这样Wireshark就只会显示指定IP的收发包了

版本更新

260812:初始版本