孩子都能学会的FPGA:第二十四课——用FPGA和格雷码实现异步FIFO

(原创声明:该文是作者的原创,面向对象是FPGA入门者,后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门作者不光让大家知其然,还要让大家知其所以然!每个工程作者都搭建了全自动化的仿真环境,只需要双击top_tb.bat文件就可以完成整个的仿真(前提是安装了modelsim),降低了初学者的门槛。如需整个工程请留言(WX:Blue23Light),不收任何费用,但是仅供参考,不建议大家获得资料后从事一些商业活动!

上节课格雷码的编码,格雷码适用于连续变化的信号,比如递增和递减,这样一次只有一位信号反转变化,在跨时钟域同步时减低了同步的难度。

下面我们考虑一下格雷码应用的场景,在异步RAM中,读数据和写数据可以是不同的时钟域,读写地址信号都是连续变化的,有时候写时钟域要知道读时钟域的地址,以判断RAM是不是要写满了;有时候读时钟域要知道写时钟域的地址,以判断RAM是不是要被读空了;上述的情况下都需要两个不同时钟域的地址信号进行同步,用格雷码是最好的选择。

我们来看一下异步RAM的接口,主要有读写时钟信号,读写使能信号,读写地址信号,读写数据信号。

再看看异步FIFO的接口,主要有读写时钟信号,读写使能信号,读写数据信号,还有就是标志信号fullempty,表示FIFO是满还是空。从信号上来说FIFO的信号要比RAM的信号少,主要是少了读写地址信号,所以控制相对也简单很多。对异步FIFO的控制,在FIFO非满的情况下(full未拉高)就可以写入新的数据;在FIFO非空的情况下(empty未拉高)就可以读出新的数据。所异步FIFO就是在异步RAM的基础上,通过读写地址信号产生空满信号。下面我们就在异步RAM的基础上来实现异步FIFO

如下是异步RAM实现异步FIFO的框图,思路很简单,写地址信号格雷码编码后由写时钟域同步到读时钟域,然后格雷码解码,和读地址信号产生空EMPTY信号;读地址信号格雷码编码后由读时钟域同步到写时钟域,然后格雷码解码,和写地址信号产生满FULL信号。当然也可以设定来产生快满(nearly_full),快空(nearly_empty)信号,FPGA程序里面有涉及。

下面用FPGA来实现异步FIFO。接口信号如下所示,和异步FIFO接口信号一致。设置了两个参数,lower_threshold来指示FIFO内的数据的下限值,当FIFO内的数据少于这个值几乎空nearly_empty信号就会拉高,upper_threshold来指示FIFO内的数据的上限值,当FIFO内的数据多于这个值几乎满nearly_full信号就会拉高。

当有新的数据要写入RAM,产生写使能wr_enable,写数据dina和写地址addra信号,保证数据可以写入RAM。

写地址信号格雷码编码,读时钟域clk_rd的读地址信号格雷码编码后同步到写时钟域clk_wr,采用3级打拍的方式进行同步,然后对同步后的读地址信号进行格雷码解码,最后将写地址信号和同步解码后的读地址信号相减,根据差值wr_occupancy来判断RAM是快写满了nearly_full还是已经写满了FULL。

同理在读时钟域clk_rd产生读使能信号rd_enable,读地址信号addrb,并将读地址信号进行格雷码编码。写时钟域clk_wr的写地址信号格雷码编码后同步到读时钟域clk_rd,采用3级打拍的方式进行同步。

然后对同步后的写地址信号进行格雷码解码,最后将同步后的写地址信号和读地址信号相减,根据差值rd_occupancy来判断RAM是快读空了nearly_empty还是已经读空了EMPTY最后是例化异步RAM,RAM的读数据和使能输出即可。

在仿真文件中产生递增数,按照FIFO的常规操作进行控制,非满就写,非空就读,如下所示。

双击sim目录下的top_tb.bat文件,如下所示。

首先看一下写时钟快于读时钟的仿真波形。由于写时钟快于读时钟,RAM很快就会写满了,后续是RAM被读一个数据才能写入一个数据,仿真结果和分析一致。

再看一下写时钟慢于读时钟的仿真,由于写时钟满于读时钟,RAM很快就会读空了,后续是RAM写入一个数据才能被读出一个数据,仿真结果和分析一致。大家如果感兴趣可以好好的看看仿真的波形。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/212337.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

『TypeScript』从零开始编写你的第一个TypeScript程序

📣读完这篇文章里你能收获到 了解TypeScript及为什么使用TypeScriptTypeScript的安装过程编写第一个HelloTs程序 文章目录 一、TypeScript简介1. 什么是TypeScript?2. 为什么选择使用TypeScript?2.1 静态类型检查2.2 更好的代码维护性2.3 更…

【尘缘送书第五期】Java程序员:学习与使用多线程

目录 1 多线程对于Java的意义2 为什么Java工程师必须掌握多线程3 Java多线程使用方式4 如何学好Java多线程5 参与方式 摘要:互联网的每一个角落,无论是大型电商平台的秒杀活动,社交平台的实时消息推送,还是在线视频平台的流量洪峰…

【头歌实训】分布式文件系统 HDFS

文章目录 第1关:HDFS的基本操作任务描述相关知识HDFS的设计分布式文件系统NameNode与DataNode HDFS的常用命令 编程要求测试说明答案代码 第2关:HDFS-JAVA接口之读取文件任务描述相关知识FileSystem对象FSDataInputStream对象 编程要求测试说明答案代码 …

基于单片机设计的激光测距仪(采用XKC-Kl200模块)

一、前言 随着科技的不断进步和应用需求的增加,测距仪成为了许多领域必备的工具之一。传统的测距仪价格昂贵、体积庞大,使用起来不够方便。本项目采用STC89C52单片机作为主控芯片,结合XKC-KL200激光测距模块和LCD1602显示器,实现…

ZKP Understanding Nova (2) Relaxed R1CS

Understanding Nova Kothapalli, Abhiram, Srinath Setty, and Ioanna Tzialla. “Nova: Recursive zero-knowledge arguments from folding schemes.” Annual International Cryptology Conference. Cham: Springer Nature Switzerland, 2022. Nova: Paper Code 2. Unders…

Vue的Nuxt项目部署在服务器,pm2动态部署和npm run build静态部署

Nuxt项目的部署有两种方式,一种是静态部署,一种是动态部署 静态部署需要关闭项目的ssr功能,动态部署则不需关闭,所以怎么部署项目就看你用不用ssr功能了 。 1.静态部署 先说静态部署,很简单,只需要在nuxt…

React创建项目

React创建项目 提前安装好nodejs再进行下面的操作,通过node -v验证是否安装 1.设置源地址 npm config set registry https://registry.npmmirror.com/2.确认源地址 npm config get registry返回如下 https://registry.npmmirror.com/3.输入命令 npx create-re…

Clickhouse Join

ClickHouse中的Hash Join, Parallel Hash Join, Grace Hash Join https://www.cnblogs.com/abclife/p/17579883.html https://clickhouse.com/blog/clickhouse-fully-supports-joins-full-sort-partial-merge-part3 总结 本文描述并比较了ClickHouse中基于内存哈希表的3种连接…

一天一个设计模式---原型模式

基本概念 原型模式(Prototype Pattern)是一种创建型设计模式,其主要目的是通过复制现有对象来创建新对象,而不是通过实例化类。原型模式允许在运行时动态创建对象,同时避免了耦合与子类化。 在原型模式中&#xff0…

Mysql综合案例练习<1>

MySql综合案例练习<1> 题目一题目二题目三题目四题目五题目六题目七题目八题目九题目十题目十一题目十二题目十三题目十四题目十五题目十六题目十七题目十八题目十九 题目一 创建数据库test01_library 创建表 books&#xff0c;表结构如下&#xff1a; CREATE DATABASE …

mysql基础之约束

在mysql中null和任何值都不相同&#xff0c;null和null也不相同 1.约束简介 1.1概念 约束英文&#xff1a;constraint 约束实际上就是表中数据的限制条件 1.2.作用 表在设计的时候加入约束的目的就是为了保证表中的记录完整性和有效性&#xff0c;比如用户表有些列的值&am…

docker-compose部署sonarqube 8.9 版本

官方部署文档注意需求版本 所以选择8.9版本 一、准备部署配置 1、持久化目录 rootlocalhost:/root# mkdir -p /data/sonar/postgres /data/sonar/sonarqube/data /data/sonar/sonarqube/logs /data/sonar/sonarqube/extensions rootlocalhost:/root# chmod 777 /data/sona…

「Swift」类淘宝商品瀑布流展示

前言&#xff1a;需要做一个类似于淘宝商品页面的瀑布流展示 结构分析&#xff1a; ps&#xff1a;图片来源 思路分析&#xff1a; 该瀑布流主要还是基于UICollectionView进行展示&#xff0c;只是在cell展示的UICollectionViewFlowLayout需要进行相应调整和自定义&#xff…

智能优化算法应用:基于北方苍鹰算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于北方苍鹰算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于北方苍鹰算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.北方苍鹰算法4.实验参数设定5.算法结果6.参考…

python技术栈之单元测试中mock的使用

什么是mock&#xff1f; mock测试就是在测试过程中&#xff0c;对于某些不容易构造或者不容易获取的对象&#xff0c;用一个虚拟的对象来创建以便测试的测试方法。 mock的作用 特别是开发过程中上下游未完成的工序导致当前无法测试&#xff0c;需要虚拟某些特定对象以便测试…

[node] Node.js的Web 模块

[node] Node.js的Web 模块 什么是 Web 服务器&#xff1f;Web的应用架构http使用方式使用 Node 创建 Web 服务器使用 Node 创建 Web 客户端 什么是 Web 服务器&#xff1f; Web服务器一般指网站服务器&#xff0c;是指驻留于因特网上某种类型计算机的程序&#xff0c;Web服务器…

使用WalletConnect Web3Modal v3 链接钱包基础教程

我使用的是vueethers 官方文档&#xff1a;WalletConnect 1.安装 yarn add web3modal/ethers ethers 或者 npm install web3modal/ethers ethers2.引用 新建一个js文件&#xff0c;在main.js中引入&#xff0c;初始化配置sdk import {createWeb3Modal,defaultConfig, } from…

Vue3 Element-Plus 一站式生成动态表单:简化前端开发流程

文章目录 1. 引言2. Vue3 和 Element-Plus 简介2.1 Vue32.2 Element-Plus 3. 动态表单的需求与挑战4. Vue3 和 Element-Plus 动态表单的优势4.1 Vue3的组合式API4.2 Element-Plus的表单组件 5. 一站式生成动态表单的实现5.1 准备工作5.2 创建动态表单组件5.3 使用动态表单组件 …

uniapp横向滚动示例

目录 插件市场案例最后 插件市场 地址 案例 地址 最后 感觉文章好的话记得点个心心和关注和收藏&#xff0c;有错的地方麻烦指正一下&#xff0c;如果需要转载,请标明出处&#xff0c;多谢&#xff01;&#xff01;&#xff01;

读书笔记-《数据结构与算法》-摘要4[插入排序]

插入排序 核心&#xff1a;通过构建有序序列&#xff0c;对于未排序序列&#xff0c;在已排序序列中从后向前扫描(对于单向链表则只能从前往后遍历)&#xff0c;找到相应位置并插入。实现上通常使用in-place排序(需用到O(1)的额外空间) 从第一个元素开始&#xff0c;该元素可…