| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- `timescale 1 ns / 1 ps
- module axis_fifo #
- (
- parameter integer S_AXIS_TDATA_WIDTH = 32,
- parameter integer M_AXIS_TDATA_WIDTH = 32,
- parameter integer WRITE_DEPTH = 512,
- parameter ALWAYS_READY = "FALSE",
- parameter ALWAYS_VALID = "FALSE"
- )
- (
- // System signals
- input wire aclk,
- input wire aresetn,
- // FIFO status
- output wire [15:0] write_count,
- output wire [15:0] read_count,
- // Slave side
- input wire [S_AXIS_TDATA_WIDTH-1:0] s_axis_tdata,
- input wire s_axis_tvalid,
- output wire s_axis_tready,
- // Master side
- output wire [M_AXIS_TDATA_WIDTH-1:0] m_axis_tdata,
- output wire m_axis_tvalid,
- input wire m_axis_tready
- );
- localparam integer WRITE_COUNT_WIDTH = $clog2(WRITE_DEPTH) + 1;
- localparam integer READ_COUNT_WIDTH = $clog2(WRITE_DEPTH * S_AXIS_TDATA_WIDTH / M_AXIS_TDATA_WIDTH) + 1;
- wire [M_AXIS_TDATA_WIDTH-1:0] int_data_wire;
- wire int_empty_wire, int_full_wire;
- xpm_fifo_sync #(
- .WRITE_DATA_WIDTH(S_AXIS_TDATA_WIDTH),
- .FIFO_WRITE_DEPTH(WRITE_DEPTH),
- .READ_DATA_WIDTH(M_AXIS_TDATA_WIDTH),
- .READ_MODE("fwft"),
- .FIFO_READ_LATENCY(0),
- .FIFO_MEMORY_TYPE("block"),
- .USE_ADV_FEATURES("0404"),
- .WR_DATA_COUNT_WIDTH(WRITE_COUNT_WIDTH),
- .RD_DATA_COUNT_WIDTH(READ_COUNT_WIDTH)
- ) fifo_0 (
- .empty(int_empty_wire),
- .full(int_full_wire),
- .wr_data_count(write_count),
- .rd_data_count(read_count),
- .rst(~aresetn),
- .wr_clk(aclk),
- .wr_en(s_axis_tvalid),
- .din(s_axis_tdata),
- .rd_en(m_axis_tready),
- .dout(int_data_wire)
- );
- generate
- if(ALWAYS_READY == "TRUE")
- begin : READY_INPUT
- assign s_axis_tready = 1'b1;
- end
- else
- begin : BLOCKING_INPUT
- assign s_axis_tready = ~int_full_wire;
- end
- endgenerate
- generate
- if(ALWAYS_VALID == "TRUE")
- begin : VALID_OUTPUT
- assign m_axis_tdata = int_empty_wire ? {(M_AXIS_TDATA_WIDTH){1'b0}} : int_data_wire;
- assign m_axis_tvalid = 1'b1;
- end
- else
- begin : BLOCKING_OUTPUT
- assign m_axis_tdata = int_data_wire;
- assign m_axis_tvalid = ~int_empty_wire;
- end
- endgenerate
- endmodule
|