SynchronousFIFO同步FIFO什么叫FIFO?1.什么是FIFO?FIFO是英文FirstInFirstOut的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。FIFO存储器主要分为基于移位寄存器型和基于RAM型。而RAM型的又有单口RAM和双口RAM之分,目前来说用的较为广泛的是基于双端口RAM的FIFO。下面给大家介绍的就是基于双端口RAM的FIFO。FIFO的模块端口双口RAM在介绍FIFO原理之前先给大家说说双口RAM,因为FIFO的主要功能就是对RAM的控制,产生空满信号。双口RAM指的就是带读和写地址、使能端的存储器。双口RAMrd_enwr_endataoutdatainrd_addrresetwr_addrFIFO有什么作用?FIFO存储器是系统的缓冲环节,如果没有FIFO存储器,整个系统就不可能正常工作它主要有几方面的功能:1)对连续的数据流进行缓存,防止在进机和存储操作时丢失数据;2)数据集中起来进行进机和存储,可避免频繁的总线操作,减轻CPU的负担;3)允许系统进行DMA操作,提高数据的传输速度。这是至关重要的一点,如果不采用DMA操作,数据传输将达不到传输要求,而且大大增加CPU的负担,无法同时完成数据的存储工作。比如FIFO的一端时AD数据采集,另一端时计算机的PCI总线,假设其AD采集的速率为16位100KBPS,那么每秒的数据量为100K×16bit=1.6Mbps,而PCI总线的速度为33MHz,总线宽度32bit,其最大传输速率为1056Mbps,在两个不同的时钟域间就可以采用FIFO来作为数据缓冲。对于不同宽度的数据接口也可以用FIFO,例如单片机位8位数据输出,而DSP可能是16位数据输入,在单片机与DSP连接时就可以使用FIFO来达到数据匹配的目的。什么叫synchronousFIFOSynchronousFIFO同步FIFO前面介绍的功能主要讲的是异步的FIFO。同步指的是读和写都在一个clock下工作。显然异步FIFO就是指不在同一个clock下工作的。这里不作描述。☀读写在同一时钟下叫同步,不同时钟叫异步。FIFO的原理FIFO就是对这个双口RAM进行操作。FIFO产生empty和full信号。告诉外面,满和空的状态。满的话就不能在写数据进去了。空的话就不能将数据读出来。FIFO内部结构图FIFOCONTROLFIFOCONTROL的作用是产生读写指针和fullempty信号。CONTROL的结构空满标志的意义满信号有效表示FIFO已经处于满状态,不能再执行写入动作;满信号复位表示FIFO非满,还可以执行写入动作;空信号有效表示FIFO处于空状态,这时没有有效数据可以读出;对空信号复位说明FIFO非空,这时可以进行读操作。正确产生空/满标志是整个FIFO设计的最关键部分,这部分的好坏直接影响着整个FIFO的性能,空/满标志产生的原则是:当整个FIFO被写满时而不会溢出,当整个FIFO被读空时而不会多读。每进行一次读写操作,相应的指针就增加一次,指向下一个位置。当指针移动到最后的位置时,它又重新回到初始位置。在FIFO非空或非满的状态下,这个过程将随着读写控制信号的变化一直变化下去。如果FIFO处于空状态,再进行一个读出动作会产生向下溢出(underflow),一个无效的数据被读出;同样地,对于一个写满的FIFO如果进行一个写入动作,会产生向上溢出(overflow),一个有用的数据会被新写入。这会导致先前的数据被覆盖。为了避免这种错误的产生,应该对FIFO设置满和空两个信号。空满信号的判断通过比较读写指针信号可以判断FIFO的空满状态。当读指针和写指针相等时,FIFO可能处于满状态或空状态。空满信号的简单示意图如何判断是空是满呢?可以用不同的方法判断是写指针从后面追上了读指针还是读指针从后面追上了写指针。本文所应用的方法是分别将读/写地址寄存器扩展一位,将最高位设置为状态位,其余低位作为地址位,指针由地址位以及状态位组成。首先把读、写状态位全部复位,如果地址循环了奇数次,则状态位置1,偶数次则又重新复位,应用地址位和状态位的结合实现对空、满标志位的控制。当读写指针的地址位和状态位全部吻合的时候,读写指针经历了相同次数的循环移动,也就是说,FIFO处于空状态;如果读写指针的地址位相同而状态位相反,写指针比读指针多循环一次,标志FIFO处于满状态。多用一位判断空满状态可以使用下面的公式来判断空满状态:empty=(w_ptr[n:0]==r_ptr[n:0])full=(w_ptr[n-1:0]==r_ptr[n-1:0]&&w_ptr[n]!=r_ptr[n])FIFOMEM虽然FIFOmem由厂家提供,但我们做仿真的时候必须要把它写出来。所以我们要用语言把它描述出来。让它和实际上的mem功能相同。写和读的时间差在真实情况下,写进去的数是不能立即读出来的。按照要求必须延迟两个clock,两个clock以后,数据稳定了才能将它读出来(当然,前面讲的是同一地址下的读写)。而我们logic不会出现这种情况,写进去的数据可以立即读出,当然这是不正确的,所以我们写mem的时候考虑到这点。读和写的使能如果系统reset后,读写使能同时有效,这时RAM输出的数据并不是输入的数据。如果读写地址不同,读写使能同为1时,读不会延迟两个clock。用这种方法可以处理这种情况。FIFO的模块端口FIFO内部结构图CONTROL的结构THEEND