【JokerのZYNQ7020】AXI_ETHERNET_MTU_9K。

时间:2024-03-26 07:06:53

软件环境:vivado 2017.4        硬件平台:XC7Z035


 今天的关键词是jumbo frame、mtu 9k 。具体说说是什么意思,在图像或者雷达进行实时、高速、大数据量传输时,普通的以太网接口(PS端,单帧小于1500B)就很难满足要求了,这时,启用巨型帧Jumbo Frame,单帧大小最大可以支持到9K,可以有效的提升带宽,使网络利用率大大提高。

首先说下为什么PS端的千兆网口不行。如下图,外部网络数据经网线,走RJ45→RGMII→MAC层→DMA→AHB。

【JokerのZYNQ7020】AXI_ETHERNET_MTU_9K。

其实主要是在DMA这块儿,手册UG585, 503页,DMA使用的是packet buffer,而不论是接收的buffer还是发送的buffer,最大也就4K,这时候你要是突发单次9K的数据,当然不可能通过。

【JokerのZYNQ7020】AXI_ETHERNET_MTU_9K。

解决这个问题的方法,先看手册XAPP1082,总共介绍了以太网通信三条路径,紫色这条就是刚才分析过的纯PS端的路径,而青色这条,可以看到虽然接口从RJ45变为SFP(光纤),但实际在到PS这边,走的依旧是PS这边的DMA,这就相当于MAC层的本质没变,两个buffer还是锁在4K,不解决根本问题,反观红色的最后一条路,过SFP后,经过的是AXI_ETHERNET和AXI_DMA,再过HP口,直接送进PS端,相当于MAC是在PL这边实现的,这样就没有buffer 4K的问题。

【JokerのZYNQ7020】AXI_ETHERNET_MTU_9K。

Xilin ZYNQ的wiki百科,对这个图上几条路线的区别,说的也比较明白,青色线和红色线,由于都过SFP,过1000BASE-X/SGMII所以同一时间,只有一条路径有效,GEM0和GEM1最大支持的单帧大小是1522,虽然支持大于16k的包,但是在IP层会被自动切片分成1522大小,而PL侧的AXI EMAC就没有这个问题,直接支持巨型帧Jumbo Frame,这也是PS侧PL侧EMAC的主要区别。

【JokerのZYNQ7020】AXI_ETHERNET_MTU_9K。

 说时迟那时快,立马我就掏出了vivado2017.4,搞一个AXI_ETHERNET + AXI_DMA的原理图如下所示。

【JokerのZYNQ7020】AXI_ETHERNET_MTU_9K。

 DMA的设置如下。需要说一下,Width of Buffer Length Register和Max Burst Size我以为大点好,试了下23和256,也不晓得为嘛,反正不求行,目前下面的这些参数是试过成功的。

【JokerのZYNQ7020】AXI_ETHERNET_MTU_9K。

AXI_ETHERNET的设置如下。接口选RGMII。

【JokerのZYNQ7020】AXI_ETHERNET_MTU_9K。

 MAC特性如下。

【JokerのZYNQ7020】AXI_ETHERNET_MTU_9K。

 这里还需要说明一下,就是好像AXI_ETHERNET这个IP核的License是需要购买的,如果不购买的话,上图中TX Memory Size和RX Memory Size只能使用默认的4K,如果改动就会报下图中的错误。临时测试使用的话,可以去Xilinx官方主页申请包含AXI_ETHERNET的试用版License。

【JokerのZYNQ7020】AXI_ETHERNET_MTU_9K。

 时钟模块的输入时钟根据自己系统更改。

【JokerのZYNQ7020】AXI_ETHERNET_MTU_9K。

输出时钟如下。 

【JokerのZYNQ7020】AXI_ETHERNET_MTU_9K。

最后加入管脚约束文件, Generate Bitstream,Export Hardware(注意勾选include biestream),最后launch SDK进行测试。


SDK这边,初始化一个LWIP的应用。

【JokerのZYNQ7020】AXI_ETHERNET_MTU_9K。

Board support  Package Settings右键。

【JokerのZYNQ7020】AXI_ETHERNET_MTU_9K。

 默认DHCP是开启的,最好先关掉,分配静态的IP地址。

【JokerのZYNQ7020】AXI_ETHERNET_MTU_9K。

ip_frag_max_mtu改9K,单帧的最大长度。

【JokerのZYNQ7020】AXI_ETHERNET_MTU_9K。

接下来这些的设置,和上节中的差不多。

【JokerのZYNQ7020】AXI_ETHERNET_MTU_9K。

最后,千万别忘了,最关键的,把巨型帧使能打开。

【JokerのZYNQ7020】AXI_ETHERNET_MTU_9K。

 接下来,main.c里面,把ip改成和PC在一个网段的ip。

【JokerのZYNQ7020】AXI_ETHERNET_MTU_9K。

还有一点要千万注意!!!板子的网线最好直连电脑的网口,记得!千万!千万!千万!别过路由,不然路由会把你大于1500的包虑掉,板子一样接收不到。PC端需要打开巨型帧。 我系统是老牌WIN7,在网络和共享中心→本地连接→属性→配置。

【JokerのZYNQ7020】AXI_ETHERNET_MTU_9K。

 高级→巨型帧→9K。

【JokerのZYNQ7020】AXI_ETHERNET_MTU_9K。

在看一眼下面的链接速度和双工模式,最好改成1G全双工。

【JokerのZYNQ7020】AXI_ETHERNET_MTU_9K。

都做好以后,程序就可以开始Debug了,如何测试9k到底通不通,最简单的办法当然是ping。

【JokerのZYNQ7020】AXI_ETHERNET_MTU_9K。


最后,说一下zynq千兆网的实际性能,都是Xilix官方的数据,可以看到,带MP和不带MP的SOC,差距还是很大的。

 

【JokerのZYNQ7020】AXI_ETHERNET_MTU_9K。

 【JokerのZYNQ7020】AXI_ETHERNET_MTU_9K。

【JokerのZYNQ7020】AXI_ETHERNET_MTU_9K。