文献标识码: A
DOI:10.16157/j.issn.0258-7998.183185
中文引用格式: 牛博,赵宏亮. 一种高可靠性高速可编程异步FIFO的设计[J].电子技术应用,2019,45(7):36-39,43.
英文引用格式: Niu Bo,Zhao Hongliang. Design of high reliability and high speed programmable asynchronous FIFO[J]. Application of Electronic Technique,2019,45(7):36-39,43.
0 引言
在现代的大规模ASIC设计中,常常涉及多时钟系统控制方式,这样就会产生不同时钟域数据传输的问题。比较好的解决方案就是使用异步FIFO(First In First Out)来实现不同时钟域数据传输的缓冲[1-2]。这是因为,异步FIFO只按指针的递增顺序写入数据,并以同样的顺序读出数据,不需要外部读写地址线,使用起来非常简单,这样既可以使相异时钟域数据传输的时序要求变得宽松,也提高了它们之间的传输效率。因此,异步FIFO在网络通信和数字信息处理等领域都有着广泛的应用[3-6]。而高性能异步FIFO的研究也就成为了大规模集成电路设计领域的研究热点之一,并取得了很多研究成果[7-10]。
例如,文献[7]中,采取了比较同步指针的方法来降低亚稳态出现的可能,这样做确实保证了比较时两个指针都是同步的,但是在进行大容量FIFO设计时,读、写指针的位数很多,同步模块会使用大量的寄存器,这样会大大增加设计成本,降低工作效率。而且该论文提到的设计方案在进行空满判断时,增加了一个地址位来标识读写指针的相对位置,这样做不仅占用了过多的逻辑资源,还降低了FIFO控制系统的可移植性。文献[8]中提到了一种通过判断格雷码前两位来划分存储区间,进而判断空满的方法,但是由于这种判断区间的划分方式是通过硬件的形式实现的,可编程性不好。本设计为了满足一款国产FPGA的芯片设计需求,在保证高可靠性的前提下,进一步增强了异步FIFO的可编程性,提出了一种基于格雷码的、可以对近空满示警阈值进行编程的异步FIFO,并且结合异步指针比较的方法提出了一种新的空满判断标准,进而提高了电路的工作速度和效率,最终设计出了一种具有高可靠性、高速及可编程性的高性能异步FIFO电路结构。
1 所提出的异步FIFO系统结构
所提出的异步FIFO设计思路是,在传统FIFO模块的基础上,通过对电路结构和状态判断依据的改进和优化,实现可靠性、可编程性和速度上的突破。传统的FIFO主要具有读、写和空满判断的功能,它不需要外部读写地址线,这样使用起来非常简单,因此它只能顺序写入数据,顺序地读出数据,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。本设计中增加了近空满示警功能,使用者可以对FIFO进行编程设置示警阈值,并且增加了近空和近满指示位来提示FIFO的状态,增加了FIFO的可编程性。FIFO模块的系统结构图如图1所示。
整个FIFO可以划分成四种模块:存储模块、指针产生模块、指针比较模块和标志位产生模块。r_clk为读时钟;w_clk为写时钟;data_in为写入数据;data_out为读出数据;ale_num为近空示警阈值;alf_num为近满示警阈值;r_ptr为读指针;w_ptr为写指针;al_empty为近空标志;al_full为近满标志;empty为空标志;full为满标志;alr_ptr为近空指针;alw_ptr为近满指针。
双端口SRAM具有两个完全独立的读、写端口,使用时可以选定一个端口写入data_in,另一个端口读出data_out,这样读操作和写操作互相独立,比较适合用来实现FIFO的功能。在图1中可以看出,一个FIFO可以分成读时钟域和写时钟域两个完全相互独立的时钟域。写指针模块根据w_clk产生w_ptr并且在w_ptr上叠加alf_num产生alw_ptr,w_ptr一方面会控制存储模块将data_in写入,写入的数据将由r_ptr控制读出,另一方面w_ptr和alw_ptr进入指针比较模块与读指针产生的r_ptr和alr_ptr进行比较,比较的结果进入标志位产生模块进行判断,产生空、满、近空和近满标志位,如果FIFO读空,则停止e_ptr,如果写满,则停止w_ptr。
在以上的系统设计中不难看出,系统指针间互相比较过程中数据的可靠性和空满判断过程中系统的精确度制约着系统性能的提升。因此,在第二节和第三节中,将分别详细阐述系统指针比较和空满判断的设计方案。
2 系统指针比较的设计方案
在数据的传输过程中,接收寄存器收到变化的数据时,如果数据的改变发生在时钟触发沿,那么会导致接受数据出现不稳定的状态,这种状态叫做亚稳态。进入亚稳态时,既无法预测该单元的输出电平,也无法预测何时输出才能稳定在某个正确的电平上。在这个稳定期间,将会输出一些中间级电平,或者可能处于振荡状态,并且这种无用的输出电平可以沿信号通道级联式传播下去。亚稳态的发生会使得FIFO出现错误,读、写时钟采样的地址指针会与真实的值之间不同,这就导致写入或读出的地址错误。亚稳态无法彻底消除,只能想办法将其发生的概率降到最低。传统的FIFO电路中为了解决亚稳态问题采取的方法是使用指针同步模块,经过同步的指针之间进行比较就不存在亚稳态的问题了。指针同步模块一般采用图2中所示的结构。假设clk1与clk2为异步时钟,当data1的改变发生在B2的触发沿处时,data2就有可能出现一个亚稳态,但是,这时B3捕获和发送的是上一个没有出现亚稳态时的数据,在下一个clk2时钟触发沿到来时,data2很可能已经趋于稳定,变为确定值0或者1,这样的话B3就是对一个确定值进行捕获。当然,data2也有可能无法在一个时钟周期中稳定,但是data3出现亚稳态的概率被极大地降低了。
使用比较同步指针的方法虽然可靠性高,但是当FIFO的数据深度很大时,指针一般都有很多位,这就需要对每一位都进行同步,极大地增加了寄存器的使用数量,增加了设计成本。
针对这种情况可以考虑使用格雷码指针。格雷码在相邻的两个码元之间只由一位变换(二进制码在很多情况下是很多码元在同时变化)。这就会避免指针变动的时候发生亚稳态现象。在写地址和读地址传输前,为了提高数据的稳定性,采用格雷码替换二进制码进行计数。这样的话就可以不使用指针同步模块,采取比较异步指针的方法,将两个异步指针直接进行比较,然后把比较后得出的标志位同步到想要的时钟域即可。本设计中指针产生模块的原理图如图3所示。
二进制指针产生模块的基本原理就是一个二进制加法计数器,每有一个时钟上升沿来临,它都会在之前输出数值的基础上加一,这样可以产生一个逐步累加的二进制指针,这个二进制指针进入半加器与近空满示警阈值相加产生一个用于近空满比较二进制指针,最后,这两种指针都会被格雷码产生模块转化为格雷码指针输出。设计中使用格雷码是为了降低亚稳态出现的概率,节省逻辑开销,降低设计成本;对指针类型进行扩充,增加了近空满示警阈值和近空满指针,是为了提升FIFO的可编程性。
3 空满判断的设计方案
由于FIFO的功能需要一边读一边写,因此实际上FIFO的容量并不等于同SRAM存储器阵列的实际容量,而是取决于读指针和写指针的相对速度。FIFO模块正确使用的初始状态一定是写指针在读指针之前,这样可以保证读出的内容都是经过写入的数据,经过一段时间的读写后,如果由于读指针追赶上了写指针而致使读写指针相同,说明存储其中的数据被读空,再进行下去会读出错误的数据;如果是写指针追赶上了读指针,则说明存储器被写满,再进行下去则会使未读出的数据被重写。以上两种情况是一定要避免的,所以如何判断空满状态,关系到FIFO的精确度和可靠性。
传统的做法是增加一位地址位来表示读写指针的相对位置,由于这种方法增加了一位地址位,使FIFO地址位的数量与SRAM地址位数量不同,降低了FIFO控制器的可移植性,而且增加的这一位地址位实际上增加了不必要的逻辑开销。考虑到设计中提到的FIFO增添了近空满示警标志位,所以可以借助近示警标志位来产生空满标志位。其状态判断原理如图4所示。
近空满示警标志位产生的原理是,将读写指针加上一个二进制数作为示警的阈值,这样就有了四种不同的指针,分别为读、写指针和近空满读写指针,使用这四种指针相互比较就能得出想要的结果。在FIFO使用过程中,如果近空满读指针等于写指针,说明读指针的速度比写指针速度快,近空满示警信号指示FIFO近空,这时只需要注意FIFO被读空,一旦读写指针相等就可以判断FIFO读空;如果近空满写指针等于读指针,则说明写指针的速度快,应指示近满,FIFO只存在写满的风险,一旦读写指针相等即判断FIFO写满。这种空满判断方法借助了示警标志位,不需要增加额外的指针位,提高了逻辑利用率和FIFO控制器的可移植性,而且这样做不需要对方向位进行运算,提升了运行速度。
4 仿真验证
本设计基于UMC 28 nm标准CMOS工艺,采用全定制方法进行电路设计。使用Hspice软件进行了电路仿真验证。仿真结果表明,提出的异步FIFO在1 V的标准电压下,最高工作频率为666.6 MHz,功耗为7.1 mW。具体仿真结果如图5所示。
对近空、空标志位进行验证时,使用的读时钟周期为1.5 ns(666.6 MHz),写时钟周期为2.5 ns(400 MHz),近空示警阈值设置为17,一共用到了9位二进制地址,按照格雷码的规律变化。仿真结果如图5(a)所示。图中r_ptr为读指针信号,w_ptr为写指针信号,均以3位十六进制数的形式表示;empty为读空信号(高有效);al_empty为近空信号(低有效)。可以看出,当读写指针相等时读空信号有效,并且近空信号提前17个读周期示警FIFO快要读空。
对近满、满标志位进行验证时,使用的读时钟周期为2.5 ns(400 MHz),写时钟周期为1.5 ns(666.6 MHz),近空示警阈值设置为15,一共用到了9位二进制地址,按照格雷码的规律变化。仿真结果如图5(b)所示。图中w_ptr为写指针信号,r_ptr为读指针信号,均以3位十六进制数的形式表示;full为写满信号(高有效);al_full为近满信号(低有效)。可以看出,当读写指针相等时写满信号有效,并且近满信号提前15个写周期示警FIFO快要读空。
5 结论
在传统FIFO结构的基础上,通过对电路结构和状态判断依据的改进和优化,提出了一种高性能异步FIFO电路结构。基于UMC 28 nm标准CMOS工艺进行电路设计、仿真与验证。仿真结果表明,提出的异步FIFO结构具有高可靠性、高速及可编程性等优点,能够满足国产FPGA芯片研发的系统需求。
参考文献
[1] 金大超,冷建伟.异步时钟域信号同步的实现[J].天津理工大学学报,2017,33(3):40-44.
[2] 刘杰,赛景波.基于DDR2 SDRAM乒乓双缓冲的高速数据收发系统设计[J].电子器件,2015,38(3):650-654.
[3] 庄洪毅.一种基于FX2与FPGA联用实现USB2.0通讯协议的方法[J].电子测量技术,2017,40(4):78-81.
[4] 冯国富,马玉齐,陈明,等.一种面向船联网的“北斗”异步FIFO多通道模型[J].微电子学与计算机,2017,34(2):1-5.
[5] 吴修英,黄嵩人.浮点型DSP中异步FIFO的研究与设计[J].电子世界,2018,1(69):145-146.
[6] 倪露,邹学玉.LZW的异步FIFO输入缓冲设计[J].电子测量技术,2015,38(4):19-23.
[7] 司岚山,吴海宏,王勇,等.一种大容量异步FIFO的设计与实现[J].微电子学,2013,43(3):405-408.
[8] 李赛,蒋林.OTN中异步FIFO的设计与实现[J].光通信研究,2015,191(5):55-58.
[9] 王齐双,黄震春,蒲海峰.基于FPGA的异步FIFO的设计方案及性能[J].弹箭与制导学报,2014,34(6):185-189.
[10] 肖静娴,戴亚文.基于FPGA的异步FIFO缓存设计[J].电子测量技术,2009,32(11):92-94.
作者信息:
牛 博,赵宏亮
(辽宁大学 物理学院,辽宁 沈阳110036)