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

Subversion Repositories ethmac10g

[/] [ethmac10g/] [trunk/] [rtl/] [verilog/] [tx_engine/] [TransmitTop.v] - Blame information for rev 72

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 39 fisher5090
/////////////////////////////////////////////////////////////////////////////
2
//
3
//              Name of module 
4
//              23/1/06 - So far Mentor Precision indicates the current system runs as 101 MHz.
5
//
6
/////////////////////////////////////////////////////////////////////////////
7
module TRANSMIT_TOP(
8
TX_DATA,
9
TX_DATA_VALID,
10
TX_CLK,
11
RESET,
12
TX_START,
13
TX_ACK,
14
TX_UNDERRUN,
15
TX_IFG_DELAY,
16
RXTXLINKFAULT,
17
LOCALLINKFAULT,
18
TX_STATS_VALID,
19
TXSTATREGPLUS,
20
TXD,
21
TXC,
22
FC_TRANS_PAUSEDATA,
23
FC_TRANS_PAUSEVAL,
24
FC_TX_PAUSEDATA,
25
FC_TX_PAUSEVALID,
26
TX_CFG_REG_VALUE,
27
TX_CFG_REG_VALID
28
);
29
 
30
 
31
/////////////////////////////////////////////////////////////////////////////
32
//
33
//              Input and output ports definitions
34
//
35
/////////////////////////////////////////////////////////////////////////////
36
 
37
//Input from user logic
38
input [63:0] TX_DATA;
39
input [7:0] TX_DATA_VALID; // To accept the data valid to be available
40
input TX_CLK;
41
input RESET;
42
input TX_START; // This signify the first frame of data
43
input TX_UNDERRUN; // this will cause an error to be injected into the data
44
input [7:0] TX_IFG_DELAY; // this will cause a delay in the ack signal
45
 
46
//input to transmit fault signals
47
input RXTXLINKFAULT;
48
input LOCALLINKFAULT;
49
 
50
input [31:0] TX_CFG_REG_VALUE;
51
input TX_CFG_REG_VALID;
52
 
53
//output to stat register
54
output TX_STATS_VALID;
55
output [24:0] TXSTATREGPLUS; // a pulse for each reg for stats
56
 
57
//output to user logic
58
output TX_ACK; //Generated by a counter
59
 
60
//output to XGMII
61
output [63:0] TXD;
62
output [7:0] TXC;
63
 
64
//output [15:0] BYTE_COUNTER_OUT;
65
 
66
//Pause inputs
67
//Transmit pause frames
68
input [15:0] FC_TRANS_PAUSEDATA; //pause frame data
69
input FC_TRANS_PAUSEVAL; //pulse signal to indicate a pause frame to be sent
70
 
71
//apply pause timing
72
input [15:0] FC_TX_PAUSEDATA;
73
input FC_TX_PAUSEVALID;
74
 
75
 
76
 
77
/////////////////////////////////////////////////////////////////////////////
78
//
79
//              Definitions and parameters
80
//
81
/////////////////////////////////////////////////////////////////////////////
82
 
83
//possibility to put this in a package.
84
 
85
//opcode definitions
86
parameter PAUSE_OPCODE = 16'b1000100000001000; //8808
87
parameter  VLAN_OPCODE = 16'b1000000100000000; //8100
88
 
89
//frame size definitions
90
parameter VLAN_FRAME_SIZE = 16'b0000010111110010;//1522 bytes
91
parameter JUMBO_FRAME_SIZE = 16'b0010001100101000;//9000 bytes
92
parameter NORMAL_FRAME_SIZE = 16'b0000010111101110;//1518 bytes
93
parameter MIN_FRAME_SIZE = 16'b0000000000111100; //60 bytes
94
 
95
 
96
//Frame definition
97
parameter IDLE_FRAME = 8'b00000111; //only six preambles as the first preamble is converted into a start flag
98
parameter IDLE_FRAME_8BYTES = 64'b0000011100000111000001110000011100000111000001110000011100000111;
99
parameter START_SEQ = 64'b1010101110101010101010101010101010101010101010101010101011111011;
100
parameter LOCAL_FAULT_SEQ = 64'b0000000100000000000000000000000000000001000000000000000000000000;
101
parameter REMOTE_FAULT_SEQ = 64'b0000001000000000000000000000000000000010000000000000000000000000;
102
parameter START_FRAME = 8'b11111011; //only valid in frame 0
103
parameter TERMINATE_FRAME = 8'b11111101;
104
parameter SFD_FRAME = 8'b10101011;
105
parameter PREAMBLE_FRAME = 8'b10101010;
106
parameter ERROR_FRAME = 8'b11111110;
107
 
108
 
109
parameter SOURCE_ADDR = 48'h010101010101;
110
parameter DEST_ADDR = 48'h101010101010;
111
 
112
parameter PAUSE_FRAME_LENGTH = 8'h02;
113
 
114
 
115
//need a parameter for min frame gap.
116
 
117
//Link fault signalling
118
// send lane 0
119
 
120
 
121
/////////////////////////////////////////////////////////////////////////////
122
//
123
//              Registers and wires
124
//
125
/////////////////////////////////////////////////////////////////////////////
126
 
127
 
128
 
129
 
130
wire  TX_ACK;
131
 
132
reg  [24:0] TXSTATREGPLUS;
133
 
134
reg  TX_STATS_VALID;
135
 
136
reg FRAME_START;
137
 
138
wire reset_int;
139
 
140
reg [15:0] DELAY_ACK;
141
 
142
reg [7:0] TX_DATA_VALID_REG;
143
reg [7:0] TX_DATA_VALID_DEL1;
144
reg [7:0] TX_DATA_VALID_DEL2;
145
reg [7:0] TX_DATA_VALID_DEL3;
146
reg [7:0] TX_DATA_VALID_DEL4;
147
reg [7:0] TX_DATA_VALID_DEL5;
148
reg [7:0] TX_DATA_VALID_DEL6;
149
reg [7:0] TX_DATA_VALID_DEL7;
150
reg [7:0] TX_DATA_VALID_DEL8;
151
reg [7:0] TX_DATA_VALID_DEL9;
152
reg [7:0] TX_DATA_VALID_DEL10;
153
reg [7:0] TX_DATA_VALID_DEL11;
154
reg [7:0] TX_DATA_VALID_DEL12;
155
reg [7:0] TX_DATA_VALID_DEL13;
156
reg [7:0] TX_DATA_VALID_DEL14;
157
reg [7:0] TX_DATA_VALID_DEL15;
158
 
159
reg [63:0] TX_DATA_DEL1;
160
reg [63:0] TX_DATA_DEL2;
161
reg [63:0] TX_DATA_DEL3;
162
reg [63:0] TX_DATA_DEL4;
163
reg [63:0] TX_DATA_DEL5;
164
reg [63:0] TX_DATA_DEL6;
165
reg [63:0] TX_DATA_DEL7;
166
reg [63:0] TX_DATA_DEL8;
167
reg [63:0] TX_DATA_DEL9;
168
reg [63:0] TX_DATA_DEL10;
169
reg [63:0] TX_DATA_DEL11;
170
reg [63:0] TX_DATA_DEL12;
171
reg [63:0] TX_DATA_DEL13;
172
reg [63:0] TX_DATA_DEL14;
173
reg [63:0] TX_DATA_DEL15;
174
 
175
reg [7:0] OVERFLOW_VALID;
176
reg [63:0] OVERFLOW_DATA;
177
 
178
reg [63:0] TXD;
179
reg [7:0] TXC;
180
 
181
reg [63:0] TX_DATA_REG, TX_DATA_VALID_DELAY;
182
 
183
wire [31:0] CRC_32_64;
184
 
185
wire [15:0] BYTE_COUNTER;
186
 
187
reg frame_start_del;
188
 
189
reg transmit_pause_frame_del, transmit_pause_frame_del2, transmit_pause_frame, append_start_pause, append_start_pause_del , transmit_pause_frame_valid, reset_err_pause, load_CRC8, transmit_pause_frame_del3;
190
 
191
reg [7:0] tx_data_int;
192
reg start_CRC8, START_CRC8_DEL;
193
reg append_end_frame;
194
 
195
 
196
reg insert_error;
197
 
198
reg [7:0] store_tx_data_valid;
199
reg [63:0] store_tx_data;
200
reg [31:0] store_CRC64;
201
reg [7:0] store_valid;
202
reg load_final_CRC;
203
 
204
reg [15:0] final_byte_count, byte_count_reg;
205
 
206
wire [31:0] CRC_OUT;
207
 
208
reg [9:0] append_reg;
209
 
210
 
211
reg [15:0] length_register;
212
 
213
reg tx_undderrun_int;
214
 
215
reg [15:0] MAX_FRAME_SIZE;
216
 
217
reg vlan_enabled_int;
218
reg jumbo_enabled_int;
219
reg tx_enabled_int;
220
reg fcs_enabled_int;
221
reg reset_tx_int;
222
reg read_ifg_int;
223
 
224
reg apply_pause_delay;
225
reg [15:0] store_pause_frame;
226
 
227
reg [63:0] TXD_PAUSE_DEL0;
228
reg [63:0] TXD_PAUSE_DEL1;
229
reg [63:0] TXD_PAUSE_DEL2;
230
 
231
reg [7:0] TXC_PAUSE_DEL0;
232
reg [7:0] TXC_PAUSE_DEL1;
233
reg [7:0] TXC_PAUSE_DEL2;
234
 
235
reg PAUSEVAL_DEL;
236
reg PAUSEVAL_DEL1;
237
reg PAUSEVAL_DEL2;
238
wire RESET_ERR_PAUSE;
239
 
240
reg set_pause_stats;
241
reg [15:0] store_transmit_pause_value;
242
reg [3:0] pause_frame_counter;
243
reg [63:0] shift_pause_data;
244
 
245
reg [7:0] shift_pause_valid;
246
reg [7:0] shift_pause_valid_del;
247
 
248
reg [14:0] byte_count_stat;
249
 
250
reg [24:0] txstatplus_int;
251
 
252
 
253
/////////////////////////////////////////////////////////////////////////////
254
//
255
//              Start of code
256
//
257
/////////////////////////////////////////////////////////////////////////////
258
 
259
 
260
 
261
 
262
//TODO
263
 
264
//RX side. need to be able to receive data and calculate the CRC switching between 64 and 8 bit datapath.
265
//Therefore, the data need to be counted correctly.
266
//ERROR checking module or process will be needed. This will check if frame is correct length.
267
//Need to be able to remove redundant frames or columns and also padding. The error module will
268
//also check the tx_underrun signal as well.
269
 
270
//need to be able to cut-off bytes. 
271
 
272
//Need to add the link fault signalling and config registers.
273
 
274
 
275
//TX side. need to be able to insert the CRC with the data.
276
//need to define the first column of txd which is START 6 PRE and SFD.
277
//need to be able invert data_valid for txc.
278
//need to be able to transmit IDLEs.
279
 
280
 
281
//Format of output
282
//IDLE 07, START FB TERMINATE FD SFD 10101011 PREAMBLE 10101010  ERROR FE.
283
 
284
//IDLE START PREAMBLE SFD DA SA L/T DATA TERMINATE IDLE
285
 
286
 
287
 
288
 
289
 
290
 
291
 
292
 
293
/////////////////////////////////////////////////////////////////////////////
294
//
295
//              Ack counter
296
//
297
/////////////////////////////////////////////////////////////////////////////
298
 
299
 
300
//Ack counter. need to be able to load the frame length, pause frame inter frame delay into the ack counter
301
// as this will delay the ack signal. The ack signal will initiate the rest of the data transmission from the
302
// user logic.
303
 
304
//need to stop the ack signal from transmitting when a PAUSE frame is transmitting
305
 
306
// Connect DUT to test bench 
307
ack_counter U_ACK_CNT(
308
.clock(TX_CLK),
309
.reset(reset_int | reset_tx_int),
310
.ready(FRAME_START | transmit_pause_frame),
311
.tx_start(TX_START),
312
.max_count(DELAY_ACK),
313
.tx_ack(TX_ACK)
314
);
315
 
316
//CRC for 64 bit data
317
//This seem to be one of the culprit for the timing violation
318
CRC32_D64 U_CRC64(
319
.DATA_IN(TX_DATA_REG), //need to swap between pause data
320
.CLK(TX_CLK),
321
.RESET(reset_int | TX_ACK | append_start_pause),
322
.START(frame_start_del | transmit_pause_frame_valid),
323
.CRC_OUT(CRC_32_64) //need to switch to output some how for a pause frame
324
);
325
 
326
 
327
//CRC for 8 bit data
328
CRC32_D8 U_CRC8(
329
.DATA_IN(tx_data_int), //8bit data
330
.CLK(TX_CLK),
331
.RESET(reset_int),
332
.START(start_CRC8),  //this signal will be use to start
333
.LOAD(load_CRC8), //use this to load first
334
.CRC_IN(CRC_32_64),
335
.CRC_OUT(CRC_OUT)
336
);
337
 
338
 
339
//The start signal need to be high for the count
340
//This seem to be one of the culprit for the timing violation
341
byte_count_module U_byte_count_module(
342
.CLK(TX_CLK),
343
.RESET(reset_int | TX_ACK),
344
.START(frame_start_del & FRAME_START),
345
.BYTE_COUNTER(BYTE_COUNTER)
346
);
347
 
348
 
349
 
350
/////////////////////////////////////////////////////////////////////////////
351
//
352
//      PAUSE FRAME
353
//
354
/////////////////////////////////////////////////////////////////////////////
355
 
356
always @(posedge TX_CLK)
357
begin
358
  PAUSEVAL_DEL <= FC_TRANS_PAUSEVAL;
359
  PAUSEVAL_DEL1 <= PAUSEVAL_DEL;
360
  PAUSEVAL_DEL2 <= PAUSEVAL_DEL1;
361
end
362
 
363
always @(posedge TX_CLK or posedge reset_int)
364
begin
365
  if (reset_int) begin
366
    transmit_pause_frame <= 0;
367
  end
368
  else if (PAUSEVAL_DEL2) begin
369
    transmit_pause_frame <= 1;
370
  end
371
  else if (pause_frame_counter == 8) begin
372
    transmit_pause_frame <= 0;
373
  end
374
end
375
 
376
always @(posedge TX_CLK or posedge reset_int)
377
begin
378
  if (reset_int) begin
379
    set_pause_stats <= 0;
380
  end
381
  else if (PAUSEVAL_DEL2) begin
382
    set_pause_stats <= 1;
383
  end
384
  else if (append_end_frame) begin
385
    set_pause_stats <= 0;
386
  end
387
end
388
 
389
always @(posedge TX_CLK or posedge reset_int)
390
begin
391
  if (reset_int) begin
392
    TXD_PAUSE_DEL0 <= 0;
393
    TXD_PAUSE_DEL1 <= 0;
394
    TXD_PAUSE_DEL2 <= 0;
395
 
396
    TXC_PAUSE_DEL0 <= 0;
397
    TXC_PAUSE_DEL1 <= 0;
398
    TXC_PAUSE_DEL2 <= 0;
399
 
400
 
401
    store_transmit_pause_value <= 0;
402
  end
403
  else if (FC_TRANS_PAUSEVAL) begin
404
    store_transmit_pause_value <= FC_TRANS_PAUSEDATA;
405
    TXD_PAUSE_DEL1 <= {DEST_ADDR, SOURCE_ADDR[47:32]};
406
    TXD_PAUSE_DEL2 <= {SOURCE_ADDR[31:0], PAUSE_FRAME_LENGTH, PAUSE_OPCODE, FC_TRANS_PAUSEDATA};
407
 
408
    TXC_PAUSE_DEL1 <= 8'hff;
409
    TXC_PAUSE_DEL2 <= 8'hff;
410
 
411
  end
412
end
413
 
414
 
415
always @(posedge TX_CLK or posedge reset_int)
416
begin
417
  if (reset_int) begin
418
    pause_frame_counter <= 0;
419
  end
420
  else if (transmit_pause_frame & !FRAME_START) begin
421
    pause_frame_counter <= pause_frame_counter + 1;
422
  end
423
end
424
 
425
 
426
always @(posedge TX_CLK or posedge reset_int)
427
begin
428
  if (reset_int) begin
429
    shift_pause_data <= 0;
430
    shift_pause_valid_del <= 0;
431
    shift_pause_valid <= 0;
432
  end
433
  else if (transmit_pause_frame & !FRAME_START) begin
434
    if (pause_frame_counter == 0) begin
435
      shift_pause_data <= TXD_PAUSE_DEL1;
436
    end
437
    else if (pause_frame_counter == 1) begin
438
      shift_pause_data <= TXD_PAUSE_DEL2;
439
    end
440
    else begin
441
      shift_pause_data <= 0;
442
    end
443
 
444
    if (pause_frame_counter == 7) begin
445
      shift_pause_valid <= 8'h0f;
446
    end
447
    else if (pause_frame_counter < 7) begin
448
      shift_pause_valid <= 8'hff;
449
    end
450
    else begin
451
      shift_pause_valid <= 0;
452
    end
453
    shift_pause_valid_del <= shift_pause_valid;
454
  end
455
  else begin
456
    shift_pause_data <= 0;
457
    shift_pause_valid <= 0;
458
    shift_pause_valid_del <= shift_pause_valid;
459
  end
460
end
461
 
462
 
463
 
464
 
465
always @(posedge reset_int or posedge TX_CLK)
466
begin
467
  if (reset_int) begin
468
    FRAME_START <= 0;
469
  end
470
  else if (TX_ACK) begin
471
    FRAME_START <= 1;
472
  end
473
  else if ((TX_DATA_VALID_REG != 8'hff) & (BYTE_COUNTER != 0)) begin
474
    FRAME_START <= 0;
475
  end
476
end
477
 
478
 
479
 
480
 
481
assign reset_int = RESET;
482
 
483
 
484
//TXSTATREGPLUS[24:0]
485
//24 pause_frame transmitted - count when pause flag is set
486
//23 to 20 bytes valid
487
//19 vlan frame - asserted if previous frame was a VLAN - just check if VLAN been set
488
//18 to 5 last frame length count in bytes stick to 16383 when jumbo frame is greater than value - just load the byte count
489
//4 if last frame has control type code 88-08 in the length type field - pause frame - check if pause flag is set
490
//3 underrun frame - check if underrun is set
491
//2 multicast frame - 01-80-C2-00-00-01 use for pause frame
492
//1 broadcast frame - al ones  
493
//0 sucessful frame - check if error occurred -use insert error flag
494
 
495
 
496
//TX_STATS_VALID - need to be driving after a frame transmission - use load_overflow signal
497
 
498
 
499
always @(posedge TX_CLK or posedge reset_int)
500
begin
501
  if (reset_int) begin
502
    txstatplus_int <= 0;
503
  end
504
  else if (load_final_CRC) begin
505
    if (insert_error) begin
506
      txstatplus_int[3] <= 1;
507
    end
508
    if (set_pause_stats) begin
509
      txstatplus_int[24] <= 1;
510
      txstatplus_int[4] <= 1;
511
      txstatplus_int[2] <= 1;
512
      txstatplus_int[1] <= 1;
513
      txstatplus_int[18:5] <= 512;
514
    end
515
    if (vlan_enabled_int) begin
516
      txstatplus_int[19] <= 1;
517
    end
518
    else begin
519
      if (final_byte_count[15] == 1) begin
520
        txstatplus_int[18:5] <= 16383;
521
      end
522
      else begin
523
        txstatplus_int[18:5] <= byte_count_stat;
524
      end
525
    end
526
  end
527
  else begin
528
    txstatplus_int <= 0;
529
  end
530 51 fisher5090
end
531 39 fisher5090
 
532 51 fisher5090
always @(posedge TX_CLK)
533
begin
534 39 fisher5090
  TXSTATREGPLUS <= txstatplus_int;
535
  TX_STATS_VALID <= append_end_frame;
536
end
537
 
538
 
539
//input [31:0] TX_CFG_REG_VALUE;
540
//24:0 reserved
541
//25 default to 0 - min frame  - 1 adjust frame delay by reading inter-frame gap delay reg - DELAY_ACK signal
542
//26 WAN - not used
543
//27 VLAN enable default to 0, 1 enabled
544
//28 default to 1 - transmitter enbaled, 0 - transmitter disabled - possibly used to reset
545
//29 default to 0 FCS enabled, 1 FCS disabled
546
//30 default to 0,  1 - Jumbo frame enabled
547
//31 deafult to 0, 1 - reset transmitter
548
 
549
//input TX_CFG_REG_VALID;
550
 
551
always @(posedge TX_CLK or posedge reset_int)
552
begin
553
  if (reset_int) begin
554
    vlan_enabled_int <= 0;
555
    jumbo_enabled_int <= 0;
556
    tx_enabled_int <= 0;
557
    fcs_enabled_int <= 1;
558
    reset_tx_int <= 0;
559
    read_ifg_int <= 0;
560
  end
561
  else if (TX_CFG_REG_VALID) begin
562
    vlan_enabled_int <= TX_CFG_REG_VALUE[27];
563
    jumbo_enabled_int <= TX_CFG_REG_VALUE[30];
564
    tx_enabled_int <= TX_CFG_REG_VALUE[28]; // Stop ack from generated, hold reset
565
    fcs_enabled_int <= TX_CFG_REG_VALUE[29];
566
    reset_tx_int <= TX_CFG_REG_VALUE[31];
567
    read_ifg_int <= TX_CFG_REG_VALUE[25];
568
  end
569
end
570
 
571
 
572
//Load the delay value for the acknowledge signal
573
always @(posedge TX_CLK or posedge reset_int)
574
begin
575
   if (reset_int) begin
576
     DELAY_ACK <= 16'h0001;
577
   end
578
   else if (apply_pause_delay) begin
579
     DELAY_ACK <= store_pause_frame;
580
   end
581
   else if (read_ifg_int) begin
582
     DELAY_ACK <= TX_IFG_DELAY;
583
   end
584
 end
585
 
586
 
587
//Need to expand to be setup by the config register
588
//1514 with out FCS added, 1518 when FCS is added
589
//1518 without FCS added, 1522 when FCS is added
590
always @(posedge TX_CLK or posedge reset_int)
591
begin
592
  if (reset_int) begin
593
    MAX_FRAME_SIZE <= 1514;
594
  end
595
  else begin
596
    if (vlan_enabled_int) begin
597
      if (fcs_enabled_int) begin
598
        MAX_FRAME_SIZE <= 1522;
599
      end
600
      else begin
601
        MAX_FRAME_SIZE <= 1518;
602
      end
603
    end
604
    else if (jumbo_enabled_int) begin
605
     if (fcs_enabled_int) begin
606
        MAX_FRAME_SIZE <= 1518;
607
      end
608
      else begin
609
        MAX_FRAME_SIZE <= 1514;
610
      end
611
    end
612
    else begin
613
      if (fcs_enabled_int) begin
614
        MAX_FRAME_SIZE <= 1518;
615
      end
616
      else begin
617
        MAX_FRAME_SIZE <= 1514;
618
      end
619
    end
620
  end
621
end
622
 
623
 
624
 
625
 
626
always @(posedge TX_CLK)
627
begin
628
  if (reset_int) begin
629
    tx_undderrun_int <= 0;
630
  end
631 51 fisher5090
  else if (append_end_frame)begin
632 39 fisher5090
    tx_undderrun_int <= 0;
633
  end
634 51 fisher5090
  else if (TX_UNDERRUN) begin
635 39 fisher5090
    tx_undderrun_int <= 1;
636
  end
637
end
638
 
639
//Indicate an error
640
always @(posedge TX_CLK or posedge reset_int)
641
begin
642
  if (reset_int) begin
643
     insert_error <= 0;
644
  end
645
  else if (append_end_frame | reset_err_pause) begin
646
     insert_error <= 0;
647
  end
648
  else if (load_CRC8) begin
649
        if (tx_undderrun_int == 1) begin
650
          insert_error <= 1;
651
        end
652
        else begin
653
          if (length_register == final_byte_count) begin
654
            if (final_byte_count <= MAX_FRAME_SIZE) begin
655
              insert_error <= 0;
656
          end
657
          else begin
658
            insert_error <= 1;
659
          end
660
        end
661
        else if (length_register < MIN_FRAME_SIZE) begin
662
          if (final_byte_count == 64) begin
663
            insert_error <= 0;
664
          end
665
          else begin
666
            insert_error <= 1;
667
          end
668
        end
669
        else begin
670
          insert_error <= 1;
671
        end
672
     end
673
  end
674
end
675
 
676
 
677
//use for delaying the ack signal when pause is required
678
always @(posedge TX_CLK or posedge reset_int)
679
begin
680
   if (reset_int) begin
681
     apply_pause_delay <= 0;
682
     store_pause_frame <= 0;
683
   end
684
   else if (TX_ACK) begin
685
     apply_pause_delay <= 0;
686
     store_pause_frame <= 0;
687
   end
688
   else if (FC_TX_PAUSEVALID) begin
689
     apply_pause_delay <= 1;
690
     store_pause_frame <= FC_TX_PAUSEDATA;
691
   end
692
end
693
 
694
 
695
 
696
 
697
always @(posedge TX_CLK)
698
begin
699
  if (TX_START) begin
700
    TX_DATA_VALID_DELAY <= IDLE_FRAME_8BYTES;
701
  end
702
  else begin
703
    TX_DATA_VALID_DELAY <= TX_DATA;
704
  end
705
end
706
 
707
 
708
 
709
//Shift valid into the system and also ensuring min frame is achieved
710
always @(posedge TX_CLK or posedge reset_int)
711
begin
712
  if (reset_int) begin
713
   TX_DATA_VALID_REG <= 0;
714
  end
715
  else if (FRAME_START) begin
716
   if (BYTE_COUNTER < 48) begin
717
     TX_DATA_VALID_REG <= 8'b11111111;
718
   end
719
   else if (BYTE_COUNTER == 48) begin
720
     if (TX_START) begin
721
       TX_DATA_VALID_REG <= 8'b00001111;
722
     end
723
     else begin
724
       TX_DATA_VALID_REG <= 8'b00001111 | TX_DATA_VALID;
725
     end
726
   end
727
   else begin
728
     if (TX_START) begin
729
       TX_DATA_VALID_REG <= 0;
730
     end
731
     else begin
732
         TX_DATA_VALID_REG <= TX_DATA_VALID;
733
     end
734
   end
735
  end
736
  else if (transmit_pause_frame_del) begin
737
     TX_DATA_VALID_REG <= shift_pause_valid_del;
738
  end
739
  else begin
740
   TX_DATA_VALID_REG <= 0;
741
  end
742
end
743
 
744
 
745
//Shifting data to the system. Also ensuring min frame is achieved
746
always @(posedge TX_CLK or posedge reset_int)
747
begin
748
  if (reset_int) begin
749
     TX_DATA_REG <= IDLE_FRAME_8BYTES;
750
  end
751
  else if (FRAME_START) begin
752
     if (BYTE_COUNTER < 56) begin
753
        case (TX_DATA_VALID_REG)
754
        8'b00000000 : begin
755
                      TX_DATA_REG <= TX_DATA_VALID_DELAY;
756
                    end
757
        8'b00000001 : begin
758
                      TX_DATA_REG <= {56'h00000000000000, TX_DATA_VALID_DELAY[7:0]};
759
                    end
760
        8'b00000011 : begin
761
                      TX_DATA_REG <= {48'h000000000000, TX_DATA_VALID_DELAY[15:0]};
762
                    end
763
        8'b00000111 : begin
764
                      TX_DATA_REG <= {40'h0000000000, TX_DATA_VALID_DELAY[23:0]};
765
                    end
766
        8'b00001111 : begin
767
                      TX_DATA_REG <= {32'h00000000, TX_DATA_VALID_DELAY[31:0]};
768
                    end
769
        8'b00011111 : begin
770
                      TX_DATA_REG <= {24'h000000, TX_DATA_VALID_DELAY[39:0]};
771
                    end
772
        8'b00111111 : begin
773
                      TX_DATA_REG <= {16'h0000, TX_DATA_VALID_DELAY[47:0]};
774
                    end
775
        8'b01111111 : begin
776
                      TX_DATA_REG <= {8'h00, TX_DATA_VALID_DELAY[55:0]};
777
                    end
778
        8'b11111111 : begin
779
                      TX_DATA_REG <= TX_DATA_VALID_DELAY;
780
                    end
781
        endcase
782
     end
783
     else begin
784
        TX_DATA_REG <= TX_DATA_VALID_DELAY;
785
     end
786
  end
787
  else if (transmit_pause_frame_valid) begin
788
     TX_DATA_REG <= shift_pause_data;
789
  end
790
  else begin
791
     if (TX_ACK | append_start_pause) begin
792
       TX_DATA_REG <= START_SEQ;
793
     end
794
     else begin
795
       TX_DATA_REG <= IDLE_FRAME_8BYTES;
796
     end
797
  end
798
 
799
end
800
 
801
 
802
 
803
 
804
 
805
 
806
 
807
//Use for shifting data to CRC and loading start value for CRC
808
always @(posedge TX_CLK or posedge reset_int)
809
begin
810
  if (reset_int) begin
811
    frame_start_del <= 0;
812
    transmit_pause_frame_del <= 0;
813
    transmit_pause_frame_del2 <= 0;
814
    transmit_pause_frame_del3 <= 0;
815
    append_start_pause <= 0;
816
    append_start_pause_del <= 0;
817
    transmit_pause_frame_valid <= 0;
818
    reset_err_pause <= 0;
819
    load_CRC8 <= 0;
820
  end
821
  else begin
822
    frame_start_del <= FRAME_START;
823
    transmit_pause_frame_del <= transmit_pause_frame;
824
    transmit_pause_frame_del2 <= transmit_pause_frame_del;
825
    transmit_pause_frame_del3 <= transmit_pause_frame_del2;
826
    append_start_pause <= (!transmit_pause_frame_del & transmit_pause_frame);
827
    append_start_pause_del <= append_start_pause;
828
    transmit_pause_frame_valid <= (transmit_pause_frame_del & transmit_pause_frame);
829
    reset_err_pause <= (transmit_pause_frame_del & !transmit_pause_frame);
830
    load_CRC8 <= (frame_start_del & !FRAME_START) | (transmit_pause_frame_del3 & !transmit_pause_frame_del2);
831
  end
832
end
833
 
834
 
835
 
836
always @(posedge TX_CLK or posedge reset_int)
837
begin
838
  if (reset_int) begin
839
    TX_DATA_VALID_DEL1 <= 0;
840
    TX_DATA_VALID_DEL2 <= 0;
841
    TX_DATA_VALID_DEL3 <= 0;
842
    TX_DATA_VALID_DEL4 <= 0;
843
    TX_DATA_VALID_DEL5 <= 0;
844
    TX_DATA_VALID_DEL6 <= 0;
845
    TX_DATA_VALID_DEL7 <= 0;
846
    TX_DATA_VALID_DEL8 <= 0;
847
    TX_DATA_VALID_DEL9 <= 0;
848
    TX_DATA_VALID_DEL10 <= 0;
849
    TX_DATA_VALID_DEL11 <= 0;
850
    TX_DATA_VALID_DEL12 <= 0;
851
    TX_DATA_VALID_DEL13 <= 0;
852
    TX_DATA_VALID_DEL14 <= 0;
853
    TX_DATA_VALID_DEL15 <= 0;
854
    OVERFLOW_VALID <= 0;
855
  end
856
  else begin
857
    TX_DATA_VALID_DEL1 <= TX_DATA_VALID_REG;
858
    TX_DATA_VALID_DEL2 <= TX_DATA_VALID_DEL1;
859
    TX_DATA_VALID_DEL3 <= TX_DATA_VALID_DEL2;
860
    TX_DATA_VALID_DEL4 <= TX_DATA_VALID_DEL3;
861
    TX_DATA_VALID_DEL5 <= TX_DATA_VALID_DEL4;
862
    TX_DATA_VALID_DEL6 <= TX_DATA_VALID_DEL5;
863
    TX_DATA_VALID_DEL7 <= TX_DATA_VALID_DEL6;
864
    TX_DATA_VALID_DEL8 <= TX_DATA_VALID_DEL7;
865
    TX_DATA_VALID_DEL9 <= TX_DATA_VALID_DEL8;
866
    TX_DATA_VALID_DEL10 <= TX_DATA_VALID_DEL9;
867
    TX_DATA_VALID_DEL11 <= TX_DATA_VALID_DEL10;
868
    TX_DATA_VALID_DEL12 <= TX_DATA_VALID_DEL11;
869
    TX_DATA_VALID_DEL13 <= TX_DATA_VALID_DEL12;
870
    TX_DATA_VALID_DEL14 <= TX_DATA_VALID_DEL13;
871
 
872
    if (load_final_CRC) begin
873
        case (TX_DATA_VALID_DEL13)
874
        8'b00000000 : begin
875
                            if (fcs_enabled_int) begin
876
                        TX_DATA_VALID_DEL14 <= 8'b00001111;
877
                      end
878
                      else begin
879
                        TX_DATA_VALID_DEL14 <= 8'b00001111;
880
                      end
881
                      OVERFLOW_VALID <= 8'b00000000;
882
                    end
883
        8'b00000001 : begin
884
                      if (fcs_enabled_int) begin
885
                            TX_DATA_VALID_DEL14 <= 8'b00011111;
886
                      end
887
 
888
                      OVERFLOW_VALID <= 8'b00000000;
889
                    end
890
        8'b00000011 : begin
891
                            if (fcs_enabled_int) begin
892
                        TX_DATA_VALID_DEL14 <= 8'b00111111;
893
                      end
894
                      OVERFLOW_VALID <= 8'b00000000;
895
                    end
896
        8'b00000111 : begin
897
                      if (fcs_enabled_int) begin
898
                        TX_DATA_VALID_DEL14 <= 8'b01111111;
899
                      end
900
 
901
                      OVERFLOW_VALID <= 8'b00000000;
902
 
903
                    end
904
        8'b00001111 : begin
905
                            if (fcs_enabled_int) begin
906
                          TX_DATA_VALID_DEL14 <= 8'b11111111;
907
                      end
908
 
909
                      OVERFLOW_VALID <= 8'b00000000;
910
 
911
                    end
912
        8'b00011111 : begin
913
                      if (fcs_enabled_int) begin
914
                        TX_DATA_VALID_DEL14 <= 8'b11111111;
915
                        OVERFLOW_VALID <= 8'b00000001;
916
                        end
917
                      else begin
918
                        OVERFLOW_VALID <= 8'b00000000;
919
                      end
920
 
921
                    end
922
        8'b00111111 : begin
923
                      if (fcs_enabled_int) begin
924
                            TX_DATA_VALID_DEL14 <= 8'b11111111;
925
                        OVERFLOW_VALID <= 8'b00000011;
926
                      end
927
                      else begin
928
                        OVERFLOW_VALID <= 8'b00000000;
929
                      end
930
                    end
931
        8'b01111111 : begin
932
                      if (fcs_enabled_int) begin
933
                        TX_DATA_VALID_DEL14 <= 8'b11111111;
934
                        OVERFLOW_VALID <= 8'b00000111;
935
                      end
936
                      else begin
937
                        OVERFLOW_VALID <= 8'b00000000;
938
                            end
939
                   end
940
        endcase
941
 
942
    end
943
 
944
    else if (append_end_frame) begin
945
        TX_DATA_VALID_DEL14 <= OVERFLOW_VALID;
946
    end
947
 
948
    TX_DATA_VALID_DEL15 <= TX_DATA_VALID_DEL14;
949
    TXC <= TX_DATA_VALID_DEL15;
950
  end
951
end
952
 
953
always @(posedge TX_CLK or posedge reset_int)
954
begin
955
  if (reset_int) begin
956
    TX_DATA_DEL1 <= 0;
957
    TX_DATA_DEL2 <= 0;
958
    TX_DATA_DEL3 <= 0;
959
    TX_DATA_DEL4 <= 0;
960
    TX_DATA_DEL5 <= 0;
961
    TX_DATA_DEL6 <= 0;
962
    TX_DATA_DEL7 <= 0;
963
    TX_DATA_DEL8 <= 0;
964
    TX_DATA_DEL9 <= 0;
965
    TX_DATA_DEL10 <= 0;
966
    TX_DATA_DEL11 <= 0;
967
    TX_DATA_DEL12 <= 0;
968
    TX_DATA_DEL13 <= 0;
969
    TX_DATA_DEL14 <= 0;
970
    TX_DATA_DEL15 <= 0;
971
    OVERFLOW_DATA <= IDLE_FRAME_8BYTES;
972
  end
973
  else begin
974
    TX_DATA_DEL1 <= TX_DATA_REG;
975
    TX_DATA_DEL2 <= TX_DATA_DEL1;
976
    TX_DATA_DEL3 <= TX_DATA_DEL2;
977
    TX_DATA_DEL4 <= TX_DATA_DEL3;
978
    TX_DATA_DEL5 <= TX_DATA_DEL4;
979
    TX_DATA_DEL6 <= TX_DATA_DEL5;
980
    TX_DATA_DEL7 <= TX_DATA_DEL6;
981
    TX_DATA_DEL8 <= TX_DATA_DEL7;
982
    TX_DATA_DEL9 <= TX_DATA_DEL8;
983
    TX_DATA_DEL10 <= TX_DATA_DEL9;
984
    TX_DATA_DEL11 <= TX_DATA_DEL10;
985
    TX_DATA_DEL12 <= TX_DATA_DEL11;
986
    TX_DATA_DEL13 <= TX_DATA_DEL12;
987
    TX_DATA_DEL14 <= TX_DATA_DEL13;
988
 
989
    if (load_final_CRC) begin
990
        case (TX_DATA_VALID_DEL13)
991
        8'b00000000 : begin
992
                            if (fcs_enabled_int) begin
993
 
994
                        TX_DATA_DEL14[31:0] <= CRC_OUT[31:0];
995
                        if (insert_error) begin
996
                          TX_DATA_DEL14[39:32] <= ERROR_FRAME;
997
                          TX_DATA_DEL14[47:40] <= TERMINATE_FRAME;
998
                        end
999
                        else begin
1000
                                  TX_DATA_DEL14[39:32] <= TERMINATE_FRAME;
1001
                          TX_DATA_DEL14[47:40] <= IDLE_FRAME;
1002
                        end
1003
 
1004
                        TX_DATA_DEL14[55:48] <= IDLE_FRAME;
1005
                        TX_DATA_DEL14[63:56] <= IDLE_FRAME;
1006
                      end
1007
                      else begin
1008
                        if (insert_error) begin
1009
                          TX_DATA_DEL14[7:0] <= ERROR_FRAME;
1010
                          TX_DATA_DEL14[15:8] <= TERMINATE_FRAME;
1011
                        end
1012
                        else begin
1013
                                  TX_DATA_DEL14[7:0] <= TERMINATE_FRAME;
1014
                          TX_DATA_DEL14[15:8] <= IDLE_FRAME;
1015
                        end
1016
 
1017
                        TX_DATA_DEL14[23:16] <= IDLE_FRAME;
1018
                        TX_DATA_DEL14[31:24] <= IDLE_FRAME;
1019
                        TX_DATA_DEL14[39:32] <= IDLE_FRAME;
1020
                        TX_DATA_DEL14[47:40] <= IDLE_FRAME;
1021
                        TX_DATA_DEL14[55:48] <= IDLE_FRAME;
1022
                        TX_DATA_DEL14[63:56] <= IDLE_FRAME;
1023
                      end
1024
                      OVERFLOW_DATA <= IDLE_FRAME_8BYTES;
1025
                    end
1026
        8'b00000001 : begin
1027
                      if (fcs_enabled_int) begin
1028
                            TX_DATA_DEL14[7:0] <= TX_DATA_DEL13[7:0];
1029
                        TX_DATA_DEL14[39:8] <= CRC_OUT[31:0];
1030
                        if (insert_error) begin
1031
                          TX_DATA_DEL14[47:40] <= ERROR_FRAME;
1032
                          TX_DATA_DEL14[55:48] <= TERMINATE_FRAME;
1033
                        end
1034
                        else begin
1035
                          TX_DATA_DEL14[47:40] <= TERMINATE_FRAME;
1036
                          TX_DATA_DEL14[55:48] <= IDLE_FRAME;
1037
                        end
1038
 
1039
 
1040
                        TX_DATA_DEL14[63:56] <= IDLE_FRAME;
1041
                        TX_DATA_DEL14 <= TX_DATA_DEL13;
1042
 
1043
                      end
1044
                      else begin
1045
                        TX_DATA_DEL14[7:0] <= TX_DATA_DEL13[7:0];
1046
 
1047
                        if (insert_error) begin
1048
                          TX_DATA_DEL14[15:8] <= ERROR_FRAME;
1049
                          TX_DATA_DEL14[23:16] <= TERMINATE_FRAME;
1050
                        end
1051
                        else begin
1052
                          TX_DATA_DEL14[15:8] <= TERMINATE_FRAME;
1053
                          TX_DATA_DEL14[23:16] <= IDLE_FRAME;
1054
                        end
1055
                                TX_DATA_DEL14[31:24] <= IDLE_FRAME;
1056
                        TX_DATA_DEL14[39:32] <= IDLE_FRAME;
1057
                        TX_DATA_DEL14[47:40] <= IDLE_FRAME;
1058
                        TX_DATA_DEL14[55:48] <= IDLE_FRAME;
1059
                        TX_DATA_DEL14[63:56] <= IDLE_FRAME;
1060
                        TX_DATA_DEL14 <= TX_DATA_DEL13;
1061
 
1062
                      end
1063
 
1064
                      OVERFLOW_DATA <= IDLE_FRAME_8BYTES;
1065
                    end
1066
        8'b00000011 : begin
1067
                            if (fcs_enabled_int) begin
1068
                            TX_DATA_DEL14[15:0] <= TX_DATA_DEL13[15:0];
1069
                        TX_DATA_DEL14[47:16] <= CRC_OUT[31:0];
1070
                        if (insert_error) begin
1071
                          TX_DATA_DEL14[55:48] <= ERROR_FRAME;
1072
                          TX_DATA_DEL14[63:56] <= TERMINATE_FRAME;
1073
                        end
1074
                        else begin
1075
                          TX_DATA_DEL14[55:48] <= TERMINATE_FRAME;
1076
                          TX_DATA_DEL14[63:56] <= IDLE_FRAME;
1077
                        end
1078
                      end
1079
                      else begin
1080
                            TX_DATA_DEL14[15:0] <= TX_DATA_DEL13[15:0];
1081
 
1082
                        if (insert_error) begin
1083
                          TX_DATA_DEL14[23:16] <= ERROR_FRAME;
1084
                          TX_DATA_DEL14[31:24] <= TERMINATE_FRAME;
1085
                        end
1086
                        else begin
1087
                          TX_DATA_DEL14[23:16] <= TERMINATE_FRAME;
1088
                          TX_DATA_DEL14[31:24] <= IDLE_FRAME;
1089
 
1090
                        end
1091
                        TX_DATA_DEL14[39:32] <= IDLE_FRAME;
1092
                        TX_DATA_DEL14[47:40] <= IDLE_FRAME;
1093
                        TX_DATA_DEL14[55:48] <= IDLE_FRAME;
1094
                        TX_DATA_DEL14[63:56] <= IDLE_FRAME;
1095
                      end
1096
 
1097
                      OVERFLOW_DATA <= IDLE_FRAME_8BYTES;
1098
                    end
1099
        8'b00000111 : begin
1100
                      if (fcs_enabled_int) begin
1101
                            TX_DATA_DEL14[23:0] <= TX_DATA_DEL13[23:0];
1102
                        TX_DATA_DEL14[55:24] <= CRC_OUT[31:0];
1103
                              OVERFLOW_DATA <= IDLE_FRAME_8BYTES;
1104
                        if (insert_error) begin
1105
                                  TX_DATA_DEL14[63:56] <= ERROR_FRAME;
1106
                                  OVERFLOW_DATA[7:0] <= TERMINATE_FRAME;
1107
                        end
1108
                        else begin
1109
                                  TX_DATA_DEL14[63:56] <= TERMINATE_FRAME;
1110
                        end
1111
                      end
1112
                      else begin
1113
                        TX_DATA_DEL14[23:0] <= TX_DATA_DEL13[23:0];
1114
                        TX_DATA_DEL14[55:24] <= CRC_OUT[31:0];
1115
                              OVERFLOW_DATA <= IDLE_FRAME_8BYTES;
1116
                        if (insert_error) begin
1117
                                  TX_DATA_DEL14[31:24] <= ERROR_FRAME;
1118
                                  TX_DATA_DEL14[39:32] <= TERMINATE_FRAME;
1119
                        end
1120
                        else begin
1121
                                  TX_DATA_DEL14[31:24] <= TERMINATE_FRAME;
1122
                          TX_DATA_DEL14[39:32] <= IDLE_FRAME;
1123
                        end
1124
                        TX_DATA_DEL14[47:40] <= IDLE_FRAME;
1125
                        TX_DATA_DEL14[55:48] <= IDLE_FRAME;
1126
                        TX_DATA_DEL14[63:56] <= IDLE_FRAME;
1127
                      end
1128
 
1129
                    end
1130
        8'b00001111 : begin
1131
                            if (fcs_enabled_int) begin
1132
                            TX_DATA_DEL14[31:0] <= TX_DATA_DEL13[31:0];
1133
                            TX_DATA_DEL14[63:32]<= CRC_OUT[31:0];
1134
 
1135
                        if (insert_error) begin
1136
                                  OVERFLOW_DATA [7:0] <= ERROR_FRAME;
1137
                                  OVERFLOW_DATA[15:8] <= TERMINATE_FRAME;
1138
                        end
1139
                        else begin
1140
                                  OVERFLOW_DATA [7:0]<= TERMINATE_FRAME;
1141
                          OVERFLOW_DATA [15:8]<= IDLE_FRAME;
1142
                        end
1143
                        OVERFLOW_DATA [23:16]<= IDLE_FRAME;
1144
                        OVERFLOW_DATA [31:24]<= IDLE_FRAME;
1145
                        OVERFLOW_DATA [39:32]<= IDLE_FRAME;
1146
                        OVERFLOW_DATA [47:40]<= IDLE_FRAME;
1147
                        OVERFLOW_DATA [55:48]<= IDLE_FRAME;
1148
                        OVERFLOW_DATA [63:56]<= IDLE_FRAME;
1149
                      end
1150
                      else begin
1151
                        TX_DATA_DEL14[31:0] <= TX_DATA_DEL13[31:0];
1152
                                OVERFLOW_DATA <= IDLE_FRAME_8BYTES;
1153
                        if (insert_error) begin
1154
                                  TX_DATA_DEL14 [39:32] <= ERROR_FRAME;
1155
                                  TX_DATA_DEL14[47:40] <= TERMINATE_FRAME;
1156
                        end
1157
                        else begin
1158
                                  TX_DATA_DEL14 [39:32]<= TERMINATE_FRAME;
1159
                          TX_DATA_DEL14 [47:40]<= IDLE_FRAME;
1160
                        end
1161
                        TX_DATA_DEL14[55:48] <= IDLE_FRAME;
1162
                        TX_DATA_DEL14[63:56] <= IDLE_FRAME;
1163
                      end
1164
                    end
1165
        8'b00011111 : begin
1166
                      if (fcs_enabled_int) begin
1167
                            TX_DATA_DEL14[39:0] <= TX_DATA_DEL13[39:0];
1168
                        TX_DATA_DEL14[63:40] <= CRC_OUT[23:0];
1169
                            OVERFLOW_DATA [7:0]<= CRC_OUT[31:24];
1170
                        if (insert_error) begin
1171
                                  OVERFLOW_DATA [15:8]<= ERROR_FRAME;
1172
                          OVERFLOW_DATA [23:16]<= TERMINATE_FRAME;
1173
                        end
1174
                        else begin
1175
                                  OVERFLOW_DATA [15:8]<= TERMINATE_FRAME;
1176
                          OVERFLOW_DATA [23:16]<= IDLE_FRAME;
1177
                        end
1178
                        OVERFLOW_DATA [31:24]<= IDLE_FRAME;
1179
                        OVERFLOW_DATA [39:32]<= IDLE_FRAME;
1180
                        OVERFLOW_DATA [47:40]<= IDLE_FRAME;
1181
                        OVERFLOW_DATA [55:48]<= IDLE_FRAME;
1182
                        OVERFLOW_DATA [63:56]<= IDLE_FRAME;
1183
                      end
1184
                      else begin
1185
                        TX_DATA_DEL14[39:0] <= TX_DATA_DEL13[39:0];
1186
                                OVERFLOW_DATA <= IDLE_FRAME_8BYTES;
1187
                        if (insert_error) begin
1188
                                  TX_DATA_DEL14 [47:40] <= ERROR_FRAME;
1189
                                  TX_DATA_DEL14[55:48] <= TERMINATE_FRAME;
1190
                        end
1191
                        else begin
1192
                                  TX_DATA_DEL14 [47:40]<= TERMINATE_FRAME;
1193
                          TX_DATA_DEL14 [55:48]<= IDLE_FRAME;
1194
                        end
1195
                        TX_DATA_DEL14[63:56] <= IDLE_FRAME;
1196
                      end
1197
 
1198
                    end
1199
        8'b00111111 : begin
1200
                      if (fcs_enabled_int) begin
1201
                            TX_DATA_DEL14[47:0] <= TX_DATA_DEL13[47:0];
1202
                        TX_DATA_DEL14[63:48] <= CRC_OUT[15:0];
1203
                            OVERFLOW_DATA [15:0]<= CRC_OUT[31:16];
1204
                        if (insert_error) begin
1205
                                  OVERFLOW_DATA [23:16]<= ERROR_FRAME;
1206
                          OVERFLOW_DATA [31:24]<= TERMINATE_FRAME;
1207
                        end
1208
                        else begin
1209
                                  OVERFLOW_DATA [23:16]<= TERMINATE_FRAME;
1210
                          OVERFLOW_DATA [31:24]<= IDLE_FRAME;
1211
                        end
1212
                        OVERFLOW_DATA [39:32]<= IDLE_FRAME;
1213
                        OVERFLOW_DATA [47:40]<= IDLE_FRAME;
1214
                        OVERFLOW_DATA [55:48]<= IDLE_FRAME;
1215
                        OVERFLOW_DATA [63:56]<= IDLE_FRAME;
1216
                      end
1217
                      else begin
1218
                        TX_DATA_DEL14[47:0] <= TX_DATA_DEL13[47:0];
1219
                        if (insert_error) begin
1220
                                  TX_DATA_DEL14 [55:48] <= ERROR_FRAME;
1221
                                  TX_DATA_DEL14[63:56] <= TERMINATE_FRAME;
1222
                        end
1223
                        else begin
1224
                                  TX_DATA_DEL14 [55:48]<= TERMINATE_FRAME;
1225
                          TX_DATA_DEL14 [63:56]<= IDLE_FRAME;
1226
                        end
1227
 
1228
                      end
1229
                    end
1230
        8'b01111111 : begin
1231
                      if (fcs_enabled_int) begin
1232
                            TX_DATA_DEL14[55:0] <= TX_DATA_DEL13[55:0];
1233
                        TX_DATA_DEL14[63:56] <= CRC_OUT[7:0];
1234
                            OVERFLOW_DATA [23:0]<= CRC_OUT[31:8];
1235
                        if (insert_error) begin
1236
                                  OVERFLOW_DATA [31:24]<= ERROR_FRAME;
1237
                          OVERFLOW_DATA [39:32]<= TERMINATE_FRAME;
1238
                        end
1239
                        else begin
1240
                                  OVERFLOW_DATA [31:24]<= TERMINATE_FRAME;
1241
                          OVERFLOW_DATA [39:32]<= IDLE_FRAME;
1242
                        end
1243
                        OVERFLOW_DATA [47:40]<= IDLE_FRAME;
1244
                        OVERFLOW_DATA [55:48]<= IDLE_FRAME;
1245
                        OVERFLOW_DATA [63:56]<= IDLE_FRAME;
1246
                      end
1247
                      else begin
1248
                        TX_DATA_DEL14[55:0] <= TX_DATA_DEL13[55:0];
1249
                                OVERFLOW_DATA <= IDLE_FRAME_8BYTES;
1250
                        if (insert_error) begin
1251
                                  TX_DATA_DEL14 [63:56] <= ERROR_FRAME;
1252
                                  OVERFLOW_DATA[7:0] <= TERMINATE_FRAME;
1253
                        end
1254
                        else begin
1255
                                  TX_DATA_DEL14 [63:56]<= TERMINATE_FRAME;
1256
                          OVERFLOW_DATA [7:0]<= IDLE_FRAME;
1257
                        end
1258
                      end
1259
 
1260
                    end
1261
 
1262
        endcase
1263
    end
1264
    else if (append_end_frame) begin
1265
      TX_DATA_DEL14 <= OVERFLOW_DATA;
1266
    end
1267
 
1268
    TX_DATA_DEL15 <= TX_DATA_DEL14;
1269
 
1270
    TXD <= TX_DATA_DEL15;
1271
  end
1272
end
1273
 
1274
 
1275
 
1276
 
1277
always @(posedge TX_CLK or posedge reset_int)
1278
begin
1279
  if (reset_int) begin
1280
    store_tx_data_valid <= 0;
1281
    store_tx_data <= 0;
1282
    store_CRC64 <= 0;
1283
    tx_data_int <= 0;
1284
  end
1285
  else if (load_CRC8) begin
1286
    store_tx_data_valid <= TX_DATA_VALID_DEL2;
1287
    store_tx_data <= TX_DATA_DEL2;
1288
    store_CRC64 <= CRC_32_64;
1289
  end
1290
  else begin
1291
    store_tx_data_valid[6:0] <= store_tx_data_valid[7:1];
1292
    tx_data_int <= store_tx_data[7:0];
1293
    store_tx_data[55:0] <= store_tx_data[63:8];
1294
  end
1295
end
1296
 
1297
//Start CRC8 and load CRC8
1298
always @(posedge TX_CLK or posedge reset_int)
1299
begin
1300
  if (reset_int) begin
1301
    start_CRC8 <= 0;
1302
    START_CRC8_DEL <= 0;
1303
  end
1304
  else begin
1305
    start_CRC8 <= store_tx_data_valid[0];
1306
    START_CRC8_DEL <= start_CRC8;
1307
  end
1308
end
1309
 
1310
 
1311
always @(posedge TX_CLK or posedge reset_int)
1312
begin
1313
  if (reset_int) begin
1314
     byte_count_reg <= 0;
1315
  end
1316
  else begin
1317
     byte_count_reg <= BYTE_COUNTER;
1318
  end
1319
end
1320
 
1321
//Use for determining the number of bytes in the data
1322
always @(posedge TX_CLK or posedge reset_int)
1323
begin
1324
  if (reset_int) begin
1325
     final_byte_count <= 0;
1326
  end
1327
  else if (load_CRC8) begin
1328
     if (BYTE_COUNTER == 64) begin
1329
        final_byte_count <= 60;
1330
     end
1331
     else begin
1332
        final_byte_count <= byte_count_reg;
1333
     end
1334
  end
1335
  else if (start_CRC8) begin
1336
     final_byte_count <= final_byte_count + 1;
1337
  end
1338 51 fisher5090
end
1339 39 fisher5090
 
1340 51 fisher5090
always @(posedge TX_CLK)
1341
begin
1342 39 fisher5090
  if (transmit_pause_frame) begin
1343
    byte_count_stat = 512;
1344
  end
1345
  else begin
1346
    byte_count_stat = final_byte_count;
1347
  end
1348
end
1349
 
1350
 
1351
always @(posedge TX_CLK or posedge reset_int)
1352
begin
1353
  if (reset_int) begin
1354
     append_reg <= 0;
1355
     load_final_CRC  <= 0;
1356
     append_end_frame <= 0;
1357
  end
1358
  else begin
1359
     append_reg[0] <= load_CRC8;
1360
     append_reg[9:1] <= append_reg[8:0];
1361
     load_final_CRC <= append_reg[9];
1362
     append_end_frame <= load_final_CRC;
1363
  end
1364
end
1365
 
1366 51 fisher5090
//
1367
//always @(posedge TX_CLK or posedge reset_int)
1368
//begin
1369
//  if (reset_int) begin
1370
//    vlan_enabled_int <= 0;
1371
//  end
1372
//end
1373 39 fisher5090
 
1374
// VLAN field - 8100 at second 64 bit data at 32:47 and V1 V2 is at 48:63
1375
// length field at third 64 bit data at 0:15
1376
 
1377
always @(posedge TX_CLK or posedge reset_int)
1378
begin
1379
   if (reset_int) begin
1380
      length_register <= 0;
1381
   end
1382 51 fisher5090
   else if (vlan_enabled_int & BYTE_COUNTER == 16) begin
1383 39 fisher5090
       length_register <= TX_DATA_REG[15:0];
1384
   end
1385
   else begin
1386
      if (BYTE_COUNTER == 8) begin
1387
        length_register <= TX_DATA_REG[47:32];
1388
      end
1389
   end
1390
 
1391
end
1392
 
1393
 
1394
always @(posedge TX_CLK or posedge reset_int)
1395
begin
1396
  if (reset_int) begin
1397
    set_pause_stats <= 0;
1398
  end
1399
  else if (PAUSEVAL_DEL2) begin
1400
    set_pause_stats <= 1;
1401
  end
1402
  else if (append_end_frame) begin
1403
    set_pause_stats <= 0;
1404
  end
1405
end
1406
 
1407
 
1408
endmodule
1409
 

powered by: WebSVN 2.1.0

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