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] |
必须文章来源:https://www.toymoban.com/news/detail-790447.html |
写入数据的内存地址 |
|
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文章来源地址https://www.toymoban.com/news/detail-790447.html |
|
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 |
到了这里,关于FPGA中AXI协议的理解及接口信号的中文描述的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!