[X]关闭
1

S05-CH05 PS 千兆 UDP 加速

摘要: 在米联的教程中已经陆续介绍了 4 种在 ZYNQ 平台进行网络通信开发的方案。本教程将基于 MZ7035 开发板介绍第 5 种应用方案。本方案的思路为:在PL 端通过米联的 UDP IP 协议栈为PS 端实现网络协议加速,与传统通过 P ...

软件版本:VIVADO2017.4

操作系统:WIN10 64bit

硬件平台:适用米联客 ZYNQ系列开发板

米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!!

5.1 概述

      在米联的教程中已经陆续介绍了 4 种在 ZYNQ 平台进行网络通信开发的方案。本教程将基于 MZ7035 开发板介绍第 5 种应用方案。本方案的思路为:在PL 端通过米联的 UDP IP 协议栈为PS 端实现网络协议加速,与传统通过 PS 端进行网络通信的方法相比,本方案完全卸载了 PS 对于 UDP、IP、ARP 等网络协议的软件开销,从而实现UDP 通信的加速。

      需要说明的是,此处所说的“加速”并不是指提高网络传输速率,而是指卸载了PS 对于网络协议的软件开销, 使其可以获得更高的 CPU 利用率。同时,这种方案也便于实现单个 CPU 同时实现多路网络通信,进一步扩展了 PS 的 UDP 传输带宽总量。

      本教程基于《UDP 千兆光通信》一章中的udp_ip_1g_sfp_4ch 例程进行进一步开发,实现了 4路PS 的千兆 UDP吗,加速(MZ7035为2路sfp+接口,对应udp_ip_1g_sfp_2ch)。

加速。

5.2 基本原理

       本例程中,设计了一个自定义 IP 核 udp_ip_stack_controller,该 IP 核主要用于对 UDP IP 协议栈进行参数配置和管理。PS 则可通过AXI-Lite 总线利用 udp_ip_stack_controller 对UDP IP 协议栈进行控制。

      同时,PS 通过 AXI Direct Memory Access IP 核与PL 端的UDP IP 协议栈通过AXI-Stream 接口进行数据双向传输,从而实现PS 通过 PL 部分的 UDP IP 协议栈进行 UDP 网络数据收发。单路 UDP 加速的实现原理如下图所示。

实现 4 路 UDP 加速只需要复制单路的框架即可。

5.3 PL 逻辑设计

 

       本例程中仍然需要使用 AXI-Stream DATA FIFO、AXI4-Stream Data Width Converter、Tri Mode Ethernet MAC 以

及 1G/2.5G Ethernet PCS/PMA or SGMII 这几个 IP 核,这些 IP 核的使用在《UDP 千兆光通信》一章中已经进行了详细描述。由于本例程基于《UDP 千兆光通信》而设计,因此 IP 的用法与之完全一致,此处不作赘述。

5.3.1PS 设置


     将 FCLK0 作为 HP0 口的同步时钟,这样单个 HP 口的带宽可以达到 125M×64bit=8Gb/s ,可以同时满足 4 路千兆以太网的全双工满额带宽要求。

     使能PL 到PS 的中断接口,如下图所示。PS 一共需要连接 12 个中断,分别为:4 个 AXI Direct Memory Access

各产生接收和发送 2 个中断,4 个UDP IP 协议栈各产生 1 个 dst_ip_unreachable 信号作为中断。

5.3.2AXI Direct Memory Access

       AXI Direct Memory Access 用于在PS 的DDR 和UDP IP 协议栈之间进行高速数据传输。AXI Direct Memory Access 的设置如下图所示。由于网络中单个 IP 包最大为 1500 字节,所以单个 UDP 包可以携带的数据量为

      1500-20-8=1472 字节,所以 Buffer Length Register 的位宽只需要设置成 11bit 即可,单次 DMA 可以传输的长度为1~2047 字节。另外,AXI 和 Stream 接口的位宽都要设为 64bit。

5.3.3udp_ip_stack_controller

      udp_ip_stack_controller 是一个米联的自定义 IP 核,主要用于通过 AXI-Lite 总线对UDP IP 协议栈进行配置和管理,IP 核位于工程目录ip_repo 文件夹中。如下图所示。

      IP 核右侧的的输出端口与UDP IP 协议栈的各项输入配置参数一一对应,PS 可通过AXI-Lite 总线随时对这些参数进行设置。左侧则由 3 个协议栈的反馈输入信号。各参数定义如下表所示。

 

5.3.4 AXI Direct Memory Access 与 udp_ip_stack_controller 的连接

 

     AXI Direct Memory Access 与 udp_ip_stack_controller 的连接关系如下图所示。

      UDP IP 协议栈到AXI DMA 的发送路径使用了 1 个异步AXI-Stream DATA FIFO 进行数据缓冲。

      AXI DMA 到UDP IP 协议栈的发送路径使用了 2 个AXI-Stream DATA FIFO,通过其中 1 个 FIFO 实现异步时钟域的转换和数据缓冲,1 个同步 FIFO 实现 Packet mode 功能。

      异步AXI-Stream DATA FIFO 两端的时钟分别为 125MHz(64bit)和 15.625MHz(64bit)。使用同步 FIFO 的 Packet mode 是由于所设计的UDP IP 协议栈的AXI-Stream 接口要求 1 个数据包的tvalid 信号在数据包持续期间必须恒为 1。

 

5.4 PS 程序设计

      PS 端主要是配置和使用 PL 端的 AXI DMA 和 udp_ip_stack_controller IP 核进行 UDP 数据传输。PS 端的工程主要包含以下几个源文件,如下图所示。

 

5.4.1Main 函数

      main 函数主要完成如下功能:

  • 初始化PS 中断控制器及系统中断;
  • 初始化并配置 AXI Direct Memory Access 及其中断;
  • 初始化并配置 udp_ip_stack_controller 及其中断;
  • 进行 UDP 数据包环路测试或发送速率测试。

      另外,在 main.c 文件中包含了几个重要的宏定义,如下所示。

      其中,由于例程每次只对 PS 的 4 路 UDP 加速通道中的 1 路进行测试,因此,TEST_INTERFACE_INDEX 代表所要测试的 1 路 UDP 加速通道的测试序号,分别对应如下 4 个选项。每个依次对应底板的一个 SFP 接口,名称与PCB 丝印一致。

      TEST_MODE 对应测试的模式,有以下两个选项。分别代表 UDP 环路测试和 UDP 发送速率测试。

      TEST_PACKET_LENGTH 代表 UDP 发送速率测试中每次发送的数据包长度,最大不能超过 1472 字节。

      TEST_UNREACHABLE_INTR 代表是否需要进行 UDP IP 协议栈产生的目的 IP 地址不可达的中断测试。对应

TRUE 和 FALSE 两个选项。

5.4.2系统中断

          PS 中断控制器的初始化程序包含在 sys_intr.c 和 sys_intr.h 中。sys_intr.c 中主要包含以下 2 个函数。

           ●Init_Intr_System,初始化 PS 的中断控制器;

           ●Setup_Intr_Exception,初始化 PS 的中断服务函数。

5.4.3AXI Direct Memory Access 驱动

            AXI Direct Memory Access 部分的驱动程序包含在 dma_intr.c 和 dma_intr.h 中。dma_intr.c 主要包含以下几个函数。

           ●DMA_Intr_Init,用于配置和初始化 PL 端的 AXI Direct Memory Access IP 核及相关参数;

           ●DMA_Setup_Intr_System,用于初始化 AXI Direct Memory Access 产生的接收和发送中断;

           ●DMA_Intr_Enable,使能 AXI Direct Memory Access 的接收和发送中断;

          ●DMA_DisableIntrSystem,关闭 AXI Direct Memory Access 的接收和发送中断;

          ●DMA_TxIntrHandlerAXI Direct Memory Access 发送中断服务函数,每次发送完 1 个数据包便会调用该函数 ;

          ●DMA_RxIntrHandlerAXI Direct Memory Access 接收中断服务函数,每次接收完 1 个数据包便会调用该函数。    

         在 dma_intr.h 中包含了一些宏定义、全局变量和函数声明。需要说明的是,其中,宏定义:

#define MAX_PKT_LEN (1472)

        表示每次传输的最大 UDP 数据量为 1472 个字节(不含 UDP 首部)。

        其余参数在此不作一一介绍,具体可以查阅相关代码和注释。

5.4.4 udp_ip_stack_controller 驱动

        udp_ip_stack_controller 部分的驱动程序包含在 udp_ip_stack.c 和 udp_ip_stack.h 中。udp_ip_stack.c 主要包含以下几个函数。

        ●udp_ip_stack_config,用于配置和初始化 PL 端的udp_ip_stack_controller IP 核的各个参数,包括本地 MAC、IP 地址,本地 UDP 端口号,是否启用 ARP 和 ICMP 功能等等;

        ●print_udp_ip_stack_setting,打印 UDP IP 协议栈的当前设置;

        ●Set_LocalMacAddress,被 udp_ip_stack_config 函数调用,用于配置 udp_ip_stack_controller 的本地MAC 地址;   

        ●setup_udp_ip_stack_intr,配置并使能 udp_ip_stack_controller 的中断;

        ●IntrHandler,udp_ip_stack_controller 的中断服务函数,表示发送的目的 IP 地址不可达。

        udp_ip_stack.h 定义许多宏定义形式的函数。均用于 udp_ip_stack_controller 的参数设置和读取。功能定义如下表所示。

      2 个 UDP IP 协议栈所产生的中断编号分别为 84、85,如下所示。

5.5 例程测试

     本教程设计了 1 个测试例程: ps_udp_speedup_1g_2ch。例程中同时例化了2个 UDP IP 协议栈,实现了 2路 PS 的 UDP 传输通道。

     在例程中,电脑的 IP 地址为 192.168.10.5,UDP 端口号为 61441,MZ7035 开发板中的 2 个 UDP IP 协议栈的的 IP 地址分别为 192.168.10.1、192.168.10.2,DP 端口号均为 61440。

     将 SFP 电模块及网线与底板丝印编号为 SFP-A、SFP-B中任意一个 SFP 屏蔽笼连接,如下图所示。

 

      根据所连接的 SFP 模块的编号,需要修改 main.c 里面的宏定义 TEST_INTERFACE_INDEX 改为相应的

      SFP_A 或 SFP_B,如下所示。然后重新编译 SDK 工程。

      测试前,需要将所使用电脑网卡的 IP 地址设置为 192.168.10.5,子网掩码设为 255.255.255.0,如下图所示。

 

5.5.1UDP 环路测试

将 main.c 中的宏定义 TEST_MODE 设置为 LOOPBACK_TEST,如下所示。

5.5.1.1 通道 1

UDP 传 输 通 道 1 与 开 发 板 SFP_A 连接, IP 地址为 192.168.10.1 。 修改 main.c 里 面 的 宏 定 义

TEST_INTERFACE_INDEX改为相应的SFP_A,如下所示。

 

      然后重新编译SDK工程,并将程序下载到开发板中然后运行。等到开发板底板的LD4 LED灯亮起,代表网络建立连接完成。打开网络调试助手,分别设置好电脑和通道1的IP地址位和UDP端口号,通过网络调试助手以UDP包的形式向开发板发送文字数据,并以1ms的间隔不断循环发送,如下图所示。

      从上图中可以看出,网络调试助手所发出的udp包和开发板返回的udp包一致,接收和发送的数据包数量一致。

      SDK串口打印如下信息,提示接收到的每个包的长度、源端口号以及是否存在UDP校验和错误。

       通过 wireshark 软件可捕获电脑和开发板之间的通信数据包,如下图所示。

 

5.5.1.2 通道 2

 

       UDP 传输通道 2 与 开 发 板 SFP_B 连接, IP 地址为 192.168.10.2 。 修改 main.c 里面的宏定义

TEST_INTERFACE_INDEX改为相应的SFP_B,如下所示。

       然后重新编译 SDK 工程,并将程序下载到开发板中然后运行。等到开发板底板的 LD3 LED 灯亮起,代表网络建立连接完成。同理,打开网络调试助手,分别设置好电脑和通道 2 的 IP 地址位和 UDP 端口号,通过网络调试助手以 UDP 包的形式向开发板发送文字数据,并以 1ms 的间隔不断循环发送,如下图所示。

5.5.1.3 Ping、ARP 测试 

      在进行 UDP 环路测试的同时,可以通过 cmd 命令窗不断向开发板发起 ping 命令,观察 ping 命令的返回。例如,在通道 1 测试过程中进行ping 命令测试,如下图所示。从图中可以看到开发板能够快速响应电脑发起的 ping 命令,UDP 数据包收发与ping 应答互不干扰。

      通过 wireshark 软件对 ping 过程的数据进行抓包验证,如下图所示。

      在整个测试过程中,电脑会以一定频率持续向开发板发送 ARP 请求,开发板均能及时响应,wireshark 软件抓取的电脑与开发板的 ARP 通信过程如下图所示。

5.5.2发送速率测试

     将 main.c 中的宏定义 TEST_MODE 设置为 TX_PERFORMANCE_TEST,TEST_INTERFACE_INDEX 改为相应的 SFP_A,如下所示。

     将宏定义 TEST_UNREACHABLE_INTR 设为 FALSE,如下所示。这表示发送的目的 IP 地址仍然使用

192.168.10.5。

      将 TEST_PACKET_LENGTH 设为最大长度 1472,如下所示。这样是为了获得最大的发送带宽。

       然后重新编译 SDK 工程,并将程序下载到开发板中然后运行。

在任务管理器中可以观察到此时 UDP IP 协议栈的发送速率,如下图所示。此时千兆网的带宽利用率为 92.8%。

通过 wireshark 可以获取开发板发出的 UDP 数据包。如下图所示。

 

5.5.3协议栈中断测试

 

        将 main.c 中的宏定义 TEST_UNREACHABLE_INTR 设置为 TRUE,TEST_INTERFACE_INDEX 改为相应的

SFP_A,如下所示。

      然后重新编译 SDK 工程,并将程序下载到开发板中然后运行。此时,UDP IP 协议栈的发送目的 IP 地址将从192.168.10.5 变为 192.168.10.6。PS 所发送的 UDP 包将无法送达 IP 地址为 192.168.10.5 的电脑。所以,UDP IP 协议栈将持续向 192.168.10.6 的 IP 地址发送ARP 请求。例如,测试通道 0 时,通过 wireshark 抓取通过 SFP-A 接口发出的ARP 请求包如下图所示。

       每次发送ARP 包的时间间隔由 Set_ArpTimeOut 所设置的时钟周期数所决定。在例程中,这个时间间隔设置为

40,000,000 个时钟周期数,由于 UDP IP 协议栈的工作时钟为 15.625MHz,因此,这个时间为 40,000,000×64ns = 2.56s。当 UDP

      IP 协议栈重复发送的ARP 请求超过 Set_ArpRetryTimes 所设置的次数时,则会拉高 dst_ip_unreachable

端口,向 PS 产生一次目的 IP 地址不可达的中断。每次中断后 PS 都会通过串口输出提示信息,如下图所示。在例程

中,重传次数设为 2,所以UDP IP 协议栈每发送 3 个 ARP 请求后向PS 产生一次中断。

      需要注意的是,由于设计的限制,当出现程序进入 IP 地址不可达的状态,将无法恢复正常发送数据的过程。如果用户需要继续进行数据发送,只能复位并重新下载程序才能继续使用。


路过

雷人

握手

鲜花

鸡蛋
发表评论

最新评论

引用 veghm 2020-8-24 22:58
keyi

查看全部评论(1)

本文作者
2019-9-28 15:19
  • 1
    粉丝
  • 3967
    阅读
  • 1
    回复

关注米联客

扫描关注,了解最新资讯

联系人:汤经理
电话:0519-80699907
EMAIL:270682667@qq.com
地址:常州溧阳市天目云谷3号楼北楼201B
热门评论
排行榜