AMBA APB总线协议
APB总线协议是一种低成本接口,为最低功耗做了优化,并减少接口复杂度。APB不支持pipeline,是一种简单的同步协议,每次传输最少消耗2个时钟周期。
1.接口定义(Signal Descriptions)
| Signal | Source | Width | Description |
| PCLK | Clock | 1 | 时钟信号 |
| PRESETn | System bus reset | 1 | 复位信号 |
| PADDR | Requester | ADDR_WIDTH | 读写地址信号,最高32bit位宽 |
| PSELx | Requester | 1 | 片选信号 |
| PWRITE | Requester | 1 | 方向信号,1:写,0:读 |
| PENABLE | Requester | 1 | 使能信号,声明传输的第二个周期 |
| PWDATA | Requester | DATA_WIDTH | 写数据信号,支持8、16、32bit位宽 |
| PSTRB | Requester | DATA_WIDTH/8 | 总线byte选择信号,高有效 |
| PREADY | Completer | 1 | 表明completer将会完成一次传输 |
| PRDATA | Completer | DATA_WIDTH | 读数据信号,支持8、16、32bit位宽 |
| PSLVERR | Completer | 1 | 错误信号,表明一次传输错误 |
| PPROT | Requester | 3 | 保护等级信号 |
| PNSE | Requester | 1 | 保护等级的扩展信号 |
| PWAKEUP | Requester | 1 | 唤醒信号 |
| PAUSER | Requester | USER_REQ_WIDTH | 用户请求属性,最高128bits |
| PWUSER | Requester | USER_DATA_WIDTH | 用户写数据属性,最高DATA_WIDTH/2 |
| PRUSER | Completer | USER_DATA_WIDTH | 用户读数据属性,最高DATA_WIDTH/2 |
| PBUSER | Completer | USER_RESP_WIDTH | 用户回应属性,最高16bits |
以上信号可以分为以下几类:
首先,以下几类可以完成核心的读写功能:
- 全局信号:PCLK,PRESETn;
- 传输第一周期核心信号:PADDR,PSELx,PWRITE,PWDATA,PRDATA;
- 传输第二周期核心信号:PENABLE,PREADY;
此外,还存在一些读写辅助信号:
- 传输第一周期辅助信号:PSTRB,PPROT,PNST,PWAKEUP
- 传输第二周期辅助信号:PSLVERR
最后,存在一些非必要用户定义信号:
- 用户自定义信号:PAUSER,PWUSER,PRUSER,PBUSER
2.读写时序(Transfer)
1) write transfer with no wait states

T1时刻:requester发起写请求,需要将要写的数据和地址输入到总线,拉高PWRITE指明数据方向,以及通过PSEL选择数据接收方。
T2时刻:requester在transfer的第二个时钟周期开始拉高PENABLE;同时,completer由于检测到PSEL和PWRITE,拉高PREADY信号回应requester的写请求。
T3时刻:completer检测到PENABLE信号为高,完成数据接收,并将PREADY拉低;同时,requester检测到PREADY为高,认定此次write操作已经完成,最终将上述所有信号拉低,完成一次transfer。
2) write transfer with wait states

T1时刻:同上。
T2时刻:requester在transfer的第二个时钟周期开始拉高PENABLE;同时,completer由于检测到PSEL和PWRITE,本应拉高PREADY信号回应requester的写请求,但由于本身未处于IDLE状态,无法完成数据接收,所以继续保持PREADY信号为低,以让requester保持本次transfer等待后续处理。
T3时刻:completer继续保持PREADY为低;同时,requester检测到PREADY为低,等待此次write操作完成,并保持上述信号。
T4时刻:completer进入IDLE状态,拉高PREADY;同时,requester仍检测到PREADY为低,等待此次write操作完成,并保持上述信号。
T5时刻:completer完成数据接收,拉低PREADY;同时,requester终于检测到PREADY为高,认为此次write操作已经完成,对上述信号进行释放。
以下信号需要在PREADY拉低的过程中保持不变:
- Address signal, PADDR
- Direction signal, PWRITE
- Select signal, PSELx
- Enable signal, PENABLE
- Write data signal, PWDATA
- Write strobe signal, PSTRB
- Protection type signal, PPROT
- User request attribute, PAUSER
- User write data attribute, PWUSER
3) read transfer with no wait states

T1时刻:requester发起写请求,需要将要读的地址输入到总线,拉低PWRITE指明数据方向,并通过PSEL选择数据接收方。
T2时刻:requester在transfer的第二个时钟周期开始拉高PENABLE;同时,completer由于检测到PSEL和PWRITE,拉高PREADY信号并将读数据驱动到总线上,回应requester的读请求。
T3时刻:completer检测到PENABLE信号为高,认为此次read操作已经完成,所以将PREADY拉低;同时,requester检测到PREADY为高,同样认定此次read操作已经完成,最终将上述所有信号拉低,完成本次transfer。
4) read transfer with wait states

T1时刻:requester发起写请求,需要将要读的地址输入到总线,拉低PWRITE指明数据方向,并通过PSEL选择数据接收方。
T2时刻:requester在transfer的第二个时钟周期开始拉高PENABLE;同时,completer由于检测到PSEL和PWRITE,但由于此时处于非IDLE状态,所以需要拉低PREADY信号,以阻塞本次操作。
T3时刻:completer由于处于非IDLE状态,需要继续拉低PREADY信号;而completer在检测到PREADY信号为低时,需要保持上述信号不变,继续等待completer处于ready状态。
T4时刻:completer在退出IDLE状态后,拉高PREADY并将读数据驱动到PRDATA;requester则继续等待PREADY信号拉高。
T5时刻:completer检测到PENABLE信号为高,认为此次read操作已经完成,所以将PREADY拉低;同时,requester检测到PREADY为高,同样认定此次read操作已经完成,最终将上述所有信号拉低,完成本次transfer。
以下信号需要在PREADY信号拉低过程中保持不变:
- Address signal, PADDR
- Direction signal, PWRITE
- Select signal, PSEL
- Enable signal, PENABLE
- Protection signal, PPROT
- User signal, PAUSER
3.操作状态(Operating States)

IDLE :transfer的默认状态;
SETUP : 当一个transfer的请求发起时,状态机将从IDEL跳转到SETUP状态。该状态只会维持一个时钟周期,然后跳转到ACCESS状态。在本状态下,将通过拉高对应的PSELx来选择completer,并保持PENABLE为0。
ACCESS:在该状态下,requester将检测PREADY的情况,并拉高PENABLE。如果PREADY为0,则保持在该状态下;如果PREADY为1,则根据是否具有下一笔transfer到来,而选择进入SETUP或者IDLE状态。
- PADDR •
- PPROT •
- PWRITE •
- PWDATA, only for write transactions •
- PSTRB •
- PAUSER •
- PWUSER
4.其它功能
1) write strobe
PSTRB支持写数据总线上的稀疏数据传输。每个PSTRB对应于写数据总线的1个字节。当断言为高时,PSTRB表示写数据总线的相应字节通道包含有效信息。
PSTRB[n] = PWDATA[(8n + 7):(8n)]

PSTRB是一个可选信号,所以并不是所有的requesterer和completer都具有这个信号,以下为该信号的兼容情况:

2) Error Respones
PSLVERR可用于指示APB读写传输上的错误情况,该信号由completer进行驱动,但completer并没有规定必须支持该功能。
PSLVERR仅在APB传输的最后一个周期内有效,即PSEL、PENABLE和PREADY都为高时,同PREADY信号同时拉高。当PSEL、PENABLE或PREADY为低时,PSLVERR被推荐设置为0,但 并没有硬性要求。
当一个write transfer过程中,requester收到一个error,也并不一定表明外围设备的寄存器没有被写入。
当一个read transfer过程中,requester收到一个error,可能仍然会使用总线上的数据,且无法阻止总线上的读数据。


当APB与AXI或AHB接口进行连接时,需要一定映射关系:
APB的PSLVERR,可以连接到AXI的读命令RRESP和写命令BRESP;
APB的PSLVERR,可以连接到AHB的读写命令HRESP;
3)Protection unit support
复杂的系统设计中,需要为系统内的设备和互联提供保护,来防止出现非法的数据传输。而APB总线使用PPROT[2:0],来实现以上保护功能。
| PPROT | Protection | Description | Comments |
| PPROT[0] | Normal or Privileged | Privileged具有访问的更高优先级 |
LOW - Normal HIGH - Privileged |
| PPROT[1] | Secure or Non-secure | 用于区分处理模式 |
LOW - Secure HIGH - Non-secure |
| PPROT[2] | Data or Instruction | 声明该transaction为数据或指令 |
LOW - DATA HIGH - Instruction |
兼容性:
| PPROT | Completer: signal not present | Completer: signal present |
| Requester: signal not present | Compatible |
Not Compatible 保护信号需要连接固定信号 |
| Requester: signal present |
Compatible 保护信号可以被忽略 |
Compatible |
4)User signaling
APB协议的用户在设计过程中,有可能会面临需要一些额外的接口信号,来实现APB总线之外的功能。User signals就是用来解决这些问题,所以这些信号的用途并没有定义。但是在通常上,这些用户接口并不推荐使用,因为不同的组件可能定义不同功能,这就导致了系统兼容性问题。
APB的一些其它功能,可以参考ARM官网的spec。以上如有理解错误,欢迎指正!
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐

所有评论(0)