找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

4017

积分

0

好友

551

主题
发表于 4 小时前 | 查看: 3| 回复: 0

基础信息

  • FPGA芯片:xc7v690tffg1761-2L
  • Vivado版本:vivado2018.3
  • 测试板卡:优数科技 PCIe-404、som-404 信号处理模块

基本架构

FPGA TCP/IP协议栈与RGMII接口架构图

说明

  1. TCP/IP协议栈:核心的TCP/IP代码,支持ICMP, UDP, TCP, ARP等以太网报文处理。
  2. Tri_mode_eth:Xilinx的千兆网IP_CORE,当前使用RGMII与以太网芯片交互。
  3. Mdio_cfg:解决误码问题,在本模块进行RXDLY的微调设置,需要根据不同的板卡确定调整值。

实际测试

基础配置

  1. FPGA_IP地址:192.168.1.30
  2. FPGA_MAC地址:0x1234_5678_9abb
  3. 上位机IP地址:192.168.1.26

交互情况

上板测试后,发现FPGA与电脑之间存在报文交互,交互正常。如下图所示,ARP报文和TCP报文可以正常发送至上位机。

Wireshark抓包显示ARP和TCP报文交互

PING异常

在电脑端ping 192.168.1.30地址,发现ping不通,但Wireshark抓包发现FPGA与电脑可正常收发包。

Ping命令显示请求超时

如下图所示,用Wireshark抓取ping报文,发现FPGA对ping是有回复的,但是回复的报文存在异常,Checksum错误,回复数据也存在异常。本应该6768696a的数据,变为676a696a,分析是存在1位的错误。

Wireshark显示ICMP Reply报文
ICMP Reply报文详情,显示Checksum错误和数据错误

在抓取了FPGA内部收到的ping报文后,发现从PHY芯片进入FPGA的报文就已经错了,因此怀疑硬件PCB走线问题。更换PCB板卡后,测试正常。在查阅pg051和以太网PHY芯片的数据手册后,决定尝试通过微调RX_DLY的值解决问题。误码如何解决详情见MDIO配置RXDLY延迟章节。

通过修改RX_DLY后,再次进行ping报文的操作,发现此时是可以ping通的。

Ping命令成功,4个包全部回复

通过Wireshark抓包,可以看到此时reply的数据是正常的。

Wireshark抓包显示正确的ICMP Reply
正确的ICMP Reply报文详情,Checksum正确

性能及资源

在解决了误码情况后进行性能测试。

性能

UDP性能测试
千兆网,UDP测试性能在970Mbps左右。
任务管理器显示UDP带宽约970Mbps

TCP性能测试
TCP的4个端口测试,性能在960Mbps左右。
测试工具显示TCP带宽约960Mbps

MDIO配置RXDLY延迟

目标是通过MDIO调节Rx_delay_sel的值解决误码问题,如下图所示,Rx_delay_sel位于 EXE_0xA003 寄存器的【13:10】bit。每步长为150ps。

RGMIIC_Config1寄存器(EXT_0xA003)配置表

查阅YT8531SH数据手册发现,通过配置0x1E寄存器和0x1F寄存器来实现对扩展寄存器的访问。

YT8531SH扩展寄存器地址偏移(0x1E)和数据(0x1F)寄存器说明

Pg051使用勘误

  1. PHY地址的确定:Xilinx手册中描述phy地址不能为0。但是实测发现当前只有1个phy时,仅当phy地址为0才能读取到正确的数据,其他的phy地址时,读取到的数据全部为0xffff

Xilinx手册关于MDIO多设备连接和PHY地址的说明

YT8531SH使用勘误

  1. 如下图,使用是需要配置0x1E寄存器为0xA003,图中显示仅【7:0】bit是可写的,【15:8】bit是仅读的,但实际测试发现,整个0x1E寄存器的16bit都是可读可写的,否则无法将0xA003写入。

YT8531SH扩展寄存器地址偏移寄存器详情,实测全16位可写

MDIO

寄存器说明

Xilinx通过axi_lite接口配置MDIO需要关注以下寄存器。

Xilinx MDIO配置寄存器地址列表
MDIO Setup Word (0x500) 寄存器说明
MDIO Control Word (0x504) 寄存器说明
MDIO Write Data (0x508) 和 Read Data (0x50C) 寄存器说明

MDIO读取测试

进行初步的测试,观察当前使用读取phy芯片的0x0寄存器,回读的数据为0x1140,与YT8531SH数据手册之中phy芯片的0x0寄存器默认值能对应。

AXI-Lite总线波形,读取到PHY 0x00寄存器值为0x1140
YT8531SH Basic Control Register (0x00) 默认值说明

寄存器控制流程

开启MDIO传输

操作phy芯片的寄存器时必须先开启MDIO传输。

w/r axi_awaddr axi_wdata description
w 0x500 0x58 [6]bit 打开MDIO_ENABLE
写0x1E寄存器

给0x1E寄存器写入0xA003表示我们要操作的扩展寄存器是 EXT_A003

w/r axi_awaddr axi_wdata description
w 0x508 0xA003 需要写的数据是0xA003
w 0x504 0x001E_4800 1.[11]bit 开启传输
2.[15:14]bit是2'b01开启写流程
3.[20:16]bit TX_REGAD 是0x1E
4.[28:24]bit phy地址是0x0
写0x1F寄存器

0x1E寄存器指代要操作的扩展寄存器,0x1F指代给0x1E指定的扩展寄存器写的值。给0x1F寄存器写入0x10F1表示,我们要给EXT_A003寄存器写0x10F1

w/r axi_awaddr axi_wdata description
w 0x508 0x10F1 需要写的数据是0x10F1
w 0x504 0x001F_4800 1.[11]bit 开启传输
2.[15:14]bit是2'b01开启写流程
3.[20:16]bit TX_REGAD 是0x1F
4.[28:24]bit phy地址是0x0

通过以上开启MDIO传输,写0x1E和写0x1F寄存器,就可以修改RX_DELAY_SEL的值了。

读寄存器流程

写寄存器和读寄存器都要先开启MDIO的控制传输,此处不再赘叙。以读0x1E地址的数据为例,说明下读寄存器的命令。

先发送axi写数据,给0x504寄存器写入0x001E_8800,表明要读取0x1E地址的数据。而后通过读取0x50C寄存器获取数据。

w/r axi_addr axi_wdata description
w 0x504 0x001E_8800 1.[11]bit 开启传输
2.[15:14]bit是2'b10开启读流程
3.[20:16]bit TX_REGAD 是0x1E
4.[28:24]bit phy地址是0x0
r 0x50c 读取0x50c获取到TX_REGAD寄存器返回的值

参考文档

  1. PG051-tri-mode-eth-mac-en-us-9.0
  2. 以太网收发器_YT8531SH

本文记录了一次完整的FPGA网络协议栈调试过程,从发现问题到分析定位,再到通过调整PHY底层参数解决问题,涵盖了RGMII接口调试中可能遇到的典型挑战。希望这份实战记录能为遇到类似问题的开发者提供参考。欢迎在云栈社区网络/系统板块交流更多关于TCP/IP协议栈和硬件设计的心得。




上一篇:OpenClaw新手进阶全攻略:四步构建你的专属AI工作流
下一篇:用 Kimi Claw 和飞书构建 7x24 小时股票盯盘系统:从部署到自动化
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-3-14 08:25 , Processed in 0.569604 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表