从0搭建一个FIFO模块-01(基础知识)
1. FIFO介绍
基本概念
FIFO(First In, First Out)是一种常用的数据结构,用于存储和处理数据。它的工作原理与排队的顺序类似,遵循"先进先出"的原则。即,第一个进入FIFO的数据会是第一个被取出的数据。在FPGA设计中,可以使用AM作为FIFO的存储单元,再通过控制逻辑来管理读写操作和指针的更新。
FIFO的作用
在FPGA中,主要有以下几个作用
数据缓冲:在处理数据流时,FIFO可用于平衡速度不一致的两个系统之间的数据流。例如,处理器和外设之间的数据传输。
异步数据传输:在不同的时钟域之间传递数据时,可以使用FIFO来暂存数据,以便顺利地进行传输。
流水线处理:在硬件设计中,FIFO常用于多阶段流水线设计中,作为各阶段之间的数据缓冲区。
为什么要自己设计FIFO
我们知道,在进行FPGA开发中,FIFO的实现大多采用IP核的形式实现,这样可以大大减少开发周期,但是IP核的形式由于是一个黑盒,会导致项目的不可控及代码移植问题,同时自己设计FIFO有利于我们深入理解FPGA开发,同时对于IC设计等领域,FIFO的电路实现也是一项必备的技能。
其他必须的知识点
格雷码
在设计FIFO之前,需要用到格雷码(gray code),因此需要对其进行了解。
我们知道,在计算机等架构中,数据是以二进制形式保存并参与计算的,例如10 dec = 1010 bin,通常称之为自然二进制。Gray码是一种特殊的二进制编码方式,它与普通的二进制码不同,主要的特点是:相邻的两个数在二进制表示中只有一位发生变化。3位宽的gray码表示如下
td {white-space:nowrap;border:1px solid #dee0e3;font-size:10pt;font-style:normal;font-weight:normal;vertical-align:middle;word-break:normal;word-wrap:normal;}
| 十进制 | 自然二进制 | Gray码 |
| 0 | 000 | 000 |
| 1 | 001 | 001 |
| 2 | 010 | 011 |
| 3 | 011 | 010 |
| 4 | 100 | 110 |
| 5 | 101 | 111 |
| 6 | 110 | 101 |
| 7 | 111 | 100 |
可以发现Gray 码的关键特点是相邻的两个值在二进制表示中只有一位二进制位的不同。这意味着当从一个数字过渡到下一个数字时,只有一个位改变,从而避免了多个位同时变化时可能引入的误差。
在数字电路中,亚稳态问题一直是工程师所需要尽量减少的,特别在跨时钟域的问题上,而Gray码这种每次只变化一个位(对应在FPGA硬件上表现为只有一个寄存器进行反转),这样就能大大减小发生亚稳态的概率,从而保证电路的稳定性。
双口RAM(Dual Port Memory Module)结构
在FPGA中实现FIFO,其基本存储结构是双口ram,以lattice双口RAM IP核为例,其结构如下图所示:
双口ram可以同时以不同的时钟速率对数据同时的分别进行写入和读出,其操作时序图如下图:
可以看到,以写为例,在写时钟的上升沿,写入地址和数据,并至少持续一个写入时钟周期,同时在该周期的时钟的下降沿,写使能信号wr_en_i拉高,并持续至第二个时钟的上升沿,这样一个数据就被存储到Addr_0中了。读操作是在读时钟的上升沿给到读地址Addr_0,同时在该读周期的时钟下降沿,读使能拉高,这样在下一个读时钟周期,地址Addr_0中的数据被读出在rd_data_o数据线中。
从0搭建一个FIFO模块-01(基础知识)的更多相关文章
- 一起来学Spring Cloud | 第一章 :如何搭建一个多模块的springcloud项目
在spring cloud系列章节中,本来已经写了几个章节了,但是自己看起来有些东西写得比较杂,所以重构了一下springcloud的章节内容,新写了本章节,先教大家在工作中如何搭建一个多模块的spr ...
- es 模块的基础知识,深度了解
// 一模块的基础知识 /** * export :用于模块输出的出口 * import :文件引入的入口 */ // 1,第一种方式使用export方式输出 var a = 'a'; var b = ...
- react全家桶从0搭建一个完整的react项目(react-router4、redux、redux-saga)
react全家桶从0到1(最新) 本文从零开始,逐步讲解如何用react全家桶搭建一个完整的react项目.文中针对react.webpack.babel.react-route.redux.redu ...
- 从0搭建一个基于 ELK 的日志、指标收集与监控系统
为了使得私有化部署的系统能更健壮,同时不增加额外的部署运维工作量,本文提出了一种基于 ELK 的开箱即用的日志和指标收集方案. 在当前的项目中,我们已经使用了 Elasticsearch 作为业务的数 ...
- [精]Odoo 8.0深入浅出开发教程-模块开发基础
參考资料点击这里. 构建Odoo模块 模块组成 业务对象 业务对象声明为Python类, 由Odoo自己主动加载. 数据文件 XML或CSV文件格式, 在当中声明了元数据(视图或工作流).配置数据(模 ...
- 如何用vue-cli3脚手架搭建一个基于ts的基础脚手架
目录 准备工作 搭建项目 vue 中 ts 语法 项目代理及 webpack 性能优化 其他 忙里偷闲,整理了一下关于如何借助 vue-cli3 搭建 ts + 装饰器 的脚手架,并如何自定义 web ...
- IntelliJ IDEA 2017.3 搭建一个多模块的springboot项目(二)
上一篇我成功搭建了一个项目,名叫bale-project,下面我们继续搭建子模块. 在项目名称上右键,New->Module,新建一个模块. 这次我们选择Spring Initializr 起个 ...
- 如何利用webpack4.0搭建一个vue项目
作为一个初学者,记录自己踩过的坑是个好的习惯.我本身比较懒,这里刚好有时间把自己的搭建过程记录一下这里是参考文章 https://www.jianshu.com/p/1fc5b5151abf文章里 ...
- 使用bootstrap3.0搭建一个具有自定义风格的侧边导航栏
由于工作变动,新的项目组,可能会涉及到更多的类似于后台管理系统这一类的项目,而且开发可能更加偏向于传统型的开发,希望今后能够在新的项目中能够用得上vuejs吧! 接手项目的时候,就是一个后台管理系统, ...
- IntelliJ IDEA 2017.3 搭建一个多模块的springboot项目(一)
新人接触springboot,IDE使用的是IntelliJ IDEA 2017.3 ,自己摸索了很久,现在自己整理一下,里面有些操作我自己也不懂是为什么这样,只是模仿公司现有的项目,自己搭建了一个简 ...
随机推荐
- java_可变参数&增强for循环
代码比较无厘头,记录看懂的意思 在可变参数的构造方法中,需要使用增强for循环遍历 public class name { String sex; public static void main(St ...
- .NET 开源实时监控系统 - WatchDog
前言 在平时的开发中随着我们系统应用不断地迭代变的复杂,对应用的实时监控变得越来越重要.实时监控不仅可以帮助我们快速定位问题,还能在出现问题时及时采取措施,减少业务中断的时间. 本文将介绍一个名为Wa ...
- Linux 网络设备命名规则
在 Linux 系统中,网络接口的命名规则已经经历了几次重要变化,特别是从传统的以 eth 和 wlan 开头的名称,转变到更现代.更具描述性的命名方式.以下是这些变化的概述: 1. 传统命名约定 在 ...
- 网站由http升级为https图文教程
网站由http升级为https图文教程 本文是基于凯哥个人网站由http升级为https的记录. 前提说明:凯哥网站在AliYun备案的.所以基于此创建的.如果是腾讯云备案的域名也是类似的. 名词解释 ...
- 【YashanDB知识库】汇聚库23.1环境发生coredump
[标题]汇聚库23.1环境发生coredump [问题分类]数据库错误 [关键词]YashanDB, 汇聚库, coredump [问题描述]在23.1.1.200版本数据库环境创建dblink.视图 ...
- 【YashanDB知识库】yasql登录报错:YAS-00413
[问题分类]错误码处理 [关键字]yasql,00413 [问题描述]使用工具设置不同并发迁移数据的过程中,导致yasql登录报错:YAS-00413 [问题原因分析]工具使用与数据库使用资源超过了操 ...
- kubernetes删除ns异常状态为:Terminating
在部署kuboard控制平台的时候,不规范删除,导致ns状态为Terminating [root@master01 ~]# kubectl delete namespace kuboard ^C ro ...
- 交通网络分析性能再升级,SuperMap iServer新增开启SSC分析模型
导语 SSC分析模型,全名SuperMap Short Cut,底层采用Contraction Hierarchies(简称CH)算法,该算法旨在通过对图形进行预处理和优化来降低最佳路径分析的时间复杂 ...
- CSharp的Where底层实现
using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using Syst ...
- typeof typeof 'texs'是什么类型
typeof '12' 返回 'string' 是字符串类型 :