从零学习AXI4总线

  • Post author:
  • Post category:其他


第一次接触AXI 4 总线是在使用xilinx zynq的时候,当时用的时候一团雾水,现在雾水少了些,但还是有很多地方没有接触到。本文作为自己的总结,有任何问题,欢迎批评指正。

5c87c2d6c4e52b36e28940164a496c86.png


什么是AXI总线?

4a286f2c298dea256f58692ec9c735a6.png

AXI 作为 ARM AMBA 微控制器总线的一部分,第一次出现在AMBA 3.0中。后面AMBA 4.0发布,AXI4出现了。

AXI 4总线和别的总线一样,都用来传输bits信息(包含了数据或者地址)。AXI4总线有三种类型,分别是AXI4、AXI4-Lite、AXI4-Stream。

AXI4 是一种高性能memory-mapped总线,AXI4-Lite是一只简单的、低通量的memory-mapped 总线,而 AXI4-Stream 可以传输高速数据流。从字面意思去理解,AXI4-Lite是AXI4的轻量版。这里保留了memory-mapped的写法,主要是为了与AXI4-Stream区分开。

memory-mapped 可以这样去理解,假设有master A , 和 slave B, A与B通过AXI4或者AXI4-Lite连接通讯,A可以把B这个外设看作A上的某个地址。当A向B传输数据时,就等同于A向这个地址传输数据。

AXI4-Stream与AXI4、AXI4-Lite不同, 它不需要地址通道。

f67702cadf52c666534eb73fc0e1c310.png


AXI4 、 AXI4-Lite 、AXI4-Stream接口

7115ce080e87a4b439b14bf45d3a6ae0.png

AXI4 和 AXI4-Lite接口包含5个不同的通道:两个读通道和三个写通道。


两个读通道

:读地址通道(read address channel)、读数据通道(read data channel);


三个写通道

:写地址通道(write address channel)、写数据通道(write data channel)、写响应通道(write response channel);

4696f1a7359bda3a5bcebad233c37809.jpeg

AXI4读通道操作 图片源自参考[1]

0d970d5d688ea9ab6e0eafb35aa45384.jpeg

AXI4 写通道操作 图片源自参考[1]

读通道和写通道是分开的,因此可以完成数据的双向传输。此外AXI4能够实现burst传输,换句说就是,可以在一个地址后传输多个数据,最多可以达256 字节。AXI4-Lite不支持burst传输。

AXI4-Stream 只有一个通道,不需要地址,可以burst 传输无限的数据。

e6d06e53d594a770651e813cb0342e1d.png


常见的辅助IP

c78ff03549f0c11608590522c314477e.png

AXI Interconnect IP 和AXI SmartConnect IP :

上文提到AXI4 和 AXI4-Lite采用了memory-mapped 的方式,无论是1个master和1个slave、1个master和N个slave、N个master和1个slave、N个master和M个slave,采用这两个ip能帮助我们完成映射。

AXI FIFOs :

缓存数据,或者跨时钟域时有用。

AXI Direct Memory Access (DMA) engines

当我们有一个AXI4-stream接口的IP想与AXI4接口的IP相连时,可以通过AXI DMA完成转换。

60f922254f3c445b4b02f5181bc7a95a.png


ZYNQ上的AXI接口

0399a9dae47c0426d64781d4aa1ef844.png

aa2940b26dec81b6055580c0c6b8a0bd.jpeg

图片源自 zynq 7 processing system ip

zynq的ps上共留了9个AXI接口,其中两个GP AXI master、两个GP AXI slave、四个HP AXI slave、以及一个ACP AXI slave。

这些接口都是AXI3类型的,但使用AXI4-Lite、AXI4 的IP仍然可以与这些接口通讯,因为在实际使用中,软件会使用AXI Interconnect ip帮助我们完成接口的转换。


主要参考

[1] ug1037-vivado-axi-reference-guide

[2] ug585-Zynq-7000-TRM

AXI4-Stream在AXI4家族中相对来说比较简单,接下来主要回答两个问题:


(1)AXI4-Stream 传输的数据流都包含什么?


(2)AXI4-Stream 的接口信号有哪些?master和slave是如何握手的?

f5a2dce8e9cf834624d21692aa757b54.png


数据流

4ebeadbd4e4faa4494a1d09adb72a2b5.png

AXI4-Stream传输的数据流包含三种类型:data type、position type、null type。

data type是最有意义的数据;position type 作为占位符使用,可以用来表征date type 的相对位置,null type不包含任何有用的信息。

数据流的结构可以有很多种,例如:可以只传数据,也即都是data type,不包含position type和null type;也可以将data type 和 null type 混着传输;还可以将position type 和 data type混着传输。当然,三者混着传输也没有问题。


c4e449ecb643b90db82526f90453156f.jpeg

全都是data type

e9f81693073f62f769d5506586b1f990.jpeg

data type 和 position type 混搭

那么问题来了,数据流传输类型有三种,在传输的过程中如何分辨这三种类型呢?AXI4-Stream的接口信号可以帮助我们进行区分,接下来看看都有哪些接口信号。

3cbfb7cf54271a9e4fe9a79f02a0b144.png


接口信号

79fde7e671dea2625f9af8e99dbd11aa.png

先来一图尽览:

cc9a1168c5e36d0de3a9b5e4197b235b.jpeg

ACLK和ARESETn信号,不必多说,时钟和复位信号;

接下来是TVALID和TREADY信号,这两个信号作为握手信号,分别从master 和 slave发出。如何握手呢?想想一下,你和别人握手的过程,大概分为三个阶段:双方心里进行某种心理活动、伸手、握手上下抖动;AXI4-Stream上握手也大体经历这三个过程。

(1)双方心里进行某种心理活动:相当于 master 和 slave 在自己内部搞事情,搞完自己的事情才能闲下来去握手,master搞完事情发出 TVALID high 信号,slave 搞完事情发出TREADY high 信号。

(2)伸手的过程其实比较讲究,现实生活中也是。你和别人握手,可能对方先伸手、也可能你先伸手、也可能你俩同时伸手。master和slave也是如此,可能 TVALID high 信号比TREADY high 早,可能TVALID比TREADY晚,也可能同时出现。

(3)握手上下抖动:当你们两个都抬起了手,接下来就是隆重的握手阶段,在握手的时候,你可以感受到对方的手那么有力量……master和slave在TVALID 和 TREADY同为高时开始传输数据。

e2f0143edbe829094e91ec2e95d3c0c2.jpeg

TVALID 先高为敬

2a0897c17ed03eadd46fe459d485782d.jpeg

TREADY 先高为敬

0fc6be7522fb7a90f4b699e1b0dd6723.jpeg

TVALID TREADY 同时变高

TDATA不多说了,它就是数据流。前文中提到在数据流中有三种类型,分别为data type、position type和null type,那么在传输的时候如何区分呢?要靠TKEEP和TSTRB。

为了便于说明,假设n为数据总线的字节数,即TDATA的字节数,可以把TDATA表示为TDATA[(8*n-1):0],TKEEP和TSTRB有n位,和TDATA上的每个字节一一对应,二者共同表示TDATA上每个字节的类型。举个例子,n = 2、TDATA = 0x0036、TKEEP = 2’b01、 TSTRB= 2’b01。由于TKEEP和TSTRB高位为0,那么TDATA的高阶字节为null type;由于TKEEP和TSTRB地位为1,那么TDATA的低阶字节为data type。

有一点需要注意,TKEEP为0、TSTRB为1的情况是不能使用的。

0c8abdd9f84d361ca4b1d3560dbf58dc.jpeg

TKEEP 和 TSTRB 表示数据流中字节类型

TLAST信号,用来表示一个包的结尾。例如发送大小为32字节的包,在发送第32个字节的时候,可以把TLAST信号拉高,来表示这个包发送完了。

TID和TDEST信号:当我们在同一个接口传输不同数据流时有用,一般来讲,AXIS4-Stream Interconnect Core IP可以帮助我们完成这个过程。TUSER信号用来传输一些额外的信息。


参考

[1] ug1037-vivado-axi-reference-guide.pdf

[2] IHI0051A_amba4_axi4_stream_v1_0_protocol_spec.pdf

本文转自:https://zhuanlan.zhihu.com/p/149721810