h1_key

当前位置:首页 >新闻资讯 > 技术文章>异步FIFO简介及其原理
异步FIFO简介及其原理
2023-04-10 2317次

 一、异步FIFO简介及其原理

FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,它与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据。异步FIFO 是指读写时钟不一致,读写时钟是互相独立的。

 

  1.1 用途

  用途1:

  跨时钟域:异步FIFO读写分别采用相互异步的不同时钟。在现代集成电路芯片中,随着设计规模的不断扩大,一个系统中往往含有数个时钟,多时钟域带来的一个问题就是,如何设计异步时钟之间的接口电路。异步FIFO是这个问题的一种简便、快捷的解决方案,使用异步FIFO可以在两个不同时钟系统之间快速而方便地传输实时数据。

  用途2:

  位宽变换:对于不同宽度的数据接口也可以用FIFO,例如单片机位8位数据输出,而DSP可能是16位数据输入,在单片机与DSP连接时就可以使用FIFO来达到数据匹配的目的。

  1.2 结构

  

 

 

  由图可见,异步FIFO的核心部件就是一个 Simple Dual Port RAM ;左右两边的长条矩形是地址控制器,负责控制地址自增、将二进制地址转为格雷码以及解格雷码;下面的两对D触发器 sync_r2w 和 sync_w2r 是同步器,负责将写地址同步至读时钟域、将读地址同步至写时钟域。

  FIFO的常见参数

  FIFO的宽度:即FIFO一次读写操作的数据位;

  FIFO的深度:指的是FIFO可以存储多少个N位的数据(如果宽度为N)。

  满标志:FIFO已满或将要满时由FIFO的状态电路送出的一个信号,以阻止FIFO的写操作继续向FIFO中写数据而造成溢出(overflow)。

  空标志:FIFO已空或将要空时由FIFO的状态电路送出的一个信号,以阻止FIFO的读操作继续从FIFO中读出数据而造成无效数据的读出(underflow)。

  读时钟:读操作所遵循的时钟,在每个时钟沿来临时读数据。

写时钟:写操作所遵循的时钟,在每个时钟沿来临时写数据。

 

 

  二、 FIFO的“空”/“满”检测

  FIFO设计的关键:产生可靠的FIFO读写指针和生成FIFO“空”/“满”状态标志。

  此处切记判断读空和写满时指针的比较方式时不同的,大华面试时就问到了这个问题,一下把我干糊涂了,直接面试凉了。

  如上图所示的同步模块synchronize to write clk,其作用是把读时钟域的读指针rd_ptr采集到写时钟(wr_clk)域,然后和写指针wr_ptr进行比较从而产生或撤消写满标志位wr_full;

  同步模块synchronize to read clk的作用是把写时钟域的写指针wr_ptr采集到读时钟域,然后和读指针rd_ptr进行比较从而产生或撤消读空标志位rd_empty。


  2.1、读写指针工作原理

  读指针:总是指向下一个将要被写入的单元,复位时,指向第一个单元(编号为0)。

  写指针:总是指向当前要被读出的数据,复位时,指向第1个单元(编号为0)

  FIFO空标志位:

  (1)系统复位,读写指针全部清零,读写指针相等时;

  (2)数据读出速率大于写入速率,读指针赶上了写指针,FIFO为空,如图所示:

  

 


  FIFO 写满标志位的产生

  (1)读写指针指向了同一地址,但写指针超前整整一圈,FIFO被写满;

  

 

 

  2.2、 空满区分

  为了区分到底是满状态还是空状态,可以采用以下方法:

  在指针中添加一个额外的位,当写指针增加并越过最后一个FIFO地址时,就将未用的最高位(MSB)加1,其他位回0.对读指针也进行同样的操作。

  此时,对于深度为2^n的FIFO,需要的读写指针位宽为(n+1)位。如对于深度为8的FIFO,需要采用4bit的计数器,0000~1000、1001~1111,MSB作为折回标志位,而低3位作为地址指针。

  如果两个指针的MSB不同,其他位相同,说明写指针比读指针多折回了一次;如r_addr=0000,而w_addr = 1000,为满。如果两个指针的MSB相同,其余位相等,则说明两个指针折回的次数相等,说明FIFO为空;

  2.3、 二进制FIFO指针的考虑

  将一个二进制的计数值从一个时钟域同步到另一个时钟域的时候很容易出现问题,因为采用二进制计数器时所有位都可能同时变化,在同一个时钟沿同步多个信号的变化会产生亚稳态问题。而使用格雷码只有一位变化,因此在两个时钟域间同步多个位不会产生问题。所以需要一个二进制到gray码的转换电路,将地址值转换为相应的gray码,然后将该gray码同步到另一个时钟域进行对比,作为空满状态的检测。

  (1)二进制如何转化为格雷码

  二进制数的最高位保持不变, 后续位依次与前一位进行异或运算

assign gray_code = (bin_code>>1) ^ bin_code;

 

 

  (2) 使用gray码进行对比,如何判断“空”与“满”

  使用gray码解决了一个问题,但同时也带来另一个问题,即在格雷码域如何判断空与满。

  对于“空”的判断依然依据二者完全相等(包括MSB);

  而对于“满”的判断,如下图,由于gray码除了MSB外,具有镜像对称的特点,当读指针指向7,写指针指向8时,除了MSB,其余位皆相同,不能说它为满。因此不能单纯的只检测最高位了,在gray码上判断为满必须同时满足以下3条:

  (1)wptr和同步过来的rptr的MSB不相等,因为wptr必须比rptr多折回一次。

  (2)wptr与rptr的次高位不相等,如上图位置7和位置15,转化为二进制对应的是0111和1111,MSB不同说明多折回一次,111相同代表同一位置。

  (3)剩下的其余位完全相等。

  这里直接给出结论:

  判断读空时 :将写时钟域的写指针同步到读时钟,然后与读时钟域的读指针进行比较,每一位都完全相同才判断为读空;

  判断写满时:需要 写时钟域的格雷码wgray_next 和 被同步到写时钟域的读指针wr2_rp 高两位不相同,其余各位完全相同;

  1 assign full = (wr_addr_gray == {~(rd_addr_gray_d2[addr_width-:2]),rd_addr_gray_d2[addr_width-2:0]}) ;//高两位不同

  2 assign empty = ( rd_addr_gray == wr_addr_gray_d2 );


 

 

 

  三、重要补充

  关于异步FIFO的关键技术,有两个,一个是格雷码减小亚稳态,另一个是指针信号跨异步时钟域的传递。

  我在自己写异步FIFO的时候也很疑惑,地址指针在同步化的时候,肯定会产生至少两个周期的延迟,如果是从快时钟域到慢时钟域,快时域的地址指针并不能都被慢时域的时钟捕获,同步后的指针比起实际的指针延迟会更大。如果以此来产生fifo_empty和fifo_full 信号会非常不准器。

  查找资料和仿真后发现,数字电路的世界真的很神奇,还有很多的东西需要去学习。非常巧妙,FIFO中的一个潜在的条件是write_ptr总是大于或者等于read_ptr;分为两种情况,写快读慢和写慢读快。

  ·

  1.在写时钟大于读时钟时,产生fifo_empty信号,需要将write_ptr同步到读时钟域,写指针会有延时,可能比实际的写地址要小,如果不满足fifo_empty的产生条件,没问题。如果满足fifo_empty的触发条件,说明此时同步后的write_ptr = read_ptr,即实际的write_ptr >= read_ptr,最坏的情况就是write_ptr > read_ptr,像这种FIFO非空而产生空标志信号的情况称为“虚空”,但是也并不影响FIFO的功能。

 

  2.在写时钟大于读时钟时,产生fifo_full信号,需要将read_ptr同步到写时钟域,读指针会有延时,可能比实际的读地址要小,如果不满足fifo_full的产生条件,没问题。如果满足fifo_full的触发条件,说明此时同步后的read_ptr == write_ptr - fifo_depth,即实际的read_ptr >= read_ptr - fifo_depth,最坏的情况就是read_ptr > read_ptr - fifo_depth,像这种FIFO非满而产生满标志信号的情况称为“虚满”,但是也并不影响FIFO的功能。

  写慢读快的情况也同上,并没有大的差异,不再分析。

  关于格雷码减小亚稳态,如果读写时钟差距过大,从快时钟域同步到慢时钟域的信号,时钟捕获的相邻两个数据变化并不是只有一个bit位的改变,可能导致格雷码失去原来的意义。

 

  • XILINX赛灵思 XC7K160T-2FBG484E
  • 赛灵思(XILINX)作为行业的领军企业,其推出的 XC7K160T-2FBG484E 更是一款备受瞩目的产品。XC7K160T-2FBG484E 属于赛灵思 7 系列 FPGA(现场可编程门阵列),具有强大的性能和丰富的功能。
    2024-09-25 415次
  • XILINX赛灵思 XCKU085-2FLVA1517E
  • 赛灵思(XILINX)作为全球领先的可编程逻辑器件供应商,其推出的 XCKU085-2FLVA1517E 以卓越的性能和丰富的功能,成为众多电子工程师和设计师的首选。XCKU085-2FLVA1517E 属于赛灵思 UltraScale 架构系列产品,采用先进的 20 纳米工艺技术制造。这一工艺不仅带来了更高的性能,还实现了更低的功耗,为各种复杂的电子系统设计提供了理想的解决方案。
    2024-09-25 386次
  • XILINX赛灵思 XCKU060-1FFVA1517C
  • 赛灵思(XILINX)作为全球领先的可编程逻辑解决方案供应商,其 XCKU060-1FFVA1517C 更是一款备受瞩目的产品。XCKU060-1FFVA1517C 属于赛灵思 UltraScale 架构系列,采用了先进的 16 纳米 FinFET 工艺技术。这一工艺带来了诸多优势,如更高的性能、更低的功耗以及更小的芯片尺寸。
    2024-09-25 417次
  • XILINX赛灵思 XCKU060-2FFVA1517E
  • 赛灵思(XILINX)作为行业的领军企业,其推出的 XCKU060-2FFVA1517E 更是一款备受瞩目的产品。XCKU060-2FFVA1517E 属于赛灵思 UltraScale 架构系列的 FPGA(现场可编程门阵列)。它融合了先进的技术和强大的性能,为各种复杂的应用场景提供了高度灵活且可靠的解决方案。
    2024-09-25 347次
  • XILINX赛灵思 XC7Z035-3FFG676E
  • 赛灵思(XILINX)作为全球领先的可编程逻辑解决方案供应商,其 XC7Z035-3FFG676E 更是一款备受瞩目的产品。XC7Z035-3FFG676E 属于赛灵思 Zynq - 7000 系列,该系列将处理器系统(PS)和可编程逻辑(PL)完美结合,为用户提供了高度灵活的解决方案。这款器件采用了先进的 28 纳米工艺技术,在性能、功耗和成本之间实现了出色的平衡。
    2024-09-25 377次

    万联芯微信公众号

    元器件现货+BOM配单+PCBA制造平台
    关注公众号,优惠活动早知道!
    10s
    温馨提示:
    订单商品问题请移至我的售后服务提交售后申请,其他需投诉问题可移至我的投诉提交,我们将在第一时间给您答复
    返回顶部