上一篇文章简单讲解了什么是AMBA总线,简单来说,AMBA总线是一系列协议。定义了适用于不同场景的总线家族。今天我们就来将AMBA总线中最简单的APB总线。
什么是APB协议/总线
APB的全称为Advanced Peripheral Bus。顾名思义,其设计之初的主要目的就是用该协议连接外设。但由于APB总线自发布至今已经过去了20多年了,因此以现在的眼光看,该总线没有什么高级一说,其连接的外设也往往是低速且低功率的外设,如I2C、UART、SPI等,除了连接低速外设之外,APB总线还广泛用于配置各种IP的寄存器(这些IP预留用户控制信号,由软件进行配置,这个时候就可以选择使用APB总线来配置这些寄存器)。
下图为一个典型的AMBA总线的系统架构:其中APB总线是AHB总线的扩展,方便外设连接到系统总线上,其中AHB和APB之间有一个转接桥来进行连接。
此外为了使得APB能够容易的被整合进大部分的设计流程中,APB规定所有的信号必须在时钟的上升沿进行传递。
下面简单介绍一下APB的发展历史,ARM公司于1998年发布了APB2,又于2003年发布了APB3,在2010年又发布了APB4。目前最常见的为APB3或APB4,其主要区别如下:
- APB2:APB总线的基础版本。
- APB3:
- 增加PREADY信号:用于反压master(其在读和写两个场景中含义略有不同,过会讲解)。
- 增加PSLVERR:用于代表传输是否发生错误。
- APB4:
- 增加PPROT保护信号。
- 增加PSTRB代表字节选通。
APB2协议
APB2信号列表
对于AMBA协议,APB的信号都是以P开头,AHB的信号都是以H开头,而AXI的信号都是以A开头。大家自己设计的时候也应该遵循这一规则。这样一看信号名就知道使用的是什么协议。APB2的信号列表如下表所示:
Signal name | Direction | Description |
PCLK | Global | 时钟信号,上升沿同步 |
PRESETn | Global | APB总线复位信号为低有效并且通常将该信号直接连接到系统总线的复位信号 |
PADDR | M-->S | 地址总线,最多可高达32位 |
PSEL | M-->S | 选通信号,当该信号拉高意味着要发起一次传输了 |
PENABLE | M-->S | 使能信号,用于表示一次APB传输的第二个周期(在阻塞情况下为第二个及以上的周期,该信号的存在完全是历史遗留问题,后面详细讲) |
PWRITE | M-->S | 该信号为高标志这次是写传输,反之则为读传输 |
PWDATA | M-->S | 写数据总线,由Master在写周期进行持续性驱动(PWRITE为高),最高可达32位。 |
PRDATA | S-->M | 读数据总线,由Slave在读周期进行持续性驱动(PWRITE为低),最高可达32位。 |
写操作时序
可以看到写操作非常的简单:
- T2->T3这一个周期
- PSEL信号拉高,意味着要发起一次新的传输了。
- PWRITE信号为1,因此此次传输为写操作。
- PWDATA为要传输的数据,PADDR为要写的地址。二者都应该保持不变,直到此次传输结束。
- 而PSEL拉高的第一个时钟周期,PENABLE应该为0。
- T3->T4这一个周期
- PSEL信号继续拉高
- PWRITE、PADDR、PWDATA应该保持不变
- PENABLE信号拉高,用于代表这已经是写传输的第二个周期了
至此一次传输结束。可以看到,APB对每一笔数据的传输,需要花费两个时钟周期。且APB的数据传输不支持流水线操作(即不可以重叠)。因此APB是非常低效的。
理论上写数据完全可以同时给出写地址和写数据,一拍就搞定,为什么APB要大费周章弄成两拍呢?这主要是那个年代的芯片本身的制程工艺以及片上互连线导致的。一个周期可能无法完成从Master向Slave写入数据的整个操作流程。因此采用两拍的方式,第一拍告诉你,我要开始传输啦!(称为setup phase)第二拍才真正的完成数据的传输。(称为access phase)。
如果Master想要马上发起一次新的传输,可以不拉低PSEL让其继续为1,但是必须要将PENABLE拉低。否则Slave侧的判断逻辑就会出现问题!
由于APB向下兼容,这一历史遗留问题一直延续至今。不过好在APB应用的场景本身就是配置寄存器等操作,因此多花一个时钟周期也没什么大不了的。
读操作时序
可以看到读操作非常的简单,跟写几乎一样。这里就不再做详细的解释了。
要特别注意的是,T3以后,也就是进入ENABLE周期后,APB的SLAVE设备必须要将M所需要读取的数据准备好,以便M可以在ENABLE的周期末也就是T4正时钟沿触发时正确的将数据读取。
APB的状态机
APB2的状态机如下所示:
- IDLE:此时为默认状态。PSEL和PENABLE都为0,没有通信请求。
- SETUP:当需要发起传输的时候,会进入该状态,此时PSEL为1,PENABLE为0。PSEL从0到1说明要发起一次传输了,而PENABLE为0表示这是传输的第一个时钟周期。(这个状态也就是setup phase)
- ENABLE:这个状态PENABLE需要拉高,进而完成数据的传输。
这个状态机模型只是便于我们的理解。并且这个状态机模型是针对整个传输过程而言的。对于实际的master或者slave的设计完全可以不用状态机实现。甚至slave都可以用纯粹的组合逻辑来实现,下面会讲到如何实现。