本帖最后由 FPGA课程 于 2024-9-11 14:18 编辑
软件版本:VIVADO2021.1
操作系统:WIN10 64bit
硬件平台:适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA
实验平台:米联客-MLK-H3-CZ08-7100开发板
板卡获取平台:https://milianke.tmall.com/
登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!
1概述具备SFP接口的FPGA开发板可以通过安装SFP转RJ45模块或者直接通过光纤进行以太网通信,如果直接用光纤需要电脑配备千兆光纤网卡。开发板中实现千兆网UDP传输的基本逻辑框架如下图所示。 为了实现UDP FPGA通信“米联客”提供了uiudp_stack.dcp协议栈网表文件给用户免费使用,具备和源码一样的功能,并且多年来已经有大量客户用于实际项目开发中稳定可靠,但是需要源码的客户需要付费购买。uiudp_stack这里对于用户就是一个“黑盒子”,上层协议就是用户实际收发的有效数据部分,而“Tri Mode Ethernet MAC”IP核负责处理以太网的MAC,以及通过GMII接口和“1G/2.5G Ethernet PCS/PMA or SGMII”IP的接口GMII接口通信。关于协议栈的使用参考“附录2:米联客uiudp_stack udp ip协议栈使用说明”一文。
本文档对应2个例程,一个是环路loop测试,一个是测速。 2 SFP信号接口开发板上的SFP屏蔽笼插入千兆SFP转RJ45电口或者光模块。SFP信号定义如下图所示。
3 Tri Mode Ethernet MAC使用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.2IP核结构
3.2.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.2.2用户接口
这里对一些重要的用户接口进行说明,其他接口可参考IP核手册。
3.2.2.1AXI-Stream接收接口
AXI-Stream接收接口信号如下图所示。用户通过该接口接收从IP核输出的以太网数据包。需要注意的是,接收接口没有使用AXI-Stream标准中的tready信号。这代表接收端需要具备持续接收数据的能力,防止出现数据来不及接收而产生溢出。
AXI-Stream接收接口时序如下图所示。
3.2.2.2AXI-Stream发送接口AXI-Stream发送接口信号如下图所示。用户通过该接口,向IP核传输所需要发送的以太网数据包。其中,tx_ifg_delay用于设置发送间隔,一般都默认采用最小间隔,将tx_ifg_delay置为0即可。
AXI-Stream发送接口时序如下图所示。
3.2.2.3接收发送数据统计信号下图中的信号,用于统计并输出当前发送完毕或者接收完毕的帧对应的各种类型的信息。除了调试用之外,一般无需使用。
信号时序如下图所示:
3.2.2.4流量控制信号非高带宽、大负荷传输情况下,一般不需要使用流量控制功能。因此,不需要发送暂停帧,将以下两个信号均置为0即可。
3.2.2.5AXI-Lite接口AXI-Lite接口主要用于配置和读取IP核内部的寄存器。除此之外,还可以直接通过MDIO接口配置外部PHY芯片或者1G/2.5G Ethernet PCS/PMA or SGMII IP核的寄存器。由于MDIO没有使用。因此,AXI-Lite接口主要用于IP核设置。 3.2.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.3IP核使用注意点
3.3.1Tri Mode Ethernet MAC 数据发送长度
Tri Mode Ethernet MAC IP核在默认情况下,发送帧长度小于64字节时,IP核会在帧末尾自动补0,补足至64字节,并且再帧末尾自动插入4字节CRC。接收时,IP核自动去除末尾4字节CRC,但对于长度小于64字节的帧末尾补的0不会被去掉,仍会通过接收接口输出。因此,可以发送的数据长度在14~1514(含14字节MAC帧头)字节之间。
IP使用文档中对此有如下描述。
3.3.2AXI-Lite接口配置策略
通过vivado仿真IP核自带的example,可以观察到example中通过AXI-Lite配置IP核的过程,如下图所示。具体寄存器定义参考PG051。在例程中,直接采用了这部分的代码。
需要说明的是,最后3个步骤均与帧过滤功能有关。
其中,unicast address就是设置IP核的本地MAC地址,用于过滤时进行地址匹配。如果开启帧过滤功能,除了广播地址、暂停地址和本地MAC地址,含有其他目的MAC地址的帧将会被全部进行过滤,不被用户接收。
最后一个步骤启用IP核的promiscuous mode,关闭了接收帧过滤功能,使IP核接收包含任何目的MAC地址的以太网帧。如果用户需要考虑进行MAC地址过滤可关闭该功能。相关寄存器如下图所示。
41G/2.5G Ethernet PCS/PMA or SGMII使用
4.1 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中。 4.2时钟网络IP核内部时钟网络结构如下图所示。
4.3多IP资源共享在例程udp_ip_1g_sfp_4ch中,同时使用了2个SFP接口,在程序中例化了2个IP核。2个IP核使用共享的MMCM、GTX PLL和GTX 参考时钟。 4.3.1时钟网络当需要使用多个IP时,且所使用的GTX位于同一个GTXBANK中时,不同IP核之间的时钟网络可以进行共享,如下图所示。多个IP核可共享同1个GTX BANK的参考时钟,以及同一个MMCM输出的时钟信号。
4.3.2共享端口多个IP核之间的共享信号连接方式如下图所示。
上图中,左侧的IP核选择了将共享资源包含在IP核内部,右侧的IP核则选择了将共享资源从IP核内部去除,移至example desgin中。以MK7325FA开发板为例,2个SFP+通道例化X需要2个IP核。其中,gig_ethernet_pcs_pma_i_1对应上图左侧的IP核,pcs_pma_i_2对应上图右侧的IP核。这取决于上面所提到的1个IP设置,其中pcs_pma_ i_1的设置如下图所示。
pcs_pma_ i_2的设置如下图所示。
各共享信号定义与连接关系如下图所示。
4.4用户接口这里对一些重要的用户接口进行说明,其他接口可参考IP核手册。 4.4.1 GMII接口GMII接口的同步时钟为IP核的输出时钟userclk2。 4.4.1.1 GMII发送时序
4.4.1.2 GMII接收时序
4.4.2 independent_clock_bufgindependent_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进入了全局时钟网络。 4.4.3 signal_detect要使IP核正常工作,需要将signal_detect置1。 4.4.4 Configuration_VectorConfiguration_Vector用于配置IP核的基本工作模式,可替代MDIO接口的功能。其具体含义如下图所示。
在例程中,Configuration_Vector的配置如下:
4.4.5 an_adv_config_vectoran_adv_config_vector用于配置IP核的自协商功能,其具体含义如下图所示。对于1000BASEX模式,只需要关注bit5,bit8~7,bit13~12。
在本例程中,an_adv_config_vector的设置如下。使能全双工,不使用暂停进行流量控制,无错误状态。 assign an_adv_config_vector = 16'b0000000000100001; 4.4.6 Status_VectorStatus_Vector反应了IP核工作状态,其具体含义如下图所示。可以把其中的若干个信号接至LED灯上进行观察。其中比较重要的几个信号分别为bit0、bit1、bit12。
4.5 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接口,无需连接。
5约束以下以样板 MK7325FA 为例,说明 GTP/GTX 引脚的约束。对于差分信号成对出现,可以只定义一端简化约束。 5.1 GTP参考时钟约束使用GTP时,需要对GTP BANK输入的差分参考时钟进行约束,需要约束其对应的引脚位置以及时钟频率。如下所示(以下为示例代码,如果和配套的代码有差异,以配套代码和原理图为准):
set_property PACKAGE_PIN E8 [get_ports gtrefclk1_p] create_clock -period 8.000 -name gtrefclk -add [get_ports gtrefclk1_p] 5.2 GTX位置约束set_property PACKAGE_PIN D2 [get_ports {sfp_tx_p[0]}] set_property PACKAGE_PIN C4 [get_ports {sfp_tx_p[1]}] 6 例程设计第一个demo是环路收发测试,即在电脑上通过网络调试助手向开发板发送任意长度小于1472字节的UDP包。 第二个demo是只让FPGA发送数据测试发送的最高速度,但是不代表接收端不丢包的速度。
数据收发的正确性。
由于UDP IP协议栈的AXI-Stream数据接口位宽为64bit,而Tri Mode Ethernet MAC的AXI-Stream数据接口位宽为8bit。因此,要将UDP IP协议栈与Tri Mode Ethernet MAC之间通过AXI-Stream接口互联,需要进行时钟域和数据位宽的转换。实现方案如下图所示。
6.1AXI-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。
6.2AXI4-Stream Data Width ConverterUDP IP协议栈的AXI-Stream接口经过FIFO时钟域转换后,还需要进行数据数据位宽转换,数据位宽的转换通过AXI4-Stream Data Width Converter完成。 在接收路径中,进行8bit到64bit的转换,AXI4-Stream Data Width Converter设置如下图所示。
在发送路径中,进行64bit到8bit的转换,AXI4-Stream Data Width Converter设置如下图所示。
7程序测试
7.1硬件接线
以 MK7325FA 开发板为测试样板,其他开发板使用也一样,其他开发板的接线见“ 附录 1 ”。
7.2环路测试连接任意一个SFP接口连接,在例程中,电脑的IP地址为192.168.137.1,UDP端口号为6001,开发板中的所有网口的IP地址均为192.168.137.2,UDP端口号均为6002。 测试前,需要将所使用电脑网卡的IP地址设置为192.168.137.1,子网掩码设为255.255.255.0,如下图所示。
打开网络调试助手,分别设置好电脑和开发板的IP地址位和UDP端口号,通过网络调试助手以udp包的形式向开发板发送文字数据,并以1ms的间隔不断循环发送,如下图所示。
测试结果如上图所示。从图中可以看出,网络调试助手所发出的udp包和开发板返回的udp包一致,接收和发送的数据包数量一致。 通过wireshark软件可捕获电脑和开发板之间的通信数据包,如下图所示。
在网络调试助手向开发板发UDP包的同时,通过cmd命令窗不断向开发板发起ping命令,观察ping命令的返回,如下图所示。从图中可以看到开发板能够快速响应电脑发起的ping命令,UDP数据包收发与ping应答互不干扰。
7.3发送测速第二个demo是发送测速,在电脑上观察开发板以太网网口的发送速率,这个测速只代表可能的最高的速度,不代表电脑真实的不丢包速度,UDP的点到点不丢包速度和电脑的网卡、CPU速度、内存速度、操作系统都有关系。
VIO虚拟IO设置: 本例中对千兆发送速率进行了测试。程序中添加了VIO IP核,用户可以通过VIO修改发送的UDP包长度以及发送间隔。 VIO共设置了3个输出端口,如下图所示。
VIO的3个输出参数为:
- trans_en,UDP包发送使能信号。1代表使能发送,0代表关闭发送。
- PACKET_LENGTH,发送UDP数据包的长度(不含UDP首部),单位为字节,可设置范围1~1472。
- PACKET_INTERVAL,UDP包发送间隔,单位为时钟周期数,可设置范围0~65535。
需要注意的是,在修改PACKET_LENGTH和PACKET_INTERVAL两个参数之前,必须先将trans_en设为0,停止UDP包发送,否则会产生错误。 不断以最小间隔循环发送1472字节的UDP包,用来测试协议栈的最高发送带宽。在VIO中先将trans_en设为0,再将PACKET_LENGTH设为1472,PACKET_INTERVAL设为0,然后将trans_en设为1,如下图所示。
测速结果:
|