异步FIFO的Verilog设计
- 格式:pdf
- 大小:546.18 KB
- 文档页数:5
异步FIFO的Verilog设计3卜宪宪(莱阳农学院 青岛 266109)
摘 要 介绍异步FIFO的基本结构和工作原理,分析异步FIFO的设计难点及其解决办法,在传统设计的基础上提出一种新颖的电路结构,用verilog描述并对其进行综合仿真并在FPGA上实现,得到较好的性能。关键词 FIFO 双口RAM 格雷码 Verilog
中图分类号 TN45
1 引言在现代的集成电路芯片中,随着设计规模的不断扩大,一个系统中往往含有数个时钟,因而出现了跨不同时钟区域进行异步数据传输的要求。异步FIFO(FirstInFirstOut)是解决这个问题一种简便、快捷的解决方案。使用异步FIFO可以在两个不同时钟系统之间快速而方便地传输实时数据。在网络接口、图像处理等方面,异步FIFO得到了广泛的应用。异步FIFO是一种先进先出的电路,使用在需要产时数据接口的部分,用来存储、缓冲在两个异步时钟之间的数据传输。在异步电路中,由于时钟之间周期和相位完全独立,因而数据的丢失概率不为零。如何设计一个高可靠性、高速的异步FIFO电路便成为一个难点。本文介绍解决这一问题的一种方法。2 异步FIFO功能描述图1给出了FIFO的接口信号和内部模块图。图1 异步FIFO内部模块图和接口信号由图1可以看出,写地址和满信号产生模块产生写有效信号和下一次要写数据的地址,以及指示缓冲区满信号。读地址和空信号产生模块产生下一次要读数据的地址,以及指示缓冲区空信号。FIFO的操作如下:FIFO复位时写指针和读指针都为0,满信号无效,空信号有效。当有写信号有效时,把数据写入写指针指向的单元,并把写指针加1,使它指向下一个要写数据单元,写时钟每一拍写入一个数据,直到满信号有效或写信号无效时停止。当读信号有效时,读指针指向的数据被读出,
读时钟每一拍可以读出一个数据,直到读信号无效或空信号有效时停止读出数据。
3 异步FIFO的难点及解决方法设计异步FIFO有两个难点:一是不同时钟域域间数据传递的问题;二是如何正确的生成的空\
满标志。下面阐述解决这两个问题的方法。3.1 不同时钟域间数据传递的问题及解决方法亚稳态是不同时钟域间传递数据的最重要的问题。当数据信号通过两个时钟域的交界处时,将会分别由两个时钟来控制信号的值。此时如果两个时钟信号敏感沿非常接近并超过允许的额度,则将出现数据信号不稳定,即电路陷入亚稳态。图2(a)中是一种最简单的异步电路,clka和clkb为异步时钟。触发器B采样触发器A的输出数据。当clka和clkb的上升延离得太近时,如果触发器A的值在这个时候发生改变,clkb将采样到一个正在变化的数据,触发器的B的输出将是一个不确定的值,如图2(b)所示。考虑到亚稳态是由于两个时钟沿过分接近造
191第38卷(2007)第6期 计算机与数字工程
3收到本文时间:2006年10月24日作者简介:卜宪宪,女,助教,硕士,研究方向:计算机系统结构、专用集成电路设计。成的,如果对不同时钟域的输入信号用两个锁存器串连续锁存两拍,第一个触发器锁存到一个不稳定信号,经过一个时钟周期的等待以后很可能趋于稳定,变为确定值0或者1,第二个触发器在下一拍锁存的时候就能得到一个确定的值。图2 亚稳态示意图3.2 空/满标志的生成空满标志的产生是异步fifo设计的核心部分。如何正确设计此部分的逻辑,直接影响到fifo的性能。空满标志产生的原则是:写满不溢出,读空不多读。即无论在什么时刻,都不应出现读写地址同时对一个存储器地址操作的情况。空满标志都是由于读写地址相等所产生的,因此需要找到一种方法来区分开地址相等的时候应该是空还是满。传统的空/满标志产生方法有两种,第一种方法是:空标志=(|写地址-读地址|<=预定值)并且(写地址超前读地址)满标志=(|写地址-读地址|<=预定值)并且(读地址超前写地址)图3 格雷码指针产生电路最直接的做法是,采用读、写地址相比较来产生空满标志。如图3(a)所示,当读、写地址的差值等于一个预设值的时候,空/满信号被置位。这种实现方法逻辑简单,但是减法器是会引入比较大的组合逻辑延时,因而限制了FIFO的速度。所以,在对FIFO的速度要求比较严格的场合,一般只采用相等不相等的比较逻辑,避免使用减法器。图3(b)是另外一种常见的设计,比较器只对读、写地址比较是否相等。但在读、写地址相等的时候FIFO既可能为空又可能满。因此,增加一个并行的区间判断逻辑来指示是空还是满。这个区间判断逻辑将整个地址空间分为几个部分,以指示读、写地址的相对位置。这种做法提高了整个电路的速度,但是也有其缺点。主要是直接采用读、写地址等于不等于的比较逻辑来进行空/满标志的判断,可能带来误判。
4 改进的FIFO4.1 格雷码的应用及产生逻辑异步设计情况下读写时钟属于不同的时钟域,
这给空满标志产生逻辑部分及双端口存储器的读写逻辑设计部分带来很大的难度。在空满信号产生逻辑部分,由于读写地址信号是由不同时钟域的时钟所产生,通过比较读写地址产生空满信号就面临着处理多时钟域信号之间数据交换可能导致亚稳态的问题。Gray码技术是解决这一问题的有效格雷码,是一种在相邻计数值之间只有一位发生变化的编码方式,使用格雷码指针使在不同时钟域传递地址指针过程中不会出现因为指针中多位数值变化带来的错误。格雷码生成可以采用A,B两种电路改进的异步fifo采用B方案,通过增加一个寄存器保存二进制的值,减少一级复杂的组合逻辑电路,使整个电路可以工作在更高的频率上。4.2 新颖的空/满标志产生逻辑FIFO中的读写指针是一个循环指针,读写指针初始化值都为0,满标志初始化为0,空标志初始化为1。读写操作开始候,每做一次写操作写指针加1,每做一次读操作读指针也加1。当读指针在加1过程中与写指针相等的时候,表示缓冲区为空应该置空标志。反之,写指针加1过程中等于读指针时,缓冲区满应该置满标志。分析看出空满标志产生的必要条件是读地址等于写地址。现在难点就集中在当读地址等于写地址时如何区分缓冲区空或者满,也就是如果判断是读指针追上写指针,还是写指针追上读指针。分析满标志发生时候格雷码地址指针变化情况发现,可以把读写指针四等分并增加标志位go2ingfull代表存储区的将要满状态,如图5,当写指针
291 卜宪宪:异步FIFO的Verilog设计 第38卷wptr落在在第n块,而读指针rptr落在第n+1块时,这个时候应该产生“将要满”goingfull状态。分析这个时机的读写地址特性发现,写指针wptr的第n位总是和读指针rptr的第n-1位相反,而写指针wptr的第n-1位总是和读指针rptr的第n位相同。根据这个条件,我们就可以产生“将要满”标志,即:goingfull=(wptr[n]^rptr[n-1])&~(wptr[n-1]^rptr[n])
图4 将要满信号判断逻辑图将要空信号goingempty的产生机制和将要满goingfull的产生机制类似,如图6,在读指针rptr落后写指针wptr一个块距离的时候产生,判断逻辑为在读指针落后写指针一个块的距离的时候产生,
即:goingempty=~(wptr[n]^rptr[n-1])&
(wptr[n-1]^rptr[n])
图5 将要空信号判断逻辑图通过判断将要满信号goingfull从1到0跳变的
出现和写指针wptr和读指针rptr相等,就能确定写指针wptr追上了读指针rptr,即缓冲区满了,这时置位满标志。而在将要空信号出现1到0的跳变且读写地址相等时产生空标志。以16×16异步fifo为例,空满标志产生逻辑用veriglog实现如下:
parameterADDRSIZE=4;parameterN=ADDRSIZE-1;
outputempty,full;input[N:0]wptr,rptr;inputwrst_n;regdirection;wiregoingfull=(wptr[N]^rptr[N-1])&~(wptr[N-1]^rptr[N]);wiregoingempty=(~(wptr[N]^rptr[N-1])&(wptr[N-1]^rptr[N]);always@(posedgehighorposedgegoingfullorposedgegoingempty)if(goingempty)direction<=1’b0;elseif(goingfull)direction<=1’b1;elsedirection<=high;assignempty=~((wptr==rptr)&&!direction);assignfull=~((wptr==rptr)&&direction);
5 综合与仿真仿真工具采用的是Modelsim,对异步FIFO电路编写测试向量进行仿真.图5给出FIFO电路的仿真波形。图6(a)是异步FIFO复位后的波形,从图中看到开始时刻满信号wfull为0,空信号rempty
为1,在进行了几个字节的些操作以后空信号rempty降为低电平,缓冲区的数据从rdata被读出且读写数据一致,说明电路的基本输入输出功能和空信号的产生是正确的。从图6(b)上看到,当写入第19(十六进制)个数据,读出第0a个数据的时候,满信号wfull被置位,这说明满信号产生时机比较准确。综合上面两个波形图的结果,整个FIFO
的工作波形符合设计要求。
图6 异步FIFO仿真波形6 总结最后用xilinx综合工具综合与布局布线,在“xc2v8000”fpga上验证,综合结果见表1,设计比
391第38卷(2007)第6期 计算机与数字工程