aboutsummaryrefslogtreecommitdiffstats
path: root/fpga/usrp3/lib/control/regport_to_settingsbus.v
diff options
context:
space:
mode:
Diffstat (limited to 'fpga/usrp3/lib/control/regport_to_settingsbus.v')
-rw-r--r--fpga/usrp3/lib/control/regport_to_settingsbus.v63
1 files changed, 63 insertions, 0 deletions
diff --git a/fpga/usrp3/lib/control/regport_to_settingsbus.v b/fpga/usrp3/lib/control/regport_to_settingsbus.v
new file mode 100644
index 000000000..532380ef3
--- /dev/null
+++ b/fpga/usrp3/lib/control/regport_to_settingsbus.v
@@ -0,0 +1,63 @@
+/////////////////////////////////////////////////////////////////////
+//
+// Copyright 2017 Ettus Research, A National Instruments Company
+//
+// SPDX-License-Identifier: LGPL-3.0-or-later
+//
+// Module: regport_to_settingsbus
+// Description:
+// Converts regport write bus to the a setting bus
+// ADDRESSING: Set to "WORD" in case of settings bus. The settings bus
+// uses word addressing and hence the address needs to be shifted by
+// to convert to set_addr.
+//
+/////////////////////////////////////////////////////////////////////
+
+module regport_to_settingsbus #(
+ parameter BASE = 14'h0,
+ parameter END_ADDR = 14'h3FFF,
+ parameter DWIDTH = 32,
+ parameter AWIDTH = 14,
+ parameter SR_AWIDTH = 12,
+ // Dealign for settings bus by shifting by 2
+ parameter ADDRESSING = "WORD",
+ parameter SHIFT = $clog2(DWIDTH/8)
+)(
+ input reset,
+ input clk,
+ input reg_wr_req,
+ input [AWIDTH-1:0] reg_wr_addr,
+ input [DWIDTH-1:0] reg_wr_data,
+
+ output reg set_stb,
+ output reg [SR_AWIDTH-1:0] set_addr,
+ output reg [DWIDTH-1:0] set_data
+);
+
+ wire set_stb_int;
+ wire [DWIDTH-1:0] set_data_int;
+ wire [SR_AWIDTH-1:0] set_addr_base;
+ wire [SR_AWIDTH-1:0] set_addr_int;
+
+ // Strobe asserted only when address is between BASE and END ADDR
+ assign set_stb_int = reg_wr_req && (reg_wr_addr >= BASE) && (reg_wr_addr <= END_ADDR);
+ assign set_addr_base = reg_wr_addr - BASE;
+ // Shift by 2 in case of setting bus
+ assign set_addr_int = (ADDRESSING == "WORD") ? {{SHIFT{1'b0}}, set_addr_base[SR_AWIDTH-1:SHIFT]}
+ : set_addr_base[SR_AWIDTH-1:0];
+ assign set_data_int = reg_wr_data;
+
+ // Adding a pipeline stage
+ always @(posedge clk) begin
+ if (reset) begin
+ set_stb <= 'b0;
+ set_addr <= 'h0;
+ set_data <= 'h0;
+ end else begin
+ set_stb <= set_stb_int;
+ set_addr <= set_addr_int;
+ set_data <= set_data_int;
+ end
+ end
+
+endmodule // regport_to_settingsbus