根据FIFO工作的时钟域分为同步/异步FIFO。同步FIFO是指读时钟和写时钟为同一个时钟在时钟沿来临时同时发生读写。异步FIFO读写时钟不一致,读写相互独立。

读写指针的工作原理

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

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

FIFO的“空/满”检测

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

很明显,当FIFO写满时,就不能再写新数据了,否则就导致数据的溢出;而在空状态即之前写入的数据已经读完,就不能再读取了,否则读出的数据就是无效数据。

1.读空信号(rd_empty)

一般情况当读写指针相等时,表明FIFO为空,这种情况发生在 复位操作时 或者当读指针读出FIFO中最后一个字 后,追赶上写指针时,此时读空信号有效。

发生如下图所示:

2.写满信号(wr_full)

当读写指针再次相等时,表明FIFO为满,这种情况发生在,当写指针转了一圈折回来(wrapped around)又追上了读指针,如下图:

以上FIFO的读写状态是基于读写指针的比较,而问题是两者的判断条件都是读写指针相等,区别在于写满状态是在写指针写满一圈后重新追上读指针,这该如何取表示呢???

如何区分到底是满状态还是空状态呢??

3.FIFO读写状态的判断方法

可以采用以下两种方法:

(1)extra bit

一般情况下深度为N=2^n的FIFO其地址的位宽为n,其读写地址的位宽也为n。共有N个存储单元,若数据位宽为W则该FIFO的容量即为N*W bit。

现在在指针中添加额外的位(extra bit,即地址的MSB)变为n+1bit,该extra bit用于指示写指针是否递增并越过最后一个FIFO地址,若越过则将该MSB加1,其它位清零。对读指针也进行同样的操作。如对于深度为8的FIFO,需要采用3+1bit是计数器:0000-1000、1001-1111,MSB作为折回标志,而低3位作为地址指针。

那么判断机制为:

*如果两个指针的MSB不同,就说明写指针比读指针多折回一次:如r_addr=0000,且w_addr=1000,为满;

*如果两个指针的MSB相同,就说明两个指针折回次数相等。再者其余位相等(则说明FIFO为空。

(2)设置数据计数器

设置一个data_counter, 当写使能有效时每写入一个data计数器同时加1;读操作时,每读出一个data时该计数器减1。如此,当data_counter为0时FIFO空,当data_counter计数至FIFO深度deep时,表示FIFO写满。

由于计数器会占用额外的资源,当FIFO较大时,可能会降低FIFO的读写速度。

读写指针的表示

读写指针的编码有多种,上述提到的指针采用二进制码形式表示。

1. 二进制FIFO指针

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

2. gray码表示指针

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

空的判断

依然依据二者完全相等(包括MSB);

满的判断

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

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

wptr与rptr的次高位不相等;如上图位置7和和位置15,转化为2进制:0111和1111. 。MSB不同说明多折回一次,111相同代表同一个位置。

异步fifo_FIFO工作的原理相关推荐

  1. servlet的异步和非阻塞原理

    之前研究了下servlet的异步和非阻塞原理,看到一篇文章,下面有两个问题,顺便解答了下 servlet3异步原理与实践 Danniel 3楼 2019.05.18 21:31 请问,AsyncLon ...

  2. 异步复位同步释放原理

    深度揭秘异步复位同步释放原理 文章右侧广告为官方硬广告,与吾爱IC社区无关,用户勿点.点击进去后出现任何损失与社区无关. 明天就放端午小长假了,提前祝大家节日快乐.腾讯官网已经给小编公众号开通了赞赏功 ...

  3. 8051异步串口的收发原理

    8051异步串口的收发原理 <8051异步串口的收发原理> 来自:刘建文 | 学术半·IT歌·文 作者:刘建文 关键字:8051 数字电子 数据通信 永久链接地址:http://artte ...

  4. 【OkHttp】OkHttp 源码分析 ( 同步 / 异步 Request 请求执行原理分析 )

    OkHttp 系列文章目录 [OkHttp]OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 ) [OkHttp]Android 项目导入 OkHttp ( 配置依赖 | 配置 ...

  5. 交换机的工作转发原理

    交换机通常是运行在网络OSI七层模型的第二层数据链路层,如图中,第三层网络层通常是路由器运行在该层 今天我们来看看,交换机的工作转发原理是什么样的. 交换机既然是利用端口进行网络数据传输,那么它是如何 ...

  6. java future_Java并发编程之异步Future机制的原理和实现

    Java并发编程之异步Future机制的原理和实现 项目中经常有些任务需要异步(提交到线程池中)去执行,而主线程往往需要知道异步执行产生的结果,这时我们要怎么做呢?用runnable是无法实现的,我们 ...

  7. 张勋说:简述棒磨机的工作运行原理和磨损机制(图文)

    1 棒磨机的工作运行原理 棒磨机采用筒形旋转装置,外沿齿轮传动,两仓,格子型,由给料部.出料部.回转部.传动部 等主要部分组成.中空轴采用铸钢件,内衬可拆换,回转大齿轮釆用铸件滚齿加工,筒体内镶有耐磨 ...

  8. LVS三种工作模式原理

    1. LVS 三种工作模式原理 1.1 LVS-DR: 通过直接路由实现虚拟服务器(VS/DR) 跟VS/TUN方法相同,VS/DR利用大多数Internet服务的非对称特点,负载调度器中只负责调度请 ...

  9. Verilog实现FIFO专题5-异步FIFO设计(异步FIFO工作方式、异步FIFO介绍、异步FIFO介绍)

    FIFO根据输入输出时钟是否一致,分为同步FIFO与异步FIFO.同步FIFO中,读写控制信号以及数据均处于同一时钟域,满足STA分析时一般不会出现亚稳态等不稳定情形:而对于异步FIFO,读写相关信号 ...

最新文章

  1. 201621123037 《Java程序设计》第10周学习总结
  2. where does watchers in scope come from
  3. oracle自带的加密函数,oracle 的加密解密函数
  4. java实用教程——组件及事件处理——ActionEvent事件
  5. 6.2二叉树及二叉树存储结构
  6. 开机自动启动_工控机断电恢复后自动开机的设置方法
  7. 5分钟学会 Vim 分屏操作方方面面
  8. Android Studio 嵌入X5WebView
  9. gRPC框架学习:6、Java+gRPC+maven+idea实例测试并打jar包
  10. @Cacheable注解属性介绍
  11. linux添加ssh key
  12. 微信公众号消息通知(原生)
  13. CSDN KaTeX 公式之等号对齐
  14. Kubesphere流水线集成(Git、Maven、Docker、K8S)
  15. 对“动态多重网络”建模与目标选择方法的介绍
  16. 【AGC001E】BBQ Hard(图论,dp)
  17. Airship再下一城,因为戴尔和AtT的合作
  18. MKS SKIPR V1.0 使用说明书
  19. Linux ❉ 正则表达式
  20. 功能强大的文件上传插件带上传进度-WebUploader

热门文章

  1. 论剑乌镇:历届互联网大会热词盘点
  2. 平均年薪 70 万!刚刚,这类程序员又涨薪了!佩服!
  3. 刚刚,百度宣布王海峰升任 CTO
  4. Google 中国版搜索引擎项目凉了!
  5. 阿里 2 年内市值将赶超苹果;腾讯回应吃鸡下架;滴滴恢复深夜运营 | 极客头条...
  6. 如何用计算机管理员权限,计算机管理员权限在哪里设置_电脑系统如何设置管理员权限-win7之家...
  7. 社会关系分析_肯德基加盟费分析!肯德基加盟流程!肯德基加盟条件2021
  8. yum方式安装android_在CentOS 7和Ubuntu14.04上安装Android Studio
  9. 用python画星座_用python做星座介绍程序。
  10. 登录时判断用户还是管理员_高低温试验仪器出现内漏时如何判断是高压还是低压内漏?...