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乃至更大的江湖。
评论
  •   电磁数据管理系统深度解析   北京华盛恒辉电磁数据管理系统作为专业的数据处理平台,旨在提升电磁数据的处理效率、安全性与可靠性。以下从功能架构、核心特性、应用场景及技术实现展开分析:   应用案例   目前,已有多个电磁数据管理系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润电磁数据管理系统。这些成功案例为电磁数据管理系统的推广和应用提供了有力支持。   一、核心功能模块   数据采集与接入:实时接收天线、频谱仪等设备数据,兼容多协议接口,确保数据采集的全面性与实时性
    华盛恒辉l58ll334744 2025-05-13 10:59 300浏览
  • 在全球能源结构转型加速推进与政策驱动的双重作用下,油气输送、智慧水务及化学化工等流体计量场景正面临效率革命与智能化升级的迫切需求。传统机械式流量计虽在工业初期有效支撑了基础计量需求,但其机械磨损、精度衰减与运维困难等固有缺陷已难以适应现代工业对精准化、智能化与可持续发展的多维诉求。在此背景下,超声波流量计则凭借着高精度探测、可实时监测、无侵入式安装、无阻流部件、易于维护与绿色环保等优势实现了突破性发展,成为当代高精度流体计量体系中不可或缺的重要一环。该技术不仅是撬动能源利用效率提升、支撑智慧管网
    华普微HOPERF 2025-05-14 11:49 54浏览
  •   电磁数据展示系统平台解析   北京华盛恒辉电磁数据展示系统平台是实现电磁数据高效展示、分析与管理的综合性软件体系,以下从核心功能、技术特性、应用场景及发展趋势展开解读:   应用案例   目前,已有多个电磁数据展示系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润电磁数据展示系统。这些成功案例为电磁数据展示系统的推广和应用提供了有力支持。   一、核心功能模块   数据采集与预处理   智能分析处理   集成频谱分析、时频变换等信号处理算法,自动提取时域频域特征;
    华盛恒辉l58ll334744 2025-05-13 10:20 386浏览
  • 感谢面包板论坛组织的本次测评活动,本次测评的对象是STM32WL Nucleo-64板 (NUCLEO-WL55JC) ,该测试板专为LoRa™应用原型构建,基于STM32WL系列sub-GHz无线微控制器。其性能、功耗及特性组合经过精心挑选,支持通过Arduino® Uno V3连接,并利用ST morpho接头扩展STM32WL Nucleo功能,便于访问多种专用屏蔽。STM32WL Nucleo-64板集成STLINK-V3E调试器与编程器,无需额外探测器。该板配备全面的STM
    无言的朝圣 2025-05-13 09:47 199浏览
  • 在当下的商业版图中,胖东来宛如一颗璀璨的明星,散发着独特的光芒。它以卓越的服务、优质的商品以及独特的企业文化,赢得了消费者的广泛赞誉和业界的高度关注。然而,近期胖东来与自媒体博主之间的一场激烈对战,却如同一面镜子,映照出了这家企业在光环背后的真实与挣扎,也引发了我们对于商业本质、企业发展以及舆论生态的深入思考。​冲突爆发:舆论场中的硝烟弥漫​2025年4月,抖音玉石博主“柴怼怼”(粉丝约28万)突然发难,发布多条视频直指河南零售巨头胖东来。他言辞犀利,指控胖东来在玉石销售方面存在暴利行为,声称其
    疯人评 2025-05-14 13:49 76浏览
  •   舰艇电磁兼容分析与整改系统平台解析   北京华盛恒辉舰艇电磁兼容分析与整改系统平台是保障海军装备作战效能的关键技术,旨在确保舰艇电子设备在复杂电磁环境中协同运行。本文从架构、技术、流程、价值及趋势五个维度展开解析。   应用案例   目前,已有多个舰艇电磁兼容分析与整改系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润舰艇电磁兼容分析与整改系统。这些成功案例为舰艇电磁兼容分析与整改系统的推广和应用提供了有力支持。   一、系统架构:模块化智能体系   电磁环境建模:基
    华盛恒辉l58ll334744 2025-05-14 11:22 90浏览
  • 在当下竞争激烈的 AI 赛道,企业高层的变动往往牵一发而动全身,零一万物近来就深陷这样的动荡漩涡。近日,零一万物联合创始人、技术副总裁戴宗宏离职创业的消息不胫而走。这位在大模型基础设施领域造诣颇深的专家,此前在华为云、阿里达摩院积累了深厚经验,在零一万物时更是带领团队短期内完成了千卡 GPU 集群等关键设施搭建,其离去无疑是重大损失。而这并非个例,自 2024 年下半年以来,李先刚、黄文灏、潘欣、曹大鹏等一众联创和早期核心成员纷纷出走。
    用户1742991715177 2025-05-13 21:24 146浏览
  • 一、量子自旋态光学操控1、‌拓扑量子态探测‌磁光克尔效应通过检测拓扑磁结构(如磁斯格明子)的磁光响应,实现对量子材料中非平庸拓扑自旋序的非侵入式表征。例如,二维量子磁体中的“拓扑克尔效应”可通过偏振光旋转角变化揭示斯格明子阵列的动态演化,为拓扑量子比特的稳定性评估提供关键手段。2、‌量子态调控界面‌非厄米磁光耦合系统(如法布里-珀罗腔)通过耗散调控增强克尔灵敏度,可用于奇异点附近的量子自旋态高精度操控,为超导量子比特与光子系统的耦合提供新思路。二、光子量子计算架构优化1、‌光子内存计算器件‌基于
    锦正茂科技 2025-05-13 09:57 57浏览
  •   军事领域仿真推演系统的战略价值与发展前瞻   北京华盛恒辉仿真推演系统通过技术创新与应用拓展,已成为作战效能提升的核心支撑。以下从战略应用与未来趋势展开解析:   应用案例   目前,已有多个仿真推演系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润仿真推演系统。这些成功案例为仿真推演系统的推广和应用提供了有力支持。   一、核心战略应用   1. 作战理论创新引擎   依托低成本仿真平台,军事人员可高效验证新型作战概念。   2. 装备全周期优化   覆盖武器
    华盛恒辉l58ll334744 2025-05-14 16:41 100浏览
  • 一、蓝牙射频电路设计的核心价值在智能穿戴、智能家居等物联网设备中,射频性能直接决定通信质量与用户体验。WT2605C等蓝牙语音芯片的射频电路设计,需在紧凑的PCB空间内实现低损耗信号传输与强抗干扰能力。射频走线每0.1dB的损耗优化可使通信距离提升3-5米,而阻抗失配可能导致30%以上的能效损失。二、射频走线设计规范1. 阻抗控制黄金法则50Ω标准阻抗实现:采用4层板时,顶层走线宽度0.3mm(FR4材质,介电常数4.3)双面板需通过SI9000软件计算,典型线宽1.2mm(1.6mm板厚)阻抗
    广州唯创电子 2025-05-13 09:00 33浏览
  •   军事仿真推演系统平台核心解析   北京华盛恒辉军事仿真推演系统平台以计算机仿真技术为基石,在功能、架构、应用及效能上展现显著优势,成为提升军事作战与决策能力的核心工具。   应用案例   目前,已有多个仿真推演系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润仿真推演系统。这些成功案例为仿真推演系统的推广和应用提供了有力支持。   一、全流程功能体系   精准推演控制:覆盖推演启动至结束全流程。   智能想定管理:集成作战信息配置、兵力部署功能。   数据模型整合
    华盛恒辉l58ll334744 2025-05-14 17:11 79浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦