FPGA实现 TCP/IP 协议栈 客户端 纯VHDL代码编写 提供4套vivado工程源码和技术支持

news2024/11/26 3:56:10

目录

  • 1、前言
    • 版本更新说明
    • 免责声明
  • 2、相关方案推荐
    • 我这里已有的以太网方案
    • 1G 千兆网 TCP-->服务器 方案
    • 10G 万兆网 TCP-->服务器+客户端 方案
    • 常规性能
    • 支持多节点
    • FPGA资源占用少
    • 数据吞吐率高
    • 低延时性能
  • 4、TCP/IP 协议栈代码详解
    • 代码架构
    • 用户接口
    • 代码模块级细讲
      • 顶层模块
      • PACKET_PARSING模块
      • ARP模块
      • IGMP_REPORT和IGMP_QUERY模块
      • PING和WHOIS2模块
      • ARP_CACHE2模块
      • UDP_TX模块
      • UDP_RX模块
      • TCP_SERVER模块
      • TCP_TX模块
      • TCP_TXBUF模块
      • TCP_RXBUFNDEMUX模块
      • IP、MAC地址定义修改
  • 5、详细设计方案
    • PHY
    • Tri Mode Ethernet MAC
    • TCP数据回环
  • 6、vivado工程1-->B50610 工程
  • 7、vivado工程2-->RTL8211 工程
  • 8、vivado工程3-->88E1518 工程
  • 9、vivado工程4-->Zynq7020 B50610 工程
  • 10、工程移植说明
    • vivado版本不一致处理
    • FPGA型号不一致处理
    • 其他注意事项
  • 11、上板调试验证并演示
    • 准备工作
    • ping测试
    • TCP数据回环测试
    • 传输速率测试
  • 12、福利:工程代码的获取

FPGA实现 TCP/IP 协议栈 客户端 纯VHDL代码编写 提供4套vivado工程源码和技术支持

1、前言

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

本设采用纯VHDL实现了TCP/IP协议栈,该协议栈为TCP客户端,没有用到任何一个IP核,为了适应大批量数据传输和匹配不同型号FPGA的源语,RGMII转GMII部分调用了Xilinx的Tri Mode Ethernet MAC三速网IP,TCP/IP协议栈的MAC接口与Tri Mode Ethernet MAC实现了MAC层数据交互,TCP/IP协议栈用户接口分为UDP和TCP接口,这里只需要用到TCP接口,感兴趣的朋友可以试试UDP玩儿,将TCP的收发端口直接用assign语句连接起来形成数据回环,外部指定FPGA开发板的IP地址、MAC地址、端口号、目的IP地址、目的端口号等信息,即可完成TCP协议栈数据回环的工程搭建;TCP/IP协议栈目前速率固定为千兆速率,MAC层数据接口为GMII,所以与phy对接的数据接口为RGMII,鉴于不同phy的时序略有不同,所以我在RTL8211、B50610、88E1518三款phy上做了测试,对应的也建了4套vivado工程,在电脑端进行ping、使用网络调试助手进行TCP收发验证;本设计为TCP客户端端,即FPGA开发板作为客户端,远程节点(比如 PC 电脑)为服务器;

提供4套vivado工程源码,4套代码的区别在于使用的FPGA型号和PHY型号不同,分别如下:

1套vivado工程:FPGA型号为Xilinx 的Artix7--35T,PHY为RTL8211;
第2套vivado工程:FPGA型号为Xilinx 的Kintex7--35T,PHY为B50610;
第3套vivado工程:FPGA型号为Xilinx 的Kintex7--35T,PHY为88E1518;
第4套vivado工程:FPGA型号为Xilinx 的Zynq7020,PHY为B50610;

本设计经过反复大量测试稳定可靠,可在项目中直接移植使用,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字通信领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

版本更新说明

此版本为第2版,根据读者的建议,对第1版工程做了如下改进和更新:
1:增加了工程移植的简单说明;
2:增加了Tri Mode Ethernet MAC IP核的使用、更新、修改等说明,以单独文档形式放在了资料包中;
3:新增一套Zynq7020,PHY为B50610的vivado工程;
4:增加了RTL8211、B50610、88E1518三款phy的原理图,已放在资料包中,如下:
在这里插入图片描述

免责声明

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

2、相关方案推荐

我这里已有的以太网方案

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

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

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

10G 万兆网 TCP–>服务器+客户端 方案

我这里也有10G 万兆网 TCP 方案,该方案有服务器和客户端两套代码,在Xilinx KU和KUP等平台测试通过并很稳定,对10G 万兆网 TCP 方案感兴趣的朋友可以去看看:直接点击前往

常规性能

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 (for multicast UDP)、DHCP client(客户端才有)等功能模块;
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个节点;

FPGA资源占用少

FPGA资源消耗是TCP里面最重要的性能指标之一,这里需要重点讲述:
FPGA资源消耗很低;以下举例:
以Xilinx旗下资源很小的Spartan-6平台为例,下只运行UDP时的资源消耗如下:
在这里插入图片描述
只运行1个TCP服务器时的资源消耗如下:
在这里插入图片描述
运行2个TCP服务器时的资源消耗如下:
在这里插入图片描述

数据吞吐率高

数据吞吐率是TCP里面最重要的性能指标之一,这里需要重点讲述:
下面给出4项测试结果,你可以自己对比评估以下:
测试1:
通过千兆以太网在TCP服务器和TCP客户端之间双向连接,FPGA参考时钟120 MHz条件下,测量的持续吞吐率为双向并发452 Mbits/s;
测试2:
Xilinx Spartan-6 -2速度等级,FPGA参考时钟120 MHz,512字节的UDP数据包通过局域网点对点发送下测得:
0丢包,吞吐率为878.5 Mbits/s;当用户时钟为125 MHz或以上时,UDP最大帧吞吐率为915 Mbits/s;
测试3:
TCP服务器传输吞吐量在1百兆局域网下PC端测量平均吞吐量为93 Mbps,如下;
在这里插入图片描述
测试4:
TCP服务器将8Gbits发送到TCP Java客户端,同时Wireshark收集速度信息。从基于FPGA的TCP服务器到PC的点对点LAN连接平均吞吐率为390.2 Mbits/s;如下:
在这里插入图片描述

低延时性能

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

4、TCP/IP 协议栈代码详解

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

代码架构

TCP/IP 协议栈代码架构如下:
在这里插入图片描述
所有模块均由vhdl源码实现,没有使用任何IP,可以移植到任何平台的FPGA上;模块的具体细节在后续章节讲述;用户接口顶层代码如下:
纯VHDL实现,没有用到任何一个IP核,用户只需要知道用户接口即可,并不需要去看内部的复杂代码;用户接口及其注释如下:

module network_top #(
    parameter TCP_NUM = 1
)(
	input                  sys_rst                  ,
	input                  clk_125                  ,
	input                  clk_200                  ,
	output                 phy_rst_n                ,
	output                 gtx_resetn               ,
    output [3: 0]          rgmii_txd                ,	// RGMII Interface
    output                 rgmii_tx_ctl             ,	// RGMII Interface
    output                 rgmii_txc                ,	// RGMII Interface
    input  [3: 0]          rgmii_rxd                ,	// RGMII Interface
    input                  rgmii_rx_ctl             ,	// RGMII Interface
    input                  rgmii_rxc                ,	// RGMII Interface
	output [7: 0]          UDP_RX_DATA              ,	// UDP 接收数据输出
	output                 UDP_RX_DATA_VALID        ,	// UDP 接收数据输出有效信号 高有效
	output                 UDP_RX_SOF               ,	// UDP 接收数据包的第一个数据标志
	output                 UDP_RX_EOF               ,	// UDP 接收数据包的最后一个数据标志
	input  [15:0]          UDP_RX_DEST_PORT_NO_IN   ,	// UDP 接收目的端口号
	input                  CHECK_UDP_RX_DEST_PORT_NO,	// 置 1 使能 UDP 接收目的端口号输入比对
	output [15:0]          UDP_RX_DEST_PORT_NO_OUT  ,	// CHECK_UDP_RX_DEST_PORT_NO=1-->UDP_RX_DEST_PORT_NO_OUT=UDP_RX_DEST_PORT_NO_IN
	input  [7:0]           UDP_TX_DATA              ,	// UDP 发送数据输出
	input                  UDP_TX_DATA_VALID        ,	// UDP 发送数据输出有效信号 高有效
	input                  UDP_TX_SOF               ,	// UDP 发送数据包的第一个数据标志
	input                  UDP_TX_EOF               ,	// UDP 发送数据包的最后一个数据标志
	output                 UDP_TX_CTS               ,	// UDP 数据此时可以发送标志
	output                 UDP_TX_ACK               ,	// UDP 数据包发送完成应答
	output                 UDP_TX_NAK               ,	// UDP 数据包发送未完成应答
	input  [31:0]          UDP_TX_DEST_IP_ADDR      ,	// UDP 发送目的 IP 地址	
	input  [15:0]          UDP_TX_DEST_PORT_NO      ,	// UDP 发送目的端口号
	input  [15:0]          UDP_TX_SOURCE_PORT_NO    ,	// UDP 发送源端口号
	output [8*TCP_NUM-1:0] TCP_RX_DATA              ,	// TCP 接收数据输出
	output [TCP_NUM-1:  0] TCP_RX_DATA_VALID        ,	// TCP 接收数据输出有效信号 高有效
	output [TCP_NUM-1:  0] TCP_RX_RTS               ,	// 通知用户准备接收 TCP 数据
	input  [TCP_NUM-1:  0] TCP_RX_CTS               ,	// 清除接收的 TCP 数据
	input  [8*TCP_NUM-1:0] TCP_TX_DATA              ,	// TCP 发送数据输入
	input  [TCP_NUM-1:  0] TCP_TX_DATA_VALID        ,	// TCP 发送数据输入有效信号 高有效
	output [TCP_NUM-1:  0] TCP_TX_CTS               ,	// TCP 数据此时可以发送标志	
    input [47:          0] MAC_ADDR					,	// 本地 MAC 地址         
    input [31:          0] IPv4_ADDR                ,	// IPv4 地址        
    input [127:         0] IPv6_ADDR                ,	// IPv6 地址         
    input [31:          0] GATEWAY_IP_ADDR          ,	// 本地网关地址  
    input [31:          0] SUBNET_MASK              ,	// 本地子网掩码      
    input [31:          0] MULTICAST_IP_ADDR        ,	// 多播 IP 地址	
    input [16*TCP_NUM-1:0] TCP_LOCAL_PORTS          ,	// 本地 TCP 端口号  	
    input [TCP_NUM-1:   0] CONNECTION_RESET          	// TCP 模块高电平复位
    );

详细代码请看源代码;

用户接口

用户接口分为配置接口和用户接口,用户接口又分为跟应用程序对接的接口和跟MAC对接的用户接口;框图如下:
在这里插入图片描述
配置接口主要完成一些开关功能,例如使能UDP、IPv6、IGMP、本地MAC地址、IP地址等等,下面举1个例子:
使能UDP接收的配置在代码中的位置如下:
在这里插入图片描述
与MAC对接的用户接口不需要讲述,直接与MAC对接即可;
UDP协议的用户接口个人感觉不太重要,因为这里有价值的是TCP协议,所以直接介绍TCP协议的用户接口,TCP协议的用户接口分为接收和发送,都是可与AXI4-Stream对接的类AXI4-Stream接口,代码中有用法,你一看就懂,很简单;
代码的端口中,有一些缩写可能不好理解,下面给出解释:
在这里插入图片描述

代码模块级细讲

顶层模块

顶层模块将各个分模块例化在一起,没什么可讲的,在代码中的位置如下:
在这里插入图片描述

PACKET_PARSING模块

PACKET_PARSING模块功能是解析从MAC接收到的数据包,并有效地提取与多个协议相关的关键信息。解析是动态进行的,而不存储数据;在代码中的位置如下:
在这里插入图片描述

ARP模块

ARP模块的作用是检测ARP请求,并组包一个ARP响应以太网数据包传输到MAC;在代码中的位置如下:在这里插入图片描述

IGMP_REPORT和IGMP_QUERY模块

IGMP_REPORT模块的作用是以广播形式发送GMP成员身份报告,IGMP_QUERY.vhd模块响应成员资格查询。在代码中的位置如下:
在这里插入图片描述

PING和WHOIS2模块

PING模块的作用是检测ICMP回波(ping)请求,并组装一个ping回波以太网数据包,以传输到MAC,Ping同时适用于IPv4和IPv6。
WHOIS2模块的作用是生成一个ARP请求广播包(IPv4)或一个请求消息(IPv6),请求由其IP地址标识的目标用其MAC地址响应。
两个模块共同构成了我们经常用到的ping功能;
在代码中的位置如下:
在这里插入图片描述

ARP_CACHE2模块

ARP_CACHE2模块是一个共享的路由表,它存储最多128个IP地址及其关联的48位MAC地址和一个“实时的”时间戳。此模块将确定目标IP地址是否为本地地址。在后一种情况下,将返回网关的MAC地址,只存储有关本地地址的记录(例如,不是WAN地址,因为这些地址通常指向路由器MAC地址);仲裁电路用于仲裁来自多个传输实例的路由请求。在代码中的位置如下:
在这里插入图片描述

UDP_TX模块

UDP_TX模块的作用是将一个数据包封装到一个UDP帧中,即从任何端口到任何端口/IP目标的地址。同时支持IPv4和IPv6。通常例化一次,而不管源或目标UDP端口的数量如何,在代码中的位置如下:
在这里插入图片描述

UDP_RX模块

UDP_RX模块的作用是验证接收到的UDP帧,并提取其中的数据包。由于验证是在接收到的数据通过时动态执行的(没有存储),因此在数据包结束时提供了有效性确认信号。在代码中的位置如下:
在这里插入图片描述

TCP_SERVER模块

TCP_SERVER模块是TCP协议的核心。它可参数化配置,以支持ntcp流并发TCP连接。它本质上是处理TCP服务器的TCP状态机:首先监听来自远程TCP客户端的连接请求,建立和删除连接,并在建立连接时管理流控制和字节排序。由于这是一个服务器,它事先不预先知道协议是IPv4还是IPv6(它依赖于客户端),所以每个服务器有两个IP地址,每个IP版本一个。此模块在TCP服务器的vivado工程中才有,在代码中的位置如下:
在这里插入图片描述

TCP_TX模块

TCP_TX模块的作用是格式化TCP tx帧,包括所有层:TCP,IP,MAC/以太网。它对所有并发流都是通用的,因此只实例化一次。在代码中的位置如下:
在这里插入图片描述

TCP_TXBUF模块

TCP_TXBUF模块的作用是将TCP tx有效负载数据存储在单独的弹性缓冲区中,每个传输流对应一个。缓冲区大小是在合成之前通过ADDR_WIDTH通用参数配置的。在代码中的位置如下:
在这里插入图片描述

TCP_RXBUFNDEMUX模块

TCP_RXBUFNDEMUX模块解复用了几个TCP rx流。该模块有两个目标: (1)暂时保持一个接收到的TCP帧,直到在帧结束时确认其有效性。如果无效则丢弃,如果无效则丢弃进一步处理。(2)基于目标端口号来分解多个TCP流。在代码中的位置如下:
在这里插入图片描述

IP、MAC地址定义修改

工程代码中需要定义开发板的MAC、IP地址以及端口号等信息,包括服务器和客户端的;
服务器和客户端的定义修改在代码中的位置一样的,如下:
开发板本地 IP、MAC地址定义修改位置如下:
代码位于top.v
在这里插入图片描述

5、详细设计方案

详细设计方案如下:
在这里插入图片描述

PHY

本例程提供3套vivado工程源码,分别对应RTL8211、B50610、88E1518三款不同的PHY,为了方便大家设计,我直接给出了三款PHY的原理图,已放在资料包中,如下:
在这里插入图片描述

Tri Mode Ethernet MAC

由于TCP协议栈前面已经详细讲过了,这里重点讲讲Tri Mode Ethernet MAC这个IP,IP调用如下:适应大批量数据传输和匹配不同型号FPGA的源语,RGMII转GMII部分调用了Xilinx的Tri Mode Ethernet MAC三速网IP,TCP/IP协议栈的MAC接口与Tri Mode Ethernet MAC实现了MAC层数据交互,MAC数据在Tri Mode Ethernet MAC和TCP/IP 协议栈之间用两个AXI-FIFO实现数据缓冲和提高数据带宽;Tri Mode Ethernet MAC固定速率为1000兆,IP配置如下:
在这里插入图片描述
在这里插入图片描述
Tri Mode Ethernet MAC在本设计中处于被锁定状态,这是我们故意为之,目的是根据不同的PHY延时参数而修改其内部代码和内部时序约束代码,这里重点介绍使Tri Mode Ethernet MAC时的修改和移植事项,当你需要工程移植,或者你的vivado版本与我的不一致时,Tri Mode Ethernet MAC都需要在vivado中进行升级,但由于该IP已被我们人为锁定,所以升级和修改需要一些高端操作,关于操作方法,我专门写了一篇文档,已附在资料包里,如下:
在这里插入图片描述

TCP数据回环

将TCP的收发端口直接用assign语句连接起来形成数据回环,外部指定FPGA开发板的IP地址、MAC地址、端口号、目的IP地址、目的端口号等信息,即可完成TCP协议栈数据回环的工程搭建;代码部分如下:
在这里插入图片描述

6、vivado工程1–>B50610 工程

开发板:Xilinx–>xc7k325tffg676-2;
开发环境:Vivado2020.2;
网络PHY:B50610 延时模式;
输入\输出:TCP 网络通信;
测试项:数据收发、连续ping;
工程代码架构如下:
在这里插入图片描述
FPGA资源消耗和功耗预估;
在这里插入图片描述

7、vivado工程2–>RTL8211 工程

开发板:Xilinx–>xc7a35tfgg484-2;
开发环境:Vivado2020.2;
网络PHY:RTL8211;
输入\输出:TCP 网络通信;
测试项:数据收发、连续ping;
工程代码架构如下:
在这里插入图片描述
FPGA资源消耗和功耗预估;
在这里插入图片描述

8、vivado工程3–>88E1518 工程

开发板:Xilinx–>xc7k325tffg676-2;
开发环境:Vivado2020.2;
网络PHY:88E1518;
输入\输出:TCP 网络通信;
测试项:数据收发、连续ping;
工程代码架构如下:
在这里插入图片描述
FPGA资源消耗和功耗预估;
在这里插入图片描述

9、vivado工程4–>Zynq7020 B50610 工程

开发板:Xilinx–>Zynq7000系列–>xc7z020clg400-2;
开发环境:Vivado2020.2;
网络PHY:B50610 延时模式;
输入\输出:TCP服务器端网络通信;
测试项:数据收发、连续ping;
工程代码架构如下:
在这里插入图片描述
FPGA资源消耗和功耗预估;
在这里插入图片描述

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、上板调试验证并演示

准备工作

以vivado工程1–>B50610 工程为例进行上板调试;
连接如下:
在这里插入图片描述
首先设置电脑端IP如下:
在这里插入图片描述
下载bit,如下:
在这里插入图片描述

ping测试

打开cdm,输入 ping 192.168.0.56,如下:
在这里插入图片描述

TCP数据回环测试

打开网络调试助手并配置,如下:
在这里插入图片描述
单次发送数据测试结果如下:
在这里插入图片描述
循环发送数据测试结果如下,1秒时间间隔循环:可以看到,收发计数都到了165032 Byte没有丢包,足以证明其稳定性;
在这里插入图片描述

传输速率测试

去除合理线损后的PC段测得991M速率,如下:
在这里插入图片描述

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

福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下:
在这里插入图片描述
在这里插入图片描述
TCP源码路径如下:
在这里插入图片描述
对 1G 千兆网 TCP 服务器感兴趣的朋友也可以看看服务器的4套vivado工程源码,网盘资料如下:
在这里插入图片描述
TCP源码路径如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1319452.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DVWA靶场的设置

1).在win 10系统安phpstudy2016,如图所示 2)创建DVWA的靶场,解压DVWA-master.zip到C:\phpStudy\WWW\DWA-master 3)配置DVWA链接数据库 右键选择记事本打开configlconfig.inc.php.dist【也可以使⽤其他编辑⼯具打开】,…

实现树形结构的插件vue-tree-color及元素放大缩小拖动

实现流程图,借鉴vue-tree-color 引入依赖 npm install vue-tree-color 同时查看项目中是否已安装less和less-loader,因为该组件使用到less npm install --save-dev less less-loader 如果这里启动项目报错,有可能是less和less-loader的版本过高,可以降低版本,或者指定版本号…

搭建Flutter开发环境、从零基础到精通(文末送书【北大出版社】)

目录 搭建开发环境 1. 下载Flutter SDK 2. 设置镜像地址及环境变量 3. 安装与设置Android Studio 4. 安装Visual Studio Code与Flutter开发插件 5. IDE的使用和配置 6. 安装Xcode 7. 检查Flutter开发环境 好书推荐 内容简介 作者简介 搭建开发环境 Flutter可以跨平…

5款不可或缺的办公软件,好用且使用频率超高,几乎每个人都需要

在当今数字化时代,办公软件成为了现代职场必备的工具。这些软件可以大大提高我们的办公效率,简化工作流程,使我们更加高效地完成任务。今天给大家分享5款不可或缺的办公软件,它们不仅好用,而且使用频率极高&#xff0c…

使用Gensim训练Word2vec模型

import gensim import jieba import re import warnings import logging warnings.filterwarnings(ignore)with open("dataset/sanguo.txt", r,encodingutf-8)as f: # 读入文本lines []for line in f: #分别对每段分词temp jieba.lcut(line) #结巴分词 精确模式wo…

股票价格预测 | Python实现基于Stacked-LSTM的股票预测模型,可预测未来(keras)

文章目录 效果一览文章概述模型描述源码设计效果一览 文章概述 以股票价格预测为例,基于Stacked-LSTM的股票预测模型(keras),可预测未来。 模型描述 LSTM 用于处理序列数据,如时间序列、文本和音频。相对于传统的RNN,LSTM更擅长捕获长期依赖关系,

C# WPF上位机开发(ExtendedWPFToolkit扩展包使用)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 虽然个人人为当前的c# wpf内容已经足够多,但是肯定还是有很多个性化的需求没有满足。比如说不够好看,比如说动画效果不好&a…

【C++】POCO学习总结(十八):XML

【C】郭老二博文之&#xff1a;C目录 1、XML文件格式简介 1&#xff09;XML文件的开头一般都有个声明&#xff0c;声明是可选 <&#xff1f;xml version"1.0" encoding"UTF-8"?>2&#xff09;根元素&#xff1a;XML文件最外层的元素 3&#xff…

不同vlan设备互通案例操作介绍

目录 一、案例示图需求 1. 示图 2. 需求 二、操作演示 1. 接入层交换机SW4、SW5划分vlan 2. 汇聚层交换机SW2、SW3配置IP作为vlan网关、与SW1直连 3. 核心交换机SW1配置IP与汇聚交换机、R1直连 4. SW1、SW2、SW3、R1配置静态路由&#xff0c;使得vlan10、vlan20、172网…

Vue项目使用WebAssembly之后,Nginx如何解决WebAssembly不支持的问题

在VUE项目中使用WebAssembly之后&#xff0c;打包的项目会出现下面的错误 Uncaught (in promise) TypeError: WebAssembly: Response has unsupported MIME type application/wasm; charsetutf-8 expected application/wasm 可以用以下办法解决 一&#xff1a;单独Nginx配置…

YK3150滚齿机电池式绝对编码器电压过低导致丢失多圈数据,如何清多圈

当驱动器电池没电了&#xff0c; 就会报警如下 C轴驱动器&#xff1a;041&#xff08;0x29&#xff09; 电池式绝对编码器电压过低导致丢失多圈数据 此时需要换电池后&#xff0c;进行【清多圈】操作&#xff0c;先把【伺服参数开关】打开&#xff08;一定要记得&#xff09…

Pycharm 如何更改成中文版| Python循环语句| for 和 else 的搭配使用

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

音视频:Ubuntu下安装 FFmpeg 5.0.X

1.安装相关依赖 首可选一&#xff1a; sudo apt-get update sudo apt-get install build-essential autoconf automake libtool pkg-config \libavcodec-dev libavformat-dev libavutil-dev \libswscale-dev libresample-dev libavdevice-dev \libopus-dev libvpx-dev libx2…

自动化测试Selenium node 配置

查看自己chrome浏览器的版本 下载chromedriver对应版本&#xff0c;下载当前版本中最大版本。 https://npm.taobao.org/mirrors/chromedriver 安装java jdk &#xff0c;版本至少1.7, 并配置jdk环境变量 以下2个文件放在同一个目录下 Cmd地址切换到第四点目录下&#xff0c;然…

剑指 Offer(第2版)面试题 36:二叉搜索树与双向链表

剑指 Offer&#xff08;第2版&#xff09;面试题 36&#xff1a;二叉搜索树与双向链表 剑指 Offer&#xff08;第2版&#xff09;面试题 36&#xff1a;二叉搜索树与双向链表解法1&#xff1a;中序遍历 - 递归解法2&#xff1a;中序遍历 - 迭代 剑指 Offer&#xff08;第2版&am…

智能电力监控管理系统在物业小区的应用——安科瑞 顾烊宇

0引言 由于部分住宅小区存在电力设施纸质档案破损缺失、产权分界不清、查找故障点所在箱变&#xff08;箱式变电站&#xff0c;下同&#xff09;位置困难或小区出入口路径不明等情况&#xff0c;影响了抢修效率。为此&#xff0c;国网辽宁沈阳市沈北新区供电公司依托原有GIS平台…

C/C++ STL提供的关联式容器之set

set&#xff08;集合&#xff09;顾名思义&#xff0c;就是数学上的集合 —— 每个元素最多只出现一次&#xff0c;并且 set 中的元素已经从小到大排好序。 特点 1. 使用红黑树实现&#xff0c;其内部元素依据其值自动排序&#xff0c;每个元素值只能出现一次&#xff0c;…

海思平台isp之raw图回灌调试

文章目录 一、搭建环境二、配置参数三、回灌raw图isp调试中,经常会遇到一些特定场景的效果需要优化,但由于某些原因和成本考虑,开发人员无法亲临现场,这个时候采集场景raw图回灌到板端调试,就显得尤为方便了。 一、搭建环境 (1)建立板端与PQTool连接 板端进入SS928V100…

【基础算法】前缀和

文章目录 算法介绍什么是前缀和&#xff1f;&#xff1f;前缀和的作用一维数组求解前缀和(Si)二维数组求解前缀项和 示例题目1&#xff1a;acwing795示例题目2&#xff1a;acwing796总结收获 算法介绍 什么是前缀和&#xff1f;&#xff1f; 数组: a[1], a[2], a[3], a[4], a[…

Nat Med | Tau靶向反义寡核苷酸

今天给同学们分享一篇实验文章“Tau-targeting antisense oligonucleotide MAPTRx in mild Alzheimers disease: a phase 1b, randomized, placebo-controlled trial”&#xff0c;这篇文章发表在Nat Med期刊上&#xff0c;影响因子为82.9。 结果解读&#xff1a; 患者 从201…