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

Swagger2实现配置Header请求头

效果 实现 大家使用swagger肯定知道在代码中会写一个 SwaggerConfig 配置类&#xff0c;如果没有这个类swagger指定也用不起来&#xff0c;所以在swagger中配置请求头也是在这个 SwaggerConfig 中操作。 1、要实现配置请求头在配置swagger的Docket的bean实例中添加一个 globa…...

4-1 SpringCloud快速开发入门:RestTemplate类详细解读

RestTemplate类详细解读 RestTemplate 的 GET 请求 Get 请求可以有两种方式&#xff1a; 第一种&#xff1a;getForEntity 该方法返回一个 ResponseEntity对象&#xff0c;ResponseEntity是 Spring 对 HTTP 请求响应的封装&#xff0c;包括了几个重要的元素&#xff0c;比如响…...

【IDEA】【工具】幸福感UP!开发常用的工具 插件/网站/软件

IDEA 插件 CodeGlance Pro —— 代码地图 CodeGlance是一款非常好用的代码地图插件&#xff0c;可以在代码编辑区的右侧生成一个竖向可拖动的代码缩略区&#xff0c;可以快速定位代码的同时&#xff0c;并且提供放大镜功能。 使用:可以通过Settings—>Other Settings—&g…...

【蓝桥杯集训·每日一题】AcWing 1562. 微博转发

文章目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解三、知识风暴宽搜BFS一、题目 1、原题链接 1562. 微博转发 2、题目描述 微博被称为中文版的 Twitter。 微博上的用户既可能有很多关注者&#xff0c;也可能关注很多其他用户。 因此&am…...

[busybox] busybox生成一个最精简rootfs(下)

书接上回&#xff1a;[busybox] busybox生成一个最精简rootfs(上) 本篇介绍几个rootfs中用到的“不是那么重要的”几个文件。 9 /etc/shadow 和 /etc/passwd 曾经&#xff0c;/etc/passwd 文件用于存储独立 Linux 系统中的所有登录信息。 后来&#xff0c;由于以下原因&…...

Java奠基】运算符的讲解与使用

目录 运算符与表达式的使用 算术运算符 隐式转换与强制转换 自增自减运算符 赋值运算符 关系运算符 逻辑运算符 三元运算符 运算符与表达式的使用 运算符是指&#xff1a;对字面量或者变量进行操作的符号。 表达式是指&#xff1a;用运算符把字面量或者变量连接起来&…...

开发一个会员管理系统

背景 由于现在公司内客户量剧增&#xff0c; 简单的靠电话及笔记本记录&#xff0c;来维护客户有些困难&#xff0c;但又不想去花钱购买那些专业版的会员管理系统&#xff0c;只能自己动手撸一个相对简易的会员系统来使用了。 开发语言及使用技术 后端&#xff1a;java、mys…...

华为OD机试题【找出通过车辆最多颜色】用 C++ 进行编码 (2023.Q1)

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明找出通…...

如何根据子网掩码计算出网络前缀(prefix)

我们知道子网掩码是对IP地址的网络地址的标注。把IP地址中网络地址位设置为1,主机地址位设置为0,得到的就是子网掩码。除了用子网掩码表示IP地址的网络地址和主机地址外,还可以用network prefix(网络前缀),比如192.168.0.1/16,这里的16就是prefix,也就是网络地址位的位…...

【FATE联邦学习】Fateboard的使用

fateboard文档 https://fate.fedai.org/fateboard/ github Fateboard文档 https://github.com/FederatedAI/FATE-Board/blob/master/README-CN.md 背景 Fateboard是FATE框架的任务看板。 在配置FATE时&#xff0c;Fateboard一般是被安装好了的&#xff0c;安装过程查看这里 A…...

住建局官网平台/南昌seo

我想从url中隐藏.html&#xff0c;将示例www.site.com/videos.html隐藏到www.site.com/videos。我在这里寻找类似的问题&#xff0c;但没有结果。在url中隐藏.html这是我的.htaccess文件&#xff1a;RewriteEngine OnRewriteRule ^index.html$ index.phpRewriteRule ^browse-(.…...

网站分站怎么做/怎么做盲盒

1.检查libevent 首先检查系统中是否安装了libevent&#xff08;Memcache用到了libevent这个库用于Socket的处理&#xff09;。 # rpm -q libevent libevent-1.4.13-4.el6.i686 如果没有安装&#xff0c;需先安装libevent。 安装libevent&#xff1a; 1.使用yum源安装&#xff1…...

http文件转wordpress/百度极简网址

cl_cache的定位还未设定&#xff1a; cl_cache 这是一种机制&#xff0c;用于缓存应用程序以文本形式提供的 OpenCL 内核的二进制表示。通过存储二进制表示&#xff0c;只需要第一次编译&#xff0c;这提高了性能。 在工作目录中&#xff0c;手动创建 cl 缓存目录。驱动程序将使…...

企业型网站有哪些特点/seo培训赚钱

一、缓存雪崩 缓存雪崩我们可以简单的理解为&#xff1a;由于原有缓存失效&#xff0c;新缓存未到期间(例如&#xff1a;我们设置缓存时采用了相同的过期时间&#xff0c;在同一时刻出现大面积的缓存过期)&#xff0c;所有原本应该访问缓存的请求都去查询数据库了&#xff0c;而…...

国外网站平台/新闻发稿推广

最近常听同事提及相关性分析,正巧看到这个google的开源库&#xff0c;并把相关操作与调试结果记录下来。 小说集可以百度《金庸小说全集 14部》全&#xff08;TXT&#xff09;作者&#xff1a;金庸 下载下来。 需要整理好格式&#xff0c;门派和武功名称之间需要有换行符&#…...

企业网站建设商城/云南网站seo服务

Go 时间戳 程序的一个通常需求是计算从Unix起始时间开始到某个时刻的秒数&#xff0c;毫秒数&#xff0c;微秒数等。 我们来看看Go里面是怎么做的。package main import "fmt" import "time" func main() { // 使用Unix和UnixNano来分别获取从Unix起始时间…...