FPGA零基础学习之Vivado-FIFO使用教程

原创 FPGA技术江湖 2023-06-08 08:11

大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。“煮酒言欢”进入IC技术圈,这里有近100个IC技术公众号。


大侠好,欢迎来到FPGA技术江湖。本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的“傻瓜式”讲解,让电子、信息、通信类专业学生、初入职场小白及打算进阶提升的职业开发者都可以有系统性学习的机会。

系统性的掌握技术开发以及相关要求,对个人就业以及职业发展都有着潜在的帮助,希望对大家有所帮助。本次带来Vivado系列,FIFO使用教程。话不多说,上货。


FIFO使用教程


作者:李西锐  校对:陆辉


FIFO的英文全称叫做First in First out,即先进先出。这也就决定了这个IP核的特殊性,先写进去的数据优先被读出,所以,FIFO是不需要地址信号线的,这也是它的一大特点,通常用来做数据的缓存,或者用来解决高速异步数据的交互,即解决了跨时钟域的问题。此外,FIFO还有一个特点,就是数据被读出之后就不存在了,不像RAM和ROM一样,数据被读出后还存在。所以我们如果想进行多次的读,那么就需要进行同样次数的写。

FIFO分为同步时钟和异步时钟,同步FIFO指的是读写使用同一个时钟,在时钟沿信号来的时候进行读写。异步FIFO是指读写在不同时钟下进行,这样我们可以实现读写不同速度。

那么接下来,我们就来实现一下异步FIFO的读写过程。

上图为选择异步FIFO之后的图示,在这个图示中,我们给大家解释一下每个信号的含义。

FIFO_WRITE:

full:FIFO的满信号,当FIFO的存储空间写满了之后,此信号拉高,否则为低。此信号为FIFO的输出信号。

din[7:0]:FIFO的数据输入,写进FIFO的数据通过此信号线进入FIFO。

wr_en:FIFO的写使能,当我们要往FIFO里面写入数据时,拉高此信号。此信号为FIFO的输入。

FIFO_READ:

empty:FIFO的空信号,当FIFO的存储空间空了之后,此信号拉高,否则为低。此信号为FIFO的输出信号。

dout:FIFO的数据输出,读出FIFO的数据通过此信号线输出

rd_en:FIFO的读使能,当我们要从FIFO里面读出数据时,拉高此信号。此信号为FIFO的输出。

rst:FIFO复位,默认高电平有效。

wr_clk:写时钟

rd_clk: 读时钟

wr_rst_busy:写复位忙信号

rd_rst_busy:读复位忙信号


在了解了FIFO的端口之后,我们来实现一个应用实例。比如,我们以10MHz的速度往FIFO里面写数据,写满之后,在20MHz的时钟下将数据读出,一直读空。当然,在显示应用中,FIFO的读写是可以同步进行的。

首先,我们先来新建工程。

新建好之后,我们先调用一下IP核:

在IP核管理器界面,搜索FIFO,然后选中图示所选项双击打开。

在FIFO类型选项,我们选择异步FIFO。刚打开默认的选项为同步FIFO。

在数据端口配置界面,我们将数据位宽改为8bit,深度使用1024。

复位端口在这就不再使用了,所以勾选位置取消掉。

在此界面出现了almost full flag和almost empty flag。这两个信号是几乎满或空的标志信号,在此实验中,我们不使用。

Data count是FIFO数据用量计数器,代表了此时FIFO的内部存储被使用的情况。假设我们写进去了10个数,那么两个计数器都为10。

此界面为IP核的信息,在此界面可以看出,我们的读写深度发生了变化,我们在前面设置的深度为1024,但是在此处显示的却是1023。原因是因为FIFO结构的特殊性,并不是我们设置的有问题。所以,在我们这个异步FIFO中,深度为1023。

点击OK直接生成。在点击Generate。

此外,我们还需要两个不同时钟,在这里我们使用锁相环生成。

在管理界面搜索clock。配置过程我们在此前已经讲过,就不在过多叙述。

接下来我们写一下fifo的写控制器,代码如下:

1   module fifo_wr(2     3     input   wire             clk,4     input   wire             rst_n,5     input   wire             empty,6     input   wire             full,7     output   reg             fifo_wr_en,8     output   reg     [7:0]      fifo_data_in9   );1011    reg         state;12    13    always @ (posedge clk, negedge rst_n)14    begin15      if(rst_n == 1'b0)16        begin17          fifo_wr_en <= 1'b0;18          fifo_data_in <= 8'd0;19          state <= 1'b0;20        end21      else22        case(state)23          1'b0  :  begin24                  if(empty)25                    state <= 1'b1;26                  else27                    state <= 1'b0;28                end29          1'b1  :  begin30                  if(full)31                    begin32                      fifo_wr_en <= 1'b0;33                      fifo_data_in <= 8'd0;34                      state <= 1'b0;35                    end36                  else37                    begin38                      fifo_wr_en <= 1'b1;39                      fifo_data_in <= fifo_data_in + 1'b1;40                      state <= 1'b1;41                    end42                end43        endcase44    end4546  endmodule


因为我们的实验是读空了才写,所以我们用状态机来做,先判断FIFO是否为空。控制器代码如下:

1   module fifo_rd(2     3     input   wire               clk,4     input   wire               rst_n,5     input   wire               empty,6     input   wire               full,7     output   reg               fifo_rd_en8   );9 10    reg         state;11    12    always @ (posedge clk, negedge rst_n)13    begin14      if(rst_n == 1'b0)15        begin16          fifo_rd_en <= 1'b0;17          state <= 1'b0;18        end19      else20        case(state)21          1'b0  :  begin22                  if(full)23                    state <= 1'b1;24                  else25                    state <= 1'b0;26                end27          1'b1  :  begin28                  if(empty)29                    begin30                      fifo_rd_en <= 1'b0;31                      state <= 1'b0;32                    end33                  else34                    begin35                      fifo_rd_en <= 1'b1;36                      state <= 1'b1;37                    end38                end39        endcase40    end4142  endmodule


顶层代码如下:

1   module fifo(2     3     input   wire               clk,4     input   wire               rst_n,5     output   wire       [7:0]      q6   );7     8     wire           fifo_wr_clk;9     wire           fifo_rd_clk;10    wire           locked;11    wire           empty;12    wire           full;13    wire           fifo_wr_en;14    wire     [7:0]    fifo_data_in;15    wire           fifo_rd_en;16    17    clk_wiz_0 clk_wiz_0_inst18     (19    // Clock out ports20    .clk_out1(fifo_wr_clk),     // output clk_out121    .clk_out2(fifo_rd_clk),     // output clk_out222    // Status and control signals23    .reset(~rst_n), // input reset24    .locked(locked),       // output locked25     // Clock in ports26    .clk_in1(clk));      // input clk_in127    28    fifo_wr fifo_wr_inst(29    30    .clk            (fifo_wr_clk),31    .rst_n            (locked  ),32    .empty            (empty    ),33    .full            (full    ),34    .fifo_wr_en          (fifo_wr_en  ),35    .fifo_data_in        (fifo_data_in)36  );3738    fifo_generator_0 fifo_generator_0_inst (39      .wr_clk(fifo_wr_clk),  // input wire wr_clk40      .rd_clk(fifo_rd_clk),  // input wire rd_clk41      .din(fifo_data_in),        // input wire [7 : 0] din42      .wr_en(fifo_wr_en),    // input wire wr_en43      .rd_en(fifo_rd_en),    // input wire rd_en44      .dout(q),      // output wire [7 : 0] dout45      .full(full),      // output wire full46      .empty(empty)    // output wire empty47    );4849    fifo_rd fifo_rd_inst(50    51    .clk        (fifo_rd_clk),52    .rst_n        (locked    ),53    .empty        (empty    ),54    .full        (full    ),55    .fifo_rd_en      (fifo_rd_en)56  );57    58  endmodule


代码写完之后,我们写个仿真验证一下波形,代码如下:
1   `timescale 1ns / 1ps2 3   module fifo_tb;4 5     reg                clk;6     reg                rst_n;7     wire       [7:0]      q;8     9     initial begin10      clk = 0;11      rst_n = 0;12      #105;13      rst_n = 1;14      #10000;15      $stop;16    end17    18    always #10 clk = ~clk;19    20    fifo fifo_inst(21    22    .clk      (clk),23    .rst_n      (rst_n),24    .q        (q)25  );2627  endmodule


打开波形之后,我们将读写控制模块的信号全部添加到波形窗口:

添加好之后,点击restart和run-all

由于波形默认运行10us,我们观察不到全部波形,所以,在此我们继续点击run-all,然后点击break,让仿真停止。

然后,我们观察波形:

在波形里面可以清楚的看到我们的fifo_data_in和q的波形,一长一短。这是因为读的速度快,所以波形维持的时间短。写数据的时间长度是读数据时间长度的两倍。

然后放大波形观察其他信号:

在黄色光标位置,可以看到满信号拉高了,然后写使能就拉低了,状态开始进入到读。在读使能拉高之后,输出q就有了数据,但是我们的empty信号维持了一段时间才拉低,这是因为fifo的特殊结构导致的,在此我们就不再过多讨论。

结论:异步FIFO控制正确,仿真波形输入和输出信号正常。



- End -


福利】:QQ交流群173560979,进群备注名字+学校/企业。
淘宝店铺:https://shop588964188.taobao.com
论坛网址:www.sxznfpga.com
叁芯智能FPGA课程

FPGA技术江湖广发江湖帖

无广告纯净模式,给技术交流一片净土,从初学小白到行业精英业界大佬等,从军工领域到民用企业等,从通信、图像处理到人工智能等各个方向应有尽有,QQ微信双选,FPGA技术江湖打造最纯净最专业的技术交流学习平台。


FPGA技术江湖微信交流群

加群主微信,备注姓名+公司/学校+岗位/专业进群


FPGA技术江湖QQ交流群

备注姓名+公司/学校+岗位/专业进群

FPGA技术江湖 任何技术的学习就好比一个江湖,对于每一位侠客都需要不断的历练,从初入江湖的小白到归隐山林的隐世高人,需要不断的自我感悟自己修炼,让我们一起仗剑闯FPGA乃至更大的江湖。
评论
  • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球无人机锂电池产值达到2457百万美元,2024-2030年期间年复合增长率CAGR为9.6%。 无人机锂电池是无人机动力系统中存储并释放能量的部分。无人机使用的动力电池,大多数是锂聚合物电池,相较其他电池,锂聚合物电池具有较高的能量密度,较长寿命,同时也具有良好的放电特性和安全性。 全球无人机锂电池核心厂商有宁德新能源科技、欣旺达、鹏辉能源、深圳格瑞普和EaglePicher等,前五大厂商占有全球
    GIRtina 2025-01-07 11:02 68浏览
  • 这篇内容主要讨论三个基本问题,硅电容是什么,为什么要使用硅电容,如何正确使用硅电容?1.  硅电容是什么首先我们需要了解电容是什么?物理学上电容的概念指的是给定电位差下自由电荷的储藏量,记为C,单位是F,指的是容纳电荷的能力,C=εS/d=ε0εrS/4πkd(真空)=Q/U。百度百科上电容器的概念指的是两个相互靠近的导体,中间夹一层不导电的绝缘介质。通过观察电容本身的定义公式中可以看到,在各个变量中比较能够改变的就是εr,S和d,也就是介质的介电常数,金属板有效相对面积以及距离。当前
    知白 2025-01-06 12:04 170浏览
  • By Toradex 秦海1). 简介嵌入式平台设备基于Yocto Linux 在开发后期量产前期,为了安全以及提高启动速度等考虑,希望将 ARM 处理器平台的 Debug Console 输出关闭,本文就基于 NXP i.MX8MP ARM 处理器平台来演示相关流程。 本文所示例的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台。  2. 准备a). Verdin i.MX8MP ARM核心版配合Dahlia载板并
    hai.qin_651820742 2025-01-07 14:52 44浏览
  • 大模型的赋能是指利用大型机器学习模型(如深度学习模型)来增强或改进各种应用和服务。这种技术在许多领域都显示出了巨大的潜力,包括但不限于以下几个方面: 1. 企业服务:大模型可以用于构建智能客服系统、知识库问答系统等,提升企业的服务质量和运营效率。 2. 教育服务:在教育领域,大模型被应用于个性化学习、智能辅导、作业批改等,帮助教师减轻工作负担,提高教学质量。 3. 工业智能化:大模型有助于解决工业领域的复杂性和不确定性问题,尽管在认知能力方面尚未完全具备专家级的复杂决策能力。 4. 消费
    丙丁先生 2025-01-07 09:25 80浏览
  • 本文介绍Linux系统更换开机logo方法教程,通用RK3566、RK3568、RK3588、RK3576等开发板,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。制作图片开机logo图片制作注意事项(1)图片必须为bmp格式;(2)图片大小不能大于4MB;(3)BMP位深最大是32,建议设置为8;(4)图片名称为logo.bmp和logo_kernel.bmp;开机
    Industio_触觉智能 2025-01-06 10:43 87浏览
  • 村田是目前全球量产硅电容的领先企业,其在2016年收购了法国IPDiA头部硅电容器公司,并于2023年6月宣布投资约100亿日元将硅电容产能提升两倍。以下内容主要来自村田官网信息整理,村田高密度硅电容器采用半导体MOS工艺开发,并使用3D结构来大幅增加电极表面,因此在给定的占位面积内增加了静电容量。村田的硅技术以嵌入非结晶基板的单片结构为基础(单层MIM和多层MIM—MIM是指金属 / 绝缘体/ 金属) 村田硅电容采用先进3D拓扑结构在100um内,使开发的有效静电容量面积相当于80个
    知白 2025-01-07 15:02 75浏览
  • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
    华普微HOPERF 2025-01-06 17:23 141浏览
  • 根据Global Info Research项目团队最新调研,预计2030年全球封闭式电机产值达到1425百万美元,2024-2030年期间年复合增长率CAGR为3.4%。 封闭式电机是一种电动机,其外壳设计为密闭结构,通常用于要求较高的防护等级的应用场合。封闭式电机可以有效防止外部灰尘、水分和其他污染物进入内部,从而保护电机的内部组件,延长其使用寿命。 环洋市场咨询机构出版的调研分析报告【全球封闭式电机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球封闭式电机总体规
    GIRtina 2025-01-06 11:10 104浏览
  • 每日可见的315MHz和433MHz遥控模块,你能分清楚吗?众所周知,一套遥控设备主要由发射部分和接收部分组成,发射器可以将控制者的控制按键经过编码,调制到射频信号上面,然后经天线发射出无线信号。而接收器是将天线接收到的无线信号进行解码,从而得到与控制按键相对应的信号,然后再去控制相应的设备工作。当前,常见的遥控设备主要分为红外遥控与无线电遥控两大类,其主要区别为所采用的载波频率及其应用场景不一致。红外遥控设备所采用的射频信号频率一般为38kHz,通常应用在电视、投影仪等设备中;而无线电遥控设备
    华普微HOPERF 2025-01-06 15:29 125浏览
  • 彼得·德鲁克被誉为“现代管理学之父”,他的管理思想影响了无数企业和管理者。然而,关于他的书籍分类,一种流行的说法令人感到困惑:德鲁克一生写了39本书,其中15本是关于管理的,而其中“专门写工商企业或为企业管理者写的”只有两本——《为成果而管理》和《创新与企业家精神》。这样的表述广为流传,但深入探讨后却发现并不完全准确。让我们一起重新审视这一说法,解析其中的矛盾与根源,进而重新认识德鲁克的管理思想及其著作的真正价值。从《创新与企业家精神》看德鲁克的视角《创新与企业家精神》通常被认为是一本专为企业管
    优思学院 2025-01-06 12:03 116浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦