2026 / 8 / 12
简介
Github链接:GitHub - BigPig-Bro/udp
这是一个UDP(带ARP\ICMP(ping))的通用接口工程汇总,目前提供了A7平台上的RGMII、GMII接口范例,未来考虑增加SGMII、XGMII等支持,调试答疑见【技术 FPGA-5】调试FPGA网口(UDP)常见问题
UDP已单独整理封装接口,范例提供回环和主动测试两个外围测试
范例环境
rgmii_1g_8b_loop:基于A7平台+RGMII接口的测试例程
gmii_1b_8b_loop:基于A7平台+GMII接口的测试例程
目前该UDP接口参数如下:
支持被动ARP(PC可以ARP访问到FPGA
支持被动ICMP部分(PC可以ping到FPGA,该功能payload固定32字节(Windows默认),linux测试请注意)
支持自动计算FCS(你只管喂中间的数据就行
支持自动增加SFD(你只管喂中间的数据就行
支持自动补0(数据段低于18个字符的自动补零,避免触发以太网帧最小60字符限制
UDP核文件结构
udp_top:接口的顶层文件,负责模块连接
gmii_top:对外的顶层文件,负责输入输出gmii格式的数据
gmii_tx:负责将数据添加SFD头、补0以及FCS尾
gmii_rx:负责检测数据并去掉SFD头
gmii2rgmii:负责gmii和rgmii接口互转
rx_dly_pll:idelay需要的200M时钟
IDDR:rgmii需要的串并转换
ODDR:rgmii需要的串并转换
rx_mux:负责识别icmp和arp单独发出去,其余发给user
icmp:负责识别是不是当前FPGA的ping报文,并响应回复
arp:负责识别是不是当前FPGA的arp报文,并响应回复
tx_mux:负责轮询icmp\arp\user数据需求
2-gmii_1g_8b_loop
udp_top:接口的顶层文件,负责模块连接
gmii_top:对外的顶层文件,负责输入输出gmii格式的数据
gmii_tx:负责将数据添加SFD头、补0以及FCS尾
gmii_rx:负责检测数据并去掉SFD头
gmii_io:负责gmii数据收发和接收idelay调节
rx_mux:负责识别icmp和arp单独发出去,其余发给user
icmp:负责识别是不是当前FPGA的ping报文,并响应回复
arp:负责识别是不是当前FPGA的arp报文,并响应回复
tx_mux:负责轮询icmp\arp\user数据需求

接口时序
目前所有例程的UDP对User接口相同
i_rst_n:低电平复位
输出接口
o_usr_rx_data :输出的用户数据,从MAC开始,无SFD,有补0和FCS
o_usr_rx_valid:输出的用户数据 valid,高电平有效
o_usr_rx_last :输出的用户数据 valid last,高电平有效
输入接口
i_usr_tx_data :输入的用户数据,从MAC开始,无SFD、补0和FCS
i_usr_tx_wr :输入的用户数据 valid,高电平有效
i_usr_tx_last :输入的用户数据 valid last,高电平有效
o_tx_busy :发送接口忙,高电平有效
范例介绍
测试环境:
rgmii_1g_8b_loop:XI050CD/XI050AB板载网口
gmii_1g_8b_loop:XI050CD+gmii模块
范例其他工程文件:
loop_top:将用户数据原文返回
test_top:根据串口字符0 1 2执行不同测试数据,优先级高于loop_top
0-什么也不干(上电默认)
1-每秒发送一个Payload包(默认1024字节,Parameter可配)
2-以最小帧间隔发送Payload包(测试最大带宽,rgmii/gmii一般在970Mbps


测试流程
所有例程接口一致,因此以下测试流程也一致
PC网口配置IP为192.168.1.100,子网掩码255.255.255.0,网关(不需要)192.168.1.1,DNS(不需要)4.4.4.4
如果只尝试ARP和PING,直接给XI050CD烧录top.bit;如果想要测试串口指令,需要自行修改MAC
连接PC网口与XI050CD对应约束的网口(别插错了
打开CMD,尝试ping 192.168.1.210,能通
打开任务管理器,打开串口助手,发送字符1,回复>1,此时能看到网口带宽8Kbps(设定的每个包1024字节,每秒发一次)。当然你愿意开网络调试助手,也看得到,就是字符有点多
发送字符2,回复>2,此时能看到网口带宽970Mbps(如果你开了Wireshark或者网络调试助手会更低一点,因为显示不出来卡死了
发送字符0,回复>0,一切归于平静
打开网络调试助手,在UDP模式,目的IP192.168.1.210:8000,随便发点12345,FPGA回复原文
测试全部完成
可能的问题
o_tx_busy会有一定延迟,万一你发出去的数据刚好和icmp\arp撞了呢?(虽然概率极小,因为arp一般只会执行一次,icmp的ping也需要人为执行
没有处理rx_err和tx_err。真有人在乎这个?
UDP报文的ID号固定。真有人在乎这个?
UDP报文的check sum固定0。真有人在乎这个?
ARP的目的IP MAC 端口应该引出来,谁来arp,FPGA就跟谁通信,而不是现在这样写死,然后重编译
范例的loop_top和test_top可能打架。真有人在乎这个?
默认MTU 1500,支持巨型帧(没测试,反正接口没限制)。真有人在乎这个?
版本更新
260812:初始版本
260814:更新GMII版本