ZYNQ--PS_PL交互(AXI_HP)

AXI_HP接口

通过AXI_HP接口,可直接通过AXI_FULL协议向DDR中通过DMA传输数据。

BD设计

在这里插入图片描述
AXI_HP接口设置
在这里插入图片描述
AXI_Master代码

module axi_full_master #
	(
		parameter  			C_M_TARGET_SLAVE_BASE_ADDR	= 32'h40000000,
		parameter integer	C_M_AXI_BURST_LEN			= 16,
		parameter integer	C_M_AXI_ID_WIDTH			= 1,
		parameter integer	C_M_AXI_ADDR_WIDTH			= 32,
		parameter integer	C_M_AXI_DATA_WIDTH			= 64,
		parameter integer	C_M_AXI_AWUSER_WIDTH		= 0,
		parameter integer	C_M_AXI_ARUSER_WIDTH		= 0,
		parameter integer	C_M_AXI_WUSER_WIDTH			= 0,
		parameter integer	C_M_AXI_RUSER_WIDTH			= 0,
		parameter integer	C_M_AXI_BUSER_WIDTH			= 0
	)
    //编码测试       
	(
		input 	wire  								M_AXI_ACLK			,
		input 	wire  								M_AXI_ARESETN		,    
		output 	wire [C_M_AXI_ID_WIDTH-1 : 0] 		M_AXI_AWID			,
		output 	wire [C_M_AXI_ADDR_WIDTH-1 : 0]     M_AXI_AWADDR		,
		output 	wire [7 : 0] 						M_AXI_AWLEN			,
		output 	wire [2 : 0] 						M_AXI_AWSIZE		,
		output 	wire [1 : 0] 						M_AXI_AWBURST		,
		output 	wire  								M_AXI_AWLOCK		,
		output 	wire [3 : 0] 						M_AXI_AWCACHE		,
		output 	wire [2 : 0] 						M_AXI_AWPROT		,
		output 	wire [3 : 0] 						M_AXI_AWQOS			,
		output 	wire [C_M_AXI_AWUSER_WIDTH-1 : 0] 	M_AXI_AWUSER		,
		output 	wire  								M_AXI_AWVALID		,
		input 	wire  								M_AXI_AWREADY		,
		output 	wire [C_M_AXI_DATA_WIDTH-1 : 0] 	M_AXI_WDATA			,
		output 	wire [C_M_AXI_DATA_WIDTH/8-1 : 0] 	M_AXI_WSTRB			,
		output 	wire  								M_AXI_WLAST			,
		output 	wire [C_M_AXI_WUSER_WIDTH-1 : 0] 	M_AXI_WUSER			,
		output 	wire  								M_AXI_WVALID		,
		input 	wire  								M_AXI_WREADY		,
		input 	wire [C_M_AXI_ID_WIDTH-1 : 0] 		M_AXI_BID			,
		input 	wire [1 : 0] 						M_AXI_BRESP			,
		input 	wire [C_M_AXI_BUSER_WIDTH-1 : 0] 	M_AXI_BUSER			,
		input 	wire  								M_AXI_BVALID		,
		output 	wire  								M_AXI_BREADY		,
		output 	wire [C_M_AXI_ID_WIDTH-1 : 0] 		M_AXI_ARID			,
		output 	wire [C_M_AXI_ADDR_WIDTH-1 : 0] 	M_AXI_ARADDR		,
		output 	wire [7 : 0] 						M_AXI_ARLEN			,
		output 	wire [2 : 0] 						M_AXI_ARSIZE		,
		output 	wire [1 : 0] 						M_AXI_ARBURST		,
		output 	wire  								M_AXI_ARLOCK		,
		output 	wire [3 : 0] 						M_AXI_ARCACHE		,
		output 	wire [2 : 0] 						M_AXI_ARPROT		,
		output 	wire [3 : 0] 						M_AXI_ARQOS			,
		output 	wire [C_M_AXI_ARUSER_WIDTH-1 : 0] 	M_AXI_ARUSER		,	
		output 	wire  								M_AXI_ARVALID		,
		input 	wire  								M_AXI_ARREADY		,
		input 	wire [C_M_AXI_ID_WIDTH-1 : 0] 		M_AXI_RID			,
		input 	wire [C_M_AXI_DATA_WIDTH-1 : 0] 	M_AXI_RDATA			,
		input 	wire [1 : 0] 						M_AXI_RRESP			,
		input 	wire  								M_AXI_RLAST			,
		input 	wire [C_M_AXI_RUSER_WIDTH-1 : 0] 	M_AXI_RUSER			,
		input 	wire  								M_AXI_RVALID		,
		output 	wire  								M_AXI_RREADY
	);

function integer clogb2(input [4:0] data_width);
	begin
		for(clogb2 = 0;data_width > 0;clogb2 = clogb2 + 1)begin
			data_width = data_width >> 1;
		end
	end
endfunction

/* parameter */
parameter 	P_BYTE_NUM_WIDTH = clogb2((C_M_AXI_DATA_WIDTH/8) - 1)  ; //假设数据位宽64,7需要三个位宽表示
parameter   P_BYTE_NUM       = C_M_AXI_DATA_WIDTH/8 ;

/* output reg */
reg [C_M_AXI_ID_WIDTH-1 : 0] 		ro_M_AXI_AWID		;
reg [C_M_AXI_ADDR_WIDTH-1 : 0]     	ro_M_AXI_AWADDR		;
reg [7 : 0] 						ro_M_AXI_AWLEN		;
reg [2 : 0] 						ro_M_AXI_AWSIZE		;
reg [1 : 0] 						ro_M_AXI_AWBURST	;
reg  								ro_M_AXI_AWLOCK		;
reg [3 : 0] 						ro_M_AXI_AWCACHE	;
reg [2 : 0] 						ro_M_AXI_AWPROT		;
reg [3 : 0] 						ro_M_AXI_AWQOS		;
reg [C_M_AXI_AWUSER_WIDTH-1 : 0] 	ro_M_AXI_AWUSER		;
reg  								ro_M_AXI_AWVALID	;
reg [C_M_AXI_DATA_WIDTH-1 : 0] 		ro_M_AXI_WDATA		;
reg [C_M_AXI_DATA_WIDTH/8-1 : 0] 	ro_M_AXI_WSTRB		;
reg  								ro_M_AXI_WLAST		;
reg [C_M_AXI_WUSER_WIDTH-1 : 0] 	ro_M_AXI_WUSER		;
reg  								ro_M_AXI_WVALID		;
reg  								ro_M_AXI_BREADY		;
reg [C_M_AXI_ID_WIDTH-1 : 0] 		ro_M_AXI_ARID		;
reg [C_M_AXI_ADDR_WIDTH-1 : 0] 		ro_M_AXI_ARADDR		;
reg [7 : 0] 						ro_M_AXI_ARLEN		;
reg [2 : 0] 						ro_M_AXI_ARSIZE		;
reg [1 : 0] 						ro_M_AXI_ARBURST	;
reg  								ro_M_AXI_ARLOCK		;
reg [3 : 0] 						ro_M_AXI_ARCACHE	;
reg [2 : 0] 						ro_M_AXI_ARPROT		;
reg [3 : 0] 						ro_M_AXI_ARQOS		;
reg [C_M_AXI_ARUSER_WIDTH-1 : 0] 	ro_M_AXI_ARUSER		;
reg  								ro_M_AXI_ARVALID	;
reg  								ro_M_AXI_RREADY		;

/* input reg */
reg [C_M_AXI_DATA_WIDTH-1 : 0] 		ri_M_AXI_RDATA		;
/* user reg */
reg [7:0]							write_cnt			;
reg [7:0]							read_cnt			;
reg									check_err			;

/* wire */
wire AW_action	;
wire W_action	; 
wire WB_action	;
wire AR_action	;
wire R_action	;

assign M_AXI_AWID		= ro_M_AXI_AWID 	;
assign M_AXI_AWADDR		= ro_M_AXI_AWADDR 	;
assign M_AXI_AWLEN		= ro_M_AXI_AWLEN 	;
assign M_AXI_AWSIZE		= ro_M_AXI_AWSIZE 	;
assign M_AXI_AWBURST	= ro_M_AXI_AWBURST 	;
assign M_AXI_AWLOCK		= ro_M_AXI_AWLOCK 	;
assign M_AXI_AWCACHE	= ro_M_AXI_AWCACHE 	;
assign M_AXI_AWPROT		= ro_M_AXI_AWPROT 	;
assign M_AXI_AWQOS		= ro_M_AXI_AWQOS 	;
assign M_AXI_AWUSER		= ro_M_AXI_AWUSER 	;
assign M_AXI_AWVALID	= ro_M_AXI_AWVALID 	;
assign M_AXI_WDATA		= ro_M_AXI_WDATA 	;
assign M_AXI_WSTRB		= ro_M_AXI_WSTRB 	;
assign M_AXI_WLAST		= ro_M_AXI_WLAST 	;
assign M_AXI_WUSER		= ro_M_AXI_WUSER 	;
assign M_AXI_WVALID		= ro_M_AXI_WVALID 	;
assign M_AXI_BREADY		= ro_M_AXI_BREADY 	;
assign M_AXI_ARID		= ro_M_AXI_ARID 	;
assign M_AXI_ARADDR		= ro_M_AXI_ARADDR 	;
assign M_AXI_ARLEN		= ro_M_AXI_ARLEN 	;
assign M_AXI_ARSIZE		= ro_M_AXI_ARSIZE 	;
assign M_AXI_ARBURST	= ro_M_AXI_ARBURST 	;
assign M_AXI_ARLOCK		= ro_M_AXI_ARLOCK 	;
assign M_AXI_ARCACHE	= ro_M_AXI_ARCACHE 	;
assign M_AXI_ARPROT		= ro_M_AXI_ARPROT 	;
assign M_AXI_ARQOS		= ro_M_AXI_ARQOS 	;
assign M_AXI_ARUSER		= ro_M_AXI_ARUSER 	;
assign M_AXI_ARVALID	= ro_M_AXI_ARVALID 	;
assign M_AXI_RREADY		= ro_M_AXI_RREADY 	;
assign AW_action 		= M_AXI_AWVALID & M_AXI_AWREADY;
assign W_action  		= M_AXI_WVALID  & M_AXI_WREADY ;
assign WB_action 		= M_AXI_BVALID  & M_AXI_BREADY ;
assign AR_action 		= M_AXI_ARVALID & M_AXI_ARREADY;
assign R_action  		= M_AXI_RVALID  & M_AXI_RREADY ;


always @(posedge M_AXI_ACLK or negedge M_AXI_ARESETN) begin
	if(!M_AXI_ARESETN) begin
		ro_M_AXI_AWID 		<= 'd0;
		ro_M_AXI_AWADDR 	<= C_M_TARGET_SLAVE_BASE_ADDR;
		ro_M_AXI_AWLEN 		<= C_M_AXI_BURST_LEN - 1;
		ro_M_AXI_AWSIZE 	<= P_BYTE_NUM_WIDTH;
		ro_M_AXI_AWBURST 	<= 2'b01;
		ro_M_AXI_AWLOCK 	<= 'd0;
		ro_M_AXI_AWCACHE 	<= 'd2;
		ro_M_AXI_AWPROT 	<= 'd0;
		ro_M_AXI_AWQOS 		<= 'd0;
		ro_M_AXI_AWUSER 	<= 'd0;
		ro_M_AXI_AWVALID 	<= 'd1;
	end
	else if(AW_action) begin
		ro_M_AXI_AWID 		<= 'd0;
		ro_M_AXI_AWADDR 	<= 'd0;
		ro_M_AXI_AWLEN 		<= 'd0;
		ro_M_AXI_AWSIZE 	<= 'd0;
		ro_M_AXI_AWBURST 	<= 'd0;
		ro_M_AXI_AWLOCK 	<= 'd0;
		ro_M_AXI_AWCACHE 	<= 'd0;
		ro_M_AXI_AWPROT 	<= 'd0;
		ro_M_AXI_AWQOS 		<= 'd0;
		ro_M_AXI_AWUSER 	<= 'd0;
		ro_M_AXI_AWVALID 	<= 'd0;
	end
end

always @(posedge M_AXI_ACLK or negedge M_AXI_ARESETN) begin
	if(!M_AXI_ARESETN)
		write_cnt <= 'd0;
	else if(write_cnt == (C_M_AXI_BURST_LEN - 1) && W_action)
		write_cnt <= 'd0;
	else if(W_action)
		write_cnt <= write_cnt + 1;
	else
		write_cnt <= write_cnt;
end

always @(posedge M_AXI_ACLK or negedge M_AXI_ARESETN) begin
	if(!M_AXI_ARESETN)begin
		ro_M_AXI_WSTRB	 <= 'd0;  
		ro_M_AXI_WUSER	 <= 'd0; 
		ro_M_AXI_WVALID	 <= 'd0; 
	end
	else if(M_AXI_WLAST)begin
		ro_M_AXI_WSTRB	 <= 'd0; 
		ro_M_AXI_WUSER	 <= 'd0; 
		ro_M_AXI_WVALID	 <= 'd0; 		
	end
	else if(AW_action)begin
		ro_M_AXI_WSTRB	 <= {P_BYTE_NUM{1'd1}}; 
		ro_M_AXI_WUSER	 <= 'd0; 
		ro_M_AXI_WVALID	 <= 'd1; 		
	end
	else begin
		ro_M_AXI_WSTRB	 <= ro_M_AXI_WSTRB ; 
		ro_M_AXI_WUSER	 <= ro_M_AXI_WUSER ; 
		ro_M_AXI_WVALID	 <= ro_M_AXI_WVALID; 		
	end
end

always @(posedge M_AXI_ACLK or negedge M_AXI_ARESETN) begin
	if(!M_AXI_ARESETN)
		ro_M_AXI_WDATA <= 'd0;
	else if(M_AXI_WLAST && W_action)
		ro_M_AXI_WDATA <= 'd0;
	else if(W_action)
		ro_M_AXI_WDATA <= ro_M_AXI_WDATA + 1;
	else
		ro_M_AXI_WDATA <= ro_M_AXI_WDATA;
end

always @(posedge M_AXI_ACLK or negedge M_AXI_ARESETN) begin
	if(!M_AXI_ARESETN)
		ro_M_AXI_WLAST <= 'd0;
	else if(ro_M_AXI_WLAST && W_action)
		ro_M_AXI_WLAST <= 'd0;
	else if(write_cnt == (C_M_AXI_BURST_LEN - 2) && W_action)
		ro_M_AXI_WLAST <= 'd1;
	else
		ro_M_AXI_WLAST <= ro_M_AXI_WLAST;	
end

always @(posedge M_AXI_ACLK or negedge M_AXI_ARESETN) begin
	if(!M_AXI_ARESETN)
		ro_M_AXI_BREADY <= 'd0;
	else if(WB_action)
		ro_M_AXI_BREADY <= 'd0;
	else if(ro_M_AXI_WLAST && W_action)
		ro_M_AXI_BREADY <= 'd1;
	else
		ro_M_AXI_BREADY <= ro_M_AXI_BREADY;	
end
/*
always @(posedge M_AXI_ACLK or negedge M_AXI_ARESETN) begin
	if(!M_AXI_ARESETN)begin
		ro_M_AXI_ARID	  <= 'd0 ;
		ro_M_AXI_ARADDR	  <= 'd0 ;
		ro_M_AXI_ARLEN	  <= 'd0 ;
		ro_M_AXI_ARSIZE	  <= 'd0 ;
		ro_M_AXI_ARBURST  <= 'd0 ;
		ro_M_AXI_ARLOCK	  <= 'd0 ;
		ro_M_AXI_ARCACHE  <= 'd0 ;
		ro_M_AXI_ARPROT	  <= 'd0 ;
		ro_M_AXI_ARQOS	  <= 'd0 ;
		ro_M_AXI_ARUSER	  <= 'd0 ;
		ro_M_AXI_ARVALID  <= 'd0 ; 
	end
	else if(AR_action)begin
		ro_M_AXI_ARID	  <= 'd0 ;
		ro_M_AXI_ARADDR	  <= 'd0 ;
		ro_M_AXI_ARLEN	  <= 'd0 ;
		ro_M_AXI_ARSIZE	  <= 'd0 ;
		ro_M_AXI_ARBURST  <= 'd0 ;
		ro_M_AXI_ARLOCK	  <= 'd0 ;
		ro_M_AXI_ARCACHE  <= 'd0 ;
		ro_M_AXI_ARPROT	  <= 'd0 ;
		ro_M_AXI_ARQOS	  <= 'd0 ;
		ro_M_AXI_ARUSER	  <= 'd0 ;
		ro_M_AXI_ARVALID  <= 'd0 ; 	
	end
	else if(WB_action)begin
		ro_M_AXI_ARID	  <= 'd0 ;
		ro_M_AXI_ARADDR	  <= C_M_TARGET_SLAVE_BASE_ADDR ;
		ro_M_AXI_ARLEN	  <= C_M_AXI_BURST_LEN - 1;
		ro_M_AXI_ARSIZE	  <= P_BYTE_NUM_WIDTH ;
		ro_M_AXI_ARBURST  <= 2'b01 ;
		ro_M_AXI_ARLOCK	  <= 'd0 ;
		ro_M_AXI_ARCACHE  <= 4'd2 ;
		ro_M_AXI_ARPROT	  <= 'd0 ;
		ro_M_AXI_ARQOS	  <= 'd0 ;
		ro_M_AXI_ARUSER	  <= 'd0 ;
		ro_M_AXI_ARVALID  <= 'd1 ;
	end
end

always @(posedge M_AXI_ACLK or negedge M_AXI_ARESETN) begin
	if(!M_AXI_ARESETN)
		ro_M_AXI_RREADY <= 'd0;
	else if(M_AXI_RLAST && R_action)
		ro_M_AXI_RREADY <= 'd0;
	else if(AR_action)
		ro_M_AXI_RREADY <= 'd1;
	else
		ro_M_AXI_RREADY <= ro_M_AXI_RREADY;
end

always @(posedge M_AXI_ACLK or negedge M_AXI_ARESETN) begin
	if(!M_AXI_ARESETN)
		read_cnt <= 'd0;
	else if(M_AXI_RLAST && R_action)
		read_cnt <= 'd0;
	else if(R_action)
		read_cnt <= read_cnt + 1;
	else
		read_cnt <= read_cnt;	
end

always @(posedge M_AXI_ACLK or negedge M_AXI_ARESETN) begin
	if(!M_AXI_ARESETN)
		check_err <= 'd0;
	else if(R_action)begin
		if(read_cnt != M_AXI_RDATA)
			check_err <= 'd1;
	end
	else
		check_err <= 'd0;
end
*/
endmodule

注意顶层中必须把Axi_Master模块数据位宽,突发长度,基址,SIZE设置对应好
在这里插入图片描述
在PS中进行读:


#include "xparameters.h"
#include "xil_io.h"
#include "xil_cache.h"

int main()
{
	u64 data[16];
	int i;
	Xil_DCacheDisable();
	Xil_ICacheDisable();
	while(1){
	for(i=0;i<16;i++)
		data[i] = Xil_In64(XPAR_PS7_RAM_0_S_AXI_BASEADDR + i*8);
	}
	return 0;
}

在这里插入图片描述
读出的数据正确

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

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

相关文章

代码随想录算法训练营第22天|235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

目录 一、力扣235.二叉搜索树的最近公共祖先1.1 题目1.2 思路1.3 代码 二、力扣701.二叉搜索树中的插入操作2.1 题目2.2 思路2.3 代码 三、力扣450.删除二叉搜索树中的节点3.1 题目3.2 思路3.3 代码3.4 总结 一、力扣235.二叉搜索树的最近公共祖先 1.1 题目 1.2 思路 利用二叉…

09-Linux部署Redis

Linux部署Redis 简介 Redis&#xff0c;全称为Remote Dictionary Server&#xff08;远程字典服务&#xff09;&#xff0c;是一个开源的、使用ANSI C语言编写的、支持网络连接的、基于内存的、同时支持持久化的日志型Key-Value数据库&#xff0c;并提供多种语言的API。 Red…

七、西瓜书——降维与度量学习

1.K近邻 k 近邻(k-Nearest Neighbor,简称 kNN)学习是一种常用的监督学习方法&#xff0c;其工作机制非常简单: 给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,然后基于这k个“邻居”的信息来进行预测&#xff0c;通常,在分类任务中可使用“投票法”&#…

$nextTick底层原理(详细) - vue篇

公众号&#xff1a;需要以下pdf&#xff0c;关注下方 2023已经过完了&#xff0c;让我们来把今年的面试题统计号&#xff0c;来备战明年的金三银四&#xff01;所以&#xff0c;不管你是社招还是校招&#xff0c;下面这份前端面试工程师高频面试题&#xff0c;请收好。 前言 n…

CUDA学习笔记04:向量之和

参考资料 CUDA编程模型系列二(向量操作)_哔哩哔哩_bilibili &#xff08;非常好的学习资料&#xff01;&#xff09; vs2019 随意新建一个空项目&#xff0c;按照之前的环境配置配好项目依赖&#xff1a; CUDA学习笔记02&#xff1a;测试程序hello world-CSDN博客 代码结构…

jitpack上传aar异常: ERROR: No build artifacts found

问题 如图所示&#xff0c;提示 ERROR: No build artifacts found 解决 无法找到artifacts的情况下&#xff0c;我们就需要手动添加artifacts 。 //maven-publish 插件的配置 // publishing 用于定义项目的发布相关配置 publishing {// 配置maven 仓库repositories { Repo…

5201B数据网络测试仪

|5201B数据网络测试仪| | 产品综述 | 电科思仪5201B便携式数据网络测试仪&#xff0c;集成高性能IP基础测试硬件平台&#xff0c;提供L2-L3流量测试及协议仿真解决方案&#xff0c;支持以太网报文线速生成与分析、统计、报文捕获&#xff0c;以及路由、接入、组播、数据中心等协…

item_fee-获得淘宝商品快递费用 API调用说明获取测试key

item_fee-获得淘宝商品快递费用 .通过传入商品id、区域id&#xff0c;来获取该商品的快递费用。 公共参数 点此获取API请求地址 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&a…

Linux系统的服务/进程

系统守护进程&#xff08;服务&#xff09; •服务就是运行在网络服务器上监听用户请求的进程 •服务是通过端口号来区分的 常见的服务及其对应的端口 1.ftp&#xff1a;21 FTP指的是文件传输协议&#xff0c;它是用于在计算机网络上进行文件传输的标准网络协议。通过FTP&am…

数字化转型导师坚鹏:成为数字化转型顾问 引领数字化美好未来

成为数字化转型顾问 引领数字化美好未来 ——数字化人才与企业的共赢之路 数字经济新时代&#xff0c;中国企业向数字化转型要效益&#xff1b; 转型顾问创未来&#xff0c;职场精英借数字化转型成良师。 我们中国政府特别重视数字经济发展及数字化人才培养。早在2020年8月2…

通过XML调用CAPL脚本进行测试(新手向)

目录 0 引言 1 XML简介 2 通过XML调用CAPL脚本 0 引言 纪念一下今天这个特殊日子&#xff0c;四年出现一次的29号。 在CANoe中做自动化测试常用的编程方法有CAPL和XML两种&#xff0c;二者各有各的特色&#xff0c;对于CAPL来说新手肯定是更熟悉一些&#xff0c;因为说到在C…

C#高级:Winform桌面开发中DataGridView的详解

一、每条数据增加一个按钮&#xff0c;点击输出对应实体 请先确保正确添加实体的名称和文本&#xff1a; private void button6_Click(object sender, EventArgs e) {//SQL查询到数据&#xff0c;存于list中List<InforMessage> list bll.QueryInforMessage();//含有字段…

动静态库-动态库加载

动静态库 前言引入 一、静态库1. 创建静态库①原理②创建 2. 使用静态库①借助编译选项②只需要带库名 3. 小结 二、动态库1. 创建动态库2. 使用动态库 三、 动态库加载原理——进程地址空间1. 地址①程序没有被加载前的地址②程序加载后的地址 2. 原理①动态库的地址②原理 前…

Redis中的单线程高性能原因和其他高级命令

单线程 Redis是单线程吗&#xff1f; Redis的单线程主要是指Redis的网络IO和键值对读写是由一个线程来完成的&#xff0c;这也是 Redis对外提供键值存储的主要流程。但Redis的其他功能&#xff0c;比如持久化、异步删除、 集群数据同步等&#xff0c;其实是由额外的线程执行的…

Spring Cloud 面试题及答案整理,最新面试题

Spring Cloud中断路器的原理及其作用是什么&#xff1f; Spring Cloud断路器的原理和作用基于以下几个关键点&#xff1a; 1、故障隔离机制&#xff1a; 在微服务架构中&#xff0c;断路器作为一种故障隔离机制&#xff0c;当某个服务实例出现问题时&#xff0c;断路器会“断…

紫光展锐携手中兴通讯成功完成业界首个5G N102芯网一体方案联调

近日&#xff0c;紫光展锐携手中兴通讯成功完成业界首个5G N102频段的芯网一体方案联调&#xff0c;包括5G NR数据呼叫、时延和峰值速率测试等用例。这是双方在5G产品和研发方面取得的重大创新成果&#xff0c;为推动N102频段在5G行业的应用奠定了坚实基础。 3GPP定义的N102频段…

软件测试 - 测试用例基本理论

1. 概念 为了特定的目的(该目的是检验代码是否满足用户需求)而设计的文档&#xff0c;文档包含测试输入、执行条件、预期结果等。文档的形式一般是excel表格。 比如说我们买了一台电脑&#xff0c;新买的笔记本检查完外观之后第一步需要查看电脑是否能够正常开机&#xff0c;…

用Python爬取古诗文网的各类古诗

fetch-gushiwen 用途 可以拿去用于个人知识库、知识图谱的创建等其他学习用途。 使用 输入古诗文网的链接&#xff0c;即可爬取该页面所有诗歌的诗名&#xff0c;作者&#xff0c;朝代&#xff0c;内容&#xff0c;译文&#xff0c;注释&#xff0c;赏析&#xff0c;创作背…

MySQL 缓存策略

MySQL 缓存方案用来干什么 ? 缓存用户定义的热点数据&#xff0c;用户直接从缓存中获取热点数据&#xff0c;降低数据的读写压力。场景分析 内存访问速度是磁盘访问速度的 10 万倍。读的需求远远大于写的需求MySQL 自身缓冲层跟业务无关。MySQL 作为项目主要数据库&#xff0…

P5076 【深基16.例7】普通二叉树(简化版)题解

题目 您需要写一种数据结构&#xff0c;来维护一些数&#xff08;都是绝对值以内的数&#xff09;的集合&#xff0c;最开始时集合是空的。其中需要提供以下操作&#xff0c;操作次数q不超过&#xff1a; 定义数x的排名为集合中小于x的数的个数1。查询数x的排名。注意x不一定…