@@ -39,8 +39,6 @@ module axis_baser_tx_64 #
39
39
parameter ENABLE_PADDING = 1 ,
40
40
parameter ENABLE_DIC = 1 ,
41
41
parameter MIN_FRAME_LENGTH = 64 ,
42
- parameter PTP_PERIOD_NS = 4'h6 ,
43
- parameter PTP_PERIOD_FNS = 16'h6666 ,
44
42
parameter PTP_TS_ENABLE = 0 ,
45
43
parameter PTP_TS_FMT_TOD = 1 ,
46
44
parameter PTP_TS_WIDTH = PTP_TS_FMT_TOD ? 96 : 64 ,
@@ -199,6 +197,7 @@ reg [3:0] fcs_output_type_1;
199
197
200
198
reg [7 :0 ] ifg_offset;
201
199
200
+ reg frame_start_reg = 1'b0 , frame_start_next;
202
201
reg frame_reg = 1'b0 , frame_next;
203
202
reg frame_error_reg = 1'b0 , frame_error_next;
204
203
reg [MIN_LEN_WIDTH- 1 :0 ] frame_min_count_reg = 0 , frame_min_count_next;
@@ -208,12 +207,12 @@ reg [1:0] deficit_idle_count_reg = 2'd0, deficit_idle_count_next;
208
207
209
208
reg s_axis_tready_reg = 1'b0 , s_axis_tready_next;
210
209
211
- reg [PTP_TS_WIDTH- 1 :0 ] m_axis_ptp_ts_reg = 0 , m_axis_ptp_ts_next ;
212
- reg [PTP_TS_WIDTH- 1 :0 ] m_axis_ptp_ts_adj_reg = 0 , m_axis_ptp_ts_adj_next ;
213
- reg [PTP_TAG_WIDTH- 1 :0 ] m_axis_ptp_ts_tag_reg = 0 , m_axis_ptp_ts_tag_next ;
214
- reg m_axis_ptp_ts_valid_reg = 1'b0 , m_axis_ptp_ts_valid_next ;
215
- reg m_axis_ptp_ts_valid_int_reg = 1'b0 , m_axis_ptp_ts_valid_int_next ;
216
- reg m_axis_ptp_ts_borrow_reg = 1'b0 , m_axis_ptp_ts_borrow_next ;
210
+ reg [PTP_TS_WIDTH- 1 :0 ] m_axis_ptp_ts_reg = 0 ;
211
+ reg [PTP_TS_WIDTH- 1 :0 ] m_axis_ptp_ts_adj_reg = 0 ;
212
+ reg [PTP_TAG_WIDTH- 1 :0 ] m_axis_ptp_ts_tag_reg = 0 ;
213
+ reg m_axis_ptp_ts_valid_reg = 1'b0 ;
214
+ reg m_axis_ptp_ts_valid_int_reg = 1'b0 ;
215
+ reg m_axis_ptp_ts_borrow_reg = 1'b0 ;
217
216
218
217
reg [31 :0 ] crc_state_reg[7 :0 ];
219
218
wire [31 :0 ] crc_state_next[7 :0 ];
@@ -224,9 +223,12 @@ reg [HDR_WIDTH-1:0] encoded_tx_hdr_reg = SYNC_CTRL;
224
223
reg [DATA_WIDTH- 1 :0 ] output_data_reg = {DATA_WIDTH{1'b0 }}, output_data_next;
225
224
reg [3 :0 ] output_type_reg = OUTPUT_TYPE_IDLE, output_type_next;
226
225
227
- reg [1 :0 ] start_packet_reg = 2'b00 , start_packet_next ;
226
+ reg [1 :0 ] start_packet_reg = 2'b00 ;
228
227
reg error_underflow_reg = 1'b0 , error_underflow_next;
229
228
229
+ reg [4 + 16 - 1 :0 ] last_ts_reg = 0 ;
230
+ reg [4 + 16 - 1 :0 ] ts_inc_reg = 0 ;
231
+
230
232
assign s_axis_tready = s_axis_tready_reg;
231
233
232
234
assign encoded_tx_data = encoded_tx_data_reg;
@@ -356,6 +358,7 @@ always @* begin
356
358
357
359
swap_lanes_next = swap_lanes_reg;
358
360
361
+ frame_start_next = 1'b0 ;
359
362
frame_next = frame_reg;
360
363
frame_error_next = frame_error_reg;
361
364
frame_min_count_next = frame_min_count_reg;
@@ -368,31 +371,15 @@ always @* begin
368
371
s_tdata_next = s_tdata_reg;
369
372
s_empty_next = s_empty_reg;
370
373
371
- m_axis_ptp_ts_next = m_axis_ptp_ts_reg;
372
- m_axis_ptp_ts_adj_next = m_axis_ptp_ts_adj_reg;
373
- m_axis_ptp_ts_tag_next = m_axis_ptp_ts_tag_reg;
374
- m_axis_ptp_ts_valid_next = 1'b0 ;
375
- m_axis_ptp_ts_valid_int_next = 1'b0 ;
376
- m_axis_ptp_ts_borrow_next = m_axis_ptp_ts_borrow_reg;
377
-
378
374
output_data_next = s_tdata_reg;
379
375
output_type_next = OUTPUT_TYPE_IDLE;
380
376
381
- start_packet_next = 2'b00 ;
382
377
error_underflow_next = 1'b0 ;
383
378
384
379
if (s_axis_tvalid && s_axis_tready) begin
385
380
frame_next = ! s_axis_tlast;
386
381
end
387
382
388
- if (PTP_TS_ENABLE && PTP_TS_FMT_TOD) begin
389
- m_axis_ptp_ts_valid_next = m_axis_ptp_ts_valid_int_reg;
390
- m_axis_ptp_ts_adj_next[15 :0 ] = m_axis_ptp_ts_reg[15 :0 ];
391
- {m_axis_ptp_ts_borrow_next, m_axis_ptp_ts_adj_next[45 :16 ]} = $signed ({1'b0 , m_axis_ptp_ts_reg[45 :16 ]}) - $signed (31'd1000000000 );
392
- m_axis_ptp_ts_adj_next[47 :46 ] = 0 ;
393
- m_axis_ptp_ts_adj_next[95 :48 ] = m_axis_ptp_ts_reg[95 :48 ] + 1 ;
394
- end
395
-
396
383
case (state_reg)
397
384
STATE_IDLE: begin
398
385
// idle state - wait for data
@@ -408,49 +395,10 @@ always @* begin
408
395
s_empty_next = keep2empty(s_axis_tkeep);
409
396
410
397
if (s_axis_tvalid && cfg_tx_enable) begin
411
- // XGMII start and preamble
412
- if (swap_lanes_reg) begin
413
- // lanes swapped
414
- if (PTP_TS_ENABLE) begin
415
- if (PTP_TS_FMT_TOD) begin
416
- m_axis_ptp_ts_next[45 :0 ] = ptp_ts[45 :0 ] + (((PTP_PERIOD_NS * 2 ** 16 + PTP_PERIOD_FNS) * 3 ) >> 1 );
417
- m_axis_ptp_ts_next[95 :48 ] = ptp_ts[95 :48 ];
418
- end else begin
419
- m_axis_ptp_ts_next = ptp_ts + (((PTP_PERIOD_NS * 2 ** 16 + PTP_PERIOD_FNS) * 3 ) >> 1 );
420
- end
421
- end
422
- start_packet_next = 2'b10 ;
423
- end else begin
424
- // lanes not swapped
425
- if (PTP_TS_ENABLE) begin
426
- if (PTP_TS_FMT_TOD) begin
427
- m_axis_ptp_ts_next[45 :0 ] = ptp_ts[45 :0 ] + (PTP_PERIOD_NS * 2 ** 16 + PTP_PERIOD_FNS);
428
- m_axis_ptp_ts_next[95 :48 ] = ptp_ts[95 :48 ];
429
- end else begin
430
- m_axis_ptp_ts_next = ptp_ts + (PTP_PERIOD_NS * 2 ** 16 + PTP_PERIOD_FNS);
431
- end
432
- end
433
- start_packet_next = 2'b01 ;
434
- end
435
- if (PTP_TS_ENABLE) begin
436
- if (PTP_TS_CTRL_IN_TUSER) begin
437
- m_axis_ptp_ts_tag_next = s_axis_tuser >> 2 ;
438
- if (PTP_TS_FMT_TOD) begin
439
- m_axis_ptp_ts_valid_int_next = s_axis_tuser[1 ];
440
- end else begin
441
- m_axis_ptp_ts_valid_next = s_axis_tuser[1 ];
442
- end
443
- end else begin
444
- m_axis_ptp_ts_tag_next = s_axis_tuser >> 1 ;
445
- if (PTP_TS_FMT_TOD) begin
446
- m_axis_ptp_ts_valid_int_next = 1'b1 ;
447
- end else begin
448
- m_axis_ptp_ts_valid_next = 1'b1 ;
449
- end
450
- end
451
- end
398
+ // Preamble and SFD
452
399
output_data_next = {ETH_SFD, {7 {ETH_PRE}}};
453
400
output_type_next = OUTPUT_TYPE_START_0;
401
+ frame_start_next = 1'b1 ;
454
402
s_axis_tready_next = 1'b1 ;
455
403
state_next = STATE_PAYLOAD;
456
404
end else begin
@@ -641,6 +589,7 @@ always @(posedge clk) begin
641
589
642
590
swap_lanes_reg <= swap_lanes_next;
643
591
592
+ frame_start_reg <= frame_start_next;
644
593
frame_reg <= frame_next;
645
594
frame_error_reg <= frame_error_next;
646
595
frame_min_count_reg <= frame_min_count_next;
@@ -653,14 +602,10 @@ always @(posedge clk) begin
653
602
654
603
s_axis_tready_reg <= s_axis_tready_next;
655
604
656
- m_axis_ptp_ts_reg <= m_axis_ptp_ts_next;
657
- m_axis_ptp_ts_adj_reg <= m_axis_ptp_ts_adj_next;
658
- m_axis_ptp_ts_tag_reg <= m_axis_ptp_ts_tag_next;
659
- m_axis_ptp_ts_valid_reg <= m_axis_ptp_ts_valid_next;
660
- m_axis_ptp_ts_valid_int_reg <= m_axis_ptp_ts_valid_int_next;
661
- m_axis_ptp_ts_borrow_reg <= m_axis_ptp_ts_borrow_next;
605
+ m_axis_ptp_ts_valid_reg <= 1'b0 ;
606
+ m_axis_ptp_ts_valid_int_reg <= 1'b0 ;
662
607
663
- start_packet_reg <= start_packet_next ;
608
+ start_packet_reg <= 2'b00 ;
664
609
error_underflow_reg <= error_underflow_next;
665
610
666
611
delay_type_valid <= 1'b0 ;
@@ -690,6 +635,50 @@ always @(posedge clk) begin
690
635
output_type_reg <= output_type_next;
691
636
end
692
637
638
+ if (PTP_TS_ENABLE && PTP_TS_FMT_TOD) begin
639
+ m_axis_ptp_ts_valid_reg <= m_axis_ptp_ts_valid_int_reg;
640
+ m_axis_ptp_ts_adj_reg[15 :0 ] <= m_axis_ptp_ts_reg[15 :0 ];
641
+ {m_axis_ptp_ts_borrow_reg, m_axis_ptp_ts_adj_reg[45 :16 ]} <= $signed ({1'b0 , m_axis_ptp_ts_reg[45 :16 ]}) - $signed (31'd1000000000 );
642
+ m_axis_ptp_ts_adj_reg[47 :46 ] <= 0 ;
643
+ m_axis_ptp_ts_adj_reg[95 :48 ] <= m_axis_ptp_ts_reg[95 :48 ] + 1 ;
644
+ end
645
+
646
+ if (frame_start_reg) begin
647
+ if (swap_lanes_reg) begin
648
+ if (PTP_TS_ENABLE) begin
649
+ if (PTP_TS_FMT_TOD) begin
650
+ m_axis_ptp_ts_reg[45 :0 ] <= ptp_ts[45 :0 ] + (ts_inc_reg >> 1 );
651
+ m_axis_ptp_ts_reg[95 :48 ] <= ptp_ts[95 :48 ];
652
+ end else begin
653
+ m_axis_ptp_ts_reg <= ptp_ts + (ts_inc_reg >> 1 );
654
+ end
655
+ end
656
+ start_packet_reg <= 2'b10 ;
657
+ end else begin
658
+ if (PTP_TS_ENABLE) begin
659
+ m_axis_ptp_ts_reg <= ptp_ts;
660
+ end
661
+ start_packet_reg <= 2'b01 ;
662
+ end
663
+ if (PTP_TS_ENABLE) begin
664
+ if (PTP_TS_CTRL_IN_TUSER) begin
665
+ m_axis_ptp_ts_tag_reg <= s_axis_tuser >> 2 ;
666
+ if (PTP_TS_FMT_TOD) begin
667
+ m_axis_ptp_ts_valid_int_reg <= s_axis_tuser[1 ];
668
+ end else begin
669
+ m_axis_ptp_ts_valid_reg <= s_axis_tuser[1 ];
670
+ end
671
+ end else begin
672
+ m_axis_ptp_ts_tag_reg <= s_axis_tuser >> 1 ;
673
+ if (PTP_TS_FMT_TOD) begin
674
+ m_axis_ptp_ts_valid_int_reg <= 1'b1 ;
675
+ end else begin
676
+ m_axis_ptp_ts_valid_reg <= 1'b1 ;
677
+ end
678
+ end
679
+ end
680
+ end
681
+
693
682
case (output_type_reg)
694
683
OUTPUT_TYPE_IDLE: begin
695
684
encoded_tx_data_reg <= {{8 {CTRL_IDLE}}, BLOCK_TYPE_CTRL};
@@ -765,9 +754,13 @@ always @(posedge clk) begin
765
754
crc_state_reg[7 ] <= 32'hFFFFFFFF ;
766
755
end
767
756
757
+ last_ts_reg <= ptp_ts;
758
+ ts_inc_reg <= ptp_ts - last_ts_reg;
759
+
768
760
if (rst) begin
769
761
state_reg <= STATE_IDLE;
770
762
763
+ frame_start_reg <= 1'b0 ;
771
764
frame_reg <= 1'b0 ;
772
765
773
766
swap_lanes_reg <= 1'b0 ;
0 commit comments