奔跑吧,SOC(三) 互联总线协议

之前,说了片上互联总线,但是光有总线可是不行的,还需要片上总线协议支持才行,因为有了协议,才能对寄存器准确无误的进行操作。

说到片上总线协议,那可就多了,如ARM公司所用的AMBA总线,Silicore公司的wisbone总线,altera的avalon总线等。关于这些总线的知识,可以自行百度之。

片上总线协议,看着似乎很高级,其实就是一个约定双方通信的方式。有了这个通信的方式,双方就可以准确无误快速的进行通信了。

以下以ARM公司的AMBA总线为例说明,因为只对这个总线有研究过。不过只要对一种片上总线有了解,学习其他的片上总线很容易就学会了。

AMBA现在主要是有3种总线协议

1、 AHB

2、 APB

3、 AXI

目前xilinx的zynq芯片使用的片上互联总线协议就是AXI4,比较高级的总线协议。

下面以APB总线来说明,因为这个协议是3个里面最简单的一个。

之前,有提出一个问题,CPU对寄存器操作,只能是在一个时钟内操作,但是如果对某些寄存器的操作需要若干个时钟周期呢,就需要将流水线暂停,直到对寄存器操作完成后,再开启流水线,执行之后的指令,但是CPU怎么知道什么时候流水线暂停,什么时候流水线开启了,就要借助APB协议了。

先来看看APB协议的接口:

光看这个接口信号,估计是没有什么感觉了,但是看看时序图,就很好理解APB协议了。

因为对寄存器的操作有读和写过程,所以APB协议也分成了读传输和写传输。

对于读传输:

从时序图能看出什么来了吗?

对于读来说,PWDATA信号是没有用的。PADDR是地址,根据之前说的,这个地址就是寄存器的地址,第二个PWRITE,读写信号,因为是读,所以为0,表示现在是读操作。第三个PSEL信号,片选信号,就是上一篇博客说的总线互联出来的寄存器使能信号。PENABLE信号,用来表示传输开始。

因为读数据,有可能需要多个时钟才能读取到数据,所以对于寄存器来说,有个信号PREADY,这个信号方向是寄存器到CPU的,用来表明数据读取是否有效,当为高的时候,CPU读取寄存器数据有效。

所以对于CPU来说,当要读取外部寄存器的数据时,首先将流水线暂停,按照APB协议规定读传输的方式,产生PADDR,PWRITE,PSEL,PENABLE信号。然后就等待PREADY信号,一旦为高,说明读取数据成功,将数据从PRDATA读走,结束读传输,然后再启动流水线。

对于写传输:

只要理解了读传输了,写传输也是很好理解的。

因为是写,所以不关心PRDATA信号。上面几个信号和读传输的一样,只是多了一个PWDATA信号,这个就是写入到寄存器的数据。同样,对于写来说,有可能写需要多个时钟周期才能把数据写入到寄存器中,所以和读传输一样,使用PREADY信号来指明,数据是否可以成功写入,当为1,就说明数据可以成功写入,CPU就不用再等待了。

所以对于CPU来说,当要写外部寄存器的数据时,首先将流水线暂停,按照APB协议规定写传输的方式,产生PADDR,PWRITE,PSEL,PENABLE,PWDATA信号。然后就等待PREADY信号,一旦为高,说明写数据成功,就结束写传输,然后再启动流水线。

当然APB协议还有些其他的接口,不过这些接口是扩展某些功能用的,你可以选择不使用了。

有了上面的这套协议机制,那么CPU对外部寄存器的操作就可以达到准确无误了。当加入了总线协议后,CPU就不是简单的发出地址总线和数据总线了,这个时候控制总线就出场了。控制总线就是所使用互联总线协议中规定的一些必须信号的集合。

对于APB协议,因为该协议比较简单,所以控制总线协议也比较简单,就PADDR,PWRITE,PSEL,PENABLE, PREADY这几个信号,但是如果用上其他协议,那控制总线就复杂了,例如,对于AXI4协议,有5个通道,接口有几十个,那就比APB要复杂多了。但是原理都是一样的。

更多相关阅读

奔跑吧,SOC(四) 外设地址集合
奔跑吧,SOC(二) 片上互联总线
奔跑吧,SOC(一) 软件是怎么控制硬件的

原文首发于骏的世界博客
作者:卢骏
更多IC设计相关的文章请关注IC设计极术专栏,每日更新。

发表评论

邮箱地址不会被公开。 必填项已用*标注