在之前的文章中,我们详细地介绍了AHB的相关内容,在这篇文章里我们会开始APB总线的学习,由于APB总线协议的内容真的非常少(手册才34页,比起那些动辄成百上千页的手册来说真的太友好啦),我们会在这一篇文章中全部讲完。
文章合集:AMBA总线协议(0)——目录与传送门
APB写传输包括两种类型:无等待状态写传输和有等待状态写传输:
在时钟上升沿后,改变地址、数据、写信号和选择信号
(1)T1周期:写传输开始于地址总线信号 PADDR、写数据信号 PWDATA、访问方向信号 PWRITE 和选择信号 PSEL。这些信号在 PCLK 的上升沿寄存。T1 周期称为写传输的建立周期。
(2)T2周期:在 PCLK 的上升沿寄存使能信号 PENABLE 和准备信号 PREADY。
① 当确认时,使能信号 PENABLE 表示传输访问周期的开始。
② 当确认时,准备信号 PREADY 表示在 PCLK 的下一个上升沿从设备可以完成传输。
(3)地址总线信号 PADDR、写数据信号 PWDATA 和控制信号一直保持有效,直到在 T3周期完成传输后,结束访问周期。
(4)在输出结束后,使能信号 PENABLE 变成无效。选择信号 PSEL 也变成无效,除非相同的外设立即开始下一个传输,这些信号才重新有效。
上图说明了从设备如何使用准备信号 PREADY 扩展传输。在访问周期,当使能信号 PENABLE 为高时,可以通过拉低准备信号 PREADY 来扩展传输。
下面这些信号保持不变:
(1)地址信号,PADDR
(2)访问方向信号,PWRITE
(3)选择信号,PSEL
(4)使能信号,PENABLE
(5)写数据信号,PWDATA
(6)写选通信号,PSTRB
(7)保护类型信号,PPROT
当使能信号 PENABLE 为低时,准备信号 PREADY 可以为任意值。确保外部器件使用两个固定的周期来使使能信号 PREADY 为高。
注意:建议在传输后不要立即更改地址和写信号,而是保持稳定,直到发生另一次访问。这降低了功耗。
APB 读传输包括无等待状态读传输和有等待状态读传输:
上图显示了无等待状态读传输。图中给出了地址信号 PADDR、访问方向信号 PWRITE、选择信号 PSEL 和使能信号 PENABLE 的。在读传输结束以前,从设备必须主动提供数据。
下图展示了PREADY信号如何扩展传输。如果在访问阶段PREADY被驱动为低,则传输被扩展。该协议确保以下内容在其他周期中保持不变:
(1)地址信号:PADDR
(2)访问方向信号:PWRITE
(3)选择信号:PSEL
(4)使能信号:PENABLE
(5)保护类型信号:PPROT
在传输过程中,可以使用 PSLVERR 信号表示 APB 传输的错误条件。在读和写的交易过程中,可能发生错误条件。
在一个 APB 传输中的最后一个周期,当PSEL、PENABLE和PREADY信号都为高时,PSLVERR信号才是有效的。
当外设接收到一个错误的交易时,外设的状态可能发生改变。当接收到一个错误时,写交易并不意味着没有更新外设内的寄存器;当接收到一个错误时,读交易能够返回无效的数据。对于一个读错误,并不要求外设将数据总线驱动为0 。
将一个 APB 错误映射到 RRESP/BRESP = SLVERR,通过PSLVERR 映射到 RRESP[1] 信号(用于读)和 BRESP[1] 信号(用于写)来实现该映射。
用于读和写,将 PSLVERR 信号映射到 HRESP = SLVERR,通过将 PSLVERR 信号映射到AHB 信号 HRESP[0]来实现该映射。
表示空闲,这是默认的APB状态。
表示建立。当请求传输时,总线进入 SETUP状态,设置选择 PSELx。总线仅在 SETUP 状态停留一个时钟周期,并在下一个时钟周期进入 ACCESS状态。
表示访问,这里多提一句,这是AMBA 3 的协议,在AMBA 2 中这个状态为ENABLE状态,所以如果看到 ENABLE 状态,这是因为使用的是AMBA 2的文档。在ACCESS 状态中使能信号 PENABLE 置为1。在从 SETUP 状态到 ACCESS 状态转变的过程中,地址信号、写信号、选择信号和写数据信号保持不变。是否从 ACCESS 状态退出,由器件的准备信号 PREADY 控制。
(1)如果准备信号 PREADY为低,保持 ACCESS 不变。
(2)如果准备信号 PREADY为高,则退出 ACCESS 状态。如果此时没有其他传输请求,总线返回 IDLE 状态,否则进入 SETUP状态。
在本文中,我们介绍了 AMBA APB 协议,分别介绍了APB传输(读传输,写参数,错误传输),其中读写又可以分别分成有等待状态和无等待状态,最后介绍了APB的操作状态。APB相对于AHB来说会简单很多,但是也是非常有用的。至此我们已经介绍了APB和AHB,接下来还有本系列最后的AXI协议,也是本系列最重要的部分。(毕竟笔者是学FPGA的,前者只是用于Soc,但AXI哪里都有)