diff options
Diffstat (limited to 'fpga/usrp3/lib/fifo/axi_fifo_flop2.v')
-rw-r--r-- | fpga/usrp3/lib/fifo/axi_fifo_flop2.v | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/fpga/usrp3/lib/fifo/axi_fifo_flop2.v b/fpga/usrp3/lib/fifo/axi_fifo_flop2.v new file mode 100644 index 000000000..381253e56 --- /dev/null +++ b/fpga/usrp3/lib/fifo/axi_fifo_flop2.v @@ -0,0 +1,59 @@ +// +// Copyright 2015 Ettus Research LLC +// Copyright 2018 Ettus Research, a National Instruments Company +// +// SPDX-License-Identifier: LGPL-3.0-or-later +// +// Single cycle latency, depth of 2 "Flip flop" with no end to end combinatorial paths on +// AXI control signals (such as i_tready depends on o_tready). Breaking the combinatorial +// paths requires an additional register stage. +// +// Note: Once i_tvalid is asserted, it cannot be deasserted without i_tready having asserted +// indicating i_tdata has been read. This is an AXI stream requirement. + +module axi_fifo_flop2 #( + parameter WIDTH = 32 +)( + input clk, + input reset, + input clear, + input [WIDTH-1:0] i_tdata, + input i_tvalid, + output i_tready, + output reg [WIDTH-1:0] o_tdata = 'h0, + output reg o_tvalid = 1'b0, + input o_tready, + output [1:0] space, + output [1:0] occupied); + + reg [WIDTH-1:0] i_tdata_temp = 'h0; + reg i_tvalid_temp = 1'b0; + + assign i_tready = ~i_tvalid_temp; + + always @(posedge clk) begin + if (~o_tvalid | o_tready) begin + if (i_tvalid_temp) begin + o_tvalid <= 1'b1; + o_tdata <= i_tdata_temp; + end else begin + o_tvalid <= i_tvalid; + o_tdata <= i_tdata; + end + i_tvalid_temp <= 1'b0; + end else begin + if (~i_tvalid_temp) begin + i_tvalid_temp <= i_tvalid; + i_tdata_temp <= i_tdata; + end + end + if (reset | clear) begin + o_tvalid <= 1'b0; + i_tvalid_temp <= 1'b0; + end + end + + assign occupied = i_tvalid_temp + o_tvalid; + assign space = 2 - occupied; + +endmodule |