IP核之同步FIFO

一、FiFo 定义和功能  即先入先出

是一种数据缓冲器,用来实现数据先入先出的读写方式。

本次实验用到的芯片是EP4CE10F17C8的开发板。用到的软件是英特尔的Quartus II 13.0sp1 。

二、如何配置fifo 以及功能引脚

以Altera Quartus II 为例。

在tool工具栏中找到这个魔法棒标识的地方,双击即可。

进去之后需要把fifo命名一下,就进入这个界面

最后一步就是勾选inst.v文件,方便直接调用例化

以下是FIFO的功能模块图

clk/clock:时钟信号,同步FIFO读写共用一个时钟
wrreq: write request写请求
rdreq: read request 读请求
data[7:0]: 写数据
q[7:0] : 读出数据
full : 满信号,为高时表示FIFO满
empty : 空信号,为高时表示FIFO空
usedw[7:0] : 用量,代表FIFO里存的数据个数

三、时序图

以下是连续读和写,fifo没有地址,fifo的使能全部变成请求,写代码时要注意时序延时,和fifo核的配置。

四、程序设计

本次程序的数据模块在仿真里。

这是顶层

module fifo(

    input  wire       clk      ,
    input  wire       rst_n ,
    input  wire [7:0] data    ,
    input  wire       rdreq ,
    input  wire       wrreq ,
    output wire [7:0] q 

);

wire          empty   ;
wire          full    ;
wire  [7:0] usedw  ;  //剩余数据 、用量

fifo_8x256    fifo_8x256_inst (
    .clock ( clk    ),
    .data ( data     ),
    .rdreq ( rdreq     ),
    .wrreq ( wrreq     ),
    .empty ( empty     ),
    .full (  full      ),
    .q       ( q         ),
    .usedw ( usedw    )
    );


endmodule

以下是仿真文件

`timescale 1ns/1ps   //时间预编译指令  时间单位时间精度

module fifo_tb();

reg          clk  ;
reg         rst_n ;
reg         wrreq ; //写请求
reg  [7:0] data  ; //数据
reg         rdreq ; //读请求

initial
begin                
    clk    =  1'b0    ;
    rst_n  =  1'b0    ;
    wrreq  =  1'b0    ;
    data   =  8'b0    ;
    rdreq  =  1'b0    ;
   #123
    rst_n  =  1'b1 ;

end 
    wire [7:0] q;
    always #10 clk = ~ clk;    
    reg [9:0]  cnt ;          //2^10 = 1024
    
always @(posedge clk, negedge rst_n)
begin
    if(~rst_n)
        cnt <= 10'd0 ;
    else 
        cnt <= cnt +1'b1 ;
end

always @(posedge clk, negedge rst_n)
begin
    if(~rst_n)
        wrreq <= 1'd0 ;
    else if(cnt >= 10'd2 && cnt <= 10'd257 )
        wrreq  <= 1'b1 ;
    else 
        wrreq <= 1'b0 ;
end

always @(posedge clk, negedge rst_n)
begin
    if(~rst_n)
        data <= 7'd0 ;
    else if( wrreq ) //wrreq 
        data  <= data + 7'b1 ;
    else 
        wrreq <= 8'b0 ;
end

always @(posedge clk, negedge rst_n)
begin
    if(~rst_n)
        rdreq <= 1'd0 ;
    else if(cnt >= 258 && cnt <= 10'd513 )
        rdreq  <=  1'b1 ;
    else 
        rdreq <= 1'b0 ;
end

fifo fifo_inst(
    .clk       (clk  ) ,
    .rst_n     (rst_n) ,
    .wrreq     (wrreq) ,
    .data      (data ) ,
    .rdreq     (rdreq) ,
    
    . q         ( q )
    

);

endmodule 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值