AXI协议
AXI简介
AXI4 所采用的是一种 READY, VALID 握手通信机制,即主从模块进行数据通信前, 先根据操作对各所用到的数据、地址通道进行握手。主要操作包括传输发送者 A 等到传输接受者 B的 READY 信号后, A 将数据与 VALID 信号同时发送给 B,这是一种典型的握手机制。
AXI总线支持burst传输。Burst传输(翻译成突发传输或者连续传输),指在同一行中相邻的存储单元可以连续传输的方式,只需要提供起始地址和突发长度,就可以自动的对后面同样数量的存储单元进行读/写操作,而不需要连续提供地址
图1 AXI4握手
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 代表成功,其他为错误。
![]() | ![]() |
AXI4读握手 | AXI4写握手 |
github 上找到一个 AXI master 的代码,地址是https://github.com/aquaxis/IPCORE/tree/master/aq_axi_vdma。这个工程是一个自己写的VDMA,里面包含了大量可参考的代码。笔者这里主要使用了 aq_axi_master.v 这个代码用于AXI master 读写操作。
PL_WRITE_READ_PS_DDR
- 通过AXI4总线,需要编写pl端代码
AXI4的控制总线S00_AXI包含了写读数据的ADDR以及写读的数据DATA
- 通过AXI4总线,主要是软件编写ps端代码
Zynq7000中HP0主要完成与ddr的高速数据交互,GP0完成AXI_LITE寄存器等控制
- ps将数据从emmc读取存入ddr,再通过dma将数据从ddr读取出来,通过M_AXIS_MM2S_0送出去
AXI接口
信号 | 可选/必选 | 默认值 | 描述 |
Write Address | |||
M_AXI_AWID | 写地址识别ID | ||
M_AXI_AWADDR[31:0] | 必须 | 写入数据的内存地址 | |
M_AXI_AWLEN[7:0] | Burst Length写入数据的Burst个数 传输量= AWLEN+1 | ||
M_AXI_AWSIZE[2:0] | Burst Size 2^n字节 一个Burst数据量的大小3’b011即使2^3=8Byte | ||
M_AXI_AWBURST [1:0] | 2’b01 | Burst Type 每次传输之间地址如何变化 2’b00:fixed(FIXED固定) burst 2’b01:incrementing burst(INCR递增突发) 2’b10:warpping burst(WARP回环突发,地址长度是器件决定还是人为设定?未验证) | |
M_AXI_AWLOCK | 2'b00 | 定义主机访问从机是否独占0:normal access 1:exclusive(独占) access | |
M_AXI_AWCACHE[3:0] | 2'b0011 | 表示不同的内存类型[0]:bufferable[1]:modifiable[2]:other allocate[3]:allocate | |
M_AXI_AWPROT[2:0] | 必须 | 2'b000 | Protect Fixed 2'b000 写事务的保护属性 |
M_AXI_AWQOS [3:0] | 2'b0000 | Quality of service | |
M_AXI_AWUSER | 可变位宽,一般不建议使用 | ||
M_AXI_AWVALID | 必须 | Valid | |
M_AXI_AWREADY | 必须 | Ready | |
Write Data | |||
M_AXI_WDATA[63:0] | 必须 | = (2^AWSIZE) * 8 | |
M_AXI_WSTRB[7:0] | =数据总线位宽 / 8,具体的WSTRB [n]为高对应于WDATA [(8n+7) : 8n]这一字节的数据有效(多少个字节时有效的) | ||
M_AXI_WLAST | 必须 | 最后一次数据传输WLAST置1,表明此时刻的数据是最后一份数据 | |
M_AXI_WUSER | |||
M_AXI_WVALID | 必须 | valid | |
M_AXI_WREADY | 必须 | ready | |
Write Response | |||
M_AXI_BID | 写响应ID,与AWID保持一致 | ||
M_AXI_BRESP[1:0] | 必须 | 写完成响应 00: OKAY正常访问成功 01: EXOKAY独占访问成功10: SLVERR丛机反映错11: DECERR指示互连模块无法成功解码从属访问。 最后数据全部传输完成后才通过写应答知道传输是否有错误 | |
M_AXI_BUSER | |||
M_AXI_BVALID | 必须 | Valid | |
M_AXI_BREADY | 必须 | Ready | |
Read Address | |||
M_AXI_ARID | |||
M_AXI_ARADDR[31:0] | 必须 | ||
M_AXI_ARLEN[7:0] | 几个Burst,实际传输数据量 = ARLEN + 1 | ||
M_AXI_ARSIZE[2:0] | Burst size 一个burst大小 | ||
M_AXI_ARBURST[1:0] | 01 | Burst Type | |
M_AXI_ARLOCK[1:0] | 00 | ||
M_AXI_ARCACHE[3:0] | 0011 | ||
M_AXI_ARPROT[2:0] | 必须 | 000 | |
M_AXI_ARQOS[3:0] | 0000 | Quality | |
M_AXI_ARUSER | |||
M_AXI_ARVALID | 必须 | ||
M_AXI_ARREADY | 必须 | ||
Read Data | |||
M_AXI_RID | 写数据识别ID, 与ARID保持一致用来对应地址和数据 | ||
M_AXI_RDATA[63:0] | 必须 | ||
M_AXI_RRESP[1:0] | 读响应 同写响应 | ||
M_AXI_RLAST | 必须 | ||
M_AXI_RUSER | |||
M_AXI_RVALID | 必须 | Valid | |
M_AXI_RREADY | 必须 | Ready |