quartus工具篇——fifo ip核

news2024/11/10 18:13:59

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 begin
	clock = 1'b0;
	wrreq = 1'b1;
	rdreq = 1'b0;
	repeat(4)begin
		repeat(4)begin
		data = {$random}%64;
		#(SYS_CLK*8);
		end
		wrreq = 1'b0;
		rdreq = 1'b1;
		repeat(4)begin
			#(SYS_CLK*8);
		end
		wrreq = 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 begin
	rdclk = 1'b0;
	wrclk = 1'b0;
	repeat(10)begin
		wrreq = 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.coloradmin.cn/o/815724.html

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

相关文章

立即报名 | AI +Serverless Meetup 上海站 8 月 5 日等你相约!

自 2021 年 5 月后,KubeSphere 社区与上海的各位小伙伴已阔别两年,许久不见,甚是想念!2023 年 8 月 5 日,KubeSphere 社区将走进上海组织一场主题为 “AI Serverless” 的 Meetup。此外,云原生也依旧是本次…

AD21 PCB设计的高级应用(三)PCB多板互连装配设计

(三)PCB多板互连装配设计 一旦模块在多板原理图上相互连接,就可以验证板到板的连接。这将检测网络到引脚分配错误和引脚到引脚的互连布线错误。可以解决这些错误并将修改信息更新到对应的 PCB 中,或者重新更新到源系统原理图。 印制电路板不是孤立存在的…

【二进制转换】十进制 转 二进制 (含相关题型)

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 十进制 转 二进制 1. &运算符 介绍2. <…

每日一题——只出现一次的数字(II)

只出现一次的数字——II 题目链接 注&#xff1a;本题的解法建立在位运算之上&#xff0c;如果对位运算不太了解&#xff0c;建议先看看&#x1f449;位运算详解 思路 可能有小伙伴做了只出现一次的数字——I后认为这题也可以用异或运算来解决&#xff0c;但是我们需要注意到…

企业服务器数据库中了_locked勒索病毒怎么解密,_勒索病毒简介与防护

网络技术的发展也为互联网安全带来了一定威胁&#xff0c;对于企业来说&#xff0c;数据安全是关系整个企业正常运行的基础&#xff0c;保护好计算机免受网络威胁的攻击成为大家的一致目标。不过&#xff0c;近期&#xff0c;我们收到很多企业的求助&#xff0c;企业的服务器数…

汽车后视镜反射率检测系统

随着社会的快速发展和物质生活的提供&#xff0c;机动车越来越普及&#xff0c;道路行车安全日益重要。为了保障机动车辆和行人的安全&#xff0c;在行车时不断观察后方和两侧的图像尤为重要。机动车后视镜通过反射镜面可以提供在规定视野内后方和两侧的图像&#xff0c;从而提…

【极大似然性】不同函数(均方误差、交叉熵、KL 散度)不同结局(1/2)

Kowshik chilamkurthy 一、说明 很多时候&#xff0c;数据科学家和机器学习从业者并不欣赏不同损失指标之间的数学和直观关系&#xff0c;如负对数似然、交叉熵、最大似然估计、Kullback-Leibler &#xff08;KL&#xff09; 散度&#xff0c;以及最重要的均方误差。如果我说KL…

工业RFID读写器在食品饮料加工生产的应用!

当前食品饮料加工行业快速发展&#xff0c;得益于科技的应用&#xff0c;科技不仅提高了生产效率&#xff0c;还提升了食品生产质量和食品安全水平。其中&#xff0c;RFID技术在食品饮料行业中的应用对于加工生产帮助很大&#xff0c;RFID技术未来在食品饮料行业仍有巨大的潜力…

进阶高级测试专项,Pytest自动化测试框架总结(四)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、pytest之不只是…

B. Longest Divisors Interval(连续倍数)

题目&#xff1a;Problem - B - Codeforces 总结&#xff1a; 对于连续的倍数&#xff0c;要想连续的数量越大连续的数越小 对于该题遍历50就可以AC 代码献上&#xff08;连续倍数&#xff09;&#xff1a; #include<iostream> #include<cmath>using namespace…

Indo-1 AM,112926-02-0,INDO-1, AM,钙离子荧光探针

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ PART1----产品描述 Indo-1 AM钙离子荧光探针&#xff08;112926-02-0&#xff09;&#xff0c;一种荧光 Ca2 指示剂 (λex340 nm&#xff0c;λem405/485 nm)。Indo-1属紫外激发Ca2荧光指示剂&#xff0c;也是目前常用的钙…

1018 Public Bike Management (PAT甲级)

这道题一开始测试点7过不了&#xff0c;后来发现是需要“output the one that requires minimum number of bikes that we must take back to PBMC”&#xff0c;补上就可以了。 #include <cstdio> #include <vector> #include <algorithm> #include <se…

小红书运营推广方法分享

大家好&#xff0c;我是网媒智星&#xff0c;今天跟大家讨论一下小红书的运营推广方法&#xff0c;总结了七点经验分享给大家。 首先&#xff0c;让我们了解一下什么是热门文案。热门文案可从以下三个方面来定义&#xff1a; 1. 阅读量&#xff1a;如果一篇小红书的阅读量达到上…

汽车后视镜反射率测定仪

汽车后视镜位于汽车头部的左右两侧&#xff0c;顶部以及汽车内部的前方。汽车后视镜反映汽车正后方视野、两侧视野和汽车前端区域视野&#xff0c;以便驾驶员可以间接看清楚这些位置的情况&#xff0c;它起着“第二只眼睛”的作用&#xff0c;扩大了驾驶者的视野范围&#xff0…

手写自定义的spring-boot-start

需求&#xff1a;手写一个加密的spring-boot-start&#xff0c;按着用户定义的加密算法&#xff08;可选&#xff1a;MD5、SHA&#xff09;去加密内容 新建一个maven项目 新建好的项目结构和pom.xml如图 添加pom.xml 完整的pom.xml文件 <?xml version"1.0" …

高并发下判重难?架构必备技能 - 布隆过滤器

系列文章目录 当Dubbo遇到高并发&#xff1a;探究流量控制解决方案 主从选举机制&#xff0c;架构高可用性的不二选择 高并发下判重难&#xff1f;架构必备技能 - 布隆过滤器 系列文章目录前言一、布隆过滤器简介二、特性与应用场景三、参数定制四、java版本的Demo五、总结 前…

七个步骤, 编写一个 Servlet 的 HelloWorld 程序

目录 1.创建项目 2.引入依赖 ①直接粘贴仓库目标地址代码 ② 下载jar包, 然后导入jar包 3.创建目录 4.编写代码 5.打包代码 6. 部署程序 ①使用IDEA打成war包 ②更方便的部署方式 7.验证程序 1.创建项目 使用IDEA创建一个maven项目 2.引入依赖 引入依赖的方式两种…

selenium-web自动化测试

一、selenium环境部署 1.准备chrome浏览器&#xff08;其他浏览器也行&#xff09; 2.准备chrome驱动包 步骤一&#xff1a;查看自己的谷歌浏览器版本(浏览器版本和驱动版本一定要对应) 步骤二&#xff1a;下载对应的驱动包, 下载路径 : ChromeDriver - WebDriver for Chrom…

环境搭建的上手指南

前言 测试环境是QA开展测试工作的前置条件。稳定和可控的测试环境&#xff0c;可以使测试人员在执行测试用例时无需花费额外的时间去维护。 有些公司运维或者研发部门会帮忙准备好测试环境&#xff0c;但是QA如果一味依赖其他部门&#xff0c;会局限测试工作的开展。 一、什…

OSPF随记

邻居状态机&#xff1a;进度条 工作原理&#xff1a; 1.发送hello报文&#xff0c;建立邻居关系 down&#xff1a;没有发送报文之前 init:开始发送hello报文&#xff0c;自己收到的hello报文中没有自己的route-id 2way:收到的hello报文中有自己的route-id&#xff08;在2w…