当前位置: 首页 > 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…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...