@@ -395,10 +395,80 @@ always @(posedge s_clk) begin
395
395
end
396
396
end
397
397
398
- if (s_axis_tready && s_axis_tvalid) begin
399
- // transfer in
400
- if (! FRAME_FIFO) begin
401
- // normal FIFO mode
398
+ if (FRAME_FIFO) begin
399
+ // frame FIFO mode
400
+ if (s_axis_tready && s_axis_tvalid) begin
401
+ // transfer in
402
+ if ((full && DROP_WHEN_FULL) || (full_wr && DROP_OVERSIZE_FRAME) || drop_frame_reg) begin
403
+ // full, packet overflow, or currently dropping frame
404
+ // drop frame
405
+ drop_frame_reg <= 1'b1 ;
406
+ if (s_axis_tlast) begin
407
+ // end of frame, reset write pointer
408
+ wr_ptr_temp = wr_ptr_commit_reg;
409
+ wr_ptr_reg <= wr_ptr_temp;
410
+ wr_ptr_gray_reg <= bin2gray(wr_ptr_temp);
411
+ drop_frame_reg <= 1'b0 ;
412
+ overflow_reg <= 1'b1 ;
413
+ end
414
+ end else begin
415
+ mem[wr_ptr_reg[ADDR_WIDTH- 1 :0 ]] <= s_axis;
416
+ wr_ptr_temp = wr_ptr_reg + 1 ;
417
+ wr_ptr_reg <= wr_ptr_temp;
418
+ wr_ptr_gray_reg <= bin2gray(wr_ptr_temp);
419
+ if (s_axis_tlast || (! DROP_OVERSIZE_FRAME && (full_wr || send_frame_reg))) begin
420
+ // end of frame or send frame
421
+ send_frame_reg <= ! s_axis_tlast;
422
+ if (s_axis_tlast && DROP_BAD_FRAME && USER_BAD_FRAME_MASK & ~ (s_axis_tuser ^ USER_BAD_FRAME_VALUE)) begin
423
+ // bad packet, reset write pointer
424
+ wr_ptr_temp = wr_ptr_commit_reg;
425
+ wr_ptr_reg <= wr_ptr_temp;
426
+ wr_ptr_gray_reg <= bin2gray(wr_ptr_temp);
427
+ bad_frame_reg <= 1'b1 ;
428
+ end else begin
429
+ // good packet or packet overflow, update write pointer
430
+ wr_ptr_temp = wr_ptr_reg + 1 ;
431
+ wr_ptr_reg <= wr_ptr_temp;
432
+ wr_ptr_commit_reg <= wr_ptr_temp;
433
+ wr_ptr_gray_reg <= bin2gray(wr_ptr_temp);
434
+
435
+ if (wr_ptr_update_reg == wr_ptr_update_ack_sync2_reg) begin
436
+ // no sync in progress; sync update
437
+ wr_ptr_update_valid_reg <= 1'b0 ;
438
+ wr_ptr_sync_commit_reg <= wr_ptr_temp;
439
+ wr_ptr_update_reg <= ! wr_ptr_update_ack_sync2_reg;
440
+ end else begin
441
+ // sync in progress; flag it for later
442
+ wr_ptr_update_valid_reg <= 1'b1 ;
443
+ end
444
+
445
+ good_frame_reg <= s_axis_tlast;
446
+ end
447
+ end
448
+ end
449
+ end else if (s_axis_tvalid && full_wr && FRAME_FIFO && ! DROP_OVERSIZE_FRAME) begin
450
+ // data valid with packet overflow
451
+ // update write pointer
452
+ send_frame_reg <= 1'b1 ;
453
+ wr_ptr_temp = wr_ptr_reg;
454
+ wr_ptr_reg <= wr_ptr_temp;
455
+ wr_ptr_commit_reg <= wr_ptr_temp;
456
+ wr_ptr_gray_reg <= bin2gray(wr_ptr_temp);
457
+
458
+ if (wr_ptr_update_reg == wr_ptr_update_ack_sync2_reg) begin
459
+ // no sync in progress; sync update
460
+ wr_ptr_update_valid_reg <= 1'b0 ;
461
+ wr_ptr_sync_commit_reg <= wr_ptr_temp;
462
+ wr_ptr_update_reg <= ! wr_ptr_update_ack_sync2_reg;
463
+ end else begin
464
+ // sync in progress; flag it for later
465
+ wr_ptr_update_valid_reg <= 1'b1 ;
466
+ end
467
+ end
468
+ end else begin
469
+ // normal FIFO mode
470
+ if (s_axis_tready && s_axis_tvalid) begin
471
+ // transfer in
402
472
mem[wr_ptr_reg[ADDR_WIDTH- 1 :0 ]] <= s_axis;
403
473
if (drop_frame_reg && LAST_ENABLE) begin
404
474
// currently dropping frame
@@ -414,70 +484,6 @@ always @(posedge s_clk) begin
414
484
wr_ptr_commit_reg <= wr_ptr_temp;
415
485
wr_ptr_gray_reg <= bin2gray(wr_ptr_temp);
416
486
end
417
- end else if ((full && DROP_WHEN_FULL) || (full_wr && DROP_OVERSIZE_FRAME) || drop_frame_reg) begin
418
- // full, packet overflow, or currently dropping frame
419
- // drop frame
420
- drop_frame_reg <= 1'b1 ;
421
- if (s_axis_tlast) begin
422
- // end of frame, reset write pointer
423
- wr_ptr_temp = wr_ptr_commit_reg;
424
- wr_ptr_reg <= wr_ptr_temp;
425
- wr_ptr_gray_reg <= bin2gray(wr_ptr_temp);
426
- drop_frame_reg <= 1'b0 ;
427
- overflow_reg <= 1'b1 ;
428
- end
429
- end else begin
430
- mem[wr_ptr_reg[ADDR_WIDTH- 1 :0 ]] <= s_axis;
431
- wr_ptr_temp = wr_ptr_reg + 1 ;
432
- wr_ptr_reg <= wr_ptr_temp;
433
- wr_ptr_gray_reg <= bin2gray(wr_ptr_temp);
434
- if (s_axis_tlast || (! DROP_OVERSIZE_FRAME && (full_wr || send_frame_reg))) begin
435
- // end of frame or send frame
436
- send_frame_reg <= ! s_axis_tlast;
437
- if (s_axis_tlast && DROP_BAD_FRAME && USER_BAD_FRAME_MASK & ~ (s_axis_tuser ^ USER_BAD_FRAME_VALUE)) begin
438
- // bad packet, reset write pointer
439
- wr_ptr_temp = wr_ptr_commit_reg;
440
- wr_ptr_reg <= wr_ptr_temp;
441
- wr_ptr_gray_reg <= bin2gray(wr_ptr_temp);
442
- bad_frame_reg <= 1'b1 ;
443
- end else begin
444
- // good packet or packet overflow, update write pointer
445
- wr_ptr_temp = wr_ptr_reg + 1 ;
446
- wr_ptr_reg <= wr_ptr_temp;
447
- wr_ptr_commit_reg <= wr_ptr_temp;
448
- wr_ptr_gray_reg <= bin2gray(wr_ptr_temp);
449
-
450
- if (wr_ptr_update_reg == wr_ptr_update_ack_sync2_reg) begin
451
- // no sync in progress; sync update
452
- wr_ptr_update_valid_reg <= 1'b0 ;
453
- wr_ptr_sync_commit_reg <= wr_ptr_temp;
454
- wr_ptr_update_reg <= ! wr_ptr_update_ack_sync2_reg;
455
- end else begin
456
- // sync in progress; flag it for later
457
- wr_ptr_update_valid_reg <= 1'b1 ;
458
- end
459
-
460
- good_frame_reg <= s_axis_tlast;
461
- end
462
- end
463
- end
464
- end else if (s_axis_tvalid && full_wr && FRAME_FIFO && ! DROP_OVERSIZE_FRAME) begin
465
- // data valid with packet overflow
466
- // update write pointer
467
- send_frame_reg <= 1'b1 ;
468
- wr_ptr_temp = wr_ptr_reg;
469
- wr_ptr_reg <= wr_ptr_temp;
470
- wr_ptr_commit_reg <= wr_ptr_temp;
471
- wr_ptr_gray_reg <= bin2gray(wr_ptr_temp);
472
-
473
- if (wr_ptr_update_reg == wr_ptr_update_ack_sync2_reg) begin
474
- // no sync in progress; sync update
475
- wr_ptr_update_valid_reg <= 1'b0 ;
476
- wr_ptr_sync_commit_reg <= wr_ptr_temp;
477
- wr_ptr_update_reg <= ! wr_ptr_update_ack_sync2_reg;
478
- end else begin
479
- // sync in progress; flag it for later
480
- wr_ptr_update_valid_reg <= 1'b1 ;
481
487
end
482
488
end
483
489
0 commit comments