目录
HTRANS、HSIZE和HBURST共同决定下一次数据传输的地址。
HTRANS[1:0]定义传输类型
HTRANS[1:0] | 主机传输状态 | 描述 |
---|---|---|
00 | IDLE空闲 | 表示没有进行数据传输,默认状态。 主设备虽然可能已经占用了总线,但是还没有开始传输数据。 从设备需要返回OKAY响应 |
01 | BUSY忙 | 主设备正在进行传输,因此没法立即开始新一轮传输。 (可以理解为主设备申请延时)从设备需要返回OKAY响应 |
10 | NONSEQ非连续 | 表示单次传输,或者是突发传输(Burst Transfer)中的第一拍数据。 在非连序模式下,每次传输都是独立的,后续的传输并不依赖于前一次传输的地址。 |
11 | SEQ连续 | 突发中剩下的传输是连续传输。控制信息会与前一次传输相同,但地址等于前一次传输地址加上HSIZE对应的字节数 |
Note:BUSY传输类型让主设备有能力在突发传输的中间暂停,插入等待周期,即使它仍占有总线并且计划继续当前的突发传输。在BUSY状态下,尽管当前传输暂停,但主设备仍需保持下一次传输所需的正确地址和控制信号,以便在条件允许时能够无缝继续数据传输。
- 突发传输的第一拍传输类型应该是NONSEQ。
- 主设备没办法立刻开始突发的第二拍传输,因此主设备使用BUSY来延迟。
- 主开始进行突发的第三拍传输,但这一次从设备没准备好,通过拉低HREADY来插入单个等待状态。
HSIZE[2:0]定义传输大小
最小是1字节,最大是1024bit。
HBURST[2:0]定义突发类型/传输拍数
HBURST信号是一个重要的控制信号,用于指示数据传输是否为突发传输(Burst Transfer)以及如果是,它指定的是哪种类型的突发模式。
突发传输是一种高效的传输模式,允许连续的数据传输而无需在每次传输之间重新设置地址和控制信号,从而显著提高数据吞吐量和总线效率。
incrementing(递增):每次传输的地址会在上一次地址基础上递增。
wraping(回环):如果传输的起始地址没有与突发传输中总字节数对齐,那么地址在到达边界后会自动循环回到起始地址。
“对齐”是指起始地址应该正好是突发传输中传输数据总字节的整数倍
例如,一个包含四个拍(beat)的回环突发,每个拍是一个字(4Byte)访问,将会在16字节的边界处循环。因此,如果传输的起始地址是0x34,那么它将包含到地址0x34、0x38、0x3C和再次回到0x30的四次传输。(起始地址不是数据大小16的整数倍)
HBURST[2:0] | 突发传输类型 | 描述 | 拍数 |
---|---|---|---|
000 | SINGLE | 单次传输 | 1beat |
001 | INCR | 不定长的递增突发 | |
010 | WRAP4 | 4拍的回环突发 | 4beat |
011 | INCR4 | 4拍的递增突发 | 4beat |
100 | WRAP8 | 8拍的回环突发 | 8beat |
101 | INCR8 | 8拍的递增突发 | 8beat |
110 | WRAP16 | 16拍的回环突发 | 16beat |
111 | INCR16 | 16拍的递增突发 | 16beat |
Note:选择INCR时,每一拍都可以改变HSIZE的值;如果选择的是WRAP4~INCR16,那只有在突发结束后才能改变HSIZE的值。
传输数据总量(字节数)计算
一次突发中传输的数据总量=拍数(HBURST)*每拍的数据大小(HSIZE)。
Wrap不对齐突发传输
在AMBA AHB协议中,WRAP突发模式允许数据访问在达到预定边界时循环回到起始地址,这样可以有效地访问固定大小的数据块,即使这些数据块跨越了地址空间的边界。WRAP边界通常是基于突发传输的总字节数(burst size)来确定的,这个总字节数等于数据大小(size)和突发长度(number of beats)的乘积。
WRAP 边界的计算方法
WRAP边界通常等于突发传输的总字节数。如果突发传输的起始地址(start address)是对齐的,那么WRAP边界就是从该地址开始的总字节数。如果起始地址没有对齐,则边界会有所不同,需要根据突发传输的总字节数进行调整。
不对齐的WRAP突发传输例子
注意!这里对齐的概念和AXI协议中的不一样!当讨论的是AXI协议中的对齐概念时,对AHB来说,它就不支持对齐传输。
假设我们有一个突发传输,其数据大小为32位(即4字节),突发长度为8个beat,意味着整个突发传输的总字节数是32位 * 8 = 256位 = 32字节。
情况1:起始地址对齐
如果起始地址是32字节的倍数(例如,0x0000_0000),那么WRAP边界也是32字节,即在达到0x0000_001F之后,地址将循环回到0x0000_0000。
情况2:起始地址不对齐
现在假设起始地址是0x0000_0003(即3字节偏移),由于数据大小为4字节,这意味着起始地址没有与突发传输的总字节数对齐。
在这种情况下,突发传输的第一个beat将从0x0000_0003开始,然后依次增加4字节直到达到边界。由于起始地址是3字节偏移,所以第一个完整的32字节块将在0x0000_0004开始,最后一个地址是0x0000_0023。然而,由于我们的起始地址是0x0000_0003,这意味着突发传输的最后部分将跨越边界,回到0x0000_0000。
具体计算如下:
- 第1 beat: 地址=0x0000_0003
- 第2 beat: 地址=0x0000_0007
- …
- 第8 beat: 正常情况下应该是0x0000_0023,但由于是WRAP模式,地址会循环回到0x0000_0003(因为从0x0000_0004开始到0x0000_0023是32字节,即WRAP边界)
因此,在这个例子中,WRAP边界实际上是在从0x0000_0004到0x0000_0023的32字节范围内,但由于起始地址是0x0000_0003,突发传输会在达到0x0000_0023后循环回到0x0000_0003,形成一个循环的访问模式。
1K边界
“1K边界”是指一种地址对齐和传输限制,它规定了突发传输(Burst Transfers)不能跨越1KB(1024字节)的地址边界/低10bit的地址。这一限制主要应用于AHB总线的突发传输模式中,以防止数据访问跨越从设备(slave)的地址空间边界,从而避免数据错误和冲突。
在AHB中,从设备通常被配置有特定的地址范围,通常是1KB对齐的,这意味着从设备的地址空间从某个1KB的边界开始,持续1KB,然后是下一个从设备的地址空间,以此类推。这种设计简化了地址解码逻辑,使得多个从设备可以在同一总线上并行存在,而不会互相干扰。
当主设备(master)想要进行突发传输时,如果这次传输会跨越1KB的边界,那么它必须被分割成两部分或更多部分,以确保每次突发传输都在同一个1KB的地址范围内。例如,如果一个突发传输开始于地址0x3F00,那么在达到地址0x3FFF之后,突发传输必须停止,随后从0x4000地址重新开始,以确保不跨越1KB的边界。
为了遵守1KB边界的限制,AHB总线协议要求主设备在设计时考虑这一约束,确保在必要的时候能够将大的突发传输分解为符合边界限制的小突发传输。