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

FPGA纯verilog代码实现4路视频缩放拼接 提供工程源码和技术支持

目录

  • 1、前言
  • 2、目前主流的FPGA图像缩放方案
  • 3、目前主流的FPGA视频拼接方案
  • 4、本设计方案的优越性
  • 5、详细设计方案解读
    • HDMI输入
    • 图像缩放
    • 图像缓存
    • VGA时序
    • HDMI输出
  • 6、vivado工程详解
  • 7、上板调试验证
  • 8、福利:工程源码获取

1、前言

本文详细描述了FPGA纯verilog代码实现4路视频缩放拼接的实现设计方案,工程代码编译通过后上板调试验证,文章末尾有演示视频,可直接项目移植,适用于在校学生、研究生,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像传输领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后。

2、目前主流的FPGA图像缩放方案

目前市面上主流的FPGA图像缩放方案如下:
1:Xilinx的HLS方案,该方案简单,易于实现,但只能用于Xilinx自家的FPGA;关于HLS实现图像缩放请,参考我之前写的文章HLS实现图像缩放点击查看:HLS图像缩放
2:非纯Verilog方案,大部分代码使用Verilog实现,但中间的fifo或ram等使用了IP,导致移植性变差,难以在Xilinx、Altera和国产FPGA之间自由移植;
3:纯Verilog方案,也就是本方案,一个字:牛逼!!!

3、目前主流的FPGA视频拼接方案

FPGA实现视频拼接是FPGA在图像处理领域的基本应用,如果你的视频是AXIS流,且你的开发板是K7或者zynq之类的高端处理器,可以使用Xilinx官方的video mixer实现视频拼接,关于video mixer实现视频拼接,可以参考我之前写的文章点击查看:video mixer实现视频拼接
但是,对于使用A7或者Spartan6之类的低端FPGA开发者来说,video mixer就不适用了,再者,video mixer必须是AXIS接口,对于vga时序或者摄像头rgb时序而言也不适用,必须用Xilinx的ip转为AXIS流,如此不仅麻烦且加大了逻辑资源消耗,这时,本文的纯verilog视频拼接方案就有用了。

4、本设计方案的优越性

一个字:牛逼,表现如下:
1:纯Verilog代码实现,学习性和阅读性达到天花板;
2:移植性达到天花板,Xilinx、Altera和国产FPGA之间自由移植;
3:算法达到天花板,融合了邻近插值和双线性插值两种算法;
4:实用性达到天花板,将图像缩放和图像拼接融合一体,符合实际的工程项目,做类似项目的兄弟可直接拿去用,一个月工资直接拿到手。。。

5、详细设计方案解读

详细设计方案框图如下:
在这里插入图片描述

HDMI输入

视频输入采用HDMI,分辨率为1920x1080,HDMI采用silicon9011芯片解码,silicon9011需要i2c配置才能使用,关于silicon9011芯片的配置和使用,请参考我之前写的文章点击查看:silicon9011
输入只有1路HDMI,为了模拟4路视频输入,直接将解码后的视频数据给到4路图像缩放模块。

图像缩放

本图像缩放模块将常用的双线性插值和邻域插值算法融合为一个代码中,通过输入参数选择某一种算法;代码使用纯verilog实现,没有任何ip,可在Xilinx、Intel、国产FPGA间任意移植;代码以ram和fifo为核心进行数据缓存和插值实现;
网上也有其他图像缩放例程代码,但大多使用了IP,导致在其他FPGA器件上移植变得困难,通用性不好;相比之下,本设计代码就具有通用性;
这里例化了4个图像缩放模块,将4路输入视频缩小至960x540;
关于图像缩放的详细设计说明,请参考我之前写的文章点击查看:图像缩放

图像缓存

使用FDMA方案实现图像三帧缓存,关于FDMA方案实现图像三帧缓存,请参考我之前写的文章点击查看:FDMA图像缓存

VGA时序

这部分很简单,不必多讲,就是生成一个1080P的VGA时序;

HDMI输出

视频输出采用HDMI,分辨率为1920x1080,HDMI采用silicon9134芯片编码,silicon9134需要i2c配置才能使用,关于silicon9134芯片的配置和使用,请参考我之前写的文章点击查看:silicon9134

6、vivado工程详解

工程BD如下:
在这里插入图片描述
综合后的代码架构如下:
在这里插入图片描述
FPGA资源消耗以及功耗预估如下:
在这里插入图片描述
顶层代码源码如下:

`timescale 1ns / 1ps
module top(  
//ddr3  output [14:0]DDR3_0_addr,output [2:0]DDR3_0_ba   ,output DDR3_0_cas_n     ,output [0:0]DDR3_0_ck_n ,output [0:0]DDR3_0_ck_p ,output [0:0]DDR3_0_cke  ,output [0:0]DDR3_0_cs_n ,output [3:0]DDR3_0_dm   ,inout [31:0]DDR3_0_dq   ,inout [3:0]DDR3_0_dqs_n ,inout [3:0]DDR3_0_dqs_p ,output [0:0]DDR3_0_odt  ,output DDR3_0_ras_n     ,output DDR3_0_reset_n   ,output DDR3_0_we_n      , input        CLK_IN1_D_0_clk_n,input        CLK_IN1_D_0_clk_p,output       ddr3_ok          ,  
//hdmi_inoutput       hdmi_in_nreset   ,     //9011/9013 resetinput        vin_clk          ,            //clock for 9111/9013input        vin_hs           ,             //horizontal synchronization for 9011/9013input        vin_vs           ,             //vertical synchronization for 9011/9013input        vin_de           ,             //data valid for 9011/9013input[23:0]  vin_data         ,           //data for 9011/9013   inout        hdmi_scl         ,           //HDMI I2C clockinout        hdmi_sda         ,           //HDMI I2C dataoutput       hdmi_nreset      ,        //9134 reset
//hdmi_out  output       vout_hs          ,            //horizontal synchronization for 9134output       vout_vs          ,            //vertical synchronization for 9134output       vout_de          ,            //data valid for 9134output       vout_clk         ,           //clock for 9134output[23:0] vout_data                   //data for 9134
);wire	    clk_200m  ;
wire        clk_hdmi  ;
wire        pll_resetn;
wire [0:0]  resetn;
wire        ud_r_0_ud_rclk;
wire [31:0] ud_r_0_ud_rdata;
wire        ud_r_0_ud_rde;
wire        ud_r_0_ud_rvs;
wire        ud_w_0_ud_wclk;
wire [31:0] ud_w_0_ud_wdata;
wire        ud_w_0_ud_wde;
wire        ud_w_0_ud_wvs;
wire [31:0] ud_w_1_ud_wdata;
wire        ud_w_1_ud_wde;
wire        ud_w_1_ud_wvs;
wire [31:0] ud_w_2_ud_wdata;
wire        ud_w_2_ud_wde;
wire        ud_w_2_ud_wvs;
wire [31:0] ud_w_3_ud_wdata;
wire        ud_w_3_ud_wde;
wire        ud_w_3_ud_wvs;
wire        ui_clk_100m;wire [9:0]   lut_index;
wire [31:0]  lut_data; wire [23:0] i_rgb;  
wire 	    o_hs ;  
wire 	    o_vs ;  
wire 	    o_de ;  
wire [23:0] o_rgb;  
wire hdmi_clk_rstn;
wire o_data_req;wire [23:0] resize0_rgb;    
wire 	    resize0_vs ;  
wire 	    resize0_de ;
wire [23:0] resize1_rgb;    
wire 	    resize1_vs ;  
wire 	    resize1_de ;
wire [23:0] resize2_rgb;    
wire 	    resize2_vs ;  
wire 	    resize2_de ;
wire [23:0] resize3_rgb;    
wire 	    resize3_vs ;  
wire 	    resize3_de ;assign hdmi_nreset   =pll_resetn;  
assign hdmi_in_nreset=pll_resetn;
assign ud_w_0_ud_wclk =vin_clk ;
assign ud_w_0_ud_wvs  =resize0_vs  ;
assign ud_w_0_ud_wde  =resize0_de  ;
assign ud_w_0_ud_wdata=resize0_rgb;
assign ud_w_1_ud_wclk =vin_clk ;
assign ud_w_1_ud_wvs  =resize1_vs  ;
assign ud_w_1_ud_wde  =resize1_de  ;
assign ud_w_1_ud_wdata=resize1_rgb;
assign ud_w_2_ud_wclk =vin_clk ;
assign ud_w_2_ud_wvs  =resize2_vs  ;
assign ud_w_2_ud_wde  =resize2_de  ;
assign ud_w_2_ud_wdata=resize2_rgb;
assign ud_w_3_ud_wclk =vin_clk ;
assign ud_w_3_ud_wvs  =resize3_vs  ;
assign ud_w_3_ud_wde  =resize3_de  ;
assign ud_w_3_ud_wdata=resize3_rgb;
assign ud_r_0_ud_rclk=clk_hdmi;
assign ud_r_0_ud_rvs=o_vs;
assign ud_r_0_ud_rde=o_data_req;
assign i_rgb=ud_r_0_ud_rdata[23:0];
assign vout_clk=clk_hdmi;
assign vout_hs=o_hs;
assign vout_vs=o_vs;
assign vout_de=o_de;
assign vout_data=o_rgb;i2c_config i2c_config_m0(
.rst            (~pll_resetn    ),
.clk            (clk_200m       ),
.clk_div_cnt    (16'd500        ),
.i2c_addr_2byte (1'b0           ),
.lut_index      (lut_index      ),
.lut_dev_addr   (lut_data[31:24]),
.lut_reg_addr   (lut_data[23:8] ),
.lut_reg_data   (lut_data[7:0]  ),
.error          (               ),
.done           (               ),
.i2c_scl        (hdmi_scl       ),
.i2c_sda        (hdmi_sda       )
);lut_hdmi lut_hdmi_m0
(
.lut_index (lut_index),
.lut_data  (lut_data )
);helai_video_scale #(.DATA_WIDTH         (8 ),		//Width of input/output data.CHANNELS           (3 ),		//Number of channels of DATA_WIDTH, for color images.DISCARD_CNT_WIDTH  (8 ),		//Width of inputDiscardCnt.INPUT_X_RES_WIDTH  (11),		//Widths of input/output resolution control signals.INPUT_Y_RES_WIDTH  (11),.OUTPUT_X_RES_WIDTH (11),.OUTPUT_Y_RES_WIDTH (11),.FRACTION_BITS      (8 ),		//Number of bits for fractional component of coefficients..SCALE_INT_BITS     (8 ),		//Width of integer component of scaling factor. The maximum input data width to.SCALE_FRAC_BITS    (14),		//Width of fractional component of scaling factor.BUFFER_SIZE        (4 )		//Depth of RFIFO	
)video_scale0(.clk             (vin_clk    ),.rst             (~pll_resetn),.i_vid_data      (vin_data   ), .i_vid_de        (vin_de     ),.o_vid_fifo_read (),.i_vid_vs        (vin_vs     ),.o_vout_data     (resize0_rgb),.o_vout_de       (resize0_de ),			//latency of 4 clock cycles after nextDout is asserted.o_vout_vs       (resize0_vs ),.i_vout_read     (1),.i_discard_cnt   (0),	//Number of input pixels to discard before processing data. Used for clipping.i_src_image_x   (1920-1),			//Resolution of input data minus 1.i_src_image_y   (1080-1),.i_des_image_x   (960-1),			//Resolution of output data minus 1.i_des_image_y   (540-1),.i_scaler_x_ratio(32'h4000 * (1920-1) / (960-1)-1),				//Scaling factors. Input resolution scaled up by 1/xScale. Format Q SCALE_INT_BITS.SCALE_FRAC_BITS.i_scaler_y_ratio(32'h4000 * (1080-1) / (540-1)-1),				//Scaling factors. Input resolution scaled up by 1/yScale. Format Q SCALE_INT_BITS.SCALE_FRAC_BITS.i_left_offset   (0),			//Integer/fraction of input pixel to offset output data horizontally right. Format Q OUTPUT_X_RES_WIDTH.SCALE_FRAC_BITS.i_top_offset    (0),		//Fraction of input pixel to offset data vertically down. Format Q0.SCALE_FRAC_BITS.i_scaler_type   (0)		//Use nearest neighbor resize instead of bilinear
);helai_video_scale #(.DATA_WIDTH         (8 ),		//Width of input/output data.CHANNELS           (3 ),		//Number of channels of DATA_WIDTH, for color images.DISCARD_CNT_WIDTH  (8 ),		//Width of inputDiscardCnt.INPUT_X_RES_WIDTH  (11),		//Widths of input/output resolution control signals.INPUT_Y_RES_WIDTH  (11),.OUTPUT_X_RES_WIDTH (11),.OUTPUT_Y_RES_WIDTH (11),.FRACTION_BITS      (8 ),		//Number of bits for fractional component of coefficients..SCALE_INT_BITS     (8 ),		//Width of integer component of scaling factor. The maximum input data width to.SCALE_FRAC_BITS    (14),		//Width of fractional component of scaling factor.BUFFER_SIZE        (4 )		//Depth of RFIFO	
)video_scale1(.clk             (vin_clk    ),.rst             (~pll_resetn),.i_vid_data      (vin_data   ), .i_vid_de        (vin_de     ),.o_vid_fifo_read (),.i_vid_vs        (vin_vs     ),.o_vout_data     (resize1_rgb),.o_vout_de       (resize1_de ),			//latency of 4 clock cycles after nextDout is asserted.o_vout_vs       (resize1_vs ),.i_vout_read     (1),.i_discard_cnt   (0),	//Number of input pixels to discard before processing data. Used for clipping.i_src_image_x   (1920-1),			//Resolution of input data minus 1.i_src_image_y   (1080-1),.i_des_image_x   (960-1),			//Resolution of output data minus 1.i_des_image_y   (540-1),.i_scaler_x_ratio(32'h4000 * (1920-1) / (960-1)-1),				//Scaling factors. Input resolution scaled up by 1/xScale. Format Q SCALE_INT_BITS.SCALE_FRAC_BITS.i_scaler_y_ratio(32'h4000 * (1080-1) / (540-1)-1),				//Scaling factors. Input resolution scaled up by 1/yScale. Format Q SCALE_INT_BITS.SCALE_FRAC_BITS.i_left_offset   (0),			//Integer/fraction of input pixel to offset output data horizontally right. Format Q OUTPUT_X_RES_WIDTH.SCALE_FRAC_BITS.i_top_offset    (0),		//Fraction of input pixel to offset data vertically down. Format Q0.SCALE_FRAC_BITS.i_scaler_type   (0)		//Use nearest neighbor resize instead of bilinear
);helai_video_scale #(.DATA_WIDTH         (8 ),		//Width of input/output data.CHANNELS           (3 ),		//Number of channels of DATA_WIDTH, for color images.DISCARD_CNT_WIDTH  (8 ),		//Width of inputDiscardCnt.INPUT_X_RES_WIDTH  (11),		//Widths of input/output resolution control signals.INPUT_Y_RES_WIDTH  (11),.OUTPUT_X_RES_WIDTH (11),.OUTPUT_Y_RES_WIDTH (11),.FRACTION_BITS      (8 ),		//Number of bits for fractional component of coefficients..SCALE_INT_BITS     (8 ),		//Width of integer component of scaling factor. The maximum input data width to.SCALE_FRAC_BITS    (14),		//Width of fractional component of scaling factor.BUFFER_SIZE        (4 )		//Depth of RFIFO	
)video_scale2(.clk             (vin_clk    ),.rst             (~pll_resetn),.i_vid_data      (vin_data   ), .i_vid_de        (vin_de     ),.o_vid_fifo_read (),.i_vid_vs        (vin_vs     ),.o_vout_data     (resize2_rgb),.o_vout_de       (resize2_de ),			//latency of 4 clock cycles after nextDout is asserted.o_vout_vs       (resize2_vs ),.i_vout_read     (1),.i_discard_cnt   (0),	//Number of input pixels to discard before processing data. Used for clipping.i_src_image_x   (1920-1),			//Resolution of input data minus 1.i_src_image_y   (1080-1),.i_des_image_x   (960-1),			//Resolution of output data minus 1.i_des_image_y   (540-1),.i_scaler_x_ratio(32'h4000 * (1920-1) / (960-1)-1),				//Scaling factors. Input resolution scaled up by 1/xScale. Format Q SCALE_INT_BITS.SCALE_FRAC_BITS.i_scaler_y_ratio(32'h4000 * (1080-1) / (540-1)-1),				//Scaling factors. Input resolution scaled up by 1/yScale. Format Q SCALE_INT_BITS.SCALE_FRAC_BITS.i_left_offset   (0),			//Integer/fraction of input pixel to offset output data horizontally right. Format Q OUTPUT_X_RES_WIDTH.SCALE_FRAC_BITS.i_top_offset    (0),		//Fraction of input pixel to offset data vertically down. Format Q0.SCALE_FRAC_BITS.i_scaler_type   (0)		//Use nearest neighbor resize instead of bilinear
);helai_video_scale #(.DATA_WIDTH         (8 ),		//Width of input/output data.CHANNELS           (3 ),		//Number of channels of DATA_WIDTH, for color images.DISCARD_CNT_WIDTH  (8 ),		//Width of inputDiscardCnt.INPUT_X_RES_WIDTH  (11),		//Widths of input/output resolution control signals.INPUT_Y_RES_WIDTH  (11),.OUTPUT_X_RES_WIDTH (11),.OUTPUT_Y_RES_WIDTH (11),.FRACTION_BITS      (8 ),		//Number of bits for fractional component of coefficients..SCALE_INT_BITS     (8 ),		//Width of integer component of scaling factor. The maximum input data width to.SCALE_FRAC_BITS    (14),		//Width of fractional component of scaling factor.BUFFER_SIZE        (4 )		//Depth of RFIFO	
)video_scale3(.clk             (vin_clk    ),.rst             (~pll_resetn),.i_vid_data      (vin_data   ), .i_vid_de        (vin_de     ),.o_vid_fifo_read (),.i_vid_vs        (vin_vs     ),.o_vout_data     (resize3_rgb),.o_vout_de       (resize3_de ),			//latency of 4 clock cycles after nextDout is asserted.o_vout_vs       (resize3_vs ),.i_vout_read     (1),.i_discard_cnt   (0),	//Number of input pixels to discard before processing data. Used for clipping.i_src_image_x   (1920-1),			//Resolution of input data minus 1.i_src_image_y   (1080-1),.i_des_image_x   (960-1),			//Resolution of output data minus 1.i_des_image_y   (540-1),.i_scaler_x_ratio(32'h4000 * (1920-1) / (960-1)-1),				//Scaling factors. Input resolution scaled up by 1/xScale. Format Q SCALE_INT_BITS.SCALE_FRAC_BITS.i_scaler_y_ratio(32'h4000 * (1080-1) / (540-1)-1),				//Scaling factors. Input resolution scaled up by 1/yScale. Format Q SCALE_INT_BITS.SCALE_FRAC_BITS.i_left_offset   (0),			//Integer/fraction of input pixel to offset output data horizontally right. Format Q OUTPUT_X_RES_WIDTH.SCALE_FRAC_BITS.i_top_offset    (0),		//Fraction of input pixel to offset data vertically down. Format Q0.SCALE_FRAC_BITS.i_scaler_type   (0)		//Use nearest neighbor resize instead of bilinear
);design_1_wrapper u_design_1_wrapper(.CLK_IN1_D_0_clk_n(CLK_IN1_D_0_clk_n),.CLK_IN1_D_0_clk_p(CLK_IN1_D_0_clk_p),.DDR3_0_addr      (DDR3_0_addr      ),.DDR3_0_ba        (DDR3_0_ba        ),.DDR3_0_cas_n     (DDR3_0_cas_n     ),.DDR3_0_ck_n      (DDR3_0_ck_n      ),.DDR3_0_ck_p      (DDR3_0_ck_p      ),.DDR3_0_cke       (DDR3_0_cke       ),.DDR3_0_cs_n      (DDR3_0_cs_n      ),.DDR3_0_dm        (DDR3_0_dm        ),.DDR3_0_dq        (DDR3_0_dq        ),.DDR3_0_dqs_n     (DDR3_0_dqs_n     ),.DDR3_0_dqs_p     (DDR3_0_dqs_p     ),.DDR3_0_odt       (DDR3_0_odt       ),.DDR3_0_ras_n     (DDR3_0_ras_n     ),.DDR3_0_reset_n   (DDR3_0_reset_n   ),.DDR3_0_we_n      (DDR3_0_we_n      ),.clk_200m         (clk_200m         ),.clk_hdmi         (clk_hdmi         ),.ddr3_ok          (ddr3_ok          ),.pll_resetn       (pll_resetn       ),.resetn           (resetn           ),.ud_r_0_ud_rclk   (ud_r_0_ud_rclk   ),.ud_r_0_ud_rdata  (ud_r_0_ud_rdata  ),.ud_r_0_ud_rde    (ud_r_0_ud_rde    ),.ud_r_0_ud_rempty (ud_r_0_ud_rempty ),.ud_r_0_ud_rvs    (ud_r_0_ud_rvs    ),.ud_w_0_ud_wclk   (ud_w_0_ud_wclk   ),.ud_w_0_ud_wdata  (ud_w_0_ud_wdata  ),.ud_w_0_ud_wde    (ud_w_0_ud_wde    ),.ud_w_0_ud_wfull  (ud_w_0_ud_wfull  ),.ud_w_0_ud_wvs    (ud_w_0_ud_wvs    ),	.ud_w_1_ud_wclk   (ud_w_1_ud_wclk   ),.ud_w_1_ud_wdata  (ud_w_1_ud_wdata  ),.ud_w_1_ud_wde    (ud_w_1_ud_wde    ),.ud_w_1_ud_wvs    (ud_w_1_ud_wvs    ),		.ud_w_2_ud_wclk   (ud_w_1_ud_wclk   ),.ud_w_2_ud_wdata  (ud_w_1_ud_wdata  ),.ud_w_2_ud_wde    (ud_w_1_ud_wde    ),.ud_w_2_ud_wvs    (ud_w_1_ud_wvs    ),		.ud_w_3_ud_wclk   (ud_w_1_ud_wclk   ),.ud_w_3_ud_wdata  (ud_w_1_ud_wdata  ),.ud_w_3_ud_wde    (ud_w_1_ud_wde    ),.ud_w_3_ud_wvs    (ud_w_1_ud_wvs    ),		.ui_clk_100m      (ui_clk_100m      ));	video_timing_control vga(.i_clk     (clk_hdmi   ), .i_rst_n   (pll_resetn ), .i_start_x (0),.i_start_y (0),.i_disp_h  (1920),.i_disp_v  (1080), .i_rgb     (i_rgb      ),.o_hs      (o_hs       ),.o_vs      (o_vs       ),.o_de      (o_de       ),.o_rgb     (o_rgb      ),.o_data_req(o_data_req )
);	
endmodule

7、上板调试验证

开发板:Xilinx Artix7-35T开发板;
开发环境:vivado2019.1;
输入:HDMI,1080P,silicon9011解码;
输出:HDMI,1080P,silicon9134编码;
静态演示如下:
在这里插入图片描述由于采用了懂王的视频,所以审核不过,只能截取点图片了。。。

8、福利:工程源码获取

福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送;
资料如下:获取方式:私,或者文章结尾的V名片;
也可以直接下载工程源码,下载链接:

相关文章:

FPGA纯verilog代码实现4路视频缩放拼接 提供工程源码和技术支持

目录1、前言2、目前主流的FPGA图像缩放方案3、目前主流的FPGA视频拼接方案4、本设计方案的优越性5、详细设计方案解读HDMI输入图像缩放图像缓存VGA时序HDMI输出6、vivado工程详解7、上板调试验证8、福利:工程源码获取1、前言 本文详细描述了FPGA纯verilog代码实现4…...

Spark on YARN运行过程,YARN-Client和YARN-Cluster

Spark on YARN运行过程 YARN是一种统一资源管理机制,在其上面可以运行多套计算框架。目前的大数据技术世界,大多数公司除了使用Spark来进行数据计算,由于历史原因或者单方面业务处理的性能考虑而使用着其他的计算框架,比如MapRed…...

NLP中一些工具列举

文章目录StanfordcoreNLPStanzaTankitspaCySuPar总结StanfordcoreNLP 这个老早就出来了,用java写的,但是已经有很多比他效果好的了。 Stanza 2020ACL发表的,看名字就知道和上一个是同一家的。 用已经切好词的句子进行依存分析。 这个功能…...

面试官:给你一段有问题的SQL,如何优化?

大家好,我是飘渺!我在面试的时候很喜欢问候选人这样一个问题:“你在项目中遇到过慢查询问题吗?你是怎么做SQL优化的?”很多时候,候选人会直接跟我说他们在编写SQL时会遵循的一些常用技巧,比如&a…...

嵌入式 Linux 文件IO操作

目录 Linux 文件操作 1 Linux 系统环境文件操作概念 2 缓冲 IO 文件操作 1 文件的创建,打开与关闭 fopen 函数函数 2 freopen 函数 3、fdopen函数 4、fclose函数 5、格式化读写 6、单个字符读写 7、文件定位 8、标准目录文件 9、非缓冲IO文件操作 Linux 文…...

植物大战 二叉搜索树——C++

这里是目录标题二叉排序树的概念模拟二叉搜索树定义节点类insert非递归Finderase(重点)析构函数拷贝构造(深拷贝)赋值构造递归FindRInsertR二叉搜索树的应用k模型KV模型二叉排序树的概念 单纯的二叉树存储数据没有太大的作用。 搜索二叉树作用很大。 搜索二叉树的一般都是用…...

[MatLab]矩阵运算和程序结构

一、矩阵 1.定义 矩阵以[ ]包含,以空格表示数据分隔,以;表示换行。 A [1 2 3 4 5 6] B 1:2:9 %1-9中的数,中间是步长(不能缺省) C repmat(B,3,2) %将B横向重复2次,纵向重复2次 D ones(2,4) …...

【Leedcode】栈和队列必备的面试题(第四期)

【Leedcode】栈和队列必备的面试题(第四期) 文章目录【Leedcode】栈和队列必备的面试题(第四期)一、题目二、思路图解1.声明结构体2.循环链表开辟动态结构体空间3.向循环队列插入一个元素4.循环队列中删除一个元素5. 从队首获取元…...

Windows Server 2016搭建文件服务器

1:进入系统在服务器管理器仪表盘中添加角色和功能。 2:下一步。 3:继续下一步。 4:下一步。 5:勾选Web服务器(IIS) 6:添加功能。 7:下一步。 8:下一步。 9:下一步。 10&a…...

零基础学SQL(十一、视图)

目录 前置建表 一、什么是视图 二、为什么使用视图 三、视图的规则和限制 四、视图的增删改查 五、视图数据的更新 前置建表 CREATE TABLE student (id int NOT NULL AUTO_INCREMENT COMMENT 主键,code varchar(255) NOT NULL COMMENT 学号,name varchar(255) DEFAULT NUL…...

web,h5海康视频接入监控视频流记录三(后台node取流)

前端vue,接入ws视频播放 云台控制 ,回放预览,都是需要调对应的海康接口。相当于,点击时,请求后台写好的接口,接口再去请求海康的接口 调用云台控制是,操作一次,不会自己停止&#x…...

网络安全从入门到精通:30天速成教程到底有多狠?你能坚持下来么?

毫无疑问,网络安全是当下最具潜力的编程方向之一。对于许多未曾涉足计算机编程的领域「小白」来说,深入地掌握网络安全看似是一件十分困难的事。至于一个月能不能学会网络安全,这个要看个人,对于时间管理不是很高的,肯…...

世界上最流行的编程语言,用户数超过Python,Java,JavaScript,C的总和!

世界上最流行的编程语言是什么? Python? Java? JavaScript? C?都不是,是Excel!外媒估计,全球有12亿人使用微软的Office套件,其中估计有7.5亿人使用Excel!可是Excel不就是能写点儿公式&#x…...

杂谈:created中两次数据修改,会触发几次页面更新?

面试题&#xff1a;created生命周期中两次修改数据&#xff0c;会触发几次页面更新&#xff1f; 一、同步的 先举个简单的同步的例子&#xff1a; new Vue({el: "#app",template: <div><div>{{count}}</div></div>,data() {return {count…...

原生JS实现拖拽排序

拖拽&#xff08;这两个字看了几遍已经不认识了&#xff09; 说到拖拽&#xff0c;应用场景不可谓不多。无论是打开电脑还是手机&#xff0c;第一眼望去的界面都是可拖拽的&#xff0c;靠拖拽实现APP或者应用的重新布局&#xff0c;或者拖拽文件进行操作文件。 先看效果图&am…...

Coredump-N: corrupted double-linked list

文章目录 问题安装debuginfo之后分析参数确定确定代码逻辑解决问题 今天碰到一例: #0 0xf7f43129 in __kernel_vsyscall () #1 0xf6942b16 in raise () from /lib/libc.so.6 #2 0xf6928e64 in abort () from /lib/libc.so.6 #3 0xf6986e8c in __libc_message () from /lib/li…...

5个好用的视频素材网站

推荐五个高质量视频素材网站&#xff0c;免费、可商用&#xff0c;赶紧收藏起来&#xff01; 1、菜鸟图库 视频素材下载_mp4视频大全 - 菜鸟图库 网站素材非常丰富&#xff0c;有平面、UI、电商、办公、视频、音频等相关素材&#xff0c;视频素材质量很高&#xff0c;全部都是…...

使用码匠连接一切|二

目录 Elasticsearch Oracle ClickHouse DynamoDB CouchDB 关于码匠 作为一款面向开发者的低代码平台&#xff0c;码匠提供了丰富的数据连接能力&#xff0c;能帮助用户快速、轻松地连接和集成多种数据源&#xff0c;包括关系型数据库、非关系型数据库、API 等。平台提供了…...

3.1.1 表的相关设计

文章目录1.表中实体与实体对应的关系2.实际案例分析3.表的实际创建4.总结1.表中实体与实体对应的关系 一对多 如一个班级对应多名学生&#xff0c;一个客户拥有多个订单等这种类型表的建表要遵循主外键关系原则&#xff0c;即在从表创建一个字段&#xff0c;此字段作为外键指向…...

Vue3 企业级项目实战:认识 Spring Boot

Vue3 企业级项目实战 - 程序员十三 - 掘金小册Vue3 Element Plus Spring Boot 企业级项目开发&#xff0c;升职加薪&#xff0c;快人一步。。「Vue3 企业级项目实战」由程序员十三撰写&#xff0c;2744人购买https://s.juejin.cn/ds/S2RkR9F/ 越来越流行的 Spring Boot Spr…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...