异步fifo格雷码的约束
- 格式:docx
- 大小:11.00 KB
- 文档页数:1
异步FIFO设计(非常详细,图文并茂,值得一看!)一、概述在大规模ASIC或FPGA设计中,多时钟系统往往是不可避免的,这样就产生了不同时钟域数据传输的问题,其中一个比较好的解决方案就是使用异步FIFO来作不同时钟域数据传输的缓冲区,这样既可以使相异时钟域数据传输的时序要求变得宽松,也提高了它们之间的传输效率。
此文内容就是阐述异步FIFO的设计。
二、设计原理2.1结构框图Fig. 2.1.1如上图所示的同步模块synchronize to write clk,其作用是把读时钟域的读指针rd_ptr采集到写时钟(wr_clk)域,然后和写指针wr_ptr进行比较从而产生或撤消写满标志位wr_full;类似地,同步模块synchronize to read clk的作用是把写时钟域的写指针wr_ptr采集到读时钟域,然后和读指针rd_ptr进行比较从而产生或撤消读空标志位rd_empty。
另外还有写指针wr_ptr和写满标志位wr_full产生模块,读指针rd_ptr和读空标志位rd_empty产生模块,以及双端口存储RAM模块。
2.2 二进制计数器存在的问题异步FIFO读写指针需要在数学上的操作和比较才能产生准确的空满标志位,但由于读写指针属于不同的时钟域及读写时钟相位关系的不确定性,同步模块采集另一时钟域的指针时,此指针有可能正处在跳变的过程中,如图Fig.2.2.1所示,那么采集到的值很有可能是不期望的值,当然,不期望的错误结果也会随之发生。
Fig. 2.2.1上图中,rd_ptr2sync 3和4以及4和5之间的中间态是由于到各寄存器的时钟rd_clk存在偏差而引起的。
二进制的递增操作,在大多数情况下都会有两位或者两以上的bit位在同一个递增操作内发生变化,但由于实际电路中会存在时钟偏差和不同的路径延时,二进制计数器在自增时会不可避免地产生错误的中间结果,如图Fig.2.2.2。
Fig.2.2.2上图是Fig.2.2.1的电路原型以及局部波形的放大。
异步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在实际应用中能够稳定可靠地工作。
基于格雷码的深度可配置的异步FIFO设计实现丛红艳,刘瑛,万清【摘要】如何防止产生亚稳态问题,更好地同步异步信号及准确地设计空、满、几乎空、几乎满控制信号的产生是异步FIFO设计的两大难点。
介绍了一种异步FIFO的设计方法,用先比较读写地址产生空满标志,再同步到相应的时钟域的方法来准确设计标志位信号的产生。
采用格雷(Gray)码来避免亚稳态的出现,性能较稳定,并比较了利用Gray码、单步循环码作异步FIFO指针的优缺点。
最后,给出了系统的仿真及综合结果。
【期刊名称】电子与封装【年(卷),期】2014(000)005【总页数】4【关键词】FIFO;亚稳态;Gray码;单步循环码1 引言异步FIFO存储器是一种先进先出的电路,使用在时钟频率不同的数据接口部分,用来存储、缓冲在两个异步时钟之间的数据传输。
设计异步FIFO的关键是产生精确、可靠的“空”和“满”信号,空满标志主要用于在FIFO出口的入口向外部读写逻辑标志FIFO的数据存储情况,当空标志置位时,读时钟域的读写逻辑不能继续从FIFO读数据,否则会发生错误。
当满标志置位时,写时钟域的读写逻辑也不能继续向FIFO写数据,否则会发生溢出。
设计FIFO关键做到写满而不溢出,读空又不多读。
2 异步FIFO设计方法与实现本设计采用SMIC 40 nm标准数字单元库。
首先由memory compiler自动生成1024×18存储器,根据电路的各项指标要求,用Verilog硬件描述语言对其进行RTL仿真,来实现配置为18 kB或者36 kB存储器。
对于18 kB,支持配置4k×4,2k×9,1k×18 FIFO,对于36 kB支持的配置是8k×4,4k×9,2k×18,1k×36 FIFO;Block RAM的端口A用作FIFO的读端口,端口B是FIFO的写端口[4]。
NC、DC功能验证成功之后,综合得出门级的电路图,进行静态时序分析、版图的自动布局布线、反标延时、后仿真直到流片。
异步fifo的工作原理今天咱们来唠唠异步FIFO这个超有趣的东西哦。
你可以把异步FIFO想象成一个特别的小仓库,这个小仓库是用来存放数据的呢。
不过它可有点特别,和咱们平常那种规规矩矩同步的仓库不太一样。
异步FIFO主要是在不同时钟域之间工作的。
就好比啊,有两个世界,一个世界的节奏快,另一个世界的节奏慢,异步FIFO就在这两个节奏不一样的世界之间搭起了一座数据的桥梁。
那它怎么存数据呢?当有数据要进来的时候,就像是有人要往这个小仓库里送货。
在写端口这边,有一个写指针,这个写指针就像一个小向导,它告诉大家数据应该放在仓库的哪个位置。
每次有新的数据要存进来,写指针就会指向下一个空闲的地方。
就像我们在图书馆书架上找空位放书一样,写指针就是那个帮我们找空位的小助手。
再说说读这边吧。
读端口有个读指针,这个读指针就负责从仓库里取数据。
它就像一个小管家,知道哪些数据已经被取走了,哪些还在仓库里等着被取。
读指针也是一步一步地移动,每次取走一个数据,就会指向下一个要取的数据的位置。
这里面有个超关键的东西,就是空满标志的判断。
你想啊,如果仓库满了,还往里塞东西,那不就乱套了嘛;或者仓库都空了,还在傻乎乎地去取数据,那也不行呀。
对于空满标志的判断呢,其实有点小巧妙。
因为是异步的,时钟不一样,所以不能简单地用一个计数器来判断。
一般会采用一些特殊的编码方式,像是格雷码。
为啥用格雷码呢?这就像是给这个小仓库的货物管理上了一道保险。
格雷码的好处就是相邻的码值只有一位不同。
这样在不同时钟域转换的时候,就不容易出错啦。
比如说,写指针和读指针在判断满的时候,不是简单地看数字大小哦。
因为时钟不一样,数字可能会乱套。
用格雷码就不一样啦,它能很准确地判断出是不是真的满了。
就好像是两个人在不同的节奏下数数,但是通过一种特殊的规则,能准确知道什么时候仓库满了。
还有哦,异步FIFO的深度也是个很重要的概念。
深度就像是这个小仓库的大小。
如果数据来的太快,而读的速度又跟不上,那仓库就得大一点,不然就容易满了溢出来。
异步fifo_gray code异步fifo的多种约束方式英文版Asynchronous FIFOs, also known as Gray code asynchronous FIFOs, are widely used in digital systems to facilitate communication between different clock domains. They are essential for ensuring data integrity and preventing data loss in asynchronous systems. However, designing and implementing asynchronous FIFOs can be challenging due to the potential for metastability issues and timing violations.There are several constraints that need to be considered when designing an asynchronous FIFO. One common constraint is the need for proper synchronization between the read and write pointers to prevent data corruption. This can be achieved using handshaking signals or other synchronization techniques.Another important constraint is the need to ensure proper data transfer between the two clock domains. This requires careful consideration of the setup and hold times of the data signals, as well as the use of Gray code encoding to minimize the chances of metastability.In addition, designers must also consider the impact of clock skew and jitter on the performance of the asynchronous FIFO. Clock skew can lead to timing violations and data corruption, while jitter can cause data loss and synchronization issues.Overall, designing an asynchronous FIFO with Gray code encoding requires careful consideration of various constraints and trade-offs. By carefully analyzing the system requirements and implementing appropriate design techniques, designers can ensure the reliable and efficient operation of their asynchronous FIFOs.中文版异步FIFO,也称为Gray码异步FIFO,在数字系统中被广泛应用,以促进不同时钟域之间的通信。
一、前言跨时钟域的同步处理,使用异步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一个周期的延时,也就满足了第二节的条件。
异步FIFO为什么要使用格雷码(转)分类:IC技术文章首先要了解的是异步FIFO使用格雷码的唯一目的就是“即使在亚稳态进行读写指针抽样也能进行正确的空满状态判断”。
那么典型的判断方法是怎样进行的呢?以满状态判断为例,先要对读指针(属于读时钟域)在写时钟域进行抽样,然后才能与写指针进行比较,如果写指针赶上了读指针,说明已经写满,写操作必须暂停。
接下来说说为什么2进制指针不适合做空满判断。
事实上2进制读指针在增减时,经常发生多位突变,比如6位地址111111会在下一时刻变成000000,在实际电路中,这个变化过程要持续很长一段时间,会由111111经历6个状态转移到达000000。
比如111111 -> 101111 -> 100111 -> 100110 -> 100100 -> 000100 -> 000000。
由于写时钟与读时钟不同步,异步的写时钟很可能会在状态不稳定的中间某个状态抽样,这样就会得到错误的读指针,进而做出错误的状态判断,导致系统异常。
而且由于多位同时突变,凭借概率论常识可知发生错误的可能性很大。
那么怎样才能避免这个问题的发生呢?显然,在中间状态抽样,这个是不可避免的,这是异步系统天生的缺陷。
我们的目标是:即使在中间状态抽样,也要不影响空满状态的判断。
符合这个要求的编码方法是每次只能有1个比特发生改变。
为什么这么说呢?因为当只有一个比特发生改变时,即使在中间状态抽样,其结果也不外乎两种:递增前原指针和递增后新指针。
显然递增后新指针是最新情况的反映,如果抽样到这个指针,那么和我们的设计预期是一致的,如果抽样到递增前的原指针,会有什么结果呢?假设现在抽样读指针,那么最坏的情况就是把“不满”判断成了“满”,使得本来被允许的写操作被禁止了,但是这并不会对逻辑产生影响,只是带来了写操作的延迟。
同样的,如果现在抽样写指针,那么最坏的情况就是把“不空”判断成了“空”,使得本来被允许的读操作被禁止了,但是这也不会对逻辑产生影响,只是带来了读操作的延迟。
摘要随着数字系统规模的不断增大,单时钟域设计会极大地限制数字系统性能,现代数字系统为了提升性能,常采用多时钟域的设计。
跨时钟域的信号在传输时会遇到亚稳态现象,如何保持系统稳定地传输数据是多时钟域系统设计者重点关注的问题,在跨时钟域传递数据的系统中,常采用异步FIFO(First In First Out,先进先出队列)口来缓冲传输的数据,以克服亚稳态产生的错误,保证数据的正确传输。
常规的异步FIFO 设计采用先同步读写指针后比较产生空/满标志和用先比较读写指针产生空/满标志,再同步到相应时钟域的方法,但由于常规异步FIFO 模块中的RAM 存储器读写寻址指针常采用格雷码计数器以及“空满”控制逻辑的存在,工作频率低,面积大,将使通过这两个模块的信号通路延时对整个模块的工作频率造成制约。
本文提出了一种新型异步FIFO 的设计方法,该方法省略“了满”信号产生模块和多余的存储器位深来简化常规的FIFO 模块,而只保留“空”信号产生模块,避免使用大量的同步寄存器,减少了面积空间。
FPGA 验证的结果表明,改进后的异步 FIFO 性能有了显著的提高。
关键词:现场可编程门阵列(FPGA )亚稳态空/满标志产高速FIFOABSTRACTWith the increasing of digital system size, a single clock domain design will greatly limit the digital system performance. To enhance the performance of modern digital systems, multiple clock domain design is conventionally adopted. While being transmitted, Cross-clock domain signals will come across the phenomenon of metastability, hence it will be a major concern for the multi -clock domain system designers to probe how to maintain the system stability and to have data transmission conducted smoothly. As to the bus system data transmission in the system where the two data interface clocks don’t match, one of super and effective solutions is to use asynchronous FIFO buffer memory. How To solve the key and difficult issue that metastability and how to generate empty and full flag correctly in asynchronous FIFO design. Traditional FIFO design often synchronizes write/read address first, then compares them to generate empty/full signals or empty / full flag first compare the read and write pointer, and then synchronized to the clock domain, This design takes on too much area and can only work at a low frequency,this will allow the signaling pathways of these two modules delay caused by constraints of the operating frequency of the entire module. A new method of asynchronous FIFO is proposed to overcome these problems,omit the "full" signal generator module and redundant memory bit depth to simplify the conventional FIFO module, leaving only the "empty" signal generation module,avoid the use of a large number of synchronization registers, reducing the area of space. FPGA verification results show that the asynchronous FIFO improved performance has been significantly improved.Keywords: Field Programmable Gate Array (FPGA); Metastable; Mmpty / Full Flag production; High-speed FIFO目录摘要 (I)ABSTRACT (II)第一章绪论 (1)1.1研究背景和意义 (1)1.2研究现状 (1)1.3本文的主要工作 (3)1.4论文结构 (3)第二章跨时钟域设计的挑战与实现方法 (4)2.1跨时钟域设计的挑战 (4)2.1.1亚稳态问题 (4)2.1.2亚稳态产生的原因 (5)2.1.3亚稳态的危害 (5)2.2 跨时钟域的实现方法 (6)2.2.1同步器 (6)2.2.2握手机制 (9)第三章开发环境 (11)3.1硬件平台 (11)3.2软件平台 (11)第四章异步FIFO的设计与实现 (13)4.1异步FIFO (13)4.1.1异步FIFO工作原理 (13)4.1.2异步FIFO设计的难点 (14)4.2常见异步 FIFO 的设计 (16)4.2.1 读写地址产生逻辑 (18)4.2.2空/满标志的产生及代码的实现 (19)4.3.3改进的异步 FIFO 设计方法分析 (22)4.4高速异步FIFO的设计与实现 (23)4.4.1常见FIFO模块分析 (23)4.4.2高速异步FIFO 设计 (25)第五章结论 (28)第六章参考文献 (29)致谢 (30)附录高速异步FIFO设计仿真分析 (31)附1. 设计工作流程 (31)附.1.1 设计输入 (31)附.1.2 设计编译 (35)附.1.3 设计仿真 (36)第一章绪论1.1研究背景和意义作为21 世纪最重要的科学领域之一,超级计算机是体现科技竞争力和综合国力的重要标志。
DC综合约束012DC综合约束012_异步FIFO中的格雷码设置max_delay1、异步fifo中格雷码约束为了保证异步fifo的功能和性能保证,需要在综合约束文件sdc 中,约束异步FIFO格雷码的最大延时。
约束如图所示:从格雷码寄存器的时钟端口---->到3级同步器的输入端口的最大延时。
写地址waddr和读地址raddr格雷码同步都需要设置set_max_delay,延时可设置为读写时钟中最快时钟周期的一半。
set_max_delay [expr 0.5*$period_fast_clk] -from [get_pins “详细路径1/waddr_gray_reg_*_/clocked_on”] -to [get_pins “详细路径1”/synchronizer_3x_u0/同步器件名称/d”] set_max_delay [expr 0.5*$period_fast_clk] -from [get_pins“详细路径2/raddr_gray_reg_*_/clocked_on”] -to [get_pins “详细路径2”/synchronizer_3x_u1/同步器件名称/d”]NOTE:路径填写的是模块例化名称,同步器_u*不能丢。
2、为什么要设置读写地址格雷码的max_delay?如果不设置读写地址格雷码约束:会出现以下两种情况:1.格雷码各bit位延时不一致---导致同步器采样的地址不符合gray规律,afifo功能异常。
2.格雷码到同步器的延时有好多个周期----异步afifo性能下降情况1:格雷码各bit位延时不一致格雷码各bit位延时不一致,导致afifo功能异常假设3bit的gray码各比特位延时不一致,比如gray[1]延时比gray[0]多一个采样周期,比如gray[2]延时比gray[1]多一个采样周期,如图所示同步器syn_3x采样端的数据入口处的波形。
虽然源端格雷码是符合要求的,但是由于格雷码延时不一致,导致采样端采样的格雷码不符合要求,如图所示:采样后的格雷码由001(1)跳转到了010(3),又由011(2)跳转到了111(5),这会造成溢出和读空信号有效,afifo功能异常。
怎么⽤Verilog语⾔描述同步FIFO和异步FIFO感谢知乎龚⼤佬打杂⼤佬⽹上⼏个nice的博客(忘了是哪个了。
)前⾔虽然FIFO都有IP可以使⽤,但理解原理还是⾃⼰写⼀个来得透彻。
什么是FIFO?Fist in first out。
先⼊先出的数据缓存器,没有外部读写地址线,可同时读写。
规则:永远不要写⼀个已经写满了的fifo。
永远不要读⼀个读空了的fifo。
FIFO种类?同步FIFO和异步FIFO。
同步FIFO只有⼀个时钟,也就是说写端和读端的时钟是⼀⽑⼀样的。
异步FIFO读端和写端两个时钟则是不⼀样的。
包括同频异相,异频异相。
FIFO⽤途?1. 数据缓冲器。
⽐如你写端burst⼀个数据,没有fifo缓冲的话就炸了。
Fifo会把写端的突发数据吃到肚⼦⾥,读端可以慢慢的⼀个个读出来。
2. 跨时钟域。
异步fifo主要使⽤在不同时钟域的边缘,⽤来同步数据到另⼀个时钟域。
3.ALTERA FIFO IP 的缺点是什么?虽然altera贴⼼的提供了FIFO的IP块,但是对于可移植性与⾃定义位宽深度更好的话,还是⾃⼰写的更佳。
FIFO深度如何计算?(避免溢出)对于异步fifo,如果读时钟⼤于写时钟且每个周期读写,那么⼀定是会读空的,反之⼀定会被写满。
⼀般来说,不会设计这么⽆聊的东西。
假设写端有突发的数据,⽽读端是均匀的读出,怎么保证fifo不溢出呢?异步FIFO快转慢的问题:可能采样踩不到某些值。
同步FIFO:当缓冲器使⽤,可以⽤ram资源搭。
原理图:信号定义:clk:时钟信号rst_n:异步复位信号wr:写请求rd:读请求data:数据输⼊q:数据输出full:满信号,表⽰fifo吃饱了empty:空信号,表⽰fifo肚⼦已经空掉了usedw:表⽰fifo中已有的数据个数仿真:没有usedw款:有usedw款:资源使⽤量:如何设计⼀个异步FIFO?⼀般⽤作跨时钟域,可⽤ram搭。
判断读空与写满,读写指针要跨时钟域,所以采⽤格雷码减少亚稳态。
异步fifo格雷码的约束
异步FIFO格雷码是一种常用于数据传输和存储的技术,它能够在数据读写方面提供高效的解决方案。
该技术实现起来很简单,但需要注意一些约束条件,以确保数据传输的正确性和可靠性。
首先,异步FIFO格雷码需要提供一个读写指针,用于指示当前读写的位置。
读写指针需要满足以下约束条件:
1. 写指针必须指向下一个可写位置,即写指针只能在读指针前面或者等于读指针。
2. 读指针必须指向下一个可读位置,即读指针只能在写指针前面或者等于写指针。
这些约束条件的目的在于防止读写指针的重叠和失序,确保数据读写的正确性和可靠性。
另外,异步FIFO格雷码还需要使用状态机控制数据的读写。
状态机需要满足以下约束条件:
1. 状态机必须保持同步,即状态转移需要在时钟信号的上升沿完成。
2. 状态机需要根据读写指针的位置控制数据的读写,确保数据读写的正确性和可靠性。
以上约束条件是异步FIFO格雷码实现中非常重要的限制条件,需要严格遵守才能够保证数据传输的正确性和可靠性。
同时,在实际的应用中,还需要注意以下几个方面:
1. 异步FIFO格雷码的读写速度需要相匹配,否则会出现溢出或者死循环等问题。
2. 异步FIFO格雷码需要具备错误检测和纠错的功能,可以通过添加CRC校验码或者自校验码来实现。
3. 异步FIFO格雷码的缓存区需要具备足够的容量,以确保数据传输不会出现阻塞或丢失的情况。
综上所述,异步FIFO格雷码的约束涉及到读写指针、状态机的控制和缓存区的容量等多个方面,需要根据具体应用情况进行合理的策略选择和实现。
只有在严格遵守约束条件并且充分考虑应用需求的情况下,才能够实现高效的数据传输和存储。