目录

  • 突发数据长度(Burst Length)
  • 常见FIFO深度计算情况
    • 一、写时钟 > 读时钟(写比读快)
      • 1、读写都没有空闲周期
      • 2、读写有空闲周期
    • 二、写时钟 = 读时钟(写读一样快)
      • 1、读写没有空闲周期,且相位相等
      • 2、读写没有空闲周期,相位不等
      • 3、读写有空闲周期,无相位差
    • 三、写时钟 < 读时钟(读比写快)
      • 1、读写没有空闲周期
      • 2、读写有空闲周期
    • 四、最坏情况(背靠背)
      • 1、背靠背
      • 2、背靠背计算
    • 五、最常考(问)的情况

异步FIFO是一种常用的跨时钟域的设计,应用非常广泛。在平常设计中,我们都是调用IP核,设置深度和宽度就可以用了,但是很少关注资源利用率,即使用最小深度来达到设计效果。
异步FIFO原理及其实现

在进行FIFO最下深度计算之前,需要知道,并不是所有跨时钟域情况都可以使用异步FIFO。

假设写入时钟比读取时钟块,并且数据连续写入不停止,就算也连续读,无论FIFO设计多大,都会被写满,那么FIFO的深度就无穷大了。所以使用异步FIFO的情况是:数据突发写入(长度称为Burst length)。

突发数据长度(Burst Length)

因为输入不能连续写入,这样会导致FIFO无穷大,但是数据可以集中在一段时间内写入,然后停止一段时间 ,等待读取数据一段时间 Ta 后,然后再写入数据(不会导致数据丢失)。突发的意思就是数据集中在一段时间写入,然后等待数据读取一段时间,才能继续写入,使得数据不丢失。

假设需要从一个传感器采集一些数据到处理器处理,传感器采集数据的速度大于处理器处理数据的速度,这时候就需要使用异步FIFO。在最小深度的情况下,传感器开始采集数据写入到FIFO,同时处理器开始读取数据,当传感器采集完一次数据(n个)后,等待一段时间 Ta,处理器也读取完数据,这时候的FIFO为空。在 Ta 时间内不允许写入数据,这就叫突发。假设写入需要10s,读取需要30s,那么在30s之后才能再次向FIFO写入数据,不然就会导致数据丢失。 这个n就是突发数据长度(Burst length)。

常见FIFO深度计算情况

一、写时钟 > 读时钟(写比读快)

写时钟大于读时钟是异步FIFO最常用的使用情况

1、读写都没有空闲周期

假设:
写入时钟 wr_clk = 50MHZ,
读取时钟 rd_clk = 20MHZ,
突发数据长度 Burst length = 100,

分析:
写入一个数据需要 1/50MHZ = 20ns;写入100个数据需要 100 * 20ns = 2000ns;

在2000ns内,只能读取 2000/(1/20MHZ) = 40个数据;

所以FIFO_DEPTH(min) = 100 - 40 = 60。

公式:FIFO_DEPTH >= Burst length - ( Burst length * rd_clk / wr_clk)

如果FIFO_DEPTH为小数(35.5),则取大于FIFO_DEPTH 的整数(36)

2、读写有空闲周期

假设:
写入时钟 wr_clk = 50MHZ,
读取时钟 rd_clk = 10MHZ,
写空闲周期 = a,
读空闲周期 = b,
假设 a = 2,b = 1,
突发数据长度 Burst length = 100,

因为读写都有空闲周期,写一个数据,等2个周期再写下一个数据,相当于每3个时钟周期写一个数据;而读一样,读一个数据,等待1个周期再读下一个数据,相当于每2个时钟周期读一个数据;

注意:读写空闲周期必须满足:(1+a)/wr_clk < (1+b)/rd_clk ,这样才能保证写比读快

分析:
写入一个数据需要 3*(1/50MHZ) = 60ns,写入100个数据需要 100 * 60 = 6000ns;

在6000ns内可以读取 6000/(2*1/10MHZ) = 30

所以所以FIFO_DEPTH(min) = 100 - 30= 70。

公式:FIFO_DEPTH >= Burst length - ( Burst length * rd_clk / wr_clk * (1+a) / (1+b )

如果FIFO_DEPTH为小数(35.5),则取大于FIFO_DEPTH 的整数(36)


二、写时钟 = 读时钟(写读一样快)

1、读写没有空闲周期,且相位相等

这种情况不需要设计FIFO

2、读写没有空闲周期,相位不等

设计一个深度为 1 的FIFO就足够了

3、读写有空闲周期,无相位差

假设:
写入时钟 wr_clk = 50MHZ,
读取时钟 rd_clk = 50MHZ,
写空闲周期 = a,
读空闲周期 = b,
假设 a = 1,b = 2,
突发数据长度 Burst length = 100,

分析:这种情况就相当于读写时钟变化了,根据变化后的时钟计算

因为读写都有空闲周期,写一个数据,等1个周期再写下一个数据,相当于每2个时钟周期写一个数据;而读一样,读一个数据,等2个周期再读下一个数据,相当于每3个时钟周期读一个数据;

写入一个数据需要 2*(1/50MHZ) = 40ns,写入100个数据需要 100 * 40 = 4000ns;

在4000ns内可以读取 4000/(3*1/50MHZ) = 66.6

所以所以FIFO_DEPTH(min) = 100 - 66.6 = 34。

公式:FIFO_DEPTH >= Burst length - ( Burst length * (1+a) / (1+b )

三、写时钟 < 读时钟(读比写快)

1、读写没有空闲周期

因为读比写快,所以不会发生数据丢失的情况,不需要设计FIFO

2、读写有空闲周期

假设:
写入时钟 wr_clk = 20MHZ,
读取时钟 rd_clk = 50MHZ,
写空闲周期 = a,
读空闲周期 = b,
突发数据长度 Burst length = 100,

因为读写都有空闲周期,写一个数据,等a个周期再写下一个数据,相当于每1+a个时钟周期写一个数据;而读一样,读一个数据,等b个周期再读下一个数据,相当于每1+b个时钟周期读一个数据;

1、当(1+a)/wr_clk >= (1+b)/rd_clk时
相当于 读时钟大于等于写时钟,如果没有相位差就不需要设计FIFO,如果有相位差,设计深度为1的FIFO就足够了。

2、当(1+a)/wr_clk < (1+b)/rd_clk时
相当于 写时钟大于读时钟,写比读快
假设a = 1,b = 5
因为读写都有空闲周期,写一个数据,等1个周期再写下一个数据,相当于每2个时钟周期写一个数据;而读一样,读一个数据,等5个周期再读下一个数据,相当于每6个时钟周期读一个数据;

分析:
写入一个数据需要 2*(1/20MHZ) = 100ns,写入100个数据需要 100 * 100 = 10000ns;

在10000ns内可以读取 10000/(6*1/50MHZ) = 83.3

所以所以FIFO_DEPTH(min) = 100 - 83.3= 27。

公式:FIFO_DEPTH >= Burst length - ( Burst length * rd_clk / wr_clk * (1+a) / (1+b )

四、最坏情况(背靠背)

1、背靠背

之前的写入和读取,相当于 是均匀写入和读取,而当写入操作没有说每几个时钟周期写入一个数据,而是在几个时钟周期内写入多少数据;在几个时钟周期内读出多少数据的时候。

2、背靠背计算

假设:

写数据时钟频率fa=50MHz
读数据时钟频率fb=40MHz
在写时钟周期内,每80个周期就有40个数据写入FIFO
在读时钟周期内,每10个周期可以有6个数据读出FIFO

在最坏的情形中,为了得到更安全的FIFO深度,我们需要考虑最坏情况,以防数据丢失,读写的速率应该相差最大,也就是说需要找出最大的写速率最小的读速率,这样才能适配所有写入和读取的情况

可以看到,并没有给出突发长度,突发长度是40吗,其实不是,我们画个图就知道了:

写入的方式很多种,有均匀写入,有先写20再写20,方式很多。我们画出背靠背的情况

在背靠背(最坏)情况下,突发长度需要设置为 80,并且写速率设置为最大的50MHZ;而因为读时钟周期内,每10个周期可以有6个数据读出FIFO,假设均匀读出,所以读速率设置为最小的40MHZ * 6/10 = 24MHZ

由此可以根据上面各种情况分析:

写入 80个数据需要的时间: 80 * 1/50MHZ = 1600ns

在1600ns内可以读出 1600 / 1/24MHZ = 38.4个数据

所以所以FIFO_DEPTH(min) = 80- 38.4 = 42。

五、最常考(问)的情况

此处参考 https://blog.csdn.net/Reborn_Lee/article/details/100127937


条件不给完,需要自己计算得到各个参数(一般写比读快

假设:
CLKA = 25MHz,CLKB = 100MHz;
Ta= 40ns, Tb = 10ns;
时钟B的使能信号 en_B = 100 * Ta,占空比为1/4;

一般写比读快,我们认为B为写时钟,写使能时间为4000/4 = 1000ns,则突发写长度为1000/10 = 100个数据;
在1000ns内读出数据为1000/40 = 25个数据,所以FIFO最小深度为100 - 25 = 75

FPGA/IC笔试面试(一):异步FIFO最小深度计算相关推荐

  1. 数字IC笔试面试题目总结1_同步异步、竞争冒险

    数字IC笔试面试题目总结1 同步和异步 竞争.冒险与亚稳态 格雷码与Latch 大部分内容均来自网络公开资料,如有侵权,请联系删除! 同步和异步 同步电路和异步电路最主要的区别是什么 异步电路主要是组 ...

  2. 数字 IC 笔试面试必考点(3)数字 IC 前端设计 + 后端实现

    前言         该资源是博主花了十多天自己整理的,IC 前端设计流程在文中给出,IC 后端设计流程除了在文中给出之外还附加了总共六十页的 PDF 详细流程文档,简直是满满的爱啊,完整展示了 IC ...

  3. IC学习笔记3——异步FIFO

    IC学习笔记3--异步FIFO 异步FIFO的工作内容与同步FIFO类似,但是异步FIFO的控制并不像同步FIFO那么简单,因为异步FIFO工作在不同的时钟域,这将会带来一些问题,比如空满检测?是否还 ...

  4. FIFO最小深度计算

    FIFO最小深度计算 文章目录 1.FIFO最小深度 2.示例分析 1.FIFO最小深度   在数据的传输中当读速率慢于写速率时,FIFO便可被用作系统中的缓冲元件或队列,类似于水流经过一个缓冲区,上 ...

  5. IC/FPGA笔试/面试题分析(九)关于FIFO最小深度计算的问题

    IC/FPGA逻辑设计笔试题中最常见的体型莫过于FIFO最小深度的计算了,以前看到过计算FIFO最小深度,需要代入公式,直到看到这篇文档,才觉得使用逻辑分析的方法来看更能让人理解的更为深刻. 文档把计 ...

  6. FPGA数字IC刷题58道Verilog题解代码及视频讲解【FPGA探索者】【同步/异步FIFO】【跨时钟】

    牛客 Verilog 刷题入门篇1~24 + 进阶篇1~34 题解代码,所有代码均能通过测试,配合视频讲解效果更佳.为避免内容冗余,本文只给出代码,部分题目给出必要说明. 很多题目本身出题有些问题,着 ...

  7. 数字IC笔试面试常考问题及答案

    来源:知乎 链接:https://zhuanlan.zhihu.com/p/261298869 基础知识 原理务必理解透彻. 锁存器的结构-DFF的结构-建立保持时间-亚稳态-STA-CDC. 亚稳态 ...

  8. 网上IC笔试面试题目与秋招进度(2022.11.5更新)

    2022.11.5更新:(IC笔试题目有JL科技.TR半导体.HZW.MX半导体.RSKX)欢迎大家一起讨论题目,也请多多指教弟弟.笔试已经转移到新开帖子了. 目前投递60+,人才库8,offer6拒 ...

  9. 【FPGA学习记录1】异步FIFO的介绍

    文章目录 写在前面 1.FIFO的定义以及为什么要用FIFO.FIFO的分类 1.1什么是FIFO 1.2为什么要用FIFO 1.3FIFO的分类 2.异步FIFO的工作原理 2.1FIFO的结构 2 ...

最新文章

  1. Linux 系统挂载数据盘
  2. sp烘焙流程_次世代86机甲战神制作全流程
  3. mysql memory inno_如何定位RDS MySQL内存使用率高?-阿里云开发者社区
  4. 浅析GDAL库C#版本支持中文路径问题(续)
  5. matlab绘图基础,matlab绘图基础
  6. samba for linux下载,Samba 4.4.3 SMB for Linux 发布下载
  7. C语言解释一下BA无标度网络
  8. 鼠标右键菜单管理工具
  9. 任意7个数字,选出5个进行组合排列,并使用Excel打印组合的所有情况。
  10. 软件项目量化管理(CMMI高成熟度)实践经验谈——之项目管理过程策划篇
  11. HDU - 1546 Idiomatic Phrases Game(dijkstra最短路)
  12. spo0lsv病毒分析
  13. Sensor Flicker (Sensor banding现象)
  14. Win11任务栏修改方法(更新中)
  15. 后端开发工程师技术导图
  16. RIP路由防止环路的方法
  17. 计算机信息机房,计算机信息机房工程全面解决方案模板.docx
  18. html5自动吸附,基于HTML5Canvas的3D渲染引擎界面以及吸附等效果的运用-
  19. 前端性能分析—前端优化
  20. 基于51单片机霍尔测速仪表测转速调速系统方案原理图设计

热门文章

  1. 【3D建模制作技巧分享】在zbrush中如何雕刻头发 ZBrush头发雕刻小技巧
  2. 计算机数值分析:拉格朗日插值公式(python实现
  3. timeGetTime
  4. android webview 自适应屏幕宽度,Android应用开发Android Webview适配屏幕宽度
  5. 大学网络安全主题班会PPT模板
  6. xwiki部署_开源Wiki应用平台---XWiki的部署
  7. ORA-12514 登录oracle数据库报错:ORA-12514
  8. 用C语言写的一个顺序表实现图书馆书籍管理
  9. jmeter基础操作,图文
  10. 常见camera测试卡