以下文章来源于微信公众号“IC解惑君”,作者木飞
原文链接:漫谈AMBA总线-AHB
1 - AHB引言
在上篇文章文章我们已经分析了AMBA总线系列中的APB总线的优点和缺点。(链接如下:漫谈AMBA总线-APB)总结得出:
缺点1: APB支持且仅支持一个主机
缺点2: APB两个周期才能完成一个数据的传输,数据传输效率不高。
所以针对以上的缺点,ARM 开发了更高级的总线AHB,下文将详述AHB基于APB的改进点,改进策略,以及AHB的协议运行机制。
1-1 背景
在漫谈AMBA总线-APB文章中我们知道只有一个水果店,只卖三种水果分别是:草莓蓝莓和苹果。随着该地区人数的上涨,一个水果店(单主机)已经不能满足该地区的要求,又因为水果店和厂商的配合时间太长(传输效率低),所以大家在商议之下,又开了一家水果店,两家水果店独立运营。在这样的情况下,之前设计的水果运输总线(类比APB)就不能满足当前的需求,所以需要根据当前的需求重新定制水果运输总线V2。
如下左图到右图:
对于V2版本的水果运输总线,在寻求制定策略方面碰到很多问题,但是最主要的两个问题如下:
问题1 : 当水果店1和水果店2同时缺货,所以同时使用大喇叭广播自己的订单需求,那么供应厂商由于两个大喇叭同时通知,会听不清订单的需求,因为互相干扰。
概念 1:总线碰撞(Bus Collision )
由于水果店1和水果店2同时使用大喇叭广播自己的需求,导致供货商听不清订单需求,那么这次水果运输的任务就算是失败的。
类比:
在AHB总线里面,ARM在设计的时候就支持连接多个主机进行操作。当两个或者两个以上的主机同时发起数据操作的时候,那么总线就会产生混乱,导致数据传输失败。
本质原因:一条总线服务两个主机,难免会产生冲突,比如两个人同时打第三个人的电话,第三个人只能接其中某一个人的电话,主要是资源冲突。
解决方法:
(1)给每个水果店配套一个水果运输总线,同时供应厂商也再配套三个,专门为对应的水果店服务(因为供应商同时只能服务一家客户),在IC设计中也叫资源复制。这种方案设计最简单,但是耗费大量的资源。
(2)当出现两个水果店同时进行订单需求的时候,水果店自己需要先确认一下另一个水果店有没有广播,如果有,就等另一个水果店使用大喇叭广播完毕,自己再使用大喇叭广播,在总线协议中,这个动作也叫总线侦听。
(3)两个水果店不想派人力进行侦听广播(或者不具备条件),所以购买一个仲裁设施,该设施对水果店进行等级分类,如果两个水果店同时发起要求,那么最重要的水果店先获得使用这个仲裁设施的允许再使用大喇叭广播(这个获取仲裁设施的允许也叫获取总线授权),等最重要的水果店完成订单之后,仲裁设施再服务相对比较不重要的水果店,总线仲裁中称为优先级仲裁策略。
结论:ARM在升级APB的时候,为了支持多主机,同时为了解决总线冲突的问题,引入了第三种解决方法(优先级仲裁),给每个主机分配不同的优先级,优先级高的主机先发送数据,优先级低的等待完成之后再进行数据发送。
PS:CAN总线,IIC总线使用的是第二种解决方法(总线侦听)来解决总线碰撞的问题。一般来说,分布式总线比较倾向于使用第二种策略,集中式总线比较倾向于第三种(例如SOC片内总线)。
Q1:可能有同学会问,那两个水果店同时发起请求的几率很小,有没有必要引入优先级仲裁策略:
答:如果为了安全的完成数据的策略,即使这种情况出现的概率很小,但是也要考虑这种最坏的情况。同时同样的问题,在SOC设计中遇到这种情况的概率相对较大。
问题2:在上一版本水果运输总线的时候,水果店需要一箱水果,则厂家就需要提供一次水果的运输,水果店再需要一箱,又得再次提供一次水果的运输,这就导致了水果店订单小,但是经常发起订单,浪费了厂家有效运输的时间,因为等待订单和运输是串行工作,先订单发出再运输再发出订单再运输。
概念2:突发传输(Burst)
水果店发起请求的时候,不是按照一箱水果作为订单的单位,而是10箱或者其他数目N个作为订单请求(Burst类型),虽然厂家运输单位是一箱(也就是一辆车只能运送1箱),但是厂家可以派出多辆车同时运输,形成运输的车队(流水线),这样n拍运输时间就基本满足水果店的需求,而之前是2n拍时间才能满足需求。所以这个方案需要水果店和水果厂家同时改进方案。
类比:
在AHB总线中,数据传输时基于Burst类型进行传输的,每次传输都是多个(总线位宽的)数据,通过数据形成多拍(流水的)效果,相比APB总线提升数据的传输效率。
这两个点是AHB针对APB总线提升最大的两个点,当然AHB为了兼容一些其他的问题,有自己独立的一些信号,这个下面继续讨论。
在这里我们总结一下多主机总线的正式概念:
总线是被总线上所有的部件所共享的一组通路(连线),对于支持多主机的总线,如果某一个主机想要与其他的部件进行通信(获得数据),首先需要向总线内部的仲裁器发起使用总线的请求,获得内部仲裁器授予所有权。其次需要将地址(厂商名字)、数据(水果)、命令(进货还是退货)放到总线上,其他的部件对总线上的数据进行侦听,检查地址数据和命令的是否与自己相关,最后相关从机部件做出命令响应。
2 - AHB总线详解
2-1 AHB在SOC内使用的部分:
如上图:
CPU : CPU是操作的发起者,CPU发起读写外设数据的操作。
DMA: DMA也是操作的发起者,DMA从一个部件搬移数据到另一个部件。
比如Mem 2 Mem 、 Mem 2 Peri 、 Peri 2 Mem 、Peri 2 Peri
AHB_interconnect(AHB_Bridge):
根据上文所说的总线协议和传输信号的要求,构建出来的设计实体,该实体首先接收主机端发送过来的独占AHB总线和通路的请求,其次根据内部的仲裁算法拒绝或者授予该主机访问总线的权利。当主机端被授予访问总线的权利时,该AHB_interconnect(AHB_Bridge)接收主机端的命令、数据、地址总线并传播和生成相应的信号到外设。同时接收外设返回的数据并交付给主机端。
SLAVE:对AHB_interconnect输出数据和指令进行响应。
Q2 : 是否可以不需要AHB_interconnect,AHB_Interconect的作用是什么?
同上篇APB文章类似,当CPU只有一个外设,那么直接可以和外设相连,不需要AHB_Interconect。同时也不需要总线的仲裁逻辑,所以关于总线仲裁逻辑的接口直接根据信号状态tie相应的值或者悬空。
当CPU需要连接多个外设的时候,且不止有一个主机(还有DMA)时,需要AHB_interconnect进行仲裁、路由、相应外设信号的生成。
2-2 AHB总线接口:(AMBA AHB 2.0)
AHB信号较多,相应功能也比较强大
系统信号: | |
HCLK | AHB总线的时钟,所有的设备的操作都在时钟下进行,上升沿有效。 |
HRESETn | AHB总线复位信号,给AHB 总线电路结构初始值 |
地址总线: | |
HADDR | AHB传输主机想要操作的地址 |
数据总线: | |
HWDATA | 主机需要给外设写入的数据通道 |
HRDATA | 外设给主机返回的数据通道 |
命令总线:(支持突发) | |
HWRITE | 传输AHB主机的读写操作,1写0读 |
HSIZE | 传输数据的位宽(Byte、HalfWord、Word) |
HBURST | 传输数据的个数 |
HPROT | 提供给外设一定级别的保护 |
HSELx | 仲裁器根据配置输出的选中外设的标志 |
HTRANS | 本次传输的类型 |
HREADY | 此次传输数据是否完成,只关注完成,不关注对错 |
HRESP | 此次传输数据外设给出的响应,表示外设处理的对错等 |
仲裁总线:(支持多主机) | |
HBUSREQx | 主机请求仲裁器,想要获得总线所有权 |
HLOCKx | 主机请求锁定总线一段时间(在这段时间内这个主机独占,不能被再授予) |
HGRANTx | 获得总线所有权标志(还要结合其他信号) |
HMASTER | 哪个主机正在使用总线和支持SPLIT从机寻找对应的主机(后面这个附加其他功能,后文详解) |
HMASTER | 表示使用总线的主机正在尝试一次锁定次序的传输(附加其他功能,后文详解) |
HSPLITx | 从机指示仲裁器,对应的主机应该重新发起一次SPLIT传输。(附加其他功能,后文详解) |
从这张大表可以看出,为了克服APB的缺点从而支持多主机模式、提升效率操作,所在总线接口上付出的代价。至少AHB总线位宽和信号个数远远超过了APB总线。
根据上面的AHB信号列表,结合之前的类比和概念我们基本上就知道AHB该怎么运行,相应的信号如何动作也有了一般的概念。
接下来会从这种总体传输的概念分析到AHB总线内部的时序逻辑和相关的具体操作,希望大家多多支持。
未完待续。。。。。。。