aboutsummaryrefslogtreecommitdiffstats
path: root/fpga/usrp3/lib/fifo/axi_fifo_2clk.v
diff options
context:
space:
mode:
authorBen Hilburn <ben.hilburn@ettus.com>2013-10-10 10:17:27 -0700
committerBen Hilburn <ben.hilburn@ettus.com>2013-10-10 10:17:27 -0700
commit0df4b801a34697f2058b4a7b95e08d2a0576c9db (patch)
treebe10e78d1a97c037a9e7492360a178d1873b9c09 /fpga/usrp3/lib/fifo/axi_fifo_2clk.v
parent6e7bc850b66e8188718248b76b729c7cf9c89700 (diff)
downloaduhd-0df4b801a34697f2058b4a7b95e08d2a0576c9db.tar.gz
uhd-0df4b801a34697f2058b4a7b95e08d2a0576c9db.tar.bz2
uhd-0df4b801a34697f2058b4a7b95e08d2a0576c9db.zip
Squashed B200 FPGA Source. Code from Josh Blum, Ian Buckley, and Matt Ettus.
Diffstat (limited to 'fpga/usrp3/lib/fifo/axi_fifo_2clk.v')
-rw-r--r--fpga/usrp3/lib/fifo/axi_fifo_2clk.v88
1 files changed, 88 insertions, 0 deletions
diff --git a/fpga/usrp3/lib/fifo/axi_fifo_2clk.v b/fpga/usrp3/lib/fifo/axi_fifo_2clk.v
new file mode 100644
index 000000000..f9f7beb88
--- /dev/null
+++ b/fpga/usrp3/lib/fifo/axi_fifo_2clk.v
@@ -0,0 +1,88 @@
+//
+// Copyright 2013 Ettus Research LLC
+//
+
+
+// Special case SIZE <= 5 uses a short fifo
+
+module axi_fifo_2clk
+ #(parameter WIDTH=69, SIZE=9)
+ (input reset,
+ input i_aclk,
+ input [WIDTH-1:0] i_tdata,
+ input i_tvalid,
+ output i_tready,
+ input o_aclk,
+ output [WIDTH-1:0] o_tdata,
+ output o_tvalid,
+ input o_tready);
+
+ wire write, read, empty, full;
+ assign i_tready = ~full;
+ assign write = i_tvalid & i_tready;
+
+ wire [71:0] tdata_int;
+ wire tvalid_int, tready_int;
+ assign tvalid_int = ~empty;
+ assign read = tvalid_int & tready_int;
+
+ wire [71:0] wr_data;
+ assign wr_data[WIDTH-1:0] = i_tdata;
+ wire [71:0] rd_data;
+ assign tdata_int = rd_data[WIDTH-1:0];
+
+ generate
+ if(WIDTH<72) begin
+ assign wr_data[71:WIDTH] = 0;
+ end
+ endgenerate
+
+ generate
+ if(SIZE<=5)
+ fifo_short_2clk fifo_short_2clk
+ (.rst(reset),
+ .wr_clk(i_aclk),
+ .din(wr_data), // input [71 : 0] din
+ .wr_en(write), // input wr_en
+ .full(full), // output full
+ .wr_data_count(), // output [9 : 0] wr_data_count
+
+ .rd_clk(o_aclk), // input rd_clk
+ .dout(rd_data), // output [71 : 0] dout
+ .rd_en(read), // input rd_en
+ .empty(empty), // output empty
+ .rd_data_count() // output [9 : 0] rd_data_count
+ );
+ else
+ fifo_4k_2clk fifo_4k_2clk
+ (.rst(reset),
+ .wr_clk(i_aclk),
+ .din(wr_data), // input [71 : 0] din
+ .wr_en(write), // input wr_en
+ .full(full), // output full
+ .wr_data_count(), // output [9 : 0] wr_data_count
+
+ .rd_clk(o_aclk), // input rd_clk
+ .dout(rd_data), // output [71 : 0] dout
+ .rd_en(read), // input rd_en
+ .empty(empty), // output empty
+ .rd_data_count() // output [9 : 0] rd_data_count
+ );
+ endgenerate
+
+ generate
+ if(SIZE>9)
+ axi_fifo #(.WIDTH(WIDTH), .SIZE(SIZE)) fifo_1clk
+ (.clk(o_aclk), .reset(reset), .clear(1'b0),
+ .i_tdata(tdata_int), .i_tvalid(tvalid_int), .i_tready(tready_int),
+ .o_tdata(o_tdata), .o_tvalid(o_tvalid), .o_tready(o_tready),
+ .space(), .occupied());
+ else
+ begin
+ assign o_tdata = tdata_int;
+ assign o_tvalid = tvalid_int;
+ assign tready_int = o_tready;
+ end
+ endgenerate
+
+endmodule // axi_fifo_2clk