FPGA实现10G万兆网TCP/IP 协议栈,客户端版本,纯VHDL代码编写,提供6套工程源码和技术支持


FPGA实现10G万兆网TCP/IP 协议栈,客户端版本,纯VHDL代码编写,提供6套工程源码和技术支持

1、前言

没玩过TCP网络通信都不好意思说自己玩儿过FPGA,这是CSDN某大佬说过的一句话,鄙人深信不疑。。。目前网上fpga实现udp协议的源码满天飞,我这里也有不少,但用FPGA纯源码实现TCP的项目却很少,能上板调试跑通的项目更是少之又少,甚至可以说是凤毛菱角,但很不巧,本人这儿就有一个;一般而言,用FPGA实现TCP并不是一个经济的方案,但对于芯片原型验证、航天可靠通信、水下通信等一些数据传输可靠性极高的领域而言,FPGA实现TCP方案依然占有一席之地;本方案采用纯VHDL实现了万兆网TCP/IP协议栈的客户端版本;

工程概述

本设采用纯VHDL实现了10G万兆网TCP/IP协议栈,该协议栈为TCP客户端版本,没有用到任何一个IP核;并在Xilinx系列FPGA上做了部署并验证,由于使用万兆网,所以需要与FPGA开发板上的GT高速接口和板载光口交互,对硬件有一定要求;本设计能实现电脑端网卡与FPGA开发板之间的双向通信,为了方便测试,设计了TCP数据回环网络测速两个功能;

TCP/IP数据回环功能如下:

电脑端网络调试助手发送测试数据或发起ping操作,然后电脑端操作系统的Socket实现发送数据的以太网帧组包;数据通过插在PC电脑主板上的10G网卡以光纤发送到FPGA开发板;FPGA开发板板载的SFP光口接收光纤数据发送给FPGA;然后调用Xilinx官方的10G Ethernet Subsystem的10G IP核实现以太网物理层和MAC数据接口转换,并以AXI4-Stream接口输出MAC数据;然后MAC数据经过数据缓冲FIFO组实现数据位宽转换和跨时钟域转换;然后数据进入TCP/IP协议栈实现以太网帧解包,解析各种头部信息,并提取输出TCP报文的有效数据段;有效数据再经过回环后回灌到TCP/IP协议栈实现以太网帧组包,即加上各种头部信息和校验;然后数据再进入Xilinx官方的10G Ethernet Subsystem的10G IP核实现以太网物理层和MAC数据接口转换,并输出差分光信号,由板载的SFP光口通过光纤发送到PC电脑主板的10G网卡;电脑端操作系统的Socket实现接收数据以太网解包,然后数据给网络调试助手显示;网络调试助手同时显示发送和接收数据,以此观察TCP数据回环的正确性;

TCP/IP网络测速功能如下:

PGA自动循环产生从0开始的累加数作为TCP发送数据,发送数据然后进入TCP协议栈实现以太网帧组包,即加上各种头部信息和校验,输出MAC数据;然后MAC数据经过数据缓冲FIFO组实现数据位宽转换和跨时钟域转换;然后MAC数据进入Xilinx官方的10G Ethernet Subsystem的10G IP核实现以太网物理层的数据接口转换,通过板载的SFP光口的光纤输出到电脑端网卡;然后打开电脑端的资源管理器,查看网卡,即可看到TCP通信速率;

为了通用性和适应性,针对不同FPGA型号差异,一共移植了6套工程源码,详情如下:
在这里插入图片描述
这里说明一下提供的6套工程源码的作用和价值,如下:

工程源码1

开发板FPGA型号为Xilinx–Kintex7-35T–xc7k325tffg676-2,板载光口类型为10G SFP光口,使用Xilinx官方的10G Ethernet Subsystem做以太网物理层,实现TCP/IP 协议栈万兆网客户端版本的应用部署,10G Ethernet Subsystem需要使用GTX高速接口资源;TCP/IP 协议栈提供的是纯VHDL代码实现的源码,并对源码进行了verilog的顶层例化,对不熟悉VHDL语法的朋友来说是巨大福音,因为在工程中可以直接用verilog当时例化TCP/IP 协议栈,该工程集成了TCP/IP数据回环功能+TCP/IP网络测速功能,适用于Xilinx 7系列FPGA移植;

工程源码2

开发板FPGA型号为Xilinx–>Virtex7–690T–xc7vx690tffg1761-3,板载光口类型为10G SFP光口,使用Xilinx官方的10G Ethernet Subsystem做以太网物理层,实现TCP/IP 协议栈万兆网客户端版本的应用部署,10G Ethernet Subsystem需要使用GTH高速接口资源;TCP/IP 协议栈提供的是纯VHDL代码实现的源码,并对源码进行了verilog的顶层例化,对不熟悉VHDL语法的朋友来说是巨大福音,因为在工程中可以直接用verilog当时例化TCP/IP 协议栈,该工程集成了TCP/IP数据回环功能+TCP/IP网络测速功能,适用于Xilinx 7系列FPGA移植;

工程源码3

开发板FPGA型号为Xilinx–Zynq7100–xc7z100ffg900-2,板载光口类型为10G SFP光口,使用Xilinx官方的10G Ethernet Subsystem做以太网物理层,实现TCP/IP 协议栈万兆网客户端版本的应用部署,10G Ethernet Subsystem需要使用GTX高速接口资源;TCP/IP 协议栈提供的是纯VHDL代码实现的源码,并对源码进行了verilog的顶层例化,对不熟悉VHDL语法的朋友来说是巨大福音,因为在工程中可以直接用verilog当时例化TCP/IP 协议栈,该工程集成了TCP/IP数据回环功能+TCP/IP网络测速功能,适用于Xilinx Zynq7000系列FPGA移植;

工程源码4

开发板FPGA型号为Xilinx-Kintex-UltraScale-xcku060-ffva1156-2-i,板载光口类型为10G SFP光口,使用Xilinx官方的10G Ethernet Subsystem做以太网物理层,实现TCP/IP 协议栈万兆网客户端版本的应用部署,10G Ethernet Subsystem需要使用UltraScale GTH高速接口资源;TCP/IP 协议栈提供的是纯VHDL代码实现的源码,并对源码进行了verilog的顶层例化,对不熟悉VHDL语法的朋友来说是巨大福音,因为在工程中可以直接用verilog当时例化TCP/IP 协议栈,该工程集成了TCP/IP数据回环功能+TCP/IP网络测速功能,适用于Xilinx UltraScale系列FPGA移植;

工程源码5

开发板FPGA型号为Xilinx-Kintex-UltraScale±xcku3p-ffva676-2-i,板载光口类型为10G SFP光口,使用Xilinx官方的10G Ethernet Subsystem做以太网物理层,实现TCP/IP 协议栈万兆网客户端版本的应用部署,10G Ethernet Subsystem需要使用GTY高速接口资源;TCP/IP 协议栈提供的是纯VHDL代码实现的源码,并对源码进行了verilog的顶层例化,对不熟悉VHDL语法的朋友来说是巨大福音,因为在工程中可以直接用verilog当时例化TCP/IP 协议栈,该工程集成了TCP/IP数据回环功能+TCP/IP网络测速功能,适用于Xilinx UltraScale+系列FPGA移植;

工程源码6

开发板FPGA型号为Xilinx-Zynq-UltraScale+MPSoCs-xczu4ev-sfvc784-2-i,板载光口类型为10G SFP光口,使用Xilinx官方的10G Ethernet Subsystem做以太网物理层,实现TCP/IP 协议栈万兆网客户端版本的应用部署,10G Ethernet Subsystem需要使用UltraScale GTH高速接口资源;TCP/IP 协议栈提供的是纯VHDL代码实现的源码,并对源码进行了verilog的顶层例化,对不熟悉VHDL语法的朋友来说是巨大福音,因为在工程中可以直接用verilog当时例化TCP/IP 协议栈,该工程集成了TCP/IP数据回环功能+TCP/IP网络测速功能,适用于Xilinx Zynq-UltraScale+MPSoCs系列FPGA移植;

本博客详细描述了Xilinx系列FPGA实现 10G万兆网TCP/IP 协议栈 客户端版本的设计方案,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做学习提升,可应用于医疗、军工等行业的高速接口或图像处理领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

免责声明

本工程及其源码即有自己写的一部分,也有网络公开渠道获取的一部分(包括CSDN、Xilinx官网、Altera官网以及其他开源免费获取渠道等等),若大佬们觉得有所冒犯,请私信批评教育;部分模块源码转载自上述网络,版权归原作者所有,如有侵权请联系我们删除;基于此,本工程及其源码仅限于读者或粉丝个人学习和研究,禁止用于商业用途,若由于读者或粉丝自身原因用于商业用途所导致的法律问题,与本博客及博主无关,请谨慎使用。。。

2、相关方案推荐

我这里已有的以太网方案

目前我这里有大量UDP协议的工程源码,包括UDP数据回环,视频传输,AD采集传输等,也有TCP协议的工程,对网络通信有需求的兄弟可以去看看:
直接点击前往

10G 万兆网 TCP–>服务器 方案

FPGA实现10G万兆网TCP/IP 协议栈,服务器版本,纯VHDL代码编写,提供6套工程源码和技术支持,感兴趣的朋友可以去看看:
直接点击前往

1G 千兆网 TCP–>服务器 方案

TCP分为服务器和客户端,两者代码是不一样的,看具体需求,既然本博客介绍的是TCP客户端,那么肯定就有TCP服务器,TCP服务器依然是16套工程源码,我另外写了一篇博客介绍TCP客户端,感兴趣的朋友可以去看看:
直接点击前往

1G 千兆网 TCP–>客户端 方案

TCP分为服务器和客户端,两者代码是不一样的,看具体需求,既然本博客介绍的是TCP服务器,那么肯定就有TCP客户端,本来TCP客户端之前一直都有,但一直没有调通,经过两年半的练习调试,总算是调通了;TCP客户端依然是16套工程源码,我另外写了一篇博客介绍TCP客户端,感兴趣的朋友可以去看看:
直接点击前往

3、详细设计方案

设计框图

本设计使用的工程详细设计方案框图如下:
在这里插入图片描述

测试用PC端电脑

测试用PC端电脑要求如下:
主板有PCIE卡槽,能插10G 网卡;
安装网络调试助手软件,软件已提供在资料包中;
我的10G 网卡插到主板如下:
在这里插入图片描述

测试用10G 网卡

测试用10G 网卡要求如下:
必须支持10G速率;
必须是SFP光口;
必须安装好网卡驱动,驱动找卖家要;
我的网卡驱动安装后如下:
在这里插入图片描述

SFP光口

FPGA开发板需要至少拥有1路SFP光口,且至少支持10G速率,此外还需要SFP光模块和光纤,用于连接10网卡,我的FPGA开发板与10G 网卡连接如下:
在这里插入图片描述

10G Ethernet Subsystem 详解

Xilinx官方的10G Ethernet Subsystem的10G IP核实现以太网物理层和MAC数据接口转换,并以AXI4-Stream接口输出MAC数据,以工程1为例,代码层面如下:
在这里插入图片描述
10G Ethernet Subsystem是Xilinx推出的具有10G速率的MAC,用户接口为AXI4-Stream,使用Xilinx GT高速接口作为物理层,官方数据手册为《PG157》,本博对10G Ethernet Subsystem的解析主要是对《PG157》的翻译和总结,详细细节读者还需自行阅读官方英文原版手册;10G Ethernet Subsystem框架如下:
在这里插入图片描述
可以看到,10G Ethernet Subsystem内部封装了Xilinx的10 Gigabit Ethernet PCS/PMA和10 Gigabit Ethernet MAC两个IP,这两个IP分别对应物理层和MAC层,IP之间通过XGMII接口连接,用户接口被封装为AXI4-Stream,可通过AXI4-Lite接口配置IP,物理层对外接口为GT,其中1588时钟同步功能可在音视频传输中启用,适应性还是很好的;关于这些底层信息,需要专业的以太网协议知识,不建议非专业人事深究,开发者一般只需要能够使用该IP即可;

现对用户接口IP指示信号做特别说明:

用户发送接口AXI4-Stream多了一个tx_ifg_delay端口,它是用于设置发送间隔,一般都默认采用最小间隔,即将 tx_ifg_delay 置为 0 即可;

用户接收接口AXI4-Stream少了一个tready 信号,这代表接收端需要具备持续接收数据的能力,防止出现数据来不及接收而产生溢出;

pcspma_status[7:0]信号用于反应物理层运行情况,最低位为1表示物理层锁定,即运行正常;

sim_speed_up 端口只有在仿真时才需要用到,用于加快仿真速度,仿真时给1,上板编译时给0;

AXI4-Lite接口对IP和内部的MAC层和物理层就你行配置,主要是对复位顺序的配置和内部数据读写测试等;

10G Ethernet Subsystem 使用

10G Ethernet Subsystem通过调用IP方式使用,这里只对重点配置讲解,如下:
在这里插入图片描述
当AXI4-Stream数据位宽选择64 bit时,要求GT连接的外部晶振必须是156.25M;这点很重要,因为它对硬件有定性要求,可以选择SIL系列可编程的差分晶振,否则硬件设计兼容性很差;

10G Ethernet Subsystem 配置

10G Ethernet Subsystem通过调用IP方式使用,通过AXI4-Lite接口对IP和内部的MAC层和物理层就你行配置,主要是对复位顺序的配置和内部数据读写测试等,代码中提供了纯verilog的配置逻辑,如下:
在这里插入图片描述

10G/25G Ethernet Subsystem 详解

Xilinx官方的10G Ethernet Subsystem的10G IP核实现以太网物理层和MAC数据接口转换,并以AXI4-Stream接口输出MAC数据,以工程4为例,代码层面如下:
在这里插入图片描述
10G/25G Ethernet Subsystem是Xilinx推出的具有10G速率的MAC,用户接口为AXI4-Stream,使用Xilinx GT高速接口作为物理层,官方数据手册为《PG210》,本博对10G Ethernet Subsystem的解析主要是对《PG210》的翻译和总结,详细细节读者还需自行阅读官方英文原版手册;10G/25G Ethernet Subsystem框架如下:
在这里插入图片描述
可以看到,10G/25G Ethernet Subsystem与我们之前使用的10G Ethernet Subsystem相机简单很多,但功能都是一样的,用户需要关心的只有两个,一个是无外部连接的SFP光口,另一个是与FPGA用户逻辑连接的用户接口;外部接口为SERDES,本应用为SFP光口,FPGA用户逻辑接口为AXI4-Stream;

10G/25G Ethernet Subsystem 使用

10G/25G Ethernet Subsystem通过调用IP方式使用,这里只对重点配置讲解,如下:
在这里插入图片描述
在这里插入图片描述
当AXI4-Stream数据位宽选择64 bit时,要求GT连接的外部晶振必须是156.25M;这点很重要,因为它对硬件有定性要求,可以选择SIL系列可编程的差分晶振,否则硬件设计兼容性很差;

10G/25G Ethernet Subsystem 配置

10G/25G Ethernet Subsystem通过调用IP方式使用,通过灵活接口对IP和内部的MAC层和物理层进行配置,相比于之前使用的0G Ethernet Subsystem需要AXI-Lite配置而言,10G/25G Ethernet Subsystem使用更为简单,不再需要配置逻辑,仅需进行同步复位即可;

AXI4-Stream缓冲FIFO

10G Ethernet Subsystem与UDP协议栈之间的数据需要通过 AXI4-Stream FIFO做缓冲,以工程1为例,代码层面如下:
在这里插入图片描述
MAC数据发送
TCP/IP 协议栈发送MAC数据给10G Ethernet Subsystem IP核,需要用AXIS FIFO做跨时钟域缓冲,这是必须的操作,否则数据出错;

MAC数据接收
10G Ethernet Subsystem IP核输出MAC数据给TCP/IP 协议栈,需要用AXIS FIFO做跨时钟域缓冲,这是必须的操作,否则数据出错;

TCP/IP协议栈简介

本TCP/IP协议栈为纯VHDL实现的万兆网速率客户端版本,可实现万兆TCP协议网络通信,TCP/IP协议栈基本设计框架如下:
在这里插入图片描述
其中的UDP我们没有用到,只用到了TCP;TCP/IP 协议栈源码架构如下:
在这里插入图片描述

TCP/IP协议栈性能简介

此TCP/IP协议栈是TCP客户端,不是服务器;即FPGA是TCP客户端,远程节点(比如 PC 电脑)是服务器;

常规性能

1:纯VHDL实现,没有用到任何一个IP核;
2:可移植性,由于代码中用到了Xilinx的RAM原语,所以理论上只能在Xilinx系列FPGA用,但由于国产目前XX,所以也可在可替代的复旦微、国威等系列FPGA上用,!!注意!!注意!!注意,复旦微、国威不建议过多传播;
3:功能齐全,包含了客户端全套;TCP/IP协议栈本身包含了动态ARP、NDP、PING、IGMP、HDCP (for multicast UDP)等功能模块,但HDCP有BUG,目前还未完全调通,不建议使用;前还未完全调通,不建议使用;
4:代码符合标准的IEEE 802.3协议,支持IPv4和IPv6;
5:对外接PHY的数据格式要求:RGMII;
6:时序收敛很到位,考虑到TCP协议的复杂性和时序的高要求,所以没有采用时序收敛不强的verilog,而是VHDL,虽然阅读性可能会低一些,但用户只需要知道用户接口即可,并不需要去看内部的复杂代码;
7:动态ARP功能;
8:带ping功能;
9:支持多播;

支持多节点

支持节点数是TCP里面最重要的性能指标之一,这里需要重点讲述:
TCP节点数最大支持255个,通过parameter TCP_NUM参数设置,但前提是你的FPGA资源能满足;TCP_NUM参数可以在代码中自由修改,含义和用法,在代码里有详细的注释,为了防止不同编译器下中文注释出现乱码,注释均由英文书写,英语较差的兄弟可以直接某度翻译,位置如下:
在这里插入图片描述
本例程只用到了1个节点;
此外,使用TCP/IP 协议栈网表的工程不支持多节点,没有此参数配置;

FPGA资源占用少

FPGA资源消耗是TCP里面最重要的性能指标之一,这里需要重点讲述:
FPGA资源消耗很低;以下举例:
以Xilinx系列Kintex7-35T平台为例,TCP/IP协议栈的资源消耗如下:
在这里插入图片描述

数据吞吐率高

数据吞吐率是TCP里面最重要的性能指标之一,这里需要重点讲述:
10G万兆网TCP/IP 协议栈的数据吞吐率与代码中的弹性Buffer深度有关;
TCP_TX_WINDOW_SIZE参数和TCP_RX_WINDOW_SIZE参数决定了Buffer深度,具体关系如下:
TCP发送弹性buffer深度=2TCP_TX_WINDOW_SIZE,TCP_TX_WINDOW_SIZE范围为11到20;
TCP接收弹性buffer深度=2
TCP_RX_WINDOW_SIZE,TCP_RX_WINDOW_SIZE范围为11到20;
不同的弹性Buffer深度与数据吞吐率映射如下:
在这里插入图片描述

低延时性能

延时性能是TCP里面最重要的性能指标之一,这里需要重点讲述:
延时与TCP数据包长直接相关,如果你对延时性能性能要求很高,则可以减少包长来有效降低延时,假设你的载包为X bytes,那么你的收发延时关系如下:
发送延时=0.5 + 2X÷125 µs;
接收延时=0.5 + X÷125 µs;
最大帧长度为1460字节,FPGA 时钟156.25MHz下的测试结果如下:
发送延时=23.9µs;
接收延时=12.2µs;

TCP/IP协议栈接口描述

由于TCP/IP协议栈主体部分由VHDL代码编写,导致可读性较差,毕竟很多朋友都是直接学的verilog语言,对VHDL并不熟悉,所以我们用verilog模块对VHDL模块做了例化形成verilog的顶层模块接口供用户例化,所以TCP/IP协议栈顶层接口如下:

module ikun_10gtcp_vip #(
	parameter CLK_FREQUENCY      = 156 ,	// 参考时钟频率	
	parameter TCP_NUM            = 1   ,	// tcp 端口数量,这里仅用到了1个	
	parameter UDP_TX_EN          = 1   ,	// UDP发送使能, 1-->使用UDP发送功能
	parameter UDP_RX_EN          = 1   ,	// UDP接收使能, 1-->使用UDP接收功能
	parameter TCP_MTU	         = 1500,	// TCP包长,范围1500到9000,普通帧使用1500,巨型帧使用9000
	parameter TCP_TX_WINDOW_SIZE = 17  ,	// TCP发送弹性buffer深度=2**TCP_TX_WINDOW_SIZE,TCP_TX_WINDOW_SIZE范围为11到20
	parameter TCP_RX_WINDOW_SIZE = 17  ,	// TCP接收弹性buffer深度=2**TCP_RX_WINDOW_SIZE,TCP_RX_WINDOW_SIZE范围为11到20
	parameter IPv6_ENABLED       = 0   ,	// IPV6使能
	parameter DHCP_CLIENT_EN     = 0   ,	// 客户端端DHCP使能,目前该功能存在BUG,不建议使用
	parameter IGMP_EN            = 0   ,	// IGMP使能
	parameter SIMULATION_EN      = 0   		// 仿真开关	
)(
	input                    clk                     ,	// 参考时钟=Ethernet端的MAC时钟
	input                    reset                   ,	// 高电平复位	
	input  [ 47:0]           fpga_MAC_addr           ,	// FPGA网卡MAC地址	
	input                    fpga_dhcp_en            ,	// 0-->disable dhcp ; 1-->enable dhcp,目前该功能存在BUG,不建议使用	
	input  [ 31:0]           fpga_static_IPV4_addr   ,	// FPGA网卡静态IPV4地址	
	input  [ 31:0]           fpga_subnet_addr        ,	// FPGA网卡子网掩码	
	input  [ 31:0]           fpga_static_gaitway_addr,	// FPGA网卡静态网关地址	
	// MAC层接口信号         
	output                   mac_tx_tuser            ,	// 输出--MAC层发送数据开始	
	output                   mac_tx_tvalid           ,	// 输出--MAC层发送数据有效	
	input                    mac_tx_tready           ,	// 输入--MAC层发送数据准备好	
	output [ 63:0]           mac_tx_tdata            ,	// 输出--MAC层发送数据
	output [  7:0]           mac_tx_tkeep            ,	// 输出--MAC层发送选通			
	output                   mac_tx_tlast            ,	// 输出--MAC层发送数据结尾
	input                    mac_rx_tvalid           ,	// 输入--MAC层接收数据有效	
	output                   mac_rx_tready           ,	// 输入--MAC层接收数据准备好	
	input  [ 63:0]           mac_rx_tdata            ,	// 输入--MAC层接收数据
	input  [  7:0]           mac_rx_tkeep            ,	// 输入--MAC层接收选通		
	input                    mac_rx_tlast            ,	// 输入--MAC层接收数据结尾	
	// UDP 配置接口
	input  [15:0]            udp_rx_dest_port        ,	// 输入--UDP协议栈用户接收目的端口号
	input  [15:0]            udp_rx_source_port      ,	// 输入--UDP协议栈用户接收  源端口号
	input  [127:0]           udp_dest_ip_addr        ,	// 输入--UDP协议栈用户发送目的 IP 地址
	input  [15:0]            udp_tx_dest_port        ,	// 输入--UDP协议栈用户发送目的端口号
	input  [15:0]            udp_tx_source_port      ,	// 输入--UDP协议栈用户发送  源端口号	
	// UDP 用户 AXIS 接收数据接口                    
	output                   udp_rx_tuser            ,	// 输出--UDP协议栈用户接收数据开始
	output                   udp_rx_tvalid           ,	// 输出--UDP协议栈用户接收数据有效	
	output [63:0]            udp_rx_tdata            ,	// 输出--UDP协议栈用户接收数据
	output [7:0]             udp_rx_tkeep            ,	// 输出--UDP协议栈用户接收数据选通
	output                   udp_rx_tlast            ,	// 输出--UDP协议栈用户接收数据结尾
	output                   udp_rx_frame_de         ,	// 输出--UDP协议栈用户接收数据帧有效
	// UDP 用户 AXIS 发送数据接口	                 
	input                    udp_tx_tuser            ,	// 输入--UDP协议栈用户发送数据开始	
	input                    udp_tx_tvalid           ,	// 输入--UDP协议栈用户发送数据有效
	output                   udp_tx_tready           ,	// 输出--UDP协议栈用户发送数据准备好	
	input  [63:0]            udp_tx_tdata            ,	// 输入--UDP协议栈用户发送数据	
	input  [7:0]             udp_tx_tkeep            ,	// 输入--UDP协议栈用户发送数据选通
	input                    udp_tx_tlast            ,	// 输入--UDP协议栈用户发送数据结尾		
	output                   udp_tx_ack              ,	// 输入--UDP协议栈用户发送数据应答
	output                   udp_tx_nak              ,	// 输入--UDP协议栈用户发送数据无应答
	// TCP 配置接口                                  
	input  [128*TCP_NUM-1:0] tcp_dest_ip_addr        ,	// 输入--TCP协议栈用户发送目的 IP 地址
	input  [16*TCP_NUM-1 :0] tcp_dest_port           ,	// 输入--TCP协议栈用户发送目的端口号
	input  [16*TCP_NUM-1 :0] tcp_local_port          ,	// 输入--TCP协议栈用户本地端口号
	// TCP 用户 AXIS 接收数据接口                    
	output [TCP_NUM-1    :0] tcp_rx_tuser            ,	// 输出--TCP协议栈用户接收数据开始
	output [TCP_NUM-1    :0] tcp_rx_tvalid           ,	// 输出--TCP协议栈用户接收数据有效	
	output [64*TCP_NUM-1 :0] tcp_rx_tdata            ,	// 输出--TCP协议栈用户接收数据
	output [8*TCP_NUM-1  :0] tcp_rx_tkeep            ,	// 输出--TCP协议栈用户接收数据选通
	output [TCP_NUM-1    :0] tcp_rx_tlast            ,	// 输出--TCP协议栈用户接收数据结尾
	input  [32*TCP_NUM-1 :0] tcp_rx_free_space       ,	// 输入--TCP协议栈用户接收数据帧剩余
	// TCP 用户 AXIS 发送数据接口
	input  [TCP_NUM-1    :0] tcp_tx_tvalid           ,	// 输入--TCP协议栈用户发送数据有效	
	input  [64*TCP_NUM-1 :0] tcp_tx_tdata            ,	// 输入--TCP协议栈用户发送数据
	input  [8*TCP_NUM-1  :0] tcp_tx_tkeep            ,	// 输入--TCP协议栈用户发送数据选通
	output [TCP_NUM-1    :0] tcp_tx_tready           	// 输出--TCP协议栈用户发送数据准备好
);

TCP/IP协议栈接口是用户逻辑与TCP/IP协议栈对接的,所以这部分非常重要,用户想要把TCP/IP协议栈用起来,理论上只需要掌握其用户接口的使用即可;
其中的parameter参数有详细注释;
配置端口用户对FPGA开发板做网卡级别的配置,包括IP、MAC地址等;
MAC层接口与10G Ethernet Subsystem IP核对接;
UDP协议栈用户接口暂时用不到;
TCP协议栈用户接口是用户逻辑直接对接的接口;
具体可参考工程源码中对该模块的调用;

TCP用户数据测试模块

TCP用户数据测试模块集成了接收数据回环和数据测速功能,通过define宏定义选择,如下:
在这里插入图片描述
接收数据回环功能

将接收数据回环发送出去,即形成发送=接收的自回环功能;该功能的作用是配合网络调试助手进行数据收发测试、数据丢包测试、数据正确性测试等;

数据数据测速

FPGA自动循环向TCP/IP 协议栈发送累加的数据,数据内容从0开始累加,即形成连续发送数据功能;该功能的作用是配合PC端测试网络极限速率,打开电脑端的资源管理器,查看网卡,即可看到通信速率;值得注意的是,该方法并不能真实反映网速,用更为专业的网速测试软件为佳;

IP地址修改

每套工程均可修改FPGA开发板的IP地址、MAC地址、端口号等信息,同时也可以修改远程节点的IP地址、端口号等信息,代码里有注释,如下:
在这里插入图片描述

工程源码架构

提供6套工程源码,以工程源码1为例,综合后的工程源码架构如下:
在这里插入图片描述

4、工程源码1详解:Kintex7-325T 版本

开发板FPGA型号:Xilinx–Kintex7-35T–xc7k325tffg676-2;
开发环境:Vivado2019.1;
以太网物理层方案:Xilinx–10G Ethernet Subsystem方案;
以太网传输层协议:TCP/IP协议栈,万兆网速率,FPGA做TCP客户端
输入输出接口:SFP光口,10G线速率;
FPGA使用高速接口:GTX高速接口,10G线速率;
实现功能:FPGA实现万兆TCP/IP 协议栈;
工程作用:此工程目的是让读者掌握FPGA实现万兆TCP/IP 协议栈的设计能力,以便能够移植和设计自己的项目;
工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

5、工程源码2详解:Virtex7–690T 版本

开发板FPGA型号:Xilinx–Virtex7–690T–xc7vx690tffg1761-3;
开发环境:Vivado2019.1;
以太网物理层方案:Xilinx–10G Ethernet Subsystem方案;
以太网传输层协议:TCP/IP协议栈,万兆网速率,FPGA做TCP客户端
输入输出接口:SFP光口,10G线速率;
FPGA使用高速接口:GTH高速接口,10G线速率;
实现功能:FPGA实现万兆TCP/IP 协议栈;
工程作用:此工程目的是让读者掌握FPGA实现万兆TCP/IP 协议栈的设计能力,以便能够移植和设计自己的项目;
工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

6、工程源码3详解:Zynq7100 版本

开发板FPGA型号:Xilinx–Zynq7100–xc7z100ffg900-2;
开发环境:Vivado2019.1;
以太网物理层方案:Xilinx–10G Ethernet Subsystem方案;
以太网传输层协议:TCP/IP协议栈,万兆网速率,FPGA做TCP客户端
输入输出接口:SFP光口,10G线速率;
FPGA使用高速接口:GTX高速接口,10G线速率;
实现功能:FPGA实现万兆TCP/IP 协议栈;
工程作用:此工程目的是让读者掌握FPGA实现万兆TCP/IP 协议栈的设计能力,以便能够移植和设计自己的项目;
工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

7、工程源码4详解:KU060 版本

开发板FPGA型号:Xilinx-- Kintex-UltraScale–xcku060-ffva1156-2-i;
开发环境:Vivado2019.1;
以太网物理层方案:Xilinx–10G/25G Ethernet Subsystem方案;
以太网传输层协议:TCP/IP协议栈,万兆网速率,FPGA做TCP客户端
输入输出接口:SFP光口,10G线速率;
FPGA使用高速接口:UltraScale GTH高速接口,10G线速率;
实现功能:FPGA实现万兆TCP/IP 协议栈;
工程作用:此工程目的是让读者掌握FPGA实现万兆TCP/IP 协议栈的设计能力,以便能够移植和设计自己的项目;
工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

8、工程源码5详解:KU3P 版本

开发板FPGA型号:Xilinx–>Kintex UltraScale±-xcku3p-ffva676-2-i;
开发环境:Vivado2019.1;
以太网物理层方案:Xilinx–10G/25G Ethernet Subsystem方案;
以太网传输层协议:TCP/IP协议栈,万兆网速率,FPGA做TCP客户端
输入输出接口:SFP光口,10G线速率;
FPGA使用高速接口:GTY高速接口,10G线速率;
实现功能:FPGA实现万兆TCP/IP 协议栈;
工程作用:此工程目的是让读者掌握FPGA实现万兆TCP/IP 协议栈的设计能力,以便能够移植和设计自己的项目;
工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

9、工程源码6详解:ZU4EV 版本

开发板FPGA型号:Xilinx–>Zynq-UltraScale+MPSoCs-xczu4ev-sfvc784-2-i;
开发环境:Vivado2019.1;
以太网物理层方案:Xilinx–10G/25G Ethernet Subsystem方案;
以太网传输层协议:TCP/IP协议栈,万兆网速率,FPGA做TCP客户端
输入输出接口:SFP光口,10G线速率;
FPGA使用高速接口:UltraScale GTH高速接口,10G线速率;
实现功能:FPGA实现万兆TCP/IP 协议栈;
工程作用:此工程目的是让读者掌握FPGA实现万兆TCP/IP 协议栈的设计能力,以便能够移植和设计自己的项目;
工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

10、工程移植说明

vivado版本不一致处理

1:如果你的vivado版本与本工程vivado版本一致,则直接打开工程;
2:如果你的vivado版本低于本工程vivado版本,则需要打开工程后,点击文件–>另存为;但此方法并不保险,最保险的方法是将你的vivado版本升级到本工程vivado的版本或者更高版本;
在这里插入图片描述
3:如果你的vivado版本高于本工程vivado版本,解决如下:
在这里插入图片描述
打开工程后会发现IP都被锁住了,如下:
在这里插入图片描述
此时需要升级IP,操作如下:
在这里插入图片描述
在这里插入图片描述

FPGA型号不一致处理

如果你的FPGA型号与我的不一致,则需要更改FPGA型号,操作如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
更改FPGA型号后还需要升级IP,升级IP的方法前面已经讲述了;

其他注意事项

1:由于每个板子的DDR不一定完全一样,所以MIG IP需要根据你自己的原理图进行配置,甚至可以直接删掉我这里原工程的MIG并重新添加IP,重新配置;
2:根据你自己的原理图修改引脚约束,在xdc文件中修改即可;
3:纯FPGA移植到Zynq需要在工程中添加zynq软核;

11、上板调试验证并演示

准备工作

本实验需要如下设备:
FPGA开发板,可以使用你自己的,也可以使用本博主的;
SFP光模块,支持10G线速率;
光纤,支持10G线速率;
10G网卡;
带PCIE的电脑主机;
网络调试助手软件;
连接如下:
在这里插入图片描述

首先设置电脑端IP如下:
在这里插入图片描述
注意!!!
注意!!!
由于代码里设置了远端IP地址自回环,所以只需要将电脑端IP地址设为与FPGA网卡IP地址同网段且不重合即可,比如这里不仅可以设置微192.168.0.10,还可以设为192.168.0.100、192.168.0.101、192.168.0.102等,但不可设置为192.168.0.56,因为这是FPGA网卡的IP地址;

然后下载bit,如下:
在这里插入图片描述

ping测试

打开cdm,输入 ping 192.168.0.56,如下:
在这里插入图片描述
ping测试视频演示如下,请点击观看:

千兆网TCP协议栈ping操作

TCP数据回环测试

打开网络调试助手并配置,如下:
在这里插入图片描述
单次发送数据测试结果如下:
在这里插入图片描述
循环发送数据测试结果如下,1秒时间间隔循环:可以看到,数据收发量接近15万字节,没有丢包,足以证明其稳定性;
在这里插入图片描述
TCP数据回环测试视频演示如下,请点击观看:

千兆网TCP协议栈服务器数据收发测试

网络速度测试

以工程源码1为例,下载测速的bit,打开网络调试助手,选择暂停接收显示,如下:
在这里插入图片描述
然后将测速bit里面的VIO打开,并将tx_en设置为1,如下:
在这里插入图片描述
然后打开电脑的任务管理器–>性能,找到你的10G网卡,即可看到实时速率,如下:
在这里插入图片描述
注意!!!
注意!!!
注意!!!
这个测速只代表可能的最高的速度,TCP 的点到点速度和电脑的网卡、CPU 速度、内存速度、操作系统都有关系;

发送速率测试视频演示如下,请点击观看:

10G-TCP测速

真实用户使用反馈

如果用户有需求,我一般会先针对用户的板子原理图做一个测试bit,主要测试数据回环和测速,用户拿到bit后自行测试,觉得测试效果满意后再决定是否使用,举例某航某院的用户对数据回环和数据丢包的使用反馈如下:
在这里插入图片描述
举例某航某院的用户对网络测速的使用反馈如下:
在这里插入图片描述

12、工程代码的获取

代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下:
在这里插入图片描述
此外,有很多朋友给本博主提了很多意见和建议,希望能丰富服务内容和选项,因为不同朋友的需求不一样,所以本博主还提供以下服务:
在这里插入图片描述

### 兆网FPGA 实现方案设计 #### 技术背景 FPGA(现场可编程门阵列)因其高度灵活性并行处理能力,在高性能络应用中扮演着重要角色。特别是在以太网领域,通过硬件加速实现TCP/IP协议栈成为一种常见需求。基于Xilinx Zynq系列FPGA的解决方案提供了强大的集成能力高效的性能表现。 #### 硬件平台配置 所使用的开发板采用 **Xilinx-Zynq7100-xc7z100ffg900-2** 型号[^1],该芯片集成了双核ARM Cortex-A9处理器以及丰富的PL(可编程逻辑)资源,适合复杂的数据包处理任务。为了满足速率的需求,开发板需配备至少一路SFP光口,并搭配支持10Gbps速率的SFP光模块光纤进行实际部署[^2]。 #### 高速接口选型 针对以太网的应用场景,选用 **GTX高速串行收发器** 提供必要的物理层支持。 GTX 支持高达10Gbps的数据传输率,其工作时钟频率设定为156.25MHz作为参考时钟输入(refclk_p/refclk_n)[^4]。 此外,还需注意以下信号定义: - `sfp_tx_dis`:控制光模块发送状态; - `sfp_linkup`:实时监控链路连接状况; - 数据交互则分别经由`s_axis`(发送端) `m_axis`(接收端)完成与MAC核之间的通信。 #### 软件环境搭建 整个项目的开发流程依托于 **Vivado 2019.1** IDE 完成综合、布局布线及比特流生成等工作。 同时利用 Xilinx 提供的标准IP库构建核心组件——即 **10G Ethernet Subsystem** ,它封装了完整的PHY层至L3/L4的功能模块。 用户只需专注于顶层互联部分即可快速启动项目原型验证过程。 #### TCP/IP 协议栈实现细节 在本案例中实现了轻量级的TCP客户端模式下的全功能TCP/IP堆栈运行于HDL描述之上。 这种方法避免了传统嵌入式Linux驱动程序带来的额外开销,从而显著提升了整体吞吐效率。 关键在于合理分配有限的片上RAM资源来缓冲待传/已收数据帧的同时保持低延迟特性。 #### 性能评估与优化建议 最终统计显示此设计方案占用约XX% LUTs, YY% FFs 及 ZZ DSP slices 的总容量。 功耗方面亦维持在一个较为理想的水平范围内。 若追求进一步降低功耗或者提高密度利用率,则可以考虑引入更先进的工艺节点比如Kintex UltraScale+系列产品替代原有器件家族成员[^5]。 ```python # 示例代码片段展示如何初始化某些参数 def initialize_fpga_params(): clk_in_frequency = 156.25e6 # MHz to Hz conversion reset_signal_level = 'high' # Active high logic level config_dict = { "CLK_IN_FREQ": clk_in_frequency, "RESET_LEVEL": reset_signal_level } return config_dict ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

9527华安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值