异步fifo(1)

news2024/11/25 4:19:51

什么时异步fifo

FIFO,即First In First Out ,是一种先进先出的数据缓存器,异步FIFO 是指读写时钟不一致,读写时钟是互相独立的。数据从一个时钟域写入FIFO缓冲区,并从另一个时钟域的同一FIFO缓冲区中读取数据,使用异步FIFO可以将数据安全地从一个时钟域传递到另一个时钟域。

异步fifo的组成

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

异步FIFO主要由以下几部分组成:双端口ram(即中心的部件)、左右两边的地址控制器,下面的两对D触发器。其中地址控制器负责控制地址自增加、将二进制地址转为格雷码以及解格雷码写指针产生逻辑、读指针产生逻辑及空满标志产生逻辑。两对D触发器 则负责将写地址同步至读时钟域、将读地址同步至写时钟域。我们知道,在异步FIFO,中读写操作是由两个完全不同时钟域的时钟所控制。在写时钟域部分,由写指针所产生逻辑生成写端口所需要的写地址和写控制信号;在读时钟域部分,由读指针产生逻辑生成读断口所需要的读地址和读控制信号。

FIFO的接口

宽度(width):FIFO一次读写操作的数据位,
深度(depth),FIFO可以存储多少个数据。
wfull:FIFO已满或将要满时由FIFO的状态电路送出的一个信号,以阻止FIFO的写操作继续向FIFO中写数据而造成溢出(overflow)。
rempty:FIFO已空或将要空时由FIFO的状态电路送出的一个信号,以阻止FIFO的读操作继续从FIFO中读出数据而造成无效数据的读出(underflow)。
wr_clk:写操作的工作时钟,在每个时钟沿来临时写数据。

rd_clk:读操作的工作时钟,在每个时钟沿来临时读数据。

w_en:异步FIFO的写使能

r_en:异步fifo的读使能
读指针:指向下一个读出地址,读完后自动加1。
写指针:指向下一个要写入的地址的,写完自动加1。
读写指针其实就是读写的地址,只不过这个地址不能任意选择,而是连续的。

如何判断空满?

我们知道,使用异步FIFO最重要的地方在于如何判断其空满。因为异步FIFO的读写使用了不同的时钟,因此不能采用常规的计数器方法来产生空满标志符。

当前的解决方法就是使用读写指针来判断,什么意思呢?当系统复位的时候读写指针全部清零,此时此刻读写指针相等时;当数据读出速率大于写入速率的时候,读指针赶上了写指针,FIFO为空,如图所示:
在这里插入图片描述

当读写指针指向了同一地址,但写指针超前整整一圈,这就说明整个fifo已经被写满了
在这里插入图片描述

为了区分到底是满状态还是空状态,我们可以在指针中添加在添加一位,这样的话,当写指针增加并越过最后一个FIFO地址时,将会直接进位,其他位置0;对读指针也进行同样的操作。因此对于深度为2^n的FIFO,其需要的地址宽度为n,需要的读写指针位宽为(n+1)位。举个例子:如对于深度为256的FIFO,需要采用8bit的地址宽度,读写指针则需要9位。

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

格雷码的使用

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

二进制转换为格雷码:二进制数的最高位保持不变, 后续位依次与前一位进行异或运算。判断读空时 :将写时钟域的写指针同步到读时钟,然后与读时钟域的读指针进行比较,每一位都完全相同才判断为读空;判断写满时:需要 写时钟域的格雷码wgray_next 和 被同步到写时钟域的读指针wr2_rp 高两位不相同,其余各位完全相同。

假空假满现象

这里有空两格问题需要讨论:使用格雷码进行空满判断一定正确么?如果不正确的话,是不是不应该使用该方法呢?我们一个一个问题来看。

首先我们先设想将读指针同步到写时钟域下:读指针同步到写时钟域需要时间T,在经过T时间后,可能原来的读指针会增加或者不变,也就是说同步后的读指针一定是小于等于原来的读指针的。写指针也可能发生变化,但是写指针本来就在这个时钟域,所以是不需要同步的,也就意味着进行对比的写指针就是真实的写指针。此时我们一定要记住,同步过来的读指针实际上是时间T之前的读指针,而并非此时此刻的读指针。如果我们进行写满判断的时候,此刻同步过来的读指针应该小于或等于此刻没有同步过来的读指针,就算出现了写满,那也是假满。还是可以往里面写的,但是我们不管真满假满,我们只知道满了。就不会往里面写数据了,那么这就不是一种错误设计。可以想象一下,假设一个深度为256的FIFO,在写到第254个数据的时候就报了“写满”,大不了FIFO的深度我少用一点点就是的。但是这是安全的
读空判断:如果我们在写时钟域下进行判空,即也就是同步后的读指针追上了写指针。但是原来的读指针是大于等于同步后的读指针的,所以实际上这个时候读指针实际上是超过了写指针。这种情况意味着已经发生了“读空”,却仍然有错误数据读出。所以这种情况就造成了FIFO的功能错误。这时候输出的是真空信号,但是会造成“读空”,所以不可取。因此万万不可以在写时钟域下进行判空。
接下来我们设想将写指针同步到读时钟域下:
  写指针同步到读时钟域需要时间T,在经过T时间后,可能原来的写指针会增加或者不变,也就是说同步后的写指针一定是小于等于原来的写指针的。读指针也可能发生变化,但是读指针本来就在这个时钟域,所以是不需要同步的,也就意味着进行对比的读指针就是真实的读指针。

读空判断:我们知道同步过来的写指针是小于此时此刻真实的写指针的,也就是说这种情况是“假读空”。。可以想象一下,假设某个FIFO,在读到还剩2个数据的时候就报了“读空”,大不了我先不读了,等数据多了再读,但是这也是安全的。
写满判断:也就是同步后的写指针超过了读指针一圈。我们知道同步过来的写指针是小于此时此刻真实的写指针的,所以实际上这个时候写指针已经超过了读指针不止一圈,这种情况意味着已经发生了“写满”,却仍然数据被覆盖写入。所以是不行的
  所以总结一下,判断读空在读时钟域,判断写满在写时钟域。那么假读空会不会造成有数据在FIFO里面读不出来?答案是不会,同步时虽然延迟了两个信号,但是最终还是会同步到跨时钟域,所以假读空信号不会一直有效,还是会在延后几个周期把数据读出来。
  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/771868.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

16. 存储过程和存储函数

文章目录 1.存储过程和存储函数2.创建和使用存储过程2.1 语法:2.2 第一个存储过程,打印hello world2.3 调用语法2.4 带参数的存储过程2.5 调试存储过程 3.创建和使用存储函数3.1 存储函数定义3.2 存储函数语法:3.3 存储函数案例: …

VR全景医疗:多渠道矩阵式使用,展现医疗实力

VR全景医疗的市场正在趋于成熟,医院将VR全景展示作为一种新颖的展示方式,在全景中嵌入官网,展现医院全貌,更可以凭借多渠道矩阵式使用,展现医疗实力,提高医院知名度。虽然这是一个全新的领域,但…

k8s1.18.20:cert-manager 1.8 安装部署

cert-manager 安装部署 一、官网安装文档 https://cert-manager.io/docs/installation/ 1.1、简介 cert-manager 在 Kubernetes 集群中增加了证书 (certificates) 和证书颁发者 (certificate issuers) 作为资源类型,并简化了获取、更新和应用这些证书的过程。 …

传统软件测试过程中的测试分工

最近看了点敏捷测试的东西,看得比较模糊。一方面是因为没有见真实的环境与流程,也许它跟本就没有固定的模式与流程,它就像告诉人们要“勇敢”“努力”。有的人在勇敢的面对生活,有些人在勇敢的挑战自我,有些人在勇敢的…

利用内存映射文件进行程序间通信2一代码

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 为了测试代码,需要分别创建两个应用程序文件。 窗体如下: 两个项目的代码在最前面添加: Impor…

新晋 Committer!来自复旦大学的帅哥一枚

点亮Star⭐️ 支持我们 https://github.com/apache/dolphinscheduler 最近,社区星力量又迎来一位新晋 Committer,这次是来自复旦大学研究生在读的王维饶同学,一起来认识一下吧! 个人简介 姓名:王维饶职位&#xff1a…

从0到1构建证券行业组织级项目管理体系的探索与实践︱东吴证券PMO负责人娄鹏呈

东吴证券股份有限公司信息技术总部PMO负责人娄鹏呈先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾,演讲议题:从0到1构建证券行业组织级项目管理体系的探索与实践。大会将于8月12-13日在北京举办,敬请关注! 议题简要&a…

简笔风和写实风的区别

现实主义和风格化 当我们谈论现实主义和风格化时,我们是什么意思?这看起来相当明显,现实主义指的是模仿逼真的逼真的图形。它不一定需要存在于现实世界中,但被传达为它属于我们的世界。10年前,我们认为现实的东西在今…

数据结构之vector的实现

数据结构之vector的实现 Vector类分为&#xff1a;构造函数、析构函数、只读函数、修改函数、私有函数、成员变量&#xff08;数据区和大小&#xff09; # include <iostream> # include <algorithm> # include <cstdlib># define DEFAULT_CAPACITY 3templat…

数学建模-图论 最短路径

作图 %% 注意&#xff1a;以下代码需要较新版本的matlab才能运行&#xff08;最好是2016版本及以上哦&#xff09; % 如果运行出错请下载新版的matlab代码再运行%% Matlab作无向图 % &#xff08;1&#xff09;无权重&#xff08;每条边的权重默认为1&#xff09; % 函数graph(…

SCT52A40,对标UCC27200、UCC27201半桥驱动IGBT/MOSFET栅极驱动器

特点&#xff1a; • 8-24V宽供电电压 • 驱动高侧和低侧N通道MOSFET • 4A峰值输出源电流和汇电流 • 升压电源电压范围可达120V • 集成阴极负载二极管 • TTL兼容输入&#xff0c;-10V输入 • 45ns传输延迟 • 1000pF负载下7ns上升和4.5ns下降时间 • 2ns延迟匹配时间 • 静…

[centos]安装mysql8.0.26

1、首先&#xff0c;根据自己的机子到MySQL官网下载对应的数据库https://dev.mysql.com/downloads/mysql/ 2、卸载mariadb&#xff0c;并解压Mysql 3、安装 rpm -ivh mysql-community-common-8.0.26-1.el7.x86_64.rpm --nodeps rpm -ivh mysql-community-libs-8.0.26-1.el7.x…

《向量数据库指南》:向量数据库Pinecone快速入门

目录 ⚠️警告 ℹ️注意 ⚠️警告 如何开始使用Pinecone向量数据库。 本指南介绍如何在几分钟内设置Pinecone向量数据库。 安装Pinecone客户端(可选)此步骤是可选的。只有在您想使用Python客户端时才执行此步骤。 使用以下shell命令安装Pinecone: Python pip insta…

potplayer放大画面,画面拖拽。备份

放大画面&#xff1a; 按住alt和鼠标左键&#xff0c;就可以拖动放大后的画面了 窗口化示图

UE4/5AI制作基础AI跳跃(适合新手)

目录 制作 添加逻辑 添加导航链接代理 结果 在上一章中&#xff0c;我们讲解了简单的AI跟随玩家&#xff0c;制作了一个基础的ai。 UE4/5AI制作基础AI&#xff08;适合新手入门&#xff0c;运用黑板&#xff0c;行为树&#xff0c;ai控制器&#xff0c;角色类&#xff0c;任…

TCP实现FTP功能

目录 server client makefile 运行顺序 FTP&#xff08;File Transfer Protocol&#xff09;是一种用于在计算机网络上传输文件的标准协议。 它允许用户通过网络将文件从一个计算机&#xff08;称为FTP服务器&#xff09;传输到另一个计算机&#xff08;称为FTP客户端&…

【Python】pyinstaller全新的打包方案,堪称完善!

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤-*- mode: python ; coding: utf-8 -*-剩下的项就省略了-*- mode: python ; coding: utf-8 -*-用一个函数选择性对依赖文件目标路径改名打印 a.binaries&#xff0c;检查依赖文件目标路径剩下的省略了2. 第二步&#xff…

Taurus .Net Core 微服务开源框架:Admin 插件【4-3】 - 配置管理-Mvc【Plugin-MicroService 微服务】

目录 1、系统配置节点&#xff1a;Mvc - Plugin - MicroService 配置界面&#xff1a;注册中心 2、系统配置节点&#xff1a;Mvc - Plugin - MicroService 配置界面&#xff1a;注册中心&#xff08;从&#xff09; 3、系统配置节点&#xff1a;Mvc - Plugin - MicroService…

代码随香录day21

235. 二叉搜索树的最近公共祖先 本题思路&#xff1a; 还是要利用二叉搜索树的特性&#xff0c;中序遍历为有序数组。如果pq两个节点都小于root&#xff0c;那么最近公共祖肯定是在他的左子树&#xff0c;如果都大于那么&#xff0c;肯定就在右子树。然后直接return root 代码…

C++编程(四) —— OOP

文章目录 前言一、this指针二、构造和析构三、深拷贝浅拷贝浅拷贝深拷贝 编程实践 前言 什么是OOP思想&#xff1f; OOP语言的四大特征&#xff1a; 抽象&#xff0c;封装/隐藏&#xff0c;继承&#xff0c;多态 一、this指针 this指针》类》很多对象 一套成员方法是如何处…