FPGA原理与结构——FIFO IP核的使用与测试
一、前言
本文介绍FIFO Generator v13.2 IP核的具体使用与例化,在学习一个IP核的使用之前,首先需要对于IP核的具体参数和原理有一个基本的了解,具体可以参考:
FPGA原理与结构——FIFO IP核原理学习
https://blog.csdn.net/apple_53311083/article/details/132378996?spm=1001.2014.3001.5501
二、FIFO IP核定制
1、FIFO IP核
step1 打开vivado工程,点击左侧栏中的IP Catalog

step2 在搜索栏搜索FIFO,找到FIFO Generator核

2、IP核定制
step3 Basic 界面定制

①Component Name :自定义FIFO的名称
②Interface Type :接口类型,我们知道FIFO可以支持Native接口和AXI接口,其中AXI接口包括AXI3,AXI4,AXI Stream类型,这里我们选择Native。
step4 Native Ports 界面设计

step5 Status Flags 界面定制

step6 Data Counts

step7 Summary 
IP核定制的最后一面永远是Summary界面,帮助我们进行一个回顾和检查。
三、IP核测试
首先设计了写FIFO模块和读FIFO模块:
3.1 写fifo模块
//-------------------------------------<写fifo模块>--------------------------------
module fifo_wr(
//-------------------<信号输入>-----------------------input clk, //系统时钟input rst, //复位信号input almost_empty, //FIFO将空信号input almost_full , //FIFO将满信号//-------------------<信号输出>----------------------- output reg fifo_wr_en, //FIFO写使能output reg [7:0] fifo_wr_data //写入FIFO的数据
);//reg define
reg [1:0] state ; //动作状态
reg almost_empty_d0 ; //almost_empty 延迟一拍
reg almost_empty_syn ; //almost_empty 延迟两拍
reg [3:0] dly_cnt ; //延迟计数器//因为 almost_empty 信号是属于FIFO读时钟域的
//所以要将其同步到写时钟域中
always@( posedge clk ) beginif( rst ) beginalmost_empty_d0 <= 1'b0 ;almost_empty_syn <= 1'b0 ;endelse beginalmost_empty_d0 <= almost_empty ;almost_empty_syn <= almost_empty_d0 ;end
end//向FIFO中写入数据
always @(posedge clk ) beginif(rst) beginfifo_wr_en <= 1'b0;fifo_wr_data <= 8'd0;state <= 2'd0;dly_cnt <= 4'd0;endelse begincase(state)2'd0: begin if(almost_empty_syn) begin //如果检测到FIFO将被读空state <= 2'd1; //就进入延时状态end elsestate <= state;end 2'd1: beginif(dly_cnt == 4'd10) begin //延时10拍//原因是FIFO IP核内部状态信号的更新存在延时//延迟10拍以等待状态信号更新完毕 dly_cnt <= 4'd0;state <= 2'd2; //开始写操作fifo_wr_en <= 1'b1; //打开写使能endelsedly_cnt <= dly_cnt + 4'd1;end 2'd2: beginif(almost_full) begin //等待FIFO将被写满fifo_wr_en <= 1'b0; //关闭写使能fifo_wr_data <= 8'd0;state <= 2'd0; //回到第一个状态endelse begin //如果FIFO没有被写满fifo_wr_en <= 1'b1; //则持续打开写使能fifo_wr_data <= fifo_wr_data + 1'd1; //且写数据值持续累加endend default : state <= 2'd0;endcaseend
endendmodule
3.2 读FIFO模块
//-------------------------------------<读fifo模块>--------------------------------
module fifo_rd(
//-------------------<信号输入>-----------------------input clk , // 时钟信号input rst , // 复位信号input [7:0] fifo_dout , // 从FIFO读出的数据input almost_full ,// FIFO将满信号input almost_empty,// FIFO将空信号//-------------------<信号输出>----------------------- output reg fifo_rd_en // FIFO读使能
);//reg define
reg [1:0] state ; // 动作状态
reg almost_full_d0 ; // fifo_full 延迟一拍
reg almost_full_syn ; // fifo_full 延迟两拍
reg [3:0] dly_cnt ; // 延迟计数器//因为 fifo_full 信号是属于FIFO写时钟域的
//所以要将其同步到读时钟域中
always@( posedge clk ) beginif( rst ) beginalmost_full_d0 <= 1'b0 ;almost_full_syn <= 1'b0 ;endelse beginalmost_full_d0 <= almost_full ;almost_full_syn <= almost_full_d0 ;end
end//读出FIFO的数据
always @(posedge clk ) beginif(rst) beginfifo_rd_en <= 1'b0;state <= 2'd0;dly_cnt <= 4'd0;endelse begincase(state)2'd0: beginif(almost_full_syn) //如果检测到FIFO将被写满state <= 2'd1; //就进入延时状态elsestate <= state;end 2'd1: beginif(dly_cnt == 4'd10) begin //延时10拍//原因是FIFO IP核内部状态信号的更新存在延时//延迟10拍以等待状态信号更新完毕dly_cnt <= 4'd0;state <= 2'd2; //开始读操作endelsedly_cnt <= dly_cnt + 4'd1;end2'd2: beginif(almost_empty) begin //等待FIFO将被读空fifo_rd_en <= 1'b0; //关闭读使能state <= 2'd0; //回到第一个状态endelse //如果FIFO没有被读空fifo_rd_en <= 1'b1; //则持续打开读使能end default : state <= 2'd0;endcaseend
endendmodule
3.3 顶层模块
module fifo_top(
//-------------------<信号输入>-----------------------input sys_clk, //系统时钟input rst //复位信号
);wire [7:0] din; //fifo的输入数据(写入的数据)wire wr_en; //写使能wire rd_en; //读使能wire [7:0] dout; //fifo的输出数据(读出的数据)wire full; //fifo满信号wire almost_full; //fifo将满标志wire empty; //fifo空标志wire almost_empty; //fifo将空标志wire [7:0]rd_data_count; //fifo写时钟域的数据计数wire [7:0]wr_data_count; //fifo读时钟域的数据计数wire wr_rst_busy;wire rd_data_count; //-------------------<IP核例化>-----------------------
fifo_exp1 fifo1 (.rst (rst), // input wire rst.wr_clk (sys_clk), // input wire wr_clk.rd_clk (sys_clk), // input wire rd_clk.din (din), // input wire [7 : 0] din.wr_en (wr_en), // input wire wr_en.rd_en (rd_en), // input wire rd_en.dout (dout), // output wire [7 : 0] dout.full (full), // output wire full.almost_full (almost_full), // output wire almost_full.empty (empty), // output wire empty.almost_empty (almost_empty), // output wire almost_empty.rd_data_count (rd_data_count), // output wire [7 : 0] rd_data_count.wr_data_count (wr_data_count), // output wire [7 : 0] wr_data_count.wr_rst_busy (wr_rst_busy), // output wire wr_rst_busy.rd_rst_busy (rd_rst_busy) // output wire rd_rst_busy
);//例化写FIFO模块
fifo_wr fifo_wr_u1(.clk ( sys_clk ), // 写时钟.rst ( rst ), // 复位信号.fifo_wr_en ( wr_en ) , // fifo写请求.fifo_wr_data ( din ) , // 写入FIFO的数据.almost_empty ( almost_empty ), // fifo空信号.almost_full ( almost_full ) // fifo满信号
);//例化读FIFO模块
fifo_rd fifo_rd_u1(.clk ( sys_clk ), // 读时钟.rst ( rst ), // 复位信号.fifo_rd_en ( rd_en ), // fifo读请求.fifo_dout ( dout ), // 从FIFO输出的数据.almost_empty ( almost_empty ), // fifo空信号.almost_full ( almost_full ) // fifo满信号
);endmodule
3.4 测试模块
`timescale 1ns / 1psmodule tb_ip_fifo( );// Inputsreg sys_clk;reg rst;// Instantiate the Unit Under Test (UUT)fifo_top tb1_fifo_top (.sys_clk (sys_clk), .rst (rst));//Genarate the clkparameter PERIOD = 20;always beginsys_clk = 1'b0;#(PERIOD/2) sys_clk = 1'b1;#(PERIOD/2);end initial begin// Initialize Inputsrst = 1;// Wait 100 ns for global reset to finish#100 ;rst = 0;// Add stimulus hereendendmodule
3.4 测试结果

通过看到FIFO如我们预期的写入和读出数据,读出的数据满足先入先出的原则。
四、总结
本文总结了FIFO IP核的使用方法,给出了各个配置参数的具体含义及配置方式,并对相关的设计进行了测试。
相关文章:
FPGA原理与结构——FIFO IP核的使用与测试
一、前言 本文介绍FIFO Generator v13.2 IP核的具体使用与例化,在学习一个IP核的使用之前,首先需要对于IP核的具体参数和原理有一个基本的了解,具体可以参考: FPGA原理与结构——FIFO IP核原理学习https://blog.csdn.net/apple_5…...
ABB CMA120 3DDE300400面板
人机界面:ABB CMA120 3DDE300400 面板通常具有用户友好的人机界面,可用于监视和控制连接设备和系统的操作。 图形显示:该面板通常具有高分辨率的液晶显示屏,用于显示图形界面和实时数据,以便操作员更容易理解和管理工…...
【代码随想录day25】动态规划:01背包理论基础
题目 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 代码 dp[i][j]: 表示从0~i个物品中选物品放到容量为j的背包中所能获得的最大价值 …...
Python Opencv实践 - 轮廓检测
import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/map.jpg") print(img.shape) plt.imshow(img[:,:,::-1])#Canny边缘检测 edges cv.Canny(img, 127, 255, 0) plt.imshow(edges, cmapplt.cm.gray)#查找轮廓 #c…...
c#保留两位小数
1.使用ToString()方法和格式字符串 double number 3.1415926; string result number.ToString(“F2”); // 将number转换为字符串,并保留两位小数 Console.WriteLine(result); // 输出结果为 “3.14” 2.使用字符串插值和格式字符串 double number 3.1415926;…...
[machineLearning]非监督学习unsupervised learning
1.什么是非监督学习 常见的神经网络是一种监督学习,监督学习的主要特征即为根据输入来对输出进行预测,最终会得到一个输出数值.而非监督学习的目的不在于输出,而是在于对读入的数据进行归类,选取特征,打标签,通过对于数据结构的分析来完成这些操作, 很少有最后的输出操作. 从…...
C语言深入理解指针(非常详细)(四)
目录 字符指针变量数组指针变量数组指针变量是什么数组指针变量怎么初始化 二维数组传参的本质函数指针变量函数指针变量的创建函数指针变量的使用代码typedef关键字 函数指针数组转移表 字符指针变量 字符指针在之前我们有提到过,(字符)&am…...
知识库建设:从0到1搞定知识库建设的方法论分享
如果我们想要搭建一个知识库,前提是我们要明确知道这个知识库是干什么用的,只有了解知识库的应用场景才能知道如何去建设知识库。 知识库建设 以常见的电商客服为例,客户会经常咨询什么时候发货,怎么退货,怎么换货………...
SpringBoot+Vue 的留守儿童系统的研究与实现,2.0 版本,附数据库、教程
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1.研究背景2. 技术栈3.系统分析4系统设计5系统的详细设计与实现5.1系统功能模块5.2管理员功能模块…...
28.考试
Description 小学期马上就要结束了,为了检验大家的学习成果,老师进行了一次考试。然而小徐前两周半都忙于练习篮球,几乎没有学习,因此考试时很可能做不完所有题目。 但小徐仍然想要拿到尽可能高的分数,因此在做题时需要…...
浏览器窗口间的通信
一、汇总 二、同源策略 三、webSocket (无跨域限制) 优点:无跨域限制 缺点:成本高 四、客户端存储 1、localStorage onStorage 例子: 2、定时器 客户端存储 例子: 缺点: 五、postMessage (无跨域…...
MATLAB 的 plot 绘图
文章目录 SyntaxDescriptionplot(X,Y)plot(X,Y,LineSpec)plot(X1,Y1,…,Xn,Yn)plot(X1,Y1,LineSpec1,...,Xn,Yn,LineSpecn)plot(Y)plot(Y,LineSpec)plot(tbl,xvar,yvar)plot(tbl,yvar)plot(ax,___)plot(___,Name,Value)p plot(___) plot: 2-D line plot Syntax plot(X,Y)plo…...
SpringBoot项目--电脑商城【获取省市区列表】
1.易错点 1.错误做法 新增收货地址页面的三个下拉列表的内容展示没有和数据库进行交互,而是通过前端实现的(将代码逻辑放在了distpicker.data.js文件中),实现方法是在加载新增收货地址页面时加载该js文件,这种做法不可取 2.正确做法 把这些数据保存到数据库中,用户点击下拉…...
使用git把本地项目关联远程代码仓库,并推送到远程仓库
你在本地新建了一个项目,写好了代码,但是没有关联远程仓库,怎么关联并上传呢? 你要先去gitee创建一个代码仓库,然后复制http地址。 首次提交项目代码到一个新建的远程仓库: 1、通过命令 git init 把这个…...
Spring+MyBatis使用collection标签的两种使用方法
目录 项目场景: 实战操作: 1.创建菜单表 2.创建实体 3.创建Mapper 4.创建xml 属性描述: 效率比较: 项目场景: 本文说明了Spring BootMyBatis使用collection标签的两种使用方法 1. 方法一: 关联查询 2. 方法…...
k8s集群中集群方式安装nacos
1、前提条件 一个k8s集群,其中有三个master 节点,这三个节点的标签名称为etcd 三个master节点的ip 分别为:192.165.187.170 、192.165.187.171、192.165.187.172一个mysql 数据库, 数据库的ip 为:192.165.187.180 用户…...
极客时间:数据结构与算法之美【学习笔记+思考实践】
本篇是 《极客时间:数据结构与算法之美》课程的学习笔记和带有自己的一些思考实践。原文学习链接如下:https://time.geekbang.org/column/intro/100017301 开篇词 | 从今天起,跨过“数据结构与算法”这道坎01 | 为什么要学习数据结构和算法&a…...
基于视觉重定位的室内AR导航项目思路(2):改进的建图和定位分离的项目思路
文章目录 一、建图二、定位首先是第一种方法:几何方法其次是第二种方法:图像检索方法最后是第三种方法:深度学习方法 前情提要: 是第一次做项目的小白,文章内的资料介绍如有错误,请多包含! 一、…...
nodejs+vue+elementui精品课程网站设计
前端技术:nodejsvueelementui基于nodejs语言、vue.js框架、B/S架构、Mysql数据库设计并实现了精品课程网站设计。系统主要包括首页、个人中心、用户管理、课程信息管理、课程分类管理、学习论坛、在线试题管理、试题管理、系统管理、考试管理等功能模块。 本文首先介…...
40个Linux常用命令组合
1.删除0字节文件 find -type f -size 0 -exec rm -rf {} \; 2.查看进程 按内存从大到小排列 ps -e -o "%C : %p : %z : %a"|sort -k5 -nr 3.按cpu利用率从大到小排列 ps -e -o "%C : %p : %z : %a"|sort -nr 4.打印说cache里的URL grep -r -a jpg …...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...
数据库正常,但后端收不到数据原因及解决
从代码和日志来看,后端SQL查询确实返回了数据,但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离,并且ai辅助开发的时候,很容易出现前后端变量名不一致情况,还不报错,只是单…...
