玩命加载中 . . .

AHB协议学习笔记


AHB组成部分

  • AHB主设备(master)
    • 发起一次读写操作
    • 某一时刻只允许一个master使用总线
  • AHB从设备(slave)
    • 响应一次读写操作
    • 通过地址映射来选择使用哪个slave
  • AHB仲裁器(arbiter)
    • 允许某一个主设备控制总线
    • 在AMBA协议中没有定义仲裁算法
  • AHB译码器(decoder)
    • 通过地址译码来决定选择哪个slave

AHB总线结构图

AHB信号

NameSourceToDesciption
HCLKclock Source各个module总线时钟
HRESETnreset controller各个module总线复位
HADDR[31:0]masterdecoder/mux to slave/arbiter32位系统地址总线
HTRANS[1:0]mastermux to slave当前传输类型: IDLE(00),BUSY(01),NONSEQ(10),SEQ(11)
HWRITEmastermux to slave0:读, 1:写
HSIZE[2:0]mastermux to slave指示当前传输的大小: 000(8bit),001(16bit),010(32bit),011(64bit)…
HBURST[2:0]mastermux to slave/arbiterburst类型: single,incr,wrap
HPROT[3:0]mastermux to slave保护机制,需要slave带有保护功能
HWDATE[31:0]mastermux to slave写数据总线
HBUSREQxmasterarbiter总线接入请求
HLOCKxmasterarbitermaster requires locked access to the bus(no other master should be granted the bus until this signal is LOW)
HRDATE[31:0]slavemux to master/arbiter读数据总线
HREADYslavemux to master/arbiterHREADY拉高表示一次传输完成,HREADY为低电平延长传输周期
HRESP[1:0]slavemux to master/arbiter传输状态: OKAY, ERROR, RETRY, SPLIT
HSPLITx[15:0]slavearbiter告诉arbiter哪个master允许重新尝试一次split传输
HSELxdecoderslaveslave片选信号
HGRANTxarbitermasterThis signal indicates that bus master x is currently the highest priority master. A master gets access to the bus when both HREADY and HGRANTx are HIGH
HMASTER[3:0]arbiter具有split功能的slave指出哪个master正在进行传输,提供进行split的信息
HMASTLOCKarbiter具有split功能的slave指出当前master正在进行一次锁定传输

基本传输

AHB传输有两个阶段:

  • Address phase: 只有一个有效周期
  • Data phase: 由HBURST信号决定需要几个有效周期

流水线传送:先是address phase,再是data phase。下一次address phase可以与上一次data phase在同一周期。

无等待周期的简单传输

HCLKHADDR[31:0]AControlControlHWDATA[31:0]Data(A)HREADYHRDATA[31:0]Data(A)Address phaseData phase

需要等待两个周期的简单传输

slave通过拉低hready信号延长传输周期(协议规定最大不能超过16个周期),注意

  • 对于写传输,master在延长周期内必须保持HWDATA数据稳定
  • 对于读传输,slave在延长周期不需要提供有效的HRDATA
HCLKHADDR[31:0]AControlControlHWDATA[31:0]Data(A)HREADYHRDATA[31:0]Data(A)Address phaseData phase

Pipeline传输

HCLKHADDR[31:0]ABCControlControl(A)Control(B)Control(C)HWDATA[31:0]Data(A)Data(B)Data(C)HREADYHRDATA[31:0]Data(A)Data(B)Data(C)

burst传输

传输类型

HTRANS[1:0]TypeDescription
00IDLEmaster占用总线,但没有进行传输
01BUSYmaster占用总线,但在burst传输过程中还没有准备好下一次传输,地址和控制信息必须反映下一次传输
10NONSEQ表明一次单个数据的传输或者一次burst传输的第一个数据,地址和控制信号与上一次传输无关
11SEQ表明burst传输接下来的数据,地址和上一次传输的地址是相关的,控制信息与上一次传输是相同的

burst类型

HBURST[2:0]TypeDesciption
000SINGLE单次传输
001INCR未定义长度incrementing传输
010WRAP44-beat wraping burst
011INCR44-beat incrementing burst
100WRAP88-beat wraping burst
101INCR88-beat incrementing burst
110WRAP1616-beat wraping burst
111INCR1616-beat incrementing burst

未定义长度INCR传输

  • INCR传输HADDR累加值与HSIZE有关,每次加2HSIZE
  • Burst传输不能跨越1K边界,即到达1K边界需要用NONSEQ发起一次新的传输

❓思考:为什么burst传输不能跨越1K边界?
ARM的回答:The 1KB restriction you refer to is not a restriction on maximum slave size but a constraint within AHB that says that a burst must not cross a 1KB boundary. The limit is designed to prevent bursts crossing from one device to another and to give a reasonable trade-off between burst size and efficiency. In practise, this means that a master must ALWAYS break a burst that would otherwise cross the 1KB boundary and restart it with a non-sequential transfer.

图4.3.1 未定义长度INCR传输HCLKHTRANS[1:0]NONSEQSEQNONSEQSEQSEQHADDR[31:0]0x200x220x5C0x600x64HBURST[2:0]INCRINCRHSIZE[2:0]001010HWDATA[31:0]Data(0x20)Data(0x22)Data(0x5C)Data(0x60)Data(0x64)HREADYHRDATA[31:0]Data(0x20)Data(0x22)Data(0x5C)Data(0x60)Data(0x64)
图4.3.2 未定义长度INCR跨1K边界HCLKHTRANS[1:0]NONSEQSEQSEQNONSEQSEQSEQHADDR[31:0]0x3F40x3F80x3FC0x4000x4040x408HBURST[2:0]INCRHSIZE[2:0]010HWDATA[31:0]Data(0x3F4)Data(0x3F8)Data(0x3FC)Data(0x400)Data(0x404)Data(0x408)HREADYHRDATA[31:0]Data(0x3F4)Data(0x3F8)Data(0x3FC)Data(0x400)Data(0x404)Data(0x408)

WRAP传输

❓思考:如何确定WRAP边界?
wrap的边界与HSIZE和HBURST都有关系,对于WRAP4来说,HADDR[HSIZE+1:HSIZE]==2’b11就是边界;对于WRAP8来说,HADDR[HSIZE+2:HSIZE]==2’b111就是边界,同理适用于WRAP16。
假如:HSIZE=3’b010时,HADDR起始地址为0x48
当HBURST为WRAP4时,HADDR依次为0x48 -> 0x4C -> 0x40 -> 0x44(对应的HADDR[3:2]依次为2’b10 -> 2’b11 -> 2’b00 -> 2’b01)
当HBURST为WRAP8时,HADDR依次为0x48 -> 0x4C -> 0x50 -> 0x54 -> 0x58 -> 0x5C -> 0x40 -> 0x44(对应的HADDR[4:2]依次为3’b010 -> 3’b011 -> 3’b100 -> 3’b101 -> 3’b110 -> 3’b111 -> 3’b000 -> 3’b001)

图4.4.1 WRAP4传输HCLKHTRANS[1:0]NONSEQSEQSEQSEQHADDR[31:0]0x480x4C0x400x44HBURST[2:0]WRAP4HSIZE[2:0]010HWDATA[31:0]Data(0x48)Data(0x4C)Data(0x40)Data(0x44)HREADYHRDATA[31:0]Data(0x48)Data(0x4C)Data(0x40)Data(0x44)

总结

  • slave短时间内无法响应:将HREADY拉低
  • slave长时间无法响应:插入SPIT/RETRY
  • master不能传输,插入BUSY
  • 总线上如果只有一个master,可以使用AHB lite协议,即没有arbiter,不支持retry和split响应
  • AHB中hready的含义
    • 对于slave来说,进来的hready_i代表的是bus上的状态低就表示bus被人(可能是他自己)使用着,hready_o代表它自身的状态,低代表它要占用bus
    • 对于arbiter来说,从slave进来的hready_i代表各个slave占用bus的状态,返回给slave的hready是所有的hready_i做and运算之后的结果,同时这个也返回给master
    • 对于master来说,hready_i拉低代表bus忙,不能使用

本文作者: 董续胜

本文链接: https://dxsm.github.io/p/ahb-protocal.html

版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0许可协议。转载请注明出处!


 评论