异步FIFO设计
摘要:本文介绍如何应用美国QUICKLOGIC公司的QUICKRAM器件设计高速、高可靠异步FIFO(Asynchronous FIFO)。
异步FIFO广泛地用于计算机网络工业中进行非同步数据传送,这里的非同步指按一种速率发送而按另一速率接收。因此异步FIFO有两个不同的时钟,一个为读同步时钟,一个为写同步时钟。
当数据从一个时钟驱动的模块进入另一个时钟驱动的模块时,一个需仔细解决的问题就出现了。例如当写时钟比读时钟快时,未读走数据有可能被新数据覆盖,因而导致数据丢失。为了解决这个问题,就必须增加一些控制信号和状态信号,控制信号如pusb、pop,状态信号如empty,almostempty,full,almost-full。
功能描述
典型的异步FIFO(AsynFIFO)都是由异步双端口RAM和控制逻辑构成,控制逻辑包含读指针和写指针。
当FIFO中有数据而非空时,POP信号(同步于读时钟)用于控制数据的读出,所读数据来自读指针所指的(AUAL PORT RAM)中的存储单元,并且读指针加一。当读指针赶上写指针时,FIFO为空并且用empty信号(同步于读时钟)来指示这种情况。
当FIFO中有空间而非满时,PUSH信号(同步于写时钟)用于控制数据的写入,所写数据写入写指针所指的双端口RAM中的存储单元,并且写指针加一。当写指针赶上读指针时,FIFO为满足并且用full信号(同步于写时钟)来指示这种情况。
当FIFO中只剩不足三个数据时,almost-empty有效(同步于读时钟)。类似地,当FIFO中还有不足四个空位时almost-full将有效(同步于写时钟)。用户可根据需要修改读、写侧的计数器初始值,从而确定所需要的almost-empty和almost-full提前量。例如当计数器初始化为7时,almost-empty和almost-full将分别比empty和full提前7个位置。读侧和写侧的状态机将根据内部比较器的输出来确定这些状态信号。每侧的状态机都有两上D触发器,构成双同步,这样的设计可大幅度提高系统的可靠性,使得平均元故障时间(MTBF)可大于100年。
结构
图1为AsynFIFO的顶层设计框图(Quicklogic免费提供全部设计文件),并给出了各相模块的设计文件名。图中各模块可根据要求修改,以增加FIFO的宽度和深度。请注意,本文图中没有给出读侧和写侧的状态机。
RAM块
图1中用了一个64×32的RAM块。该RAM块由Verilog代码定义,该代码由SpDE内的RAM/ROM/FIFO向导自动产生。在向导中用户可自由指定所需的宽度和深度,向导自动产生所需的Verilog/VHDL代码和原理图中所需的symbol。
比较器
参考设计中的比较器为5位,采用纯原理图方法输入。当用户修改了RAM块的深度时,比较器的宽度也要与之对应。例如当FIFO深度为256时,地址须为8位,因而是比较器也应为8位。
格雷码计数器
为了提高MTFB,设计中采用了格雷码计数器,该计数器为5位,采用Verilog/VHDL语言实现。它们可以被改成6位、7位、8位、9位,以对应深度为64、128、256、512的FIFO。
锁存器
图中的锁存器为verilog/VHDL语言所写,读侧有三个,写侧有一个,用户可自由地修改其宽度。它们用于状态、控制信号的产生。
性能
RARTS:QuickRAM family
AREA:48 buffer cells
Speed:write colck(WCLK)=136MHz,read clock(RCLK)=129MHz
结论
采用QuickRAM器件实现异步FIFO方便灵活,并且速度快,成本低,还可以实现非常规深度和宽度的专用FIFO。
评论