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

以太网实战AD采集上传上位机——FPGA学习笔记27

一、设计目标

使用FPGA实现AD模块驱动采集模拟电压,通过以太网上传到电脑上位机。

二、框架设计

数据位宽转换模块(ad_10bit_to_16bit):为了方便数据传输,数据位宽转换模块实现了将十位的 AD 数据转换成十六位,并且为了异步 FIFO 传输将高八位和低八位交换然后传输给数据封装模块。
开始传输模块(start_transfer_ctrl):该模块接收上位机发送的命令来判断是否开启传输以及使用那个通道传输。
数据封装模块(img_data_pkt):该模块调用异步 FIFO 将十六位的 AD 数据转换为传输给以太网部分的八位 UDP 数据,并且控制一包数据的大小和以太网 UDP 开始发送信号。


(1)开始传输模块 start_transfer_ctrl

module start_transfer_ctrl(input                 clk                ,   //时钟信号input                 rst_n              ,   //复位信号,低电平有效input                 udp_rec_pkt_done   ,   //UDP单包数据接收完成信号 input                 udp_rec_en         ,   //UDP接收的数据使能信号input        [7 :0]   udp_rec_data       ,   //UDP接收的数据 input        [15:0]   udp_rec_byte_num   ,   //UDP接收到的字节数   output  reg  [1:0]    ctrl               ,                                output  reg           transfer_flag          //图像开始传输标志,1:开始传输 0:停止传输    
);    //parameter define
parameter  START_1 = 8'd1;  //通道一开始命令
parameter  STOP    = 8'd0;  //停止命令
parameter  START_2 = 8'd2;  //通道二开始命令//解析接收到的数据
always @(posedge clk or negedge rst_n) beginif (!rst_n) begintransfer_flag   <=  1'b0;endelse if (udp_rec_pkt_done && udp_rec_byte_num == 1'b1)beginif (udp_rec_data == START_1) begintransfer_flag   <=  1'b1;ctrl            <=  2'b01;endelse if (udp_rec_data == START_2) begintransfer_flag   <=  1'b1;ctrl            <=  2'b10;end else if (udp_rec_data == STOP) begintransfer_flag   <=  1'b0;ctrl            <=  2'b00;end else begintransfer_flag   <=  1'b0;ctrl            <=  2'b00;endend 
endendmodule

(2)开始传输模块  start_transfer_ctrl

module ad_10bit_to_16bit(input                 clk       ,input                 rst_n     ,input       [1:0]     sel       ,//控制命令input       [9:0]     ad_in1    ,//通道一数据input       [9:0]     ad_in2    ,//通道二数据output  reg [15:0]    ad_out     //输出数据
);//wire define 
wire [9:0]s_ad_in1;
wire [9:0]s_ad_in2;//十位扩展为十六位	
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginad_out <= 16'd0;endelse if( sel == 2'b01) beginad_out<={6'd0,ad_in1};//这样补0为了适应上位机endelse if( sel == 2'b10) beginad_out<={6'd0,ad_in2};//endelse beginad_out <= 16'd0;end
endendmodule

(3)数据封装模块    img_data_pkt:

 

(4)UDP顶层修改

主要修改UDP顶层UDP协议接口,对ICMP以及ARP部分进行保留

module eth_top(input                   sys_rst_n           ,   //系统复位信号,低电平有效 input                   clk_200m            ,output                  gmii_rx_clk         ,output                  gmii_tx_clk         ,//PL以太网RGMII接口                     //inputinput                   eth_rxc             ,   //RGMII接收数据时钟input                   eth_rx_ctl          ,   //RGMII输入数据有效信号input       [3:0]       eth_rxd             ,   //RGMII输入数据//outputoutput                  eth_txc             ,   //RGMII发送数据时钟    output                  eth_tx_ctl          ,   //RGMII输出数据有效信号output      [3:0]       eth_txd             ,   //RGMII输出数据       //UDP接口input                   udp_tx_start_en     ,   //UDP发送开始使能信号 input       [7:0]       udp_tx_data         ,   //UDP待发送数据input       [15:0]      udp_tx_byte_num     ,   //UDP发送的有效字节数 单位:byte output                  udp_rec_pkt_done    ,   //UDP单包数据接收完成信号   output                  udp_tx_done         ,   //UDP发送完成信号 output                  udp_tx_req          ,   //UDP读数据请求信号output                  udp_rec_en          ,   //UDP接收的数据使能信号output      [7:0]       udp_rec_data        ,   //UDP接收的数据output      [15:0]      udp_rec_byte_num  	    //UDP接收的有效字节数 单位:byte);//parameter define
parameter  BOARD_MAC = 48'h00_11_22_33_44_55;       //开发板MAC地址     00-11-22-33-44-55
parameter  BOARD_IP  = {8'd192,8'd168,8'd1,8'd10};  //开发板IP地址      192.168.1.10
parameter  DES_MAC   = 48'hff_ff_ff_ff_ff_ff;       //目的MAC地址       ff_ff_ff_ff_ff_ff
parameter  DES_IP    = {8'd192,8'd168,8'd1,8'd102}; //目的IP地址        192.168.1.102     
parameter  IDELAY_VALUE = 15;                       //输入数据IO延时    (如果为n,表示延时n*78ps) //wire define
// wire                    clk_200m   		        ;   //用于IO延时的时钟 // wire                    gmii_rx_clk             ;   //GMII接收时钟
wire                    gmii_rx_dv              ;   //GMII接收数据有效信号
wire          [7:0]     gmii_rxd                ;   //GMII接收数据
// wire                    gmii_tx_clk             ;   //GMII发送时钟
wire                    gmii_tx_en              ;   //GMII发送数据使能信号
wire          [7:0]     gmii_txd                ;   //GMII发送数据     //ARP信号
wire                    arp_gmii_tx_en	        ;   //ARP GMII输出数据有效信号 
wire          [7:0]     arp_gmii_txd  	        ;   //ARP GMII输出数据
wire                    arp_rx_done   	        ;   //ARP接收完成信号
wire                    arp_rx_type   	        ;   //ARP接收类型 0:请求  1:应答
wire          [47:0]    src_mac       	        ;   //接收到目的MAC地址
wire          [31:0]    src_ip        	        ;   //接收到目的IP地址    
wire                    arp_tx_en     	        ;   //ARP发送使能信号
wire                    arp_tx_type   	        ;   //ARP发送类型 0:请求  1:应答
wire          [47:0]    des_mac       	        ;   //发送的目标MAC地址
wire          [31:0]    des_ip        	        ;   //发送的目标IP地址   
wire                    arp_tx_done   	        ;   //ARP发送完成信号//ICMP信号
wire                    icmp_gmii_tx_en	        ;   //ICMP GMII输出数据有效信号 
wire          [7:0]     icmp_gmii_txd  	        ;   //ICMP GMII输出数据
wire                    icmp_rec_pkt_done       ;   //ICMP单包数据接收完成信号
wire                    icmp_rec_en             ;   //ICMP接收的数据使能信号
wire          [ 7:0]    icmp_rec_data           ;   //ICMP接收的数据
wire          [15:0]    icmp_rec_byte_num       ;   //ICMP接收的有效字节数 单位:byte 
wire          [15:0]    icmp_tx_byte_num        ;   //ICMP发送的有效字节数 单位:byte 
wire                    icmp_tx_done   	        ;   //ICMP发送完成信号
wire                    icmp_tx_req             ;   //ICMP读数据请求信号
wire          [ 7:0]    icmp_tx_data            ;   //ICMP待发送数据
wire                    icmp_tx_start_en        ;   //ICMP发送开始使能信号//UDP信号
wire                    udp_gmii_tx_en	        ;   //UDP GMII输出数据有效信号 
wire          [7:0]     udp_gmii_txd  	        ;   //UDP GMII输出数据
// wire                    udp_rec_pkt_done  	        ;   //UDP单包数据接收完成信号
// wire                    udp_rec_en    	        ;   //UDP接收的数据使能信号
// wire          [ 7:0]    udp_rec_data  	        ;   //UDP接收的数据
// wire          [15:0]    udp_rec_byte_num  	        ;   //UDP接收的有效字节数 单位:byte 
// wire          [15:0]    udp_tx_byte_num   	    ;   //UDP发送的有效字节数 单位:byte 
// wire                    udp_tx_done   	        ;   //UDP发送完成信号
// wire                    udp_tx_req    	        ;   //UDP读数据请求信号
// wire          [ 7:0]    udp_tx_data   	        ;   //UDP待发送数据
// wire                    udp_tx_start_en   	    ;   //UDP发送开始使能信号wire          [7:0]	    rec_data			    ;   //FIFO写入数据
wire        		    rec_en			        ;   //FIFO写使能
wire        		    tx_req			        ;   //FIFO读使能
wire          [7:0]	    tx_data	    	        ;   //FIFO读出数据assign icmp_tx_start_en =   icmp_rec_pkt_done   ;   //ICMP 接收端结束标志,作为 ICMP发送端开始标志
assign icmp_tx_byte_num =   icmp_rec_byte_num   ;   //ICMP 接收端数据个数,作为 ICMP发送端发送数据 // assign udp_tx_start_en      =   udp_rec_pkt_done    ;   //UDP 接收端结束标志,作为 UDP发送开始使能信号
// assign udp_tx_byte_num      =   udp_rec_byte_num        ;   //UDP 接收端数据个数,作为 UDP发送端发送数据个数assign des_mac          =   src_mac             ;   //ARP 接收到的 源MAC,作为 ICMP\UDP 目的MAC,实际为电脑端MAC
assign des_ip           =   src_ip              ;   //ARP 接收到的 源IP ,作为 ICMP\UDP 目的IP ,实际为电脑端IP//数据位于异步FIFO之中,如需单独使用一侧功能,可以修改FIFO数据//需要注意写入有效数据数量要与此处相同,一定要注意 数据个数与FIFO读出数据对齐!!!!!!! // //MMCM/PLL 产生200Mhz时钟--> gmii2rgmii
// clk_wiz_0 u_clk_wiz_0
// (
//     .clk_out1           (clk_200m           ),      // output clk_out1
//     .reset              (~sys_rst_n         ),      // input reset
//     .locked             (locked             ),      // output locked
//     .clk_in1            (eth_rxc            )       // PHY侧提供eth_rxc时钟125Mhz
// );  //GMII接口转RGMII接口
gmii_to_rgmii 
#(.IDELAY_VALUE       (IDELAY_VALUE       )
)      
u_gmii_to_rgmii(        .idelay_clk         (clk_200m           ),      //IDELAY时钟//以太网GMII接口    .gmii_rx_clk        (gmii_rx_clk        ),      //GMII接收时钟.gmii_rx_dv         (gmii_rx_dv         ),      //GMII接收数据有效信号.gmii_rxd           (gmii_rxd           ),      //GMII接收数据.gmii_tx_clk        (gmii_tx_clk        ),      //GMII发送时钟.gmii_tx_en         (gmii_tx_en         ),      //GMII发送数据使能信号.gmii_txd           (gmii_txd           ),      //GMII发送数据   //以太网RGMII接口   .rgmii_rxc          (eth_rxc            ),      //RGMII接收时钟.rgmii_rx_ctl       (eth_rx_ctl         ),      //RGMII接收数据控制信号.rgmii_rxd          (eth_rxd            ),      //RGMII接收数据.rgmii_txc          (eth_txc            ),      //RGMII发送时钟    .rgmii_tx_ctl       (eth_tx_ctl         ),      //RGMII发送数据控制信号.rgmii_txd          (eth_txd            )       //RGMII发送数据   
);//ARP通信
arp                                             
#(.BOARD_MAC          (BOARD_MAC          ),      //参数例化.BOARD_IP           (BOARD_IP           ),.DES_MAC            (DES_MAC            ),.DES_IP             (DES_IP             )
)   
u_arp(  .rst_n              (sys_rst_n  	    ),      //复位信号,低电平有效//GMII接口  //input.gmii_rx_clk        (gmii_rx_clk	    ),      //GMII接收数据时钟.gmii_rx_dv         (gmii_rx_dv 	    ),      //GMII输入数据有效信号.gmii_rxd           (gmii_rxd   	    ),      //GMII输入数据.gmii_tx_clk        (gmii_tx_clk	    ),      //GMII发送数据时钟//output.gmii_tx_en         (arp_gmii_tx_en     ),      //GMII输出数据有效信号.gmii_txd           (arp_gmii_txd       ),      //GMII输出数据         //用户接口                           //output.arp_rx_done        (arp_rx_done	    ),      //ARP接收完成信号.arp_rx_type        (arp_rx_type	    ),      //ARP接收类型 0:请求  1:应答.src_mac            (src_mac    	    ),      //接收到目的MAC地址.src_ip             (src_ip     	    ),      //接收到目的IP地址 //input   .arp_tx_en          (arp_tx_en  	    ),      //ARP发送使能信号.arp_tx_type        (arp_tx_type	    ),      //ARP发送类型 0:请求  1:应答.des_mac            (des_mac    	    ),      //发送的目标MAC地址.des_ip             (des_ip     	    ),      //发送的目标IP地址//output.tx_done            (arp_tx_done	    )       //以太网发送完成信号    
);  //ICMP通信  
icmp                                             
#(.BOARD_MAC          (BOARD_MAC          ),      //参数例化.BOARD_IP           (BOARD_IP           ),.DES_MAC            (DES_MAC            ),.DES_IP             (DES_IP             )
)
u_icmp(.rst_n              (sys_rst_n   	    ),      //复位信号,低电平有效//GMII接口//input.gmii_rx_clk        (gmii_rx_clk 	    ),      //GMII接收数据时钟         .gmii_rx_dv         (gmii_rx_dv  	    ),      //GMII输入数据有效信号       .gmii_rxd           (gmii_rxd    	    ),      //GMII输入数据                 .gmii_tx_clk        (gmii_tx_clk 	    ),      //GMII发送数据时钟//output.gmii_tx_en         (icmp_gmii_tx_en	),      //GMII输出数据有效信号       .gmii_txd           (icmp_gmii_txd	    ),      //GMII输出数据//用户接口//output.rec_pkt_done       (icmp_rec_pkt_done  ),      //以太网单包数据接收完成信号  .rec_en             (icmp_rec_en        ), 	    //以太网接收的数据使能信号				  .rec_data           (icmp_rec_data      ),      //以太网接收的数据				 	    .rec_byte_num       (icmp_rec_byte_num  ),      //以太网接收的有效字节数 单位:byte   //input.tx_start_en        (icmp_tx_start_en   ),      //以太网开始发送信号      .tx_data            (icmp_tx_data       ),      //以太网待发送数据					     .tx_byte_num        (icmp_tx_byte_num   ),      //以太网发送的有效字节数 单位:byte.des_mac            (des_mac     	    ),      //发送的目标MAC地址.des_ip             (des_ip      	    ),      //发送的目标IP地址  //output.tx_done            (icmp_tx_done	    ),      //以太网发送完成信号      .tx_req             (icmp_tx_req        )       //读数据请求信号					     
); //UDP通信
udp                                             
#(.BOARD_MAC          (BOARD_MAC          ),      //参数例化.BOARD_IP           (BOARD_IP           ),.DES_MAC            (DES_MAC            ),.DES_IP             (DES_IP             )
)
u_udp(.rst_n              (sys_rst_n          ),      //复位信号,低电平有效//GMII接口//input.gmii_rx_clk        (gmii_rx_clk        ),      //GMII接收数据时钟 .gmii_rx_dv         (gmii_rx_dv         ),      //GMII输入数据有效信号.gmii_rxd           (gmii_rxd           ),      //GMII输入数据.gmii_tx_clk        (gmii_tx_clk        ),      //GMII发送数据时钟   //output .gmii_tx_en         (udp_gmii_tx_en     ),      //GMII输出数据有效信号.gmii_txd           (udp_gmii_txd       ),      //GMII输出数据 //用户接口//outpur.rec_pkt_done       (udp_rec_pkt_done   ),      //以太网单包数据接收完成信号 .rec_en             (udp_rec_en         ),      //以太网接收的数据使能信号.rec_data           (udp_rec_data       ),      //以太网接收的数据      .rec_byte_num       (udp_rec_byte_num   ),      //以太网接收的有效字节数 单位:byte      //input.tx_start_en        (udp_tx_start_en    ),      //以太网开始发送信号      .tx_data            (udp_tx_data        ),      //以太网待发送数据        .tx_byte_num        (udp_tx_byte_num    ),      //以太网发送的有效字节数 单位:byte      .des_mac            (des_mac            ),      //发送的目标MAC地址      .des_ip             (des_ip             ),      //发送的目标IP地址    //output .tx_done            (udp_tx_done        ),      //以太网发送完成信号 .tx_req             (udp_tx_req         )       //读数据请求信号   
); //异步FIFO,实际做同步FIFO使用
async_fifo_2048x8b u_async_fifo_2048x8b (//input.rst                (~sys_rst_n	        ),      //input wire rst.wr_clk             (gmii_rx_clk        ),  	//input wire wr_clk.rd_clk             (gmii_rx_clk        ),  	//input wire rd_clk.din                (rec_data	        ),      //input wire [7 : 0] din.wr_en              (rec_en		        ),    	//input wire wr_en.rd_en              (tx_req		        ),    	//input wire rd_en//output.dout               (tx_data	        ),      //output wire [7 : 0] dout.full               (                   ),      //output wire full.empty              (                   )    	//output wire empty
);// //预留调试ILA
// ila_0 ila_0_fifo (
// 	.clk                (gmii_rx_clk        ),      // input wire clk// 	.probe0             (rec_en             ),      // input wire [0:0]  probe0  
// 	.probe1             (rec_data           ),      // input wire [7:0]  probe1 
// 	.probe2             (tx_req             ),      // input wire [0:0]  probe2 
// 	.probe3             (tx_data            )       // input wire [7:0]  probe3
// );//以太网控制模块
eth_ctrl u_eth_ctrl(//input.clk            	(gmii_rx_clk	    ),      //时钟.rst_n          	(sys_rst_n		    ),      //系统复位信号,低电平有效 //ARP相关端口信号 //input.arp_rx_done    	(arp_rx_done   	    ),      //ARP接收完成信号.arp_rx_type    	(arp_rx_type   	    ),      //ARP接收类型 0:请求  1:应答.arp_tx_done    	(arp_tx_done   	    ),      //ARP发送完成信号.arp_gmii_tx_en 	(arp_gmii_tx_en	    ),      //ARP GMII输出数据有效信号 .arp_gmii_txd   	(arp_gmii_txd  	    ),      //ARP GMII输出数据//output.arp_tx_en      	(arp_tx_en     	    ),      //ARP发送使能信号.arp_tx_type    	(arp_tx_type   	    ),      //ARP发送类型 0:请求  1:应答//ICMP相关端口信号//input.icmp_tx_start_en	(icmp_tx_start_en   ),      //ICMP开始发送信号.icmp_tx_done		(icmp_tx_done	    ),      //ICMP发送完成信号.icmp_gmii_tx_en	(icmp_gmii_tx_en    ),      //ICMP GMII输出数据有效信号  .icmp_gmii_txd		(icmp_gmii_txd	    ),      //ICMP GMII输出数据 //ICMP fifo接口信号//input.icmp_rec_en       	(icmp_rec_en        ),      //ICMP接收的数据使能信号.icmp_rec_data     	(icmp_rec_data      ),      //ICMP接收的数据.icmp_tx_req       	(icmp_tx_req        ),      //ICMP读数据请求信号//output.icmp_tx_data      	(icmp_tx_data       ),      //ICMP待发送数据//UDP相关端口信号//input.udp_tx_start_en	(udp_tx_start_en   	),      //UDP开始发送信号.udp_tx_done    	(udp_tx_done   	    ),      //UDP发送完成信号    .udp_gmii_tx_en 	(udp_gmii_tx_en	    ),      //UDP GMII输出数据有效信号  .udp_gmii_txd   	(udp_gmii_txd  	    ),      //UDP GMII输出数据   //UDP fifo接口信号//input.udp_rec_data		(udp_rec_data       ),      //UDP接收的数据		--->      UDP要发送的数据.udp_rec_en			(udp_rec_en         ),      //UDP接收的数据使能信号     .udp_tx_req			(udp_tx_req         ),      //UDP读数据请求信号   //output .udp_tx_data		(                   ),      //UDP待发送数据		//fifo接口信号//output.rec_data			(rec_data	        ),      //待发送的数据	.rec_en	        	(rec_en	            ),      //读数据请求信号 .tx_req	        	(tx_req	            ),      //接收的数据使能信号//input.tx_data	    	(tx_data	        ),      //接收的数据//GMII发送引脚  //output.gmii_tx_en     	(gmii_tx_en    	    ),      //GMII输出数据有效信号 .gmii_txd       	(gmii_txd      	    )       //GMII输出数据 
);      endmodule

三、代码架构

四、下载测试

1、ping指令&ARP

2、UDP数据上报

正弦波

方波

三角波

多频音波

五、源码获取工程移植,请后台私信

相关文章:

以太网实战AD采集上传上位机——FPGA学习笔记27

一、设计目标 使用FPGA实现AD模块驱动采集模拟电压&#xff0c;通过以太网上传到电脑上位机。 二、框架设计 数据位宽转换模块&#xff08;ad_10bit_to_16bit&#xff09;&#xff1a;为了方便数据传输&#xff0c;数据位宽转换模块实现了将十位的 AD 数据转换成十六位&#…...

数据结构与算法整理复习(一):数据结构概念与线性表

目录 第一章&#xff1a;绪论 1.1 数据结构的基本概念 1.2 算法与算法评价 第二章&#xff1a;线性表 2.1 线性表的定义和基本操作 2.2 线性表的顺序表示&#xff08;顺序表&#xff09; 应用题 2.3 线性表的链式表达&#xff08;链表&#xff09; 2.3.1 单链表 2.3.2…...

虚幻商城 Fab 免费资产自动化入库

文章目录 一、背景二、实现效果展示三、实现自动化入库一、背景 上一次写了个这篇文章 虚幻商城 Quixel 免费资产一键入库,根据这个构想,便决定将范围扩大,使 Fab 商城的所有的免费资产自动化入库,是所有!所有! 上一篇文章是根据下图这部分资产一键入库: 而这篇文章则…...

TCP Window Full是怎么来的

wireshark查看包时&#xff0c;会看到TCP Window Full&#xff0c;总结下它的特点&#xff1a; 1. Sender会显示 TCP Window Full 2. “Sender已发出&#xff0c;但&#xff0c;Receiver尚未ack的字节”&#xff0c;即Sender的 bytes in flights 3. Sender的 bytes in fligh…...

高效建站指南:通过Portainer快速搭建自己的在线网站

文章目录 前言1. 安装Portainer1.1 访问Portainer Web界面 2. 使用Portainer创建Nginx容器3. 将Web静态站点实现公网访问4. 配置Web站点公网访问地址4.1公网访问Web站点 5. 固定Web静态站点公网地址6. 固定公网地址访问Web静态站点 前言 Portainer是一个开源的Docker轻量级可视…...

“UniApp的音频播放——点击视频进入空白+解决视频播放器切换视频时一直加载的问题”——video.js、video-js.css

今天&#xff0c;又解决了一个单子“UniApp的音频播放——点击视频进入空白解决视频播放器切换视频时一直加载的问题” 一、问题描述 在开发一个基于 video.js 的视频播放器时&#xff0c;用户通过上下滑动切换视频时&#xff0c;视频一直处于加载状态&#xff0c;无法正常播放…...

如何让openhands始终输出中文?

在本地创建一个文件./user_prompt.j2 添加一行 Always respond in 中文你可以直接&#xff1a; echo "Always respond in 中文" > ./user_prompt.j2使用官方文档的docker命令启动容器时-v挂载一个文件/app/openhands/agenthub/codeact_agent/prompts/user_promp…...

CSS 溢出问题及解决方案:实用案例与技巧

在网页开发中&#xff0c;CSS 的布局和样式起着至关重要的作用&#xff0c;但经常会遇到一个棘手的问题——溢出问题。溢出是指元素内的内容超出了其设定的容器大小&#xff0c;这不仅会影响页面的美观&#xff0c;还可能干扰用户体验。本文将详细探讨 CSS 溢出问题的案例&…...

vue3使用音频audio标签

文章目录 一、背景二、页面三、标签介绍四、代码五、代码说明场景1&#xff1a;针对加载固定格式的比如MP3文件&#xff0c;可直接使用\<audio>标签场景2&#xff1a;针对播放告警内容&#xff0c;比如中文或者英文词条情况 一、背景 项目使用vue3&#xff0c;需求针对告…...

【useCallback Hook】在多次渲染中缓存组件中的函数,避免重复创建函数

文章目录 什么是 useCallback&#xff1f;基本语法 为什么需要 useCallback&#xff1f;示例1. 避免子组件重复创建函数2. 作为 useEffect 的依赖项 注意事项总结 在 React 开发中&#xff0c;性能优化是一个重要的主题。随着应用规模的增长&#xff0c;组件的重新渲染可能会变…...

Vue2+OpenLayers添加缩放、滑块缩放、拾取坐标、鹰眼、全屏控件(提供Gitee源码)

目录 一、案例截图 二、安装OpenLayers库 三、代码实现 四、Gitee源码 一、案例截图 二、安装OpenLayers库 npm install ol 三、代码实现 废话不多说&#xff0c;直接给完整代码&#xff0c;替换成自己的KEY即可运行&#xff1a; <template><div><div i…...

feign调用跳过HTTPS的SSL证书校验配置详解

一、问题抛出 如果不配置跳过SSL证书校验&#xff0c;当Feign客户端尝试连接到一个使用自签名证书的服务器时&#xff0c;可能会抛出类似以下的异常&#xff1a; javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building faile…...

spring @EnableAspectJAutoProxy @Aspect的使用和源码流程

目录 测试代码EnableAspectJAutoProxyAspectJAutoProxyRegistrarAnnotationAwareAspectJAutoProxyCreatororg.springframework.context.support.AbstractApplicationContext#registerBeanPostProcessors 实例化AnnotationAwareAspectJAutoProxyCreator bean "a"的代理…...

项目实战--网页五子棋(游戏大厅)(3)

我们的游戏大厅界面主要需要包含两个功能&#xff0c;一是显示用户信息&#xff0c;二是匹配游戏按钮 1. 页面实现 hall.html <!DOCTYPE html> <html lang"ch"> <head><meta charset"UTF-8"><meta name"viewport"…...

『 实战项目 』Cloud Backup System - 云备份

文章目录 云备份项目服务端功能服务端功能模块划分客户端功能客户端模块划分 项目条件Jsoncpp第三方库Bundle第三方库httplib第三方库Request类Response类Server类Client类搭建简单服务器搭建简单客户端 服务端工具类实现 - 文件实用工具类服务器配置信息模块实现- 系统配置信息…...

【机器学习实战入门】使用OpenCV和Keras的驾驶员疲劳检测系统

嗜睡驾驶者警报系统 防止司机疲劳驾驶警报系统 中级 Python 项目 - 司机疲劳检测系统 疲劳检测是一种安全技术&#xff0c;能够预防因司机在驾驶过程中入睡而造成的事故。 本中级 Python 项目的目标是建立一个疲劳检测系统&#xff0c;该系统将检测到一个人的眼睛闭合了一段时…...

使用 spring boot 2.5.6 版本时缺少 jvm 配置项

2.5.6我正在使用带有版本和springfox-boot-starter版本的Spring Boot 项目3.0.0。我的项目还包括一个WebSecurityConfig扩展WebSecurityConfigurerAdapter并实现WebMvcConfigurer的类。但是&#xff0c;我面临的问题是指标在端点jvm_memory_usage_after_gc_percent中不可见/act…...

【强化学习】Soft Actor-Critic (SAC) 算法

&#x1f4e2;本篇文章是博主强化学习&#xff08;RL&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…...

2024年博客之星主题创作|Android 开发:前沿技术、跨领域融合与就业技能展望

目录 引言 一、推动 Android 应用创新的核心力量 1.1 人工智能与机器学习的崛起 1.2 增强现实&#xff08;AR&#xff09;与虚拟现实&#xff08;VR&#xff09;的应用扩展 1.3 5G技术的推动 1.4 跨平台开发技术的成熟 1.4.1 React Native 1.4.2 Flutter 1.4.3 Taro …...

Spring Boot--@PathVariable、@RequestParam、@RequestBody

目录 声明&#xff01;&#xff01; 什么是RESTful&#xff1f; RESTful 的基本原则 无状态性&#xff08;Stateless&#xff09; 统一接口&#xff08;Uniform Interface&#xff09; 分层系统&#xff08;Layered System&#xff09; 缓存&#xff08;Cacheable&#…...

网站HTTP改成HTTPS

您不仅需要知道如何将HTTP转换为HTTPS&#xff0c;还必须在不妨碍您的网站自成立以来建立的任何搜索排名权限的情况下进行切换。 为什么应该从HTTP转换为HTTPS&#xff1f; 与非安全HTTP于不同&#xff0c;安全域使用SSL&#xff08;安全套接字层&#xff09;服务器上的加密代…...

Spring Boot + Netty + WebSocket 实现消息推送

1、关于Netty Netty 是一个利用 Java 的高级网络的能力&#xff0c;隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。 2、Maven依赖 <dependencies><!-- https://mvnrepository.com/artifact/io.netty/netty-all --><dependency><gr…...

AI之HardWare:英伟达NvidiaGPU性价比排名(消费级/专业级/中高端企业级)以及据传英伟达Nvidia2025年将推出RTX 5090/5080、华为2025年推出910C/910D

AI之HardWare&#xff1a;英伟达NvidiaGPU性价比排名(消费级/专业级/中高端企业级)以及据传英伟达Nvidia2025年将推出RTX 5090/5080、华为2025年推出910C/910D 目录 英伟达NvidiaGPU性能排名(消费级/专业级/中高端企业级) NVIDIA中消费级和专业级 GPU NVIDIA中高端企业GPU …...

ESP32云开发二( http + led + lcd)

文章目录 前言先上效果图platformio.iniwokwi.tomldiagram.json源代码编译编译成功上传云端完结撒花⭐⭐⭐⭐⭐ 前言 阅读此篇前建议先看 此片熟悉下wokwi https://blog.csdn.net/qq_20330595/article/details/144289986 先上效果图 Column 1Column 2 platformio.ini wokwi…...

JavaScript语言的软件工程

JavaScript语言的软件工程 引言 在当今软件开发的浪潮中&#xff0c;JavaScript已不仅仅是一个简单的前端脚本语言。它的位置已经升华为全栈开发的重要语言之一&#xff0c;借助Node.js等技术&#xff0c;JavaScript不仅可以用于浏览器环境&#xff0c;还可以在后端服务器中运…...

【Qt】04-Lambda表达式

前言一、概念引入二、使用方法2.1 基本用法代码示例2.2 捕获外部变量2.3 参数列表 三、完整代码mywidget.cppsecondwidget.cppmywidget.hsecondwidget.h 总结 前言 一、概念引入 Lambda表达式&#xff08;Lambda Expressions&#xff09;是C11标准引入的一种匿名函数对象&…...

Golang 生态学习

1. Go 语言基础 在深入 Go 语言的生态之前&#xff0c;首先需要掌握 Go 语言本身的核心特性。 • Go 语言官方文档&#xff1a;https://golang.org/doc/ Go 官方文档是学习语言基础和标准库的首选资源。 • 学习内容&#xff1a; • 基础语法&#xff1a;数据类型、控制流…...

Arcgis Pro安装完成后启动失败的解决办法

场景 之前安装的Arcgis Pro 今天突然不能使用了&#xff0c;之前是可以使用的&#xff0c;自从系统更新了以后就出现了这个问题。 环境描述 Arcgis Pro 3.0 Windows 10 问题描述 打开Arcgis Pro&#xff0c;页面也不弹出来&#xff0c;打开任务管理器可以看到进程创建之后&…...

支持向量机SVM的应用案例

支持向量机&#xff08;Support Vector Machine,SVM&#xff09;是一种强大的监督学习算法&#xff0c;广泛应用于分类和回归任务。 基本原理 SVM的主要目标是周到一个最优的超平面&#xff0c;该超平面能够将不同类别的数据点尽可能分开&#xff0c;并且使离该超平面最近的数…...

Linux中的Iptables介绍

文章目录 iptables1. 概述2. **工作原理**3. 数据包处理流程与规则匹配顺序4. 常用的匹配条件5. 动作类型6. 基本命令7. 高级功能 iptables 1. 概述 Iptables 是一个用于配置 Linux 内核防火墙的用户空间工具。它能够对进出服务器的网络数据包进行过滤、修改和转发等操作&…...

14天学习微服务-->第2天:Spring Cloud深入与实践

第2天&#xff1a;Spring Cloud深入与实践 一、Spring Cloud核心组件深入 在微服务架构中&#xff0c;Spring Cloud 提供了一系列核心组件来支持服务的注册与发现、配置管理、负载均衡等功能。今天我们将深入学习其中的三个关键组件&#xff1a;Eureka/Nacos&#xff08;服务…...

使用 Box2D 库开发愤怒的小鸟游戏

使用 Box2D 库开发愤怒的小鸟游戏 Box2D 是一个开源的 2D 物理引擎&#xff0c;广泛应用于游戏开发中&#xff0c;特别是在模拟物体的运动、碰撞、重力等方面。在本文中&#xff0c;我们将利用 Box2D 库开发一个简化版的 愤怒的小鸟 游戏。我们将一步步展示如何实现物理引擎的…...

C# ComboBox 控件属性

ComboBox 的基本属性 在C#中&#xff0c;ComboBox控件具有多种属性&#xff0c;这些属性可以帮助开发者更好地控制和管理控件的各个方面。以下是一些基本的ComboBox属性及其功能&#xff1a; 公共属性 AccessibilityObject&#xff1a;获取分配给该控件的AccessibleObject。 Ac…...

《keras 3 内卷神经网络》

keras 3 内卷神经网络 作者&#xff1a;Aritra Roy Gosthipaty 创建日期&#xff1a;2021/07/25 最后修改时间&#xff1a;2021/07/25 描述&#xff1a;深入研究特定于位置和通道无关的“内卷”内核。 &#xff08;i&#xff09; 此示例使用 Keras 3 在 Colab 中查看 GitHub …...

Linux:文件描述符fd、系统调用open

目录 一、文件基础认识 二、C语言操作文件的接口 1.> 和 >> 2.理解“当前路径” 三、相关系统调用 1.open 2.文件描述符 3.一切皆文件 4.再次理解重定向 一、文件基础认识 文件 内容 属性。换句话说&#xff0c;如果在电脑上新建了一个空白文档&#xff0…...

ToDesk设置临时密码和安全密码都可以当做连接密码使用

ToDesk 在各领域办公都已经是非常常见了 为了安全 ToDesk 设置了连接密码&#xff0c;想连接 需要输入远程码和连接密码 我们刚打开 系统默认给我们用的是临时密码&#xff0c;安全性确实很强 和定时Tokey一样&#xff0c;固定时间切换。 但是 如果我们要经常连接这个电脑&a…...

C#防止重复提交

C#防止重复提交 文章目录 C#防止重复提交前言防止重复提交的思路Web API 防止重复提交代码实现代码讲解使用方法 MVC防止重复提交总结 前言 当用户在前端进行提交数据时&#xff0c;如果网络出现卡顿和前端没有给出响应的话顾客通常都会狂点提交按钮&#xff0c;这样就很容易导…...

递归算法学习v2.2

46. 全排列 class Solution {List<List<Integer>> ret;List<Integer> path;boolean[] check;public List<List<Integer>> permute(int[] nums) {ret new ArrayList<>();path new ArrayList<>();check new boolean[nums.length…...

unity插件Excel转换Proto插件-ExcelToProtobufferTool

unity插件Excel转换Proto插件-ExcelToProtobufferTool **ExcelToProtobufTool 插件文档****1. 插件概述****2. 默认配置类&#xff1a;DefaultIProtoPathConfig****属性说明** **3. 自定义配置类****定义规则****示例代码** **4. 使用方式****4.1 默认路径****4.2 自定义路径**…...

manim(manimgl)安装教学-win11(2024-08)

manim 目前的两种版本&#xff1a;★★ 稍微捋一捋【项目中的 readme.md 十分重要】 manimgl 是 Grant Sanderson&#xff08;YouTube频道 3Blue1Brown的作者&#xff09;等人开发。 现在为 manimgl&#xff0c;在维护中。 manimCE 是2020年后的 manim 分支 manim community e…...

【语言处理和机器学习】概述篇(基础小白入门篇)

前言 自学笔记&#xff0c;分享给语言学/语言教育学方向的&#xff0c;但对语言数据处理感兴趣但是尚未入门&#xff0c;却需要在论文中用到的小伙伴&#xff0c;欢迎大佬们补充或绕道。ps&#xff1a;本文不涉及公式讲解&#xff08;文科生小白友好体质&#xff09;&#xff…...

脚本工具:PYTHON

Python 是一种高级编程语言&#xff0c;以其简洁清晰的语法和强大的功能被广泛应用于各种领域&#xff0c;包括自动化脚本编写、数据分析、机器学习、Web开发等。以下是一些关于使用 Python 编写脚本工具的基本介绍、常用库以及一些实用技巧总结。 这里写目录标题 基础知识安装…...

一文讲解Redis常见使用方式

1. 单机模式部署 适用场景&#xff1a; • 开发和测试环境&#xff0c;或者对高可用性要求不高的小型项目。 部署步骤&#xff1a; 1. 拉取 Redis 镜像&#xff1a; docker pull redis:latest 2. 运行 Redis 容器&#xff1a; docker run -d --name redis-single -p 637…...

Gin 源码概览 - 路由

本文基于gin 1.1 源码解读 https://github.com/gin-gonic/gin/archive/refs/tags/v1.1.zip 1. 注册路由 我们先来看一段gin代码&#xff0c;来看看最终得到的一颗路由树长啥样 func TestGinDocExp(t *testing.T) {engine : gin.Default()engine.GET("/api/user", f…...

【计算机网络】传输层协议TCP与UDP

传输层 传输层位于OSI七层网络模型的第四层&#xff0c;主要负责端到端通信&#xff0c;可靠性保障&#xff08;TCP&#xff09;&#xff0c;流量控制(TCP)&#xff0c;拥塞控制(TCP)&#xff0c;数据分段与分组&#xff0c;多路复用与解复用等&#xff0c;通过TCP与UDP协议实现…...

iOS UIScrollView的一个特性

1如果UIScrollView 的contentSize.height > scrollView.bounds.size.height - scrollView.contentInset.top - scrollView.contentInset.bottom &#xff0c; 则scrollView就可以滚动&#xff0c;否则无法滚动 并且最大的滚动范围就是 contentSize.height - &#xff08; s…...

Docker 实现MySQL 主从复制

一、拉取镜像 docker pull mysql:5.7相关命令&#xff1a; 查看镜像&#xff1a;docker images 二、启动镜像 启动mysql01、02容器&#xff1a; docker run -d -p 3310:3306 -v /root/mysql/node-1/config:/etc/mysql/ -v /root/mysql/node-1/data:/var/lib/mysql -e MYS…...

python爬虫入门(实践)

python爬虫入门&#xff08;实践&#xff09; 一、对目标网站进行分析 二、博客爬取 获取博客所有h2标题的路由 确定目标&#xff0c;查看源码 代码实现 """ 获取博客所有h2标题的路由 """url "http://www.crazyant.net"import re…...

通过Ukey或者OTP动态口令实现windows安全登录

通过 安当SLA&#xff08;System Login Agent&#xff09;实现Windows安全登录认证&#xff0c;是一种基于双因素认证&#xff08;2FA&#xff09;的解决方案&#xff0c;旨在提升 Windows 系统的登录安全性。以下是详细的实现方法和步骤&#xff1a; 1. 安当SLA的核心功能 安…...

C 语言雏启:擘画代码乾坤,谛观编程奥宇之初瞰

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。* 这一课主要是让大家初步了解C语言&#xff0c;了解我们的开发环境&#xff0c;main函数&#xff0c;库…...