异步fifo设计及时序约束设置
异步fifo的sdc约束

异步fifo的sdc约束
异步FIFO的时序约束是设计异步FIFO时非常重要的一步,它确保了数据在FIFO中的稳定传输。
在进行时序约束时,需要考虑时钟域的转换、数据传输的延迟以及时序分析等因素。
以下是针对异步FIFO的SDC约束的多角度回答:
1. 时钟域转换,在异步FIFO中,往往会涉及到不同时钟域之间的数据传输,因此需要在时序约束中明确指定数据从一个时钟域到另一个时钟域的延迟限制。
这样可以确保数据在时钟域之间的稳定传输。
2. 时钟频率,在SDC约束中,需要指定异步FIFO所使用的时钟频率。
这有助于综合工具正确地分析和优化FIFO的时序性能。
3. 数据传输延迟,对于异步FIFO的写入和读取操作,需要在SDC约束中指定数据传输的延迟限制。
这有助于确保数据能够按时到达目的地,并且在读取时能够正确地被采样。
4. 时序分析,在SDC约束中,需要进行综合和时序分析,以确保异步FIFO在不同工艺、温度和电压条件下都能正常工作。
这包括
时序收敛、时序边界的定义等方面的约束。
5. 时序路径约束,在异步FIFO的时序约束中,需要指定关键
路径和时序收敛路径,以确保FIFO的关键路径能够满足时序要求,
并且各个路径能够在设计规定的时钟周期内完成。
综上所述,异步FIFO的SDC约束涉及到时钟域转换、时钟频率、数据传输延迟、时序分析以及时序路径约束等方面。
合理设置这些
约束可以确保异步FIFO在实际应用中能够稳定可靠地工作。
Quartus II LPM使用指南(FIFO篇)

下图中是 SCFIFO 和 DCFIFO 的框图,其中,SCFIFO 中读写双方信号与时钟 clock 同步,DCFIFO 读写双方信号分别与读写时钟同步。
表一中列出 FIFO 中各个 IO 的详细描述: 表一 端口描述
端口
类型 是否必选
描述
Clock
输入
是
上升沿触发时钟
Wrclk
当该信号有效时,FIFO 会被认为已经读空,此时不能 再进行读操作;
准装满信号,当 usedw 大于参数 almost_full_value 或 相同时,该信号被激活,即是 full 信号被激活的预示; 准读空信号,当 usedw 小于参数 almost_empty_value 或相同时,该信号被激活,即是 empty 信号被激活的 预示; 显示当前 FIFO 中数据存量。
Rdreq
输入
是
Sclr
输入
非
Aclr
Q
输出
是
Full Wrfull Rdfull Empty Wrempty Rdempty Almost_full
输出
非
输出
非
输出
非
Almost_empty
输出
否
Usedw Wrusedw Rdusedw
输出
否
FIFO 篇
第 -5- 页
Rdreq Rdfull Rdempty Rdusedw 当 wrreq 有效时数据线上的数据通过 DATA 端口被写 入 FIFO 中 写请求信号,激发写入操作。 1.当 full(对于 SCFIFO)或 wrfull(对于 DCFIFO)有 效时,不能激活 wrreq 信号,参数 overflow_checking 设置为 ON,即在 full 状态下 FIFO 会自动无视写请求; 2.不能再 aclr 有效期间激活 wrreq 信号; 3. 使 用 Stratix 和 Cyclone 系 列 器 件 ( 除 了 Stratix, Stratix GX, 和 Cyclone 系 列 以 外 ) 需 要 将 write_aclr_synch 参数选择位 ON,确保符合限制条件。 读请求信号,激发读出操作。 1. 该信号 的作用在正 常模式下和 在预读模式 下的作用 有很多不同(详情见后文); 2.当 empty(对于 SCFIFO)或 rdempty(对于 DCFIFO) 有效时,不能激活 rdreq 信号,参数 underflow_checking 设置为 ON,即在 full 状态下 FIFO 会自动无视读请求; 清零端口,详情见后文
一种高性能异步FIFO的设计与实现

27卷 第8期2010年8月微电子学与计算机M ICROELECTRONICS &COM PUTERVol.27 No.8August 2010收稿日期:2010-05-13;修回日期:2010-06-08一种高性能异步FIFO 的设计与实现李 冬1,赵志凯2(1中国矿业大学信息与电气工程学院,江苏徐州221008;2中国矿业大学计算机科学与技术学院,江苏徐州221008)摘 要:提供了一种全新的高性能异步FIF O 设计方案.首先定义了F IFO 的通信协议和总体结构设计,然后围绕如何提高FIF O 性能依次论述了存储阵列设计、读写控制逻辑和空/满判断逻辑的设计方法.通过与FPGA 本身的F IF O 模块比较,该方案可以提高FI FO 性能30%以上.关键词:异步F IFO ;亚稳态;多时钟中图分类号:T P302 文献标识码:A 文章编号:1000-7180(2010)08-0145-04Design and Implementation of High Performance Asynchronous FIFOLI Dong 1,ZHAO Zhi kai 2(1School of I nformation and Electr ical Engineering,China U niversity of M ining and T echnolog y,Xuzhou 221008,China;2School of Co mputer Science and T echnolo gy,China U niversity of M ining and T echnology ,Xuzhou 221008,China)Abstract:T hi s paper presents a high performance FIF O desig n t hat interfaces subsystems on a chip working at different speeds.T he communication protocol and the ar chitecture of F IFO are pr oposed at first.A im at improving its operation speed,the design of stor ag e array,read/w rite control logic and full/empty status logic are described par ed with the ex isting F IFO block,the desig n s performance improv ement r atio is more than 30percent.Key words:asy nchr onous FIF O;meta stability;multiple clock1 引言随着计算机及电子器件的飞速发展,高速处理器中的逻辑越来越复杂,芯片规模不断扩大,在一个芯片中常常含有多个不同的高速时钟.当数据从一个时钟域传输到另一个时钟域时,确保数据在高速状态下的可靠传输就成为一个重要问题.异步FIFO (First In First Out)单元成为解决这类跨时钟域的数据可靠传输问题的不可缺少的元件.异步FIFO 是一个缓冲存储部件,用于在两个不同时钟域之间进行数据交换.数据从一个时钟域生成并写入FIFO,然后从另外的时钟域读出并被使用.为了提高FIFO 的性能,需要精心设计FIFO 的体系结构和电路实现.为此,文中对已有的工作进行了仔细研究.不同的设计有不同的读写控制策略和空/满逻辑判断方法.有些方法会导致性能降低,比如存储阵列会严重影响系统性能[1]、在设计中使用减法器来进行空/满逻辑判断也会降低系统性能[2].文中基于FIFO 存储电路的功能和特点,讨论了FIFO 设计的关键技术,重点探讨了高性能异步FIFO 的设计和实现方法.2 总体结构2.1 外部端口FIFO 是一种用来作为缓冲的存储器,它能对数据进行快速顺序的存储和发送,主要用来解决不同速率器件间的速率匹配问题.图1是采用FIFO 连接的数据通信系统.图1中,数据发送系统和数据接收系统采用不同的工作时钟.数据发送系统产生数据,数据接收系统使用数据.FIFO 模块通过不同的端口分别与数据发送系统和数据接收系统连接,其中与数据发送系统连接的端口统称为 写端口!,与数据接收系统图1 采用F IFO 连接的数据通信系统连接的端口统称为 读端口!.写端口包括四组信号,分别是:(1)req put 来自数据发送系统的发送请求信号;(2)data put 数据发送总线;(3)full 该值为1时表示FIFO 存储空间满;(4)clk put 数据发送系统工作时钟.读端口包括五组信号:(1)req get 来自数据接收系统的数据请求信号;(2)valid get 标志接收的数据是否有效;(3)empty 该值为1时表示FIFO 存储空间空;(4)data get 数据接收总线;(5)clk get 数据接收系统工作时钟.2.2 通信协议FIFO 的写端口和读端口分别遵循不同的通信协议.写端口的数据通信协议如下:当数据发送系统有数据需要传输时,在clk put 时钟上升沿来临之前,数据需要放在dataput总线上,并给出req put 信号,如果在时钟上升沿来临时,full 信号为低电平,则数据被写入FIFO.如果时钟上升沿来临时,full 为高电平,则数据发送系统需要一直等待full 信号变为低电平,数据才能正常发送.如图2所示,在时钟沿A,数据被正确写入FI FO;在时钟沿B,数据不能被写入FIFO,需要等待FIFO 腾空.图2 F IFO 写端口的时序图读端口的数据通信协议如下:当数据发送系统有数据需要传输时,在clk get 时钟的上升沿来临之前,数据接收系统首先发送req g et 信号,如果FIFO 中存在有效数据,那么数据将被放在data get 数据总线上,同时valid g et 和em pty 信号也被置为相应的值.在clkget 的下一个时钟沿来临时,数据接收系统可以根据后两个信号来决定数据总线上的data get 数据是否有效.valid get 表示当前读取的数据是否有效,empty 表示当前数据读取之后,FIFO 是否为空,在系统初始化时,empty 的初值置为0.2.3 结构设计FIFO 的总体结构如图3所示.与RAM 相比,FIFO 对存储阵列按顺序读写,不需要额外的地址端口.图3 FI FO 的总体结构FIFO 的存储阵列类似于一片双端口的RAM,可以同时执行读操作和写操作,读写操作受控于不同的时钟.空/满状态判断逻辑根据读、写指针的变化实时检测当前FIFO 的空/满状态.读控制和写控制逻辑分别根据相应的读写信号,控制存储存储阵列执行读操作和写操作.3 存储阵列与读写控制逻辑改善存储阵列与读、写控制逻辑是提高FIFO 性能的有效途径.3.1 存储阵列设计当前广泛使用的片上存储单元有SRAM 、DRAM 和Flash 等多种形式.由于对FIFO 进行读、写操作的性能与存储阵列的性能密切相关,因此我们选择SRAM 来构建存储整列.SRAM 是静态随机存取存储器,它的每一个单元由6个尺寸不同的晶体管构成[1],它存储数据是依靠晶体管之间的正反馈结构.在执行读写操作时,由于它既不需要像DRAM 那样的预充电-求值过程,也不需要Flash 那样的编程-擦除过程,因而效率较高.146微电子学与计算机2010年通过对晶体管尺寸的优化,读写性能可以得到较大改善.为了加快读操作的时间,SRAM采用了灵敏放大单元,以便加快读操作的时间并提高数据的可靠性.多个SRAM单元排列在一起构成了存储阵列.为了便于同时优化读、写性能,阵列的排列需要尽量接近方形.3.2 读写控制逻辑FIFO的读写控制逻辑控制读写指针和存储阵列进行工作.FIFO对存储阵列按地址依次读写.系统初始化之后,FIFO的读写指针均指向0地址,每执行一次读操作或者写操作,相应的读写指针顺序加1.当指针移到存储阵列的最后一个位置后,下一个操作会使指针返回地址0.读写指针如此周而复始地变化,FIFO空间得到了最有效的运用.写指针总是指向下一个要写入的单元,每执行完一次写操作后,写指针指向下一个将要写入的存储单元.在写操作之前,需要判断写指针指向的单元是否可以写入,这需要空/满判断逻辑的信号支持.在clk put时钟的上升沿,如果req put信号有效,并且full无效,那么数据data put在这一时钟沿被写入存储阵列,同时写指针加1指向下一个将要被写入的单元.如果full信号有效,那么req put信号需要一直保持,直到full信号无效数据才能被写入.与此类似,读指针总是指向当前被读出的单元.每执行完一次读操作后,读指针指向下一个将要读出的存储单元.在读操作之前,需要判断读指针指向的单元是否可以读出,这需要空/满判断逻辑的信号支持.在clk get时钟的上升沿,如果req get信号有效,并且empty无效,那么数据在这一时钟沿被放在data g et数据总线上,同时读指针加1指向下一个将要被写入的单元,valid get信号置为有效.如果empty信号有效,那么valid get信号被置为无效,req get信号需要一直保持,直到empty信号无效数据才能被读出.对于数据量比较大的异步通信系统来说,上述读写控制逻辑可以实现每个时钟周期写入或者读出一个数据项,大大提高了数据读写的效率.同时,时序控制逻辑简单,便于实现.我们采用verilog语言实现了上述读写控制逻辑,并通过逻辑综合在FP GA中进行了实现.4 空/满判断逻辑分析4.1 空/满判断逻辑在FIFO进行读写操作之前,需要正确判断FI FO的存储状态,以免出现误读或者误写.正确判断FIFO的空/满状态是FIFO设计的关键点之一.空/满状态判断的原则是写满而不溢出,读空而不多读[3],以免造成数据丢失或者误用.如何设计FIFO[4]的空/满状态判断逻辑关系FIFO的读写性能.当读写指针在同一时刻指向同一个内存位置时,FIFO处于空或者满状态,否则为非空非满状态,FIFO可以随意执行读写操作.然而,当读写指针重合时,具体是空还是满要通过逻辑进行分析.传统的判断方法是另外设置一个状态位[5],作为最高位,其余作为地址位.当系统初始化时,状态位和地址位均置0.当读写指针的地址位和状态位全部吻合时,FIFO处于空状态;当读写指针的地址位相同而状态位不同时,说明写指针比读指针多循环一次,FIFO处于满状态.这种状态判断逻辑工作频率低且占面积大,不适用于高度集成化和快速数据处理的场合[3].为了快速判断空/满状态,我们采用为每个存储单元附加一个锁存器来标志单元的存储状态.当某个单元被写入数据时,锁存器被置1表示单元处于满状态.当某单元的数据被读出时,锁存器的状态被置0,表示单元处于空状态.假设第i个单元的满状态用f i表示,空状态用ei表示.对于含有N个存储单元的FIFO来说,可以分别采用式(1)和式(2)来进行空/满状态判断.公式中的AND和OR分别表示逻辑与!操作和逻辑或!操作.full=ANDNi=1(f i)(1)em pty=ORNi=1(ei)(2)以上判断逻辑如果用组合逻辑实现,虽然运行效率较高,但是逻辑规模大,需要占用较大的芯片面积.为了克服这个缺点,采用动态逻辑来实现状态判断,从而在减小芯片面积的同时获得更高的运行效率.图4是采用动态逻辑来判断含有4个存储单元的FIFO的空/满状态判断的电路图.从图中可以看出,空/满判断逻辑只需要较少的芯片资源.对于含有更多存储单元的FIFO来说,判断逻辑可以进行相似的扩充.4.2 亚稳态的避免异步电路设计需要妥善处理亚稳态的问题.当异步信号在不同的时钟域中传输时,由于工作时钟不同,如果某信号在变化的过程中恰好被采样,那么采样信号的状态变得不可确定,这种现象称为亚稳态[1].147第8期李冬,等:一种高性能异步FI FO的设计与实现图4 采用动态逻辑的空/满状态检测电路在异步FIFO的设计中,发送端口和接收端口采用不同的工作时钟.而空/满判断逻辑与两个时钟均密切相关,因而可能产生亚稳态的问题.一旦产生亚稳态,说明信号电平不稳定.如果这种状况持续的时间大于一个时钟周期,不稳定的数据状态就会造成下一级的触发器错误接收或者发送电平信号,从而影响整个FIFO的数据传输.在异步FIFO数据传输过程中,由于发送端和接收端的时钟不同,建立时间和保持时间的冲突不可避免,因而一定会产生亚稳态的问题.解决亚稳态的问题需要从分析时序电路的特性入手.对于时序器件来说,信号相对于时钟满足建立时间和保持时间是保证信号被可靠采样的前提.根据亚稳态产生的条件,可以对不同时钟域输入的信号采用双所存器连续锁存两次.如果第一个锁存器锁存到一个不稳定的电平信号,在经过一个时钟后可能趋于稳定,从而得到一个稳态的信号值.虽然亚稳态不可避免,但采用这种双所存结构之后,电路出现亚稳态的概率可以将到非常低的程度.5 实验验证采用FPGA对文中设计的FIFO的控制逻辑和状态检测逻辑进行了验证.数字逻辑部分采用了Verilog硬件描述语言进行实现.验证实验在Falcon -E25T G开发平台上进行,使用的FPGA为Xilinx 的SPARTAN3E.设计和仿真环境采用Xilinx的ISE9.1i.FIFO的存储体部分例化了FPGA提供的块RAM.FIFO的数据宽度为8位,深度为4096.通过实验,文中设计的FIFO单元的读写性能可以达到400MH z左右,比ISE工具自动生成的FIFO单元的工作频率提高了约100MH z,FIFO性能提高幅度达到30%以上.与ISE自动生成的FIFO相比,本文中FIFO所占用的FPGA资源有所增加,约增加15%左右.在高性能设计中,在增加少许资源的情况下获得显著的性能提升是值得的.6 结束语文中讨论了高速异步FIFO电路的设计方法,通过精心设计FIFO体系结构、读写电路和状态检测电路,可以实现FIFO工作性能的大幅提升.文中的设计用于FPGA设计,可以有效解决多时钟域之间的高速数据通信问题.参考文献:[1]Rabaey J M,Chandrakasan A,Nikolic B.数字集成电路∀∀∀电路、系统与设计[M].2版.周润德,译.北京:清华大学出版社,2004.[2]刘洪波,龙娟,郝晓莉,等.异步状态判断的研究与设计[J].微电子学与计算机,2007,24(3):81-84.[3]徐海铭,程月东.高速异步FI FO设计[J].电子与封装,2009(6):14-16.[4]Chelcea T,N owick S M.A low-latency FIF O for mix ed-clock systems[C]//Pro ceedings of the IEEE Computer Societ y A nnual W orkshop on VL SI(W VL SI 00).Orlan do,2000:119.[5]于海,樊晓桠.基于F PGA异步F IFO的研究与实现[J].微电子学与计算机,2007,24(3):210-213.作者简介:李 冬 女,(1989-).研究方向为电子电路.赵志凯 男,(1983-),博士研究生.研究方向为机器学习、模式识别.148微电子学与计算机2010年。
quartus 异步fifo用法 -回复

quartus 异步fifo用法-回复quartus异步FIFO用法引言:在数字电路设计中,FIFO(First In First Out)是一种常见的数据存储器,它允许数据以先进先出的顺序进出。
在使用Quartus进行FPGA设计时,异步FIFO是一种非常有用的工具,它可以帮助我们处理不同速度的数据流,并实现数据的缓冲和流量控制。
本文将介绍Quartus异步FIFO的基本概念和使用方法,并给出一些实例。
第一部分:Quartus异步FIFO概述1.1 什么是异步FIFO?异步FIFO是一种数据存储器,在其中数据可以以不同速度进入和退出。
与同步FIFO不同,异步FIFO的读写时钟可以是不同的,这使得它可以处理速度不匹配的数据流。
Quartus提供了异步FIFO的库函数和IP核,使得它可以在FPGA设计中方便地使用。
1.2 Quartus异步FIFO的特点Quartus异步FIFO具有以下特点:- 可以使用不同的时钟频率进行读写操作。
- 可以配置不同的缓冲深度来满足特定的设计需求。
- 可以实现流量控制和数据的重排序。
- 可以支持并行读写和读写使能信号。
- 可以适应不同的数据宽度和时钟域要求。
第二部分:Quartus异步FIFO的使用方法2.1 创建异步FIFO在Quartus中创建异步FIFO的方式有两种:使用库函数和使用IP核。
使用库函数创建异步FIFO的步骤如下:- 首先,在Quartus中打开设计工程,并创建一个新的源文件。
- 然后,将异步FIFO的库函数导入到源文件中,以便在设计中调用它。
- 接着,实例化异步FIFO,并通过参数配置其属性,例如宽度,深度,时钟域等。
- 最后,将异步FIFO连接到其他逻辑模块,完成设计。
使用IP核创建异步FIFO的步骤如下:- 首先,在Quartus中打开设计工程,并创建一个新的IP核。
- 然后,在IP核的界面中选择合适的FIFO类型和配置参数。
- 接着,将异步FIFO实例化到设计中,将其连接到其他逻辑模块。
fpga中异步信号处理

fpga中异步信号处理
在FPGA中进行异步信号处理是一项重要的任务,因为许多
输入信号可能以不同的时钟信号、频率或相位到达FPGA。
处
理这些异步信号需要特殊的技术和电路设计。
以下是一些常用的异步信号处理方法:
1. 异步复位器:在FPGA中,可以使用异步复位器来处理异
步复位信号。
异步复位器可确保在输入复位信号到达时立即将FPGA重置为初始状态,而不需要等待时钟信号。
2. 异步触发器:通过使用异步触发器,可以将异步输入信号转换为同步的信号。
异步触发器具有单独的时钟信号和数据输入,当触发信号到达时,会将数据输入传递到输出。
这样,异步信号就可以与FPGA中的同步逻辑一起使用。
3. FIFO缓冲器:FIFO(First-In-First-Out)缓冲器用于将异步
信号转换为同步信号,并进行缓冲。
当异步输入信号到达时,它会存储在FIFO中,然后由同步时钟信号按顺序输出。
这样
可以确保异步信号按照正确的顺序被处理。
4. 时序分析和约束:在设计FPGA中的异步信号处理电路时,需要进行时序分析和约束。
时序分析可以帮助确定异步信号到达的时机、时钟边沿等。
时序约束可以确保异步信号处理电路能够按照预期的时序工作。
需要注意的是,异步信号处理在FPGA设计中需要特别小心,
因为异步信号可能导致不稳定的或不确定的行为。
因此,正确设计和验证异步信号处理电路是至关重要的。
异步FIFO的VHDL设计

异步FIFO的VHDL设计下面是一个异步FIFO的VHDL设计示例:```vhdllibrary ieee;use ieee.std_logic_1164.all;entity AsyncFIFO isgenericDATA_WIDTH : natural := 8; -- 数据宽度FIFO_DEPTH : natural := 16 -- FIFO深度portclk : in std_logic; -- 时钟信号rst : in std_logic; -- 复位信号read_en : in std_logic; -- 读使能write_en : in std_logic; -- 写使能read_data : out std_logic_vector(DATA_WIDTH-1 downto 0); -- 读数据write_data : in std_logic_vector(DATA_WIDTH-1 downto 0); -- 写数据full : out std_logic; -- FIFO满标志empty : out std_logic -- FIFO空标志end AsyncFIFO;architecture Behavioral of AsyncFIFO istype buffer_array is array (FIFO_DEPTH-1 downto 0) ofstd_logic_vector(DATA_WIDTH-1 downto 0);signal buffer : buffer_array; -- 数据缓冲区signal wr_ptr : natural range 0 to FIFO_DEPTH-1; -- 写指针signal rd_ptr : natural range 0 to FIFO_DEPTH-1; -- 读指针signal count : natural range 0 to FIFO_DEPTH-1; -- 缓冲区中数据个数beginprocess (clk)beginif rising_edge(clk) thenif rst = '1' thenwr_ptr <= 0;rd_ptr <= 0;count <= 0;elseif write_en = '1' and full = '0' then -- 写使能且FIFO非满buffer(wr_ptr) <= write_data;wr_ptr <= wr_ptr + 1;count <= count + 1;end if;if read_en = '1' and empty = '0' then -- 读使能且FIFO非空read_data <= buffer(rd_ptr);rd_ptr <= rd_ptr + 1;count <= count - 1;end if;end if;end if;end process;full <= '1' when count = FIFO_DEPTH-1 else '0';empty <= '1' when count = 0 else '0';end Behavioral;```在上面的代码中,`DATA_WIDTH`和`FIFO_DEPTH`是异步FIFO的泛型参数,可以根据实际需求进行配置。
高速异步FIFO的设计与实现

高速异步FIFO的设计与实现2 异步FIFO的实现读时钟2.1 FIFO设计的难点如何同步异步信号,使触发器不产生亚稳态是设计异步FIFO的难点。
国内外解决此问题的较成熟方法是对写地址膜地址采纳格雷码,本文也挺直采纳格雷码。
异步FIFO设计的另一个难点是如何推断FIFO的空/满状态。
为了保证数据正确的写入或读出。
必需保证异步FIFO在满的状态下.不能举行写操作:在空的状态下不能举行读操作。
通常状况下将存储器组织成一个环形链表。
满/空标记产生的原则是:写满不溢出.读空不多读。
即无论在什么状况.都不应浮现读写地址同时对一个存储器地址操作的状况。
在读写地址相等或相差一个或多个地址的时候,满标记应当有效。
表示此时FIFO 已满,外部电路应停止对FIFO发数据。
在满信号有效时写数据应按照设计的要求,或保持、或抛弃重发。
同理,空标记的产生也是如此。
为了更好的推断满/空标记。
采纳在FIFO本来深度的基础上增强一位的办法,而由该位组成的格雷码并不代表新的地址。
也就是说3位格雷码可表示8位的深度,若再加一位最高位MSB,则这一位加其他三位组成的格雷码并不代表新的地址,也就是说格雷码的0100表示7,而1100仍然表示7,只不过格雷码在经过一个以0位MSB的循环后进入一个以1为MSB的循环,然后又进入一个以0位MSB的循环。
其他的三位码仍然是格雷码。
举例解释:一个深度为8字节的FIFO怎样工作(用法已转换为二进制的指针),N=3,指针宽度为N+I=4。
开头rd_ptr_bin和wr_ptr_bin均为“0000”。
此时FIFO中写入8个字节的数据。
wr_ptr_bin=“1000",rd_ptr_bin=“0000”。
固然,这就是满条件。
现在,假设执行了8次的读操作.使得rd_ptr_bin=“1000”,这就是空条件。
另外的8次写操作将使wr_ptr_bin等于“0000”,但rd_ptr_bin仍然等于“1000”,因此,FIFO为满条件。
基于FPGA的异步FIFO设计与实现

基于FPGA的异步FIFO设计与实现王伟国;张振东【摘要】随着现代数字电路系统密度和规模的不断扩大,一个系统中通常会包含多个时钟,因此不同时钟之间的数据传输成为亟待解决的问题.而一种可靠易行的解决方案就是异步FIFO.异步FIFO需要非常严格的多时钟技术,难以作出正确的设计合成和分析.本文提出了一种利用格雷码作为读写地址计数器的异步FIFO的设计方法,有效的避免了数据在不同时钟时间传输时遇到的亚稳态问题.并给出了综合仿真结果.%With the expanding of the density and scale of modern digital circuitry,a system will contain multiple clock.Therefore,the transfer of data between different clock becomes a serious problem needs to be solved.A reliable and feasible solution is asynchronous FIFO.Asynchronous FIFO require very strict clock technology,it is difficult to make the correct design of synthesis and analysis.This paper presents a design method of asynchronous FIFO which based on read/write counter in terms of gray code.This method effectively avoid the metastable state in the data transmission between different clock and given a comprehensive simulation results.【期刊名称】《聊城大学学报(自然科学版)》【年(卷),期】2012(025)003【总页数】6页(P79-84)【关键词】多时钟;异步fifo;verilog;HDL;格雷码【作者】王伟国;张振东【作者单位】中国科学院长春光学精密机械与物理研究所,吉林长春130033;中国科学院长春光学精密机械与物理研究所,吉林长春130033/中国科学院研究生院,北京100039【正文语种】中文【中图分类】TN4330 引言随着现代数字电路系统的实时数据处理能力的不断提高,逻辑电路的复杂程度和内核处理器的运算速度也快速增长,在使得一些复杂算法得以实现的同时也加剧了快速CPU与慢速外设之间的冲突.异步FIFO大量数据缓存的能力成功的解决了这一问题,但专用的高速异步FIFO芯片价格昂贵,且容量受限,随着现场可编程逻辑器件容量和速度的不断提高,利用现场可编程逻辑器件设计异步FIFO成为可行的方法.本文首先讨论了异步FIFO设计中经常出现的亚稳态问题和二进制计数器多位同时改变的问题,并给出解决办法,然后讨论了两种格雷码计数器的形式并作出比较,最后给出一种以格雷码为读写地址计数器的异步FIFO的设计方法和在设计异步FIFO时必须要注意的细节.1 多时钟电路中的亚稳态问题在一个时序电路中,合理的建立时间和保持时间是触发器正常工作的前提条件.对于下降沿触发的触发器而言,下降沿触发之前输入数据持续的最短时间是建立时间(setup time),下降沿触发之后输入数据持续的最短时间是保持时间(hold time).当电路时序不能满足setup time/hold time的要求时,系统时序就会出现混乱.在异步时序电路中,不同时钟之间是不存在任何关系的,必然会产生建立时间和保持时间冲突.解决系统时序问题常用双锁存器法如下图1所示,即在不同时钟之间传输数据时连续锁存两次.但是这种方法只是保证了电平的稳定,而在实际的系统中还需要FIFO作为不同时钟之间传输多位数据的接口.图1 避免亚稳态出现的双锁存器法2 异步FIFO指针对于同步FIFO来说,使用一个计数器计算读出和写入到FIFO缓存器中的数据量,计数器在只有写没读是递增,只读没写是递减,既读又写和没读也没写时保持不变.当计数器到达设定值时FIFO满信号置位,为零时空信号置位.在异步FIFO中,由于这种计算数据个数增减的计数器会被两个不同的时钟控制,因此这种计数器不能使用.所以,为了决定FIFO“空”和“满”状态,读指针和写指针必须相互比较.设计FIFO最主要的困难是生成FIFO指针和找到一个决定FIFO“空”和“满”状态的可靠方法.在FIFO设计中,读指针和写指针总是指向下一个要读和写的地址空间.当读或写操作完成后指针自动递增,当FIFO是空时读指针和写指针相等,当FIFO满时读指针和写指针也是相等.一种解决的方法是增加一个多余的MSB位来区分两种状态,当写指针递增超过地址范围时,写指针会递增MSB位,其他位清零,读指针同样也是.当读指针和写指针的MSB位不同时,意味着写指针比读指针多走了一圈,当MSB位相同时意味着走的圈数相等(如图2所示)图2 增加多余MSB后区分FIFO空和FIFO满的方法示意图当FIFO存储缓冲区需要(n-1)位地址时,地址指针用n位,当指针相等(包括MSB位)时空标志置位,当指针低(n-1)位相等且MSB位不等时满标志置位.2.1 二进制FIFO指针的情况二进制地址计数量会有多个位同时变化,因此在把二进制量在不同时钟域之间同步时会出现问题.一个解决的方法是取样并把周期计数量寄存在一个保持寄存器中,并发出一个ready信号,新时钟域收到信号并发出确认信号,这样变化的计数量就安全的传送到新时钟域.用这种方法不会产生上溢和下溢,因为当读指针递增到与写指针相等时,空信号置位,取样的写指针不反映当前写指针的值,而是小于当前值,故永远不能产生下溢,满信号也是如此.最常用的解决方法是用格雷码计数器,格雷码在每个时钟只有一位变换可以极大的减少在同步计数时错误的发生.3 格雷码计数器设计格雷码计数器的方法有很多,这里介绍二种简单直接的方法.下面详细介绍两种方法.3.1 格雷码计数器中的问题为了更好的理解把n-bit计数器转换成(n-1)-bit计数器时出现的问题,先考虑一下一个双重4-bit和3-bit格雷码计数器的例子如图3.图3 4-bit格雷码计数器示例及转换成3-bit格雷码时出现的问题在4-bit计数器中除了MSB位其余位关于中间对称,我们把2nd MSB位反相后,上半部分与下半部分的LSBs便相等.但是经过反相操作后整体便不是格雷码了,例如15(1100)到0(0000)的转变过程有两个bits变化,在下面的第一种格雷码计数器中会有解决方法.3.2 第一种格雷码计数器图4是第一种计数器的框图并是双重格雷码计数器中两个bits同时跳变的解决方法.其中假设输出寄存器的值是格雷码(ptr),此格雷码被输出到格雷码到二进制的转换器中,然后通过一个有条件递增的加法器并输出下一个格雷码值(gnext),连接到输出寄存器的输入端,如框图上半部分所示.(n-1)-bit格雷码简单地通过n-bit格雷码的2个MSBs的异或操作产生,(n-2)个LSBs不变.图4 第一种格雷码计数器示意图及其如何避免了两位同时跳变问题3.3 第二种格雷码计数器此种风格的格雷计数器(如图5所示)用了两组寄存器避免了把格雷码转换成二进制数的步骤.而且第二组寄存器也可以直接用来寻址FIFO存储器.n-bit格雷码指针仍然需要同步到不同的时钟域中.二进制指针可以更容易的通过计算产生“几乎满”和“几乎空”信号.因此在本论文的设计中用此种风格的格雷码计数器.图5 第二种格雷码计数器工作示意图4 总体设计及“空”和“满”信号的产生总体设计如图6所示,本设计方案共有四个模块,双口RAM模块,读控制模块,写控制模块,格雷码同步模块.写控制模块主要是当写使能信号有效且写满信号无效时产生写地址并实行地址递增功能,读控制模块实现相似功能,双口RAM模块用来使缓冲数据其读写动作可同时进行.4.1 “空”和“满”信号的产生“空”信号的产生比较简单,只需同步到读时钟域的写地址格雷码与n-bit的读指针的格雷码完全相等即可代码如下图6 异步FIFO总体设计框图及其信号说明但是,“满”信号的产生就没那么容易,简单地用n-bit格雷码作比较判断“满”信号是不可靠的.因为格雷码除了MSB位外是对称的如图3所示.在图3中假如写指针和读指针都指向地址7,此时写指针递增一次后,写指针指向地址8,读指针和写指针相比较,除了MSB位不同外其余各位均相等,满信号此时有效,但这是不符合实际情况的,错误的.这也是为什么在图4中应用双重n-bit格雷码计数器的一个原因.正确判断满信号的条件是:读写指针的n-bit格雷码的前两个MSBs都不相等,其余的写指针和同步读针相等.代码如下4.2 不同时钟速度因为异步FIFO被两个不同的时钟控制,很明显两个时钟运行在不同的速度下.当把较快的时钟同步到较慢的时钟时,会有一些计数值被跳过.当被同步的格雷码递增两次只被取样一次时也不会出现亚稳态问题,因为亚稳态出现在同步时钟上升沿附近有多位同时跳变时,而在两个同步时钟沿之间有格雷码跳变两次,第一次跳变距离同步时钟条边沿较远,只有第二次跳变在同步时钟沿附近,故不会产生亚稳态.当较快的格雷码计数器在较慢时钟沿之间递增多于一次,不会出现已经溢出却没有检测到的现象,因为同步到写时钟域的读指针滞后于当前的读指针,而写指针只会小于或等于同步读指针,故不会出现溢出.5 设计仿真及总结本设计采用Xilinx公司Spartan3A系列的XC3S1400A,封装时PG484,速度是-4,仿真器是ISE Simulator(VHDL/Verilog),硬件描述语言是Verilog,开发工具是ISE.最后对电路进行时序分析,结果为该FIFO运行速度可达到90.63MHz.wclk、rclk时钟周期分别为:75MHz、80MHz.先向FIFO中写入18个数据,当第16个数据被读入后wfull立即被置位如下图7.图7 写满仿真结果同时向FIFO中写入和读出数据,由于wptr要经过两个读周期才能同步到读时钟域,故在waddr递增后的第二个rclk的上升沿rempty才清零如下图8所示.本文对异步FIFO的结构和重要时序问题给予了详细的阐述,并得到了可靠的仿真结果.在高速数据采集系统中,采用高性能FPGA作为数据预处理和高速异步FIFO 作为数据采集缓存的应用都十分广泛.把FIFO集成在FPGA中简化了电路设计的复杂程度,增加了电路的集成化程度和可靠性,是未来高速数据采集系统的重要发展方向.图8 同时写入读出时的仿真结果参考文献【相关文献】[1] Clifford E.Cummings,Synthesis and Scrip ting Techniques for De signing Multi-Asynchronous Clock Designs[A].SNUG-2001,2001(3):2-8.[2]吴自信,张嗣忠.异步FIFO结构及FPGA设计[J].单片机及嵌入式系统应用,2000,22(3):1.[3]赵雅兴.FPGA原理、设计与应用[M].天津:天津大学出版社,1999.[4]夏宇闻.数字系统设计-Verilog实现[M].北京:高等教育出版社,2006.[5]王金明.Verilog HDL程序设计教程[M].北京:人民邮电出版社,2004.。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、前言跨时钟域的同步处理,使用异步FIFO是常用的方式之一,对于异步FIFO的设计,网上的大部分资料来源于《Simulation and Synthesis Techniques for Asynchronous FIFO Design》一文其异步FIFO的结构如下图所示本文不是介绍上图描述的设计。
我从基本的数字电路时序开始,介绍异步FIFO的相关问题。
最后介绍如何用时序约束保证设计的正确性二、数字电路时序对于数字电路来讲,我们的信号在时钟边沿发生变化,Dat1信号是一种理想情况,而Dat2是实际情况,其特点是一、相对时钟边沿有延时二、信号变化有一段时间(电平转换时间),在这段时间就是亚稳态在亚稳态期间进行数据采样,不能获得稳定的值。
数字电路中经过时序约束,在T1产生的信号,在T2一定稳定(否则就是不满足时序),所以对于只有一个时钟的数字电路来说,它在T1和T2都能获得稳定的信号(T1时刻的值为0、T2时刻的值为1)三、跨时钟域时序问题对于异步时钟而言(相位不同),对于CLK1产生的信号,CLK2有可能在任意时刻进行数据采样在FIFO的设计中,将会产生2种信号,一种是数据本身(用Data表示),另外一种是指示数据是否有效(用valid表示),注意(valid不一定是一个比特的寄存器,可以是由FIFO中的读写指针产生而来,例如fifo的full或empty状态)异步FIFO的问题在于,如果CLK2在时钟T2进行采样,那么有可能得到valid有效,而数据无效的情况。
这样在CLK2采样取得的设计就是错误的数据。
四、处理异步FIFO的valid和data(理论基础)我们假设valid为低电平表示没有数据,高电平为有数据,解决的办法就是,当CLK对valid进行采样时,即使valid处于亚稳态期间,数据信号也是稳定的如上图所以,在T1时刻进行上升沿采样,虽然valid是一个亚稳态状态,但是此时Data 是一个稳定的值,如果在T1时刻采样的valid为1,那么可以得到稳定的Data信号,如果在T1时刻采样的valid为0,那么控制逻辑认为在T1无法获得数据,从而在下一个时钟获取注意:T2时刻是在下降沿进行采样,而此时的Data信号也是稳定的五、如何实现为了让valid和Data处于上面的状态,我们可以对valid进行延时处理,即使用时钟对其进行采样,必须使用2个寄存器依次采样,才能保证至少有一个时钟的延时valid1是CLK2对valid进行采样产生的,如果采样的时机不好,那么valid1相对valid只有一点点延时,valid2是CLK2对valid1的采样,这样valid2相对于valid至少有CLK2一个周期的延时,也就满足了第二节的条件。
所以在《Simulation and Synthesis Techniques for Asynchronous FIFO Design》的设计中,将写时钟域写指针使用2级寄存器同步到读时钟域,然后使用该同步后的写指针和读时钟域读指针产生valid状态,(备注:写时钟域写指针发生改变就和上图中valid发生变化是一个道理,代表数据写入,使用读时钟域同步后想当于产生valid2信号,相信不难理解),写指针是多比特数据,无法在亚稳态获取数据,必须使用一次只有一个比特变化的格雷码,然后再使用格雷码产生valid状态(即FIFO中的full或者empty),同样的道理,将读时钟域的读指针使用2级寄存器同步写时钟域。
其目的是判断数据是否已经被读取。
这就是《Simulation and Synthesis Techniques for Asynchronous FIFO Design》中的理论支持,其它的逻辑就是格雷码的设计、FIFO的状态产生等逻辑,本文不再进行详细说明。
六、问题产生《Simulation and Synthesis Techniques for Asynchronous FIFO Design》的设计中是否能绝对保证异步FIFO的正确性?如上图所示,在T1时刻CLK1产生了valid和Data信号,它是满足时序要求的,在T2时刻是稳定的,只是valid比Data先稳定。
我们对valid进行采样延时,产生的valid1是可以出现上面的状态,但此时valid1和Data都是亚稳态,不满足关系需要说明的是1、上述出现的概率较小,取决数字后端布局2、如果进行采样的同步时钟比CLK1慢(即写时钟快于读时钟),不会出现问题3、后端布局后,还可以进行多时钟时序仿真,也可以发现问题七、改进设计在异步FIFO设计中,我们必须要保证valid和data的相对关系。
我们可以通过下面的逻辑设计再加上时序约束来保证这一点。
一、逻辑设计控制逻辑,在T1时刻准备好数据,在T2时刻产生valid二、时序约束将读写2个时钟设置为同一个时钟,频率设置使用最高频率的那个时钟。
(可以单独将这个FIFO做块,或者和高频率的那个模块一起做块)经过上面的逻辑设计和时序约束,对于要采样valid和data的异步时钟而言:1、由于是采用最高频率的时钟进行约束,即使采样时钟频率低,也能满足时序要求2、通过逻辑设计和时序约束,对于采样时钟而言,valid和Data也一定是满足相对关系八、参考代码module Mfifo(input rst_n,input wr_clk,input wr_req,input[7:0]wr_data,output wr_ready,input rd_clk,input rd_req,output[7:0]rd_data,output rd_ready);reg[7:0]fifo_r[3:0];reg[1:0]wp_r;reg wp_valid_r;reg[3:0]wp_flag_r;reg[1:0]rp_r;reg rp_valid_r;reg[3:0]rp_flag_r;//=================================================================== //WR CLK//=================================================================== always@(posedge wr_clk)beginif(~rst_n)wp_r<=2'b00;else if(wr_req&wr_ready)wp_r<=wp_r+2'b01;endalways@(posedge wr_clk)beginif(wr_req&wr_ready)fifo_r[wp_r]<=wr_data;endalways@(posedge wr_clk)beginif(~rst_n)wp_valid_r<=1'b0;else if(wr_req&wr_ready)wp_valid_r<=1'b1;else if(wp_valid_r)wp_valid_r<=1'b0;endalways@(posedge wr_clk)beginif(~rst_n)wp_flag_r<=4'b0000;else if(wp_valid_r)wp_flag_r[wp_r-2'b01]<=~wp_flag_r[wp_r-2'b01];end//=================================================================== //RD CLK//=================================================================== always@(posedge rd_clk)beginif(~rst_n)rp_r<=2'b00;else if(rd_req&rd_ready)rp_r<=rp_r+2'b01;endalways@(posedge rd_clk)beginif(~rst_n)rp_valid_r<=1'b0;else if(rd_req&rd_ready)rp_valid_r<=1'b1;else if(rp_valid_r)rp_valid_r<=1'b0;endalways@(posedge rd_clk)beginif(~rst_n)rp_flag_r<=4'b0000;else if(rp_valid_r)rp_flag_r[rp_r-2'b01]<=~rp_flag_r[rp_r-2'b01];end//=================================================================== //FIFO STATE//=================================================================== assign wr_ready=wp_flag_r[wp_r]==rp_flag_r[wp_r];assign rd_ready=wp_flag_r[rp_r]!=rp_flag_r[rp_r];assign rd_data=fifo_r[rp_r];endmodule九、其它补充1、异步fifo的主要目的是跨时钟同步,不应该有复杂的控制逻辑和fifo深度,(复杂的控制逻辑可以放在其它地方实现,如果实在需要深度较大fifo来缓冲数据,可以用同步fifo接在异步fifo的输入或输出端,以此达到目的)2、不管异步FIFO如何设计,一定要做时序仿真(下图是在fpga上的布局后的时序仿真)。