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

Subversion Repositories sgmii

[/] [sgmii/] [trunk/] [src/] [mSGMII.v] - Blame information for rev 3

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

Line No. Rev Author Line
1 2 jefflieu
/*
2 3 jefflieu
Developed By Jeff Lieu (lieumychuong@gmail.com)
3 2 jefflieu
File            :
4
Description     :
5
        This core implements:
6
        B1000-X Standard
7
        PCS/PMA of SGMII MAC Side
8
Remarks         :
9
Revision        :
10
        Date    Author          Description
11
02/09/12        Jefflieu
12
*/
13
 
14
`timescale 1ns/10ps
15
`include "SGMIIDefs.v"
16
 
17
module mSGMII
18
(
19
        //Tranceiver Interface
20
        input   i_SerRx,
21
        output  o_SerTx,
22
        input   i_CalClk,
23
        input   i_RefClk125M,
24
        input   i_ARstHardware_L,
25
 
26
        //Local BUS interface
27
        //Wishbonebus, single transaction mode (non-pipeline slave)
28
        input   i_Cyc,
29
        input   i_Stb,
30
        input   i_WEn,
31
        input   [31:00]         i32_WrData,
32
        input   [07:00]         iv_Addr,
33
        output  [31:00]         o32_RdData,
34
        output  o_Ack,
35
 
36
        input   i_Mdc,
37
        inout   io_Mdio,
38
 
39
        output  o_Linkup,
40
        output  o_ANDone,
41
 
42
        output  [1:0] o2_SGMIISpeed,
43
        output  o_SGMIIDuplex,
44
 
45
        //GMII Interface
46
        input   [07:00] i8_TxD,
47
        input   i_TxEN,
48
        input   i_TxER,
49
        output  [07:00] o8_RxD,
50
        output  o_RxDV,
51
        output  o_RxER,
52
        output  o_GMIIClk,
53
        output  o_MIIClk,
54
        output  o_Col,
55
        output  o_Crs);
56
 
57
        wire    w_ClkSys;
58
        wire    w_Loopback;
59
        reg             r_RestartAN;
60
        wire    w_ANEnable;
61
        wire    [15:00] w16_Status;
62
        wire    w_MIIRst_L;
63
        wire    w_ANComplete;
64
 
65
        wire    [07:00] w8_RxCG_SyncToRxver;
66
        wire    w_RxCGInv_SyncToRxver;
67
        wire    w_RxCGCtrl_SyncToRxver;
68
        wire    w_SyncStatus,w_RxEven,w_IsComma,w_OSValid;
69
        wire    w_IsI1Set,w_IsI2Set,w_IsC1Set,w_IsC2Set,w_IsTSet,w_IsVSet,w_IsSSet,w_IsRSet;
70
 
71
        wire    w_Receiving;
72
        wire    w_Transmitting;
73
        wire    w_CheckEndKDK,w_CheckEndKD21_5D0_0,w_CheckEndKD2_2D0_0,w_CheckEndTRK,w_CheckEndTRR,w_CheckEndRRR,w_CheckEndRRK,w_CheckEndRRS;
74
        reg             r_CheckEndKDK,r_CheckEndKD21_5D0_0,r_CheckEndKD2_2D0_0,r_CheckEndTRK,r_CheckEndTRR,r_CheckEndRRR,r_CheckEndRRK,r_CheckEndRRS;
75
 
76
        wire    [2:0] w3_XmitState;
77
        wire    [16:01] w16_TxConfigReg;
78
        wire    [15:00] w16_RxConfigReg;
79
        wire    [15:00] w16_LcAdvAbility;
80
        wire    [15:00] w16_LpAdvAbility;
81
        wire    w_RUDIConfig;
82
        wire    w_RUDIIdle;
83
        wire    w_RUDIInvalid;
84
        wire    w_ARstLogic_L;
85
        wire    w_MIIReset_L;
86
        wire    w_ANRestart;
87
        //This delay stage is for the function checkend
88
        reg     [07:00] r8_RxCodeGroup[0:2];
89
        reg     r_RxCgInvalid[0:2];
90
        reg     r_RxCgCtrl[0:2];
91
        wire    [2:0] w3_PreCheckIsSSet;
92
        wire    [2:0] w3_PreCheckIsTSet;
93
        wire    [2:0] w3_PreCheckIsRSet;
94
        wire    [2:0] w3_PreCheckIsComma;
95
        wire    [2:0] w3_PreCheckIsD21_5;
96
        wire    [2:0] w3_PreCheckIsD2_2;
97
        wire    [2:0] w3_PreCheckIsD;
98
        wire    [2:0] w3_PreCheckIsD0_0;
99
        wire    w_GxBPowerDown;
100
        wire    w_TxCodeCtrl, w_TxCodeValid, w_RxCodeInvalid, w_RxCodeCtrl;
101
        wire    [07:00] w8_TxCode, w8_RxCode;
102
        wire    w_SignalDetect;
103
        wire    w_TxForceNegDisp;
104
        wire    w_PllLocked;
105
        wire    [20:00] w21_LinkTimer;
106
        wire    w_TxEN,w_TxER,w_RxER, w_RxDV;
107
        wire    [07:00] w8_RxD, w8_TxD;
108
 
109
        //MII Clock Gen
110
        reg [6:0]        r7_Cntr;
111
        reg r_MIIClk;
112
        reg r_MIIClk_D;
113
        wire w_SamplingClk;
114
 
115
        integer DELAY;
116
 
117
        assign o_Linkup = w_SyncStatus;
118
        assign o_ANDone = w_ANComplete;
119
 
120
        mRateAdapter    u0RateAdapter(
121
        //MAC Side signal
122
        .i_TxClk                (o_MIIClk),
123
        .i_TxEN                 (i_TxEN ),
124
        .i_TxER                 (i_TxER ),
125
        .i8_TxD                 (i8_TxD ),
126
        .i_RxClk                (o_MIIClk),
127
        .o_RxEN                 (o_RxDV),
128
        .o_RxER                 (o_RxER),
129
        .o8_RxD                 (o8_RxD),
130
        .i2_Speed               (o2_SGMIISpeed),
131
        //SGMII PHY side
132
        .i_SamplingClk  (w_SamplingClk),
133
        .i_GClk                 (w_ClkSys),
134
        .o_TxEN                 (w_TxEN),
135
        .o_TxER                 (w_TxER),
136
        .o8_TxD                 (w8_TxD),
137
        .i_RxEN                 (w_RxDV),
138
        .i_RxER                 (w_RxER),
139
        .i8_RxD                 (w8_RxD));
140
 
141
        generate
142
                genvar STAGE;
143
                for(STAGE=0;STAGE<3;STAGE=STAGE+1)
144
                begin
145
                        assign w3_PreCheckIsComma[STAGE]        = (r_RxCgInvalid[STAGE]==1'b0 && r_RxCgCtrl[STAGE]==1'b1 && r8_RxCodeGroup[STAGE]==`K28_5)?1'b1:1'b0;
146
                        assign w3_PreCheckIsTSet[STAGE]         = (r_RxCgInvalid[STAGE]==1'b0 && r_RxCgCtrl[STAGE]==1'b1 && r8_RxCodeGroup[STAGE]==`K29_7)?1'b1:1'b0;
147
                        assign w3_PreCheckIsRSet[STAGE]         = (r_RxCgInvalid[STAGE]==1'b0 && r_RxCgCtrl[STAGE]==1'b1 && r8_RxCodeGroup[STAGE]==`K23_7)?1'b1:1'b0;
148
                        assign w3_PreCheckIsD21_5[STAGE]        = (r_RxCgInvalid[STAGE]==1'b0 && r_RxCgCtrl[STAGE]==1'b0 && r8_RxCodeGroup[STAGE]==`D21_5)?1'b1:1'b0;
149
                        assign w3_PreCheckIsD2_2[STAGE]         = (r_RxCgInvalid[STAGE]==1'b0 && r_RxCgCtrl[STAGE]==1'b0 && r8_RxCodeGroup[STAGE]==`D2_2)?1'b1:1'b0;
150
                        assign w3_PreCheckIsD[STAGE]            = (r_RxCgInvalid[STAGE]==1'b0 && r_RxCgCtrl[STAGE]==1'b0)?1'b1:1'b0;
151
                        assign w3_PreCheckIsD0_0[STAGE]         = (r_RxCgInvalid[STAGE]==1'b0 && r_RxCgCtrl[STAGE]==1'b0 && r8_RxCodeGroup[STAGE]==`D0_0)?1'b1:1'b0;
152
                        assign w3_PreCheckIsSSet[STAGE]         = (r_RxCgInvalid[STAGE]==1'b0 && r_RxCgCtrl[STAGE]==1'b1 && r8_RxCodeGroup[STAGE]==`K27_7)?1'b1:1'b0;
153
                end
154
        endgenerate
155
 
156
        assign w_CheckEndKDK            = w3_PreCheckIsComma[2] & w3_PreCheckIsD[1]&w3_PreCheckIsComma[0];
157
        assign w_CheckEndRRR            = &(w3_PreCheckIsRSet);
158
        assign w_CheckEndTRK            = w3_PreCheckIsTSet[2] & w3_PreCheckIsRSet[1] & w3_PreCheckIsComma[0];
159
        assign w_CheckEndTRR            = w3_PreCheckIsTSet[2] & w3_PreCheckIsRSet[1] & w3_PreCheckIsRSet[0];
160
        assign w_CheckEndKD21_5D0_0     = w3_PreCheckIsComma[2] & w3_PreCheckIsD21_5[1] & w3_PreCheckIsD2_2[0];
161
        assign w_CheckEndKD2_2D0_0      = w3_PreCheckIsComma[2] & w3_PreCheckIsD2_2[1] & w3_PreCheckIsD2_2[0];
162
        assign w_CheckEndRRK            = w3_PreCheckIsRSet[2] & w3_PreCheckIsRSet[1] & w3_PreCheckIsComma[0];
163
        assign w_CheckEndRRS            = w3_PreCheckIsRSet[2] & w3_PreCheckIsRSet[1] & w3_PreCheckIsSSet[0];
164
 
165
        always@(posedge w_ClkSys)
166
                begin
167
                        r8_RxCodeGroup[0]        <= w8_RxCode;
168
                        r_RxCgCtrl[0]            <= w_RxCodeCtrl;
169
                        r_RxCgInvalid[0]         <= w_RxCodeInvalid;
170
                        for(DELAY=1;DELAY<3;DELAY=DELAY+1)
171
                                begin
172
                                r8_RxCodeGroup[DELAY]   <= r8_RxCodeGroup[DELAY-1];
173
                                r_RxCgInvalid[DELAY]    <= r_RxCgInvalid[DELAY-1];
174
                                r_RxCgCtrl[DELAY]               <= r_RxCgCtrl[DELAY-1];
175
                                end
176
                end
177
 
178
        assign o_Col = w_Transmitting & w_Receiving;
179
        assign o_Crs = 1'b0;
180
        assign w_ARstLogic_L    = w_PllLocked & i_ARstHardware_L & (w_MIIRst_L);
181
        mRegisters      u0Registers(
182
        .w_ARstLogic_L  (w_ARstLogic_L),
183
        .i_Clk                  (w_ClkSys),
184
        .i_Cyc                  (i_Cyc),
185
        .i_Stb                  (i_Stb),
186
        .i_WEn                  (i_WEn),
187
        .i8_Addr                (iv_Addr),
188
        .i32_WrData             (i32_WrData),
189
        .o32_RdData             (o32_RdData),
190
        .o_Ack                  (o_Ack),
191
        .o_Stall                (o_Stall),
192
 
193
        .io_Mdio                (io_Mdio),
194
        .i_Mdc                  (i_Mdc),
195
 
196
        //Register in and out,
197
 
198
        //MAC-Side SGMII
199
        .o2_SGMIISpeed          (o2_SGMIISpeed),
200
        .o_SGMIIDuplex          (o_SGMIIDuplex),
201
 
202
        //Phy-Side SGMII
203
        .i_PhyLink                      (i_PhyLink      ),
204
        .i_PhyDuplex            (i_PhyDuplex),
205
        .i2_PhySpeed            (i2_PhySpeed),
206
        .o21_LinkTimer          (w21_LinkTimer),
207
 
208
        .i16_TxConfigReg        (w16_TxConfigReg),
209
        .o_MIIRst_L                     (w_MIIRst_L),
210
        .o_ANEnable                     (w_ANEnable),
211
        .o_ANRestart            (w_ANRestart),
212
        .o_Loopback                     (w_Loopback),
213
        .o_GXBPowerDown         (w_GxBPowerDown),
214
        .o16_LcAdvAbility       (w16_LcAdvAbility),
215
        .i3_XmitState           (w3_XmitState),
216
        .i_SyncStatus           (w_SyncStatus),
217
        .i_ANComplete           (w_ANComplete),
218
        .i16_LpAdvAbility       (w16_LpAdvAbility));
219
 
220
         mSyncCtrl u0SyncCtrl(
221
        .i_Clk                          (w_ClkSys               ),
222
        .i_Cke                          ((~w_GxBPowerDown)      ),
223
        .i_ARst_L                       (w_ARstLogic_L  ),
224
        .i_CtrlLoopBack         (w_Loopback             ),
225
 
226
        .i8_RxCodeGroupIn       (r8_RxCodeGroup[2]      ),
227
        .i_RxCodeInvalid        (r_RxCgInvalid[2]       ),
228
        .i_RxCodeCtrl           (r_RxCgCtrl[2]          ),
229
        .i_SignalDetect         (w_SignalDetect         ),
230
 
231
        .o8_RxCodeGroupOut      (w8_RxCG_SyncToRxver    ),
232
        .o_RxCodeInvalid        (w_RxCGInv_SyncToRxver  ),
233
        .o_RxCodeCtrl           (w_RxCGCtrl_SyncToRxver ),
234
        .o_RxEven                       (w_RxEven                               ),
235
        .o_SyncStatus           (w_SyncStatus                   ),
236
        .o_BitSlip                      (),
237
        .o_IsComma                      (w_IsComma      ),
238
        .o_OrderedSetValid      (w_OSValid      ),
239
        .o_IsI1Set                      (w_IsI1Set      ),
240
        .o_IsI2Set                      (w_IsI2Set      ),
241
        .o_IsC1Set                      (w_IsC1Set      ),
242
        .o_IsC2Set                      (w_IsC2Set      ),
243
        .o_IsTSet                       (w_IsTSet       ),
244
        .o_IsVSet                       (w_IsVSet       ),
245
        .o_IsSSet                       (w_IsSSet       ),
246
        .o_IsRSet                       (w_IsRSet       ));
247
 
248
        always@(posedge w_ClkSys)
249
        begin
250
        r_CheckEndKDK                   <= w_CheckEndKDK;
251
        r_CheckEndKD21_5D0_0    <= w_CheckEndKD21_5D0_0;
252
        r_CheckEndKD2_2D0_0         <= w_CheckEndKD2_2D0_0;
253
        r_CheckEndTRK                   <= w_CheckEndTRK;
254
        r_CheckEndTRR                   <= w_CheckEndTRR;
255
        r_CheckEndRRR                   <= w_CheckEndRRR;
256
        r_CheckEndRRK                   <= w_CheckEndRRK;
257
        r_CheckEndRRS                   <= w_CheckEndRRS;
258
        end
259
 
260
        mReceive        u0Receive(
261
        .i8_RxCodeGroupIn               (w8_RxCG_SyncToRxver    ),
262
        .i_RxCodeInvalid        (w_RxCGInv_SyncToRxver  ),
263
        .i_RxCodeCtrl           (w_RxCGCtrl_SyncToRxver ),
264
        .i_RxEven                       (w_RxEven                               ),
265
 
266
        .i3_Xmit                                (w3_XmitState),
267
 
268
        .i_IsComma                              (w_IsComma      ),
269
        .i_OrderedSetValid      (w_OSValid      ),
270
        .i_IsI1Set              (w_IsI1Set      ),
271
        .i_IsI2Set              (w_IsI2Set      ),
272
        .i_IsC1Set              (w_IsC1Set      ),
273
        .i_IsC2Set              (w_IsC2Set      ),
274
        .i_IsTSet               (w_IsTSet       ),
275
        .i_IsVSet               (w_IsVSet       ),
276
        .i_IsSSet               (w_IsSSet       ),
277
        .i_IsRSet               (w_IsRSet       ),
278
 
279
        .i_CheckEndKDK                  (r_CheckEndKDK                  ),
280
        .i_CheckEndKD21_5D0_0   (r_CheckEndKD21_5D0_0   ),
281
        .i_CheckEndKD2_2D0_0    (r_CheckEndKD2_2D0_0    ),
282
        .i_CheckEndTRK                  (r_CheckEndTRK                  ),
283
        .i_CheckEndTRR                  (r_CheckEndTRR                  ),
284
        .i_CheckEndRRR                  (r_CheckEndRRR                  ),
285
        .i_CheckEndRRK                  (r_CheckEndRRK                  ),
286
        .i_CheckEndRRS                  (r_CheckEndRRS                  ),
287
 
288
        .o16_RxConfigReg        (w16_RxConfigReg),
289
        .o_RUDIConfig           (w_RUDIConfig),
290
        .o_RUDIIdle                     (w_RUDIIdle),
291
        .o_RUDIInvalid          (w_RUDIInvalid),
292
 
293
        .o_RxDV                         (w_RxDV ),
294
        .o_RxER                         (w_RxER ),
295
        .o8_RxD                         (w8_RxD ),
296
        .o_Invalid                      (o_Invalid),
297
        .o_Receiving            (w_Receiving),
298
        .i_Clk                          (w_ClkSys),
299
        .i_ARst_L                       (w_ARstLogic_L));
300
 
301
        mANCtrl u0ANCtrl(
302
        .i_Clk                          (w_ClkSys                       ),
303
        .i_ARst_L                       (w_ARstLogic_L          ),
304
        .i_Cke                          ((~i_PwrDown)           ),
305
        .i_RestartAN            (w_ANRestart            ),
306
        .i_SyncStatus           (w_SyncStatus           ),
307
        .i_ANEnable                     (w_ANEnable                     ),
308
        .i21_LinkTimer          (w21_LinkTimer          ),
309
        .i16_LcAdvAbility       (w16_LcAdvAbility       ),
310
        .o16_LpAdvAbility       (w16_LpAdvAbility       ),
311
        .o_ANComplete           (w_ANComplete           ),
312
        .i16_RxConfigReg        (w16_RxConfigReg        ),
313
        .i_RUDIConfig           (w_RUDIConfig           ),
314
        .i_RUDIIdle                     (w_RUDIIdle                     ),
315
        .i_RUDIInvalid          (w_RUDIInvalid          ),
316
        .o3_Xmit                        (w3_XmitState           ),
317
        .o16_TxConfigReg        (w16_TxConfigReg        ));
318
 
319
        mTransmit       u0Transmit(
320
        .i3_Xmit                        (w3_XmitState           ),
321
        .i16_ConfigReg          (w16_TxConfigReg        ),
322
 
323
        .i_TxEN                         (w_TxEN                         ),
324
        .i_TxER                         (w_TxER                         ),
325
        .i8_TxD                         (w8_TxD                         ),
326
 
327
 
328
        .o_Xmitting                     (w_Transmitting         ),
329
        .o_TxEven                       (w_TxEven                       ),
330
        .o8_TxCodeGroupOut      (w8_TxCode                      ),
331
        .o_TxCodeValid          (w_TxCodeValid          ),
332
        .o_TxCodeCtrl           (w_TxCodeCtrl           ),
333
        .i_CurrentParity        (w_CurrentParity        ),
334
 
335
        .i_Clk                          (w_ClkSys                       ),
336
        .i_ARst_L                       (w_ARstLogic_L          ));
337
 
338 3 jefflieu
        assign w_SignalDetect=~w_RxCodeInvalid;
339 2 jefflieu
 
340
        mXcver u0Xcver(
341
 
342
        .i_SerRx                        (i_SerRx                        ),
343
        .o_SerTx                        (o_SerTx                        ),
344
 
345
        .i_RefClk125M           (i_RefClk125M           ),
346
        .o_TxClk                        (w_ClkSys                       ),
347
        .i_CalClk                       (i_CalClk                       ),
348
        .i_GxBPwrDwn            (w_GxBPowerDown         ),
349
        .i_XcverDigitalRst      (~w_ARstLogic_L         ),
350
        .o_PllLocked            (w_PllLocked            ),
351
 
352 3 jefflieu
        .o_SignalDetect         (),
353 2 jefflieu
        .o8_RxCodeGroup         (w8_RxCode                      ),
354
        .o_RxCodeInvalid        (w_RxCodeInvalid        ),
355
        .o_RxCodeCtrl           (w_RxCodeCtrl           ),
356
 
357
        .i8_TxCodeGroup         (w8_TxCode                      ),
358
        .i_TxCodeValid          (w_TxCodeValid          ),
359
        .i_TxCodeCtrl           (w_TxCodeCtrl           ),
360
        .i_TxForceNegDisp       (w_TxForceNegDisp       ),
361
        .o_RunningDisparity     (w_CurrentParity));
362
 
363
        assign o_GMIIClk = w_ClkSys;
364
 
365
        always@(posedge w_ClkSys)
366
        begin
367
                if(o2_SGMIISpeed==2'b01)
368
                        begin
369
                        if(r7_Cntr==7'h4) r7_Cntr<=7'h0; else r7_Cntr<=r7_Cntr+7'h1;
370
                        if(r7_Cntr==7'h4) r_MIIClk<=1'b1; else if(r7_Cntr==7'h1) r_MIIClk<=1'b0;
371
                        end
372
                else if(o2_SGMIISpeed==2'b00)
373
                        begin
374
                        if(r7_Cntr==7'h49) r7_Cntr<=7'h0; else r7_Cntr<=r7_Cntr+7'h1;
375
                        if(r7_Cntr==7'h49) r_MIIClk<=1'b1; else if(r7_Cntr==7'h24) r_MIIClk<=1'b0;
376
                        end
377
                r_MIIClk_D <= r_MIIClk;
378
        end
379
        assign w_SamplingClk = (r_MIIClk_D & (~r_MIIClk));
380
 
381
        //Insert Clock Buffer or PLL if necessary
382
        mClkBuf u0ClkBuf(.i_Clk(r_MIIClk),.o_Clk(o_MIIClk));
383
 
384
endmodule
385
 
386
 
387
 
388
 
389
 

powered by: WebSVN 2.1.0

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