在之前的文章中我们详细讲述了关于AHB的基本操作流程,主机要先从仲裁器获得授权,然后进行总线的访问,这样可以避免总线冲突,获得授权后,主机给出地址和控制信号,从机根据自身情况进行响应,可以分成有等待的情况和无等待的情况,这主要通过从机控制HREADY信号实现。AHB传输共分成4种类型,由主机通过HTRANS体现。
在本文中我们将详细介绍AHB协议中的猝发操作。
猝发是英文burst的翻译,也有译作突发,也有意译成批量的。其含义是指只一次进行多个数据的连续传输,支持猝发对于总线协议来说非常重要,因为很多时候主机与从机之间需要进行连续的,大规模的数据传输,猝发可以使得这类传输的效率大大提升。
AMBA AHB协议定义了4,8和16拍猝发,也有未定长度的猝发和信号传输。协议支持递增和回卷。
(1)递增猝发:访问连续地址,并且猝发中每一次传输的地址只是前一次地址的递增。
(2)回卷猝发:如果传输的起始地址并未和猝发(x 拍)中字节总数对齐,那么突发传输地址将在达到边界处回卷。例如,一个四拍回卷突发的字(4 字节)访问将在16 字节边界回环。因此,如果传输的起始地址是 0x34,那么它将包含四个到地址0x34、0x38、0x3C 和 0x30;
通过使用HBURST[2:0]提供猝发信息。下表给出了8种可能的猝发类型:
HBURST[2:0] | 类型 | 描述 |
000 | SINGLE | 单一传输 |
001 | INCR | 未指定长度的递增猝发 |
010 | WRAP4 | 4拍回卷猝发 |
011 | INCR4 | 4拍递增猝发 |
100 | WRAP8 | 8拍回卷猝发 |
101 | INCR8 | 8拍递增猝发 |
110 | WRAP16 | 16拍回卷猝发 |
111 | INCR16 | 16拍递增猝发 |
(1)猝发禁止超过1KB的地址边界。因此重要的是主机不要尝试发起一个将超过这个边界的定长增量猝发。
(2)猝发大小表示猝发的节拍数量,并不是一次猝发传输的实际字节数量。一次猝发传输的数据总量可以用节拍数乘以每拍数据的字节数来计算,每拍字节数由 HSIZE[2:0]指示。
在实际使用中,有一些特定的情况使得猝发不足以完成,因此对于从机的设计来说,能够利用猝发信息来采取正确的行动就显得至关重要。在AHB总线协议中,通过监控 HTRANS 信号,从设备能够决定何时提前终止一个猝发,并且确保在猝发结束之后每次传输有连续或忙的标记。如果产生一个非连续或空闲传输,那么表明已经开始一个新的猝发。因此,一定已经终止了前一次猝发传输。
如果总线主设备因为失去总线授权而不能完成一次猝发传输,它必须在下一次获得权限后正确地重建猝发。例如,如果一个主机仅完成了4拍猝发中的1拍,那么它必须用一个未定长度猝发来执行剩下的3拍。
接下来我们将通过示例来帮助大家更好地理解猝发。
由于是第一个例子,我们会详细展开图中的每一处细节,后面的部分相同的部分会直接省略。
HCLK:时钟信号,注意是上升沿有效就行,没什么好多说的。
HTRANS[1:0] : 传输类型(私以为亦可以理解成传输状态,这样不容易与猝发类型混淆),00:IDLE(空闲) ; 01:BUSY(忙) ; 10:NONSEQ(不连续) ; 11:SEQ(连续)。在上一篇文章中有重点介绍,不记得的即使回顾。
HADDR[31:0] : 地址总线,32位。
HBURST[2:0] : 猝发类型,上文刚刚提及,这里不展开啦,这里就是使用的WRAP4:四拍回卷猝发。
HWRITE,HSIZE[2:0],HPORT[3:0] :先分别解释一下含义,依次为读写信号,传输大小,保护控制,之所以放在一起是因为它们可以统称为控制信号。会在后面的文章中详细解读,这里理解是控制信号就行。
HWDATA[31:0] : 写数据总线,用来在写操作期间从主机到总线从机传输数据。
HREADY :传输完成,当 HREADY 为高时表示总线上的传输已经完成。
HRDATA[31:0] : 读数据总线,用来在读操作期间从总线从机向总线主机传输数据。
T1时刻:什么都还没发生(对传输来说,对系统来说或许主机正在尝试获取权限呢)
T2时刻:此时主机获得了总线的访问权限,给出了地址和控制信息,还给出了传输类型和猝发类型,表明了这是一次四拍回卷猝发。同时由于是一次猝发的第一个传输,所以传输类型是非连续的。
T3时刻:此时注意到HREADY拉低了,也就是从机插入了等待,对于写操作,主机需要维护HWDATA有效,对于读操作,从机数据无要求。
T4时刻:此时HREADY拉高,从机结束等待,正常进行数据传输。
T5时刻:首先注意一下地址,由于是4拍回卷猝发,地址在16字节边界边界处回卷,所以0x3C后面的地址是0x3O 。其他就是一个正常的数据传输。
T6,T7:正常的数据传输过程。
与之前说的四拍回卷猝发唯一的不同就在于地址的变化,地址连续通过16个字节边界。
地址在32字节边界回卷,因此,地址0x3C后一个地址为0x20 。
这次我们采用的是半字传输,所以地址每次增加2个字节,并且为增量猝发。
图中有2个猝发:
(1)在地址0x20处,开始传输2个半字,半字传输地址以2递增
(2)在地址0x5C处,开始传输3个字,字传输地址以4递增
在本文中我们展现了AHB猝发传输的具体细节,学习了猝发的类型和具体传输方式,猝发是AHB传输中非常重要的一部分,到这里我们已经基本学习完了AHB的核心内容,接下来的文章中我们将继续研究AHB的一些额外细节,让我们整体的知识结构更加完整。