目前网上的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的10G Ethernet PCS/PMA IP,使用纯VHDL语言编写的10G UDP协议栈实现UDP通信的MAC层设计,调用Xilinx官方的10G Ethernet PCS/PMA IP核实现了网络变压器的功能,从而实现无需外挂网络芯片即可实现UDP通信的方案;U10G UDP协议栈已封装为AXIS接口和XGMII接口,使得用户无需关心复杂的UDP协议而只需关心简单的用户接口时序即可操作UDP收发,非常简单;本设计调用AXI DMA和MicroBlaze,实现软核通过DMA发起UDP通信,MicroBlaze也可以用zynq代替,实现了zynq里PS软件通过调用PL端硬件资源实现10G万兆网UDP通信的功能;
本设计连接1路SFP光口,并使SFP光口的收发两端相连形成数据回环;FPGA开发板配置为UDP服务器;本设计经过反复大量测试稳定可靠,可在项目中直接移植使用,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字通信领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;
目前我这里有如下几种UDP方案和应用实例:
我的博客主页有个FPGA以太网通信专栏,专栏是免费的,里面有很多FPGA实现的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官方的10G Ethernet PCS/PMA IP核实现了网络变压器的功能,通过SFP光口输出实现UDP协议数据通信,设计框图如下:
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充当AXI-DMA与UDP模块的桥梁,因为AXI-DMA的用户接口为AXIS数据流,而UDP模块也已封装为FIFO接口,所以直接调用两个AXIS-FIFO轻松实现不同数据接口模块之间的屋里连接,这里调用两个AXIS-FIFO,一个作为接收,另一个作为发送;
10G-UDP协议栈的用户接口和外部接口分别为AXIS接口和XGMII接口,关于10G-UDP协议栈的详细描述,请参考我之前写的文章,文章链接:https://blog.csdn.net/qq_41667729/article/details/130897803
本案例使用 10G Ethernet PCS/PMA IP 核实现物理层(PCS 与 PMA)功能;10G Ethernet PCS/PMA IP 核开发文档为Xilinx 官方参考文档《pg068-ten-gig-eth-pcs-pma》,具体配置请参考我之前写的文章,文章链接:https://blog.csdn.net/qq_41667729/article/details/130897803
10G Ethernet PCS/PMA IP 核直接输出到SFP接口,并使SFP光口的收发两端相连形成数据回环,即可完成工程的硬件连接,另外,为了与FPGA开发板通信和打印测试信息,工程还调用了一个AXI Uart IP,所以还需要一根USB转串口线连接开发板与电脑,电脑打开串口调试助手接口收到FPGA开发板打印的信息;串口波特率为115200,数据位8,无校验;
开发板FPGA型号:Xilinx-xc7k325tffg676-2;
开发环境:vivado2019.1;
输入/输出:SFP光口;
测试项:UDP数据回环;
工程Block Design如下:
综合后的工程代码架构如下:
综合编译后的FPGA资源消耗和功耗预估如下:
SDK代码架构如下:
SDK实现的功能主要如下:
1:设置传输数据包大小为 65524Byte,如图:
2:初始化并校准 Timer,如图:
3:初始化 DMA 设备,如图:
4:使用轮询模式,关闭 DMA 中断,如图:
5:构建每次传输所要发送的数据包,如图:
6:分别往 DMA 设备写入源6:地址、目的地址与数据量,并启动 DMA 传输,如图:
7:启动 DMA 传输后,使用 Timer 进行计时,等待 DMA 传输完成后计算数据传输速率,由于进行 UDP 数据收发时,需将一帧数据包完全存入 FIFO 中才能继续进行数据发送或接收,从而产生时延,因此该案例测试 UDP 数据传输速率时,仅统计 DMA 将数据搬运到 FIFO 的时间,如图:
8:每次传输完成后,对传输8:数据进行校验,如图:
9:计算数据传输平均速率与误码率,如图:
本设计连接1路SFP光口,并使SFP光口的收发两端相连形成数据回环,如下:
打开vivado工程,编译后导出bit,运行SDK,然后通过SDK下载程序运行,打开电脑的串口调试助手,你会看到如下打印即可看到串口调试终端打印 SFP+光口外部回环的数据传输测试信息。
本案例的 GTX 带宽配置为 10Gbps,即 1250MB/s。如下:
可从上图得到如下信息:
SFP+光口外部回环的数据传输速率为 1197MB/s;
SFP+光口外部回环的数据传输误码率为 0;
福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下: