基于xilinx的fifo IP核使用

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

一、FIFO IP 核简介

        FIFO(First In First Out,即先入先出),是一种数据缓冲器,用来实现数据先入先出的读写方式。与 ROM 或 RAM 的按地址读写方式不同,FIFO 的读写遵循“先进先出”的原则,即数据按顺序写入 FIFO,先被写入的数据同样在读取的时候先被读出,所以FIFO存储器没有地址线。FIFO 有一个写端口和一个读端口外部无需使用者控制地址,使用方便。

        FIFO存储器主要是作为缓存,应用在同步时钟系统和异步时钟系统中,在很多的设计中都会使用,后面实例中如:多比特数据做跨时钟域的转换前后带宽不同步等都用到了FIFO。FIFO 根据读写时钟是否相同,分为SCFIFO(同步FIFO)和 DCFIFO(异步FIFO),SCFIFO 的读写为同一时钟,应用在同步时钟系统中; DCFIFO 的读写时钟不同,应用在异步时钟系统中。

1.SCFIFO IP 核配置

        下面来看一下同步fifo的配置:

基于xilinx的fifo IP核使用,fpga开发

 基于xilinx的fifo IP核使用,fpga开发① 框中我们输入IP核的命名, 后面实例化IP 的时候都是使用的该名字,这里所取的名字最好是和该 IP 核相关,因为本节我们主要讲解同步 fifo,给该 IP 核取名为scfifo_256x8,让人一看名字就知道我们调用的 scfifo 是 256 个深度 8 位宽的。
② 框是选中 FIFO 的接口类型, 这里我们按默认选择“Native” 即可。
③ 框是选中 FIFO 的类型, 以及使用什么资源来实现。 这里我们选择“Common Clock Block RAM”使用块 RAM 来实现同步 FIFO;其中 Common Clock 表示是同步 FIFO,Block RAM 表示的是块 RAM 资源。

基于xilinx的fifo IP核使用,fpga开发

   ①框中是对模式的选择,这里我们选择标准 FIFO(Standard FIF0) 即可。
        ② 框中可设置存储数据的位宽和深度, 其中“Write Width”是设置写数据位宽,这里我们设置为 8 位; “Write Depth” 是设置数据深度,这里我们设置为 256; “Read Width”是设置读数据位宽,这里我们设置为 8 位;“Read Depth”为读数据深度,该选项会根据我们设置的读写位宽及写数据深度自动设置。
        ③ 框是对复位信号创建的设置, 大家可根据自己的设计需求进行选择是否创建, 这里我们按默认勾选, 进行创建。设置完之后切换到“Status Flags”页面。

基于xilinx的fifo IP核使用,fpga开发

        ①框中可勾选生成 FIFO 几乎满(Almost Full Flag) ,几乎空(Almost Empty Flag) 输
出信号;也就是说若勾选了这两个信号,当 FIFO 存储数据快满或者快空的时候,该信号就有效。这里大家可根据自己的实际需求进行勾选,这里我们选择都不勾选。
        ② 左框中可勾选生成写确认标志信号,用于报告写操作成功。 若勾选后可以配置为高电平有效或低电平有效,这里我们选择不勾选。
       ② 右框中可勾选生成溢出标志信号; 该标志信号可以指示 FIFO 内存储数据是否溢出,可以指示上一次写操作何时失败。若勾选后可以配置为高电平有效或低电平有效,这里我们选择不勾选。
        ③左 框中可勾选生成指示输出总线上数据何时有效的有效标志信号。 若勾选后可以配置
为高电平有效或低电平有,这里我们选择不勾选。
        ③右框中可勾选生成下溢标志信号;该标志信号可以指示 FIFO 内存储数据空了,可以指示上一次的读请求何时失败。 若勾选后可以配置为高电平有效或低电平有效,这里我们选择不勾选。
这些选项可以根据自己的设计需求进行勾选,这里我们按默认都不勾选,直接切换到“Data Counts”页面。

        可勾选“Data Count”生成 FIFO 内剩余个数输出信号, 该输出信号可根据自己设计是否需要进行生成,默认是不生成,这里我们勾选进行生成该信号。设置完之后切换到“summary”页面。

基于xilinx的fifo IP核使用,fpga开发

 然后点击OK。

1.1 SCFIFO IP 核例化     

         生成IP之后就可以将我们的同步fifo IP例化到我们的新建的同步fifo工程进行一个tb文件的编写。 

module scfifo(
	input					sys_clk		,     //
	input					sys_rst_n	,     //

	input		[7:0]		din			,     //写数据
	input					wr_en		,     //写使能
	input					rd_en		,     //读使能

	output		[7:0]		dout		,     //读数据
	output					full		,     //fifo满标志信号,高有效
	output					empty		,     //fifo空标志信号,高有效
	output		[7:0]		data_count        //fifo存在的数据个数
    );


scfifo_256x8 scfifo_256x8_inst (
  .clk(sys_clk),                // input wire clk
  .srst(~sys_rst_n),              // input wire srst
  .din(din),                // input wire [7 : 0] din
  .wr_en(wr_en),            // input wire wr_en
  .rd_en(rd_en),            // input wire rd_en
  .dout(dout),              // output wire [7 : 0] dout
  .full(full),              // output wire full
  .empty(empty),            // output wire empty
  .data_count(data_count)  // output wire [7 : 0] data_count
);

endmodule

1.2 SCFIFO IP 核仿真

        下面是 Testbench 仿真测试文件,和 SCFIFO 的仿真一样,我们也需要给输入信号测试激励, pi_flag 每 4 个时钟周期且没有读请求时产生一个数据有效标志信号也作为 FIFO 的写请求信号,因为需要 pi_data 伴随着 pi_flag 一起产生,所以每当 pi_data 检测到 pi_flag 标志信号有效时就自加 1,其值从 0~255 循环变化,这样我们就可以在 pi_flag 标志信号有效时将 pi_data 写入到 FIFO 中。而 FIFO 的读请求信号 rd_en 当 FIFO 的满标志信号 full 有效时拉高,当 FIFO 的空标志信号 empty 有效时拉低。

        SCFIFO 可以同时进行读写操作,但本例我们没有让 SCFIFO 同时进行读写,当我们真正使用 SCFIFO IP 核时一定要保证 FIFO 不被写满也不被读空。

`timescale 1ns / 1ns

module tb_scfifo();

//reg define
reg       sys_clk   ;           //系统时钟
reg [7:0] pi_data   ;           //写数据
reg       wr_en     ;           //写使能
reg       rd_en     ;           //读使能
reg       sys_rst_n ;           //系统复位
reg [1:0] cnt_baud  ;           //计数器

//wire define
wire [7:0] po_data ;            //读数据
wire       empty ;              //读空标志信号
wire       full ;               //写满标志信号
wire [7:0] data_count ;         //数据计数器


initial begin
    sys_clk = 1'b1;
    sys_rst_n <= 1'b0;
    #201
    sys_rst_n <= 1'b1;
end

always #10 sys_clk <= ~sys_clk;

//数据读写之间产生一个间隔
always@(posedge sys_clk or negedge sys_rst_n) begin
	if(!sys_rst_n)
		cnt_baud <= 2'd0;
	else if(&cnt_baud == 2'd1)  //累计满清零
		cnt_baud <= 2'd0;
	else
		cnt_baud <= cnt_baud + 2'd1;
end

//写使能信号,也是fifo的写请求信号
always@(posedge sys_clk or negedge sys_rst_n) begin
	if(!sys_rst_n)
		wr_en <= 1'b0;
    //每四个周期且没有读使能没有产生一个读使能信号
	else if(cnt_baud == 2'd0 && rd_en == 1'b0)
		wr_en <= 1'b1;
	else
		wr_en <= 1'b0;
end

//写数据模块,向fifo写入256个数据
always@(posedge sys_clk or negedge sys_rst_n) begin
	if(!sys_rst_n)
		pi_data <= 8'd0;
	else if(pi_data == 8'd255 && wr_en == 1'd1)
		pi_data <= 8'd0;
	else if(wr_en == 1'b1)
		pi_data <= pi_data + 1'b1;
end

//fifo读请求信号
always@(posedge sys_clk or negedge sys_rst_n) begin
	if(!sys_rst_n)
		rd_en <= 1'b0;
    //当fifo中的数据被读空时,停止读取fifo中的数据
	else if(empty == 1'b1)
		rd_en <= 1'b0;
    //当fifo中的数据被写满时,停止往fifo中写入数据
	else if(full == 1'b1)
		rd_en <= 1'b1;
end


scfifo scfifo_inst(
	.sys_clk	(sys_clk),     
	.sys_rst_n	(sys_rst_n),     
			    
	.din		(pi_data)	,       //写数据
	.wr_en		(wr_en),            //写使能
	.rd_en		(rd_en),            //读使能
			    
	.dout		(po_data),           //读数据
	.full		(full),              //fifo满标志信号,高有效
	.empty		(empty),             //fifo空标志信号,高有效
	.data_count (data_count)         //fifo存在的数据个数
    );

endmodule

仿真结果:

基于xilinx的fifo IP核使用,fpga开发

 基于xilinx的fifo IP核使用,fpga开发

 基于xilinx的fifo IP核使用,fpga开发文章来源地址https://www.toymoban.com/news/detail-718818.html

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

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

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

相关文章

  • xilinx FPGA ROM IP核的使用(VHDL&ISE)

    目录 1.新建工程之后 建一个ip核文件: 2.编写顶层文件或者激励文件:(一定一定点击下面这个例化模板 去对ip核进行例化) 3.查看rtl图:   4编写测试文件: 5.仿真图: 工程下载链接:https://download.csdn.net/download/qq_43811597/86488775       根据所存数据的最大值来设置数据位宽

    2024年02月08日
    浏览(36)
  • 小梅哥Xilinx FPGA学习笔记19——IP 核使用之 ROM

    目录 一:章节导读 二:ROM IP 核配置 2.1 创建 ROM 初始化文件 2.3 ROM IP 核配置步骤 三: ROM核的仿真与调用 3.1 三角波的产生 3.2 仿真验证结果 3.3 正弦波的产生 3.4 仿真验证结果        ROM 是只读存储器( Read-Only Memory )的简称,是一种只能读出事先所存数据的固态半导体存

    2024年02月03日
    浏览(36)
  • 基于xilinx的axi-fifo的应用

    作为一个有一定工作经验(划水好多年)的FPGA工程师,很多模块都已经学习过或者使用过,但是如果让我重新实现,感觉又是一脸懵。因此,这是我发文档的原因。对于自己来说,这是一个总结归纳的过程,对读者,可能是一次解惑。 后期,将会逐渐分享DDR/ETH/SERDES/PCIe/SP

    2024年02月09日
    浏览(45)
  • xilinx FPGA 乘法器ip核(multipler)的使用(VHDL&Vivado)

    一、创建除法ip核  可以选择两个变量数相乘,也可以选择一个变量输入数据和一个常数相乘 可以选择mult(dsp资源)或者lut(fpga资源) 可以选择速度优先或者面积优先 可以自己选择输出位宽 还有时钟使能和复位功能  二、编写VHDL程序:声明和例化乘法器ip核 三、编写仿真程

    2024年02月11日
    浏览(51)
  • 【FPGA】Xilinx Cordic IP 内核使用记录(输入输出数据格式介绍)及实验仿真

    Rotate 实现的功能是坐标的旋转。 输入 X, Y, Phase 输出X’, Y’ 具体实现的功能对应的数学表达形式如下: 在做FFT 复乘旋转因子时也可以用这个IP核的Rotate功能来实现。旋转因子-旋转! Translation 实现的功能是求模,以及向量的夹角 输入 X, Y 输出X’ and Phase 具体实现的功能对应

    2024年02月07日
    浏览(38)
  • Xilinx FPGA开发环境vivado使用流程

    第一步:点击Add Sources按钮 第二步:选择add or create design sources按钮,即添加设计文件 第三步:选择create file 文件新建完成后: 此时可以定义I/O端口,我们选择自己在程序中编写。 第四步:在编辑器中编写verilog程序 XDC文件里主要是完成管脚的约束,时钟的约束,以及组的约

    2024年02月03日
    浏览(49)
  • 【FPGA】xilinx的开发软件vitis使用简介

           Xilinx的开发软件Vitis是一款全新的开发工具套件,它支持多种编程语言如C++、OpenCL、Python等,以及多种硬件平台,包括Xilinx的FPGA和ACAP(Adaptive Compute Acceleration Platform)。这使得它具有极高的灵活性,可以应对不同类型的开发需求,包括数据中心、云端和边缘智能应用

    2024年02月04日
    浏览(38)
  • FPGA中FIFO的应用(三)——Vivado FIFO IP核的调用

    ⭐️作者简介: 小瑞同学 ,一个努力精进的 FPGA 和通信学习者。 🍎个人主页:小瑞同学的博客主页 🌻个人信条:越努力,越幸运! ⏰日期:2023.12.6 🔍来源:自学经历 📖文章内容概述:简单介绍了 FIFO IP核 常用参数的配置,通过仿真分析了异步IP的 读写数据 过程。 连载

    2024年01月18日
    浏览(32)
  • 【FPGA IP系列】FIFO深度计算详解

    FIFO(First In First Out)是一种先进先出的存储结构,经常被用来在FPGA设计中进行数据缓存或者匹配传输速率。 FIFO的一个关键参数是其深度,也就是FIFO能够存储的数据条数,深度设计的合理,可以防止数据溢出,也可以节省FPGA资源的消耗。 影响FIFO深度计算的主要因素包括: FIF

    2024年02月06日
    浏览(44)
  • 【FPGA IP系列】FIFO的通俗理解

    FPGA厂商提供了丰富的IP核,基础性IP核都是可以直接免费调用的,比如FIFO、RAM等等。 本文主要介绍FIFO的一些基础知识,帮助大家能够理解FIFO的基础概念。 FIFO全称是First In First Out,即先进先出。 FIFO是一个数据缓存队列,主要特点就是数据顺序写入,再按照同样的顺序输出数

    2024年02月15日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包