AXI4总线协议 ------ AXI_LITE协议

news2025/5/17 8:30:52

一、AXI 相关知识介绍

https://download.csdn.net/download/mvpkuku/90841873 AXI_LITE

 选出部分重点,详细文档见上面链接。

1.AXI4 协议类型

2.握手机制 

 二、AXI_LITE 协议的实现 

 1. AXI_LITE 通道及各通道端口功能介绍

2.实现思路及框架 

2.1 总体框架 

2.2 写通道 

1.复位信号进行跨时钟域同步(用户时钟/AXI4时钟)

2.仅当user_wr_ready为高时,用户的写通道是有效的

3.例化两个fifo分别存储用户端传来的地址以及数据用户时钟写入,并通过AXI时钟读出

4.控制AXI_LITE(状态机)接口信号是在AXI时钟下进行 (控制cmd_rden/data_rden并输出对应的相关接口数据)

`timescale 1ns / 1ps
//
// Description: AXI_lite写通道
//
module axlite_wr_channel#(
	parameter USER_WR_DATA_WIDTH    = 32 ,//用户写数据位宽和AXI4—Lite数据位宽保持一致
	parameter AXI_DATA_WIDTH 		= 32, //AXI4_LITE总线规定,数据位宽只支持32Bit或者64bit
	parameter AXI_ADDR_WIDTH        = 32	
)(
    input   wire							        clk,     //用户写时钟		
	input   wire									axi_clk, //从机读时钟   
	input   wire									reset,
    //与 用户端 交互信号
    input   wire								    user_wr_en,
	input   wire  [USER_WR_DATA_WIDTH-1:0]	        user_wr_data,
	input   wire  [AXI_ADDR_WIDTH-1 :0]		        user_wr_addr,
	output  wire                                    user_wr_ready,	
    //与 axi_lite从机 交互信号
    output  reg   [AXI_ADDR_WIDTH -1:0]  	        m_axi_awaddr, //write addr channel
	output  wire  [2:0] 				 	        m_axi_awprot, 
	output  reg   		 				 	        m_axi_awvalid, 
	input   wire    		 			 	        m_axi_awready,

	output  reg   [AXI_DATA_WIDTH-1:0]	 	        m_axi_wdata,   //write data channel
	output  wire  [AXI_DATA_WIDTH/8-1:0] 	        m_axi_wstrb,
	output  reg      					 	        m_axi_wvalid,
	input   wire    					 	        m_axi_wready,

	input   wire  [1:0]	         	                m_axi_bresp,  //wirte response channel
	input   wire	   			         	        m_axi_bvalid,
	output  wire    			         	        m_axi_bready
);

(* dont_touch = "true"*) reg reset_sync_d0;  //user clk
(* dont_touch = "true"*) reg reset_sync_d1;
(* dont_touch = "true"*) reg reset_sync;
(* dont_touch = "true"*) reg a_reset_sync_d0; //axi clk
(* dont_touch = "true"*) reg a_reset_sync_d1;
(* dont_touch = "true"*) reg a_reset_sync;

reg	 [31:0]  cmd_din;
reg          cmd_wren;
wire [31:0]  cmd_dout;
reg 		 cmd_rden;
wire		 cmd_wrfull ;
wire		 cmd_rdempty;
wire [4:0]   cmd_wrcount;
wire [4:0]   cmd_rdcount;


reg	 [31:0]  data_din;
reg          data_wren;
wire [31:0]  data_dout;
reg 		 data_rden;
wire		 data_wrfull;
wire		 data_rdempty;
wire [4:0]   data_wrcount;
wire [4:0]   data_rdcount;

reg [2 : 0]	 cur_status;
reg [2 : 0]	 nxt_status;

localparam WR_IDLE     = 3'b000;
localparam WR_PRE      = 3'b001;
localparam WR_DATA_EN  = 3'b010;
localparam WR_END      = 3'b100;
/*--------------------------------------------------*\
				     assign
\*--------------------------------------------------*/
assign m_axi_bready  = 1'b1;
assign m_axi_awprot  = 0;
assign m_axi_wstrb   = {AXI_DATA_WIDTH/8{1'b1}};

assign user_wr_ready = reset_sync ? 1'b0 : cmd_wrcount <= 'd12 ; //留一点余量 
                                                                 //当user_wr_ready为低的时候,用户发送写是无效的
/*--------------------------------------------------*\
				     CDC process
\*--------------------------------------------------*/
always @(posedge clk) begin
	reset_sync_d0   <= reset;
	reset_sync_d1   <= reset_sync_d0;
	reset_sync      <= reset_sync_d1;
end

always @(posedge axi_clk) begin
	a_reset_sync_d0 <= reset;
	a_reset_sync_d1 <= a_reset_sync_d0;
	a_reset_sync    <= a_reset_sync_d1;
end

/*--------------------------------------------------*\
    wirte addr to cmd fifo、write data to data fifo 
\*--------------------------------------------------*/
always @(posedge clk) begin
	if (user_wr_ready) begin
		cmd_wren  <= user_wr_en;
		cmd_din   <= user_wr_addr;
		data_wren <= user_wr_en;
		data_din  <= user_wr_data; 		
	end
	else begin
		cmd_wren  <= 0;
		cmd_din   <= 0;
		data_wren <= 0;
		data_din  <= 0; 		
	end
end

/*--------------------------------------------------*\
	            WR state machine  (三段式)
\*--------------------------------------------------*/
always@(posedge axi_clk)begin
    if(a_reset_sync)
        cur_status <= WR_IDLE;
    else
        cur_status <= nxt_status;       
end

always@(*)begin
    if(a_reset_sync)begin
        nxt_status <= WR_IDLE;
    end
    else begin
        case(cur_status)
            WR_IDLE : begin
                if(!cmd_rdempty)
                    nxt_status <= WR_PRE;
                else
                    nxt_status <= cur_status;
            end
            WR_PRE : begin
                nxt_status <= WR_DATA_EN;
            end
            WR_DATA_EN : begin
				if (m_axi_bvalid && m_axi_bready)
					nxt_status <= WR_END;
				else 
					nxt_status <= cur_status;
			end			
            WR_END : begin
				nxt_status <= WR_IDLE;
			end
            default : nxt_status <= WR_IDLE;
        endcase
    end  
end
/*-----------------------------------------------------------*\
       read addr from cmd_fifo 、 read data from data_fifo  
\*-----------------------------------------------------------*/
always @(*) begin
	if (a_reset_sync) begin
		cmd_rden   <= 0;
		data_rden  <= 0;
	end
	else begin
		cmd_rden   <= cur_status == WR_PRE;
		data_rden  <= cur_status == WR_PRE;
	end
end

always @(posedge axi_clk) begin
	if (cmd_rden) 
		m_axi_awaddr <= cmd_dout;
	else 
		m_axi_awaddr <= m_axi_awaddr;
end

always @(posedge axi_clk) begin
	if (a_reset_sync) 
		m_axi_awvalid <= 0;
	else if (cur_status == WR_PRE)
		m_axi_awvalid <= 1'b1;
	else if (m_axi_awvalid && m_axi_awready)
		m_axi_awvalid <= 0;
end

always @(posedge axi_clk) begin
	if (data_rden) 
		m_axi_wdata <= data_dout;
	else 
		m_axi_wdata <= m_axi_wdata;
end

always @(posedge axi_clk) begin
	if (a_reset_sync) 
		m_axi_wvalid <= 0;
	else if (cur_status == WR_PRE)
		m_axi_wvalid <= 1'b1;
	else if (m_axi_wvalid && m_axi_wready)
		m_axi_wvalid <= 0;
end


//写地址fifo
fifo_w32xd16 wr_cmd_fifo (
  .rst          ( reset_sync  ), // input wire rst
  .wr_clk       ( clk         ), // input wire wr_clk         用户写时钟
  .din          ( cmd_din     ), // input wire [31 : 0] din
  .wr_en        ( cmd_wren    ), // input wire wr_en

  .rd_clk       ( axi_clk     ), // input wire rd_clk         从机读时钟 
  .rd_en        ( cmd_rden    ), // input wire rd_en
  .dout         ( cmd_dout    ), // output wire [31 : 0] dout


  .full         ( cmd_wrfull  ), // output wire full
  .empty        ( cmd_rdempty ), // output wire empty

  .rd_data_count( cmd_wrcount ), // output wire [4 : 0] rd_data_count
  .wr_data_count( cmd_rdcount )  // output wire [4 : 0] wr_data_count
);


//写数据fifo
fifo_w32xd16 wr_data_fifo (
  .rst          ( reset_sync   ), // input wire rst
  .wr_clk       ( clk          ), // input wire wr_clk        用户写时钟
  .din          ( data_din     ), // input wire [31 : 0] din
  .wr_en        ( data_wren    ), // input wire wr_en

  .rd_clk       ( axi_clk      ), // input wire rd_clk        从机读时钟 
  .rd_en        ( data_rden    ), // input wire rd_en
  .dout         ( data_dout    ), // output wire [31 : 0] dout

  .full         ( data_wrfull  ), // output wire full
  .empty        ( data_rdempty ), // output wire empty

  .rd_data_count( data_rdcount ), // output wire [4 : 0] rd_data_count
  .wr_data_count( data_wrcount )  // output wire [4 : 0] wr_data_count
);
endmodule

2.3 读通道 

读通道的实现分两步,用户端发出读请求并给读的地址,然后从机根据地址发出数据,用户读出。

因此读地址fifo的逻辑部分与写通道一致,只有状态机跳转的RD_DATA_EN的条件根据模块端口有所改变,但是读数据fifo,是在AXI_CLK的时钟域下,端口输入有效及端口输入数据,根据非空开始用户读,然后赋给模块用户端口

`timescale 1ns / 1ps
//
// Description: AXI_LITE读通道
//
module axilite_rd_channel#(
	parameter USER_RD_DATA_WIDTH    = 32 , //用户读数据位宽和AXI4—Lite数据位宽保持一致
	parameter AXI_DATA_WIDTH 		= 32, 
	parameter AXI_ADDR_WIDTH        = 32		
)(
	input   wire								    clk,  	  
	input   wire								    axi_clk,    
	input   wire								    reset,

    //用户端读请求,读地址信号
	input   wire								    user_rd_en,
	input   wire  [AXI_ADDR_WIDTH-1 :0]		        user_rd_addr,
	output  wire                                    user_rd_ready,

	output  reg   [USER_RD_DATA_WIDTH-1:0]	        user_rd_data,
	output  reg                                     user_rd_valid,
    //与AXI_LITE从机 交互信号
	output  reg   		 							m_axi_arvalid, // axi read address channel
	input   wire   		 							m_axi_arready, 
	output  reg   [AXI_ADDR_WIDTH-1:0] 				m_axi_araddr,
	output  wire  [2:0] 							m_axi_arprot, 

	input   wire  [AXI_DATA_WIDTH-1:0]	    		m_axi_rdata,   // axi read data channel
	input   wire  [1:0] 				    		m_axi_resp,
	input   wire     					    		m_axi_rvalid,
	output  wire   						   	 		m_axi_rready
);

(* dont_touch = "true"*) reg reset_sync_d0;  //user clk
(* dont_touch = "true"*) reg reset_sync_d1;
(* dont_touch = "true"*) reg reset_sync;
(* dont_touch = "true"*) reg a_reset_sync_d0; //axi clk
(* dont_touch = "true"*) reg a_reset_sync_d1;
(* dont_touch = "true"*) reg a_reset_sync;

reg	 [31:0]  cmd_din;
reg          cmd_wren;
wire [31:0]  cmd_dout;
reg 		 cmd_rden;
wire		 cmd_wrfull;
wire		 cmd_rdempty;
wire [4:0]   cmd_wrcount;
wire [4:0]   cmd_rdcount;

reg	 [31:0]  data_din;
reg          data_wren;
wire [31:0]  data_dout;
wire 		 data_rden;
wire		 data_wrfull;
wire		 data_rdempty;
wire [4:0]   data_wrcount;
wire [4:0]   data_rdcount;


reg [2 : 0]	 cur_status;
reg [2 : 0]	 nxt_status;

localparam RD_IDLE     = 3'b000;
localparam RD_PRE      = 3'b001;
localparam RD_DATA_EN  = 3'b010;
localparam RD_END      = 3'b100;
/*--------------------------------------------------*\
				     assign
\*--------------------------------------------------*/
assign user_rd_ready = reset_sync ? 1'b0 : cmd_wrcount <= 'd12 ; 
assign m_axi_rready  = 1'b1;
assign m_axi_arprot  = 0;
/*--------------------------------------------------*\
				     CDC process
\*--------------------------------------------------*/
always @(posedge clk) begin
	reset_sync_d0   <= reset;
	reset_sync_d1   <= reset_sync_d0;
	reset_sync      <= reset_sync_d1;
end

always @(posedge axi_clk) begin
	a_reset_sync_d0 <= reset;
	a_reset_sync_d1 <= a_reset_sync_d0;
	a_reset_sync    <= a_reset_sync_d1;
end

/*--------------------------------------------------*\
               wirte addr to cmd fifo
\*--------------------------------------------------*/
always @(posedge clk) begin
	if (user_rd_ready) begin
		cmd_wren  <= user_rd_en;
		cmd_din   <= user_rd_addr;	
	end
	else begin
		cmd_wren  <= 0;
		cmd_din   <= 0;			
	end
end

/*--------------------------------------------------*\
	            RD state machine  
\*--------------------------------------------------*/
always @(posedge axi_clk) begin
	if (a_reset_sync) begin
		cur_status <= RD_IDLE;
	end
	else begin
		cur_status <= nxt_status;
	end
end

always @(*) begin
	if (a_reset_sync) begin
		nxt_status <= RD_IDLE;		
	end
	else begin
		case(cur_status)
			RD_IDLE : begin
 				if (~cmd_rdempty)
					nxt_status <= RD_PRE;
				else 
					nxt_status <= cur_status;
			end
			RD_PRE : begin
				nxt_status <= RD_DATA_EN;
			end
			RD_DATA_EN : begin
				if (m_axi_rvalid && m_axi_rready)
					nxt_status <= RD_END;
				else 
					nxt_status <= cur_status;
			end
			RD_END : begin
				nxt_status <= RD_IDLE;
			end
			default : nxt_status <= RD_IDLE;
		endcase	
	end
end

/*-----------------------------------------------------------*\
                  read addr from cmd_fifo 
\*-----------------------------------------------------------*/
always @(*) begin
	if (a_reset_sync) 
		cmd_rden  <= 0;
	else 
		cmd_rden  <= cur_status == RD_PRE;
end

always @(posedge axi_clk) begin
	if (cmd_rden) 
		m_axi_araddr <= cmd_dout;
	else 
		m_axi_araddr <= m_axi_araddr;
end

always @(posedge axi_clk) begin
	if (a_reset_sync) 
		m_axi_arvalid <= 0;
	else if (cur_status == RD_PRE)
		m_axi_arvalid <= 1'b1;
	else if (m_axi_arvalid && m_axi_arready)
		m_axi_arvalid <= 0;
end

/*-----------------------------------------------------------*\
                  read user data from data fifo
\*-----------------------------------------------------------*/
always @(posedge axi_clk) begin
	data_din  <= m_axi_rdata;
	data_wren <= m_axi_rvalid;
end 

assign data_rden = reset_sync ? 1'b0 : ~data_rdempty;

always @(posedge clk) begin
	user_rd_valid  <= data_rden;
	user_rd_data   <= data_dout;
end

//读地址fifo
fifo_w32xd16 rd_cmd_fifo (
  .rst          ( reset_sync  ), // input wire rst
  .wr_clk       ( clk         ), // input wire wr_clk         用户写时钟
  .din          ( cmd_din     ), // input wire [31 : 0] din
  .wr_en        ( cmd_wren    ), // input wire wr_en

  .rd_clk       ( axi_clk     ), // input wire rd_clk         从机读时钟 
  .rd_en        ( cmd_rden    ), // input wire rd_en
  .dout         ( cmd_dout    ), // output wire [31 : 0] dout


  .full         ( cmd_wrfull  ), // output wire full
  .empty        ( cmd_rdempty ), // output wire empty

  .rd_data_count( cmd_wrcount ), // output wire [4 : 0] rd_data_count
  .wr_data_count( cmd_rdcount )  // output wire [4 : 0] wr_data_count
);


//读数据fifo
fifo_w32xd16 rd_data_fifo (
  .rst          ( a_reset_sync ), // input wire rst
  .wr_clk       ( axi_clk      ), // input wire wr_clk        从机写时钟
  .din          ( data_din     ), // input wire [31 : 0] din
  .wr_en        ( data_wren    ), // input wire wr_en

  .rd_clk       ( clk          ), // input wire rd_clk            用户读时钟 
  .rd_en        ( data_rden    ), // input wire rd_en
  .dout         ( data_dout    ), // output wire [31 : 0] dout

  .full         ( data_wrfull  ), // output wire full
  .empty        ( data_rdempty ), // output wire empty

  .rd_data_count( data_rdcount ), // output wire [4 : 0] rd_data_count
  .wr_data_count( data_wrcount )  // output wire [4 : 0] wr_data_count
);
endmodule

3.仿真 

通过调用AXI_LITE接口的BRAM IP核,实/复位结束等一会儿进入写数据状态,读写数据(写10个数据,读10个数据),数据一致累加,地址也不断累加,地址最大为1024。

 仿真结果如下,可以看出读写地址和数据完全一样,说明AXI_LITE接口代码实现无误。

 

需要工程请私信

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

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

相关文章

Ubuntu24.04 安装 5080显卡驱动以及cuda

前言 之前使用Ubuntu22.04版本一直报错,然后换了24.04版本才能正常安装 一. 配置基础环境 Linux系统进行环境开发环境配置-CSDN博客 二. 安装显卡驱动 1.安装驱动 按以下步骤来&#xff1a; sudo apt update && sudo apt upgrade -y#下载最新内核并安装 sudo add…

SpringAI-RC1正式发布:移除千帆大模型!

续 Spring AI M8 版本之后&#xff08;5.1 发布&#xff09;&#xff0c;前几日 Spring AI 悄悄的发布了最新版 Spring AI 1.0.0 RC1&#xff08;5.13 发布&#xff09;&#xff0c;此版本也将是 GA&#xff08;Generally Available&#xff0c;正式版&#xff09;发布前的最后…

操作系统之进程和线程听课笔记

计算机的上电运行就是构建进程树,进程调度就是在进程树节点进程进行切换 进程间通信的好处 经典模型 生产者和消费者 进程和线程的区别 线程引入带来的问题线程的优势 由于unix70年代产生,90年代有线程,当时数据库系统操作需要线程,操作系统没有来得及重造,出现了用户态线…

COMSOL随机参数化表面流体流动模拟

基于粗糙度表面的裂隙流研究对于理解地下水的流动、污染物传输以及与之相关的地质灾害&#xff08;如滑坡&#xff09;等方面具有重要意义。本研究通过蒙特卡洛方法生成随机表面形貌&#xff0c;并利用COMSOL Multiphysics对随机参数化表面的微尺度流体流动进行模拟。 参数化…

JavaSwing中的容器之--JScrollPane

JavaSwing中的容器之–JScrollPane 在Java Swing中&#xff0c;容器是用于容纳其他组件&#xff08;如按钮、标签等&#xff09;的组件。Swing提供了多种容器&#xff0c;它们可以嵌套使用以创建复杂的用户界面。 JScrollPane是一个轻量级组件&#xff0c;提供可滚动视图。JSc…

使用 Cookie 实现认证跳转功能

使用 Cookie 实现认证跳转功能的实践与解析 在 Web 开发中&#xff0c;用户身份认证是一个基础而关键的功能点。本文将通过一个简单的前后端示例系统&#xff0c;介绍如何基于 Cookie 实现 Token 保存与自动跳转认证的功能&#xff0c;并结合 Cookie 与 Header 的区别、使用场…

LED接口设计

一个LED灯有3种控制状态&#xff0c;常亮、常灭和闪烁&#xff0c;要做到这种控制最简单的一种方法是使用任何一款处理器的普通IO去控制。 用IO控制方式有两种&#xff0c;一种是高有效&#xff0c;如下图1所示IO口为高电平时LED亮&#xff0c;IO为低电平时LED不亮。IO口出一个…

SpringBoot项目使用POI-TL动态生成Word文档

近期项目工作需要动态生成Word文档的需求&#xff0c;特意调研了动态生成Word的技术方案。主要有以下两种&#xff1a; 第一种是FreeMarker模板来进行填充&#xff1b;第二种是POI-TL技术使用Word模板来进行填充&#xff1b; 以下是关于POI-TL的官方介绍 重点关注&#xff1…

YOLOv3深度解析:多尺度特征融合与实时检测的里程碑

一、YOLOv3的诞生&#xff1a;继承与突破的起点 YOLOv3作为YOLO系列的第三代算法&#xff0c;于2018年由Joseph Redmon等人提出。它在YOLOv2的基础上&#xff0c;针对小目标检测精度低、多类别标签预测受限等问题进行了系统性改进。通过引入多尺度特征图检测、残差网络架构和独…

uniapp-商城-60-后台 新增商品(属性的选中和页面显示)

前面添加了属性&#xff0c;添加属性的子级项目。也分析了如何回显&#xff0c;但是在添加新的商品的时&#xff0c;我们也同样需要进行选择&#xff0c;还要能正常的显示在界面上。下面对页面的显示进行分析。 1、界面情况回顾 属性显示其实是个一嵌套的数据显示。 2、选中的…

虹科技术 | 简化汽车零部件测试:LIN/CAN总线设备的按键触发功能实现

汽车零部件测试领域对操作的便捷性要求越来越高&#xff0c;虹科Baby-LIN-RC系列产品为这一需求提供了完美的解决方案。从基础的按键设置到高级的Shift键应用&#xff0c;本文将一步步引导您了解虹科Baby-LIN-RC系列产品的智能控制之道。 虹科Baby-LIN-3-RC 想象一下&#xff0…

单片机ESP32天气日历闹铃语音播报

自制Arduino Esp32 单片机 可以整点语音播报&#xff0c;闹铃语音播报&#xff0c;农历显示&#xff0c;白天晚上天气&#xff0c;硬件有 Esp32&#xff0c;ST7789显示屏&#xff0c;Max98357 喇叭驱动&#xff0c;小喇叭一枚。有需要源码的私信我。#单片机 #闹钟 #嵌入式 #智能…

如何解决LCMS 液质联用液相进样器定量环漏液问题

以下是解决安捷伦1260液相色谱仪为例的进样器定量环漏液问题的一些方法&#xff1a;视频操作 检查相关部件 检查定量环本身&#xff1a;观察定量环是否有破损、裂纹或变形等情况。如果发现定量环损坏&#xff0c;需及时更换。检查密封垫&#xff1a;查看进样阀的转子密封垫、计…

服务器内部可以访问外部网络,docker内部无法访问外部网络,只能docker内部访问

要通过 iptables 将容器中的特定端口请求转发到特定服务器&#xff0c;你需要设置 DNAT&#xff08;目标地址转换&#xff09;规则。以下是详细步骤&#xff1a; 假设场景 容器端口: 8080&#xff08;容器内服务监听的端口&#xff09;目标服务器: 192.168.1.100&#xff08;请…

PCIe Switch 问题点

系列文章目录 文章目录 系列文章目录完善PCIe Retimer Overview Document OutlineSwitch 维度BroadComMicroChipAsmedia 祥硕Cyan其他 完善 Functional block diagram&#xff0c;功能框图Key Features and Benefits&#xff0c;主要功能和优点Fabric 链路Multi-root PCIe Re…

开源轻量级地图解决方案leaflet

Leaflet 地图&#xff1a;开源轻量级地图解决方案 Leaflet 是一个开源的 JavaScript 库&#xff0c;用于在网页中嵌入交互式地图。它以轻量级、灵活性和易用性著称&#xff0c;适用于需要快速集成地图功能的项目。以下是关于 Leaflet 的详细介绍和使用指南。 1. Leaflet 的核心…

Flutter目录结构介绍、入口、Widget、Center组件、Text组件、MaterialApp组件、Scaffold组件

目录 1. 创建Flutter项目 1.1使用Android Studio创建Flutter项目 1.2 使用命令行创建Flutter项目 2. Flutter项目介绍 2.1所有代码都在lib目录下编写 2.1 pubspec.yaml 依赖库/图片的引用 ​编辑 3. 运行项目 4. 编写mian.dart文件 4.1 使用MaterialApp 和 Scaffold两个组件…

如何实现金蝶云星空到MySQL的数据高效集成

金蝶云星空数据集成到MySQL的技术案例分享 在企业信息化建设中&#xff0c;数据的高效流动和准确处理是关键。本文将聚焦于一个具体的系统对接集成案例&#xff1a;金蝶云星空的数据集成到MySQL&#xff0c;方案名称为“xsck-2金蝶销售出库-->mysql”。通过这一案例&#x…

院校机试刷题第四天:1911反转公约数、1702十六进制不进位加法

一、1911反转公约数 1.题目描述 2.解题思路 两个关键点&#xff1a;1.如何把数字反转&#xff0c;2.如何求最大公约数。 反转&#xff1a;用字符串形式存储&#xff0c;定义一个新的字符串倒序存储反转之后的字符串&#xff0c;将字符串按位转换位数字。 求最大公约数&…

Redis解析

Redis解析 一、单线程模型 redis在io层面是多线程的&#xff0c;在数据处理层面是单线程的。 多线程一般用于&#xff1a; 关闭连接删除/淘汰内存网络IO 1.1 io多路复用 redis使用nio&#xff08;select、poll、epoll&#xff09;的方式处理socket 主线程负责接收建立连接…