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

Subversion Repositories sgmii

[/] [sgmii/] [trunk/] [sim/] [BFMs/] [SGMII_altera/] [testbench/] [model/] [timing_adapter_fifo_8.v] - Blame information for rev 9

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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