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

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...