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


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

1、前言

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

工程概述

本设采用纯VHDL实现了10G万兆网TCP/IP协议栈,该协议栈为TCP服务器版本,没有用到任何一个IP核;并在Xilinx系列FPGA上做了部署并验证,由于使用千兆网,所以需要与FPGA开发板上的网络PHY交互,对硬件有一定要求;整个工程处理流程如下:

TCP/IP协议栈接收流程
PC端网络调试助手发送以太网数据包,或者发起ping操作,数据通过插在PC电脑主板上的10G网卡以光纤介质发送到FPGA开发板;FPGA开发板板载的SFP光口接收光纤数据发送给FPGA;然后调用Xilinx官方的10G Ethernet Subsystem的10G IP核实现MAC数据解析,并以AXI4-Stream数据流输出MAC数据;再调用2个AXI4-Stream Data FIFO做MAC数据跨时钟域处理和数据缓冲处理后依然以AXI4-Stream数据流输出给TCP/IP 协议栈;TCP/IP 协议栈对数据的MAC数据做以太网数据帧解析、IP报文解析等操作,去掉以太网帧头、协议层报文帧头等信息,提取出有效数据段信息和IP、MAC等地址信息,并以AXI4-Stream数据流形式输出有效数据,至此,TCP/IP协议栈接收流程完毕;

TCP/IP协议栈发送流程
用户数据测试模块为数据发起者,可以是测速模式下的单向的给PC端发送数据,也可以是数据回环模式下的将接收数据回环发送出去,两种模式通过define宏定义选择;用户输出发送时序为AXI4-Stream数据流;用户发送数据首先进入TCP/IP协议栈,并做协议层报文封装、以太网帧格式封装等操作,然后以AXI4-Stream数据流输出;再调用2个AXI4-Stream Data FIFO做TCP数据跨时钟域处理和数据缓冲处理后依然以AXI4-Stream数据流输出给MAC层;然后调用Xilinx官方的10G Ethernet Subsystem的10G IP核实现MAC数据加扰串化,以高速差分数据输出;高速差分数据再进入开发板板载的SFP光口,以光纤介质发送给PC电脑主板上的10G网卡,至此,TCP/IP协议栈发送流程完毕;

为了通用性和适应性,针对不同FPGA型号与不同网络PHY的差异,一共移植了6套工程源码,详情如下:
在这里插入图片描述
6套工程源码的TCP/IP 协议栈分为两种提供方式:
工程1~3提供的是TCP/IP 协议栈源码,即完全看得到并可修改的纯源码;
工程4~6提供的是TCP/IP 协议栈网表,可以正常调用、例化并使用,但看不到TCP/IP 协议栈源码也不能修改;

这里说明一下提供的6套工程源码的作用和价值,如下:

工程源码1
开发板FPGA型号为Xilinx Kintex7-35T,板载光口类型为10G SFP光口,使用Xilinx官方的10G Ethernet Subsystem做MAC,进行TCP/IP 协议栈万兆网服务器版本的应用部署,其中TCP/IP 协议栈提供的是纯VHDL代码实现的源码,并对源码进行了verilog的顶层例化,对不熟悉VHDL语法的朋友来说是巨大福音,因为在工程中可以直接用verilog当时例化TCP/IP 协议栈,该工程适用于Xilinx 7系列FPGA移植;

工程源码2
开发板FPGA型号为Xilinx Zynq7100,板载光口类型为10G SFP光口,使用Xilinx官方的10G Ethernet Subsystem做MAC,进行TCP/IP 协议栈万兆网服务器版本的应用部署,其中TCP/IP 协议栈提供的是纯VHDL代码实现的源码,并对源码进行了verilog的顶层例化,对不熟悉VHDL语法的朋友来说是巨大福音,因为在工程中可以直接用verilog当时例化TCP/IP 协议栈,该工程适用于Xilinx 7系列FPGA移植;

工程源码3
开发板FPGA型号为Xilinx Kintex-UltraScale-060,板载光口类型为10G SFP光口,使用Xilinx官方的10G/25G Ethernet Subsystem做MAC,进行TCP/IP 协议栈万兆网服务器版本的应用部署,其中TCP/IP 协议栈提供的是纯VHDL代码实现的源码,并对源码进行了verilog的顶层例化,对不熟悉VHDL语法的朋友来说是巨大福音,因为在工程中可以直接用verilog当时例化TCP/IP 协议栈,该工程适用于Xilinx Kintex-UltraScale系列FPGA移植;

工程源码4
开发板FPGA型号为Xilinx Kintex7-35T,板载光口类型为10G SFP光口,使用Xilinx官方的10G Ethernet Subsystem做MAC,进行TCP/IP 协议栈万兆网服务器版本的应用部署,其中TCP/IP 协议栈提供的是EDF网表文件,可以正常调用、例化并使用,但看不到TCP/IP 协议栈源码也不能修改,网表文件例化方式依然是verilog方式;该工程适用于Xilinx 7系列FPGA移植;

工程源码5
开发板FPGA型号为Xilinx Zynq7100,板载光口类型为10G SFP光口,使用Xilinx官方的10G Ethernet Subsystem做MAC,进行TCP/IP 协议栈万兆网服务器版本的应用部署,其中TCP/IP 协议栈提供的是EDF网表文件,可以正常调用、例化并使用,但看不到TCP/IP 协议栈源码也不能修改,网表文件例化方式依然是verilog方式;该工程适用于Xilinx 7系列FPGA移植;

工程源码6
开发板FPGA型号为Xilinx Kintex-UltraScale-060,板载光口类型为10G SFP光口,使用Xilinx官方的10G/25G Ethernet Subsystem做MAC,进行TCP/IP 协议栈万兆网服务器版本的应用部署,其中TCP/IP 协议栈提供的是EDF网表文件,可以正常调用、例化并使用,但看不到TCP/IP 协议栈源码也不能修改,网表文件例化方式依然是verilog方式;该工程适用于Xilinx Kintex-UltraScale系列FPGA移植;

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

免责声明

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

2、相关方案推荐

我这里已有的以太网方案

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

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 详解

工程源码1、2、4、5使用10G Ethernet Subsystem,包括IP调用、IP配置等,以工程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 详解

工程源码3、6使用10G/25G Ethernet Subsystem,主要为IP调用、IP复位配置等,以工程3为例,代码层面如下:
在这里插入图片描述
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 协议栈源码,即完全看得到并可修改的纯源码;另一种是TCP/IP 协议栈网表,可以正常调用、例化并使用,但看不到TCP/IP 协议栈源码也不能修改;TCP/IP协议栈基本设计框架如下:
在这里插入图片描述
其中的UDP我们没有用到,只用到了TCP;

TCP/IP协议栈源码简介

TCP/IP 协议栈源码架构如下:
在这里插入图片描述

TCP/IP协议栈网表简介

TCP/IP 协议栈网表架是TCP/IP协议栈源码加密封装而来,用户可以正常调用、例化并使用,但看不到TCP/IP 协议栈源码也不能修改;架构如下:
在这里插入图片描述

TCP/IP协议栈性能简介

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

常规性能

1:纯VHDL实现,没有用到任何一个IP核;
2:移植性天花板,该协议栈可在Xilinx、Altera、Lattice、国产FPGA等各大FPGA型号之间任意移植,因为是没有任何IP和源语的纯VHDL代码实现;但例如Tri Mode Ethernet MAC这样的PHY侧IP核目前用的Xilinx的;
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_SERVER_EN     = 0   ,	// 服务器端DHCP使能,目前该功能存在BUG,不建议使用
	parameter DHCP_CLIENT_EN     = 0   ,	// 客户端端DHCP使能,目前该功能存在BUG,不建议使用
	parameter IGMP_EN            = 0   ,	// IGMP使能
	parameter IPVX_ADDR_LOOP     = 1   ,	// 目的IP地址回环使能; 1-->不需要指定目的IP地址; 0-->需要指定目的IP地址;
	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  [127:0]          fpga_IPV6_addr          ,	// FPGA网卡IPV6地址
	input  [ 31:0]          fpga_subnet_addr        ,	// FPGA网卡子网掩码
	input  [ 31:0]          fpga_static_gaitway_addr,	// FPGA网卡静态网关地址
    input  [16*TCP_NUM-1:0] fpga_tcp_port           ,	// FPGA网卡端口号	
	input  [ 31:0]          PC_IPV4_addr            ,	// 远端网卡IPV4地址	
	input  [ 15:0]          PC_tcp_port    	        ,	// 远端网卡端口号
	// MAC层接口信号                                
	output [ 63:0]          mac_tx_tdata            ,	// 输出--MAC层发送数据
	output [  7:0]          mac_tx_tkeep            ,	// 输出--MAC层发送选通	
	input                   mac_tx_tready           ,	// 输入--MAC层发送数据准备好	
	output                  mac_tx_tvalid           ,	// 输出--MAC层发送数据有效	
	output                  mac_tx_tuser            ,	// 输出--MAC层发送数据开始	
	output                  mac_tx_tlast            ,	// 输出--MAC层发送数据结尾
	input  [ 63:0]          mac_rx_tdata            ,	// 输入--MAC层接收数据
	input  [  7:0]          mac_rx_tkeep            ,	// 输入--MAC层接收选通	
	input                   mac_rx_tvalid           ,	// 输入--MAC层接收数据有效	
	output                  mac_rx_tready           ,	// 输入--MAC层接收数据准备好	
	input                   mac_rx_tlast            ,	// 输入--MAC层接收数据结尾
	// UDP协议栈用户接口信号                        
	output [ 63:0]          udp_rx_tdata            ,	// 输出--UDP协议栈用户接收数据
	output                  udp_rx_tvalid           ,	// 输出--UDP协议栈用户接收数据有效
	output  [  7:0]         udp_rx_tkeep            ,	// 输出--UDP协议栈用户接收数据选通
	output                  udp_rx_tuser            ,	// 输出--UDP协议栈用户接收数据开始	
	output                  udp_rx_tlast            ,	// 输出--UDP协议栈用户接收数据结束	
	output                  udp_rx_frame_valid      ,	// 输出--UDP协议栈用户接收数据帧有效			
	input  [ 63:0]          udp_tx_tdata            ,	// 输入--UDP协议栈用户发送数据
	input  [  7:0]          udp_tx_tkeep            ,	// 输入--UDP协议栈用户发送数据选通	
	input                   udp_tx_tvalid           ,	// 输入--UDP协议栈用户发送数据有效
	output                  udp_tx_tready           ,	// 输出--UDP协议栈用户发送数据准备好	
	input                   udp_tx_tuser            ,	// 输入--UDP协议栈用户发送数据开始	
	input                   udp_tx_tlast            ,	// 输入--UDP协议栈用户发送数据结束	
	output                  udp_tx_ack              ,	// 输出--UDP协议栈用户发送数据应答	
	output                  udp_tx_nak              ,	// 输出--UDP协议栈用户发送数据无应答	
	// TCP协议栈用户接口信号	
	output [64*TCP_NUM-1:0] tcp_rx_tdata            ,	// 输出--TCP协议栈用户接收数据
	output [   TCP_NUM-1:0] tcp_rx_tvalid           ,	// 输出--TCP协议栈用户接收数据有效
	output [ 8*TCP_NUM-1:0] tcp_rx_tkeep            ,	// 输出--TCP协议栈用户接收数据选通
	output [   TCP_NUM-1:0] tcp_rx_tuser            ,	// 输出--TCP协议栈用户接收数据开始 
	output [   TCP_NUM-1:0] tcp_rx_tlast            ,	// 输出--TCP协议栈用户接收数据结束 	
	input  [32*TCP_NUM-1:0] tcp_rx_free_space       ,	// 输入--TCP协议栈用户接收数据帧剩余	
	input  [64*TCP_NUM-1:0] tcp_tx_tdata            ,	// 输入--TCP协议栈用户发送数据
	input  [   TCP_NUM-1:0] tcp_tx_tvalid           ,	// 输入--TCP协议栈用户发送数据有效
	output [   TCP_NUM-1:0] tcp_tx_tready           ,	// 输出--TCP协议栈用户发送数据准备好	
	input  [ 8*TCP_NUM-1:0] tcp_tx_tkeep            	// 输入--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地址、端口号等信息,当IPVX_ADDR_LOOP设置为1时,不需要指定远程节点的IP地址,这也是默认的工作方式,代码里有注释,如下:
在这里插入图片描述

TCP/IP 协议栈RTL源码版本–>工程源码架构

工程源码1~3为TCP/IP 协议栈源码版本,以工程源码1为例工程源码架构截图如下,其他工程与之类似:
在这里插入图片描述

TCP/IP 协议栈EDF网表版本–>工程源码架构

工程源码4~6为TCP/IP 协议栈源码版本,以工程源码4为例工程源码架构截图如下,其他工程与之类似:
在这里插入图片描述

4、工程源码1详解:Kintex7-35T–10G TCP协议栈RTL源码版本

开发板FPGA型号:Xilinx–Kintex7-35T–xc7k325tffg676-2;
开发环境:Vivado2019.1;
输入输出:万兆以太网帧,TCP网络数据;
接口:1路SFP 10G光口;
MAC方案:Xilinx–10G Ethernet Subsystem方案;
协议层方案:10G–TCP协议栈–服务器;
TCP协议栈是否提供源码?–>提供完整的源码;
工程源码架构请参考前面第3章节中的《TCP/IP 协议栈RTL源码版本–>工程源码架构》小节;
工程作用:此工程目的是让读者掌握FPGA实现 TCP/IP 协议栈 服务器版本的设计能力,以便能够移植和设计自己的项目;
工程的资源消耗和功耗如下:
在这里插入图片描述

5、工程源码2详解:Zynq7100–10G TCP协议栈RTL源码版本

开发板FPGA型号:Xilinx–Zynq7100–xc7z100ffg900-2;
开发环境:Vivado2019.1;
输入输出:万兆以太网帧,TCP网络数据;
接口:1路SFP 10G光口;
MAC方案:Xilinx–10G Ethernet Subsystem方案;
协议层方案:10G–TCP协议栈–服务器;
TCP协议栈是否提供源码?–>提供完整的源码;
工程源码架构请参考前面第3章节中的《TCP/IP 协议栈RTL源码版本–>工程源码架构》小节;
工程作用:此工程目的是让读者掌握FPGA实现 TCP/IP 协议栈 服务器版本的设计能力,以便能够移植和设计自己的项目;
工程的资源消耗和功耗如下:
在这里插入图片描述

6、工程源码3详解:KU060–TCP协议栈RTL源码版本

开发板FPGA型号:Xilinx-- Kintex-UltraScale–xcku060-ffva1156-2-i;
开发环境:Vivado2019.1;
输入输出:万兆以太网帧,TCP网络数据;
接口:1路SFP 10G光口;
MAC方案:Xilinx–10G/25G Ethernet Subsystem方案;
协议层方案:10G–TCP协议栈–服务器;
TCP协议栈是否提供源码?–>提供完整的源码;
工程源码架构请参考前面第3章节中的《TCP/IP 协议栈RTL源码版本–>工程源码架构》小节;
工程作用:此工程目的是让读者掌握FPGA实现 TCP/IP 协议栈 服务器版本的设计能力,以便能够移植和设计自己的项目;
工程的资源消耗和功耗如下:
在这里插入图片描述

7、工程源码4详解:Kintex7-35T–10G TCP协议栈EDF网表版本

开发板FPGA型号:Xilinx–Kintex7-35T–xc7k325tffg676-2;
开发环境:Vivado2019.1;
输入输出:万兆以太网帧,TCP网络数据;
接口:1路SFP 10G光口;
MAC方案:Xilinx–10G Ethernet Subsystem方案;
协议层方案:10G–TCP协议栈–服务器;
TCP协议栈是否提供源码?–>否,提供TCP协议栈网表文件;
工程源码架构请参考前面第3章节中的《TCP/IP 协议栈EDF网表版本–>工程源码架构》小节;
工程作用:此工程目的是让读者掌握FPGA实现 TCP/IP 协议栈 服务器版本的设计能力,以便能够移植和设计自己的项目;
工程的资源消耗和功耗如下:
在这里插入图片描述

8、工程源码5详解:Zynq7100–10G TCP协议栈EDF网表版本

开发板FPGA型号:Xilinx–Zynq7100–xc7z100ffg900-2;
开发环境:Vivado2019.1;
输入输出:万兆以太网帧,TCP网络数据;
接口:1路SFP 10G光口;
MAC方案:Xilinx–10G Ethernet Subsystem方案;
协议层方案:10G–TCP协议栈–服务器;
TCP协议栈是否提供源码?–>否,提供TCP协议栈网表文件;
工程源码架构请参考前面第3章节中的《TCP/IP 协议栈EDF网表版本–>工程源码架构》小节;
工程作用:此工程目的是让读者掌握FPGA实现 TCP/IP 协议栈 服务器版本的设计能力,以便能够移植和设计自己的项目;
工程的资源消耗和功耗如下:
在这里插入图片描述

9、工程源码6详解:KU060–TCP协议栈EDF网表版本

开发板FPGA型号:Xilinx-- Kintex-UltraScale–xcku060-ffva1156-2-i;
开发环境:Vivado2019.1;
输入输出:万兆以太网帧,TCP网络数据;
接口:1路SFP 10G光口;
MAC方案:Xilinx–10G/25G Ethernet Subsystem方案;
协议层方案:10G–TCP协议栈–服务器;
TCP协议栈是否提供源码?–>否,提供TCP协议栈网表文件;
工程源码架构请参考前面第3章节中的《TCP/IP 协议栈EDF网表版本–>工程源码架构》小节;
工程作用:此工程目的是让读者掌握FPGA实现 TCP/IP 协议栈 服务器版本的设计能力,以便能够移植和设计自己的项目;
工程的资源消耗和功耗如下:
在这里插入图片描述

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协议栈服务器数据收发测试

发送速率测试

首先需要在代码里打开网速测试开关,如下:
在这里插入图片描述
然后编译工程,生成bit流,再板子上电下载bit;
在这里插入图片描述
然后打开VIO,将tcp_speed_en设置为1,如下:
在这里插入图片描述
在这里插入图片描述
然后打开网络调试助手,可以看到
在这里插入图片描述
然后打开电脑的任务管理器–>性能,找到你的10G网卡,即可看到实时速率,如下:
在这里插入图片描述
注意!!!
注意!!!
注意!!!
这个测速只代表可能的最高的速度,TCP 的点到点速度和电脑的网卡、CPU 速度、内存速度、操作系统都有关系;

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

10G-TCP测速

12、福利:工程代码的获取

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

  • 8
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

9527华安

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

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

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

打赏作者

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

抵扣说明:

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

余额充值