异步FIFO结构及FPGA设计 跨时钟域设计

摘要:
异步FIFO可用于在两个不同的时钟系统之间快速方便地传输实时数据。如何设计一个高可靠性、高速的异步FIFO电路成为一个难点。写控制信号和写地址由写地址生成逻辑生成;读时钟部分通过读地址生成逻辑生成读控制信号和读地址。空/满标志是通过比较读和写地址生成的。电路的外部输入和内部时钟之间没有时间关系。由多个触发器的输出组成的写地址/读地址可以使用格雷码。
http://hi.baidu.com/hieda/blog/item/e8f8752465afb337c895593c.html

 

异步FIFO 结构及FPGA 设计

吴自信,张嗣忠. 单片机及嵌入式系统应用,2000  

摘要:首先介绍异步FIFO的概念、应用及其结构,然后分析实现异步FIFO的难点问题及其解决办法;在传统设计的基础上提出一种新颖的电路结构并对其进行综合仿真和FPGA实现。

1、异步FIFO介绍

在现代的集成电路芯片中,随着设计规模的不断扩大,一个系统中往往含有数个时钟。多时钟域带来的一个问题就是,如何设计异步时钟之间的接口电路。异步 FIFO(First In First Out)是解决这个问题一种简便、快捷的解决方案。使用异步FIFO可以在两个不同时钟系统之间快速而方便地传输实时数据。在网络接口、图像处理等方面, 异步FIFO得到了广泛的应用。

异步FIFO是一种先进先出的电路,使用在需要产时数据接口的部分,用来存储、缓冲在两个异步时钟之间的数据传输。在异步电路中,由于时钟之间周期和相位完全独立,因而数据的丢失概率不为零。如何设计一个高可靠性、高速的异步FIFO电路便成为一个难点。本文介绍解决这一问题的一种方法。

由图1可以看出:整个系统分为两个完全独立的时钟域——读时钟域和写时间域;FIFO的存储介质为一块双端口RAM,可以同时进行读写操作。在写时钟域部分,由写地址产生逻辑产生写控制信号和写地址;读时钟部分由读地址产生逻辑产生读控制信号和读地址。在空/满标志产生部分,由读写地址相互比较产生空/满标志。
异步FIFO结构框图

2、异步FIFO的设计难点

设计异步FIFO有两个难点:一是如何同步异步信号,使触发器不产生亚稳态;二是如何正确地设计空、满以及几乎满等信号的控制电路。

下面阐述解决问题的具体方法。

2.1 亚稳态问题的解决

在数字集成电路中,触发器要满足setup/hold的时间要求。当一个信号被寄存器锁存时,如果信号和时钟之间不满足这个要求,Q端的值是不确定的,并且在未知的时刻会固定到高电平或低电平。这个过程称为亚稳态(Metastability)。图2所示为异步时钟和亚稳态,图中clka和clkb为异步时钟。
异步FIFO结构及FPGA设计 跨时钟域设计第2张

亚稳态必定会发生在异步FIFO中。图中在异步FIFO中,电路外部的输入和内部的时钟之间是毫无时间关系的,因此setup/hold冲突是必然的;同在电路内部的两个没有关系的时钟域之间的信号传递,也必须会导致setup/hold冲突。

虽然亚稳态是不可避免的,但是,下面的设计改进可以将其发生的概率降低到一个可以接受的程度。

①对写地址/读地址采用格雷码。由实践可知,同步多个异步输入信号出现亚稳态的概率远远大于同步一个异步信号的概率。对多个触发器的输出所组成的写地址/读地址可以采用格雷码。由于格雷码每次只变化一位,采用格雷码可以有效地减少亚稳态的产生。

②采用触发器来同步异步输入信号,如图3中的两极触发器可以将出现亚稳态的几率降低到一个很小的程度。但是,正如图3所示,这种方法同时带来了对输入信号的一级延时,需要在设计时钟的时候加以注意。
异步FIFO结构及FPGA设计 跨时钟域设计第3张

2.2 空/满标志的产生

空/满标志的产生FIFO的核心部分。如何正确设计此部分的逻辑,直接影响到FIFO的性能。

空/ 满标志产生的原则是:写满不溢出,读空不多读。即无论在什么进修,都不应出现读写地址同时对一个存储器地址操作的情况。在读写地址相等或相差一个或多个地址的时候,满标志应该有效,表示此时FIFO已满,外部电路应对FIFO发数据。在满信号有效时写数据,应根据设计的要求,或保持、或抛弃重发。同理,空标志的产生也是如此,即:

空标志<=(|写地址-读地址|<=预定值)AND(写地址超前读地址)

满标志<=(|写地址-读地址|<=预定值)AND(读地址超前写地址)

最直接的做法是,采用读写地址相比较来产生空满标志。如图4所示,当读写地址的差值等于一个预设值的时候,空/满信号被置位。这种实现方法逻辑简单,但它是减法器形成的一个比较大的组合逻辑,因而限制了FIFO的速度。所以,一般只采用相等不相等的比较逻辑,避免使用减法器。
异步FIFO结构及FPGA设计 跨时钟域设计第4张

异步FIFO结构及FPGA设计 跨时钟域设计第5张

图5 是另外一种常用的设计,比较器只对读写地址比较是否相等。在读写地址相等的时候有两种情况:满或者空。所以,附加了一个并行的区间判断逻辑来指示是空还是满。这个区间判断逻辑将整个地址空间分为几个部分,以指示读写地址的相对位置。这种做法提高了整个电路的速度,但是也有其缺点。主要是直接采用读写地址等于不等于的比较逻辑来进行空/满标志的判断,可以带来误判。

3、新颖的FIF0空/满标志控制逻辑

3.1 对读写地址的分析

由以上对FIFO的分析可以看出,由地址直接相减和将地址相互比较产生空/满标志都不可取。如何简单地进行直接比较,又不提高逻辑的复杂程度呢?对地址加延时可以做到这一点。设读地址为Rd_bin_addr,用读地址Rd_addr产生读地址的格雷码Rd_next_gray_addr,将 Rd_next_gray_addr延一拍得到Rd_gray_addr,再将Rd_gray_addr延一拍得到Rd_last_gray_addr。在绝对时间上,Rd_next_gray_addr、Rd_gray_addr、Rd_last_gray_addr这些地址先后关系,从大到小排列,并且相差一个地址,如图6所示。
异步FIFO结构及FPGA设计 跨时钟域设计第6张
图6 经过延时后格雷码之间的关系

写地址的格雷码的产生也与此类似,即:Wt_next_gray_addr、Wt_gray_addr、Wt_last_gray_addr。利用这6个格雷码进行比较,同时加上读写使能,就能方便而灵活地产生空/满标志。

以空标志Empty的产生为例,当读写格雷码地址相等或者FIFO内还剩下一个深度的字,并且正在不空的情况下执行读操作,这时Emptr标志应该置为有效(高电平有效)。

即EMPTY<=(Rd_gray_addr=Wt_gray_addr)and(Read_enable=1)或EMPTY<=(Rd_next_gray_addr=Wt_gray_addr)and(Read_enable=1)

同理可类推满标志的产生逻辑。

3.2 基于延时格雷码的FIFO标志产生逻辑

异步FIFO结构及FPGA设计 跨时钟域设计第7张
图7 是使用上述思想设计的地址产生和标志产生的逻辑。首先,在地址产生部分,将产生的格雷码地址加一级延时,利用其前一级地址与当前的读地址作比较。其次,在空/满标志有效的时候,采用了内部保护机制,不使读/写地址进一步增加而出现读写地址共同对一个存储单元操作的现象。

3.3 仿真信号波形

利用图7电路设计的思想构造了一个256×8的FIFO,用MODELSIM进行仿真。图8为系统中主要信号对读空情况的仿真波形。

异步FIFO结构及FPGA设计 跨时钟域设计第8张

图8 读空情况的仿真波形图
图8 中,WDATA为写数据,RDATA为读数据,WCLK为写时钟,RCLK为读时钟,REMPTY为空信号,AEMPTY的几乎空信号,RPTR为读地址 WPTR为写地址,RGNEXT为下一位读地址格雷码,RBIN读地址二进制,RBNEXT为下一位读地址的二进制码。

由图8可以看出,由于读时钟高于写时钟,读地址逐渐赶上写地址,其中由AEMPTY信号指示读地址和写地址的接近程度。当这个信号足够长而被触发器捕捉到时,真正的空信号REMPTY有效。

4、电路优点的分析
由图7可见,该电路最大的瓶颈为二进制到格雷码和比较器的延时之和。由于这两个组合逻辑的延时都很小,因此该电路的速度很高。经测试,在Xilinx的FPGA中,时钟频率可达140MHz。另外,由于将异步的满信号加了一级锁存,从而输出了可靠而稳定的标志。

5、总结
在实际工作中,分别用图4、图5与图7中所示的逻辑实现了一个256×8的FIFO。综合工具为SYNPLIFY7.0,由Foundation Series 3.3i布局布线后烧入Xilinx公司的WirtexEV100ECS144。三者的性能指标比较见表1。

表1 三种不同设计的比较

逻辑设计方式时钟频率/MHz有效结果输出频率/MHzslice数目/个
图4所示逻辑16078.917
图5所示逻辑1609215
图7所示逻辑16014013


由表1可知,图7所示的异步FIFO的电路速度高,面积小,从而降低了功耗,提高了系统的稳定性。

免责声明:文章转载自《异步FIFO结构及FPGA设计 跨时钟域设计》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Spark SQL概述java代码POST方式请求SOAP下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

linux内核内存管理(zone_dma zone_normal zone_highmem)

Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。 Linux内核地址空间划分 通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间。注意这里是32位内核地址空间划分,...

WebRTC 之ICE浅谈

前言 ICE全称Interactive Connectivity Establishment:交互式连通建立方式。 ICE参照RFC5245建议实现,是一组基于offer/answer模式解决NAT穿越的协议集合。 它综合利用现有的STUN,TURN等协议,以更有效的方式来建立会话。 客户端侧无需关心所处网络的位置以及NAT类型,并且能够动态的发现最优的传...

使用nginx搭建rtmp服务器

一、软件需求   1、nginx源码包  下载地址:http://nginx.org/。笔者下载的是1.10.3。   2、pcre源码包。这是一个正则表达式库。nginx会用到这个开源库来做正则匹配。很多软件都会引用,比如php引擎编译的时候也会用到。   下载地址:https://ftp.pcre.org/pub/pcre/pcre-8.36.zip...

腾讯云平台--云直播和云点播

背景:最近兼职做的一个项目设计到直播模块,用的是腾讯相关的模块,网上资源甚少,可能比较简单,所以大家都吝于分享(苦涩ing),参考https://www.cnblogs.com/wilson-5133/p/12237734.html 常用名词介绍: 推流:通常是指将直播的语音视频信息传输到对应平台的媒体服务器上 拉流:将媒体服务器上的资源拉取到本地 Str...

Ubuntu 14.04 安装Visual studio Code

上一篇简单介绍了Ubuntu 14.04上如何创建、运行 hello world 程序。 这篇介绍Ubuntu 14.04如何安装Visual studio Code。 网上推荐的有通过Ubuntu Make来进行安装,但是我一直没有成功,所以这里通过下载Zip文件,解压方式安装。 1,下载地址:https://code.visualstudio.com/...

webrtc连接方法——TURN服务器和STUN服务器作用简介

WebRTC的TURN服务器是几乎所有WebRTC部署中必不可少的部分,连接WebRTC会话是在多个WebRTC服务器的协助下精心策划的工作,WebRTC中的NAT遍历服务器负责确保正确连接多媒体,这些服务就是STUN和TURN服务。 在浏览器(对等)连接WebRTC之间会话的三种方法: A、通过本地网络直接连接: 如果两个设备都在本地网络上,则无需做任...