目录
- 1、前言
- 2、我这里已有的UDP方案
- 3、详细设计方案
- 传统 FPGA UDP 方案
- 本 FPGA 10G UDP 方案(牛逼)
- 10G Ethernet 框图
- 10G Ethernet 发送解析
- 10G Ethernet 接收解析
- 10G Ethernet 寄存器配置
- 10G Ethernet UI 配置
- 4、vivado工程详解
- 5、上板调试验证并演示
- ping功能测试
- 数据收发测试
- 10G 网速测试
- 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,通信,这种方案不需要外接网络变压器即可完成,本方案就是此种设计;
本设计使用UDP协议栈实现UDP通信的MAC层设计,调用Xilinx官方的10G Ethernet Subsystem IP核实现了网络变压器的功能,从而实现无需外挂网络芯片即可实现UDP通信的方案,轻松实现时下热门的10G万兆网通信;顶层代码设置了1个用户按键,不按下按键时工程科进行UDP数据回环测试,按下用户按键后,可进行网速测速测试;本例程使用的UDP该协议栈目前并不开源,只提IP核,但不影响使用,该协议栈带有用户接口,使得用户无需关心复杂的UDP协议而只需关心简单的用户接口时序即可操作UDP收发,非常简单;本设计通过一个fifo实现UDP数据的回环收发,并在电脑端使用网络调试助手进行UDP收发验证;
本设计链接1路SFP光口,配置为UDP服务器,本设计经过反复大量测试稳定可靠,可在项目中直接移植使用,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字通信领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;
2、我这里已有的UDP方案
目前我这里有如下几种UDP方案和应用实例:
我的博客主页有个FPGA以太网通信专栏,专栏是免费的,里面有很多FPGA实现的UDP应用,既有常规千兆网也有万兆网方案,对网络通信有需求的兄弟可以去看看:直接点击前往
3、详细设计方案
传统 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 10G UDP 方案(牛逼)
本FPGA开发板可以理解为一个网卡,远端节点就是与之连接的另一个网卡;
本设计与上述传统的FPGA实现UDP方案不同的是网络变压器部分,前面的网络变压器是真实的网络PHY芯片,比如我常用到的RTL8211、B50610、88E1518等等;本设计没有用到网络变压器,而是调用Xilinx官方的10G Ethernet Subsystem IP核实现了网络变压器的功能,通过SFP光口输出实现与远端节点的连接,设计框图如下:
本设计在电脑端使用网络调试助手和开发板通信,实现UDP数据环回试验,本设计没有使用外接网络变压器,而是调用Xilinx官方的10G Ethernet Subsystem IP核,利用SFP光口输出的形式完成。
顶层文件udp_test.v:
对于 udp_ip 的例化时,设置本地的 ip 地址,也就是开发板的 IP 地址为192.168.10.1,本地的 MAC 地址为 000a3501fec0,目的 IP 地址设置为 192.168.10.2,源端口为61441,目的端口为 61441。用户接口分为接收与发送,全都是 AXI4 流接口,同样 MAC 接口也是 AXI4 流接口,与 10G MAC 对接。
IP地址和端口号可自由修改,位置如下:udp_test.v
UDP回环模块:
UDP回环模块的文件为udp_read_write_ctrl.v 主要是实现用户功能,实现了两种模式的切换,一种是 loopback 模式,也就是上位机向开发板发送数据,开发板再把接收到的数据发送回去;另外一种就是测速模式,开发板持续向 10G 设备发送数据包;两种模式通过按键进行切换。
MAC层:
使用自定义IP实现,即UDP协议栈,该UDP协议栈拥有动态ARP,ping等功能,可实现UDP收发;
这里重点讲一讲Xilinx官方的10G Ethernet Subsystem IP核;
注意!!!
10G Ethernet Subsystem IP核只有在K7及其以上FPGA才有;
10G Ethernet 框图
上图为 10G MAC 的原理框图,可以查看 pg157 文档。其中发送部分、接收部分都是 AXI 流接口,数据宽度为 64 位。同时还有 AXI4-Lite 接口,用于配置 MAC 寄存器等。我们关注的重点主要是数据传输接口,也就是发送和接收部分。
10G Ethernet 发送解析
从上表中也可以看到,AXIS 接口可以配置为 64 位或 32 位,是在配置 IP 核的时候进行选择的。根据不同的数据宽度,参考时钟频率也不同,在文档里也可以看到,64 位时钟为 156.25MHz,32位时钟为312.5MHz。在本实验中我们使用64位的数据,其带宽也就是156.25M64bit=10Gbps。
由于 10GBASE-R 是 64b/66b 编码,因此收发器的速度为 10Gbps66/64 = 10.3125Gbps。
以下为 64 位发送端正常模式下的时序,其中的 DA 为 destination mac address,即目标 MAC地址;SA 为 source mac address,即源 MAC 地址;L/T 为 length/type 信息,即长度或类型;D为数据信息。可以看到正常模式下是不带 CRC 校验的,这部分由 MAC 来完成。
一包数据部分长度要求为 46~1500 字节,也就是 D 部分,如果不足 46 字节,MAC 会自动插入数据到 46 字节。但是如果 MAC IP 被配置成有 FCS 部分,也就是 CRC 校验部分,用户需要保证数据部分长度满足要求,否则会被 MAC IP 认为是 Bad Frame。本节实验中,采用正常模式,不加 FCS 部分。
10G Ethernet 接收解析
接收部分与发送部分最大的不同是没有了 tready 信号,也就是不需要用户这边提供准备信号,而是一直不停的接收数据。同时 tuser 指示接收到的包是否正确,用户可以根据此信号判断包的正确性。
以下是 64 位接收到正确包的时序图,可以看到是在 tlast 有效时,tuser 同时有效,表明此包是正确的包。
下面是接收到错误包的情况,在 tlast 有效时,tuser 为低电平。
以下的情况会出现错误包:
1: FCS 发现错误
2:数据包长小于 64 字节,也就是 DA(6)+SA(6)+L/T(2)+D+FCS(4)的长度,其中 D 的长度要大于
等于 46 字节。
3:没有使能巨型帧的情况下,接收到巨型帧
4:数据包长度大于 MTU 要求
还有其他一些情况也会出现错误,这里就不在列举了,详情可以参考 pg157 文档。
同样,接收部分也有是否插入 FCS 的配置,在本实验中采用默认的正常模式,不插入 FCS。
10G Ethernet 寄存器配置
在文档中也介绍了很多的寄存器,这些寄存器都是通过 AXI4-Lite 总线配置的,工程中给出了配置源码,axi_10g_ethernet_0_axi_lite_sm.v 是从 10g mac 的 example 工程中得来的,功能是配MAC,不需要改变,直接拿来用即可,具体的寄存器说明请参考 pg157 文档。
10G Ethernet UI 配置
IP配置如下:
4、vivado工程详解
开发板FPGA型号:Xilinx xc7k325tffg900-2;
开发环境:vivado2019.1;
输入/输出:SFP光口;
网卡速度:10G;
测试项:UDP数据回环,ping等;
工程代码架构如下:
综合编译后的FPGA资源消耗和功耗预估如下:
5、上板调试验证并演示
本实验需要用户自己准备 10G 网卡,插到电脑主板上。下图为我在某鱼上买的二手货。。。
连接方式如下:
开发板侧SFP连接如下:
ping功能测试
板子上电下载bit后,先测试ping功能,如下:
单次ping还不够,直接上连续ping,如下:
数据收发测试
然后是用网络调试助手进行数据收发测试,网卡连接成功后网络调试助手会收到FPGA发来的测试字符串,1s发一次,如下:
然后发送大批量数据进行测试,测试结果如下:
10G 网速测试
测速功能要慎重!!!会导致电脑严重卡顿!!!
测速功能要慎重!!!会导致电脑严重卡顿!!!
测速功能要慎重!!!会导致电脑严重卡顿!!!
可以先打开任务管理器,在性能中看以太网传输速度
按下顶层中绑定的用户按键,以太网速度会发生变化。
在电脑上观察开发板以太网网口的发送速率,这个测速只代表可能的最高的速度,不代表电脑真实的不丢包速度,UDP 的点到点不丢包速度和电脑的网卡、CPU 速度、内存速度、操作系统都有关系。。。
如果电脑出现严重卡顿,请及时再次按下按键,即可切换到 Loopback 模式!!!
6、福利:工程代码的获取
福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下: