FPGA基于AXI 1G/2.5G Ethernet Subsystem实现UDP通信DMA传输 提供工程源码和技术支持

news2024/11/25 18:41:24

目录

  • 1、前言
  • 2、我这里已有的UDP方案
  • 3、详细设计方案
    • 传统UDP网络通信方案
    • 本方案详细设计说明
      • DMA和BRAM
      • AXIS-FIFO
      • UDP模块设计
      • UDP模块FIFO
      • AXI 1G/2.5G Ethernet Subsystem:
      • 输出
  • 4、vivado工程详解
  • 5、上板调试验证并演示
    • 注意事项
  • 6、福利:工程代码的获取

1、前言

目前网上的fpga实现udp基本生态如下:
1:verilog编写的udp收发器,但不带ping功能,这样的代码功能正常也能用,但不带ping功能基本就是废物,在实际项目中不会用这样的代码,试想,多机互联,出现了问题,你的网卡都不带ping功能,连基本的问题排查机制都不具备,这样的代码谁敢用?
2:带ping功能的udp收发器,代码优秀也好用,但基本不开源,不会提供源码给你,这样的代码也有不足,那就是出了问题不知道怎么排查,毕竟你没有源码,无可奈何;
3:使用了Xilinx的Tri Mode Ethernet MAC三速网IP实现,这样的代码也很优秀,但还是那个问题,没有源码,且三速网IP需要licence,三速网IP实现了rgmii到gmii再到axis的转换;
4:使用FPGA的GTX资源利用SFP光口实现UDP通信,这种方案不需要外接网络变压器即可完成,本方案就是此种设计;

本设计调用Xilinx的AXI 1G/2.5G Ethernet Subsystem IP,使用硬件语言编写的UDP协议栈实现UDP通信的MAC层设计,调用Xilinx官方的AXI 1G/2.5G Ethernet Subsystem IP核实现了网络变压器的功能,从而实现无需外挂网络芯片即可实现UDP通信的方案;UDP协议栈已封装为FIFO接口,使得用户无需关心复杂的UDP协议而只需关心简单的用户接口时序即可操作UDP收发,非常简单;本设计调用AXI DMA和MicroBlaze,实现软核通过DMA发起UDP通信,MicroBlaze也可以用zynq代替,实现了zynq里PS软件通过调用PL端硬件资源实现1G千兆网UDP通信的功能;

本设计连接1路SFP光口,并使SFP光口的收发两端相连形成数据回环;FPGA开发板配置为UDP服务器;本设计经过反复大量测试稳定可靠,可在项目中直接移植使用,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字通信领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

2、我这里已有的UDP方案

目前我这里有如下几种UDP方案和应用实例:
我的博客主页有个FPGA以太网通信专栏,专栏是免费的,里面有很多FPGA实现的UDP应用,既有常规千兆网也有万兆网方案,对网络通信有需求的兄弟可以去看看:直接点击前往

3、详细设计方案

传统UDP网络通信方案

在讲述设计方案之前,我们先来看看FPGA实现UDP通信方案应具备什么条件,大体如下:
在这里插入图片描述
1:用户逻辑:
开发者需要收发的实际数据,可以以多种形势存在,比如自定义格式、AXIS数据流格式等等,用户逻辑的接口时序必须与MAC层的接口时序一致;
2:MAC层
主要由UDP、IP、ARP、ICMP等具体的协议逻辑组成,实现网络数据的组包与拆包,相当于做了软件里Sockte做的事儿,Sockte依赖CPU做网络数据包,而这里的MAC层直接使用硬件资源做网络数据包,解放了网络数据包对CPU的奴役,在当今时髦儿的RDMA中得以完美体现。。。本设计的MAC层采用米联客的UDP协议栈,关于这部分,请参考我之前写的文章
3:网络变压器
主要由PCS/PMA组成,PCS主要实现并行数据的编解码,比如经典的8b/10编解码,PMA主要实现并串/串并转换,输出接口是高速差分信号,可直接与SFP或者RG45网口连接;
4:RJ45网口:俗称水晶头,插网线的。。。
5:远端节点
本FPGA开发板可以理解为一个网卡,远端节点就是与之连接的另一个网卡,比如电脑主机上的网卡;

本方案详细设计说明

本设计与上述传统的FPGA实现UDP方案不同的是网络变压器部分,前面的网络变压器是真实的网络PHY芯片,比如我常用到的RTL8211、B50610、88E1518等等;本设计没有用到网络变压器,而是调用Xilinx官方的AXI 1G/2.5G Ethernet Subsystem IP核实现了网络变压器的功能,通过SFP光口输出实现UDP协议数据通信,设计框图如下:
在这里插入图片描述

DMA和BRAM

AXI-BRAM充当存储介质,可以用DDR代替,AXI-BRAM负责存储待发送UDP模块的数据,也存储从UDP模块接收到的UDP数据,如果数据量大,则可换成DDR,将AXI-BRAM换成AXI-MIG;AXI-DMA充当软件和硬件之间的桥梁,MicroBlaze软核通过AXI-Lite接口控制DMA的数据流向,也可以将软件侧的数据通过DMA发送出去,后端的UDP模块和AXI-Ethernet等硬件资源完全无需关心;如果是zynq系列器件,则可把MicroBlaze软核替换为Zynq软核,这样就实现了PS和PL资源的交互,且PS软件可直接控制硬件UDP协议完成数据收发,在架构上属于高端架构。。。

AXIS-FIFO

AXIS-FIFO充当AXI-DMA与UDP模块的桥梁,因为AXI-DMA的用户接口为AXIS数据流,而UDP模块也已封装为FIFO接口,所以直接调用两个AXIS-FIFO轻松实现不同数据接口模块之间的屋里连接,这里调用两个AXIS-FIFO,一个作为接收,另一个作为发送;

UDP模块设计

该UDP协议栈的功能和性能参数如下:原谅我装13秀一波英文。。。

FEATURES:
Implements UDP, IPv4, ARP protocols 
Zero latency between UDP and MAC layer 
 (combinatorial transfer during user data phase)
 See simulation diagram below
Allows full control of UDP src & dst ports on TX. 
Provides access to UDP src & dst ports on RX (user filtering) 
Couples directly to Xilinx Tri-Mode eth Mac via AXI interface 
Separate building blocks to create custom stacks 
Easy to tap into the IP layer directly 
Supports TX and RX with IP layer broadcast address 
Separate clock domains for tx & rx paths 
Choice of smaller single slot ARP or multislot up to 255 slots 
Tested for 1Gbit Ethernet, but applicable to 100M and 10M

UDP协议栈 Bolck Design设计框图如下:
在这里插入图片描述
核心代码采用VHDL语言实现,是为了更好的时序,顶层代码采用verilog语言实现,是为了方便用户例化,UDP模块已封装为FIFO接口,使得用户无需关心复杂的UDP协议而只需关心简单的用户接口时序即可操作UDP收发,非常简单;UDP模块带动态ARP、IP仲裁等功能,但不带ping功能;具体设计框图如下:
在这里插入图片描述
UDP层代码顶层文件直接拖入Block Design中可生成IP界面,IP界面可配置IP地址等信息,如图:
在这里插入图片描述

UDP模块FIFO

作用与前面说的AXIS-FIFO功能类似,充当UDP模块与AXI-Ethernet的桥梁,因为AXI-Ethernet的用户接口为AXIS数据流,而UDP模块也已封装为FIFO接口,所以手写一个UDP模块FIFO轻松实现不同数据接口模块之间的屋里连接;

AXI 1G/2.5G Ethernet Subsystem:

本设计使用 AXI 1G/2.5G Ethernet Subsystem IP 核实现物理层功能,IP核通过MicroBlaze软核配置;根据官方文档介绍,该IP功能如下:
在这里插入图片描述
更多关于该IP的细节,请自行阅读官方手册《pg138-axi-ethernet》;
AXI 1G/2.5G Ethernet Subsystem IP 核具体配置说明如下:
1: 配置链路速率为 1Gbps。;
2: 配置 PHY 接口类型为 1000BaseX;
3: 配置 MDIO PHY Address 为 1;
具体配置界面如图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

输出

AXI 1G/2.5G Ethernet Subsystem IP核直接输出到SFP接口,并使SFP光口的收发两端相连形成数据回环,即可完成工程的硬件连接,另外,为了与FPGA开发板通信和打印测试信息,工程还调用了一个AXI Uart IP,所以还需要一根USB转串口线连接开发板与电脑,电脑打开串口调试助手接口收到FPGA开发板打印的信息;串口波特率为115200,数据位8,无校验;

4、vivado工程详解

开发板FPGA型号:Xilinx-xc7k325tffg676-2;
开发环境:vivado2019.1;
输入/输出:SFP光口;
测试项:UDP数据回环;

工程Block Design如下:
在这里插入图片描述
综合后的工程代码架构如下:
在这里插入图片描述
综合编译后的FPGA资源消耗和功耗预估如下:
在这里插入图片描述
SDK代码架构如下:
在这里插入图片描述

5、上板调试验证并演示

本设计连接1路SFP光口,并使SFP光口的收发两端相连形成数据回环,如下:
在这里插入图片描述
打开vivado工程,编译后导出bit,运行SDK,然后通过SDK下载程序运行,打开电脑的串口调试助手,你会看到如下打印即可看到串口调试终端打印 SFP+光口外部回环的数据传输测试信息。
本案例的 GTX 带宽配置为 1Gbps,即 125MB/s。如下:
在这里插入图片描述
可从上图得到如下信息:
SFP+光口外部回环的数据传输速率为 84MB/s;
SFP+光口外部回环的数据传输误码率为 0;

SDK软件代码主要完成如下功能:
1:初始化 AXI Ethernet 驱动程序,如下:
在这里插入图片描述
2:设置 MAC 地址,需与UDP模块所设置的 MAC 地址一致,如下:
在这里插入图片描述
3:设置 PHY 参数,如链路速率等,如图:
在这里插入图片描述
4:启动 AXI Ethernet 设备,如下:
在这里插入图片描述
5:初始化并校准定时器,如下:
在这里插入图片描述
6:初始化 GPIO 驱动程序,用于监测 DMA AXIS MM2S Tvalid 信号;
由于本案例使用的 UDP 协议栈所支持的标准 UDP 包的数据长度小于 AXI DMA IP核内置 FIFO,当 AXI DMA 传输完成后,DMA 内部状态寄存器不会发生改变,因此无法通过检测 DMA 内部状态寄存器判断是否传输完成。故需增加 AXI GPIO IP 核来监测 AXI DMA的 Stream 端的 MM2S Tvalid 信号,从而判断 DMA 是否传输完成。如下:
在这里插入图片描述
7:初始化 DMA 设备,使用轮询模式,关闭 DMA 中断,构建每次传输所要发送的数据包,分别往 DMA 设备写入源地址、目的地址以及数据量,并启动 DMA 传输。启动DMA 传输后,使用 Timer 进行计时,等待 DMA 传输完成后计算数据传输速率;每次传输完成后,对传输数据进行校验;计算数据传输平均速率与误码率;这部分代码太多,就不截图了;

注意事项

AXI 1G/2.5G Ethernet Subsystem IP核需要Licence才能编译生成比特流,请到官方申请Licence

6、福利:工程代码的获取

福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下:
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/587700.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【simple-cache】一款只用一个注解就实现缓存的框架-我们终于迎来了SpringBoot版本

上次我们讲了【simple-cache】的使用: 【simple-cache】我开发了一款只要一个注解就可以轻松实现缓存的框架 这次主要更新的内容为: 添加springboot项目框架中去除了redisconfig类,避免了redis的单机和集群问题用户可以自定义使用自己项目中…

Python之字符串(str)基础知识点

strip() 删除指定字符 当token为空时,默认删除空白符(含’\n’,‘\r’,‘\t’,’ ),当非空时,根据指定的token进行删除。 字符的删除又可分为以下几种情况: string.strip(token):删除string字符串中开头(left)、结尾处(right)的…

【操作系统】02.进程管理

多道程序系统 多道就是将多个程序同时装入内存,使之并发运行。操作系统也是基于多道产生的,提高了资源利用率和系统吞吐量。 进程 定义 进程是程序的一次执行 进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位 在引入线…

会流程图却不会UML活动图?活动图深度剖析,就怕你学不会!

1. UML活动图是啥? 也许很多人都不怎么了解活动图,但是却对流程图很熟悉,你暂且可以简单的把活动图理解为UML里的流程图,用来描述系统的行为特征。不过UML活动图对比于流程图来说也存在不少差异,本文将在第三章节讲解活…

解决 MobaXterm X11 server 打开 wsl2 linux 子系统 rviz 可视化窗口卡顿问题

1、问题 环境: MobaXtermwsl2 Ubuntu-18.04ROS1Intel 核显 一直使用 MobaXterm 这个远程软件 ssh 链接 linux 服务器,因为它集成了 X11 server,即可以显示一些 linux 下有图形化界面的程序,如 ROS 的 rviz 等。 但是 MobaXterm…

宝塔面板一键部署Z-Blog博客 - 内网穿透实现公网访问

文章目录 1.前言2.网站搭建2.1. 网页下载和安装2.2.网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道(云端设置)3.3.Cpolar稳定隧道(本地设置) 4.公网访问测试5.结语 转发自cpolar极点云的…

一步一步的实现使用 Tensorflow Hub 进行图像分割

在本文中,我们将学习如何使用 TensorFlow Hub中提供的预训练模型执行语义图像分割。TensorFlow Hub 是一个库和平台,旨在共享、发现和重用预训练的机器学习模型。TensorFlow Hub 的主要目标是简化重用现有模型的过程,从而促进协作、减少冗余工…

[比赛简介]ICR - Identifying Age-Related Conditions

比赛链接:https://www.kaggle.com/competitions/icr-identify-age-related-conditions 比赛简介 本次比赛的目标是预测一个人是否患有三种疾病中的任何一种。您被要求预测该人是否患有三种疾病中的任何一种或多种(1 类),或者三种…

第14届蓝桥杯Scratch选拔赛(STEMA) 真题集锦

一、选择题 第 1题单选题 运行以下程序 (小象仅有两个造型),小象的造型是哪个? () 答案 A 解析 本题正确答案是A,考察的知识点是角色造型,在Scratch中,切换造型有两个指令,分别是“换成xx造型“和“下一个造型”,其中前者将角色切换为指定造型,而后者则从当前造型切换…

面向小白的最全Python数据分析指南,超全的!

因工作需求经常会面试一些数据分析师,一些 coding 能力很强的小伙伴,当被问及数据分析方法论时一脸懵逼的,或者理所当然的认为就是写代码啊,在文章开头先来解释一下数据分析。 数据分析是通过明确分析目的,梳理并确定…

虎牙在全球 DNS 秒级生效上的实践

博主介绍:✌全网粉丝4W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战、定制、远程,博主也曾写过优秀论文,查重率极低,在这方面…

六级备考18天|CET-6|写作第一讲|现象解释|10:00~10:45

目录 1. 议论文类型 现象解释 what,why,importance 观点选择 whether,choice,option 问题解决 how to,measures 图片图表 image,cartoon,diagram,chart 2. 基本题型 议论文、图表、谚语 3. 模版构成/段落结构划分 三个段落:10-11句 背景主题句过渡句 …

电加热道岔融雪系统设备

设备构成 融雪设备由道岔融雪远程控制中心工作站(以下简称工作站)、道岔融雪车站控制终端(以下简称控制终端)、道岔融雪控制柜(以下简称控制柜)、钢轨温度传感器、电加热元件、道岔融雪隔离变压器(以下简称隔离变压器)等组成。 01集中供电方式 02分散供电方式 设备型号及含义…

本地新建项目,git 到gitlab中

目录 1、首先,gitlab中,创建一个空项目 2. 本地项目上 操作 1) git init 2) 关联远程仓库 3)git pull 4) 查看远程分支 5)指定git pull 远程哪个分支 6)关联远程分支 7) .gitignore …

批量处理同列的相同值,合并成一个单元格

效果 易错点 选中公司部门的时候,选择是数据的开始的第一行和最后一行居中和合并完后,选择的也是公司部门的数据开始第一行和最后一行; 操作方法 1、 鼠标悬浮到你要合并的任意一栏 2、 选择菜单-数据汇总 3. 这两个值,要选择要分组的列名,求和方式…

【Unity】基于GLTFUtility插件加载gltf格式数据

C#代码:JSON数据解析 一、环境配置1. GLTFUtility项目git地址2. 安装支持工具:搜索Newtonsoft.Json并安装 二、代码调用1. 单线程加载GLTF/GLB2. 多线程加载GLTF3. 多线程加载GLB 三、加载参考案例1. 创建基础UI2. 挂接脚本到ReaderGLTF对象3. 加载结果 …

Flink从入门到精通之-11Table API 和 SQL

Flink从入门到精通之-11Table API 和 SQL 如图 11-1 所示,在 Flink 提供的多层级 API 中,核心是 DataStream API,这是我们开发流处理应用的基本途径;底层则是所谓的处理函数(process function)&#xff0c…

【八】设计模式~~~结构型模式~~~装饰模式(Java)

【学习难度:★★★☆☆,使用频率:★★★☆☆】 3.1. 模式动机 一般有两种方式可以实现给一个类或对象增加行为: 继承机制,使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类…

当APP进入推荐榜,我们需要做些什么

在苹果的应用商店内,“today标签页”和“热门推荐页”的曝光率会更高些,更新时间都是每周五的上午八点前后,热门推荐页的占比权重大,是获取流量的重大突破口,如果应用本身优秀,还可获得更好的下载转化率。 …

华为OD机试之模拟商场优惠打折(Java源码)

模拟商场优惠打折 题目描述 模拟商场优惠打折,有三种优惠券可以用,满减券、打折券和无门槛券。 满减券:满100减10,满200减20,满300减30,满400减40,以此类推不限制使用; 打折券&…