当前位置: 首页 > news >正文

AD9248驱动的简易示波器设计——FPGA学习笔记21

一、原理

        我们这里设计的是显示 1024 个波形数据点, 在绘制每一行的图像的时候, 比对每一个数据和 VS 的 Y 坐标是否相等, 如果相等就绘制这个波形点。 这样我们就能完成 1024 个波形点在整个屏幕的显示。

 二、乒乓操作

可见FPGA实现双口RAM的乒乓操作——FPGA学习笔记2_ram乒乓存储-CSDN博客

三、测试程序设计

 de:屏幕有效的画面显示

de_2:画中画波形绘制有效显示区域

`timescale 1ns / 1psmodule LCD(input           I_sysclk    ,   //系统时钟input           I_vid_clk   ,   //HDMIx1时钟input           I_vid_rstn  ,   //系统复位输入output          O_vid_hs    ,   //hs信号output          O_vid_vs    ,   //vs信号output          O_vid_de    ,   //视频数据有效信号output [23:0]   O_rgb           // RGB
);wire  [7:0]  O_wave1_data    ;
wire  [7:0]  O_wave2_data    ;
wire         O_vtc2_de       ;
wire         data_en         ;//例化VTC模块
VTC#
(.H_ActiveSize   (1280           )   ,   //视频时间参数,行视频信号,一行有效(需要显示的部分)像素所占的时钟数,一个时钟对应一个有效像素,设置320个像素.H_FrameSize    (1280+88+44+239 )   ,   //视频时间参数,行视频信号,一行视频信号总计占用的时钟数 .H_SyncStart    (1280+88        )   ,   //视频时间参数,行同步开始,即多少时钟数后开始产生行同步信号.H_SyncEnd      (1280+88+44     )   ,   //视频时间参数,行同步结束,即多少时钟数后停止产生行同步信号,之后就是行数据有效数据部分.V_ActiveSize   (720            )   ,   //视频时间参数,场视频信号,一帧图像所占用的有效(需要显示的部分)行数量,通常说的视频分辨率即H_ActiveSize*V_ActiveSize.V_FrameSize    (720+4+5+28     )   ,   //视频时间参数,场视频信号,一帧视频信号总计占用的行数量.V_SyncStart    (720+4          )   ,   //视频时间参数,场同步开始,即多少行数后开始产生场同步信号 .V_SyncEnd      (720+4+5        )   ,   //视频时间参数,场同步结束,即多少行数后停止产生场同步信号,之后就是场有效数据部分.H2_ActiveSize  (1024           )   ,.V2_ActiveSize  (256            )   
)
u_VTC
(.I_vtc_clk      (I_vid_clk      )   ,   //系统时钟.I_vtc_rstn     (I_vid_rstn     )   ,   //系统复位.O_vtc_vs       (O_vid_vs       )   ,   //图像的vs信号.O_vtc_hs       (O_vid_hs       )   ,   //图像的hs信号.O_vtc_de       (O_vid_de       )   ,	//de数据有效信号.I_vtc2_offset_x(128            )   ,   //相对屏幕原点,x轴偏移方向.I_vtc2_offset_y(200            )   ,	//相对屏幕原点,y轴偏移方向.O_vtc2_de      (O_vtc2_de      )       //
);//
wave u_wave
(.I_wave1_clk     (I_sysclk      )   ,   //波形一时钟.I_wave1_data    (O_wave1_data  )   ,   //波形一数据.I_wave1_data_de (data_en       )   ,   //波形一数据有效.I_wave2_clk     (I_sysclk      )   ,   //波形二时钟.I_wave2_data    (O_wave2_data  )   ,   //波形二数据.I_wave2_data_de (data_en       )   ,   //波形二数据有效
//VTC时序输入       .I_vtc_rstn      (I_vid_rstn    )   ,   //.I_vtc_clk       (I_vid_clk     )   ,   //.I_vtc_vs        (O_vid_vs      )   ,   //.I_vtc_de        (O_vtc2_de     )   ,   //      de_2//同步时序输出,以及像素输出        .O_vtc_vs        (              )   ,   //.O_vtc_de        (              )   ,   //.O_vtc_rgb       (O_rgb         )       //
);  //  
TPG u_TPG(  .I_sysclk        (I_sysclk      )   ,.I_rst_n         (I_vid_rstn    )   ,.O_wave1_data    (O_wave1_data  )   ,.O_wave2_data    (O_wave2_data  )   ,.data_en         (data_en       )   
);endmodule
`timescale 1ns / 1psmodule VTC#(
parameter H_ActiveSize  =   1280            ,       //视频时间参数,行视频信号,一行有效(需要显示的部分)像素所占的时钟数,一个时钟对应一个有效像素
parameter H_FrameSize   =   1280+88+44+239  ,       //视频时间参数,行视频信号,一行视频信号总计占用的时钟数
parameter H_SyncStart   =   1280+88         ,       //视频时间参数,行同步开始,即多少时钟数后开始产生行同步信号 
parameter H_SyncEnd     =   1280+88+44      ,       //视频时间参数,行同步结束,即多少时钟数后停止产生行同步信号,之后就是行有效数据部分parameter V_ActiveSize  =   720            ,       //视频时间参数,场视频信号,一帧图像所占用的有效(需要显示的部分)行数量,通常说的视频分辨率即H_ActiveSize*V_ActiveSize
parameter V_FrameSize   =   720+4+5+28     ,       //视频时间参数,场视频信号,一帧视频信号总计占用的行数量
parameter V_SyncStart   =   720+4          ,       //视频时间参数,场同步开始,即多少行数后开始产生场同步信号 
parameter V_SyncEnd     =   720+4+5        ,       //视频时间参数,场同步结束,即多少场数后停止产生场同步信号,之后就是场有效数据部分parameter H2_ActiveSize =   1024            ,       //波形显示H区域
parameter V2_ActiveSize =   256                      //波形显示V区域
)
(
input           I_vtc_rstn      ,       //系统复位
input			I_vtc_clk       ,       //系统时钟
output	reg		O_vtc_vs        ,       //场同步输出
output  reg     O_vtc_hs        ,       //行同步输出
output  reg     O_vtc_de        ,       //视频数据有效
input  [11:0]   I_vtc2_offset_x ,       //相对屏幕原点,x轴偏移方向
input  [11:0]   I_vtc2_offset_y ,	    //相对屏幕原点,y轴偏移方向
output  reg     O_vtc2_de               //
);reg [11:0]  hcnt     =  12'd0       ;   //视频水平方向,列计数器,寄存器
reg [11:0]  vcnt     =  12'd0       ;   //视频垂直方向,行计数器,寄存器   
reg [2 :0]  rst_cnt  =  3'd0        ;   //复位计数器,寄存器
wire        rst_sync =  rst_cnt[2]  ;   //同步复位//同步复位
always @(posedge I_vtc_clk or negedge I_vtc_rstn ) beginif (!I_vtc_rstn) beginrst_cnt <= 3'd0;end else if(rst_cnt[2] == 1'b0)beginrst_cnt <=  rst_cnt + 1'b1 ;end
end//视频水平方向,列计数器
always @(posedge I_vtc_clk) beginif (rst_sync == 1'b0) beginhcnt <= 12'd0;end else if(hcnt < (H_FrameSize - 1'b1))beginhcnt <= hcnt + 1'b1;endelse beginhcnt <= 12'd0;end
end//视频垂直方向,行计数器
always @(posedge I_vtc_clk) beginif (rst_sync == 1'b0) beginvcnt <= 12'd0;end else if(hcnt == (H_FrameSize - 1'b1))beginif (vcnt == (V_FrameSize - 1'b1)) beginvcnt <= 12'd0;end else beginvcnt <= vcnt + 1'b1;    endend
endwire hs_valid  =  hcnt < H_ActiveSize                                                   ;   //行信号有效像素部分
wire vs_valid  =  vcnt < V_ActiveSize                                                   ;   //场信号有效像素部分
wire vtc_hs    =  (hcnt >= H_SyncStart && hcnt < H_SyncEnd)                             ;   //产生hs,行同步信号
wire vtc_vs	   =  (vcnt > V_SyncStart && vcnt <= V_SyncEnd)                             ;   //产生vs,场同步信号      
wire vtc_de    =  hs_valid && vs_valid                                                  ;   //只有当视频水平方向,列有效和视频垂直方向,行同时有效,视频数据部分才是有效wire hs2_valid =  (hcnt >= I_vtc2_offset_x && hcnt < I_vtc2_offset_x + H2_ActiveSize)   ;
wire vs2_valid =  (vcnt >= I_vtc2_offset_y && vcnt < I_vtc2_offset_y + V2_ActiveSize)   ;
wire vtc2_de   =  hs2_valid && vs2_valid                                                ;//完一次寄存打拍输出, 有利于改善时序, 尤其对于高分辨率, 高速的信号, 打拍可以改善内部时序, 以运行于更高速度
always @(posedge I_vtc_clk)beginif(rst_sync == 1'b0)beginO_vtc_vs <= 1'b0;O_vtc_hs <= 1'b0;O_vtc_de <= 1'b0;O_vtc2_de <= 1'b0;endelse beginO_vtc_vs <= vtc_vs; //场同步信号打拍输出O_vtc_hs <= vtc_hs; //行同步信号打拍输出O_vtc_de <= vtc_de; //视频有效信号打拍输出O_vtc2_de <= vtc2_de; //画中画, 数据有效绘制信号end
endendmodule
`timescale 1ns / 1ps
//测试数据生成
module wave(input       I_wave1_clk         ,   //波形一时钟
input [7:0] I_wave1_data        ,   //波形一数据
input       I_wave1_data_de     ,   //波形一数据有效input       I_wave2_clk         ,   //波形二时钟
input [7:0] I_wave2_data        ,   //波形二数据
input       I_wave2_data_de     ,   //波形二数据有效//VTC时序输入   
input       I_vtc_rstn          ,   //
input       I_vtc_clk           ,   //
input       I_vtc_vs            ,   //
input       I_vtc_de            ,   //      de_2//同步时序输出,以及像素输出    
output      O_vtc_vs            ,   //
output      O_vtc_de            ,   //
output  reg [23:0]  O_vtc_rgb       //);reg [1 :0]   vtc_vs_r    ;
reg [1 :0]   vtc_de_r    ;
reg [11:0]   vcnt = 12'd0, hcnt = 12'd0 ; reg          grid_de     ;assign  O_vtc_vs    =   vtc_vs_r[0] ;
assign  O_vtc_de    =   vtc_de_r[0] ;//寄存,同步
always @(posedge I_vtc_clk ) beginvtc_vs_r <= {vtc_vs_r[0],I_vtc_vs}  ;vtc_de_r <= {vtc_de_r[0],I_vtc_de}  ;    
end//hcnt计数器
always @(posedge I_vtc_clk) beginif (hcnt == 12'd1023) beginhcnt <= 12'd0;end else if(vtc_de_r[0] && (hcnt != 12'd1023))beginhcnt <= hcnt + 1'b1;end
end//vcnt计数器
always @(posedge I_vtc_clk ) beginif (vtc_vs_r == 2'b01) beginvcnt <= 12'd0;end else if((vtc_de_r == 2'b10) && (vcnt != 12'd255))beginvcnt <= vcnt + 1'b1;end
end//栅格绘制
always @(posedge I_vtc_clk ) beginif ((hcnt[2:0]==7&&(vcnt[5:0]==63||vcnt == 0))||((hcnt[5:0]==63||hcnt==0)&&vcnt[2:0]==7)||(vcnt == 0&& hcnt==0)) begingrid_de <= O_vtc_de;end else begingrid_de <= 1'b0;    end
end//1--绘制波形曲线 1, 绿色点
//2--绘制波形曲线 2, 黄色点
//3--绘制栅格虚线, 白色点
//4--绘制背景色, 黑色
always @(posedge I_vtc_clk)begincasex({grid_de,wave2_pixel_en,wave1_pixel_en})3'bxx1:O_vtc_rgb <= {8'h00,8'hff,8'h00}; //wave1 信号显示像素颜色3'bx10:O_vtc_rgb <= {8'hff,8'hff,8'h00}; //wave2 信号显示像素颜色3'b100:O_vtc_rgb <= {8'h96,8'h96,8'h96}; //网格显示像素为白色点default:O_vtc_rgb <= {8'h00,8'h00,8'h00}; //黑色背景endcase
endwave_buf u_wave_buf1
(.I_wave_clk      (I_wave1_clk       ),   //写数据输入时钟, 和 ADC 采集时钟同步.I_wave_data     (I_wave1_data      ),   //写数据.I_wave_data_de  (I_wave1_data_de   ),   //写数据有效.I_vtc_clk       (I_vtc_clk         ),   //VTC 时序发生器时钟输入.I_vtc_rstn      (I_vtc_rstn        ),   //VTC 时序发生器复位.I_vtc_vs        (I_vtc_vs          ),   //VTC 时序发生器的 VS 同步信号输入.I_vtc_de_r      (vtc_de_r[0]       ),   //VTC 时序发生器的 de 有效区域输入.I_vtc_vcnt      (vcnt              ),   //vtc 的数据偏移, 主要对有符号数据进行调整.O_pixel_en      (wave1_pixel_en    )    //输出输出使能
);wave_buf u_wave_buf2
(.I_wave_clk      (I_wave2_clk       ),   //写数据输入时钟, 和 ADC 采集时钟同步.I_wave_data     (I_wave2_data      ),   //写数据.I_wave_data_de  (I_wave2_data_de   ),   //写数据有效.I_vtc_clk       (I_vtc_clk         ),   //VTC 时序发生器时钟输入.I_vtc_rstn      (I_vtc_rstn        ),   //VTC 时序发生器复位.I_vtc_vs        (I_vtc_vs          ),   //VTC 时序发生器的 VS 同步信号输入.I_vtc_de_r      (vtc_de_r[0]       ),   //VTC 时序发生器的 de 有效区域输入.I_vtc_vcnt      (vcnt              ),   //vtc 的数据偏移, 主要对有符号数据进行调整.O_pixel_en      (wave2_pixel_en    )    //输出输出使能
);endmodule
`timescale 1ns / 1ps
//实现乒乓
module wave_buf
(input           I_wave_clk      ,   //写数据输入时钟, 和 ADC 采集时钟同步input   [7 :0]  I_wave_data     ,   //写数据input           I_wave_data_de  ,   //写数据有效input           I_vtc_clk       ,   //VTC 时序发生器时钟输入input           I_vtc_rstn      ,   //VTC 时序发生器复位input           I_vtc_vs        ,   //VTC 时序发生器的 VS 同步信号输入input           I_vtc_de_r      ,   //VTC 时序发生器的 de 有效区域输入input   [7 :0]  I_vtc_vcnt      ,   //vtc 的数据偏移, 主要对有符号数据进行调整output          O_pixel_en          //输出输出使能
);//BRAM 简单双口 BRAM
reg     [9 :0]  addra = 0; //BRAM 通道 A 地址
//reg ena = 0; //BRAM 通道 A 使能
reg             wea     = 0         ;   //BRAM 通道 A 写使能
reg     [9 :0]  addrb   = 0         ;   //BRAM 通道 B 地址
reg             enb     = 0         ;   //BRAM 通道 B 读使能
reg     [0 :0]  WR_S,RD_S           ;   //写状态机, 读状态机
reg             buf_flag            ;   //buf_flag 用于乒乓地址缓存切换
reg             addr0_en            ;   //用于设置写第一个数据相对地址 0wire    [7 :0]  wave_data           ;   //写波形数据到 BRAM
reg     [3 :0]  async_vtc_vs = 0    ;   //同步信号//异步信号I_vtc_vs转同步信号
always @(posedge I_wave_clk ) beginasync_vtc_vs <= {async_vtc_vs [2:0] , I_vtc_vs};
end//绘制波形数据点使能, 绘制原理:
//当匹配到存储的 ADC 数据和正在扫描的 Y 坐标值一致就输出, 每个 X 坐标方向绘制 1 个波形点
assign O_pixel_en = I_vtc_de_r&(I_vtc_vcnt[7:0] == wave_data[7:0]);//写RAM状态机
always @(posedge I_wave_clk or negedge I_vtc_rstn ) beginif(!I_vtc_rstn)begin //复位重置所有寄存器addra       <= 10'd0    ;   //写RAM地址addr0_en    <= 1'b1     ;   //wea         <= 1'b0     ;   //写信号  0:停止    1:开始buf_flag    <= 1'b0     ;   //读写地址控制信号WR_S        <= 1'd0     ;   // end else begincase (WR_S)0:beginif (I_wave_data_de == 1'b1) beginif (addra == 1023) begin    //1024写完wea     <=  1'b0    ;   //停止写addra   <=  10'd0   ;addr0_en <= 1'b1    ;WR_S    <=  1'd1    ;end else beginwea     <=  1'b1    ;   //写使能addr0_en <= 1'b0    ; addra   <=  (addr0_en == 1'b0) ? (addra + 1'b1) : 0 ;   //相对地址递增  endend else beginwea <= 1'b0;endend1:begin //等待VTC时序通同步if(async_vtc_vs[3:2] == 2'b10) beginWR_S <= 1'd0;buf_flag <= !buf_flag;endenddefault: WR_S <= 1'd0   ;endcaseend
end//读状态机
always @(posedge I_vtc_clk or negedge I_vtc_rstn ) beginif (!I_vtc_rstn) beginaddrb   <=  10'd0   ;RD_S    <=  1'b0    ;end else begincase (RD_S)0:beginif (I_vtc_de_r == 1'b1) beginif (addrb == 1023) beginaddrb <= 0;RD_S  <= 1'd1;    end else beginaddrb <= addrb + 1'b1;endend end1:beginif (I_vtc_de_r == 1'b0) beginRD_S <= 1'd0;endenddefault: RD_S <=1'd0;endcase    end
endblk_mem_gen_0 u_blk_mem_gen_0 (.clka     (I_wave_clk         )   ,   //写时钟.wea      (wea                )   ,   // input wire [0 : 0]写使能.addra    ({buf_flag,addra}   )   ,   // input wire [10 : 0] 写地址.dina     (I_wave_data        )   ,   // input wire [7 : 0] 写数据.clkb     (I_vtc_clk          )   ,   // input wire 读时钟.addrb    ({!buf_flag,addrb}  )   ,   // input wire [10 : 0] 读地址.doutb    (wave_data          )       // output wire [7 : 0] 读数据
);endmodule
//使用buf_flag控制写入上半部分,还是下半部分
`timescale 1ns / 1psmodule TPG(
input               I_sysclk        ,
input               I_rst_n         ,
output  [7:0]       O_wave1_data    ,
output  [7:0]       O_wave2_data    ,
output              data_en         
);// localparam SYSCLK     = 100_000_000;
localparam t500ms_CNT = (50_000_000 - 1'b1);reg [25:0]  t500ms_cnt = 26'd0;wire        t500ms_en  = (t500ms_cnt == t500ms_CNT) ;always @(posedge I_sysclk ) beginif (!I_rst_n) begint500ms_cnt  <=   26'd0;end else if(t500ms_cnt == t500ms_CNT)begint500ms_cnt <=  26'd0;endelse begint500ms_cnt <= t500ms_cnt + 1'b1;end
endreg [1:0]   WAVE_S                  ; //写数据状态机
reg [9:0]   test_data   =   10'd0   ; //测试数据assign      O_wave1_data =  8'd255 - test_data[7:0];
assign      O_wave2_data =  test_data[7:0];assign      data_en = (WAVE_S == 0 || WAVE_S == 1);always @(posedge I_sysclk) beginif (!I_rst_n) beginWAVE_S <= 2'd2;test_data <= 10'd0;end else begincase (WAVE_S)0:beginif (test_data == 10'd255) beginWAVE_S <= 2'd1;endelse begintest_data <= test_data + 1'b1;endend1:beginif (test_data == 0) beginWAVE_S <=2'd2;end else begintest_data <= test_data - 1'b1;    endend 2:beginif (t500ms_en == 1'b1) beginWAVE_S <= 2'd0;endelse beginWAVE_S <= WAVE_S;endenddefault: WAVE_S <= 2'd0;endcaseend
endendmodule

四、下载验证

五、AD9248驱动的示波器

1、总体框图

2、AD9248芯片简介

3、采集模式

3.1非复合模式

3.2复合模式

3.3数据格式

4、引脚定义

。。。。。。没做出来。。。。。。。。。。。,驱动不起来,,,,,有时间再写,学ZYNQ去了

相关文章:

AD9248驱动的简易示波器设计——FPGA学习笔记21

一、原理 我们这里设计的是显示 1024 个波形数据点&#xff0c; 在绘制每一行的图像的时候&#xff0c; 比对每一个数据和 VS 的 Y 坐标是否相等&#xff0c; 如果相等就绘制这个波形点。 这样我们就能完成 1024 个波形点在整个屏幕的显示。 二、乒乓操作 可见FPGA实现双口RAM…...

微软十月补丁星期二发现了 118 个漏洞

微软将在2024 年 10 月补丁星期二解决 118 个漏洞&#xff0c;并且有证据表明发布的 5 个漏洞被野蛮利用和/或公开披露&#xff0c;尽管微软尚未将其中任何一个漏洞评定为严重漏洞。 在这五个漏洞中&#xff0c;微软列出了两个已被利用的漏洞&#xff0c;这两个漏洞现在都已列…...

到底是微服务,还是SOA?

引言&#xff1a;大概正式工作有5年了&#xff0c;换了三个大厂【也是真特么世道艰难&#xff0c;中国互联网人才饱和了】。基本上每个公司有的架构都不太相同&#xff0c;干过TOC和TOB的业务&#xff0c;但是大家用的架构都不太相同。有坚持ALL in one的SB&#xff0c;最后服务…...

JDK17常用新特性

目前国内大部分开发人员都是在使用jdk8&#xff0c;甚至是jdk6&#xff0c;但是随着jdk的更新迭代&#xff0c;jdk8我觉得可能就会慢慢的淡出舞台&#xff0c;随着目前主流框架最新版推出明确说明了不再支持jdk8&#xff0c;也促使我不得不抓紧学习了解一波jdk17的新特性&#…...

【分布式微服务云原生】探索负载均衡的艺术:深入理解与实践指南

探索负载均衡的艺术&#xff1a;深入理解与实践指南 摘要&#xff1a; 在本文中&#xff0c;我们将深入探讨负载均衡的概念、重要性以及实现负载均衡的多种算法。通过详细的技术解析、Java代码示例、流程图和对比表格&#xff0c;您将了解如何选择合适的负载均衡策略来优化资源…...

拥抱云原生

专题七&#xff1a;云原生实战72课时 专题简介&#xff1a; 云原生正在改变世界&#xff0c;新一代架构思想ServiceMesh、Serverless改变传统软件架构模式&#xff0c;本专题基于完全云上架构实战&#xff0c;结合微服务架构和云计算平台两者的优势&#xff0c;属于架构师必备…...

关于使用若依并快速构建系统的操作指南

准备阶段--下载源码&#xff08;脚手架&#xff09; 1.1 若依官网地址&#xff1a;https://www.ruoyi.vip/ 1.2 选择“前后端分离版本进行下载”&#xff0c;如下图所示 1.3 跳转gitee后&#xff0c;直接按如下步骤进行下载。 前后端模块分离 解压&#xff0c;并打开到项目…...

【分布式微服务云原生】 选择SOAP还是RESTful API?深入探讨与实践指南

&#x1f310; 选择SOAP还是RESTful API&#xff1f;深入探讨与实践指南 摘要&#xff1a; 在构建现代Web服务时&#xff0c;开发者常常面临一个关键决策&#xff1a;是选择SOAP还是RESTful API&#xff1f;本文将为您提供一个全面的比较&#xff0c;包括两者的适用场景、安全…...

HarmonyOS NEXT 应用开发实战(五、页面的生命周期及使用介绍)

HarmonyOS NEXT是华为推出的最新操作系统&#xff0c;arkUI是其提供的用户界面框架。arkUI的页面生命周期管理对于开发者来说非常重要&#xff0c;因为它涉及到页面的创建、显示、隐藏、销毁等各个阶段。以下是arkUI页面生命周期的介绍及使用举例。 页面的生命周期的作用 页面…...

C# 比较两个集合和比较对象

1、比较集合 /// <summary> /// 比较两个集合 /// </summary> /// <typeparam name"T"></typeparam> /// <param name"list1"></param> /// <param name"list2"></param> /// <returns>&…...

Spark高级用法-自定义函数

用户可以根据需求自己封装计算的逻辑&#xff0c;对字段数据进行计算 内置函数&#xff0c;是spark提供的对字段操作的方法 &#xff0c;split(字段) 对字段中的数进行切割&#xff0c;F.sum(字段) 会将该字段下的数据进行求和 实际业务中又能内置函数不满足计算需求&#xff0…...

『Mysql进阶』Mysql explain详解(五)

目录 Explain 介绍 Explain分析示例 explain中的列 1. id 列 2. select_type 列 3. table 列 4. partitions 列 5. type 列 6. possible_keys 列 7. key 列 8. key_len 列 9. ref 列 10. rows 列 11. filtered 列 12. Extra 列 Explain 介绍 EXPLAIN 语句提供有…...

【工具】音视频翻译工具基于Whisper+ChatGPT

OpenAI推出的开源语音识别工具Whisper&#xff0c;以其卓越的语音识别能力&#xff0c;在音频和视频文件处理领域大放异彩。与此同时&#xff0c;ChatGPT也在翻译领域崭露头角&#xff0c;其强大的翻译能力备受赞誉。因此&#xff0c;一些字幕制作团队敏锐地捕捉到了这两者的结…...

学成在线——关于nacos配置优先级的坑

出错&#xff1a; 本地要起两个微服务&#xff0c;一个是content-api&#xff0c;另一个是gateway网关服务。 发现通过网关服务请求content微服务时&#xff0c;怎么请求都请求不到。 配置如下&#xff1a; content-api-dev.yaml的配置&#xff1a; server:servlet:context-p…...

Nginx在Windows Server下的启动脚本

Nginx在Windows Server下的快捷运行脚本 使用时记得修改NGINX_DIR路径 ECHO OFF CHCP 65001 SET NGINX_DIRD:\software\Nginx\ color 0a TITLE Nginx Management GOTO MENU :MENU CLS ECHO. ECHO. * * * * Nginx Management * * * * * * * * * * * ECHO. * * EC…...

【国科大】C++程序设计秋季——五子棋

【国科大】C程序设计秋季 —— 五子棋程序 下载地址&#xff1a;https://mbd.pub/o/bread/Zp2Ukptx...

Docker 环境下多节点服务器监控实战:从 Prometheus 到 Grafana 的完整部署指南

Docker 环境下多节点服务器监控实战&#xff1a;从 Prometheus 到 Grafana 的完整部署指南 文章目录 Docker 环境下多节点服务器监控实战&#xff1a;从 Prometheus 到 Grafana 的完整部署指南一 多节点部署1 节点一2 节点二3 节点三 二 监控节点部署三 配置 prometheus.yml四 …...

【动手学深度学习】6.3 填充与步幅(个人向笔记)

卷积的输出形状取决于输入形状和卷积核的形状在应用连续的卷积后&#xff0c;我们最终得到的输出大小远小于输入大小&#xff0c;这是由于卷积核的宽度和高度通常大于1导致的比如&#xff0c;一个 240 240 240240 240240像素的图像&#xff0c;经过10层 5 5 55 55的卷积后&am…...

【宝可梦】游戏

pokemmo https://pokemmo.com/zh/ 写在最后&#xff1a;若本文章对您有帮助&#xff0c;请点个赞啦 ٩(๑•̀ω•́๑)۶...

docker启动的rabbitmq如何启动其SSL功能

docker run --hostname my-rabbit --name my-rabbit -p 5671:5671 -p 15671:15671 -p 15672:15672 -e RABBITMQ_DEFAULT_USERabc -e RABBITMQ_DEFAULT_PASSabc -d rabbitmq:4.0-management 使用docker的复制命令将ca.crt、server.crt和server.key文件复制到容器的/etc/server_s…...

易基因: cfMeDIP-seq揭示cfDNA甲基化高效区分原发性和转移性前列腺|Nat Commun

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 前列腺癌&#xff08;Prostate cancer&#xff0c;PCa&#xff09;是男性中第二常见的恶性肿瘤&#xff0c;也是全球癌症相关死亡的第三大原因。虽然大多数原发性前列腺癌可以治愈&#…...

CMake 教程跟做与翻译 4

目录 添加一个option! 添加一个option! option&#xff0c;正如其意&#xff0c;就是选项的意思。我们这里需要演示一下option的做法。 option对于大型的工程必然是非常常见的&#xff1a;一些模块会被要求编译&#xff0c;另一些客户不准备需要这些模块。option就是将这种需…...

MySQL面试题分享

慢日志&#xff08;了解&#xff09; 慢日志开启的变量&#xff1a;slow_query_logON; 如果值为 OFF ,那就是没有开启慢日志 耗时&#xff1a; long_query_time&#xff0c;默认是10秒 redis 和 mysql 慢日志的区别 redis 慢日志默认是没有开启的 mysql 慢日志默认是开启的…...

vue路由缓存问题

什么是路由缓存问题 解决方案&#xff1a; 让组件实例不再复用&#xff0c;强制销毁重建监听路由变化&#xff0c;变化之后执行数据更新操作 方法一 给 routerv-view 添加key属性&#xff0c;强制不添加缓存&#xff0c;破坏缓存&#xff0c;所以这个方法性能会比较差 <Ro…...

RabbitMQ中如何解决消息堆积问题,如何保证消息有序性

RabbitMQ中如何解决消息堆积问题 如何保证消息有序性 只需要让一个消息队列只对应一个消费者即可...

python爬虫案例——selenium爬取淘宝商品信息,实现翻页抓取(14)

文章目录 1、任务目标2、网页分析3、代码编写3.1 代码分析3.2 完整代码1、任务目标 目标网站:淘宝(https://www.taobao.com/) 任务要求:通过selenium实现自动化抓取 淘宝美食 板块下的所有商品信息,并实现翻页抓取,最后以csv格式将数据保存至本地;如: 2、网页分析 首先…...

在VSCode中使用Excalidraw

概述 Excalidraw是一款非常不错的示意图绘制软件&#xff0c;没想到在VSCode中有其扩展&#xff0c;可以在VScode中直接使用。 安装扩展 使用 需要创建.excalidraw.svg、.excalidraw或.excalidraw.png等名称的文件。 搭配手写版使用 自由画笔工具可以配合手写板&#xff0c…...

25中国投资中投笔试测评秋招校招SHL笔试题型分享

✅中投公司不必过多介绍&#xff0c;和建总都位于金融央企第一档&#xff0c;但是招人更少&#xff0c;竞争更为激烈&#xff0c;看公示录用名单都是清北的金融硕士&#xff0c;投资岗难度更大。 ✅中投公司的笔试往年都是shl系统&#xff0c;但考察范围非常广&#xff0c;包含…...

【LeetCode热题100】分治-快排

本篇博客记录分治快排的4道题目&#xff1a;颜色分类、排序数组、数组中的第K个最大元素、数组中最小的N个元素&#xff08;库存管理&#xff09;。 class Solution { public:void sortColors(vector<int>& nums) {int n nums.size();int left -1,right n;for(int…...

Docker 教程四 (Docker 镜像加速)

Docker 镜像加速 国内从 DockerHub 拉取镜像有时会遇到困难&#xff0c;此时可以配置镜像加速器。 目前国内 Docker 镜像源出现了一些问题&#xff0c;基本不能用了&#xff0c;后期能用我再更新下。* Docker 官方和国内很多云服务商都提供了国内加速器服务&#xff0c;例如…...