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

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

C++_哈希表

本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、基础概念 1. 哈希核心思想&#xff1a; 哈希函数的作用&#xff1a;通过此函数建立一个Key与存储位置之间的映射关系。理想目标&#xff1a;实现…...

uni-app学习笔记三十五--扩展组件的安装和使用

由于内置组件不能满足日常开发需要&#xff0c;uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件&#xff0c;需要安装才能使用。 一、安装扩展插件 安装方法&#xff1a; 1.访问uniapp官方文档组件部分&#xff1a;组件使用的入门教程 | uni-app官网 点击左侧…...

echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式

pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图&#xff0c;如果边框加在dom上面&#xff0c;pdf-lib导出svg的时候并不会导出边框&#xff0c;所以只能在echarts图上面加边框 grid的边框是在图里…...

C++ Saucer 编写Windows桌面应用

文章目录 一、背景二、Saucer 简介核心特性典型应用场景 三、生成自己的项目四、以Win32项目方式构建Win32项目禁用最大化按钮 五、总结 一、背景 使用Saucer框架&#xff0c;开发Windows桌面应用&#xff0c;把一个html页面作为GUI设计放到Saucer里&#xff0c;隐藏掉运行时弹…...