双线性插值缩放算法原理以及matlab与verilog的实现(二)

系列文章目录

双线性插值缩放算法原理以及matlab与verilog的实现(一)


文章目录

  • 系列文章目录
  • 前言
  • 一、前提回顾
  • 二、FPGA实现步骤
    • 2.1 找到源图像四个像素点求目标像素点
    • 2.2 FPGA实现步骤
    • 2.3 总体框架
    • 2.4 ROM缓存模块
    • 2.5 VGA模块
    • 2.6 双线性算法模块
  • 三、下板验证


前言

开发平台:vivado2020.1
开发芯片:xc7k410tffv900-2

在上一篇文章,我们学会了双线性缩放插值算法的原理以及matlab的实现,以及VGA时序的简单实现。
本文实现目的:用verilog实现双线性插值算法,将一张112 ×103大小图片,放大两倍至224 ×206,然后通过VGA显示出来

一、前提回顾

双线性插值算法公式如下:
在这里插入图片描述

f ( x , y ) = f ( Q 11 ) ( 1 − u ) ( 1 − v ) + f ( Q 21 ) u ( 1 − v ) + f ( Q 12 ) ( 1 − u ) v + f ( Q 22 ) u v f(x,y)={f(Q_{11})}{(1-u)(1-v)}+{f(Q_{21})}{u(1-v)}+{f(Q_{12})}{(1-u)v}+{f(Q_{22})}{uv} f(x,y)=f(Q11)(1u)(1v)+f(Q21)u(1v)+f(Q12)(1u)v+f(Q22)uv

由于在图像处理中,一般将左上角的像素点定义为坐标原点,因此将上述的图片变换一下坐标,以及命名顺序,就变为了:
在这里插入图片描述

f ( x , y ) = f ( Q 11 ) ( 1 − u ) ( 1 − v ) + f ( Q 21 ) u ( 1 − v ) + f ( Q 12 ) ( 1 − u ) v + f ( Q 22 ) u v f(x,y)={f(Q_{11})}{(1-u)(1-v)}+{f(Q_{21})}{u(1-v)}+{f(Q_{12})}{(1-u)v}+{f(Q_{22})}{uv} f(x,y)=f(Q11)(1u)(1v)+f(Q21)u(1v)+f(Q12)(1u)v+f(Q22)uv

二、FPGA实现步骤

现在我们知道,我们用一张已知各点像素值的图片(源图像),求出一张放大两倍的图片(目标图像),但是目标各点像素值都是未知。双线性插值算法核心就是:用已知的四个像素点的值算出所求目标像素点的值。因此步骤如下:

2.1 找到源图像四个像素点求目标像素点

根据目标像素点位置乘以缩放系数( s r c w i d t h d s t w i d t h , s r c h e i g h t d s t h e i g h t \frac{srcwidth}{dstwidth},\frac{srcheight}{dstheight} dstwidthsrcwidthdstheightsrcheight)得到一个浮点坐标 ( i + u , j + v ) (i+u,j+v) i+uj+v(其中 i i i j j j为浮点坐标的整数部分; u u u v v v为浮点坐标的小数部分),而这个浮点坐标 ( i + u , j + v ) (i+u,j+v) i+uj+v的像素值 f ( i + u , j + v ) f(i+u,j+v) f(i+uj+v),就是上图中所要求的p点值,所以由公式可知, f ( p ) f(p) f(p)可由 f ( Q 11 f(Q_{11} f(Q11)、 f ( Q 12 f(Q_{12} f(Q12)、 f ( Q 21 f(Q_{21} f(Q21)、 f ( Q 22 f(Q_{22} f(Q22)求出。而 f ( Q 11 f(Q_{11} f(Q11)、 f ( Q 12 f(Q_{12} f(Q12)、 f ( Q 21 f(Q_{21} f(Q21)、 f ( Q 22 f(Q_{22} f(Q22)的坐标分别是 ( i , j ) (i,j) ij ( i + 1 , j ) (i+1,j) i+1j ( i , j + 1 ) (i,j+1) ij+1 ( i + 1 , j + 1 ) (i+1,j+1) i+1j+1

例如:将图像放大2倍

  1. 缩放系数为(0.5,0.5)
  2. 假如求目标图像坐标(10,15)的像素值,浮点坐标为(5 + 0,7 + 0.5)其中u = 0,v = 0.5
  3. 源图像四个点坐标为 ( 5 , 7 ) (5,7) 57 ( 6 , 7 ) (6,7) 67 ( 5 , 8 ) (5,8) 58 ( 6 , 8 ) (6,8) 68
  4. 带入双线性插值算法公式就可求出

2.2 FPGA实现步骤

  1. 求出缩放系数,通常涉及到小数,FPGA处理小数通常是将浮点数转化成定点数来计算(参考FPGA浮点数计算),本文将浮点数放大256倍,例如缩放系数为0.5,则在FPGA中显示为128。再例如,计算 1 - 0.7 = 0.3,在FPGA中就是256 - 179 = 77
  2. 如何同时取出源图像四个点:因为FPGA中,无论是RAM还是ROM,一个时钟周期只能读出一个数据,所以需要将源图像缓存至四个RAM或者4个ROM中(面积换速度),这样一次性给四个地址到这四个ROM中,就能同时收到四个像素点
  3. 实现公式:公式都是由加法和乘法组成,为了速度能快,选用加法器和乘法器的IP,而不是直接用 +,×
  4. 计算完成,数据缓存到RAM里,VGA接口直接读RAM

2.3 总体框架

在这里插入图片描述

2.4 ROM缓存模块

  1. 将图片通过matlab提取像素点,按照RGB顺序,十六进制的格式写入coe文件里,maltab代码如下:
% 读取图像
img = imread('C:\Users\Administrator\Desktop\qq.jpg');

% 获取图像尺寸
[height, width, ~] = size(img);

% 打开 COE 文件以写入数据
fileID = fopen('C:\Users\Administrator\Desktop\save.coe', 'w');

% 写入 COE 文件头部信息
fprintf(fileID, 'memory_initialization_radix=16;\n');
fprintf(fileID, 'memory_initialization_vector=\n');

% 遍历图像像素并将像素值写入 COE 文件
for i = 1:height
    for j = 1:width
        % 将像素值写入 COE 文件
        fprintf(fileID, '%02X%02X%02X,\n', img(i,j,1), img(i,j,2), img(i,j,3));  
    end
end

% 关闭 COE 文件
fclose(fileID);
disp('COE file generation complete.');

得到coe文件
在这里插入图片描述
打开ROM ip,生成一个位宽24位。深度112×103=11536的ROM,初始化文件为此coe文件
在这里插入图片描述

2.5 VGA模块

vga模块代码和上篇文章一样,只是加了读ROM的操作,代码如下:

 //显示ROM缓存的图片
module vga_ctrl
(
    input                                               clk ,
    input           [23:0]                              data_in ,
    output  reg     [13:0]                              rd_rom_addr,	
    output  reg                                         vs =1'b0 ,
    output  reg                                         hs =1'b0 ,
    output  reg     [23:0]                              data_out    
    );
	
    parameter                                           hcnt_max        =1100;//行扫描是对列计数,最大值
    parameter                                           vcnt_max        =2250;//列扫描是对行计数,最大值

    parameter                                           H_ACTIVE        =960; //行数据有效时间
    parameter                                           H_FRONT_PORCH   =44 ; //行前沿时间
    parameter                                           H_SYNC_TIME     =22;//行同步信号时间
    parameter                                           H_BACK_PORCH    =74;//行消隐后肩时间

    parameter                                           V_ACTIVE        =2160;//场数据有效时间
    parameter                                           V_FRONT_PORCH   =8 ; //场前沿时间
    parameter                                           V_SYNC_TIME     =10   ; //场同步信号时间
    parameter                                           V_BACK_PORCH    =72;//场后沿时间

    reg             [10:0]                              hcnt ='d0    ;
    reg             [11:0]                              vcnt ='d0   ;
    reg             [10:0]                              pix_x ='d0    ;//当前显示像素点x坐标
    reg             [11:0]                              pix_y ='d0   ; //当前显示像素点y坐标

      
	//对行扫描进行计数
	always @(posedge clk)begin
		if(hcnt == hcnt_max - 1 )
            hcnt <= 0;
		else
            hcnt <= hcnt +'d1;		
	end
	//对列扫描进行计数
    always @(posedge clk)
		begin
			if((vcnt == vcnt_max-1)&&(hcnt == hcnt_max -1))
				vcnt <= 0;
			else	if(hcnt == hcnt_max -1)
				vcnt <= vcnt +'d1;
			else
				vcnt <= vcnt;
		end
	

		
	always@(posedge clk)begin
		if(hcnt < H_SYNC_TIME)
			hs <= 1;
		else
			hs <= 0;
	end
	always@(posedge clk)begin
		if(vcnt < V_SYNC_TIME)
			vs <= 1;
		else
			vs <= 0;
	end	
  
  //整个屏幕有效显示区域
     always @(posedge clk) begin
        if(((hcnt >= H_SYNC_TIME +H_BACK_PORCH)&&(hcnt < H_SYNC_TIME +H_BACK_PORCH +H_ACTIVE))&&((vcnt >=V_SYNC_TIME + V_BACK_PORCH)&&(vcnt<V_SYNC_TIME+V_BACK_PORCH+V_ACTIVE)))begin
            de <= 1'b1;
        end
        else begin
            de <= 1'b0;
        end
    end

//当前显示的像素点的位置
    always@(posedge clk)begin
        if(de == 1'b1)begin
            pix_x <= hcnt - H_SYNC_TIME - H_BACK_PORCH;
            pix_y <= vcnt - V_SYNC_TIME - V_BACK_PORCH;
        end
        else begin
            pix_x <= 'd0;
            pix_y <= 'd0;
        end
    end
//提前一拍读ROM地址
    always @(posedge clk) begin
        if((pix_x >= 278)&&(pix_x <390)&&((pix_y >=1080)&&(pix_y < 1183)))begin
             if(rd_rom_addr <'d11535)
                rd_rom_addr <= rd_rom_addr + 1;
            else
                rd_rom_addr <= 'd0;
        end
        else begin
            rd_rom_addr <= rd_rom_addr;
        end
        
    end

    always @(posedge clk) begin
        if((pix_x >= 279)&&(pix_x <391)&&((pix_y >=1080)&&(pix_y < 1183)))
            data_out <= data_in;
        else 
            data_out <= 96'h800080_800080_800080_800080;
    end
    
endmodule 
            

屏幕显示效果:
在这里插入图片描述
VGA模块以及ROM数据皆正常,至于为什么图片偏绿,可能是因为显示器YUV和RGB色域转换的问题,后续文章会说明,现在暂时不管。

2.6 双线性算法模块

module bilinear_calculate(
    input                                               clk ,
    input                                               rst_n   ,
    input           [7:0]                               cur_u_dec   ,       //输入的u
    input           [7:0]                               cur_v_dec   ,       //输出的v
    input                                               pix_en,
    input           [7:0]                               i_j_pix ,		    //i_j_pix=f(i,j)
    input           [7:0]                               i_j_1_pix   ,		//i_j_1_pix=f(i,j+1)
    input           [7:0]                               i_1_j_pix   ,		//i_1_j_pix=f(i+1,j)
    input           [7:0]                               i_1_j_1_pix ,	    //i_1_j_1_pix=f(i+1,j+1)
    output  reg     [7:0]                               post_cal_data,
    output  reg                                         post_cal_data_valid =1'b0
    );

//f(x,y)= f(0,0)*(1-u)(1-v)+f(1,0)*u*(1-v)+f(0,1)*(1-u)*v+f(l,1)*u*v

    reg             [7:0]                               cur_u_dec_reg=8'd0  ;
    reg             [7:0]                               cur_v_dec_reg=8'd0  ;

    reg             [8:0]                               u_1 =9'd0;	//1-u
    reg             [8:0]                               v_1 =9'd0;	//1-v
    reg             [8:0]                               u   =9'd0;	//u
    reg             [8:0]                               v   =9'd0;	//v

    reg             [8:0]                               u_1_reg =9'd0;	
    reg             [8:0]                               v_1_reg =9'd0;	
    reg             [8:0]                               u_reg   =9'd0;	
    reg             [8:0]                               v_reg   =9'd0;	

    reg             [8:0]                               u_1_reg_copy    =9'd0;	
    reg             [8:0]                               v_1_reg_copy    =9'd0;	
    reg             [8:0]                               u_reg_copy  =9'd0;	
    reg             [8:0]                               v_reg_copy  =9'd0;	

    wire            [17:0]                              u_v ;
    wire            [17:0]                              u_1_v_1 ;
    wire            [17:0]                              u_v_1  ;
    wire            [17:0]                              u_1_v  ;

    reg             [17:0]                              u_v_reg =18'd0;
    reg             [17:0]                              u_1_v_1_reg =18'd0;
    reg             [17:0]                              u_v_1_reg   =18'd0;
    reg             [17:0]                              u_1_v_reg   =18'd0;

    reg             [7:0]                               i_j_pix_reg =8'd0;	
    reg             [7:0]                               i_j_1_pix_reg   =8'd0;	
    reg             [7:0]                               i_1_j_pix_reg   =8'd0;	
    reg             [7:0]                               i_1_j_1_pix_reg =8'd0;

    wire            [25:0]                              Fi_j_pix0   ;					
    wire            [25:0]                              Fi_j_1_pix0 ;	
    wire            [25:0]                              Fi_1_j_pix0 ;
    wire            [25:0]                              Fi_1_j_1_pix0   ; 	

    reg             [25:0]                              Fi_j_pix0_reg   =26'd0;	
    reg             [25:0]                              Fi_j_1_pix0_reg =26'd0;	
    reg             [25:0]                              Fi_1_j_pix0_reg =26'd0;
    reg             [25:0]                              Fi_1_j_1_pix0_reg   =26'd0; 	

    reg             [25:0]                              F_i_u_j_v1_pix0 =26'd0;
    reg             [25:0]                              F_i_u_j_v2_pix0 =26'd0;
    reg             [26:0]                              F_i_u_j_v_pix0  =27'd0;

    reg             [5:0]                               pix_en_reg ='d0  ;


always@(posedge clk )begin
	cur_u_dec_reg	     <= cur_u_dec;
	cur_v_dec_reg      <= cur_v_dec;
end

always@(posedge clk )begin
	u_1    <= {1'b0,~cur_u_dec_reg} + 1;
	v_1    <= {1'b0,~cur_v_dec_reg} + 1;
	u 	    <= cur_u_dec_reg;
	v 	    <= cur_v_dec_reg;
end

always@(posedge clk )begin
	u_1_reg	   <= u_1; 
	v_1_reg	   <= v_1;
	u_reg	 <= u; 	
	v_reg	 <= v; 	
end

always@(posedge clk )begin
	u_1_reg_copy	  <= u_1; 
	v_1_reg_copy	  <= v_1;
	u_reg_copy		   <= u; 	
	v_reg_copy		   <= v; 	
end


mult_9_9 mult_u_v (
  .CLK(clk),  
  .A(u_reg),      
  .B(v_reg),      
  .P(u_v)      
);

mult_9_9 mult_u_1_v_1 (
  .CLK(clk),  
  .A(u_1_reg),      
  .B(v_1_reg),      
  .P(u_1_v_1)      
);

mult_9_9 mult_u_1_v (
  .CLK(clk),  
  .A(u_1_reg_copy),      
  .B(v_reg_copy),      
  .P(u_1_v)      
);

mult_9_9 mult_u_v_1 (
  .CLK(clk),  
  .A(u_reg_copy),      
  .B(v_1_reg_copy),      
  .P(u_v_1)      
);


always@(posedge clk)begin
	u_v_reg			<= u_v;		
	u_1_v_1_reg		<= u_1_v_1;	
	u_v_1_reg		<= u_v_1;	
	u_1_v_reg		<= u_1_v;	
end

// pix_cal
always@(posedge clk)begin
	i_j_pix_reg		<= i_j_pix;		
	i_j_1_pix_reg	<= i_j_1_pix;	
	i_1_j_pix_reg	<= i_1_j_pix;	
	i_1_j_1_pix_reg <= i_1_j_1_pix;
end

mult_18_8 mult1 (
  .CLK(clk),  
  .A(u_1_v_1_reg),      
  .B(i_j_pix_reg),      
  .P(Fi_j_pix0)      
);

mult_18_8 mult2 (
  .CLK(clk),  
  .A(u_1_v_reg),      
  .B(i_j_1_pix_reg),      
  .P(Fi_j_1_pix0)      
);

mult_18_8 mult3(
  .CLK(clk),  
  .A(u_v_1_reg),      
  .B(i_1_j_pix_reg),      
  .P(Fi_1_j_pix0)      
);

mult_18_8 mult4(
  .CLK(clk),  
  .A(u_v_reg),      
  .B(i_1_j_1_pix_reg),      
  .P(Fi_1_j_1_pix0)      
);

always@(posedge clk)begin
	Fi_j_pix0_reg		<= Fi_j_pix0;		
    Fi_j_1_pix0_reg		<= Fi_j_1_pix0;	
    Fi_1_j_pix0_reg		<= Fi_1_j_pix0;	
    Fi_1_j_1_pix0_reg  	<= Fi_1_j_1_pix0;
end

	always@(posedge clk)begin
		F_i_u_j_v1_pix0	<=	Fi_j_pix0_reg + Fi_j_1_pix0_reg;
		F_i_u_j_v2_pix0	<=	Fi_1_j_pix0_reg + Fi_1_j_1_pix0_reg;
	end

always@(posedge clk)begin
	F_i_u_j_v_pix0 <= {1'b0,F_i_u_j_v1_pix0} + {1'b0,F_i_u_j_v2_pix0};
end

always@(posedge clk)begin
	if(F_i_u_j_v_pix0[26 : 24] == 'd0)
		post_cal_data <= F_i_u_j_v_pix0[23 : 16];
	else
		post_cal_data <= 8'hff;
end

always @(posedge clk) begin
    pix_en_reg <= {pix_en_reg[4:0],pix_en};
    if(pix_en_reg[5] == 1'b1)
        post_cal_data_valid <= 1'b1;
    else
         post_cal_data_valid <= 1'b0;
end
endmodule

三、下板验证

再修改一下vga模块,让它显示两部分,左边是原始图片,右边显示放大图片。效果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/460720.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【AI+应用】一步步搭建聊天机器人搭配多种国内外大模型以及api接口调用

如果你看过我之前写的一篇文章 【AI应用】怎么快速制作一个类chatGPT套壳网站&#xff0c; 你可能顺利地使用chatGPT、Gemini&#xff0c; 用得很happy。 突然有一天&#xff0c;你发现一些网站&#xff0c;除了chatGPT、Gemini &#xff0c;还可以切换使用国内外其他的大模型…

【原创】一文读懂RAG的来源、发展和前沿

检索增强生成(Retrieval Augmented Generation&#xff0c;RAG)结合了检索 (Retrieval) 和生成 (Generation) 两个过程&#xff0c;旨在提高机器生成文本的相关性、准确性和多样性。RAG通过在生成文本输出之前先检索大量相关信息&#xff0c;然后将这些检索到的信息作为上下文输…

练习题手撕总结

基础篇 1.基础知识&#xff08;时间复杂度、空间复杂度等&#xff09; 2.线性表&#xff08;顺序表、单链表&#xff09; 3.双链表、循环链表 4.队列 5.栈 6.递归算法 7.树、二叉树&#xff08;递归、非递归遍历&#xff09; 8.二叉搜索树&#xff08;BST&#xff09; 9.二分查…

FPGA静态时序分析与约束(三)、读懂vivado时序报告

系列文章目录 FPGA静态时序分析与约束&#xff08;一&#xff09;、理解亚稳态 FPGA静态时序分析与约束&#xff08;二&#xff09;、时序分析 文章目录 系列文章目录前言一、时序分析回顾二、打开vivado任意工程2.1 工程布局路由成功后&#xff0c;点击vivado左侧**IMPLEMENT…

浅易理解:非极大抑制NMS

什么是非极大抑制NMS 非极大值抑制&#xff08;Non-Maximum Suppression&#xff0c;简称NMS&#xff09;是一种在计算机视觉和图像处理领域中广泛使用的后处理技术&#xff0c;特别是在目标检测任务中。它的主要目的是解决目标检测过程中出现的重复检测问题&#xff0c;即对于…

家具工厂5G智能制造数字孪生可视化平台,推进家具行业数字化转型

家具制造5G智能制造工厂数字孪生可视化平台&#xff0c;推进家具行业数字化转型。随着科技的飞速发展&#xff0c;家具制造业正迎来一场前所未有的数字化转型。在这场家具制造业转型中&#xff0c;5G智能制造工厂数字孪生可视化平台发挥着至关重要的作用。 5G智能制造工厂数字孪…

深度学习模型部署(十)模型部署配套工具二

上篇blog讲了trtexec和onnx_graphsurgeon两个工具&#xff0c;一个用于将onnx转化为trt模型&#xff0c;另一个用于对onnx模型进行修改。这篇blog讲polygraphy和nsight systems&#xff0c;前者用于进行模型优化以及结果验证&#xff0c;后者用于性能分析。 polygraph polygra…

sqllab第二十三关通关笔记

知识点&#xff1a; mysqli_query() 返回值为资源型或布尔型如果内容为查询语句则返回资源型数据&#xff1b;如果内容为插入、更新、删除等语句则返回布尔类型结果mysql_fetch_array() 从结果集中取出一行作为关联数组或数字数组输入内容为指定查询的结果集单引号闭合绕过联…

hololens2发布unity设置

生成vs工程再向hololens发布时&#xff0c; Architecture选X64或ARM64都可以成功发布

爬虫3_爬取翻页URL不变的网站

之前实现了对大学排数据爬取&#xff1a;爬虫2_2019年549所中国大学排名. 近期复现代码&#xff0c;发现原网站升级&#xff0c;在翻页时&#xff0c;发现URL不改变&#xff0c;修改代码&#xff0c;使用网页自动化工具selenium实现对该类网站数据获取。 #-*- coding: UTF-8 -…

【物联网】Modbus 协议及Qinghub物联网平台应用

Modbus 协议简介 QingHub设计器在设计物联网数据采集时不可避免的需要针对Modbus协议的设备做相关数据采集&#xff0c;这里就我们的实际项目经验分享Modbus协议 你可以通过QingHub作业直接体验试用&#xff0c;也可以根据手册开发相应的代码块。 qinghub项目已经全面开源。 …

MC78L05ACDR2G线性稳压器芯片中文资料规格书PDF数据手册引脚图参数图片价格

产品概述&#xff1a; MC78L00A系列线性稳压器价格便宜&#xff0c;易于使用&#xff0c;适用于各种需要最高100mA的调节电源的应用。与大功率MC7800和MC78M00系列一样&#xff0c;这款稳压器也提供内部电流限制和高温关断&#xff0c;因此非常坚固耐用。在很多应用中&#xf…

MediaBox音视频终端SDK已适配鸿蒙星河版(HarmonyOS NEXT)

2024年1月&#xff0c;HarmonyOS NEXT 鸿蒙星河版系统开发者预览版开放申请&#xff0c;该系统将只能安装为鸿蒙开发的原生应用&#xff0c;而不再兼容安卓应用。对此&#xff0c;阿里云MediaBox音视频终端SDK产品已实现功能的鸿蒙化迁移和重构&#xff0c;全面适配鸿蒙系统Har…

王勇:硬科技的下一站 | 演讲嘉宾公布

一、智能耳机与可穿戴专题论坛 智能耳机与可穿戴专题论坛将于3月27日同期举办&#xff01; 智能耳机、可穿戴设备已经逐渐融入我们的生活&#xff0c;它们不仅带来了便捷与舒适&#xff0c;更在悄然改变着我们的生活方式和工作模式。在这里&#xff0c;我们将分享最新的研究成果…

前端基础——HTML傻瓜式入门(2)

该文章Github地址&#xff1a;https://github.com/AntonyCheng/html-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.c…

误分区酿苦果,数据恢复有妙方

一、误操作引发分区混乱 在数字化时代的浪潮中&#xff0c;硬盘分区成为我们管理和存储数据的重要手段。然而&#xff0c;误分区这一操作失误&#xff0c;却时常给许多用户带来不小的困扰。误分区&#xff0c;简单来说&#xff0c;就是在对硬盘进行分区操作时&#xff0c;由于…

P6安装:安装P6提示1433端口无效

错误描述 尝试运行 Microsoft SQL Server 2005 的 Primavera P6 数据库时&#xff0c;遇到以下错误&#xff1a; SQLServerException: The TCP/IP connection to the host [name], port 1433 has failed. Error: “Connection refused: connect. Verify the connection prope…

LCR144翻转二叉树(力扣简单题,Java,递归+非递归)

目录 题目描述&#xff1a; 递归代码1&#xff1a; 递归代码2&#xff1a; 非递归代码&#xff08;层次遍历&#xff09;&#xff1a; 题目描述&#xff1a; 给定一棵二叉树的根节点 root&#xff0c;请左右翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a;…

vs2022安装番茄助手后无法使用

1.安装番茄助手 兼容性-win7-管理员启动 2.破解 下载附件“VA_X64.dll”、“PiaoYun64.dll”破解文件&#xff0c;使用Everything找到C盘对应的“VA_X64.dll”路径&#xff0c;将两个破解文件拷贝到此路径。 3.命令行键入类似命令&#xff1a;D:\OfficeSoftware\VisualStudi…

mybatis实现动态sql和关联映射以及延迟加载策略

一、动态sql的简述 什么是动态sql:在不同条件下拼接不同的sql Mybatis框架的动态sql技术是一种根据特定条件动态拼接SQl语句的功能&#xff0c;他存在的意义是为了解决拼接SQL语句字符串时的痛点问题。比如我们在用淘宝之类的软件在进行商品属性选择的时候&#xff0c;我们会发…