OpenCores
URL https://opencores.org/ocsvn/sgmii/sgmii/trunk

Subversion Repositories sgmii

[/] [sgmii/] [trunk/] [sim/] [BFMs/] [SGMII_altera/] [testbench/] [model/] [timing_adapter_fifo_32.v] - Diff between revs 9 and 20

Only display areas with differences | Details | Blame | View Log

Rev 9 Rev 20
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
//
//
// 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 // 
 
 
 
 
 
 
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.