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

这篇具有很好参考价值的文章主要介绍了基于XDMA的简易FPGA网卡实现(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

开发环境

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

基于XDMA的简易FPGA网卡实现(一),linux驱动开发经验,FPGA,fpga开发,驱动开发

实现原理

FPGA侧

基于XDMA的简易FPGA网卡实现(一),linux驱动开发经验,FPGA,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

基于XDMA的简易FPGA网卡实现(一),linux驱动开发经验,FPGA,fpga开发,驱动开发

iperf测试

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

基于XDMA的简易FPGA网卡实现(一),linux驱动开发经验,FPGA,fpga开发,驱动开发

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

基于XDMA的简易FPGA网卡实现(一),linux驱动开发经验,FPGA,fpga开发,驱动开发

tftp下载文件

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

基于XDMA的简易FPGA网卡实现(一),linux驱动开发经验,FPGA,fpga开发,驱动开发

基于XDMA的简易FPGA网卡实现(一),linux驱动开发经验,FPGA,fpga开发,驱动开发

结论

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

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

关注博主公众号,优质文章不断更新
基于XDMA的简易FPGA网卡实现(一),linux驱动开发经验,FPGA,fpga开发,驱动开发文章来源地址https://www.toymoban.com/news/detail-853464.html

到了这里,关于基于XDMA的简易FPGA网卡实现(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA基于XDMA实现PCIE X8采集AD9226数据 提供工程源码和QT上位机程序和技术支持

    PCIE(PCI Express)采用了目前业内流行的点对点串行连接,比起 PCI 以及更早期的计算机总线的共享并行架构,每个设备都有自己的专用连接,不需要向整个总线请求带宽,而且可以把数据传输率提高到一个很高的频率,达到 PCI 所不能提供的高带宽,是目前各行业高速接口的优

    2024年02月04日
    浏览(44)
  • FPGA基于XDMA实现PCIE X8视频采集HDMI输出 提供工程源码和QT上位机程序和技术支持

    PCIE(PCI Express)采用了目前业内流行的点对点串行连接,比起 PCI 以及更早期的计算机总线的共享并行架构,每个设备都有自己的专用连接,不需要向整个总线请求带宽,而且可以把数据传输率提高到一个很高的频率,达到 PCI 所不能提供的高带宽,是目前各行业高速接口的优

    2024年02月01日
    浏览(49)
  • FPGA基于XDMA实现PCIE X4视频采集HDMI输出 提供工程源码和QT上位机程序和技术支持

    PCIE(PCI Express)采用了目前业内流行的点对点串行连接,比起 PCI 以及更早期的计算机总线的共享并行架构,每个设备都有自己的专用连接,不需要向整个总线请求带宽,而且可以把数据传输率提高到一个很高的频率,达到 PCI 所不能提供的高带宽,是目前各行业高速接口的优

    2024年02月02日
    浏览(48)
  • FPGA实现 NIC 100G 网卡,UltraScale+ 100G Ethernet Subsystem驱动,提供工程源码和技术支持

    FPGA实现 NIC 100G 网卡,GTY+100G Ethernet Subsystem架构,纯verilog代码实现,提供2套工程源码和技术支持 网络接口控制器(NIC)是计算机与网络进行交互的网关。NIC构成了软件协议栈和网络之间的桥梁,该桥梁的功能定义了网络接口。网络接口的功能以及这些功能的实现都在迅速发

    2024年02月05日
    浏览(80)
  • FPGA实现 RDMA NIC 100G UDP协议栈网卡,UltraScale+ 100G Ethernet Subsystem驱动,提供工程源码和技术支持

    FPGA实现 NIC 100G 网卡,GTY+100G Ethernet Subsystem架构,纯verilog代码实现,提供2套工程源码和技术支持 网络接口控制器(NIC)是计算机与网络进行交互的网关。NIC构成了软件协议栈和网络之间的桥梁,该桥梁的功能定义了网络接口。网络接口的功能以及这些功能的实现都在迅速发

    2024年02月08日
    浏览(50)
  • FPGA(基于xilinx)中PCIe介绍以及IP核XDMA的使用

    例如:第一章 PCIe简介以及IP核的使用 PCIe 总线架构与以太网的 OSI 模型类似,是一种分层协议架构, 分为事务层(Transaction Layer)、 数据链路层(Data Link Layer) 和物理层(Physical Layer)。 这些层中的每一层都分为两部分:一部分处理出站(要发送的)信息,另一部分处理入站(接收

    2024年02月08日
    浏览(46)
  • 【FPGA教程案例40】通信案例10——基于FPGA的简易OFDM系统verilog实现

    FPGA教程目录 MATLAB教程目录 --------------------------------------------------------------------------------------- 目录 1.软件版本 2.OFDM原理 3.OFDM系统的verilog实现

    2024年02月12日
    浏览(57)
  • 基于VHDL的FPGA简易电子琴(实现三音阶切换与弹奏)

    目录 一、设计内容简介 二、系统框图 1、简易框图  2、总电路图(quarters软件自动生成) 三、代码说明  1、总体代码 2、代码思路 四、仿真实现结果与分析总结 1、仿真思路 2、仿真建立过程 3、仿真结果检验 ​ (1)静音功能检验 (2)琴键功能检验 (3)模式选择功能检验

    2024年01月16日
    浏览(40)
  • FPGA驱动RGB888屏幕——基于正点原子达芬奇FPGA开发板

    RGB888简介 一个像素点由三种颜色控制,每个颜色8bit,共24bit,三个字节,这就是RGB888。同样的还有RGB565等。 LCD屏幕介绍 1、HSYNC(水平同步信号、行同步信号):产生此信号,说明开始显示新的一行。 2、VSYNC(垂直同步信号、帧同步信号):当产生此信号的话就表示开始显示

    2024年02月04日
    浏览(48)
  • 基于XDMA 中断模式的 PCIE 上位机与FPGA数据交互架构 提供工程源码和QT上位机源码

    PCIE(PCI Express)采用了目前业内流行的点对点串行连接,比起 PCI 以及更早期的计算机总线的共享并行架构,每个设备都有自己的专用连接,不需要向整个总线请求带宽,而且可以把数据传输率提高到一个很高的频率,达到 PCI 所不能提供的高带宽,是目前各行业高速接口的优

    2024年02月11日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包