异步FIFO设计的仿真与综合技术(1)

概述

        本文主体翻译自C. E. Cummings and S. Design, “Simulation and Synthesis Techniques for Asynchronous FIFO Design 一文,添加了笔者的个人理解与注释,文中蓝色部分为笔者注或意译。

摘要(ABSTRACT

        FIFO通常被用于将数据从一个时钟域传输到另一个异步时钟域。使用FIFO将数据从一个时钟域传递到另一个时钟域需要多异步时钟设计技术。设计一个合适的异步FIFO是很困难的

        本文将详细介绍一种异步FIFO的设计方法,读/写指针使用格雷码进行编码(即使用格雷码指针),在判断FIFO空/满之前,将读/写指针同步到对侧(对侧含义:读指针同步到写时钟域,写指针同步到读时钟域)。本文包括完全的编码、综合和分析的RTL Verilog模型。

1.0 引言(Introduction)

        异步FIFO指的是:数据值从一个时钟域写入FIFO缓冲区,从另一个时钟域的同一FIFO缓冲区读出(这两个时钟域是异步的)一种FIFO设计。

        异步FIFO用于将数据从一个时钟域安全地传递到另一个时钟域(也就是我们经常说的FIFO用于跨时钟域传输)。

        异步FIFO的设计方法很多,但是其中包括很多错误的方法。大多数错误实现的FIFO设计仍然在90%的时间内正常运作,大多数几乎正确的FIFO设计能在99%+的时候正常运作。不幸的是,正常工作99%+的设计缺陷通常是最难检测和调试的,或者就是诊断和被召回时最昂贵的。

        简单说就是设计异步FIFO的方法很多,但是很多设计方法是错误的,但是这些错误的设计能在大部分时间正确运行,可是一旦发生错误,弥补起来代价就很大。

        本文讨论了异步FIFO设计风格和FIFO设计时必须考虑的重要细节。在本文的其余部分只是简单地将“异步FIFO”称为“FIFO”。

2.0 传递多个异步信号(Passing multiple asynchronous signals

        尝试将多个变化中的信号从一个时钟域同步到另一个新的时钟域,并且还要保证所有变化中的信号同步到新时钟域的相同时钟周期已经被证明是有问题的。FIFO用于将多位的数据从一个时钟域安全地传递到另一个时钟域。通过一个时钟域中的控制信号将数据放入FIFO缓冲存储器阵列中(写FIFO操作),并通过来自第二个时钟域的控制信号从同一FIFO缓冲存储器阵列的另一个端口取出这些数据字(读FIFO操作)。从概念上讲,这样去设计一个FIFO的似乎很容易。

        FIFO设计的核心(难点)在于设计FIFO的指针(读/写指针,也有地方成为读/写地址),并且找到一种合适且稳定的方式来生成空/满信号(用来指示FIFO的full/empty状态)。

2.1 同步FIFO指针(Synchronous FIFO pointers)

         对于同步FIFO设计(读写操作处于同一个时钟域下),可以通过一个计数器来获取FIFO当前数据数量信息(只读不写:计数器递减,只写不读:计数器递减,不读不写/既读又写:计数器不变)当FIFO计数器达到设定的阈值时,FIFO为满,而当FIFO计数器为零时,FIFO为空。

这种方法我们称之为计数法,关于这种设计方法的细节内容,可以阅读:同步FIFO的verilog实现(1)——计数法icon-default.png?t=N7T8https://blog.csdn.net/apple_53311083/article/details/132381065?spm=1001.2014.3001.5501

        不幸的是,对于异步FIFO设计,不能使用增量-递减的FIFO填充计数器(也就是我们上面讲的计数法),因为需要两个不同的异步时钟来控制计数器。如果要确定异步FIFO设计的满状态和空状态,则必须对写指针和读指针进行比较。

2.2 异步FIFO指针(Asynchronous FIFO pointers)

        为了理解FIFO的设计,我们需要了解FIFO指针是如何工作的。写指针总是指向下一个要写入的位置;因此,在复位时,两个指针都被设置为零,这恰好也是下一个要写入的FIFO数据的位置。在FIFO写操作中,数据被写到写指针所指向的内存位置,然后增加写指针以指向下一个要写入的位置。

        相似的,读指针总是指向当前要读取的FIFO数据。同样,在复位时,两个指针都重置为零,FIFO为空,读指针指向无效数据(因为FIFO为空,生效空标志)。一旦第一个数据被写入FIFO,写指针增加,清除空标志,读指针仍然寻址第一个FIFO内存的内容,并且立即将第一个有效数据驱动到FIFO数据输出端口,数据准备读出。读指针总是指向下一个要读取的FIFO数据,这意味着接收器逻辑不必使用两个时钟周期来读数据。如果接收方在读取FIFO数据之前必须先增加读指针,接收器将需要一个时钟周期来从FIFO输出数据,再通过一个时钟周期捕获数据到接收器中。这将造成不必要的效率降低。

        当两个指针相等时,FIFO为空。这种情况发生在(1)复位操作,两个指针都被复位到0;(2)读指针追上写指针,读出了FIFO中的最后一个数据。

        当两个指针再次相等时,FIFO为满,当写指针转了一圈折回来(wrapped around)又追上了读指针,此时FIFO为满。这就造成了一个问题,读写指针相等时,FIFO到达是空的还是满的?

        有一种计数可以实现FIFO空和满的区分,方法是给每一个指针(读和写)都额外增加一位。当写指针的增量超过最终的FIFO地址时,写指针将增加未使用的MSB,同时将其余的位设置为零,如图1所示(FIFO已经卷起:wrapped并切换了指针的MSB)。读指针也是这样相同的操作。如果两个指针的MSB位不同,这意味着写指针比读指针多回卷(wrapped)了一次。如果两个指针的MSB相同,这意味着两个指针回卷的次数相同。这种方法,我们称之为高位扩展法,关于这部分的详细内容,可以阅读

同步FIFO的verilog实现(2)——高位扩展法icon-default.png?t=N7T8https://blog.csdn.net/apple_53311083/article/details/132740196?spm=1001.2014.3001.5501

        使用n-bit指针,其中(n-1)是访问整个FIFO内存缓冲区所需的地址位数,当包括MSB在内的两个指针相等时,FIFO为空。当两个指针除了MSB外都相等时,FIFO是满的。

        本文中的FIFO设计使用了一个具有2^{n-1}可写位置的FIFO的n位指针来帮助处理满和空条件。相关内容将在后文中展示。

异步FIFO设计的仿真与综合技术(2)icon-default.png?t=N7T8https://blog.csdn.net/apple_53311083/article/details/132856486?spm=1001.2014.3001.5501

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

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

相关文章

万物目标识别——Detic使用图像级别的监督信号来进行目标检测模型推理(C++/Python)

一、目标识别 1.1 传统目标识别算法 传统目标检测通常将分类(确定物体属于哪个类别)和定位(确定物体的位置,通常使用边界框bbox表示)任务耦合在一起。这要求训练数据集中包含每个物体的类别标签以及其对应的bbox位置…

【开发】视频监控平台EasyCVR分组批量绑定/取消通道功能的后端代码设计逻辑介绍

视频监控平台/视频存储/视频分析平台EasyCVR基于云边端一体化管理,可支持视频实时监控、云端录像、云存储、磁盘阵列存储、回放与检索、智能告警、平台级联等功能。安防监控平台在线下场景中应用广泛,包括智慧工地、智慧工厂、智慧校园、智慧社区等等。 …

【Flink实战】玩转Flink里面核心的Sink Operator实战

🚀 作者 :“大数据小禅” 🚀 文章简介 :玩转Flink里面核心的Sink Operator实战 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 目录导航 Flink Sink Operator简介Flink 核心知识 Sink Operator速览Fl…

便捷高效的查询系统

今天我要来给大家种草一个超级好用的教学工具——易查分!使用易查分,老师们可以轻松制作一个方便快捷的成绩查询系统,让查询成绩变得简单又高效。下面就让我来为大家详细介绍一下使用教程吧! 是不是想有个自己的分班or成绩查询页面…

Eclipse官网下载历史版本

进入官网 https://www.eclipse.org/ 进入下载页面 选择下载包 同一版本,又有不同类型 Eclipse IDE for Enterprise Java and Web Developers Eclipse IDE for Java Developers 任何Java开发人员必备的工具,包括Java IDE、Git客户端、XML编辑器、Mave…

Unity实现用WASD控制一个物体前后左右移动-小白课程01

1 根据业务逻辑搭建场景 02 根据业务写代码 using System.Collections; using System.Collections.Generic; using UnityEngine;//实现让被挂在的物体往前移动 //按下W键往前移动,按下S键往后移动 public class RoleMove : MonoBehaviour { public float myspe…

新手询问想要成功学好嵌入式开发有什么建议吗?

今日话题,想要成功学好嵌入式开发有什么建议吗?想要学好的话选择一门合适的编程语言是关键。虽然嵌入式开发支持多种语言,但C和C仍然是最常用的。如果你是初学者,从学习C语言开始是一个不错的选择。它相对容易学习,而且…

C++(day5)

思维导图 小练习 实现一个图形类(Shape),包含受保护成员属性:周长、面积,公共成员函数:特殊成员函数书写 定义一个圆形类(Circle),继承自图形类,包含私有属性…

Python下载、安装及如何配置Pycharm(Windows 11)详细教程

本文介绍在Windows 11系统Python的下载、安装及配置Pycharm 一、下载 官网地址:https://www.python.org/downloads/windows/ 1、选择Python 3.10.5版本下载 二、安装 1、选择自定义安装 2、全部默认勾选,点击Next 3、自定义安装路径 建议勾选inst…

计算机竞赛 推荐系统设计与实现 协同过滤推荐算法

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 推荐系统设计与实现 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1…

Matplotlib渲染3D模型【Wavefront .OBJ】

推荐:用 NSDT编辑器 快速搭建可编程3D场景 Matplotlib 有一个非常漂亮的 3D 界面,具有许多功能(和一些限制),在用户中非常受欢迎。 然而,对于某些用户(或者可能对于大多数用户)来说&…

基于Android 语音朗读书籍管理系统

视频演示: 基于Android 语音朗读书籍管理系统 基于 Android 的语音朗读书籍管理系统可以提供用户管理书籍、朗读书籍的功能。以下是一个简单的步骤和功能列表: 用户注册和登录功能: 用户可以注册新账号或使用现有账号登录系统。用户信息可以包…

软件自动化测试有哪些步骤?自动化测试需要找第三方检测机构吗?

您是否曾经因为软件出现问题而影响了工作进程或者个人生活的正常运转?那么,您是否了解软件自动化测试这一神奇的技术?在这篇文章中,我们将为您介绍软件自动化测试的定义和测试步骤,帮助您更好地了解自动化测试。 一、什么是软件自动化测试…

预约微信小程序源码系统制作搭建 适用于多场景 支持万能DIY功能

分享一个预约微信小程序源码系统,适用于多种预约场景,含完整代码包前端后端详细的搭建教程,支持万能DIY功能,让你轻松开发制作一个属于自己的想要的预约小程序。 一、预约微信小程序源码系统制作搭建的基本步骤和注意事项&#xf…

第5篇 vue的通信框架axios和ui框架-element-ui以及node.js

一 axios的使用 1.1 介绍以及作用 axios是独立于vue的一个项目,基于promise用于浏览器和node.js的http客户端。 在浏览器中可以帮助我们完成 ajax请求的发送在node.js中可以向远程接口发送请求 1.2 案例使用axios实现前后端数据交互 1.后端代码 2.前端代码 &…

拿走吧你,Fiddler模拟请求发送和修改响应数据

模拟伪造请求 方法一:打断点模拟HTTP请求 1、浏览器页面填好内容后(不要操作提交),打开fiddler,设置请求前断点,点击菜单fiddler,”Rules”\”Automatic Breakpoints”\”Before Requests” 2、在页面上点…

批量复制文件到指定文件夹,智能跳过相同文件名!

大家好!在进行文件管理的过程中,如果需要将大量文件快速复制到指定文件夹,并避免重复文件名带来的混乱,传统的手动操作可能会非常繁琐和耗时。为了让您能够高效地完成这一任务,我们为您提供了一种智能方法,…

SpringMVC之综合案例:参数传递,向页面传参,页面跳转

参数传递向页面传参页面跳转 1.参数传递 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"htt…

长胜证券:三大拐点共振 看好智能驾驶新一轮行情

摘要 【长胜证券&#xff1a;三大拐点共振 看好智能驾驭新一轮行情】长胜证券研报指出&#xff0c;全球共振&#xff0c;国内智驾商场正迎来三大拐点&#xff1a;1&#xff09;技能上&#xff0c;“BEV Transformer数据闭环”新架构2023年开端上车&#xff0c;使得不依靠高精地…

HONEYWELL 0574-A-012 0574-A-0131 编码器模块

HONEYWELL 0574-A-012 0574-A-0131 编码器模块是一种用于测量旋转或线性位置的设备&#xff0c;通常用于自动化系统、机器控制和传感器应用。以下是HONEYWELL 0574-A-012 0574-A-0131 编码器模块可能具备的一些常见产品特点&#xff1a; 高精度测量&#xff1a;HONEYWELL 0574-…