大猪蹄子的个人博客

大猪蹄子

【技术 FPGA-6】猪蹄UDP开源接口

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核文件结构

1-rgmii_1g_8b_loop

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_dly_pll:idelay需要的200M时钟
  • 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

测试流程

  1. 所有例程接口一致,因此以下测试流程也一致

  2. PC网口配置IP为192.168.1.100,子网掩码255.255.255.0,网关(不需要)192.168.1.1,DNS(不需要)4.4.4.4

  3. 如果只尝试ARP和PING,直接给XI050CD烧录top.bit;如果想要测试串口指令,需要自行修改MAC

  4. 连接PC网口与XI050CD对应约束的网口(别插错了

  5. 打开CMD,尝试ping 192.168.1.210,能通

  6. 打开任务管理器,打开串口助手,发送字符1,回复>1,此时能看到网口带宽8Kbps(设定的每个包1024字节,每秒发一次)。当然你愿意开网络调试助手,也看得到,就是字符有点多

  7. 发送字符2,回复>2,此时能看到网口带宽970Mbps(如果你开了Wireshark或者网络调试助手会更低一点,因为显示不出来卡死了

  8. 发送字符0,回复>0,一切归于平静

  9. 打开网络调试助手,在UDP模式,目的IP192.168.1.210:8000,随便发点12345,FPGA回复原文

  10. 测试全部完成

可能的问题

  1. o_tx_busy会有一定延迟,万一你发出去的数据刚好和icmp\arp撞了呢?(虽然概率极小,因为arp一般只会执行一次,icmp的ping也需要人为执行

  2. 没有处理rx_err和tx_err。真有人在乎这个?

  3. UDP报文的ID号固定。真有人在乎这个?

  4. UDP报文的check sum固定0。真有人在乎这个?

  5. ARP的目的IP MAC 端口应该引出来,谁来arp,FPGA就跟谁通信,而不是现在这样写死,然后重编译

  6. 范例的loop_top和test_top可能打架。真有人在乎这个?

  7. 默认MTU 1500,支持巨型帧(没测试,反正接口没限制)。真有人在乎这个?

版本更新

260812:初始版本
260814:更新GMII版本