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] - Blame information for rev 20

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 9 jefflieu
// -------------------------------------------------------------------------
2
// -------------------------------------------------------------------------
3
//
4
// Revision Control Information
5
//
6
// $RCSfile: timing_adapter_fifo_32.v,v $
7
// $Source: /ipbu/cvs/sio/projects/TriSpeedEthernet/src/testbench/models/verilog/ethernet_model/gen/timing_adapter_fifo_32.v,v $
8
//
9
// $Revision: #1 $
10 20 jefflieu
// $Date: 2012/06/21 $
11
// Check in by : $Author: swbranch $
12 9 jefflieu
// Author      : SKNg/TTChong
13
//
14
// Project     : Triple Speed Ethernet - 10/100/1000 MAC
15
//
16
// Description : (Simulation only)
17
//
18
// Timing adapter FIFO  
19
//
20
// 
21
// ALTERA Confidential and Proprietary
22
// Copyright 2006 (c) Altera Corporation
23
// All rights reserved
24
//
25
// -------------------------------------------------------------------------
26
// -------------------------------------------------------------------------
27
 
28
//  --------------------------------------------------------------------------------
29
// | simple_atlantic_fifo
30
//  --------------------------------------------------------------------------------
31
 
32
`timescale 1ns / 1ps
33
module timing_adapter_fifo_32 (
34
      output reg [ 3: 0] fill_level ,
35
 
36
      // Interface: clock
37
      input              clk,
38
      input              reset,
39
      // Interface: data_in
40
      output reg         in_ready,
41
      input              in_valid,
42
      input      [36: 0] in_data,
43
      // Interface: data_out
44
      input              out_ready,
45
      output reg         out_valid,
46
      output reg [36: 0] out_data
47
);
48
 
49
   // ---------------------------------------------------------------------
50
   //| Internal Parameters
51
   // ---------------------------------------------------------------------
52
   parameter DEPTH = 8;
53
   parameter DATA_WIDTH = 37;
54
   parameter ADDR_WIDTH = 3;
55
 
56
   // ---------------------------------------------------------------------
57
   //| Signals
58
   // ---------------------------------------------------------------------
59
   reg [ADDR_WIDTH-1:0] wr_addr;
60
   reg [ADDR_WIDTH-1:0] rd_addr;
61
   reg [ADDR_WIDTH-1:0] next_wr_addr;
62
   reg [ADDR_WIDTH-1:0] next_rd_addr;
63
   reg [ADDR_WIDTH-1:0] mem_rd_addr;
64
   reg [DATA_WIDTH-1:0] mem[DEPTH-1:0];
65
   reg empty;
66
   reg full;
67
   reg out_ready_vector;
68
 
69
   // ---------------------------------------------------------------------
70
   //| FIFO Status
71
   // ---------------------------------------------------------------------
72
   always @(out_ready or wr_addr or rd_addr or full)
73
   begin
74
//      out_valid = !empty;
75
      out_ready_vector = out_ready;
76
      in_ready  = !full;
77
      next_wr_addr = wr_addr + 1;
78
      next_rd_addr = rd_addr + 1;
79
      fill_level[ADDR_WIDTH-1:0] = wr_addr - rd_addr;
80
      fill_level[ADDR_WIDTH] = 0;
81
 
82
      if (full)
83
           fill_level = DEPTH;
84
 
85
   end
86
 
87
   // ---------------------------------------------------------------------
88
   //| Manage Pointers
89
   // ---------------------------------------------------------------------
90
   always @ (posedge reset or posedge clk)
91
   begin
92
      if (reset)
93
        begin
94
             wr_addr  <= 0;
95
             rd_addr  <= 0;
96
             empty    <= 1;
97
             rd_addr  <= 0;
98
             full     <= 0;
99
             out_valid<= 0;
100
        end
101
      else
102
       begin
103
         out_valid <= !empty;
104
         if (in_ready && in_valid)
105
          begin
106
            wr_addr <= next_wr_addr;
107
            empty   <= 0;
108
            if (next_wr_addr == rd_addr)
109
              full <= 1;
110
          end
111
 
112
         if (out_ready_vector && out_valid)
113
          begin
114
            rd_addr <= next_rd_addr;
115
            full    <= 0;
116
            if (next_rd_addr == wr_addr)
117
             begin
118
               empty <= 1;
119
               out_valid <= 0;
120
             end
121
          end
122
 
123
         if (out_ready_vector && out_valid && in_ready && in_valid)
124
          begin
125
            full  <= full;
126
            empty <= empty;
127
          end
128
       end
129
   end // always @ (posedge reset, posedge clk)
130
 
131
 
132
   always @ (rd_addr or out_ready or out_valid or next_rd_addr)
133
   begin
134
      mem_rd_addr = rd_addr;
135
      if (out_ready && out_valid)
136
      begin
137
        mem_rd_addr = next_rd_addr;
138
      end
139
   end
140
 
141
 
142
   // ---------------------------------------------------------------------
143
   //| Infer Memory
144
   // ---------------------------------------------------------------------
145
   always @ (posedge reset or posedge clk)
146
   begin
147
      if (reset)
148
        mem[0] <= 38'h0;
149
      else
150
       begin
151
           if (in_ready && in_valid)
152
            mem[wr_addr] <= in_data;
153
       end
154
      out_data = mem[mem_rd_addr];
155
   end
156
 
157
endmodule // 
158
 
159
 
160
 

powered by: WebSVN 2.1.0

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