zynq AXI

AXI 总线/接口/协议

总线是一组传输通道,是各种逻辑器件构成的传输数据的通道,一般由由数据线、地址线、控制线等构成。

接口是一种连接标准,又常常被称之为物理接口。

协议就是传输数据的规则。

AXI 总线

ZYNQ 中有支持三种 AXI 总线,拥有三种 AXI 接口,当然用的都是 AXI 协议。其中三种AXI 总线分别为:

AXI4:(For high-performance memory-mapped requirements.)主要面向高性能地址映射通信的需求,是面向地址映射的接口,允许最大 256 轮的数据突发传输;

AXI4-Lite:(For simple, low-throughput memory-mapped communication )是一个轻量级的地址映射单次传输接口,占用很少的逻辑单元。

AXI4-Stream:(For high-speed streaming data.)面向高速流数据传输;去掉了地址项,允许无限制的数据突发传输规模。

AXI4 总线和 AXI4-Lite 总线具有相同的组成部分:

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

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

3)写地址通道,包含 AWVALIDAWADDR, AWREADY 信号;

4)写数据通道,包含 WVALID, WDATAWSTRB, WREADY 信号;

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

6)系统通道,包含:ACLKARESETN 信号。

AXI4 总线和 AXI4-Lite 总线的信号也有他的命名特点读地址信号都是以 AR 开头(AaddressRread写地址信号都是以 AW 开头(AaddressWwrite读数据信号都是以 R 开头(Rread写数据信号都是以 W 开头(Wwrite应答型号都是以 B 开头(Bbackanswer back))

 

AXI4-Stream 总线的组成有:

1ACLK 信号:总线时钟,上升沿有效;

2ARESETN 信号:总线复位,低电平有效

3TREADY 信号:从机告诉主机做好传输准备;

4TDATA 信号:数据,可选宽度 32,64,128,256bit

5TSTRB 信号:每一 bit 对应 TDATA 的一个有效字节,宽度为 TDATA/8

6TLAST 信号:主机告诉从机该次传输为突发传输的结尾;

7TVALID 信号:主机告诉从机数据本次传输有效;

8TUSER 信号 :用户定义信号,宽度为 128bit

对于 AXI4-Stream 总线命名而言,除了总线时钟和总线复位,其他的信号线都是以 T 字母开头,后面跟上一个有意义的单词,看清这一点后,能帮助读者记忆每个信号线的意义。如 TVALID = T+ 单词 Valid(有效),那么读者就应该立刻反应该信号的作用。每个信号的具体作用,在后面分析源码时再做分析

AXI 接口

三种 AXI 接口分别是:

AXI-GP 接口(4 个):是通用的 AXI 接口,包括两个 32 位主设备接口和两个 32 位从设备接 口,使用该接口可以访问 PS 中的片内外设。

AXI-HP 接口(4 个):是高性能/带宽的标准的接口,PL 模块作为主设备连接(从下图中箭头 可以看出)。主要用于 PL 访问 PS 上的存储器(DDR On-Chip RAM

AXI-ACP 接口(1 个):是 ARM 多核架构下定义的一种接口,中文翻译为加速器一致性端口, 用来管理 DMA 之类的不带缓存的 AXI 外设,PS 端是 Slave 接口。

AXI 协议

协议和总线关系密切,协议要在总线的结构上制定。虽然说 AXI4AXI4-LiteAXI4-Stream 都 是 AXI4 协议,但是各自细节上还是不同的。 总的来说,AXI 总线协议的两端可以分为分为主(master)、从(slave)两端,他们之间一般 需要通过一个AXI Interconnect 相连接,作用是提供将一个或多个 AXI主设备连接到一个或多个 AXI 从设备的一种交换机制。当我们添加了 zynq 以及带 AXI IP 后再进行自动连线时,vivado 会自动帮我们添加上这个 IP

AXI Interconnect 的主要作用是,当存在多个主机以及从机器时,AXI Interconnect 负责将它们 联系并管理起来。由于 AXI 支持乱序发送,乱序发送需要主机的 ID 信号支撑,而不同的主机发送 的 ID 可能相同,而 AXI Interconnect 解决了这一问题,他会对不同主机的 ID 信号进行处理让 ID 变 得唯一。

AXI 协议将读地址通道,读数据通道,写地址通道,写数据通道,写响应通道分开,各自通道 都有自己的握手协议。每个通道互不干扰却又彼此依赖。这也是 AXI 高效的原因之一。

AXI 协议之握手协议

AXI4 所采用的是一种 READY,VALID 握手通信机制,简单来说主从双方进行数据通信前, 有一个握手的过程。

发送方置高 VALID 信号表示发送方已经将数据,地址或者控制信息放到的写总线上,并保持。

接收方置高 READY 信号表示接收方已经做好接收的准备。

所谓的双向流控机制,指的是发送方通过 VALID 信号置起控制发送速度的同时,接收方也可以通过 READY 信号的置起与否控制接收速度,反压发送方的发送速度。

当双方的信息同时为高,时钟上升沿到达后,一次数据传输完成,在 1 到 n 次时钟上升沿后,双方传完了要传的信息后,两信号同时拉低。

VALID READY 信号的出现先后分为三种情况:

1.VALID 信号先到达

发送方 VALID 信号早早就到了,这时还不到 T2 时刻,并带来了新鲜的数据(数据通道),地址或者控制信息(地址通道)。

但过了 T2 也没见到接收方的 READY 信号。原来是接收方还忙着,可能上一次的数据还没存完,还堵在数据通路上,忙过了 T2 才来。好吧,那也行,T3 时刻传输完成。在这种情况下,接收方通过 READY 信号控制了传输速度,反压了发送速度。

协议规定:VALID 信号一旦置起就不能拉低,直到此次传输完成。对于接收方编程来说,检测到 VALID 信号置起,如果系统正忙,完全可以让发送方等待,发送方在完成传输之前都不会置低 VALID 信号,不需要考虑发送方撤销传输的可能。

协议另外规定:发送方不能在置起 VALID 信号之前就光等待 READY 信号。

这句阅读理解有点难,原文为:

作者个人从总线接口编程的角度理解,READY 信号可能先到达,如下图的情况。但是发送方编程时,不能依赖 READY 信号先到达的情况。不能将 READY 信号置高作为置高 VALID 的条件,比如将 READY 信号通过组合逻辑生成 VALID 信号。

换句话说,发送方准备发送,置起 VALID 信号是完全主动的过程。接收方按照协议可以依赖发送方,但如果此时发送方也依赖接收方,就会造成死锁的情况,所以协议在这里规定了 VALID 信号的主动性。

2.READY 信号先到达

READY 信号很自由,可以等待 VALID 信号到来再做响应,但也完全可以在 VALID 信号到来前就置高,表示接收端已经做好准备了。

READY 信号与 VALID 不同,接收方可以置起 READY 之后发现:其实我好像还挺忙,然后拉低 READY 信号。只要此时 VALID 信号没有置起,这种操作是完全可以。

3.同时到达

同时到达就很简单,等到下一个时钟上升沿 T2,传输就这么轻松愉快地完成了,一个时钟周期里就完成了。

五个独立通道

AXI4 总线的一大特征是它有 5 个独立的传输通道,这些通道都只支持单向传输。作为类比,SPI 总线有 2 条传输通道:MISO, MOSI。SPI 输入输出的数据,大路朝天,各走一条;而作为对比, IIC 协议则只有 SDA 一条通道,输入输出数据只能在这一条通道上分时双向传输。

单向传输的通道意味着通道两端的终端节点是有身份差距的,好比水只能从上游流到下流。在 AXI 总线传输中,通道两端分为 Master 主机与 Slave 从机,主机总是发起读写请求的一方,而我们五大通道的读/写定义就都是根据主机来定义的。

那么五个通道都有谁呢:

  1. 读地址 read address
  2. 读数据 read data
  3. 写地址 write address
  4. 写数据 write data
  5. 写回复 write response

5 个是不是很奇怪,你看读/写怎么也得是个 2 的倍数不是,那为什么不是 6 条,为什么没有读响应?其实,读响应借用了读数据通道。至于为什么没有独立的读回复通道,我们之后再讲。

五个独立通道在读写操作中的角色

首先是写操作,主机在写地址通道上写地址和控制信息。

在写地址操作结束之后,即主机确保从机已经获得了此次传输的地址和控制信息后,才开始在写数据通道上写数据。

从机在写回复通道上,将此次写传输的状态回复给主机。

一般来说,写数据都发生在写地址操作之后,但也不是绝对的,在有些情况下,可以先写数据。但是,所有情况下,写回复必然是在写数据之后,是对此次写数据的状态回复。

 

接下来看读操作:

读操作只涉及两个通道,首先主机在读地址通道上写入想要读取的数据的地址以及控制信息。

从机在接收到地址后,将该地址上的数据通过读数据通道发送给主机。

有两点值得注意:一是 AXI 总线支持突发传输,主机可以写入起始地址以及突发传输的字节数,从机将发送起始地址开始,突发传输个数的多个连续地址上的数据。

二是虽然名字为读地址通道,但实际上仍由主机写入地址,只不过是写入要读取数据的地址。读地址通道,这个名字确实有点歧义,主机读操作地址通道表达得更贴切一些。

读地址通道与写地址通道:

在这两条通道上传输地址和控制信息,读写操作都拥有各自的地址通道。地址位宽一般限制为32位。

读数据通道:

读数据通道上包括从机发送给主机的读数据以及读操作完成状态回复,具体的读操作状态回复情况会在之后讨论。数据的宽度可以是8,16,64,128,256,512 或者是 1024 比特。

写数据通道:

写数据的宽度和读数据通道的数据位宽相同,写通道有一点读通道所不具有的特性是有 STROBE 信号,用于标识写数据中有效的传输字节,即有些无效的数据,出于减少主机工作量的目的,或者在读写宽度不对称时,被放到写数据通道上和有效数据一起发送。而 STROBE 的信号的作用就是标识出这些无用的数据,告知从机不需要接收无用数据。(Master:我太懒,以至于把所有信号都送过来了)

写回复通道:

用于从机将写完成情况回复给主机。所有的写传输操作都需要在写回复通道上接收此次写传输操作的完成情况。值得注意的是写回复是针对一次突发传输的,而不是针对每一次的写数据操作的。(一次突发传输包括了多次写操作)

那么问题来了,为什么只有写回复通道而没有读回复通道呢?

这个问题可以从数据流向看出来,主机在读取数据时,数据在读通道上传输,流向为从机到主机。而读回复由从机向主机报告读操作的情况,信号的数据流向也是从机到主机,所以读回复可以合并在读数据通道中。

但写回复通道的数据流向就和写数据相反。写数据是从主机到从机,而写回复为从机报告写操作的完成情况,流向为从机到主机,无法合并到写数据通道中,另一方面,写回复又是不可或缺的,所以就有了一条独立的写回复通道。

通道上的信号们

全局信号

AXI 总线中有两个全局信号:ACLK,全局的时钟信号,所有的传输操作都发生在 ACLK 的上升沿。ARESETn,全局复位信号,低电平有效。在复位问题上,AXI 规定了一些细节,会在后续的文章中讨论。

写地址通道

写地址通道的信号可以分为 3 部分:经常用到的基础信号,突发传输有关的信号以及和内存访问相关以及其他的在基础阶段不是很常用的信号。

基础信号即 AWADDR:你想要写入的地址,AWVALID 以及 AWREADY:所有通道都使用的握手信号。

突发传输指的是传输一次起始地址后,进行多次地址上连续的读写操作。突发传输有关的操作包括:AWLEN:突发传输的长度,即在一次突发传输中数据传输的个数。AWSIZE:每次突发传输中的数据传输的位宽。AWBURST:突发传输的类型。

其他信号包括和内存原子操作有关的 AWLOCK,AWCACHE,AWPROT 以及用于用户自定义的 AWUSER 信号,都将在以后的文章涉及。(等我自己先用到再说)

读地址通道

读地址通道和写地址通道的信号十分类似,就不再从 specification 中截图以及介绍了。

写数据通道

值得注意的是 AXI4 不再支持 WID 信号,这和 AXI4 的乱序机制有关,AXI4 规定所有数据通道的数据必须顺序发送。

WDATA 与常见的握手信号不再赘述,WDATA 的可使用位宽可以见上文。WSTRB 信号用于标记传输数据中有效的字节,每个 WSTRB 位对应一个字节的位宽,比如数据位宽为 64 位,那么 WSTRB 信号的位宽就是 1 个字节,共 8 位。(感谢评论区纠正)

WLAST 标识一次突发传输中最后一次数据传输,如果没有正确的 WLAST 的信号,就会造成写入地址的混乱,导致从机无法正确接收写数据,从而造成从机不再拉高 READY 信号的现象。

写回复通道

与写数据通道不同,写回复通道支持 BID,即支持乱序的写回复,关于乱序的问题,我们稍后再谈。BRESP 回复上一次的写状态。

读数据通道

读数据通道与写数据通道类似,区别有两点:一,支持 RID 信号。二,因为读回复信息在读数据通道上传递,所以集成了 RRESP 信号,用于返回读状态,值得注意的是读回复信号和读数据一样,发送方(source)为从机(slave)。

AXI4 总线突发传输机制

AXI 总线的突发传输机制( burst ),在 AXI 总线中的突发传输是指,在地址总线上进行一次地址传输后,进行多次数据传输( transfer,这个有点搞,突发传输 and 传输?)。第一次地址传输中的地址作为起始地址,根据突发传输类型的不同,后续数据的存储地址在起始地址的基础上递增(INCR 模式);或者首先递增,到达上限地址后回到起始地址,继续递增(WRAP 模式);又或者后续数据都将不断写入起始地址,刷新起始地址上的数据。(FIXED 模式)

突发传输类型,在前文中提及,共有 3 种,分别为 FIXED,INCR 以及 WRAP。使用 2 位二进制表示。

FIXED 类型适合对某个固定地址进行数据更新,比如向一个 almost full 的 fifo 更新数据。

INCR 类型最为常用,后续的数据的存储地址在初始地址的基础上,以突发传输宽度进行递增,适合对于 RAM 等 mapped memory 存储介质进行读写操作。

WRAP 模式比较特殊,除了初始地址外,还有最高地址的界限。在最大地址以下,WRAP 与 INCR 类型完全相同,地址递增,但达到最高地址后,地址直接回到起始地址,再进行递增,就这样循环往复。数据手册上表示,WRAP 适合对 cache 的访问,我这方面经验还不多,不是很能理解这种模式的精妙之处。

突发传输长度 (burst length),突发传输长度是指在一次突发传输中所进行的传输(transfer)次数,在传输完初始地址后,进行的数据传输次数就是突发传输长度,假设数据位宽是 32 位,即进行 32 * N bit 的数据传输。在 AXI4 中,INCR 类型最大支持长度为 256,其他类型最大长度为 16。当然你的突发长度最少为 1,不然也就没有传输发生了。协议中的 burst length 从零开始,实际的长度值为长度字段加1。传输长度使用 8 位二进制表示。

突发传输长度有一些限制,包括:

  • 对于 WRAP 模式,突发传输长度仅能为2,4,8,16
  • 在一次突发传输中,地址不能跨越一个 4KB 分区
  • 一次突发传输不能在未达到传输长度的情况下提前结束。

突发传输宽度(burst size),突发传输宽度是每指一次传输(transfer)中的最大数据宽度,突发传输数据宽度不能超过数据线本身的宽度。当数据线本身宽度大于突发传输宽度时,将根据协议的相关规定制定数据在部分数据线上传输。突发传输宽度共 3 个二进制位,表示为:

读写操作信号

Vivado 为我们生成的 AXI-Lite 的操作源码,是一个模板,我们只需要读懂它,然后稍加修改,就

可以在实际工程使用。

写操作

image096.gif

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章