FPGA实现10G万兆网TCP/IP 协议栈,服务器版本,纯VHDL代码编写 提供6套viva ...

打印 上一主题 下一主题

主题 507|帖子 507|积分 1521

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协议栈顶层接口如下:
  1. module ikun_10gtcp_vip #(
  2.         parameter CLK_FREQUENCY      = 156 ,        // 参考时钟频率
  3.         parameter TCP_NUM            = 1   ,        // tcp 端口数量,这里仅用到了1个
  4.         parameter UDP_TX_EN          = 1   ,        // UDP发送使能, 1-->使用UDP发送功能
  5.         parameter UDP_RX_EN          = 1   ,        // UDP接收使能, 1-->使用UDP接收功能
  6.         parameter TCP_MTU                 = 1500,        // TCP包长,范围1500到9000,普通帧使用1500,巨型帧使用9000
  7.         parameter TCP_TX_WINDOW_SIZE = 17  ,        // TCP发送弹性buffer深度=2**TCP_TX_WINDOW_SIZE,TCP_TX_WINDOW_SIZE范围为11到20
  8.         parameter TCP_RX_WINDOW_SIZE = 17  ,        // TCP接收弹性buffer深度=2**TCP_RX_WINDOW_SIZE,TCP_RX_WINDOW_SIZE范围为11到20
  9.         parameter IPv6_ENABLED       = 0   ,        // IPV6使能
  10.         parameter DHCP_SERVER_EN     = 0   ,        // 服务器端DHCP使能,目前该功能存在BUG,不建议使用
  11.         parameter DHCP_CLIENT_EN     = 0   ,        // 客户端端DHCP使能,目前该功能存在BUG,不建议使用
  12.         parameter IGMP_EN            = 0   ,        // IGMP使能
  13.         parameter IPVX_ADDR_LOOP     = 1   ,        // 目的IP地址回环使能; 1-->不需要指定目的IP地址; 0-->需要指定目的IP地址;
  14.         parameter SIMULATION_EN      = 0                   // 仿真开关
  15. )(
  16.         input  clk                                      ,        // 参考时钟=Ethernet端的MAC时钟
  17.         input  reset                                    ,        // 高电平复位
  18.         input  [ 47:0]          fpga_MAC_addr           ,        // FPGA网卡MAC地址       
  19.         input                   fpga_dhcp_en            ,        // 0-->disable dhcp ; 1-->enable dhcp,目前该功能存在BUG,不建议使用
  20.         input  [ 31:0]          fpga_static_IPV4_addr   ,        // FPGA网卡静态IPV4地址
  21.     input  [127:0]          fpga_IPV6_addr          ,        // FPGA网卡IPV6地址
  22.         input  [ 31:0]          fpga_subnet_addr        ,        // FPGA网卡子网掩码
  23.         input  [ 31:0]          fpga_static_gaitway_addr,        // FPGA网卡静态网关地址
  24.     input  [16*TCP_NUM-1:0] fpga_tcp_port           ,        // FPGA网卡端口号       
  25.         input  [ 31:0]          PC_IPV4_addr            ,        // 远端网卡IPV4地址       
  26.         input  [ 15:0]          PC_tcp_port                    ,        // 远端网卡端口号
  27.         // MAC层接口信号                                
  28.         output [ 63:0]          mac_tx_tdata            ,        // 输出--MAC层发送数据
  29.         output [  7:0]          mac_tx_tkeep            ,        // 输出--MAC层发送选通       
  30.         input                   mac_tx_tready           ,        // 输入--MAC层发送数据准备好       
  31.         output                  mac_tx_tvalid           ,        // 输出--MAC层发送数据有效       
  32.         output                  mac_tx_tuser            ,        // 输出--MAC层发送数据开始       
  33.         output                  mac_tx_tlast            ,        // 输出--MAC层发送数据结尾
  34.         input  [ 63:0]          mac_rx_tdata            ,        // 输入--MAC层接收数据
  35.         input  [  7:0]          mac_rx_tkeep            ,        // 输入--MAC层接收选通       
  36.         input                   mac_rx_tvalid           ,        // 输入--MAC层接收数据有效       
  37.         output                  mac_rx_tready           ,        // 输入--MAC层接收数据准备好       
  38.         input                   mac_rx_tlast            ,        // 输入--MAC层接收数据结尾
  39.         // UDP协议栈用户接口信号                        
  40.         output [ 63:0]          udp_rx_tdata            ,        // 输出--UDP协议栈用户接收数据
  41.         output                  udp_rx_tvalid           ,        // 输出--UDP协议栈用户接收数据有效
  42.         output  [  7:0]         udp_rx_tkeep            ,        // 输出--UDP协议栈用户接收数据选通
  43.         output                  udp_rx_tuser            ,        // 输出--UDP协议栈用户接收数据开始       
  44.         output                  udp_rx_tlast            ,        // 输出--UDP协议栈用户接收数据结束       
  45.         output                  udp_rx_frame_valid      ,        // 输出--UDP协议栈用户接收数据帧有效                       
  46.         input  [ 63:0]          udp_tx_tdata            ,        // 输入--UDP协议栈用户发送数据
  47.         input  [  7:0]          udp_tx_tkeep            ,        // 输入--UDP协议栈用户发送数据选通       
  48.         input                   udp_tx_tvalid           ,        // 输入--UDP协议栈用户发送数据有效
  49.         output                  udp_tx_tready           ,        // 输出--UDP协议栈用户发送数据准备好       
  50.         input                   udp_tx_tuser            ,        // 输入--UDP协议栈用户发送数据开始       
  51.         input                   udp_tx_tlast            ,        // 输入--UDP协议栈用户发送数据结束       
  52.         output                  udp_tx_ack              ,        // 输出--UDP协议栈用户发送数据应答       
  53.         output                  udp_tx_nak              ,        // 输出--UDP协议栈用户发送数据无应答       
  54.         // TCP协议栈用户接口信号       
  55.         output [64*TCP_NUM-1:0] tcp_rx_tdata            ,        // 输出--TCP协议栈用户接收数据
  56.         output [   TCP_NUM-1:0] tcp_rx_tvalid           ,        // 输出--TCP协议栈用户接收数据有效
  57.         output [ 8*TCP_NUM-1:0] tcp_rx_tkeep            ,        // 输出--TCP协议栈用户接收数据选通
  58.         output [   TCP_NUM-1:0] tcp_rx_tuser            ,        // 输出--TCP协议栈用户接收数据开始
  59.         output [   TCP_NUM-1:0] tcp_rx_tlast            ,        // 输出--TCP协议栈用户接收数据结束        
  60.         input  [32*TCP_NUM-1:0] tcp_rx_free_space       ,        // 输入--TCP协议栈用户接收数据帧剩余       
  61.         input  [64*TCP_NUM-1:0] tcp_tx_tdata            ,        // 输入--TCP协议栈用户发送数据
  62.         input  [   TCP_NUM-1:0] tcp_tx_tvalid           ,        // 输入--TCP协议栈用户发送数据有效
  63.         output [   TCP_NUM-1:0] tcp_tx_tready           ,        // 输出--TCP协议栈用户发送数据准备好       
  64.         input  [ 8*TCP_NUM-1:0] tcp_tx_tkeep                    // 输入--TCP协议栈用户发送数据选通       
  65. );
复制代码
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手刺。
网盘资料如下:

此外,有很多朋侪给本博主提了很多意见和发起,盼望能丰富服务内容和选项,因为不同朋侪的需求不一样,所以本博主还提供以下服务:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

雁过留声

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表