FPGA学习笔记之FIFO IP核

FIFO总结文档

  1. 何为FIFO .?

FIFO(First In First Out ) 先进先出是一个常用于数据缓存的一个数据缓冲器。

fifo主要有WRREQ(写信号)WRclk(写时钟)data(写数据)wrfull(写满标志)wrempty(写空标志)wrusedw(告知里面还有多少数据)

Rdreq(读信号)rdclk(读时钟)rdfull(读满标志)rdempty(读空标志)rdusedw(告知里面数据个数)

以上所有信号全是高电平有效。

  1. 为什么要用fifo?

在项目设计中,我们通常需要在两个模块之间传输数据,如果两个模块的数据处理速率相同,那么自然没有什么问题,直接进行数据之间的对接就可以,可若是两个模块的数据处理速度不同呢?如果说数据接收模块和数据发送模块的速度不一致的话,必然会导致采集数据出现遗漏的现象,那么又该如何解决这一问题呢?

这里教大家一种比较简单的方法就是引用FIFO(先进先出)数据缓冲器,所有数据都先经过缓存器去缓存,然后再输入数据接收模块。这样就通过一个数据缓存的方法解决了速度不一致而导致的遗漏数据的问题。

  1. 如何在quarters和ISE里调用FIFO IP核

先主要说一下quarters里面的调用,在IP核搜索区找到fifo选项,

然后写入IP核的名字,点击NEXT就可以进入配置页面,

在这里可以定义位宽和数据深度,因为同步FIFO用的不多,所以主要说一下异步FIFO,在下方的图片中可以定义写空写满和读空读满信号以及写使能和读使能等等。

其余几个页面不需要配置什么直接点击NEXT就可以。

另外需要注意的是:  读端口和写端口的输出会有几个时间差,这是由FIFO内部的结构导致的。

  1. 读写控制信号的生成与fifo的应用

系统框架:

三个输入线和一个输出线

总共需要三个模块和一个顶层连线

代码展示:

写控制:

module FIFO_wr(
input        wire        wclk,
input        wire        rst_n,
input        wire        wrfull,
input        wire        wrempty,
output    reg        [7:0]wrdata,
output    reg        wrreq
);

reg    [7:0]    state;

always @(posedge wclk or negedge rst_n)
begin
if(!rst_n)
    begin
    wrdata<=0;
    wrreq<=0;
    state<=0;
    end
else
    begin
        case(state)
                0:begin
                        if(wrempty)
                                begin
                                    wrreq<=1    ;
                                    wrdata<=0;
                                    state<=1    ;
                                end
                        else
                                state<=0;

                    end
                1:begin
                        if(wrfull)
                                begin
                                    state<=0;
                                    wrreq<=0;
                                    wrdata<=0;
                                end
                        else
                                begin
                                    wrreq<=1;
                                    wrdata<=wrdata+1‘b1;
                                end
                    end
                default:    state<=0;
                endcase
        end
end 

endmodule

读控制:

module     FIFO_rd(
input            wire        rdclk,
input            wire        rst_n,
input            wire        rdempty,
input            wire        rdfull,
output        reg            rdreq
);

reg[2:0]state;

always@(posedge rdclk or negedge rst_n)
    begin
        if(!rst_n)
            begin
                state<=0;
                rdreq<=0;

            end
        else
          begin
            case (state)
                    0:begin
                            if(rdfull)
                             begin
                                     state<=1;
                                     rdreq<=1;
                             end
                            else
                                    state    <=0;
                        end
                    1:begin
                            if(rdempty==0)
                                begin
                                    state<=1;
                                    rdreq<=1;
                                end
                            else
                                    begin
                                    rdreq<=0;
                                    state<=0;
                                    end
                        end
            default:    state<=0;
            endcase
           end
        end
endmodule 

顶层连线:

module     fifo_top(
        input                wire            wrclk,
        input                wire            rst_n,
        input                wire            rdclk,
        output            wire            [7:0]rdata
        );

wire            wrfull;
wire            wrreq;
wire            [7:0]wrdata;
wire            wrempty;
wire            rdfull;
wire            rdempty;
wire            rdreq;

        FIFO_wr        U1 (
                          .wclk(wrclk)        ,
                        .rst_n(rst_n)        ,
                        .wrfull(wrfull)    ,
                        .wrdata(wrdata)    ,
                        .wrreq(wrreq)      ,
                        .wrempty(wrempty)
                    );
        FIFO_rd        U2(
                            .rdclk    (rdclk)        ,
                            .rst_n    (rst_n)        ,
                            .rdempty(rdempty)        ,
                            .rdreq    (rdreq)        ,
                            .rdfull    (rdfull)
                            );
        my_fifo         U3(
                            .data(wrdata)            ,
                            .rdclk(rdclk)            ,
                            .rdreq(rdreq)            ,
                            .wrclk(wrclk)            ,
                            .wrreq(wrreq)            ,
                            .q(rdata)                ,
                            .rdempty(rdempty)       ,
                            .rdfull(rdfull)        ,
                            .wrempty(wrempty)       ,
                            .wrfull(wrfull)
                        );    

endmodule 

测试文件:

  

module    fifo_top_tb;

reg            wrclk;
reg            rdclk;
reg            rst_n;

wire            [7:0]    rdata;

initial
begin
wrclk=1;
rdclk=1;
rst_n=0;
#1000
rst_n=1;
#100000 $stop;
end 

always #10 wrclk=~wrclk;
always #20 rdclk=~rdclk;

fifo_top    U1(
            .wrclk            (wrclk)            ,
            .rst_n            (rst_n)            ,
            .rdclk            (rdclk)            ,
            .rdata            (rdata)
);

endmodule 

仿真波形:

  

可以看到:

  当复位结束之前,写空标志为高电平,当有第一个数据写进去的时候,写空标志拉低,当数据写完的时候,写满标志拉高,延时了几拍后,读满标志拉高,当有第一个数据读出来以后,读满标志拉低,当数据读完后,读空标志由低变高,延时几拍后会出现写空标志,进行下一循环。

由上可以看到当读和写的时钟不一样的时候也能很方便的达到数据缓存的目的,不至于数据丢失。

时间: 2024-12-17 22:37:41

FPGA学习笔记之FIFO IP核的相关文章

学习笔记之TCP/IP协议的传输方式

一.通过网络发送数据,大致可以分为面向有连接与面向无连接两种类型: 1.面向无连接型包括以太网. IP.UDP等协议. 2. 面向有连接 型包括ATM.帧中继.TCP等 协议. 通过一张图了解一下: 面向有连接型 面向有连接型中,在发送数据之前,需要在收发主机之间连接一条通信线路 面向有连接型就好比人们平常打电话,输入完对方电话号码拨出之后,只有 对端拿起电话才能真正通话,通话结束后将电话机扣上就如同切断电源.因此在 面向有连接的方式下,必须在通信传输前后,专门进行建立和断开连接的处理.如果与对

学习笔记之TCP/IP协议分层与OSI参考模型

1.协议的分层      ISO在制定标准化OSI之前,对网络体系结构相关的问题进行了充分的讨论, 最终提出了作为通信协议设计指标的OSI参考模型.这一模型将通信协议中必要 的功能分成了7层.通过这些分层,使得那些比较复杂的网络协议更加简单化. 在这一模型中,每个分层都接收由它下一层所提供的特定服务,并且负责为自己的上一层提供特定的服务.上下层之间进行交互时所遵循的约定叫做"接口".同一层之间的交互所遵循的约定叫做"协议". 协议分层就如同计算机软件中的模块化开发.

FPGA初体验之用户IP核封装

实验平台:Vivado 2015 开发板:Xilinx ZYNQ-7020 内容:创建和封装用户IP核流程 第一步:打开Vivado 2015,新建工程. 第二步:更改工程名和存放路径,点击下一步. 第三步:选择RTL工程,点击下一步. 第四步:点击创建文件,输入IP核名称(自定义),点击OK. 点击下一步. 点击下一步. 第五步:选择对应的芯片.我的开发板用的芯片是xc7z020clg-1,点击下一步. 点击完成. 直接点击OK. 第六步:编辑myip.v 代码:myip.v 1 `times

FPGA学习笔记(二)——FPGA学习路线及开发流程

###### [该随笔部分内容转载自小梅哥]       ######### 一.FPGA学习路线 工具使用 -> 语法学习 -> 逻辑设计 -> IP使用 ->接口设计 -> 时序分析 -> 片上系统 1.工具使用 Altera:Quartus II Xlinx: Vivado 2.语法学习 Verilog HDL(FPGA设计的是电路) 3. 逻辑设计 组合逻辑:多路选择器.加法器.译码器.乘法器 ······· 时序逻辑:计数器.分频器.移位寄存器.定时器 ···

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

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

FPGA学习笔记之DDS

大纲: 什么是DDS? DDS是直接数字式频率合成器(Direct Digital Synthesizer)的英文缩写,与传统的频率合成器相比,DDS具有低成本,高分辨率,低功耗,高分辨率,和快速转换时间等优点,广泛应用在电信与电子仪器领域,是实现设备全数字化的一个关键技术. 什么是信号发生器? 波形发生器就是一种数据信号发生器,在调试硬件的时候,常常需要加入一些信号,以观察电路工作是否正常,加入的信号有正玄波,三角波,方波,以及任意波形. 何为调频 调频就是改变单位时间内完成周期性变化的次数.

FPGA学习笔记(四)——Verilog基本语法

###### [该随笔部分内容转载自小梅哥] ######### 组合逻辑:    多路选择器.加法器.译码器.乘法器 时序逻辑:    计数器.分频器.定时器.移位寄存器 一.Verilog文件的基本结构 1.模块声明     模块名    端口列表 2.端口类型.位宽定义 3.功能描述 //模块描述方式一(先列出端口,再描述端口类型) //此方式虽然行数多,但是方便后面例化端口,推荐使用 module name( , , //最后一个不需要"," ); //端口类型描述 //功能描

Xilinx FPGA 学习笔记一-chipscope 无法观察信号 BUFG

今天开始试着使用chipscope,写了一个简单的流水灯的例程,开始综合布线的时候没有问题,但是加上chipscope 以后,综合就总报错. 第一种情况:用chipscope不可以直接观察全局时钟信号,即BUFG信号-----X 错误如下: ERROR:Place:1136 - This design contains a global buffer instance, <PLL_u0/clkout1_buf>, driving the net, <CLK_OUT1>, that

FPGA学习笔记之IIC—EEPROM写和读

一.IIC总线协议特点及其工作原理 I2C(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备. 1)I2C总线特点 I2C总线最主要的优点是其简单性和有效性.由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本.总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件. I2C总线的另一个优点是,它支持多主控(multimastering),