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

概述

        本文主体翻译自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.mzph.cn/news/78933.shtml

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

相关文章

自动化测试(五):自动化测试框架的搭建和基于yaml热加载的测试用例的设计

该部分是对自动化测试专栏前四篇的一个补充,本次参考以下文章实现一个完整的谷歌翻译接口自动化测试:   [1]【python小脚本】Yaml配置文件动态加载   [2]【python做接口测试的学习记录day8——pytest自动化测试框架之热加载和断言封装】 目标:框架封…

新增动态排序图、桑基图、AntV组合图,DataEase开源数据可视化分析平台v1.18.10发布

2023年9月14日,DataEase开源数据可视化分析平台正式发布v1.18.10版本。 这一版本的功能升级包括:数据集方面,对字段管理的后台保存做了相关优化,降低了资源消耗;仪表板方面,对联动、查询结果以及过滤组件等…

系统架构:软件工程速成

文章目录 参考概述软件工程概述软件过程 可行性分析可行性分析概述数据流图数据字典 需求分析需求分析概述ER图状态转换图 参考 软件工程速成(期末考研复试软考)均适用. 支持4K 概述 软件工程概述 定义:采用工程的概念、原理、技术和方法来开发与维护软件。 三…

GET,POST,DELETE,PUT参数传递的形式

一.get请求参数在地址后面进行拼接 1.代码&#xff1a; <template><div class""><button click"fn">点击</button></div> </template><script> import axios from "axios"; //安装完之后&#xff0…

MFC中嵌入显示opencv窗口

在MFC窗体中建立一个Picture Control控件,用于显示opencv窗口 在属性中设置图片控件的资源ID为IDC_PIC1 主要的思路: 使用GetWindowRect可以获取图片控件的区域 使用cv::resizeWindow可以设置opencv窗口的大小,适合图片控件的大小 使用cvGetWindowHandle函数可以获取到ope…

OpenCV(四十二):Harris角点检测

1.Harris角点介绍 什么是角点&#xff1f; 角点指的是两条边的交点&#xff0c;图中红色圈起来的点就是角点。 Harris角点检测原理&#xff1a;首先定义一个矩形区域&#xff0c;然后将这个矩形区域放置在我的图像中&#xff0c;求取这个区域内所有的像素值之和&#xff0c;之…

麒麟v10安装mysql(ARM架构)

下载MYSQL安装包 华为开源镜像站_软件开发服务_华为云 上面的选择一个下载 或者用命令下载 wget https://repo.huaweicloud.com/kunpeng/yum/el/7/aarch64/Packages/database/mysql-5.7.27-1.el7.aarch64.rpm 检查是否已经安装MySQL rpm -qa | grep mysql将包卸载掉 rpm -…

图论第三天|130. 被围绕的区域、417. 太平洋大西洋水流问题、827. 最大人工岛

130. 被围绕的区域 文档讲解 &#xff1a;代码随想录 - 130. 被围绕的区域 状态&#xff1a;开始学习。 思路&#xff1a; 步骤一&#xff1a; 深搜或者广搜将地图周边的 ‘O’ 全部改成 ’A’&#xff0c;如图所示&#xff1a; 步骤二&#xff1a; 再遍历地图&#xff0c;将 …

JWT 安全及案例实战

文章目录 一、JWT (json web token)安全1. Cookie&#xff08;放在浏览器&#xff09;2. Session&#xff08;放在服务器&#xff09;3. Token4. JWT (json web token)4.1 头部4.1.1 alg4.1.2 typ 4.2 payload4.3 签名4.4 通信流程 5. 防御措施 二、漏洞实例&#xff08;webgoa…

API原理概念篇(六)玩转正则表达式等常用API

一 玩转正则表达式等常用API ① 正则 1、openresty存在两套正则表达式规范1) lua自身独有的正则规范 备注&#xff1a;大约有5%&#xff5e;15%性能损耗损耗原因&#xff1a;表达式compile成pattern,并不会被缓存,每次都会被重新compile编译2) nginx的符合POSIX规范的PCR…

集合减法【新思路】

#include<stdio.h> int main() {int n,m,flag0;int x;int a[100001]{0},b[100001]{0};scanf("%d %d",&n,&m);以集合A所有元素作为数组下标映射值成1 for (int i 0; i < n; i) {scanf("%d", &x);a[x] 1; }以集合B所有元素作为数组下…

生产消费者模型的介绍以及其的模拟实现

目录 生产者消费者模型的概念 生产者消费者模型的特点 基于阻塞队列BlockingQueue的生产者消费者模型 对基于阻塞队列BlockingQueue的生产者消费者模型的模拟实现 ConProd.c文件的整体代码 BlockQueue.h文件的整体代码 对【基于阻塞队列BlockingQueue的生产者消费者模型…

windows系统安装php,运行php

一、安装php 官网&#xff1a;PHP For Windows: Binaries and sources Releases 下载最新的PHP解释器 解压好放入 C:\php 目录文件下 二、配置php 配置环境变量&#xff1a;在CMD命令提示符中输入以下命令&#xff0c;将PHP路径添加到系统环境变量中&#xff0c;以便可以在…

【第四阶段】kotlin语言集合转换与快捷转换学习

1.list可以通过转换为set进行去重 2.list转set在转list也能去重 3.使用快捷函数distinct进行去重 package Kotlin.Stage4fun main() {val list mutableListOf("java", "ktolin", "c", "java", "ktolin", "c")pr…

MyVector 的实现

myVector #include <iostream> #include <vector>int size20;using namespace std;template <typename type> class myvector {int size;type value;type *arr;public://无参构造myvector(){};//有参构造myvector(int s,type v):size(s),value(v){arrnew in…

laravel8框架-语言包的安装和配置

1, 查找 laravel框架语言包地址&#xff1a; \根目录\resources\lang\ 默认有个 en 语言包 2&#xff0c;下载 和 安装 下载地址&#xff1a;https://packagist.org/ 搜索 laravel/lang 参考网址&#xff1a;https://packagist.org/packages/overtrue/laravel-lang 选择你…

Django系列:Django简介与MTV架构体系概述

Django系列 Django简介与MTV架构体系概述 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/132890054 【介…

【数据结构】串的定义;存储结构;基本操作的实现

欢迎光~临~^_^ 目录 知识树 1、串的定义 2、串的存储结构 2.1顺序存储 静态存储 动态存储 2.2链式存储 2.3串的堆分配存储表示 3、串的基本操作 3.1求子串 3.2比较操作 3.3定位操作 4、C语言实现串的基本操作 知识树 1、串的定义 串是由零个或多个字符组成的…

记录一次IDEA非法字符‘\ufeff‘报错

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 报错以及Bug ✨特色专栏&#xff1a; …

JavaScript与jQuery(下篇)

JavaScript与jQuery笔记&#xff08;下篇&#xff09; 一、获取jquery二、jquery选择器三、jquery事件四、jquery操作Dom元素————————创作不易&#xff0c;如觉不错&#xff0c;随手点赞&#xff0c;关注&#xff0c;收藏(*&#xffe3;︶&#xffe3;)&#xff0c;谢…