紫光同创FPGA纯verilog代码实现UDP网络通信,支持10M/100/1000M三速网自协商仲裁,提供PDS工程源码和技术支持


紫光同创FPGA纯verilog代码实现UDP网络通信,支持10M/100/1000M三速网自协商仲裁,提供PDS工程源码和技术支持

1、前言

国产FPGA现状:

“苟利国家生死以,岂因祸福避趋之!”大洋彼岸的我优秀地下档员,敏锐地洞察到祖国的短板在于先进制程半导体的制造领域,于是本着为中华民族伟大复兴的中国梦贡献绵薄之力的初心,懂先生站在高略高度和长远角度谋划,宁愿背当代一世之骂名也要为祖国千秋万世谋,2018年7月,懂先生正式打响毛衣战,随后又使出恰勃纸战术,旨在为祖国先进制程半导体领域做出自主可控的战略推动;2019年初我刚出道时,还是Xilinx遥遥领先的时代(现在貌似也是),那时的国产FPGA还处于黑铁段位;然而才短短7年,如今的国产FPGA属于百家争鸣、百花齐放、八仙过海、神仙打架、方兴未艾、得陇望蜀、友商都是XX的喜极而泣之局面,此情此景,不得不吟唱老人家的诗句:魏武挥鞭,东临碣石有遗篇,萧瑟秋风今又是,换了人间。。。
目前对于国产FPGA优势有以下几点:
1:性价比高,与同级别国外大厂芯片相比,价格相差几倍甚至十几倍;
2:自主可控,国产FPGA拥有完整自主知识产权的产业链,从芯片到相关EDA工具;
3:响应迅速,FAE技术支持比较到位,及时解决开发过程中遇到的问题,毕竟中文数据手册;
4:采购方便,产业链自主可控,采购便捷;

FPGA实现UDP网络通信现状:

FPGA实现UDP网络通信主要有两种方案,其一是使用PHY芯片实现物理层功能,比如常见的RTL8211、B50610等芯片,UDP协议栈部分很简单,可使用verilog代码直接实现;其二是使用Xilinx系列的IP核实现物理层功能,比如常见的1G/2.5G Ethernet PCS/PMA or SGMII、AXI 1G/2.5G Ethernet Subsystem、10G/25G Ethernet Subsystem、10G Ethernet Subsystem等,UDP协议栈部分很简单,可使用verilog代码直接实现;本设计使用PHY芯片方案实现物理层功能;

工程概述

本文使用紫光同创PG2L100H系列FPGA纯verilog实现UDP网络通信,支持10M/100/1000M三速网自协商仲裁;本设计能实现电脑端网卡与FPGA开发板之间的双向通信,为了方便测试,设计集成了UDP数据回环和网络测速两个功能;

UDP数据回环功能如下:

首先电脑端网络调试助手发送测试数据,然后电脑端操作系统的Socket实现发送数据的以太网帧组包,然后发送给电脑端网卡后通过网线连接到FPGA开发板的RJ45网口;然后差分网络数据进入FPGA开发板板载的PHY芯片实现以太网物理层功能,将差分数据转换为并行RGMII接口数据;RGMII网络数据再送入纯verilog实现的RGMII互转GMII模块,实现双沿采集的RGMII数据到单沿采集的GMII数据转换,需要使用紫光的GTP_ISERDES_E2源语;然后MAC数据进入UDP协议栈实现以太网帧解包,解析各种头部信息,并提取输出UDP报文的有效数据段;有效数据再经过回环FIFO后回灌到UDP协议栈实现以太网帧组包,即加上各种头部信息和校验;然后数据进入纯verilog实现的RGMII互转GMII模块,实现单沿采集的GMII数据到双沿采集的RGMII数据转换,需要使用紫光的GTP_OSERDES_E2源语;然后数据进入板载PHY芯片实现以太网物理层,输出差分信号,并通过网线发送到电脑端;电脑端操作系统的Socket实现接收数据以太网解包,然后数据给网络调试助手显示;网络调试助手同时显示发送和接收数据,以此观察UDP数据回环的正确性;

UDP网络测速功能如下:

FPGA自动循环产生从0开始的累加数作为UDP发送数据,发送数据然后进入UDP协议栈实现以太网帧组包,即加上各种头部信息和校验;然后数据进入纯verilog实现的RGMII互转GMII模块,实现单沿采集的GMII数据到双沿采集的RGMII数据转换,需要使用紫光的GTP_OSERDES_E2源语;然后数据进入板载PHY芯片实现以太网物理层,输出差分信号,并通过网线发送到电脑端;然后打开电脑端的资源管理器,查看网卡,即可看到UDP通信速率;

针对市场主流需求,本设计提供1套PDS工程源码,具体如下:
在这里插入图片描述
现对上述1套工程源码做如下解释,方便读者理解:

工程源码1

开发板FPGA型号为PG2L100H-6EBG676;设计集成了了UDP数据回环和网络测速两个功能;
UDP数据回环设计:
首先电脑端网络调试助手发送测试数据,然后电脑端操作系统的Socket实现发送数据的以太网帧组包,然后发送给电脑端网卡后通过网线连接到FPGA开发板的RJ45网口;然后差分网络数据进入FPGA开发板板载的KSZ9031RNX芯片实现以太网物理层功能,KSZ9031RNX工作于延时模式,RGMII接口,将差分数据转换为并行RGMII接口数据;RGMII网络数据再送入纯verilog实现的RGMII互转GMII模块,实现双沿采集的RGMII数据到单沿采集的GMII数据转换,需要使用紫光的GTP_ISERDES_E2源语;然后MAC数据进入UDP协议栈实现以太网帧解包,解析各种头部信息,并提取输出UDP报文的有效数据段;有效数据再经过回环FIFO后回灌到UDP协议栈实现以太网帧组包,即加上各种头部信息和校验;然后数据进入纯verilog实现的RGMII互转GMII模块,实现单沿采集的GMII数据到双沿采集的RGMII数据转换,需要使用紫光的GTP_OSERDES_E2源语;然后数据进入板载PHY芯片实现以太网物理层,输出差分信号,并通过网线发送到电脑端;电脑端操作系统的Socket实现接收数据以太网解包,然后数据给网络调试助手显示;网络调试助手同时显示发送和接收数据,以此观察UDP数据回环的正确性;
UDP网络测速设计:
FPGA自动循环产生从0开始的累加数作为UDP发送数据,发送数据然后进入UDP协议栈实现以太网帧组包,即加上各种头部信息和校验;然后数据进入纯verilog实现的RGMII互转GMII模块,实现单沿采集的GMII数据到双沿采集的RGMII数据转换,需要使用紫光的GTP_OSERDES_E2源语;然后数据进入板载PHY芯片实现以太网物理层,输出差分信号,并通过网线发送到电脑端;然后打开电脑端的资源管理器,查看网卡,即可看到UDP通信速率;

本博客描述了紫光同创FPGA纯verilog代码实现UDP网络通信的设计方案,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做学习提升,可应用于医疗、军工等行业的高速接口或图像处理领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

免责声明

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

2、相关方案推荐

我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目

其实一直有朋友反馈,说我的博客文章太多了,乱花渐欲迷人,自己看得一头雾水,不方便快速定位找到自己想要的项目,所以本博文置顶,列出我目前已有的所有项目,并给出总目录,每个项目的文章链接,当然,本博文实时更新。。。以下是博客地址:
点击直接前往

紫光同创FPGA相关方案推荐

鉴于国产FPGA的优异表现和市场需求,我专门开设了一个人紫光同创FPGA专栏,里面收录了基于紫光同创FPGA的图像处理、UDP网络通信、GT高速接口、PCIE等博客,感兴趣的可以去看看,博客地址:点击直接前往

我这里已有的以太网方案

目前我这里有大量UDP协议的工程源码,包括UDP数据回环,视频传输,AD采集传输等,也有TCP协议的工程,还有RDMA的NIC 10G 25G 100G网卡工程源码,对网络通信有需求的兄弟可以去看看:
直接点击前往
其中千兆TCP协议的工程博客如下:
直接点击前往

本方案在Xilinx系列FPGA的应用方案

本方案在Xilinx系列FPGA上也有部署和应用,有这方面需求的用户可以参考本博之前的博客,博客链接如下:
点击直接前往

3、设计思路框架

工程设计原理框图

工程设计原理框图如下:
在这里插入图片描述

电脑端网络调试助手

电脑端网络调试助手很简单,几乎干这一行的都用过,为Windows版本.exe文件,无需安装直接使用,界面如下:
在这里插入图片描述
这个软件使用教程可自行百度,如果连这个都不会用,说明。。。

PHY芯片

本例程提供5套vivado工程源码,分别用到了RTL8211、KSZ9031、YT8531等市面上主流的PHY型号,通过这些型号PHY的使用,你将能学会其他型号PHY的使用,因为很多都是兼容的;此外,还提供了PHY的参考原理图,一并放在了资料包中;如下:

MDIO配置

smi_read_write.v 文件用于MDIO接口的读写控制,在IDLE状态下根据写请求或读请求到相应的状态,再根据MDIO时序实现 MDC和MDIO的控制,一般情况下网络PHY不需要配置,在原理图设计时进行匹配电阻上下拉即可实现PHY正常工作,一般会让其工作在延时模式,但本设计为了实现10/100/1000M网速的自适应和仲裁,需要读取PHY当前和连接网卡的速度,所以设计了MDIO配置模块,另外,读者也可以借机学习一下MDIO的知识,MDIO配置模块代码架构如下:
在这里插入图片描述
MDIO驱动模块顶层接口如下:
在这里插入图片描述
以KSZ9031RNX芯片为例,smi_config.v文件读取PHY寄存器0x11的bit10和bit[15:14],来判断以太网是否已经连接和当前的以太网速度,默认状态下,PHY芯片是自动协商速度,根据对方的速度做匹配,状态寄存器bit-10为1则 link成功,否则失败,bit[15:14]为00则是10M,01为100M,10或11为1000M,根据不同的速度点亮LED灯,没有link都不亮,10M亮一个灯,100M亮两个灯,1000M亮三个灯。
MDIO寄存器读写模块顶层接口如下:
在这里插入图片描述

RGMII互转GMII模块

RGMII互转GMII模块由纯verilog实现;功能是实现双沿采集的RGMII数据互转单沿采集的GMII数据,需要使用紫光的GTP_ISERDES_E2和GTP_OSERDES_E2源语;模块代码架构如下:
在这里插入图片描述
其中的相位偏移时钟用于工作于延时模式的PHY芯片;

10/100/1000M三速网协商仲裁模块

10/100/1000M三速网协商仲裁模块带阿米架构如下:
在这里插入图片描述
由于10/100M传输数据时是单边沿采集数据,因此一个周期传输4bit数据,而RGMII为双边沿采集数据,所以要进行数据的转换,如发送时,要将一周其8bit数据转成一周期4bit数据,因此要设置数据缓存,读数据速率为写数据的一半。本设计参考了其他友商的自协商方案,居然还有设置三种时钟的方案,着实有点LOW,所以本方案汲取教训,仅需一个参考时钟,具体如下:
设置一个TX buffer:
gmii_tx_buffer.v将要发送的8bit缓存到eth_data_fifo中,同时将数据长度缓存到len_fifo中,在状态机中判断len_fifo中的数据是否大于0,是则表明已经缓存了数据,之后进入读FIFO数据状态,每两个周期读一次数据,此功能不好理解,最好用signaltap抓取信号帮助理解。
设置一个RX buffer:
gmii_rx_buffer.v将接收的10/100M数据缓存到eth_data_fifo中,同时将数据长度缓存到len_fifo中,在状态机中判断len_fifo中的数据是否大于0,是则表明已经缓存了数据,之后进入读FIFO数据状态,每两个周期读一次数据,最好用signaltap抓取信号帮助理解。
10/100/1000M三速网仲裁:
gmii_arbi.v用于三种速度的仲裁,同时设定了发送的间隔都为1s。

UDP协议栈

UDP协议栈是以太网的协议层,由纯verilog代码实现,具有动态ARP、ICMP功能,占用逻辑资源少,性能不错,设计精简等特点,代码有详细中文注释,UDP协议栈设计架构如下:
在这里插入图片描述
UDP协议栈代码架构如下:
在这里插入图片描述

MAC层发送

发送部分中,mac_tx.v为MAC层发送模块,首先在SEND_START状态,等待mac_tx_ready信号,如果有效,表明IP或ARP的数据已经准备好,可以开始发送。再进入发送前导码状态,结束时发送mac_data_req,请求IP或ARP的数据,之后进入发送数据状态,最后进入发送CRC状态。在发送数据过程中,需要同时进行CRC校验。MAC层发送顶层接口如下:
在这里插入图片描述

MAC发送仲裁

工程中的mac_tx_mode.v为发送仲裁,根据发送模式是IP或ARP选择相应的信号与数据,MAC发送仲裁顶层接口如下:
在这里插入图片描述

ARP发送

发送部分中,arp_tx.v为ARP发送模块,在IDLE状态下,等待ARP发送请求或ARP应答请求信号,之后进入请求或应答等待状态,并通知MAC层,数据已经准备好,等待mac_data_req信号,之后进入请求或应答数据发送状态。由于数据不足46字节,需要补全46字节发送,ARP发送顶层接口如下:
在这里插入图片描述

IP层发送

在发送部分,ip_tx.v为IP层发送模块,在IDLE状态下,如果ip_tx_req有效,也就是UDP或ICMP发送请求信号,进入等待发送数据长度状态,之后进入产生校验和状态,校验和是将IP首部所有数据以16位相加,最后将进位再与低16位相加,直到进入为0,再将低16位取反,得出校验和结果。此程序中校验和以树型加法结构,并插入流水线,能有效降低加法部分的延迟,但缺点是会消耗较多逻辑资源。如下图 ABCD 四个输入,A与B相加结果为E,C与D相加结果为F,再将E与F相加结果为G,在每个相加结果之后都有寄存器。校验和设计框图如下:
在这里插入图片描述
在生成校验和之后,等待MAC层数据请求,开始发送数据,并在即将结束发送IP首部后请求UDP或ICMP数据。等发送完,进入 IDLE状态,IP层发送顶层接口如下:
在这里插入图片描述

IP发送仲裁

工程中的ip_tx_mode.v为发送仲裁,根据发送仲裁是UDP或ICMP选择相应的信号与数据。IP发送仲裁顶层接口如下:
在这里插入图片描述

UDP发送

发送部分中,udp_tx.v为UDP发送模块,第一步将数据写入UDP发送RAM,同时计算校验和,第二步将RAM中数据发送出去。UDP校验和与IP校验和计算方法一致。在计算时需要将伪首部加上,伪首部包括目的IP地址,源IP地址,网络类型,UDP数据长度,UDP发送顶层接口如下:
在这里插入图片描述

MAC层接收

在接收部分,其中mac_rx.v为mac层接收文件,首先在IDLE状态下需要判断rx_dv信号是否为高,在REC_PREAMBLE前导码状态下接收前导码。之后进入接收MAC头部状态,接收目的MAC地址、源MAC地址、类型,并将它们缓存起来,在此状态判断前导码是否正确,错误则进入REC_ERROR错误状态,在REC_IDENTIFY状态判断类型是IP(8’h0800)或ARP(8’h0806),然后进入接收数据状态,将数据传送到IP或ARP模块,等待IP或ARP数据接收完毕,再接收CRC数据,并在接收数据的过程中对接收的数据进行CRC处理,将结果与接收到的CRC数据进行对比,判断数据是否接收正确,正确则结束,错误则进入ERROR状态,MAC层接收顶层接口如下:
在这里插入图片描述

ARP接收

工程中的arp_rx.v为ARP接收模块,实现ARP数据接收,在IDLE状态下,接收到从MAC层发来的arp_rx_req信号,进入ARP接收状态,在此状态下,提取出目的MAC地址,源MAC地址,目的IP地址,源IP地址,并判断操作码OP是请求还是应答。如果是请求,则判断接收到的目的IP地址是否为本机地址,如果是,发送应答请求信号arp_reply_req,如果不是,则忽略。如果OP是应答,则判断接收到的目的IP地址及目的MAC地址是否与本机一致,如果是,则拉高arp_found 信号,表明接收到了对方的地址。并将对方的MAC地址及IP地址存入ARP缓存中。ARP接收顶层接口如下:
在这里插入图片描述

IP层接收

在工程中,ip_rx 为 IP层接收模块,实现IP层的数据接收,信息提取,并进行校验和检查。首先在IDLE状态下,判断从MA 层发过来的ip_rx_req信号,进入接收IP首部状态,先在REC_HEADER0提取出首部长度及IP总长度,进入REC_HEADER1状态,在此状态提取出目的IP地址、源IP地址、协议类型,根据协议类型发送udp_rx_req或icmp_rx_req。在接收首部的同时进行校验和的检查,将首部接收的所有数据相加,存入32位寄存器,再将高16位与低16位相加,直到高16位为0,再将低16位取反,判断其是否为0,如果是0,则检验正确,否则错误,进入IDLE状态,丢弃此帧数据,等待下次接收。IP层接收顶层接口如下:
在这里插入图片描述

UDP接收

在工程中,udp_rx.v为UDP接收模块,在此模块首先接收UDP首部,再接收数据部分,并将数据部分存入RAM 中,在接收的同时进行UDP校验和检查,如果UDP数据是奇数个字节,在计算校验和时,在最后一个字节后加上 8’h00,并进行校验和计算。校验方法与IP校验和一样,如果校验正确,将拉高udp_rec_data_valid 信号,表明接收的UDP数据有效,否则无效,等待下次接收。UDP接收顶层接口如下:
在这里插入图片描述

以太网测试模块

以太网测试模块集成了UDP数据回环和网络测速两个功能,通过顶层参数选择使用UDP数据回环还是网络测速,如下:
在这里插入图片描述数据回环模块:
udp_loop.v为UDP数据回环模块,实现数据流的回环控制,首先等待一段时间后发送 ARP请求信号,直到对方回应,进入发送UDP数据状态,如果在WAIT状态时发现UDP接收数据有效,则将接收的数据发送出去。循环1秒发送,在每次发送前需要检查目的IP地址是否能在ARP缓存里找到,如果没有,则发送ARP请求。UDP数据回环模块设置了网卡连接成功后自动向外发送的测试字符串,代码位置如下,可自由修改字符串内容,比如改为爱你女朋与的名字。。。
在这里插入图片描述
网络测速模块:
FPGA自动循环向UDP协议栈发送累加的数据,数据内容从0开始累加,即形成连续发送数据功能;该功能的作用是配合PC端测试网络极限速率,打开电脑端的资源管理器,查看网卡,即可看到通信速率;值得注意的是,该方法并不能真实反映网速,用更为专业的网速测试软件为佳;

IP地址、端口号的修改

工程留出了IP地址、端口号的修改端口供用户自由修改,位置在顶层模块如下:
在这里插入图片描述

工程源码架构

工程源码架构如下:
在这里插入图片描述

4、PDS工程源码1详解:KSZ9031RNX作PHY

开发板FPGA型号:紫光同创–PG2L100H-6EBG676;
开发环境:Pango Design Suite 2021.1;
以太网物理层方案:KSZ9031RNX芯片,延时模式,RGMII接口;
以太网MAC层方案:纯verilog实现的RGMII互转GMII方案;
以太网协议层方案:千兆网版本的UDP协议栈,纯verilog实现;
网口数量:1个网口,即1个FPGA工程里运行1个UDP协议栈;
工程源码架构请参考前面第3章节中的《工程源码架构》小节;
工程作用:此工程目的是让读者掌握紫光同创FPGA纯verilog代码实现UDP网络通信的设计能力,以便能够移植和设计自己的项目;
工程的资源消耗和功耗如下:
在这里插入图片描述

5、上板调试验证并演示

需要准备的器材如下:
FPGA开发板,没有开发板可以找本博提供;
网线;
电脑主机;
我的开发板了连接如下:
在这里插入图片描述
然后将电脑端IP地址设置为如下:
在这里插入图片描述
然后下载bit或者固化bin文件,即可开始测试;

ping测试

打开电脑CMD,输入ping指令;
单次ping测试如下:
在这里插入图片描述
连续ping测试如下:
在这里插入图片描述

ARP测试

打开电脑CMD,输入ARP指令;如下:
在这里插入图片描述

UDP数据回环测试

打开电脑端网络调试助手,测试如下:
在这里插入图片描述
在这里插入图片描述

网络速度测试

首先需要把以太网测试模块里的测试模式设置为网络速测模式,如下:
在这里插入图片描述
然后编译工程,下载到板子,然后打开电脑资源管理器,点击性能,找到以太网网卡选项,即可看到测速,测速如下:
在这里插入图片描述
注意!!!
注意!!!
在电脑上观察到的是开发板以太网网口的发送速率,这个测速只代表可能的最高的速度,不代表电脑真实的不丢包速度,UDP 的点到点不丢包速度和电脑的网卡、CPU 速度、内存速度、操作系统都有关系。

100M网下的测试

100M网需要将PC端网卡改为100M,如下:
在这里插入图片描述
然后再进行前面的测试;

紫光同创FPGA实现UDP网络通信效果演示

紫光同创FPGA实现UDP网络通信效果演示如下:

紫光-UDP-三速

6、福利:工程源码获取

福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

9527华安

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

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

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

打赏作者

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

抵扣说明:

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

余额充值