2021-10-10

**

FPGA入“坑”之路:大话AXI总线( 一)

**

【写的初衷纯属个人记录生活,也肯定会有不对的地方,若有,还请各位大佬们不吝赐教,比心0.0】

一、“总线?啥玩意”

第一篇去写zynq的相关知识,确实有点跳跃了,但是先把硬骨头啃掉,其他的就舒服了,(可能这就是典型的自讨苦吃),咋们玩zynq的时候,肯定会接触AXI的,提起AXI,我们毫无疑问的就会提起总线这个概念,总线(Bus)是计算机/微处理器各种功能部件之间传送信息的公共通信干线;简单点说就跟bus这个单词一样,它就像一个公交汽车,把一些数据从一个地方运到另外一个地方,为了保证把数据正确的运送到相应的地方,在运送时它会进行“票证验证”(握手机制),确定你要去的地方,还需要保证你去的地方还留有你的位置,不然你去了也没地方呆,那你还是得回来。

SoC片上总线依旧在如火如荼的发展阶段,不像计算机总线那样成熟,因此各大厂商和组织纷纷推出自己的标准,以便在未来的SoC片上总线标准中占有一席之地。ARM公司就在1995年推出了自己的总线——AMBA(Advanced Microcontroller Bus Architecture)。它独立于处理器和制造工艺技术,增强了各种应用中的外设和系统宏单元的可重用性,非常适合于现代大规模集成电路设计自动化的要求。而随着技术更迭,AMBA经历了不同的版本,分别如下:

AMBA 1:只有ASB和APB协议;

AMBA 2:引入AHB协议用于高速数据传输;

AMBA 3:为适应高吞吐量传输和调试引入AXI和ATB,增加高级可扩展接口,而AHB协议缩减为AHB-lite,APB协议增加了PREADY和PSLVERR,ASB由于设计复杂而不再使用;

AMBA 4:AXI得到了增强,引入QOS和long burst的支持,根据应用不同可选AXI4,AXI4-lite,AXI4-stream,同时为满足复杂SOC的操作一致性引入ACE和ACE-lite协议,APB和ATB也同时得到增强,比如APB加入了PPROT和PSTRB,另外为改善总线数据传输引入QVN协议;

AMBA 5:于2020年提出 适应更加复杂的高速NOC设计,引入环形总线协议,推出的AMBA CHI协议。

而在AMBA3.0中新增加了一种总线——AXI(Advanced eXtensible Interface)。它是一种面向高性能、高带宽、低延迟的片内总线。它的地址/控制和数据相位是分离的,支持不对齐的数据传输,同时在突发传输中,只需要首地址,同时分离的读写数据通道、并支持显著传输访问和乱序访问,并更加容易就行时序收敛。AXI 是AMBA 中一个新的高性能协议。AXI 技术丰富了现有的AMBA 标准内容,满足超高性能和复杂的SoC设计的需求。下图是在 IHI0022D AMBA® AXI and ACEProtocol Specification文档中的介绍
2021-10-10

看了上面这介绍是不是脑瓜子嗡嗡的?(哈哈哈,当初我也是)没关系,这里留点悬念,我先不解释,后面你就会大彻大悟,现在,我们正式开始进入精彩的AXI总线世界:
在深入了解之前,我觉得咋们得屡一下为啥要去学习这个东西,我当时玩zynq的时候,几乎每个大佬都会跟我说,你把AXI好好的弄明白,zynq也就玩明白一半了。可是我不懂啊,为啥呢?因为所有的带AXI接口的IP都是吧接口封装好了的,我直接连线就行了呀,为啥还要去了解啊?没事儿找事儿干?闲的?官方的几个ip我都没搞明白 还玩这个? 其实不然,确实很多IP给你把AXI的相关接口写好了,可是如果你需要一个官方没有的IP,但是又是需要通过AXI进行交互的时候,你咋办?“vivado不是可以创建AXI的ip吗?里面的代码都写好了直接用就行了啊”我都能想到你抢答时那撅起的嘴唇。确实,里面有这些接口的代码,也确实你只需要修改部分地方就可以,但是你如果不知道这些代码的意义,你怎么可能能修改呢?比如AXI DMA 这个IP,很多时候 由于在传输完一次突发数据后就需要 PS 端重新启动一次读或写操作,就导致在传输大量数据时,尤其是对 DDR 不同地址区域同时进行读与写操作时,该 IP 就不能有效的工作。所以我们可以创建一个模块去改善这些缺点。
扯了这么多还没开始讲AXI ,下面真正的要开始讲了:下面所讲的皆是AXI4总线的结构

二、“上车走人”

第一节中我们打了一个比方,在数据交互中,类似于用一种交通工具去将乘客从一个地方运输到另外一个地方,那我们在上车之前我们需要做哪些准备工作呢?(找旅游攻略!,真把自己当成旅游的人了。。),第一步是先看自己适合乘坐什么类型的交通工具。在amba 4的AXI总线 中有几种“交通工具”呢?答案是三种:分别是AXI4、AXI-lite、AXI-Stream;
AXI4:主要面向高性能地址映射通信的需求,是面向地址映射的接口,允许最大256轮的数据突发传输;(在zynq中也叫axi 4 full)
AXI4-Lite:是一个简单地吞吐量地址映射性通信总线,占用很少的逻辑单元;
AXI4-Stream:面向高速流数据传输,去掉了地址项,允许无限制的数据突发传输规模;(也叫作ST)
简单点说就是:AXI4-Lite和AXI4-Stream是AXI 4 full精简之后适用于不同场景的总线,AXI4-Lite适合单数据(32位或者64位)的传输,基于内存映射,传输时需要提供要操作的内存地址,也就是要告诉AXI4-Lite要往哪个地址写数据,一般用于寄存器配置,启动信号等小数据量的传输,而AXI4-Stream则恰恰相反,用于高速的数据流通信,他不需要指定地址,那你肯定就很疑惑了,不需要指定地址为啥还能传输到我想去的地址呢?是这样的:AXI4-Stream只有一个站点那就是目的地,而AXI4-Lite因为要去不同的地址,所以它有很多目的地,因为他是单数据传输,所以他每次到达这个站之后就回到起点重新装人再去另外一个目的地,而AXI4-Stream则不同,它每次只到固定的目的地,而这个目的地不由它自己决定,它也并不知道自己要去哪,他只知道自己在什么时候停,它只在乎装多少人并不在乎去哪,如果你想去其他的地方,你需要在我所到达的目的地之后再去转车,并且我每次装载的数据不止一个而是多个,最多支持256个,这样它就能实现无地址传输,看到这里,你看懂AXI4-Stream的传输了吗?如果你看懂了,那我再给你继续补充三个知识点,一、ST(AXI4-Stream)一次传输多个数据的方式:叫做突发传输(Burst传输)(这下你就理解了什么叫burst了吧,也能理解在第一节中所说的突发传输了吧,哈哈是不是简单易懂);二、在AXI里也有主机(M)和从机(S)的概念,但是不能通过从起点和终点去判断主机和从机,至于为什么呢?这里留个悬念,我们后面在说通道的时候 你自己就能懂了(哈哈,让我稍微装一下);第三:AXI是主机和从机都能控制传输速率的总线,原因也是后面你就懂了(再小小装一下); 讲完了LITE 和ST 我为啥不讲FULL呢?因为我上文中说过了,:AXI4-Lite和AXI4-Stream是AXI 4 full精简之后适用于不同场景的总线,所以AXI4 Full肯定就是包含了AXI4-Lite和AXI4-Stream一起的功能呀,但是它也有自己的特色,后面我们再说,此处先略过一下。
找到了自己适合的交通方式,也就是找到了车站,第二步肯定是找到能到达去目的地的车啊,在AXI4总线 中,所能乘的车我们称之为“通道”,让我们先看看AXI 4中有哪些“车”可供我们搭乘:
AXI4协议(因为stream 无地址操作,所以只包括full 和 lite)具有五个独立的通道:读地址通道、读数据通道、写地址通道、写数据通道、写回应通道。
2021-10-10

上图是官方的介绍,从中我们也知道了不同通道的简写(AR\R\AW\W\B),所以我们在ZYNQ中所看到的信号前缀,(前面的M00_AXI,M指的是主机 AXI:总线 接着后面信号的前缀就是各自通道的信号)你们就知道它们各自是什么通道的了吧:

2021-10-10

我们先介绍一下简单的axi4 -stream,因为它没有地址的概念,它不需要关心车里的数据具体要去哪个地址,反正都是去相同的起始地址,但是一个地址肯定装不下这么多人,所以他便会根据车里数据的排列顺序,开始从起始地址开始往后进行排列,类似于fifo,依次摆放在fifo里面,如果我的起始地址是0x8c000000,那第一个下车的32位数据就会放0x8c000000,第二个就是 0x8c000001,第三个0x8c000002,依次往下排列,在所以在它的世界里只有两个选项,开始or停止,数据装满了就走,给了指令就停;axi4 -stream总线的组成有:
(1)ACLK信号:总线时钟,上升沿有效;
(2)ARESETN信号:总线复位,低电平有效
(3)TREADY信号:从机告诉主机做好传输准备;
(4)TDATA信号:数据,可选宽度32,64,128,256bit
(5)TSTRB信号:每一bit对应TDATA的一个有效字节,宽度为TDATA/8
(6)TLAST信号:主机告诉从机该次传输为突发传输的结尾;
(7)TVALID信号:主机告诉从机数据本次传输有效;
(8)TUSER信号 :用户定义信号,宽度为128bit。

知道了五个通道,不知道你看了这5个通道有没有疑惑?反正我当时是有疑问,5 个是为什么没有读回复通道只有写回复?其实,它是有的,只不过读回复复用了读数据通道。后面我们讲每个通道的时候再细说,我们知道了这五种通道了,它们之间是怎么切换交流的呢?车站是怎么进行各通道之间的调度安排的,下面我们看看主机和从机是怎么通过这些通道完成数据传输的。
首先是写传输操作(Write transcation):
如下图所示,主机首先在写地址通道(AWC)上告知从机本次传输操作(transcaction,对应后文中的"传输操作")的特性,包括地址和控制信息。
然后,在写数据通道(WDC)向从机写入数据,一次传输操作中可能包括多个数据传输(data transfer)。
最后,从机在接收到写数据后,通过写回复通道(RC)将本次传输操作的响应告知主机。主机以收到从机的响应信号,作为本次传输操作结束的标志。手册中强调,写回复是针对整个传输操作(transcaction)的,而不是针对每个写入数据(data transfer)。
2021-10-10

所有传输操作中,RC 与 WDC 的关系都如上图所示,写回复必然是在收到传输操作中最后一个写数据之后触发。
但是,AWC 与 WC 的关系并不局限于一种情况。一般来说,写数据都发生在写地址操作之后,但也不是绝对的,在有些情况下,可以先写数据,或者在同一周期写入数据与地址,都是允许的。这也表现了 AXI 通道之间的独立性。(例外:RC 和 WDC 间的独立性较弱)
接下来看读操作(Read transcation):
读操作只涉及两个通道,首先主机在读地址通道(ARC)上写入本次传输操作(Transcation)待读取数据的地址以及控制信息。
从机在接收到地址后,将该地址上的数据通过读数据通道(RC)传输给主机。

2021-10-10

值得注意的是, AR 虽然名字为读地址通道,但实际上仍由主机写入地址,只不过是写入要读取数据的地址。读地址通道,这个名字确实有点歧义,主机读操作地址通道表达得更贴切一些。
读操作时通道间(ARC&RC)完全独立,当然从机发出读数据一定发生在主机写入读地址后,从机不能未卜先知,是吧。
无论是读写操作,AXI 总线支持,或者说基于突发传输(Burst Transaction)。简单来说,主机可以写入起始地址以及突发传输的长度等信息,从机将起始地址开始,依次接收主机传输的写数据,或者读取连续地址上的数据,作为读数据传输给主机。所以上面两张图中,一次传输操作中(Transcation) 中包括了一次地址与控制信息(Address & Control)、多个数据(data transfer)。

到这儿,简单的跟大伙分享了一下AXI的相关知识,由于篇幅限制,不可能一次性将AXI的所有内容全部分享出来,后面会逐步更新axi的相关知识和FPGA开发领域的其他知识,能看到这儿的,先谢谢大家了。

上一篇:AXI 基础第 1 讲 - AXI 简介


下一篇:AXI从设备接口