// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
//
|
//
|
// Revision Control Information
|
// Revision Control Information
|
//
|
//
|
// $RCSfile: timing_adapter_fifo_32.v,v $
|
// $RCSfile: timing_adapter_fifo_32.v,v $
|
// $Source: /ipbu/cvs/sio/projects/TriSpeedEthernet/src/testbench/models/verilog/ethernet_model/gen/timing_adapter_fifo_32.v,v $
|
// $Source: /ipbu/cvs/sio/projects/TriSpeedEthernet/src/testbench/models/verilog/ethernet_model/gen/timing_adapter_fifo_32.v,v $
|
//
|
//
|
// $Revision: #1 $
|
// $Revision: #1 $
|
// $Date: 2011/11/10 $
|
// $Date: 2012/06/21 $
|
// Check in by : $Author: max $
|
// Check in by : $Author: swbranch $
|
// Author : SKNg/TTChong
|
// Author : SKNg/TTChong
|
//
|
//
|
// Project : Triple Speed Ethernet - 10/100/1000 MAC
|
// Project : Triple Speed Ethernet - 10/100/1000 MAC
|
//
|
//
|
// Description : (Simulation only)
|
// Description : (Simulation only)
|
//
|
//
|
// Timing adapter FIFO
|
// Timing adapter FIFO
|
//
|
//
|
//
|
//
|
// ALTERA Confidential and Proprietary
|
// ALTERA Confidential and Proprietary
|
// Copyright 2006 (c) Altera Corporation
|
// Copyright 2006 (c) Altera Corporation
|
// All rights reserved
|
// All rights reserved
|
//
|
//
|
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
|
|
// --------------------------------------------------------------------------------
|
// --------------------------------------------------------------------------------
|
// | simple_atlantic_fifo
|
// | simple_atlantic_fifo
|
// --------------------------------------------------------------------------------
|
// --------------------------------------------------------------------------------
|
|
|
`timescale 1ns / 1ps
|
`timescale 1ns / 1ps
|
module timing_adapter_fifo_32 (
|
module timing_adapter_fifo_32 (
|
output reg [ 3: 0] fill_level ,
|
output reg [ 3: 0] fill_level ,
|
|
|
// Interface: clock
|
// Interface: clock
|
input clk,
|
input clk,
|
input reset,
|
input reset,
|
// Interface: data_in
|
// Interface: data_in
|
output reg in_ready,
|
output reg in_ready,
|
input in_valid,
|
input in_valid,
|
input [36: 0] in_data,
|
input [36: 0] in_data,
|
// Interface: data_out
|
// Interface: data_out
|
input out_ready,
|
input out_ready,
|
output reg out_valid,
|
output reg out_valid,
|
output reg [36: 0] out_data
|
output reg [36: 0] out_data
|
);
|
);
|
|
|
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
//| Internal Parameters
|
//| Internal Parameters
|
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
parameter DEPTH = 8;
|
parameter DEPTH = 8;
|
parameter DATA_WIDTH = 37;
|
parameter DATA_WIDTH = 37;
|
parameter ADDR_WIDTH = 3;
|
parameter ADDR_WIDTH = 3;
|
|
|
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
//| Signals
|
//| Signals
|
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
reg [ADDR_WIDTH-1:0] wr_addr;
|
reg [ADDR_WIDTH-1:0] wr_addr;
|
reg [ADDR_WIDTH-1:0] rd_addr;
|
reg [ADDR_WIDTH-1:0] rd_addr;
|
reg [ADDR_WIDTH-1:0] next_wr_addr;
|
reg [ADDR_WIDTH-1:0] next_wr_addr;
|
reg [ADDR_WIDTH-1:0] next_rd_addr;
|
reg [ADDR_WIDTH-1:0] next_rd_addr;
|
reg [ADDR_WIDTH-1:0] mem_rd_addr;
|
reg [ADDR_WIDTH-1:0] mem_rd_addr;
|
reg [DATA_WIDTH-1:0] mem[DEPTH-1:0];
|
reg [DATA_WIDTH-1:0] mem[DEPTH-1:0];
|
reg empty;
|
reg empty;
|
reg full;
|
reg full;
|
reg out_ready_vector;
|
reg out_ready_vector;
|
|
|
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
//| FIFO Status
|
//| FIFO Status
|
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
always @(out_ready or wr_addr or rd_addr or full)
|
always @(out_ready or wr_addr or rd_addr or full)
|
begin
|
begin
|
// out_valid = !empty;
|
// out_valid = !empty;
|
out_ready_vector = out_ready;
|
out_ready_vector = out_ready;
|
in_ready = !full;
|
in_ready = !full;
|
next_wr_addr = wr_addr + 1;
|
next_wr_addr = wr_addr + 1;
|
next_rd_addr = rd_addr + 1;
|
next_rd_addr = rd_addr + 1;
|
fill_level[ADDR_WIDTH-1:0] = wr_addr - rd_addr;
|
fill_level[ADDR_WIDTH-1:0] = wr_addr - rd_addr;
|
fill_level[ADDR_WIDTH] = 0;
|
fill_level[ADDR_WIDTH] = 0;
|
|
|
if (full)
|
if (full)
|
fill_level = DEPTH;
|
fill_level = DEPTH;
|
|
|
end
|
end
|
|
|
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
//| Manage Pointers
|
//| Manage Pointers
|
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
always @ (posedge reset or posedge clk)
|
always @ (posedge reset or posedge clk)
|
begin
|
begin
|
if (reset)
|
if (reset)
|
begin
|
begin
|
wr_addr <= 0;
|
wr_addr <= 0;
|
rd_addr <= 0;
|
rd_addr <= 0;
|
empty <= 1;
|
empty <= 1;
|
rd_addr <= 0;
|
rd_addr <= 0;
|
full <= 0;
|
full <= 0;
|
out_valid<= 0;
|
out_valid<= 0;
|
end
|
end
|
else
|
else
|
begin
|
begin
|
out_valid <= !empty;
|
out_valid <= !empty;
|
if (in_ready && in_valid)
|
if (in_ready && in_valid)
|
begin
|
begin
|
wr_addr <= next_wr_addr;
|
wr_addr <= next_wr_addr;
|
empty <= 0;
|
empty <= 0;
|
if (next_wr_addr == rd_addr)
|
if (next_wr_addr == rd_addr)
|
full <= 1;
|
full <= 1;
|
end
|
end
|
|
|
if (out_ready_vector && out_valid)
|
if (out_ready_vector && out_valid)
|
begin
|
begin
|
rd_addr <= next_rd_addr;
|
rd_addr <= next_rd_addr;
|
full <= 0;
|
full <= 0;
|
if (next_rd_addr == wr_addr)
|
if (next_rd_addr == wr_addr)
|
begin
|
begin
|
empty <= 1;
|
empty <= 1;
|
out_valid <= 0;
|
out_valid <= 0;
|
end
|
end
|
end
|
end
|
|
|
if (out_ready_vector && out_valid && in_ready && in_valid)
|
if (out_ready_vector && out_valid && in_ready && in_valid)
|
begin
|
begin
|
full <= full;
|
full <= full;
|
empty <= empty;
|
empty <= empty;
|
end
|
end
|
end
|
end
|
end // always @ (posedge reset, posedge clk)
|
end // always @ (posedge reset, posedge clk)
|
|
|
|
|
always @ (rd_addr or out_ready or out_valid or next_rd_addr)
|
always @ (rd_addr or out_ready or out_valid or next_rd_addr)
|
begin
|
begin
|
mem_rd_addr = rd_addr;
|
mem_rd_addr = rd_addr;
|
if (out_ready && out_valid)
|
if (out_ready && out_valid)
|
begin
|
begin
|
mem_rd_addr = next_rd_addr;
|
mem_rd_addr = next_rd_addr;
|
end
|
end
|
end
|
end
|
|
|
|
|
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
//| Infer Memory
|
//| Infer Memory
|
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
always @ (posedge reset or posedge clk)
|
always @ (posedge reset or posedge clk)
|
begin
|
begin
|
if (reset)
|
if (reset)
|
mem[0] <= 38'h0;
|
mem[0] <= 38'h0;
|
else
|
else
|
begin
|
begin
|
if (in_ready && in_valid)
|
if (in_ready && in_valid)
|
mem[wr_addr] <= in_data;
|
mem[wr_addr] <= in_data;
|
end
|
end
|
out_data = mem[mem_rd_addr];
|
out_data = mem[mem_rd_addr];
|
end
|
end
|
|
|
endmodule //
|
endmodule //
|
|
|
|
|
|
|
|
|