参考资料:
(3)AXI协议详解(4)-突发传输_axi突发长度-CSDN博客
1、发展历史
华为实习笔试的时候有遇到这个方面的问题,几个比较重要的时间线是:
(1)AMBA1发布了APB和ASB(Advanced System Bus),ASB是AHB的前身,后因为太复杂而不再使用,所以讲到AMBA总线的时候没有太多提到它。
(2)AMBA2发布了AHB,并更新了APB,值得一提的是,APB基本上在之后所有版本更新中都被更新了,确实还是有其不可替代的点的。
(3)AMBA3发布了AXI,也就是我们目前未知基本上在FPGA或者IC设计中最最常见的总线协议。
(4)AMBA4和5分别发布了ACE和CHI,其中,ACE是AXI的一种衍生总线,CHI全称是“相干集线器接口”,这两个我目前来说,基本上没用到过,也没有特地准备这个知识点,只需要知道他们俩也属于AMBA总线就可以了(希望别有面试官问我这个)。
本文主要就APB、AHB、AXI展开讲讲记录一下我觉得重要的资料。
2、APB
APB全称是(Advanced Peripheral Bus),即高级外设总线,它是最低带宽的总线协议,主要用处是为了支持低速外围设备,在低功耗和低复杂性方面做了特定的优化,不支持burst突发传输。它最主要的一个特点就是读写操作都至少需要2个周期,可以由一个状态转换图来表示:
这里有两个重要信号,PSELx和PENABLE,当主机发送读/写指令的时候,就会自动进入到setup阶段,PSELx=1,然后第二个周期自动进入access阶段,PENABLE=1,表示数据读出/写入。
一次数据操作完成后,如果下一次传输紧接着来了,就会回到setup阶段,否则回到IDLE阶段等待。
值得一提的是,在AMBA 3中,APB协议更新了两个信号,PREADY和PSLVERR,其中PREADY表示从机是否准备好,如果没有准备好,则状态机需要一直保持在access状态中;而PSLVERR信号则是表示本次操作请求失败,但是不常用。如果本次操作请求失败,需要把PREADY和PSLVERR同时拉高。我的理解是,如果主机发送请求之后超过了多少个周期从机还没有准备好的话,即可认为这次请求失败。
APB中信号汇总:
信号 | 来源 | 介绍 |
PCLK | System | 时钟 |
PRESETn | System | 复位 |
PADDR | Master | 一般为32bit,读/写地址 |
PSELx | Master | 状态机控制信号 |
PENABLE | Master | 状态机控制信号 |
PWRITE | Master | 0:读操作 1:写操作 |
PWDATA | Master | 一般为32bit,写数据 |
PRDATA | Slave | 一般为32bit,读数据 |
PREADY | Slave | 从机是否准备好信号 |
PSLVERR | Slave | 本次请求失败信号 |
其他关于APB好像也没有什么要讲的了,这个协议最重要的就是它的工作不是流水进行的,一次传输固定要消耗两个时钟周期,简单,用于低速外设。
3、AHB协议
AHB全称是(Advanced High-performance Bus),即高级高性能总线。它可以将微控制器(CPU)、高带宽的片上RAM、高带宽的外部存储器接口、DMA总线控制器,以及各种AHB接口的控制器等连接起来构成一个独立的完整SOC系统,还可以通过AHB-APB桥来连接APB总线系统。相比于APB协议来说,AHB不再是固定两个周期数据传输,而是支持两级流水操作。
由于AHB还支持多主多从,这样导致的后果就是在AHB中,需要考虑仲裁操作,关于仲裁相关的,下次再理解。
还是说回AHB的数据传输模式。AHB的读和写都包括两个阶段,两个阶段间是流水的关系,第一个阶段传递地址,第二个阶段传输数据。当需要传输多笔数据的时候,下一次地址会和上一次的数据阶段重合。
AHB中数据传输相关信号汇总(省略去了和仲裁相关的信号):
信号 | 来源 | 介绍 |
HCLK | System | 时钟 |
HRESETn | System | 复位 |
HADDR | Master | 一般为32bit,读/写地址 |
HTRANS[1:0] | Master | 当前传输类型 |
HWRITE | Master | 0:读操作 1:写操作 |
HSIZE[2:0] | Master | 传输一次的数据大小,0~7分别表示8bits(byte), 16bits(halfword),32bits(word),64bits,128bits,256bits, 512bits,1024bits |
HBRUST[2:0] | Master | 突发类型和突发个数 |
HSELx | Master | 从机选择 |
HWDATA | Master | 一般为32bit,写数据 |
HRDATA | Slave | 一般为32bit,读数据 |
HREADY | Slave | 从机是否准备好信号 |
HRESP[1:0] | Slave | 附加信息,OKEY、ERROR、RETRY和SPLIT。 |
同时,AHB协议还支持burst传输,这是APB中没有的,详细记录一下和突发传输相关的几个信号。
HTRANS信号,类似于在APB中PSELx和PENABLE信号的合并,只会在突发传输的时候出现,当从机收到这个信号时,表明当前的传输是一个突发中的某一拍。
HBRUST信号,定义了突发的个数和地址的增长类型。增量突发每次地址递增,回环突发会在传输地址达到边界值时回到最小值。
地址每次的增长量由HBRUST和HSIZE共同决定。例如HBRUST=3‘b010,HSIZE=3’b010,即一个4拍字回环突发,每次地址增量为0x04,以0x10为地址回环的边界,每次到达边界的倍数时,就会从上一个边界处重新开始。
下图是8增量的半字传输增量突发,用来协助理解。
还有一个要点,就是突发禁止超过 1KB 的地址边界。这和每个从机分配到的映射地址都是1KB有关。如果跨过这个边界就会导致将数据读出/写入是发生在其他从机的情况。
4、AXI协议
AXI全称是(Advanced eXtensible Interface),即高级可扩展总线。在AMBA4.0修正后,包括AXI4.0-full、AXI4.0-lite和AXI4.0-stream。
AXI4.0-lite是AXI4.0-full的简化版本,一个地址对应一个数据,不使用burst; AXI4.0-stream不需要进行burst长度的设定,用于大量数据的传输应用。
相比于AHB协议,AXI协议(1)将读写通道分离开来,并且支持了更大的突发长度;(2)优化了burst传输,只需要首地址就可以完成一次完整的突发;(3)支持乱序传输,非对齐数据传输。使得它对比AHB来说,速度更快,更强大。
AXI协议定义了5个独立的传输通道:写地址通道、写数据通道、写响应通道、读地址通道、读数据通道。(这里没有单独读响应通道是因为读数据会进行反馈,可以通过对于这个数据的读取表明读操作是否完成)。
AXI中数据传输相关信号汇总(省略去了和仲裁相关的信号以及用户自定义信号):
信号 | 来源 | 介绍 |
ACLK | System | 时钟 |
ARESETn | System | 复位 |
写地址通道 | ||
AWID | Master | 写地址ID |
AWADDR | Master | 写地址,突发首地址 |
AWLEN[7:0] | Master | 写突发次数 |
AWSIZE[2:0] | Master | 写突发单次字节数,0~7分别表示8bits(byte), 16bits(halfword),32bits(word),64bits,128bits,256bits, 512bits,1024bits |
AWBURST[1:0] | Master | 写突发类型 |
AWVALID | Master | 写突发有效信号 |
AWREADY | Slave | 从机是否准备好 |
写数据通道 | ||
WID | Master | 写地址ID |
WDATA | Master | 写数据 |
WSTRB | Master | 写数据有效的字节,掩码作用 |
WLAST | Master | 表示写的最后一个数据 |
WVALID | Master | 写有效 |
WREADY | Slave | 从机是否准备好 |
写响应通道 | ||
BID | Slave | 写响应ID |
BVALID | Slave | 写响应有效 |
BRESP | Slave | 写响应,表明写事务的状态 |
BREADY | Master | 表明主机能够接收写响应 |
读地址通道 | ||
ARID | Master | 读地址ID |
ARADDR | Master | 读地址,突发首地址 |
ARLEN[7:0] | Master | 读突发次数 |
ARSIZE[2:0] | Master | 读突发单次字节数, 0~7分别表示8bits(byte), 16bits(halfword),32bits(word),64bits,128bits,256bits, 512bits,1024bits |
ARBURST[1:0] | Master | 读突发类型 |
ARVALID | Master | 读突发有效信号 |
ARREADY | Slave | 从机是否准备好 |
读数据通道 | ||
RID | Master | 写地址ID |
RDATA | Master | 写数据 |
RRESP | Master | 读响应 |
WLAST | Master | 表示读的最后一个数据 |
WVALID | Master | 读有效 |
WREADY | Slave | 从机是否准备好 |
关于这些信号:
(1)AXI协议每一个通道都有一个握手信号,用于在传输过程中对地址、数据、控制信号进行握手。
(2)读响应信号包含在读数据通道内,没有单独一个通道。
(3)AXI要求通道间满足写响应必须跟随最后一次burst的的写传输;读数据必须跟随数据对应的地址。
(4)VALID信号不能依赖READY信号。这个约定表明了VALID信号是由Master信号主动产生的,并不是检测到从机READY之后才拉高。
对比AHB,AXI突发长度支持INCR突发类型为1~256次传输,对于其他的传输类型(FIXED、WRAP)依然保持1~16次突发传输。Burst_Length=AxLEN[7:0]+1,即实际突发长度比AxLEN设定的值要多1。
INCR的burst地址不能跨4KB边界,原因和AHB协议中相同。
不支持提前终止burst传输(AHB也不支持提前终止)。主机可以忽略后续的数据,但是不能中途停止某一次传输。
AxBURST表示AXI中的突发类型,相比于AHB来说,多了一个FIXED突发类型,这个类型传输表示在突发传输过程中地址固定,一般是用于FIFO访问。
5、APB、AHB、AXI的对比和常见问题
三大总线的区别:
(这个图中有个错误地方,我查资料说AHB总线是不支持乱序访问的;其他地方都总结的挺好的)
AHB和AXI的burst传输区别:
AHB需要一次burst传输的所有地址依次向从机发送,并且后一次突发必须在前一次完成之后才能进行;而AXI只需要一次burst传输的首地址,且支持乱序访问。
什么时候用AXI,什么时候用AHB:
AXI类似于AHB的优化增强。当应用对数据传输速度和吞吐量有极高要求时,应选择AXI总线;而当应用对性能有一定要求,但不需要AXI总线提供的极端高速和高带宽特性时,AHB总线是一个更合适的选择。这两种总线的选择取决于具体的系统设计和应用需求。
有碰到其他问题后续再补充……