2026 / 8 / 12
简介
当你想要手搓FPGA UDP的时候,建议看完UDP数据结构后,看一下下面可能会遇到的坑。
测试环境:Xilinx XC7A50T开发板(猪蹄板 XI050CD)
测试接口:RGMII(GMII会简单一步接口转换)
测试内容:ARP、ICMP(Ping通)、用户数据回环
常见问题
假设板子已经跑起来回环例程了,第一次打开调试助手
选择指定的网口(如果你有两三个网口+WIFI的话,或者FPGA和PC直连就选直连那个)
输入PC端的通信端口、FPGA的IP地址和通信端口(这个一般会在代码里写死,支持动态的不多)
输入一个任意长度数据,点击发送(数据框显示 几点几分几秒:TX XXX
PC向指定IP发送ARP包(Who has 192.xx.xx.xx?TMD把你的MAC发过来
FPGA响应ARP包(你爷爷在此
PC发送UDP数据包(拿着!
FPGA回UDP数据包(拿着!
数据框显示 几点几分几秒:RX XXX
再次点击发送数据,不再有ARP过程

网络通信需要三个东西,IP地址、MAC地址和端口号。
端口号(16位)基本是指定的。比如A应用就是通过100端口收发数据,B应用通过200端口。A设备A应用要访问B设备的B应用就一定是通过A设备的100端口对接B设备的200端口。
IP地址是当前设备在当前网络下的临时身份证。注意条件、当前(明天可能IP就变了)、当前设备(换个设备插进来IP可能也不一样)、当前网络(插别的路由器可能就分到另一个IP了)。
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包。
发送的ARP包包含A的IP、要使用的端口和MAC,B的IP、要使用的端口
回复的ARP包包含A的IP、要使用的端口和MAC,B的IP、要使用的端口和MAC
这样AB会保存这个ARP信息(在Windows里可以在CMD里打arp -a查询),然后才能正常收发数据(包括Ping)。也就是说,如果没有ARP,你不管发什么指令、数据,在Wireshark里都看不到,只会看到一堆ARP。

一般在FPGA代码里直接写死了目的IP、MAC、端口号,直接发就完了。电脑又不能这么干,人家要走正规流程的。当然有些FPGA代码的目的IP、MAC、端口号也会跟着ARP更改,谁来ARP FPGA,FPGA就跟谁通信。
是的,写死IP MAC和端口号后,直接发就完了。
准确来说ICMP有好几个测试项目,Ping只是其中最常见的一种。当你没有对应上位机或者怀疑上位机读写有问题的时候,直接在CMD ping一下FPGA的IP,通了,说明基本是没啥问题的——接下来压力给到开发上位机的人。

Wireshark能改变网卡接收数据的某些行为,比如本应该丢弃数据错误的包,但是Wireshark能给你抓回来,这个时候你的上位机就收到了,常见的错误如下:
Wireshark提示的各种错误(比如数据长度和包头不对、类型不对等)
Wireshark不提示,可能Checksum错了(这个在Wireshark里是Disabled的,网卡给你丢了,软件又给你捞回来了
Wireshark不提示,可能FCS错了(FCS是最底层的校验,他不会出现在Wireshark可显示范围里,需要在FPGA那儿采集原始数据+FCS丢给GPT AI分析一下就知道错了
Wireshark不提示,可能数据长度不够(以太网帧要求最小60个字符(包含包头,对应数据部分不低于18字节),虽然你能看到发出去42个字符的帧,但是这个帧经过网卡会自动补0,这一点可以通过在FPGA采集相同帧验证;然后FPGA发回来的帧补0又不会过滤掉,就会形成发出去42个字节的帧,回来60个字节的帧,然后上位机还是显示42字节对应帧,不会显示补0。因为包头里有实际数据长度,补0自动忽略了)

不需要,因为IP有网段限制,都不处在同一个圈子,测试数据(ARP、Ping等)只会从直连网口发出去。这个你要去搜子网掩码和IP的关系
不需要填,填了它还要老是去ARP网关,不填就干净多了;DNS只在访问外网有用,这就填个通用8888就行

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

版本更新
260812:初始版本