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

Subversion Repositories sgmii

[/] [sgmii/] [trunk/] [sim/] [BFMs/] [SGMII_altera/] [triple_speed_ethernet-library/] [altera_tse_rgmii_module.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: altera_tse_rgmii_module.v,v $
7
// $Source: /ipbu/cvs/sio/projects/TriSpeedEthernet/src/RTL/MAC/mac/rgmii/altera_tse_rgmii_module.v,v $
8
//
9
// $Revision: #1 $
10 20 jefflieu
// $Date: 2012/06/21 $
11
// Check in by : $Author: swbranch $
12 9 jefflieu
// Author      : Arul Paniandi
13
//
14
// Project     : Triple Speed Ethernet - 10/100/1000 MAC
15
//
16
// Description : 
17
//
18
// Top level RGMII interface (receive and transmit) module.
19
 
20
// 
21
// ALTERA Confidential and Proprietary
22
// Copyright 2006 (c) Altera Corporation
23
// All rights reserved
24
//
25
// -------------------------------------------------------------------------
26
// -------------------------------------------------------------------------
27
 
28
// synthesis translate_off
29
`timescale 1ns / 100ps
30
// synthesis translate_on
31
module altera_tse_rgmii_module /* synthesis ALTERA_ATTRIBUTE = "SUPPRESS_DA_RULE_INTERNAL=\"D103\"" */ (   // new ports to cater for mii with RGMII interface are added 
32
                      // inputs
33
                       rgmii_in,
34
                                           speed,
35
                                           //data
36
                       gm_tx_d,
37
                                           m_tx_d,
38
 
39
                                           //control
40
                       gm_tx_en,
41
                                           m_tx_en,
42
 
43
                       gm_tx_err,
44
                                           m_tx_err,
45
 
46
                       reset_rx_clk,
47
                       reset_tx_clk,
48
                       rx_clk,
49
                       rx_control,
50
                       tx_clk,
51
 
52
                      // outputs:
53
                       rgmii_out,
54
 
55
                                           gm_rx_d,
56
                                           m_rx_d,
57
 
58
                       gm_rx_dv,
59
                                           m_rx_en,
60
 
61
 
62
                       gm_rx_err,
63
                       m_rx_err,
64
 
65
                                           m_rx_col,
66
                                           m_rx_crs,
67
                                           tx_control
68
                    );
69
 
70
  parameter SYNCHRONIZER_DEPTH  = 3;                //  Number of synchronizer
71
 
72
  output  [  3: 0] rgmii_out;
73
  output  [  7: 0] gm_rx_d;
74
  output  [  3: 0] m_rx_d;
75
  output           gm_rx_dv;
76
  output           m_rx_en;
77
  output           gm_rx_err;
78
  output           m_rx_err;
79
  output           m_rx_col;
80
  output           m_rx_crs;
81
  output           tx_control;
82
 
83
  input   [  3: 0] rgmii_in;
84
  input            speed;
85
  input   [  7: 0] gm_tx_d;
86
  input   [  3: 0] m_tx_d;
87
  input            gm_tx_en;
88
  input            m_tx_en;
89
  input            gm_tx_err;
90
  input            m_tx_err;
91
  input            reset_rx_clk;
92
  input            reset_tx_clk;
93
  input            rx_clk;
94
  input            rx_control;
95
  input            tx_clk;
96
 
97
  wire    [  3: 0] rgmii_out;
98
  wire    [  7: 0] gm_rx_d;
99
  wire             gm_rx_dv;
100
  wire             m_rx_en;
101
  wire             gm_rx_err;
102
  wire             m_rx_err;
103
  wire                     m_rx_col;
104
  reg              m_rx_col_reg;
105
  reg              m_rx_crs;
106
 
107
  reg              rx_dv;
108
  reg              rx_err;
109
  wire             tx_control;
110
  //wire             tx_err;
111
  reg     [  7: 0] rgmii_out_4_wire;
112
  reg              rgmii_out_1_wire_inp1;
113
  reg              rgmii_out_1_wire_inp2;
114
 
115
  wire    [  7:0 ] rgmii_in_4_wire;
116
  reg     [  7:0 ] rgmii_in_4_reg;
117
  reg     [  7:0 ] rgmii_in_4_temp_reg;
118
  wire    [  1:0 ] rgmii_in_1_wire;
119
  reg     [  1:0 ] rgmii_in_1_temp_reg;
120
 
121
  reg m_tx_en_reg1;
122
  reg m_tx_en_reg2;
123
  reg m_tx_en_reg3;
124
  reg m_tx_en_reg4;
125
 
126
  assign gm_rx_d = rgmii_in_4_reg;
127
  assign m_rx_d  = rgmii_in_4_reg[3:0];  // mii is only 4 bits, data are duplicated so we only take one nibble
128
 
129
  altera_tse_rgmii_in4 the_rgmii_in4
130
    (
131
      .aclr (),         //INPUT
132
      .datain (rgmii_in),           //INPUT     
133
      .dataout_h (rgmii_in_4_wire[7 : 4]),  //OUTPUT
134
      .dataout_l (rgmii_in_4_wire[3 : 0]),  //OUTPUT
135
      .inclock (rx_clk)             //OUTPUT
136
    );
137
 
138
 
139
  altera_tse_rgmii_in1 the_rgmii_in1
140
    (
141
      .aclr (),            //INPUT
142
      .datain (rx_control),            //INPUT
143
      .dataout_h (rgmii_in_1_wire[1]), //INPUT    rx_err
144
      .dataout_l (rgmii_in_1_wire[0]), //OUTPUT   rx_dv
145
      .inclock (rx_clk)                //OUTPUT
146
    );
147
 
148
 
149
always @(posedge rx_clk or posedge reset_rx_clk)
150
    begin
151
        if (reset_rx_clk == 1'b1) begin
152
            rgmii_in_4_temp_reg <= {8{1'b0}};
153
            rgmii_in_1_temp_reg <= {2{1'b0}};
154
        end
155
        else begin
156
            rgmii_in_4_temp_reg <= rgmii_in_4_wire;
157
            rgmii_in_1_temp_reg <= rgmii_in_1_wire;
158
        end
159
    end
160
 
161
 
162
always @(posedge rx_clk or posedge reset_rx_clk)
163
    begin
164
        if (reset_rx_clk == 1'b1) begin
165
            rgmii_in_4_reg <= {8{1'b0}};
166
            rx_err <= 1'b0;
167
            rx_dv <= 1'b0;
168
        end
169
        else begin
170
            rgmii_in_4_reg <= {rgmii_in_4_wire[3:0], rgmii_in_4_temp_reg[7:4]};
171
            rx_err <= rgmii_in_1_wire[0];
172
            rx_dv <= rgmii_in_1_temp_reg[1];
173
        end
174
    end
175
 
176
 
177
always @(rx_dv or rx_err or rgmii_in_4_reg)
178
  begin
179
                m_rx_crs = 1'b0;
180
                if ((rx_dv == 1'b1) || (rx_dv == 1'b0 && rx_err == 1'b1 && rgmii_in_4_reg == 8'hFF ) || (rx_dv == 1'b0 && rx_err == 1'b1 && rgmii_in_4_reg == 8'h0E ) || (rx_dv == 1'b0 && rx_err == 1'b1 && rgmii_in_4_reg == 8'h0F ) || (rx_dv == 1'b0 && rx_err == 1'b1 && rgmii_in_4_reg == 8'h1F ) )
181
                begin
182
                        m_rx_crs = 1'b1;   // read RGMII specification data sheet , table 4 for the conditions where CRS should go high
183
                end
184
  end
185
 
186
always @(posedge tx_clk or posedge reset_tx_clk)
187
begin
188
        if(reset_tx_clk == 1'b1)
189
        begin
190
                m_tx_en_reg1 <= 1'b0;
191
                m_tx_en_reg2 <= 1'b0;
192
                m_tx_en_reg3 <= 1'b0;
193
                m_tx_en_reg4 <= 1'b0;
194
 
195
        end
196
        else
197
        begin
198
                m_tx_en_reg1 <= m_tx_en;
199
                m_tx_en_reg2 <= m_tx_en_reg1;
200
                m_tx_en_reg3 <= m_tx_en_reg2;
201
                m_tx_en_reg4 <= m_tx_en_reg3;
202
        end
203
 
204
end
205
 
206
 
207
 
208
always @(m_tx_en_reg4 or m_rx_crs or rx_dv)
209
begin
210
        m_rx_col_reg = 1'b0;
211
        if ( m_tx_en_reg4 == 1'b1 & (m_rx_crs == 1'b1 | rx_dv == 1'b1))
212
        begin
213
                m_rx_col_reg = 1'b1;
214
        end
215
end
216
 
217
altera_std_synchronizer #(SYNCHRONIZER_DEPTH) U_SYNC_1(
218
                        .clk(tx_clk), // INPUT
219
                        .reset_n(~reset_tx_clk), //INPUT
220
                        .din(m_rx_col_reg), //INPUT
221
                        .dout(m_rx_col));// OUTPUT
222
 
223
  assign gm_rx_err = rx_err ^ rx_dv;
224
  assign gm_rx_dv = rx_dv;
225
 
226
  assign m_rx_err = rx_err ^ rx_dv;
227
  assign m_rx_en = rx_dv;
228
 
229
    // mux for Out 4
230
  always @(*)
231
  begin
232
    case (speed)
233
      1'b1:  rgmii_out_4_wire = gm_tx_d;
234
      1'b0:  rgmii_out_4_wire = {m_tx_d,m_tx_d};
235
    endcase
236
  end
237
 
238
   // mux for Out 1
239
  always @(*)
240
  begin
241
    case (speed)
242
      1'b1:
243
                begin
244
                        rgmii_out_1_wire_inp1 = gm_tx_en; // gigabit
245
                        rgmii_out_1_wire_inp2 = gm_tx_en ^ gm_tx_err;
246
                end
247
      1'b0:
248
                begin
249
                        rgmii_out_1_wire_inp1 = m_tx_en;
250
                        rgmii_out_1_wire_inp2 = m_tx_en ^ m_tx_err;
251
                end
252
    endcase
253
  end
254
 
255
 
256
  altera_tse_rgmii_out4 the_rgmii_out4
257
    (
258
      .aclr (reset_tx_clk),         //INPUT
259
      .datain_h (rgmii_out_4_wire[3 : 0]),   //INPUT
260
      .datain_l (rgmii_out_4_wire[7 : 4]),   //INPUT
261
      .dataout (rgmii_out),         //INPUT
262
      .outclock (tx_clk)            //OUTPUT
263
    );
264
 
265
 
266
  //assign tx_err = gm_tx_en ^ gm_tx_err;
267
 
268
  altera_tse_rgmii_out1 the_rgmii_out1
269
    (
270
      .aclr (reset_tx_clk),         //INPUT
271
      .datain_h (rgmii_out_1_wire_inp1),         //INPUT
272
      .datain_l (rgmii_out_1_wire_inp2),           //INPUT     
273
      .dataout (tx_control),        //INPUT
274
      .outclock (tx_clk)            //OUTPUT
275
    );
276
 
277
 
278
 
279
endmodule
280
 

powered by: WebSVN 2.1.0

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