Discussion and technical support related to USRP, UHD, RFNoC
View all threadsHi folks,
I'm using the rx_samples_to_file.cpp demo application with very minor modifications (listed below). I'm having an issue with the noc_block_fir_filter in RFNOC on an E310. Whenever I try to set the taps, using the set_taps method of the uhd::rfnoc::fir_block_ctrl class in my main function, I get an output of all zeros.
Here's the funny part, I can go through and manually edit fir_block_ctrl_impl.cpp to assign a fixed vector of taps instead of all zeros, re-compile, and it will assign them just fine when it instantiates the blocks. However, if I try calling this method from my main file, I get an output of all zeros. No warnings or errors are thrown, as far as I can tell. I've tried changing up the order of setting the channel, passing the streamargs, and assigning the taps; no luck.
Any insight would be appreciated, thanks!
Changes to rx_samples_to_file.cpp (aside from adding the required includes), blockid is always FIR,
// Clear the E310
usrp->get_device3()->clear();
// Clear all previous channels
usrp->clear_channels();
// Create a pointer to our FIR filter
uhd::rfnoc::fir_block_ctrl::sptr fir_block_ctrl_imp =
usrp->get_device3()->find_block_ctrl< uhd::rfnoc::fir_block_ctrl >(blockid);
// Read in our filter taps (single column of ints) from a file
std::vector<int> coeffsVector;
std::ifstream coeffsFile(coeffs);
if (coeffsFile) {
int value;
while (coeffsFile >> value) coeffsVector.push_back(value);
}
coeffsFile.close();
std::cout << "-- Read " << coeffsVector.size() << " filter taps.\n";
// Set the taps on our FIR Filter
fir_block_ctrl_imp->set_taps(coeffsVector);
// Pass through our stream arguments to the blocks
fir_block_ctrl_imp->set_args(streamargs);
usrp->get_device3()->get_block_ctrl(radio_ctrl_id)->set_args(streamargs);
// Connect our blocks together
std::cout << "Connecting Blocks..." << std::endl;
usrp->connect(radio_ctrl_id, fir_block_ctrl_imp->get_block_id());
// Set the RX Channel to the ARM
usrp->set_rx_channel(fir_block_ctrl_imp->get_block_id());
All the best,
David Greene
University of Florida
It would probably be more useful to the list-serve if I include the E310 bit file, sorry about that...
This contains the Radio_0, Radio_1, FIFO, and a 31-tap FIR filter block. It was built on 12/14/2015 using the latest source. Thanks again!
Dropbox link in case the list-serve blocks it:
https://www.dropbox.com/s/qa61rrojfyhynwx/usrp_e310_fpga_fir_31taps.bit?dl=0
All the best,
David Greene
University of Florida
Mobile: (954) 655-3421
From: USRP-users usrp-users-bounces@lists.ettus.com on behalf of Greene,David J via USRP-users usrp-users@lists.ettus.com
Sent: Monday, December 14, 2015 1:31 PM
To: usrp-users@lists.ettus.com
Subject: [USRP-users] RFNOC: FIR 'set-taps' function causing output of all zero
Hi folks,
I'm using the rx_samples_to_file.cpp demo application with very minor modifications (listed below). I'm having an issue with the noc_block_fir_filter in RFNOC on an E310. Whenever I try to set the taps, using the set_taps method of the uhd::rfnoc::fir_block_ctrl class in my main function, I get an output of all zeros.
Here's the funny part, I can go through and manually edit fir_block_ctrl_impl.cpp to assign a fixed vector of taps instead of all zeros, re-compile, and it will assign them just fine when it instantiates the blocks. However, if I try calling this method from my main file, I get an output of all zeros. No warnings or errors are thrown, as far as I can tell. I've tried changing up the order of setting the channel, passing the streamargs, and assigning the taps; no luck.
Any insight would be appreciated, thanks!
Changes to rx_samples_to_file.cpp (aside from adding the required includes), blockid is always FIR,
// Clear the E310
usrp->get_device3()->clear();
// Clear all previous channels
usrp->clear_channels();
// Create a pointer to our FIR filter
uhd::rfnoc::fir_block_ctrl::sptr fir_block_ctrl_imp =
usrp->get_device3()->find_block_ctrl< uhd::rfnoc::fir_block_ctrl >(blockid);
// Read in our filter taps (single column of ints) from a file
std::vector<int> coeffsVector;
std::ifstream coeffsFile(coeffs);
if (coeffsFile) {
int value;
while (coeffsFile >> value) coeffsVector.push_back(value);
}
coeffsFile.close();
std::cout << "-- Read " << coeffsVector.size() << " filter taps.\n";
// Set the taps on our FIR Filter
fir_block_ctrl_imp->set_taps(coeffsVector);
// Pass through our stream arguments to the blocks
fir_block_ctrl_imp->set_args(streamargs);
usrp->get_device3()->get_block_ctrl(radio_ctrl_id)->set_args(streamargs);
// Connect our blocks together
std::cout << "Connecting Blocks..." << std::endl;
usrp->connect(radio_ctrl_id, fir_block_ctrl_imp->get_block_id());
// Set the RX Channel to the ARM
usrp->set_rx_channel(fir_block_ctrl_imp->get_block_id());
All the best,
David Greene
University of Florida
Hi David,
I don't see any reason why what you are doing shouldn't work. If I were to
guess, I would say that the FPGA is not accepting the taps properly. Can
you try sending the same taps twice or three times in a row and see if that
makes a difference? I'll also take a closer look with chipscope.
Jonathon
On Wed, Dec 16, 2015 at 10:19 AM, Greene,David J via USRP-users <
usrp-users@lists.ettus.com> wrote:
It would probably be more useful to the list-serve if I include the
E310 bit file, sorry about that...
This contains the Radio_0, Radio_1, FIFO, and a 31-tap FIR filter block.
It was built on 12/14/2015 using the latest source. Thanks again!
Dropbox link in case the list-serve blocks it:
https://www.dropbox.com/s/qa61rrojfyhynwx/usrp_e310_fpga_fir_31taps.bit?dl=0
All the best,
David Greene
University of Florida
Mobile: (954) 655-3421
From: USRP-users usrp-users-bounces@lists.ettus.com on behalf of
Greene,David J via USRP-users usrp-users@lists.ettus.com
Sent: Monday, December 14, 2015 1:31 PM
To: usrp-users@lists.ettus.com
Subject: [USRP-users] RFNOC: FIR 'set-taps' function causing output of
all zero
Hi folks,
I'm using the rx_samples_to_file.cpp demo application with very minor
modifications (listed below). I'm having an issue with the
noc_block_fir_filter in RFNOC on an E310. Whenever I try to set the taps,
using the set_taps method of the uhd::rfnoc::fir_block_ctrl class in my
main function, I get an output of all zeros.
Here's the funny part, I can go through and manually
edit fir_block_ctrl_impl.cpp to assign a fixed vector of taps instead of
all zeros, re-compile, and it will assign them just fine when it
instantiates the blocks. However, if I try calling this method from my main
file, I get an output of all zeros. No warnings or errors are thrown, as
far as I can tell. I've tried changing up the order of setting the channel,
passing the streamargs, and assigning the taps; no luck.
Any insight would be appreciated, thanks!
Changes to rx_samples_to_file.cpp (aside from adding the required
includes), blockid is always FIR,
// Clear the E310
usrp->get_device3()->clear();
// Clear all previous channels
usrp->clear_channels();
// Create a pointer to our FIR filter
uhd::rfnoc::fir_block_ctrl::sptr fir_block_ctrl_imp =
usrp->get_device3()->find_block_ctrl<
uhd::rfnoc::fir_block_ctrl >(blockid);
// Read in our filter taps (single column of ints) from a file
std::vector<int> coeffsVector;
std::ifstream coeffsFile(coeffs);
if (coeffsFile) {
int value;
while (coeffsFile >> value) coeffsVector.push_back(value);
}
coeffsFile.close();
std::cout << "-- Read " << coeffsVector.size() << " filter
taps.\n";
// Set the taps on our FIR Filter
fir_block_ctrl_imp->set_taps(coeffsVector);
// Pass through our stream arguments to the blocks
fir_block_ctrl_imp->set_args(streamargs);
usrp->get_device3()->get_block_ctrl(radio_ctrl_id)->set_args(streamargs);
// Connect our blocks together
std::cout << "Connecting Blocks..." << std::endl;
usrp->connect(radio_ctrl_id, fir_block_ctrl_imp->get_block_id());
// Set the RX Channel to the ARM
usrp->set_rx_channel(fir_block_ctrl_imp->get_block_id());
All the best,
David Greene
University of Florida
USRP-users mailing list
USRP-users@lists.ettus.com
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com
Hi Jonathan,
I've tried multiple sets, even tried including a delay in case it was taking some time to settle before streaming, no luck.
If I call 'set_taps' more than twice, the channel outputs zeros. After analyzing the frequency response of the data I'm getting back when it does work, it doesn't seem to be using the taps I specify at all...just the initial taps set in VHDL. I'm assuming the 'coefficient reload' isn't working, so I'm taking a stab at rebuilding the ip entirely and inserting it back into the design. I noticed the original seemed to have been designed for the xc7k410t, so it may be worth looking into it.
I'll post back on my progress, thanks.
All the best,
David Greene
University of Florida
From: Jonathon Pendlum jonathon.pendlum@ettus.com
Sent: Wednesday, December 16, 2015 3:21 PM
To: Greene,David J
Cc: usrp-users@lists.ettus.com
Subject: Re: [USRP-users] RFNOC: FIR 'set-taps' function causing output of all zero
Hi David,
I don't see any reason why what you are doing shouldn't work. If I were to guess, I would say that the FPGA is not accepting the taps properly. Can you try sending the same taps twice or three times in a row and see if that makes a difference? I'll also take a closer look with chipscope.
Jonathon
On Wed, Dec 16, 2015 at 10:19 AM, Greene,David J via USRP-users <usrp-users@lists.ettus.commailto:usrp-users@lists.ettus.com> wrote:
It would probably be more useful to the list-serve if I include the E310 bit file, sorry about that...
This contains the Radio_0, Radio_1, FIFO, and a 31-tap FIR filter block. It was built on 12/14/2015 using the latest source. Thanks again!
Dropbox link in case the list-serve blocks it:
https://www.dropbox.com/s/qa61rrojfyhynwx/usrp_e310_fpga_fir_31taps.bit?dl=0
All the best,
David Greene
University of Florida
Mobile: (954) 655-3421tel:%28954%29%20655-3421
From: USRP-users <usrp-users-bounces@lists.ettus.commailto:usrp-users-bounces@lists.ettus.com> on behalf of Greene,David J via USRP-users <usrp-users@lists.ettus.commailto:usrp-users@lists.ettus.com>
Sent: Monday, December 14, 2015 1:31 PM
To: usrp-users@lists.ettus.commailto:usrp-users@lists.ettus.com
Subject: [USRP-users] RFNOC: FIR 'set-taps' function causing output of all zero
Hi folks,
I'm using the rx_samples_to_file.cpp demo application with very minor modifications (listed below). I'm having an issue with the noc_block_fir_filter in RFNOC on an E310. Whenever I try to set the taps, using the set_taps method of the uhd::rfnoc::fir_block_ctrl class in my main function, I get an output of all zeros.
Here's the funny part, I can go through and manually edit fir_block_ctrl_impl.cpp to assign a fixed vector of taps instead of all zeros, re-compile, and it will assign them just fine when it instantiates the blocks. However, if I try calling this method from my main file, I get an output of all zeros. No warnings or errors are thrown, as far as I can tell. I've tried changing up the order of setting the channel, passing the streamargs, and assigning the taps; no luck.
Any insight would be appreciated, thanks!
Changes to rx_samples_to_file.cpp (aside from adding the required includes), blockid is always FIR,
// Clear the E310
usrp->get_device3()->clear();
// Clear all previous channels
usrp->clear_channels();
// Create a pointer to our FIR filter
uhd::rfnoc::fir_block_ctrl::sptr fir_block_ctrl_imp =
usrp->get_device3()->find_block_ctrl< uhd::rfnoc::fir_block_ctrl >(blockid);
// Read in our filter taps (single column of ints) from a file
std::vector<int> coeffsVector;
std::ifstream coeffsFile(coeffs);
if (coeffsFile) {
int value;
while (coeffsFile >> value) coeffsVector.push_back(value);
}
coeffsFile.close();
std::cout << "-- Read " << coeffsVector.size() << " filter taps.\n";
// Set the taps on our FIR Filter
fir_block_ctrl_imp->set_taps(coeffsVector);
// Pass through our stream arguments to the blocks
fir_block_ctrl_imp->set_args(streamargs);
usrp->get_device3()->get_block_ctrl(radio_ctrl_id)->set_args(streamargs);
// Connect our blocks together
std::cout << "Connecting Blocks..." << std::endl;
usrp->connect(radio_ctrl_id, fir_block_ctrl_imp->get_block_id());
// Set the RX Channel to the ARM
usrp->set_rx_channel(fir_block_ctrl_imp->get_block_id());
All the best,
David Greene
University of Florida
USRP-users mailing list
USRP-users@lists.ettus.commailto:USRP-users@lists.ettus.com
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com