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

本文主要是介绍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名片。
网盘资料如下:
在这里插入图片描述

这篇关于FPGA UltraScale GTH 全网最细讲解,aurora 8b/10b编解码,HDMI视频传输,提供2套工程源码和技术支持的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/453053

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显