微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 片上总线Wishbone 学习(十)总线周期之块读操作

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

时间:12-15 来源:互联网 点击:

异步周期结束方式

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


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

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

在时钟上升沿0,主设备将地址信号ADR_O()、TGA_O()放到总线上,将WE_O置为低表示读操作,将适当的SEL_O()信号置高通知从设备将数据放在数据总线的适当位置,将CYC_O和TGC_O()置高表示操作正在进行,将STB_O置高表示一次子操作开始。CYC_O和TGC_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的响应。

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

在时钟上升沿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信号置低表示插入等待周期。
上升沿5和6之间被插入了多个等待周期。当从设备准备好数据,在时钟上升沿6到达之前,将适当的数据放到主设备的DAT_I()和TGD_I(),将主设备的ACK_I置高作为对主设备STB_O的响应。

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

同步周期结束方式

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

在时钟上升沿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()]发出有效的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top