aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/rfnoc
diff options
context:
space:
mode:
authormattprost <matt.prost@ni.com>2020-02-21 11:42:10 -0600
committerAaron Rossetto <aaron.rossetto@ni.com>2020-07-16 12:14:49 -0500
commit0507cc2d79f6ea16456a8f60cdd67ee16da46ba3 (patch)
treef5aa5e8323929de13d6169949880f43f9b3421f0 /host/lib/rfnoc
parentcdb4a357284a0dd29d1120e2b6f7594f5f934f88 (diff)
downloaduhd-0507cc2d79f6ea16456a8f60cdd67ee16da46ba3.tar.gz
uhd-0507cc2d79f6ea16456a8f60cdd67ee16da46ba3.tar.bz2
uhd-0507cc2d79f6ea16456a8f60cdd67ee16da46ba3.zip
rfnoc: Add Moving Average block controller
Signed-off-by: mattprost <matt.prost@ni.com>
Diffstat (limited to 'host/lib/rfnoc')
-rw-r--r--host/lib/rfnoc/CMakeLists.txt1
-rw-r--r--host/lib/rfnoc/moving_average_block_control.cpp106
2 files changed, 107 insertions, 0 deletions
diff --git a/host/lib/rfnoc/CMakeLists.txt b/host/lib/rfnoc/CMakeLists.txt
index 7d1334e04..63bdccf4d 100644
--- a/host/lib/rfnoc/CMakeLists.txt
+++ b/host/lib/rfnoc/CMakeLists.txt
@@ -49,6 +49,7 @@ LIBUHD_APPEND_SOURCES(
${CMAKE_CURRENT_SOURCE_DIR}/fir_filter_block_control.cpp
${CMAKE_CURRENT_SOURCE_DIR}/fosphor_block_control.cpp
${CMAKE_CURRENT_SOURCE_DIR}/logpwr_block_control.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/moving_average_block_control.cpp
${CMAKE_CURRENT_SOURCE_DIR}/null_block_control.cpp
${CMAKE_CURRENT_SOURCE_DIR}/radio_control_impl.cpp
${CMAKE_CURRENT_SOURCE_DIR}/split_stream_block_control.cpp
diff --git a/host/lib/rfnoc/moving_average_block_control.cpp b/host/lib/rfnoc/moving_average_block_control.cpp
new file mode 100644
index 000000000..f812d535d
--- /dev/null
+++ b/host/lib/rfnoc/moving_average_block_control.cpp
@@ -0,0 +1,106 @@
+//
+// Copyright 2020 Ettus Research, a National Instruments Brand
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+//
+
+#include <uhd/exception.hpp>
+#include <uhd/rfnoc/defaults.hpp>
+#include <uhd/rfnoc/moving_average_block_control.hpp>
+#include <uhd/rfnoc/property.hpp>
+#include <uhd/rfnoc/registry.hpp>
+#include <string>
+
+using namespace uhd::rfnoc;
+
+const uint32_t moving_average_block_control::REG_SUM_LEN_ADDR = 0;
+const uint32_t moving_average_block_control::REG_DIVISOR_ADDR = 4;
+
+// User property names
+const char* const PROP_KEY_SUM_LEN = "sum_len";
+const char* const PROP_KEY_DIVISOR = "divisor";
+
+class moving_average_block_control_impl : public moving_average_block_control
+{
+public:
+ RFNOC_BLOCK_CONSTRUCTOR(moving_average_block_control), _sum_len(10), _divisor(10)
+ {
+ _register_props();
+ this->regs().poke32(REG_SUM_LEN_ADDR, uint8_t(_sum_len));
+ this->regs().poke32(REG_DIVISOR_ADDR, uint32_t(_divisor));
+ }
+
+ void set_sum_len(const uint8_t sum_len)
+ {
+ set_property(PROP_KEY_SUM_LEN, static_cast<int>(sum_len), res_source_info::USER);
+ }
+
+ uint8_t get_sum_len() const
+ {
+ return _sum_len;
+ }
+
+ void set_divisor(const uint32_t divisor)
+ {
+ set_property(PROP_KEY_DIVISOR, static_cast<int>(divisor), res_source_info::USER);
+ }
+
+ uint32_t get_divisor() const
+ {
+ return _divisor;
+ }
+
+private:
+ void _register_props()
+ {
+ // Register user properties
+ register_property(
+ &_prop_sum_len, [this]() { _set_sum_len(_prop_sum_len.get()); });
+ register_property(
+ &_prop_divisor, [this]() { _set_divisor(_prop_divisor.get()); });
+ }
+
+ void _set_sum_len(int sum_len)
+ {
+ // The hardware implementation requires this value to be in the range [1, 255]
+ if ((sum_len < 1) || (sum_len > 255)) {
+ throw uhd::value_error(
+ "Attempting to set Moving Average Block sum length to invalid value!");
+ }
+ // The hardware implementation causes this noc block to clear the fifo when a
+ // register write occurs to the sum length. This value should only be written if
+ // the value actually changes.
+ if (sum_len != _sum_len) {
+ _sum_len = sum_len;
+ this->regs().poke32(REG_SUM_LEN_ADDR, uint8_t(_sum_len));
+ }
+ }
+
+ void _set_divisor(int divisor)
+ {
+ // The hardware implementation requires this value to be in the range [1, 2^24-1]
+ if ((divisor < 1) || (divisor > (1 << 24) - 1)) {
+ throw uhd::value_error(
+ "Attempting to set Moving Average Block divisor to invalid value!");
+ }
+ _divisor = divisor;
+ this->regs().poke32(REG_DIVISOR_ADDR, uint32_t(_divisor));
+ }
+
+ /**************************************************************************
+ * Attributes
+ *************************************************************************/
+ property_t<int> _prop_sum_len =
+ property_t<int>{PROP_KEY_SUM_LEN, 10, {res_source_info::USER}};
+ property_t<int> _prop_divisor =
+ property_t<int>{PROP_KEY_DIVISOR, 10, {res_source_info::USER}};
+
+ uint8_t _sum_len;
+ uint32_t _divisor;
+};
+
+UHD_RFNOC_BLOCK_REGISTER_DIRECT(moving_average_block_control,
+ MOVING_AVERAGE_BLOCK,
+ "MovingAverage",
+ CLOCK_KEY_GRAPH,
+ "bus_clk")