@@ -106,11 +106,11 @@ module axi_spi_engine #(
106
106
107
107
input sdo_data_ready,
108
108
output sdo_data_valid,
109
- output [(DATA_WIDTH- 1 ) :0 ] sdo_data,
109
+ output [(DATA_WIDTH) - 1 :0 ] sdo_data,
110
110
111
111
output sdi_data_ready,
112
112
input sdi_data_valid,
113
- input [(NUM_OF_SDI * DATA_WIDTH- 1 ) :0 ] sdi_data,
113
+ input [(NUM_OF_SDI * DATA_WIDTH) - 1 :0 ] sdi_data,
114
114
115
115
output sync_ready,
116
116
input sync_valid,
@@ -122,7 +122,7 @@ module axi_spi_engine #(
122
122
output [15 :0 ] offload0_cmd_wr_data,
123
123
124
124
output offload0_sdo_wr_en,
125
- output [(DATA_WIDTH- 1 ) :0 ] offload0_sdo_wr_data,
125
+ output [(DATA_WIDTH) - 1 :0 ] offload0_sdo_wr_data,
126
126
127
127
output offload0_mem_reset,
128
128
output offload0_enable,
@@ -133,7 +133,7 @@ module axi_spi_engine #(
133
133
input [7 :0 ] offload_sync_data
134
134
);
135
135
136
- localparam PCORE_VERSION = 'h010501 ;
136
+ localparam PCORE_VERSION = 'h010600 ;
137
137
localparam S_AXI = 0 ;
138
138
localparam UP_FIFO = 1 ;
139
139
@@ -152,16 +152,15 @@ module axi_spi_engine #(
152
152
wire sdo_fifo_almost_empty;
153
153
wire up_sdo_fifo_almost_empty;
154
154
155
- wire [( DATA_WIDTH- 1 ) :0 ] sdo_fifo_in_data;
155
+ wire [DATA_WIDTH- 1 :0 ] sdo_fifo_in_data;
156
156
wire sdo_fifo_in_ready;
157
157
wire sdo_fifo_in_valid;
158
158
159
- wire sdi_fifo_out_data_msb_s;
160
- wire [SDI_FIFO_ADDRESS_WIDTH- 1 :0 ] sdi_fifo_level;
159
+ wire [31 :0 ] sdi_fifo_level;
161
160
wire sdi_fifo_almost_full;
162
161
wire up_sdi_fifo_almost_full;
163
162
164
- wire [(NUM_OF_SDI * DATA_WIDTH- 1 ) :0 ] sdi_fifo_out_data;
163
+ wire [DATA_WIDTH- 1 :0 ] sdi_fifo_out_data;
165
164
wire sdi_fifo_out_ready;
166
165
wire sdi_fifo_out_valid;
167
166
@@ -325,15 +324,6 @@ module axi_spi_engine #(
325
324
end
326
325
end
327
326
328
- generate
329
- if (NUM_OF_SDI > 1 ) begin
330
- // Only the first two SDI data can be recovered through AXI regmap
331
- assign sdi_fifo_out_data_msb_s = sdi_fifo_out_data[DATA_WIDTH+ :DATA_WIDTH];
332
- end else begin
333
- assign sdi_fifo_out_data_msb_s = sdi_fifo_out_data;
334
- end
335
- endgenerate
336
-
337
327
reg [7 :0 ] offload_sdo_mem_address_width = OFFLOAD0_SDO_MEM_ADDRESS_WIDTH;
338
328
reg [7 :0 ] offload_cmd_mem_address_width = OFFLOAD0_CMD_MEM_ADDRESS_WIDTH;
339
329
reg [7 :0 ] sdi_fifo_address_width = SDI_FIFO_ADDRESS_WIDTH;
@@ -356,10 +346,9 @@ module axi_spi_engine #(
356
346
8'h31 : up_rdata_ff <= offload_sync_id;
357
347
8'h34 : up_rdata_ff <= cmd_fifo_room;
358
348
8'h35 : up_rdata_ff <= sdo_fifo_room;
359
- 8'h36 : up_rdata_ff <= (sdi_fifo_out_valid == 1 ) ? sdi_fifo_level + 1 : sdi_fifo_level; /* beacuse of first-word-fall-through */
349
+ 8'h36 : up_rdata_ff <= (sdi_fifo_out_valid == 1 ) ? sdi_fifo_level + 1 : sdi_fifo_level; /* because of first-word-fall-through */
360
350
8'h3a : up_rdata_ff <= sdi_fifo_out_data[DATA_WIDTH- 1 :0 ];
361
- 8'h3b : up_rdata_ff <= sdi_fifo_out_data_msb_s; /* store SDI's 32 bits MSB, if exists */
362
- 8'h3c : up_rdata_ff <= sdi_fifo_out_data; /* PEEK register */
351
+ 8'h3c : up_rdata_ff <= sdi_fifo_out_data[DATA_WIDTH- 1 :0 ]; /* PEEK register */
363
352
8'h40 : up_rdata_ff <= {offload0_enable_reg};
364
353
8'h41 : up_rdata_ff <= {offload0_enabled_s};
365
354
8'h80 : up_rdata_ff <= CFG_INFO_0;
@@ -421,7 +410,9 @@ module axi_spi_engine #(
421
410
.ASYNC_CLK(ASYNC_SPI_CLK),
422
411
.M_AXIS_REGISTERED(0 ),
423
412
.ALMOST_EMPTY_THRESHOLD(1 ),
424
- .ALMOST_FULL_THRESHOLD(1 )
413
+ .ALMOST_FULL_THRESHOLD(1 ),
414
+ .TLAST_EN(0 ),
415
+ .TKEEP_EN(0 )
425
416
) i_cmd_fifo (
426
417
.s_axis_aclk(clk),
427
418
.s_axis_aresetn(up_sw_resetn),
@@ -430,22 +421,25 @@ module axi_spi_engine #(
430
421
.s_axis_data(cmd_fifo_in_data),
431
422
.s_axis_room(cmd_fifo_room),
432
423
.s_axis_tlast(1'b0 ),
424
+ .s_axis_tkeep(),
433
425
.s_axis_full(),
434
426
.s_axis_almost_full(),
427
+
435
428
.m_axis_aclk(spi_clk),
436
429
.m_axis_aresetn(spi_resetn),
437
430
.m_axis_ready(cmd_ready),
438
431
.m_axis_valid(cmd_valid),
439
432
.m_axis_data(cmd_data),
440
433
.m_axis_tlast(),
434
+ .m_axis_tkeep(),
435
+ .m_axis_level(),
441
436
.m_axis_empty(),
442
- .m_axis_almost_empty(cmd_fifo_almost_empty),
443
- .m_axis_level());
437
+ .m_axis_almost_empty(cmd_fifo_almost_empty));
444
438
445
439
assign sdo_fifo_in_valid = up_wreq_s == 1'b1 && up_waddr_s == 8'h39 ;
446
- assign sdo_fifo_in_data = up_wdata_s[( DATA_WIDTH- 1 ) :0 ];
440
+ assign sdo_fifo_in_data = up_wdata_s[DATA_WIDTH- 1 :0 ];
447
441
448
- util_axis_fifo #(
442
+ util_axis_fifo #(
449
443
.DATA_WIDTH(DATA_WIDTH),
450
444
.ASYNC_CLK(ASYNC_SPI_CLK),
451
445
.ADDRESS_WIDTH(SDO_FIFO_ADDRESS_WIDTH),
@@ -460,6 +454,7 @@ module axi_spi_engine #(
460
454
.s_axis_data(sdo_fifo_in_data),
461
455
.s_axis_room(sdo_fifo_room),
462
456
.s_axis_tlast(1'b0 ),
457
+ .s_axis_tkeep(),
463
458
.s_axis_full(),
464
459
.s_axis_almost_full(),
465
460
.m_axis_aclk(spi_clk),
@@ -468,35 +463,43 @@ module axi_spi_engine #(
468
463
.m_axis_valid(sdo_data_valid),
469
464
.m_axis_data(sdo_data),
470
465
.m_axis_tlast(),
466
+ .m_axis_tkeep(),
471
467
.m_axis_level(),
472
468
.m_axis_empty(),
473
469
.m_axis_almost_empty(sdo_fifo_almost_empty));
474
470
475
471
assign sdi_fifo_out_ready = up_rreq_s == 1'b1 && up_raddr_s == 8'h3a ;
476
472
477
- util_axis_fifo #(
478
- .DATA_WIDTH(NUM_OF_SDI * DATA_WIDTH),
473
+ util_axis_fifo_asym #(
479
474
.ASYNC_CLK(ASYNC_SPI_CLK),
480
- .ADDRESS_WIDTH(SDI_FIFO_ADDRESS_WIDTH),
475
+ .S_DATA_WIDTH(NUM_OF_SDI * DATA_WIDTH),
476
+ .M_DATA_WIDTH(DATA_WIDTH),
477
+ .ADDRESS_WIDTH(SDO_FIFO_ADDRESS_WIDTH),
481
478
.M_AXIS_REGISTERED(0 ),
482
479
.ALMOST_EMPTY_THRESHOLD(1 ),
483
- .ALMOST_FULL_THRESHOLD(31 )
484
- ) i_sdi_fifo (
480
+ .ALMOST_FULL_THRESHOLD(1 ),
481
+ .TLAST_EN(0 ),
482
+ .TKEEP_EN(0 ),
483
+ .REDUCED_FIFO(0 )
484
+ ) i_sdi_fifo (
485
485
.s_axis_aclk(spi_clk),
486
486
.s_axis_aresetn(spi_resetn),
487
487
.s_axis_ready(sdi_data_ready),
488
488
.s_axis_valid(sdi_data_valid),
489
489
.s_axis_data(sdi_data),
490
490
.s_axis_room(),
491
491
.s_axis_tlast(),
492
+ .s_axis_tkeep(),
492
493
.s_axis_full(),
493
494
.s_axis_almost_full(sdi_fifo_almost_full),
495
+
494
496
.m_axis_aclk(clk),
495
497
.m_axis_aresetn(up_sw_resetn),
496
498
.m_axis_ready(sdi_fifo_out_ready),
497
499
.m_axis_valid(sdi_fifo_out_valid),
498
500
.m_axis_data(sdi_fifo_out_data),
499
501
.m_axis_tlast(),
502
+ .m_axis_tkeep(),
500
503
.m_axis_level(sdi_fifo_level),
501
504
.m_axis_empty(),
502
505
.m_axis_almost_empty());
@@ -508,22 +511,31 @@ module axi_spi_engine #(
508
511
.DATA_WIDTH(8 ),
509
512
.ASYNC_CLK(ASYNC_SPI_CLK),
510
513
.ADDRESS_WIDTH(SYNC_FIFO_ADDRESS_WIDTH),
511
- .M_AXIS_REGISTERED(0 )
514
+ .M_AXIS_REGISTERED(0 ),
515
+ .TLAST_EN(0 ),
516
+ .TKEEP_EN(0 )
512
517
) i_sync_fifo (
513
518
.s_axis_aclk(spi_clk),
514
519
.s_axis_aresetn(spi_resetn),
515
520
.s_axis_ready(sync_ready),
516
521
.s_axis_valid(sync_valid),
517
522
.s_axis_data(sync_data),
518
523
.s_axis_room(),
524
+ .s_axis_tlast(),
525
+ .s_axis_tkeep(),
519
526
.s_axis_full(),
527
+ .s_axis_almost_full(),
528
+
520
529
.m_axis_aclk(clk),
521
530
.m_axis_aresetn(up_sw_resetn),
522
531
.m_axis_ready(1'b1 ),
523
532
.m_axis_valid(sync_fifo_valid),
524
533
.m_axis_data(sync_fifo_data),
534
+ .m_axis_tlast(),
535
+ .m_axis_tkeep(),
525
536
.m_axis_level(),
526
- .m_axis_empty());
537
+ .m_axis_empty(),
538
+ .m_axis_almost_empty());
527
539
528
540
// synchronization FIFO for the offload command interface
529
541
wire up_offload0_cmd_wr_en_s;
@@ -533,50 +545,68 @@ module axi_spi_engine #(
533
545
.DATA_WIDTH(16 ),
534
546
.ASYNC_CLK(ASYNC_SPI_CLK),
535
547
.ADDRESS_WIDTH(SYNC_FIFO_ADDRESS_WIDTH),
536
- .M_AXIS_REGISTERED(0 )
548
+ .M_AXIS_REGISTERED(0 ),
549
+ .TLAST_EN(0 ),
550
+ .TKEEP_EN(0 )
537
551
) i_offload_cmd_fifo (
538
552
.s_axis_aclk(clk),
539
553
.s_axis_aresetn(up_sw_resetn),
540
554
.s_axis_ready(),
541
555
.s_axis_valid(up_offload0_cmd_wr_en_s),
542
556
.s_axis_data(up_offload0_cmd_wr_data_s),
543
557
.s_axis_room(),
558
+ .s_axis_tlast(),
559
+ .s_axis_tkeep(),
544
560
.s_axis_full(),
561
+ .s_axis_almost_full(),
562
+
545
563
.m_axis_aclk(spi_clk),
546
564
.m_axis_aresetn(spi_resetn),
547
565
.m_axis_ready(1'b1 ),
548
566
.m_axis_valid(offload0_cmd_wr_en),
549
567
.m_axis_data(offload0_cmd_wr_data),
568
+ .m_axis_tlast(),
569
+ .m_axis_tkeep(),
550
570
.m_axis_level(),
551
- .m_axis_empty());
571
+ .m_axis_empty(),
572
+ .m_axis_almost_empty());
552
573
553
574
assign up_offload0_cmd_wr_en_s = up_wreq_s == 1'b1 && up_waddr_s == 8'h44 ;
554
575
assign up_offload0_cmd_wr_data_s = up_wdata_s[15 :0 ];
555
576
556
577
// synchronization FIFO for the offload SDO interface
557
578
wire up_offload0_sdo_wr_en_s;
558
- wire [DATA_WIDTH- 1 :0 ] up_offload0_sdo_wr_data_s;
579
+ wire [( DATA_WIDTH- 1 ) :0 ] up_offload0_sdo_wr_data_s;
559
580
560
581
util_axis_fifo #(
561
582
.DATA_WIDTH(DATA_WIDTH),
562
583
.ASYNC_CLK(ASYNC_SPI_CLK),
563
584
.ADDRESS_WIDTH(SYNC_FIFO_ADDRESS_WIDTH),
564
- .M_AXIS_REGISTERED(0 )
585
+ .M_AXIS_REGISTERED(0 ),
586
+ .TLAST_EN(0 ),
587
+ .TKEEP_EN(0 )
565
588
) i_offload_sdo_fifo (
566
589
.s_axis_aclk(clk),
567
590
.s_axis_aresetn(up_sw_resetn),
568
591
.s_axis_ready(),
569
592
.s_axis_valid(up_offload0_sdo_wr_en_s),
570
593
.s_axis_data(up_offload0_sdo_wr_data_s),
571
594
.s_axis_room(),
595
+ .s_axis_tlast(),
596
+ .s_axis_tkeep(),
572
597
.s_axis_full(),
598
+ .s_axis_almost_full(),
599
+
573
600
.m_axis_aclk(spi_clk),
574
601
.m_axis_aresetn(spi_resetn),
575
602
.m_axis_ready(1'b1 ),
576
603
.m_axis_valid(offload0_sdo_wr_en),
577
604
.m_axis_data(offload0_sdo_wr_data),
605
+ .m_axis_tlast(),
606
+ .m_axis_tkeep(),
578
607
.m_axis_level(),
579
- .m_axis_empty());
608
+ .m_axis_empty(),
609
+ .m_axis_almost_empty());
580
610
581
611
assign up_offload0_sdo_wr_en_s = up_wreq_s == 1'b1 && up_waddr_s == 8'h45 ;
582
612
assign up_offload0_sdo_wr_data_s = up_wdata_s[DATA_WIDTH- 1 :0 ];
@@ -586,22 +616,31 @@ module axi_spi_engine #(
586
616
.DATA_WIDTH(8 ),
587
617
.ASYNC_CLK(ASYNC_SPI_CLK),
588
618
.ADDRESS_WIDTH(SYNC_FIFO_ADDRESS_WIDTH),
589
- .M_AXIS_REGISTERED(0 )
619
+ .M_AXIS_REGISTERED(0 ),
620
+ .TLAST_EN(0 ),
621
+ .TKEEP_EN(0 )
590
622
) i_offload_sync_fifo (
591
623
.s_axis_aclk(spi_clk),
592
624
.s_axis_aresetn(spi_resetn),
593
625
.s_axis_ready(offload_sync_ready),
594
626
.s_axis_valid(offload_sync_valid),
595
627
.s_axis_data(offload_sync_data),
596
628
.s_axis_room(),
629
+ .s_axis_tlast(),
630
+ .s_axis_tkeep(),
597
631
.s_axis_full(),
632
+ .s_axis_almost_full(),
633
+
598
634
.m_axis_aclk(clk),
599
635
.m_axis_aresetn(up_sw_resetn),
600
636
.m_axis_ready(1'b1 ),
601
637
.m_axis_valid(offload_sync_fifo_valid),
602
638
.m_axis_data(offload_sync_fifo_data),
639
+ .m_axis_tlast(),
640
+ .m_axis_tkeep(),
603
641
.m_axis_level(),
604
- .m_axis_empty());
642
+ .m_axis_empty(),
643
+ .m_axis_almost_empty());
605
644
606
645
end else begin /* ASYNC_SPI_CLK == 0 */
607
646
0 commit comments