一、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

1万+

被折叠的 条评论
为什么被折叠?



