目录
1. 系统总线
总线作为芯片系统之间的通信链路,具有以下优点:
-
低成本:总线可以通过共享信号线、电路和组件等资源来连接多个子系统,从而减少了系统中所需的物理连接和线路数量。这样可以降低系统的成本和复杂度。
-
方便使用:总线提供了一种简单的通信方式,使得各个子系统可以直接访问总线上的数据和设备。这样,系统设计师可以更轻松地将不同的功能模块集成到一个整体系统中,简化了系统的开发和维护过程。
总线的使用也存在缺点,其中一个主要的缺点是可能会造成性能瓶颈:
- 性能瓶颈:当多个子系统同时请求访问总线时,可能会引发冲突和竞争,从而导致总线传输速度的下降和系统性能的降低。特别是在高性能应用中,总线的带宽可能成为系统的瓶颈,限制了数据传输和处理的效率。
为了克服总线的性能瓶颈,有时会采用一些优化措施,例如使用高速总线、增加总线宽度、引入缓存技术、使用分布式通信结构等,以提高总线的传输速度和系统性能。此外,还可以采用其他连接方式,如并行连接、串行连接或者使用更高级的通信协议来替代总线。
2. AMBA
Advanced Microcontroller Bus Architecture
- 片上总线的标准
定义了三种总线:
- AHB(Advanced High-performance Bus)
- ASB(Advanced System Bus)
- APB(Advanced Peripheral Bus)
发展史:
- AMBA 1.0(ASB和APB)
- AMBA 2.0(AHB、ASB和APB)
- AMBA 3.0(AXI)
基于AMBA的微控制器通常由一个高性能系统主干总线组成,该总线能够维持CPU和其他直接存储器访问(DMA)设备所在的外部存储器带宽,加上一个到较窄APB总线的桥接器,较低带宽的外围设备位于该总线上。
2.1 AHB总线
AHB总线具有以下特点:
- 高速总线,高性能
- 2级流水线设计
- 可支持多个总线主设备
- 支持burst传输
- 总线带宽:8、16、32、64、128bits
- 上升沿触发操作
2.1.1 AHB组成部分:
- AHB主设备(master) 进行读写操作,某一时刻只能有一个主设备(CPU、DMA、DSP、LCDC…)使用总线
- AHB从设备(slave): 响应读写操作,根据地址映射选择从设备(外部存储器控制器EMI、APB bridge)
- AHB仲裁器(arbiter): 允许哪一个设备来控制总线,AMBA中并没有规定固定的仲裁算法
- AHB译码器(decoder): 地址译码决定选择哪个从设备
AHB主设备与从设备的传输过程:
- 主设备发起一个请求给仲裁器,包含驱动地址和控制信号(HADDR、HWDATA、HRDATA)
- 仲裁器允许某个主设备控制总线
- 选中的从设备响应驱动地址和控制信号,拉高HREADY
- 总线传输完成
AHB的信号如下:
Name | Source | Description |
---|---|---|
HCLK | Clock Source | Bus clock |
HRESETn | Reset controller | Reset |
HADDR[31:0] | Master | Address bus |
HTRANS[1:0] | Master | Transfer type |
HWRITE | Master | Transfer direction |
HSIZE[2:0] | Master | Transfer size |
HBURST[2:0] | Master | Burst type |
HPROT[3:0] | Master | Protection control |
HWDATA[31:0] | Master | Write data bus |
HSELx | Decoder | Slave select |
HRDATA[31:0] | Slave | Read data bus |
HREADY | Slave | Transfer done |
HRESP[1:0] | Slave | Transfer response(status) |
2.1.2 AHB操作概述
在开始AHB传输之前,必须授予总线主机访问总线的权限。该过程由主设备向仲裁器断言请求信号开始。然后,仲裁器指示何时允许主机使用总线。
授权的总线主控器通过驱动地址和控制信号来启动AHB传输。这些信号提供关于传输的地址、方向和宽度的信息,以及传输是否形成突发的一部分的指示。允许两种不同形式的突发传输:
- 递增突发传输,在地址边界不会进行循环
- 循环突发传输,在特定的地址边界进行循环
写入数据总线用于将数据从主设备移动到从设备,而读取数据总线用于从设备移动到主设备。
每次传输包括:
- 一个地址和控制周期
- 一个或多个数据周期
从设备需要根据特定的时间信号来采样地址和数据。地址不可扩展,意味着固定长度的地址需要在规定的时间内被从设备采样。而数据可以使用特定的信号来进行扩展。当这个信号为低电平时,传输中会插入等待状态,以便从设备有足够的时间来提供或采样数据。
从设备会使用响应信号(HRESP[1:0])来展示其状态,以指示传输的进展或完成情况等。
HRESP[1:0] | 响应 | 描述 |
---|---|---|
00 | OKAY | 当HREADY信号为高电平时,表示传输已成功完成。OKAY响应还用于在给出其他三种响应之前,在HREADY为低电平时,插入的任何额外周期中使用。 |
01 | ERROR | 此响应显示发生了错误。应向总线主机发出错误情况的信号,以便其知道传输不成功。 |
10 | RETRY | 响应显示传输尚未完成,因此总线主机应重试传输。主机应继续重试传输,直到传输完成。需要两个周期的RETRY响应。 |
11 | SPLIT | 传输尚未成功完成。总线主机下次被授予访问总线的权限时,必须重试传输。当传输完成时,从设备将代表主设备请求访问总线。需要两个周期的SPLIT响应。 |
2.1.3 AHB基本传输
AHB传输由两个不同的部分组成:
- 寻址阶段,只持续一个周期。
- 数据阶段,可能需要几个周期。这是通过使用HREADY信号来实现的。
在没有等待状态的简单传输中:
- 在HCLK的上升沿之后,主机将地址和控制信号驱动到总线上。
- 然后,从设备在时钟的下一个上升沿对地址和控制信息进行采样。
- 在从设备已经对地址和控制进行采样之后,它可以开始驱动适当的响应,并且这由总线主设备在时钟的第三上升沿进行采样。
从机可以在任何传输中插入等待状态,如图所示:
Tips:
- 对于写入操作,总线主机将在整个扩展周期内保持数据稳定。
- 对于读取传输,在传输即将完成之前,从设备不必提供有效数据
三个不同的地址的传输如图:
Tips:
- 到地址A和C的传输都是零等待状态
- 到地址B的传输是一个等待状态
- 将传输的数据阶段扩展到地址B具有将传输的地址阶段扩展到C的效果
2.1.4 AHB传输类型
HTRANS信号指出当前传输的四个状态:NONSEQ、SEQ、IDLE、BUSY
HTRANS[1:0] | 类型 | 描述 |
---|---|---|
00 | IDLE | 表示不需要数据传输。IDLE传输类型是在总线主机被授予总线但不希望执行数据传输时使用的。从设备必须始终为IDLE传输提供零等待状态OK响应,并且该传输应被从设备忽略。 |
01 | BUSY | BUSY传输类型允许总线主控器在传输突发的中间插入IDLE周期。此传输类型表示总线主机正在继续进行一系列传输,但下一次传输不能立即发生。当主机使用BUSY传输类型时,地址和控制信号必须反映突发中的下一次传输。从设备应忽略传输。从设备必须始终提供零等待状态OK响应,就像它们响应IDLE传输一样。 |
10 | NONSEQ | 指示突发或单次传输的第一次传输。地址和控制信号与先前的传输无关。总线上的单个传输被视为一个的突发,因此传输类型为非序列的。 |
11 | SEQ | 突发中的剩余传输是顺序的,地址与前一次传输有关。控制信息与上一次传输相同。地址等于上一次传输的地址加上大小(以字节为单位)。在wrapping bursts的情况下,传输的地址在地址边界处循环,该地址边界等于大小(以字节为单位)乘以传输中的节拍数(4、8或16)。 |
第一次传输是突发的开始,因此是非连续的。
-
主机无法立即执行突发的第二次传输(CPU有别的事去干,先挂会机),因此主机使用BUSY传输来延迟下一次传输的开始。在这个例子中,主设备只需要一个周期就可以开始突发中的下一次传输,这在没有等待状态的情况下完成。
-
主设备立即执行突发的第三次传输,但这一次从设备无法完成,并使用HREADY插入单个等待状态。
-
突发的最终传输以零等待状态完成
2.1.4 Burst类型
AMBA AHB协议中定义了4、8和16拍突发,以及未定义长度的突发和单次传输。协议中支持递增和包装突发:
-
递增突发(Incrementing bursts)访问顺序位置,突发中每次传输的地址只是前一个地址的增量。
-
对于循环突发(wrapping bursts),通过定义一个上限和下限,当信号的值超过上限时,它会被映射到下限,并从下限重新开始计数。反之,当信号的值低于下限时,它会被映射到上限,并从上限重新开始计数。如果传输的起始地址未与突发中的字节总数对齐(大小*拍数),则到达边界时,突发中传输的地址将循环。例如,字(4字节)访问的四拍循环突发将在16字节边界处循环。因此,如果传输的起始地址是0x34,则它由四个到地址0x34、0x38、0x3C和0x30的传输组成。
下表是HBURST[2:0] 和八种可能的类型:
HBURST[2:0] | 类型 | 描述 |
---|---|---|
000 | SINGLE | 单次传输 |
001 | INCR | 未指定长度的递增突发 |
010 | WRAP4 | 4-beat wrapping burst |
011 | INCR4 | 4-beat incrementing burst |
100 | WRAP8 | 8-beat wrapping burst |
101 | INCR8 | 8-beat incrementing burst |
110 | WRAP16 | 16-beat wrapping burst |
111 | INCR16 | 16-beat incrementing burst |
突发不得跨越1kB地址边界。因此,重要的是,主控器不要试图启动固定长度的递增突发,这将导致该边界被跨越。
使用仅具有长度为1的突发的未指定长度递增突发来执行单个传输是可以接受的。
递增突发可以是任何长度,但上限是由地址不能跨越1kB边界这一事实设置的。
此外,突发大小指示突发中的节拍数,而不是传输的字节数。如HSIZE[2:0]所示,通过将节拍数乘以每个节拍中的数据量来计算突发中传输的数据总量。
突发内的所有传输必须与等于传输大小的地址边界对齐。例如,字传输必须与字地址边界对齐(即A[1:0]=00),半字传输必须对齐半字地址边界(即A[0]=0)。
2.1.4.1 早期突发终止
在某些情况下,突发将不被允许完成。从设备可以通过监测HTRANS信号并确保在突发开始后每个传输都被标记为SEQUENTIAL或BUSY来确定突发何时提前终止。如果发生非顺序或空闲传输,则这表明新的突发已经开始,因此前一个突发必须已经终止。
如果总线主控器因为失去了对总线的所有权而无法完成突发,那么它必须在下一次访问总线时适当地重建突发。例如,如果主机只完成了四拍突发中的一拍,那么它必须使用未定义长度的突发来执行剩余的三次传输。
下图为显示了一个四拍包装突发,其中为第一次传输添加了等待状态:
下图是一个eight-beat burst的字传输:
下图是一个未定义的长度突发:
显示两个突发:
- 从地址0x20开始的两个半字传输。半字传输地址递增2。
- 从地址0x5C开始的三字传输。字传输地址递增4。
2.1.5 AHB控制信号
2.1.5.1 AHB传输方向
当HWRITE为HIGH时,该信号指示写入传输,并且主设备将在写入数据总线HWDATA[31:0] 上传输数据。
当LOW时,将执行读取传输,并且从设备必须在读取数据总线HRDATA[31:0] 上生成数据。
2.1.5.2 AHB传输大小
HSIZE[2:0] | 大小 |
---|---|
000 | 8bits |
001 | 16bits |
010 | 32bits |
011 | 64bits |
100 | 128bits |
101 | 256bits |
110 | 512bits |
111 | 1024bits |
该大小与HBURST[2:0]信号一起使用,以确定用于循环突发的地址边界。
2.1.5.3 AHB保护控制
保护控制信号HPROT[3:0] 提供了有关总线访问的附加信息,主要用于希望实现某种级别保护的任何模块
信号指示传输是否为:
- 操作码获取或数据访问
- 特权模式访问或用户模式访问。
对于具有存储器管理单元的总线主控器,这些信号还指示当前访问是可缓存的还是可缓冲的。
HPROT[3] | HPROT[2] | HPROT[1] | HPROT[0] | 描述 |
---|---|---|---|---|
- | - | - | 0 | 操作码提取 |
- | - | - | 1 | 数据访问 |
- | - | 0 | - | 用户访问 |
- | - | 1 | - | 特权访问 |
- | 0 | - | - | 不可缓冲 |
- | 1 | - | - | 可缓冲 |
0 | - | - | - | 不可缓存 |
1 | - | - | - | 可缓存 |
并非所有总线主设备都能够生成准确的保护信息,因此建议从设备除非绝对必要,否则不要使用HPROT信号。
2.1.6 AHB地址解码
解码器用于为总线上的每个从设备提供选择信号HSELx。选择信号是高阶地址信号的组合解码,并且鼓励简单的地址解码方案以避免复杂的解码逻辑并确保高速操作。
当HREADY为HIGH时,从设备必须仅对地址和控制信号以及HSELx进行采样,这表明当前传输正在完成。在某些情况下,当HREADY为LOW时,可能会断言HSELx,但在当前传输完成时,所选从机将发生更改。
可以分配给单个从机的最小地址空间为1kB。所有总线主控器都被设计为不会在1kB边界上执行递增传输,从而确保突发永远不会越过地址解码边界。
2.1.7 AHB从设备传输响应
在主设备启动传输后,从设备将确定传输应如何进行。AHB规范中没有规定总线主机在传输开始后取消传输。
无论何时访问从设备,它都必须提供一个指示传输状态的响应。HREADY信号用于扩展传输,这与提供传输状态的响应信号HRESP[1:0]相结合。
从设备可以通过多种方式完成传输。它可以:
- 立即完成传输
- 插入一个或多个等待状态以留出时间完成传输
- 发出错误信号以指示传输失败
- 延迟传输完成,但允许主设备和从设备退出总线,使其可用于其他传输。
2.1.7.1 传输结束
HREADY信号用于延长AHB传输的数据部分。当为LOW时,HREADY信号指示传输将被延长,而当为HIGH时,指示传输可以完成。
每个从机必须具有预定的最大等待状态数,以便计算访问总线的延迟。建议(但不是强制性的)从机插入的等待状态不要超过16个,以防止任何单个访问在大量时钟周期内锁定总线。
2.1.7.2 传输响应
从设备会使用响应信号(HRESP[1:0])来展示其状态,以指示传输的进展或完成情况等。
HRESP[1:0] | 响应 | 描述 |
---|---|---|
00 | OKAY | 当HREADY信号为高电平时,表示传输已成功完成。OKAY响应还用于在给出其他三种响应之前,在HREADY为低电平时,插入的任何额外周期中使用。 |
01 | ERROR | 此响应显示发生了错误。应向总线主机发出错误情况的信号,以便其知道传输不成功。 |
10 | RETRY | 响应显示传输尚未完成,因此总线主机应重试传输。主机应继续重试传输,直到传输完成。需要两个周期的RETRY响应。 |
11 | SPLIT | 传输尚未成功完成。总线主机下次被授予访问总线的权限时,必须重试传输。当传输完成时,从设备将代表主设备请求访问总线。需要两个周期的SPLIT响应。 |
典型的从设备将使用HREADY信号在传输中插入适当数量的等待状态,然后传输将以HREADY HIGH和OK响应完成,这表示传输成功完成。
ERROR响应由从设备用来指示与相关传输有关的某种形式的错误情况。通常,这用于保护错误,例如试图写入只读内存位置。
SPLIT和RETRY响应组合允许从设备延迟完成传输,但释放总线供其他主设备使用。这些响应组合通常只有具有高访问延迟的从设备才需要,并且可以利用这些响应代码来确保不会阻止其他主设备长时间访问总线。
在正常操作中,在仲裁器授予另一个主机访问总线之前,允许主机完成特定突发中的所有传输。然而,为了避免过度的仲裁延迟,仲裁器可以中断突发,并且在这种情况下,主控器必须重新仲裁总线,以便完成突发中的剩余传输。
2.1.7.3 两个周期的响应
在单个周期内只能给出一个OKAY响应。而ERROR、SPLIT和RETRY响应需要至少两个周期。为了完成其中任何一个响应,在倒数第二个(倒数第二个)周期中,从设备将HRESP[1:0] 设置为表示ERROR、RETRY或SPLIT,同时将HREADY设置为LOW以延长传输一个额外的周期。在最后一个周期中,HREADY被设置为HIGH以结束传输,而HRESP[1:0] 仍然保持驱动以表示ERROR、RETRY或SPLIT。
如果从设备需要超过两个周期来提供ERROR、SPLIT或RETRY响应,则可以在传输开始时插入额外的等待状态。在此期间,HREADY信号将保持低电平,响应必须设置为OKAY。
之所以需要两个周期的响应是因为总线的流水线特性。当一个从设备开始发出ERROR、SPLIT或RETRY响应时,后续传输的地址已经广播到总线上。两个周期的响应可以为主设备提供足够的时间来取消这个地址,并在下一个传输开始之前将HTRANS[1:0] 置为IDLE。
对于SPLIT和RETRY响应,必须取消后续的传输,因为它不能在当前传输完成之前进行。然而,对于ERROR响应,当前传输不会重复,后续传输的完成是可选的。
下图显示了RETRY操作的示例
图示了以下事件:
- 主机从传输到地址a开始。
- 在收到此传输的响应之前,主机将地址移动到A+4
- 地址A处的从设备无法立即完成传输,因此它会发出RETRY响应。该响应向主机指示地址A处的传输无法完成,因此地址A+4处的传输被取消并由IDLE传输代替。
下图显示了一个传输,其中从设备需要一个周期来决定它要给出的响应(在此期间HRESP指示OK),然后从设备以两个周期的ERROR响应结束传输。
2.1.7.4 error响应
如果从设备提供ERROR响应,则主设备可以选择取消突发中的剩余传输。然而,这不是一个严格的要求,并且主设备继续突发中的剩余传输也是可以接受的。
2.1.7.5 Split和retry
SPLIT和RETRY响应为从属设备提供了一种机制,当它们无法立即提供传输数据时,可以释放总线。这两种机制都允许在总线上完成传输,因此允许更高优先级的主机访问总线。
SPLIT和RETRY之间的区别在于仲裁器在发生SPLIT或RETRY后分配总线的方式:
- 对于RETRY,仲裁器将继续使用正常优先级方案,因此只有具有更高优先级的主机才能访问总线。
- 对于SPLIT传输,仲裁器将调整优先级方案,以便任何其他请求总线的主机都可以访问,即使优先级较低。为了完成SPLIT传输,必须在从设备具有可用数据时通知仲裁器。
SPLIT传输在从设备和仲裁器中都需要额外的复杂性,但其优点是它完全释放了总线供其他主设备使用,而RETRY情况只允许更高优先级的主设备进入总线。
总线主机应该以相同的方式处理SPLIT和RETRY。它应该继续请求总线并尝试传输,直到它成功完成或被ERROR响应终止。
2.1.8 数据总线
最小数据总线宽度被指定为32位,但总线宽度可以增加。
2.1.8.1 HWDATA[31:0]
写入数据总线在写入传输期间由总线主机驱动。如果传输被延长,则总线主机必须保持数据有效,直到传输完成,如HREADY HIGH所示。
所有传输都必须与等于传输大小的地址边界对齐。
例如,字传输必须与字地址边界对齐(即A[1:0]=00),半字传输必须对齐半字地址边界(即A[0]=0)。
对于比总线宽度窄的传输,例如32位总线上的16位传输,那么总线主控器只需要驱动适当的字节通道。从设备负责从正确的字节通道中选择写入数据。
2.1.8.2 HRDATA[31:0]
读取数据总线在读取传输期间由适当的从设备驱动。如果从设备通过保持 HREADY 为 LOW 来延长读取传输,则从设备只需在传输的最后一个周期结束时提供有效数据,如 HREADY 为 HIGH 所示。
对于比总线宽度窄的传输,从设备只需在活动字节通道上提供有效数据
2.1.8.3 字节顺序
为了系统能够正确运行,所有模块都必须具有相同的字节顺序,并且任何数据路由或桥接也必须具有相同的字节顺序。
不支持动态字节顺序,因为在大多数嵌入式系统中,这将导致显著的冗余硅开销。
对于模块设计者来说,建议只有那些将在各种应用中使用的模块才应该具备双字节顺序,可以使用配置引脚或内部控制位来选择字节顺序。对于更具体应用的模块,将字节顺序固定为小端序或大端序将得到一个更小、更低功耗、更高性能的接口。
2.1.9 仲裁器
仲裁机制用于确保在任何时候只有一个主设备可以访问总线。仲裁器通过观察多个使用总线的请求,并决定当前优先级最高的主设备请求总线来执行此功能。仲裁器还接收来自希望完成split传输的从设备的请求。
不具备执行split传输能力的任何从设备都不需要了解仲裁过程,只需观察到如果总线的所有权更改,传输的一系列操作可能无法完成就可以了。
2.1.9.1 仲裁器信号描述
每个仲裁信号的简要描述如下:
信号名 | 描述 |
---|---|
HBUSREQx | 总线请求信号由总线主控器用来请求对总线的访问。每个总线主机都有自己的HBUSREQx信号到仲裁器,在任何系统中最多可以有16个独立的总线主机 |
HLOCKx | 锁定信号与总线请求信号同时由主机断言。这向仲裁器指示主控器正在执行多个不可分割的传输,并且一旦锁定传输的第一次传输已经开始,仲裁器就不能允许任何其他总线主控器访问总线。HLOCKx必须在其引用的地址之前至少一个周期被断言,以防止仲裁器改变授权信号。 |
HGRANTx | 授权信号由仲裁器生成,并指示适当的主机当前是请求总线的最高优先级主机,考虑到锁定传输和SPLIT传输。当在HCLK的上升沿HGRANTx为HIGH并且HREADY为HIGH时,主控器获得地址总线的所有权。 |
HMASTER[3:0] | 仲裁器使用HMASTER[3:0]信号指示哪个主机当前被授予总线,并且这可以用于控制中央地址和控制多路复用器。具有SPLIT功能的从设备也需要主设备编号,以便它们可以向仲裁器指示哪个主设备能够完成SPLIT事务。 |
HMASTLOCK | 仲裁器通过断言与地址和控制信号具有相同时序的HMASTLOCK信号来指示当前传输是锁定序列的一部分。 |
HSPLIT[15:0] | 具有Split功能的从设备使用16位Split Complete总线来指示哪个总线主设备可以完成Split事务。该信息是仲裁器所需要的,这样它就可以允许主设备访问总线以完成传输。 |
2.1.9.2 请求总线访问
总线主控器使用HBUSREQx信号来请求对总线的访问,并且可以在任何周期期间请求总线。仲裁器将在时钟上升时对请求进行采样,然后使用内部优先级算法来决定下一个访问总线的主机。
通常,仲裁器只会在突发完成时授予不同的总线主设备。
然而,如果需要,仲裁器可以提前终止突发,以允许更高优先级的主设备访问总线。
如果主控器需要锁定访问,则它还必须断言HLOCKx信号,以向仲裁器指示不应授予其他主控器总线。
在没有主设备请求总线的情况下,仲裁器可能会授予某个主设备总线的使用权。这可能发生在没有主设备请求总线时,仲裁器将访问权限授予默认的主设备。因此,如果一个主设备不需要访问总线,它需要将传输类型 HTRANS 设置为指示IDLE传输。
2.1.9.3 授予总线访问权限
仲裁器通过置位适当的 HGRANTx 信号来指示当前优先级最高的请求总线的主设备。当当前传输完成,由 HREADY 信号高电平表示时,该主设备将被授予总线使用权限,并且仲裁器将改变 HMASTER[3:0] 信号以指示主设备编号。
数据总线的所有权延迟于地址总线的所有权。每当一个传输完成,由 HREADY 高电平表示,拥有地址总线的主设备将能够使用数据总线,并且将继续拥有数据总线直到传输完成。下图显示了当两个总线主设备之间发生切换时,数据总线的所有权如何转移。
下图显示了仲裁器如何在传输突发结束时切换总线的示例:
下图显示了系统中如何使用HGRANTx和HMASTER信号。
因为使用了中央多路复用器,所以每个主机都可以立即驱动出它希望执行的传输地址,并且它不需要等待,直到它被授予总线。HGRANTx信号仅由主设备用于确定其何时拥有总线,从而确定其何时应当考虑地址已经由适当的从设备采样。