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 个波形数据点, 在绘制每一行的图像的时候, 比对每一个数据和 VS 的 Y 坐标是否相等, 如果相等就绘制这个波形点。 这样我们就能完成 1024 个波形点在整个屏幕的显示。 二、乒乓操作 可见FPGA实现双口RAM…...
微软十月补丁星期二发现了 118 个漏洞
微软将在2024 年 10 月补丁星期二解决 118 个漏洞,并且有证据表明发布的 5 个漏洞被野蛮利用和/或公开披露,尽管微软尚未将其中任何一个漏洞评定为严重漏洞。 在这五个漏洞中,微软列出了两个已被利用的漏洞,这两个漏洞现在都已列…...
到底是微服务,还是SOA?
引言:大概正式工作有5年了,换了三个大厂【也是真特么世道艰难,中国互联网人才饱和了】。基本上每个公司有的架构都不太相同,干过TOC和TOB的业务,但是大家用的架构都不太相同。有坚持ALL in one的SB,最后服务…...
JDK17常用新特性
目前国内大部分开发人员都是在使用jdk8,甚至是jdk6,但是随着jdk的更新迭代,jdk8我觉得可能就会慢慢的淡出舞台,随着目前主流框架最新版推出明确说明了不再支持jdk8,也促使我不得不抓紧学习了解一波jdk17的新特性&#…...
【分布式微服务云原生】探索负载均衡的艺术:深入理解与实践指南
探索负载均衡的艺术:深入理解与实践指南 摘要: 在本文中,我们将深入探讨负载均衡的概念、重要性以及实现负载均衡的多种算法。通过详细的技术解析、Java代码示例、流程图和对比表格,您将了解如何选择合适的负载均衡策略来优化资源…...
拥抱云原生
专题七:云原生实战72课时 专题简介: 云原生正在改变世界,新一代架构思想ServiceMesh、Serverless改变传统软件架构模式,本专题基于完全云上架构实战,结合微服务架构和云计算平台两者的优势,属于架构师必备…...
关于使用若依并快速构建系统的操作指南
准备阶段--下载源码(脚手架) 1.1 若依官网地址:https://www.ruoyi.vip/ 1.2 选择“前后端分离版本进行下载”,如下图所示 1.3 跳转gitee后,直接按如下步骤进行下载。 前后端模块分离 解压,并打开到项目…...
【分布式微服务云原生】 选择SOAP还是RESTful API?深入探讨与实践指南
🌐 选择SOAP还是RESTful API?深入探讨与实践指南 摘要: 在构建现代Web服务时,开发者常常面临一个关键决策:是选择SOAP还是RESTful API?本文将为您提供一个全面的比较,包括两者的适用场景、安全…...
HarmonyOS NEXT 应用开发实战(五、页面的生命周期及使用介绍)
HarmonyOS NEXT是华为推出的最新操作系统,arkUI是其提供的用户界面框架。arkUI的页面生命周期管理对于开发者来说非常重要,因为它涉及到页面的创建、显示、隐藏、销毁等各个阶段。以下是arkUI页面生命周期的介绍及使用举例。 页面的生命周期的作用 页面…...
C# 比较两个集合和比较对象
1、比较集合 /// <summary> /// 比较两个集合 /// </summary> /// <typeparam name"T"></typeparam> /// <param name"list1"></param> /// <param name"list2"></param> /// <returns>&…...
Spark高级用法-自定义函数
用户可以根据需求自己封装计算的逻辑,对字段数据进行计算 内置函数,是spark提供的对字段操作的方法 ,split(字段) 对字段中的数进行切割,F.sum(字段) 会将该字段下的数据进行求和 实际业务中又能内置函数不满足计算需求࿰…...
『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,以其卓越的语音识别能力,在音频和视频文件处理领域大放异彩。与此同时,ChatGPT也在翻译领域崭露头角,其强大的翻译能力备受赞誉。因此,一些字幕制作团队敏锐地捕捉到了这两者的结…...
学成在线——关于nacos配置优先级的坑
出错: 本地要起两个微服务,一个是content-api,另一个是gateway网关服务。 发现通过网关服务请求content微服务时,怎么请求都请求不到。 配置如下: content-api-dev.yaml的配置: 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程序设计秋季 —— 五子棋程序 下载地址:https://mbd.pub/o/bread/Zp2Ukptx...
Docker 环境下多节点服务器监控实战:从 Prometheus 到 Grafana 的完整部署指南
Docker 环境下多节点服务器监控实战:从 Prometheus 到 Grafana 的完整部署指南 文章目录 Docker 环境下多节点服务器监控实战:从 Prometheus 到 Grafana 的完整部署指南一 多节点部署1 节点一2 节点二3 节点三 二 监控节点部署三 配置 prometheus.yml四 …...
【动手学深度学习】6.3 填充与步幅(个人向笔记)
卷积的输出形状取决于输入形状和卷积核的形状在应用连续的卷积后,我们最终得到的输出大小远小于输入大小,这是由于卷积核的宽度和高度通常大于1导致的比如,一个 240 240 240240 240240像素的图像,经过10层 5 5 55 55的卷积后&am…...
【宝可梦】游戏
pokemmo https://pokemmo.com/zh/ 写在最后:若本文章对您有帮助,请点个赞啦 ٩(๑•̀ω•́๑)۶...
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…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
