无锡做网站优化公司,wordpress 幻灯片插件使用,数字选用平台介绍,国产软件开发工具目录 1、前言免责声明 2、相关方案推荐我这里已有的以太网方案本协议栈的 1G-UDP版本本协议栈的 10G-UDP版本1G 千兆网 TCP--服务器 方案1G 千兆网 TCP--客户端 方案10G 万兆网 TCP--服务器客户端 方案 3、该UDP协议栈性能4、详细设计方案设计架构框图网络调试助手… 目录 1、前言免责声明 2、相关方案推荐我这里已有的以太网方案本协议栈的 1G-UDP版本本协议栈的 10G-UDP版本1G 千兆网 TCP--服务器 方案1G 千兆网 TCP--客户端 方案10G 万兆网 TCP--服务器客户端 方案 3、该UDP协议栈性能4、详细设计方案设计架构框图网络调试助手GT资源使用GTY--10GBASE-R*协议使用1G/2.5G Ethernet PCS/PMA or SGMII 使用25G-PHY层25G-MAC层1G-MAC层1G-MAC数据位宽转换AXI4-Stream 总线仲裁AXI4-Stream FIFO25G-UDP 高速协议栈IP地址修改UDP数据回环总体代码架构 5、工程源码 详解6、工程移植说明vivado版本不一致处理FPGA型号不一致处理其他注意事项 7、上板调试验证并演示准备工作查看ARPUDP数据回环测试 8、福利工程代码的获取 FPGA高端项目纯verilog的 25G-UDP 高速协议栈提供工程源码和技术支持 1、前言
目前网上的fpga实现udp基本生态如下 1verilog编写的udp收发器但中间的FIFO或者RAM等调用了IP或者不带ping功能这样的代码功能正常也能用但不带ping功能基本就是废物在实际项目中不会用这样的代码试想多机互联出现了问题你的网卡都不带ping功能连基本的问题排查机制都不具备这样的代码谁敢用 2带ping功能的udp收发器代码优秀也好用但基本不开源不会提供源码给你这样的代码也有不足那就是出了问题不知道怎么排查毕竟你没有源码无可奈何 3使用了Xilinx的Tri Mode Ethernet MAC三速网IP实现这样的代码也很优秀但还是那个问题没有源码且三速网IP需要licence三速网IP实现了rgmii到gmii再到axis的转换 4使用FPGA的GTX资源利用SFP光口实现UDP通信这种方案不需要外接网络变压器即可完成 5真正意义上的verilog实现的UDP协议栈真正意义上的verilog实现意思是UDP协议栈全部代码均使用verilog代码不适用任何IP核包括FIFO、RAM等这样的UDP协议栈移植性很强这样的协议栈在市面上也很少几乎很难得到而很设计就是这样的协议栈呵呵。。。
本设计使用纯verilog实现的25G-UDP 高速协议栈实现25G-UDP回环通信测试之所以只用到了数据回环模式是因为本设计旨在为用户提供一个可任意移植修改的25G-UDP协议栈架构用户可通过此架构任意创建自己的项目自由度和开放性极强基于市面上主流和占有率较高的FPGA器件创建了1套工程源码FPGA器件适用于Xilinx系列FPGA开发工具适用于Xilinx的vivado使用的FPGAGT高速资源为GTY板载连接光口包括SFP、QSFP
本设计经过反复大量测试稳定可靠可在项目中直接移植使用工程代码可综合编译上板调试可直接项目移植适用于在校学生、研究生项目开发也适用于在职工程师做项目开发可应用于医疗、军工等行业的数字通信领域 提供完整的、跑通的工程源码和技术支持 工程源码和技术支持的获取方式放在了文章末尾请耐心看到最后
免责声明
本工程及其源码即有自己写的一部分也有网络公开渠道获取的一部分(包括CSDN、Xilinx官网、Altera官网等等)若大佬们觉得有所冒犯请私信批评教育基于此本工程及其源码仅限于读者或粉丝个人学习和研究禁止用于商业用途若由于读者或粉丝自身原因用于商业用途所导致的法律问题与本博客及博主无关请谨慎使用。。。
2、相关方案推荐
我这里已有的以太网方案
目前我这里有大量UDP协议的工程源码包括UDP数据回环视频传输AD采集传输等也有TCP协议的工程对网络通信有需求的兄弟可以去看看直接点击前往
本协议栈的 1G-UDP版本
本UDP协议栈支持1G、10G、25G速率本文介绍的是10G速率的应用之前写过一篇博客介绍本协议栈1G速率的应用在1G模式下基于市面上主流和占有率较高的FPGA器件创建了11套工程源码FPGA器件适用于Xilinx和Altera开发工具适用于Xilinx的vivado和Altera的Quartus网络PHY芯片支持MII、GMII、RGMII、SGMII等对千兆网UDP网络通信有需求的兄弟可以去看看直接点击前往
本协议栈的 10G-UDP版本
本UDP协议栈支持1G、10G、25G速率本文介绍的是1G速率的应用之前写过一篇博客介绍本协议栈10G速率的应用在10G模式下基于市面上主流和占有率较高的FPGA器件创建了7套工程源码FPGA器件适用于Xilinx开发工具适用于Xilinx的vivado高速接口资源使用到了GTH、GTY、10G Ethernet PCS/PMA(10GBASE-R/KR)等对10G UDP网络通信有需求的兄弟可以去看看 直接点击前往
1G 千兆网 TCP–服务器 方案
TCP分为服务器和客户端两者代码是不一样的看具体需求既然本博客介绍的是TCP客户端那么肯定就有TCP服务器本来TCP服务器之前一直都有但一直没有调通经过两年半的练习调试总算是调通了TCP服务器依然是4套工程源码我另外写了一篇博客介绍TCP服务器感兴趣的朋友可以去看看直接点击前往
1G 千兆网 TCP–客户端 方案
TCP分为服务器和客户端两者代码是不一样的看具体需求既然本博客介绍的是TCP服务器那么肯定就有TCP客户端本来TCP客户端之前一直都有但一直没有调通经过两年半的练习调试总算是调通了TCP客户端依然是4套工程源码我另外写了一篇博客介绍TCP客户端感兴趣的朋友可以去看看直接点击前往
10G 万兆网 TCP–服务器客户端 方案
我这里也有10G 万兆网 TCP 方案该方案有服务器和客户端两套代码在Xilinx KU和KUP等平台测试通过并很稳定对10G 万兆网 TCP 方案感兴趣的朋友可以去看看直接点击前往
3、该UDP协议栈性能
1纯verilog实现没有用到任何一个IP核 2移植性天花板该协议栈可在Xilinx、Altera等各大FPGA型号之间任意移植因为是没有任何IP源语也有参数可选择 3适应性强目前已在RTL8211、B50610、88E1518等多款phy上成功测试也可以用GT资源的SFP接口实现10G-UDP协议的以太网通信支持MII、GMII、RGMII、SGMII等PHY接口 4时序收敛很到位 5动态ARP功能 6不带ping功能 7用户接口数据位宽高达64bit 8最高支持25G速率本设计使用25G
4、详细设计方案
设计架构框图
详细设计方案如下框图 由于我的FPGA开发板板载TI的DP83867ISRGZ网络芯片和QSFP光口且逻辑资源很丰富所以利用GTYQSFP光口做 25G-UDP 高速协议栈另外用1G/2.5G Ethernet PCS/PMA or SGMIITI的DP83867ISRGZ做SGMII接口的1G-千兆网UDP 协议栈相当于在一个工程里同事做了两个UDP数据通路一个是25G-UDP使用QSFP接口另一个是1G-UDP使用SGMII接口两个UDP数据通路使用同一个25G-UDP 高速协议栈代码里有axis_adapter.v模块负责将1G-UDP的8bit数据位宽转换到64bit数据位宽的25G-UDP数据另外还有一个axis_switch.v模块负责1G-UDP数据和25G-UDP数据进出25G-UDP 高速协议栈的仲裁具体的数据交互由板载的两个按键控制具体切换逻辑如下 默认使用 25G-UDP 进出25G-UDP 高速协议栈后做回环 按键3按下,SGMII接口的 1G-UDP 数据将插入 QSFP接口的 25G-UDP 数据通路 按键2按下,输入QSFP接口的25G-UDP数据–25G-MAC–UDP协议栈–1G-MAC–SGMII接口输出简单说就是: 25G-UDP数据输入转1G-UDP输出, QSFP接收转SGMII发送 不按按键2,输入SGMII接口的1G-UDP数据–1G-MAC–UDP协议栈–25G-MAC–QSFP接口输出简单说就是: 1G-UDP数据输入转25G-UDP输出, SGMII接收转QSFP发送 板子上电后默认就只有QSFP接口的25G-UDP数据参与了回环通路SGMII接口的1G-UDP数据被无视
网络调试助手
这只是一个回环测试工具常用的Win软件用来测试UDP数据收发无需多言
GT资源使用
本设计包含了25G-UDP和1G-UDP数据通路默认使用25G-UDP数据进入UDP 高速协议栈进行数据回环要使用1G-UDP数据通路则需要按键切换两种不同速率的UDP数据通路都用到了TG高速接口资源其中25G-UDP直接调用GTY选择10GBASE-R*协议该协议可用于网络数据包的编解码1G-UDP直接调用1G/2.5G Ethernet PCS/PMA or SGMII选择GBASE-R协议1G速率SGMII接口该协议可用于网络数据包的编解码具体细节会在后面章节介绍
GTY–10GBASE-R*协议使用
25G-UDP数据通路使用该方案GTY IP调用和配置如下 IP主要的配置界面如上图详细配置界面请参考工程该IP输出并行数据注意这里输出的仅仅是解串之后的数据并未实现数据对齐和接口转换功能数据将交给25G-PHY层做进一步处理IP使用GTY–10GBASE-R*协议64/66B编解码
1G/2.5G Ethernet PCS/PMA or SGMII 使用
1G-UDP数据通路使用该方案1G/2.5G Ethernet PCS/PMA or SGMII IP调用和配置如下 IP主要的配置界面如上图详细配置界面请参考工程使用1G速率对应的GT参考时钟必须为125M使用SGMII接口需对接相应的PHY本设计使用的PHY型号为TI 的 DP83867ISRGZ 网络芯片也可以使用较为常见的88E1111等PHY该IP的输入接口为SGMII输出接口为GMII也就是说用户接口为GMII这就为1G-MAC的实现带来了极大地便利
25G-PHY层
25G-UDP数据通路使用该方案25G-PHY层由verilog代码实现没有使用任何IP是实现和GTY对接做数据处理和接口转换的功能模块该模块主要实现两个功能一是数据的处理包括GT资源送出的数据加解扰、数据对齐、数据校验、数据帧同步、误码率监控、HDR看门狗(该功能实际并未用到)二是数据接口的转换将PHY侧的并行数据转换为XGMII数据流对于接收而言就是数据解扰、数据对齐、数据校验、各种监测、PHY转XGMII对于发送则是反过来的25G-PHY层代码位置如下需要注意的是这个PHY层为10G和25G通用的所以代码命名上延续了10G的命名规则
25G-MAC层
10G-MAC层由verilog代码实现没有使用任何IP是实现和10G-PHY层对接做数据接口转换和数据跨时钟域转换的功能模块该模块主要实现两个功能一是接口转换二是据跨时钟域转换对于接收来说首先将XGMII数据流转换为AXI4-Stream数据流再对AXI4-Stream数据流做跨时钟域转换从PHY侧时钟域转换到UDP侧时钟域整个过程都用到CRC校验虽然耗时增加但数据误码率降低如果对时延有苛刻要求可去掉校验发送则于接收相反10G-MAC层代码位置如下需要注意的是这个MAC层为10G和25G通用的所以代码命名上延续了10G的命名规则
1G-MAC层
1G-UDP数据通路使用该方案由于PHY层用到了1G/2.5G Ethernet PCS/PMA or SGMII该IP直接输出GMII接口数据所以1G-MAC层就变得非常简单了只需要将GMII转为AXI4-Stream即可代码位置如下
1G-MAC数据位宽转换
代码里有axis_adapter.v模块负责将1G-UDP的8bit数据位宽转换到64bit数据位宽的25G-UDP数据因为1G-UDP通路的数据要进入25G-UDP通路数据位宽必须一致axis_adapter.v模块由纯verilog实现代码位置如下 需要注意的是1G-UDP通路的MAC数据才需要用到axis_adapter.v模块1G-UDP通路的MAC数据本身就是64bit的不需要转换
AXI4-Stream 总线仲裁
axis_switch.v模块负责1G-UDP数据和25G-UDP数据进出25G-UDP 高速协议栈的仲裁具体的数据交互由板载的两个按键控制具体切换逻辑如下 默认使用 25G-UDP 进出25G-UDP 高速协议栈后做回环 按键3按下,SGMII接口的 1G-UDP 数据将插入 QSFP接口的 25G-UDP 数据通路 按键2按下,输入QSFP接口的25G-UDP数据–25G-MAC–UDP协议栈–1G-MAC–SGMII接口输出简单说就是: 25G-UDP数据输入转1G-UDP输出, QSFP接收转SGMII发送 不按按键2,输入SGMII接口的1G-UDP数据–1G-MAC–UDP协议栈–25G-MAC–QSFP接口输出简单说就是: 1G-UDP数据输入转25G-UDP输出, SGMII接收转QSFP发送 板子上电后默认就只有QSFP接口的25G-UDP数据参与了回环通路SGMII接口的1G-UDP数据被无视 切换逻辑具体代码如下位于fpga_core.v axis_switch.v模块代码位置如下
AXI4-Stream FIFO
网络数据经过MAC层和AXI4-Stream 总线仲裁后输出的是AXI4-Stream数据流如果直接将数据送入25G-UDP 高速协议栈有数据冲突的风险为了降低这种风险使用纯verilog实现的AXI4-Stream FIFO作为缓冲在MAC层与UDP协议栈之间建立“桥梁”MAC层解析出来的例如原MAC地址、目的MAC地址等信息也通过AXI4-Stream FIFO转发AXI4-Stream FIFO代码位置如下
25G-UDP 高速协议栈
25G-UDP协议栈的功能就是用verilog硬件描述语言完成标准UDP协议它由动态ARP层、IP层、UDP层构成动态ARP层完成ARP协议内容的数据收发对于接收端来说是数据帧解包从以太网数据帧中提取ARP数据段的有效数据对于发送端来说是数据帧组包将用户端发来的有效数据封装成ARP协议的数据帧作为以太网数据帧的ARP数据段代码中设置了ARP动态缓存即arp_cache收发两端都进行crc校验于千兆UDP 协议栈不同的是25G-UDP 高速协议栈的用户接口数据位宽为64bit
IP层完成IP协议内容的数据收发对于接收端来说是数据帧解包从以太网数据帧中提取IP数据段的有效数据对于发送端来说是数据帧组包将用户端发来的有效数据封装成IP协议的数据帧作为以太网数据帧的IP数据段IP层与动态ARP层是数据交互的模块相互包含代码架构无法明显划分
UDP层完成UDP协议内容的数据收发对于接收端来说是数据帧解包从以太网数据帧中提取UDP数据段的有效数据对于发送端来说是数据帧组包将用户端发来的有效数据封装成UDP协议的数据帧作为以太网数据帧的UDP数据段IP层与动态ARP层是数据交互的模块相互包含代码架构无法明显划分UDP层会对UDP数据做前后检验
UDP协议栈架构封装后代码位置如下需要注意的是这个UDP 高速协议栈为10G和25G通用的所以代码命名上延续了10G的命名规则 UDP协议栈是直接与用户逻辑数据对接的接口所以对于FPGAS开发者而言只要知道了UDP协议栈的数据接口就能在用户侧编写与之对接的时序来控制数据收发UDP协议栈的接口时序为AXI4-Stream时序如下 发送端时序如下__ __ __ __ __ __ __clk __/ \__/ \__/ \__/ \__/ \__/ \__/ \________________ ___________s_eth_hdr_valid \_________________/_____ s_eth_hdr_ready ________/ \__________________________________s_eth_dest_mac XXXXXXXXX_DMAC_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX_____s_eth_dest_mac XXXXXXXXX_SMAC_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX___________ _____ _____s_eth_payload_axis_tdata XXXXXXXXX_A0________X_A1__X_A2__XXXXXXXXXXXX_______________________s_eth_payload_axis_tvalid ________/ \____________________________s_eth_payload_axis_tready ______________/ \________________s_eth_payload_axis_tlast __________________________/ \___________s_eth_payload_axis_tuser ____________________________________________接收端时序与发送端一样IP地址修改
FPGA与PC通信而言FPGA作为UDP服务器PC作为UDP客户端需要在FPGA代码里设置MAC、IP等配置信息这是UDP通信的重要信息开发者至少需要知道该部分代码的位置甚至根据自己的需要修改代码的位置如下 可以看到我这里的配置如下 FPGA开发板MAC地址02-00-00-00-00-00 FPGA开发板IP地址192.168.1.128 FPGA开发板网关192.168.1.1 FPGA开发板子网掩码255.255.255.0 那么PC端的IP地址应该设为多少呢 因为在回环代码里写成了发送的目的IP接收到的目的IP所以只需要在PC端设置与192.168.1.128网段一样的IP地址即可比如我在测试时设置PC端IP地址为192.168.1.10如下 当然你也可以配置为192.168.1.11、192.168.1.12、192.168.1.100等等 默认的FPGA开发板和PC端的端口号都是1234代码的位置如下 这部分代码位于fpga_core.v
UDP数据回环
之所以只用到了数据回环模式是因为本设计旨在为用户提供一个可任意一直修改的UDP协议栈架构用户可通过此架构任意创建自己的项目自由度和开放性极强使用一个纯verilog实现的AXI4-Stream FIFO来做数据回环操作因为UDP协议栈的用户数据接口正是AXI4-Stream数据流代码的位置如下 代码里直接用assign语句将AXI4-Stream FIFO的收发两端连接如下 AXI4-Stream FIFO配置为了8192如果你的FPGA逻辑资源较小配置为1024就可以了 这部分代码位于fpga_core.v
总体代码架构
工程代码架构如下
5、工程源码 详解
开发板FPGA型号Xilinx Virtex UltraScale XCVU9P–xcvu9p-flga2104-2L-e 开发环境Vivado 2022.2 GT资源GTY 输入\输出QSFP光口和SGMII接口的PHY 测试项数据回环收发 工程代码架构参考第4章节的“总体代码架构”小节 FPGA资源消耗和功耗预估如下
6、工程移植说明
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软核
7、上板调试验证并演示
准备工作
需要准备以下物品 1FPGA开发板 2光纤 3支持25G的网卡一张 4上位机电脑台式或笔记本 5网络调试助手 连接如下然后上电下载bit 首先设置电脑端IP如下 开发板的IP地址在代码中的设置如下在fpga_core.v里可以自由修改
查看ARP
打开cmd输入 arp -a查看电脑的arp缓存表如下
UDP数据回环测试
打开网络调试助手并配置如下 单次发送数据测试结果如下 循环发送数据测试结果如下1秒时间间隔循环
8、福利工程代码的获取
福利工程代码的获取 代码太大无法邮箱发送以某度网盘链接方式发送 资料获取方式私或者文章末尾的V名片。 网盘资料如下 25G-UDP 高速协议栈源码文件夹如下