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

概述

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

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

FIFO style #1 

        FIFO样式#1的框图如图5所示:

        为了便于对风格#1的FIFO设计进行静态时序分析,该设计被划分为以下6个Verilog模块,具有以下功能和时钟域(这部分我们只是进行一个简单的介绍,具体的实现方式将在文章的后面部分带来):

1、fifo1.v

        (参见第6.1节中的示例2)-这是包含所有时钟域的顶层封装模块。顶层模块仅用作一个封装来例化在设计中使用的所有其他FIFO模块。如果将这个FIFO用作更大的ASIC或FPGA设计的一部分,那么这个顶层封装模块可能会被丢弃,以允许将其他FIFO模块分组到它们各自的时钟域中,以改进综合和静态时序分析。

2、fifomem.v

        (参见第6.2节中的示例3)-这是由写和读时钟域同时访问的FIFO内存缓冲区。这个缓冲区很可能是一个实例化的同步双端口RAM。其他内存样式可以适应作为FIFO缓冲区。

3、sync_r2w.v

        (参见第6.3节中的示例4)-这是一个同步器模块,用于将读指针同步到写时钟域。同步读指针将被wptr_full模块用来生成FIFO满条件。此模块只包含与写时钟同步的触发器。此模块中不包含任何其他逻辑。

4、sync_w2r.v

        (参见第6.4节中的示例5)-这是一个同步器模块,用于将写指针同步到读时钟域。rptr_empty模块将使用同步的写指针来生成FIFO为空的条件。此模块只包含与读时钟同步的触发器。此模块中不包含任何其他逻辑。

5、rptr_empty.v

        (参见第6.5节中的示例6)-此模块与读时钟域完全同步,并包含FIFO读指针和空标志逻辑。 

6、wptr_full.v

        (参见第6.6节中的示例7)-此模块与写时钟域完全同步,并包含FIFO写指针和满标志逻辑。

        为了使用这种FIFO设计方式能够执行FIFO full和FIFO empty测试,必须将读写指针传递到相反的时钟域以进行指针比较。与其他FIFO设计一样,由于这两个指针是由两个不同的时钟域生成的,因此这些指针需要“安全地”传递到相反的时钟域。本文所展示的技术是同步格雷码指针,以确保一次只有一个位可以改变。

为什么要用格雷码

        以下的所有部分非原文内容,为笔者自行补充。

        在本文中使用到了格雷码指针,实际上在如今大量的异步FIFO的设计中,都会使用格雷码来替代二进制码来实现FIFO的指针,但是具体的原因在原论文中没有详细展开,只是简单提到了确保只有一个指针位被改变,这里我们进行一个简单的说明,为什么异步FIFO的设计一般会采用格雷码的形式来实现指针。

        我们知道了判断FIFO的空、满需要将读写指针分别同步,而跨时钟域传输的一旦没处理好就会引起亚稳态问题,造成指针的值异常,从而引发FIFO的功能错误。那么应该如何将读写指针同步到对方的时钟域呢?

1、避免使用二进制指针

        由于两个指针所处的时钟域不同,且彼此异步,在使用二进制计数器实现指针的时候,就会导致用于比较的指针值取样错误,例如:二进制指针FFF->000。这时所有的位都会同时发生改变,虽然能够通过同步计数器避免亚稳态,但是仍然可能得到极其不相关的取样值,所以同步计数器不是最终的解决方案。

        从FFF->000的可能情况有:

  • FFF->000
  • FFF->001
  • FFF->010
  • FFF->011
  • FFF->100
  • FFF->101
  • FFF->110
  • FFF->111

        如果同步时钟沿在FFF->000的中间到来,就可能将3位二进制数的任何值取样并同步到对侧时钟域,这就会使得FIFO同步后的读/写指针错误,从而导致FIFO的空/满信号错误,最终导致FIFO运行异常。

2、使用格雷码代替二进制实现指针

        实现FIFO指针的一种方式是使用格雷码,如下图所示:

        格雷码的一大优势是在从一个数变化到相邻的另一个数的时候,只有一个位发生变化,也就是一种单位间距码,因此,在发生转换时,最多出现一位的错误,例如,计数器从“1010”变化到 "1011"  ,取样值只可能是“1010”或者“1011”。即便没有采集到变化后的1011,也会采集到变化之前的1010,这就避免了由于采样指针错误导致的空/满信号错误的可能性。

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

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

相关文章

开源网安入选广东省网络空间安全标准化技术委员会新技术及应用安全技术工作组成员单位

近日,第二届广东省网络空间安全标准化技术委员会(GD/TC 124)(以下简称省网安标委)正式成立。为进一步发挥省网安标委在支撑网络强国建设、推进网络安全产业高质量发展过程中,示范引领核心技术攻关、创新产品…

Redis 7 第九讲 微服务集成Redis 应用篇

Jedis 理论 Jedis是redis的java版本的客户端实现,使用Jedis提供的Java API对Redis进行操作,是Redis官方推崇的方式;并且,使用Jedis提供的对Redis的支持也最为灵活、全面;不足之处,就是编码复杂度较高。 …

堆与栈的区别

OVERVIEW 栈与堆的区别一、程序内存分区中的堆与栈1.栈2.堆3.堆&栈 二、数据结构中的堆与栈1.栈2.堆 三、堆的深入1.堆插入2.堆删除:3.堆建立:4.堆排序:5.堆实现优先队列:6.堆与栈的相关练习 栈与堆的区别 自整理,…

Haproxy集群与常见的Web集群调度器

文章目录 1. Web集群调度器概述1.1 Web集群调度器简介1.2 调度器类别1.2.1 常用软件类1.2.2 常用硬件类 2. Haproxy软件介绍2.1 Haproxy简介2.2 支持功能2.3 主要特性2.4 常用调度算法2.4.1 轮询:RR(Round Robin)2.4.2 最小连接数&#xff1a…

基于Streamlit的应用如何通过streamlit-authenticator组件实现用户验证与隔离

Streamlit框架中默认是没有提供用户验证组件的,大家在基于streamlit快速实现web应用服务过程中,不可避免的需要配置该应用的访问范围和权限,即用户群体,一般的做法有两种,一种是通过用户密码验证机制,要求只…

LeetCode每日一题:1222. 可以攻击国王的皇后(2023.9.14 C++)

目录 1222. 可以攻击国王的皇后 题目描述: 实现代码与解析: 模拟 原理思路: 1222. 可以攻击国王的皇后 题目描述: 在一个 8x8 的棋盘上,放置着若干「黑皇后」和一个「白国王」。 给定一个由整数坐标组成的数组 …

小美的数组操作2---牛客周赛 Round 11

注意给a[ 0 ]赋一个最小值 #include<bits/stdc.h> using namespace std; typedef long long ll; const int N1e55; int t,n,m,a[N],cnt[N]; int main(){scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);for(int i1;i<n;i){scanf(&q…

go语言基础--面向对象杂谈

面向过程 所谓的面向过程就是&#xff1a;强调的是步骤、过程、每一步都是自己亲自去实现的。 面向对象 所谓的面向对象其实就是找一个专门做这个事的人来做&#xff0c;不用关心具体怎么实现的。 所以说&#xff0c;面向过程强调的是过程&#xff0c;步骤。而面向对象强调的…

【计算思维题】少儿编程 蓝桥杯青少组计算思维 数学逻辑思维真题详细解析第9套

蓝桥杯青少组计算思维 数学逻辑思维真题详细解析第9套 第十四届蓝桥杯省赛真题 1、要把下面4张图片重新排列成蜗牛的画像,该如何排列这些图片 A、 B、 C、 D、 答案:A 考点分析:主要考查小朋友们的观察能力空

向量的概念、向量组的概念

目录 向量的概念、向量组的概念 向量的基本运算 线性表出、线性相关、线性无关 向量的概念、向量组的概念 向量&#xff08;Vector&#xff09;是一个有次序的数所组成的数组&#xff0c;通常用来表示一个物理量或者一个对象在空间中的移动。向量可以表示位置、速度、力等物…

SpringMVC之文件上传下载以及jrebel的使用

目录 一.文件上传 1.1.导入依赖 1.2.配置文件上传解析器 ​​​​​​​ 1.3 配置服务器存放文件地址 1.3.1.点击编辑Configurations 1.3.2.将项目部署至tomcat服务器上 1.3.3.配置相对路径 1.4.导入PropertiesUtil工具类 1.5.编写resource.properties 1.6.添加sql 1.7.编写…

【C语言】扫雷小游戏(保姆教程)

目录 一、扫雷游戏介绍 二、代码分装 三、代码实现步骤 1. 制作菜单menu函数以及游戏运行逻辑流程 2. 数组棋盘分析 3. 创建棋盘数组 4. 初始化棋盘InitBoard函数 5. 显示棋盘DisplayBoard函数 6. 布置雷SetMine函数 7. 统计雷个数GetMineCount函数 8. 排查雷FindMine函…