转载自APB总线
APB总线
概述
在APB总线里面,数据的传输只能由主机(master)发起,其他部分响应主机操作。
在APB总线里面,数据的回复由从机(slave)完成,从机只能完成主机发起的操作,自己不能发起操作然后完成操作。
在APB总线里面,有且只有一个主机可以连接到APB总线接口,其他的只能连接从机(外设),所以APB总线只支持单主机模式。
在APB总线里面,主机先发起要访问的外设地址,外设根据要求返回数据,主机收到数据,这一个完整的流程被称为APB总线协议。
总线是被总线上所有的部件所共享的一组通路(连线),对于单主机来说,如果该主机想要与其中的外设部件进行通信,需要将地址、数据、命令放到总线上,其他的从机部件对总线上的数据进行侦听,检查地址数据和命令的是否与自己相关,然后相关部件做出响应。
在APB总线中,有地址线(PADDR),命令线(PWRITE、PENABLE、PESEL)和数据线(PRDATA、PWDATA)。
总线详解
参考APB
CPU :CPU是操作的发起者,CPU发起读写外设数据的操作。
APB_Interconnect :根据上文所说的总线协议和传输信号的要求,构建出来的设计实体,该实体接收CPU发出的数据和指令,然后广播到每一个外设部件。
SLAVE:对APB_interconnect输出数据和指令进行响应。
是否可以不需要APB_interconnect,APB_Interconect的作用是什么?
如上图,当CPU只有一个外设,那么直接可以和外设相连,不需要APB_Interconect。此时CPU的发出的指令和操作只会发给URT0,不需要地址来仲裁。如下图:
但是当CPU需要连接多个外设的时候(CPU只管发出地址和命令),根据CPU地址范围分配表:
(1)APB_Interconect对每一个外设设置地址,然后APB_Interconect根据CPU发出的地址,选中对应地址的外设,把CPU的地址和指令传输到该外设 [地址路由仲裁]。
结论:是否需要APB_interconnect根据应用而定,如果只是单个的外设连接CPU(很少出现),可以直接连接CPU和外设通过APB总线。不需要APB_Interconect,但是当外设数目变多,自然而然的就引入了不同外设的区分,所以当多个外设的时候,需要引入APB_Interconect来做这些相关的处理。
总线接口
APB Bridge示意接口(APB_Interconect)
根据AMBA APB手册,截取APB Bridge接口:
图左边的接口System Bus Slave Interface,连接APB 主机(即上面的CPU),这个接口也是APB完整的接口,包含上面举例的信号。图右边和左下面的接口连接多个SLAVE,其中PSELn有多个,每个对应不同的SLAVE。其他信号对于SLAVE是一致的,因为PSELn已经可以选中不同的SLAVE来接收传输的共享信号了。
APB BUS时序图(AMBA APB 2.0手册)
写传输:
如上时序图,主机在T2时刻把所要访问的地址,命令和数据全部放到APB总线上,沿着组成APB的接口的金属线传播到从机接口处。在T3时刻,从机发现自己的PSEL信号为高,就知道主机选择它来处理数据的写操作,此时从机内部准备好处理数据的准备动作,在T4时刻,从机完成总线上数据采样并进行内部数据处理。
PSEL, PENABLE以及PREADY信号这三个信号十分重要,这3个信号之间的关系标志着一次transaction的开始和结束:
PSEL从0变为1,表明要开始一个新的transaction。
PSEL为1的第一个周期,PENABLE要为0,然后在下一个周期变为1。
当Slave可以确保在下一个时钟沿接受到PWDATA时,就可以把PREADY变为1。
当Master看到PREADY为1后,就可以在下一个时钟沿把PSEL,PENABLE拉为0,结束transaction。
注意:
PWDATA,PADDR, PWRITE需要在PSEL为高一直到PREADY为高期间都保持稳定。
PENABLE必须要在PSEL为高的第一个周期为0(称为setup phase),第二个周期为1,直到PREADY为1(称为access phase)。
如果Master想要在PREADY为高之后下一个沿立刻开始新的transaction,可以不拉低PSEL,而使得PSEL继续为1,但是一定要把PENABLE拉低
状态机如下
WriteEnable = PSEL & (!PENABLE) & PWRTIE ;
或者
WriteEnable = PSEL & PENABLE & PWRTIE ;
always @ (posedge PCLK or negedge PRESETn)
begin
if(~PRESETn)
begin
reg_paddr <= 'h0 ;
reg_pwdata <= 'h0 ;
end
else if(WriteEnable)
bein
reg_paddr <= PADDR ;
reg_pwdata <= PWDATA ;
end
end
TODO:
外设内部处理数据
读传输:
如上时序图,主机在T2时刻把所要访问的地址,命令和数据全部放到APB总线上,沿着组成APB的接口的金属线传播到从机接口处。在T3时刻,从机发现自己的PSEL信号为高,就知道主机需要它内部的数据(PWRITE ==0),此时从机内部准备好返回数据并把返回的数据放在数据总线上,在T4时刻,主机完成总线上数据采样得到需要的数据。
ReadEnable = PSEL & (!PENABLE) & (!PWRTIE)
always @ (posedge PCLK or negedge PRESETn)
begin
if(~PRESETn)
begin
reg_paddr <= 'h0 ;
reg_prdata <= 'h0 ;
end
else if(ReadEnable)
bein
reg_paddr <= PADDR ;
reg_prdata <= 外设内部产生的数据 ;
end
end
assign PRDATA = reg_prdata ;
优缺点
我们看到,APB的读和写不能同时进行,每一个transaction要么是读,要么是写,由PWRITE来控制。每一个transaction至少需要2个周期。这两点导致了APB在AMBA三兄弟中是最低性能的,但是好处是协议简单,Master和Slave的设计都只需要很少的逻辑。
优点:设计简单,时序简单,用在不需要高性能总线的外设上。
缺点:每个数据的传输都需要两个时钟周期,这样的话,APB BUS满载的带宽也只有50%,带宽利用率不高。