上一篇文章给大家介绍了AHB-lite的一些控制信号,重点是通过这些控制信号去理解AHB-lite为什么这么设计,采用这些控制信号有什么好处。这节课给大家带来剩余的一些控制信号介绍。
1、Slave Response Signaling
1.1、Slave Transfer Responses
在Master发起一次传输以后,剩余的传输过程实际上是由Slave在控制。一旦传输开始,Master不能在中途取消这次传输。在之前的文章中,我们都是从Master的视角去看传输的,这篇文章引入Slave响应的视角,来建立完整的传输流程。
AHB-lite实际上通过HRESP和HREADY这两个信号的组合来控制传输响应,HRESP只有以下两个值:
- OKAY
- 传输完成(HREADY为高)。
- Slave额外需要传输周期,Transfer处于Pending状态(HREADY为Low)。
- ERROR
- 在传输过程中发生了错误(通常情况下是写了只读区域造成的)。
- 需要两个HCLK Cycles去完成。
- Master可以选择继续发该笔Transfer或者不再发起这次传输。
前面已经说过,HRESP和HREADY这两个信号的组合来控制传输响应,因此理论上一共有四种组合,接下来分别介绍这几种情况:
- 当HRESP为0,而HREADY为1,代表本次传输成功。
- 当HRESP为0,而HREADY为0。则代表Slave正在反压主机,可能是从机此时不能够及时的响应,主机此时应该维持住控制信号。当HREADY拉高,并且HRESP仍然为0,则代表本次传输成功结束。(需要注意的是,对于正常的传输,也就是不涉及错误情况的时候,HRESP应该始终为0)
- Note:通常而言,每个Slave应该提前规定好最大的Wait states周期数。此外建议Slave不要插入多于16个周期的等待时间,否则的话每次访问可能要花费大量的时间去等待。
- 当HRESP为1,则代表传输出现错误了。大概率是写了不让写的地方导致的。对于之前的正常传输而言,只需要维持住一个周期的响应,但是ERROR response需要两个时钟周期。(这是由于总线的流水线特性决定的,当slave发出ERROR响应时,下一个传输的地址已经被广播到总线上了。two-cycle响应给master提供了足够的时间取消下一次访问并将HTRANS [1:0]驱动到IDLE。)
我们直接看出现错误传输的情况的时序图,来便于我们的理解。下图是Master终止当前的突发传输的情况:
- T1->T2:Slave插入一个Wait state,即HRADY为0并且将HRESP设置为OKAY。(Slave发现地址B不准写,因此要准备返回ERROR response,首先要插入一个wait states来准备后续的操作,当然也可以插入多个wait states来准备后续的操作)
- T2->T3:Slave返回一个ERROR response,这是ERROR response的第一个时钟周期,此时HREADY为0。
- T3->T4:Slave返回一个ERROR response,这是ERROR response的第二个时钟周期,此时HREADY为1。
- Master因此就有足够多的时间去决定下笔是继续发这个transfer还是终止这次transfer,这也就是为什么需要两个时钟周期去维持这个ERROR response,如果没有两个时钟周期的ERROR response,那么T2->T3的HREADY就应该为高,HTRANS应该迅速变成IDLE,来完成这次传输,如果逻辑复杂的话,组合逻辑链路会过长,为了保证流水线特性,让Master有足够多的时间去感知本次传输出错了,则需要维持两拍的ERROR response,此外这也是保证和其他的正常传输一致。回顾一下没有错误传输情况的突发传输,二者都具有流水线特性)。
- 在这个例子中,Master将HTRANS变成IDLE,代表放弃了这次对地址B的传输。
- T4->T5:Slave返回OKAY response。这次突发传输到此结束。
当然也可以继续传输,如下图所示:虽然A+4不让写。但是Master决定继续写A+8。
2、其它控制信号
2.1、Protection Control
保护控制信号HPROT[3:0],每一位代表不同的含义。该信号用于提供一些保护信息。
- HPORT[0],代表是取数据还是取指令。
- HPORT[1],代表是特权还是非特权模式访问。比如操作系统的地址区域,就应该是特权访问,并不是所有的写都有权限去写这段地址空间,不然就出大事了。
- HPROT[2],代表Bufferable。这个Bufferable指的是写的数据是可以放在Buffer里面还是一定要到达最后的目标地址空间。(实际上最终还是会写回最终目标地址空间的,只不过返回HRESP的时候,大概率是还没有写到最终的目标地址空间)对于写具有严格的先后顺序之分的地址空间,一般是Non-cacheable和Non-bufferable,否则可能会乱序。
- HPORT[3],代表Cacheable,表示是否可以存放在Cache中,是否更新最终的memory。对于外设寄存器这种,当然是不可以Cacheable的。我们本意就是希望写目标寄存器,达到某些功能。写到Cache里面,那就没法达到预期了。
实际上很多AHB的Master或者Slave根本就不支持HPORT信号,或者是无法提供完整正确的HPORT信号。如果你用不到这些信号,ARM的推荐是:
- Master将HPORT设置为0011,代表Non-cacheable、Non-Bufferable、Non-Privileged、data-access
- 对于Slave而言,符合奥卡姆剃刀原理。如非必要,不去使用HPORT信号。
除此之外,AHB5(AMBA5的AHB协议)增加了很多额外的控制信号,这些信号我暂时不打算讲。因为后续还会花几篇文章专门介绍完整的AHB协议,这几篇文章大家掌握AMBA3的AHB-lite控制信号即可。
3、AHB和ARM处理器
AHB本身就是由ARM公司推出的,因此它最早就是用在了ARM系列处理器中,如下图所示:
- AHB-lite总线用在了Cortex-M0,M0+,M3,M4,M7处理器中。用于取指令和数据访问,还用在CoreSight的调试接口上。可以看到这些处理器都是一些低功耗的处理器。AHB-lite协议简单,信号变量较少,对性能要求不高,适用于这些场景。
- AHB2用在了一些早期的ARM处理器中,比如ARM7,实际上这种处理器内核已经没有人使用了,AHB2协议也基本上淘汰了,现在要么是使用AMBA5的AHB5或者AHB-lite或者AMBA3的AHB-lite。(AMBA5和AMBA3的AHB-lite区别很小)。
- AHB5主要用在一些相对性能高的M系列处理器中,比如Cortex-M23,Cortex-M33。这些处理器对保护特性、带锁访问、排他访问等具有要求,因此AHB5的一些信号适用于该场景。
接下来再介绍一下对于某个特定的ARM处理器,它对应的AHB总线协议。
- Cortex-M0/M0+:没用到突发传输,都是Single Transfer。这两款处理器都是非常轻量级的,Buffer也比较少。所以也用不到Burst,不需要源源不断的去取数据。
- Cortex-M3/M4:没有Wrap transaction。只有Single Transfer或者基于INCR的Burst传输。(因为没有Cache,所以没有必要用Wrap transaction)。
除此之外,还增加了sideband signal用于支持Exclusive Transfer(前面已经提到,这两款处理器使用的是AHB-lite协议,AHB-lite协议里面本身没有Exclusive相关的信号。但是有时候要跑实时操作系统的时候,需要semaphore这种机制,设计者可以自行增加这些额外信号)。 - Cortex-M7:有三个AHB-lite接口:AHBS、AHB、AHBP
- AHBS:AHB-lite Slave。用于让DMA去初始化TCM。TCM全称Tightly Coupled Memory。紧耦合内存,可以理解为On-chip Memory。用于存储一些关键的指令和数据。
- AHBD:AHB-lite Debug。用来给Coresight调试用的。
- AHBP:AHB-lite Peripheral。用来访问外设的,只支持Single Transfer。
- Cortex-M23/M33:
- M23和M0+很像,增加了TrustZone和整数除法功能,和M0+一样,只支持Single Transfer。
- M33是M23和M4的缝合产品,支持TrustZone。对于突发传输,它只支持INCR Transfer(依旧没有Cache)。
本节课程就介绍到这里。原本想介绍相关代码的。但内容比较多可能难以消化。接下来应该会花3篇文章给大家介绍AHB2APB和AHB2SRAM的设计。然后介绍一下AHB的局限性,然后就开始AXI相关的介绍。有任何建议和意见欢迎评论或者私信。
欢迎和我一起学习AMBA总线,完整的专栏在这里: