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

目录

  • 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 Interfaceoutput                 rgmii_tx_ctl             ,	// RGMII Interfaceoutput                 rgmii_txc                ,	// RGMII Interfaceinput  [3: 0]          rgmii_rxd                ,	// RGMII Interfaceinput                  rgmii_rx_ctl             ,	// RGMII Interfaceinput                  rgmii_rxc                ,	// RGMII Interfaceoutput [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_INinput  [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.hqwc.cn/news/283453.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AtCoder Beginner Contest 332 G. Not Too Many Balls(最大流转最小割 dp)

题目 n(n<500)种球&#xff0c;第i种有ai(0<ai<1e12)个球&#xff0c; m(m<5e5)个盒子&#xff0c;第j个能放bj(0<bj<1e12)个球 特别地&#xff0c;第j个盒子最多能放i*j个第i种球 求m个盒子能放的最多的球的总数 思路来源 官方题解 题解 显然是一个最…

关于“Python”的核心知识点整理大全26

目录 10.3.9 决定报告哪些错误 10.4 存储数据 10.4.1 使用 json.dump()和 json.load() number_writer.py number_reader.py 10.4.2 保存和读取用户生成的数据 对于用户生成的数据&#xff0c;使用json保存它们大有裨益&#xff0c;因为如果不以某种方式进行存储&#xf…

CyclicBarrier学习一

一、定义 CyclicBarrier 字面意思回环栅栏&#xff08;循环屏障&#xff09;&#xff0c;通过它可以实现让一组线程等待至某个状态&#xff08;屏障点&#xff09;之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后&#xff0c;CyclicBarrier可以被重用。 CyclicB…

C++入门【9-C++循环】

C 循环 有的时候&#xff0c;可能需要多次执行同一块代码。一般情况下&#xff0c;语句是顺序执行的&#xff1a;函数中的第一个语句先执行&#xff0c;接着是第二个语句&#xff0c;依此类推。 编程语言提供了允许更为复杂的执行路径的多种控制结构。 循环语句允许我们多次…

代码随想录-刷题第三十天

332. 重新安排行程 题目链接&#xff1a;332. 重新安排行程 直觉上来看这道题和回溯法没有什么关系&#xff0c;更像是图论中的深度优先搜索。 这道题算是图论里深搜的题目&#xff0c;可以用回溯法的套路来解这道题目&#xff0c;算是拓展一下思路&#xff0c;原来回溯法还…

[Big Bird]论文解读:Big Bird: Transformers for Longer Sequences

文章目录 1 介绍2 模型架构3 结果 论文&#xff1a;Big Bird: Transformers for Longer Sequences 作者&#xff1a;Manzil Zaheer, Guru Guruganesh, Avinava Dubey, Joshua Ainslie, Chris Alberti, Santiago Ontanon, Philip Pham, Anirudh Ravula, Qifan Wang, Li Yang, Am…

[计网00] 计算机网络开篇导论

目录 前言 计算机网络的概念 计算机网络的分层 计算机网络的分类 网络的标准化工作和相关组织 计算机网络的性能指标 前言 计算机网络在我们的日常生活中无处不在 在网络会有各种各样的协议和封装 保证我们的信息完整,无误的在各个客户端之前传输 计算机网络的概念 四…

c语言 文件与文件操作

&#x1f3e0; 一.引言 我们日常生活中会将我们制作的ppt,word等存放在文件里进行归类&#xff0c;你是否知道我们能用cC语言对文件进行操作呢(比如文件的打开&#xff0c;关闭和读写等)&#xff1f;那接下来跟博主一起来学习下吧。 &#x1f3e0;二.什么是文件 磁盘上的文件就…

TCP/IP详解——FTP 协议,Telnet协议

文章目录 1. FTP 协议1.1 FTP的应用1.2 FTP传输文件的过程1.3 FTP传输模式1.4 主动模式&#xff08;Active Mode&#xff09;1.5 Active Mode 抓包分析1.6 被动模式&#xff08;Passive Mode&#xff09;1.7 Passive Mode 抓包分析 2. Telnet 协议2.1 Telnet 概念2.2 Telnet 协…

Python电能质量扰动信号分类(一)基于LSTM模型的一维信号分类

目录 引言 1 数据集制作与加载 1.1 导入数据 1.2 制作数据集 2 LSTM分类模型和超参数选取 2.1 定义LSTM分类模型 2.2 定义模型参数 3 LSTM模型训练与评估 3.1 模型训练 3.2 模型评估 往期精彩内容&#xff1a; Python-凯斯西储大学&#xff08;CWRU&#xff09;轴承…

Word写大论文常见问题(持续更新)

脚注横线未定格 解决方案&#xff1a;“视图”-“草图”&#xff0c;“引用”-“显示备注”-选择“脚注分隔符”&#xff0c;把横线前的空格删掉。 2.PPT做的图插入word中清晰度太低 解决方案&#xff1a;PPT-图形-“另存为图片”-“可缩放矢量图格式”-粘贴到word中。

RDD编程

目录 一、RDD编程基础 &#xff08;一&#xff09;RDD创建 &#xff08;二&#xff09;RDD操作 1、转换操作 2、行动操作 3、惰性机制 &#xff08;三&#xff09;持久化 &#xff08;四&#xff09;分区 &#xff08;五&#xff09;一个综合实例 二、键值对RDD &am…