1. FIFO介绍

  1. 基本概念

FIFO(First In, First Out)是一种常用的数据结构,用于存储和处理数据。它的工作原理与排队的顺序类似,遵循"先进先出"的原则。即,第一个进入FIFO的数据会是第一个被取出的数据。在FPGA设计中,可以使用AM作为FIFO的存储单元,再通过控制逻辑来管理读写操作和指针的更新。

  1. FIFO的作用

在FPGA中,主要有以下几个作用

  1. 数据缓冲:在处理数据流时,FIFO可用于平衡速度不一致的两个系统之间的数据流。例如,处理器和外设之间的数据传输。

  2. 异步数据传输:在不同的时钟域之间传递数据时,可以使用FIFO来暂存数据,以便顺利地进行传输。

  3. 流水线处理:在硬件设计中,FIFO常用于多阶段流水线设计中,作为各阶段之间的数据缓冲区。

  4. 为什么要自己设计FIFO

我们知道,在进行FPGA开发中,FIFO的实现大多采用IP核的形式实现,这样可以大大减少开发周期,但是IP核的形式由于是一个黑盒,会导致项目的不可控及代码移植问题,同时自己设计FIFO有利于我们深入理解FPGA开发,同时对于IC设计等领域,FIFO的电路实现也是一项必备的技能。

  1. 其他必须的知识点

    1. 格雷码

在设计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硬件上表现为只有一个寄存器进行反转),这样就能大大减小发生亚稳态的概率,从而保证电路的稳定性。

  1. 双口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(基础知识)的更多相关文章

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

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

  2. es 模块的基础知识,深度了解

    // 一模块的基础知识 /** * export :用于模块输出的出口 * import :文件引入的入口 */ // 1,第一种方式使用export方式输出 var a = 'a'; var b = ...

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

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

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

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

  5. [精]Odoo 8.0深入浅出开发教程-模块开发基础

    參考资料点击这里. 构建Odoo模块 模块组成 业务对象 业务对象声明为Python类, 由Odoo自己主动加载. 数据文件 XML或CSV文件格式, 在当中声明了元数据(视图或工作流).配置数据(模 ...

  6. 如何用vue-cli3脚手架搭建一个基于ts的基础脚手架

    目录 准备工作 搭建项目 vue 中 ts 语法 项目代理及 webpack 性能优化 其他 忙里偷闲,整理了一下关于如何借助 vue-cli3 搭建 ts + 装饰器 的脚手架,并如何自定义 web ...

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

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

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

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

  9. 使用bootstrap3.0搭建一个具有自定义风格的侧边导航栏

    由于工作变动,新的项目组,可能会涉及到更多的类似于后台管理系统这一类的项目,而且开发可能更加偏向于传统型的开发,希望今后能够在新的项目中能够用得上vuejs吧! 接手项目的时候,就是一个后台管理系统, ...

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

    新人接触springboot,IDE使用的是IntelliJ IDEA 2017.3 ,自己摸索了很久,现在自己整理一下,里面有些操作我自己也不懂是为什么这样,只是模仿公司现有的项目,自己搭建了一个简 ...

随机推荐

  1. RISC-V全志D1多媒体套件文章汇总

    提示 此开发板的任何问题都可以在我们的论坛交流讨论 https://forums.100ask.net/c/aw/d1/57 文章目录汇总 教程共计14章,下面是章节汇总: 第0章_RISC-V全志D ...

  2. freertos学习笔记(十)事件标志组

    事件标志组 相当于用户平时定义的Flag,事件标志,不过freertos支持将该标志组作为启动task的条件 概述 分为8位和24位的模式(通过设置宏来配置) 每一位有0和1两个状态 用法 用于平常程 ...

  3. Windows PE 安装

    Microsoft 官方提供的 Windows PE 默认只有命令行界面.如果想要使用带有桌面环境的 Windows PE,推荐使用微 PE . 下载并安装 Windows ADK 和 WinPE 加 ...

  4. JVM学习笔记之类装载器-ClassLoader

    JVM学习笔记之类装载器-ClassLoader 本文字数:2300,阅读耗时7分钟 JVM体系结构概览 类装载器ClassLoader: 负责加载class文件,class文件在文件开头有特定的文件 ...

  5. 6.24.2 数据库&漏洞口令&应急取证

    windows日志分析神器 logonTracer-外内网日志 github下载:#JPCERTCC/LogonTracer:通过可视化和分析 Windows 事件日志来调查恶意 Windows 登录 ...

  6. C# SAPX调用用户控件方法

    //获得用户控件            Type pageType = ucMoneyList1.GetType();             //用户控件方法名            MethodI ...

  7. EF Core – 大杂烩

    前言 记入一些零零碎碎的知识. Shadow Properties 参考:Docs – Shadow and Indexer Properties Shadow Property 指的是那些在数据库有 ...

  8. 安全 – CSP (Content Security Policy)

    前言 之前讲过 CSRF.防 Cookie hacking 的. 也介绍过防 XSS 的 HtmlSanitizer. 今天再介绍 CSP. 参考 Content Security Policy 介绍 ...

  9. Codeforces Round 973 (Div. 2) D

    性质1:题目操作相当于将前面的数搬到了后面,将其视为柱状图,则是把前面柱的高度转移至后面柱的高度 性质2:最后移成的序列以单调不下降序列为最优,易证明当存在下降时,可通过操作使答案更优或不变差 性质3 ...

  10. [OI] 指针与迭代器

    取地址与解引用 一般来说,我们有一个取地址符 & 可以返回该变量的地址. int main(){ int a; cout<<&a; } 0x6ffe1c 如果我们现在有一个 ...