新闻中心

EEPW首页 > 消费电子 > 设计应用 > 用CPLD和外部SRAM构成大容量FIFO的设计

用CPLD和外部SRAM构成大容量FIFO的设计

作者:任三军 呼文杰时间:2003-04-11来源:电子设计应用收藏
摘要:对照一般通用FIFO的外部控制线,以及视频服务器应用的具体要求,设计完成用CPLD和外部SRAM构成的大容量、廉价、高速FIFO,除了可以满足视频服务器码流缓冲的需要外,也可以作为一个通用的大容量FIFO。
关键词:
The design of FIFO consisted of CPLD and SRAM
Ren Sanjun Hu Wenjie
DSP Center of Institute of Acoustics, Chinese Academy of Science, Beijing 100080
Abstract: According to the signal of general FIFO and the special need of video server, implement a cheap, high -volume and high-speed FIFO with CPLD and external SRAM. Besides meeting the buffer need of video stream in video server, it can be a general high-volume FIFO.
Keywords:video server, stream buffering, FPGA/CPLD, FIFO


随着数字电视技术的进一步成熟,在视频服务器方面,利用支持软件丰富、运算速度不断提高、具有较高性能价格比的微机来代替昂贵的专用设备实现数字视频码流的复用具有一定的实际意义,但是一般的桌面操作系统定时不够精确、处理大量并发任务效率不高以及突发传送等问题影响了复用后码流的质量,为了保证复用后的码流可以均匀平滑地传送到调制器,还考虑到微机的工作效率,就需要用FIFO来进行码流的缓冲。如果FIFO的容量足够大,微机就可以通过DMA方式一次发送大量的数据,最后再经过FIFO的缓冲,按照预设频率均匀送出。
在其它许多实际应用中,也会利用到FIFO来完成数据流的缓冲,消除突发传送带来的数据抖动,达到平滑输出的效果。FIFO的容量和速度直接影响到缓冲的效果,但是目前大容量FIFO价格昂贵,这就影响到了FIFO的进一步实际应用。本文介绍了一种利用外部SRAM和CPLD构成的廉价、高速、大容量先进先出缓冲器FIFO的设计方法。
一、系统的设计思路
为了用外部SRAM来实现FIFO,要解决以下问题:
§ 区分同时到达的读写信号,并且产生间隔的对外部SRAM的读写信号
§ 在SRAM顺序寻址的基础上实现数据的先进先出
§ 全空、全满、半空、半满状态的判定
§ 尽量降低对器件速度的要求
二、设计方法
同步设计
在系统中地址产生、比较器结果输出、FIFO各种状态的输出都采用同步触发方式,全部按照系统时钟统一进行,这能在很大程度上消除异步方式引起的逻辑状态变化时间的不确定和毛刺的产生,但也没必要在所有的地方都强求按同步设计,只要能符合时序要求,异步方式也可以,目的是尽量减少设计的复杂度和占用的资源。
原理图输入
设计在Altera公司的MAX+plus II V9.6软件下编译仿真。在系统的整体设计中采用原理图的方式,可以方便地进行时序控制和仿真。
三、具体信号的产生及时序分析
信号分析的具体条件
以下的设计都是在CPLD为EPM7128SQC100-6,SRAM为IDT71128-12的条件下进行,对FIFO的最高要求为双向同时读写,时钟RCLK和WCLK为10MHz,脉冲宽度为50ns,系统时钟CLK为50MHz,脉冲宽度为10ns。对于较低速度的读写,50MHz的系统时钟也可以适应,如果外部要求降低,也可按照与RCLK、WCLK的等比例换用较低的系统时钟。外部数据是在上升沿有效,FIFO的输出也是上升沿有效。
基本信号的产生以及时序图
系统采用独立的系统时钟CLK。为区分同时到达的外部读写信号,内部产生的读写信号分别用系统时钟的上升沿和下降沿触发,同时让产生的内部读写信号互斥,以得到间隔的对外部SRAM的读写信号;考虑到实际的需要以及器件和内部时钟的速度,按照四个脉冲宽度的方式产生读写信号,以保证在最小10个脉冲时间内各有一次有效读写。
外部读写时钟RCLK、WCLK先经过各自的使能控制信号REN、WEN进入CPLD;为保证读写互斥,外部读写异步锁存之后,读信号锁存后面的第一个上升沿,写信号锁存后面的第一个下降沿,并且用各自的前三个脉冲控制对方锁存第一个脉冲。
通过对各种情况的分析,基本读写脉冲OE和MW之间的最小间隔是一个脉冲,在有连续两个外部读或写的情况下所产生的两个OE或MW之间的最小间隔是两个脉冲。
基本信号产生的原理图和时序图如下:



图1 基本信号的产生

图2 基本信号的时序
读写地址信号
读写各有一个地址指针,每读出一个数读地址加一,读指针就指向下一个最早写入的数,经过SRAM阵列的最高地址后,又从起始地址开始,这样就可以达到先进先出的效果;只有有效的读写脉冲才能触发地址计数器;为使整个系统的动作时间一致,采用同步设计,读写都统一选择上升沿触发计数器变化;地址改变先于后面的/WE、/OE脉冲的产生。
地址发生器采用计数器宏单元。FIFO容量的大小由计数器决定,简单地增加计数器的位数和SRAM的数量,就可以扩大FIFO的容量。读写地址产生之后,经过一个总线复用器后输出作为对外部SRAM读写的地址线;总线复用器的选择由MW信号控制,只有在MW有效的时候才输出为写地址,其它时间都是读地址。
读写地址在由计数器产生经过总线复用时,会产生静态冒险;对于读写地址比较器,因为它锁存的时刻距离地址变化后两个脉冲,而且比较器输入的地址不经过总线复用,这就可以保证在比较器锁存的时刻地址比较结果已经稳定而且不受静态冒险的影响;对于到SRAM的读写地址,在读写控制脉冲/OE、/WE有效前还有两个脉冲的时间稳定,不会因为地址不稳定产生错误操作。
读写地址相等时比较器输出相等标志EF,FIFO半满,即除去最高位以外的地址都相等的情况输出半满标志EHF。


图3 读写地址信号的产生
FIFO状态信号
1、小于半满LHFULL
在上电或复位之后,LHFULL立刻有效。利用另一个触发器上电或者复位的清零,置位LHFULL触发器,使其有效,但在第一个写之后这个触发器就不再对LHFULL的变化有影响。在读写地址比较器输出半满的时候再来一个读,就判定为小于半满LHFULL。从大于半满到小于半满,需要经过两个连续的读,第一个读使比较器得到半满结果,第二个读使LHFULL有效。当经过一个写从小于半满到半满时,在读写地址比较器输出半满使LHFULL触发器状态可以变化后的下一个上升沿清除LHFULL触发器。触发器的使能端选为EHF,保证状态信号只在半满的时候才发生变化。
2、大于半满GHFULL
半满的时候再来一个写,GHFULL置位为高有效。GHFULL的设计原理同LHFULL,且不需要上电复位置位的处理。

图4 LHFULL和GHFULL的产生
3、全满FULL
当比较器输出结果为读写地址相等时,如果此时执行的操作是写,即在一个写之后读写地址才相等,就判定为全满,置FULL为有效。在全满状态下,如果有一个读,FULL就被清零。
1、 全空EMPTY
在上电或复位之后,EMPTY立刻有效。利用另一个触发器上电或者复位的清零,置位EMPTY触发器,使其有效,但在第一个写之后这个触发器就不再对EMPTY的变化有影响。当比较器输出结果为读写地址相等时,如果此时执行的操作是读,即在一个读之后读写地址相等,就判定为全空,置EMPTY有效。全空状态下,如果有一个写,EMPTY就被清零。

图5 FULL和EMPTY的产生
复位信号
只要RST信号为低就会产生有效的复位,读写的地址计数器都被清零,全满、大于半满状态清除,全空和小于半满置位,FIFO锁存输出为零。
与外部SRAM的连接及对SRAM的读写定时分析
CPLD与SRAM之间除去读写复用的地址和数据线以外,还需要有输出使能信号/OE,读写信号/WE,片选信号/CS。地址线、数据线、/OE和/WE如前所述;片选信号由地址高位译码产生,在这里是把最高位取反,得到两个片选信号。
读写信号的时序符合设计采用的IDT71128-12 SRAM的定时要求。
写操作:
写周期最小12ns,地址有效到结束写最小10ns,片选到写结束最小10ns,写脉冲最小10ns,数据有效到写结束最小7ns。地址在/WE之前建立,在/WE结束之后变化;数据保持到/WE无效再变化;在地址变化时,/WE、/CS不能都有效;在有效的写时,/CS、/WE为低;
读操作:
地址寻址时间最大12ns,读周期最小12ns,片选寻址时间最大12ns,输出使能到数据输出有效最大6ns。在读周期/WE为高,/OE为低,读周期结束时地址和数据应该保持不变。
写地址与MW脉冲的上升沿同时变化,在两个脉冲之后,写地址能够稳定,这时/WE才有效,并且由于连续两个读写脉冲之间最少有一个脉冲的间隔,而且MW比EW4要有延迟,同时总线选择也是由MW决定,就保证了写地址在/WE前有效并能保持到/WE结束;写数据的三态缓冲由EW4打开,可以保持到/WE结束。
读地址在上一个写结束之后有效,由于读地址变化比OE脉冲晚一个脉冲,/OE在OE结束时开始,保证了/OE开始的时候读地址已稳定和读周期时间符合要求;写数据已由EW4关闭,由于读写之间的最小间隔,且控制SRAM数据输出的/OE是ER5的反向,从SRAM中读出的数据在锁存入CPLD之后,满足保持时间的要求。
对外部SRAM数据的读写,见后图7、8。
四、为提高可靠性和满足些特殊需要做的处理
读写特殊时刻地址的产生
FIFO状态为全空的时候,再有一个读脉冲读地址会继续增加,由于此时内部已经没有有效数据,以后读出的数据就不正确,因此必须在全空以后禁止读地址的增加,同时置位VALID信号为无效。读地址计数器的使能端由EMPTY和ER1共同控制,在EMPTY的时候,读地址触发无效。
FIFO状态为全满时,再有一个写脉冲,由于已经达到全满的状态,此时的写操作就会把下一个地址的未读出的数据修改,以后再按照此读地址读出的就是错误的数据;因此在出现全满的情况下,一方面通过外部FULL标志指示,另外如果有写操作,则读地址也同样增加,这样可以保证,以后的读操作读出的数据是没经过修改的有效数据。在EW1和FULL同时有效的时候,让读地址计数器的使能端有效,也同时计数。

图6 特殊时刻对读地址的控制
数据写入SRAM
外部数据经过异步锁存,先写入CPLD内的寄存器,然后再由/WE写入SRAM;可能会遇到最大的延迟使上一个外部写所产生的/WE的最后锁存时刻上升沿位于下一个外部写脉冲之内,对SRAM来讲,在/WE上升沿锁存时刻数据就不能保持不变。因此,在每次从外部写入CPLD内寄存器时,先在有效的MW脉冲之内锁存一次,具体设计中选在EW2脉冲对应的下降沿。同时,因为对SRAM写入和读出的两个数据总线都要连接到相同的SRAM的I/O数据线上,为了区分,在写入数据的输出端加上三态缓冲,使能端由EW4控制,即/WE的反向。

图7 外部数据写入SRAM
从SRAM中读出数据的锁存输出
按照/OE产生之后,从外部SRAM读出数据直接锁存输出的结果来看,由于时序的变化,锁存输出数据的时间长度不一致,必须把锁存的数据再锁存一次以与外部读时钟RCLK的上升沿配合。
通过分析得到:即使是在最滞后的情况下,由上一个读RCLK从SRAM中读出的数据D[7..0]的锁存也会发生在下一个RCLK所包含的系统时钟的第三个脉冲之前;最快也在当前RCLK所包含的第六个CLK脉冲之后。因此最后输出的锁存时刻选在这两个时间之内,以保证最后锁存输出的一定是上一个RCLK读出的数据。


图8 读出数据的锁存输出
有效VALID信号的产生及作用
VALID信号是为缓冲码流的目的专门设计的。一般的MPEG2接口信号由D[7..0]、CLK、SYNC、VAL、ERR组成。ERR、SYNC可以不用,CLK采用读时钟RCKL,数据有效VALID需要合成出来,标志FIFO当前不处于全空状态,按照RCLK时钟读出的是有效数据。
设计要做到:在全空的情况下,最后一个有效数据锁存输出的时候VALID仍有效;全空信号无效情况下,有效数据出现之后才能有VALID信号。VALID信号的设计与读出数据的锁存输出密切相关;根据现在的设计,锁存输出的数据一定是前一个外部读时钟读出的数据,所以选在EMPTY置位以后,再经过一个RCLK的上升沿VALID才能被清除;在EMPTY被清除之后,再经过一个有效的/OE和一次读输出数据锁存后VALID才能置位。

图9 VALID信号的产生
五、设计结果及进一步的改进
根据本设计的所做的实际硬件电路,在实验室测试时,一端用码流发生器送入数据,另一端用与输入相同的时钟读出数据送到解码器解码,在现有的CPLD和SRAM的条件下(EPM7128SQC100-6,IDT71128-12),可以达到双向10MBps的读写。
所设计的FIFO可作为同步或者异步FIFO;通过增加系统资源、改变读写地址比较器的设计可以按照需要设计出将近FULL、EMPTY,HFULL等标志,偏差可以由外部置入,能够进一步增加FIFO状态控制的灵活性。
参考文献:
[1] MAX7000 Programmable Logic Device Family Data Sheet, July 1999, ALTERA
[2] IDT71128 CMOS Static SRAM Data Sheet, IDT
[3] IDT72201 CMOS SyncFIFO Data Sheet, IDT
[4] CPLD技术及其应用, 宋万杰、罗丰、吴顺君,1999年9月,西安电子科技大学出版社
[5] FPGA原理及应用设计,朱明程,1994年5月,电子工业出版社
作者简介:
任三军,1972年生,博士,主要研究方向为信号处理、数字视频
呼文杰,1972年生,博士,主要研究方向为信号处理、数字视频



评论


相关推荐

技术专区

关闭