数据缓存器FIFO IP核调取及应用

写在前面的话

在项目设计中,我们通常需要在两个模块之间传输数据,如果两个模块的数据处理速率相同,那么自然没有任何问题,直接数据对接就可以。但是,如果两个模块的数据处理速度不同呢?数据接收模块和数据发送模块的速度不一致,必然会导致采集数据的遗漏或错误。那么,该如何解决这个问题呢?梦翼师兄的办法是在他们之间加一个数据缓存器,所有数据先经过缓存器缓存,然后再输入到数据接收模块。那么本节,梦翼师兄和大家一起学习用做数据缓存的存储IP核-FIFO的设计。

项目需求

创建两个模块,一个作为数据发送模块,另一个作为数据接收模块。发送模块检测到FIFO为空则开始向FIFO中写入数据,直到FIFO写满为止。数据接收模块检测到FIFO为满则开始从FIFO中读出数据,直到FIFO读空为止。

操作步骤 

在右侧的IP核搜索区,输入fifo,然后双击【FI

选择语言类型为Verilog,并命名

点击【OK】

设置fifo的的存储深度和每一个存储空间的比特位数,选择输入和读出不是同一个时钟,fifo就会出现读时钟和写时钟

点击【NEXT】,选择端口如下

点击【NEXT】

选中my_fifo_inst.v文件,然后点击【Finish】退出即可。


fifo的读端口信号


fifo的写端口信号


端口名称


端口介绍


端口名称


端口介绍


full


读满信号(rdfull),当fifo被填充满,全部没有读出时,full为真值


full


写满信号(wrfull),当fifo被写满时full为真值


empty


读空信号(rdempty),当fifo所有的数据都被读出时,empty为真值


empty


写空信号(wrempty),当fifo没有任何数据被写入时,empty为真值

注:读端口和写端口的输出会有几拍的时间差,这是由fifo内部的结构导致的。

 顶层架构设计

FIFO是一个重要的数据缓冲器,我们设计出对应的控制模块对FIFO进行读写,根据我们在FIFO设置向导中了解到的信息,我们掌握了FIFO端口的含义,现设计架构图如下(为了方便大家理解,在这里我们选择读/写数据的时钟是相同的)

模块功能介绍


模块名


功能描述


Wr_fifo


对fifo进行写入


Rd_fifo


对fifo进行读出


My_fifo


数据缓存器


Fifo


系统顶层模块,负责子模块级联

端口和内部连线描述

顶层模块端口介绍


端口名


端口说明


Clk


系统时钟输入


Rst_n


系统复位


q


数据输出

系统内部连线介绍


连线名


连线说明


wrreq


写请求信号


wrfull


写满信号


wrempty


写空信号


rdreq


读请求信号


rdfull


读满信号


rdempty


读空信号


data


输入fifo的数据

代码解释

Wr_fifo模块代码


/****************************************************

*   Engineer      :   梦翼师兄

*   QQ             :   761664056

*   The module function:对fifo进行写入 *****************************************************/

00 module wr_fifo (

01 clk, //模块输入时钟

02 rst_n, //模块复位

03 wrfull,// 写满信号

04 wrempty,//写空信号

05 data,//fifo的输入数据

06 wrreq//写请求信号

07 );

08 //模块输入

09 input clk;//模块输入时钟

10 input rst_n;//模块复位

11 input wrfull;// 写满信号

12 input wrempty;//写空信号

13 //模块输出

14 output reg [7:0] data;//fifo的输入数据

15 output reg wrreq;//写请求信号

16 //定义中间寄存器

17 reg state; //状态寄存器

18

19 always @ (posedge clk or negedge rst_n)

20 begin

21 if (!rst_n)//复位时,将中间寄存器和输出清零

22 begin

23 data <= 0;

24 wrreq <= 0;

25 state <= 0;

26 end

27 else

28 begin

29 case (state)

30 0 : begin

31 if (wrempty)//写空时,写请求拉高,跳到下一个状态

32 begin

33 state <= 1;

34 wrreq <= 1;

35 data <= 0;

36 end

37 else

38 state <= 0;

39 end

40

41 1 : begin

42 if (wrfull)//写满时,写请求拉低,跳回上一个状态

43 begin

44 state <= 0;

45 data <= 0;

46 wrreq <= 0;

47 end

48 else

49 begin

50 data <= data + 1; //没有写满的时候,写请求拉高,继续输入数据

51 wrreq <= 1;

52 end

53 end

54 endcase

55 end

56 end

57

58 endmodule

rd_fifo模块代码


/****************************************************

*   Engineer      :   梦翼师兄

*   QQ             :   761664056

*   E_mail        :   [email protected]

*   The module function:对fifo进行读出 *****************************************************/

00 module rd_fifo (

01 clk,  //模块输入时钟

02 rst_n, //模块复位

03 rdfull,//读满信号

04 rdempty,//读空信号

05 rdreq//读请求

06 );

07 //模块输入

08 input clk;//模块输入时钟

09 input rst_n;//模块复位

10 input rdfull;//读满信号

11 input rdempty;//读空信号

12 //模块输出

13 output reg rdreq;//读请求

14 //定义中间寄存器

15 reg state;//状态寄存器

16

17 always @ (posedge clk or negedge rst_n)

18 begin

19 if (!rst_n)//复位时,将中间寄存器和输出清零

20 begin

21 rdreq <= 0;

22 state <= 0;

23 end

24 else

25 case (state)

26 0 : begin

27 if (rdfull)//读满时,读请求拉高,跳到下一个状态

28 begin

29 rdreq <= 1;

30 state <= 1;

31 end

32 else

33 state <= 0;

34 end

35

36 1 : begin

37 if (rdempty)//读空时,读请求拉低,跳回上一个状态

38 begin

39 rdreq <= 0;

40 state <= 0;

41 end

42 else

43 begin

44 rdreq <= 1;//没有读空的时候,读请求拉高,继续读出数据

45 state <= 1;

46 end

47 end

48 endcase

49

50 end

51

52 endmodule

顶层连接模块


/****************************************************

*   Engineer      :   梦翼师兄

*   QQ             :   761664056

*   The module function:顶层连接模块 *****************************************************/

00 module fifo (

01 clk,  //系统输入时钟

02 rst_n,  //系统复位

03 q //输出数据

04 );

05  //系统输入

06 input clk; //系统输入时钟

07 input rst_n; //系统复位

08 //系统输出

09 output [7:0] q; //输出数据

10 //定义中间连线

11 wire wrfull; // 写满信号

12 wire wrempty;//写空信号

13 wire [7:0] data;//fifo的输入数据

14 wire wrreq; //写请求信号

15 wire rdfull;//读满信号

16 wire rdempty;//读空信号

17 wire rdreq;//读请求

18 // 实例化wr_fifo模块

19 wr_fifo  wr_fifo (

20 .clk(clk),  //系统输入时钟

21 .rst_n(rst_n), //系统复位

22 .wrfull(wrfull), // 写满信号

23 .wrempty(wrempty), //写空信号

24 .data(data), //fifo的输入数据

25 .wrreq(wrreq)//写请求信号

26 );

27 // 实例化rd_fifo模块

28 rd_fifo rd_fifo (

29 .clk(clk),  //系统输入时钟

30 .rst_n(rst_n), //系统复位

31 .rdfull(rdfull), //读满信号

32 .rdempty(rdempty), //读空信号

33 .rdreq(rdreq)//读请求

34 );

35 //实例化my_fifo

36 my_fifo my_fifo_inst (

37 .data ( data ),//fifo的输入数据

38 .rdclk ( clk ),//读时钟

39 .rdreq ( rdreq ),//读请求

40 .wrclk ( clk ),//写时钟

41 .wrreq ( wrreq ),//写请求

42 .q ( q ),//输出数据

43 .rdempty ( rdempty ),//读空信号

44 .rdfull ( rdfull ),//读满信号

45 .wrempty ( wrempty ),//写空信号

46 .wrfull ( wrfull )//写满信号

47 );

48

49 endmodule

编写完可综合代码之后,首先查看RTL视图如下:

由RTL视图可以看出,代码综合以后成的电路和我们所设计的系统框图一致,说明顶层模块连接正确,接下来编写测试代码如下:


/****************************************************

*   Engineer      :   梦翼师兄

*   QQ             :   761664056

*   The module function:fifo的仿真测试 *****************************************************/

00  `timescale 1ns/1ps       //时间单位和精度定义

01  module fifo_tb;

02      //系统输入

03      reg clk;        //系统输入时钟

04      reg rst_n;  //系统复位

05      //系统输出

06      wire [7:0] q;       //输出数据

07

08      initial begin

09          clk = 1;

10          rst_n = 0;

11          # 200.1

12          rst_n = 1;

13      end

14

15      always # 10 clk = ~clk; //50MHz的时钟

16

17      //实例化fifo

18      fifo fifo (

19                          .clk(clk),      //系统输入时钟

20                          .rst_n(rst_n),  //系统复位

21                          .q(q)           //输出数据

22                      );

23

24  endmodule

仿真分析

复位结束后,由于fifo中没有任何数据,所以写空信号为1,当写入一个数据之后,写空信号变成0,写满信号一直为0。

当输入数据到达256个的时候写满信号变高,并且经过几拍之后读满信号变成1(这是由fifo内部结构导致的),当读出一个数据之后,读满信号马上就拉低。

当读出的数据达到256后,读空信号变高,经过几拍之后写空信号变高(由fifo内部结构决定),之后开始重新写数据,开始循环。

原文地址:https://www.cnblogs.com/mengyi1989/p/11518290.html

时间: 2024-08-02 16:20:40

数据缓存器FIFO IP核调取及应用的相关文章

FIFO数据缓存器

FIFO数据缓存器: FIFO (First Input First Output) 一种先进先出的数据缓存器,先进入的数据先从FIFO缓存器中读出,与RAM相比没有外部读写地址线,使用比较简单,但只能顺序写入数据,顺序的读出数据,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址. FIFO数据缓存器的作用: FIFO一般用于不同时钟域之间的数据传输,比如FIFO的一端是AD数据采集,另一端为PCI总线,那么在两个不同的时钟域间就可以采用FIFO来作为数据缓冲.另外对于不同宽度的数据

FPGA学习笔记之FIFO IP核

FIFO总结文档 何为FIFO .? FIFO(First In First Out ) 先进先出是一个常用于数据缓存的一个数据缓冲器. fifo主要有WRREQ(写信号)WRclk(写时钟)data(写数据)wrfull(写满标志)wrempty(写空标志)wrusedw(告知里面还有多少数据) Rdreq(读信号)rdclk(读时钟)rdfull(读满标志)rdempty(读空标志)rdusedw(告知里面数据个数) 以上所有信号全是高电平有效. 为什么要用fifo? 在项目设计中,我们通常

移位寄存器的 IP核调取及应用

写在前面的话 做很多图像算法的时候,我们经常需要用到模板运算(如sobel图像边缘检测.中值滤波.均值滤波等等),处理这些问题的时候,我们可以借助altera提供的移位寄存器IP核来简化我们的设计,从而提高设计效率.本节,梦翼师兄和大家一起学习这个适合用于模板运算的移位寄存器IP核的用法. 功能要求 假设数据在一个ROM中以如下图所示的方式存放,列加行的值作为该数的地址(如e的地址就是8+1=9). address 0 1 2 3 4 5 6 7 0 a d g j m p aa bb 8 b

IP核之初——FIFO添加以太网MAC头部

说白了,IP核就是别人做好了的硬件模块,提供完整的用户接口和说明文档,更复杂的还有示例工程,你只要能用好这个IP核,设计已经完成一半了.说起来容易,从冗长的英文文档和网上各个非标准教程中汲取所需,并灵活运用还是需要下一番功夫的. 我认为其中最重要的几点如下: 1) 提供给IP核正确的时钟和复位条件: 2) 明确各个重要用户接口功能: 3) 掌握所需指令的操作时序: 4) 知道内部寄存器地址及功能和配置方式.顺序: 5) 会从官方示例工程中学会IP核正确使用方式: 今天来讲讲一个最常用的IP核,F

Quartus II 与ModelSim-Altera联合仿真FFT IP核之FFT IP调用与例程数据验证-lab1

编译 仿真文件编写 仿真结果 数据结果对比 Modelsim输出的数据测试可以和matlab example里面matlab输出的数据进行对比,对比结果如下,结果表明与matlab输出的处理结果一致,验证了FFT IP核的正确性.

FPGA设计千兆以太网MAC(3)——数据缓存及位宽转换模块设计与验证

本文设计思想采用明德扬至简设计法.上一篇博文中定制了自定义MAC IP的结构,在用户侧需要位宽转换及数据缓存.本文以TX方向为例,设计并验证发送缓存模块.这里定义该模块可缓存4个最大长度数据包,用户根据需求改动即可. 该模块核心是利用异步FIFO进行跨时钟域处理,位宽转换由VerilogHDL实现.需要注意的是用户数据包位宽32bit,因此包尾可能有无效字节,而转换为8bit位宽数据帧后是要丢弃无效字节的.内部逻辑非常简单,直接上代码: 1 `timescale 1ns / 1ps 2 3 //

第7讲 SPI和RAM IP核

学习目的: (1) 熟悉SPI接口和它的读写时序: (2) 复习Verilog仿真语句中的$readmemb命令和$display命令: (3) 掌握SPI接口写时序操作的硬件语言描述流程(本例仅以写时序为例),为以后描述更复杂的时序逻辑电路奠定基础. 学习过程: [SPI的相关知识] ① SPI的速度比串口的快,采用源同步传输的方式,且为串行传输,应用场景不同则时序和接口名称会有不同: ② 串行flash的读写擦除命令可通过SPI接口进行通信,CPU芯片与FPGA可通过SPI接口进行通信,某些

Lattice 的 Framebuffer IP核使用调试笔记之IP核生成与参数设置

本文由远航路上ing 原创,转载请标明出处. 这节笔记记录IP核的生成以及参数设置. 先再IP库里下载安装Framebuffer 的ipcore 并安装完毕. 一.IP核的生成: 1.先点击IP核则右边会出现生成对话框: 按箭头指示顺序进行设置:要设置生成ip核的路径(可以新建一个文件夹ipcore来放置IP核,若有多个IP核则在ipcore下分别建立文件夹),IP核的名字,以及语言的类型:verilog或VHDL.最后点击Customize. 2. 在上一步设置之后会出现下面的设置界面,先设置

Quartus II 与ModelSim-Altera联合仿真FFT IP核之FFT IP核分析

FFT IP Core Features 参数设置 FFT IP核有4种模式,分别为: 突发模式(Burst): 缓存突发模式(Buffered Burst): 流模式(Streaming): 可变流模式(Variable Streaming): 前3中模式运算速度依次增大,占用资源也依次增加,第4种模式(Variable Streaming)可以用于在线改变FFT的大小.速度和流模式差不多,资源占用更多. 分为基本配置和高级配置两种,基本配置包括配置FFT ip核的变换长度,FFT还是IFFT