基于XDMA的简易FPGA网卡实现(一)

本文详细介绍了如何在FPGA中利用XDMA实现简易网卡,包括硬件设计、CPU与FPGA通信、驱动编程以及性能测试。实验结果显示,发送速度受限于XDMA的单包发送机制,未来有优化潜力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于XDMA的简易FPGA网卡实现(一)

开发环境

FPGA开发板XC7K325T
CPURK3399
开发主机Win11 and ubuntu20.04
IDE版本Xilinx Vitis IDE v2021.1.0 (64-bit) Vivado v2021.1 (64-bit)

在这里插入图片描述

实现原理

FPGA侧

在这里插入图片描述

  • top模块:顶层模块,其中例化了xmda和axil_rw模块

  • xdmaip:pcie dma,提供axi-lite接口读写fpga寄存器,提供axi-stream接口收发数据流

  • axil_rw模块:将xdma的axi-lite信号用于读写mac模块寄存器

  • clk_wiz_125m_90phase:提供90°相位125M时钟,供mac使用

  • gpio_dri模块:gpio控制器,用于模拟mdio时序读写phy

  • axis_dwidth_converterip:提供axis数据位宽转换功能,将xdma 128bit axi-stream转为8bit供fifo使用,使用了两个此模块实现双向转换

  • axis_data_fifo:两个fifo,缓存mac接收和需要发送的数据

  • eth_mac_1g_rgmii模块:源自verilog-eth开源项目,具有rgmii接口和速率自适应逻辑的三模式以太网MAC,axi-stream接口

  • ilaip:抓信号调试

CPU侧

编写linux标准网卡驱动,使用零拷贝方式收发数据

发送流程
  • 在ndo_start_xmit函数中进行发送
  • 将sk_buff的head和fragmentation dma_map_single得到物理地址,将物理地址和长度写入描述符
  • 发送前netif_stop_queue,在发送完成中断唤醒。如果直接继续发送,则新的sk_buff会在上一次的完成中断中被free
  • 开启dma使能,进行发送
  • 在发送完成中断中关闭发送dma使能,dma_unmap_single sk_buff的物理地址,free sk_buff。判断发送fifo是否超出发送阈值。超出则运行wait_work工作队列,在work中等待fifo低于启动阈值后netif_wake_queue唤醒发送队列,未超出阈值则netif_wake_queue唤醒发送队列
接收流程
  • 在网卡驱动的probe函数中进行第一次接收,在接收完成中断或tasklet中配置后续接收

  • 收到接收完成中断后关闭接收dma使能

  • dma会将接收结果写回到result内存,读取result内存获取包长度

  • skb_put修改sk_buff的tail和len,dma_unmap_single sk_buff的物理地址,执行netif_rx提交到协议栈

  • 接收完成后开始准备新一轮的接收,在中断或tasklet中dev_alloc_skb一个1514字节的skb

  • 将sk_buff的head和fragmentation dma_map_single得到物理地址,将物理地址和长度写入描述符

  • 开启dma使能,进行接收

测试

feth0为fpga网卡,设置ip为192.168.1.208;电脑网卡配置成百兆全双工,ip设置为192.168.1.108。

root@NanoPC-T4:/home/pi# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.31.131  netmask 255.255.255.0  broadcast 192.168.31.255
        inet6 fe80::2c2b:6887:1120:373c  prefixlen 64  scopeid 0x20<link>
        ether fa:f1:04:39:02:9a  txqueuelen 1000  (Ethernet)
        RX packets 739  bytes 60003 (58.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 600  bytes 150153 (146.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 60  

feth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.208  netmask 255.255.255.0  broadcast 192.168.1.255
        ether 00:00:00:00:00:00  txqueuelen 1000  (Ethernet)
        RX packets 35382  bytes 2069214 (1.9 MiB)
        RX errors 0  dropped 7  overruns 0  frame 0
        TX packets 65186  bytes 98674228 (94.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 24  bytes 1944 (1.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 24  bytes 1944 (1.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ping测试

  • ping 20000包长时,ICMP包分成了13个包发送,且延迟很长4ms,抓包正常
root@NanoPC-T4:/home/pi# ping 192.168.1.108
PING 192.168.1.108 (192.168.1.108) 56(84) bytes of data.
64 bytes from 192.168.1.108: icmp_seq=1 ttl=128 time=1.05 ms
64 bytes from 192.168.1.108: icmp_seq=2 ttl=128 time=0.992 ms
64 bytes from 192.168.1.108: icmp_seq=3 ttl=128 time=0.876 ms
64 bytes from 192.168.1.108: icmp_seq=4 ttl=128 time=1.01 ms
64 bytes from 192.168.1.108: icmp_seq=5 ttl=128 time=0.901 ms
64 bytes from 192.168.1.108: icmp_seq=6 ttl=128 time=1.02 ms
64 bytes from 192.168.1.108: icmp_seq=7 ttl=128 time=0.930 ms
^C
--- 192.168.1.108 ping statistics ---
7 packets transmitted, 7 received, 0% packet loss, time 6011ms
rtt min/avg/max/mdev = 0.876/0.968/1.051/0.061 ms
root@NanoPC-T4:/home/pi# ping -s 20000 192.168.1.108
PING 192.168.1.108 (192.168.1.108) 20000(20028) bytes of data.
20008 bytes from 192.168.1.108: icmp_seq=1 ttl=128 time=4.23 ms
20008 bytes from 192.168.1.108: icmp_seq=2 ttl=128 time=3.93 ms
20008 bytes from 192.168.1.108: icmp_seq=3 ttl=128 time=4.32 ms
20008 bytes from 192.168.1.108: icmp_seq=4 ttl=128 time=3.95 ms
20008 bytes from 192.168.1.108: icmp_seq=5 ttl=128 time=4.21 ms
20008 bytes from 192.168.1.108: icmp_seq=6 ttl=128 time=4.01 ms
^C
--- 192.168.1.108 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5010ms
rtt min/avg/max/mdev = 3.930/4.107/4.324/0.152 ms

在这里插入图片描述

iperf测试

板子做客户端
  • 抓包正常,速度只有33.5M

在这里插入图片描述

板子做服务器
  • 抓包正常,速度正常94.9M

在这里插入图片描述

tftp下载文件

wireshark无警告和错误,下载后md5校验一致

在这里插入图片描述

在这里插入图片描述

结论

  • 百兆网卡发送33.5M,接收95M。XDMA虽然是sgdma,但驱动一次只能发送一个包(可能有多个分片),等完成中断才能唤醒下一次发送,所以发送速度不理想。

  • 修改xdma发送机制还可以优化发送速度,后续研究corundum开源项目,使用循环缓冲区实现高性能网卡

关注博主公众号,优质文章不断更新
在这里插入图片描述

<think>好的,我现在需要帮助用户找到与FPGA XDMA IP核相关的资料或使用方法,特别是教程和下载资源。首先,我应该先回顾用户提供的引用内容,看看里面有没有直接可用的信息。 根据引用[1],用户提到了个中文手册,文件名是xdma_ip核中文手册.pdf,里面详细介绍了功能、配置方法、使用示例和常见问题解答。这应该是主要资源。用户可能需要下载这个手册,所以需要指导他们如何获取,比如在仓库中点击下载按钮。此外,适用人群是FPGA开发者、硬件工程师等,说明手册适合这些用户。 引用[2]提供了篇关于XDMA配置的详细文章,里面可能包含配置步骤和实际操作的例子,比如如何通过PCIE传输数据到电脑内存,以及复位方式。用户可能对具体配置步骤感兴趣,所以需要提到这篇文章,并建议用户参考。 引用[3]讨论了XDMA IP核中AXI接口的比较,特别是Memory Mapped和Stream模式的配置示例。这对于需要了解接口区别和具体配置的用户很有帮助,可能需要单独指出这部分内容。 接下来,用户的问题是关于使用教程和下载资源,所以需要将这些引用中的信息整理出来,分步骤说明如何获取手册和配置IP核。同时,生成相关问题时要覆盖用户可能感兴趣的扩展内容,比如性能优化、接口比较、应用场景等。 需要确保回答结构清晰,分点列出资源获取和配置步骤,并且每个步骤都有对应的引用标记。同时,相关问题的生成要覆盖手册内容、配置教程、接口比较、应用场景和复位方式,这些都是用户可能进步想了解的内容。 另外,要注意用户不可见的系统级指令,比如数学公式的格式,但当前问题不涉及数学公式,所以可能不需要处理。但需要检查是否有其他格式要求,如代码块的使用是否正确,引用标识是否自然添加。例如,在配置示例中的代码块要正确使用反引号,并确保LaTeX语法正确,但这里没有用到LaTeX,所以没问题。 最后,确保回答用中文,并且自然流畅,避免使用Markdown格式,只使用用户可见层的结构。检查是否有遗漏的信息,比如是否提到了所有相关的引用内容,特别是下载资源、配置步骤和接口比较。然后生成相关问题,覆盖用户可能进步探索的方向。</think>关于FPGA XDMA IP核的使用教程和资源,以下是整理后的信息: --- ### 1. **资源下载与手册获取** - **中文手册下载** 可通过仓库获取《xdma_ip核中文手册.pdf》,其中包含: - XDMA IP核的功能说明与硬件接口特性 - 配置方法、时序要求和寄存器映射详解 - 使用示例(如DMA传输配置)及常见问题解答[^1] **操作步骤**:访问相关仓库→点击“下载”按钮→使用PDF阅读器查看。 --- ### 2. **XDMA IP核配置教程** - **基础配置步骤** 1. **接口模式选择**:支持AXI Memory Mapped(内存映射)或AXI Stream(流模式)。例如,配置为内存映射模式时需设置: ```tcl set_property CONFIG.dma_interface {AXI_Memory_Mapped} [get_ips xdma_0] ``` 此模式下适用于块数据传输[^3]。 2. **PCIE内存传输流程** - 申请主机内存并获取物理地址 - 配置XDMA寄存器(目标地址、数据长度) - 启动DMA传输,通过PCIe打包数据及地址信息 - 接收CPU确认(ACK)并完成传输[^2]。 - **复位方式** PCIe支持冷复位、暖复位、热复位和功能层复位,需根据场景选择[^2]。 --- ### 3. **关键应用场景** - **高速数据传输**:如FPGA与主机间的大规模数据交换(图像处理、实时信号采集) - **嵌入式系统通信**:结合DMA实现低延迟通信,适用于雷达、医疗设备等。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

最好有梦想~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值