FPGA GTH 全网最细讲解,aurora 8b/10b协议,HDMI板对板视频传输,提供2套工程源码和技术支持

news2024/11/26 18:51:11

目录

  • 1、前言
    • 免责声明
  • 2、我这里已有的 GT 高速接口解决方案
  • 3、GTH 全网最细解读
    • GTH 基本结构
    • GTH 发送和接收处理流程
    • GTH 的参考时钟
    • GTH 发送接口
    • GTH 接收接口
    • GTH IP核调用和使用
  • 4、设计思路框架
    • 视频源选择
    • silicon9011解码芯片配置及采集
    • 动态彩条
    • 视频数据组包
    • GTH aurora 8b/10b
    • 数据对齐
    • 视频数据解包
    • 图像缓存
    • 视频输出
  • 5、第1套vivado工程详解
  • 6、第2套vivado工程详解
  • 7、工程移植说明
    • vivado版本不一致处理
    • FPGA型号不一致处理
    • 其他注意事项
  • 8、上板调试验证
    • 光纤连接
    • 静态演示
    • 动态演示
  • 9、福利:工程代码的获取

1、前言

没玩过GT资源都不好意思说自己玩儿过FPGA,这是CSDN某大佬说过的一句话,鄙人深信不疑。。。
GT资源是Xilinx系列FPGA的重要卖点,也是做高速接口的基础,不管是PCIE、SATA、MAC等,都需要用到GT资源来做数据高速串化和解串处理,Xilinx不同的FPGA系列拥有不同的GT资源类型,低端的A7由GTP,K7有GTX,V7有GTH,更高端的U+系列还有GTY等,他们的速度越来越高,应用场景也越来越高端。。。

本文使用Xilinx的Virtex7 FPGA的GTH资源做视频传输实验,视频源有两种,分别对应开发者手里有没有摄像头的情况,一种是使用笔记本电脑模拟HDMI视频,silicon9011解码输入的HDMI为GRB后供FPGA使用;如果你得手里没有摄像头,或者你得开发板没有HDMI输入接口,则可使用代码内部生成的动态彩条模拟摄像头视频;视频源的选择通过代码顶层的`define宏定义进行,默认使用HDMI输入作为视频源;调用GTH IP核,用verilog编写视频数据的编解码模块和数据对齐模块,使用2块开发板硬件上的2个SFP光口实现数据的收发;本博客提供2套vivado工程源码,2套工程的不同点在于一套是GTH发送,另一套是GTH接收;本博客详细描述了FPGA GTH视频传输的设计方案,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做学习提升,可应用于医疗、军工等行业的高速接口或图像处理领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

免责声明

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

2、我这里已有的 GT 高速接口解决方案

我的主页有FPGA GT 高速接口专栏,该专栏有 GTP 、 GTX 、 GTH 、 GTY 等GT 资源的视频传输例程和PCIE传输例程,其中 GTP基于A7系列FPGA开发板搭建,GTX基于K7或者ZYNQ系列FPGA开发板搭建,GTH基于KU或者V7系列FPGA开发板搭建,GTY基于KU+系列FPGA开发板搭建;以下是专栏地址:
点击直接前往

3、GTH 全网最细解读

关于GTH 介绍最详细的肯定是Xilinx官方的《ug476_7Series_Transceivers》,我们以此来解读:
《ug476_7Series_Transceivers》的PDF文档我已放在了资料包里,文章末尾有获取方式;
我用到的开发板FPGA型号为Xilinx Virtex7 xc7vx690tffg1761-3;带有8路GTH 资源,其中2路连接到了2个SFP光口,每通道的收发速度为 500 Mb/s 到 10.3125 Gb/s 之间。GTH 收发器支持不同的串行传输接口或协议,比如 PCIE 1.1/2.0 接口、万兆网 XUAI 接口、OC-48、串行 RapidIO 接口、 SATA(Serial ATA) 接口、数字分量串行接口(SDI)等等;

GTH 基本结构

Xilinx 以 Quad 来对串行高速收发器进行分组,四个串行高速收发器和一个 COMMOM(QPLL)组成一个 Quad,每一个串行高速收发器称为一个 Channel(通道),下图为四路 GTH 收发器在Virtex7 FPGA 芯片中的示意图:《ug476_7Series_Transceivers》第24页;
在这里插入图片描述
GTH 的具体内部逻辑框图如下所示,它由四个收发器通道 GTHE2_CHANNEL原语 和一个GTHE2_COMMON 原语组成。每路GTHE2_CHANNEL包含发送电路 TX 和接收电路 RX,GTHE2_CHANNEL的时钟可以来自于CPLL或者QPLL,可在IP配置界面里配置;《ug476_7Series_Transceivers》第25页;
在这里插入图片描述
每个 GTHE2_CHANNEL 的逻辑电路如下图所示:《ug476_7Series_Transceivers》第26页;
在这里插入图片描述
GTHE2_CHANNEL 的发送端和接收端功能是独立的,均由 PMA(Physical Media Attachment,物理媒介适配层)和 PCS(Physical Coding Sublayer,物理编码子层)两个子层组成。其中 PMA 子层包含高速串并转换(Serdes)、预/后加重、接收均衡、时钟发生器及时钟恢复等电路。PCS 子层包含8B/10B 编解码、缓冲区、通道绑定和时钟修正等电路。
这里说多了意义不大,因为没有做过几个大的项目是不会理解这里面的东西的,对于初次使用或者想快速使用者而言,更多的精力应该关注IP核的调用和使用,后面我也会重点将到IP核的调用和使用;

GTH 发送和接收处理流程

首先用户逻辑数据经过 8B/10B 编码后,进入一个发送缓存区(Phase Adjust FIFO),该缓冲区主要是 PMA 子层和 PCS 子层两个时钟域的时钟隔离,解决两者时钟速率匹配和相位差异的问题,最后经过高速 Serdes 进行并串转换(PISO),有必要的话,可以进行预加重(TX Pre-emphasis)、后加重。值得一提的是,如果在 PCB 设计时不慎将 TXP 和 TXN 差分引脚交叉连接,则可以通过极性控制(Polarity)来弥补这个设计错误。接收端和发送端过程相反,相似点较多,这里就不赘述了,需要注意的是 RX 接收端的弹性缓冲区,其具有时钟纠正和通道绑定功能。这里的每一个功能点都可以写一篇论文甚至是一本书,所以这里只需要知道个概念即可,在具体的项目中回具体用到,还是那句话:对于初次使用或者想快速使用者而言,更多的精力应该关注IP核的调用和使用。

GTH 的参考时钟

GTH 模块有两个差分参考时钟输入管脚(MGTREFCLK0P/N 和 MGTREFCLK1P/N),作为 GTH 模块的参考时钟源,用户可以自行选择。一般的A7系列开发板上,都有一路 148.5Mhz 的 GTH 参考时钟连接到 MGTREFCLK0上,作为 GTH 的参考时钟。差分参考时钟通过IBUFDS 模块转换成单端时钟信号进入到 GTHE2_COMMOM 的QPLL或CPLL中,产生 TX 和 RX 电路中所需的时钟频率。TX 和 RX 收发器速度相同的话,TX 电路和 RX 电路可以使用同一个 PLL 产生的时钟,如果 TX 和 RX收发器速度不相同的话,需要使用不同的 PLL 时钟产生的时钟。参考时钟这里Xilinx给出的GT参考例程已经做得很好了,我们调用时其实不用修改;GTH 的参考时钟结构图如下:《ug476_7Series_Transceivers》第31页;
在这里插入图片描述

GTH 发送接口

《ug476_7Series_Transceivers》的第107到165页详细介绍了发送处理流程,其中大部分内容对于用户而言可以不去深究,因为手册讲的基本都是他自己的设计思想,留给用户可操作的接口并不多,基于此思路,我们重点讲讲GTH 例化时留给用户的发送部分需要用到的接口;
在这里插入图片描述

用户只需要关心发送接口的时钟和数据即可,GTH 例化模块的这部分接口如下:
在这里插入图片描述
在这里插入图片描述
在代码中我已为你们重新绑定并做到了模块的顶层,代码部分如下:
在这里插入图片描述

GTH 接收接口

《ug476_7Series_Transceivers》的第167到295页详细介绍了发送处理流程,其中大部分内容对于用户而言可以不去深究,因为手册讲的基本都是他自己的设计思想,留给用户可操作的接口并不多,基于此思路,我们重点讲讲GTH 例化时留给用户的发送部分需要用到的接口;
在这里插入图片描述
用户只需要关心接收接口的时钟和数据即可,GTH 例化模块的这部分接口如下:
在这里插入图片描述
在这里插入图片描述
在代码中我已为你们重新绑定并做到了模块的顶层,代码部分如下:
在这里插入图片描述

GTH IP核调用和使用

在这里插入图片描述
有别于网上其他博主的教程,我个人喜欢用如下图的共享逻辑:
在这里插入图片描述
这样选择的好处有两个,一是方便DRP变速,二是便于IP核的修改,修改完IP核后直接编译即可,不再需要打开example工程,再复制下面的一堆文件放到自己的工程什么的,玩儿个GTH需要那么复杂么?
在这里插入图片描述
这里对上图的标号做解释:
1:线速率,根据自己的项目需求来,GTH的范围是0.5到13.1G,由于我的项目是视频传输,所以在GTH的速率范围内均可,本例程选择了5G;
2:参考时钟,这个得根据你的原理图来,可以是80M、125M、148.5M、156.25M等等,我的开发板是156.25M;
4:GTH组的绑定,这个很重要,他的绑定参考依据有两个,已是你的开发板原理图,而是官方的参考资料《ug476_7Series_Transceivers》,官方根据BANK不同将GTH资源分成了多组,由于GT资源是Xilinx系列FPGA的专用资源,占用专用的Bnak,所以引脚也是专用的,那么这些GTH组和引脚是怎么对应的呢?《ug476_7Series_Transceivers》的说明如下:红框内为的我的开发板原理图对应的FPGA引脚;
在这里插入图片描述
我的板子原理图如下:
在这里插入图片描述
在这里插入图片描述
选择外部数据位宽32bit的8b/10b编解码,如下:
在这里插入图片描述
下面这里讲的是K码检测:
在这里插入图片描述
这里选择K28.5,也就是所谓的COM码,十六进制为bc,他的作用很多,可以表示空闲乱序符号,也可以表示数据错位标志,这里用来标志数据错位,8b/10b协议对K码的定义如下:
在这里插入图片描述
下面讲的是时钟矫正,也就是对应GTH内部接收部分的弹性buffer;
在这里插入图片描述
这里有一个时钟频偏的概念,特别是收发双方时钟不同源时,这里设置的频偏为100ppm,规定每隔5000个数据包发送方发送一个4字节的序列,接收方的弹性buffer会根据这4字节的序列,以及数据在buffer中的位置来决定删除或者插入一个4字节的序列中的一个字节,目的是确保数据从发送端到接收端的稳定性,消除时钟频偏的影响;

4、设计思路框架

本博客提供2套vivado工程源码,2组工程的不同点在于一套是GTH 发送,另一套是GTH 接收;我这里有2个FPGA开发板,记作开发板1和开发板2,两个开发板上均有HDMI输入和HDMI输出接口,2套vivado工程源码如下极其设计架构如下:
在这里插入图片描述
第1套vivado工程源码:GTH 作为发送端,FPGA开发板1采集视频,然后数据组包,通过GTH 做8b/10b编码后,通过板载的SFP光口的TX端发送出去;视频源有两种,分别对应开发者手里有没有摄像头的情况,一种是使用笔记本电脑模拟HDMI视频,silicon9011解码输入的HDMI为GRB后供FPGA使用;如果你得手里没有摄像头,或者你得开发板没有HDMI输入接口,则可使用代码内部生成的动态彩条模拟摄像头视频;视频源的选择通过代码顶层的`define宏定义进行,默认使用HDMI输入作为视频源;

第2套vivado工程源码:FPGA2开发板的SFP RX端口接收数据,经过GTH 做8b/10b解码、数据对齐、数据解包的操作后就得到了有效的视频数据,再用我常用的FDMA方案做视频缓存,最后输出HDMI视频显示;

视频源选择

视频源有两种,分别对应开发者手里有没有摄像头的情况,如果你的手里有摄像头,或者你的开发板有HDMI输入接口,则使用HDMI输入作为视频输入源,我这里用到的是笔记本模拟HDMI视频,silicon9011解码芯片解码HDMI;如果你得手里没有摄像头,或者你得开发板没有HDMI输入接口,则可使用代码内部生成的动态彩条模拟摄像头视频,动态彩条是移动的画面,完全可以模拟视频;默认使用HDMI输入作为视频源;视频源的选择通过代码顶层的`define宏定义进行;如下:
在这里插入图片描述
选择逻辑代码部分如下:
在这里插入图片描述
选择逻辑如下:
当(注释) define COLOR_TEST时,输入源视频是动态彩条;
当(不注释) define COLOR_TEST时,输入源视频是HDMI输入;

silicon9011解码芯片配置及采集

silicon9011解码芯片需要i2c配置才能使用,关于silicon9011解码芯片的配置和使用,请参考我往期的博客,博客地址:点击直接前往
silicon9011解码芯片配置及采集这两部分均用verilog代码模块实现,代码位置如下:
在这里插入图片描述
代码中配置为1920x1080分辨率;

动态彩条

动态彩条可配置为不同分辨率的视频,视频的边框宽度,动态移动方块的大小,移动速度等都可以参数化配置,我这里配置为辨率1920x1080,动态彩条模块代码位置和顶层接口和例化如下:
在这里插入图片描述
在这里插入图片描述

视频数据组包

由于视频需要在GTH中通过aurora 8b/10b协议收发,所以数据必须进行组包,以适应aurora 8b/10b协议标准;视频数据组包模块代码位置如下:
在这里插入图片描述
首先,我们将16bit的视频存入FIFO中,存满一行时就从FIFO读出送入GTH发送;在此之前,需要对一帧视频进行编号,也叫作指令,GTH组包时根据固定的指令进行数据发送,GTH解包时根据固定的指令恢复视频的场同步信号和视频有效信号;当一帧视频的场同步信号上升沿到来时,发送一帧视频开始指令 0,当一帧视频的场同步信号下降沿到来时,发送一帧视频开始指令 1,视频消隐期间发送无效数据 0 和无效数据 1,当视频有效信号到来时将每一行视频进行编号,先发送一行视频开始指令,在发送当前的视频行号,当一行视频发送完成后再发送一行视频结束指令,一帧视频发送完成后,先发送一帧视频结束指令 0,再发送一帧视频结束指令 1;至此,一帧视频则发送完成,这个模块不太好理解,所以我在代码里进行了详细的中文注释,需要注意的是,为了防止中文注释的乱序显示,请用notepad++编辑器打开代码;指令定义如下:
在这里插入图片描述
指令可以任意更改,但最低字节必须为bc;

GTH aurora 8b/10b

这个就是调用GTH做aurora 8b/10b协议的数据编解码,前面已经对GTH做了详细概述,这里不讲;代码位置如下:
在这里插入图片描述

数据对齐

由于GT资源的aurora 8b/10b数据收发天然有着数据错位的情况,所以需要对接受到的解码数据进行数据对齐处理,数据对齐模块代码位置如下:
在这里插入图片描述
我定义的 K 码控制字符格式为:XX_XX_XX_BC,所以用一个rx_ctrl 指示数据是否为 K 码 的 COM 符号;
rx_ctrl = 4’b0000 表示 4 字节的数据没有 COM 码;
rx_ctrl = 4’b0001 表示 4 字节的数据中[ 7: 0] 为 COM 码;
rx_ctrl = 4’b0010 表示 4 字节的数据中[15: 8] 为 COM 码;
rx_ctrl = 4’b0100 表示 4 字节的数据中[23:16] 为 COM 码;
rx_ctrl = 4’b1000 表示 4 字节的数据中[31:24] 为 COM 码;
基于此,当接收到有K码时就对数据进行对齐处理,也就是将数据打一拍,和新进来的数据进行错位组合,这是FPGA的基础操作,这里不再赘述;

视频数据解包

数据解包是数据组包的逆过程,代码位置如下:
在这里插入图片描述
GTH 解包时根据固定的指令恢复视频的场同步信号和视频有效信号;这些信号是作为后面图像缓存的重要信号;
至此,数据进出GTH 部分就已经讲完了,整个过程的框图我在代码中描述了,如下:
在这里插入图片描述

图像缓存

经常看我博客的老粉应该都知道,我做图像缓存的套路是FDMA,他的作用是将图像送入DDR中做3帧缓存再读出显示,目的是匹配输入输出的时钟差和提高输出视频质量,关于FDMA,请参考我之前的博客,博客地址:点击直接前往
这里需要注意的是,我的开发板的DDR3并不是直接贴片的DDR3颗粒,而是SODIMM接口的DDR3内存条,这种情况下,MIG的配置方式是不一样的,基于此,我在之前专门写过一篇博客介绍FPGA MIG 如何配置SODIMM接口的DDR3内存条的博客,可以到那里看看,请参考我之前的博客,博客地址:点击直接前往

视频输出

视频从FDMA读出后,经过VGA时序模块和HDMI发送模块后输出显示器,输出方式有两种,一是通过silicon9134芯片做HDMI发送器,这种方式的HDMI发送由芯片完成,针对板子上有silicon9134芯片的情景,如果你的板子没有silicon9134芯片,则可以选择纯verilog代码实现的HDMI发送模块输出,两种方式我这里均作了输出,你可根据自己的板子情况选择其中一种输出即可;
VGA时序配置为1920X1080,verilog代码实现的HDMI发送模块输出代码位置如下:
在这里插入图片描述
在这里插入图片描述
HDMI发送模块采用verilog代码手写,可以用于FPGA的HDMI发送应用,关于这个模块,请参考我之前的博客,博客地址:点击直接前往
silicon9134解码芯片需要i2c配置才能使用,关于silicon9134解码芯片的配置和使用,请参考我往期的博客,博客地址:点击直接前往
silicon9134解码芯片配置及采集这两部分均用verilog代码模块实现,代码位置如下:
在这里插入图片描述

5、第1套vivado工程详解

开发板FPGA型号:Xilinx–Virtex7–xc7vx690tffg1761-3;
开发环境:Vivado2019.1;
输入:HDMI或者动态彩条,分辨率1920x1080@60Hz;
输出:开发板1的SFP光口的TX接口;
应用:GTH 板对板视频传输;
工程代码架构如下:
在这里插入图片描述
综合编译完成后的FPGA资源消耗和功耗预估如下:
在这里插入图片描述

6、第2套vivado工程详解

开发板FPGA型号:Xilinx–Virtex7–xc7vx690tffg1761-3;
开发环境:Vivado2019.1;
输入:开发板2的SFP光口的RX接口;
输出:开发板2的HDMI输出接口,分辨率1920x1080@60Hz;
应用:GTH 板对板视频传输;
工程Block Design如下:
在这里插入图片描述
工程代码架构如下:
在这里插入图片描述
综合编译完成后的FPGA资源消耗和功耗预估如下:
在这里插入图片描述

7、工程移植说明

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软核;

8、上板调试验证

光纤连接

两块板子的光纤接法如下:
在这里插入图片描述

静态演示

HDMI输入后的输出效果:
当GTH运行5线速率时输出如下:
在这里插入图片描述
动态彩条输出效果:
当GTH运行5G线速率时输出如下:
在这里插入图片描述

动态演示

动态彩条输出效果演示视频:

V7-GTH-COLOR

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

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

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

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

相关文章

【Java 基础篇】深入理解 Java 内部类:嵌套在嵌套中的编程奇妙世界

在 Java 编程中,内部类(Inner Class)是一个非常强大且灵活的概念,它允许在一个类的内部定义另一个类。内部类可以访问外部类的成员,包括私有成员,这使得内部类在许多编程场景中都非常有用。本篇博客将详细介…

js如何实现数组去重的常用方法

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用 Set(ES6)⭐ 使用 filter 和 indexOf⭐ 使用 reduce⭐ 使用对象属性⭐ 使用 includes 方法(ES6)⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方…

$ref属性的介绍与使用

在Vue.js中,$ref是一个特殊的属性,用于访问Vue组件中的DOM元素或子组件实例。它允许你直接访问组件内部的DOM元素或子组件,并且可以在需要时进行操作或修改。以下是有关$ref的详细介绍和示例演示,给大家做一个简单的介绍和概念区分…

库中是如何实现string类的?

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏1: 🍔🍟🌯C语言初阶 🐻推荐专栏2: 🍔🍟🌯C语言进阶 🔑个人信条: 🌵知行合一 &#x1f…

如何查看B站UP主数据?如何看懂B站数据?

bilibili是独特且稀缺的PUGC视频社区,拥有浓厚社区氛围的视频社区。有别于短视频,PUGC视频创作门槛高,视频内容更充实,bilibili是PUGC视频行业的领跑者,同时,bilibili拥有社区产品特有的高创作渗透率和高互…

SQL SERVER 如何实现UNDO REDO 和PostgreSQL 有近亲关系吗

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,SQL Server,Redis ,Oracle ,Oceanbase 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请加微信号 l…

分类任务评价指标

分类任务评价指标 分类任务中,有以下几个常用指标: 混淆矩阵准确率(Accuracy)精确率(查准率,Precision)召回率(查全率,Recall)F-scorePR曲线ROC曲线 1. 混…

配置Jenkins

主要是配置Jenkins和jdk,maven的插件

Spring Cloud Alibaba Nacos配置导入问题解决方案

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

论文复现--lightweight-human-pose-estimation-3d-demo.pytorch(单视角多人3D实时动作捕捉DEMO)

分类:动作捕捉 github地址:https://github.com/Daniil-Osokin/lightweight-human-pose-estimation-3d-demo.pytorch 所需环境: Windows10,conda 4.13.0; 目录 conda环境配置安装Pytorch全家桶安装TensorRT(…

[数据集][目标检测]裸土识别裸土未覆盖目标检测数据集VOC格式857张2类别

数据集格式:Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):857 标注数量(xml文件个数):857 标注类别数:2 标注类别名称:["luotu","n…

Python网络爬虫中这七个li标签下面的属性值,不是固定的,怎样才能拿到他们的值呢?...

点击上方“Python爬虫与数据挖掘”,进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。 大家好,我…

Java8实战-总结21

Java8实战-总结21 使用流归约元素求和无初始值 最大值和最小值 使用流 归约 到目前为止,见到过的终端操作都是返回一个boolean(allMatch之类的)、void(forEach)或optional对象(findAny等)。也见过了使用collect来将流中的所有元素组合成一个List。 如何把一个流中…

r7 7840u和r7 7840hs差距 锐龙r77840u和r77840hs对比

锐龙7 7840U 采用Zen3架构、8核心16线程,基准频率疑似3.3GHz,同样集成RDNA3架构核显Radeon 780M,也是12个CU单元 r7 7840U 的处理器在 Cinebench R23 中多核跑分 14825 分 选r7 7840u还是 R7 7840HS这些点很重要 http://www.adiannao.cn/dy …

小红书笔记爬虫

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据…

codesys可视化

可视化有2种:本地和网页 触摸屏的话,属于网页。 1先配置IDE 如果有些控件,别人有,而你却没有,原因是:你库里没有引用。 比如缺少3D轨迹的控制面板,你需要库内引用 VisuStruct3DControl编译报错…

C 风格文件输入/输出 (std::fopen)(std::freopen)(std::fclose)

文件访问 打开文件 std::fopen std::FILE* fopen( const char* filename, const char* mode ); 打开 filename 所指示的文件并返回与该文件关联的流。用 mode 确定文件访问模式。 参数 filename-要关联文件流到的文件名mode-确定文件访问模式的空终止字符串 文件访问模式字…

sql:SQL优化知识点记录(十一)

(1)用Show Profile进行sql分析 新的一个优化的方式show Profile 运行一些查询sql: 查看一下我们执行过的sql 显示sql查询声明周期完整的过程: 当执行过程出现了下面这4个中的时,就会有问题导致效率慢 8这个sql创建…

【图解RabbitMQ-3】消息队列RabbitMQ介绍及核心流程

🧑‍💻作者名称:DaenCode 🎤作者简介:CSDN实力新星,后端开发两年经验,曾担任甲方技术代表,业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开…

linux线程讲解

1.线程概述 一个进程在同一时刻只做一件事情,进程是程序执行的一个实例。 线程是操作系统能够进行运算调度的最小单位,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 进程:资源分配的最小单位。线程,程…