本帖最后由 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概述为了实现UDP FPGA通信“米联客”提供了uiudp_stack.dcp协议栈网表文件给用户免费使用,具备和源码一样的功能,并且多年来已经有大量客户用于实际项目开发中稳定可靠,但是需要源码的客户需要付费购买。uiudp_stack这里对于用户就是一个“黑盒子”负责处理ARP以及UDP IP通信协议,上层协议就是用户实际收发的有效数据部分,而“10G Ethernet Subsystem”IP核负责处理以太网数据通过GTX高速串行接口传输。开发板中实现万兆网UDP传输的基本逻辑框架如下图所示。关于协议栈的使用参考“附录1:米联客uiudp_stack udp ip协议栈使用说明”一文。
2 SFP+接口H3上有2个SFP+屏蔽笼,SFP+屏蔽笼可以插入千兆或万兆光模块。SFP+信号定义与SFP 一致,如下图所示.
3 10G Ethernet Subsystem IP使用
3.1IP核设置将 IP 核 AXI-Stream 的用户数据接口位宽设为 64bit,此时对应用户接口时钟频率为 156.25MHz。如下图所示。
将 AXI-Lite 配置接口时钟频率设置为 100MHz,当然用户也可以自由选择其他的频率。不使用参数统计和优先级流量控制功能。如下图所示。
时钟频率的设置仅对 IP 核单独综合有效。如下图。
将 GTX 动态重配置端口DRP 的时钟设为 100MHz, Debug 功能不作使用,如下图。
该时钟频率设置也仅对单独综合有效。如下图。
1588 同步功能一般针对某些需要进行网络时间同步的场合,如音视频传输。仅用作数据传输时无需使用。因此 这里不启用 1588 功能。如下图。
当设计中只包含 1 个此 IP 核时,应当将可共享的逻辑资源和硬件模块包含在 IP 核内部,这样会减少所生成的模块数量,简化设计。如下图所示。
当设计中需要同时使用若干个此 IP 核,且所使用的GTX 均位于同一个GTX BANK 中。此时,只需其中 1 个IP 核内部的共享资源(MMCM、QUADPLL、GTX 参考时钟等)便可以满足所有 IP 核的需求,即选择将共享资源包含在 IP 核内部。其余 IP 核将这些共享资源从其内部剔除即可,即选择将共享资源包含在 example 中。如下图所示。
3.2核结构IP 核的结构如下图所示。用户的接收和发送接口均采用了 AXI-Stream 标准。
10 Gigabit Ethernet Subsystem IP 核内部由 10 Gigabit Ethernet MAC 和 10 Gigabit Ethernet PCS/PMA 两个 IP 核所组成,两个 IP 之间通过XGMII 和 MDIO 接口连接。如下图所示。
3.3时钟网络IP 核内部时钟网络结构如下图所示。
3.4多IP资源共享例如,在设计中同时使用 3 个 IP 核时,3 个 IP 核之间的共享资源信号连接如下图所示。
3.5用户接口
3.5.1AXI-Stream接口AXI-Stream 发送接口 AXI-Stream 发送接口信号如下图所示。用户通过该接口,向 IP 核传输所需要发送的以太网数据包。其中, tx_ifg_delay 用于设置发送间隔,一般都默认采用最小间隔,将 tx_ifg_delay 置为 0 即可。
AXI-Stream 发送接口时序如下图所示。
背靠背连续发送
AXI-Stream 接收接口 AXI-Stream 接收接口信号如下图所示。用户通过该接口接收从 IP 核输出的以太网数据包。需要注意的是,接收接口没有使用 AXI-Stream 标准中的 tready 信号。这代表接收端需要具备持续接收数据的能力,防止出现数据来不及接收而产生溢出。
AXI-Stream 接收接口时序如下图所示。
3.5.2pcspma_status pcspma_status 端口用户反应 IP 核内部 PCS PMA 部分的运行状态。由于 GTX 只支持 10GBASE-R,因此pcspma_status 只有 bit0 有效。如下图所示。
3.5.3sim_speed_up sim_speed_up 引脚只有在仿真时才需要用到这个信号,用于加快仿真速度。编译时将其置为 0 或 1 即可。
3.5.4光模块相关信号IP 与光模块之间的连接信号及接法如下图所示。
3.5.5流量控制信号非高带宽、大负荷传输情况下,一般不需要使用流量控制功能。因此,不需要发送暂停帧,将以下两个信号均置为 0 即可。
3.5.6接收发送数据统计信号 下图中的信号,用于统计并输出当前发送完毕或者接收完毕的帧对应的各种类型的信息。除了调试用之外,一般无需使用。
信号时序如下图所示。
3.6AXI-Lite接口AXI-Lite 接口主要用于配置和读取 IP 核内部的寄存器。AXI-Lite 接口不仅可以配置 IP 核 MAC 部分的寄存器, 还可以直接通过 MAC 部分的 MDIO 接口配置PCS/PMA 部分的寄存器,如下图所示。
通过AXI-Lite 接口实现 MDIO 接口读写PCS/PMA 部分的寄存器的例子如下所示。
3.7用注意点
3.7.1数据发送长度
IP 核在默认情况下,发送帧长度小于 64 字节时,IP 核会在帧末尾自动补 0,补足至 64 字节,并且再帧末尾自动插入 4 字节 CRC。接收时,IP 核自动去除末尾 4 字节CRC,但对于长度小于 64 字节的帧末尾补的 0 不会被去掉, 仍会通过接收接口输出。因此,可以发送的数据长度在 14~1514(含 14 字节 MAC 帧头)字节之间。 IP 使用文档中对此有如下描述。
3.7.2用FIFO与 IP核AXI-Stream接口连接
在设计中,可以使用 AXI-Stream DATA FIFO 与 IP 核的 AXI-Stream 接口,作为数据的缓冲。使用 FIFO 时有以下几个注意点。对此,IP 核使用文档中有如下描述:
3.7.3AXI-Lite接口配置策略
仿真 ip 核自带的 example,可以观察到 example 中通过AXI-Lite 配置 IP 核MAC 部分的过程,如图蓝色方框内所示。以及通过 AXI-Lite 经过 MAC 部分的内部MDIO 接口配置访问PCS PMA 部分的寄存器,如图红色方框所示。具体寄存器定义参考PG157。
Example 通过AXI-Lite 配置 IP 核的流程如下图所示。在例程中,直接采用这部分的代码。
4例程设计例程的原理如下图所示。实现了一个 UDP 收发环路,即电脑通过网络调试助手向开发板发送 udp 包,开发板接收到 udp 包经过 fifo 缓存后重新发回电脑,由此验证数据收发的正确性。
UDP IP 协议栈与万兆 IP 核之间通过 2 个 AXI-Stream DATA FIFO 进行连接。两个 FIFO 的设置如下图所示,均使能Packet mode 功能。 Packet mode 是指 FIFO 持续缓存 AXI-Stream 接口输入的数据直至输入端 tlast 信号拉高,即存满一个完整的数据包时,才开始在 AXI-Stream 输出端口向外输出数据。需要注意的是,启用 Packet mode 时,FIFO 必须工作于同步模式。 对于发送路径,这样做是为了防止 FIFO 被 IP 核读空。对于接收路径,是由于米联的UDP IP 协议栈要求 1 个数据包的 tvalid 信号在数据包持续期间必须恒为 1。
由于在 Verilog 中定义变量,对 tdata 和 tkeep 进行大小端的字节序转换。 5程序测试
5.1硬件接线
以 MK7325FA 开发板为测试样板,其他开发板使用也一样,其他开发板的接线见“ 附录 1 ”。
5.2环路测试连接任意一个SFP接口连接,在例程中,电脑的IP地址为192.168.137.100,UDP端口号为6001,开发板中的所有网口的IP地址均为192.168.137.2,UDP端口号均为6002。 测试前,需要将所使用电脑网卡的IP地址设置为192.168.137.100,子网掩码设为255.255.255.0,如下图所示 打开网络调试助手,分别设置好电脑和开发板的IP地址位和UDP端口号,通过网络调试助手以udp包的形式向开发板发送文字数据,并以1ms的间隔不断循环发送,如下图所示。
测试结果上图所示。从图中可以看出,网络调试助手所发出的udp包和开发板返回的udp包一致,接收和发送的数据包数量一致。 通过wireshark软件可捕获电脑和开发板之间的通信数据包,如下图所示。
在网络调试助手向开发板发UDP包的同时,通过cmd命令窗不断向开发板发起ping命令,观察ping命令的返回,如下图所示。从图中可以看到开发板能够快速响应电脑发起的ping命令,UDP数据包收发与ping应答互不干扰。
5.3发送测速第二个demo是发送测速,在电脑上观察开发板以太网网口的发送速率,这个测速只代表可能的最高的速度,不代表电脑真实的不丢包速度,UDP的点到点不丢包速度和电脑的网卡、CPU速度、内存速度、操作系统都有关系。 5.3.1VIO虚拟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,如下图所示。
5.3.2测试结果
|