AHB总线的主要特征
- 支持burst传输
- 单时钟边沿触发的操作
- 非三态实现
- 宽的数据总线配置 64,128,256,512和1024bits
总线结构
对于单master的AHB总线来说,主要包含master,decoder,multiplexor以及salves,对于多masters的情况,还需要加入arbiter来进行仲裁
Master interface
Slave interface
Decoder diagram
- 对于decoder来说,因为有多个的slave,所以需要对地址进行译码,选择数据的要去的地址,这是一个纯逻辑的译码电路,方法是通过对地址的高位进行译码,得到HSELx,此时slave对HSELx和地址同时进行采样
- 地址的起始和结束地址应位于1KB范围内,因为不想跨越slave的边界,对应此要求,slave的大小被要求设定大于等于1KB。
- 如果Memory Map不完整的话,则有可能会导致error,所以如果Memory Map不完整,则需要指定默认的salve
Multiplexor diagram
对于MUX来说,因为有多slave情况的存在,所以需要通过mux将响应和读取的数据进行片选,传送到主机
Signal description
Master signal
HCLK 在时钟的上升沿进行采样。
在AHB5中定义了一个特性是Stable_Between_Clock,如果此信号为高,则表明此信号需要保持无毛刺,如果此信号为低,则不需要保持信号无毛刺
HRESETn 低电平有效
- 可以使用异步复位,但是必须同步释放
- 复位信号必须保持足够的时钟周期以保证复位成功
- 在复位过程中,所有的master需要保证地址和控制信号是有效的,并且HTRANS信号处于IDLE的状态
HADDR[31:0] 32-bit的地址总线
HBURST[2:0] 表示burst的类型,如下图所示
-
AHB的transfer必须和地址边界对齐,比如说16bit的数据,需要保证地址的最后一位为0,32bit的数据需要保证地址的最后两位为0
-
fixed length的burst需要使用SEQ的HTRANS类型结束,即WRAP4,INCR4,WRAP8,INCR8,WRAP16,INCR16这几种类型
-
SINGLE burst需要保证接下来是一个IDLE或者NONSEQ的HTRANS类型
-
burst可以被slave传回来的error或者其他master打断,此时可以终止传输,但是不强制
-
关于wrap类型及地址计算方法如下图,图来自网络,我就直接粘过来了(若有侵权,请联系删除)
以下是两个burst传输的例子 -
第一个是一个WRAP4类型的传输,因为总共4个transfer,每个4byte(1个word),所以总的传输大小为4x4=16bytes,起始地址0x38为56,并不能整除16,所以按照原首地址0x38为起始地址进行传输,到了0x40的边界又回到0x30,地址分别为0x38,0x3C,0x30,0x34.
-
第二个是一个INCR4的burst类型的例子,同样的首地址是0x38,因为是INCR4,SIZE是4byte(1word),所以地址分别为0x38,0x3C,0x40,0x44.
HMASTLOCK 锁定访问的标志位 -
一旦进入锁定访问,在读和写操作之间不能有任何其他的操作
-
在锁定访问结束后,推荐加入一个IDLE的HTRANS类型,如下图所示
HPROT[6:0] 在AHB5中此信号扩展到了7位,以下解释的是AHB5中对每一位新的定义 -
HPROT[0] 表示这是一个取指令操作还是一个数据访问操作
-
HPROT[1] 表示这个传输是一个优先级访问还是用户访问
-
HPROT[2] 表示此传输是否是bufferable的
-
HPROT[3] 表示此传输是否是modified的
-
HPROT[4] 表示此传输是否需要在cache中进行寻找
-
HPROT[5] 表示此传输是否建议在cache中allocate
此处的意思是如果出现了write miss,则需要将数据写入存储,但是此时写入存储的方法有两种,一种是non-allocated,如果是non-allocated的,那么此时的数据将会直接写入到存储中,此种情况下,只有读操作才会被cache中缓存。但是如果是allocated的,那么此时需要将数据从存储中加载到cache中,然后采用write-hit的方法对cache进行write,并对此进行标志dirty,这种方法下读操作和写操作都会被缓存。
-
HPROT[6] 表示此区域是否适合其他master共享的
HSIZE[2:0] 每个transfer的大小
传输的数据大小需要小于或者等于数据总线的宽度
HNONSEC 安全传输的特性
此信号如果是高电平则表示是非安全传输,如果是低电平则表示是安全传输
HEXCL 独占传输
- 如果传输成功,slave将会返回EXOKAY
- 传输有以下的限制
- 必须是但数据传输
- 必须是SINGLE或者INCR类型的burst传输
- 不能出现BUSY的HTRANS类型
- 数据需要对齐地址边界
- HPORT信号必须保证独占访问的monitor对此次传输能看见
HMASTER[3:0] master的标识
对于有多个主机的系统,独占访问的monitor会记录此master的标识以及访问的地址
HTRANS[1:0] 表示transfer的类型
分别有IDLE,BUSY,NONSEQ,SEQ四种类型
下图为传输类型示例
HWDATA[31:0] 写地址总线
master仅需要根据transfer的size及length来驱动相应的byte lanes
HWRITE 传输方向,分为写和读
高电平为写,低电平为读
Slave signals
HRDATA[31:0] 读地址总线,宽度可扩展
HREADYOUT 如果为高电平,则意味着此transfer结束了,如果是低电平,则需要延长此transfer
HRESP 表示此burst是否成功,如果成功,则响应OKAY,如果失败,则响应两个周期的ERROR
HEXOKAY 表示独占访问是否成功
Decoder signals
HSELx 对slave进行片选
Multiplexor signals
HRDATA[31:0]
HREADY
HRESP
HEXOKAY
上述信号都是经由MUX进行select得到的
基本传输
基本传输包含两个相位,分别是地址和数据相位,
一般地址只会持续一个周期,除非HREADY拉低,导致不能接着传输,此时将会导致地址信号延长周期
数据可以传输多个周期,使用HREADY信号可以控制数据传输的周期数
数据总线
对于不能数据总线和slave宽度不匹配的情况,有以下解决方法
AHB5中提及到以下一段话
A slave can only accept transfers that are as wide as its natural interface. If a master attempts a transfer that is wider than the slave can support then the slave can use the ERROR transfer response
上面说总线和slave中间的宽度不匹配可以采用响应的方法,但此处又提及error
我对此的理解如下:
这个的重点应该是是tranfer,一个burst中可能有好几个tranfer,byte lane会选用一部分传输,而且要align,拿那个64位总线接到32位slave上的来说,意思就是每个transfer不能超过32位,低于32位的,每次tranfer都可以完整的传到slave中。但是大于32位的,会被mux给切开,导致单个tranfer不完整,这时候slave就会报错,mux的作用就是在每个cycle选择有数据的那32bit部分(因为每次只有32bit,而且align,不会超过一半),其中slave会报错的根据应该是根据master产生的HSIZE的值。
原子操作
- 单拷贝原子性大小定义了传输保证原子更新的数据字节数