【FPGA项目】bin文件ram存取回环测试

news2024/12/23 20:43:24

🎉欢迎来到FPGA专栏~bin文件ram存取回环测试


  • ☆* o(≧▽≦)o *☆~我是小夏与酒🍹
  • 博客主页:小夏与酒的博客
  • 🎈该系列文章专栏:FPGA学习之旅
  • 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️
    FPGQ2

CSDN

🎉 目录-bin文件ram存取回环测试

  • 一、效果演示
    • 🥝演示视频
    • 🥝结果分析
  • 二、说明
  • 三、bin文件的生成
    • 🔸bin文件介绍
    • 🔸为什么使用bin文件作为数据载体发送给FPGA
    • 🔸matlab生成bin文件
  • 四、串口收发模块
  • 五、回环系统搭建
    • 🍍系统功能描述
    • 🍍ram ip核设置
    • 🍍RTL视图
    • 🍍系统完整代码

遇见未来

一、效果演示

使用matlab生成1001-10032位随机整型数据,并将数据保存为bin文件;通过带有bin文件收发功能的串口调试助手发送给FPGA,再接收FPGA的回环数据。

🥝演示视频

演示视频-【FPGA】bin文件ram存取回环测试

🥝结果分析

matlab生成的随机数:
生成

串口助手接收结果:
结果
分析:
将串口助手接收框内的数据转换成10进制,并与matlab生成的数据进行对比,数值一致;串口助手接收框内的有效数据个数为100个,与matlab生成的数据个数一致;接收框内最后出现了FF,这个数据并不是bin文件中的数据,而是串口助手最后发送给FPGA的发送指令,该指令也被存入到了ram中(为了避免该现象的出现,可以在FPGA中对数据进行相关的判断处理,或者使用vio进行控制,即可解决)。

二、说明

需要该项目中的串口助手软件或者项目工程文件的小伙伴,直接加入QQ群,在群文件中搜索下载即可QQ群862135231
matlab版本:R2020b
vivado版本:2020.2
开发板型号:AXKU040
接口连接如下所示:
接口

三、bin文件的生成

🔸bin文件介绍

bin文件是二进制文件的缩写,通常用于存储计算机程序或数据。它们可以包含各种类型的信息,例如操作系统、应用程序和媒体文件。bin文件是计算机系统中最基本的文件类型之一,通常需要特定的软件才能打开和读取。
不同类型的bin文件可能需要不同的软件来打开,例如,图像bin文件可能需要图像查看器来打开,而文档bin文件可能需要文本编辑器来打开。

重点在这:
bin文件可以储存大量数据的二进制形式!

🔸为什么使用bin文件作为数据载体发送给FPGA

ChatGPT的回答:
bin文件作为一种固定的二进制数据格式,具有以下优点,使其成为向FPGA发送数据的常用载体:

  1. 紧凑性:bin文件通常比其他格式更紧凑,减少了数据传输的带宽和存储空间需求。
  2. 高效性:FPGA可以直接读取和处理二进制数据,而不需要进行格式转换,提高了数据处理的效率
  3. 准确性:bin文件中的数据以精确的二进制形式表示,确保了数据的准确性和完整性。
  4. 通用性:bin文件是一种广泛使用的格式,可以在不同的系统和硬件平台之间进行传输和使用。

🔸matlab生成bin文件

运行如下代码,会在matlab脚本的根目录下生成bin文件:

%% bin文件生成代码
%----------------------------------------------------
% 首先生成1-100的double类型随机整数;
% 将double类型随机整数转换为32位数据;
% 将转换后的数据保存为bin文件。
%----------------------------------------------------
clear;
clc;
close all;
% 生成1-100的double类型随机整数
random_numbers = randi([1 100], 1, 100);

% 将double类型数据转换为uint32类型
random_numbers_uint32 = uint32(random_numbers);

% 将数据保存为bin文件
fid = fopen('random_numbers.bin', 'wb');
fwrite(fid, random_numbers_uint32, 'uint32');
fclose(fid);

disp('随机数已生成并保存为 random_numbers.bin');

四、串口收发模块

关于串口收发模块的详细讲解,请点击如下两篇文章进行学习:
串口发送模块:【FPGA零基础学习之旅#13】串口发送模块设计与验证;
串口接收模块:【FPGA零基础学习之旅#15】串口接收模块设计与验证(工业环境)。

在此附上模块代码:

串口发送模块:

//
//模块名称:串口发送模块
//
module uart_byte_tx(
	input 		Clk,
	input 		Rst_n,
	input [7:0]	data_byte,
	input 		send_en,
	input [2:0]	baud_set,
	
	output reg uart_tx,
	output reg Tx_Done,
	output reg uart_state
);

	reg bps_clk;//波特率时钟
	
	reg [15:0]div_cnt;//分频计数器
		
	reg [15:0]bps_DR;//分频计数最大值
	
	reg [3:0]bps_cnt;//波特率计数时钟
		
	//定义数据的起始位和停止位
	localparam START_BIT = 1'b0;
	localparam STOP_BIT  = 1'b1;
	
	reg [7:0]r_data_byte;//数据寄存器
	
//--------<uart状态模块>--------	
	always@(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)
			uart_state <= 1'b0;
		else if(send_en)
			uart_state <= 1'b1;
		else if(bps_cnt == 4'd11)//bps_cnt计数达到11次,即发送结束
			uart_state <= 1'b0;
		else
			uart_state <= uart_state;
	end

//--------<使能分频计数模块>-------	
//	assign en_cnt = uart_state;
	
//--------<寄存待发送的数据,使数据保持稳定>--------
	always@(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)
			r_data_byte <= 8'd0;
		else if(send_en)
			r_data_byte <= data_byte;
		else
			r_data_byte <= r_data_byte;
	end
	
//--------<波特率查找表>--------		
	always@(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)
			bps_DR <= 16'd5207;
		else begin
			case(baud_set)
				0:bps_DR <= 16'd5207;
				1:bps_DR <= 16'd2603;
				2:bps_DR <= 16'd1301;
				3:bps_DR <= 16'd867;
				4:bps_DR <= 16'd433;
				default:bps_DR <= 16'd5207;
			endcase
		end	
	end
	
//--------<Div_Cnt模块>--------	
//得到不同计数周期的计数器
	always@(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)
			div_cnt <= 16'd0;
		else if(uart_state)begin	//	assign en_cnt = uart_state;
			if(div_cnt == bps_DR)
				div_cnt <= 16'd0;
			else
				div_cnt <= div_cnt + 1'b1;
		end
		else
			div_cnt <= 16'd0;
	end
//--------<bps_clk信号的产生>--------	
	always@(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)
			bps_clk <= 1'b0;
		else if(div_cnt == 16'd1)
			bps_clk <= 1'b1;
		else
			bps_clk <= 1'b0;
	end
	
//--------<bps_cnt计数模块>--------		
	always@(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)
			bps_cnt <= 4'd0;
		else if(bps_cnt == 4'd11)//clr信号
			bps_cnt <= 4'd0;
		else if(bps_clk)
			bps_cnt <= bps_cnt + 1'b1;
		else
			bps_cnt <= bps_cnt;
	end

//--------<Tx_Done模块>--------	
	always@(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)
			Tx_Done <= 1'b0;
		else if(bps_cnt == 4'd11)
			Tx_Done <= 1'b1;
		else
			Tx_Done <= 1'b0;
	end
	
//--------<数据位输出模块-10选1多路器>--------	
	always@(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)
			uart_tx <= 1'b1;
		else begin
			case(bps_cnt)
				0:uart_tx <= 1'b1;
				1:uart_tx <= START_BIT;
				2:uart_tx <= r_data_byte[0];
				3:uart_tx <= r_data_byte[1];
				4:uart_tx <= r_data_byte[2];
				5:uart_tx <= r_data_byte[3];
				6:uart_tx <= r_data_byte[4];
				7:uart_tx <= r_data_byte[5];
				8:uart_tx <= r_data_byte[6];
				9:uart_tx <= r_data_byte[7];
				10:uart_tx <= STOP_BIT;
				default:uart_tx <= 1'b1;
			endcase
		end
	end
	
endmodule

串口接收模块:

//
//模块名称:串口接收模块(工业环境)
//
module uart_byte_rx(
	input 					Clk,//50M
	input 					Rst_n,
	input 			[2:0]	baud_set,
	input 					data_rx,
	output 	reg 	[7:0]	data_byte,
	output 	reg			Rx_Done
);

	reg s0_Rx,s1_Rx;//同步寄存器
	
	reg tmp0_Rx,tmp1_Rx;//数据寄存器
	
	reg [15:0]bps_DR;//分频计数器计数最大值
	reg [15:0]div_cnt;//分频计数器
	reg bps_clk;//波特率时钟
	reg [7:0]bps_cnt;
	
	reg uart_state;
	
	reg [2:0] r_data_byte [7:0];
	
	reg [2:0]START_BIT;
	reg [2:0]STOP_BIT;
	
	wire nedge;
	
//--------<同步寄存器处理>--------		
//用于消除亚稳态
	always@(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)begin
			s0_Rx <= 1'b0;
			s1_Rx <= 1'b0;
		end
		else begin
			s0_Rx <= data_rx;
			s1_Rx <= s0_Rx;
		end
	end
	
//--------<数据寄存器处理>--------		
	always@(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)begin
			tmp0_Rx <= 1'b0;
			tmp1_Rx <= 1'b0;
		end
		else begin
			tmp0_Rx <= s1_Rx;
			tmp1_Rx <= tmp0_Rx;
		end
	end
	
//--------<下降沿检测>--------	
	assign nedge = !tmp0_Rx & tmp1_Rx;
	
//--------<div_cnt模块>--------	
//得到不同计数周期的计数器
	always@(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)
			div_cnt <= 16'd0;
		else if(uart_state)begin
			if(div_cnt == bps_DR)
				div_cnt <= 16'd0;
			else
				div_cnt <= div_cnt + 1'b1;
		end
		else
			div_cnt <= 16'd0;
	end
//--------<bps_clk信号的产生>--------	
	always@(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)
			bps_clk <= 1'b0;
		else if(div_cnt == 16'd1)
			bps_clk <= 1'b1;
		else
			bps_clk <= 1'b0;
	end
	
//--------<bps_clk计数模块>--------		
	always@(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)
			bps_cnt <= 8'd0;
		else if(bps_cnt == 8'd159 || (bps_cnt == 8'd12 && (START_BIT > 2)))
			bps_cnt <= 8'd0;
		else if(bps_clk)
			bps_cnt <= bps_cnt + 1'b1;
		else
			bps_cnt <= bps_cnt;
	end
	
//--------<Rx_Done模块>--------	
	always@(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)
			Rx_Done <= 1'b0;
		else if(bps_cnt == 8'd159)
			Rx_Done <= 1'b1;
		else
			Rx_Done <= 1'b0;
	end	
	
//--------<波特率查找表>--------		
	always@(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)
			bps_DR <= 16'd324;
		else begin
			case(baud_set)
				0:bps_DR <= 16'd324;
				1:bps_DR <= 16'd162;
				2:bps_DR <= 16'd80;
				3:bps_DR <= 16'd53;
				4:bps_DR <= 16'd26;
				default:bps_DR <= 16'd324;
			endcase
		end	
	end

//--------<采样数据接收模块>--------	
	always@(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)begin
			START_BIT <= 3'd0;
			r_data_byte[0] <= 3'd0; 
			r_data_byte[1] <= 3'd0;
			r_data_byte[2] <= 3'd0; 
			r_data_byte[3] <= 3'd0;
			r_data_byte[4] <= 3'd0; 
			r_data_byte[5] <= 3'd0;
			r_data_byte[6] <= 3'd0; 
			r_data_byte[7] <= 3'd0;
			STOP_BIT <= 3'd0;
		end
		else if(bps_clk)begin
			case(bps_cnt)
				0:begin
					START_BIT <= 3'd0;
					r_data_byte[0] <= 3'd0;
					r_data_byte[1] <= 3'd0;
					r_data_byte[2] <= 3'd0;
					r_data_byte[3] <= 3'd0;
					r_data_byte[4] <= 3'd0;
					r_data_byte[5] <= 3'd0;
					r_data_byte[6] <= 3'd0;
					r_data_byte[7] <= 3'd0;
					STOP_BIT <= 3'd0; 
				end
				6,7,8,9,10,11:START_BIT <= START_BIT + s1_Rx;
				22,23,24,25,26,27:r_data_byte[0] <= r_data_byte[0] + s1_Rx;
				38,39,40,41,42,43:r_data_byte[1] <= r_data_byte[1] + s1_Rx;
				54,55,56,57,58,59:r_data_byte[2] <= r_data_byte[2] + s1_Rx;
				70,71,72,73,74,75:r_data_byte[3] <= r_data_byte[3] + s1_Rx;
				86,87,88,89,90,91:r_data_byte[4] <= r_data_byte[4] + s1_Rx;
				102,103,104,105,106,107:r_data_byte[5] <= r_data_byte[5] + s1_Rx;
				118,119,120,121,122,123:r_data_byte[6] <= r_data_byte[6] + s1_Rx;
				134,135,136,137,138,139:r_data_byte[7] <= r_data_byte[7] + s1_Rx;
				150,151,152,153,154,155:STOP_BIT <= STOP_BIT + s1_Rx;
				default:begin
					START_BIT <= START_BIT;
					r_data_byte[0] <= r_data_byte[0];
					r_data_byte[1] <= r_data_byte[1];
					r_data_byte[2] <= r_data_byte[2];
					r_data_byte[3] <= r_data_byte[3];
					r_data_byte[4] <= r_data_byte[4];
					r_data_byte[5] <= r_data_byte[5];
					r_data_byte[6] <= r_data_byte[6];
					r_data_byte[7] <= r_data_byte[7];
					STOP_BIT <= STOP_BIT;
				end
			endcase
		end
	end

//--------<数据状态判定模块>--------	
	always@(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)
			data_byte <= 8'd0;
		else if(bps_cnt == 8'd159)begin
			data_byte[0] <= r_data_byte[0][2];
			data_byte[1] <= r_data_byte[1][2];
			data_byte[2] <= r_data_byte[2][2];
			data_byte[3] <= r_data_byte[3][2];
			data_byte[4] <= r_data_byte[4][2];
			data_byte[5] <= r_data_byte[5][2];
			data_byte[6] <= r_data_byte[6][2];
			data_byte[7] <= r_data_byte[7][2];
		end
		else
			;
	end

//--------<uart_state模块>--------	
	always@(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)
			uart_state <= 1'b0;
		else if(nedge)
			uart_state <= 1'b1;
		else if(Rx_Done || (bps_cnt == 8'd12 && (START_BIT > 2)))
			uart_state <= 1'b0;
		else
			uart_state <= uart_state;
	end

endmodule

五、回环系统搭建

🍍系统功能描述

系统串口波特率设置为115200

功能描述: 为了避免使用按键等作为触发或者控制信号,本项目使用串口指令控制整个系统的运行,因此设置了十六进制的feff指令。通过串口助手发送十六进制的fe指令使能ram的储存,再通过发送十六进制的ff指令让FPGA将ram中的数据通过串口发送出来。

🍍ram ip核设置

选择普通双端口类型:
ram1
由于串口接收到的数据位宽都是8位,将ram的输入端口设置为8位便于存储和控制,深度选择为2048,一直使能:
ram2
ram中的数据也是直接通过串口输出,因此输出端口的数据位宽也设置为8位便于控制和读取,选择使用使能引脚控制ram读取数据:
ram3
Summary中可以看到每个端口访问数据的地址位宽:
ram4

🍍RTL视图

RTL

🍍系统完整代码

uart_top.v:

`timescale 1ns / 1ps

module uart_top(
    input 	sys_clk_p,
    input 	sys_clk_n,
    input 	rst_n,
    input 	uart_rx,
    output 	uart_tx
);
	
	localparam baud_set = 3'b100;

	wire locked;
	wire clk_r;
	wire clk;

	wire [7:0] data_byte;
	reg En;
	reg send_en;

	reg [11-1:0] data_in_cnt;

	wire Rx_Done;

	wire write_en;

	reg [10:0] addrb;

	wire read_en;

	wire [7:0] data_byte_tx;

	clk50MHz instance_name
	(
	// Clock out ports
	.clk_out1(clk_r),     // output clk_out1
	// Status and control signals
	.reset(!rst_n), // input reset
	.locked(locked),       // output locked
	// Clock in ports
	.clk_in1_p(sys_clk_p),    // input clk_in1_p
	.clk_in1_n(sys_clk_n)
	);    // input clk_in1_n

	assign clk = (locked)?clk_r:1'b0;

	uart_byte_rx inst_uart_byte_rx
	(
		.Clk       (clk),
		.Rst_n     (rst_n),
		.baud_set  (baud_set),
		.data_rx   (uart_rx),
		.data_byte (data_byte),
		.Rx_Done   (Rx_Done)
	);

//--------------------<system_ctrl>--------------------------------
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)
		   En <= 1'b0;
		else if(data_byte == 8'hfe)
		   En <= 1'b1;
		else
		   En <= En;
	end

	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)
		   send_en <= 1'b0;
		else if(data_byte == 8'hff && addrb < 11'd2000)
		   send_en <= 1'b1;
		else if(addrb == 11'd2000)
		   send_en <= 1'b0;
		else
		   send_en <= send_en;
	end
//-----------------------------------------------------------------

//--------------------<data_in_cnt>--------------------------------
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)
		   data_in_cnt <= 11'd0;
		else if((En) && (data_in_cnt < 11'd2047) && Rx_Done)
		   data_in_cnt <= data_in_cnt + 1'b1;
		else if(data_in_cnt == 11'd2047)
		   data_in_cnt <= 11'd0;
		else
			data_in_cnt <= data_in_cnt;
	end
//-----------------------------------------------------------------
	
	assign write_en = (En && !(send_en))?1'b1:1'b0;

	ram_ip ram_8_2048_8
	(
		.clka	(clk),    // input wire clka
		.wea	(write_en),      // input wire [0 : 0] wea
		.addra	(data_in_cnt),  // input wire [10 : 0] addra
		.dina	(data_byte),    // input wire [7 : 0] dina
		.clkb	(clk),    // input wire clkb
		.enb	(read_en),      // input wire enb
		.addrb	(addrb),  // input wire [10 : 0] addrb
		.doutb	(data_byte_tx)  // output wire [7 : 0] doutb
	);

	assign read_en = (send_en && Tx_Done)?1'b1:1'b0;

	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)
			addrb <= 11'd0;
		else if(Tx_Done)
			addrb <= addrb + 1'b1;
		else
			addrb <= addrb;
	end
	
	uart_byte_tx inst_uart_byte_tx
	(
		.Clk        (clk),
		.Rst_n      (rst_n),
		.data_byte  (data_byte_tx),
		.send_en    (send_en),
		.baud_set   (baud_set),
		.uart_tx    (uart_tx),
		.Tx_Done    (Tx_Done),
		.uart_state ()
	);

endmodule

csdn

🧸结尾


  • ❤️ 感谢您的支持和鼓励! 😊🙏
  • 📜您可能感兴趣的内容:
  • 【FPGA零基础学习之旅#17】搭建串口收发与储存双口RAM系统
  • 【Python】串口通信-与FPGA、蓝牙模块实现串口通信(Python+FPGA)
  • 【Arduino TinyGo】【最新】使用Go语言编写Arduino-环境搭建和点亮LED灯
  • 【全网首发开源教程】【Labview机器人仿真与控制】Labview与Solidworks多路支配关系-四足爬行机器人仿真与控制
    遇见未来

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

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

相关文章

据说可以防静电和浪涌的P6KE30CA

公司有些变送器之前在最后一道校准时&#xff0c;经常发生烧毁的情况。所以在电路的防反接的M7二极管前面又增加了一个TVS二极管&#xff0c;型号P6KE30CA。但愿加了这个好使把。今天又研究了一下这个TVS管子&#xff0c;把搜索到的东西记录一下。放这里备忘把&#xff0c;忘记…

C语言| 把数组a赋给数组b

把数组a赋给数组b, 正确的写法是用for循环&#xff0c;将数组a中的元素一个一个赋给数组b的元素。 #include <stdio.h> int main(void) { int a[5] {11, 22, 33, 44, 55}; int b[5]; int i; for(i0; i<5; i) { b[i] a[i]; printf(…

Java开发工具的下载

Java开发工具的下载 IDEA概述 IDEA全称InteliJ IDEA&#xff0c;是用于Java语言开发的集成环境&#xff0c;它是业界公认的目前用于Java程序开发最 好的工具。 集成环境 把代码编写&#xff0c;编译&#xff0c;执行&#xff0c;调试等多种功能综合到一起的开发工具。 让我…

证照之星是一款很受欢迎的证件照制作软件

证照之星是一款很受欢迎的证件照制作软件&#xff0c;证照之星可以为用户提供“照片旋转、裁切、调色、背景处理”等功能&#xff0c;满足用户对证件照制作的基本需求。本站证照之星下载专题为大家提供了证照之星电脑版、安卓版、个人免费版等多个版本客户端资源&#xff0c;此…

IEC61850 调试工具 工程师必备

文章目录 IEC61850 调试工具 工程师必备主要功能软件截图 IEC61850 调试工具 工程师必备 下载地址&#xff1a;http://www.redisant.cn/iec61850client IEC 61850 是国际电工委员会&#xff08;IEC&#xff09;制定的一项国际标准&#xff0c;主要用于电力系统自动化领域&…

后端跨域问题的处理

问题描述 在做前后端分离的项目时&#xff0c;很有可能会遇到这样一种情况&#xff1a; 就是在游览器中请求后端的接口&#xff0c;出现了 CORS error 错误 报错信息如下&#xff1a; Access to XMLHttpRequest at http://localhost:8860/user/auth/login from origin http:…

常见的 EVM 版本以及它们的区别

EVM&#xff08;以太坊虚拟机&#xff09;版本的演进是为了引入新的特性和改进以太坊平台的安全性、效率和功能性。每个版本通常伴随着以太坊网络的硬分叉&#xff0c;这是以太坊协议的重大升级。以下是一些常见的EVM版本及其主要区别&#xff1a; Homestead (2016年3月)&…

图像生成新篇章:Stable Diffusion 3 Medium开源评析

摘要 在数字艺术与人工智能的交汇点上&#xff0c;Stable Diffusion 3&#xff08;SD3&#xff09;的开源无疑是一场技术革新的盛宴。就在3月份&#xff0c;我撰写了一篇博文&#xff0c;深入探讨了SD3的技术报告内容与介绍&#xff0c;文章发表在CSDN博客上&#xff0c;https:…

同城如何异地共享文件?

在现代社会中&#xff0c;跨地区的合作变得越来越普遍&#xff0c;而这也带来了共享文件的需求。当我们身处不同的城市&#xff0c;如何高效地共享文件已经成为一项迫切的需求。本文将介绍一种名为“同城异地共享文件”的解决方案&#xff0c;帮助解决这一问题。 2. 天联组网—…

Day02 顺序表

目录 1、顺序表 2、随机访问&顺序访问 3、思考 4、顺序表的封装 1、顺序表 数组在数据结构中是属于线性表的一种&#xff0c;线性表是由一组具有n个相同类型的数据元素组成的。线性表中的任何一个数据元素 有且只有一个直接前驱有且只有一个直接后继首元素是没有前驱的…

学习Java中的Future类

学习Java中的Future类 Future接口在Java 5中引入&#xff0c;作为java.util.concurrent包的一部分。它代表一个异步计算的结果&#xff0c;当计算完成时可以通过Future对象获取结果。Future对象提供了一些方法来检查任务是否完成、等待任务完成并获取任务结果、取消任务等。 …

【python】tkinter编程三大布局管理器pack、grid、place应用实战解析

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

leetcode240 搜索二维矩阵II

题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18…

redis序列化

文章目录 1、为什么要进行序列化操作&#xff1f;2、序列化方式2.1、自定义序列化2. 2、StringRedisTemplate&#xff08;重点&#xff09; 1、为什么要进行序列化操作&#xff1f; 不进行序列化向redis存入数据代码&#xff1a; SpringBootTest class RedisDemoApplicationT…

渗透测试练习题解析 6 (CTF web)

1、[HCTF 2018]admin 1 考点&#xff1a;二次注入 先注册一个账号看看&#xff0c;注册 admin 会提示该用户名已存在&#xff0c;那我们就换一个用户名 观察页面功能&#xff0c;存在一个修改密码&#xff0c;开始的思路是想看看能否通过该密码功能抓包然后修改用户名为 admin …

RAG_Example

今天尝试基于langchain进行LLM RAG搭建&#xff0c;感觉使用难度没有想象中大。具体流程参考末尾链接。 主要流程包括下面几个模块&#xff0c;每一个模块都有很多选择&#xff0c;而不是唯一解。 但这里可以感受到潜在的几个问题 1. 文本转换过程中&#xff0c;PDF的信息可…

Android framework的Zygote源码分析

文章目录 Android framework的Zygote源码分析linux的fork Android framework的Zygote源码分析 init.rc 在Android系统中&#xff0c;zygote是一个native进程&#xff0c;是Android系统上所有应用进程的父进程&#xff0c;我们系统上app的进程都是由这个zygote分裂出来的。zyg…

极限网关助力好未来 Elasticsearch 容器化升级

极限网关在好未来的最佳实践案例&#xff0c;轻松扛住日增百 TB 数据的流量&#xff0c;助力 ES 从物理机到云原生架构的改造&#xff0c;实现了流控、请求分析、安全管理、无缝迁移等场景。一次完美的客户体验~ 背景 物理机架构时代 2022 年&#xff0c;好未来整个日志 Elas…

开源AGV调度系统OpenTCS中的路由器(router)详解

OpenTCS中的任务分派器router详解 1. 引言2. 路由器(router)2.1 代价计算函数&#xff08;Cost functions&#xff09;2.2 2.1 Routing groups2.1 默认的停车位置选择2.2 可选停车位置属性2.3 默认的充电位置选择2.4 即时运输订单分配 3. 默认任务分派器的配置项4. 参考资料与源…

区间预测 | Matlab实现EVO-CNN-SVM能量谷算法优化卷积神经网络支持向量机结合核密度估计多置信区间多变量回归区间预测

区间预测 | Matlab实现EVO-CNN-SVM能量谷算法优化卷积神经网络支持向量机结合核密度估计多置信区间多变量回归区间预测 目录 区间预测 | Matlab实现EVO-CNN-SVM能量谷算法优化卷积神经网络支持向量机结合核密度估计多置信区间多变量回归区间预测效果一览基本介绍程序设计参考资…