异步fifo 订阅
使用FIFO同步源自不同时钟域的数据是在数字IC设计中经常使用的方法,设计功能正确的FIFO会遇到很多问题,探讨了两种不同的异步FIFO的设计思路。两种思路都能够实现功能正确的FIFO。本文所研究的FIFO,从硬件的观点来看,就是一块数据内存。 展开全文
使用FIFO同步源自不同时钟域的数据是在数字IC设计中经常使用的方法,设计功能正确的FIFO会遇到很多问题,探讨了两种不同的异步FIFO的设计思路。两种思路都能够实现功能正确的FIFO。本文所研究的FIFO,从硬件的观点来看,就是一块数据内存。
信息
源    自
不同时钟域的数据
端口数
两个端口
外文名
Asynchronous FIFO
介    绍
是一块数据内存
中文名
异步FIFO
宏定义简介
使用FIFO同步源自不同时钟域的数据是在数字IC设计中经常使用的方法,设计功能正确的FIFO会遇到很多问题,探讨了两种不同的异步FIFO的设计思路。两种思路都能够实现功能正确的FIFO。本文所研究的FIFO,从硬件的观点来看,就是一块数据内存。它有两个端口,一个用来写数据,就是将数据存入FIFO;另一个用来读数据,也就是将数据从FIFO当中取出。与FIFO操作相关的有两个指针,写指针指向要写的内存部分,读指针指向要读的内存部分。FIFO控制器通过外部的读写信号控制这两个指针移动,并由此产生FIFO空信号或满信号。对于异步FIFO而言,数据是由某一个时钟域的控制信号写入FIFO,而由另一个时钟域的控制信号将数据读出FIFO。也就是说,读写指针的变化动作是由不同的时钟产生的。因此,对FIFO空或满的判断是跨时钟域的。如何根据异步的指针信号对FIFO的满状态或空状态进行正确的判断是本文研究的重点。此外,设计过程中的一些细节问题也将在文中涉及到。1 指针以及满空信号的产生为了更好地说明问题,先探讨一下同步FIFO指针移动以及满空信号的产生过程。对于同步FIFO,读写指针都指向一个内存的初始位置,每进行一次读写操作,相应的指针就递增一次,指向下一个内存位置。当指针移动到了内存的最后一个位置时,它又重新跳回初始位置。在FIFO非满或非空的情况下,这个过程将随着读写控制信号的变化一直进行下去。如果FIFO处于空的状态,下一个读动作将会导致向下溢出(underflow),一个无效的数据被读入;同样,对于一个满了的FIFO,进行写动作将会导致向上溢出(overflow),一个有用的数据被新写入的数据覆盖。这两种情况都属于误动作,因此需要设置满和空两个信号,对满信号置位表示FIFO处于满状态,对满信号复位表示FIFO非满,还有空间可以写入数据;对空信号置位表示FIFO处于空状态,对空信号复位表示FIFO非空,还有有效的数据可以读出。当读指针和写指针相等也就是指向同一个内存位置的时候,FIFO可能处于满或空两种状态。可以通过不同的方法判断或区分FIFO究竟是处于满状态还是空状态,也就是究竟是写指针从后赶上了读指针,还是读指针从后赶上了写指针。本文所应用的方法是设置一个额外的状态位,指针由它的地址位以及状态位组成。地址位随着相应的操作递增,指针由内存的最后位置返回到初始位置的时候状态位取反。因此,当读写指针的地址位和状态位全部吻合的时候,读写指针经历了相同次数的循环移动,也就是说,FIFO处于空状态(图1(a));如果读写指针的地址位相同而状态位相反,写指针比读指针多循环一次,标志FIFO处于满状态(图1(b))。 (2)二进制指针可以用于任意大小的FIFO;格雷码指针只能用于大小为2的幂的FIFO。2 二进制指针和格雷码指针的同步二进制指针是由一位状态位和若干位二进制编码的地址位组成的(例如由三位地址和一位状态位构成的指针的变化:0000→0001→0010→0011→0100→0101→0110→0111→1000→1001→1010→1011→1100→1101→1110→1111)。如果在不同的时钟域内直接同步二进制指针,有可能产生问题。例如,当读指针从0111向1000变化的时侯,指针所有的位都要变化,如果写时钟恰好在读指针的变化时刻采样,写者得到的读指针值有可能是从0000到1111中的任何一个。所以二进制指针不宜被直接同步,但可以通过一对握手信号同步二进制指针。例如,读指针被读者存入一个寄存器时,读者就发出一个就绪信号。当写者看到就绪信号时,读取读指针,发出一个收到数据的确认信号。当读者看到确认信号时,就收回就绪信号,然后用当前的读指针值刷新寄存器(图2)。在收到确认信号前,存放读指针的寄存器内容保持不变,确保了被读取的指针的正确性。为了能够在不同的时钟域内直接同步指针,可以对指针使用格雷码的编码方式,也就是指针每次移动只变化一位,这样就避免了由于指针多位同时变化而无法直接同步的问题。图3表示了一个三位地址的内存用于格雷码编码的FIFO。n位地址的内存需要n+1位的格雷码。使用最高位(也就是第n-1位)作为状态位,从第n—2到第0位作为地址的第n-2位到第0位;对状态位(也就是第n-1位)和第n-2位进行位异或运算产生地址的第n-2位(也就是地址的最高位)。通过对图3的观察可以得知,四位格雷码编码的指针和三位二进制加状态位编码的指针具有同样的功能:指针产生的地址循环遍历8个内存地址,每一次遍历后状态位取反。值得注意的一点,是当指针从0100变化到1100的时候,相应的地址由100变为000,状态位和一位地址同时发生了变化,所以不能同步由另一个时钟域格雷码指针产生的状态位和地址位,此时应该直接由另一个时钟域同步指针来完成,由同步后的指针产生相应的状态位和地址位。3 保守的满空判断对于异步FIFO设计,无论是采用握手还是直接同步的方法来获取对方时钟域的指针,对满空信号的判断总是“保守”的。(1)满空信号的复位(满信号复位表示FIFO非满,空信号复位表示FIFO非空)和实际FIFO的情况相比有一定的延迟。例如,空信号是由读者用读指针与同步或握手后得到的写指针进行比较产生的。由于同步或握手需要一定的时间,在这段时间,写者可能向FIFO写入新的数据,写指针发生了变化,此时FIFO已经非空,但此刻空信号仍然没有复位。对于写者而言,满信号的复位也会遇到相同的问题。不过,在通常情况下,FIFO只要确保不会向下溢出或向上溢出,复位的延迟就不会导致向下溢出或向上溢出,是可以接受的。(2)满空信号的置位(满信号置位表示FIFO满,空信号置位表示FIFO空)和FIFO的实际情况相比没有延迟。例如,同样考虑FIFO为空的情况,读者使用读指针和同步或握手后的写指针进行比较,由于FIFO为空,写动作不会发生,相应的写指针也保持不变,因此读者获得的就是当时的写指针值。这样就能马上对空信号置位。同样地,在FIFO满的情况下,由于读指针不发生变化,写者得到的是当前的读指针值,能够马上判断FIFO为满。从以上两点的讨论可以得出结论,FIFO满空判断是保守的,写者可能在FIFO还有一定空间时停止写数据,但不会在FIFO已经满了的情况下继续写数据;读者可能在FIFO还有一些有效的数据时停止读数据,但是不会在FIFO已经空的情况下继续读数据。保守的满空判断能够满足FIFO的功能要求。4 二进制指针和格雷码指针的比较二进制指针和格雷码指针两者各有优缺点:?(1)由于通过握手同步,指针可以有多位同时变化,二进制指针每次移动可以跳跃过任意的长度,这样给FIFO的某些功能的实现带来了方便(例如,硬件直接控制FIFO从缓存的数据流中丢弃一个出错的包);而格雷码指针一般只能做递增或递减的移动。(3) 与直接同步相比,通过握手同步需要多时钟周期,因此二进制指针的满空判断比格雷码指针的满空判断更“保守”;对于设计一个容量很大且由内存构成的FIFO来说,由于保守判断而损失的空间可以忽略;但对于一个容量较小的FIFO而言,这种“保守”可能是无法接受的。例如,一个由8个寄存器组成的FIFO,对于格雷码编码的指针,最坏情况下,FIFO被写者判断为满时,里面实际只存有五个数据(使用两级同步器,可能需要三个周期同步,而在这三个周期内都有读动作发生);而对与二进制编码的指针,FIFO被判为满时,FIFO里可能只有三个数据或更少(使用两级同步器,最好的情况下,需要五个周期握手,而在这五个周期里都有读动作发生)。设计者在两种方法的比较选择上应该考虑到以上的几点。本文介绍的异步FIFO的设计方法的两种不同尽路都能够实现功能正确的异步FIFO。对这两种方法设计的FIFO的优缺点所做的简要分析,对FIFO的设计具有指导意义。
收起全文
精华内容
下载资源
问答
  • 异步fifo的verilog实现

    2020-07-08 15:38:34
    该资源是实现了的通过异步fifo进行跨时钟域传输的vivado工程,在不同的时钟域进行fifo数据读写,并用读写地址的格雷码判断fifo空满产生空满标志。工程代码基于vivado2017.4,并在modelsim10.6上仿真成功。工程中附有...
  • Verilog实现的异步FIFO

    2019-04-05 12:47:12
    Verilog实现的异步FIFO,不调用IP核,两级寄存器实现读写指针的同步,地址采用格雷码形式防止亚稳态
  • 异步FIFO的VHDL设计

    2020-07-27 03:26:39
    给出了一种利用格雷码对地址编码的异步%&%’的实现方法,并给出了ABCD程序,以 解决异步读写时钟引起的问题。
  • 异步fifo时序原理

    2017-09-07 10:56:59
    在大规模ASIC或FPGA设计中,多时钟系统往往是不可避免的,这样就产生了不同时钟域数据传输的问题,其中一个比较好的解决方案就是使用异步FIFO来作不同时钟域数据传输的缓冲区,这样既可以使相异时钟域数据传输的时序...
  • 深度不为2的幂次方的异步FIFO设计!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  • 异步FIFO,Verilog源码

    2018-10-31 10:22:54
    异步FIFO,Verilog源码实现异步FIFO异步FIFO的原理,
  • 摘要:FIFO经常应用于从一个时钟域传输数据到另一个异步时钟域...为解决异步FIFO设计过程中空满标志判断难以及FPGA亚稳态的问题,提出一种新颖的设计方案,即利用格雷码计数器(每次时钟到来仅有1位发生改变)表示读/写
  • 本文提出一种新颖的异步FIFO设计方案,它通过先比较读写地址并结合象限检测法产生异步的空/满标志,再把异步的空/满标志同步到相应的时钟域。通过仿真验证,该方法是稳定有效的。
  • 本文通过采用异步FIFO的方式给出了这个问题的一种解决方法,并采用Verilog 硬件描述语言通过前仿真和逻辑综合完成设计。 关键词:异步FIFO;时钟域;Verilog引言当今集成电路设计的主导思想之一就是设计同步化,即对...
  • 本设计以对大量实时采集数据进行缓存为背景,硬件采用Micron公司的1GB SODIMM DDR3 和Kintex-7系列FPGA的片上FIFO,软件通过研究DDR3的基本工作原理编写用户接口模块,同时结合片上FIFO的控制模块完成异步FIFO缓存...
  • 同步FIFO与异步FIFO的Verilog实现(附源代码和测试代码)
  • 利用异步FIFO实现FPGA与DSP进行数据通信的方案。FPGA在写时钟的控制下将数据写入FIFO,再与DSP进行握手后,DSP通过EMIFA接口将数据读入。文中给出了异步FIFO的实现代码和FPGA与DSP的硬件连接电路。经验证,利用异步...
  • 异步FIFO

    千次阅读 2021-06-11 13:50:01
    文章目录前言FIFO使用场景FIFO参数同步FIFO异步FIFO 前言 FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,,但缺点就是只能顺序写入数据,顺序的...

    👉注:代码链接在文末,有需要直接移至文末观看。
    👉注:更多精彩请看:面试常问的verilog代码汇总 一文


    简介

    异步FIFO 的读写是用不同的时钟来控制的,所以不能采用共享同一个计数器的方法来产生空满标志。那么我将通过引入问题的方式,逐步异步FIFO中重要的概念和机制,再来进行代码环节。

    注:同步FIFO也可以看同步FIFO

    指针该怎么设计?

    将读写指针向高位扩展一位,也就是说,深度为2n 的异步FIFO,读写指针的宽度应该为(n+1)位。当读写指针指向最FIFO中的最后一位时,指针最高为从0变为1,其他位变成0,指针再次折回到FIFO的首位。
    在这里插入图片描述

    空满标志产生的条件?

    因为读写指针向高位扩展一位,所以当使用二进制进行编码读写指针时,空满标志为:

    • 读写指针相同时,FIFO为空。只有在复位操作或者当读指针读出FIFO中的最后一个数据时,读指针追赶上了写指针。
    • 读写指针最高位(MSB)不同,其他位相同时,FIFO为满。这说明写指针比读指针已经多折回了一次,此时FIFO已满。

    为什么是格雷码?

    用上面二进制编码读写指针,这样问题就真的解决了吗?还是那个问题,读写指针是在不同的时钟域,要进行跨时钟域同步(不太了解的可以看跨时钟域传输),这势必要考虑传输时的亚稳态问题。采用二进制码进行读写指针的编码时,我们知道,其相邻点的递增可能有好几个二进制位同时发生变化。而在异步FIFO中,我们一般采用两级触发器同步打两拍的方式进行读写指针的同步。也就是说,如果使用二进制进行编码,就不能采用这种简单的同步两拍的方式,因为这种方式只能进行单bit信号跨时钟域传输。那为何解决这个问题?
    采用格雷码。格雷码是一种在0 ~ 2n -1之间循环变化的编码,其相邻两个数值之间只有一位二进制位发生变化,有效的降低了在指针同步的过程中产生亚稳态的概率。
    所以采用格雷码后,产生空满标志的条件又要变一变了。

    • 空标志:读写指针所有位均相同
    • 满标志:读写指针最高位(MSB)不同次高位不同其他位相同

    PS:这里我补充解释几个点:

    1.为什么要改变满标志判断条件?

    答:假如是如下图所示的4位格雷码,FIFO深度为8,读写指针从0000 ,…,0100(7)再到1100(8)。格雷码具有镜像对称的特点,这里的1100(8)的意义就相当于指针折回到FIFO的首位(0000)。所以假如此时要比较满时,要比较1100和0000,也就是要满足最高位和次高位不同,其他位相同。在这里插入图片描述

    2.是用格雷码需要注意什么?

    答:格雷码只有满足2n 个数,才可以形成循环,否则会导致相邻位不止一位发生变化。这也就是使用格雷码作为读写指针时,FIFO的深度必须为2n 。有的时候宁愿浪费一点空间,也要将深度设为2n
    例如:如果设置FIFO的深度为6,首位跳变时有多位发送变化。
    在这里插入图片描述

    3.格雷码同步时出错了,怎么办?

    答:格雷码每次只要1位二进制位发生变化,这样在进行地址同步时,如果地址同步出错,如下图:写地址跳变由000到001,同步时出错,将写指针由001同步成000。

    在这里插入图片描述
    尽管写地址跳变出错,在读时钟域判断空是否产生空标志时也不会出现严重错误,最坏的情况就是让空标志在FIFO不是为空的时钟产生空标志,也就是假空的情况。但是不会产生更加严重的空度情况。

    4.格雷码与二进制之间的转换?

    答:这个还是看我之前的博客:IC验证面试题(题2),描述的更详细。

    空满标志产生需要读写指针如何同步?

    首先我们要明白,读写指针受不同的时钟控制,假如你把写指针同步到读指针时钟域中去判断满,行不行?不行,假如加入此时你判断了为满(最高位和次高位不同,其他位相同),控制FIFO不要再写了。但你注意了,此时写指针在经过两级触发器同步到读时钟域的过程中,写指针它在写时钟域中还进行了至少两次的写操作(一般写时钟更快),这就造成了FIFO的溢出。
    那么该怎么办?

    • 满标志: 将读指针同步到写时钟域,告诉写信号“你TM别写了!,再写就溢了”
    • 空标志:将写指针同步到读时钟域,告诉写信号“你TM别读了!,再读就空了”

    那么这就有个问题了?上面说同步的过程中,FIFO实际还在写,所以会造成写满。那你现在把读指针同步到写时钟域来判断满,实际FIFO应该还未满,这不造成羞耻的浪费了嘛。其实这种设计称为保守设计,就是为了增加FIFO的安全性,防止写指针孬头吧唧地写满了。同理,也防止读指针孬头吧唧地产生空读,读出无效数据。

    FIFO的深度如何计算?

    Question1:写时钟频率为100MHz,读时钟频率为80MHz。每100个时钟周期写入80个数据,每一个周期读出一个数据。那么FIFO的深度应该是多少?
    首先我们要确定最极端的情况,也就是FIFO的Burst 会写了多少个数据。这里要考虑数据是“背靠背”传输的,如下:
    在这里插入图片描述
    这种情况是,前100个时钟周期,数据在后80个周期内发生了连续的写操作,在后100个时钟周期内,数据在前80个周期写入。这就造成了:

    • 数据突发长度为 :160
    • burst长度(160个数据)写入需要的时间:burst长度/写时钟频率 = 160/100
    • burst长度(160个数据)写入期间可以读出的数据量:160/100 ÷ 1/80 =128
    • FIFO的深度:160 - 128 = 32

    Question2:设计一个同步FIFO,每100个时钟周期可以写80个数据,每10个周期可以读8个数据,FIFO的深度为多少?
    和上面的情况一样,burst长度为160。所以:

    • burst长度(B)为:B =160
    • 写入B长度所需的时间:T = (1/fwr)*160
    • 从FIFO中读出一个数据所需的时间:t = (1/frd)*(8/10)
    • 在T时间读走的数据量:T/T= 160* (frd/fwr)(8/10)
    • FIFO的深度:160 - 160* (frd/fwr)(8/10)

    因为是同步FIFO,所以frd/fwr = 1,代入得 深度为32。
    由此我们可以推出FIFO的计算公式:
    在这里插入图片描述

    想了解FIFO深度的计算场景,还可以看一个大佬的FIFO深度计算

    FIFO的测试点?

    question1:(22届乐鑫提前批)一个异步FIFO,rdata和wdata均为8位,FIFO深度为16,当rst_n为低时,FIFO复位。当wclk的上升沿采样且wr为高时,数据被写入FIFO,当rclk的上升沿采样且rd为高时,FIFO输出数据。此外,当FIFO为空时,EMPTY为高,当FIFO为满时,FULL信号为高。尽可能列出你能想到的FIFO测试点。

    有两个一级测试点:1.FIFO的基本功能;2.异步处理

    1.FIFO的基本功能测试包括:

    • 检查端口时序。

      1.检查数据数据是否在wclk的上升沿并且wr为高时被写入。如,在wr为高或为低时写入的数据能不能被有效写入。

      2.检查数据数据是否在rclk的上升沿采样且rd为高时读出。

    • 数据一致性。先写后读,检查是否能按先入先出的顺序读出;

    • 空满信号能不能正确生成。先连续地写,再连续的读,检查空满信号是否准确生成;

    • 读写指针有没有做空满限制。当FIFO满时,外部有没有做保证写指针不会增加;当FIFO空时,读指针是否还在增加;

    • 检查复位信号,各个寄存器和信号是否能被正常复位,复位释放后信号的初始值是否正常;

    • 读写指针转换为格雷码的逻辑检查。

    2.异步处理:

    • 读写指针跨时钟域传输时,有没有做同步处理。
    • FIFO的读写时钟频率差速耐受能力。检查读快写慢、写慢读快一定周期后,FIFO是否还能保持稳定。

    异步FIFO的verilog代码

    异步FIFO的结构如图所示。由读时钟域、写时钟域、Mermory模块和跨时钟域同步组成。
    在这里插入图片描述

    异步FIFO代码

    本博客内容过长,不方便阅读。详细代码请看我的另一篇博客:异步FIFO代码(Verilog)

    展开全文
  • 摘要:首先介绍异步FIFO的概念、应用及其结构,然后分析实现异步FIFO的难点问题及其解决办法;在传统设计的基础上提出一种新颖的电路结构并对其进行综合仿真和FPGA实现。  关键词:异步电路 FIFO 亚稳态 格雷码 ...
  • 异步FIFO是一种在电子系统中得到广泛应用的器件,多数情况下它都是以一个独立芯片的方式在系统中应用。本文介绍一种充分利用FPGA内部的RAM资源,在FPGA内部实现异步FIFO模块的设计方法。这种异步FIFO比外部FIFO 芯片...
  • 异步FIFO的VHDL实现

    2021-03-05 16:53:07
    --rtl 这是源代码 --sim 这是modelsim仿真...已经验证,可以实现异步FIFO 两级寄存器实现读写指针的同步,地址采用格雷码形式防止亚稳态。异步FIFO的源码,个人觉得不易理解,故上传本人最近写的源码,与大家一起分享
  • 异步FIFO设计思路指导

    2019-02-20 13:08:56
    在大规模ASIC或FPGA设计中,多时钟系统往往是不可避免的,这样就产生了不同时钟域数据传输的问题,其中一个比较好的解决方案就是使用异步FIFO来作不同时钟域数据传输的缓冲区,这样既可以使相异时钟域数据传输的时序...
  • 当年的获奖论文啊,公认的经典 经典英文 CummingsSNUG2002SJ_FIFO1.pdf
  • 异步FIFO.pdf

    2020-02-26 14:26:21
    异步FIFO的工作原理、同步化分析处理、跨时钟域解决方案以及fpga代码示例讲解,适合初学者学习使用。
  • 介绍同步FIFO原理,并且提供了verilog源代码;详细介绍了异步FIFO原理和两种实现方法,并提供verilog源代码。
  • 本文利用异步FIFO芯片作为TVP5150与DSP之间的缓冲,可以进行稳定的数据传输,并且简化了设计难度。给出了系统的整体架构,重点介绍了FIFO的特点,FIFO与TVP5150之间的硬件接口电路,FIFO与DSP之间的硬件接口电路,...
  • 纯Verilog实现的异步FIFO,分为读写控制模块,SRAM CORE,同步等几个模块,内含源文件和仿真文件
  • FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针...
  • 一直以来异步FIFO都是数字前端的心腹大患,今天的问题来到了,异步FIFO中跨异步走线的约束与影响。 异步FIFO结构 画了下异步FIFO的简图,橘色为写时钟域,蓝色为读时钟域,结构有以下几个核心点: 1.数据ram/...

    前言

    【异步FIFO的一些小事·0】异步FIFO同步化设计

    【异步FIFO的一些小事·1】空满判断与格雷码

    一直以来异步FIFO都是数字前端的心腹大患,今天的问题来到了,异步FIFO中跨异步走线的约束与影响。

    异步FIFO结构

     画了下异步FIFO的简图,橘色为写时钟域,蓝色为读时钟域,结构有以下几个核心点:

    1.数据ram/mem置于写侧,读取时不进行跨异步直接进行数据选取;

    2.写指针打三拍向读时钟域同步,在读时钟域进行“空”状态判定;

    3.读指针打三拍向写时钟域同步,在写时钟域进行“满”状态判定;

    走线延时的几个问题点

     wr_ptr走线太慢的影响

    wr_ptr走线时间太慢,是相对谁慢了呢?肯定是相对于写入的data。假设fifo为空且写入了第一个数据。wr_ptr走线太慢,即数据已经稳定在mem中,但是rd端在很长时间后才察觉到“非空”开始给后级rd_en信号,那么会导致后级模块读取数据的不及时;

    比较典型的一个场景是,慢时钟同步到快时钟,这种场景下一般是不会有断流的场景的。但是如果wr_ptr走线时间太长,比如走了100clk_wr才走到clk_rd域,那么如果fifo深度不够,很可能会反压写侧的前级模块,此时就需要加深fifo深度来规避这个问题;

    因此,wr_ptr走线太慢不会有功能问题,但是会引发性能问题。如果对性能没有要求,那这条线的max_delay是可以适量放宽松的。在不放宽的情况下,wr_ptr的走线延时一般不大于快时钟的70%;

    wr_ptr走线太快/data走线太慢的影响

    wr_ptr走线时间太快,实际就是data走线过慢了。数据的走线可以慢一些么?是可以的,因为数据是不需要跨异步的。但是显然走线延时不能太大,其中的关系是,wr_ptr经过3拍跨异步后,以rd_ptr和wr_ptr_sync进行逻辑运算判断可读,此时数据必须已经抵达rd时钟域寄存器的D端(如果有输出打拍,如果没有的话就是抵达数据出口),那么此时clk_rd采样才能踩到正确的数据。如果数据走线延时过大,wr_ptr指针已经完成同步并判断可读,那么rd_en带出去的就是旧的数据,会发生数据错误。

    因此,如果wr_ptr是打三拍跨异步,那么data的走线延时一般最大为2T_rd,毕竟还要满足采样setup time和hold time嘛;如果wr_ptr是打两拍跨异步,那么data的走线延时一般最大为1.5T_rd。这个是比较硬性的约束,如果不满足则后端要重新摆放cell;

    rd_ptr走线太慢的影响

    rd_ptr走线时间太慢的影响,实际就是写侧更新读指针不及时,会影响“满状态”的判定。假设fifo为满且读取了一个数据,rd_ptr走线太慢,即数据已经被读走但是wr端在很长时间后才察觉到“非满”撤销给前级的反压,那么一样会导致前级写入数据不及时,类似wr_ptr走线太慢,造成断流;

    因此,rd_ptr走线太慢不会有功能问题,但是会引发性能问题。如果对性能没有要求,那这条线的max_delay是可以适量放宽松的。在不放宽的情况下,rd_ptr的走线延时一般不大于快时钟的70%;

    展开全文
  • 异步FIFO源代码

    2018-08-30 16:49:49
    异步FIFO,跨时钟通信必备,完整代码verilog版本.......
  • 同步和异步FIFO.zip

    2019-09-05 11:21:02
    同步和异步FIFO的硬件实现(verilog)和文档说明。。
  • 分析了异步FIFO的结构和关键技术,在与利用格雷码作为异步FIFO指针编码对比的基础上,提出了一种采用移位码编码方式的FIFO,不仅减小了亚稳态出现的概率,也简化了电路结构,降低了电路面积和功耗,在此基础上也缩短...
  • 异步fifo的verilog实现的代码,可用于asic综合
  • 异步FIFO_异步FIFO_源码

    2021-10-02 00:42:53
    当使用异步信号时,一个好的设计将对异步信号执行同步处理。 同步通常使用多级D触发器级联处理,如下图所示。 该模型的大多数数据表明,在第一级寄存器生成亚稳态之后,第二级寄存器的稳定输出概率为90%,第三级...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 37,793
精华内容 15,117
关键字:

异步fifo