基于zynq的千兆网udp项目_米联客 ZYNQ/SOC 精品教程 S05-CH03-UDP千兆光通信

3.1概述

MZ7035开发板具有的2路SFP接口,可实现千兆光纤以太网通信。使用开发板中实现千兆网UDP传输的基本逻辑框架如下图所示。FPGA程序基于米联的新版UDP IP协议栈以及Xilinx的IP核Tri Mode Ethernet MAC和1G/2.5G Ethernet PCS/PMA or SGMII而实现。

本文档对应2个例程,分别为udp_ip_1g_sfp和udp_ip_1g_sfp_4ch,分别实现单路和4路千兆UDP光纤传输(MZ7035FA只有两路SFP,MZ7035FB(D)有四路SFP)。例程基于vivado 2017.4开发。

3.2 SFP接口

开发板上有4个SFP屏蔽笼。SFP屏蔽笼可以插入千兆。SFP信号定义如下图所示。

3.3 IP设置

3.3.1 Tri Mode Ethernet MAC设置

由于使用千兆通讯,因此将速率设为1Gbps。如下图所示。

首先,由于该IP需要与IP核1G/2.5G Ethernet PCS/PMA or SGMII之间通过GMII接口连接,此时不需要在IP核内部为GMII接口添加I/O BUF。因此,需要将PHY Interface设为Internal。

其次,由于1G/2.5G Ethernet PCS/PMA or SGMII使用1G光通讯时采用了1000BASEX标准,速率固定为1G。所以,需要将Tri Mode Ethernet MAC的MAC speed设为1000Mbps,与之相匹配。

当Tri Mode Ethernet MAC与1G/2.5G Ethernet PCS/PMA or SGMII配合使用时,Tri Mode Ethernet MAC的gtx_clk时钟源需要由1G/2.5G Ethernet PCS/PMA or SGMII提供。一般都选择1G/2.5G Ethernet PCS/PMA or SGMII输出的user_clk2(125MHz)时钟作为Tri Mode Ethernet MAC的时钟源。

将Tri Mode Ethernet MAC的配置方式设置为通过AXI-Lite接口配置。

将AXI-Lite接口的时钟设为与user_clk2频率相同,即125MHz,这样可以使用同一个时钟源。

在设计中不使用MDIO与1G/2.5G Ethernet PCS/PMA or SGMII IP核连接,因此不使能MDIO接口。

上述设置如下图所示。

Shared logic不用进行设置。

音视频桥、流量控制、参数统计等功能均不使用。如下图所示。

3.3.2 1G/2.5G Ethernet PCS/PMA or SGMII设置

使用1000BASEX模式,需要将速度设为1G,如下图。

选择1000BASEX模式,如下图。

使用开发板的GTX收发器作为SFP的接口,输入IP核内部的MMCM的时钟源选择为GTX收发器输出的时钟TXOUTCLK,该MMCM将产生我们所需要的用户接口时钟。MDIO接口可用可不用,这里不使能MDIO接口。使能自协商。如下图。

当设计中只包含1个此IP核时,应当将可共享的逻辑资源和硬件模块包含在IP核内部,这样会减少所生成的模块数量,简化设计。如下图所示。

当设计中需要同时使用若干个此IP核,且所使用的GTX均位于同一个GTX BANK中。此时,只需其中1个IP核内部的共享资源(MMCM、GTX PLL、GTX 参考时钟等)便可以满足所有IP核的需求,即选择将共享资源包含在IP核内部。其余IP核将这些共享资源从其内部剔除即可,即选择将共享资源包含在example中。

3.4 IP核结构

3.4.1 Tri Mode Ethernet MAC

3.4.1.1时钟网络

IP核内部时钟网络结构如下图所示。其中,tx_mac_aclk为AXI-Stream发送接口的同步时钟,rx_mac_aclk为AXI-Stream接收接口的同步时钟。由于在设计中没有使用MDIO接口,所以不存在时钟信号mdc。

gtx_clk为IP核工作的全局时钟源,频率125MHz。s_axi_aclk为AXI-Lite接口的同步时钟。其余时钟refclk、gtx_clk90等均与GMII、RGMII接口与外部PHY芯片连接有关,由于设计中IP核与1G/2.5G Ethernet PCS/PMA or SGMII连接。因此,不需要使用这些时钟。

3.4.1.2用户接口

这里对一些重要的用户接口进行说明,其他接口可参考IP核手册。

3.4.1.2.1 AXI-Stream接收接口

AXI-Stream接收接口信号如下图所示。用户通过该接口接收从IP核输出的以太网数据包。需要注意的是,接收接口没有使用AXI-Stream标准中的tready信号。这代表接收端需要具备持续接收数据的能力,防止出现数据来不及接收而产生溢出。

AXI-Stream接收接口时序如下图所示。

3.4.1.2.2  AXI-Stream发送接口

AXI-Stream发送接口信号如下图所示。用户通过该接口,向IP核传输所需要发送的以太网数据包。其中,tx_ifg_delay用于设置发送间隔,一般都默认采用最小间隔,将tx_ifg_delay置为0即可。

AXI-Stream发送接口时序如下图所示。

3.4.1.2.3接收发送数据统计信号

下图中的信号,用于统计并输出当前发送完毕或者接收完毕的帧对应的各种类型的信息。除了调试用之外,一般无需使用。

信号时序如下图所示。

3.4.1.2.4流量控制信号

非高带宽、大负荷传输情况下,一般不需要使用流量控制功能。因此,不需要发送暂停帧,将以下两个信号均置为0即可。

3.4.1.2.5 AXI-Lite接口

AXI-Lite接口主要用于配置和读取IP核内部的寄存器。除此之外,还可以直接通过MDIO接口配置外部PHY芯片或者1G/2.5G Ethernet PCS/PMA or SGMII IP核的寄存器。由于MDIO没有使用。因此,AXI-Lite接口主要用于IP核设置。

3.4.1.2.6复位信号

IP核的复位信号网络如下图所示。

其中glbl_rstn为全局复位信号,用于复位整个IP核。rx_axi_rstn和tx_axi_rstn分别用于单独复位接收和发送部分的逻辑,一般无需使用。在例程中,将rx_axi_rstn和tx_axi_rstn都被恒置为1。

tx_reset和rx_reset分别用于表示IP核的发送和接收部分逻辑的复位状态,根据这两个信号可以判断IP核是否处于复位状态。这两个信号需要配合AXI-Stream接收和发送接口的同步时钟信号tx_mac_aclk和rx_mac_aclk进行使用,这是因为可能当tx_reset和rx_reset由1变为0时,IP核才会输出tx_mac_aclk和rx_mac_aclk。对于使用tx_mac_aclk和rx_mac_aclk作为同步时钟的逻辑,复位信号必须以tx_reset和rx_reset作为基准,避免出现复位无效的情况。对此,在例程中给出了参考设计。

3.4.2 1G/2.5G Ethernet PCS/PMA or SGMII

3.4.2.1时钟网络

IP核内部时钟网络结构如下图所示。

3.4.2.2多IP资源共享

在例程udp_ip_1g_sfp_2ch中,同时使用了2个SFP接口,在程序中例化了2个IP核。2个IP核使用共享的MMCM、GTX PLL和GTX 参考时钟。

3.4.2.2.1时钟网络

当需要使用多个IP时,且所使用的GTX位于同一个GTXBANK中时,不同IP核之间的时钟网络可以进行共享,如下图所示。多个IP核可共享同1个GTX BANK的参考时钟,以及同一个MMCM输出的时钟信号。

3.4.2.2.2共享端口

多个IP核之间的共享信号连接方式如下图所示。

上图中,左侧的IP核选择了将共享资源包含在IP核内部,右侧的IP核则选择了将共享资源从IP核内部去除,移至example desgin中。在udp_ip_1g_sfp_2ch例程中,例化了2个IP核。其中,gig_ethernet_pcs_pma_i_1对应上图左侧的IP核,pcs_pma_i_2对应上图右侧的IP核。这取决于上面所提到的1个IP设置,其中pcs_pma_ i_1的设置如下图所示。

pcs_pma_ i_2的设置如下图所示。

各共享信号定义与连接关系如下图所示。

3.4.3用户接口

这里对一些重要的用户接口进行说明,其他接口可参考IP核手册。

3.4.3.1GMII接口

GMII接口的同步时钟为IP核的输出时钟userclk2。

3.4.3.1.1 GMII发送时序

3.4.3.1.2 GMII接收时序

3.4.3.2 independent_clock_bufg

independent_clock_bufg是频率为200MHz的输入时钟。在IP核的example design中,GMII接口连接了IDELAYE2,并作为IO与芯片引脚连接。independent_clock_bufg输入的200MHz时钟便作为IDELAYCTRL的参考时钟。在本例程中,GMII作为内部信号,不用作IO口,所以不需要使用IDELAYCTRL。

除此之外,independent_clock_bufg还供IP核内部的其他逻辑使用。因此,无论是否需要使用IDELAYCTRL,independent_clock_bufg都必须输入200MHz的时钟。后缀bufg表示该200MHz时钟进入independent_clock_bufg端口前就已经通过BUFG进入了全局时钟网络。

3.4.3.3 signal_detect

要使IP核正常工作,需要将signal_detect置1。

3.4.3.4 Configuration_Vector

Configuration_Vector用于配置IP核的基本工作模式,可替代MDIO接口的功能。其具体含义如下图所示。

在例程中,Configuration_Vector的配置如下:

3.4.3.5 an_adv_config_vector

an_adv_config_vector用于配置IP核的自协商功能,其具体含义如下图所示。对于1000BASEX模式,只需要关注bit5,bit8~7,bit13~12。

在本例程中,an_adv_config_vector的设置如下。使能全双工,不使用暂停进行流量控制,无错误状态。

assign  an_adv_config_vector = 16'b0000000000100001;

3.4.3.6 Status_Vector

Status_Vector反应了IP核工作状态,其具体含义如下图所示。可以把其中的若干个信号接至LED灯上进行观察。其中比较重要的几个信号分别为bit0、bit1、bit12。

3.4.4 Tri Mode Ethernet MAC与1G/2.5G Ethernet PCS/PMA or SGMII的连接

在设计中,需要将Tri Mode Ethernet MAC与1G/2.5G Ethernet PCS/PMA or SGMII之间通过GMII接口互联。Tri Mode Ethernet MAC IP核的工作时钟源为1G/2.5G Ethernet PCS/PMA or SGMII输出的userclk2,频率为125MHz。同时,userclk2也与GMII接口的各信号同步。GMII接口连接如下图所示。由于本例程中不使用MDIO接口,无需连接。

3.4.5 IP核使用注意点

3.4.5.1Tri Mode Ethernet MAC

3.4.5.1.1数据发送长度

Tri Mode Ethernet MAC IP核在默认情况下,发送帧长度小于64字节时,IP核会在帧末尾自动补0,补足至64字节,并且再帧末尾自动插入4字节CRC。接收时,IP核自动去除末尾4字节CRC,但对于长度小于64字节的帧末尾补的0不会被去掉,仍会通过接收接口输出。因此,可以发送的数据长度在14~1514(含14字节MAC帧头)字节之间。

IP使用文档中对此有如下描述。

3.4.5.2AXI-Lite接口配置策略

通过vivado仿真IP核自带的example,可以观察到example中通过AXI-Lite配置IP核的过程,如下图所示。具体寄存器定义参考PG051。在例程中,直接采用了这部分的代码。

需要说明的是,最后3个步骤均与帧过滤功能有关。

其中,unicast address就是设置IP核的本地MAC地址,用于过滤时进行地址匹配。如果开启帧过滤功能,除了广播地址、暂停地址和本地MAC地址,含有其他目的MAC地址的帧将会被全部进行过滤,不被用户接收。

最后一个步骤启用IP核的promiscuous mode,关闭了接收帧过滤功能,使IP核接收包含任何目的MAC地址的以太网帧。如果用户需要考虑进行MAC地址过滤可关闭该功能。相关寄存器如下图所示。

3.5约束

3.5.1 GTX参考时钟约束

使用GTX时,需要对GTX BANK输入的差分参考时钟进行约束,需要约束其对应的引脚位置以及时钟频率。如下所示(以下为示例代码,如果和配套的代码有差异,以配套代码和原理图为准):

set_property PACKAGE_PIN U6 [get_ports gtrefclk1_p]

set_property PACKAGE_PIN U5 [get_ports gtrefclk1_n]

create_clock -period 8.000 -name gtrefclk -add [get_ports gtrefclk1_p]

3.5.2 GTX位置约束

在XDC文件中,需要锁定IP核所使用的GTX对应于FPGA芯片的具体位置,并指定工程中GTX原语所在的路径。

在MZ7035开发板中,包含了1个GTX BANK。4个SFP模块分别与X0Y12,X0Y13,X0Y14,X0Y15的GTX连接。

例如,在udp_ip_1g_sfp例程中的XDC中的约束如下:

set_property LOC GTXE2_CHANNEL_X0Y15 [get_cells gig_ethernet_pcs_pma_i_1/*/*/transceiver_inst/gtwizard_inst/*/gtwizard_i/gt0_GTWIZARD_i/gtxe2_i]

例如,在udp_ip_1g_sfp_4ch例程中的XDC中的约束如下:

set_property LOC GTXE2_CHANNEL_X0Y12 [get_cells gig_ethernet_pcs_pma_i_4/*/transceiver_inst/gtwizard_inst/*/gtwizard_i/gt0_GTWIZARD_i/gtxe2_i]

set_property LOC GTXE2_CHANNEL_X0Y13 [get_cells gig_ethernet_pcs_pma_i_3/*/transceiver_inst/gtwizard_inst/*/gtwizard_i/gt0_GTWIZARD_i/gtxe2_i]

set_property LOC GTXE2_CHANNEL_X0Y14 [get_cells gig_ethernet_pcs_pma_i_2/*/transceiver_inst/gtwizard_inst/*/gtwizard_i/gt0_GTWIZARD_i/gtxe2_i]

set_property LOC GTXE2_CHANNEL_X0Y15 [get_cells gig_ethernet_pcs_pma_i_1/*/*/transceiver_inst/gtwizard_inst/*/gtwizard_i/gt0_GTWIZARD_i/gtxe2_i]由于使用了GTX原语锁定了GTX在芯片中的物理位置,每个GTX与相应的RX、TX引脚是一一对应的,因此,GTX的RX、TX引脚可不作约束。

3.6 例程设计

本教程设计了2个测试例程:udp_ip_1g_sfp和udp_ip_1g_sfp_4ch。

例程的原理如下图所示。2个例程均实现了UDP收发环路,即在电脑上通过网络调试助手向开发板发送任意长度小于1472字节的UDP包。开发板接收到udp包经过fifo缓存后重新发回电脑,由此验证数据收发的正确性。

由于UDP IP协议栈的AXI-Stream数据接口位宽为64bit,而Tri Mode Ethernet MAC的AXI-Stream数据接口位宽为8bit。因此,要将UDP IP协议栈与Tri Mode Ethernet MAC之间通过AXI-Stream接口互联,需要进行时钟域和数据位宽的转换。实现方案如下图所示。

3.6.1 AXI-Stream DATA FIFO

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

由于1G速率下Tri Mode Ethernet MAC的AXI-Stream数据接口同步时钟信号为125MHz。此时,UDP IP协议栈64bit的AXI-Stream数据接口同步时钟信号应该为125MHz/(64/8)=15.625MHz。因此,异步AXI-Stream DATA FIFO两端的时钟分别为125MHz(8bit),15.625MHz(64bit)。

Packet mode是指FIFO在输出数据前持续缓存AXI-Stream接口输入的数据直至输入端tlast信号拉高,即存满一个完整的数据包时,才开始在AXI-Stream输出端口向外输出数据。Packet mode功能设置如下图所示。需要注意的是,启用Packet mode时,FIFO必须工作于同步模式。

对于发送路径,启用Packet mode是为了防止FIFO被IP核读空。对于接收路径,是由于米联的UDP IP协议栈要求1个数据包的tvalid信号在数据包持续期间必须恒为1。

3.6.2 AXI4-Stream Data Width Converter

UDP IP协议栈的AXI-Stream接口经过FIFO时钟域转换后,还需要进行数据数据位宽转换,数据位宽的转换通过AXI4-Stream Data Width Converter完成。

在接收路径中,进行8bit到64bit的转换,AXI4-Stream Data Width Converter设置如下图所示。

在发送路径中,进行64bit到8bit的转换,AXI4-Stream Data Width Converter设置如下图所示。

3.7 例程测试

udp_ip_1g_sfp实现了单路UDP网络传输功能,udp_ip_1g_sfp_4ch中同时例化了4个UDP IP协议栈,实现了4路UDP网络传输功能。在例程中,电脑的IP地址为192.168.10.2,UDP端口号为61441,开发板中的4个SFP接口的IP地址均为192.168.10.1,UDP端口号均为61440。

对于udp_ip_1g_sfp例程,将SFP光电模块及网线插入SFP-A对应的屏蔽笼内。对于udp_ip_rgmii_2ch例程,则可将SFP电模块及网线与SFP-A、SFP-B、SFP-C、SFP-D中任意一个SFP屏蔽笼连接。

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

3.7.1 UDP环路测试

打开网络调试助手,分别设置好电脑和开发板的IP地址位和UDP端口号, 通过网络调试助手以udp包的形式向开发板发送文字数据,并以1ms的间隔不断循环发送,如下图所示。

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

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

3.7.2 Ping、ARP测试

在网络调试助手向开发板发UDP包的同时,通过cmd命令窗不断向开发板发起ping命令,观察ping命令的返回,如下图所示。从图中可以看到开发板能够快速响应电脑发起的ping命令,UDP数据包收发与ping应答互不干扰。

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

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

你可能感兴趣的:(基于zynq的千兆网udp项目)