FPGA开发——IP核的FIFO调用

一、简介

        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我们可以看到数据已经成功写入且成功读出。调用到此结束。 

IP(Intellectual Property)即知识产权。美国 Dataquest 咨询公司将半导体产业的 IP 定 义为“用于 ASIC 或 FPGA 中的预先设计好的电路功能模块”。简而言之,这里的 IP 即电 路功能模块。 IP 在数字电路中常用于比较复杂的功能模块(如 FIFO、 RAM、 FIR 滤波 器、 SDRAM 控制器、 PCIE 接口等)设计成参数可修改的模块,让其他用户可以直接调用 这些模块。随着设计规模增大,复杂度提高,使用 IP 可以提高开发效率,减少设计和调 试时间,加速开发进程,降低开发成本,是业界的发展趋势。利用 IP 设计电子系统,引 用方便,修改基本元件的功能容易。具有复杂功能和商业价值的 IP 一般具有知识产权, 尽管 IP 的市场活动还不规范,但是仍有许多集成电路设计公司从事 IP 的设计、开发 和营销工作。 IP 有三种不同的存在形式: HDL 语言形式,网表形式、版图形式。分别对应我们常 说的三类 IP:软、固和硬。这种分类主要依据产品交付的方式,而这三种 IP实现方法也各具特色。 PLL(Phase Locked Loop,即锁相环)是最常用的 IP 之一,其性能强大,可以对输 入到 FPGA 的时钟信号进行任意分频、倍频、相位调整、占空比调整,从而输出一个期望 时钟,实际上,即使不想改变输入到 FPGA 时钟的任何参数,也常常会使用 PLL,因为经 过 PLL 后的时钟在抖动(Jitter)方面的性能更好一些。 Altera 中的 PLL 是模拟锁相环,和 数字锁相环不同的是模拟锁相环的优点是输出的稳定度高、相位连续可调、延时连续可 调;缺点是当温度过高或者电磁辐射过强时会失锁(普通环境下不考虑该问题)。
### FPGAFIFO 的实现及相关问题 FIFO(First In First Out)是一种常见的数据缓冲结构,在 FPGA 设计中广泛用于解决不同时钟域之间的数据传输问题以及提高系统的吞吐量。以下是关于 FPGAFIFO 实现的关键点: #### 1. **同步与异步 FIFO** 在 FPGA 中,可以根据应用场景设计同步或异步 FIFO: - 同步 FIFO 使用单一的时钟信号操作读写指针和存储器单元[^1]。 - 异步 FIFO 则涉及两个不同的时钟域,通常需要使用格雷码或其他方法来跨时钟域传递状态信息以避免亚稳态问题。 #### 2. **满标志与空标志的设计** 为了防止数据溢出或下溢,FIFO 需要提供满标志(Full Flag)和空标志(Empty Flag)。这些标志可以通过比较读写指针的位置来生成。对于多时钟域的应用场景,可能还需要额外的逻辑来处理跨时钟域的状态传递[^5]。 ```verilog // Verilog 示例:简单的同步 FIFO 满/空标志生成 module fifo_flags #(parameter DEPTH = 8)( input wire clk, input wire reset, output reg full_flag, output reg empty_flag, input wire write_en, input wire read_en); reg [$clog2(DEPTH)-1:0] wr_ptr; reg [$clog2(DEPTH)-1:0] rd_ptr; always @(posedge clk or posedge reset) begin if (reset) begin wr_ptr <= 'd0; rd_ptr <= 'd0; full_flag <= 'b0; empty_flag <= 'b1; end else begin if (write_en && !full_flag) wr_ptr <= wr_ptr + 1'b1; if (read_en && !empty_flag) rd_ptr <= rd_ptr + 1'b1; // 更新满/空标志 full_flag <= (wr_ptr == rd_ptr - 1); empty_flag <= (wr_ptr == rd_ptr); end end endmodule ``` #### 3. **跨时钟域的数据传输** 当 FIFO 被用来连接两个不同时钟域时,必须特别注意如何安全地传递数据和状态信息。一种常见的方式是使用双端口 RAM 和格雷编码技术来减少亚稳态的影响[^2]。 #### 4. **资源优化** 在实际应用中,FPGA 提供了专用的 BRAM(Block RAM)或分布式 RAM 来实现 FIFO 功能。合理配置这些资源可以显著提升性能并降低功耗。例如,Xilinx Vivado 工具链支持自动综合 FIFO 结构,并允许用户指定深度、宽度和其他参数[^4]。 #### 5. **安全性考虑** 如果 FIFO 应用于敏感数据路径,则需关注其安全性。例如,利用 FPGA 平台内置的安全启动机制保护比特流免受篡改攻击[^3]。此外,还应确保 FIFO 的访问权限受到严格控制,以防未授权的操作影响系统整体可靠性。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电子小芯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值