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

目录

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

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

1、前言

没玩过GT资源都不好意思说自己玩儿过FPGA,这是CSDN某大佬说过的一句话,鄙人深信不疑。。。GT资源是Xilinx系列FPGA的重要卖点,也是做高速接口的基础,不管是PCIE、SATA、MAC等,都需要用到GT资源来做数据高速串化和解串处理,Xilinx不同的FPGA系列拥有不同的GT资源类型,低端的A7由GTP,K7有GTX,V7有GTH,更高端的U+系列还有GTY等,他们的速度越来越高,应用场景也越来越高端。。。UltraScale GTH 适用于Xilinx UltraScale系列的FPGA上,包括Virtex UltraScale、Kintex UltraScale、Zynq® UltraScale等器件,在UltraScale系列之下只有GTH,而UltraScale GTH相比于GTH,线速率更高,支持协议类型更多,功耗更低,带宽更高。。。

本文使用Xilinx的Kirtex7-UltraScale-xcku060-ffva1156-2-i FPGA 的UltraScale GTH资源做视频传输实验,视频源有两种,分别对应开发者手里的开发板有没有HDMI输入接口的情况,一种是使用笔记本电脑模拟HDMI视频,ADV7611芯片将输入的HDMI视频解码为GRB后供FPGA使用;如果你的开发板有没有HDMI输入接口,或者你的开发板HDMI输入解码芯片不是ADV7611,则可使用代码内部生成的动态彩条模拟摄像头视频;视频源的选择通过代码顶层的define宏定义进行,默认使用HDMI输入作为视频源;FPGA采集到谁视频后,首先会送入数据组包模块对视频进行打包,并加上以字符BC为基础的控制帧头和帧尾以及其他标志符;然后调用Xilinx官方的UltraScale GTH IP核,并配置为8b/10b编解码模式,线速率配置为5G;然后通过板载的SFP光口将8b/10b编码后的视频进行回环后板子又接收;UltraScale GTH再做8b/10b解码处理;然后将数据送入数据对齐模块进行对齐处理;然后将数据送入数据解包模块去掉帧头帧尾并恢复视频时序;为了方便期间,这里没有再对视频进行缓存,而是直接调用Xilinx官方的Video In to AXI4-Stream、Video Timing Controller、AXI4-Stream to Video Out三个IP将视频简单缓存后送入纯verilog代码实现的HDMI发送模块,将RGB视频转换为HDMI视频,最后输出显示器显示;

本博客提供2套vivado工程源码,2套工程的不同点在于使用1个SFP光口做收发还是两个2个SFP光口做收发;详情如下:

vivado工程1:HDMI/动态彩条输入,UltraScale GTH编解码,1路SFP光口回环,HDMI输出显示器;
vivado工程2:HDMI/动态彩条输入,UltraScale GTH编解码,2路SFP光口回环,HDMI输出显示器;

本博客详细描述了Xilinx的Kirtex7-UltraScale-xcku060-ffva1156-2-i FPGA 的UltraScale 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、详细设计方案

本文使用Xilinx的Kirtex7-UltraScale-xcku060-ffva1156-2-i FPGA 的UltraScale GTH资源做视频传输实验,视频源有两种,分别对应开发者手里的开发板有没有HDMI输入接口的情况,一种是使用笔记本电脑模拟HDMI视频,ADV7611芯片将输入的HDMI视频解码为GRB后供FPGA使用;如果你的开发板有没有HDMI输入接口,或者你的开发板HDMI输入解码芯片不是ADV7611,则可使用代码内部生成的动态彩条模拟摄像头视频;视频源的选择通过代码顶层的define宏定义进行,默认使用HDMI输入作为视频源;FPGA采集到谁视频后,首先会送入数据组包模块对视频进行打包,并加上以字符BC为基础的控制帧头和帧尾以及其他标志符;然后调用Xilinx官方的UltraScale GTH IP核,并配置为8b/10b编解码模式,线速率配置为5G;然后通过板载的SFP光口将8b/10b编码后的视频进行回环后板子又接收;UltraScale GTH再做8b/10b解码处理;然后将数据送入数据对齐模块进行对齐处理;然后将数据送入数据解包模块去掉帧头帧尾并恢复视频时序;为了方便期间,这里没有再对视频进行缓存,而是直接调用Xilinx官方的Video In to AXI4-Stream、Video Timing Controller、AXI4-Stream to Video Out三个IP将视频简单缓存后送入纯verilog代码实现的HDMI发送模块,将RGB视频转换为HDMI视频,最后输出显示器显示;本博客提供2套vivado工程源码,2套工程的不同点在于使用1个SFP光口做收发还是两个2个SFP光口做收发

设计框图

第一套工程详细设计方案框图如下:
在这里插入图片描述
第二套工程详细设计方案框图如下:
在这里插入图片描述
框图解释:箭头表示数据流向,箭头内文字表示数据格式,箭头外数字表示数据流向的步骤;

视频源选择

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

ADV7611解码芯片配置及采集

第二套工程使用ADV7611解码输入的HDMI视频,适应板载ADV7611解码芯片的FPGA开发板;ADV7611解码芯片需要i2c配置才能使用,ADV7611解码芯片配置及采集这两部分均用verilog代码模块实现,代码中配置为1920x1080分辨率;代码位置如下:
在这里插入图片描述
代码中配置为1920x1080分辨率;

动态彩条

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

视频数据组包

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

UltraScale GTH 全网最细解读

关于UltraScale GTH介绍最详细的肯定是Xilinx官方的《ug576-ultrascale-gth-transceivers》,我们以此来解读:
《ug576-ultrascale-gth-transceivers》的PDF文档我已放在了资料包里,文章末尾有获取方式;
我用到的开发板FPGA型号为Kirtex7-UltraScale-xcku060-ffva1156-2-i;UltraScale GTH的收发速度为 500 Mb/s 到 16.375 Gb/s 之间,比GTH高出3G;UltraScale GTH收发器支持不同的串行传输接口或协议,比如 PCIE 1.1/2.0 接口、万兆网 XUAI 接口、OC-48、串行 RapidIO 接口、 SATA(Serial ATA) 接口、数字分量串行接口(SDI)等等;
工程调用UltraScale GTH做aurora 8b/10b协议的数据编解码,代码位置如下:
在这里插入图片描述
UltraScale GTH基本配置如下:板载差分晶振125M,线速率配置为5G,协议类型被指为aurora 8b/10b;
在这里插入图片描述

UltraScale GTH 基本结构

Xilinx 以 Quad 来对串行高速收发器进行分组,四个串行高速收发器和一个 COMMOM(QPLL)组成一个 Quad,每一个串行高速收发器称为一个 Channel(通道),下图为UltraScale GTH 收发器在Kintex7 UltraScale FPGA 芯片中的示意图:《ug576-ultrascale-gth-transceivers》第19页;
在这里插入图片描述
在 Ultrascale/Ultrascale+架构系列的 FPGA 中,GTH 高速收发器通常使用 Quad 来划分,一个 Quad 由四个GTHE3/4_CHANNEL 原语和一个 GTHE3/4_COMMON 原语组成。每个GTHE3/4_COMMON 中包含两个 LC-tank pll(QPLL0 和 QPLL1)。只有在应用程序中使用 QPLL 时,才需要实例化 GTHE3/4_COMMON。每个 GTHE3/4_CHANNEL 由一个 channel PLL(CPLL)、一个 transmitter,和一个 receiver 组成。一个参考时钟可以直接连接到一个 GTHE3/4_CHANNEL 原语,而不需要实例化 GTHE3/4_COMMON;

Ultrascale GTH 收发器的发送端和接收端功能是相互独立,都是由 Physical Media Attachment(物理媒介适配层 PMA)和Physical Coding Sublayer(物理编码子层 PCS)组成。PMA 内部集成了串并转换(PISO)、预加重、接收均衡、时钟发生器和时钟恢复等;PCS 内部集成了 8b/10b 编解码、弹性缓冲区、通道绑定和时钟修正等,每个 GTHE3/4_CHANNEL源语的逻辑电路如下图所示:《ug576-ultrascale-gth-transceivers》第20页;
在这里插入图片描述
这里说多了意义不大,因为没有做过几个大的项目是不会理解这里面的东西的,对于初次使用或者想快速使用者而言,更多的精力应该关注IP核的调用和使用,后面我也会重点将到IP核的调用和使用;

参考时钟的选择和分配

UltraScale 器件中的 GTH 收发器提供了不同的参考时钟输入选项。参考时钟选择架构支持 QPLL0、QLPLL1 和CPLL。从架构上讲,每个 Quad 包含四个 GTHE3/4_CHANNEL 原语,一个 GTHE3/4_COMMON 原语,两个专用的外部参考时钟引脚对,以及专用的参考时钟路由。如果使用到了高性能 QPLL,则必须实例化 GTHE3/4_COMMON,如下面 GTHE3/4_COMMON 时钟多路复用器结构的详细视图所示,(《ug576-ultrascale-gth-transceivers》第33页)在一个 Quad 中有 6 个参考时钟引脚对,两个本地参考时钟引脚对:GTREFCLK0或GTREFCLK1,两个参考时钟引脚对来自上面的两个Quads:GTSOUTHREFCLK0或 GTSOUTHREFCLK1,两个参考时钟引脚对来自下面的两个 Quads: GTNORTHREFCLK0 或GTNORTHREFCLK1。
在这里插入图片描述

UltraScale GTH 发送和接收处理流程

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

UltraScale GTH 发送接口

《ug576-ultrascale-gth-transceivers》的第104到179页详细介绍了发送处理流程,其中大部分内容对于用户而言可以不去深究,因为手册讲的基本都是他自己的设计思想,留给用户可操作的接口并不多,基于此思路,我们重点讲讲UltraScale GTH例化时留给用户的发送部分需要用到的接口;
在这里插入图片描述
用户只需要关心发送接口的时钟和数据即可,UltraScale GTH例化模块的这部分接口如下:该文件名为gth_aurora_example_wrapper.v,例化IP后由官方自动生成;
在这里插入图片描述
在这里插入图片描述
在代码中我已为你们重新绑定并做到了模块的顶层,代码部分如下:
该文件名为gth_aurora_example_top.v;例化了官方的gth_aurora_example_wrapper.v;
在这里插入图片描述

UltraScale GTH 接收接口

《ug576-ultrascale-gth-transceivers》的第181到314页详细介绍了发送处理流程,其中大部分内容对于用户而言可以不去深究,因为手册讲的基本都是他自己的设计思想,留给用户可操作的接口并不多,基于此思路,我们重点讲讲UltraScale GTH 例化时留给用户的发送部分需要用到的接口;
在这里插入图片描述
用户只需要关心发送接口的时钟和数据即可,UltraScale GTH例化模块的这部分接口如下:该文件名为gth_aurora_example_wrapper.v,例化IP后由官方自动生成;
在这里插入图片描述
在这里插入图片描述
在代码中我已为你们重新绑定并做到了模块的顶层,代码部分如下:
该文件名为gth_aurora_example_top.v;例化了官方的gth_aurora_example_wrapper.v;
在这里插入图片描述

UltraScale GTH IP核调用和使用

在这里插入图片描述
UltraScale GTH基本配置如下:板载差分晶振125M,线速率配置为5G,协议类型被指为aurora 8b/10b;
在这里插入图片描述
具体配置参考vivado工程,在IP配置好后,需要打开example工程,并将里面的文件复制出来作为自己的工程中使用,不过在我的工程中已经做好了这一步;打开example工程方法如下:
在这里插入图片描述

数据对齐

由于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的基础操作,这里不再赘述;

视频数据解包

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

图像输出架构

为了方便期间,这里没有再对视频进行缓存,而是直接调用Xilinx官方的Video In to AXI4-Stream、Video Timing Controller、AXI4-Stream to Video Out三个IP将视频简单缓存后送入纯verilog代码实现的HDMI发送模块,将RGB视频转换为HDMI视频,最后输出显示器显示;这里需要注意的是,纯verilog代码实现的HDMI发送模块适用于UltraScale系列FPGA,因为使用的原语变了,不同于7系列FPGA原语;

4、vivado工程1–>1路SFP传输

开发板FPGA型号:Xilinx–Kirtex7-UltraScale-xcku060-ffva1156-2-i
开发环境:Vivado2022.2;
输入:HDMI或者动态彩条,分辨率1920x1080@60Hz;
输出:HDMI显示器;
应用:1路SFP光口GTH aurora 8b/10b编解码视频传输;即1路SFP的TX端连接RX端形成回环;
工程Block Design如下:
在这里插入图片描述
工程代码架构如下:
在这里插入图片描述
综合编译完成后的FPGA资源消耗和功耗预估如下:
在这里插入图片描述

5、vivado工程2–>2路SFP传输

开发板FPGA型号:Xilinx–Kirtex7-UltraScale-xcku060-ffva1156-2-i
开发环境:Vivado2022.2;
输入:HDMI或者动态彩条,分辨率1920x1080@60Hz;
输出:HDMI显示器;
应用:2路SFP光口GTH aurora 8b/10b编解码视频传输;即1路SFP的TX端连接另一路SFP的RX端形成回环;
工程Block Design、工程代码架构、综合编译完成后的FPGA资源消耗和功耗预估等信息与第4章节的几乎一样,请参考第4章节内容;不同点在于vivado工程2使用到了2个SFP光口;

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

准备工作

FPGA开发板;
笔记本电脑,你的板子没有HDMI输入接口可以选择动态彩条;
SFP光口模块及光纤;
连接光纤,板子上电,下载bit;
工程1:1路SFP传输的光纤接法如下:
在这里插入图片描述
工程2:2路SFP传输的光纤接法如下:
在这里插入图片描述

静态演示

下面以工程2:2路SFP传输为例展示HDMI输入后的输出效果:
当UltraScale GTH 运行5线速率时输出如下:
在这里插入图片描述
动态彩条输出效果:
当UltraScale GTH 运行5G线速率时输出如下:
在这里插入图片描述

动态演示

录制了一个动态彩条输出的小视频,输出动态演示如下:

V7-GTH-COLOR

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

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

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

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

相关文章

【小沐学Python】Python实现Web服务器(Flask+celery,生产者-消费者)

文章目录 1、简介2、安装和下载2.1 flask2.2 celery2.3 redis 3、功能开发3.1 创建异步任务的方法3.1.1 使用默认的参数3.1.2 指定相关参数3.1.3 自定义Task基类 3.2 调用异步任务的方法3.2.1 app.send_task3.2.2 Task.delay3.2.3 Task.apply_async 3.3 获取任务结果和状态 4、…

web前端之JavaScript实现数据的流式获取、一边传输一边解析、fetch、getReader、TextDecoder、read、decode

MENU 前言代码TextDecodergetReaderfetch 前言 1、此功能类似于GTP一样一点一点的解析数据,不需要等到所有数据都返回才解析,这个是回来多少解析多少。 2、代码中的url是真实的URL,只是读取的是列表,所以流式的效果不是很明显&…

C++ priority_queue

一、简介 Priority Queue(优先队列) 是一种常用的数据结构,它基于每个元素关联的优先级而组织元素,确保高优先级的元素先被处理。在实际应用中,优先队列常用于解决与优先级相关的问题,如任务调度、图算法等…

2312skia,16画布

创建SkCanvas 首先,阅读SkCanvasAPI概述. Skia有多个接收SkCanvas绘图命令的后端.每个后端都有创建SkCanvas的独特方式.本页给出了每个示例: 光栅化 光栅化后端将绘画到可由Skia或客户管理的内存块. 推荐用管理画布命令要绘画内存对象的SkSurface为Raster和Ganesh后端创建画…

用CHAT如何写教研室工作总结?

问CHAT:写一份教研室工作总结 CHAT回复:以下是一个教研室工作总结的大纳,具体内容需要根据你们教研室的实际情况进行填充和修改。 教研室XXXX年度工作总结 1. 引言:简要介绍本年度工作总结的目的和主题。 2. 教育教学工作&…

Java核心知识点整理大全24-笔记

目录 22. 数据结构 22.1.1. 栈(stack) 22.1.2. 队列(queue) 22.1.3. 链表(Link) 22.1.4. 散列表(Hash Table) 22.1.5. 排序二叉树 22.1.5.1. 插入操作 22.1.5.2. 删除操作 2…

知识点滴 - 什么是半透膜和渗透压

半透膜和渗透作用 1748年的一天,法国物理学家诺勒为了改进酒的制作水平,设计了这样一个试验:在一个玻璃圆筒中装满酒精,用猪膀胱封住,然后把圆筒全部浸在水中。当他正要做下一步的工作时,突然发现&#xff…

DDOS攻击为何永不过时?

文章目录 一、DOS二、DDOS三、如何防范DDOS 1.可以过滤IP地址2.增加设备3.在骨干节点配置防火墙4.开启过滤5.配置DNS抗攻击6.白帽团队 四、白帽子 为什么二十年前中国红客们就在用的DDOS攻击直到现在还依然是黑客们最爱的攻击方法?二十年前的攻击技术为什么还不过…

Day12——集合

1.集合 在内存层面需要针对于多个数据进行存储。此时可以考虑的容器有:数组、集合类。 数组存储多个数据方面的特点: 数组一旦初始化,其长度就是确定的。数组中的多个元素是依次紧密排列的,有序的,可重复的。数组一…

mysql数据库常见函数(时间函数)

一、mysql日期函数 ADDDATE(d,n) ; 计算起始日期 d 加上 n 天的日期 代码如下(示例): SELECT ADDDATE("2023-11-11", INTERVAL 31 DAY); ->2023-12-12ADDTIME(t,n); n 是一个时间表达式,时间…

基于Java SSM框架+Vue实现教学视频点播网站项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架Vue实现教学视频点播网站演示 摘要 随着现在网络的快速发展,网上管理系统也逐渐快速发展起来,网上管理模式很快融入到了许多学院的之中,随之就产生了“视频点播系统”,这样就让视频点播系统更加方便简单。 对于…

Java 学习之多态

多态的概念 多态 晚绑定。 所谓多态,就是父类型的引用可以指向子类型的对象,或者接口类型的引用可以指向实现该接口的类的实例。 不要把函数重载理解为多态。因为多态是一种运行期的行为,不是编译期的行为。 多态:父类型的引用可…

java源码-Java方法的定义和使用详解

1、 方法定义 如果我们想定义一个方法,基本语法如下: 修饰符:方法的修饰符是可选的,用于定义该方法的访问类型,可用的修饰符包括public/private/protected/默认的。 返回值:方法可以有返回值,…

线程中出现异常的处理

目录 前言 正文 1.线程出现异常的默认行为 2.使用 setUncaughtExceptionHandler() 方法进行异常处理 3.使用 setDefaultUncaughtExceptionHandler() 方法进行异常处理 4.线程组内处理异常 5.线程异常处理的优先性 总结 前言 在紧密交织的多线程环境中,异…

解决:ValueError: binary mode doesn‘t take an encoding argument

解决:ValueError: binary mode doesn‘t take an encoding argument 文章目录 解决:ValueError: binary mode doesn‘t take an encoding argument背景报错问题报错翻译报错位置代码报错原因解决方法方法一方法二今天的分享就到此结束了 背景 在使用之前…

USART的PAL库编程

USART驱动的工作原理 总结一下我们之前使用中断的方式来进行数据的发送和接收 如果收到数据数据在RDR寄存器中 RXNE标志位就从0到1触发中断 进入中断服务函数 把数据缓存在队列中 然后在到进程函数中断接收数据函数中进行出队处理 发送数据就是把中断关闭(标志位TXE…

日志模块Loguru

安装 Loguru 仅支持 Python 3.5 及以上的版本,使用 pip 安装即可: pip install loguru开箱即用 Loguru 的主要概念是只有一个:logger from loguru import loggerlogger.info("This is log info!") logger.warning("This i…

Python----网络爬虫

目录 1.Robots排除协议 2.request库的使用 3.beautifulsoup4库的使用 Python网络爬虫应用一般分为两部: (1)通过网络连接获取网页内容 (2)对获得的网页内容进行处理 - 这两个步骤分别使用不同的函数库:requests …

[Shell]获取Linux操作系统的发行版本

Linux命令uname -a输出分割成数组 # 将 uname -a 的输出分割成数组 IFS" " read -ra INFO <<< "$(uname -a)"# 打印数组中的各个元素 echo "System Name: ${INFO[0]}" echo "Node Name: ${INFO[1]}" echo "Kernel Vers…

食物相关的深度学习数据集合集—食物、饮料、肉类、餐具等数据集

最近收集了一大波与食物酒水相关的数据集&#xff0c;包含食物、饮料、肉类、餐具等不同等类型的数据集&#xff0c;废话不多说&#xff0c;给大家逐一介绍&#xff01;&#xff01; 1、自制啤酒配方数据库 超过20万自制啤酒配方数据库&#xff0c;数据集包含不同精酿啤酒的名…