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

Subversion Repositories turbo8051

[/] [turbo8051/] [trunk/] [rtl/] [gmac/] [mac/] [g_mii_intf.v] - Blame information for rev 76

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

Line No. Rev Author Line
1 12 dinesha
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  Tubo 8051 cores MAC Interface Module                        ////
4
////                                                              ////
5
////  This file is part of the Turbo 8051 cores project           ////
6
////  http://www.opencores.org/cores/turbo8051/                   ////
7
////                                                              ////
8
////  Description                                                 ////
9
////  Turbo 8051 definitions.                                     ////
10
////                                                              ////
11
////  To Do:                                                      ////
12
////    nothing                                                   ////
13
////                                                              ////
14
////  Author(s):                                                  ////
15
////      - Dinesh Annayya, dinesha@opencores.org                 ////
16
////                                                              ////
17 76 dinesha
////  Revision : Mar 2, 2011                                      //// 
18
////                                                              ////
19 12 dinesha
//////////////////////////////////////////////////////////////////////
20
////                                                              ////
21
//// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////
22
////                                                              ////
23
//// This source file may be used and distributed without         ////
24
//// restriction provided that this copyright statement is not    ////
25
//// removed from the file and that any derivative work contains  ////
26
//// the original copyright notice and the associated disclaimer. ////
27
////                                                              ////
28
//// This source file is free software; you can redistribute it   ////
29
//// and/or modify it under the terms of the GNU Lesser General   ////
30
//// Public License as published by the Free Software Foundation; ////
31
//// either version 2.1 of the License, or (at your option) any   ////
32
//// later version.                                               ////
33
////                                                              ////
34
//// This source is distributed in the hope that it will be       ////
35
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
36
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
37
//// PURPOSE.  See the GNU Lesser General Public License for more ////
38
//// details.                                                     ////
39
////                                                              ////
40
//// You should have received a copy of the GNU Lesser General    ////
41
//// Public License along with this source; if not, download it   ////
42
//// from http://www.opencores.org/lgpl.shtml                     ////
43
////                                                              ////
44
//////////////////////////////////////////////////////////////////////
45
 
46
/***************************************************************
47
 Description:
48
 
49
 mii_intf.v: This verilog file is reduced mii interface for ethenet
50
 The transmit state machine generates a condition to indicate
51
 start transmit. This is done using strt_preamble. The transmit
52
 state machine upon detecting strt_preamble generates pre-amble
53
 and start of frame de-limiter and then starts accepting the data
54
 from the transmit block by asserting the transmit nibble ack.
55
 
56
 ***************************************************************/
57
/************** MODULE DECLARATION ****************************/
58
module g_mii_intf(
59
                  // Data and Control Signals to tx_fsm and rx_fsm
60
          mi2rx_strt_rcv,
61
          mi2rx_rcv_vld,
62
          mi2rx_rx_byte,
63
          mi2rx_end_rcv,
64
          mi2rx_extend,
65
          mi2rx_frame_err,
66
          mi2rx_end_frame,
67
          mi2rx_crs,
68
          mi2tx_byte_ack,
69
          mi2tx_slot_vld,
70
          cfg_uni_mac_mode_change,
71
 
72
          // Phy Signals 
73
          phy_tx_en,
74
          phy_tx_er,
75
          phy_txd,
76
          phy_tx_clk,
77
          phy_rx_clk,
78
          tx_reset_n,
79
          rx_reset_n,
80
          phy_rx_er,
81
          phy_rx_dv,
82
          phy_rxd,
83
          phy_crs,
84
          // rx_er fix.  need to fwd to mac wrapper, to drop rx_er pkts.  mfilardo.
85
          rx_sts_rx_er_reg,
86
 
87
                  // Reset signal
88
          app_reset_n,
89
 
90
                  // Signals from Config Management
91
          cf2mi_loopback_en,
92
          cf2mi_rmii_en,
93
          cf_mac_mode,
94
          cf_chk_rx_dfl,
95
          cf_silent_mode,
96
 
97
                  // Signal from Application to transmit JAM
98
          df2rx_dfl_dn,
99
 
100
                  // Inputs from Transmit FSM
101
          tx2mi_strt_preamble,
102
          tx2mi_end_transmit,
103
          tx2mi_tx_byte,
104
                  tx_ch_en
105
          );
106
 
107
 
108
parameter NO_GMII_PREAMBLE   = 5'b00111;
109
parameter NO_MII_PREAMBLE    = 5'b01111;
110
parameter NO_RMII_PREAMBLE   = 5'b11111;
111
parameter GMII_JAM_COUNT     = 5'b0011;
112
parameter MII_JAM_COUNT      = 5'b0111;
113
parameter RMII_JAM_COUNT     = 5'b1111;
114
 
115
  /******* INPUT & OUTPUT DECLARATIONS *************************/
116
 
117
  output      mi2rx_strt_rcv;     // This is generated by the MII block to indicate start 
118
                                  // of receive data.
119
  output      mi2rx_rcv_vld;      // This signal is asserted by MII on reception of valid
120
                                  // bytes to indicate to the RX block to accept data from PHY
121
  output[7:0] mi2rx_rx_byte;      // This the receive data from the PHY gathered as bytes 
122
  output      mi2rx_end_rcv;      // This signal is asserted with the last data assembled
123
  output      mi2rx_extend;       // This signal is asserted during carrier extension (Receive)
124
  output      mi2rx_frame_err;    // This signal is asserted during Dibit Error (In RMII Mode)
125
                                  // or Nibble Error in (MII Mode)
126
  output      mi2rx_end_frame;    // End of Frame 
127
  output      mi2rx_crs;          // CRS signal in rx_clk domain
128
  output      mi2tx_byte_ack;     // MII block acknowledges a byte during transmit
129
  output      mi2tx_slot_vld;     // MII block acknowledges valid slot during transmit // mfilardo
130
 
131
  output      phy_tx_en;          // Enable data on TX
132
  output      phy_tx_er;          // Transmit Error (Used in Carrier Extension in 1000 Mode)
133
  output[7:0] phy_txd;            // Transmit data on the line 
134
 
135
  input      phy_tx_clk;         // Transmit Clock in 10/100 Mb/s 
136
 
137
  output       rx_sts_rx_er_reg;  // rx_er fix.  need to fwd to mac wrapper, to drop rx_er pkts.  mfilardo.
138
  input       app_reset_n;          // reset from the application interface
139
 
140
  input       phy_rx_clk;         // Receive Clock in 10/100/1000 Mb/s 
141
  input       phy_rx_er;          // Receive Error. Used in Carrier Extension in 1000 Mode 
142
  input       phy_rx_dv;          // Receive Data Valid from the PHY 
143
  input[7:0]  phy_rxd;            // Receive Data 
144
  input       phy_crs;            // Carrier Sense from the line 
145
 
146
  input       tx_reset_n;
147
  input       rx_reset_n;
148
 
149
 
150
  input       cf2mi_loopback_en;           // loop back enable
151
  input       cf2mi_rmii_en;               // RMII Mode
152
  input       cf_mac_mode;                 // Mac Mode 0--> 10/100 Mode, 1--> 1000 Mode 
153
  input       cf_chk_rx_dfl;               // Check for Deferal 
154
  input       cf_silent_mode;              // PHY Inactive 
155
  input       df2rx_dfl_dn;                // Deferal Done in Rx Clock Domain 
156
  input       tx2mi_strt_preamble;         // Tx FSM indicates to MII to generate 
157
                                           // preamble on the line 
158
  input       tx2mi_end_transmit;          // This is provided by the TX block to 
159
                                           // indicate end of transmit
160
  input[7:0]  tx2mi_tx_byte;               // 8 bits of data from Tx block
161
  input       tx_ch_en;                    // Transmitt Enable 
162
  input       cfg_uni_mac_mode_change;
163
 
164
  /******* WIRE & REG DECLARATION FOR INPUT AND OUTPUTS ********/
165
  reg       phy_tx_en;
166
  reg       mi2tx_byte_ack;
167
  reg       mi2tx_slot_vld;
168
  reg [7:0] phy_txd;
169
  wire [7:0] mi2rx_rx_byte;
170
  reg [7:0] mi2rx_rx_byte_in;
171
  reg       mi2rx_extend;
172
  reg       mi2rx_extend_err;
173
  reg       mi2rx_strt_rcv;
174
  reg       mi2rx_end_rcv;
175
  reg       mi2rx_rcv_vld;
176
  reg       mi2rx_frame_err;
177
 
178
  /*** REG & WIRE DECLARATIONS FOR LOCAL SIGNALS ***************/
179
 
180
  reg [4:0]  tx_preamble_cnt_val;
181
 
182
 
183
  reg        strt_rcv_in;
184
  reg        end_rcv_in;
185
  reg        rx_dv_in;
186
  reg        rx_er_in;
187
  reg        rcv_valid_in;
188
 
189
 
190
 
191
  reg [7:0]  rxd_in;
192
 
193
  parameter  mii_rx_idle_st = 3'd0, mii_rx_pre_st = 3'd1,
194
             mii_rx_byte_st = 3'd2, mii_rx_end_st = 3'd3,
195
             mii_rx_dibit_st = 3'd4, mii_rx_nibble_st = 3'd5;
196
 
197
  reg [2:0]  mii_rx_nxt_st;
198
  reg [2:0]  mii_rx_cur_st;
199
 
200
  parameter  mii_tx_idle_st =  4'd0, mii_tx_pre_st  =  4'd1,
201
             mii_tx_byte_st = 4'd2,  mii_tx_end_st = 4'd3,
202 37 dinesha
             mii_tx_nibble_st = 4'd5,
203 12 dinesha
             mii_tx_nibble_end_st = 4'd6, mii_tx_dibit_st = 4'd7,
204
             mii_tx_dibit_end_st = 4'd8;
205
 
206
  reg [3:0]  mii_tx_cur_st;
207
  reg [3:0]  mii_tx_nxt_st;
208
 
209
  wire       receive_detect;
210
  wire       pre_condition;
211
  wire       sfd_condition;
212
  wire       tx_en;
213
  wire       tx_er;
214
  wire [7:0] txd;
215
  wire       byte_boundary_rx, byte_boundary_tx;
216
 
217
  reg        tx_en_in;
218
  reg        tx_err_in;
219
  reg        tx_ext_in;
220
  reg        tx_pre_in;
221
  reg        tx_sfd_in;
222
  reg        tx_xfr_ack_in;
223
  reg        inc_preamble_cntr;
224
  reg        rst_preamble_cntr;
225
  reg [1:0]  tx_xfr_cnt, rx_xfr_cnt, tx_slot_xfr_cnt;
226
  reg        rx_dv;
227
  reg        rx_er;
228
  reg        rcv_err_in;
229
  reg        mi2rx_end_frame_in;
230
 
231
  reg [1:0]  tx_dibit_in;
232
  reg        mi2rx_extend_in, mi2rx_extend_err_in, mi2rx_end_frame;
233
  reg        crs_in;
234
  reg        phy_tx_er;
235
 
236
  wire       dibit_check_rx, dibit_check_tx;
237
  wire       nibble_check_rx, nibble_check_tx;
238
  wire       pre_condition_gmii, pre_condition_mii, pre_condition_rmii;
239
  wire       sfd_condition_gmii, sfd_condition_mii, sfd_condition_rmii;
240
  wire [3:0] tx_nibble_in;
241
  reg [7:0]  rxd;
242
  wire       receive_detect_pulse;
243
  reg        d_receive_detect;
244
 
245
 
246
  reg        lb_tx_en, lb_tx_er;
247
  reg        rx_dv_del;
248
  reg  [1:0] rxd_del;
249
  reg        rx_dfl_dn;
250
  reg        rx_dfl_dn_reg;
251
 
252
 
253
  /******** SEQUENTIAL LOGIC **********************************/
254
 
255
  // This logic generates appropriate receive data valid
256
  // in case of loop back 
257
  always @(tx_en or phy_rxd or txd or phy_rx_dv or tx_er or phy_crs
258
           or cf2mi_loopback_en or phy_tx_en or phy_rx_er or
259
           cf2mi_rmii_en or cf_mac_mode)
260
    begin
261
      if(cf2mi_loopback_en)
262
        begin
263
          rx_dv_in = tx_en;
264
          rx_er_in = tx_er;
265
          rxd_in = txd;
266
          crs_in = (tx_en | tx_er) && cf_mac_mode;
267
        end // if (mii_loopback_en)
268
      else
269
        begin
270
          rx_dv_in = phy_rx_dv ;
271
          rx_er_in = phy_rx_er;
272
          rxd_in = phy_rxd;
273
          // *** NOTE ****
274
          // phy_crs should be a combination of crs and tx_en
275
          // In Full Duplex tx_en determines deferral in half duplex
276
          // crs determines deferral
277
          crs_in = (tx_en | tx_er);
278
        end // else: !if(mii_loopback_en)
279
    end
280
 
281
 
282
  // Following state machine is to detect start preamble and
283
  // transmit preamble and sfd and then the data.
284
  // This state machine also generates acknowledge to TX block
285
  // to allow the TX block to update its byte pointers
286
  always @(posedge phy_tx_clk or negedge tx_reset_n)
287
    begin
288
      if(!tx_reset_n)
289
        begin
290
          mii_tx_cur_st <= mii_tx_idle_st;
291
        end
292
      else if (tx_ch_en)
293
        begin
294
          mii_tx_cur_st <= mii_tx_nxt_st;
295
        end
296
      else
297
        begin
298
          mii_tx_cur_st <= mii_tx_idle_st;
299
        end
300
    end
301
 
302
  always @(mii_tx_cur_st or tx2mi_strt_preamble or tx2mi_end_transmit or cf_mac_mode
303
           or cf2mi_rmii_en or tx_preamble_cnt_val or byte_boundary_tx
304 37 dinesha
           or tx_xfr_cnt or receive_detect
305
           or receive_detect_pulse or cfg_uni_mac_mode_change)
306 12 dinesha
    begin
307
 
308
      mii_tx_nxt_st = mii_tx_cur_st;
309
      tx_en_in = 1'b0;
310
      tx_pre_in = 1'b0;
311
      tx_sfd_in = 1'b0;
312
      tx_err_in = 1'b0;
313
      tx_ext_in = 1'b0;
314
      inc_preamble_cntr = 1'b0;
315
      rst_preamble_cntr = 1'b0;
316
      tx_xfr_ack_in = 1'b0;
317
 
318
      casex(mii_tx_cur_st)       // synopsys parallel_case full_case
319
 
320
        mii_tx_idle_st:
321
        // wait from start from transmit state machine
322
          begin
323
            if(tx2mi_strt_preamble)
324
              begin
325
                inc_preamble_cntr = 1'b1;
326
                tx_en_in = 1'b1;
327
                tx_pre_in = 1'b1;
328
                mii_tx_nxt_st = mii_tx_pre_st;
329
              end
330
            else
331
              mii_tx_nxt_st = mii_tx_idle_st;
332
          end
333
 
334
        mii_tx_pre_st:
335
        // This state generates the preamble to be transmitted and
336
        // generates SFD before transitioning the data state
337
          begin
338
            if((tx_preamble_cnt_val == NO_GMII_PREAMBLE) && cf_mac_mode)
339
              begin
340
                tx_en_in = 1'b1;
341
                tx_sfd_in = 1'b1;
342
                tx_xfr_ack_in = 1'b1;
343
                rst_preamble_cntr = 1'b1;
344
                mii_tx_nxt_st = mii_tx_byte_st;
345
              end
346
            else if((tx_preamble_cnt_val == NO_MII_PREAMBLE) && !cf_mac_mode &&
347
                    !cf2mi_rmii_en)
348
              begin
349
                tx_en_in = 1'b1;
350
                tx_sfd_in = 1'b1;
351
                tx_xfr_ack_in = 1'b1;
352
                rst_preamble_cntr = 1'b1;
353
                mii_tx_nxt_st = mii_tx_nibble_st;
354
              end
355
            else if((tx_preamble_cnt_val == NO_RMII_PREAMBLE) && !cf_mac_mode &&
356
                   cf2mi_rmii_en)
357
              begin
358
                tx_en_in = 1'b1;
359
                tx_sfd_in = 1'b1;
360
                tx_xfr_ack_in = 1'b1;
361
                rst_preamble_cntr = 1'b1;
362
                mii_tx_nxt_st = mii_tx_dibit_st;
363
              end
364
            else
365
              begin
366
                inc_preamble_cntr = 1'b1;
367
                tx_en_in = 1'b1;
368
                tx_pre_in = 1'b1;
369
                mii_tx_nxt_st = mii_tx_pre_st;
370
              end
371
          end
372
 
373
        mii_tx_byte_st:
374
        // This state picks up a byte from the transmit block
375
        // before transmitting on the line
376
                  begin
377
            if(tx2mi_end_transmit && byte_boundary_tx )
378
                begin
379
                        tx_en_in = 1'b1;
380
                        tx_xfr_ack_in = 1'b0;
381
                        mii_tx_nxt_st = mii_tx_end_st;
382
                end
383
                                else if (!cf_mac_mode & cfg_uni_mac_mode_change)  // Mandar
384
                begin
385
                        tx_en_in = 1'b1;
386
                        tx_xfr_ack_in = 1'b1;
387
                        mii_tx_nxt_st = mii_tx_nibble_st;
388
                end
389
                else
390
                begin
391
                tx_en_in = 1'b1;
392
                tx_xfr_ack_in = 1'b1;
393
                mii_tx_nxt_st = mii_tx_byte_st;
394
                end
395
         end
396
 
397
       /*mii_tx_byte_st:
398
        // This state picks up a byte from the transmit block
399
        // before transmitting on the line
400
          begin
401
            if(tx2mi_end_transmit && byte_boundary_tx )
402
              begin
403
                tx_en_in = 1'b1;
404
                tx_xfr_ack_in = 1'b0;
405
                mii_tx_nxt_st = mii_tx_end_st;
406
              end
407
            else
408
              begin
409
                tx_en_in = 1'b1;
410
                tx_xfr_ack_in = 1'b1;
411
                mii_tx_nxt_st = mii_tx_byte_st;
412
              end
413
          end*/
414
 
415
        mii_tx_end_st:
416
        // This state checks for the end of transfer 
417
        // and extend for carrier extension
418
          begin
419
            if(tx2mi_strt_preamble)
420
              begin
421
                tx_en_in = 1'b1;
422
                tx_pre_in = 1'b1;
423
                mii_tx_nxt_st = mii_tx_pre_st;
424
              end
425
            else
426
              begin
427
                tx_en_in = 1'b0;
428
                mii_tx_nxt_st = mii_tx_idle_st;
429
              end
430
          end
431
 
432
        /*mii_tx_nibble_st:
433
        // This state picks up a byte from the transmit block
434
        // before transmitting on the line
435
          begin
436
            if(tx2mi_end_transmit && !byte_boundary_tx )
437
              begin
438
                tx_en_in = 1'b1;
439
                tx_xfr_ack_in = 1'b1;
440
                mii_tx_nxt_st = mii_tx_nibble_end_st;
441
              end
442
            else
443
              begin
444
                tx_en_in = 1'b1;
445
                tx_xfr_ack_in = 1'b1;
446
                mii_tx_nxt_st = mii_tx_nibble_st;
447
              end
448
                        end*/
449
 
450
        mii_tx_nibble_st:                             // Mandar
451
        // This state picks up a byte from the transmit block
452
        // before transmitting on the line
453
                                        begin
454
                        if(tx2mi_end_transmit && !byte_boundary_tx )
455
                                begin
456
                                        tx_en_in = 1'b1;
457
                                        tx_xfr_ack_in = 1'b1;
458
                                        mii_tx_nxt_st = mii_tx_nibble_end_st;
459
                                end
460
                 else if (cf_mac_mode & cfg_uni_mac_mode_change)  // Mandar
461
                                begin
462
                                        tx_en_in = 1'b1;
463
                                        tx_xfr_ack_in = 1'b1;
464
                        mii_tx_nxt_st = mii_tx_byte_st;
465
                                end
466
                        else
467
                                begin
468
                                        tx_en_in = 1'b1;
469
                                        tx_xfr_ack_in = 1'b1;
470
                                        mii_tx_nxt_st = mii_tx_nibble_st;
471
                                end
472
                                        end
473
 
474
        mii_tx_nibble_end_st:
475
        // This state checks for the end of transfer 
476
        // and extend for carrier extension
477
          begin
478
            if(tx2mi_strt_preamble)
479
              begin
480
                tx_en_in = 1'b1;
481
                tx_pre_in = 1'b1;
482
                mii_tx_nxt_st = mii_tx_pre_st;
483
              end
484
            else
485
              begin
486
                tx_en_in = 1'b0;
487
                mii_tx_nxt_st = mii_tx_idle_st;
488
              end
489
          end
490
 
491
        mii_tx_dibit_st:
492
        // This state picks up a byte from the transmit block
493
        // before transmitting on the line
494
          begin
495
            if(tx2mi_end_transmit && (tx_xfr_cnt[0]) && (tx_xfr_cnt[1]) )
496
              begin
497
                tx_en_in = 1'b1;
498
                tx_xfr_ack_in = 1'b1;
499
                mii_tx_nxt_st = mii_tx_dibit_end_st;
500
              end
501
            else
502
              begin
503
                tx_en_in = 1'b1;
504
                tx_xfr_ack_in = 1'b1;
505
                mii_tx_nxt_st = mii_tx_dibit_st;
506
              end
507
          end
508
 
509
        mii_tx_dibit_end_st:
510
        // This state checks for the end of transfer 
511
        // and extend for carrier extension
512
          begin
513
             if(tx2mi_strt_preamble)
514
              begin
515
                tx_en_in = 1'b1;
516
                tx_pre_in = 1'b1;
517
                mii_tx_nxt_st = mii_tx_pre_st;
518
              end
519
            else
520
              begin
521
                tx_en_in = 1'b1;
522
                mii_tx_nxt_st = mii_tx_idle_st;
523
              end
524
          end
525
       endcase
526
     end // end always 
527
 
528
  // All the data, enable and ack signals leaving this blocks are
529
  // registered tx_data and tx_en are outputs going to PHY tx_nibble_ack 
530
  // is indicating to the TX block of acceptance of data nibble
531
  always @(posedge phy_tx_clk or negedge tx_reset_n)
532
    begin
533
      if(!tx_reset_n)
534
        begin
535
          lb_tx_en <= 1'b0;
536
          lb_tx_er <= 1'b0;
537
          phy_tx_en <= 1'b0;
538
          phy_tx_er <= 1'b0;
539
          mi2tx_byte_ack <= 1'b0;
540
          mi2tx_slot_vld <= 1'b0;
541
        end
542
      else
543
        begin
544
          lb_tx_en <= tx_en_in;
545
          lb_tx_er <= tx_err_in;
546
          phy_tx_en <= (cf_silent_mode) ? 1'b0 : tx_en_in;
547
          phy_tx_er <= (cf_silent_mode) ? 1'b0 : tx_err_in;
548
          mi2tx_byte_ack <= (cf_mac_mode || (cf2mi_rmii_en && tx_xfr_cnt[1] && !tx_xfr_cnt[0]) ||
549
                             (!cf2mi_rmii_en && nibble_check_tx)) ? tx_xfr_ack_in : 1'b0;
550
          mi2tx_slot_vld <= (cf_mac_mode || (cf2mi_rmii_en && tx_slot_xfr_cnt[1] && !tx_slot_xfr_cnt[0]) ||
551
                             (!cf2mi_rmii_en && tx_slot_xfr_cnt[0] )) ? (tx_xfr_ack_in || inc_preamble_cntr) : 1'b0;
552
        end
553
    end
554
 
555
  always @(posedge phy_tx_clk or negedge tx_reset_n)
556
    begin
557
      if(!tx_reset_n)
558
        begin
559
          phy_txd[7:0] <= 8'b00000000;
560
        end
561
      else
562
        begin
563
          if (cf_mac_mode)
564
             phy_txd[7:0] <= (tx_pre_in) ? 8'b01010101 : ((tx_sfd_in) ?
565 37 dinesha
                              8'b11010101 :  ((tx_ext_in) ? 8'b00001111: tx2mi_tx_byte));
566 12 dinesha
          else if (!cf_mac_mode && !cf2mi_rmii_en)
567
             phy_txd[3:0] <= (tx_pre_in) ? 4'b0101 : ((tx_sfd_in) ?
568 37 dinesha
                              4'b1101 : tx_nibble_in) ;
569 12 dinesha
          else if (!cf_mac_mode && cf2mi_rmii_en)
570
             phy_txd[1:0] <= (tx_pre_in) ? 2'b01 : ((tx_sfd_in) ?
571 37 dinesha
                              2'b11 : tx_dibit_in) ;
572 12 dinesha
        end
573
    end
574
  assign receive_detect_pulse = receive_detect && !d_receive_detect;
575
 
576
 
577
  always @(posedge phy_tx_clk or negedge tx_reset_n)
578
    begin
579
      if(!tx_reset_n)
580
        d_receive_detect <= 0;
581
      else
582
        d_receive_detect <= receive_detect;
583
    end
584
  // counter for the number transfers 
585
  always @(posedge phy_tx_clk or negedge tx_reset_n)
586
    begin
587
      if(!tx_reset_n)
588
        tx_xfr_cnt <= 2'd0;
589
      else if(tx2mi_strt_preamble)
590
        tx_xfr_cnt <= 2'd0;
591
      else if(tx_xfr_ack_in)
592
        tx_xfr_cnt <= tx_xfr_cnt + 1;
593
    end
594
 
595
  // phy_tx_en_dly
596
  reg phy_tx_en_dly;
597
  always @(posedge phy_tx_clk or negedge tx_reset_n)
598
    begin
599
      if(!tx_reset_n)
600
        phy_tx_en_dly <= 1'd0;
601
      else
602
        phy_tx_en_dly <= phy_tx_en;
603
    end
604
 
605
   wire phy_tx_en_fall;
606
   assign phy_tx_en_fall = phy_tx_en_dly && !phy_tx_en;
607
 
608
  // counter for the number transfers  ... 
609
  always @(posedge phy_tx_clk or negedge tx_reset_n)
610
    begin
611
      if(!tx_reset_n)
612
        tx_slot_xfr_cnt <= 2'd0;
613
      else if(phy_tx_en_fall)
614
        tx_slot_xfr_cnt <= 2'd0;
615
      else if(inc_preamble_cntr || tx_xfr_ack_in)
616
        tx_slot_xfr_cnt <= tx_slot_xfr_cnt + 1;
617
    end
618
 
619
  assign nibble_check_tx = tx_xfr_cnt[0];
620
  assign dibit_check_tx= tx_xfr_cnt[0] && tx_xfr_cnt[1];
621
  assign byte_boundary_tx = (cf_mac_mode) ? 1'b1:
622
               ((!cf_mac_mode && !cf2mi_rmii_en) ? nibble_check_tx :  dibit_check_tx);
623
 
624
  assign tx_nibble_in = (tx_xfr_cnt[0]) ? tx2mi_tx_byte[3:0] : tx2mi_tx_byte[7:4];
625
 
626
/*  always @(tx_xfr_cnt or tx2mi_tx_byte or phy_tx_clk)
627
        begin
628
          if (!tx_xfr_cnt[1] && !tx_xfr_cnt[0])
629
            tx_dibit_in <= tx2mi_tx_byte[1:0];
630
          else if (!tx_xfr_cnt[1] && tx_xfr_cnt[0])
631
            tx_dibit_in <= tx2mi_tx_byte[3:2];
632
          else if (tx_xfr_cnt[1] && !tx_xfr_cnt[0])
633
            tx_dibit_in <= tx2mi_tx_byte[5:4];
634
          else if (tx_xfr_cnt[1] && tx_xfr_cnt[0])
635
            tx_dibit_in <= tx2mi_tx_byte[7:6];
636
          else
637
            tx_dibit_in <= tx2mi_tx_byte[1:0];
638
        end
639
*/
640
  always @(posedge phy_tx_clk or negedge tx_reset_n)
641
    begin
642
      if(!tx_reset_n)
643
        tx_dibit_in <= 2'b0;
644
      else if(tx2mi_strt_preamble)
645
        tx_dibit_in <= 2'b0;
646
      else
647
        begin
648
          if (!tx_xfr_cnt[1] && !tx_xfr_cnt[0])
649
            tx_dibit_in <= tx2mi_tx_byte[1:0];
650
          else if (!tx_xfr_cnt[1] && tx_xfr_cnt[0])
651
            tx_dibit_in <= tx2mi_tx_byte[3:2];
652
          else if (tx_xfr_cnt[1] && !tx_xfr_cnt[0])
653
            tx_dibit_in <= tx2mi_tx_byte[5:4];
654
          else if (tx_xfr_cnt[1] && tx_xfr_cnt[0])
655
            tx_dibit_in <= tx2mi_tx_byte[7:6];
656
        end
657
    end
658
 
659
  // counter for the number of preamble to be sent
660
  // before transmitting the sfd
661
  always @(posedge phy_tx_clk or negedge tx_reset_n)
662
    begin
663
      if(!tx_reset_n)
664
        tx_preamble_cnt_val <= 5'd0;
665
      else if(rst_preamble_cntr)
666
        tx_preamble_cnt_val <= 5'd0;
667
      else if(inc_preamble_cntr)
668
        tx_preamble_cnt_val <= tx_preamble_cnt_val + 1;
669
    end
670
 
671
 
672
 
673
    always @(posedge phy_rx_clk or negedge rx_reset_n)
674
      begin
675
        if(!rx_reset_n)
676
          rx_dfl_dn_reg <= 1'b0;
677
        else if (df2rx_dfl_dn)
678
          rx_dfl_dn_reg <= 1'b1;
679
        else
680
          begin
681
            if (!phy_rx_dv && !phy_rx_er)
682
              rx_dfl_dn_reg <= 1'b0;
683
          end
684
      end
685
 
686
  assign mi2rx_rx_byte = mi2rx_rx_byte_in;
687
  //assign rxd = (!cf_mac_mode && cf2mi_rmii_en)? mi2rx_rx_byte : mi2rx_rx_byte_in;
688
 
689
  assign pre_condition_gmii = (!rxd[7] && rxd[6] && !rxd[5] && rxd[4]
690
                               && !rxd[3] && rxd[2] && !rxd[1] && rxd[0] && rx_dv
691
                               && !(!rx_dfl_dn_reg && cf_chk_rx_dfl));
692
 
693
  assign pre_condition_mii = (!rxd[3] && rxd[2] && !rxd[1] && rxd[0] && rx_dv
694
                              && !(!rx_dfl_dn_reg && cf_chk_rx_dfl));
695
 
696
  assign pre_condition_rmii = (!rxd[1] && rxd[0] && rx_dv
697
                               && !rxd_del[1] && rxd_del[0] && rx_dv_del
698
                               && !(!rx_dfl_dn_reg && cf_chk_rx_dfl));
699
 
700
  assign sfd_condition_gmii = (rxd[7] && rxd[6] && !rxd[5] && rxd[4]
701
                               && !rxd[3] && rxd[2] && !rxd[1] && rxd[0] && rx_dv
702
                               && !(!rx_dfl_dn_reg && cf_chk_rx_dfl));
703
 
704
  assign sfd_condition_mii = (rxd[3] && rxd[2] && !rxd[1] && rxd[0] && rx_dv
705
                              && !(!rx_dfl_dn_reg && cf_chk_rx_dfl));
706
 
707
  assign sfd_condition_rmii = (rxd[1] && rxd[0] && rx_dv
708
                               && !rxd_del[1] && rxd_del[0] && rx_dv_del
709
                               && !(!rx_dfl_dn_reg && cf_chk_rx_dfl));
710
 
711
 
712
 
713
  assign pre_condition = (cf_mac_mode) ? pre_condition_gmii :
714
                         ((cf2mi_rmii_en) ? pre_condition_rmii : pre_condition_mii);
715
 
716
  assign sfd_condition = (cf_mac_mode) ? sfd_condition_gmii :
717
                         ((cf2mi_rmii_en) ? sfd_condition_rmii : sfd_condition_mii);
718
 
719
  // Following state machine is to detect strt preamble and
720
  // receive preamble and sfd and then the data.
721
  always @(posedge phy_rx_clk or negedge rx_reset_n)
722
    begin
723
      if(!rx_reset_n)
724
        begin
725
          mii_rx_cur_st <= mii_rx_idle_st;
726
        end
727
      else
728
        begin
729
          mii_rx_cur_st <= mii_rx_nxt_st;
730
        end
731
    end
732
 
733
  always @(mii_rx_cur_st or rx_dv or rx_er or pre_condition or sfd_condition
734
           or byte_boundary_rx or rxd or rx_xfr_cnt or cf2mi_rmii_en or cf_mac_mode)
735
    begin
736
      mii_rx_nxt_st = mii_rx_cur_st;
737
      strt_rcv_in = 1'b0;
738
      end_rcv_in = 1'b0;
739
      rcv_valid_in = 1'b0;
740
      rcv_err_in = 1'b0;
741
      mi2rx_extend_in = 1'b0;
742
      mi2rx_extend_err_in = 1'b0;
743
      mi2rx_end_frame_in = 1'b0;
744
 
745
      casex(mii_rx_cur_st)       // synopsys parallel_case full_case
746
 
747
        mii_rx_idle_st:
748
        // This state is waiting for pre-amble to
749
        // appear on the line in Receive mode
750
        begin
751
          if(pre_condition)
752
            mii_rx_nxt_st = mii_rx_pre_st;
753
          else
754
            mii_rx_nxt_st = mii_rx_idle_st;
755
        end
756
 
757
        mii_rx_pre_st:
758
        // This state checks the pre-amble and Waits for SFD on the line 
759
        begin
760
          if(sfd_condition)
761
            begin
762
              strt_rcv_in = 1'b1;
763
              if(cf_mac_mode)
764
                mii_rx_nxt_st = mii_rx_byte_st;
765
              else if(!cf_mac_mode && !cf2mi_rmii_en)
766
                mii_rx_nxt_st = mii_rx_nibble_st;
767
              else if(!cf_mac_mode && cf2mi_rmii_en)
768
                mii_rx_nxt_st = mii_rx_dibit_st;
769
            end
770
          else if(pre_condition)
771
            begin
772
              mii_rx_nxt_st = mii_rx_pre_st;
773
            end
774
          else if(!rx_dv && rx_er && cf_mac_mode)
775
            begin
776
              mi2rx_extend_in = (rxd == 8'h0F) ? 1'b1: 1'b0;
777
              mi2rx_extend_err_in = (rxd == 8'h1F) ? 1'b1: 1'b0;
778
              mii_rx_nxt_st = mii_rx_pre_st;
779
            end
780
          else
781
            begin
782
              mi2rx_end_frame_in = 1'b1;
783
              mii_rx_nxt_st = mii_rx_idle_st;
784
            end
785
        end
786
 
787
        mii_rx_byte_st:
788
        // This state looks for data validity and latches di-bit2 and
789
        // sends it to the receiver
790
        begin
791
          if(rx_dv)
792
            begin
793
              rcv_valid_in = 1'b1;
794
              mii_rx_nxt_st = mii_rx_byte_st;
795
            end
796
          else if (!rx_dv && rx_er && cf_mac_mode)
797
            begin
798
              mi2rx_extend_in = (rxd == 8'h0F) ? 1'b1: 1'b0;
799
              mi2rx_extend_err_in = (rxd == 8'h1F) ? 1'b1: 1'b0;
800
              end_rcv_in = 1'b1;
801
              mii_rx_nxt_st = mii_rx_pre_st;
802
            end
803
          else
804
            begin
805
              end_rcv_in = 1'b1;
806
              mii_rx_nxt_st = mii_rx_end_st;
807
            end
808
        end
809
 
810
        mii_rx_end_st:
811
        // This state looks for data validity and latches di-bit2 and
812
        // sends it to the receiver
813
           mii_rx_nxt_st = mii_rx_idle_st;
814
 
815
        mii_rx_nibble_st:
816
        begin
817
          if(rx_dv)
818
            begin
819
              rcv_valid_in = 1'b1;
820
              mii_rx_nxt_st = mii_rx_nibble_st;
821
            end
822
          else
823
            begin
824
              end_rcv_in = 1'b1;
825
              mii_rx_nxt_st = mii_rx_end_st;
826
              if(rx_xfr_cnt[0])
827
                rcv_err_in = 1'b1;
828
            end
829
        end
830
 
831
        mii_rx_dibit_st:
832
        begin
833
          if(rx_dv)
834
            begin
835
              rcv_valid_in = 1'b1;
836
              mii_rx_nxt_st = mii_rx_dibit_st;
837
            end
838
          else
839
            begin
840
              end_rcv_in = 1'b1;
841
              mii_rx_nxt_st = mii_rx_end_st;
842
              if(!(!rx_xfr_cnt[0] && !rx_xfr_cnt[1]))
843
                rcv_err_in = 1'b1;
844
            end
845
        end
846
 
847
      endcase
848
    end // always @ (mii_rx_cur_st...
849
 
850
  // counter for the number receives 
851
  always @(posedge phy_rx_clk or negedge rx_reset_n)
852
    begin
853
      if(!rx_reset_n)
854
        rx_xfr_cnt <= 2'd0;
855
      else if(mi2rx_end_rcv)
856
        rx_xfr_cnt <= 2'd0;
857
      else if(rcv_valid_in)
858
        rx_xfr_cnt <= rx_xfr_cnt + 1;
859
    end
860
 
861
  always @(posedge phy_rx_clk or negedge rx_reset_n)
862
    begin
863
      if(!rx_reset_n)
864
        begin
865
          mi2rx_rx_byte_in <= 8'b0;
866
          rxd <= 8'b0;
867
          rxd_del <= 2'b0;
868
        end
869
      else
870
        begin
871
          rxd <= rxd_in;
872
//        rxd_del <= rxd_in[1:0];
873
          rxd_del <= rxd[1:0];
874
 
875
          if (cf_mac_mode)
876
            mi2rx_rx_byte_in <= rxd;
877
          else if (!cf_mac_mode && !cf2mi_rmii_en)
878
            begin
879
              if(!rx_xfr_cnt[0])
880
                mi2rx_rx_byte_in[3:0] <= rxd[3:0];
881
              else
882
                mi2rx_rx_byte_in[7:4] <= rxd[3:0];
883
            end
884
          else if(!cf_mac_mode && cf2mi_rmii_en)
885
            begin
886
              if(!rx_xfr_cnt[1] && !rx_xfr_cnt[0])
887
                mi2rx_rx_byte_in[1:0] <= rxd[1:0];
888
              else if(!rx_xfr_cnt[1] && rx_xfr_cnt[0])
889
                mi2rx_rx_byte_in[3:2] <= rxd[1:0];
890
              else if(rx_xfr_cnt[1] && !rx_xfr_cnt[0])
891
                mi2rx_rx_byte_in[5:4] <= rxd[1:0];
892
              else if(rx_xfr_cnt[1] && rx_xfr_cnt[0])
893
                mi2rx_rx_byte_in[7:6] <= rxd[1:0];
894
            end
895
        end
896
    end
897
 
898
  reg  rx_sts_rx_er_reg;
899
  always @(posedge phy_rx_clk or negedge rx_reset_n) begin
900
      if(!rx_reset_n) begin
901
          rx_sts_rx_er_reg <= 1'b0;
902
      end
903
      else if (mi2rx_strt_rcv) begin
904
          rx_sts_rx_er_reg <= 1'b0;
905
      end
906
      else if(phy_rx_dv && phy_rx_er) begin
907
          rx_sts_rx_er_reg <= 1'b1;
908
      end
909
  end
910
 
911
  always @(posedge phy_rx_clk
912
       or negedge rx_reset_n)
913
    begin
914
      if(!rx_reset_n)
915
        begin
916
          mi2rx_rcv_vld <= 1'b0;
917
        end
918
      else if(cf_mac_mode)
919
          mi2rx_rcv_vld <= rcv_valid_in;
920
      else if(!cf_mac_mode && cf2mi_rmii_en && rx_xfr_cnt[0] && rx_xfr_cnt[1])
921
          mi2rx_rcv_vld <= rcv_valid_in;
922
      else if(!cf_mac_mode && !cf2mi_rmii_en && rx_xfr_cnt[0])
923
          mi2rx_rcv_vld <= rcv_valid_in;
924
      else
925
          mi2rx_rcv_vld <= 1'b0;
926
    end
927
  // All the data, enable and ack signals out of RX block are
928
  // registered 
929
  always @(posedge phy_rx_clk or negedge rx_reset_n)
930
    begin
931
      if(!rx_reset_n)
932
        begin
933
          mi2rx_strt_rcv <= 1'b0;
934
          mi2rx_end_rcv <= 1'b0;
935
          //mi2rx_rcv_vld <= 1'b0;
936
          mi2rx_frame_err <= 1'b0;
937
          mi2rx_extend <= 1'b0;
938
          mi2rx_extend_err <= 1'b0;
939
          mi2rx_end_frame <= 1'b0;
940
          rx_dv <= 1'b0;
941
          rx_er <= 1'b0;
942
          rx_dv_del <= 1'b0;
943
        end
944
      else
945
        begin
946
          mi2rx_strt_rcv <= strt_rcv_in;
947
          mi2rx_end_rcv <= end_rcv_in;
948
          //mi2rx_rcv_vld <= rcv_valid_in;
949
          mi2rx_frame_err <= rcv_err_in;
950
          mi2rx_extend <= mi2rx_extend_in;
951
          mi2rx_extend_err <= mi2rx_extend_err_in;
952
          mi2rx_end_frame <= mi2rx_end_frame_in;
953
          rx_dv <= rx_dv_in;
954
          rx_er <= rx_er_in;
955
          rx_dv_del <= rx_dv;
956
        end
957
    end
958
 
959
 
960
 
961
 half_dup_dble_reg U_dble_reg1 (
962
                 //outputs
963
                 .sync_out_pulse(receive_detect),
964
                 //inputs
965
                 .in_pulse(rx_dv_in),
966
                 .dest_clk(phy_tx_clk),
967
                 .reset_n(tx_reset_n)
968
             );
969
 
970
 
971
wire test;
972
 
973
 half_dup_dble_reg U_dble_reg5 (
974
                 //outputs
975
                 .sync_out_pulse(tx_en),
976
                 //inputs
977
                 .in_pulse(lb_tx_en),
978
                 .dest_clk(phy_rx_clk),
979
                 .reset_n(rx_reset_n)
980
             );
981
 
982
 half_dup_dble_reg U_dble_reg6 (
983
                 //outputs
984
                 .sync_out_pulse(txd[0]),
985
                 //inputs
986
                 .in_pulse(phy_txd[0]),
987
                 .dest_clk(phy_rx_clk),
988
                 .reset_n(rx_reset_n)
989
             );
990
 
991
 half_dup_dble_reg U_dble_reg7 (
992
                 //outputs
993
                 .sync_out_pulse(txd[1]),
994
                 //inputs
995
                 .in_pulse(phy_txd[1]),
996
                 .dest_clk(phy_rx_clk),
997
                 .reset_n(rx_reset_n)
998
             );
999
 
1000
 half_dup_dble_reg U_dble_reg8 (
1001
                 //outputs
1002
                 .sync_out_pulse(txd[2]),
1003
                 //inputs
1004
                 .in_pulse(phy_txd[2]),
1005
                 .dest_clk(phy_rx_clk),
1006
                 .reset_n(rx_reset_n)
1007
             );
1008
 
1009
 half_dup_dble_reg U_dble_reg9 (
1010
                 //outputs
1011
                 .sync_out_pulse(txd[3]),
1012
                 //inputs
1013
                 .in_pulse(phy_txd[3]),
1014
                 .dest_clk(phy_rx_clk),
1015
                 .reset_n(rx_reset_n)
1016
             );
1017
 
1018
 half_dup_dble_reg U_dble_reg10 (
1019
                 //outputs
1020
                 .sync_out_pulse(txd[4]),
1021
                 //inputs
1022
                 .in_pulse(phy_txd[4]),
1023
                 .dest_clk(phy_rx_clk),
1024
                 .reset_n(rx_reset_n)
1025
             );
1026
 
1027
 
1028
 half_dup_dble_reg U_dble_reg11 (
1029
                 //outputs
1030
                 .sync_out_pulse(txd[5]),
1031
                 //inputs
1032
                 .in_pulse(phy_txd[5]),
1033
                 .dest_clk(phy_rx_clk),
1034
                 .reset_n(rx_reset_n)
1035
             );
1036
 
1037
 
1038
 half_dup_dble_reg U_dble_reg12 (
1039
                 //outputs
1040
                 .sync_out_pulse(txd[6]),
1041
                 //inputs
1042
                 .in_pulse(phy_txd[6]),
1043
                 .dest_clk(phy_rx_clk),
1044
                 .reset_n(rx_reset_n)
1045
             );
1046
 
1047
 
1048
 half_dup_dble_reg U_dble_reg13 (
1049
                 //outputs
1050
                 .sync_out_pulse(txd[7]),
1051
                 //inputs
1052
                 .in_pulse(phy_txd[7]),
1053
                 .dest_clk(phy_rx_clk),
1054
                 .reset_n(rx_reset_n)
1055
             );
1056
 
1057
 
1058
 half_dup_dble_reg U_dble_reg14 (
1059
                 //outputs
1060
                 .sync_out_pulse(tx_er),
1061
                 //inputs
1062
                 .in_pulse(lb_tx_er),
1063
                 .dest_clk(phy_rx_clk),
1064
                 .reset_n(rx_reset_n)
1065
             );
1066
 
1067
 
1068
 half_dup_dble_reg U_dble_reg15 (
1069
                 //outputs
1070
                 .sync_out_pulse(mi2rx_crs),
1071
                 //inputs
1072
                 .in_pulse(crs_in),
1073
                 .dest_clk(phy_rx_clk),
1074
                 .reset_n(rx_reset_n)
1075
             );
1076
 
1077
endmodule
1078
 

powered by: WebSVN 2.1.0

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