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. C 语言编译过程

    编译过程 编译过程是将高级编程语言(如 C 语言)写成的源代码转换成机器可以执行的低级机器语言(通常是二进制代码)的过程.这个过程一般可以分为几个阶段: 预处理(Preprocessing): 预处理 ...

  2. BooleanBuilder 如何根据自定义列名 模糊查询 使用PathBuilder

    // 动态传参 // 1. 声明 PathBuilder:MyTable 为类名称,"myTable" 为首字母小写后的类名 PathBuilder<MyTable> ...

  3. 《花100块做个摸鱼小网站! 》第五篇—通过xxl-job定时获取热搜数据

    ️基础链接导航️ 服务器 → ️ 阿里云活动地址 看样例 → 摸鱼小网站地址 学代码 → 源码库地址 一.前言 我们已经成功实现了一个完整的热搜组件,从后端到前端,构建了这个小网站的核心功能.接下来, ...

  4. Seata 核心源码详解

    参考文章: 分布式事务实战方案汇总 https://www.cnblogs.com/yizhiamumu/p/16625677.html 分布式事务原理及解决方案案例https://www.cnblo ...

  5. 十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)

    十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式) @ 目录 十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式) 1. Spring Boot 配置 M ...

  6. 【赵渝强老师】使用kubeadmin部署K8s集群

    首先,我们来看一下整体的架构. K8s的部署方式: yum方式部署 二进制包:手动使用tar包来部署 minikube:单机版,用于开发测试. kubeadm:可以把kubeadmin看成一个部署工具 ...

  7. Laravel视图共享数据

    Laravel视图共享数据 最近在用lavavel过程中想实现公共头部尾部需要的配置数据在所有的页面中都可以使用,便查看了官方文档,在此做一个总结: 一. 修改 ComposerServiceProv ...

  8. USB gadget驱动框架(三)

    gadget驱动框架(三) usb_udc与usb_gadget_driver的绑定 usb_udc与usb_gadget_driver,在注册的时候分别被添加到udc_list和gadget_dri ...

  9. 使用dynamic debug帮助调试

    你一定在kernel source code中看过很多pr_debug()/dev_dbg()/print_hex_dump_debug()吧,这些debug语句提供更多的信息帮助我们了解内核运行流程 ...

  10. 分类问题的评价指标AUC