目录
- 1、前言
- 2、相关方案推荐
- 3、详细设计方案
- 设计框图
- 测试用PC端电脑
- 测试用10G 网卡
- SFP光口
- 10G Ethernet Subsystem 详解
- 10G Ethernet Subsystem 使用
- 10G Ethernet Subsystem 配置
- 10G/25G Ethernet Subsystem 详解
- 10G/25G Ethernet Subsystem 使用
- 10G/25G Ethernet Subsystem 配置
- AXI4-Stream缓冲FIFO
- TCP/IP协议栈简介
- TCP/IP协议栈性能简介
- TCP/IP协议栈接口描述
- TCP用户数据测试模块
- IP地址修改
- TCP/IP 协议栈RTL源码版本-->工程源码架构
- TCP/IP 协议栈EDF网表版本-->工程源码架构
- 4、工程源码1详解:Kintex7-35T--10G TCP协议栈RTL源码版本
- 5、工程源码2详解:Zynq7100--10G TCP协议栈RTL源码版本
- 6、工程源码3详解:KU060--TCP协议栈RTL源码版本
- 7、工程源码4详解:Kintex7-35T--10G TCP协议栈EDF网表版本
- 8、工程源码5详解:Zynq7100--10G TCP协议栈EDF网表版本
- 9、工程源码6详解:KU060--TCP协议栈EDF网表版本
- 10、工程移植说明
- 11、上板调试验证并演示
- 12、福利:工程代码的获取
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深度=2TCP_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名片。
网盘资料如下:
此外,有很多朋友给本博主提了很多意见和建议,希望能丰富服务内容和选项,因为不同朋友的需求不一样,所以本博主还提供以下服务: