quartus工具篇——fifo ip核

这篇具有很好参考价值的文章主要介绍了quartus工具篇——fifo ip核。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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核

quartusii的fifo核,fpga开发

quartusii的fifo核,fpga开发

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

quartusii的fifo核,fpga开发

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

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

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

quartusii的fifo核,fpga开发

下面勾选工作模式,我这里演示两种不同工作模式的区别,选择正常模式进行配置:

选择show ahead模式进行配置

quartusii的fifo核,fpga开发

两种方式后续内容完全相同,可完全按照下列步骤配置

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

quartusii的fifo核,fpga开发

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

quartusii的fifo核,fpga开发

2.2、同步fifo仿真代码

下列书写一段仿真代码和顶层文件来观察两种模式的不同,以及同步fifo的工作原理

module top(
    input wire clk,
    input wire rst_n,
	input wire [7:0] data_sig_1,
	input wire rdreq_sig_1,
	input wire wrreq_sig_1,

	input wire [7:0] data_sig_2,
	input wire rdreq_sig_2,
	input wire wrreq_sig_2,

	output wire empty_sig_1,
	output wire empty_sig_2,
	output wire [3:0]usedw_sig_1,
	output wire [3:0]usedw_sig_2,

	output wire full_sig_1,
	output wire full_sig_2,

	output wire[7:0] q_sig_1,
	output wire[7:0] q_sig_2
	);

fifo1	fifo1_inst (
	.aclr ( ~rst_n ),
	.clock ( clk ),
	.data ( data_sig_1 ),
	.rdreq ( rdreq_sig_1 ),
	.wrreq ( wrreq_sig_1 ),
	.empty ( empty_sig_1 ),

	.full ( full_sig_1 ),
	.q ( q_sig_1 ),
	.usedw ( usedw_sig_1 )
	);

fifo2	fifo2_inst (
	.aclr ( ~rst_n ),
	.clock ( clk ),
	.data ( data_sig_2 ),
	.rdreq ( rdreq_sig_2 ),
	.wrreq ( wrreq_sig_2 ),
	.empty ( empty_sig_2 ),

	.full ( full_sig_2 ),
	.q ( q_sig_2 ),
	.usedw ( usedw_sig_2 )
	);
endmodule
`timescale 1ns/1ns
module moudle_tb();

reg clk;
reg rst_n;
reg[7:0] data_sig_1;
wire rdreq_sig_1;
wire wrreq_sig_1;

wire rdreq_sig_2;
wire wrreq_sig_2;

wire empty_sig_1;
wire empty_sig_2;
wire [3:0]usedw_sig_1;
wire [3:0]usedw_sig_2;

wire full_sig_1;
wire full_sig_2;

wire[7:0] q_sig_1;
wire[7:0] q_sig_2;

parameter SYS_CLK = 20;
always #(SYS_CLK/2) clk = ~clk;

initial begin
    clk=1'b1;
    rst_n=1'b0;
    
    #(2*SYS_CLK);
    rst_n=1'b1;
end
assign wrreq_sig_1 = ~full_sig_1;
assign wrreq_sig_2 = ~full_sig_2;
assign rdreq_sig_1 = ~empty_sig_1;
assign rdreq_sig_2 = ~empty_sig_2;
initial begin
	data_sig_1 = 8'd0;
	#(SYS_CLK*2)
	repeat(20)begin
		data_sig_1 = {$random}%64;
		
		#(SYS_CLK);
	end
	#(5*SYS_CLK);
	repeat(20)begin
		
		#(SYS_CLK);
	end
	#(5*SYS_CLK)
	$stop;
end

top inst_top
	(
		.clk         (clk),
		.rst_n       (rst_n),
		.data_sig_1  (data_sig_1),
		.rdreq_sig_1 (rdreq_sig_1),
		.wrreq_sig_1 (wrreq_sig_1),
		.data_sig_2  (data_sig_1),
		.rdreq_sig_2 (rdreq_sig_2),
		.wrreq_sig_2 (wrreq_sig_2),

		.empty_sig_1 (empty_sig_1),
		.empty_sig_2 (empty_sig_2),
		.usedw_sig_1 (usedw_sig_1),
		.usedw_sig_2 (usedw_sig_2),
		.full_sig_1  (full_sig_1),
		.full_sig_2  (full_sig_2),
		.q_sig_1     (q_sig_1),
		.q_sig_2     (q_sig_2)
	);


endmodule

2.3、同步fifo仿真结果

quartusii的fifo核,fpga开发

从图中可以看出,正常工作模式和show ahead工作模式最大的区别就是,show ahead工作模式会在read读信号来的时候或者之前就会开始读取数据,而正常模式下需要在读信号来之后延时一个周期才会开始读取数据

3、异步fifo ip核配置

3.1异步fifo 配置

异步fifo几乎与同步fifo相同,主要是勾选的方式不同,异步fifo可以勾选不同的输出位宽,及输入的数据大小和读取的数据大小可以不一致,下面将进行延时

输出位宽和输入位宽相同:

quartusii的fifo核,fpga开发

输入位宽和输出位宽不同:

quartusii的fifo核,fpga开发

后面配置这两种模式是一致的,我就不做过多的演示

这里勾选默认即可

quartusii的fifo核,fpga开发

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

quartusii的fifo核,fpga开发

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

quartusii的fifo核,fpga开发

3.2异步fifo仿真代码

下列书写一段仿真代码和顶层文件来观察两种模式的不同,以及异步fifo的工作原理

module top_a(
    input wire clk,
    input wire clk_100m,
    input wire rst_n,
	input wire [7:0] data_sig_1,
	input wire rdreq_sig_1,
	input wire wrreq_sig_1,

	input wire [7:0] data_sig_2,
	input wire rdreq_sig_2,
	input wire wrreq_sig_2,

	output wire empty_sig_1,
	output wire empty_sig_2,
	output wire [3:0]usedw_sig_1,
	output wire [3:0]usedw_sig_2,
	output wire [3:0] usedw_sig_3,
  	output wire [3:0] usedw_sig_4,
	output wire full_sig_1,
	output wire full_sig_2,

	output wire[7:0] q_sig_1,
	output wire[7:0] q_sig_2
	);

  afifo1 afifo1_inst (
      .aclr (~rst_n),
      .data (data_sig_1),
      .rdclk(clk_100m),
      .rdreq(rdreq_sig_1),
      .wrclk(clk),
      .wrreq(wrreq_sig_1),

      .q(q_sig_1),
      .rdempty(empty_sig_1),
      .rdusedw(usedw_sig_1),
      .wrfull(full_sig_1),
      .wrusedw(usedw_sig_2)
  );


  afifo2 afifo2_inst (
      .aclr (~rst_n),
      .data (data_sig_1),
      .rdclk(clk_100m),
      .rdreq(rdreq_sig_2),
      .wrclk(clk),
      .wrreq(wrreq_sig_2),

      .q(q_sig_2),
      .rdempty(empty_sig_2),
      .rdusedw(usedw_sig_3),
      .wrfull(full_sig_2),
      .wrusedw(usedw_sig_4)
  );
endmodule
`timescale 1ns / 1ns
module afifo_tb ();

  reg clk;
  reg rst_n;
  reg clk_100m;

  parameter SYS_CLK = 20;
  always #(SYS_CLK / 2) clk = ~clk;
  always #(5) clk_100m = ~clk_100m;

  reg [7:0] data_sig_1;
  wire rdreq_sig_1;
  wire wrreq_sig_1;

  wire rdreq_sig_2;
  wire wrreq_sig_2;

  wire empty_sig_1;
  wire empty_sig_2;
  wire [3:0] usedw_sig_1;
  wire [3:0] usedw_sig_2;
  wire [3:0] usedw_sig_3;
  wire [3:0] usedw_sig_4;
  wire full_sig_1;
  wire full_sig_2;

  wire [7:0] q_sig_1;
  wire [7:0] q_sig_2;


  initial begin
    clk   = 1'b1;
    rst_n = 1'b0;
    clk_100m = 1'b0;
    #(2 * SYS_CLK);
    rst_n = 1'b1;
  end
  assign wrreq_sig_1 = ~full_sig_1;
  assign wrreq_sig_2 = ~full_sig_2;
  assign rdreq_sig_1 = ~empty_sig_1;
  assign rdreq_sig_2 = ~empty_sig_2;
  initial begin
    data_sig_1 = 8'd0;
    #(SYS_CLK * 2)
      repeat (20) begin
        data_sig_1 = {$random} % 64;

        #(SYS_CLK);
      end
    #(5 * SYS_CLK);
    repeat (20) begin

      #(SYS_CLK);
    end
    #(5 * SYS_CLK) $stop;
  end

  	top_a inst_top_a
		(
			.clk         (clk),
			.clk_100m    (clk_100m),
			.rst_n       (rst_n),
			.data_sig_1  (data_sig_1),
			.rdreq_sig_1 (rdreq_sig_1),
			.wrreq_sig_1 (wrreq_sig_1),
			.data_sig_2  (data_sig_2),
			.rdreq_sig_2 (rdreq_sig_2),
			.wrreq_sig_2 (wrreq_sig_2),
			.empty_sig_1 (empty_sig_1),
			.empty_sig_2 (empty_sig_2),
			.usedw_sig_1 (usedw_sig_1),
			.usedw_sig_2 (usedw_sig_2),
			.usedw_sig_3 (usedw_sig_3),
			.usedw_sig_4 (usedw_sig_4),
			.full_sig_1  (full_sig_1),
			.full_sig_2  (full_sig_2),
			.q_sig_1     (q_sig_1),
			.q_sig_2     (q_sig_2)
		);

endmodule

3.3仿真结果

quartusii的fifo核,fpga开发

我们可以从图中看出,读写时钟大于写入时钟时,直至下一次数据写入,读取信号才会进行拉高,并重新进行读取。

在输出位选和输入位宽不同的时候,先输入的位宽会作为低位,后输入的位宽会作为高位。

4、总结

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

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

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

先入先出——FIFO的Verilog实现与仿真(一) - 知乎 (zhihu.com)文章来源地址https://www.toymoban.com/news/detail-734057.html

到了这里,关于quartus工具篇——fifo ip核的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【FPGA】 Vivado FIFO IP核使用教程

    目录 一、FIFO简介 二、FIFO的应用 三、Vivado FIFO创建 四、FIFO IP核实例化 五、对实例化顶层文件仿真        FIFO 的英文全称是 First In First Out ,即 先进先出 。 FPGA 使用的 FIFO 一般指的是对数据的存储具有先进先出特性的一个缓存器,常被用于数据的缓存或者高速异步数据的交

    2024年02月06日
    浏览(113)
  • FPGA原理与结构——FIFO IP核原理学习

    系列文章目录:FPGA原理与结构(0)——目录与传送门         FIFO是英文First-In-First-Out的缩写,是一种先入先出的数据缓冲器,与一般的存储器的区别在于没有地址线, 使用起来简单,缺点是只能顺序读写数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器

    2024年02月11日
    浏览(48)
  • Altera FPGA 储存单元IP核之RAM、FIFO

         只读存储器,系统上电后数据就被写入ROM,运行过程中只能从ROM中读取数据,而不能改变ROM中的数值。      随机存取储存器,可以随时把数据写入任一指定地址的储存单元,也可以随时从任一指定地址中读取数据。其读写速度是由时钟频率决定的。RAM主要用来存放程

    2023年04月08日
    浏览(45)
  • FPGA原理与结构(12)——FIFO IP核原理学习

    系列文章目录:FPGA原理与结构(0)——目录与传送门         FIFO是英文First-In-First-Out的缩写,是一种先入先出的数据缓冲器,与一般的存储器的区别在于没有地址线, 使用起来简单,缺点是只能顺序读写数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器

    2024年02月08日
    浏览(44)
  • 基于FPGA的OFDM-BPSK链路verilog实现,开发平台为quartusii

    目录 一、理论基础 二、核心程序 三、测试结果        OFDM(Orthogonal Frequency Division Multiplexing)和BPSK(Binary Phase Shift Keying)都是数字通信中常用的调制和多路复用技术。在一个OFDM-BPSK链路中,BPSK用于调制数据信号,而OFDM用于多路复用和传输。 BPSK调制(Binary Phase Shift Keyi

    2024年02月07日
    浏览(46)
  • xilinx FPGA FIFO IP核的使用(VHDL&ISE)

    1.新建工程和ip核文件 下图显示了一个典型的写操作。拉高WR_EN,导致在WR_CLK的下一个上升边缘发生写入操作。因为FIFO未满,所以WR_ACK输出1,确认成功的写入操作。当只有一个附加的单词可以写入FIFO时,FIFO会拉高ALMOST_FULL标志。当ALMOST_FULL拉高之后,一个附加的写入将导致

    2024年02月03日
    浏览(54)
  • 【FPGA】FFT测量信号频率(Quartus IP核)

    ​​​​​​​ 一、前言 二、FFT是什么(原理)? 三、FFT IP核参数介绍 四、仿真 0、文件完整结构 1、设置IP核 2、例化FFT,并完善顶层文件 3、利用matlab生成正弦波信号 4、导出变量x生成的正弦波数据 5、编写testbench 6、RTL Simulation 五、上板 1、matlab生成正弦波信号并导出m

    2024年04月28日
    浏览(37)
  • FPGA时序分析工具上手(一)(Quartus)

    在FPGA的设计中,往往要进行时序约束,时序约束的作用是告诉EDA软件,该设计要达到什么样的时序标准,在时序约束中,有着欠约束和过约束之分。 对于欠约束,就是约束的力度不够大,导致约束不足。 对于过约束,约束力度足够大,那么为什么也不行呢?假设FPGA中有三条

    2024年02月05日
    浏览(51)
  • FPGA之Quartus II 自带的IP核的使用(IP核仅自己学习,未完成)

    1、锁相环:       锁相环是对接收到的信号进行处理,并从其中提取某个时钟的相位信息。锁相环由鉴相器、环路滤波器和压控振荡器组成。  锁相环原理图 鉴相器:         用来鉴别输入信号输入信号Ui与输出信号输出信号Uo之间的相位差相位差,并输出误差电压Ud。Ud

    2023年04月09日
    浏览(49)
  • FPGA IP核配置FIFO中遇到数据不匹配以及输出数据缺失问题的解决与思考

    本人配置了一个 16bit 数据转 8bit 数据的FIFO,因为不涉及异步时钟,所以使用的是单时钟。 一、初级问题 : empty信号一直为高 ,嗯~让我难以下手,毕竟这个问题过于简单化了,这是复位的问题,我的是低电平复位,前期为了方便,我便把复位信号拉低了,然后它一直处于复

    2024年02月03日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包