AHB总线笔记(一)
系统芯片中各个模块之间的连接通讯就通过总线,总线就作为子系统之间共享的通信链路。总线可以理解为数据传输的协议,大家都按照这种协议(AHB、APB、AXI)来传数据,这样各个模块之间就不会出错,尤其是很多时候别人买你的IP,你要保证人家买过去能用起来,那就需要一个规范来统一标准,我们称之为总线。
总线的优点就是成本低,方便使用。缺点也很明显,就是会造成性能瓶颈,也正是因为这个所以总线协议一直在更新,到现在的AXI4,读写数据通道分开,增加了数据的带宽。
AMBA全称Advanced Microcontroller Bus Architecture,即片上总线协议标准 。AMBA协议是与工艺无关的,没有电气特性,而是一种协议。总共定义了三种总线:
AHB(Advanced High-performance Bus)
ASB(Advanced System Bus)用的很少
APB(Advanced Peripheral Bus)
AMBA发展历史:
AMBA1.0:ASB和APB
AMBA2.0: AHB、ASB和APB
AMBA3.0:AMBA Advanced eXtensible Interface(AXI)
AMBA4.0:....
AHB特点:
高速总线,高性能。
具有两级流水操作,包括地址周期和数据周期的两级流水线处理。第一个周期读地址,第二个周期写数据,用流水线操作处理,在第二个周期写数据的同时读另一个地址,这样在下一个周期就可以直接写数据,读地址写数据同时进行,这样两周期的操作在流水线开始后每周期都能写一个数据。

AHB可以支持多个总线主设备(最多16个)。
还支持burst传输。就是一次burst传输,一次性传输一串数据,数据长度为burst length。
总线带宽:8、16、32、64、128bits。采用上升沿触发操作。
APB总线特点:
低速总线,低功耗,接口简单。在bridge中锁存地址信号和控制信号。适用于多种外设,采用上升沿触发操作。

AHB组成部分:
AHB主设备(master)
初始化一次读/写操作。某一时刻只允许一个主设备使用总线。比如CPU、DMA、DSP、LCDC等。
AHB从设备(slave)
响应一次读/写操作。通过地址映射来选择使用哪一个从设备。外部存储器控制EMI、APB bridge等。
AHB仲裁器(arbiter)
因为总线上只允许一个master访问,所以在多个master同时申请总线的时候就会引起冲突,这就需要仲裁器来选择给哪个master总线的控制权。但是在AMBA协议中没有定义仲裁算法,所以具体分配可以自己定制,循环优先也好、设定优先级也好,都可以自己定制。
AHB译码器(decoder)
通过地址译码来决定哪一个从设备。它必须知道地址map信息,知道后就会分析总线上的address是什么值,落在那个slave的区域,就会把对应slave的HSEL信号拉高。而作为slave而言,他就看自己的HSEL信号是否被译码器拉高来判断自己是否要工作。
APB组成部分:
AHB2APB Bridge
可以锁存所有地址、数据和信号。进行二级译码来产生APB从设备选择信号,APB有一个地址空间比如0x5000_0000~0x6fff_ffff,其中又分为很多小的APB地址,比如APB1~APB5,当AHB总线上地址落在0x5000_0000~0x6fff_ffff时,代表这块APB被选中,选中之后就会通过二级译码来判断具体是落在那个APB块儿上。
APB总线上的所有其他模块都是APB从设备。
拿一个CPU控制DMA的过程举例说明设备之间的通信:

DMA在系统中主要起一个数据搬运的作用,它可以代替CPU做数据迁移。DMA有自己的地址空间,表格中的Address为偏移地址offset,从DMA基地址开始的一些寄存器保存的一般为状态,称为状态寄存器。CPU控制DMA搬移数据,先从DMA中读DMA的Status,如果读取DMA是ready状态,那么就可以给DMA写的0x00地址给1,然后告诉DMA数据搬运的起始地址(Source address) 和目的地址(Destination address),然后还要告诉DMA搬运数据的个数size。之后就可以把搬运数据的工作交给DMA,然后自己腾出手来去做别的事。CPU控制DMA做数据搬运主要可以分为以下几个步骤:
step1:CPU设置(source address)、(destination address) 、(size)
step2:启动DMA
step3:DMA把数据从memory1传输到memory2
step4:DMA向CPU发起中断请求
step5:CPU检查DMA的状态
AMBA总线的互连

Arbiter控制mux选择哪个master有效。选中了master之后,HADDR会被送进Decoder判断选中的是那个slave,然后把对应slave的HSEL信号拉高表示slave工作,接着读入地址和数据信号,这里其他的slave其实也能看到数据和地址信号,但是因为他们的HSEL信号没被拉高,所以不会工作。
master和slave中还有一对常用的master和slave,就是default master和default slave。当没有master在工作的时候,就选择default master来控制总线,这个master可以直接访问总线而不需要两个仲裁周期的时间,他是最常用的master。当没有slave被控制的时候就选择 default slave 来被控制。
AHB信号

这里的信号都是H打头,因为是AHP总线的信号,如果是APB的话,就会是P打头。HRESETn表示低电平有效的复位。HADDR[31:0]是32位系统地址总线。HWDATA[31:0] 写数据总线,从主设备写到从设备。HRDATA[31:0]读数据总线,从从设备读到主设备.
HTRANS是指当前传输的状态,分为IDLE、BUSY、NONSEQ和SEQ。00:IDLE,主设备占据总线,但没进行传输,两次burst中间主设备没准备好的话发IDLE。01:BUSY,主设备占用总线,但是在burst传输过程中还没有准备好进行下一次传输,一次burst传输中间主设备发BUSY。10:NONSEQ,表明一次单个数据的传输,或者一次burst传输的第一个数据,地址和控制信号与上一次传输无关。11:SEQ,表明burst传输接下来的数据,地址和上一次传输的地址是相关的。
HWRITE信号表示读写状态,HWRITE=1时表示写,=0时表示读状态。HSIZE指BUS的宽度当前传输大小,HSIZE=000时 为8bit,HSIZE=001时为16bit,HSIZE=010时为32bit,以此类推。HBURST指传输的burst类型,总共有8个类型:SINGLE、INCR、WRAP[4|8|16]、INCR[4|8|16]。HSELx用来选择slave。HRESP是从设备发给主设备的总线传输状态,有四种状态:ERROR、OKAY、SPLIT和RETRY,RETRY和SPLIT有区别。RETRY不影响被拒绝的master 的优先级,但是如果用SPLIT拒绝了当前的master,arbiter会把当前被拒绝的master优先级降低。HREADY 为高:从设备指出传输结束;为低:从设备需要延长传输周期。
一次无需等待的AHB传输

写操作,HADDR就是写地址,把HWDATA信号写入,如果是读,HADDR就是读地址,采HRDATA信号读出数据。
如果slave没有准备好接受信号,那么传输的数据就会被延长直到HREADY被拉高。但是master不会一直无限等slave,最多等16个周期,slave在HRESP信号里返回RETRY。

但是上面这种传输速度不够快,所以AHB采用的实际上是pipeline结构的数据传输,如下图

这样一次传输一个地址,传输一个数据,那么每来一次传输,都要decode一次,效率很低,提高传输效率的方法就是burst传输,每一次burst传输只需要decode一次,提高数据传输效率。