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总线你需要知道的事儿

一般的接法如上。高速的接在AHB上,低速的接在APB上。中间有一个AHB2APB的桥。你可以理解这个桥也是一个告诉的AHB Slave。

二、AHB总线里有什么

AHB与APB总线你需要知道的事儿

如上图所示。其实AHB总线非常简单。里面一个仲裁器(Arbiter)用于仲裁多个主设备同时访问总线的情况,三个多路选择器,用于选通master与slave之间的data和address。

你有没有发现,ADDR没有分读和写的ADDR?是的。。。AHB不是全双工的,读写是不可以同时进行的。所以性能上比AXI一般来讲是要弱的。

三、AHB里有什么关键信号

作为通用总线。。。信号显然是比较多的。以典型的master为例。介绍一下各个信号。

AHB与APB总线你需要知道的事儿

输入

HGRANTx, 总线授权信号。这个为高说明你可以用总线了。

HREADY,Slave给的,表示这次传输完成了。可以搞下次了。

HRESP,Slave给的一些额外的信息,比如成功,失败等等。

输出

BUSREQ, 总线申请。你不申请总线是不会把权限主动给你的。

LOCK, 直接锁定总线。这个值为高以后不再低下来仲裁器就不会再把总线让给别人了。属于霸道信号。

HTRANS,用于标识传输种类的。NONSEQUENTIAL, SEQUENTIAL, IDLE, BUSY四种状态。下文详细解释。

HWRITE,标识数据方向的。1为写,0为读

HSIZE, 标识传输位宽。。。8bit, 16bit,32bt... 这个就比较神奇了。

HBURST,burst长度。标志一次连续传输要穿多少个数。

对于slave来讲。

AHB与APB总线你需要知道的事儿

新的信号主要是HSELx, 标识当前总线在访问这个slave。

四、AHB传输过程是怎样的

AHB可以实现各种奇奇怪怪的传输。自出举一个最典型的例子。

AHB与APB总线你需要知道的事儿

假设总线已经申请到了。这时候就要把TRANS,ADDR,BURST放总线上。然后一个周期以后把DATA放总线上。所以你可以看大量。DATA比ADDR是慢一个周期的。如果TRANS为BUSY,则需要把ADDR保留一个周期(0x24),最终把数据传输完成。如果salve的ready没有变高,那么master还要等等salve ready才算数据接收正确(例如0x28)那个地方的情况。

整个传输过程还是比较简单的。。。你可以理解为。给个地址,一周期后给个数据。就这么传。

五、关于AHB的常见问题

  1. HSIZE是干啥用的

HSIZE代表的是一次传输的大小。8bit,16bit,32bi6,。。1024bit。为啥有这个值呢?因为传输的数据位宽和总线位宽可以不一样。例如总线位宽比较低,而你需要一个高带宽slave。那么这样搞。

AHB与APB总线你需要知道的事儿

通过传输两个数拼成一个数。这个时候就需要HSIZE告诉总线,一个数64bit。

同理,如果总线比较宽。总线64bit的,slave 32bit的。那么可以这样,总线传过来一个数,分成2个。

AHB与APB总线你需要知道的事儿

需要注意的是从设备位宽可以高于也可以低于总线,但是主设备位宽不允许高于总线

2. 既然每次都要传输地址,那么Burst有什么用?

Burst其实在AHB中某些情况。。。真的没啥用。主要是提供一些额外的信息,也就是说提前告诉slave和仲裁器,我要传多少数,你好有个准备。你不告诉这个东西数据照样传。当然,对于有些slave, 提前知道了burst信息有助于提高效率。例如提前腾出burst大小的buffer.

3. AHB Lite是个啥东西?

简单理解,阉割掉仲裁器,总线只允许一个主设备,这样就是ahb lite.

=======================================================

六、APB总线

对于APB来说,就简单多了。毕竟是低速的东西。没那么多幺蛾子。主要是用来读写寄存器的。

AHB与APB总线你需要知道的事儿

如图所示,一个典型的慢速APB Slave需要的接口。

PSEL, 总线选通。PENABLE, 标志可以访问。这两信号都为高才读数据。其他信号没什么东西。典型的状态机就是这样的。

AHB与APB总线你需要知道的事儿

例如往外设写个值。

AHB与APB总线你需要知道的事儿

AHB如何访问APB的。此处举个连续写的例子。

AHB与APB总线你需要知道的事儿

有个APB只能单数据的读,所以两个周期出一个数。

总结

至此,AHB APB就介绍的差不多了。你还需要一把沙子和一个CPU核心就能攒出一个嵌入式SOC了。