Zynq GTX全网最细讲解,aurora 8b/10b编解码,OV5640摄像头视频传输,提供2套工程源码和技术支持

news2024/11/16 9:45:52

目录

  • 1、前言
    • 免责声明
  • 2、我这里已有的 GT 高速接口解决方案
  • 3、GTX 全网最细解读
    • GTX 基本结构
    • GTX 发送和接收处理流程
    • GTX 的参考时钟
    • GTX 发送接口
    • GTX 接收接口
    • GTX IP核调用和使用
  • 4、设计思路框架
    • 视频源选择
    • OV5640摄像头配置及采集
    • 动态彩条
    • 视频数据组包
    • GTX aurora 8b/10b
    • 数据对齐
    • 视频数据解包
    • 图像缓存
    • 视频输出
  • 5、vivado工程1-->2路SFP传输
    • PL FPGA 端设计
    • PS 端 SDK 端设计
  • 6、vivado工程2-->1路SFP传输
    • PL FPGA 端设计
    • PS 端 SDK 端设计
  • 7、上板调试验证
    • 光纤连接
    • 静态演示
    • 动态演示
  • 8、福利:工程代码的获取

1、前言

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

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

免责声明

本工程及其源码即有自己写的一部分,也有网络公开渠道获取的一部分(包括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、GTX 全网最细解读

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

GTX 基本结构

Xilinx 以 Quad 来对串行高速收发器进行分组,四个串行高速收发器和一个 COMMOM(QPLL)组成一个 Quad,每一个串行高速收发器称为一个 Channel(通道),下图为四路 GTX 收发器在Kintex7 FPGA 芯片中的示意图:《ug476_7Series_Transceivers》第24页;
在这里插入图片描述
GTX 的具体内部逻辑框图如下所示,它由四个收发器通道 GTXE2_CHANNEL原语 和一个GTXE2_COMMON 原语组成。每路GTXE2_CHANNEL包含发送电路 TX 和接收电路 RX,GTXE2_CHANNEL的时钟可以来自于CPLL或者QPLL,可在IP配置界面里配置;《ug476_7Series_Transceivers》第25页;
在这里插入图片描述

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

GTX 发送和接收处理流程

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

GTX 的参考时钟

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

GTX 发送接口

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

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

GTX 接收接口

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

GTX IP核调用和使用

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

4、设计思路框架

本博客提供2套vivado工程源码,2套工程的不同点在于使用1个SFP光口做收发还是两个2个SFP光口做收发;使用1个SFP光口做收发是用光纤连接SFP的RX和TX;使用2个SFP光口做收发是用光纤连接一个SFP的RX和另一个SFP的TX;设计思路框架分别如下:
使用2个SFP光口框图如下:
在这里插入图片描述
使用1个SFP光口框图如下:
在这里插入图片描述

视频源选择

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

OV5640摄像头配置及采集

OV5640摄像头需要i2c配置才能使用,需要将DVP接口的视频数据采集为RGB565或者RGB888格式的视频数据,这两部分均用verilog代码模块实现,代码位置如下:
在这里插入图片描述
其中摄像头配置为分辨率1280x720,如下:
在这里插入图片描述
摄像头采集模块支持RGB565和RGB888格式的视频输出,可由参数配置,如下:
在这里插入图片描述
RGB_TYPE=0输出本RGB565格式;
RGB_TYPE=1输出本RGB888格式;
设计选择RGB565格式;

动态彩条

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

视频数据组包

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

GTX aurora 8b/10b

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

数据对齐

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

视频数据解包

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

图像缓存

这里我用到了Zynq7100开发板,有别于全网其他博主的套路,他们基本都是用以VDMA为核心的图像缓存架构,这样做固然是可以的,但这一大堆IP你看不到源码,且用起来很烦,哪一个脚连错了都可能导致IP工作不起来,而且这些IP还需要用SDK配置,对于没有嵌入式C编程基础的兄弟而言很是头疼,我事儿仰望星空,我们就像快乐的玩儿一玩儿FPGA为什么就这么难呢?
就目前而言,VDMA有如下不便之处:

1:需要将视频转为AXI4-Stream流,无论是自己用fifo转还是使用官方的Video In to AXI4-Stream IP转,无疑都增加了资源消耗,对资源紧张的FPGA不宜,再者也加大了FPGA开发难度,对于刚入门的兄弟而言望而却步,最后,Video In to AXI4-Stream这个 IP也是个黑箱,出了问题排查问题太繁琐;
2:需要SDK配置,跑个VDMA还要打开SDK去调用官方库函数进行一大堆配置,无疑是烦,加之有些做硬件的兄弟c语言水平跟我一样菜,根本就搞不定嵌入式C,只想安安心心地干点儿FPGA的活儿就这么难吗?哈哈。。。
3:VDMA输出还要调用Video Time Controller和AXI4-Stream to Video Out这两个IP才能实现AXI4-Stream视频流到VGA时序的转换,实属费力又不讨好,还是同样的问题,增加资源消耗,黑箱操作,出了问题排查太繁琐;

基于此,我用zynq做图像缓存时就不用VDMA,而是用FDMA,在zynq中用FDMA取代VDMA具有以下优势:

1:不需要将输入视频转为AXI4-Stream流;节约资源,开发难度低;
2:不需要SDK配置,不要要会嵌入式C,纯FPGA开发者的福音;
3:看得到的源码,不存在黑箱操作问题;

关于如何在zynq中使用FDMA,请参考我之前的博客,博客地址:点击直接前往

视频输出

视频从FDMA读出后,经过VGA时序模块和HDMI发送模块后输出显示器,代码位置如下:
在这里插入图片描述
VGA时序配置为1280X720,HDMI发送模块采用verilog代码手写,可以用于FPGA的HDMI发送应用,关于这个模块,请参考我之前的博客,博客地址:点击直接前往

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

PL FPGA 端设计

开发板FPGA型号:Xilinx–Zynq7100–xc7z100ffg900-2;
开发环境:Vivado2019.1;
输入:ov5640摄像头或者动态彩条,分辨率1280x720@60Hz;
输出:HDMI显示器;
应用:2路SFP光口GTX aurora 8b/10b编解码视频传输;
工程Block Design如下:
在这里插入图片描述
工程代码架构如下:
在这里插入图片描述
综合编译完成后的FPGA资源消耗和功耗预估如下:
在这里插入图片描述

PS 端 SDK 端设计

由于没有了VDMA那一堆需要配置的IP,SDK只需要做OV5640的i2c软件配置即可,SDK代码架构如下:
在这里插入图片描述
这样一来SDK主函数就变得特别精简,如下:
在这里插入图片描述

6、vivado工程2–>1路SFP传输

PL FPGA 端设计

开发板FPGA型号:Xilinx–Zynq7100–xc7z100ffg900-2;
开发环境:Vivado2019.1;
输入:ov5640摄像头或者动态彩条,分辨率1280x720@60Hz;
输出:HDMI显示器;
应用:1路SFP光口GTX aurora 8b/10b编解码视频传输;
工程Block Design如下:
在这里插入图片描述
工程代码架构如下:
在这里插入图片描述
综合编译完成后的FPGA资源消耗和功耗预估如下:
在这里插入图片描述

PS 端 SDK 端设计

由于没有了VDMA那一堆需要配置的IP,SDK只需要做OV5640的i2c软件配置即可,SDK代码架构如下:
在这里插入图片描述
这样一来SDK主函数就变得特别精简,如下:
在这里插入图片描述

7、上板调试验证

光纤连接

工程1:2路SFP传输的光纤接法如下:
在这里插入图片描述
工程2:1路SFP传输的光纤接法如下:
在这里插入图片描述

静态演示

下面以工程1:2路SFP传输为例展示OV5640摄像头输出效果:
当GTX运行5G线速率时输出如下:
在这里插入图片描述
下面以工程1:2路SFP传输为例展示动态彩条输出效果:
当GTX运行5G线速率时输出如下:
在这里插入图片描述

动态演示

下面以工程1:2路SFP传输为例展示OV5640摄像头输出效果演示视频:

Zynq7100-GTX-OV5640


下面以工程1:2路SFP传输为例展示动态彩条输出效果演示视频:

Zynq7100-GTX-COLOR

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

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

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

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

相关文章

INSTANCE 2022数据集

论文链接:https://arxiv.org/abs/2301.03281 数据集链接:Home - Grand Challenge github baseline:GitHub - PerceptionComputingLab/INSTANCE2022: Official repository of MICCAI 2022 INSTANCE challenge 数据集得自己填表申请 比赛是…

gdb基本使用快捷键

gdb 1. gdb简介2.基本命令2.1 进入/退出2.2 基本使用2.3 执行语句2.4 查看变量2.5 禁用/启用断点 1. gdb简介 gdb是Linux下的代码调试工具。 程序的发布有debug模式和release模式,Linux的gcc/g模式,默认是release模式。若想在Linux下调试,程…

生活类书单视频如何做?几个步骤轻松拿捏

生活类书单视频是一种很受欢迎的内容形式,它可以帮助观众了解各种生活类书籍,并提供一些有用的信息。在制作生活类书单视频时,我们需要注意几个步骤,以确保视频内容的质量和专业性。 首先,我们需要选择适合的书单背景。…

华为数通方向HCIP-DataCom H12-821题库(拖拽题,知识点总结)

以下是我在现有题库中整理的需要重点关注的考点内容,如有遗漏小伙伴可以留言补充。 VRRP双机热备份: 主备AC两个独立的IP地址,通过VRRP对外虚拟为同一个IP地址,单个AP和虚拟IP建立一条CAPWAP链路。主AC备份AP信息、STA信息和CAPWA…

关于三维模型OBJ格式轻量化压缩必要性探讨

关于三维模型OBJ格式轻量化压缩必要性探讨 三维模型的OBJ格式轻量化压缩在当前的计算机图形学和虚拟现实应用中具有重要的必要性。以下是对三维模型OBJ格式轻量化压缩必要性的分析: 1、提高加载和传输效率:随着三维模型的复杂性不断增加,原始…

【day10】驱动

作业&#xff1a; 基于platform实现 添加设备树节点 irq_led{ compatible “hqyj,irq_led”; //用于获取节点 interrupt-parent <&gpiof>; //引用父节点 interrupts <9 0>; //这个节点引入的中断管脚 led1<&gpioe 10 0>; }; 1.驱动端 #include…

火狐浏览器使用scss嵌套编写css无法识别问题

火狐浏览器使用scss嵌套编写css无法识别问题 版本&#xff1a; “node-sass”: “^4.14.1”, “sass-loader”: “^7.3.1”,vue版本&#xff1a; v2问题描述&#xff1a; 我的文件目录是这样的&#xff1a; 而在scss文件中我是这样书写的 .vue文件中 在火狐浏览器中 在谷…

基于Android的学生信息管理系统

基于Android的学生信息管理系统 一、系统介绍二、功能展示三、其他系统实现五.获取源码 一、系统介绍 项目名称&#xff1a;学生信息管理系统 主要技术&#xff1a;java、android 开发工具&#xff1a;Eclipse(ADT) 运行工具&#xff1a;只能使用Eclipse 数 据 库&#xf…

用于统计编码时长的Wakapi

本文应网友 suka 的要求折腾&#xff0c;但是否符合他得要求就不得而知了&#xff0c;因为老苏不是程序员&#xff0c;没有这方面的需求&#xff1b; 什么是 Wakatime &#xff1f; WakaTime 是一个可以统计你在不同语言、项目上写代码时长的工具。 它支持多种 IDE、编辑器。 它…

商汤科技半年报出炉:生成式AI商业化成果喜人,驱动四大业务飞跃

撰稿|行星 来源|贝多财经 8月28日&#xff0c;商汤科技&#xff08;HK:0020&#xff09;发布了2023年上半年业绩报告。从财务数据来看&#xff0c;商汤科技在2023年上半年业绩表现稳健&#xff0c;大模型和生成式AI推动各项业务板块取得长足进步。 一、生成式AI表现亮眼&…

Koa + Prisma 快速入门

10分钟掌握 Koa Prisma 实现数据库 CRUD 前言 Prisma 是号称下一代的 ORM 工具&#xff0c;同样是基于 TypeScript 实现&#xff0c;但是带来了很强的类型安全。 本文使用 Koa.js 搭建一个简单的 Web 服务&#xff0c;配合 MySQL 数据库&#xff0c;来演示如何通过 Prisma …

【100天精通python】Day47:python网络编程_Web编程

目录 1 网络编程与web编程 1.1 网络编程 1.2 web编程 2 Web开发概述 3 Web开发基础 3.1 HTTP协议 3.2 Web服务器 3.3 前端基础 3.4 静态服务器 3.5 前后端交互的基本原理 4 WSGI接口 4.1 CGI 简介 4.2 WSGI 简介 4.3 定义 WSGI 接口 4.4 运行 WSGI 服务 4.5…

面霸的自我修养-synchronized

今天是《面霸的自我修养》的第3弹&#xff0c;内容是Java并发编程中至关重要的关键字synchronized&#xff0c;作为面试中的“必考题”&#xff0c;这部分是你必须要充分准备的内容&#xff0c;接下来我们就一起一探究竟吧。 数据来源&#xff1a; 大部分来自于各机构&#x…

SpringWeb(SpringMVC)

目录 SpringWeb介绍 搭建 SpringWeb SpringWeb介绍 Spring Web是一个基于 Servlet API 构建的原始 web 框架&#xff0c;用于构建基于MVC模式的Web应用程序。在 web 层框架历经 Strust1&#xff0c;WebWork&#xff0c;Strust2 等诸多产品的历代更选 之后&#xff0c;目前业界普…

研发规范第九讲:通用类命名规范(重点)

研发规范第九讲&#xff1a;通用类命名规范&#xff08;重点&#xff09; 无规范不成方圆。我自己非常注重搭建项目结构的起步过程&#xff0c;应用命名规范、模块的划分、目录&#xff08;包&#xff09;的命名&#xff0c;我觉得非常重要&#xff0c;如果做的足够好&#xff…

聊聊大厂都怎么防止重复下单?

一、问题背景 最简单的&#xff1a;DB 事务。如创建订单时&#xff0c;同时往订单表、订单商品表插数据&#xff0c;这些 Insert 须在同一事务执行。 Order 服务调用 Pay 服务&#xff0c;刚好网络超时&#xff0c;然后 Order 服务开始重试机制&#xff0c;于是 Pay 服务对同一…

java八股文面试[多线程]——自旋锁

优点&#xff1a; 1. 自旋锁尽可能的减少线程的阻塞&#xff0c;这对于锁的竞争不激烈&#xff0c;且占用锁时间非常短的代码块来说性能能大幅度的提升&#xff0c;因为自旋的消耗会小于线程阻塞挂起再唤醒的操作的消耗 &#xff0c;这些操作会导致线程发生两次上下文切换&…

【Python自学笔记】Python好用的模块收集(持续更新...)

文章目录 日志模块钉钉机器人命令助手持续更新中,如果您有其他实用好用的模块欢迎留言...日志模块 写代码离不开日志,自定义一个理想的日志对于小白来说可能是一件很反锁的事情,就像我刚学习Python的时候自己写的一个自定义日志,为了解决这个痛点,今天就和大家分享一个可以…

Linux开发板下检查及配置串口(波特率/数据发送接收等)的操作

在linux开发板上如何设置和编辑串口波特率、开启指定的uart口? 下面演示常用的命令操作 1&#xff09;编辑开启指定串口的配置文件 ls -l /boot/uEnv/ sudo vim /boot/uEnv/xxx.txt 2&#xff09;检查串口是否开启成功 ls /dev/tty* 3&#xff09;查看串口波特率…

每天 26,315 美元罚款?交通安全局要求特斯拉提供 Autopilot数据

根据美国国家公路交通安全管理局&#xff08;NHTSA&#xff09;最近的特别命令&#xff0c;特斯拉公司被要求提供关于其自动驾驶功能Autopilot的相关信息。这一命令是继NHTSA于2021年8月启动初步评估后&#xff0c;在2022年6月升级为正式调查的一部分&#xff0c;NHTSA近期对特…