首页 > 其他分享 >异步FIFO的空和满是准确的吗

异步FIFO的空和满是准确的吗

时间:2024-10-07 15:49:27浏览次数:7  
标签:异步 漏采 读写 FIFO 信号 准确 时钟

关注公众号FPGA开源工坊获取更多FPGA相关内容
交流群:838607138

异步FIFO的空和满是准确的吗

在我们关于两级同步器电路那篇推文里面提到了异步FIFO中格雷码进行同步的时候是允许漏采的,那么这个漏采会出问题吗,这篇推文我们就来讨论一下这个问题。

首先来说明一下异步FIFO的空满信号是怎么产生的

满信号是将读指针同步到写时钟域后进行判断产生的
空信号是将写指针同步到读时钟域后进行判断产生的
既然是异步FIFO,那么读写时钟域肯定是不一样的,最常见的一种情况就是读写时钟一个快一个慢的这种情况。另外一种情况是虽然读写时钟频率一样,但是不是由同一个时钟产生的,这样两个时钟也是异步时钟域。

那么既然有一个时钟快,一个时钟慢。就会产生以下两种情况

  • 快时钟域去采样慢时钟域下的信号
  • 慢时钟域去采样快时钟域下的信号
    当快采慢的时候一般是不会出问题的,但是慢采快的时候就可能出现漏采的现象。

比如快时钟域下一个数字的变化为0,1,2,3,4,5,慢时钟域下去采样这个信号就可能只采到数字0,2,3,5等数字,也就是漏采的情况。

那么漏采会不会让异步FIFO的读写产生问题呢,下面仍然分两种情况来进行讨论。

读慢写快

进行满信号判断的时候是将慢时钟域下的读指针同步到比较快的写时钟域下,所以不会出现漏采的情况。但是由于同步是需要时间的,所以满信号可能会提前出现,不过这个不会对FIFO产生读写错误,因为满信号提前产生只会造成FIFO里面还有空间的时候,写不进去数的情况,也就是FIFO的利用率降低的情况。

进行空信号判断的时候需要将快时钟域下的写指针同步到比较满的读时钟域下,所以有可能出现漏采的情况。但是出现漏采会产生影响吗。比如FIFO的深度是10,那么写指针的循环范围就是0到9,假如说漏采了3,4,5这几个信号,读时钟域直接采到了6这个信号,这个时候还在往FIFO里面写数,写指针也在一直变化,这个时候只会让FIFO的空信号可能还是拉高的,但是FIFO还一直在进数,所以只会造成一种FIFO里面不是空的,但是空信号还拉高的情况,这种情况也不会对FIFO的读写逻辑造成任何的错误,只会造成FIFO在读的时候延迟了几个时钟周期。比如实际上第二个时钟周期就把数写进了FIFO,但是第五个时钟周期读端口才反应过来FIFO里面不是空的了。

读快写慢

进行空判断的时候需要将满时钟域下写指针同步到比较快的读时钟域下,所以不会出现漏采的情况。但是同步也是需要时间的,所以空信号可能会提前出现,也就是并不是真正的读空了,这个情况也不会造成FIFO的读写逻辑出现错误。

进行满判断的时候就需要将较快时钟域下的读指针同步到较慢时钟域下进行判断了,这个时候就可能出现漏采的情况。这个时候如果出现漏采,那么就会出现一种情况就是一个数据已经被读出去了,但是同步的时候没有被采样到,导致写时钟域下去判断满信号的时候认为这个时候FIFO满了,所以会出现假满的情况,但是这个也不会影响FIFO的读写正确性。

结论

也就是说FIFO的读写指针可能会产生漏采,但是这个漏采只可能导致FIFO的性能下降,而不会产生读写数据的错误。另外就是FIFO的空满信号可能会出现假空假满的情况。

标签:异步,漏采,读写,FIFO,信号,准确,时钟
From: https://www.cnblogs.com/A1112day/p/18450182

相关文章

  • `std::future`--异步的优势
    std::future相比于直接使用线程在C++中有几个重要的优势,主要体现在同步结果获取、简化代码管理、以及更安全的异步任务管理等方面。以下是std::future的一些主要优势:1.自动结果获取与同步std::future提供了一种便捷的机制来获取异步任务的返回值。当我们使用线程时,通常......
  • 【机器学习】集成学习——提升模型准确度的秘密武器
    【机器学习】集成学习——提升模型准确度的秘密武器1.引言集成学习(EnsembleLearning)是一种通过结合多个弱模型来提升整体预测准确性的技术。通过将多个模型的预测结果进行组合,集成学习在复杂任务中展现了极强的泛化能力。本文将探讨集成学习的主要方法,并通过代码示例演......
  • django + redis + celery 异步任务
    目录结构E:.│db.sqlite3│Dockerfile│manage.py│requirements.txt│├─celery_tasks#自定义一个celery的工作目录││config.py#celery配置文件││__init__.py│││├─sms│tasks.py#worker任务│__init__.py│......
  • C# - 异步编程 - BackgroundWorker 类
    后台线程,BackgroundWorker类用于创建一个线程,在后台持续运行以完成某项工作,并不时地与主线程通信。BackgroundWorker类的属性,方法与事件。属性:WorkerReportsProgress:设置后台任务是否可以把它的进度汇报给主线程。WorkerSupportsCancellation:是否支持从主线程取消。IsB......
  • 爬虫——同步与异步加载
     一、同步加载同步模式--阻塞模式(就是会阻止你浏览器的一个后续加载)停止了后续的解析因此停止了后续的文件加载(图像)比如hifini音乐网站二、异步加载异步加载--xhr(重点)比如腾讯新闻,腾讯招聘等三、同步加载和异步加载的区分1.网页数据返回的方式(数据返回给你客户端......
  • 使用微服务Spring Cloud集成Kafka实现异步通信(消费者)
    1、本文架构本文目标是使用微服务SpringCloud集成Kafka实现异步通信。其中KafkaServer部署在Ubuntu虚拟机上,微服务部署在Windows11系统上,KafkaProducer微服务和KafkaConsumer微服务分别注册到Eureka注册中心。KafkaProducer和KafkaConsumer之间通过KafkaServer实现异......
  • 设计模式:异步处理文件常用设计模式
    引言在java中,基于系统系统性能考虑,大文件导入和导出大多采用异步模式。那么如何设计既不会造成代码冗余也有利于后续更好的扩展呢?以下将介绍三种不同的设计方案:正文1.工厂模式+模板方法模式1.1.设计思路使用工厂模式创建不同的文件导入处理器(如CSV导入、Excel导......
  • HarmonyOs DevEco Studio小技巧24--异步编程(Promises、async/await)
    异步编程:调用后耗时,不阻塞代码继续执行,将来完成后,触发回调函数传递结果异步编程的范畴:网络请求(如使用 fetch 或 XMLHttpRequest 发送HTTP请求获取数据)。文件读写操作(读取或写入本地文件)。数据库操作(查询、插入、更新、删除数据)。定时器函数(如 setTimeout 和 setInt......
  • 异步
    javascript中的异步编程允许您执行api调用、读取文件或查询数据库等任务,而不会阻塞其他代码的执行。这在javascript中至关重要,尤其是在web开发中,响应能力和性能是关键。关键概念1。回调:作为参数传递给另一个函数的函数,该函数在异步操作完成后执行。示例:functionfetchdata......
  • Don't Block on Async Code 不要阻止异步代码
    翻译自 Don'tBlockonAsyncCode(stephencleary.com)ThisisaproblemthatisbroughtuprepeatedlyontheforumsandStackOverflow.Ithinkit’sthemost-askedquestionbyasyncnewcomersoncethey’velearnedthebasics.这是论坛和StackOverflow上反复......