aboutsummaryrefslogtreecommitdiffstats
path: root/fpga/usrp3
diff options
context:
space:
mode:
Diffstat (limited to 'fpga/usrp3')
-rw-r--r--fpga/usrp3/lib/fifo/axi_fifo_short.v185
1 files changed, 87 insertions, 98 deletions
diff --git a/fpga/usrp3/lib/fifo/axi_fifo_short.v b/fpga/usrp3/lib/fifo/axi_fifo_short.v
index 465be28bb..d78bee24e 100644
--- a/fpga/usrp3/lib/fifo/axi_fifo_short.v
+++ b/fpga/usrp3/lib/fifo/axi_fifo_short.v
@@ -1,113 +1,102 @@
//
// Copyright 2012 Ettus Research LLC
// Copyright 2018 Ettus Research, a National Instruments Company
+// Copyright 2020 Ettus Research, a National Instruments Brand
//
// SPDX-License-Identifier: LGPL-3.0-or-later
//
-
-
-//
-// 32 word FIFO with AXI4-STREAM interface.
+// Description: 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.
+// NOTE: This module uses the SRLC32E primitive explicitly and as such can
+// only be used with Xilinx technology.
//
-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
- );
+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,
- reg full = 1'b0, empty = 1'b1;
- wire write = i_tvalid & i_tready;
- wire read = o_tready & o_tvalid;
+ output reg [5:0] space,
+ output reg [5:0] occupied
+);
- 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
+ reg full = 1'b0, empty = 1'b1;
+ wire write = i_tvalid & i_tready;
+ wire read = o_tready & o_tvalid;
- // NOTE will fail if you write into a full fifo or read from an empty one
+ 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),
+ .CE(write),.CLK(clk),.D(i_tdata[i])
+ );
+ end
+ endgenerate
+
+ always @(posedge clk) begin
+ 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
+ end
- //////////////////////////////////////////////////////////////
- // 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;
+ // NOTE: Will fail if you write into a full FIFO or read from an empty one
- 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;
-
+ always @(posedge clk) begin
+ 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;
+ end
+
+ always @(posedge clk) begin
+ 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;
+ end
+
endmodule // axi_fifo_short
-