1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
/////////////////////////////////////////////////////////////////////
//
// Copyright 2016-2017 Ettus Research
// Copyright 2018 Ettus Research, a National Instruments Company
//
// SPDX-License-Identifier: LGPL-3.0-or-later
//
//////////////////////////////////////////////////////////////////////
module fifo64_to_axi4lite
(
input s_axi_aclk,
input s_axi_areset,
input [31:0] s_axi_awaddr,
input s_axi_awvalid,
output s_axi_awready,
input [31:0] s_axi_wdata,
input [3:0] s_axi_wstrb,
input s_axi_wvalid,
output s_axi_wready,
output [1:0] s_axi_bresp,
output s_axi_bvalid,
input s_axi_bready,
input [31:0] s_axi_araddr,
input s_axi_arvalid,
output s_axi_arready,
output [31:0] s_axi_rdata,
output [1:0] s_axi_rresp,
output s_axi_rvalid,
input s_axi_rready,
output m_axis_tvalid,
output m_axis_tlast,
output [63:0] m_axis_tdata,
input m_axis_tready,
output [3:0] m_axis_tuser,
input s_axis_tvalid,
input s_axis_tlast,
input [63:0] s_axis_tdata,
output s_axis_tready,
input [3:0] s_axis_tuser,
output irq
);
wire clear_txn;
wire [31:0] tx_tdata;
wire tx_tlast;
wire tx_tvalid;
wire tx_tready;
wire [3:0] tx_tkeep;
wire [1:0] tx_tuser = (tx_tkeep == 4'b1111) ? 2'd0 :
(tx_tkeep == 4'b0001) ? 2'd1 :
(tx_tkeep == 4'b0011) ? 2'd2 :
(tx_tkeep == 4'b0111) ? 2'd3 : 2'd0;
axi_fifo32_to_fifo64 inst_axi_fifo32_to_fifo64
(
.clk(s_axi_aclk),
.reset(s_axi_areset | ~clear_txn),
.i_tdata({tx_tdata[7:0], tx_tdata[15:8], tx_tdata[23:16], tx_tdata[31:24]}), // endian swap
.i_tuser(tx_tuser),
.i_tlast(tx_tlast),
.i_tvalid(tx_tvalid),
.i_tready(tx_tready),
.o_tdata(m_axis_tdata),
.o_tuser(m_axis_tuser),
.o_tlast(m_axis_tlast),
.o_tvalid(m_axis_tvalid),
.o_tready(m_axis_tready)
);
wire clear_rxn;
wire [31:0] rx_tdata;
wire rx_tlast;
wire rx_tvalid;
wire rx_tready;
wire [1:0] rx_tuser;
axi_fifo64_to_fifo32 inst_axi_fifo64_to_fifo32
(
.clk(s_axi_aclk),
.reset(s_axi_areset || ~clear_rxn),
.i_tdata(s_axis_tdata),
.i_tuser(s_axis_tuser[2:0]),
.i_tlast(s_axis_tlast),
.i_tvalid(s_axis_tvalid),
.i_tready(s_axis_tready),
.o_tdata({rx_tdata[7:0], rx_tdata[15:8], rx_tdata[23:16], rx_tdata[31:24]}), // endian swap
.o_tuser(rx_tuser),
.o_tlast(rx_tlast),
.o_tvalid(rx_tvalid),
.o_tready(rx_tready)
);
wire [3:0] rx_tkeep = ~rx_tlast ? 4'b1111 : (rx_tuser == 2'd0) ? 4'b1111 :
(rx_tuser == 2'd1) ? 4'b0001 :
(rx_tuser == 2'd2) ? 4'b0011 :
(rx_tuser == 2'd3) ? 4'b0111 :
4'b1111;
axis_fifo_to_axi4lite inst_axis_fifo_to_axi4lite0
(
.interrupt(irq),
.s_axi_aclk(s_axi_aclk),
.s_axi_aresetn(~s_axi_areset),
.s_axi_awaddr({16'h0000, s_axi_awaddr}),
.s_axi_awvalid(s_axi_awvalid),
.s_axi_awready(s_axi_awready),
.s_axi_wdata(s_axi_wdata),
.s_axi_wstrb(s_axi_wstrb),
.s_axi_wvalid(s_axi_wvalid),
.s_axi_wready(s_axi_wready),
.s_axi_bresp(s_axi_bresp),
.s_axi_bvalid(s_axi_bvalid),
.s_axi_bready(s_axi_bready),
.s_axi_araddr({16'h0000, s_axi_araddr}),
.s_axi_arvalid(s_axi_arvalid),
.s_axi_arready(s_axi_arready),
.s_axi_rdata(s_axi_rdata),
.s_axi_rresp(s_axi_rresp),
.s_axi_rvalid(s_axi_rvalid),
.s_axi_rready(s_axi_rready),
.mm2s_prmry_reset_out_n(clear_txn),
.axi_str_txd_tvalid(tx_tvalid),
.axi_str_txd_tready(tx_tready),
.axi_str_txd_tlast(tx_tlast),
.axi_str_txd_tdata(tx_tdata),
.axi_str_txd_tkeep(tx_tkeep),
.s2mm_prmry_reset_out_n(clear_rxn),
.axi_str_rxd_tvalid(rx_tvalid),
.axi_str_rxd_tready(rx_tready),
.axi_str_rxd_tlast(rx_tlast),
.axi_str_rxd_tdata(rx_tdata),
.axi_str_rxd_tkeep(rx_tkeep)
);
endmodule
|