FPGA开发——IP核的FIFO调用

news2024/9/20 14:50:56

一、简介

        FIFO 的英文全称是 First In First Out,即先进先出。 FPGA 使用的 FIFO 一般指的是对数据的存储具有先进先出特性的一个缓存器,常被用于数据的缓存或者高速异步数据的交互,也即所谓的跨时钟域信号传递。它与 FPGA 内部的 RAM 和 ROM 的区别是没有外部读写地址线,采取顺序写入数据,顺序读出数据的方式,使用起来简单方便,由此带来的缺点就是不能像 RAM 和 ROM 那样可以由地址线决定读取或写入某个指定的地址。

1、FIFO分类

        FIFO 从输入时钟的角度来分,有两种类型:单时钟 FIFO(SCFIFO)和双时钟 FIFO (DCFIFO);其中,双时钟 FIFO 又可从输出数据的位宽的角度,分为普通双时钟(DCFIFO)和混合宽度双时钟 FIFO(DCFIFO_MIXED_WIDTHS)。单时钟 FIFO 具有一个独立的时钟端口 clock,因此,所有的输入输出信号都同步于 clock 信号。双时钟 FIFO结构中,写端口和读端口分别有独立的时钟,所有与写相关的信号都是同步于写时钟wrclk,所有与读相关的信号都是同步于读时钟 rdclk。


2、同步FIFO和异步FIFO 原理图

3、单时钟 FIFO 和双时钟 FIFO 的应用场景

单时钟 FIFO 常用于同步时钟的数据缓存;

双时钟 FIFO 常用于跨时钟域的数据信号的传递,例如时钟域 A 下的数据 data1 传递给异步时钟域 B,当 data1 为连续变化信号时,如果直接传递给时钟域 B 则可能会导致收非所送的情况,即在采集过程中会出现包括亚稳态(数据采样失真)问题在内的一系列问题,使用双时钟 FIFO 能够将不同时钟域中的数据同步到所需的时钟域中。

 二、FIFO的配置

1、FIFO的选择

如图所示,在 IP Catalog 的搜索栏中搜索 FIFO,然后选择 FIFO。(这里和前面调用的pll一样也是需要先进行工程创建,不清楚的小伙伴可以在前面的文章看看)

2、 FIFO存放位置的选择

3、fifo存储容量和同步时钟设置

如下图所示,该界面配置的参数有:

方框①:fifo的数据存储容量

方框②:fifo读写的时钟选择,Yes选项是读写时钟同一个时钟,No是读写使用不同的时钟,这里看自己需要进行选择。在本篇文章中默认使用同一个时钟。然后点击 Next 进入下一界面。

 

4、控制信号的选择

如下图所示,该界面配置的参数有:

方框①:这里是满信号——full、空信号——empty、fifo剩余容量信号——usedw的选择,这里一般我们不用选,系统默认就已经选择好了,如果没有就自行勾选。

方框②:也是满信号的设置,只不过这里和上面一个的区别就是这个信号是容量接近满的状态,这样可以给fifo留有缓冲的容量,避免数据出错。不做要求一般不选

方框③:这里是空信号的设置,当fifo剩余容量少于某个值时,系统就认为是空,这里和②一样一般也是默认不选。

方框④:这里就是数据清除的选择,第一个选想是异步清除,第二个选项是同步清除。这里我们默认选择异步清除。然后点击 Next 进入下一界面。

5、fifo显示模式的选择

如下图所示,该界面配置的参数有:

方框①:这里是fifo显示模式的选择,认为普通模式和前显模式,如果需要实时读写的话就选择第一个普通模式,如果是对已经存在的数据进行一个读取或者修改的话就选择第二个前显模式。

方框②:这里是fifo构建资源的选择,一般默认就行。然后点击 Next 进入下一界面。

6、最大输出的寄存器选择

这里因为需要占用额外的资源,所以一般选择No。

7、仿真工具文件的选择

8、 生成文件的选择

如下图所示,该页面为需要配置生成的文件。勾选fifo_inst.v 即可。rfifo_bb.v 可勾可不勾选。然后点击 finish。

9、将文件添加到工程中

如下图所示,配置完成,点击“Yes”即可。 

三、FIFO的调用

1、设计文件的编写

在rtl文件夹中新建ip_fifo.v文件,其中ram实例化代码可以从 fifo_inst.v 例化模板文件复制。如图:

module ip_fifo (
    input clk,
    input rst_n,
	input [7:0] data,
	input rden,
	input wren,
	output empty,
	output full,
	output [7:0] q,
	output [7:0] usedw
);
wire rdreq;
wire wrreq;
fifo	fifo_inst (
	.aclr ( ~rst_n ),//复位
	.clock ( clk ),//时钟
	.data ( data ),//输入数据
	.rdreq ( rden ),//读有效信号
	.wrreq ( wren ),//写有效信号
	.empty ( empty ),//空标志位
	.full ( full),//满标志位
	.q 	  ( q ),
	.usedw ( usedw )//FIFO 中剩余的数据量
	);


endmodule

2、测试文件的编写

`timescale 1ns/1ns
module fifo_tb();

reg clk     ; 
reg rst_n   ; 
reg [7:0] data    ; 
reg rden    ; 
reg wren    ; 
wire empty   ; 
wire full    ; 
wire [7:0] q      ;
wire [7:0] usedw  ;

ip_fifo ip_fifo_inst(
    /*input        */ .clk   (clk   )  ,
    /*input        */ .rst_n (rst_n )  ,
	/*input [7:0]  */ .data  (data  )  ,
	/*input        */ .rden  (rden  )  ,
	/*input        */ .wren  (wren  )  ,
	/*output        */ .empty (empty )  ,
	/*output        */ .full  (full  )  ,
	/*output [7:0] */ .q     (q     )  ,
	/*output [7:0] */ .usedw (usedw )
    );
//时钟
parameter  CLK_CLY =20 ;
initial clk=0;
always #(CLK_CLY/2) clk=~clk;

integer i;
//复位
initial begin
    rst_n =1'b0;
    data = 0;
    wren = 0;
    rden = 0;
    #(CLK_CLY*2);
    #3;
    rst_n=1'b1;
    #(10*CLK_CLY);
    //开始赋值
    for(i=0;i<512;i=i+1)begin
        data = {$random};
        wren = 1'b1;
        #(1*CLK_CLY);
        wren = 1'b0;
    end
    #(100*CLK_CLY);

     for(i=0;i<200;i=i+1)begin
        rden = 1'b1;
        #(1*CLK_CLY);
        rden = 1'b0;
    end 
end

endmodule


                                                   

3、波形仿真

通过波形图和mendata我们可以看到数据已经成功写入且成功读出。调用到此结束。 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言 | Leetcode C语言题解之第330题按要求补齐数组

题目&#xff1a; 题解&#xff1a; int minPatches(int* nums, int numsSize, int n) {int patches 0;long long x 1;int index 0;while (x < n) {if (index < numsSize && nums[index] < x) {x nums[index];index;} else {x << 1;patches;}}retu…

网通设备有关工程师产品设计时如何选择适合的集成网口座呢?

Hqst盈盛&#xff08;华强盛&#xff09;电子导读&#xff1a;今天分享的是网通设备有关工程师产品设计时如何选择集成网口座呢&#xff1f; 下面我们一起来看看网通设备有关工程师产品设计时是选择集成网口座的 综合多年与网通产品或相关…

微调LLama 3.1——七月论文审稿GPT第5.5版:拿早期paper-review数据集微调LLama 3.1

前言 对于llama3&#xff0c;我们之前已经做了针对llama3 早7数据微调后的测评 去pk llama2的早7数据微调后&#xff0c;推理测试集中的早期paper&#xff1a;出来7方面review去pk gpt4推理测试集中的早期paper&#xff1a;7方面reviewground truth是早期paper的7方面人工rev…

13.3 正则表达式的应用

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

vue 打包时候的分包

export default defineConfig({plugins: [vue()],resolve: {alias: {: fileURLToPath(new URL(./src/, import.meta.url))}},// 分包&#xff0c;node_modules中的单独打包成名字为vendor的js文件build: {rollupOptions: {manualChunks(id) {if (id.includes(node_modules)) {r…

汽车测试,引领国际

汽车测试及质量监控博览会&#xff08;中国&#xff09;(Testing Expo China 2024 - Automotive )是引领世界的领先国际展会&#xff0c;将于 2024 年 8 月 28-30日在上海世博展览馆举行。展示汽车测试、开发和验证技术的各个方面&#xff0c;每年在中国、欧洲和美国举办&#…

Openssh升级到>=9.6版本导致sftp不兼容的解决办法

因为要修复漏洞&#xff0c;所以得升级openssh&#xff0c;但从9.6开始&#xff0c;默认编译出来的openssh&#xff0c;无法兼容之前的sftp客户端了&#xff0c;大概的错误信息就是算法协商不一致。 解决办法其实也简单&#xff0c;就2步&#xff1a; 1. 编译的时候&#xff0c…

Linux学习记录(五)-------三类读写函数

文章目录 三种读写函数1.行缓存2.无缓存3.全缓存4.fgets和fputs5.gets和puts 三种读写函数 1.行缓存 遇到新行&#xff08;\n&#xff09;,或者写满缓存时&#xff0c;即调用系统函数 读&#xff1a;fgets,gets,printf,fprintf,sprintf写&#xff1a;fputs,puts,scanf 2.无缓…

Flink Checkpoint expired before completing解决方法

在Flink消费Kafka日志的时候出现了这样的一则报错&#xff0c; JobManager报错如下&#xff1a; 2024-03-07 15:21:12,500 [Checkpoint Timer] WARN org.apache.flink.runtime.checkpoint.CheckpointFailureManager [] - Failed to trigger or complete checkpoint 181 for …

面试官:怎样设计一个分布式任务调度平台?

大家好&#xff0c;我是君哥。 在工作中&#xff0c;批量任务调度的需求经常会遇到&#xff0c;比如下面的几个场景&#xff1a; 数据迁移&#xff1a;从数据库 A 批量读取数据&#xff0c;加工后把数据写入数据库 B&#xff1b; 消息通知&#xff1a;运营商批量给客户发送短…

宠物空气净化器什么牌子好?希喂、美的测评推荐

家里养了两只猫&#xff0c;每天晚上和我入眠&#xff0c;早上睡醒过来就看到猫睡在我身边&#xff0c;这一刻幸福感爆棚。幸福感爆棚的同时&#xff0c;无力感也袭来。主要是因为虽然每天玩得都很开心&#xff0c;但是家里的变化让我不禁感慨这是真实存在的吗。一回到家就会发…

【Material-UI】Checkbox组件:受控模式详解

文章目录 一、什么是受控组件&#xff1f;二、受控模式的基本用法1. 核心概念2. 代码分析 三、受控组件的优势与应用场景1. 确保数据的一致性2. 简化复杂的表单逻辑3. 轻松实现状态回显 四、受控模式的最佳实践1. 状态管理2. 优化性能3. 处理异步数据 五、结论 在Web开发中&…

【数据结构-前缀哈希】力扣3026. 最大好子数组和

给你一个长度为 n 的数组 nums 和一个 正 整数 k 。 如果 nums 的一个 子数组 中&#xff0c;第一个元素和最后一个元素 差的绝对值恰好 为 k &#xff0c;我们称这个子数组为 好 的。换句话说&#xff0c;如果子数组 nums[i…j] 满足 |nums[i] - nums[j]| k &#xff0c;那么…

如何通过AquilaInsight快速查看每天有哪些异常/慢查询?

友情链接&#xff1a; AquilaInsight核心功能及角色概览Aquila的核心功能介绍DBA Service的核心功能介绍刚部署好Aquila Insight&#xff0c;第一次如何使用如何通过Aquila Insight快速定位一个查询为什么慢&#xff1f;Aquila 添加自定义监控信息和告警的示例当Quark/Incepto…

[器械财讯]威高血液净化:中国血液透析市场的领军企业冲刺IPO

一、IPO冲刺&#xff1a;威高血净迎来新进展 山东威高血液净化制品股份有限公司&#xff08;以下简称“威高血净”&#xff09;在2023年12月30日正式启动IPO后&#xff0c;于2024年8月2日迎来新进展&#xff0c;其审核状态在上海证券交易所更新为“已问询”。尽管2024年医药行…

没有获取淘宝API的资质怎么获取淘宝数据

淘宝是头部电商平台之一&#xff0c;每个自研商家或电商软件服务商想要开发电商管理功能模板就少不了要对接淘宝API。淘宝API是在淘宝开放平台提供的&#xff0c;自研商家和软件服务商接入淘宝开放平台需要经过一系列审核和申请流程&#xff0c;要求资质和相关资料符合对应的要…

Windows下,C# 通过FastDDS高效通信

目录 1、安装FastDDS 库2、使用IDL定义自己的数据格式3、生成DLL3.1 托管 &#xff08;Managed&#xff09;模式3.2 非托管 &#xff08;Unmanaged&#xff09;模式 -- 可用于Unity 代码示例 eprosima Fast DDS is a C implementation of the DDS (Data Distribution Service) …

【面试八股文】软件测试面试题汇总

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、你的测试职业发展是什么? 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有…

bug: 配置flyway.locations多个脚本位置不生效

文章目录 业务场景场景一场景二 业务场景 随着项目版本迭代&#xff0c;数据库结构也会变动。如果一个项目引用其他项目的jar包&#xff0c;并且需要执行对应jar包的flyway脚本&#xff0c;就需要配置flyway.locations 场景一 正常情况下&#xff0c;在一个项目中可以在yml文件…

【亲测有效!】ubuntu20.04和Centos7离线安装docker及nvidia-container-toolkit

【亲测有效&#xff01;】ubuntu20.04和Centos7离线安装docker及nvidia-container-toolkit 一、Ubuntu20.04安装docker&#xff08;1&#xff09;查看当前系统版本号和名称&#xff08;2&#xff09;在镜像源进行源文件下载&#xff08;3&#xff09;命令行进行安装&#xff08…