基于RS232的VGA显示

news2024/9/30 5:35:03

前言

        基于ROM的VGA显示缺点:需要将图片转化为mif文件,使用的RAM是FPGA内部RAM模拟出来的,占用资源大切换显示图片需要重新转化,对ROM进行写入,使用极不方便,因此这里采用RS232进行VGA显示。

正文

一、基于RS232的VGA显示

        1.项目需求

        使用目标:设计基于RS232的VGA图片显示驱动模块,完成对100*100的彩色图片进行显示。

        2.技术介绍

        使用PC机通过RS232(50Mhz)连接FPGA开发板,通过RS232向FPGA发送图片数据,FPGA将图片数据缓存到RAM,使用FPGA的VGA接口驱动屏幕,将传入的数据进行读取,从而完成基于RS232的VGA显示。(640*480*60hz)(25.1Mhz)这里利用RAM进行跨时钟域进行数据处理,并存储数据。

        ip核PLL使用的时钟输入为开发板载时钟,当使用锁相环时,系统时钟只能用在锁相环输入,不建议将系统时钟再做其他模块的驱动模块时钟,其他模块时钟可以使用锁相环输出。

UART通信实现与验证(RS232)

        3.顶层架构

        4.端口描述

clk时钟接口(50Mhz)
rst_n复位按键(低电平有效)
rx数据接收接口
rgb[7:0]颜色数据
hs场同步信号
vs行同步信号

二、代码验证

vga驱动模块

module vga_ctrl(

	input    		clk		,
	input    		rst_n		,
	input[7:0]		in_rgb	,
	
	output			volid_en ,
	output   		vga_hs	,
	output   		vga_vs	,
	output[9:0]   	vga_h		,//坐标
	output[9:0]   	vga_v		,//坐标
	output[7:0]  	vga_rgb
);

reg [9:0] cnt_hs;//列计数器
reg [9:0] cnt_vs;//行计数器
wire hs_en;//列有效显示区域
wire vs_en;//行有效显示区域
//wire volid_en;//有效显示区域

parameter 	hs_sync = 10'd96	,//同步
				hs_bask = 10'd40	,//后沿
				hs_left = 10'd8	,//左边
				hs_vali = 10'd640	,//有效
				hs_righ = 10'd8	,//右边
				hs_fpon = 10'd8	,//前沿
				hs_tota = 10'd800	;//总共
				                   
parameter 	vs_sync = 10'd2	,//同步   
				vs_bask = 10'd25	,//后沿	  
				vs_left = 10'd8	,//上边   
				vs_vali = 10'd480	,//有效 
				vs_righ = 10'd8	,//底边   
				vs_fpon = 10'd2	,//前沿   
				vs_tota = 10'd525	;//总共				

always @(posedge clk,negedge rst_n)
begin
	if(rst_n == 0)
		cnt_hs <= 10'd0;
	else
		if(cnt_hs < hs_tota - 10'd1)
			cnt_hs <= cnt_hs + 10'd1;
		else
			cnt_hs <= 10'd0;
end 

always @(posedge clk,negedge rst_n)
begin
	if(rst_n == 0)
		cnt_vs <= 10'd0;
	else
		if(cnt_hs ==  hs_tota - 10'd1)
			if(cnt_vs < vs_tota - 10'd1)
				cnt_vs <= cnt_vs + 10'd1;
			else 
				cnt_vs <= 10'd0;
		else
			cnt_vs <= cnt_vs;
end 

assign vga_hs = (cnt_hs < hs_sync)?1'b0:1'b1;//行同步信号赋值

assign vga_h  = (volid_en == 1'b1)?(cnt_hs - (hs_sync + hs_bask + hs_left)):10'd0;//行坐标(Y)

assign vga_vs = (cnt_vs < vs_sync)?1'b0:1'b1;//场同步信号赋值

assign vga_v  = (volid_en == 1'b1)?(cnt_vs - (vs_sync + vs_bask + vs_left)):10'd0;//列坐标(X)

assign hs_en = ((cnt_hs >= hs_sync + hs_bask + hs_left )&&(cnt_hs < hs_sync + hs_bask + hs_left + hs_vali))?1'b1:1'b0;

assign vs_en = ((cnt_vs >= vs_sync + vs_bask + vs_left )&&(cnt_vs < vs_sync + vs_bask + vs_left + vs_vali))?1'b1:1'b0;

assign volid_en = hs_en & vs_en;//显示区域

assign vga_rgb = (volid_en == 1'b1)?in_rgb:8'd0;

endmodule 

RS232数据接收

module uart_rx(
	input 			clk		,
	input				rst_n 	,
	input				rx			,
	
	output reg[7:0]po_data	,	//接收到的数据
	output reg  	po_flag		//数据输出有效

);

parameter 	uart_btl ='d9600			;//串口波特率
parameter 	clk_shuj ='d50_000_000	;//时钟频率

parameter 	cnt_max  =clk_shuj/uart_btl;

reg 			reg1,reg2,reg3	;//打排延迟周期,消除亚稳态
reg 			flag				;//uart工作信号(uart工作时在工作状态切换后产生一个时钟周期高电平)
reg 			en					;//uart工作使能标志信号(uart工作时在工作状态切换后的下一个时钟周期开始一直拉高,直到检测到停止信号)
reg [15:0]	cnt				;//每比特数据持续时钟周期计数器
reg [3 :0]	bit_cnt			;//数据个数计数器
reg 			bit_flag			;//每bit数据接收有效信号
reg [7 :0]	rx_data			;//存储输入数据
reg			rx_flag			;//输入数据并位结束信号

always@(posedge clk,negedge rst_n)//数据打排1
begin
	if(rst_n == 0)
		reg1 <= 1'b1;
	else
		reg1 <= rx;
end	

always@(posedge clk,negedge rst_n)//数据打排2
begin
	if(rst_n == 0)
		reg2 <= 1'b1;
	else
		reg2 <= reg1;
end	

always@(posedge clk,negedge rst_n)//数据打排3
begin
	if(rst_n == 0)
		reg3 <= 1'b1;
	else
		reg3 <= reg2;
end	

always@(posedge clk,negedge rst_n)//uart工作信号赋值
begin
	if(rst_n == 0)
		flag <= 1'b0;
	else
		if((reg2 == 1'b0)&&(reg3 == 1'b1)&&(en == 1'b0))
			flag <= 1'b1;
		else
			flag <= 1'b0;
end

always@(posedge clk,negedge rst_n)//uart工作使能标志信号赋值
begin
	if(rst_n == 0)
		en <= 1'b0;
	else
		if(flag == 1'b1)
			en <= 1'b1;
		else
			if((bit_cnt == 4'd8)&&(bit_flag == 1'b1))
				en <= 1'b0;
			else
				en <= en;
end			

always@(posedge clk,negedge rst_n)//每比特数据持续时钟周期计数器驱动逻辑
begin
	if(rst_n == 0)	
		cnt <= 16'd0;
	else 	
		if((cnt == cnt_max - 1)||(en == 1'b0))
			cnt <= 16'd0;
		else
			cnt = cnt + 1'b1;
end

always@(posedge clk,negedge rst_n)//每比特数据持续时钟周期计数器驱动逻辑
begin
	if(rst_n == 0)	
		bit_flag <= 1'b0;
	else
		if(cnt == cnt_max/2 - 1)
			bit_flag <= 1'b1;
		else
			bit_flag <= 1'b0;
end

always@(posedge clk,negedge rst_n)//数据个数计数器驱动逻辑
begin
	if(rst_n == 0)	
		bit_cnt <= 4'd0;
	else	
		if((bit_cnt == 4'd8)&&(bit_flag == 1'b1))
			bit_cnt <= 4'd0;
		else 
			if(bit_flag == 1'b1)
				bit_cnt <= bit_cnt + 1'b1;
			else
				bit_cnt <= bit_cnt;
end

always@(posedge clk,negedge rst_n)//接收数据并位
begin
    if(rst_n == 0)
        rx_data <= 8'd0;
    else
        if((bit_cnt >= 4'd1)&&(bit_cnt <= 4'd8)&&(bit_flag == 1'b1))
            rx_data <= {reg3,rx_data[7:1]};
end

always@(posedge clk,negedge rst_n)//输入数据并位结束信号
begin
    if(rst_n == 0)
        rx_flag <= 1'b0;
    else 
        if((bit_cnt == 4'd8)&&(bit_flag == 1'b1))
            rx_flag <= 1'b1;
        else
            rx_flag <= 1'b0;
end

always@(posedge clk,negedge rst_n)//输出数据传递
begin
    if(rst_n == 0)
        po_data <= 8'd0;
    else 
        if(rx_flag == 1'b1)
            po_data <= rx_data;
        else
            po_data <= po_data;
end

always@(posedge clk,negedge rst_n)//输出使能
begin
    if(rst_n == 0)
        po_flag <= 1'b0;
    else 
        po_flag <= rx_flag;
end

endmodule

数据生成

module vga_data(

    input 					clk_ram	,
	 input               clk     	,
    input               rst_n   	,
	 input[9:0]				pix_x		,
	 input[9:0]				pix_y		,
	 input[7:0]				po_data	,	//接收到的数据
	 input  					po_flag	,	//数据输出有效
	 
	 
	 output [7:0]		vga_rgb_t

);

parameter 	show_h = 10'd110,//定位点X坐标
				show_v = 10'd100;//定位点Y坐标
				
parameter 	show_chan = 10'd256,//图片长度
				show_kuan = 10'd32;//图片宽度

parameter 	show_1_rgb = 8'b000_000_00,//背景
				show_0_rgb = 8'b111_100_00;//图片颜色
				
parameter 	pot_h = 10'd120,//定位点X坐标
				pot_v = 10'd100;//定位点Y坐标
					
parameter 	chan = 10'd100,//图片长度
				kuan = 10'd100;//图片宽度	

reg [255:0]	char	[31:0];//存储字符数据
wire[9:0]	char_x;
wire[9:0]	char_y;

reg [07:0]vga_rgb;
wire[07:0]rom_data;//存储RAM数据
reg [13:0]addr;//ip核读地址
reg [13:0]wier;//ip核写地址
wire rd_en ;//ip核读使能
				
assign char_x =((pix_x >= show_h)&&(pix_x < (show_h + show_chan)))&&((pix_y >= show_v)&&(pix_y <(show_v + show_kuan)))?(pix_x - show_h):10'h3ff;
assign char_y =((pix_x >= show_h)&&(pix_x < (show_h + show_chan)))&&((pix_y >= show_v)&&(pix_y <(show_v + show_kuan)))?(pix_y - show_v):10'h3ff;

always@(posedge clk)
begin
	char[0  ] <= 256'h0000000000000000000000000001000000200000000100000020000000010000; 
	char[1  ] <= 256'h0020000000010000003FFFFFFFFF0000003FFFFFFFFF0000003FFFFFFFFF0000;
	char[2  ] <= 256'h003FFFFFFFFF0000003000180001000000300018000100000030001800010000;
	char[3  ] <= 256'h0030001800010000003000180000000000300018000000000030001800000000;
	char[4  ] <= 256'h003000180000000000300018000000000030003C000000000030007E00000000;
	char[5  ] <= 256'h003803FFE00000000038000000000000003C000000000000003E000000000000;
	char[6  ] <= 256'h003F8000000000000003C0000000000000006000000000000000000000000000;
	char[7  ] <= 256'h0000000000000000000000000000000000000000000000000000000000000000;
	char[8  ] <= 256'h0000000000000000000000000001000000200000000100000020000000010000;
	char[9  ] <= 256'h0020000000010000003FFFFFFFFF0000003FFFFFFFFF0000003FFFFFFFFF0000;
	char[10 ] <= 256'h003FFFFFFFFF0000003000060001000000300006000100000030000600010000;
	char[11 ] <= 256'h0030000600010000003000060000000000300006000000000030000600000000;
	char[12 ] <= 256'h00300006000000000038000E000000000038000E00000000001C001C00000000;
	char[13 ] <= 256'h001E003C00000000000F80F800000000000FFFF8000000000007FFF000000000;
	char[14 ] <= 256'h0001FFC00000000000007F000000000000000000000000000000000000000000;
	char[15 ] <= 256'h0000000000000000000000000000000000000000000000000000000000000000;
	char[16 ] <= 256'h00000000000000000000000000000000000000FFE000000000000FFFFE000000;
	char[17 ] <= 256'h00007FFFFF8000000000FFFFFFE000000003FE001FF800000007E00000FC0000;
	char[18 ] <= 256'h000F0000003C0000001E0000000E0000001C0000000600000038000000070000;
	char[19 ] <= 256'h0030000000030000003000000003000000300000000300000030000100030000;
	char[20 ] <= 256'h00300001000300000018000100060000001C0001800E0000001E0001FFFC0000;
	char[21 ] <= 256'h001F8001FFF80000001FF001FFF8000000003801FFF800000000000180000000;
	char[22 ] <= 256'h0000000100000000000000010000000000000001000000000000000000000000;
	char[23 ] <= 256'h0000000000000000000000000000000000000000000000000000000000000000;
	char[24 ] <= 256'h00000000000100000000000000010000000000000003000000000000001F0000;
	char[25 ] <= 256'h0000000001FF0000000000001FE3000000000001FC0100000000001FC0010000;
	char[26 ] <= 256'h000001FCC000000000001FC0C00000000001FC00C0000000001FC000C0000000;
	char[27 ] <= 256'h003E0000C0000000007F0000C0000000007FF000C0000000003FFF00C0000000;
	char[28 ] <= 256'h0001FFF0C000000000001FFFC0000000000001FFFC0100000000001FFFC10000;
	char[29 ] <= 256'h00000001FFFF0000000000000FFF00000000000000FF000000000000000F0000;
	char[30 ] <= 256'h0000000000030000000000000001000000000000000100000000000000000000;
	char[31 ] <= 256'h0000000000000000000000000000000000000000000000000000000000000000;
end

always @(posedge clk,negedge rst_n)
begin
	if(rst_n == 0)
		vga_rgb <= show_1_rgb;
	else
		if(	((pix_x >= show_h - 1'b1)&&(pix_x < (show_h + show_chan - 1'b1)))
			&&	((pix_y >= show_v )&&(pix_y <(show_v + show_kuan)))
			&&	(char[char_y][10'd255 - char_x] == 1'b1))
			vga_rgb  <= show_0_rgb;
		else
			vga_rgb <= show_1_rgb;
end

assign rd_en = (((pix_x >=  pot_h)&&(pix_x < pot_h + chan))&&((pix_y >= pot_v)&&(pix_y <pot_v + kuan)))? 1'b1:1'b0;//ip核图片显示区域

always @(posedge clk,negedge rst_n)//读地址
begin
	if(rst_n == 0)
		addr <= 14'd0;
	else
		if(addr == 14'd9999)
			addr <= 14'd0;
		else
			if(rd_en == 1'b1)
				addr <= addr + 14'd1;
			else
				addr <= addr;
end

always @(posedge clk_ram,negedge rst_n)//写地址
begin
	if(rst_n == 0)
		wier <= 14'd0;
	else
		if((wier == 14'd9999)&&(po_flag == 1'b1))
			wier <= 14'd0;
		else
			if(po_flag == 1'b1)
				wier <= wier + 14'd1;
			else
				wier <= wier;
end			

my_ram	my_ram_inst (
	.data 		( po_data			),
	.inclock 	( clk_ram	 		),
	.outclock 	( clk				 	),
	.rdaddress 	( addr 				),
	.wraddress 	( wier 				),
	.wren 		( ~po_flag 			),
	
	.q 			( rom_data 			)
	);

assign vga_rgb_t = (rd_en)?rom_data:vga_rgb;

endmodule 

顶层连线

module RS232_vga(

	input   			clk		,
	input				rst_n		,
	input				rx			,
	
	output			hs			,
	output			vs			,
	output[7:0]		rgb		

);

wire clk_50;
wire clk_25;
wire rst_en;

wire[7:0]po_data;	//接收到的数据
wire po_flag;		//数据输出有效

wire[9:0]vga_h;//坐标
wire[9:0]vga_v;//坐标

wire[7:0]in_rgb;

my_pll	my_pll_inst (
	.areset 	(~rst_n 	),
	.inclk0 	( clk 	),
	.c0 		( clk_50 ),
	.c1 		( clk_25 ),
	.locked 	( rst_en )
);

uart_rx uart_rx(
	.clk		(clk_50	),
	.rst_n 	(rst_en 	),		
	.rx		(rx		),
          
	.po_data	(po_data),	//接收到的数据
	.po_flag	(po_flag)//数据输出有效

);

vga_ctrl vga_ctrl(

	.clk		(clk_25	)	,
	.rst_n	(rst_en	)	,
	.in_rgb	(in_rgb	)	,
   
	.volid_en()	,
	.vga_hs	(hs		)	,
	.vga_vs	(vs		)	,
	.vga_h	(vga_h	)	,//坐标
	.vga_v	(vga_v	)	,//坐标
	.vga_rgb	(rgb		)	
);

vga_data vga_data(

	 .clk_ram	(clk_50		) 	,
    .clk     	(clk_25  	)	,
    .rst_n   	(rst_en  	)	,
	 .pix_x		(vga_h		)	,
	 .pix_y		(vga_v		)	,
	 .po_data	(po_data		)	,
	 .po_flag	(po_flag		)	,
	 
	 .vga_rgb_t	(in_rgb		)	

);

endmodule

仿真代码

`timescale 1ns/1ps
module vga_driver_tb();

	reg   			clk		;
	reg				rst_n		;
	reg				rx			;
	
	wire				hs			;
	wire				vs			;
	wire[7:0]		rgb		;		

RS232_vga vga_driver_instx(

	.clk		(clk	)	,
	.rst_n	(rst_n)	,
	.rx		(rx   )	,
	
	.hs		(hs	)	,//行脉冲信号,由列计数器控制产生
	.vs		(vs	)	,//场脉冲信号,由行计数器控制产生
	.rgb		(rgb	)		
			
);

initial clk = 1'b1;
always #10 clk = ~clk;

initial begin
	rst_n = 1'b0;
	rx = 1'b1;
	#40
	rst_n = 1'b1;
	#200
	re_byte();
	#1000000
	$stop;
end
//赋值函数
		task	rx_bit(

			input [7:0]data
			
		);

		integer i;

		for(i = 0;i < 10; i = i + 1)//循环9次
				begin
					case(i)
						0:  rx <= 1'b0;
						1:  rx <= data[0];
						2:  rx <= data[1];
						3:  rx <= data[2];
						4:  rx <= data[3];
						5:  rx <= data[4];
						6:  rx <= data[5];
						7:  rx <= data[6];
						8:  rx <= data[7];
						9:  rx <= 1'b1;
					endcase
				#(5208*20);//每次延时
				end
		endtask
	
		task re_byte();
			integer j;
				for(j = 0;j < 8;j = j + 1)
					rx_bit(j);//传递0——7,8个数据
		endtask
	
endmodule

三、仿真验证

运行仿真,观察输出波形。

上图完成了4帧数据的输出,对一帧数据进行放大观察

两条黄色标线区域中为图片数据,接下来追踪该图片数据来源

可以看到在图片区域rgb数据输出的数据来自于IP核rom,实验成功

参考资料

UART通信实现与验证(RS232)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跨境电商静态IP选择:机房IP还是住宅IP?

在跨境电商日益繁荣的今天&#xff0c;选择合适的静态IP代理对于网店的成功至关重要。代理IP不仅影响着店铺的网络连接速度和稳定性&#xff0c;还直接关系到店铺的安全性和防封能力。对于跨境网店而言&#xff0c;有静态机房IP和静态住宅IP两种选择。那么&#xff0c;究竟哪种…

病理切片染色标准化以及虚拟染色的系统总结|专题总结·24-08-30

小罗碎碎念 本期推文主题&#xff1a;虚拟染色及染色标准化在病理AI中的应用 昨晚1群在讨论虚拟染色和染色标准化&#xff0c;2群在讨论病理基础模型&#xff0c;二者恰好互补了&#xff0c;哈哈。 染色标准化的文章大致分为两种类型——一种是专门研究标准化&#xff0c;还有…

大模型Prompt提示设计简介(1)

提示设计是一门艺术&#xff0c;它涉及到精心构思的语句&#xff0c;旨在从语言模型中激发出我们渴望得到的回复。编写一个结构精巧、引人入胜的提示&#xff0c;是确保我们从语言模型那里获得既准确又高质量的答案的关键步骤。在这篇文章中&#xff0c;我们将深入探讨一些基本…

SQL 注入之 sqlmap 实战

在网络安全领域&#xff0c;SQL 注入攻击一直是一个严重的威胁。为了检测和利用 SQL 注入漏洞&#xff0c;安全人员通常会使用各种工具&#xff0c;其中 sqlmap 是一款非常强大且广泛使用的开源 SQL 注入工具。本文将详细介绍 sqlmap 的实战用法。 一、sqlmap 简介 sqlmap 是一…

Nat Commun系列|如何像搭积木一样去搭建你自己的病理AI模型框架|专题总结·24-08-30

小罗碎碎念 前情铺垫 今天的第一篇推文更偏向理论知识&#xff0c;分享了多篇综述&#xff0c;帮助大家快速了解病理切片染色标准化和虚拟染色的内容。 那么这期推文则是补充第一篇推文没有涉及的部分——染色标准化如何作为预处理流程出现在整体的框架中——准备了三篇Nature…

【中仕公考是骗子吗】公务员联考是什么意思?

公务员联考是指由多个省份在同一时间举行招录考试&#xff0c;并且这些省份在考试内容上保持较高的一致性。参与联考的省份往往采用同一套或相近的试卷&#xff0c;在具体的题量、难度或题型分布上可能会根据各自情况进行调整&#xff0c;同时可能加入一些具有本省特色的元素。…

基于web旅游信息平台的设计与实现

三、系统分析 &#xff08;一&#xff09;识别参与者 对于平台功能需求的分析&#xff0c;我们定位了四种参与者&#xff1a;普通用户、注册用户、企业级用户、网站维护人员。现对参与者描述如下&#xff1a; &#xff08;1&#xff09;普通用户 描述&#xff1a;可以注册成…

安全帽佩戴监测摄像机

安全帽是工业生产中必不可少的安全防护装备&#xff0c;能有效保护工人头部免受意外伤害。然而&#xff0c;管理人员往往难以监督工人是否正确佩戴安全帽&#xff0c;这可能导致一些潜在的安全隐患。为了解决这一问题&#xff0c;一种新型的安全帽佩戴监测摄像机 应运而生。 这…

python基础(13魔法方法介绍)

python系列文章目录 python基础&#xff08;01变量&数据类型&运算符&#xff09; python基础&#xff08;02序列共性&#xff09; python基础(03列表和元组) python基础&#xff08;04字符串&字典&#xff09; python基础&#xff08;05集合set&#xff09; pytho…

docker Desktop报错 error pulling image configuration 处理

问题描述 在 docker 拉数据 出现以下错误 error pulling image configurarion&#xff1a; 这个问题 主要是 可能应该某些原因不能网络无法连上镜像 原因分析&#xff1a; 1。 2024年 5月以后 国内很多IP都 。。。懂的都懂&#xff0c;很多 VPN 也是。。。 懂的都懂&#x…

Edge资源占用优化:调整浏览器设置与关闭自动更新检查

最近&#xff0c;作者在学习过程中&#xff0c;打开任务管理器的时候注意到&#xff0c;即使没有打开浏览器&#xff0c;edge依然有着内存占用较高的情况&#xff1a; 于是就在网上收集了一些后台调优的方法&#xff0c;如果各位朋友有更多优化浏览器资源占用的方法&#xff0c…

ansible自动化运维项目详细讲解

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; Ansible 是一个开源的自动化工具&#xff0c;主要用于配置管理、应用部署、任务自动化和IT编排。在实际的运维项目中&#xff0c;Ansible可以帮助运维工程师以一致、可重复和可靠的方式管理大量服务器和服务…

论文翻译:Scaling Instruction-Finetuned Language Models

Scaling Instruction-Finetuned Language Models https://www.jmlr.org/papers/volume25/23-0870/23-0870.pdf 指令微调语言模型 文章目录 指令微调语言模型摘要1. 引言2. Flan微调2.1 微调数据2.2 微调过程2.3 评估协议 3. 扩展到5400亿参数和1836个任务4. 带有思维链注释的微…

python实战二-筛选多个Excel中数据

筛选12个月中单日销售额大于300的数据&#xff0c;并将符合条件数据存储到新表中。 import time from openpyxl import Workbook, load_workbook import os """ 筛选销售额大于300的销售数据&#xff0c;创建新表存储 """ def 筛选数据(file_dir…

iOS 模拟器打不开:unable to boot the simulator

重启电脑后发现模拟器打不开&#xff0c;提示如下&#xff1a; 解决方法&#xff1a; 1、在Finder里command shift G前往文件夹 ~/Library/Developer/CoreSimulator/Caches2、删除Caches文件里面的dyld文件 3、重启模拟器即可

前缀和2️⃣-二维前缀和

题目链接&#xff1a;**【模板】二维前缀和_牛客题霸_牛客网** 题目描述&#xff1a; 解法&#xff1a; 算法思路&#xff1a; 类比于一维数组的形式&#xff0c;如果我们能处理出来从[0, 0] 位置到 [i, j] 位置这片区域内所有元素的累加和&#xff0c;就可以在O(1) 的时间内…

BioEdit 序列比对编辑器

软件介绍 BioEdit是一个功能齐全免费的分子生物学应用软件&#xff0c;可以完成核苷酸序列和蛋白质序列进行所有常规的分析操作。 如&#xff1a;序列比对、序列检索、引物设计、系统发育分析等。与DNAMAN 相比&#xff0c;其分析内容相对更丰富一些&#xff0c;而且提供了很…

一种基于YOLOv10的高精度光伏板缺陷检测算法(原创自研),适用缺陷检测场景、小缺陷场景

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文原创自研算法&#xff1a;一种基于YOLOv10的高精度光伏板缺陷检测算法&#xff0c;魔改SPPF_attention一种新颖的基于内容引导注意力(CGA)的混合融合&#xff0c;mAP50从原始的0.838提升至0.868 &#x1f4a1;&#x1f4a1;&…

3D Tiles的4x4的仿射变换矩阵

前言 项目需要&#xff0c;使用Cesium技术&#xff0c;把STL格式模型加载进去。 一、格式转换 第一步&#xff0c;先将STL文件转换为glTF格式 第二步&#xff0c;将glTF文件转换为3D Tiles格式&#xff0c;使用Cesium ion 二、矩阵整体结构 这个矩阵是一个4x4的仿射变换矩阵&…

探索多模态人工智能:融合视觉、语言与声音的未来智能系统

前言 在这个信息爆炸的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的每一个角落&#xff0c;从智能手机的语音助手到自动驾驶汽车&#xff0c;再到医疗诊断和个性化推荐系统。然而&#xff0c;随着技术的进步&#xff0c;我们对智能系统的要求也在不…