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

Subversion Repositories srdydrdy_lib

[/] [srdydrdy_lib/] [trunk/] [external/] [ethernet_tri_mode/] [MAC_tx/] [MAC_tx_FF.v] - Blame information for rev 23

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 23 ghutchis
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  MAC_tx_FF.v                                                 ////
4
////                                                              ////
5
////  This file is part of the Ethernet IP core project           ////
6
////  http://www.opencores.org/projects.cgi/web/ethernet_tri_mode/////
7
////                                                              ////
8
////  Author(s):                                                  ////
9
////      - Jon Gao (gaojon@yahoo.com)                            ////
10
////                                                              ////
11
////                                                              ////
12
//////////////////////////////////////////////////////////////////////
13
////                                                              ////
14
//// Copyright (C) 2001 Authors                                   ////
15
////                                                              ////
16
//// This source file may be used and distributed without         ////
17
//// restriction provided that this copyright statement is not    ////
18
//// removed from the file and that any derivative work contains  ////
19
//// the original copyright notice and the associated disclaimer. ////
20
////                                                              ////
21
//// This source file is free software; you can redistribute it   ////
22
//// and/or modify it under the terms of the GNU Lesser General   ////
23
//// Public License as published by the Free Software Foundation; ////
24
//// either version 2.1 of the License, or (at your option) any   ////
25
//// later version.                                               ////
26
////                                                              ////
27
//// This source is distributed in the hope that it will be       ////
28
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
29
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
30
//// PURPOSE.  See the GNU Lesser General Public License for more ////
31
//// details.                                                     ////
32
////                                                              ////
33
//// You should have received a copy of the GNU Lesser General    ////
34
//// Public License along with this source; if not, download it   ////
35
//// from http://www.opencores.org/lgpl.shtml                     ////
36
////                                                              ////
37
//////////////////////////////////////////////////////////////////////
38
//                                                                    
39
// CVS Revision History                                               
40
//                                                                    
41
// $Log: MAC_tx_FF.v,v $
42
// Revision 1.5  2006/06/25 04:58:56  maverickist
43
// no message
44
//
45
// Revision 1.4  2006/05/28 05:09:20  maverickist
46
// no message
47
//
48
// Revision 1.3  2006/01/19 14:07:54  maverickist
49
// verification is complete.
50
//
51
// Revision 1.3  2005/12/16 06:44:18  Administrator
52
// replaced tab with space.
53
// passed 9.6k length frame test.
54
//
55
// Revision 1.2  2005/12/13 12:15:39  Administrator
56
// no message
57
//
58
// Revision 1.1.1.1  2005/12/13 01:51:45  Administrator
59
// no message
60
//                                           
61
 
62
module MAC_tx_FF (
63
Reset               ,
64
Clk_MAC             ,
65
Clk_SYS             ,
66
//MAC_rx_ctrl interface    
67
Fifo_data           ,
68
Fifo_rd             ,
69
Fifo_rd_finish      ,
70
Fifo_rd_retry       ,
71
Fifo_eop            ,
72
Fifo_da             ,
73
Fifo_ra             ,
74
Fifo_data_err_empty ,
75
Fifo_data_err_full  ,
76
//user interface          
77
Tx_mac_wa           ,
78
Tx_mac_wr           ,
79
Tx_mac_data         ,
80
Tx_mac_BE           ,
81
Tx_mac_sop          ,
82
Tx_mac_eop          ,
83
//host interface   
84
FullDuplex          ,
85
Tx_Hwmark           ,
86
Tx_Lwmark
87
 
88
);
89
input           Reset               ;
90
input           Clk_MAC             ;
91
input           Clk_SYS             ;
92
                //MAC_tx_ctrl
93
output  [7:0]   Fifo_data           ;
94
input           Fifo_rd             ;
95
input           Fifo_rd_finish      ;
96
input           Fifo_rd_retry       ;
97
output          Fifo_eop            ;
98
output          Fifo_da             ;
99
output          Fifo_ra             ;
100
output          Fifo_data_err_empty ;
101
output          Fifo_data_err_full  ;
102
                //user interface 
103
output          Tx_mac_wa           ;
104
input           Tx_mac_wr           ;
105
input   [31:0]  Tx_mac_data         ;
106
input   [1:0]   Tx_mac_BE           ;//big endian
107
input           Tx_mac_sop          ;
108
input           Tx_mac_eop          ;
109
                //host interface 
110
input           FullDuplex          ;
111
input   [4:0]   Tx_Hwmark           ;
112
input   [4:0]   Tx_Lwmark           ;
113
//******************************************************************************
114
//internal signals                                                              
115
//******************************************************************************
116
parameter       MAC_byte3               =4'd00;
117
parameter       MAC_byte2               =4'd01;
118
parameter       MAC_byte1               =4'd02;
119
parameter       MAC_byte0               =4'd03;
120
parameter       MAC_wait_finish         =4'd04;
121
parameter       MAC_retry               =4'd08;
122
parameter       MAC_idle                =4'd09;
123
parameter       MAC_FFEmpty             =4'd10;
124
parameter       MAC_FFEmpty_drop        =4'd11;
125
parameter       MAC_pkt_sub             =4'd12;
126
parameter       MAC_FF_Err              =4'd13;
127
 
128
 
129
reg [3:0]       Current_state_MAC           /* synthesis syn_preserve =1 */ ;
130
reg [3:0]       Current_state_MAC_reg       /* synthesis syn_preserve =1 */ ;
131
reg [3:0]       Next_state_MAC              ;
132
 
133
 
134
parameter       SYS_idle                =4'd0;
135
parameter       SYS_WaitSop             =4'd1;
136
parameter       SYS_SOP                 =4'd2;
137
parameter       SYS_MOP                 =4'd3;
138
parameter       SYS_DROP                =4'd4;
139
parameter       SYS_EOP_ok              =4'd5;
140
parameter       SYS_FFEmpty             =4'd6;
141
parameter       SYS_EOP_err             =4'd7;
142
parameter       SYS_SOP_err             =4'd8;
143
 
144
reg [3:0]       Current_state_SYS   /* synthesis syn_preserve =1 */;
145
reg [3:0]       Next_state_SYS;
146
 
147
reg [`MAC_RX_FF_DEPTH-1:0]       Add_wr          ;
148
reg [`MAC_RX_FF_DEPTH-1:0]       Add_wr_ungray   ;
149
reg [`MAC_RX_FF_DEPTH-1:0]       Add_wr_gray     ;
150
reg [`MAC_RX_FF_DEPTH-1:0]       Add_wr_gray_dl1 ;
151
wire[`MAC_RX_FF_DEPTH-1:0]       Add_wr_gray_tmp ;
152
 
153
reg [`MAC_RX_FF_DEPTH-1:0]       Add_rd          ;
154
reg [`MAC_RX_FF_DEPTH-1:0]       Add_rd_reg      ;
155
reg [`MAC_RX_FF_DEPTH-1:0]       Add_rd_gray     ;
156
reg [`MAC_RX_FF_DEPTH-1:0]       Add_rd_gray_dl1 ;
157
wire[`MAC_RX_FF_DEPTH-1:0]       Add_rd_gray_tmp ;
158
reg [`MAC_RX_FF_DEPTH-1:0]       Add_rd_ungray   ;
159
wire[35:0]      Din             ;
160
wire[35:0]      Dout            ;
161
reg             Wr_en           ;
162
wire[`MAC_RX_FF_DEPTH-1:0]       Add_wr_pluse    ;
163
wire[`MAC_RX_FF_DEPTH-1:0]       Add_wr_pluse_pluse;
164
wire[`MAC_RX_FF_DEPTH-1:0]       Add_rd_pluse    ;
165
reg [`MAC_RX_FF_DEPTH-1:0]       Add_rd_reg_dl1  ;
166
reg             Full            /* synthesis syn_keep=1 */;
167
reg             AlmostFull      /* synthesis syn_keep=1 */;
168
reg             Empty           /* synthesis syn_keep=1 */;
169
 
170
reg             Tx_mac_wa           ;
171
reg             Tx_mac_wr_dl1           ;
172
reg [31:0]      Tx_mac_data_dl1         ;
173
reg [1:0]       Tx_mac_BE_dl1           ;
174
reg             Tx_mac_sop_dl1          ;
175
reg             Tx_mac_eop_dl1          ;
176
reg             FF_FullErr              ;
177
wire[1:0]       Dout_BE                 ;
178
wire            Dout_eop                ;
179
wire            Dout_err                ;
180
wire[31:0]      Dout_data               ;
181
reg [35:0]      Dout_reg                /* synthesis syn_preserve=1 */;
182
reg             Packet_number_sub_dl1   ;
183
reg             Packet_number_sub_dl2   ;
184
reg             Packet_number_sub_edge  /* synthesis syn_preserve=1 */;
185
reg             Packet_number_add       /* synthesis syn_preserve=1 */;
186
reg [4:0]       Fifo_data_count         ;
187
reg             Fifo_ra                 /* synthesis syn_keep=1 */;
188
reg [7:0]       Fifo_data               ;
189
reg             Fifo_da                 ;
190
reg             Fifo_data_err_empty     /* synthesis syn_preserve=1 */;
191
reg             Fifo_eop                ;
192
reg             Fifo_rd_dl1             ;
193
reg             Fifo_ra_tmp             ;
194
reg [5:0]       Packet_number_inFF      /* synthesis syn_keep=1 */;
195
reg [5:0]       Packet_number_inFF_reg  /* synthesis syn_preserve=1 */;
196
reg             Pkt_sub_apply_tmp       ;
197
reg             Pkt_sub_apply           ;
198
reg             Add_rd_reg_rdy_tmp      ;
199
reg             Add_rd_reg_rdy          ;
200
reg             Add_rd_reg_rdy_dl1      ;
201
reg             Add_rd_reg_rdy_dl2      ;
202
reg [4:0]       Tx_Hwmark_pl            ;
203
reg [4:0]       Tx_Lwmark_pl            ;
204
reg             Add_rd_jump_tmp         ;
205
reg             Add_rd_jump_tmp_pl1     ;
206
reg             Add_rd_jump             ;
207
reg             Add_rd_jump_wr_pl1      ;
208
 
209
integer         i                       ;
210
//******************************************************************************
211
//write data to from FF .
212
//domain Clk_SYS
213
//******************************************************************************
214
always @ (posedge Clk_SYS or posedge Reset)
215
    if (Reset)
216
        Current_state_SYS   <=SYS_idle;
217
    else
218
        Current_state_SYS   <=Next_state_SYS;
219
 
220
always @ (Current_state_SYS or Tx_mac_wr or Tx_mac_sop or Full or AlmostFull
221
            or Tx_mac_eop )
222
    case (Current_state_SYS)
223
        SYS_idle:
224
            if (Tx_mac_wr&&Tx_mac_sop&&!Full)
225
                Next_state_SYS      =SYS_SOP;
226
            else
227
                Next_state_SYS      =Current_state_SYS ;
228
        SYS_SOP:
229
                Next_state_SYS      =SYS_MOP;
230
        SYS_MOP:
231
            if (AlmostFull)
232
                Next_state_SYS      =SYS_DROP;
233
            else if (Tx_mac_wr&&Tx_mac_sop)
234
                Next_state_SYS      =SYS_SOP_err;
235
            else if (Tx_mac_wr&&Tx_mac_eop)
236
                Next_state_SYS      =SYS_EOP_ok;
237
            else
238
                Next_state_SYS      =Current_state_SYS ;
239
        SYS_EOP_ok:
240
            if (Tx_mac_wr&&Tx_mac_sop)
241
                Next_state_SYS      =SYS_SOP;
242
            else
243
                Next_state_SYS      =SYS_idle;
244
        SYS_EOP_err:
245
            if (Tx_mac_wr&&Tx_mac_sop)
246
                Next_state_SYS      =SYS_SOP;
247
            else
248
                Next_state_SYS      =SYS_idle;
249
        SYS_SOP_err:
250
                Next_state_SYS      =SYS_DROP;
251
        SYS_DROP: //FIFO overflow           
252
            if (Tx_mac_wr&&Tx_mac_eop)
253
                Next_state_SYS      =SYS_EOP_err;
254
            else
255
                Next_state_SYS      =Current_state_SYS ;
256
        default:
257
                Next_state_SYS      =SYS_idle;
258
    endcase
259
 
260
//delay signals 
261
always @ (posedge Clk_SYS or posedge Reset)
262
    if (Reset)
263
        begin
264
        Tx_mac_wr_dl1           <=0;
265
        Tx_mac_data_dl1         <=0;
266
        Tx_mac_BE_dl1           <=0;
267
        Tx_mac_sop_dl1          <=0;
268
        Tx_mac_eop_dl1          <=0;
269
        end
270
    else
271
        begin
272
        Tx_mac_wr_dl1           <=Tx_mac_wr     ;
273
        Tx_mac_data_dl1         <=Tx_mac_data   ;
274
        Tx_mac_BE_dl1           <=Tx_mac_BE     ;
275
        Tx_mac_sop_dl1          <=Tx_mac_sop    ;
276
        Tx_mac_eop_dl1          <=Tx_mac_eop    ;
277
        end
278
 
279
always @(Current_state_SYS)
280
    if (Current_state_SYS==SYS_EOP_err)
281
        FF_FullErr      =1;
282
    else
283
        FF_FullErr      =0;
284
 
285
reg     Tx_mac_eop_gen;
286
 
287
always @(Current_state_SYS)
288
    if (Current_state_SYS==SYS_EOP_err||Current_state_SYS==SYS_EOP_ok)
289
        Tx_mac_eop_gen      =1;
290
    else
291
        Tx_mac_eop_gen      =0;
292
 
293
assign  Din={Tx_mac_eop_gen,FF_FullErr,Tx_mac_BE_dl1,Tx_mac_data_dl1};
294
 
295
always @(Current_state_SYS or Tx_mac_wr_dl1)
296
    if ((Current_state_SYS==SYS_SOP||Current_state_SYS==SYS_EOP_ok||
297
        Current_state_SYS==SYS_MOP||Current_state_SYS==SYS_EOP_err)&&Tx_mac_wr_dl1)
298
        Wr_en   = 1;
299
    else
300
        Wr_en   = 0;
301
 
302
 
303
//
304
 
305
 
306
always @ (posedge Reset or posedge Clk_SYS)
307
    if (Reset)
308
        Add_wr_gray         <=0;
309
    else
310
                begin
311
                Add_wr_gray[`MAC_RX_FF_DEPTH-1] <=Add_wr[`MAC_RX_FF_DEPTH-1];
312
                for (i=`MAC_RX_FF_DEPTH-2;i>=0;i=i-1)
313
                Add_wr_gray[i]                  <=Add_wr[i+1]^Add_wr[i];
314
                end
315
 
316
//
317
 
318
always @ (posedge Clk_SYS or posedge Reset)
319
    if (Reset)
320
        Add_rd_gray_dl1         <=0;
321
    else
322
        Add_rd_gray_dl1         <=Add_rd_gray;
323
 
324
always @ (posedge Clk_SYS or posedge Reset)
325
    if (Reset)
326
        Add_rd_jump_wr_pl1  <=0;
327
    else
328
        Add_rd_jump_wr_pl1  <=Add_rd_jump;
329
 
330
always @ (posedge Clk_SYS or posedge Reset)
331
    if (Reset)
332
        Add_rd_ungray       =0;
333
    else if (!Add_rd_jump_wr_pl1)
334
                begin
335
                Add_rd_ungray[`MAC_RX_FF_DEPTH-1]       =Add_rd_gray_dl1[`MAC_RX_FF_DEPTH-1];
336
                for (i=`MAC_RX_FF_DEPTH-2;i>=0;i=i-1)
337
                        Add_rd_ungray[i]            =Add_rd_ungray[i+1]^Add_rd_gray_dl1[i];
338
                end
339
assign          Add_wr_pluse        =Add_wr+1;
340
assign          Add_wr_pluse_pluse  =Add_wr+4;
341
 
342
always @ (Add_wr_pluse or Add_rd_ungray)
343
    if (Add_wr_pluse==Add_rd_ungray)
344
        Full    =1;
345
    else
346
        Full    =0;
347
 
348
always @ (posedge Clk_SYS or posedge Reset)
349
    if (Reset)
350
        AlmostFull  <=0;
351
    else if (Add_wr_pluse_pluse==Add_rd_ungray)
352
        AlmostFull  <=1;
353
    else
354
        AlmostFull  <=0;
355
 
356
always @ (posedge Clk_SYS or posedge Reset)
357
    if (Reset)
358
        Add_wr  <= 0;
359
    else if (Wr_en&&!Full)
360
        Add_wr  <= Add_wr +1;
361
 
362
 
363
//
364
always @ (posedge Clk_SYS or posedge Reset)
365
    if (Reset)
366
        begin
367
        Packet_number_sub_dl1   <=0;
368
        Packet_number_sub_dl2   <=0;
369
        end
370
    else
371
        begin
372
        Packet_number_sub_dl1   <=Pkt_sub_apply;
373
        Packet_number_sub_dl2   <=Packet_number_sub_dl1;
374
        end
375
 
376
always @ (posedge Clk_SYS or posedge Reset)
377
    if (Reset)
378
        Packet_number_sub_edge  <=0;
379
    else if (Packet_number_sub_dl1&!Packet_number_sub_dl2)
380
        Packet_number_sub_edge  <=1;
381
    else
382
        Packet_number_sub_edge  <=0;
383
 
384
always @ (posedge Clk_SYS or posedge Reset)
385
    if (Reset)
386
        Packet_number_add       <=0;
387
    else if (Current_state_SYS==SYS_EOP_ok||Current_state_SYS==SYS_EOP_err)
388
        Packet_number_add       <=1;
389
    else
390
        Packet_number_add       <=0;
391
 
392
 
393
always @ (posedge Clk_SYS or posedge Reset)
394
    if (Reset)
395
        Packet_number_inFF      <=0;
396
    else if (Packet_number_add&&!Packet_number_sub_edge)
397
        Packet_number_inFF      <=Packet_number_inFF + 1'b1;
398
    else if (!Packet_number_add&&Packet_number_sub_edge)
399
        Packet_number_inFF      <=Packet_number_inFF - 1'b1;
400
 
401
 
402
always @ (posedge Clk_SYS or posedge Reset)
403
    if (Reset)
404
        Packet_number_inFF_reg      <=0;
405
    else
406
        Packet_number_inFF_reg      <=Packet_number_inFF;
407
 
408
always @ (posedge Clk_SYS or posedge Reset)
409
    if (Reset)
410
        begin
411
        Add_rd_reg_rdy_dl1          <=0;
412
        Add_rd_reg_rdy_dl2          <=0;
413
        end
414
    else
415
        begin
416
        Add_rd_reg_rdy_dl1          <=Add_rd_reg_rdy;
417
        Add_rd_reg_rdy_dl2          <=Add_rd_reg_rdy_dl1;
418
        end
419
 
420
always @ (posedge Clk_SYS or posedge Reset)
421
    if (Reset)
422
        Add_rd_reg_dl1              <=0;
423
    else if (Add_rd_reg_rdy_dl1&!Add_rd_reg_rdy_dl2)
424
        Add_rd_reg_dl1              <=Add_rd_reg;
425
 
426
 
427
 
428
always @ (posedge Clk_SYS or posedge Reset)
429
    if (Reset)
430
        Fifo_data_count     <=0;
431
    else if (FullDuplex)
432
        Fifo_data_count     <=Add_wr[`MAC_RX_FF_DEPTH-1:`MAC_RX_FF_DEPTH-5]-Add_rd_ungray[`MAC_RX_FF_DEPTH-1:`MAC_RX_FF_DEPTH-5];
433
    else
434
        Fifo_data_count     <=Add_wr[`MAC_RX_FF_DEPTH-1:`MAC_RX_FF_DEPTH-5]-Add_rd_reg_dl1[`MAC_RX_FF_DEPTH-1:`MAC_RX_FF_DEPTH-5]; //for half duplex backoff requirement
435
 
436
 
437
always @ (posedge Clk_SYS or posedge Reset)
438
    if (Reset)
439
        Fifo_ra_tmp <=0;
440
    else if (Packet_number_inFF_reg>=1||Fifo_data_count>=Tx_Lwmark)
441
        Fifo_ra_tmp <=1;
442
    else
443
        Fifo_ra_tmp <=0;
444
 
445
always @ (posedge Clk_SYS or posedge Reset)
446
    if (Reset)
447
        begin
448
        Tx_Hwmark_pl        <=0;
449
        Tx_Lwmark_pl        <=0;
450
        end
451
    else
452
        begin
453
        Tx_Hwmark_pl        <=Tx_Hwmark;
454
        Tx_Lwmark_pl        <=Tx_Lwmark;
455
        end
456
 
457
always @ (posedge Clk_SYS or posedge Reset)
458
    if (Reset)
459
        Tx_mac_wa   <=0;
460
    else if (Fifo_data_count>=Tx_Hwmark_pl)
461
        Tx_mac_wa   <=0;
462
    else if (Fifo_data_count<Tx_Lwmark_pl)
463
        Tx_mac_wa   <=1;
464
 
465
//******************************************************************************
466
 
467
 
468
 
469
 
470
 
471
 
472
 
473
 
474
 
475
 
476
 
477
 
478
 
479
 
480
 
481
 
482
 
483
 
484
 
485
 
486
 
487
 
488
 
489
 
490
 
491
 
492
 
493
//******************************************************************************
494
//rd data to from FF .
495
//domain Clk_MAC
496
//******************************************************************************
497
reg[35:0]   Dout_dl1;
498
reg         Dout_reg_en /* synthesis syn_keep=1 */;
499
 
500
always @ (posedge Clk_MAC or posedge Reset)
501
    if (Reset)
502
        Dout_dl1    <=0;
503
    else
504
        Dout_dl1    <=Dout;
505
 
506
always @ (Current_state_MAC or Next_state_MAC)
507
    if ((Current_state_MAC==MAC_idle||Current_state_MAC==MAC_byte0)&&Next_state_MAC==MAC_byte3)
508
        Dout_reg_en     =1;
509
    else
510
        Dout_reg_en     =0;
511
 
512
always @ (posedge Clk_MAC or posedge Reset)
513
    if (Reset)
514
        Dout_reg        <=0;
515
    else if (Dout_reg_en)
516
        Dout_reg    <=Dout_dl1;
517
 
518
assign {Dout_eop,Dout_err,Dout_BE,Dout_data}=Dout_reg;
519
 
520
always @ (posedge Clk_MAC or posedge Reset)
521
    if (Reset)
522
        Current_state_MAC   <=MAC_idle;
523
    else
524
        Current_state_MAC   <=Next_state_MAC;
525
 
526
always @ (Current_state_MAC or Fifo_rd or Dout_BE or Dout_eop or Fifo_rd_retry
527
            or Fifo_rd_finish or Empty or Fifo_rd or Fifo_eop)
528
        case (Current_state_MAC)
529
            MAC_idle:
530
                if (Empty&&Fifo_rd)
531
                    Next_state_MAC=MAC_FF_Err;
532
                else if (Fifo_rd)
533
                    Next_state_MAC=MAC_byte3;
534
                else
535
                    Next_state_MAC=Current_state_MAC;
536
            MAC_byte3:
537
                if (Fifo_rd_retry)
538
                    Next_state_MAC=MAC_retry;
539
                else if (Fifo_eop)
540
                    Next_state_MAC=MAC_wait_finish;
541
                else if (Fifo_rd&&!Fifo_eop)
542
                    Next_state_MAC=MAC_byte2;
543
                else
544
                    Next_state_MAC=Current_state_MAC;
545
            MAC_byte2:
546
                if (Fifo_rd_retry)
547
                    Next_state_MAC=MAC_retry;
548
                else if (Fifo_eop)
549
                    Next_state_MAC=MAC_wait_finish;
550
                else if (Fifo_rd&&!Fifo_eop)
551
                    Next_state_MAC=MAC_byte1;
552
                else
553
                    Next_state_MAC=Current_state_MAC;
554
            MAC_byte1:
555
                if (Fifo_rd_retry)
556
                    Next_state_MAC=MAC_retry;
557
                else if (Fifo_eop)
558
                    Next_state_MAC=MAC_wait_finish;
559
                else if (Fifo_rd&&!Fifo_eop)
560
                    Next_state_MAC=MAC_byte0;
561
                else
562
                    Next_state_MAC=Current_state_MAC;
563
            MAC_byte0:
564
                if (Empty&&Fifo_rd&&!Fifo_eop)
565
                    Next_state_MAC=MAC_FFEmpty;
566
                else if (Fifo_rd_retry)
567
                    Next_state_MAC=MAC_retry;
568
                else if (Fifo_eop)
569
                    Next_state_MAC=MAC_wait_finish;
570
                else if (Fifo_rd&&!Fifo_eop)
571
                    Next_state_MAC=MAC_byte3;
572
                else
573
                    Next_state_MAC=Current_state_MAC;
574
            MAC_retry:
575
                    Next_state_MAC=MAC_idle;
576
            MAC_wait_finish:
577
                if (Fifo_rd_finish)
578
                    Next_state_MAC=MAC_pkt_sub;
579
                else
580
                    Next_state_MAC=Current_state_MAC;
581
            MAC_pkt_sub:
582
                    Next_state_MAC=MAC_idle;
583
            MAC_FFEmpty:
584
                if (!Empty)
585
                    Next_state_MAC=MAC_byte3;
586
                else
587
                    Next_state_MAC=Current_state_MAC;
588
            MAC_FF_Err:  //stopped state-machine need change                         
589
                    Next_state_MAC=Current_state_MAC;
590
            default
591
                    Next_state_MAC=MAC_idle;
592
        endcase
593
//
594
always @ (posedge Reset or posedge Clk_MAC)
595
    if (Reset)
596
        Add_rd_gray         <=0;
597
    else
598
                begin
599
                Add_rd_gray[`MAC_RX_FF_DEPTH-1] <=Add_rd[`MAC_RX_FF_DEPTH-1];
600
                for (i=`MAC_RX_FF_DEPTH-2;i>=0;i=i-1)
601
                Add_rd_gray[i]                  <=Add_rd[i+1]^Add_rd[i];
602
                end
603
//
604
 
605
always @ (posedge Clk_MAC or posedge Reset)
606
    if (Reset)
607
        Add_wr_gray_dl1     <=0;
608
    else
609
        Add_wr_gray_dl1     <=Add_wr_gray;
610
 
611
always @ (posedge Clk_MAC or posedge Reset)
612
    if (Reset)
613
        Add_wr_ungray       =0;
614
    else
615
                begin
616
                Add_wr_ungray[`MAC_RX_FF_DEPTH-1]       =Add_wr_gray_dl1[`MAC_RX_FF_DEPTH-1];
617
                for (i=`MAC_RX_FF_DEPTH-2;i>=0;i=i-1)
618
                        Add_wr_ungray[i]        =Add_wr_ungray[i+1]^Add_wr_gray_dl1[i];
619
                end
620
//empty     
621
always @ (posedge Clk_MAC or posedge Reset)
622
    if (Reset)
623
        Empty   <=1;
624
    else if (Add_rd==Add_wr_ungray)
625
        Empty   <=1;
626
    else
627
        Empty   <=0;
628
 
629
//ra
630
always @ (posedge Clk_MAC or posedge Reset)
631
    if (Reset)
632
        Fifo_ra <=0;
633
    else
634
        Fifo_ra <=Fifo_ra_tmp;
635
 
636
 
637
 
638
always @ (posedge Clk_MAC or posedge Reset)
639
    if (Reset)
640
        Pkt_sub_apply_tmp   <=0;
641
    else if (Current_state_MAC==MAC_pkt_sub)
642
        Pkt_sub_apply_tmp   <=1;
643
    else
644
        Pkt_sub_apply_tmp   <=0;
645
 
646
always @ (posedge Clk_MAC or posedge Reset)
647
    if (Reset)
648
        Pkt_sub_apply   <=0;
649
    else if ((Current_state_MAC==MAC_pkt_sub)||Pkt_sub_apply_tmp)
650
        Pkt_sub_apply   <=1;
651
    else
652
        Pkt_sub_apply   <=0;
653
 
654
//reg Add_rd for collison retry
655
always @ (posedge Clk_MAC or posedge Reset)
656
    if (Reset)
657
        Add_rd_reg      <=0;
658
    else if (Fifo_rd_finish)
659
        Add_rd_reg      <=Add_rd;
660
 
661
always @ (posedge Clk_MAC or posedge Reset)
662
    if (Reset)
663
        Add_rd_reg_rdy_tmp      <=0;
664
    else if (Fifo_rd_finish)
665
        Add_rd_reg_rdy_tmp      <=1;
666
    else
667
        Add_rd_reg_rdy_tmp      <=0;
668
 
669
always @ (posedge Clk_MAC or posedge Reset)
670
    if (Reset)
671
        Add_rd_reg_rdy      <=0;
672
    else if (Fifo_rd_finish||Add_rd_reg_rdy_tmp)
673
        Add_rd_reg_rdy      <=1;
674
    else
675
        Add_rd_reg_rdy      <=0;
676
 
677
reg Add_rd_add /* synthesis syn_keep=1 */;
678
 
679
always @ (Current_state_MAC or Next_state_MAC)
680
    if ((Current_state_MAC==MAC_idle||Current_state_MAC==MAC_byte0)&&Next_state_MAC==MAC_byte3)
681
        Add_rd_add  =1;
682
    else
683
        Add_rd_add  =0;
684
 
685
 
686
always @ (posedge Clk_MAC or posedge Reset)
687
    if (Reset)
688
        Add_rd          <=0;
689
    else if (Current_state_MAC==MAC_retry)
690
        Add_rd          <= Add_rd_reg;
691
    else if (Add_rd_add)
692
        Add_rd          <= Add_rd + 1;
693
 
694
always @ (posedge Clk_MAC or posedge Reset)
695
        if (Reset)
696
            Add_rd_jump_tmp <=0;
697
        else if (Current_state_MAC==MAC_retry)
698
            Add_rd_jump_tmp <=1;
699
        else
700
            Add_rd_jump_tmp <=0;
701
 
702
always @ (posedge Clk_MAC or posedge Reset)
703
        if (Reset)
704
            Add_rd_jump_tmp_pl1 <=0;
705
        else
706
            Add_rd_jump_tmp_pl1 <=Add_rd_jump_tmp;
707
 
708
always @ (posedge Clk_MAC or posedge Reset)
709
        if (Reset)
710
            Add_rd_jump <=0;
711
        else if (Current_state_MAC==MAC_retry)
712
            Add_rd_jump <=1;
713
        else if (Add_rd_jump_tmp_pl1)
714
            Add_rd_jump <=0;
715
 
716
//gen Fifo_data 
717
 
718
 
719
always @ (Dout_data or Current_state_MAC)
720
    case (Current_state_MAC)
721
        MAC_byte3:
722
            Fifo_data   =Dout_data[31:24];
723
        MAC_byte2:
724
            Fifo_data   =Dout_data[23:16];
725
        MAC_byte1:
726
            Fifo_data   =Dout_data[15:8];
727
        MAC_byte0:
728
            Fifo_data   =Dout_data[7:0];
729
        default:
730
            Fifo_data   =0;
731
    endcase
732
//gen Fifo_da           
733
always @ (posedge Clk_MAC or posedge Reset)
734
    if (Reset)
735
        Fifo_rd_dl1     <=0;
736
    else
737
        Fifo_rd_dl1     <=Fifo_rd;
738
 
739
always @ (posedge Clk_MAC or posedge Reset)
740
    if (Reset)
741
        Fifo_da         <=0;
742
    else if ((Current_state_MAC==MAC_byte0||Current_state_MAC==MAC_byte1||
743
              Current_state_MAC==MAC_byte2||Current_state_MAC==MAC_byte3)&&Fifo_rd&&!Fifo_eop)
744
        Fifo_da         <=1;
745
    else
746
        Fifo_da         <=0;
747
 
748
//gen Fifo_data_err_empty
749
assign  Fifo_data_err_full=Dout_err;
750
//gen Fifo_data_err_empty
751
always @ (posedge Clk_MAC or posedge Reset)
752
    if (Reset)
753
        Current_state_MAC_reg   <=0;
754
    else
755
        Current_state_MAC_reg   <=Current_state_MAC;
756
 
757
always @ (posedge Clk_MAC or posedge Reset)
758
    if (Reset)
759
        Fifo_data_err_empty     <=0;
760
    else if (Current_state_MAC_reg==MAC_FFEmpty)
761
        Fifo_data_err_empty     <=1;
762
    else
763
        Fifo_data_err_empty     <=0;
764
 
765
always @ (posedge Clk_MAC)
766
    if (Current_state_MAC_reg==MAC_FF_Err)
767
        begin
768
        $finish(2);
769
        $display("mac_tx_FF meet error status at time :%t",$time);
770
        end
771
 
772
//gen Fifo_eop aligned to last valid data byte¡£            
773
always @ (Current_state_MAC or Dout_eop)
774
    if (((Current_state_MAC==MAC_byte0&&Dout_BE==2'b00||
775
        Current_state_MAC==MAC_byte1&&Dout_BE==2'b11||
776
        Current_state_MAC==MAC_byte2&&Dout_BE==2'b10||
777
        Current_state_MAC==MAC_byte3&&Dout_BE==2'b01)&&Dout_eop))
778
        Fifo_eop        =1;
779
    else
780
        Fifo_eop        =0;
781
//******************************************************************************
782
//******************************************************************************
783
 
784
duram #(36,`MAC_TX_FF_DEPTH,"M4K") U_duram(
785
.data_a         (Din        ),
786
.wren_a         (Wr_en      ),
787
.address_a      (Add_wr     ),
788
.address_b      (Add_rd     ),
789
.clock_a        (Clk_SYS    ),
790
.clock_b        (Clk_MAC    ),
791
.q_b            (Dout       ));
792
 
793
endmodule

powered by: WebSVN 2.1.0

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