SU200P 双口千兆以太网实验说明
配套工程:
SU200P_Ethernet工程环境:Vivado 2026.1 目标器件:xcsu200p-sbva1024-2-e
1. 实验目的
本实验使用 SU200P 开发板上的两路千兆以太网接口完成以下内容:
- 通过 GMII 接口驱动两片板载 DP83867 千兆以太网 PHY;
- 使用 MDIO 对两路 PHY 进行复位、初始化和链路状态检测;
- 分别为 J2 和 J58 网口实现独立的 IPv4/UDP 数据接收与原端口回显;
- 使用普通按键 SW6 在 UDP 回显模式和连续测速模式之间切换;
- 完成 PDI 下载、网卡配置、UDP 回显和千兆链路吞吐验证。
2. 设计概况
本工程采用纯 RTL 实现,以 su200p_dual_gmii.v 为综合顶层。两路网口具有各自的 PHY 初始化模块、接收时钟、UDP 处理模块和收发数据通路,J2 接收到的合法 UDP 报文仍从 J2 返回,J58 接收到的合法报文仍从 J58 返回,两路数据不会相互转发。
工程提供回显和测速两种工作模式。复位完成后默认进入回显模式,主机发送到指定 IP 地址和 UDP 端口的数据会原样返回。按下 SW6 后进入测速模式,FPGA 使用最近一次有效 UDP 报文中学习到的主机 MAC、IP 和 UDP 端口,连续发送固定长度的测速报文。再次按下 SW6,设计返回回显模式。
<samp>工程文件说明</samp>
| 文件 | 作用 |
|---|---|
su200p_dual_gmii.xpr | Vivado 工程入口 |
su200p_dual_gmii.src/sources_1/new/su200p_dual_gmii.v | 综合顶层,连接两路 PHY、UDP 模块、按键和状态 LED |
su200p_dual_gmii.src/sources_1/new/dp83867_gmii_init.v | DP83867 复位、MDIO 初始化和千兆链路检测 |
su200p_dual_gmii.src/sources_1/new/mode_button.v | SW6 同步、消抖和模式切换 |
su200p_dual_gmii.src/sources_1/new/udp_echo_port.v | 单路 UDP 接收校验、报文缓存、回显和测速控制 |
su200p_dual_gmii.src/sources_1/eth_udp_gmii/eth_udp_tx_gmii.v | 以太网、IPv4 和 UDP 发送帧生成 |
crc32_d8.v、ip_checksum.v | 以太网 CRC32 和 IPv4 首部校验和计算 |
su200p_dual_gmii.src/constrs_1/new/su200p_gmii.xdc | 时钟、按键、LED 和两路 GMII 管脚约束 |
software/host/UdpSpeedTest.exe | Windows 端 UDP 注册、接收和吞吐统计工具 |
software/host/Start_Port0.cmd | J2 网口测试入口 |
software/host/Start_Port1.cmd | J58 网口测试入口 |
bit/su200p_dual_gmii.pdi | 板级下载文件 |
<kbd>双口千兆以太网设计结构</kbd>
3. 设计原理
3.1 板级接口与网络参数
开发板上的 J2 和 J58 分别连接一片 DP83867 千兆以太网 PHY。FPGA 与 PHY 之间使用 8 位 SDR GMII 接口,每个时钟传输 1 Byte 数据;在 125 MHz GMII 时钟下,物理层数据速率为 1 Gbit/s。两组 GMII 位于 FPGA 的 1.8 V I/O Bank 41 和 Bank 42,因此约束中均采用 LVCMOS18,设计没有使用 RGMII 所需的双沿采样转换逻辑。
两路网口使用不同的本地 MAC 和 IP 地址,但监听相同的 UDP 端口:
<samp>双网口网络参数</samp>
| 逻辑端口 | 板载接口 | FPGA MAC 地址 | FPGA IP 地址 | UDP 端口 | 建议的电脑地址 |
|---|---|---|---|---|---|
| GEM0 | J2 | 02:00:00:00:00:02 | 192.168.0.2 | 5000 | 192.168.0.3/24 |
| GEM1 | J58 | 02:00:00:00:00:03 | 192.168.1.2 | 5000 | 192.168.1.3/24 |
该 RTL 只处理满足设计条件的 IPv4/UDP 报文,没有实现 ARP 和 ICMP。因此,主机访问 FPGA 前需要配置静态邻居项;ping 没有响应也不能直接说明以太网设计异常,功能判断应以 UDP 回显或测速结果为准。
<!-- 在此插入开发板双网口及相关 PHY 电路截图 -->
<kbd>J2、J58 与 DP83867 以太网接口电路</kbd>
3.2 PHY 初始化与链路建立
dp83867_gmii_init.v 在系统复位释放后先保持 PHY 复位约 10 ms,再等待约 210 ms,使 PHY 的时钟和内部模拟电路稳定。随后,状态机通过约 995 kHz 的 MDC 时钟访问 PHY 地址 1,并依次完成以下配置:
- 写寄存器 4,关闭 10 Mbit/s 和 100 Mbit/s 能力通告;
- 写寄存器 9,只通告 1000BASE-T 全双工能力;
- 写基本控制寄存器 0,重新启动自动协商;
- 写 LED 控制寄存器 24,将 PHY 指示灯设置为发送和接收活动指示;
- 循环读取状态寄存器 17,判断链路是否协商为 1000 Mbit/s 全双工。
自动协商仍用于确定千兆链路的主从关系,但模块只在检测到千兆全双工状态时置位 link_1000。因此,连接的电脑网卡、交换机或 USB 网卡必须支持并启用千兆以太网;如果对端只能工作在百兆,FPGA 端的数据通路将保持复位。
两路 PHY 使用独立的 MDC/MDIO 接口,各自完成初始化和状态轮询。任一路掉线只会复位本端口的数据通路,不会中断另一路已经建立的连接。
3.3 时钟与复位
板载 266.67 MHz 差分时钟由 IBUFDS 和 BUFG 转换为系统时钟,用于按键消抖、PHY 复位和 MDIO 管理。SW13 连接管脚 F23,按下时产生低有效全局复位。
以太网数据处理不直接使用系统时钟。每片 PHY 都向 FPGA 提供独立的 125 MHz RX_CLK,对应的 udp_echo_port 在本端口接收时钟域内完成接收、缓存和发送,从而避免在两个网口之间传递数据。发送数据在 RX_CLK 上升沿更新,顶层将该时钟反相后作为 GTX_CLK 返回 PHY,使 PHY 在半个周期之后采样发送数据。
全局复位和链路状态先在系统时钟域组合成本端口复位条件,再分别同步释放到两路接收时钟域。这样,即使某一路网线拔出或接收时钟停止,另一路仍可继续工作。
<samp>时钟、复位与模式输入</samp>
| 信号 | FPGA 管脚 | 板上器件 | 说明 |
|---|---|---|---|
sys_clk_p/n | V28/U28 | 板载差分时钟 | 约 266.67 MHz 系统时钟 |
reset_n | F23 | SW13 | 低电平有效全局复位 |
key_mode | E24 | SW6 | 高电平有效,按一次切换一次模式 |
gem0_rx_clk | AD17 | J2 对应 PHY | GEM0 接收时钟,千兆链路时为 125 MHz |
gem1_rx_clk | AF15 | J58 对应 PHY | GEM1 接收时钟,千兆链路时为 125 MHz |
3.4 UDP 接收与原端口回显
每个 udp_echo_port 都从 GMII 字节流中识别以太网帧,并检查帧结构、以太网 CRC、目的 MAC、IPv4 类型、IP 首部格式、分片标志、目的 IP、UDP 协议、目的端口、长度关系以及校验和。设计只接收无 IP 选项、无分片且 UDP 载荷不超过 1472 Byte 的 IPv4 报文。
接收模块设置了四个完整报文缓存槽。只有通过全部检查的报文才会被提交到发送队列;队列已满或报文校验失败时,当前帧会被整包丢弃,不会返回残缺数据。
回显模式是复位后的默认模式。模块保存有效请求的源 MAC、源 IP 和源 UDP 端口,发送时将它们作为目的地址,并保持 UDP 载荷内容不变。J2 和 J58 各自保存并处理本端口的请求,因此可以同时服务两个不同网段的主机。
电脑发送:主机 MAC/IP/端口 → FPGA IP,UDP 5000
FPGA 回显:FPGA MAC/IP,UDP 5000 → 原主机 MAC/IP/端口
发送模块负责生成前导码、以太网首部、IPv4 首部、UDP 首部、载荷、必要的填充、CRC 和帧间隔。顶层将帧间隔设置为 12 个 GMII 时钟周期,符合千兆以太网最小帧间隔要求。
3.5 测速模式
mode_button.v 对 SW6 进行双触发同步和约 20 ms 消抖。一次有效按下只切换一次模式,持续按住不会反复切换。speed_mode=0 表示回显模式,speed_mode=1 表示测速模式。
进入测速模式前,主机必须先向 FPGA 发送至少一个有效 UDP 报文。接收模块利用该报文学习主机的 MAC、IP 和 UDP 源端口;如果尚未学习到主机信息,即使按下 SW6,FPGA 也不会盲目发送测速数据。工程配套的 UdpSpeedTest.exe 会每秒发送一次 speed-host 注册报文,因此可以自动完成这一过程。
进入测速模式后,每一路已经学习到主机信息的网口都会连续发送 1472 Byte UDP 载荷。载荷前 16 Byte 用于识别和统计,后续内容采用固定规律,便于主机检查数据完整性。
<samp>测速载荷格式</samp>
| 字节偏移 | 长度 | 内容 |
|---|---|---|
| 0~3 | 4 Byte | ASCII 字符 SU2P |
| 4~7 | 4 Byte | 会话编号,大端格式 |
| 8~11 | 4 Byte | 报文序号,大端格式 |
| 12~13 | 2 Byte | 载荷长度 0x05C0,即 1472 Byte |
| 14 | 1 Byte | 端口编号,J2 为 0,J58 为 1 |
| 15 | 1 Byte | 格式版本,当前为 1 |
| 16~1471 | 1456 Byte | 每个字节等于其偏移量的低 8 位 |
模式只在发送模块空闲时切换。进入测速前先发送完已经进入队列的回显报文,退出测速时也会等待当前帧完整结束,因此不会因为按键切换产生半帧数据。
在理想情况下,单口 1472 Byte UDP 有效载荷速率约为:
<p align="center"><strong>R ≈ 1472 ÷ (1526 + 12) × 1000 Mbit/s ≈ 957 Mbit/s</strong></p>
其中 1526 Byte 包括前导码、以太网帧、IPv4/UDP 首部、载荷和 CRC,12 Byte 为帧间隔。电脑端显示值还会受到网卡、驱动、操作系统调度和接收缓冲区影响,因此板级实测值通常低于理论值。
3.6 状态指示
顶层使用四个板载 LED 显示链路、模式和发包状态。原理图中 Q26~Q29 为 LED 驱动器件,FPGA 输出高电平时对应 LED 点亮。
<samp>状态LED</samp>
| 顶层信号 | FPGA 管脚 | 板上器件 | 含义 |
|---|---|---|---|
led[0] | B17 | Q26(LED1) | J2 已建立千兆全双工链路 |
led[1] | C18 | Q27(LED2) | J58 已建立千兆全双工链路 |
led[2] | B18 | Q28(LED3) | 点亮为测速模式,熄灭为回显模式 |
led[3] | E17 | Q29(LED4) | 两路发包计数活动指示 |
led[3] 由两路已发送报文计数器的最低位组合产生。低频回显时可以看到状态翻转;连续测速时翻转速度远高于人眼分辨能力,可能表现为稳定亮度,不应把它当作精确的速率指示。
4. 板级验证
4.1 硬件准备与连接
准备 SU200P 开发板、配套电源、JTAG 下载器、支持千兆以太网的电脑网卡和网线。建议先单独验证一个网口;如果要同时验证 J2 和 J58,电脑需要两块独立网卡,并分别配置到两个网段。
- 在断电状态下连接 JTAG 下载器;
- 将网线连接到 J2 或 J58;
- 网线另一端连接电脑千兆网卡;
- 确认连接设备支持 1000BASE-T;
- 连接开发板电源并上电。

<kbd>双口千兆以太网实验连接</kbd>
4.2 配置电脑网卡
验证 J2 时,将对应电脑网卡设置为静态地址 192.168.0.3、子网掩码 255.255.255.0;验证 J58 时设置为 192.168.1.3、子网掩码 255.255.255.0。本实验为本地直连,不需要填写默认网关和 DNS。
由于 FPGA 没有实现 ARP,还需要以管理员身份打开命令提示符,为目标 IP 添加静态邻居项。先用以下命令查看网卡名称:
netsh interface ipv4 show interfaces
假设测试网卡名称为“以太网”,J2 和 J58 分别使用以下命令。实际操作时只需添加当前测试端口对应的一项,并按电脑上的名称替换“以太网”。
netsh interface ipv4 add neighbors "以太网" 192.168.0.2 02-00-00-00-00-02
netsh interface ipv4 add neighbors "以太网" 192.168.1.2 02-00-00-00-00-03
可以用 arp -a 检查目标 IP 是否已经对应到正确的 MAC 地址。更换网卡、切换网段或删除系统网络配置后,需要重新添加相应的静态邻居项。
4.3 下载 PDI
- 启动 Vivado 2026.1,打开
su200p_dual_gmii.xpr; - 进入 Open Hardware Manager;
- 选择 Open Target → Auto Connect;
- 确认识别到
xcsu200p; - 右键器件,选择 Program Device;
- 选择
bit/su200p_dual_gmii.pdi; - 单击 Program 完成下载。
下载后等待 PHY 复位和自动协商完成。J2 建立千兆链路后 Q26 点亮,J58 建立千兆链路后 Q27 点亮。JTAG 下载为易失性配置,开发板断电后需要重新下载。
4.4 UDP 回显验证
回显功能使用以太网调试软件进行验证。打开软件并选择 UDP 协议,根据被测网口设置本地地址、远端地址和端口:
<samp>UDP回显软件配置</samp>
| 测试接口 | 本地主机地址 | 本地端口 | 远端 FPGA 地址 | 远端端口 |
|---|---|---|---|---|
| J2 / GEM0 | 192.168.0.3 | 6102 | 192.168.0.2 | 5000 |
| J58 / GEM1 | 192.168.1.3 | 6102 | 192.168.1.2 | 5000 |
保持 SW6 对应的模式为回显模式,选择 ASCII 发送和接收显示,在发送区输入一段容易辨认的文本并单击发送。FPGA 接收到合法 UDP 报文后,会交换源、目的地址和端口,并将载荷原样返回。

<kbd>J2 网口的 UDP 回显实测结果</kbd>
图中网络调试助手使用本地地址 192.168.0.3 和本地端口 6102,远端设置为 FPGA 的 192.168.0.2:5000。软件先后两次发送相同的 49 Byte ASCII 文本,随后均从 192.168.0.2:5000 收到内容完全一致的 49 Byte 数据;窗口底部的 TX 和 RX 计数均为 98 Byte。
发送长度、接收长度和文本内容均一致,说明 J2 的千兆链路、静态邻居配置、IPv4/UDP 接收校验以及原端口回显均已正常工作。验证期间 Q26 应点亮,Q28 保持熄灭。测试 J58 时只需换用表中的第二组 IP 地址,正常情况下 Q27 点亮,发送数据同样会从 J58 返回。
4.5 连续测速验证
连续测速使用工程提供的 software/host/UdpSpeedTest.exe。运行程序后选择被测网口:输入 1 测试 J2,输入 2 测试 J58。程序会绑定对应的电脑地址和 UDP 6102 端口,并每秒向 FPGA 的 UDP 5000 端口发送注册报文,使 FPGA 学习测速数据的目标 MAC、IP 和 UDP 端口。
保持程序运行,等待注册报文发出后,按下并松开 SW6。按键消抖完成后,Q28 点亮,FPGA 进入连续测速模式。程序每秒打印一次接收结果,主要字段含义如下:
<samp>测速程序输出</samp>
| 字段 | 含义 | 正常判断 |
|---|---|---|
Mbps | 1472 Byte UDP 有效载荷速率 | 应持续显示较高且相对稳定的数值 |
pps | 每秒接收的测速报文数 | 应连续增加 |
packets | 累计有效测速报文数 | 持续增加 |
gap_slots | 序号向前跳过的位置数 | 理想情况下保持较小或为 0 |
late_or_repeat | 迟到或重复的报文数 | 理想情况下为 0 |
bad | 载荷格式或内容检查失败数 | 使用 --check 时应为 0 |
other | 非测速格式 UDP 报文数 | 回显注册报文会计入此项 |

<kbd>J2 网口的 UDP 连续测速实测结果</kbd>
图中选择 1 对 J2 / GEM0 进行测试,本地端点为 192.168.0.3:6102,FPGA 端点为 192.168.0.2:5000。进入测速模式后,有效载荷速率稳定在 955.08~955.30 Mbit/s,接收速率约为 81104~81128 packet/s;运行到 7.8 s 时,累计收到 630623 个测速报文。
整个截图范围内 gap_slots=0、late_or_repeat=0、bad=0,说明接收端没有发现序号跳跃、迟到或重复报文,也没有发现载荷格式错误。实测速率接近约 957 Mbit/s 的理论 UDP 有效载荷上限,表明 J2 的连续发送和电脑端接收均处于正常状态。图中的 other=0 是因为截图时设计已经处于测速模式,注册报文用于更新目标信息,不会作为回显数据返回。
Q29 在连续发包期间快速翻转,肉眼可能看到稳定亮度。再次按下并松开 SW6 后,设计会发送完当前帧再退出测速,Q28 熄灭;测速报文计数停止,而每秒注册报文重新被回显,other 继续增加。
双口同时验证时,应分别使用两块网卡运行 Start_Port0.cmd 和 Start_Port1.cmd。两个窗口应各自统计本端口的测速数据,拔掉其中一根网线只影响对应端口,另一端口仍能继续接收。
4.6 常见问题
<samp>常见问题与处理方法</samp>
| 问题 | 可能原因 | 处理方法 |
|---|---|---|
| Q26 或 Q27 不亮 | 对端只支持百兆、网线异常或 PHY 尚未协商完成 | 确认网卡为千兆模式,更换六类或合格的超五类网线,重新连接并等待协商 |
| 程序提示本机没有可绑定的 IP | 网卡没有配置为 192.168.0.3 或 192.168.1.3 | 检查当前测试网卡的静态 IPv4 地址和子网掩码 |
| 链路已建立但收不到回显 | 未配置静态邻居项、目标 MAC 错误或程序被防火墙拦截 | 重新添加对应 IP/MAC 映射,使用 arp -a 核对,并允许测试程序通过防火墙 |
ping 无响应 | RTL 没有实现 ARP 和 ICMP | 使用静态邻居项和 UDP 测试工具判断功能 |
| 按 SW6 后没有测速数据 | 还未收到有效注册报文,或主机工具没有保持运行 | 先启动对应端口的测试程序,等待回显后再按 SW6 |
Mbps 波动较大或 gap_slots 增加 | 主机网卡、驱动、系统调度或接收缓冲能力不足 | 关闭其他大流量程序,使用独立千兆网卡,提高接收缓冲并避免低性能 USB 网卡 |
| 双口测试地址冲突 | 两块网卡配置到同一网段或启动了错误脚本 | J2 使用 192.168.0.x,J58 使用 192.168.1.x,分别运行两个启动脚本 |
5. 总结与扩展
本实验使用纯 RTL 在 SU200P 上实现了两路相互独立的千兆以太网数据通路。设计通过 MDIO 初始化两片 DP83867,只在千兆全双工链路建立后释放端口逻辑;每路 udp_echo_port 对接收报文进行完整性和地址检查,并在四槽缓存的基础上完成原端口 UDP 回显。SW6 可以在回显和连续测速之间切换,配套主机程序负责注册目标、接收 1472 Byte 测速载荷并统计吞吐与序号连续性。
板级验证时,应特别注意两路网口使用不同网段、设计不响应 ARP 和 ICMP,以及对端必须支持千兆以太网。完成静态地址和静态邻居配置后,可以先用以太网调试软件检查 UDP 载荷能否原样返回,再用 UdpSpeedTest.exe 检查连续测速。J2 实测回显数据内容与长度一致,测速有效载荷速率约为 955 Mbit/s,且未发现序号或载荷错误。
后续可以在现有设计上增加 ARP、ICMP 和 DHCP,使主机不再依赖静态邻居表;也可以加入跨时钟统计、ILA 在线观测、可配置 IP/端口寄存器,或扩展为多端口 UDP 数据采集与转发系统。

