@@ -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,44 @@ 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
+ .FIFO_LIMITED(0 ),
484
+ .ADDRESS_WIDTH_PERSPECTIVE(0 )
485
+ ) i_sdi_fifo (
485
486
.s_axis_aclk(spi_clk),
486
487
.s_axis_aresetn(spi_resetn),
487
488
.s_axis_ready(sdi_data_ready),
488
489
.s_axis_valid(sdi_data_valid),
489
490
.s_axis_data(sdi_data),
490
491
.s_axis_room(),
491
492
.s_axis_tlast(),
493
+ .s_axis_tkeep(),
492
494
.s_axis_full(),
493
495
.s_axis_almost_full(sdi_fifo_almost_full),
496
+
494
497
.m_axis_aclk(clk),
495
498
.m_axis_aresetn(up_sw_resetn),
496
499
.m_axis_ready(sdi_fifo_out_ready),
497
500
.m_axis_valid(sdi_fifo_out_valid),
498
501
.m_axis_data(sdi_fifo_out_data),
499
502
.m_axis_tlast(),
503
+ .m_axis_tkeep(),
500
504
.m_axis_level(sdi_fifo_level),
501
505
.m_axis_empty(),
502
506
.m_axis_almost_empty());
@@ -508,22 +512,31 @@ module axi_spi_engine #(
508
512
.DATA_WIDTH(8 ),
509
513
.ASYNC_CLK(ASYNC_SPI_CLK),
510
514
.ADDRESS_WIDTH(SYNC_FIFO_ADDRESS_WIDTH),
511
- .M_AXIS_REGISTERED(0 )
515
+ .M_AXIS_REGISTERED(0 ),
516
+ .TLAST_EN(0 ),
517
+ .TKEEP_EN(0 )
512
518
) i_sync_fifo (
513
519
.s_axis_aclk(spi_clk),
514
520
.s_axis_aresetn(spi_resetn),
515
521
.s_axis_ready(sync_ready),
516
522
.s_axis_valid(sync_valid),
517
523
.s_axis_data(sync_data),
518
524
.s_axis_room(),
525
+ .s_axis_tlast(),
526
+ .s_axis_tkeep(),
519
527
.s_axis_full(),
528
+ .s_axis_almost_full(),
529
+
520
530
.m_axis_aclk(clk),
521
531
.m_axis_aresetn(up_sw_resetn),
522
532
.m_axis_ready(1'b1 ),
523
533
.m_axis_valid(sync_fifo_valid),
524
534
.m_axis_data(sync_fifo_data),
535
+ .m_axis_tlast(),
536
+ .m_axis_tkeep(),
525
537
.m_axis_level(),
526
- .m_axis_empty());
538
+ .m_axis_empty(),
539
+ .m_axis_almost_empty());
527
540
528
541
// synchronization FIFO for the offload command interface
529
542
wire up_offload0_cmd_wr_en_s;
@@ -533,50 +546,68 @@ module axi_spi_engine #(
533
546
.DATA_WIDTH(16 ),
534
547
.ASYNC_CLK(ASYNC_SPI_CLK),
535
548
.ADDRESS_WIDTH(SYNC_FIFO_ADDRESS_WIDTH),
536
- .M_AXIS_REGISTERED(0 )
549
+ .M_AXIS_REGISTERED(0 ),
550
+ .TLAST_EN(0 ),
551
+ .TKEEP_EN(0 )
537
552
) i_offload_cmd_fifo (
538
553
.s_axis_aclk(clk),
539
554
.s_axis_aresetn(up_sw_resetn),
540
555
.s_axis_ready(),
541
556
.s_axis_valid(up_offload0_cmd_wr_en_s),
542
557
.s_axis_data(up_offload0_cmd_wr_data_s),
543
558
.s_axis_room(),
559
+ .s_axis_tlast(),
560
+ .s_axis_tkeep(),
544
561
.s_axis_full(),
562
+ .s_axis_almost_full(),
563
+
545
564
.m_axis_aclk(spi_clk),
546
565
.m_axis_aresetn(spi_resetn),
547
566
.m_axis_ready(1'b1 ),
548
567
.m_axis_valid(offload0_cmd_wr_en),
549
568
.m_axis_data(offload0_cmd_wr_data),
569
+ .m_axis_tlast(),
570
+ .m_axis_tkeep(),
550
571
.m_axis_level(),
551
- .m_axis_empty());
572
+ .m_axis_empty(),
573
+ .m_axis_almost_empty());
552
574
553
575
assign up_offload0_cmd_wr_en_s = up_wreq_s == 1'b1 && up_waddr_s == 8'h44 ;
554
576
assign up_offload0_cmd_wr_data_s = up_wdata_s[15 :0 ];
555
577
556
578
// synchronization FIFO for the offload SDO interface
557
579
wire up_offload0_sdo_wr_en_s;
558
- wire [DATA_WIDTH- 1 :0 ] up_offload0_sdo_wr_data_s;
580
+ wire [( DATA_WIDTH- 1 ) :0 ] up_offload0_sdo_wr_data_s;
559
581
560
582
util_axis_fifo #(
561
583
.DATA_WIDTH(DATA_WIDTH),
562
584
.ASYNC_CLK(ASYNC_SPI_CLK),
563
585
.ADDRESS_WIDTH(SYNC_FIFO_ADDRESS_WIDTH),
564
- .M_AXIS_REGISTERED(0 )
586
+ .M_AXIS_REGISTERED(0 ),
587
+ .TLAST_EN(0 ),
588
+ .TKEEP_EN(0 )
565
589
) i_offload_sdo_fifo (
566
590
.s_axis_aclk(clk),
567
591
.s_axis_aresetn(up_sw_resetn),
568
592
.s_axis_ready(),
569
593
.s_axis_valid(up_offload0_sdo_wr_en_s),
570
594
.s_axis_data(up_offload0_sdo_wr_data_s),
571
595
.s_axis_room(),
596
+ .s_axis_tlast(),
597
+ .s_axis_tkeep(),
572
598
.s_axis_full(),
599
+ .s_axis_almost_full(),
600
+
573
601
.m_axis_aclk(spi_clk),
574
602
.m_axis_aresetn(spi_resetn),
575
603
.m_axis_ready(1'b1 ),
576
604
.m_axis_valid(offload0_sdo_wr_en),
577
605
.m_axis_data(offload0_sdo_wr_data),
606
+ .m_axis_tlast(),
607
+ .m_axis_tkeep(),
578
608
.m_axis_level(),
579
- .m_axis_empty());
609
+ .m_axis_empty(),
610
+ .m_axis_almost_empty());
580
611
581
612
assign up_offload0_sdo_wr_en_s = up_wreq_s == 1'b1 && up_waddr_s == 8'h45 ;
582
613
assign up_offload0_sdo_wr_data_s = up_wdata_s[DATA_WIDTH- 1 :0 ];
@@ -586,22 +617,31 @@ module axi_spi_engine #(
586
617
.DATA_WIDTH(8 ),
587
618
.ASYNC_CLK(ASYNC_SPI_CLK),
588
619
.ADDRESS_WIDTH(SYNC_FIFO_ADDRESS_WIDTH),
589
- .M_AXIS_REGISTERED(0 )
620
+ .M_AXIS_REGISTERED(0 ),
621
+ .TLAST_EN(0 ),
622
+ .TKEEP_EN(0 )
590
623
) i_offload_sync_fifo (
591
624
.s_axis_aclk(spi_clk),
592
625
.s_axis_aresetn(spi_resetn),
593
626
.s_axis_ready(offload_sync_ready),
594
627
.s_axis_valid(offload_sync_valid),
595
628
.s_axis_data(offload_sync_data),
596
629
.s_axis_room(),
630
+ .s_axis_tlast(),
631
+ .s_axis_tkeep(),
597
632
.s_axis_full(),
633
+ .s_axis_almost_full(),
634
+
598
635
.m_axis_aclk(clk),
599
636
.m_axis_aresetn(up_sw_resetn),
600
637
.m_axis_ready(1'b1 ),
601
638
.m_axis_valid(offload_sync_fifo_valid),
602
639
.m_axis_data(offload_sync_fifo_data),
640
+ .m_axis_tlast(),
641
+ .m_axis_tkeep(),
603
642
.m_axis_level(),
604
- .m_axis_empty());
643
+ .m_axis_empty(),
644
+ .m_axis_almost_empty());
605
645
606
646
end else begin /* ASYNC_SPI_CLK == 0 */
607
647
0 commit comments