系统总线简介
系统总线上传送的信息包括数据信息、地址信息、控制信息,因此,系统总线包含有三种不同功能的总线,即数据总线DB(Data Bus)、地址总线AB(Address Bus)和控制总线CB(Control Bus)。这个技术的开发是用来降低成本和促进模块化。
总线作为芯片系统之间的通信链路,具有以下优点:
*低成本:总线可以通过共享信号线、电路和组件等资源来连接多个子系统,从而减少了系统中所需的物理连接和线路数量。这样可以降低系统的成本和复杂度。
*方便使用:总线提供了一种简单的通信方式,使得各个子系统可以直接访问总线上的数据和设备。这样,系统设计师可以更轻松地将不同的功能模块集成到一个整体系统中,简化了系统的开发和维护过程。
总线的使用也存在缺点,其中一个主要的缺点是可能会造成性能瓶颈:
*性能瓶颈:当多个子系统同时请求访问总线时,可能会引发冲突和竞争,从而导致总线传输速度的下降和系统性能的降低。特别是在高性能应用中,总线的带宽可能成为系统的瓶颈,限制了数据传输和处理的效率。
为了克服总线的性能瓶颈,有时会采用一些优化措施,例如使用高速总线、增加总线宽度、引入缓存技术、使用分布式通信结构等,以提高总线的传输速度和系统性能。此外,还可以采用其他连接方式,如并行连接、串行连接或者使用更高级的通信协议来替代总线。
AMBA总线
高级微控制器总线架构(英语:Advanced Microcontroller Bus Architecture, AMBA)是用于ARM架构下系统芯片(SoC)设计中的一种总线架构。
AMBA总线的发展史如下:
*AMBA 1.0(ASB和APB)
*AMBA 2.0(AHB、ASB和APB)
*AMBA 3.0(AXI)
该总线总是包含这么几个部分:
CPU(核心功能是进行数据的运算),DMA(帮助进行数据搬运等无需消耗CPU做的事),RAM以及外部存储。当时钟比较慢的总线(比如APB)与时钟比较快的总线(比如AHB)要进行数据传输时必须通过一个Bridge(桥连器),之后的慢速总线就可以接其他外设之类的了。
这里我们主要介绍的是AHB总线。
AHB总线
AHB=Advanced High Performance Bus,译作高级高性能总线。
AHB总线有许多特点,比如
- 高速总线,高性能
- 2级流水线设计
- 可支持多个总线主设备
- 支持burst传输
- 总线带宽:8、16、32、64、128bits
- 上升沿触发操作
AHB总线结构
AHB总线主要会包括四个部分,他们分别是:
*AHB主设备(master) 进行读写操作,某一时刻只能有一个主设备(CPU、DMA、DSP、LCDC…)使用总线。
*AHB从设备(slave): 响应读写操作,根据地址映射选择从设备(外部存储器控制器EMI、APB bridge)。
*AHB仲裁器(arbiter): 允许哪一个设备来控制总线,AMBA中并没有规定固定的仲裁算法。
*AHB译码器(decoder):用来对每次传输进行地址译码,并在传输中包含一个从设备的选择信号。
从上面的流程图中可以看出AHB总线中主从设备的信息交互过程是这样的:
-首先,主设备发起一个请求给仲裁器,包含驱动地址和控制信号(HADDR、HWDATA、HRDATA)
-之后,仲裁器会允许其中一个主设备控制总线,并传输数据给从设备。
-然后,被选中的从设备响应驱动地址和控制信号,拉高HREADY。
- 最后通过地址译码器将数据传回给主设备,传输结束。
AHB信号组成
列举了AHB中大部分会使用到的信号,如下所示:
名称 | 来源 | 作用 |
---|---|---|
HCLK | 时钟源 | 作为总线的时钟 |
HRESETn | 重置控制器 | 重置 |
HADDR[31:0] | 主设备 | 32位系统地址总线 |
HTRANS[1:0] | 主设备 | 当前传输的类型,包括NONSEQUENTIAL、SEQUENTIAL、IDLE和BUSY |
HWRITE | 主设备 | 高时表示写传输,低时表示读传输 |
HSIZE[2:0] | 主设备 | 从0开始分别代表8位,16位,32位···1024位 |
HBURST[2:0] | 主设备 | 突发传输类型,支持4、8和16拍突发,突发可以是递增的,也可以是换行(循环)的 |
HPROT[3:0] | 主设备 | 用于保护,具体不清楚 |
HWDATA[31:0] | 主设备 | 在写操作期间将数据从主总线传输到从总线。建议数据总线宽度不小于32位。 |
HSELx(从设备选择) | 译码器 | 每个AHB从设备都有自己的选择信号,这个信号表明当前的传输是为所选的从设备准备的。这个信号只是地址总线的组合解码。 |
HRDATA[31:0] | 从设备 | 在读操作期间将数据从从设备传输到主设备。 |
HREADY | 从设备 | 这个信号为高时,HREADY信号表示总线上的传输已经完成。这个信号可以被驱动为低电平以扩展传输。 注意:总线上的slave需要HREADY作为输入和输出信号。 |
HRESP[1:0](传输回执) | 从设备 | 传输响应提供有关传输状态的附加信息。 提供了四种不同的响应:OKAY, ERROR, RETRY和SPLIT |
AHB详细操作过程
在开始AHB传输之前,必须授予总线主机访问总线的权限。该过程由主设备向仲裁器断言请求信号开始。然后,仲裁器指示何时允许主机使用总线。
授权的总线主控器通过驱动地址和控制信号来启动AHB传输。这些信号提供关于传输的地址、方向和宽度的信息,以及传输是否形成突发的一部分的指示。允许两种不同形式的突发传输:
1.递增突发传输,在地址边界不会进行循环
2.循环突发传输,在特定的地址边界进行循环
写入数据总线用于将数据从主设备移动到从设备,而读取数据总线用于从设备移动到主设备。每次传输包括:
1.一个地址和控制周期
2.一个或多个数据周期
从设备需要根据特定的时间信号来采样地址和数据。地址不可扩展,意味着固定长度的地址需要在规定的时间内被从设备采样。而数据可以使用特定的信号来进行扩展。当这个信号为低电平时,传输中会插入等待状态,以便从设备有足够的时间来提供或采样数据。所以从设备会用一个响应信号来显示他当前传输数据时的状态:
HRESP[1:0] | 响应状态 | 具体描述 |
---|---|---|
00 | OKAY | OKAY响应用于指示传输正在正常进行,当HREADY为高时,表示传输已成功完成。 |
01 | ERROR | ERROR响应表示发生了传输错误,并且传输不成功。 |
1x | RETRY和SPLIT | RETRY和SPLIT传输响应都表明传输不能立即完成,但是总线主机应该继续尝试传输。 |
AHB具体传输流程
AHB传输由两个不同的部分组成:
1.地址阶段,它只持续一个周期。
2.数据阶段,可能需要几个周期。这是通过HREADY信号实现的。
首先下面这个例子是没有等待状态的最简单的传输方式:
在这次传输过程中:
首先,在HCLK的上升沿之后,主设备将地址和控制信号驱动到总线上。
然后,从设备在时钟的下一个上升沿对地址和控制信息进行采样。
在从设备已经对地址和控制进行采样之后,它可以开始驱动适当的响应,并且这由总线主设备在时钟的第三上升沿进行采样。
从机可以在任何传输中插入等待状态(可以注意一下此时的HREADY),如图所示:
注意:
- 对于写入操作,总线主机将在整个扩展周期内保持数据稳定。
- 对于读取传输,在传输即将完成之前,从设备不必提供有效数据。
以下是一个依次输入三个地址的例子
可以明显看出是一个二级流水线结构,注意:
- 到地址A和C的传输都是零等待状态
- 到地址B的传输是一个等待状态
- 将传输的数据阶段扩展到地址B具有将传输的地址阶段扩展到地址C的效果(即流水线操作)
AHB传输类型
每个传输可以分为四种不同的类型,如表中HTRANS[1:0]信号所示。
HTRANS[1:0] | 类型 | 描述 |
---|---|---|
00 | IDLE | 表示不需要传输数据。当总线主机被授予总线,但不希望执行数据传输时,使用IDLE传输类型。 从设备必须始终为IDLE传输提供零等待状态OKAY响应,并且该传输应该被从设备忽略。 |
01 | BUSY | BUSY传输类型允许总线主设备在burst传输中插入IDLE周期。这种传输类型表明总线主站正在继续进行一连串的传输,但是下一个传输不能立即发生。当主设备使用BUSY传输类型时,地址和控制信号必须在burst中反映下一个传输。 slave应该忽略传输。从服务器必须始终提供零等待状态OKAY响应,与它们响应IDLE传输的方式相同。 |
10 | NONSEQ | burst指示或单次传输的第一次传输。地址和控制信号与之前的传输无关。 总线上的单次传输被视为一次传输的burst,因此传输类型为NONSEQUENTIAL。 |
11 | SEQ | 在突发中剩余的传输是顺序的,地址与前一次传输相关。控制信息与前一次传输相同。该地址等于前一次传输的地址加上大小(以字节为单位)。在封装突发的情况下,传输地址在地址边界处封装,等于大小(以字节为单位)乘以传输中的节拍数(4,8或16)。 |
可能光看这些文字会觉得很头晕,不妨看下面这个实例:
• 第一次传输是突发的开始,因此是NONSEQUENTIAL的。
•主设备不知道出了什么情况不能立即执行突发的第二次传输,因此主设备使用BUSY传输来延迟下一个传输的开始。在这个例子中,主设备只需要一个周期,就可以准备好在突发中开始下一个传输,并且没有等待状态。
•主设备立即执行第三次突发传输,但这一次从设备无法完成,并使用HREADY插入单个等待状态。
•突发的最终传输在零等待状态下完成。
BURST的类型
前面提到burst代表的是数据传输的一种模式,上面的例子其实也是busrt的其中一种类型,接下来说明所有burst的类型:
在AMBA AHB协议中定义了4、8和16拍突发,以及未定义长度的突发和单次传输。协议中支持递增和循环burst。
递增突发(Incrementing bursts)是访问顺序位置,突发中每个传输的地址只是前一个地址的增量。
循环突发(wrapping bursts)通过定义一个上限和下限,当信号的值超过上限时,它会被映射到下限,并从下限重新开始计数。反之,当信号的值低于下限时,它会被映射到上限,并从上限重新开始计数。如果传输的起始地址未与突发中的字节总数对齐(大小*拍数),则到达边界时,突发中传输的地址将循环。
举个简单的例子,字(4字节)访问的四拍循环突发将在16字节边界处循环。因此,如果传输的起始地址是0x34,则它由四个到地址0x34、0x38、0x3C和0x30的传输组成。
对于HBURST[2:0]有八种可能的类型:
HBURST[2:0] | 类型 | 描述 |
---|---|---|
000 | SINGLE | 单次传输 |
001 | INCR | 未指定长度的 Incrementing burst |
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的边界来设置的(意思就是说数据长度最多只能1024BYTE)。
·突发大小是指突发的节拍数,而不是传输的字节数。通过将节拍数乘以每个节拍中的数据量来计算突发中传输的数据总量,如HSIZE[2:0]所示。
·在一个突发内的所有传输必须对齐到等于传输大小的地址边界。例如,字传输必须与字地址边界对齐(即A[1:0] = 00),半字传输必须与半字地址边界对齐(即A[0] = 0)。
早期突发终止
在某些情况下,突发将不允许完成,因此重要的是,如果突发提前终止,任何使用突发信息的从属设计都可以采取正确的行动。从服务器可以通过监控HTRANS信号来确定突发何时提前终止,并确保在突发开始后,每个传输都被标记为SEQUENTIAL或BUSY。如果发生NONSEQUENTIAL或IDLE传输,则表明新的突发已经开始,因此前一个突发必须已经终止。
如果总线主控器因为失去了对总线的所有权而无法完成突发,那么它必须在下一次访问总线时适当地重建突发。例如,如果主机只完成了四拍突发中的一拍,那么它必须使用未定义长度的突发来执行剩余的三次传输。
下图为显示了一个四拍循环突发,其中为第一次传输添加了等待状态。
由于突发是一个四拍的字传输突发,地址将在16字节边界处包装,因此向地址0x3C的传输之后是向地址0x30的传输。
与增量突发的唯一区别,如下图所示,是地址继续超过16字节边界。
下图是一个8拍的字传输
地址将在32字节边界处封装,因此地址0x3C后面跟着0x20。
下图的突发使用半字传输,所以地址增加2,突发是递增的,所以地址继续递增超过16字节边界。
这个例子显示了未定义长度的递增突发。
首先是从地址0x20开始的两个半字传输,半字传输地址增加2。
之后是从地址0x5C开始的三个字传输,字传输地址增加4。
控制信号
除了传输类型和突发类型外,每个传输将具有许多控制信号,这些信号提供有关传输的附加信息。这些控制信号与地址总线具有完全相同的时序。然而,它们必须在一连串的转移中保持不变。
传输方向
当HWRITE为高电平时,这个信号表示写传输,主机将在写数据总线HWDATA[31:0]上传入数据。当低电平发生读传输时,从机必须在读数据总线HRDATA[31:0]上生成数据。
传输大小
HSIZE[2:0] | 大小 | 描述 |
---|---|---|
000 | 8bits | 单字节 |
001 | 16bits | 半字 |
010 | 32bits | 字 |
011 | 64bits | - |
100 | 128bits | 4-word line |
101 | 256bits | 8-word line |
110 | 512bits | - |
111 | 1024bits | - |
保护控制
保护控制信号HPROT[3:0]提供关于总线访问的额外信息,主要用于任何希望实现某种级别保护的模块。
信号指示传输是否为:
- 操作码获取或数据访问
- 特权模式访问或用户模式访问。
对于具有存储器管理单元的总线主控器,这些信号还指示当前访问是可缓存的还是可缓冲的。
HPROT[3]cacheable | HPROT [2] bufferable | HPROT[1] privileged | HPROT[0] data/opcode | Description |
---|---|---|---|---|
- | - | - | 0 | 操作码获取 |
- | - | - | 1 | 数据访问 |
- | - | 0 | - | 用户访问 |
- | - | 1 | - | 访问权限 |
- | 0 | - | - | 不可缓冲 |
- | 1 | - | - | 可缓冲 |
0 | - | - | - | 不可缓存 |
1 | - | - | - | 可缓存 |
但是并非所有的总线主站都能够生成准确的保护信息,因此建议从站除非必要,否则不要使用HPROT信号。
地址译码
中央地址解码器用于为总线上的每个从站提供一个选择信号HSELx。选择信号是对高阶地址信号的组合解码,为了避免复杂的解码逻辑,保证高速运行,会采用简单的地址解码方案。
当HREADY为高时,slave必须只采样地址和控制信号以及HSELx,这表明当前传输正在完成。在某些情况下,当HREADY为低时,HSELx可能会被置位,但是在当前传输完成时,所选的从设备已经更改。
可以分配给单个从设备的最小地址空间是1kB。所有总线主机都被设计成不会在1kB边界上执行增量传输,从而确保突发永远不会跨越地址解码边界。
在系统设计不包含完全填充的内存映射的情况下,应该实现一个额外的默认从服务器,以便在访问任何不存在的地址位置时提供响应。如果尝试向不存在的地址位置进行NONSEQUENTIAL或SEQUENTIAL传输,则默认从设备应该提供一个ERROR响应。IDLE或BUSY传输到不存在的位置应该导致零等待状态OKAY响应。通常,默认的从属功能将作为中央地址解码器的一部分实现。
从设备传输响应
在主设备启动传输后,从设备将确定传输应如何进行。AHB规范中没有规定总线主机在传输开始后取消传输。
无论何时访问从设备,它都必须提供一个指示传输状态的响应。HREADY信号用于扩展传输,这与提供传输状态的响应信号HRESP[1:0]相结合。
从设备可以通过多种方式完成传输。它可以:
- 立即完成传输
- 插入一个或多个等待状态以留出时间完成传输
- 发出错误信号以指示传输失败
- 延迟传输完成,但允许主设备和从设备退出总线,使其可用于其他传输。(个人感觉奇怪的是这整体是个什么流程)
传输完成
HREADY信号用于延长AHB传输的数据部分。当为LOW时,HREADY信号指示传输将被延长,而当为HIGH时,指示传输可以完成。
每个从机必须具有预定的最大等待状态数,以便计算访问总线的延迟。一般从设备插入的等待状态不超过16个,以防止任何单个访问在大量时钟周期内锁定总线。
传输响应
从设备将使用HREADY信号将适当数量的等待状态插入到传输中,然后传输将以HREADY HIGH和一个ok响应完成,这表明传输成功完成。(都是一些以前提到的话了)
从设备将使用HREADY信号在传输中插入适当数量的等待状态,然后传输将以HREADY HIGH和OKAY响应完成,这表示传输成功完成。
ERROR响应由从设备用来指示与相关传输有关的某种形式的错误情况。通常,这用于保护错误,例如试图写入只读内存位置。
SPLIT和RETRY响应组合允许从设备延迟完成传输,但释放总线供其他主设备使用。这些响应组合通常只有具有高访问延迟的从设备才需要,并且可以利用这些响应代码来确保不会阻止其他主设备长时间访问总线。
HRESP[1:0]的编码、传递响应信号以及各响应的描述如表所示。
HRESP[1:0] | 响应 | 描述 |
---|---|---|
00 | OKAY | 当HREADY信号为高电平时,表示传输已成功完成。OKAY响应还用于在给出其他三种响应之前,在HREADY为低电平时,插入的任何额外周期中使用。 |
01 | ERROR | 此响应显示发生错误。应向总线主机发出错误情况的信号,以便其知道传输不成功。 |
10 | RETRY | 响应显示传输尚未完成,因此总线主机应重试传输。主机应继续重试传输,直到传输完成。需要两个周期的RETRY响应。 |
11 | SPLIT | 传输尚未成功完成。总线主机下次被授予访问总线的权限时,必须重试传输。当传输完成时,从设备将代表主设备请求访问总线。需要两个周期的SPLIT响应。 |
当从设备需要在决定给出什么响应之前插入一些等待状态时,它必须将响应驱动到OKAY。
两周期响应
总之说的是具体使用除了OKAY以外的两周期响应的方法。
在单个周期内只能给出一个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指示OKAY),然后从设备以两个周期的ERROR响应结束传输。
ERROR响应
如果从设备提供了一个ERROR响应,那么主服务器可以选择取消突发中剩余的传输。然而,这并不是一个严格的要求,master在burst中继续剩余的传输也是可以接受的。
SPLIT和RETRY响应
SPLIT和RETRY响应为从属设备提供了一种机制,当它们无法立即提供传输数据时,可以释放总线。这两种机制都允许在总线上完成传输,因此允许更高优先级的主机访问总线。
SPLIT和RETRY之间的区别在于仲裁器在发生SPLIT或RETRY后分配总线的方式:
·RETRY,仲裁器将继续使用正常优先级方案,因此只有具有更高优先级的主机才能访问总线。
·SPLIT传输,仲裁器将调整优先级方案,以便任何其他请求总线的主机都可以访问,即使优先级较低。
为了完成SPLIT传输,必须在从设备具有可用数据时通知仲裁器。SPLIT传输在从设备和仲裁器中都需要额外的复杂性,但其优点是它完全释放了总线供其他主设备使用,而RETRY情况只允许更高优先级的主设备进入总线。
总线主机应该以相同的方式处理SPLIT和RETRY。它应该继续请求总线并尝试传输,直到它成功完成或被ERROR响应终止。
数据总线
最小数据总线宽度被指定为32位,但总线宽度可以增加。