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

news2025/5/26 4:58:16

概述

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

异步FIFO设计的仿真与综合技术(2)icon-default.png?t=N7T8https://blog.csdn.net/apple_53311083/article/details/132856486?spm=1001.2014.3001.5502        我们继续书结上回,来学习为什么异步FIFO中格雷码的使用

3.0 格雷码计数器(Gray code counter)

        格雷码是以Frank Gray的名字命名的,他在1953年最初申请该编码专利,设计一个格雷码计数器有多种方法。本节详细介绍了一种简单而直接的设计方法。本文中描述的技术只使用了一组触发器作为格雷码计数器,第二种使用两组触发器来实现更高速度的方法在第4.0节中展示。

3.1 格雷码模式(Gray code patterns)

        我们希望同时创建一个n位格雷码计数器和一个(n-1)位格雷码计数器(原因后面会说)。分别创建两个计数器当然很容易,但是创建一个通用的n位格雷码计数器,然后修改第二个MSB,通过共享LSBs构成一个(n-1)位格雷码计数器也是很容易和高效的。在本文中,这种方法被称为“双n位格雷码计数器”(dual n-bit Gray code counter)。

        为了更好地理解将n位格雷码转换为(n-1)位格雷码的问题,我们考虑创建一个双4位和3位格雷码计数器的示例,如图2所示 。

        最常见的格雷码,如图2所示,是一个反射(reflected)编码,其中除了MSB位之外,任何列中的位都关于序列中点对称。这意味着4位格雷码的后半部分是MSB倒置的前半部分的镜像。        

        要把一个4位格雷码转换到3位,我们不希望4位序列的后半部分的LSBs是前半部分的LSBs的镜像,相反,我们希望后半部分的LSBs重复前半部分的4位LSBs。

        经过更仔细的检查,很明显,反转4位格雷码的后半部分的第二个MSB(第二高位,这里指的就是从右往左数第二位)将在4位序列的三个LSB中产生所需的3位格雷码序列。唯一的问题是,具有额外MSB的3位格雷码不再是真正的格雷码,因为当序列从7(格雷码0100)改为8(~格雷码1000),再从15(~格雷码1100)改为0(格雷码0000)时,两位变化而不是一位。一个真正的格雷码在相邻数据之间只改变一位(这部分内容结合上面的图二应该解释的比较清楚)。

3.2 格雷码计数基础(Gray code counter basics)

        关于格雷码,我们首先要明确的就是:任意两个相邻数之间的代码距离只有1(从一个格雷码变到相邻的另一个格雷码的时候,只有一个位可以改变)。第二点需要明确的是:当计数总量为2的幂次时,格雷码计数最有效。可以制作一个计数偶数个序列的格雷码计数器,但对这些序列的转换通常不像标准的格雷码那么简单。还要注意,没有计数奇数的格雷码计数器,所以人们不能制作一个计数值为23的格雷码代码。基于此,本文所设计的FIFO的深度被设置为2^{n}

        图3是一个样式为#1的双n位格雷码计数器的框图。样式#1格雷码计数器假设寄存器位的输出是格雷码值本身(ptr、wptr或rptr)。格雷码输出被传递到格雷码-二进制转换器(bin),bin被传递到一个条件二进制值递增器以生成下一个二进制计数值(bnext),bnext被传递到二进制-格雷码转换器,该转换器生成下一个格雷码计数值(gnext),gnext被传递到寄存器输入。图3方框图的上半部分表示了所描述的逻辑流,而下半部分表示了下一节中描述的第二个格雷码计数器相关的逻辑。

3.3 双n位格雷码计数器(Dual n-bit Gray code counter)

        双n位格雷码计数器同时生成n位格雷码序列(见第3.2节所述)和(n-1)位格雷码序列。

        (n-1)位格雷码只是通过对n位格雷码的两个MSB进行异或操作来生成,以生成(n-1)位格雷码的MSB。这与n位格雷码计数器的(n-2)个LSBs结合起来,形成(n-1)位格雷码计数器。

        这里我们来简单解释一下,从3.1节中,我们知道,n-1位格雷码的生成方式是把格雷码的下半部分(MSB为1的部分)的第二高位(第二个MSB)翻转(0变1,1变0),这里我们的gnext[n-1]其实就是我们的MSB(在这里甚至可以直接理解成就是1),gnext[n-2]就是我们的第二个MSB,也就是gnext[n-2]与数据1进行异或操作,我们知道0和1异或结果是1,1和1异或结果是0,也就完成了第二高位的翻转,然后与剩下的LSBs进行拼接,就得到了n-1位的格雷码。

3.4 关于格雷码计数器的额外注意事项(Additional Gray code counter considerations)

        二进制值递增器采用“如果未满”或“如果未空”测试,以确保适当的FIFO指针在FIFO满或FIFO空条件期间不会增加。

        如果在生效FIFO满条件时,向FIFO发送数据的逻辑块能可靠地停止发送数据,则可以通过从FIFO写指针中删除FIFO满测试逻辑来简化FIFO设计。

        FIFO指针本身并不保护FIFO缓冲区被覆盖(写覆盖,在写过数据的地方继续写,覆盖原有的数据),但是FIFO额外的条件逻辑可以被添加到FIFO内存缓冲区,以确保在FIFO满状态下写使能信号不能被激活。

        可以向指针设计中添加一个附加的“sticky”状态位,即ovf(overflow,溢出)或unf(underflow,下溢出),以指示在FIFO满期间发生额外的FIFO写操作或在FIFO空期间发生额外的FIFO读操作,以指示只有通过复位才能清楚的错误情况。

        一个安全、通用的FIFO设计将包括上述的保障措施,代价是稍大和可能较慢的实现。这是一个好主意,因为未来的同事可能会尝试在另一个设计中复制和重用代码,而不理解当前设计中所考虑的所有重要细节。

4.0 格雷码计数器-风格2(Gray code counter - Style #2)

        从本文的1.2版本开始,FIFO实现使用了格雷码计数器-样式#2,它实际上使用了两组寄存器来消除将格雷码指针值转换为二进制值的需要。第二组寄存器(二进制寄存器)也可以用于直接寻址FIFO存储器,而不需要将存储器地址转换为格雷码。n-位的格雷码指针仍然需要将指针同步到相反的时钟域,但是n-1位的二进制指针可以直接用来处理内存。二进制指针还使运行计算更容易,以生成“几乎满”和“几乎空”的位(在本文中没有显示)。

 

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

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

相关文章

29.Xaml TreeView控件---->树形控件,节点的形式显示数据

1.运行效果 2.运行源码 a.Xaml源码 <Window x:Class="testView.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mic…

栈和队列讲解

栈和队列 栈和队列3.1 栈和队列的定义和特点3.2 案例引用3.3 栈的顺序表示和实现3.4 栈的链式表示和实现3.5 队列的顺序表示和实现3.6 队列的链式表示和实现 3.1 栈和队列的定义和特点 栈 (stack) 是限定仅在表尾进行插入或删除操作的线性表。 因此&#xff0c; 对栈来说&…

树莓派4B使用Docker部署SpringBoot项目——(一)树莓派安装docker

使用Shell7连接树莓派&#xff0c;命令行执行安装命令&#xff0c;等待安装成功即可。 apt install docker.io执行docker version查看docker版本信息。 其他docker命令。 docker images 查看镜像 docker ps -a 查看所有容器 docker ps 查看运行的容器

社区分享|MeterSphere变身“啄木鸟”,助力云帐房落地接口自动化测试

云帐房网络科技有限公司&#xff08;以下简称为“云帐房”&#xff09;成立于2015年3月&#xff0c;以“成为最值得信赖的税务智能公司”为愿景&#xff0c;运用人工智能、大数据等互联网技术&#xff0c;结合深厚的财税行业服务经验&#xff0c;为代账公司和中大型企业提供智能…

Linux中使用Docker安装ElasticSearch7.10.x集群

使用Docker安装ElasticSearch7.10.x单节点请访问这里 一、集群环境说明 服务器IP地址192.168.137.1&#xff0c;192.168.137.2&#xff0c;192.168.137.3 二、前期准备 1. 拉取镜像 docker pull elasticsearch:7.10.12. 首先需要创建一个用于生成秘钥的初始容器&#xff0…

一体化研发协作赋能平台:Apipost

作为一款专为程序员打造的API管理工具&#xff0c;Apipost也成为开发人员圈子里的一款热门工具。Apipost拥有强大的功能和便捷操作性&#xff0c;这也让许多开发者爱不释手。那么&#xff0c;Apipost到底有哪些吸引人的特点呢&#xff1f;本文将为您详细介绍。 统一API管理 Ap…

qt 移植到vs后,常见问题汇总????

1.第一次在VS中编译QT项目&#xff0c;因为在MinGW中不能编译带有qtwebengine的程序&#xff0c;因为这个引擎使用的google浏览器的内核&#xff0c;据QT官方的说法&#xff1a;google不喜欢MinGW,所以QT5.5以后的版本中带有这个模块的的部分将无法编译通过&#xff0c;我们只能…

《银河麒麟高级服务器操作系统V10》使用

一言而论&#xff1a;讲了麒麟服务器V10的基本使用&#xff0c;包括终端、VNC 文章目录 前言基本架构环境硬件环境软件环境 麒麟安装步骤1.在宿主机上安装好VM&#xff0c;并且激活2.使用VM创建虚拟机3.启动虚拟机 终端常用点VNC的使用麒麟上安装VNC服务器Windows上安装VNC客户…

在ie浏览器下解决pdfjs插件思源宋体字体部分无法识别问题

pdf文件正常 利用pdfis渲染出来就成这样了 查看了思源宋体是2017年发布,pdf版本是1.10.88 &#xff0c;推测可能由于版本问题部分字体映射没有&#xff0c;去官网拷贝了几个版本&#xff0c;在本地启服务测试了几个&#xff0c;为了兼顾ie浏览器兼容 &#xff0c;选择了2.0.94…

JVM参数配置

一、堆内存相关配置 复制代码 设置堆初始值 指令1&#xff1a;-Xms2g 指令2&#xff1a;-XX:InitialHeapSize2048m ​ ​ 设置堆区最大值 指令1&#xff1a;-Xmx2g 指令2&#xff1a; -XX:MaxHeapSize2048m ​ ​ 缩小堆内存的时机 -XX:MaxHeapFreeRatio70//堆内存…

视频怎么抠图换背景,怎么把视频后面的背景换掉?

视频中的背景可以直接影响整个视频的观感&#xff0c;有时候我们需要更换背景来达到更好的效果。而如何更换背景呢&#xff1f; 在视频制作中&#xff0c;更换视频背景可以为视频添加更好的视觉效果&#xff0c;增强观赏性和吸引力。例如&#xff0c;在拍摄一个演讲视频时&…

C++之打印编译全过程(二百一十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

驱动开发--汇总

一&#xff0c;【驱动相关概念】 1&#xff0c;什么是驱动 能够驱使硬件实现特定功能的软件代码 根据驱动程序是否依赖于系统内核将驱动分为裸机驱动和系统驱动 2&#xff0c;逻辑驱动和系统驱动的区别 裸机驱动&#xff1a;编写的驱动代码中没有进行任何内核相关API的调用…

小程序实现一个 倒计时组件

小程序实现一个 倒计时组件 需求背景 要做一个倒计时&#xff0c;可能是天级别&#xff0c;也可能是日级别&#xff0c;时级别&#xff0c;而且每个有效订单都要用&#xff0c;就做成组件了 效果图 需求分析 需要一个未来的时间戳&#xff0c;或者在服务度直接下发一个未来…

LeetCode-热题100-笔记-day23

104. 二叉树的最大深度https://leetcode.cn/problems/maximum-depth-of-binary-tree/ 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,1…

leetcode 332. Reconstruct Itinerary(重构行程)

有一些票tickets, tickets[ i ] [from, to], 每个出发到达城市名字都是3个大写英文字母&#xff0c; 同一个出发城市时&#xff0c;优先去字母顺序较小的到达城市。 必须先从“JFK”出发。 每个ticket必须用且只用一次&#xff0c;所有ticket一定会形成至少一个有效的行程&…

重建大师提交空三后引擎状态是等待,怎么开启?

答&#xff1a;图片中这是在自由网空三阶段&#xff0c;整个AT都是等待中&#xff0c;可以修改任务目录和监控目录看一下&#xff0c;先设置引擎&#xff0c;再提交空三。

【Unity】万人同屏, 从入门到放弃之——多线程RVO避障

不使用Dots能否实现海量物体同屏&#xff1f;很多场面宏大的游戏&#xff0c;尤其是Rougelike游戏&#xff0c;动辄成千上万满屏怪&#xff0c;割草清屏的快感酣畅淋漓&#xff0c;所以这类游戏非常火爆&#xff0c;然鹅是怎么做到的呢&#xff1f; 首先&#xff0c;海量移动物…

CRC(循环冗余校验码的校验方法)

5个关键点&#xff1a; 1.信息码&#xff1a;即给出要校验的二进制码 2.生成多项式&#xff1a;一般多项式会给&#xff0c;从最高位的指数位数就可以得到有几个校验码&#xff1b;如果没给多项式&#xff0c;肯定会给个多项式二进制码&#xff0c;根据它来推就行&#xff08;…

面试题:问js的forEach和map的区别

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 【国庆头像】- 国庆爱国 程序员头像&#xff01;总有一款适合你&#xff01; 前言 为什么要写这么一篇文章&#xff0c;原因是今天下午水群的时候&…