片上总线Wishbone 学习(十一)总线周期之块读操作

长平狐 发布于 2013/06/03 14:54
阅读 66
收藏 0

片上总线Wishbone 学习(十一)总线周期之块读操作

异步周期结束方式

            块读/写操作每次读/写数据多次。块读/写操作实际上是由顺序进行的多个单次读/写操作组合而成的。在同时存在多个主设备时,块读/写操作非常有用,一个块读写一般是不能打断的,比如一次DMA,如图9所示,在一次块操作中,CRC_O信号必须保持为高。同时为了保证整个块操作不被打断,LOCK_O也可以置为高,但是LOCK_O不必须为高。典型地,主设备进行一次DMA连续传输4个或者8个总线宽度单位的数据,然后主动释放总线,其后又试图占用总线重新进行DMA,直到所有的数据都传输完毕。这样做的好处是允许其他优先级更高的主设备在两次DMA之间插入操作以完成更加紧急的任务。 


图1 Wishbone总线块操作中CYC_O信号的用法

           块读操作如图2所示。块操作最多能够在每个时钟周期进行一次数据读或者写,但是主设备和从设备都可以通过插入等待周期控制块操作的速度。一次块操作包括多次子操作。每一次子操作都是块操作的一个阶段,完成一次数据读或者写。图10的块操作由五次读操作完成,其过程如下: 

           在时钟上升沿0,主设备将地址信号ADR_O()TGA_O()放到总线上,将WE_O置为低表示读操作,将适当的SEL_O()信号置高通知从设备将数据放在数据总线的适当位置,将CYC_OTGC_O()置高表示操作正在进行,将STB_O置高表示一次子操作开始。CYC_OTGC_O()从无效变为有效可以发生在上升沿0以前的任何时刻。 

           在时钟上升沿1到达之前,从设备检测到主设备发起的操作,将适当的数据放到主设备的DAT_I()TGD_I(),将主设备的ACK_I置高作为对主设备STB_O的响应。 

           在时钟上升沿1,主设备发现ACK_I信号为高,将DAT_I()TGD_I()采样,完成第一次子操作。主设备将新地址信号ADR_O()、新TGA_O()放到总线上,将新的SEL_O()信号置高通知从设备将数据放在数据总线的适当位置。 

           在时钟上升沿2到达之前,从设备检测到主设备发起的第二次操作,将适当的数据放到主设备的DAT_I()TGD_I(),继续将主设备的ACK_I置高。 

           在时钟上升沿2,主设备发现ACK_I信号为高,将DAT_I()TGD_I()采样,完成第二次子操作。主设备将STB_O信号置低表示插入等待周期。 

           在时钟上升沿3到达之前,从设备检测到STB_O信号为低,将ACK_I置低。 

           在时钟上升沿3,主设备发起第三次操作,将新的地址信号ADR_O()、新的TGA_O()放到总线上,将WE_O置为低表示读操作,将适当的SEL_O()信号置高通知从设备将数据放在数据总线的适当位置,将STB_O置高表示第三次子操作开始。 

           在时钟上升沿4到达之前,从设备检测到主设备发起的第三次子操作,将适当的数据放到主设备的DAT_I()TGD_I(),将主设备的ACK_I置高作为对主设备STB_O的响应。 


图2 Wishbone总线的块读操作(异步周期结束方式)

       在时钟上升沿4,主设备发现ACK_I信号为高,将DAT_I()TGD_I()采样,完成第三次子操作。主设备同时发起第四次子操作,将新地址信号ADR_O()、新TGA_O()放到总线上,将新的SEL_O()信号置高通知从设备将数据放在数据总线的适当位置。 

      在时钟上升沿5到达之前,从设备检测到主设备发起的第四次子操作,将适当的数据放到主设备的DAT_I()TGD_I(),将主设备的ACK_I置高作为对主设备STB_O的响应。 

      在时钟上升沿5,主设备发现ACK_I信号为高,将DAT_I()TGD_I()采样,完成第五次子操作。主设备同时发起第六次子操作,将新地址信号ADR_O()、新TGA_O()放到总线上,将新的SEL_O()信号置高通知从设备将数据放在数据总线的适当位置。 

      在时钟上升沿5过后,从设备检测到主设备发起的第五次子操作,但是由于数据没有准备好,它在新上升沿到达之前将ACK_I信号置低表示插入等待周期。
     上升沿56之间被插入了多个等待周期。当从设备准备好数据,在时钟上升沿6到达之前,将适当的数据放到主设备的DAT_I()TGD_I(),将主设备的ACK_I置高作为对主设备STB_O的响应。 

     在时钟上升沿6,主设备发现ACK_I信号为高,将DAT_I()TGD_I()采样,并将STB_OCYC_O置为低表示整个块读操作完成。 从设备发现STB_O置低后,也将主设备的ACK_I置低。 

同步周期结束方式

图3 Wishbone总线的块读操作(同步周期结束方式)
在时钟上升沿0:
  • Master在[ADR_O()]和[TGA_O()]发出有效的地址
  • Master拉低[WE_O],表明是一个读周期
  • Master发出有效数据选择信号[SEL_O()]表明哪些数据是有效的
  • Master发出[CYC_O]和[TGC_O()]表明总线周期的开始
  • Master发出[STB_O]表明操作的开始
注意:Mater必须在时钟上升沿1或之前发出[CYC_O]和/或[TGC_O()]


在时钟上升沿1:
  • Slave检测到主设备发起的操作,发出[ACK_I]
  • Slave在[DAT_O]和[TGD_O()]发出有效的数据
  • Slave发出[ACK_I]应答[STB_O],表明数据有效,可以读取数据了
  • Master发现[ACK_I],准备锁存[DAT_I]和[TGD_I()]

在时钟上升沿2:
  • Master锁存[DAT_I]和[TGD_I()]
  • Master拉低[STB_O]插入等待周期(-WSS-)


在时钟上升沿3:
  • Master在[ADR_O()]和[TGA_O()]发出有效的地址
  • Master拉低[WE_O],表明是一个读周期
  • Master发出有效数据选择信号[SEL_O()]表明哪些数据是有效的
  • Master发出[STB_O]表明操作的开始

在时钟上升沿4:
  • Slave检测到主设备发起的操作,发出[ACK_I]
  • Slave在[DAT_O]和[TGD_O()]发出有效的数据

在时钟上升沿5:
  • Master锁存[DAT_I]和[TGD_I()]
  • Master拉低[STB_O]和[CYC_O],结束总线周期

原文链接:http://blog.csdn.net/ce123/article/details/6963971
加载中
返回顶部
顶部