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 12

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

powered by: WebSVN 2.1.0

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