一、异步FIFO需要注意的问题

所谓异步FIFO,指的是写时钟与读时钟可以不同步,读时钟可以比写时钟快,反之亦然。思考一下,这样会直接地造成两个问题:

  1. 由于异步FIFO的基本存储单元是双端口RAM,因此读写速率不一致,就会造成读满或者写满的问题。
  2. 为了判断读满、写满的情况,势必需要将写指针(告诉读模块,写到哪个位置了,我还可不可以继续读?)同步到读模块,(或者读指针同步到写模块,通知写模块,现在读到哪里了,我还能不能继续写啦?如果还没读,我再写一轮不就把数据覆盖了啊?),这样就会存在跨时钟域的同步问题。

    因此,针对上述问题,我们解决办法如下:
  3. 针对问题一,我们需要将读指针与写指针进行比较,产生读空、写满标志。思考一下如何判断读空、写满标志呢,假设有一个深度为8的RAM,那么其地址线的宽度为3,这里我们扩展一位,让最高位作为读空、写满标志,(实际给到RAM的只有[2:0]),其原理如下

    假设写指针写到了0111,此时读指针也读到了0111,意味着读指针追上了写写指针,那么此时就是读空了;

    假设写指针写到了1000(实际上是第二轮的000),此时读指针读到了000(第一轮的000),那么就是写满。

因此,可以总结:

当最高位相同,其余位相同认为是读空

当最高位不同,其余位相同认为是写满

2. 针对问题二:我们将读写指针编码为Gray码并打两拍进行同步。采用Gray码的原因可参考上一篇博客,简单来说就是Gray码相邻两个编码之间只存在一个bit变化,避免多个bit同时跳变的问题。再进行两拍同步就可以将读写指针进行异步时钟同步化了。

3. 由于问题二,采用Gray码,导致我们判断读空及写满的逻辑需要稍微改变下了:

我们观察一下基于gray码的读空、写满的情况:

因此,用格雷码判断是否为读空或写满时应看最高位和次高位是否相等:即:

当最高位和次高位相同,其余位相同认为是读空

当最高位和次高位不同,其余位相同认为是写满

二、异步FIFO架构

根据上述讨论,我们可以总结一个异步FIFO的架构包括以下几个部分:

  1. 双端口RAM,作为FIFO的存储体。可以采用硬件描述的方式描述一个RAM,也可以采用IP核、原语的方式。
  2. FIFO写模块,用于产生写地址,写使能,写满等信号
  3. FIFO读模块,用于产生读地址,读使能、读空等信号。
  4. Gray码转换模块,用于自然二进制与Gray码转换
  5. 时钟同步,用于将读写指针打拍同步。

    结构框架如下:

从0搭建一个FIFO模块-02(系统架构)的更多相关文章

  1. 一起来学Spring Cloud | 第一章 :如何搭建一个多模块的springcloud项目

    在spring cloud系列章节中,本来已经写了几个章节了,但是自己看起来有些东西写得比较杂,所以重构了一下springcloud的章节内容,新写了本章节,先教大家在工作中如何搭建一个多模块的spr ...

  2. 搭建一个microblaze的最小系统

    搭建一个microblaze的最小系统 首先例化一个microblaze核 对microblaze核进行配置 勾选: 这个是使能外部存储BRAM作为程序运行缓冲区 第二个是需要勾选 这个是使能AXI数 ...

  3. Cola:一个分布式爬虫框架 - 系统架构 - Python4cn(news, jobs)

    Cola:一个分布式爬虫框架 - 系统架构 - Python4cn(news, jobs) Cola:一个分布式爬虫框架 发布时间:2013-06-17 14:58:27, 关注:+2034, 赞美: ...

  4. 从0搭建一个基于 ELK 的日志、指标收集与监控系统

    为了使得私有化部署的系统能更健壮,同时不增加额外的部署运维工作量,本文提出了一种基于 ELK 的开箱即用的日志和指标收集方案. 在当前的项目中,我们已经使用了 Elasticsearch 作为业务的数 ...

  5. react全家桶从0搭建一个完整的react项目(react-router4、redux、redux-saga)

    react全家桶从0到1(最新) 本文从零开始,逐步讲解如何用react全家桶搭建一个完整的react项目.文中针对react.webpack.babel.react-route.redux.redu ...

  6. AI识万物:从0搭建和部署手语识别系统 ⛵

    作者:韩信子@ShowMeAI 深度学习实战系列:https://www.showmeai.tech/tutorials/42 计算机视觉实战系列: https://www.showmeai.tech ...

  7. 搭建一个redis高可用系统

    一.单个实例 当系统中只有一台redis运行时,一旦该redis挂了,会导致整个系统无法运行. 单个实例 二.备份 由于单台redis出现单点故障,就会导致整个系统不可用,所以想到的办法自然就是备份( ...

  8. 搭建一个BS 的简单SOA 架构(直接通过jquery 调用后台的 wcf 服务的架构)(第一天)

    亲们!还在用传统的三层架构吗?你还在对SOA架构 不了解吗? 那就赶快来学习下一个 比较简单的SOA的架构吧!我会手把手的 教会你们怎么搭建这个 简单的SOA的架构. 其中用的技术点保证  WCF,a ...

  9. IntelliJ IDEA 2017.3 搭建一个多模块的springboot项目(二)

    上一篇我成功搭建了一个项目,名叫bale-project,下面我们继续搭建子模块. 在项目名称上右键,New->Module,新建一个模块. 这次我们选择Spring Initializr 起个 ...

  10. 如何利用webpack4.0搭建一个vue项目

    作为一个初学者,记录自己踩过的坑是个好的习惯.我本身比较懒,这里刚好有时间把自己的搭建过程记录一下这里是参考文章   https://www.jianshu.com/p/1fc5b5151abf文章里 ...

随机推荐

  1. Redis实战之session共享

    当线上集群时候,会出现session共享问题. 虽然Tomcat提供了session copy的功能,但是缺点比较明显: 1:当Tomcat多的时候,session需要大量同步到多台集群上,占用内网宽 ...

  2. HBuilder X在4K显示器怎么设置HBuilderX窗口本身的字体大小

    在使用HBuilder X编辑器的时候,使用笔记本自身的显示器,编辑器窗口本身的字体大小都正好,但是将HBuilder X编辑器用在外接显示器(高清)或者4K显示器上的时候,就不行了.怎么解决呢? 在 ...

  3. C语言:应用程序增加库函数rand的步骤

    rand函数用来生成随机数,函数原型为int rand( void ); 返回值为生成的随机数,范围0~32767.在调用rand之前可以用srand函数初始化随机数发生器来生成更随机的数. 可以通过 ...

  4. vue3 如何获取 dom

    1. 通过 ref     1. 在 html 标签上指定 ref 属性     2. 在 setup 中定义并返回.注意:标签上的 ref 属性名需要跟 setup 中的对应 <h1 ref= ...

  5. 全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类

    全网最适合入门的面向对象编程教程:50 Python 函数方法与接口-接口和抽象基类 摘要: 在 Python 中,接口和抽象基类(Abstract Base Classes, ABCs)都用于定义类 ...

  6. Cookie——基本使用

    Cookie 基本使用      Cookie 原理 Cookie 使用细节 Cookie jsp中获取Cookie

  7. Windows系统环境变量

    添加环境变量: 添加系统变量,机器要重新启动 添加用户变量,机器不用重启: 一般添加环境变量都添加在用户变量中,但只针对这一用户生效 为了使的所有用户都能正常使用软件,通常添加系统变量

  8. websocket打造在线聊天室

    1. 常见的网络通信协议  tcp udp http 和 websocket 等 : http 超文本传输协议 ,是一个无状态,无连接,单向的应用层协议,缺点是服务器不能主动的给客户端发送消息 :消息 ...

  9. 66.有没有碰到过数组响应丢失(问的是ref和reactive的用法,什么情况下用)

    由于vue3使用proxy,对于对象和数组都不能直接整个赋值.  直接赋值丢失了响应性 只有push或者根据索引遍历赋值才可以保留reactive数组的响应性  : 可以使用 toRefs 解决这个问 ...

  10. 亿图图示最新版本(Win和Mac)适用的最高45天免费会员,Edrawmax,MindMaster,windows和mac兼用免费会员

    活动随时都在变化,感兴趣的快点去领吧! 亿图图示:https://www.edrawsoft.cn/viral-marketing/Invited.html?s_uid=26349406&pr ...