quartus工具篇——fifo ip核

news/2025/2/12 4:28:42/

quartus工具篇——fifo ip核

1、简介

FPGA 中的 FIFO(First-In, First-Out)是一种常见的数据缓冲器,用于在不同的时钟域之间进行数据传输。FIFO 可以暂存一定数量的数据,并支持并行读取和写入操作,同时保持先进先出的数据顺序。

FIFO 在 FPGA 中的应用非常广泛,特别是在需要处理异步数据交换的场景中。以下是一些 FIFO 的基本特性和特点:

  1. 数据存储:FIFO 由一组寄存器或存储单元组成,可以暂存一定数量的数据。每个存储单元可以存储一个数据元素(如字节、字等)。存储单元之间按照 FIFO 原则连接,确保数据的顺序性。
  2. 读写指针:FIFO 使用读写指针来跟踪当前读取和写入的位置,以及可用空间和已存储数据的数量。读指针指示下一个要读取的数据位置,写指针指示下一个要写入的数据位置。读写指针根据读写操作递增,并循环回到 FIFO 的起始位置。
  3. 同步与异步操作:FIFO 可以在不同的时钟域之间进行数据传输,实现异步数据交换。它能够解决数据产生速率与数据消费速率不匹配时的数据处理问题。
  4. 深度与宽度:FIFO 的深度表示存储单元的数量,决定了可以存储的数据量。宽度表示每个存储单元能够存储的数据位数。深度和宽度取决于具体的设计需求。
  5. 读写接口:FIFO 通过独立的读取和写入接口与其他电路进行通信。读取接口用于从 FIFO 中读取数据,写入接口用于向 FIFO 中写入数据。
  6. 数据管理:FIFO 提供了一些额外的功能,如读写标志、满/空状态标志等,以便有效地管理数据的读写操作。

FIFO 可以在许多应用中发挥重要作用,例如数据缓存、流水线数据传输、数据帧同步等。借助 FPGA 的灵活性,我们可以根据具体的需求和设计约束来实现定制化的 FIFO。

同步fifo与异步fifo的比较

  1. 同步 FIFO: 同步 FIFO 在读取和写入时都使用相同的时钟信号,数据传输是在同一时钟域下进行的。读取和写入操作在时钟的上升沿或下降沿进行,具有明确定义的时序关系。同步 FIFO 的特点包括:
  • 时序简单:由于读写操作在同一个时钟信号下进行,不涉及时序转换,因此设计相对较简单。
  • 数据稳定性:由于时钟同步,对于数据的读取和写入,保证了数据的稳定性和可靠性。
  • 可靠性高:同步 FIFO 较为可靠,能够通过时钟握手机制来实现有效的数据传输。
  1. 异步 FIFO: 异步 FIFO 在读取和写入时使用不同的时钟信号,数据传输是跨越不同时钟域的。由于存在时钟领域之间的不同步,需要引入额外的电路来处理时钟缓冲和数据同步等问题。异步 FIFO 的特点包括:
  • 处理异步时序:由于读写操作在不同的时钟域下进行,需要处理异步时序问题,确保数据的正确传输。这通常需要使用双缓冲技术、同步器等方法来实现。
  • 时序复杂:异步 FIFO 的设计更为复杂,需要考虑数据传输的稳定性、时序约束和互锁等问题。对于异步 FIFO 的设计,需要仔细分析时序关系,并采取相应的措施确保正确性。
  • 适应异步系统:异步 FIFO 在跨越不同时钟域的系统中发挥重要作用,可以解决异步数据交换的问题,使得不同部分之间能够以不同的速率进行数据传输。

在选择同步 FIFO 还是异步 FIFO 时,需要根据具体的设计需求和系统要求进行权衡。如果时钟同步性较好且时序要求较低,同步 FIFO 可能是一个更简单和可靠的选择。而在异步时序较为复杂的情况下,异步 FIFO 可以提供解决方案

2、同步fifo ip核配置

2.1、quartus配置fifo(同步)

在quartus右上角搜索fifo,选择文件夹创建ip核

image-20230727193552169

image-20230727193608305

进入fifo后,下图是一些选项的简单介绍,我选择的是同步fifo,数据传输位宽位8bit,总长度位32bit

image-20230727193457754

进入到下面,会让你根据需求创建信号,这些信号的意思分别为

  • full:fifo内部存储几乎要满时
  • empty:fifo内存存储几乎要空时
  • usedw:fifo内部已经使用的字节大小
  • almost full:fifo内部存储几乎要满时
  • almost empty:fifo内部存储几乎要空时
  • Asynchronous clear:异步清零
  • Synchronous clear:同步清零

我这里只做简单的,所以只勾选了前三个信号,后面的信号可以根据自己的需求进行勾选

image-20230727193922829

下面勾选工作模式,一般选择正常工作模式即可。后面选择内存的类型,勾选自动即可,如果你想深入了解工作模式的区别,请参考:

详解 altera 的同步 FIFO IP配置及使用 - 知乎 (zhihu.com)

image-20230727194922240

之后选择优化选项,勾画no即可,详情可参考:详解 altera 的同步 FIFO IP配置及使用 - 知乎 (zhihu.com)

image-20230727195222349

最后生成inst文件,就完成了

image-20230727195242602

2.2、同步fifo仿真代码

只写了一段特别简单的仿真进行模拟,如果需要严谨点的话可以写的更复杂

由于我这里勾选的内存字节大小为32,数据位是8位,所以延时4个周期,不断更换rdreq、wrreq信号,达到模拟的效果

`timescale 1 ns/ 1 ns
module fifo_vlg_tst();
// constants                                           
// general purpose registers
reg eachvec;
// test vector input registers
reg clock;
reg [7:0] data;
reg rdreq;
reg wrreq;
// wires                                               
wire empty;
wire full;
wire [7:0]  q;
wire [4:0]  usedw;parameter SYS_CLK = 20;
always #(SYS_CLK/2) clock = ~clock;
initial beginclock = 1'b0;wrreq = 1'b1;rdreq = 1'b0;repeat(4)beginrepeat(4)begindata = {$random}%64;#(SYS_CLK*8);endwrreq = 1'b0;rdreq = 1'b1;repeat(4)begin#(SYS_CLK*8);endwrreq = 1'b1;rdreq = 1'b0;end$stop;
end// assign statements (if any)                          
fifo i1 (
// port map - connection between master ports and signals/registers   .clock(clock),.data(data),.empty(empty),.full(full),.q(q),.rdreq(rdreq),.usedw(usedw),.wrreq(wrreq)
);
initial                                                
begin                                                  
// code that executes only once                        
// insert code here --> begin                          // --> end                                             
$display("Running testbench");                       
end                                                    
always                                                 
// optional sensitivity list                           
// @(event1 or event2 or .... eventn)                  
begin                                                  
// code executes for every event on sensitivity list   
// insert code here --> begin                          @eachvec;                                              
// --> end                                             
end                                                    
endmodule

2.3、同步fifo仿真结果

image-20230727195606848

3、异步fifo ip核配置

3.1异步fifo 配置

异步fifo几乎与同步fifo相同,主要是勾选的方式不同

image-20230729165322221

这里勾选默认即可

image-20230729165347653

选择勾选的信号,与同步fifo信号基本类似,我这里多勾选了几个,方便观察

image-20230729165424346

其他步骤全部默认,生成文件即可

image-20230729165504699

3.2异步fifo仿真代码

`timescale 1 ps/ 1 ps
module afifo_vlg_tst();
// constants                                           
// general purpose registers
// test vector input registers
parameter SYS_CLK_READ = 20;
parameter SYS_CLK_WRITE = 10;reg [7:0] data;
reg rdclk;
reg rdreq;
reg wrclk;
reg wrreq;
// wires                                               
wire [7:0]  q;
wire rdempty;
wire rdfull;
wire [4:0]  rdusedw;
wire wrempty;
wire wrfull;
wire [4:0]  wrusedw;always #(SYS_CLK_READ/2) rdclk= ~rdclk;
always #(SYS_CLK_WRITE/2) wrclk = ~wrclk;initial beginrdclk = 1'b0;wrclk = 1'b0;repeat(10)beginwrreq = 1'b1;rdreq = 1'b0;data = {$random}%64;#(SYS_CLK_WRITE*4);wrreq = 1'b0;rdreq = 1'b1;#(SYS_CLK_READ*4);end
end
// assign statements (if any)                          
afifo i1 (
// port map - connection between master ports and signals/registers   .data(data),.q(q),.rdclk(rdclk),.rdempty(rdempty),.rdfull(rdfull),.rdreq(rdreq),.rdusedw(rdusedw),.wrclk(wrclk),.wrempty(wrempty),.wrfull(wrfull),.wrreq(wrreq),.wrusedw(wrusedw)
);
endmodule

3.3仿真结果

image-20230729170007984

4、总结

由于自身水平原因,不能对fifo做一个更为详细的介绍,只作为自己的一个学习记录,如果有需要,可以参考下面链接去进行学习

FPGA(异步FIFO原理及Verilog代码实现)_哔哩哔哩_bilibili

07_FIFO IP核的使用讲解_哔哩哔哩_bilibili

先入先出——FIFO的Verilog实现与仿真(一) - 知乎 (zhihu.com)


http://www.ppmy.cn/news/993464.html

相关文章

SK5代理与网络安全:保障爬虫安全与效率的最佳选择

一、SK5代理和IP代理的概念及区别 SK5代理(也称为socks5代理)和IP代理是两种常见的代理技术。IP代理是通过代理服务器转发请求和响应,隐藏客户端的真实IP地址,从而实现匿名访问和绕过网络限制。SK5代理是一种特殊的代理协议&#…

【javascript】关于path-package

背景 一个老的vue项目,预览pdf文件的时候,电子签章不显示 解决方案 由于是老项目,升级版本存在风险,然后又找到一些解决方案,都是修改源码,修改源码就引出了今天的主题 path-package,我们需要…

Java课题笔记~数据库连接池

一、数据库连接池 1.1 数据库连接池简介 数据库连接池是个容器,负责分配、管理数据库连接(Connection) 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个; 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数…

远距离传输大型文件:如何应对不同地区的网络环境和带宽约束

在现代社会中,远程传输大文件已经变得非常常见了。无论是个人生活还是各种组织之间的合作和协作,都需要频繁地进行文件传输。但是,由于不同地区的网络状况和带宽限制,传输大文件可能会遇到很多问题。因此,如何应对不同…

vue使用driver.js完成页面引导的功能

需求:给客户做一个页面引导,教客户怎么做 效果: driverjs官方文档 一.安装driver.js # Using npm npm install driver.js# Using pnpm pnpm install driver.js# Using yarn yarn add driver.js 二.在自己需要引导的页面上引入driver.js i…

redis 淘汰策略和持久化

文章目录 一、淘汰策略1.1 背景1.2 淘汰策略 二、持久化2.1 AOF日志2.1.1 AOF配置2.1.2 AOF策略2.1.3 AOF缺点2.1.4 AOF Rewrite2.1.5 AOF Rewrite配置2.1.6 AOF Rewrite缺点2.1.7 fork进程时的写时复制2.1.8 大key对持久化的影响 2.2 RDB快照2.2.1 RDB配置2.2.2 RDB缺点 2.3 混…

搞活系列-Java NIO之偏偏不用buffer.flip()会出现什么问题?

最近看博客又看到了Java NIO相关的博客,其中有讲解NIO和传统IO关于文件复制的文章,看到了如下的代码: /**** channel用例* 基于channel的文件复制*/Testpublic void fileCopyByChannel(){try {FileInputStream fileInputStream new FileInpu…

Linux-MySQL安装

配置: 1.VMware workstation pro 2.MySQL 3.centOS 5.7版本 1.配置yum仓库 #更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022#安装 rpm --Uvh https://repo.mysql.com//mysql57-community-release-el7-7.noarch.rpm 2.安装mysql yum …