如果设计中有多个模块,每个模块内部有许多寄存器或者存储块需要配置或者提供读出那么实现方式有多种,主要如下:
实现方式一:可以在模块顶部将所有寄存器引出,提供统一的模块进行配置和读出。这种方式简单是简单,但是顶层连接工作量较大,并且如果配置个数较多,导致顶层中寄存器的数目也会较多。
实现方式二:通过总线进行连接,为每个模块分配一个地址范围。这样寄存器等扩展就可以在模块内部进行扩展,而不用再顶层进行过多的顶层互联。如下图所示:
那如果进行总线的选择,那么有一种极为简单的总线推荐被使用,那就是AVALON-MM的总线
ALTERA提出两种总线类型,分别是AVALON-MM, AVALON-ST。分别用于连接memeory 和数据流的传送 MM不是你想的意思,其英文为memory map。实现内存映射是其主要目的。主要信号包括如下表所示:
信号 |
例子 |
address |
地址 |
read |
读 |
readdata |
读数据 |
write |
写 |
writedata |
写数据 |
waitrequest_n |
等待信号 |
AVALON-MM因此可以说是最简单实用的总线形态了。对于其操作来说,总线为同步类型的总线,写信号只需要在写使能有效时,同时提供写数据即可,而读数据等待信号无效时,读出数据有效。
同样数据类型读数据(readdata)和写数据(writedata)的宽度可以根据设计的需要灵活配置为(8,16,32----256---1024)BIT等值。即可以支持非常大的位宽,但普通应用,只需要(8,16,32,64)BIT等即可满足应用。
那假设总线宽度32,基本上主流的数据总线的宽度。如果需要更细粒度的划分,确定读写某个字节有效,那么byteenable信号也是必须的。其需要4bit来标示32bit(4个byte)中那个有效,每一BIT表示一个字节,因此如果要完全表示所有的字节有效,因此字节有效信号的宽度为(数据总线的宽度/8)。AVALON还可以有burst的操作。主设备可以通过burstcount设备确定brust的长度,为2的n-1次方。
对于普通的应用,通过上述表格中的基本操作即可满足需求,这也正是AVALON-mm总线的优势。此外模块按此标准提供连接接口,各种模块可以挂在NIOSII的片上系统上。
如果模块之间为点对点的连接,同时传递大数据量的操作,那么的AVALON-mm总线就不太适合,因此AVALON_streaming总线就适合这种应用场景。
AVALON_streaming总线本质上是一种同步并行总线,即在同步时钟状态下,使能有效代表传递数据有效。其基本信号如下表所示:
信号 |
例子 |
valid |
主设备数据有效 |
data |
数据信号 |
ready |
从设备准备好 |
start of frame |
帧开始 |
end of frame |
帧结束 |
empty |
帧结束信号时,空数据的位数 |
从上图中,可以看出各信号在数据传输中的作用,对于从设备获取数据的处理,就是VALID有效时,数据有效的采样操作,非常简单方便,易于处理。如果从设备设定ready永为1,则表示没有反压的机制,则主设备,可根据自身收包情况一直向从设备发送数据包。此外还有其他辅助信号,可以根据设计需要进行添加。
使用总线使模块标准化,便于代码的移植和设计复用。同时标准总线的设定和统一定义也利于项目团队代码的标准化,便于理解和传播。
下文将介绍两种其他应用较广的总线形态,AHB(AMBA) 和WISHBONE总线(待续)。
用户377235 2014-8-10 11:24
用户377235 2014-7-28 08:04
讲的很简单。没看懂。