Xilinx AXI4 协议

news2024/10/6 2:28:36

AXI4 相对复杂,但 SOC 开发者必须掌握。AXI 协议的具体内容可参考 Xilinx UG761 AXI Reference Guide。

在这里我们简单了解一下。

AXI4 所采用的是一种 READY,VALID 握手通信机制,即主从模块进行数据通信前,先根

据操作对各所用到的数据、地址通道进行握手。主要操作包括传输发送者 A 等到传输接受者 B

的 READY 信号后,A 将数据与 VALID 信号同时发送给 B,这是一种典型的握手机制。

AXI 总线分为五个通道:

 读地址通道,包含 ARVALID, ARADDR, ARREADY 信号;

 写地址通道,包含 AWVALID,AWADDR, AWREADY 信号;

 读数据通道,包含 RVALID, RDATA, RREADY, RRESP 信号;

 写数据通道,包含 WVALID, WDATA,WSTRB, WREADY 信号;

 写应答通道,包含 BVALID, BRESP, BREADY 信号;

 系统通道,包含:ACLK,ARESETN 信号;

其中 ACLK 为 axi 总线时钟,ARESETN 是 axi 总线复位信号,低电平有效;读写数据与读

写地址类信号宽度都为 32bit;READY 与 VALID 是对应的通道握手信号;WSTRB 信号为 1 的

bit 对应 WDATA 有效数据字节,WSTRB 宽度是 32bit/8=4bit;BRESP 与 RRESP 分别为写回

应信号,读回应信号,宽度都为 2bit,‘h0 代表成功,其他为错误。

读操作顺序为主与从进行读地址通道握手并传输地址内容,然后在读数据通道握手并传输

所读内容以及读取操作的回应,时钟上升沿有效。如图所示:

写操作顺序为主与从进行写地址通道握手并传输地址内容,然后在写数据通道握手并传输

所读内容,最后再写回应通道握手,并传输写回应数据,时钟上升沿有效。如图所示:

在我们不擅长写 FPGA 的一些代码时我们往往要借鉴别人的代码或者使用 IP core。在这里

笔者从 github 上找到一个 AXI master 的代码,地址是

https://github.com/aquaxis/IPCORE/tree/master/aq_axi_vdma。这个工程是一个自己写的

VDMA,里面包含了大量可参考的代码。笔者这里主要使用了 aq_axi_master.v 这个代码用于

AXI master 读写操作。借鉴别人代码有时会节省很多时间,但如果不能理解的去借鉴,出现问

题了很难解决。aq_axi_master.v 代码如下,有部分修改。

/* 
 * Copyright (C)2014-2015 AQUAXIS TECHNOLOGY. 
 *  Don't remove this header.  
 * When you use this source, there is a need to inherit this header. 
 * 
 * License 
 *  For no commercial - 
 *   License:     The Open Software License 3.0 
 *   License URI: http://www.opensource.org/licenses/OSL-3.0 
 * 
 *  For commmercial - 
 *   License:     AQUAXIS License 1.0 
 *   License URI: http://www.aquaxis.com/licenses 
 * 
 * For further information please contact. 
 *  URI:    http://www.aquaxis.com/ 
 *  E-Mail: info(at)aquaxis.com 
 */ 
 

// 
// Company:  
// Engineer: 
//  
// Create Date: 2016/11/17 10:27:06 
// Design Name:  
// Module Name: mem_test 
// Project Name:  
// Target Devices:  
// Tool Versions:  
// Description:  
//  
// Dependencies:  
//  
// Revision: 
// Revision 0.01 - File Created 
// Additional Comments: 
//  

// 
module aq_axi_master( 
// Reset, Clock 
input           ARESETN, 
input           ACLK, 
 
// Master Write Address 
output[0:0]  M_AXI_AWID, 
output[31:0] M_AXI_AWADDR, 
output[7:0]  M_AXI_AWLEN,// Burst Length: 0-255 
output[2:0]  M_AXI_AWSIZE,// Burst Size: Fixed 2'b011 
output[1:0]  M_AXI_AWBURST,// Burst Type: Fixed 2'b01(Incremental Burst) 
output        M_AXI_AWLOCK,// Lock: Fixed 2'b00 
output[3:0]  M_AXI_AWCACHE,// Cache: Fiex 2'b0011 
output[2:0]  M_AXI_AWPROT,// Protect: Fixed 2'b000 
output[3:0]  M_AXI_AWQOS,// QoS: Fixed 2'b0000 
output[0:0]  M_AXI_AWUSER,// User: Fixed 32'd0 
output        M_AXI_AWVALID, 
input         M_AXI_AWREADY, 
 
// Master Write Data 
output[63:0] M_AXI_WDATA, 
output[7:0]  M_AXI_WSTRB, 
output        M_AXI_WLAST, 
output[0:0]  M_AXI_WUSER, 
output        M_AXI_WVALID, 
input         M_AXI_WREADY, 
 
// Master Write Response 
input[0:0]   M_AXI_BID, 
input[1:0]   M_AXI_BRESP, 
input[0:0]   M_AXI_BUSER, 
input         M_AXI_BVALID, 
output        M_AXI_BREADY, 
 
// Master Read Address 
output[0:0]  M_AXI_ARID, 
output[31:0] M_AXI_ARADDR, 
output[7:0]  M_AXI_ARLEN, 
output[2:0]  M_AXI_ARSIZE, 
output[1:0]  M_AXI_ARBURST, 
output[1:0]  M_AXI_ARLOCK, 
output[3:0]  M_AXI_ARCACHE, 
output[2:0]  M_AXI_ARPROT, 
output[3:0]  M_AXI_ARQOS, 
output[0:0]  M_AXI_ARUSER, 
output        M_AXI_ARVALID, 
input         M_AXI_ARREADY, 
 
// Master Read Data  
input[0:0]   M_AXI_RID, 
input[63:0]  M_AXI_RDATA, 
input[1:0]   M_AXI_RRESP, 
input         M_AXI_RLAST, 
input[0:0]   M_AXI_RUSER, 
input         M_AXI_RVALID, 
output        M_AXI_RREADY, 
 
// Local Bus 
input         MASTER_RST, 
 
input         WR_START, 
input[31:0]  WR_ADRS, 
input[31:0]  WR_LEN, 
output        WR_READY, 
output        WR_FIFO_RE, 
input         WR_FIFO_EMPTY, 
input         WR_FIFO_AEMPTY, 
input[63:0]  WR_FIFO_DATA, 
output        WR_DONE, 
 
input         RD_START, 
input[31:0]  RD_ADRS, 
input[31:0]  RD_LEN, 
output        RD_READY, 
output        RD_FIFO_WE, 
input         RD_FIFO_FULL, 
input         RD_FIFO_AFULL, 
output[63:0] RD_FIFO_DATA, 
output        RD_DONE, 
 
output[31:0] DEBUG 
); 
 
localparam S_WR_IDLE  =3'd0; 
localparam S_WA_WAIT  =3'd1; 
localparam S_WA_START =3'd2; 
localparam S_WD_WAIT  =3'd3; 
localparam S_WD_PROC  =3'd4; 
localparam S_WR_WAIT  =3'd5; 
localparam S_WR_DONE  =3'd6; 
 
reg[2:0]   wr_state; 
reg[31:0]  reg_wr_adrs; 
reg[31:0]  reg_wr_len; 
reg         reg_awvalid, reg_wvalid, reg_w_last; 
reg[7:0]   reg_w_len; 
reg[7:0]   reg_w_stb; 
reg[1:0]   reg_wr_status; 
reg[3:0]   reg_w_count, reg_r_count; 
 
reg[7:0]   rd_chkdata, wr_chkdata; 
reg[1:0]   resp; 
reg rd_first_data; 
reg rd_fifo_enable; 
reg[31:0] rd_fifo_cnt; 
assign WR_DONE =(wr_state == S_WR_DONE); 
 
 
 
assign WR_FIFO_RE         = rd_first_data |(reg_wvalid &~WR_FIFO_EMPTY & 
M_AXI_WREADY & rd_fifo_enable); 
//assign WR_FIFO_RE         = reg_wvalid & ~WR_FIFO_EMPTY & M_AXI_WREADY; 
always@(posedge ACLK ornegedge ARESETN) 
begin 
  if(!ARESETN) 
    rd_fifo_cnt <=32'd0; 
  elseif(WR_FIFO_RE) 
    rd_fifo_cnt <= rd_fifo_cnt +32'd1; 
  elseif(wr_state == S_WR_IDLE) 
    rd_fifo_cnt <=32'd0;  
end 
 
always@(posedge ACLK ornegedge ARESETN) 
begin 
  if(!ARESETN) 
    rd_fifo_enable <=1'b0; 
  elseif(wr_state == S_WR_IDLE && WR_START) 
    rd_fifo_enable <=1'b1; 
  elseif(WR_FIFO_RE &&(rd_fifo_cnt == RD_LEN[31:3]-32'd1)) 
    rd_fifo_enable <=1'b0;     
end 
// Write State 
always@(posedge ACLK ornegedge ARESETN)begin 
if(!ARESETN)begin 
      wr_state            <= S_WR_IDLE; 
      reg_wr_adrs[31:0]<=32'd0; 
      reg_wr_len[31:0]<=32'd0; 
      reg_awvalid         <=1'b0; 
      reg_wvalid          <=1'b0; 
      reg_w_last          <=1'b0; 
      reg_w_len[7:0]<=8'd0; 
      reg_w_stb[7:0]<=8'd0; 
      reg_wr_status[1:0]<=2'd0; 
      reg_w_count[3:0]<=4'd0; 
      reg_r_count[3:0]<=4'd0; 
      wr_chkdata          <=8'd0; 
      rd_chkdata <=8'd0; 
      resp <=2'd0; 
    rd_first_data <=1'b0; 
endelsebegin 
if(MASTER_RST)begin 
      wr_state <= S_WR_IDLE; 
endelsebegin 
case(wr_state) 
        S_WR_IDLE:begin 
if(WR_START)begin 
            wr_state          <= S_WA_WAIT; 
            reg_wr_adrs[31:0]<= WR_ADRS[31:0]; 
            reg_wr_len[31:0]<= WR_LEN[31:0]-32'd1; 
      rd_first_data <=1'b1; 
end 
          reg_awvalid         <=1'b0; 
          reg_wvalid          <=1'b0; 
          reg_w_last          <=1'b0; 
          reg_w_len[7:0]<=8'd0; 
          reg_w_stb[7:0]<=8'd0; 
          reg_wr_status[1:0]<=2'd0; 
end 
        S_WA_WAIT:begin 
if(!WR_FIFO_AEMPTY |(reg_wr_len[31:11]==21'd0))begin 
            wr_state          <= S_WA_START; 
end 
      rd_first_data <=1'b0; 
end 
        S_WA_START:begin 
          wr_state            <= S_WD_WAIT; 
          reg_awvalid         <=1'b1; 
          reg_wr_len[31:11]<= reg_wr_len[31:11]-21'd1; 
if(reg_wr_len[31:11]!=21'd0)begin 
            reg_w_len[7:0]<=8'hFF; 
            reg_w_last      <=1'b0; 
            reg_w_stb[7:0]<=8'hFF; 
endelsebegin 
            reg_w_len[7:0]<= reg_wr_len[10:3]; 
            reg_w_last      <=1'b1; 
            reg_w_stb[7:0]<=8'hFF; 
/* 
            case(reg_wr_len[2:0]) begin 
              case 3'd0: reg_w_stb[7:0]  <= 8'b0000_0000; 
              case 3'd1: reg_w_stb[7:0]  <= 8'b0000_0001; 
              case 3'd2: reg_w_stb[7:0]  <= 8'b0000_0011; 
              case 3'd3: reg_w_stb[7:0]  <= 8'b0000_0111; 
              case 3'd4: reg_w_stb[7:0]  <= 8'b0000_1111; 
              case 3'd5: reg_w_stb[7:0]  <= 8'b0001_1111; 
              case 3'd6: reg_w_stb[7:0]  <= 8'b0011_1111; 
              case 3'd7: reg_w_stb[7:0]  <= 8'b0111_1111; 
              default:   reg_w_stb[7:0]  <= 8'b1111_1111; 
            endcase 
*/ 
end 
end 
        S_WD_WAIT:begin 
if(M_AXI_AWREADY)begin 
            wr_state        <= S_WD_PROC; 
            reg_awvalid     <=1'b0; 
            reg_wvalid      <=1'b1; 
end 
end 
        S_WD_PROC:begin 
if(M_AXI_WREADY &~WR_FIFO_EMPTY)begin 
if(reg_w_len[7:0]==8'd0)begin 
              wr_state        <= S_WR_WAIT; 
              reg_wvalid      <=1'b0; 
              reg_w_stb[7:0]<=8'h00; 
endelsebegin 
              reg_w_len[7:0]<= reg_w_len[7:0]-8'd1; 
end 
end 
end 
        S_WR_WAIT:begin 
if(M_AXI_BVALID)begin 
            reg_wr_status[1:0]<= reg_wr_status[1:0]| M_AXI_BRESP[1:0]; 
if(reg_w_last)begin 
              wr_state          <= S_WR_DONE; 
endelsebegin 
              wr_state          <= S_WA_WAIT; 
              reg_wr_adrs[31:0]<= reg_wr_adrs[31:0]+32'd2048; 
end 
end 
end 
        S_WR_DONE:begin 
            wr_state <= S_WR_IDLE; 
end 
default:begin 
          wr_state <= S_WR_IDLE; 
end 
endcase 
/* 
      if(WR_FIFO_RE) begin 
        reg_w_count[3:0]  <= reg_w_count[3:0] + 4'd1; 
      end 
      if(RD_FIFO_WE)begin 
        reg_r_count[3:0]  <= reg_r_count[3:0] + 4'd1; 
      end 
      if(M_AXI_AWREADY & M_AXI_AWVALID) begin 
        wr_chkdata <= 8'hEE; 
      end else if(M_AXI_WSTRB[7] & M_AXI_WVALID) begin 
        wr_chkdata <= WR_FIFO_DATA[63:56]; 
      end 
      if(M_AXI_AWREADY & M_AXI_AWVALID) begin 
        rd_chkdata <= 8'hDD; 
      end else if(M_AXI_WSTRB[7] & M_AXI_WREADY) begin 
        rd_chkdata <= WR_FIFO_DATA[63:56]; 
      end 
      if(M_AXI_BVALID & M_AXI_BREADY) begin 
        resp <= M_AXI_BRESP; 
      end 
*/ 
end 
end 
end 
 
assign M_AXI_AWID         =1'b0; 
assign M_AXI_AWADDR[31:0]= reg_wr_adrs[31:0]; 
assign M_AXI_AWLEN[7:0]= reg_w_len[7:0]; 
assign M_AXI_AWSIZE[2:0]=2'b011; 
assign M_AXI_AWBURST[1:0]=2'b01; 
assign M_AXI_AWLOCK       =1'b0; 
assign M_AXI_AWCACHE[3:0]=4'b0011; 
assign M_AXI_AWPROT[2:0]=3'b000; 
assign M_AXI_AWQOS[3:0]=4'b0000; 
assign M_AXI_AWUSER[0]=1'b1; 
assign M_AXI_AWVALID      = reg_awvalid; 
 
assign M_AXI_WDATA[63:0]= WR_FIFO_DATA[63:0]; 
//  assign M_AXI_WSTRB[7:0]   = (reg_w_len[7:0] == 
8'd0)?reg_w_stb[7:0]:8'hFF; 
//  assign M_AXI_WSTRB[7:0]   = (wr_state == S_WD_PROC)?8'hFF:8'h00; 
assign M_AXI_WSTRB[7:0]=(reg_wvalid &~WR_FIFO_EMPTY)?8'hFF:8'h00; 
assign M_AXI_WLAST        =(reg_w_len[7:0]==8'd0)?1'b1:1'b0; 
assign M_AXI_WUSER        =1; 
assign M_AXI_WVALID       = reg_wvalid &~WR_FIFO_EMPTY; 
//  assign M_AXI_WVALID       = (wr_state == S_WD_PROC)?1'b1:1'b0; 
 
assign M_AXI_BREADY       = M_AXI_BVALID; 
 
assign WR_READY           =(wr_state == S_WR_IDLE)?1'b1:1'b0; 
 
//  assign WR_FIFO_RE         = (wr_state == S_WD_PROC)?M_AXI_WREADY:1'b0; 
 
localparam S_RD_IDLE  =3'd0; 
localparam S_RA_WAIT  =3'd1; 
localparam S_RA_START =3'd2; 
localparam S_RD_WAIT  =3'd3; 
localparam S_RD_PROC  =3'd4; 
localparam S_RD_DONE  =3'd5; 
 
reg[2:0]   rd_state; 
reg[31:0]  reg_rd_adrs; 
reg[31:0]  reg_rd_len; 
reg         reg_arvalid, reg_r_last; 
reg[7:0]   reg_r_len; 
assign RD_DONE =(rd_state == S_RD_DONE); 
// Read State 
always@(posedge ACLK ornegedge ARESETN)begin 
if(!ARESETN)begin 
      rd_state          <= S_RD_IDLE; 
      reg_rd_adrs[31:0]<=32'd0; 
      reg_rd_len[31:0]<=32'd0; 
      reg_arvalid       <=1'b0; 
      reg_r_len[7:0]<=8'd0; 
endelsebegin 
case(rd_state) 
        S_RD_IDLE:begin 
if(RD_START)begin 
            rd_state          <= S_RA_WAIT; 
            reg_rd_adrs[31:0]<= RD_ADRS[31:0]; 
            reg_rd_len[31:0]<= RD_LEN[31:0]-32'd1; 
end 
          reg_arvalid     <=1'b0; 
          reg_r_len[7:0]<=8'd0; 
end 
        S_RA_WAIT:begin 
if(~RD_FIFO_AFULL)begin 
            rd_state          <= S_RA_START; 
end 
end 
        S_RA_START:begin 
          rd_state          <= S_RD_WAIT; 
          reg_arvalid       <=1'b1; 
          reg_rd_len[31:11]<= reg_rd_len[31:11]-21'd1; 
if(reg_rd_len[31:11]!=21'd0)begin 
            reg_r_last      <=1'b0; 
            reg_r_len[7:0]<=8'd255; 
endelsebegin 
            reg_r_last      <=1'b1; 
            reg_r_len[7:0]<= reg_rd_len[10:3]; 
end 
end 
        S_RD_WAIT:begin 
if(M_AXI_ARREADY)begin 
            rd_state        <= S_RD_PROC; 
            reg_arvalid     <=1'b0; 
end 
end 
        S_RD_PROC:begin 
if(M_AXI_RVALID)begin 
if(M_AXI_RLAST)begin 
if(reg_r_last)begin 
                rd_state          <= S_RD_DONE; 
endelsebegin 
                rd_state          <= S_RA_WAIT; 
                reg_rd_adrs[31:0]<= reg_rd_adrs[31:0]+32'd2048; 
end 
endelsebegin 
              reg_r_len[7:0]<= reg_r_len[7:0]-8'd1; 
end 
end 
end 
    S_RD_DONE:begin 
      rd_state          <= S_RD_IDLE; 
    end 
       
  endcase 
end 
end 
 
// Master Read Address 
assign M_AXI_ARID         =1'b0; 
assign M_AXI_ARADDR[31:0]= reg_rd_adrs[31:0]; 
assign M_AXI_ARLEN[7:0]= reg_r_len[7:0]; 
assign M_AXI_ARSIZE[2:0]=3'b011; 
assign M_AXI_ARBURST[1:0]=2'b01; 
assign M_AXI_ARLOCK       =1'b0; 
assign M_AXI_ARCACHE[3:0]=4'b0011; 
assign M_AXI_ARPROT[2:0]=3'b000; 
assign M_AXI_ARQOS[3:0]=4'b0000; 
assign M_AXI_ARUSER[0]=1'b1; 
assign M_AXI_ARVALID      = reg_arvalid; 
 
assign M_AXI_RREADY       = M_AXI_RVALID &~RD_FIFO_FULL; 
 
assign RD_READY           =(rd_state == S_RD_IDLE)?1'b1:1'b0; 
assign RD_FIFO_WE         = M_AXI_RVALID; 
assign RD_FIFO_DATA[63:0]= M_AXI_RDATA[63:0]; 
 
assign DEBUG[31:0]={reg_wr_len[31:8], 
1'd0, wr_state[2:0],1'd0, rd_state[2:0]}; 
 
endmodule 

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

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

相关文章

填满背包方案数OJ

目录 LintCode 炼码物品大小不重复的填满背包的方案数 LintCode 炼码 物品大小存在重复情况 LintCode 炼码不重复的组合个数 完全背包_牛客题霸_牛客网 LintCode 炼码物品大小不重复的填满背包的方案数 描述给出 n 个物品, 以及一个数组, nums[i]代表第i个物品的大小, 保证大…

编辑PDF文件的两种方法

PDF文件具备较好的稳定性、兼容性&#xff0c;在日常工作中的应用非常广泛&#xff0c;但想要编辑文件内容就不那么容易了&#xff0c;下面来说说编辑PDF文件的两种方法。 方法一&#xff1a; 我们知道&#xff0c;查看PDF文件只需要阅读器就可以了&#xff0c;如果想对文件内…

springboot 整合 webservice服务

目录webservice百科创建一个springboot项目并导入相关依赖编写webservice接口编写实现类发布webservice浏览器访问postman调用在前一段时间用到了webservice服务&#xff0c;今天整理了一下&#xff0c;记录下来。webservice百科 Web Service是一个平台独立的&#xff0c;低耦…

Apifox调用Security权限接口

Apifox调用Security权限接口1. SpringBoot3.0集成SpringSecurity1.1 pom1.2 properties配置2. Apifox 配置2.1 配置根目录Auth2.2 ApiFox 分享调用本地接口本教程环境&#xff1a; Apifox&#xff1a;2.2.14 &#xff08;建议更新到最新版本&#xff0c;老版本Auth从父级继承可…

flowable数据表详解

爬虫组件分析目录概述需求&#xff1a;设计思路实现思路分析1.flowable2.数据表的命名规则3.ACT_RU_*4.ACT_ID_*5.ACT_HI_*数据表的介绍参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hard…

AjaxRedis问题总结

一、JQuery——Ajax实现三大方法的应用及区别&#xff08;get,post,ajax&#xff09; 1. $.get()方法 <script type"text/javascript">$(function () {$("#send").click(function () {$.get("AjaxHandler.ashx", {username: $("#use…

【操作系统】国科大《高级操作系统》思考题整理

参考用书&#xff1a;《Linux内核设计的艺术》 引言 国科大杨力祥《高级操作系统》思考题整理 思考题 为什么开始启动计算机的时候&#xff0c;执行的是BIOS代码而不是操作系统自身的代码&#xff1f;&#xff08;P1&#xff0c;3&#xff09; 加电的一瞬间&#xff0c;计算…

graphviz安装及使用、决策树生成

一、graphviz下载安装 下载网址&#xff1a;http://www.graphviz.org/download/ 选择合适版本下载 1.1 双击安装 1.2 点击下一步 1.3 点击我接受 1.4 添加至系统路径 勾选添加至当前用户的系统路径&#xff0c;创建桌面图标可选&#xff0c;点击下一步 1.5 选择安装位置 浏…

「设备树」dtb给内核的两种工作模式

一&#xff0c;传递dtb给内核对于传统bootloader提供两种工作模式&#xff1a;一是启动加载模式&#xff08;start loading&#xff09;&#xff0c;一是下载模式&#xff08;downloading&#xff09;工作在启动加载模式时&#xff0c;bootloader会自动执行bootcmd命令&#xf…

AGV移动机器人PID运动控制

PID算法基本原理 PID算法是控制行业最经典、最简单、而又最能体现反馈控制思想的算法&#xff0c;PID算法利用反馈来检测偏差信号&#xff0c;并通过偏差信号来控制被控量。而控制器本身就是比例、积分、微分三个环节的加和。其功能框如图1所示&#xff1a; 考虑在某个特定的时…

C语言-指针进阶(9.1)

目录 思维导图&#xff1a; 1. 字符指针 2. 指针数组 3. 数组指针 3.1 数组指针的定义 3.2 &数组名VS数组名 3.3 数组指针的使用 4. 数组传参和指针传参 4.1 一维数组传参 4.2 二维数组传参 4.3 一级指针传参 4.4 二级指针传参 写在最后 思维导图&#xff1a;…

年底赶进度,如何将开发风险降到最低?

1、科学规划风险策略和控制流程 针对开发流程各环节中可能存在的风险&#xff0c;项目经理需要进行项目风险分析&#xff0c;并制定符合项目特点的风险评估和监督机制&#xff0c;实行岗位负责制&#xff0c;提前制定好控制策略&#xff0c;将开发风险降到最低。 如何将开发风险…

分布式基础篇2——分布式组件

一、SpringCloud Alibaba1、简介2、为什么使用3、版本选择4、依赖选择二、SpringCloud Alibaba 组件1、Nacos作为注册中心2、OpenFeign3、Nacos作为配置中心namespaceData IDGroup同时加载多个配置文件三、Spring Cloud1、GateWay简介三大核心部分网关的使用视频来源: 【Java项…

Ansible剧本流程控制

handlers触发器 notify&#xff1a;监控上面的模块执行是否发生变化 chufa&#xff1a;自定义的任务名称&#xff0c;自动去handlers里面匹配相对应的任务名称执行动作 下方是copy了/data/copy/下的文件到server2组里的主机/data/monster/handlers/下&#xff0c;notify监控发…

如何下载指定版本的xcode

如何下载指定版本的xcode一、安装最新版本xcode二、下载指定版本xcode一、安装最新版本xcode 从苹果商店中获取并安装即可。 但是安装最新版有个风险&#xff0c;就是它有系统版本的要求&#xff0c;比如这里要求macOS版本最低是12.5 如果版本不够的话&#xff0c;可以升级系统…

【蓝桥杯基础题】2020年省赛填空题—既约分数

&#x1f451;专栏内容&#xff1a;蓝桥杯刷题⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录一、题目背景二、题目描述三、题目分析1.求最大公约数①辗转相减法②穷举法③辗转相除法④辗转相除法&#xff08;递归&am…

LVGL之学习篇(一)

LVGL之学习篇(一) 学习目的 LVGL简介 LVGL本身是一个图形库&#xff0c;前身是litterVGL。其作者是来自匈牙利的Gabor Kiss-Vamosikisvegabor&#xff0c;LVGL用C语音编写&#xff0c;以实现最大的兼容性(与C兼容)&#xff0c;模拟器可在没有嵌入式硬件的PC上启动嵌入式GUI设计…

MATLAB实验三

实验三 &#xff08;实验报告中附上每题的主要程序和结果&#xff09; 1、在命令行窗口中分别输入下列命令&#xff0c;对应输出结果是 A&#xff0e;命令x[-2:2] B&#xff0e;命令xzeros(1,2);x>0 C&#xff0e;命令ydiag(eye(3),1) D&#xff0e;命令[-2:2]30*eye(…

内存分页机制

文章目录内存分页的原因一级页表分页机制的原理一级页表二级页表二级页表概述地址转换启动分页机制内存分页的原因 在还未出现内存分页机制之前&#xff0c;我们都内存分段机制下工作。 但是&#xff0c;这样会有个问题。来看个下方的例子。 进程在分段机制下运行 下图&…

【学习记录】ORBSLAM2均匀化策略源码解析

在ORBSLAM中&#xff0c;为了保证特征的均匀分布使用了均匀化的策略&#xff0c;最近在尝试扩展一下均匀化的内容&#xff0c;所以仔细看了一下ORBSLAM源码里面这部分的内容&#xff0c;之前看源码的时候没有展开仔细看这一部分的代码&#xff0c;这里补充记录一下&#xff0c;…