当前位置: 首页 > news >正文

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

c1987bb2bcf249be8d0ca5f847744a0c.jpeg

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

99ad759bbe6a4661b465b48f57064dc5.jpeg

2、IP核定制 

step3 Basic 界面定制

f0f81c6c86c54f9ca5078d8b1ee0dfbf.jpeg

①Component Name :自定义FIFO的名称 

②Interface Type :接口类型,我们知道FIFO可以支持Native接口和AXI接口,其中AXI接口包括AXI3,AXI4,AXI Stream类型,这里我们选择Native。

Fifo Implementation :用于选择我们想要实现的是同步 FIFO 还是异步 FIFO 以及使用哪
种资源实现 FIFO,这里我们选择“Independent Clocks Block RAM”,即使用块 RAM 来实现的异步 FIFO。
Synchronization Stages :同步级数,这里保持默认为2,如果有更高的频率要求,可以提升。
③FIFO Implementation Options :不同资源类型实现FIFO所能支持的功能列表,大家根据表格自行观察连接即可。


step4 Native Ports 界面设计

5cb4107a8efc498ead60d87e7a8d816a.jpeg

①Read Mode :用于设置读 FIFO 时的读模式,可选的有标准模式和前显模式,一般没有特殊需求的前提下,我们推荐标准模式。这里我们选择默认的“Standard FIFO”。
②Data Port Parameters :用于设置读写端口的数据总线的宽度以及 FIFO 的深度,写宽度“Write Width”我们设置为 8 位,写深度“Write Depth”我们设置为 256,注意此时 FIFO IP 核所能实现的实际深度却是 255;虽然读宽度“Read Width”能够设置成和 写宽度不一样的位宽,且此时读深度“Read Depth”会根据上面三个参数被动地自动设置成相应的值;但是我们还是将读宽度“Read Width”设置成和写宽度“Write Width”一样的位宽,这也是在实际应用中最常用的情况。
③ ECC模式:在本次的FIFO测试中不使用
④ Initiazation :用于设置FIFO的复位等相关内容,默认同步复位,安全复位,full在复位时保持高电平有效。

step5 Status Flags 界面定制

a0527277fa314254b78eb21c51ed18b7.jpeg

“Status Flags”界面,这个界面用于设置用户自定义接口或者用于设定专用的输入口。
① Optional Flags : 可选信号,在这里可以勾选将空和将满信号,这里我们都勾上。
② Handshaking Options :握手信号,这里我们使用不到,就不勾选了。
③ Programmable Flags : 可编程阈值,这里我们也不做选择。

step6 Data Counts

3abd803c1c1948d9906d08033aab49fe.jpeg

Data Counts界面用于设置 FIFO 内数据计数的输出信号,此信号表示当前在 FIFO 内存在多少个有效数据。为了更加方便地观察读/写过程,这里我们把读/写端口的数据计数都打开,且计数值总线的位宽设置为满位宽,即 8 位。

step7 Summary 5615d074617449bcaa49ddc8e40c1ce3.jpeg

         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 测试结果

4e6a307bdfe14cad9d529680c41836ab.jpeg

        通过看到FIFO如我们预期的写入和读出数据,读出的数据满足先入先出的原则。

四、总结 

        本文总结了FIFO IP核的使用方法,给出了各个配置参数的具体含义及配置方式,并对相关的设计进行了测试。

 

相关文章:

FPGA原理与结构——FIFO IP核的使用与测试

一、前言 本文介绍FIFO Generator v13.2 IP核的具体使用与例化&#xff0c;在学习一个IP核的使用之前&#xff0c;首先需要对于IP核的具体参数和原理有一个基本的了解&#xff0c;具体可以参考&#xff1a; FPGA原理与结构——FIFO IP核原理学习https://blog.csdn.net/apple_5…...

ABB CMA120 3DDE300400面板

人机界面&#xff1a;ABB CMA120 3DDE300400 面板通常具有用户友好的人机界面&#xff0c;可用于监视和控制连接设备和系统的操作。 图形显示&#xff1a;该面板通常具有高分辨率的液晶显示屏&#xff0c;用于显示图形界面和实时数据&#xff0c;以便操作员更容易理解和管理工…...

【代码随想录day25】动态规划:01背包理论基础

题目 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 代码 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转换为字符串&#xff0c;并保留两位小数 Console.WriteLine(result); // 输出结果为 “3.14” 2.使用字符串插值和格式字符串 double number 3.1415926;…...

[machineLearning]非监督学习unsupervised learning

1.什么是非监督学习 常见的神经网络是一种监督学习,监督学习的主要特征即为根据输入来对输出进行预测,最终会得到一个输出数值.而非监督学习的目的不在于输出,而是在于对读入的数据进行归类,选取特征,打标签,通过对于数据结构的分析来完成这些操作, 很少有最后的输出操作. 从…...

C语言深入理解指针(非常详细)(四)

目录 字符指针变量数组指针变量数组指针变量是什么数组指针变量怎么初始化 二维数组传参的本质函数指针变量函数指针变量的创建函数指针变量的使用代码typedef关键字 函数指针数组转移表 字符指针变量 字符指针在之前我们有提到过&#xff0c;&#xff08;字符&#xff09;&am…...

知识库建设:从0到1搞定知识库建设的方法论分享

如果我们想要搭建一个知识库&#xff0c;前提是我们要明确知道这个知识库是干什么用的&#xff0c;只有了解知识库的应用场景才能知道如何去建设知识库。 知识库建设 以常见的电商客服为例&#xff0c;客户会经常咨询什么时候发货&#xff0c;怎么退货&#xff0c;怎么换货………...

SpringBoot+Vue 的留守儿童系统的研究与实现,2.0 版本,附数据库、教程

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1.研究背景2. 技术栈3.系统分析4系统设计5系统的详细设计与实现5.1系统功能模块5.2管理员功能模块…...

28.考试

Description 小学期马上就要结束了&#xff0c;为了检验大家的学习成果&#xff0c;老师进行了一次考试。然而小徐前两周半都忙于练习篮球&#xff0c;几乎没有学习&#xff0c;因此考试时很可能做不完所有题目。 但小徐仍然想要拿到尽可能高的分数&#xff0c;因此在做题时需要…...

浏览器窗口间的通信

一、汇总 二、同源策略 三、webSocket (无跨域限制) 优点&#xff1a;无跨域限制 缺点&#xff1a;成本高 四、客户端存储 1、localStorage onStorage 例子&#xff1a; 2、定时器 客户端存储 例子&#xff1a; 缺点&#xff1a; 五、postMessage &#xff08;无跨域…...

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把本地项目关联远程代码仓库,并推送到远程仓库

你在本地新建了一个项目&#xff0c;写好了代码&#xff0c;但是没有关联远程仓库&#xff0c;怎么关联并上传呢&#xff1f; 你要先去gitee创建一个代码仓库&#xff0c;然后复制http地址。 首次提交项目代码到一个新建的远程仓库&#xff1a; 1、通过命令 git init 把这个…...

Spring+MyBatis使用collection标签的两种使用方法

目录 项目场景&#xff1a; 实战操作&#xff1a; 1.创建菜单表 2.创建实体 3.创建Mapper 4.创建xml 属性描述&#xff1a; 效率比较&#xff1a; 项目场景&#xff1a; 本文说明了Spring BootMyBatis使用collection标签的两种使用方法 1. 方法一: 关联查询 2. 方法…...

k8s集群中集群方式安装nacos

1、前提条件 一个k8s集群&#xff0c;其中有三个master 节点&#xff0c;这三个节点的标签名称为etcd 三个master节点的ip 分别为&#xff1a;192.165.187.170 、192.165.187.171、192.165.187.172一个mysql 数据库&#xff0c; 数据库的ip 为&#xff1a;192.165.187.180 用户…...

极客时间:数据结构与算法之美【学习笔记+思考实践】

本篇是 《极客时间&#xff1a;数据结构与算法之美》课程的学习笔记和带有自己的一些思考实践。原文学习链接如下&#xff1a;https://time.geekbang.org/column/intro/100017301 开篇词 | 从今天起&#xff0c;跨过“数据结构与算法”这道坎01 | 为什么要学习数据结构和算法&a…...

基于视觉重定位的室内AR导航项目思路(2):改进的建图和定位分离的项目思路

文章目录 一、建图二、定位首先是第一种方法&#xff1a;几何方法其次是第二种方法&#xff1a;图像检索方法最后是第三种方法&#xff1a;深度学习方法 前情提要&#xff1a; 是第一次做项目的小白&#xff0c;文章内的资料介绍如有错误&#xff0c;请多包含&#xff01; 一、…...

nodejs+vue+elementui精品课程网站设计

前端技术&#xff1a;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 …...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...