Xilinx FIFO IP核的例化和使用(含代码实例)

2023-11-15

        使用FPGA进行数据传输处理时,数据缓存是很关键的部分。FIFO作为一种简单的缓存方案,在FPGA开发中具有广泛的应用。

        Xilinx为我们提供的FIFO IP核是一种先进先出(FIFO)内存队列,例化后,开发人员可自定义宽度、深度、状态标志、内存类型和写入/读取端口纵横比。FIFO利用顺序存储和检索的工作方式,可以帮助开发人员实现少量数据缓存、跨时钟处理、位宽转换等功能。

本文分为三部分

  1. IP核例化
  2. IP核调用
  3. IP核端口理解和时序关系
  4. IP核控制(提供实例)

一、IP核例化

step1: 点击vivado左侧列表中的 “IP catalog” 进入IP目录,点击搜索框输入“fifo”,选择“FIFO Generator”。

 step 2:  首先对fifo命名,可根据深度和位宽作为命名方式。在“Basic”界面中选择例化的fifo类型,若FIFO外接AXI接口,可在接口选择时选择AXI相关,由于作者无相关需求,且为了使用的普遍性,本文故只介绍常用的Native功能。

在“ Fifo Implementation” 中选择FIFO类型,若FIFO使用同频时钟,则选择common相关;若使用不同时钟,则选择independent相关。

其中“Block RAM”称为块RAM,“Distributed RAM”为分布式RAM,其区别在于Block ram由一定数量固定大小的存储块构成的,使用BRAM资源不占用额外的逻辑资源,并且速度快。分布式RAM利用查找表LUT作为存储器, 既可以实现芯片内部存储,又能提高资源利用率。实现大规模的存储器会占用大量的LUT,可用来实现逻辑的查找表就会减少。故在需要小规模存储器时,使用这种分布式RAM。根据实验跨时钟的需要, 本实验选择"Independent Clocks Block RAM ".

 Step 3:  "Native ports" 界面配置, 可在此界面进行读模式选择, 当选择 "Standard FIFO"标准读取操作在读请求的下一个时钟周期输出数据。若选择"First Word Fall Through" ,则在读请求的本时钟周期输出数据。

" write width" 表示写入数据位宽 ;  "write  Depth" 表示写入数据深度, 即FIFO中能写入多少个对应位宽的数据; "Read Width" 表示读数据位宽, " Read Depth" 根据前三个参数计算得出,无需自行填入 。其他参数选择默认配置即可。

  Step 4:   若无其他开发要求, "Status Flags"  "Data Counts" 选择默认配置即可,点击"OK", 之后一直保持默认操作点击"OK", 直到弹出"Generate ouput product" , 继续点击"OK" 即可完成FIFO IP核的例化操作。

 二、IP核调用

        找到到工程路径下,找到IP的保存路径, 打开 .veo文件, 将文档中提供的例化范例直接拷贝到工程中即可完成 IP核的调用过程。

三、IP核端口理解

        下图是官方数据手册中提供的Native型接口的FIFO端口连接图,图中上班部分是基础例化后形成的端口,下半部分为可选功能,本文只做基数部分的叙述,如有其他功能需求,请阅读数据手册继续理解,各端口解释如下表。

rst input 复位信号:高有效
写端口   wr_clk input 写入时钟:写入域上的所有信号都与该时钟同步
din[n:0] input 写入数据
wr_en input 写使能:当FIFO未满且读数据有效时信号拉高
    full output FIFO写满标志:当其拉高时,写使能不再有效
读端口   rd_clk input 读时钟: 读出域上的所有信号都与该时钟同步
dout[m:0] output 读出数据
  rd_en input 读使能:当FIFO非空且有数据读出需求时拉高
  empty output FIFO读空标志:当其拉高时,读使能不再有效
valid output 可选信号,标志该IP核入/输出数据有效
ready output 可选信号,当FIFO满或空时拉低

        FIFO在使用时,据读写逻辑输出的wr_en和rd_en信号来确定通道上的有效数据或控制信息何时可用。同时可根据需要,在配置IP核时选择性使用握手信号“valid”和“ready”,Valid_in/out拉高时表示有效数据在该时钟周期内可取或可存;Ready_in/out信号表示何时FIFO可以接收或发送数据。

四、IP核使用

      Independent Clocks Block RAM IP核的简单使用代码和仿真运行结果如下, 需要可自取。文章包含了以下三个文件:

fifo_test_top.v:工程的top,用于例化IP,生成读逻辑;

fifo_data_in.v:用于构造仿真输入数据,生成写逻辑;

fifo_test_tb.v:仿真文件,用于生成时钟和复位。

module fifo_test_top(

input   wire                   clk_a ,   //74.25M
input   wire                   clk_b ,   //148.5M
input   wire                   rst   ,
output  wire   [15:0]          o_data,
output  reg                    o_vld
    );
    
wire  [31:0]   fifo_wdata;
wire           fifo_wvld ;
wire           full      ;
wire           empty     ;  
wire           wr_en     ;
wire           rd_en     ;
wire  [15:0]   fifo_rdata;

fifo_data_in u_fifo_data_in(
.clk(clk_a),
.rst(rst),
.o_data(fifo_wdata),
.o_data_vld(fifo_wvld)
);

assign wr_en = fifo_wvld & (~full) ;
assign rd_en = (~empty) ;

always @(posedge clk_b) begin
    if(rst)
        o_vld <= 1'b0;
    else
        o_vld <= rd_en;
end

assign o_data = fifo_rdata;

fifo_32_4096_16 u_fifo_32_4096_16 (
  .rst(rst),                  // input wire rst
  .wr_clk(clk_a),             // input wire wr_clk
  .rd_clk(clk_b),             // input wire rd_clk
  .din(fifo_wdata),           // input wire [31 : 0] din
  .wr_en(wr_en),              // input wire wr_en
  .rd_en(rd_en),              // input wire rd_en
  .dout(fifo_rdata),          // output wire [15 : 0] dout
  .full(full),                // output wire full
  .empty(empty)               // output wire empty
 // .wr_rst_busy(wr_rst_busy),  // output wire wr_rst_busy
//  .rd_rst_busy(rd_rst_busy)  // output wire rd_rst_busy
);
    

endmodule
module fifo_data_in(

input  wire           clk,
input  wire           rst,
output reg   [31:0]   o_data,
output reg            o_data_vld
    );

reg  [15:0]          data_cnt_l;
wire [15:0]          data_cnt_u;
parameter   VLD_CNT = 16'd1125;

always @(posedge clk) begin
    if(rst)
        data_cnt_l <= 16'd0;
    else if(data_cnt_l == 1125)
        data_cnt_l <= 16'd0;
    else 
        data_cnt_l <= data_cnt_l + 11'd1;
end
assign data_cnt_u = VLD_CNT - data_cnt_l ;

always @(posedge clk) begin
    if(rst)
        o_data  <= 32'd0;
    else if ((data_cnt_l < 1080) && (data_cnt_l >= 0))
        o_data <= {data_cnt_u,data_cnt_l};
    else
        o_data <= 32'd0;
end

always @(posedge clk) begin
    if(rst)
        o_data_vld  <= 32'd0;
    else if ((data_cnt_l < 1080) && (data_cnt_l >= 0))
        o_data_vld <= 1'b1;
    else
        o_data_vld <= 32'd0;
end

endmodule
module fifo_test_tb();

reg                clk_a;   //74.25M
reg                clk_b;   //148.5M
reg                rst;
wire [15:0]       o_data;
wire              o_vld;

parameter   CLK_74_25 = 6.734;
parameter   CLK_148_5 = 3.367;

initial begin   //74.25M
    clk_a = 0;
    forever begin
    # CLK_74_25 clk_a = 0;
    # CLK_74_25 clk_a = 1;
    end
end

initial begin   //148.5
    clk_b = 0;
    forever begin
    # CLK_148_5 clk_b = 0;
    # CLK_148_5 clk_b = 1;
    end
end

initial begin
rst = 1;
#1000 rst = 0;
end

fifo_test_top fifo_test_top_tb(
.clk_a (clk_a),   //74.25M
.clk_b (clk_b),   //148.5M
.rst   (rst) ,
.o_data(o_data),
.o_vld (o_vld)
    );
endmodule

         若拷贝了以上程序仍然无法调试成功, 可下载"保姆" 调试包, 包含了以上提到的三个.v文件和例化后的FIFO IP文件夹,以及 FIFO的官方使用手册--pg057-fifo-generator.pdf。

https://download.csdn.net/download/qq_37203760/86762497

说明: "保姆" 调试包中的程序与文章中完全一样,所以还是希望大家能参照文章自主调试,加油!

"保姆" 调试包使用方法:

1. 点击“Add Sources”-"Add or create design sources"将fifo_data_in.v、fifo_test_top.v和fifo_32_4096_16.xci导入已建好的工程中。
2. 点击“Add Sources”-"Add or create simulation sources" 将fifo_test_tb.v导入工程中。
3. 运行simulation

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Xilinx FIFO IP核的例化和使用(含代码实例) 的相关文章

  • 【Xilinx Vivado时序分析/约束系列6】FPGA开发时序分析/约束-IO时序输入延时

    目录 源同步FPGA输入时序分析的模型 input delay约束 极限input delay 往期系列博客 源同步FPGA输入时序分析的模型 以下为源同步FPGA输入时序分析的模型的示意图 在之前的文章中介绍过 在此介绍一下各个时钟延时的
  • 平头哥(T-Head )开源RISCV处理器OpenC906 RTL仿真

    在过去的几年里 阿里集团平头哥陆续推出了几款RISCV处理器 有些处理器已经在产业界得到了应用 比如在某志的D1处理器中 就嵌入了平头哥的玄铁C906内核为 芯 RISCV虽然是一个开放标准 并且网络上也不乏一些开源核的RTL实现 但是商用
  • MIPI D-PHY介绍(二) FPGA

    MIPI D PHY介绍 二 FPGA 随着移动设备的广泛普及 MIPI D PHY作为其最主要的物理层标准之一 被越来越多地使用在各种嵌入式系统中 本文将详细介绍MIPI D PHY的工作原理和在FPGA设计中的实现方法 MIPI D P
  • 【FPGA入门】第八篇、FPGA驱动VGA实现动态图像移动

    目录 第一部分 实现效果 第二部分 动态VGA显示的原理 1 将动态显示的区域提前进行赋值 2 图像块的移动是每张图片叠加后的效果 3 如何实现图像块位置的改变 第三部分 系统结构和驱动波形 1 系统的Top down结构 2 图像块移动的
  • DEBUG:Generate Bitstream失败

    问题 约束失败 解决 确保IO初始化引脚正确 和选择合适的电平
  • FPGA零基础学习之Vivado-UART驱动教程

    FPGA零基础学习之Vivado UART驱动教程 本系列将带来FPGA的系统性学习 从最基本的数字电路基础开始 最详细操作步骤 最直白的言语描述 手把手的 傻瓜式 讲解 让电子 信息 通信类专业学生 初入职场小白及打算进阶提升的职业开发者
  • 【FPGA】:频率测量

    转载 1 FPGA频率测量的三种方法 直接测量法 间接测量法 等精度测量法
  • 实验1-FPGA编程入门

    文章目录 一 认识全加器 二 输入原理图实现1位加法器 一 半加器原理图输入 二 全加器原理图输入 三 Verilog语言实现全加器 四 总结 五 资料参考 一 认识全加器 一 半加器 1 逻辑分析 如下图所示 半加器只有两个输入和两个输出
  • 【Xilinx DDR3 MIG】Xilinx FPGA DDR3读写实验相关用户接口引脚解释

    目录 DDR3读写实验 实验框图 时钟模块 DDR3读写及LED指示模块 MIG IP核 用户接口解释
  • 握手2倍速率进,一倍速率出[verilog]

    module two to one parameter WORD LEN 33 input clk input arst input 2 WORD LEN 1 0 i din input i din valid output o din r
  • Verilog之assign

    Verilog中的关键词assign主要用于如下两个地方 数据流建模 用于数据流建模的显示连续赋值语句语法格式如下
  • TestBench编写_激励产生

    TestBench编写 激励产生 TestBench编写 激励产生 基本背景 读取函数介绍 a fopen函数使用 b fread函数使用 c fclose函数使用 实际使用 TestBench编写 激励产生 基本背景 最近遇到项目中需要对
  • Verilog HDL——Modelsim仿真

    常用testbench语法 finish 和 stop finish任务用于终止仿真并跳出仿真器 stop任务则用于中止仿真 timescale time unit time precision time unit指定计时和延时的测量单位
  • FPG—VGA显示器字符显示(附代码)

    目录 1 实操 1 1 字符取模 1 2 顶层模块 1 3 图像数据生成模块 1 3 1 模块框图 1 3 2 波形图绘制 1 3 3 代码编写 1 3 4 仿真验证 2 总结 本例程大部分与VGA显示驱动内容相同 只是显示部分改变了 故此
  • 蓝桥杯真题:迷宫

    目录 题目描述 运行限制 dfs bfs 结果 题目描述 本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 下图给出了一个迷宫的平面图 其中标记为 11 的为障碍 标记为 00 的为可以通行的地方 010000 000
  • 使用七牛云进行文件上传

    目录 一 七牛云入门测试 1 注册七牛云账号 完成后选择对象存储 2 在里面创建空间 一个空间相当于一个文件夹 就是将对象上传到的地方 3 查看个人秘钥 注册完成账号后 会有一个秘钥 上传文件的时候进行授权和认证 4 文件上传测试 二 封装
  • 【FPGA】通俗理解从VGA显示到HDMI显示

    注 大部分参考内容来自 征途Pro FPGA Verilog开发实战指南 基于Altera EP4CE10 2021 7 10 上 贴个下载地址 野火FPGA Altera EP4CE10征途开发板 核心板 野火产品资料下载中心 文档 hd
  • 【电子技术】什么是LFSR?

    目录 0 前言 1 数学基础 1 1 逻辑异或 1 2 模2乘法 和 模2除法 2 线性反馈移位寄存器LFSR 3 抽头和特征多项式 4 阶线性反馈移位寄存器实例 0 前言 线性反馈移位寄存器 Linear Feedback Shift R
  • [Verilog] Verilog 基本格式和语法

    主页 元存储博客 全文 3000 字 文章目录 1 声明格式 1 1 模块声明 1 2 输入输出声明 1 3 内部信号声明 1 4 内部逻辑声明
  • TRICONEX MA2211-100 芯片上相互连接

    TRICONEX MA2211 100 芯片上相互连接 TRICONEX MA2211 100 所有相同的组件 io的电源 处理器 和内存将需要 但是 你可以看到所有这些带存储器和处理器的OO板 针不能嵌入到一个小的单片机上 现在是 普拉克

随机推荐

  • Python爬虫系列之爬取猫眼电影,没办法出门就补一下往期电影吧

    前言 今天给大家介绍利用Python爬取并简单分析猫眼电影影评 让我们愉快地开始吧 开发工具 Python版本 3 6 4 相关模块 requests模块 pyecharts模块 jieba模块 scipy模块 wordcloud模块 以及
  • 运行Pangolin时提示以下错误: terminate called after throwing an instance of 'std::runtime_error'

    在运行Pangolin时提示以下错误 terminate called after throwing an instance of std runtime error what Pangolin X11 Unable to retrieve
  • 增强现实代码+注释解析(三)

    1 书名 Mastering OpenCV with Practical Computer Vision Projects 2 章节 Chapter 3 Marker less Augmented Reality 3 书中源代码的最新更新可
  • CustomEditor+ScripableObject 简单用法

    写在前面 看了一整天 算是明白了点 记录一下 要是不知道怎么入门可以看一下 希望能帮到您 Ps 本文一律采用c 进行讲解 用途 自定义inspector 监视器 面板 举个例子 你在ScriptableObejct里声明了一个string类
  • Linux安装——VMware + RedHat

    文章目录 1 安装VMware虚拟机 2 安装RedHat红帽系统 2 1 虚拟机设置 2 2 开启虚拟机 3 cannot updata read only repo 3 1 删除自带yum包 3 2 下载centos版本yum包替换 3
  • Mysql 5.7 / 5.8 性能测试

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 转载于 https my oschina net u 582827 blog 1802981
  • Python训练了个模型,怎么交给Java用呢?

    最近碰到几个人问 如何实现 java 调用他们写好的 Python 应用 模型 这里我就把几种常见的办法做下汇总整理 喜欢本文记得收藏 关注 点赞 注 文末提供技术交流群 推荐文章 李宏毅 机器学习 国语课程 2022 来了 有人把吴恩达老
  • 【应用层】DNS协议

    一 概述 本篇文章基于 计算机网络 和 计算机网络 自顶向下方法 为笔者的读书笔记 主要内容如下所示 DNS提供的服务 互联网的域名结构 DNS服务器的分布 DNS的工作原理 DNS记录 往DNS插入记录 二 DNS提供的服务 域名系统 D
  • (二十九)admin-boot项目之自定义全局拦截404异常

    二十九 自定义全局拦截404异常 项目地址 https gitee com springzb admin boot 如果觉得不错 给个 star 简介 这是一个基础的企业级基础后端脚手架项目 主要由springboot为基础搭建 后期整合一
  • 深入理解Linux内核(第三版)- 进程切换

    为了控制进程的执行 内核必须有能力挂起正在CPU上运行的进程 并恢复以前挂起的某个进程的执行 这种行为被称为进程切换 process switch 任务切换 task switch 或上下文切换 context switch 硬件上下文 尽
  • 5G信令流程详解-45G互操作流程详解

    5G信令流程详解 45G互操作流程详解
  • java打开本机应用程序_Java启动本机应用程序EXE的三种方式

    Java代码 第一种方式 利用cmd方式 执行cmd命令 param command throws IOException public static String executeCmd String command throws IOEx
  • 常见报错01

    1 apt get no process found 如果你在使用apt get命令时出现 apt get no process found 错误消息 可能是以下原因之一 1 没有正在运行的apt get进程 这个错误通常会在你尝试终止一个
  • Python中的for循环和range()函数用法详解

    引言 在Python编程中 for循环和range 函数是非常常用的语法结构 用于遍历序列和重复执行一段代码块 本文将详细介绍Python中for循环和range 函数的用法 包括语法 参数 应用场景 并结合实际案例进行分析 一 for循环
  • maven 打包 releases 和 snapshots 版本

    releases 线上版本 生产环境使用的 snapshots 快照版本 开发过程中使用的 maven 打包代码到私服根据version 后面是否带有 SNAPSHOTS 来区分是打包线上版本还是快照版本 如果带有 SNAPSHOTS 打包
  • webpack + TypeScript搭建工程

    工程搭建 环境 浏览器 模块化 webpack 构建工具 更据人口文件找寻依赖关系 打包 安装 npm i webpack webpack cli D 安装插件 npm i D html webpack plugin clean webpa
  • Ubuntu18.04安装搜狗拼音输入法后无法输入中文

    系统环境 Ubuntu18 04 6 LTS 安装命令 sudo dpkg i sogoupinyin 4 2 1 145 amd64 deb 安装后显示输入法输入框 并不能输入中文 只能输入英文 解决办法 sudo apt get ins
  • 10个好用又有趣的工具类网站,赶快收藏吧

    YwTools 工具集合 www ywcoding com YwTools是一个提供许多有趣小工具的网站 这些工具能够为用户提供方便 快捷的支持 它提供许多实用性工具 比如生产力工具 免注册流程图 文本对比去重 编程类工具比如文本解码编码
  • 使用Appuploader工具将IPA上传到App Store的最新流程和步骤

    苹果官方提供的工具xcode上架ipa非常复杂麻烦 用appuploader 可以在 mac 和windows 上制作管理 证书 无需钥匙串工具 条件 1 以Windows为例 创建app打包ios需要的证书和描述文件 2 准备好一个苹果开
  • Xilinx FIFO IP核的例化和使用(含代码实例)

    使用FPGA进行数据传输处理时 数据缓存是很关键的部分 FIFO作为一种简单的缓存方案 在FPGA开发中具有广泛的应用 Xilinx为我们提供的FIFO IP核是一种先进先出 FIFO 内存队列 例化后 开发人员可自定义宽度 深度 状态标志