aboutsummaryrefslogtreecommitdiffstats
path: root/fpga/usrp3/lib/rfnoc/fosphor/f15_eoseq.v
diff options
context:
space:
mode:
Diffstat (limited to 'fpga/usrp3/lib/rfnoc/fosphor/f15_eoseq.v')
-rw-r--r--fpga/usrp3/lib/rfnoc/fosphor/f15_eoseq.v78
1 files changed, 78 insertions, 0 deletions
diff --git a/fpga/usrp3/lib/rfnoc/fosphor/f15_eoseq.v b/fpga/usrp3/lib/rfnoc/fosphor/f15_eoseq.v
new file mode 100644
index 000000000..6d209cd16
--- /dev/null
+++ b/fpga/usrp3/lib/rfnoc/fosphor/f15_eoseq.v
@@ -0,0 +1,78 @@
+/*
+ * f15_eoseq.v
+ *
+ * Resequence a data flow with data/valid/last ensuring EVEN/ODD
+ * sequencing (even data on even cycles, odd data on odd cycles)
+ *
+ * Copyright (C) 2014 Ettus Corporation LLC
+ * Copyright 2018 Ettus Research, a National Instruments Company
+ *
+ * SPDX-License-Identifier: LGPL-3.0-or-later
+ *
+ * vim: ts=4 sw=4
+ */
+
+`ifdef SIM
+`default_nettype none
+`endif
+
+module f15_eoseq #(
+ parameter integer WIDTH = 16
+)(
+ input wire [WIDTH-1:0] in_data,
+ input wire in_valid,
+ input wire in_last,
+ output reg [WIDTH-1:0] out_data,
+ output reg out_valid,
+ output reg out_last,
+ input wire clk,
+ input wire rst
+);
+
+ // Signals
+ reg [WIDTH-1:0] buf_data;
+ reg buf_valid;
+ reg buf_last;
+
+ wire flip;
+ reg odd;
+ reg sel;
+
+ // Control
+ always @(posedge clk)
+ if (rst)
+ odd <= 1'b0;
+ else
+ odd <= ~(in_last & in_valid) & (odd ^ in_valid);
+
+ always @(posedge clk)
+ if (rst)
+ sel <= 1'b0;
+ else if (flip)
+ sel <= ~sel;
+
+ assign flip = ~in_valid | (in_last & ~odd);
+
+ // Buffer
+ always @(posedge clk)
+ begin
+ buf_data <= in_data;
+ buf_valid <= in_valid;
+ buf_last <= in_last;
+ end
+
+ // Output
+ always @(posedge clk)
+ begin
+ if (sel) begin
+ out_data <= buf_data;
+ out_valid <= buf_valid;
+ out_last <= buf_last;
+ end else begin
+ out_data <= in_data;
+ out_valid <= in_valid;
+ out_last <= in_last;
+ end
+ end
+
+endmodule // f15_eoseq