diff options
author | michael-west <michael.west@ettus.com> | 2021-12-09 16:22:28 -0800 |
---|---|---|
committer | Aaron Rossetto <aaron.rossetto@ni.com> | 2022-01-10 16:19:11 -0600 |
commit | 699870d7dec67b43c08e55fcc1d4e159a337c49a (patch) | |
tree | 4bb85f94157425a4f32d028ec8cdd8d5eaa36a8f /host/lib/rfnoc | |
parent | 5d80e28752d2b6f202480ce591f142f5e6f90139 (diff) | |
download | uhd-699870d7dec67b43c08e55fcc1d4e159a337c49a.tar.gz uhd-699870d7dec67b43c08e55fcc1d4e159a337c49a.tar.bz2 uhd-699870d7dec67b43c08e55fcc1d4e159a337c49a.zip |
RFNoC: Fix DSP frequency accuracy
The host code was calculating and programming a 32-bit value for the DSP
frequency, but the DDS modules in the FPGA only use the upper 24-bits.
This led to inaccurate frequency values being returned. This change
corrects the resolution of the value on the host side so an accurate
value is returned.
Signed-off-by: michael-west <michael.west@ettus.com>
Diffstat (limited to 'host/lib/rfnoc')
-rw-r--r-- | host/lib/rfnoc/ddc_block_control.cpp | 7 | ||||
-rw-r--r-- | host/lib/rfnoc/duc_block_control.cpp | 7 |
2 files changed, 12 insertions, 2 deletions
diff --git a/host/lib/rfnoc/ddc_block_control.cpp b/host/lib/rfnoc/ddc_block_control.cpp index df606f11b..12e89961d 100644 --- a/host/lib/rfnoc/ddc_block_control.cpp +++ b/host/lib/rfnoc/ddc_block_control.cpp @@ -541,10 +541,15 @@ private: double _set_freq( const double requested_freq, const double dds_rate, const size_t chan) { + static int freq_word_width = 24; double actual_freq; int32_t freq_word; std::tie(actual_freq, freq_word) = - get_freq_and_freq_word(requested_freq, dds_rate); + get_freq_and_freq_word(requested_freq, dds_rate, freq_word_width); + + // Only the upper 24 bits of the SR_FREQ_ADDR register are used, so shift the word + freq_word <<= (32 - freq_word_width); + _ddc_reg_iface.poke32( SR_FREQ_ADDR, uint32_t(freq_word), chan, get_command_time(chan)); return actual_freq; diff --git a/host/lib/rfnoc/duc_block_control.cpp b/host/lib/rfnoc/duc_block_control.cpp index ac9629ec4..487e4b8ff 100644 --- a/host/lib/rfnoc/duc_block_control.cpp +++ b/host/lib/rfnoc/duc_block_control.cpp @@ -525,10 +525,15 @@ private: double _set_freq( const double requested_freq, const double dds_rate, const size_t chan) { + static int freq_word_width = 24; double actual_freq; int32_t freq_word; std::tie(actual_freq, freq_word) = - get_freq_and_freq_word(requested_freq, dds_rate); + get_freq_and_freq_word(requested_freq, dds_rate, freq_word_width); + + // Only the upper 24 bits of the SR_FREQ_ADDR register are used, so shift the word + freq_word <<= (32 - freq_word_width); + _duc_reg_iface.poke32( SR_FREQ_ADDR, uint32_t(freq_word), chan, get_command_time(chan)); return actual_freq; |