异步fifo(1)

什么时异步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里面读不出来?答案是不会,同步时虽然延迟了两个信号,但是最终还是会同步到跨时钟域,所以假读空信号不会一直有效,还是会在延后几个周期把数据读出来。
  

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

libevent:windows环境配置+QT使用

目录 libevent是什么 编译 QT使用 测试代码 libevent是什么 Fast portable non-blocking network programming with Libevent http://www.wangafu.net/~nickm/libevent-book/TOC.html 这篇文档讲的很清楚,尤其是Chapter 1: A tiny introduction to asynchro…

解决打开excel时报错 “不能使用对象链接和嵌入”

问题截图 打开excel文件或者插入对象时,直接弹出不能使用对象链接和嵌入报错信息。 解决方法 按 winr 组合快捷键,打开运行,输入 dcomcnfg.exe 按回车确定 此时进入到组件服务管理界面,依次选择 组件服务-计算机-我的电脑-DOCM…

JDK 下载 华为云镜像站 地址

通常去 Oracle 官网下载 JDK,速度很慢而且需要账号登入 Oracle 官网下载地址 https://www.oracle.com/cn/java/technologies/downloads/archive/ JDK 下载 华为云镜像站 地址 https://repo.huaweicloud.com/java/jdk/ 我们下期见,拜拜!

LCD-STM32液晶显示中英文-(7.字模及显示原理)

目录 字模介绍 什么是字模 字模的构成 字模显示原理 字模制作 如何制作字模 字模寻址公式 存储字模文件 字模介绍 什么是字模 有了编码,我们就能在计算机中处理、存储字符了,但是如果计算机处理完字符后直接以编码的形式输出,人类将难…

位运算常见算法题

文章目录 前言191. 位1的个数338. 比特位计数461. 汉明距离136. 只出现一次的数字260. 只出现一次的数字 III面试题 01.01. 判定字符是否唯一268. 丢失的数字371. 两整数之和137. 只出现一次的数字 II面试题 17.19. 消失的两个数字 前言 本篇文章会涉及多道位运算题目&#xf…

Vue中的事件处理

一,基本使用 1.使用v-on:事件名或者事件名绑定事件 常见的事件有: onclick, 鼠标单击事件; ondblclick, 鼠标双击事件;onmousedown,鼠标按下去的事件;onmouseup,鼠标弹起事件; onmouseover,onmouseente…

【代码随想录 | Leetcode | 第六天】链表 | 反转链表 | 两两交换链表中的节点 | 删除链表的倒数第 N 个结点

前言 欢迎来到小K的Leetcode|代码随想录|专题化专栏,今天将为大家带来反转链表、两两交换链表中的节点和删除链表的倒数第N个节点的分享✨ 目录 前言206. 反转链表24. 两两交换链表中的节点19. 删除链表的倒数第 N 个结点总结 206. 反转链表 ✨题目链接点这里 给你…

【蓝图】p27开关门互动实现

p27开关门互动实现 创建一个门 添加初学者内容包 拖拽一个门到场景中 添加一个碰撞 创建盒体触发器 左侧模式->基础->盒体触发器,拖拽到门上,调整大小 开关门互动实现 做一个开门互动 要把开门逻辑写在关卡蓝图里 门设置为可移动 打开关卡蓝…

MySQL-DDL-表的结构-查询修改删除

DDL(表操作) 查询 查询当前数据库所有表:show tables 查询表结构:desc 表名 查询建表语句:show create table 表名 修改(主要还是通过图形化界面进行操作) 添加字段:alter table …

LayUi之手风琴的趣味案例

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于LayUi的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.手风琴是什么 二.手风琴在什么时候使用…

业务开发“银弹” ——低代码开发平台

一、现状 低代码开发平台要让每个人,包括开发者和普通业务人员,都能够成为企业数字化过程中的主导者和构建者!让普通人更容易上手! 基于这一目标,应用需求多的云服务商成为低代码投资的主要来源。一家云服务商如谷歌云…

AD从原理图到PCB超详细教程

AD超详细教程 前言一、建立一个工程模板二、原理图1.设计原理图。2.使用AD自带库和网上开源原理图库3.画原理图库4.编译原理图 三、PCB1.确定元器件尺寸大小2.绘制PCB Library①使用元器件向导绘制元件库②原理图与PCB的映射 3.绘制PCB①更新PCB②调整元件位置③布线④漏线检查…

代理模式【静态代理和动态代理实现业务功能扩展】

静态代理 我们在不修改业务的情况下想要给它增加一些功能,这就需要使用代理模式。我们不会在原有业务上直接修改,为了避免修改导致程序不可逆转的破坏。三种角色:抽象角色-接口、真实角色-实现类和代理角色-代理类。真实角色和代理角色继承的…

raid5故障导致上层文件系统不可用的服务器数据恢复案例

服务器数据恢复环境: 一台服务器上有两组分别由4块SAS硬盘组建的raid5磁盘阵列,这两组raid5阵列划分LUN并组成LVM结构,格式化为EXT3文件系统。 服务器故障: 一组raid5阵列上的一块硬盘未知原因离线,热备盘上线替换离线…

Redis远程字典服务

目录 前言 1.NoSQL 1.1NOSQL和关系型数据库比较 1.2非关系型数据库的优势 1.3关系型数据库的优势 ​编辑 2.主流的NOSQL产品 键值(Key-Value)存储数据库 列存储数据库 文档型数据库 图形(Graph)数据库 3.Redis简介 redis的应用场景 4.命令操作 4.1字符串类型 s…

Linux内核的任务:

硬件与软件之间的中间层:内核在技术层面上充当硬件和软件之间的中间层,负责将应用程序的请求传递给硬件,并处理硬件设备和组件的寻址和操作。 应用程序的接口:对于应用程序来说,内核是它们与硬件之间的接口。应用程序通…

vscode 端口转发实现端口映射,实现端口自由

用vscode连接server进行开发, 是非常方便的,但很多时候,server的端口开放的很有限,那么就可以利用vscode进行端口映射 举一个应用场景: 先通过A利用vscode 连接B,然后再vscode 的port窗口进行端口转发&…

每日一刷——替换空格

题目描述: 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 我的思路:从左向右循环遍历字符串,定义一个空串。如果遇到空格&#xf…

【广州华锐互动】VR地铁消防逃生路线演练系统

随着城市轨道交通的不断发展,事故应急演练的重要性也越来越受到重视。而VR技术的应用,为地铁消防逃生路线演练带来了许多亮点,包括以下几个方面: 首先,VR技术可以提供高度真实的模拟场景。在传统的事故应急演练中&…

Lottie源代码解析

Lottie-iOS Lottie动画的原理: 一个完整动画View,是由很多个子Layer 组成,而每个子Layer主要通过shapes(形状),masks(蒙版),transform三大部分进行动画。Lottie框架通过…