关于APB协议中PSEL和PENABLE的一点疑问

发布时间 2023-08-25 15:13:36作者: 注意看

今天在想一个模块的端口的时候突然联想到APB协议,然后我产生了一个疑问:在我看来PSEL有点类似于握手信号中的vld信号,那么PSEL和PREADY就可以完成握手,为什么还需要PENABLE信号呢?

首先回顾一下APB协议,以写操作为例,一个典型的时序图如下所示

image

APB协议没有流水线,数据传输分为IDLE,SETUP和ACCESS三个阶段,状态转换图如下

image

IDLE状态不传输数据;开始传输数据时先进入SETUP状态,此状态下master提供地址和数据,同时PSEL变为1;SETUP状态只会维持一个周期,下一个周期将进入ACCESS状态,此状态下PENABLE变为1同时PADDR,PWDATA和PSEL继续保持为1,等待slave的响应,slave接收到数据之后将PREADY置为1,代表完成数据的传输。如果还需要继续传输数据则进入SETUP状态,否则进入IDLE状态。

从波形上来看只用PSEL和PREADY就可以完成握手,为什么还需要PENABLE信号呢?在网络上搜索了一下,主要有以下几个说法:

  1. 历史遗留
    这个博客说其实只用PSEL也能完成传输,之所以又加了PENABLE是历史遗留,优化时序的原因。

  2. 优化时序,与PSEL功能不同
    这个说法来源于EETOP的这个帖子。意思是PSEL是用于译码确定master选择的是那个slave的,enbale是用来指示数据开始传输的,这样设置还可以优化时序。

两个说法里感觉第二个靠谱一些,但是我没想清楚为什么这样设置有利于总线的时序优化。