在之前的文章中,我们已经讲述了AHB传输中的两种情况,基本传输和猝发传输。我们进行一个简单的回顾,首先,开始一次传输之前主机需要向仲裁器申请获得总线的使用权限,然后主机给出地址和控制信号,根据不同的传输类型,猝发类型等,从机做出相应的操作,最后需要回给主机一个响应。我们之前着重讨论了传输类型,猝发类型,却还没有研究关于主机的控制信号和地址的细节,以及从机是如何给出做出读写操作,给出响应的,这就是我们这篇文章的重点了。
在之前的文章中我们就简单的提及过控制信号,一共有3条:传输方向HWRITE,传输大小HSIZE[2:0],保护机制HPROT[3:0] 。控制信号由主机给出,就像每一次传输都需要给出传输类型和猝发类型一样,我们还需要给出一组控制信号来提供传输的附加信息。这些控制信号和地址总线有着严格一致的时序要求,在一次猝发的传输过程中,它们必须保持不变。
当 HWRITE 为高时,该信号表示一个写操作,即主机向从机传输数据;当 HWRITE 为低时,该信号表示一个读操作,即从机向主机传输数据。
HSIZE[2:0]用于表示传输的宽度,传输宽度与 HBURST[2:0]信号一起决定了回卷猝发的边界地址。下表给出了传输宽度的编码及含义:
HSIZE[2:0] | 宽度 | 描述 |
000 | 8位 | 字节 |
001 | 16位 | 半字 |
010 | 32位 | 字 |
011 | 64位 | 双字 |
100 | 128位 | 4字 |
101 | 256位 | 8字 |
110 | 512位 | 16字 |
111 | 1024位 | 32字 |
保护控制信号 HPROT[3:0],提供总线访问的附加信息,并且最初是给那些希望执行某种保护级别的模块使用的,控制保护级别如下表:
HPROT[3] 高速缓存 |
HPROT[2] 带缓冲的 |
HPROT[1] 特权模式 |
HPROT[0] 数据/预取指 |
描述 |
—— | —— | —— | 0 |
预取指
|
—— | —— | —— | 1 | 数据访问 |
—— | —— | 0 | —— | 用户模式访问 |
—— | —— | 1 | —— | 特权模式访问 |
—— | 0 | —— | —— | 无缓冲 |
—— | 1 | —— | —— | 带缓冲 |
0 | —— | —— | —— | 无高速缓存 |
1 | —— | —— | —— | 带高速缓存 |
对于每个总线上的从机来说,使用一个中央地址译码器提供选择信号HSELx。选择信号是高位地址信号的组合译码,并且建议使用简单的译码方案,以避免复杂译码逻辑和确保高速操作。
从机只能在 HREADY 信号为高时采样地址和控制信号以及 HSELx,HSELx 为高表示当前传输已经完成。在特定的情况下有可能在 HREADY 为低时采样 HSELx,但是被选中的从机将会在当前传输完成后变更。
能够分配给单个从机的最小地址空间是 1KB。所有总线主机必须被设计为不能执行超过 1KB 地址边界的增量传输,因此,需要确保了一个突发绝不会超过地址译码的边界。
在系统设计中如果有包含一个存储器映射并未完全填满(存储空间)的情况时应该设置一个额外的默认从机以在访问任何不存在的地址空间时提供响应。如果一个非连续或者连续传输试图访问一个不存在的地址空间时这个默认从机应该提供一个 ERROR 响应。空闲或者忙传输访问不存在的空间(默认从机)应该给出一个零等待状态的 OKAY 响应。典型默认从机的功能将以作为中央地址译码器的一部分来实现。
下图给出了一个地址译码系统和从设备选择信号:
HREADY信号用来扩展(就是我们之前说的插入等待周期)一次传输的数据周期。当HREADY信号为低时,表示将扩展传输;当该信号为高时,表示传输完成。
HRESP[1:0] | 响应 | 描述 |
00 | OKAY |
当 HREADY 为高表示传输已经成功完成。 OKAY 响应也被用来插入任意一个附加周期,当 HREADY 为低时,优先给出其他三种响应之一。
|
01 | ERROR |
该响应表示发生了一个错误。错误条件应该发信号给总线主机,以便让主机意识到传输失败。 一个错误条件需要双周期响应。
|
10 | RETRY |
RETRY(重试)信号表示传输并未完成,因此总线主机应该重试传输。主机应该继续重试传输直到完成为止。要求双周期的 RETRY 响应。
|
11 | SPLIT |
传输并未成功完成。总线主机必须在下一次被授予访问总线时重试传输。当传输能够完成时从机将请求代替主机访问总线。要求双周期的 SPLIT 响应。
|
简单总结一下,OKAY响应那就是一切顺利,传输正常完成,ERROR就是从机发现主机提出的要求自己满足不了,这活我干不了啊,RETRY就是从机告诉主机,你再重新试一次,SPLIT就是从机表示你这传输我还没干完,但是我有其他事情要忙,我就不管你了,你还要来?找仲裁器去吧。
仅有 OKAY 响应可以在单个周期里给出。ERROR、SPLIT 和 RETRY 响应需要至少两个周期。为了完成这些响应中的任意一个:
(1)在倒数第二个(最后一个的前一个)周期,从机驱动 HRESP[1:0]以表示 ERROR、RETRY 或者 SPLIT 响应。并同时驱动 HREADY 为低以给传输扩展一个额外的周期。
(2)在最后一个周期 HREADY 被驱动为高电平以结束传输,同时HRESP[1:0]保持驱动以表示 ERROR、RETRY 或者 SPLIT。
如果从机需要两个以上的周期以提供 ERROR、SPLIT 或者 RETRY 响应那么额外的等待状态可能会在传输开始时被插入。在这段时间 HREADY 信号将为低电平同时响应必须被设为 OKAY。
需要双周期响应是因为总线通道的本质特征。在从机开始发出 ERROR、SPLIT 或者 RETRY 中任何一个响应时,接下来传输的地址已经广播到总线上了。双周期响应允许主机有足够的时间来取消该地址。并且在开始下一次传输之前驱动 HTRANS[1:0]为空闲传输。
对于SPLIT和RETRY响应接下来的传输必须取消。因为在当前传输完成之前禁止下一次传输发生。然而,对于 ERROR 响应,由于当前传输不被重复,所以可以选择完成接下来的传输。
下图给出了带有RETRY响应的传输:
分割和重试响应给从机提供了在无法立刻给传输提供数据时释放总线的机制。这两种机制都允许在总线上结束传输。因此,允许更高优先级的主机能够访问主机。分割(SPLIT)和重试(RETRY)的不同之处在于仲裁器在发生 SPLIT 和 RETRY 后分配总线的方式:
(1)对 RETRY 而言,仲裁器将继续使用常规优先级方案。因此只有拥有更高优先级的主机将获准访问总线;
(2)对于 SPLIT 传输而言,仲裁器将调整优先级方案,以便其他任何主机请求总线即能获得访问总线(即使是优先级较低的主机)。为了完成一个 SPLIT 传输,从机必须通知仲裁器何时数据可用。
为了不使用三态驱动,同时又允许执行AHB系统,所以要求分开读和写数据总线。最小的数据宽度规定为 32 位,但是总线宽度却可以增加。
写数据总线在写传输期间由总线主机驱动。如果传输是扩展的那么总线主机必须保持数据有效直到传输完成,由 HREADY 为高表示。
为了使系统正确运行事实上所有模块都是相同端结构的并且任何数据通路或者桥接器也是相同端结构的。
在大部分的嵌入式系统中,动态端结构将导致硅晶片开销增大,因此一般不支持动态端结构。
对于模块设计者而言,建议只有应用场合非常宽泛的模块才应该被设计为双端结构的,通过一个配置引脚或者内部控制位来选择端结构。对于更多的特定用途的模块,固定端结构为大端或者小端将产生体积更小、功耗更低、性能更高的接口。
在本文中我们讨论了AHB的很多传输细节,主要有控制信号,地址信号的译码,从机的响应等,其中重点介绍了双周期响应,最后介绍了数据总线及端结构,在后面的文章中我们将继续介绍AHB传输的仲裁机制。