diff options
Diffstat (limited to 'fpga/usrp3/lib/fifo/axi_fifo_short.v')
| -rw-r--r-- | fpga/usrp3/lib/fifo/axi_fifo_short.v | 113 | 
1 files changed, 113 insertions, 0 deletions
| diff --git a/fpga/usrp3/lib/fifo/axi_fifo_short.v b/fpga/usrp3/lib/fifo/axi_fifo_short.v new file mode 100644 index 000000000..465be28bb --- /dev/null +++ b/fpga/usrp3/lib/fifo/axi_fifo_short.v @@ -0,0 +1,113 @@ +// +// Copyright 2012 Ettus Research LLC +// Copyright 2018 Ettus Research, a National Instruments Company +// +// SPDX-License-Identifier: LGPL-3.0-or-later +// + + +// +// 32 word FIFO with AXI4-STREAM interface. +// +// NOTE: This module uses the SRLC32E primitive explicitly and as such +// can only be used with Xilinx technology of the VIRTEX-6/SPARTAN-6/SIERIES-7 or newer. +// + +module axi_fifo_short +  #(parameter WIDTH=32) +   ( +    input clk,  +    input reset,  +    input clear, +    input [WIDTH-1:0] i_tdata, +    input i_tvalid, +    output i_tready, +    output [WIDTH-1:0] o_tdata, +    output o_tvalid, +    input o_tready, +     +    output reg [5:0] space, +    output reg [5:0] occupied +    ); + +   reg full = 1'b0, empty = 1'b1; +   wire write 	     = i_tvalid & i_tready; +   wire read 	     = o_tready & o_tvalid; + +   assign i_tready  = ~full; +   assign o_tvalid  = ~empty; +    +   reg [4:0] 	  a; +   genvar 	  i;  +    +   generate +      for (i=0;i<WIDTH;i=i+1) +	begin : gen_srlc32e +	   SRLC32E +	     srlc32e(.Q(o_tdata[i]), .Q31(), +		     .A(a), //.A0(a[0]),.A1(a[1]),.A2(a[2]),.A3(a[3]),.A4(a[4]), +		    .CE(write),.CLK(clk),.D(i_tdata[i])); +	end +   endgenerate +    +   always @(posedge clk) +     if(reset) +       begin +	  a <= 0; +	  empty <= 1; +	  full <= 0; +       end +     else if(clear) +       begin +	  a <= 0; +	  empty <= 1; +	  full<= 0; +       end +     else if(read & ~write) +       begin +	  full <= 0; +	  if(a==0) +	    empty <= 1; +	  else +	    a <= a - 1; +       end +     else if(write & ~read) +       begin +	  empty <= 0; +	  if(~empty) +	    a <= a + 1; +	  if(a == 30) +	    full <= 1; +       end + +   // NOTE will fail if you write into a full fifo or read from an empty one + +   ////////////////////////////////////////////////////////////// +   // space and occupied are used for diagnostics, not  +   // guaranteed correct +    +   //assign space = full ? 0 : empty ? 16 : 15-a; +   //assign occupied = empty ? 0 : full ? 16 : a+1; + +   always @(posedge clk) +     if(reset) +       space <= 6'd32; +     else if(clear) +       space <= 6'd32; +     else if(read & ~write) +       space <= space + 6'd1; +     else if(write & ~read) +       space <= space - 6'd1; +    +   always @(posedge clk) +     if(reset) +       occupied <= 6'd0; +     else if(clear) +       occupied <= 6'd0; +     else if(read & ~write) +       occupied <= occupied - 6'd1; +     else if(write & ~read) +       occupied <= occupied + 6'd1; +       +endmodule // axi_fifo_short + | 
