AXI协议——学习笔记(一)概述

写在前面:

最近需要使用AXI-BRAM、XDMA框架的PCIE以及UART协议,都有涉及到AXI接口,因此需要深入研究一下这个接口的各个信号的含义,以更好的完成设计和验证,这里整理了网上找到的一些内容以及自己的思考,内容比较多,纯干货,不整虚头八脑的,需要分为多期来完成。大家一起学习进步,欢迎在评论区讨论或给出您的宝贵意见。

AXI(Advanced eXtensible Interface)协议是一种由ARM公司定义的高性能、高带宽、低延迟的片上总线协议,广泛应用于SoC(System on Chip)设计中。它支持高效的数据传输和复杂的系统架构,是AMBA(Advanced Microcontroller Bus Architecture)规范的一部分。AMBA规范还包括了APB(常用于外设),AHB。

AXI是纯同步的总线,所有信号都需要在时钟CLK的上升沿进行改变和采样。一个信号如果在第n个时钟上升沿被改编为新值,那么采样者只能在第n+1个时钟上升沿采样到这个新值。

AXI协议的特点包括:

1. 高性能:通过分离的地址/控制通道和数据通道,支持非对齐数据传输和突发传输,提供高带宽、低延迟的数据传输能力。

2. 灵活性:采用主从设备间的握手协议,实现数据传输的可靠性和灵活性。支持乱序访问和Outstanding传输访问,增强了灵活性。

3. 时序收敛:地址和数据通道分离,使得时序收敛更易实现,简化了设计的复杂度。

4. 低功耗:定义了进出低功耗节电模式前后的握手协议,降低了功耗。

AXI协议的结构包括五个通道:

以下3个通道用来写数据(数据从AXI-master流向AXI-slave):

  • 写地址 (AXI Write Address Channel, 简称 AW) :AXI-master 告诉 AXI-slave 要写的首地址、长度、ID 等信息
  • 写数据 (AXI Write Data Channel, 简称 W) :AXI-master 向 AXI-slave 传送数据
  • 写响应 (AXI Write Response Channl, 简称 B) : 在收到数据后, AXI-slave 向 AXI-master 响应

以下 2 个通道用来读数据 (数据从 AXI-slave 流向 AXI-master):

  • 读地址 (AXI Read Address Channel, 简称 AR) :AXI-master 告诉 AXI-slave 要读的首地址、长度、ID 等信息
  • 读数据 (AXI Read Data Channel, 简称 R) :AXI-slave 向 AXI-master 传送数据

AXI协议的工作机制采用Ready, Valid握手通信机制。在进行数据通信前,主从模块需要根据操作对各所用到的数据、地址通道进行握手。AXI协议定义了三种burst读写类型:FIXED、INCR、WRAP,以及支持非对齐传输和乱序传输(Out of order)。

AXI协议在ZYNQ等SoC中实现了多种变体,如AXI4、AXI4-LiteAXI4-Stream,以适应不同的性能和设计需求。AXI4面向高性能地址映射通信,AXI4-Lite是轻量级接口,而AXI4-Stream则面向高速流数据传输

在设计中,AXI协议的理解和应用对于确保系统性能和可靠性至关重要。设计师需要熟悉AXI协议的信号握手机制突发传输机制以及乱序和原子操作等特性,以实现高效的数据通信和系统性能优化。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是一个简单的 AXI 协议的 Verilog 示例代码,仅供参考: ```verilog module axi( input clk, input resetn, input [31:0] awaddr, input [2:0] awprot, input [3:0] awsize, input [1:0] awburst, input [3:0] awlen, input [31:0] wdata, input [3:0] wstrb, input [1:0] wlast, input [31:0] araddr, input [2:0] arprot, input [3:0] arsize, input [1:0] arburst, input [3:0] arlen, output [1:0] rresp, output [31:0] rdata, output [1:0] rlast, output rvalid, output rready, output [1:0] bresp, output bvalid, output bready ); // AXI Master Write FSM states parameter IDLE = 2'b00; parameter AWAIT = 2'b01; parameter WDATA = 2'b10; parameter BRESP = 2'b11; // AXI Slave Read FSM states parameter RREADY = 2'b00; parameter RVALID = 2'b01; parameter RRESP = 2'b10; // AXI Slave Write FSM states parameter BREADY = 2'b00; parameter BVALID = 2'b01; // AXI Master Write FSM reg [1:0] aw_state = IDLE; reg [31:0] awaddr_reg; reg [3:0] awlen_reg; reg [3:0] wlen_reg; reg [31:0] wdata_reg; reg [3:0] wstrb_reg; reg [1:0] wlast_reg; reg [1:0] bresp_reg; reg [1:0] bresp_next; reg bvalid_reg; // AXI Slave Read FSM reg [1:0] ar_state = RREADY; reg [3:0] arlen_reg; reg [31:0] araddr_reg; reg [1:0] rresp_reg; reg [31:0] rdata_reg; reg [1:0] rlast_reg; reg rvalid_reg; // AXI Slave Write FSM reg [1:0] b_state = BREADY; reg [1:0] bresp_reg; reg [1:0] bresp_next; reg bvalid_reg; // AXI Master Write FSM always @(posedge clk) begin if(!resetn) begin aw_state <= IDLE; awaddr_reg <= 0; awlen_reg <= 0; wlen_reg <= 0; wdata_reg <= 0; wstrb_reg <= 0; wlast_reg <= 0; bresp_reg <= 0; bvalid_reg <= 0; end else begin case(aw_state) IDLE: begin if(awburst[1:0] == 2'b01) begin aw_state <= AWAIT; awaddr_reg <= awaddr; awlen_reg <= awlen; end else begin awaddr_reg <= awaddr; aw_state <= WDATA; end end AWAIT: begin if(wlen_reg == awlen_reg) begin aw_state <= BRESP; end else begin aw_state <= WDATA; end end WDATA: begin wlen_reg <= wlen_reg + 1; wdata_reg <= wdata; wstrb_reg <= wstrb; wlast_reg <= wlast; if(wlen_reg == awlen_reg) begin aw_state <= BRESP; end else begin awaddr_reg <= awaddr_reg + 4; end end BRESP: begin bresp_reg <= bresp_next; bvalid_reg <= 1; aw_state <= IDLE; end endcase end end // AXI Slave Read FSM always @(posedge clk) begin if(!resetn) begin ar_state <= RREADY; arlen_reg <= 0; araddr_reg <= 0; rresp_reg <= 0; rdata_reg <= 0; rlast_reg <= 0; rvalid_reg <= 0; end else begin case(ar_state) RREADY: begin if(arburst[1:0] == 2'b01) begin ar_state <= RVALID; arlen_reg <= arlen; araddr_reg <= araddr; end end RVALID: begin rdata_reg <= araddr_reg; rlast_reg <= (arlen_reg == 0); rresp_reg <= 0; rvalid_reg <= 1; if(rlast_reg) begin ar_state <= RREADY; end else begin arlen_reg <= arlen_reg - 1; araddr_reg <= araddr_reg + 4; end end endcase end end // AXI Slave Write FSM always @(posedge clk) begin if(!resetn) begin b_state <= BREADY; bresp_reg <= 0; bvalid_reg <= 0; end else begin case(b_state) BREADY: begin if(wlast_reg) begin b_state <= BVALID; bresp_next <= 0; end end BVALID: begin bresp_reg <= bresp_next; bvalid_reg <= 1; if(bvalid && bready) begin b_state <= BREADY; end end endcase end end // AXI Master Write interface assign awready = (aw_state == AWAIT) ? 1 : 0; assign wready = (aw_state == WDATA) ? 1 : 0; assign bresp = bresp_reg; assign bvalid = bvalid_reg; // AXI Slave Read interface assign rdata = rdata_reg; assign rlast = rlast_reg; assign rresp = rresp_reg; assign rvalid = rvalid_reg; // AXI Slave Write interface assign bready = (b_state == BREADY) ? 1 : 0; endmodule ``` 需要注意的是,这只是一个简单的示例,实际开发中可能需要根据具体的应用场景进行修改和扩展。同时,还需要注意 AXI 协议的细节和规范,以保证与其他设备和系统的兼容性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Anton_wzd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值