AHB与APB总线你需要知道的事儿
ARM出了好几版本总线。在FPGA中一般都会用到教新的AXI总线。而在大量嵌入式SOC里面,AHB和APB才是最常用的总线。这篇文章简单介绍一下这两个东西。文章只介绍最基本的概念,细节需要看AMBA Specification Rev2.0.
一、AHB和APB到底是什么
AHB(Advanced High-performance Bus), 高速总线,用来接高速外设的。APB (Advanced Peripheral Bus) 低速总线,用来接低速外设的。
一般的接法如上。高速的接在AHB上,低速的接在APB上。中间有一个AHB2APB的桥。你可以理解这个桥也是一个告诉的AHB Slave。
二、AHB总线里有什么
如上图所示。其实AHB总线非常简单。里面一个仲裁器(Arbiter)用于仲裁多个主设备同时访问总线的情况,三个多路选择器,用于选通master与slave之间的data和address。
你有没有发现,ADDR没有分读和写的ADDR?是的。。。AHB不是全双工的,读写是不可以同时进行的。所以性能上比AXI一般来讲是要弱的。
三、AHB里有什么关键信号
作为通用总线。。。信号显然是比较多的。以典型的master为例。介绍一下各个信号。
输入
HGRANTx, 总线授权信号。这个为高说明你可以用总线了。
HREADY,Slave给的,表示这次传输完成了。可以搞下次了。
HRESP,Slave给的一些额外的信息,比如成功,失败等等。
输出
BUSREQ, 总线申请。你不申请总线是不会把权限主动给你的。
LOCK, 直接锁定总线。这个值为高以后不再低下来仲裁器就不会再把总线让给别人了。属于霸道信号。
HTRANS,用于标识传输种类的。NONSEQUENTIAL, SEQUENTIAL, IDLE, BUSY四种状态。下文详细解释。
HWRITE,标识数据方向的。1为写,0为读
HSIZE, 标识传输位宽。。。8bit, 16bit,32bt... 这个就比较神奇了。
HBURST,burst长度。标志一次连续传输要穿多少个数。
对于slave来讲。
新的信号主要是HSELx, 标识当前总线在访问这个slave。
四、AHB传输过程是怎样的
AHB可以实现各种奇奇怪怪的传输。自出举一个最典型的例子。
假设总线已经申请到了。这时候就要把TRANS,ADDR,BURST放总线上。然后一个周期以后把DATA放总线上。所以你可以看大量。DATA比ADDR是慢一个周期的。如果TRANS为BUSY,则需要把ADDR保留一个周期(0x24),最终把数据传输完成。如果salve的ready没有变高,那么master还要等等salve ready才算数据接收正确(例如0x28)那个地方的情况。
整个传输过程还是比较简单的。。。你可以理解为。给个地址,一周期后给个数据。就这么传。
五、关于AHB的常见问题
- HSIZE是干啥用的
HSIZE代表的是一次传输的大小。8bit,16bit,32bi6,。。1024bit。为啥有这个值呢?因为传输的数据位宽和总线位宽可以不一样。例如总线位宽比较低,而你需要一个高带宽slave。那么这样搞。
通过传输两个数拼成一个数。这个时候就需要HSIZE告诉总线,一个数64bit。
同理,如果总线比较宽。总线64bit的,slave 32bit的。那么可以这样,总线传过来一个数,分成2个。
需要注意的是从设备位宽可以高于也可以低于总线,但是主设备位宽不允许高于总线
2. 既然每次都要传输地址,那么Burst有什么用?
Burst其实在AHB中某些情况。。。真的没啥用。主要是提供一些额外的信息,也就是说提前告诉slave和仲裁器,我要传多少数,你好有个准备。你不告诉这个东西数据照样传。当然,对于有些slave, 提前知道了burst信息有助于提高效率。例如提前腾出burst大小的buffer.
3. AHB Lite是个啥东西?
简单理解,阉割掉仲裁器,总线只允许一个主设备,这样就是ahb lite.
=======================================================
六、APB总线
对于APB来说,就简单多了。毕竟是低速的东西。没那么多幺蛾子。主要是用来读写寄存器的。
如图所示,一个典型的慢速APB Slave需要的接口。
PSEL, 总线选通。PENABLE, 标志可以访问。这两信号都为高才读数据。其他信号没什么东西。典型的状态机就是这样的。
例如往外设写个值。
AHB如何访问APB的。此处举个连续写的例子。
有个APB只能单数据的读,所以两个周期出一个数。
总结
至此,AHB APB就介绍的差不多了。你还需要一把沙子和一个CPU核心就能攒出一个嵌入式SOC了。