/******************************************************************************
|
/******************************************************************************
|
$Id: fifo_beh.v,v 1.1 2002-03-10 17:18:37 johnsonw10 Exp $
|
$Id: fifo_beh.v,v 1.1 2002-03-10 17:18:37 johnsonw10 Exp $
|
|
|
Author(s): Johnsonw10@opencors.org
|
Author(s): Johnsonw10@opencors.org
|
|
|
Revision History:
|
Revision History:
|
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
|
|
******************************************************************************/
|
******************************************************************************/
|
`timescale 1 ns / 100 ps
|
`timescale 1 ns / 100 ps
|
module fifo_beh (
|
module fifo_beh (
|
clk,
|
clk,
|
reset_n,
|
reset_n,
|
wr,
|
wr,
|
din,
|
din,
|
|
|
rd,
|
rd,
|
dout,
|
dout,
|
|
|
empty,
|
empty,
|
full
|
full
|
);
|
);
|
|
|
parameter DATA_WIDTH = 32;
|
parameter DATA_WIDTH = 32;
|
parameter FIFO_SIZE = 64;
|
parameter FIFO_SIZE = 64;
|
|
|
input reset_n;
|
input reset_n;
|
input clk;
|
input clk;
|
|
|
input wr;
|
input wr;
|
input [0:DATA_WIDTH-1] din;
|
input [0:DATA_WIDTH-1] din;
|
|
|
input rd;
|
input rd;
|
output [0:DATA_WIDTH-1] dout;
|
output [0:DATA_WIDTH-1] dout;
|
reg [0:DATA_WIDTH-1] dout;
|
reg [0:DATA_WIDTH-1] dout;
|
output empty;
|
output empty;
|
output full;
|
output full;
|
|
|
reg [0:DATA_WIDTH-1] mem[0:FIFO_SIZE-1];
|
reg [0:DATA_WIDTH-1] mem[0:FIFO_SIZE-1];
|
integer rd_ptr, wr_ptr, dcnt;
|
integer rd_ptr, wr_ptr, dcnt;
|
|
|
wire empty_o, full_o;
|
wire empty_o, full_o;
|
wire rd_i = rd & (!empty_o);
|
wire rd_i = rd & (!empty_o);
|
wire wr_i = wr & (!full_o);
|
wire wr_i = wr & (!full_o);
|
|
|
always @ (negedge reset_n or posedge clk) begin
|
always @ (negedge reset_n or posedge clk) begin
|
if (!reset_n) begin
|
if (!reset_n) begin
|
rd_ptr <= 0;
|
rd_ptr <= 0;
|
wr_ptr <= 0;
|
wr_ptr <= 0;
|
dcnt <= 0;
|
dcnt <= 0;
|
end
|
end
|
else begin
|
else begin
|
if (rd_i) begin
|
if (rd_i) begin
|
dout <= mem[rd_ptr];
|
dout <= mem[rd_ptr];
|
rd_ptr <= rd_ptr + 1;
|
rd_ptr <= rd_ptr + 1;
|
end
|
end
|
|
|
if (wr_i) begin
|
if (wr_i) begin
|
mem[wr_ptr] <= din;
|
mem[wr_ptr] <= din;
|
wr_ptr <= wr_ptr + 1;
|
wr_ptr <= wr_ptr + 1;
|
end
|
end
|
|
|
if (rd_i && wr_i)
|
if (rd_i && wr_i)
|
dcnt <= dcnt;
|
dcnt <= dcnt;
|
else if (rd_i)
|
else if (rd_i)
|
dcnt <= dcnt - 1;
|
dcnt <= dcnt - 1;
|
else if (wr_i)
|
else if (wr_i)
|
dcnt <= dcnt + 1;
|
dcnt <= dcnt + 1;
|
end
|
end
|
end
|
end
|
|
|
assign empty_o = (dcnt == 0);
|
assign empty_o = (dcnt == 0);
|
assign full_o = (dcnt == FIFO_SIZE);
|
assign full_o = (dcnt == FIFO_SIZE);
|
|
|
assign empty = empty_o;
|
assign empty = empty_o;
|
assign full = full_o;
|
assign full = full_o;
|
|
|
|
|