主要是对APB总线进行介绍
《IHI0024D_amba_apb5_protocol_spec》
APB总线协议
AHB APB 简单通讯架构 代码 APB_Bridge
APB桥时序
设计AHB2APB同步桥
APB协议是一种低成本的接口,优化了功耗和接口复杂度。APB接口不是流水线操作,它是一个简单的同步协议,至少需要两个周期才能完成读或写,控制逻辑简单。
通信为一主多从模式,其中Slave 主要为在低带宽、低速、低功率的外设,例如UART、I2C,可针对外围设备作功率消耗及复杂接口的最佳化。
而Master经常是与高级高性能总线(Advanced High-performance Bus, AHB)构成的AHB2APB桥接器,而AHB又可连接多个aph master,如下图所示
也可将多个APB外设连接到高级可拓展接口(Advanced eXtensible Interface, AXI)内存系统。
APB常见接口如下
Source | Signal | Width(bits) | Description |
---|---|---|---|
CLOCK | PCLK | 1 | 时钟 |
System bus reset | PRESETn | 1 | 低电平复位 |
Source | Signal | Width(bits) | Description |
---|---|---|---|
Master | PADDR | ADDR_WIDTH | 最大32bit。允许非对齐地址,但结果不可预知 |
PSELx | 1 | 拉高表示标号x的Completer被选中,要与其进行数据传输 | |
PENABLE | 1 | 表明进入APB的ENABLE状态,开始数据传输 | |
PWRITE | 1 | 高表示写,低表示读 | |
PWDATA | DATA_WIDTH | 由APB桥接器Requester发起,可为8、16、32bits | |
PSTRB | DATA_WIDTH/8 | 表明PWDATA中哪个byte有效,用于稀疏传输 |
Source | Signal | Width(bits) | Description |
---|---|---|---|
Slave | PREADY | 1 | 可延长APB传输的clk拍数 |
PRDATA | DATA_WIDTH | 可为8、16、32bits | |
PSLVERR | 1 | 表明传输出现错误 |
参数描述
Parameter | Units | Description |
---|---|---|
ADDR_WIDTH | bit | 地址宽度 |
DATA_WIDTH | bit | 数据宽度 |
APB就已经给出每次传输的状态机,APB将传输过程分为了3个状态,IDLE、SETUP和ACCESS,如下图所示
● SETUP:当requester需要数据传输时,会驱动某个Completer对应的PSELx拉高,PENABLE置0。且SETUP状态只持续一拍,下一拍必进入ACCESS状态
● ACCESS:会驱动PENABLE拉高,注意要从SETUP到ACCESS的转换时保证以下信号不会发生变化
PADDR, PPROT, PWRITE, PWDATA, PSTRB,PAUSER, PWUSER
之后会采样Completer.PREAEDY信号,如果PREADY为低,则ACCESS状态持续一拍。 PREADY拉高,若Requester传送数据则再次进入SETUP状态,否则回到IDLE
详细时序可以看下节读写时序
如下图所示,posedge PCLK为采样时刻,并画出驱动时刻与posedge PCLK之间的delta cycle
● T1~T2:为SETUP phase。T1时刻,requester要写数据,因此分别驱动了PADDR、PWDATA、PWRITE拉高、选择的completer对应的PSEL拉高、PENABLE拉低(表示下一拍实施写入)
● T2~T3:为ACCESS phase。T2时刻,requester采集到有PSEL拉高、PENABLE拉低,因此驱动PENABLE拉高,表示该数据有效。
个人猜测这个PENABLE就类似于常说与data一起传输的valid信号,completer检测到PENABLE为高才认为PDATA数据有效
注意T2时刻,completer会采样到自己的PSEL拉高了,就明白requester要给自己写数据了,因此驱动PREADY拉高
● T3~T4:退出ACCESS phase。T3时刻,requester采样到PREADY拉高知道completer可以接受数据,同时completer采样到PADDR、PDATA和PENABLE,将数据写入自身。
ACCESS phase可能不会只持续一个周期,这个取决于completer的PREADY信号,如下图
● T2~T3:依然为SETUP phase。T2时刻,completer采集到PSEL拉高了但自己并不能接收数据,就会使PREADY拉低而不是拉高。
此时requester就会一直等待completer的PREADY信号,此时以下信号将保持不变
PADDR, PPROT, PWRITE, PWDATA, PSTRB, PAUSER, PWUSER, PSELx, PENABLE, PAUSER, PWUSER
● T4~T5:直到T4时刻completer才拉高PREADY
● T5~T6:为ACCESS phase。T5时刻完成数据写入
使用PSTRB对PWDATA的数据进行选通,即决定PWDATA中哪个byte能被写入。
注意到PSTRB的大小是PWDATA大小/8,所以PSTRB[n] == 1 则代表 PWDATA[(8n+7):8n]的数据有效,看图
读传输时,PSTRB必须全位拉低
表示completer认为写传输错误,注意并不是写入之后completer才反馈写错误。
看时序图
● T3~T4:T3时刻,completer可以接受数据,驱动PREADY。但是T3时刻,completer可能是采集PADDR、PWDATA等信号出现问题,所以认为写传输有错故驱动PSLVERR为高
● T4~T5:T4时刻,requester采样到PENABLE、PSEL和PREADY均拉高,此时才会查看PSLVERR的值,发现其为高,知道写传输出错。
注意PSLVERR只是一个信号,至于completer如何针对该信号进行处理取决于它的内部逻辑
读传输与写传输的时序类似,不多赘述
completer的PREADY拉低的情况
读传输也可能出现错误,表明无可读数据
APB Slave端的RTL设计,包括寄存器读写、指令传输、FIFO读写