从0搭建一个FIFO模块-02(系统架构)
一、异步FIFO需要注意的问题
所谓异步FIFO,指的是写时钟与读时钟可以不同步,读时钟可以比写时钟快,反之亦然。思考一下,这样会直接地造成两个问题:
- 由于异步FIFO的基本存储单元是双端口RAM,因此读写速率不一致,就会造成读满或者写满的问题。
- 为了判断读满、写满的情况,势必需要将写指针(告诉读模块,写到哪个位置了,我还可不可以继续读?)同步到读模块,(或者读指针同步到写模块,通知写模块,现在读到哪里了,我还能不能继续写啦?如果还没读,我再写一轮不就把数据覆盖了啊?),这样就会存在跨时钟域的同步问题。
因此,针对上述问题,我们解决办法如下: - 针对问题一,我们需要将读指针与写指针进行比较,产生读空、写满标志。思考一下如何判断读空、写满标志呢,假设有一个深度为8的RAM,那么其地址线的宽度为3,这里我们扩展一位,让最高位作为读空、写满标志,(实际给到RAM的只有[2:0]),其原理如下
假设写指针写到了0111,此时读指针也读到了0111,意味着读指针追上了写写指针,那么此时就是读空了;
假设写指针写到了1000(实际上是第二轮的000),此时读指针读到了000(第一轮的000),那么就是写满。
因此,可以总结:
当最高位相同,其余位相同认为是读空
当最高位不同,其余位相同认为是写满
2. 针对问题二:我们将读写指针编码为Gray码并打两拍进行同步。采用Gray码的原因可参考上一篇博客,简单来说就是Gray码相邻两个编码之间只存在一个bit变化,避免多个bit同时跳变的问题。再进行两拍同步就可以将读写指针进行异步时钟同步化了。
3. 由于问题二,采用Gray码,导致我们判断读空及写满的逻辑需要稍微改变下了:
我们观察一下基于gray码的读空、写满的情况:
因此,用格雷码判断是否为读空或写满时应看最高位和次高位是否相等:即:
当最高位和次高位相同,其余位相同认为是读空
当最高位和次高位不同,其余位相同认为是写满
二、异步FIFO架构
根据上述讨论,我们可以总结一个异步FIFO的架构包括以下几个部分:
- 双端口RAM,作为FIFO的存储体。可以采用硬件描述的方式描述一个RAM,也可以采用IP核、原语的方式。
- FIFO写模块,用于产生写地址,写使能,写满等信号
- FIFO读模块,用于产生读地址,读使能、读空等信号。
- Gray码转换模块,用于自然二进制与Gray码转换
- 时钟同步,用于将读写指针打拍同步。
结构框架如下:
从0搭建一个FIFO模块-02(系统架构)的更多相关文章
- 一起来学Spring Cloud | 第一章 :如何搭建一个多模块的springcloud项目
在spring cloud系列章节中,本来已经写了几个章节了,但是自己看起来有些东西写得比较杂,所以重构了一下springcloud的章节内容,新写了本章节,先教大家在工作中如何搭建一个多模块的spr ...
- 搭建一个microblaze的最小系统
搭建一个microblaze的最小系统 首先例化一个microblaze核 对microblaze核进行配置 勾选: 这个是使能外部存储BRAM作为程序运行缓冲区 第二个是需要勾选 这个是使能AXI数 ...
- Cola:一个分布式爬虫框架 - 系统架构 - Python4cn(news, jobs)
Cola:一个分布式爬虫框架 - 系统架构 - Python4cn(news, jobs) Cola:一个分布式爬虫框架 发布时间:2013-06-17 14:58:27, 关注:+2034, 赞美: ...
- 从0搭建一个基于 ELK 的日志、指标收集与监控系统
为了使得私有化部署的系统能更健壮,同时不增加额外的部署运维工作量,本文提出了一种基于 ELK 的开箱即用的日志和指标收集方案. 在当前的项目中,我们已经使用了 Elasticsearch 作为业务的数 ...
- react全家桶从0搭建一个完整的react项目(react-router4、redux、redux-saga)
react全家桶从0到1(最新) 本文从零开始,逐步讲解如何用react全家桶搭建一个完整的react项目.文中针对react.webpack.babel.react-route.redux.redu ...
- AI识万物:从0搭建和部署手语识别系统 ⛵
作者:韩信子@ShowMeAI 深度学习实战系列:https://www.showmeai.tech/tutorials/42 计算机视觉实战系列: https://www.showmeai.tech ...
- 搭建一个redis高可用系统
一.单个实例 当系统中只有一台redis运行时,一旦该redis挂了,会导致整个系统无法运行. 单个实例 二.备份 由于单台redis出现单点故障,就会导致整个系统不可用,所以想到的办法自然就是备份( ...
- 搭建一个BS 的简单SOA 架构(直接通过jquery 调用后台的 wcf 服务的架构)(第一天)
亲们!还在用传统的三层架构吗?你还在对SOA架构 不了解吗? 那就赶快来学习下一个 比较简单的SOA的架构吧!我会手把手的 教会你们怎么搭建这个 简单的SOA的架构. 其中用的技术点保证 WCF,a ...
- IntelliJ IDEA 2017.3 搭建一个多模块的springboot项目(二)
上一篇我成功搭建了一个项目,名叫bale-project,下面我们继续搭建子模块. 在项目名称上右键,New->Module,新建一个模块. 这次我们选择Spring Initializr 起个 ...
- 如何利用webpack4.0搭建一个vue项目
作为一个初学者,记录自己踩过的坑是个好的习惯.我本身比较懒,这里刚好有时间把自己的搭建过程记录一下这里是参考文章 https://www.jianshu.com/p/1fc5b5151abf文章里 ...
随机推荐
- 远程连接 Ubuntu Desktop 桌面
在 Ubuntu 的 设置 > 系统 > 远程桌面 上打开 桌面共享 和 远程控制 选项. sudo apt install gnome-remote-desktop 未完待续 参考: S ...
- 浅谈下市面上流行的各种Linux操作系统
当前最流行的Linux操作系统之一是Ubuntu.它是一个基于Debian的开源操作系统,它的用户界面和易用性使得它成为许多用户的首选. 其他流行的Linux操作系统包括: Debian:一个稳定和可 ...
- Angular Material 18+ 高级教程 – CDK Drag and Drop
前言 CDK Drag and Drop 和 CDK Scrolling 都是在 Angular Material v7 中推出的. 它们有一个巧妙的共同点,那就是与 Material Design ...
- CSS & JS Effect – 脉冲 Pulse Play Button
效果 参考 Youtube – Create a pulsing animation with CSS 重点 在背后做一个一样大的 div border 然后 animation scale up. ...
- MVC模式与三层架构
MVC 模式 三层架构 MVC 模式 与 三层架构 的关系
- Wpf使用NLog将日志输出到LogViewer
1 LogViewer LogViewer是通过UDP传输的高性能实时log查看器. 具有一下特性: 通过UDP读取日志 通过文件导入日志 导出日志到一个文件中 排序.过滤(日志树,日志等级)和查找 ...
- 6How To Use Messages With Flask - Flask Fridays #6 10:43
消息闪现 消息闪现 {% for message in get_flashed_messages() %} <div class="alert alert-success alert ...
- 视频剪辑过于卡顿,让Pr更流畅的技巧 ( 待测试 )
事件起因: 项目组某后期同事,使用Pr剪辑视频非常卡顿,但是机器配置是完全满足他的办公需求的 解决办法: 1. 降低回放分辨率 如果你的视频预览卡顿,首先应该考虑的,就是当前回放分辨率是否过高.通常在 ...
- Python | os.path.join() method
Python中的os.path.join()方法可以连接一个或多个路径组件. 此方法将各个路径组成部分,与每个非空部分路径组成部分恰好用一个目录分隔符(" /")连接起来. 如果要 ...
- Java实用小工具系列2---使用StopWatch统计多个任务耗时分布
在Java中经常需要统计程序的使用时间,如果只是一个时间段统计比较好处理,可以直接使用System.currentTimeMillis().但如果一个程序中包含多个步骤,需要统计每个步骤耗时,并且需要 ...