一种异步FIFO数据余量检测方法

2011-06-07 05:53宋建港宋英雄张俊杰
电视技术 2011年15期
关键词:触发器指针时序

宋建港,宋英雄,张俊杰

(上海大学 特种光纤与光接入网教育部重点实验室,上海 200072)

0 引言

现代数字系统设计中往往含有多个时钟,即多时钟域,这必然会造成数据之间的传递在多时钟控制下完成,使用异步FIFO能有效地在两个不同时钟系统之间快速方便地传输实时数据。在信息处理、数据通信、图像处理等方面,异步FIFO应用广泛。在10G-EPON系统中,存在大量高速数据与低速数据的传输,需要使用大量的异步FIFO,根据实际需要,若能掌握异步FIFO的数据余量(本文将FIFO中已经存储的数据个数定义为数据余量),就能实时告诉外界FIFO已经写入了多少数据,外界就能依此判断剩下的空间能否写下下一帧数据,可以更有效地提高FIFO的利用率。

1 亚稳态

要想设计异步FIFO数据余量的检测方法,首先应该了解异步FIFO设计中涉及到的亚稳态问题。

在数字集成电路中,触发器必须满足建立时间(set⁃up time)和保持时间(hold time)的时序要求(其中建立时间是时钟翻转之前数据输入必须有效的最小时间,有效时间是在时钟沿之后数据输入必须仍然有效的最小时间)。触发器时序要求如图1所示,如果信号和时钟之间不满足这个时序要求,会使寄存器工作在一个不确定的状态,并且在未知的时刻会随机地固定到高电平或低电平,此时称寄存器进入亚稳态(metastability)。亚稳态会严重降低设计性能,破坏设计所能实现的功能。

异步FIFO中要对不同时钟域信号进行同步,必然会引起亚稳态,而且亚稳态无法彻底消除,只能将其出现的概率降到最低[1]。为了解决亚稳态问题,本文异步FIFO设计中采用格雷码和两级触发器[2]。

在异步FIFO中,读写地址指针有多位,若采用二进制计数进行同步,有可能有多位同时变化,这将很容易出现亚稳态,得出不相关的同步信号。而格雷码的相邻码之间只有一位发生改变,对其同步时,最多只有一个触发器进入亚稳态,稳定后输出的要么是当前地址,要么是前一地址,可以有效地解决亚稳态问题。

此外,虽然理论上亚稳态无法完全消除,但是当时钟周期满足公式Tclk≥20×Teq+Tsetup时(Tclk为同步器的时钟周期,Teq和Tsetup分别为触发器的输出延时和建立时间)[3],第一级触发器的输出Q1经过20×Teq的延时后仍不稳定的概率p非常小,第二级触发器的输出Q2仍不稳定的概率p2可忽略不计。两级触发器如图2所示,如果使用两级触发器,在同步异步信号的同时还可有效防止亚稳态的传播,更进一步保证了系统的可靠性。

2 异步FIFO数据余量检测方法

在同步FIFO中,初始化时读写指针都指向FIFO起始位置,每进行一次读写操作,相应地指针就增加一次,指向下一个位置。设FIFO深度为2N,当waddr=raddr时,FIFO为空,由于FIFO是一个环形结构,所以会出现写地址大于、等于和小于读地址3种情况。当写地址大于或等于读地址时,FIFO内数据余量为waddr-raddr;写地址小于读地址时,FIFO内数据余量为2N-(raddr-waddr)[4]。但是对于异步FIFO来说,因为异步FIFO的读写时钟是完全异步的,其数据余量不能直接采用这种方法计算。

基于此,本文提出一种异步FIFO数据余量的检测方法,首先把读地址同步到写时钟域,然后采用同步FIFO数据余量检测方法来进行检测。考虑到异步FIFO同步过程中出现的亚稳态问题,本文设计方法中,是先把读地址转化为格雷码形式并经过两级触发器同步到写时钟域中。另外,本文涉及方法中设定当waddr=raddr时,FIFO为空,当waddr_next=raddr时,FIFO为满(数据余量最大值比FIFO深度小1),如图3所示。所以写时钟域进行读写地址比较时,比较的是waddr_next与同步过来的读地址wclk_raddr。

为了检测异步FIFO的数据余量,构造一个计数器data_num,用来记录异步FIFO的数据余量。数据余量的产生方法如下:读地址raddr的格雷码形式rgray_addr同步到写时钟域后,还原为二进制自然码形式wclk_raddr,与写地址的下一个状态waddr_next进行比较,根据比较情况,使用相应的公式得出数据余量data_num的值。因为会出现wclk_raddr大于、等于或小于waddr_next的情况,分两种情况计算,当wclk_raddr大于或等于waddr_next时,data_num≤2addr_length-(wclk_raddr-waddr),当wclk_rad⁃dr小于waddr_next时,data_num≤waddr-wclk_raddr。

检测方法如图4所示,real_data_num表示实际的数据余量,用来与测试出的数据余量data_num进行比较看其是否准确。在某时刻waddr=d5H,同步到写时钟域的raddr信号wclk_raddr=3cH,根据文中检测方法得出的数据余量data_num=99H,而FIFO的实际数据余量是98H,比测试出的值小,但这并不是错误。因为检测data_num的目的是告诉外界FIFO中已经写入了多少数据,还有多少空间没有写,防止空间不够时数据帧往FIFO里写,当测得的数据余量偏大时,不影响达到此目的。本文设计方法得出的数据余量等于或者大于实际的数据余量,可以保证其有效性。

3 仿真验证

设计读、写地址指针长度为8,深度为28=256的异步FIFO,读、写指针初始位置都是00H。采用Verilog HDL硬件描述语言进行电路设计,使用Modelsim SE 6.5进行功能仿真,综合速度为204.918 MHz。根据本文设计方法,考虑几个边界问题,主要包括读、写指针由ffH跳变到00H时,写满后继续写时,以及读空后继续读时,经过仿真验证,本设计方法在涉及到的边界条件下均能正常工作,且得出的数据余量均符合设计要求。下面是部分仿真结果。

图5表示的当wclk比rclk快的情况下,写指针由ffH→00H时,测得的数据余量data_num由d2H→d3H,实际数据余量由d1H→d2H,符合设计要求。

图6表示的是当wclk比rclk慢的情况下,读指针由ffH→00H时,测得的数据余量data_num是03H,实际数据余量由02H→01H,符合设计要求。

从仿真结果可以看出,根据本文设计方法得出的异步FIFO数据余量均等于或者大于实际的数据余量,可以达到设计目的,得到有效的数据余量。

4 结束语

本文提出了一种异步FIFO数据余量的检测方法,并在Modelsim中进行了仿真验证,根据实验研究表明,这种方法能够实时有效地检测异步FIFO中数据余量,对提高FIFO的利用率具有显著作用,具有一定的应用价值和应用前景。

[1]谢文华,高文华.FPGA异步FIFO设计中的问题与解决办法[J].单片机与嵌入式系统应用,2009(8):33-35.

[2]CUMMINGS C E.Synthesis and scrip ting techniques for designing multi-asynchronous clock designs[C]//Proc.SNUG2001.San Jose:[s.n.],2001.

[3]李媛,卢宏生.异步FIFO设计的实现与时序分析[J].高性能计算技术,2007(7):35-39.

[4]张莹,阳璞琼.FIFO可靠性设计与研究[J].微处理机,2008(6):170-172.

猜你喜欢
触发器指针时序
清明
基于不同建设时序的地铁互联互通方案分析
基于FPGA 的时序信号光纤传输系统
为什么表的指针都按照顺时针方向转动
使用触发器,强化安全性
一种毫米波放大器时序直流电源的设计
基于改进Hough变换和BP网络的指针仪表识别
ARM Cortex—MO/MO+单片机的指针变量替换方法
几种常见触发器工作方式的讨论
对触发器逻辑功能转换的分析