热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

异步FIFO(一)

​一、FIFO简单讲解FIFO是英文FirstInFirstOut的缩写,是一种先进先出的数据缓存器,可分为同步FIFO和异步FIFO,

​一、FIFO简单讲解

FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,可分为同步FIFO和异步FIFO,同步FIFO是指读时钟和写时钟为同一个时钟,在时钟沿来临时同时发生读写操作,常常用于交互数据缓冲。异步FIFO是指读写时钟不一致,读写时钟是互相独立的,异步FIFO常用于跨时钟域交互

重要参数

  • FIFO的深度:通俗地说,就是异步FIFO可以存多少个数据的意思!

  • FIFO的宽度:上面说FIFO的深度是表示能存放多少数据的概念,那宽度便是每个数据有多少位,也就是我们通常所说的数据有多宽!

  • FIFO空:表示FIFO里面数据被读完了;

  • FIFO满:表示FIFO里面填满了数据;

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

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

  • FIFO读时钟:表示读取数据使用的时钟,一般设计时钟的上升沿为有效沿,有效沿读取数据;

  • FIFO写时钟:表示写入数据时使用的时钟,一般上升沿为有效沿,当然也可以设计下降沿为有效沿。

    (同步FIFO的读写时钟一致)

先从简单的同步FIFO讲起,以和异步FIFO的设计做比较。

同步FIFO的设计根据空满信号判断的方式主要分为两种:

一:利用计数器来判断空满。

二:将FIFO的地址位拓展一位,用最高位来判断空满

一:利用计数器来判断空满

空满检测逻辑:

为产生FIFO空满标志,引入FIFO Counter计数器,FIFO Counter寄数器用于指示FIFO内部存储数据个数;

  1)当只有写操作时,FIFO Counter加1;只有读操作时,FIFO Counter减1;其他情况下,FIFO Counter不变;

  2)当FIFO Counter=0时,说明FIFO为空,fifo_empty置位;

  3)当FIFO Counter=FIFO_DEPTH时,说明FIFO已满,fifo_full置位;

读写控制逻辑

 在clk上升沿时,读使能且FIFO非空(empty=0)时,进行一次读操作,rp加1(即顺序读出),将读指针rp对应地址处的数据读出至dout;

 在clk上升沿时,写使能且FIFO不满(full=0)时,进行一次写操作,wp加1(即顺序存储);将din写入写指针wp对应地址处;

设计代码如下:

二:将FIFO的地址位拓展一位,用最高位来判断空满。

空满检测逻辑:

空:扩展位相同,有效地址位也相同。

满:扩展位不同,有效地址为不同。

如何理解?

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

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

需要注意的是:在系统正确工作的前提下,读地址不可能超前于写地址。

为了区分到底是满状态还是空状态,需要:在地址指针中添加一个额外的位。

--如果两个指针的MSB不同,说明写指针比读指针多折回了一次;如r_addr=000,而w_addr = 100,FIFO为满

--如果两个指针的MSB相同,则说明两个指针折回的次数相等。其余位相等,说明FIFO为空;

给出图以供理解:假设FIFO深度为4,有效地址为2位。

设计代码如下:

文章同步发布在微信公众号:IC码农。分享日常所学和基础知识,分享历年大厂笔试题,EDA工具和培训视频,学习交流群,欢迎关注。




推荐阅读
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 尽管某些细分市场如WAN优化表现不佳,但全球运营商路由器和交换机市场持续增长。根据最新研究,该市场预计在2023年达到202亿美元的规模。 ... [详细]
  • 自学编程与计算机专业背景者的差异分析
    本文探讨了自学编程者和计算机专业毕业生在技能、知识结构及职业发展上的不同之处,结合实际案例分析两者的优势与劣势。 ... [详细]
  • 阅读本文大约需要3分钟。微信8.0版本的发布带来了许多令人振奋的新功能,如烟花特效和改进的悬浮窗,引发了用户的热烈反响。 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
  • 本文将深入探讨PHP编程语言的基本概念,并解释PHP概念股的含义。通过详细解析,帮助读者理解PHP在Web开发和股票市场中的重要性。 ... [详细]
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 2018年3月31日,CSDN、火星财经联合中关村区块链产业联盟等机构举办的2018区块链技术及应用峰会(BTA)核心分会场圆满举行。多位业内顶尖专家深入探讨了区块链的核心技术原理及其在实际业务中的应用。 ... [详细]
  • 本文探讨了 Swapper 工具对系统内存和存储设备(如 SD 卡)的潜在影响,解释其工作原理及使用时需要注意的问题。 ... [详细]
  • MySQL 高性能实战教程
    本课程深入探讨 MySQL 的架构、性能调优、索引优化、查询优化及高可用性等关键领域。通过实际案例和详细讲解,帮助学员掌握提升 MySQL 数据库性能的方法与技巧。 ... [详细]
  • 本文探讨了Java编程的核心要素,特别是其面向对象的特性,并详细介绍了Java虚拟机、类装载器体系结构、Java类文件和Java API等关键技术。这些技术使得Java成为一种功能强大且易于使用的编程语言。 ... [详细]
author-avatar
一个不需要幸福的男人丶
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有