软件版本:VIVADO2017.4 操作系统:WIN10 64bit 硬件平台:MZ7X 米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问! 6.1 概述本章讲解使用PL端以太网口实现UDP通信。开发板中实现千兆网 UDP 传输的基本逻辑框架如下图所示。FPGA 程序基于米联客的新版 UDP IP 协议栈以及 Xilinx 的 IP 核 Tri Mode Ethernet MAC 和1G/2.5G Ethernet PCS/PMA or SGMII 而实现。 本教程适用于具有PL端网口的开发板MZ7XB-7020。 6.2 Tri Mode Ethernet MAC设置由于使用千兆通讯,因此将速率设为1Gbps。如下图所示。 首先,由于该 IP 需要连接到 PHY 的 RGMII接口所以 PHY Interface 选择 RGMII。 其次,由于 1G/2.5G Ethernet PCS/PMA or SGMII 使用 1G 光通讯时采用了 1000BASEX 标准,速率固定为 1G。所以,需要将Tri Mode Ethernet MAC 的 MAC speed 设为 1000Mbps,与之相匹配。 将 Tri Mode Ethernet MAC 的配置方式设置为通过 AXI-Lite 接口配置。将 AXI-Lite 接口的时钟设为与 user_clk2频率相同,即 125MHz,这样可以使用同一个时钟源。 在设计中不使用 MDIO,因此不使能 MDIO接口。 上述设置如下图所示。 Shared logic不用进行设置。 音视频桥、流量控制、参数统计等功能均不使用。如下图所示。 6.3 IP核结构6.3.1 Tri Mode Ethernet MAC时钟网络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 芯片连接有关,refclk 用于 IP 的 idelay 延迟模块,输入时钟为 200MHZ,gtx_clk90用不到。 6.3.2 用户接口这里对一些重要的用户接口进行说明,其他接口可参考IP核手册。 1. AXI-Stream接收接口 AXI-Stream接收接口信号如下图所示。用户通过该接口接收从IP核输出的以太网数据包。需要注意的是,接收接口没有使用AXI-Stream标准中的tready信号。这代表接收端需要具备持续接收数据的能力,防止出现数据来不及接收而产生溢出。 AXI-Stream接收接口时序如下图所示。 2. AXI-Stream发送接口 AXI-Stream发送接口信号如下图所示。用户通过该接口,向IP核传输所需要发送的以太网数据包。其中,tx_ifg_delay用于设置发送间隔,一般都默认采用最小间隔,将tx_ifg_delay置为0即可。 AXI-Stream发送接口时序如下图所示。 3. 接收发送数据统计信号 下图中的信号,用于统计并输出当前发送完毕或者接收完毕的帧对应的各种类型的信息。除了调试用之外,一般无需使用。 信号时序如下图所示。 4.流量控制信号 非高带宽、大负荷传输情况下,一般不需要使用流量控制功能。因此,不需要发送暂停帧,将以下两个信号均置为0即可。 5. AXI-Lite接口 AXI-Lite接口主要用于配置和读取IP核内部的寄存器。除此之外,还可以直接通过MDIO接口配置外部PHY芯片或者1G/2.5G Ethernet PCS/PMA or SGMII IP核的寄存器。由于MDIO没有使用。因此,AXI-Lite接口主要用于IP核设置。 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作为基准,避免出现复位无效的情况。对此,在例程中给出了参考设计。 6.4 IP核用户接口6.4.1 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进入了全局时钟网络。 6.4.2 signal_detect要使IP核正常工作,需要将signal_detect置1。 6.4.3 Configuration_VectorConfiguration_Vector用于配置IP核的基本工作模式,可替代MDIO接口的功能。其具体含义如下图所示。 6.4.4 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; 6.4.5 Status_VectorStatus_Vector反应了IP核工作状态,其具体含义如下图所示。可以把其中的若干个信号接至LED灯上进行观察。其中比较重要的几个信号分别为bit0、bit1、bit12。 6.4.6 IP核使用注意点1.Tri Mode Ethernet MAC数据发送长度 Tri Mode Ethernet MAC IP核在默认情况下,发送帧长度小于64字节时,IP核会在帧末尾自动补0,补足至64字节,并且再帧末尾自动插入4字节CRC。接收时,IP核自动去除末尾4字节CRC,但对于长度小于64字节的帧末尾补的0不会被去掉,仍会通过接收接口输出。因此,可以发送的数据长度在14~1514(含14字节MAC帧头)字节之间。 IP使用文档中对此有如下描述。 2.AXI-Lite接口配置策略 通过vivado仿真IP核自带的example,可以观察到example中通过AXI-Lite配置IP核的过程,如下图所示。具体寄存器定义参考PG051。在例程中,直接采用了这部分的代码。 需要说明的是,最后3个步骤均与帧过滤功能有关。 其中,unicast address就是设置IP核的本地MAC地址,用于过滤时进行地址匹配。如果开启帧过滤功能,除了广播地址、暂停地址和本地MAC地址,含有其他目的MAC地址的帧将会被全部进行过滤,不被用户接收。 最后一个步骤启用IP核的promiscuous mode,关闭了接收帧过滤功能,使IP核接收包含任何目的MAC地址的以太网帧。如果用户需要考虑进行MAC地址过滤可关闭该功能。相关寄存器如下图所示。 6.5 例程设计例程的原理如下图所示。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接口互联,需要进行时钟域和数据位宽的转换。实现方案如下图所示。 6.5.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。 6.5.2 AXI4-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设置如下图所示。 6.6 B50610芯片使用tri_mode_ethernet_mac IP核注意事项tri_mode_ethernet_mac IP 默认的 RGMII 发送接口结构如下图所示: 上图中 RGMII 发送时钟与数据形成了固定 90°的相位差,即时钟边沿对准了数据窗的中心位置, 但是有些 phy 芯片的时序要求时钟边沿与数据边沿对齐。 发送端 开发板使用的PHY芯片为B50610,该芯片RGMII发送接口默认使用的是延时模式,由如下寄存器的值决定。 B50610芯片延时模式RGMII发送接口时序关系如下图所示。 需要通过修改 IP 核生成的 RGMII 发送接口部分的代码来实现。 修改l 修改发送时钟 ODDR 的参考时钟和复位信号,如下图,将: 修改为: 这样发送的时钟和数据就形成了边沿对齐的关系。 修改2 修改完 IP 核源码后还需要对相应的 xdc 约束 进行修改,IP 核内部关于 RGMII 接口的时序在tri_mode_ethernet_mac_0_clock.xdc中进行约束,关于IDELAY的延时值 在 tri_mode_ethernet_mac_0.xdc 中进行约束。 首先修改tri_mode_ethernet_mac_0_clock.xdc 中关于input delay的约束。tri_mode_ethernet_mac_0_clock.xdc中关于input delay的约束如下: 根据使用的网口芯片要求,对tri_mode_ethernet_mac_0_clock.xdc对应内容修改如下: 根据B50610datasheet中的接收时序: 该芯片RGMII接收接口默认使用的也是延时模式,由如下寄存器的值决定。 B50610芯片延时模式RGMII接收接口时序关系如下图所示。 ri_mode_ethernet_mac_0_clock.xdc中关于input delay的约束修改如下: 其次,覆盖output delay的约束值,IP核内部的约束默认发送时钟和发送数据存在2ns的延时关系,这与B50610芯片的时序不符,因此需要修改。 tri_mode_ethernet_mac_0_clock.xdc 中的约束为: 根据使用的网口芯片要求,对tri_mode_ethernet_mac_0_clock.xdc对应内容修改如下: 6.7 例程测试 测试前,需要将所使用电脑网卡的IP地址设置为192.168.10.2,子网掩码设为255.255.255.0,如下图所示。 6.7.1 UDP环路测试打开网络调试助手,分别设置好电脑和开发板的IP地址位和UDP端口号, 通过网络调试助手以udp包的形式向开发板发送文字数据,并以1ms的间隔不断循环发送,如下图所示。 测试结果上图所示。从图中可以看出,网络调试助手所发出的udp包和开发板返回的udp包一致,接收和发送的数据包数量一致。 通过wireshark软件可捕获电脑和开发板之间的通信数据包,如下图所示。 |