Ref:
AHB总线协议 http://t.csdnimg.cn/dCLc5
AHB总线—wrap burst的理解 http://t.csdnimg.cn/g90Go
AMBA总线协议(0)——目录与传送门 http://t.csdnimg.cn/bPOk5 墙裂建议和第一个一起食用,它们俩优势互补,解释角度相互补充,对照学习理解飞快~
目录
---------------------------------------------------------分鸽线--------------------------------------------------------------
AHB基本特性
-
Burst传输:在一次总线事务中,允许一次性传输多个数据,从而提高数据传输效率。
-
Split事务处理:允许多个总线主设备同时使用总线,从而提高总线的并行性和效率。
-
单周期master移交:在总线主设备之间进行切换时只需要一个时钟周期,从而减少总线传输的延迟。
-
单一时钟沿操作:所有总线操作都只在时钟信号的上升沿 (或 下降沿)触发,以确保同步和稳定的总线传输。
-
无三态:总线上的设备不会处于空闲态(高阻态),以确保总线上始终有 有效的信号传输。
-
更宽的数据总线配置(64/128):支持更宽的数据总线,可以一次性传输更多的数据,提高总线的数据吞吐量。
-
流水线操作:允许多个(不同设备的)总线事务同时进行,并行处理,提高总线的效率和性能。
-
可支持多个总线主设备(最多16个):支持多达16个总线主设备同时使用总线,提高了总线的并行处理能力和灵活性。
AHB总线的组成
AHB基本传输
无等待简单传输
麻烦的巴拉巴拉话不说了,直接看图:
注意:
第③周期的时候,你的HADDR信号是给下一个周期准备的,这样做可以加快效率,也就是Pipeline技术
写出来HW和HR是方便你看图,单独分析两个过程的时候分别忽略另一方即可
带等待的简单传输
同理
需要注意的是:
1.这里①标志着开始Address读取(主机要开始准备东西了)
2.②之后从机确实是收到了,但是没消化完,所以从机把HREADY拉低,让主机等等,这时候主机的HADDR也是 Pipeline 给下次准备的,所以要和本次要传的数据一样 一直等着发出去
3.如果是HRDATA的话,本来主机就是搁那等从机的,从机准备好了自然会把数据端上来,所以没有所谓的 2. 情况
多重传输
之前说过了Pipeline在单数据传输的影响,这里你应该也能看懂了
传 A数据 的时候已经 端上来 B控制和B地址 了,这里一个低READY是让从机消化 B相关信号的
当然,它的代价就是:如果你准备往从机写(HW),你准备写的数据就会延长一会儿;同样因为Pipeline原因,C我就不说了。而且,读是不延长的,也讲过
在这里你应该也可以看到:我最多预先存一个准备用,然后一个正在用,也就是说:
AHB的pipeline是两级pipe,总线上你最多有两个正在做但没做完的传输(因为数据读传输、写传输、地址控制传输是分开的。HREADY只有一个, 它的终结 标志着 你准备那一堆 可以被读取),你不可能说是俩都没做完,你master就再搞别的操作,这个时候你这个master只能等。
Burst传输
一般递增Burst
你既然知道pipeline了,你也知道一次完整传输的数据和地址信号咋看了(就是“\”这个方向看,先存好地址,下次直接传数据),不过你看到了BUSY的时候好像啥也没传,这是master告诉slave它还没完全把Data和ADDR消化完
但是地址啥的还是要一直保持的,等消化完了,把HTRANS改成正常递增,就可以继续让slave处理了
注意这里HBURST始终保持一致,表示这是 同一次 递增Burst 正在进行时
HREADY拉低那点之前已经说过了,不再解释
四拍回卷Burst
四拍回卷的话就是一个“回卷”难懂,其实它意思就是:地址递增到边界的时候会打回初始地址重新开始递增(这个初始地址不一定(大概率不)是你开始传输的那个地址),具体算法看Ref。
不过注意的是:边界地址的范围大概是取决于你的HSIZE大小。
四拍递增Burst
和回卷Burst唯一不同就是地址的变化,连续通过16个字节边界
八拍回卷Burst
就是地址边界变了变,这取决于你的总传输字节数:4Byte(这是一个word) * 8 = 32 Byte
喜闻乐见的八拍递增
还是那个样,8个连续边界,不回卷,但是你看看总传输大小变了,因为是half word传输:2Byte
不定长度的递增Burst
这里有俩传输,字类型不同,不再过多啰嗦
AHB 传输控制信号
传输状态HTRANS
传输单位大小HSIZE
传输方向HWRITE
高就是写,低就是读
传输类型Hburst
注意:
1.Burst禁止超过1k大小边界,主机别作死(后边解释)
2.对于回卷Burst:
如果传输的起始地址并未和猝发(第x拍)中字节总数对齐,那么突发传输地址将在达到边界处回卷
例如:一个四拍回卷突发的字(4 字节)访问将在16 字节边界回环。因此,如果传输的起始地址是 0x34,那么它将包含四个到地址0x34、0x38、0x3C 和 0x30;
3.所有Burst传输必须将地址边界和传输单位大小对齐。
例如:字传输(4Byte,8位h)必须对齐到字地址边界(也就是 A[1:0] = 00)
半字传输(2Byte,4位h)必须对齐到半字地址边界(也就是 A[0] = 0)
AHB 地址译码
中央地址译码器去选通设备,选通的信号一般在主机发出的地址信号的高几位,算法简单,不复杂
从机视角:
HREADY高的时候我才能采样地址信号、控制信号、选通信号
选通信号为高表示我传输完了
如果产生了选通信号HSELx,但是HREADY是低,那么在这个传输过后我才会采样那仨信号
---------------------------------------------------------------------------------------------------------------------------------
关于为什么Burst禁止超过1k大小边界的问题:
能够分配给单个从机的最小地址空间是 1KB。
所有总线主机必须被设计为不能执行超过 1KB 地址边界的Burst增量传输。
因此,确保了一个突发绝不会超过地址译码的边界。
默认slave是你的设计没用到所有地址空间的情况:
如果一个 非连续 或者 连续传输 试图访问一个不存在的地址空间时,这个默认从机应该 提供一个 ERROR 响应。 空闲 或者 忙 传输访问不存在的空间时,默认从机应该给出一个零等待状态的 OKAY 响应。
典型默认从机的功能将以作为中央地址译码器的一部分来实现。
AHB 从设备响应信号
master发起一笔传输后,slave可以决定这笔传输的进程,而master不能取消已经发出的传输。
只要slave被访问,它必须提供一个表示传输状态的响应:
slave通过HREADY信号反映传输是否完成;
slave通过HRESP[1:0]反映传输的状态。
传输方式:
(1)立刻完成传输;
(2)插入一个或者多个等待状态以允许有时间来完成传输;
(3)发出一个错误信号来表示传输失败;
(4)延时传输的完成,但是允许主机和从机放弃总线,把总线留给其他传输使用
传输完成阶段
之前传输的时候看到:HREADY低表示扩展数据传输,高表示结束传输
注:每个从机必须有一个 预先确定的 在从机放弃总线之前 插入的 最大等待状态数目,以便能够计算访问总线的延时。
建议但不强制规定,从机不要插入多于 16 个等待状态。防止任何单个访问将总线锁定较长的时钟周期。(意思就是站着茅坑不拉shi,就把他踹下去)
传输响应阶段
一般来说,OKEY + HREADY高 才是正式的传输完成
其他情况
ERROR 响应被slave用来表示 某种形式的 错误条件 和 相关的 传输
比如试图写一个ROM
SPLIT 和 RETRY 响应组合允许slave延长传输完成的时间。
SPLIT 会导致总线释放并给其他master用
而 RETRY 会导致这个主机重新传输
......
这些组合通常仅由有高访问延迟的从机请求,并且这个从机能利用响应编码确保其他主机在长时间内一直访问总线
当从机 需要插入一定数量的等待状态 优于 决定 将要给出何种响应 时从机必须将响应驱
动为 OKAY。
双周期响应(回答上边提及的生词)
什么是双周期响应
(1)在倒数第二个(最后一个的前一个)周期,从机驱动 HRESP[1:0]以表示 ERROR、RETRY 或者 SPLIT 响应。并同时驱动 HREADY 为低以给传输扩展一个额外的周期。
(2)在最后一个周期 HREADY 被驱动为高电平以结束传输,同时HRESP[1:0]保持驱动以表示 ERROR、RETRY 或者 SPLIT。
为什么要用双周期响应
我们知道,由于pipeline,主机的下一个地址总是自作聪明的先站着茅.....先占在总线上。
我们知道HRESP信号是slave发给arbiter的,第一拍我们是把HRESP发给arbiter,之后我们留一拍的时间来取消这个可恶的地址,并且在开始下一次传输之前驱动THRANS变成空闲传输,这样它就能保持当前的地址、数据了。
对于SPLIT和RETRY响应接下来的传输 必须取消。
因为在当前传输完成之前禁止下一次传输发生。
然而,对于 ERROR 响应,由于当前传输不被重复,所以可以选择完成接下来的传输。
例子1
例子2
错误响应
从机提供一个错误响应,主机可以选择取消Burst中剩下的传输。
也允许主机持续Burst中剩下那部分
SPLIT & RETRY
这俩其实就是帮从机的,帮忙抽出总线去干其他东西
对 RETRY 而言,仲裁器将继续使用常规优先级方案。因此只有拥有更高优先级的主机将获准访问总线;
对于 SPLIT 传输而言,仲裁器将调整优先级方案,以便其他任何主机请求总线即能获得访问总线(即使是优先级较低的主机)。为了完成一个 SPLIT 传输,从机必须通知仲裁器何时数据可用。
SPLIT 传输增加了仲裁器和从机的复杂性,但是却有可以完全释放总线给其他主机使用的优点,
但是 RETRY(响应)的情况就只允许较高优先级的主机使用总线。
总线主机应该以同样的方式来对待 SPLIT 和 RETRY(响应)。
主机应该继续请求总线并尝试传输直到传输成功完成 或者 遇到 ERROR 响应时终止。
AHB数据总线
读写分立、最小数据总线宽度是32,但是总线宽度却可以增加
HWDATA写数据总线
如果传输是扩展的那么总线主机必须保持数据有效直到传输完成,由 HREADY 为高表示。
对于宽度小于总线宽度的传输,例如一个在 32 位总线上的 16 位传输,那么总线主机仅需要驱动相应的字节通道。
从机必须负责从正确的字节通道选择写数据,传输位宽小于数据总线宽度的突发传输将在每拍突发中有不同有效字节通道。(比如,第一拍是7-0,第二拍就会变成15-8)
有效字节通道取决于系统的端结构,但是 AHB 并不指定要求的端结构。因此,总线上所有主机和从机的端结构相同这点很重要。
HRDATA读数据总线
读数据总线在读传输期间由合适的从机驱动。
如果从机通过拉低 HREADY 扩展读传输,那么从机只需要在传输的最后一个周期提供有效数据,由 HREADY 为高表示。
对于宽度小于总线宽度的传输。从机仅需要在有效的字节通道提供有效数据(与写数据总线中的表格一致)。总线主机负责从正确的字节通道中选择数据。
当传输以 OKAY 响应完成时,从机需提供有效数据。SPLIT、RETRY 和 ERROR 响应不需要提供有效的读数据。
端结构
为了使系统正确运行,所有模块都是相同端结构的并且任何数据通路或者桥接器也是相同端结构的。(在大部分的嵌入式系统中,动态端结构将导致硅晶片开销增大,因此一般不支持动态端结构)
对于模块设计者而言:
只有应用场合非常宽泛的模块才应该被设计为双端结构,通过一个配置引脚或者内部控制位来选择端结构。
对于更多的特定用途的模块,固定端结构为大端或者小端将产生体积更小、功耗更低、性能更高的接口。