当前位置: 首页 > news >正文

FPGA自学——FIFO缓存器

FPGA自学——FIFO缓存器

文章目录

  • FPGA自学——FIFO缓存器
    • 一、介绍
    • 二、调用FIFIO的IP核
      • 一)基本配置信息
      • 二)创建同步标准读的块RAM的FIFO
        • 1.拟设计目标
        • 2.fifo设置
        • 3.仿真文件
        • 4.仿真波形分析
      • 三)创建异步FT读的块RAM的FIFO
        • 1.拟设计目标
        • 2.fifo配置
        • 3.仿真文件
        • 4.仿真波形分析

一、介绍

定义: FIFO(First In First Out),也就是先进先出。FPGA或者ASIC中使用到的FIFO一般指的是对数据的存储具有先进先出特性的一个缓存器,常被用于数据的缓存或者高速异步数据的交互。

与普通存储器的区别: 没有外部读写地址线

优点: 使用起来相对简单

缺点: 只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。

作用: 对于存储的数据,先进先出,可以确保数据的连续性

应用场景1:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

应用场景2:

在这里插入图片描述

**应用场景3:**独立时钟

在这里插入图片描述

二、调用FIFIO的IP核

一)基本配置信息

选择FIFO的IP核进行配置

在这里插入图片描述

1.basic

在这里插入图片描述

在这里插入图片描述

2.native ports

在这里插入图片描述

标准模式时序图

在这里插入图片描述

FT模式时序图

在这里插入图片描述

3.status flags

在这里插入图片描述

4.data counts

在这里插入图片描述

由于对于FT模式下的FIFO是不准确的,看一下下列示例如何调整

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

二)创建同步标准读的块RAM的FIFO

1.拟设计目标

在这里插入图片描述

2.fifo设置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.仿真文件
`timescale 1ns / 1ps
module bram_sync_fifo_test();reg         clk           ;reg         reset         ;reg  [7:0]  din           ;reg         wr_en         ;reg         rd_en         ;wire [7:0]   dout          ;wire         full          ;wire         almost_full   ;wire         wr_ack        ;wire         overflow      ;wire         empty         ;wire         almost_empty  ;wire         valid         ;wire         underflow     ;wire  [7:0]  data_count    ;bram_sync_fifo bram_sync_fifo (.clk              (clk),                    // input wire clk.srst             (reset),                  // 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.almost_full      (almost_full),    // output wire almost_full.wr_ack           (wr_ack),              // output wire wr_ack.overflow         (overflow),          // output wire overflow.empty            (empty),                // output wire empty.almost_empty     (almost_empty),  // output wire almost_empty.valid            (valid),                // output wire valid.underflow        (underflow),        // output wire underflow.data_count       (data_count)      // output wire [7 : 0] data_count
);initial clk = 1;always #10 clk = ~clk;initial beginreset = 1'b1;wr_en = 1'b0;rd_en = 1'b0;din = 8'hff;#21;reset = 1'b0;//写操作 从0到255,共256个数据while(full == 1'b0)begin@(posedge clk);#1;//由于这个延时1ns,与时钟错开,所以在下一个时钟才会写入fifo,din的原始值为ff,+1之后变为00wr_en = 1'b1;din   = din + 1'b1;end//再多写一个数据,看overflow的变化din = 8'hf0;@(posedge clk);#1;wr_en = 1'b0;#2000 ;//读操作,读256次while(empty == 1'b0)begin@(posedge clk)#1;rd_en = 1'b1;end//再多给一个读使能,看underflow的变化@(posedge clk)#1 ;rd_en = 1'b0;//复位#200;reset = 1'b1;#21;reset = 1'b0;#2000;$stop;endendmodule
4.仿真波形分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三)创建异步FT读的块RAM的FIFO

1.拟设计目标

在这里插入图片描述

摄像头图像采集显示,示波器,电压表

2.fifo配置

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3.仿真文件
`timescale 1ns / 1psmodule bram_async_fifo_test();reg             reset          ;
reg             wr_clk         ;
reg             rd_clk         ;
reg   [7:0]     din            ;
reg             wr_en          ;
reg             rd_en          ;
wire  [15:0]    dout           ;
wire            full           ;
wire            almost_full    ;
wire            wr_ack         ;
wire            overflow       ;
wire            empty          ;
wire            almost_empty   ;
wire            valid          ;
wire            underflow      ;
wire  [7:0]     rd_data_count  ;
wire  [8:0]     wr_data_count  ;
wire            wr_rst_busy    ;
wire            rd_rst_busy    ;bram_async_fifo bram_async_fifo (.rst                      (reset),                      // input wire rst.wr_clk                   (wr_clk),                // input wire wr_clk.rd_clk                   (rd_clk),                // input wire rd_clk.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 [15 : 0] dout.full                     (full),                    // output wire full.almost_full              (almost_full),      // output wire almost_full.wr_ack                   (wr_ack),                // output wire wr_ack.overflow                 (overflow),            // output wire overflow.empty                    (empty),                  // output wire empty.almost_empty             (almost_empty),    // output wire almost_empty.valid                    (valid),                  // output wire valid.underflow                (underflow),          // output wire underflow.rd_data_count            (rd_data_count),  // output wire [7 : 0] rd_data_count.wr_data_count            (wr_data_count),  // output wire [8 : 0] wr_data_count.wr_rst_busy              (wr_rst_busy),      // output wire wr_rst_busy.rd_rst_busy              (rd_rst_busy)      // output wire rd_rst_busy
);//读侧是100M的时钟initial wr_clk = 1;always #10 wr_clk = !wr_clk;//写侧50M的时钟initial rd_clk = 1;always #5 rd_clk = !rd_clk;reg [5:0] cnt;//cnt计数always@(posedge rd_clk or posedge reset)if(reset)cnt <= 6'b0;else if(cnt >= 6'd31)cnt <= 6'd0;else if(rd_en)#1  cnt <= cnt + 1;//读使能信号always@(posedge rd_clk or posedge reset)if(reset)begin#1 rd_en <= 1'b0;endelse if(rd_data_count > 9'd31)//当可以读的数据大于32了,将读使能打开#1 rd_en <= 1'b1;else if(cnt >= 6'd31)//经过了32个读时钟周期后拉低#1 rd_en <= 1'b0;initial beginreset = 1'b1;din   = 8'hff;wr_en = 1'b0;rd_en = 1'b0;#(20*3+1)//异步复位,至少持续3个慢的时钟周期reset = 1'b0;//写数据@(negedge wr_rst_busy)wait(rd_rst_busy == 1'b0)repeat(257)begin//257@(posedge wr_clk)#1;wr_en = 1'b1;din <= din + 1'b1;endwr_en = 1'b0;#1000;$stop;endendmodule
4.仿真波形分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

http://www.dtcms.com/a/328210.html

相关文章:

  • 游戏中角色持枪:玩家操控角色,角色转向时枪也要转向
  • 西门子PLC跨代通讯实战:S7-200通过以太网模块与S7-1500数据交互
  • PFC是什么
  • 【数模技巧】使用python将.xlsx文件转换为CSV文件
  • 大模型-QAT介绍
  • Product Hunt 每日热榜 | 2025-08-12
  • DeepSeek-R1-0528 推理模型完整指南:领先开源推理模型的运行平台与选择建议
  • 论区间dp:常用模型(附极角排序教程)
  • 项目实战2——LAMP_LNMP实践
  • @系统管理-WindowsLinux-补丁管理工具
  • SpringBoot项目部署
  • 浪潮推出首个“人工智能工厂”,工业化模式加速技术落地
  • RS485+DMA+空闲中断+HAL库收发数据
  • 无人机智能返航模块技术分析
  • element-table的合并行的使用-指定某些字段允许相邻数据能进行合并,通过传递的key键进行判断-公共方法
  • LaTeX 教程:从入门到专业的排版模板
  • UGUI源码剖析(6):遮罩的“魔法”与“算法”——从C#到Shader,彻底揭示Mask与RectMask2D的原理
  • 13.深度学习——Minst手写数字识别
  • git config的配置全局或局部仓库的参数: local, global, system
  • java面试题储备4: 谈谈对es的理解
  • 【银行测试】外贸信托项目与电子资金项目(面试项目讲解)
  • Java面试题储备11: mysql优化全面讲一下,及你遇到的对应业务场景
  • 不废话,UE5极速云渲染操作方法
  • B.10.02.3-分布式一致性:电商业务场景下的理论与工程实践
  • 使用 RealSense D435 获取红外图像:完整 Python 脚本解析
  • 扣子空间深度解析
  • 堆排序以及实现
  • 飞算 JavaAI -智慧城市项目实践:从交通协同到应急响应的全链路技术革新
  • 【Go】Gin 超时中间件的坑:fatal error: concurrent map writes
  • FPGA即插即用Verilog驱动系列——UART串口接收