参考资料:
在APB总线中,支持且仅支持一个主机存在,因此并不会导致冲突问题产生,但是在AHB总线里面,ARM在设计的时候就支持连接多个主机进行操作。当两个或者两个以上的主机同时发起数据操作的时候,那么总线就会产生混乱,导致数据传输失败,这种现象被称之为总线碰撞(Bus Collision ):
本质原因:一条总线服务两个主机,难免会产生冲突,比如两个人同时打第三个人的电话,第三个人只能接其中某一个人的电话,主要是资源冲突。
解决方法:
1.给每个主机配套一个总线,同时对应从机也复制,称为资源复制,这种方案设计最简单,但是耗费大量的资源。
2.总线侦听:主机自身在对总线发起请求时,先确认总线上没有主机占用,如果有,等待当前主机释放总线。
3.优先级仲裁策略:对主机等级进行分类,优先级最高的主机先获得总线使用权,等最重要的主机完成处理之后,仲裁设施再服务相对比较不重要的主机,总线仲裁中称为优先级仲裁策略。
结论:ARM在升级APB的时候,为了支持多主机,同时为了解决总线冲突的问题,引入了第三种解决方法(优先级仲裁),给每个主机分配不同的优先级,优先级高的主机先发送数据,优先级低的等待完成之后再进行数据发送。
CAN总线,IIC总线使用的是第二种解决方法(总线侦听)来解决总线碰撞的问题。一般来说,分布式总线比较倾向于使用第二种策略,集中式总线比较倾向于第三种(例如SOC片内总线)。
一个常见的SOC片内AXI总线链接结构,其中,CPU和DMA都是主机,而下面挂载的是bridge外设;AHB_Bridge接收主机端发送过来的独占AHB总线和通路的请求,其次根据内部的仲裁算法拒绝或者授予该主机访问总线的权利。当主机端被授予访问总线的权利时,该AHB_interconnect(AHB_Bridge)接收主机端的命令、数据、地址总线并传播和生成相应的信号到外设。同时接收外设返回的数据并交付给主机端。这样就衍生出了之前说AMBA总线中AHB完整结构时候省略去的那个组件:仲裁组件。
补充AHB中和仲裁相关的信号:
信号 | 来源 | 介绍 |
仲裁相关信号 | ||
HBUSREQx | Master | 主机请求仲裁器,想要获得总线所有权 |
HLOCKx | Master | 主机请求锁定总线一段时间 |
HGRANTx | Bridge | 获得总线所有权标志 |
HMASTER | Bridge | 哪个主机正在使用总线和支持SPLIT从机寻找对应的主机 |
HMASTERLOCK | Master | 表示使用总线的主机正在尝试一次锁定次序的传输 |
HSPLITx | Slaver | 从机指示仲裁器 |
一些信号相关知识点记录:
(1)由于AHB协议中最多支持16个Master,所以HMASTER位宽为4bit。
(2)主设备Masterx控制总线条件:HGRANTx = 1 且 HREADY = 1。
(3)HSPLITx[15:0] 是其中唯一一个从slave发送的信号,从设备用这个信号告诉仲裁器哪个主设备允许重新尝试一次split传输,16bit每一位对应一个主设备。
(4)关于split传输:Split传输含义是根据Slave的响应来分离Master的操作,当传输产生时,如果Slave认为传输的执行将占据大量的时钟周期,那么Slave记录MasterID号(HMASTER),发出一个SPLIT响应,该信号提示Arbiter降低此Master的优先权,移交总线给其他Master。但根据我查到的资料,这个情况好像基本上没有出现过,所以仅作记录。
单个主机请求总线全流程:
(1)MasterA拉高HBUSREQx信号向AHB_Bridge申请使用总线
(2)总线处于空闲阶段,并且当前没有其他优先级更高的Master请求总线,因此AHB_Bridge同意MasterA占用总线,拉高HGRANTx信号。
(3)AHB_Bridge通过HMASTER记录哪个主机正在使用总线,当确定分配总线给MasterA后,HMASTER输出MasterA的ID编号。
(4)没有其他Master打断这次总线占用数据传输,MasterA完成传输后正常释放总线。
注意:HLOCKx信号一般不随意拉高,不然如果允许每一个主机请求时候都拉高HLOCKx,那么优先级仲裁策略最后将转换为FIFS仲裁策略。
多主机仲裁轮转:
T3时刻之前:M1主机获得总线,使用总线传输数据
T3时刻:M2主机想要使用总线,所以向AHB_Interconnect发起总线的使用权请求。此时主机M1正在使用总线传输数据。
T5时刻:仲裁器判断M2的优先级更高,于是取缔M1使用总线的权利。同时授予M2主机使用总线。
T6时刻:主机M1接收到AHB_Bridge取消其使用总线的请求,所以其T6时刻之后不会再发新命令(当然T6时刻之前已经发出命令不能取消了,因为已经被发出到总线)。主机M2已经收到AHB_Bridge授权总线的请求了,但是当前其虽有授权,但是还是没有真正掌握总线。(上一个主机的数据传输阻塞数据总线 HREADY = =0)
T7时刻:上一个主机的数据成功传输(Data(A+8))释放了主机M1占有的地址和控制总线,所以此时主机M2就开始占有地址和控制总线了,HMASTER变化为M2的ID。所以主机M2把其想操作的地址和命令发送到地址和控制总线上。
T8时刻:上一个主机的遗留数据传输卡着总线 (HREADY = =0),此时主机M2还不能进一步掌握数据总线。所以只能保持当前的状态等待上一个主机接收数据释放数据总线。
T9时刻:上一个主机数据传输完成,释放了数据总线(Data(A+12)),进而主机M2进一步掌握了数据总线,把自己需要的数据放到数据总线上来进行一次完整的传输。
一个关于仲裁关键的地方:由于AHB协议是二级流水传输,分为地址传输阶段和数据传输阶段,那也就意味着其让出总线的过程也需要两个时钟周期来完成。
第一步移交地址和控制总线,其次第二步移交数据总线,只有当数据总线也交付完成后,才表示另一个主机独占了总线。这也就能够解释为什么在T7阶段M2没有办法发送命令控制HTRAN和HADDR,因为它还没有完全占用总线。
最后还有一点,在AHB规范并没有给出确定的优先级算法,设计者需要根据具体的系统要求定义。一般情况下设计的仲裁不会中断一个burst传输,将总线接入权让给其他Master。但是既然这个是自己定义编写的,所以在进行一个AHB协议设定的时候,我们当然可以按照想要实现的情况来完成。
同理,在AHB协议中由于多主机结构而需要进行仲裁,那么在AXI协议中也同样需要这种机制。但是在找资料的时候并没有特别详细的说明,所以我认为它应该和上文AHB的相差不多,毕竟都是优先级仲裁嘛,原理大同小异。就是针对AXI协议来说,它区分了多个通道,读写的仲裁应该是分开独立的;而非共用一个仲裁器。