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

Subversion Repositories sgmii

[/] [sgmii/] [trunk/] [build/] [OpenCore_MAC/] [MAC_tx_FF.v] - Blame information for rev 26

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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