<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://kb.ettus.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=MartinAnderseck</id>
		<title>Ettus Knowledge Base - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://kb.ettus.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=MartinAnderseck"/>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/Special:Contributions/MartinAnderseck"/>
		<updated>2026-07-10T23:18:58Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Getting_Started_with_DPDK_and_UHD&amp;diff=7027</id>
		<title>Getting Started with DPDK and UHD</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Getting_Started_with_DPDK_and_UHD&amp;diff=7027"/>
				<updated>2026-06-25T09:30:11Z</updated>
		
		<summary type="html">&lt;p&gt;MartinAnderseck: Added X420 to the list of DPDK supported USRPs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Application Note Number and Authors ==&lt;br /&gt;
&lt;br /&gt;
'''AN-500''' by Nate Temple, Alex Williams, Wade Fife, Matt Prost, and Michael Dickens&lt;br /&gt;
&amp;lt;!-- Internal use only: please do keep this updated!&lt;br /&gt;
==Revision History==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Author&lt;br /&gt;
!Details&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2020-01-08&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Nate Temple &amp;amp; Alex Williams&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Initial creation&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2021-02-25&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Wade Fife&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Added corrections specific to UHD 4.0 and Mellanox card use.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2022-02-08&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Matt Prost (via Michael Dickens)&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Tweak Tuning Notes and add Known Issues&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2023-11-20&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Michael Dickens&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Lots of Updates&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
&lt;br /&gt;
This application note walks through the process to get started with the Data Plane Development Kit (DPDK) driver within UHD. &lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
&lt;br /&gt;
Up until now, UHD's only support for networked devices was backed by the kernel's sockets implementation. Every call to &amp;lt;code&amp;gt;send()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;recv()&amp;lt;/code&amp;gt; would cause a context switch and invite the kernel's scheduler to replace our thread with something else. Because the typical scheduler is optimized to distribute CPU time fairly across multiple loads, the timing-critical threads might sporadically be hit with sleeping time, and the thread might be migrated off its current CPU and forced to run on another. The overhead and random latency spikes make it difficult to enable reliable real-time streaming at higher rates.&lt;br /&gt;
&lt;br /&gt;
DPDK is a high-speed packet processing framework that enables a kernel bypass for network drivers. By putting the entire driver in user space, avoiding context switches, and pinning I/O threads to cores, UHD and DPDK combine to largely prevent the latency spikes induced by the scheduler. In addition, the overall overhead for packet processing lowers. &lt;br /&gt;
&lt;br /&gt;
== Supported Devices ==&lt;br /&gt;
&lt;br /&gt;
=== USRPs ===&lt;br /&gt;
&lt;br /&gt;
DPDK is supported on the following USRP devices:&lt;br /&gt;
&lt;br /&gt;
* E320&lt;br /&gt;
* N300 / N310&lt;br /&gt;
* N320 / N321&lt;br /&gt;
* X300 / X310&lt;br /&gt;
* X410&lt;br /&gt;
* X420&lt;br /&gt;
* X440&lt;br /&gt;
&lt;br /&gt;
=== Host Network Cards ===&lt;br /&gt;
&lt;br /&gt;
DPDK is supported on many Intel and Mellanox based 10Gb and 100Gb NICs and lots of other NICs. Below is a list of NICs Ettus Research has tested. For a full list of NICs supported by DPDK, please see the DPDK manual.&lt;br /&gt;
&lt;br /&gt;
* Intel X520-DA1 (1x10Gb)&lt;br /&gt;
* Intel X520-DA2 (2x10Gb)&lt;br /&gt;
* Intel X710-DA2 (2x10Gb)&lt;br /&gt;
* Intel X710-DA4 (4x10Gb)&lt;br /&gt;
* Intel XL710-QDA2 (2x40Gb breakout to 4x10Gb)&lt;br /&gt;
* Intel E810-CQDA1 (1x100Gb and 1x4x10Gb)&lt;br /&gt;
* Intel E810-CQDA2 (1x100Gb and 2x4x10Gb; [https://edc.intel.com/content/www/us/en/design/products/ethernet/perf-tuning-guide-800-series-linux/%E2%80%8Bcheck-system-hardware-capabilities/ note that this NIC does not support 2x100Gb])&lt;br /&gt;
* Intel E810-2CQDA2 (1x100Gb and 2x4x10Gb; 2x100Gb with some work)&lt;br /&gt;
* Mellanox MCX4121A-ACAT ConnectX-4 Lx (2x10Gb)&lt;br /&gt;
* Mellanox MCX515A-CCAT ConnectX-5 EN (2x100Gb or 2x10Gb)&lt;br /&gt;
* Mellanox MCX516A-CCAT ConnectX-5 EN (2x100Gb or 2x10Gb)&lt;br /&gt;
* Mellanox MCX516A-CDAT ConnectX-5 Ex EN (2x100Gb or 2x10Gb)&lt;br /&gt;
* Mellanox MCX623106AN-CDAT ConnectX-6 Dx EN (2x100Gb or 2x10Gb)&lt;br /&gt;
* [https://www.ni.com/en-us/support/model.100-gb-ethernet-connectivity-kit.html NI Dual 100 Gigabit Ethernet PCIe Interface Kit (PN 788216-01)]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
* DPDK: https://www.dpdk.org/&lt;br /&gt;
** https://doc.dpdk.org/guides-17.11&lt;br /&gt;
** https://doc.dpdk.org/guides-18.11&lt;br /&gt;
** https://doc.dpdk.org/guides-19.11&lt;br /&gt;
** https://doc.dpdk.org/guides-20.11&lt;br /&gt;
** https://doc.dpdk.org/guides-21.11&lt;br /&gt;
** https://doc.dpdk.org/guides-22.11&lt;br /&gt;
** https://doc.dpdk.org/guides-23.11&lt;br /&gt;
** https://doc.dpdk.org/guides-24.11&lt;br /&gt;
* UHD Manual: https://files.ettus.com/manual/page_dpdk.html&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
&lt;br /&gt;
* UHD 3.x requires DPDK 17.11&lt;br /&gt;
&lt;br /&gt;
* UHD 4.0 and 4.1 require DPDK 18.11&lt;br /&gt;
&lt;br /&gt;
* UHD 4.2 to 4.7 can use any version of DPDK from 18.11 to 21.11&lt;br /&gt;
&lt;br /&gt;
* UHD 4.8 to 4.9 can use any version of DPDK from 18.11 to 24.11&lt;br /&gt;
&lt;br /&gt;
== Installing DPDK == &lt;br /&gt;
&lt;br /&gt;
We recommend installing DPDK via the system-provided installer; for example with Ubuntu:&lt;br /&gt;
&lt;br /&gt;
    sudo apt install dpdk dpdk-dev&lt;br /&gt;
&lt;br /&gt;
While it is possible to install DPDK from source, we recommend using the system-provided install unless there is a very good reason to not do so. DPDK can be challenging to ''correctly'' build from source though more recent versions use meson and ninja along with default settings needed by UHD and hence are relatively simple to build and install. If you require installing DPDK from source, the install guide for various versions is noted below:&lt;br /&gt;
&lt;br /&gt;
* [https://doc.dpdk.org/guides-17.11/linux_gsg/build_dpdk.html DPDK 17.11]&lt;br /&gt;
* [https://doc.dpdk.org/guides-18.11/linux_gsg/build_dpdk.html DPDK 18.11]&lt;br /&gt;
* [https://doc.dpdk.org/guides-19.11/linux_gsg/build_dpdk.html DPDK 19.11]&lt;br /&gt;
* [https://doc.dpdk.org/guides-20.11/linux_gsg/build_dpdk.html DPDK 20.11]&lt;br /&gt;
* [https://doc.dpdk.org/guides-21.11/linux_gsg/build_dpdk.html DPDK 21.11]&lt;br /&gt;
* [https://doc.dpdk.org/guides-22.11/linux_gsg/build_dpdk.html DPDK 22.11]&lt;br /&gt;
* [https://doc.dpdk.org/guides-23.11/linux_gsg/build_dpdk.html DPDK 23.11]&lt;br /&gt;
* [https://doc.dpdk.org/guides-24.11/linux_gsg/build_dpdk.html DPDK 24.11]&lt;br /&gt;
&lt;br /&gt;
DPDK releases come three times per year in April (version X.04), July (version X.07), and November (version X.11). The X.11 version is more of a formal release. While any ''can'' be used with UHD, we recommend using just the formal releases.&lt;br /&gt;
&lt;br /&gt;
NOTE: It is sometimes necessary to use NIC device drivers because of improved feature sets or just getting a NIC to work; the system provided NIC drivers are too old. In this case: (1) remove the system provided DPDK and DPDK-DEV and whatever UHD install is in use; you will need to build these from source. (2) Download and install the new NIC drivers, NVM, and anything else that the NIC needs to be updated to the version needed. (3) Download and install DPDK from source. (4) Downlaod and install UHD from source.&lt;br /&gt;
&lt;br /&gt;
== Installing UHD ==&lt;br /&gt;
&lt;br /&gt;
Once the &amp;lt;code&amp;gt;dpdk&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;dpdk-dev&amp;lt;/code&amp;gt; packages are installed, UHD will locate them during a build and you should see DPDK in the enabled components lists when running &amp;lt;code&amp;gt;cmake&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
NOTE that in general UHD installed from PPA or system packages ''does not'' include support for DPDK, and even if DPDK is installed alongside these UHD it will not be used. In order to get UHD with DPDK support, [https://kb.ettus.com/Building_and_Installing_the_USRP_Open-Source_Toolchain_(UHD_and_GNU_Radio)_on_Linux UHD generally has to be built from source].&lt;br /&gt;
&lt;br /&gt;
== Enable hugepages ==&lt;br /&gt;
&lt;br /&gt;
Edit your grub configuration file, &amp;lt;code&amp;gt;/etc/default/grub&amp;lt;/code&amp;gt; and add the follow parameters to &amp;lt;code&amp;gt;GRUB_CMDLINE_LINUX_DEFAULT&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    iommu=pt intel_iommu=on hugepages=2048&lt;br /&gt;
&lt;br /&gt;
On a vanilla Ubuntu system it should look like this:&lt;br /&gt;
&lt;br /&gt;
    GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;quiet splash iommu=pt intel_iommu=on hugepages=2048&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Close &amp;lt;code&amp;gt;/etc/default/grub&amp;lt;/code&amp;gt; and at the command prompt, update your grub configuration with the command:&lt;br /&gt;
&lt;br /&gt;
    sudo update-grub&lt;br /&gt;
&lt;br /&gt;
For these settings to take effect, reboot your host machine.&lt;br /&gt;
&lt;br /&gt;
== Preparing your UHD Configuration File ==&lt;br /&gt;
&lt;br /&gt;
You must note the MAC addresses for your NICs before proceeding.&lt;br /&gt;
&lt;br /&gt;
The MAC addresses for your NICs can be found by running the command:&lt;br /&gt;
&lt;br /&gt;
    ip a&lt;br /&gt;
&lt;br /&gt;
You must then create a UHD configuration file.&lt;br /&gt;
&lt;br /&gt;
For UHD 3 the location is &amp;lt;code&amp;gt;/root/.uhd/uhd.conf&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    sudo su&lt;br /&gt;
    mkdir -p /root/.uhd&lt;br /&gt;
    nano /root/.uhd/uhd.conf&lt;br /&gt;
&lt;br /&gt;
For UHD 4 the location is &amp;lt;code&amp;gt;/root/.config/uhd.conf&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    sudo su&lt;br /&gt;
    mkdir -p /root/.config&lt;br /&gt;
    nano /root/.config/uhd.conf&lt;br /&gt;
&lt;br /&gt;
=== UHD 3.x ===&lt;br /&gt;
&lt;br /&gt;
An example &amp;lt;code&amp;gt;uhd.conf&amp;lt;/code&amp;gt; file is listed below. Note that field names in UHD 3.x are slightly different from UHD 4.0.&lt;br /&gt;
&lt;br /&gt;
You should update the following fields for your configuration from this example:&lt;br /&gt;
&lt;br /&gt;
* Update the MAC address variables, &amp;lt;code&amp;gt;dpdk-mac&amp;lt;/code&amp;gt;, to match your NIC&lt;br /&gt;
&lt;br /&gt;
* Update the &amp;lt;code&amp;gt;dpdk-driver&amp;lt;/code&amp;gt; if the location is different on your system. &amp;lt;code&amp;gt;/usr/lib/x86_64-linux-gnu/dpdk-17.11-drivers/&amp;lt;/code&amp;gt; is the default location on Ubuntu 18.04.x when &amp;lt;code&amp;gt;dpdk&amp;lt;/code&amp;gt; is installed via &amp;lt;code&amp;gt;apt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Update the &amp;lt;code&amp;gt;dpdk-corelist&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;dpdk-io-cpu&amp;lt;/code&amp;gt; fields. In this example, a two port NIC is used. There should be one core for the main &amp;lt;code&amp;gt;dpdk&amp;lt;/code&amp;gt; thread (in this example &amp;lt;code&amp;gt;core #2&amp;lt;/code&amp;gt;), and then separate cores assigned to each NIC (in this example &amp;lt;code&amp;gt;core #3&amp;lt;/code&amp;gt; for the first port on the NIC, &amp;lt;code&amp;gt;core #4&amp;lt;/code&amp;gt; for the second port on the NIC)&lt;br /&gt;
&lt;br /&gt;
* Update the &amp;lt;code&amp;gt;dpdk-ipv4&amp;lt;/code&amp;gt; fields to your desired IP range.&lt;br /&gt;
** &amp;lt;code&amp;gt;192.168.30.2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;192.168.40.2&amp;lt;/code&amp;gt; on a default X3xx system&lt;br /&gt;
** &amp;lt;code&amp;gt;192.168.10.2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;192.168.20.2&amp;lt;/code&amp;gt; on a default N3xx system&lt;br /&gt;
** &amp;lt;code&amp;gt;192.168.10.2&amp;lt;/code&amp;gt; on a default E320 system&lt;br /&gt;
&lt;br /&gt;
    [use_dpdk=1]&lt;br /&gt;
    dpdk-mtu=9000&lt;br /&gt;
    dpdk-driver=/usr/lib/x86_64-linux-gnu/dpdk-17.11-drivers/&lt;br /&gt;
    dpdk-corelist=2,3,4&lt;br /&gt;
    dpdk-num-mbufs=4095&lt;br /&gt;
    dpdk-mbufs-cache-size=315&lt;br /&gt;
    &lt;br /&gt;
    [dpdk-mac=aa:bb:cc:dd:ee:f1]&lt;br /&gt;
    dpdk-io-cpu = 3&lt;br /&gt;
    dpdk-ipv4 = 192.168.10.1/24&lt;br /&gt;
    &lt;br /&gt;
    [dpdk-mac=aa:bb:cc:dd:ee:f2]&lt;br /&gt;
    dpdk-io-cpu = 4&lt;br /&gt;
    dpdk-ipv4 = 192.168.20.1/24&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Additional information on the UHD configuration file can be found here: https://files.ettus.com/manual_archive/v3.15.0.0/html/page_dpdk.html#dpdk_nic_config&lt;br /&gt;
&lt;br /&gt;
=== UHD 4.x ===&lt;br /&gt;
&lt;br /&gt;
An example &amp;lt;code&amp;gt;uhd.conf&amp;lt;/code&amp;gt; file is listed below. Note that the field names in UHD 4.x are slightly different from UHD 3.x.&lt;br /&gt;
&lt;br /&gt;
You must verify and/or update the following fields for your configuration from this example:&lt;br /&gt;
&lt;br /&gt;
* The MAC address variables, &amp;lt;code&amp;gt;dpdk_mac&amp;lt;/code&amp;gt;, to match your NIC(s) link(s); note that the MAC address info ''must be lowercase''&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;dpdk_driver&amp;lt;/code&amp;gt; if the location is different on your system. &amp;lt;code&amp;gt;/usr/local/lib/&amp;lt;/code&amp;gt; is the default location on when DPDK is built and installed from source.&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;dpdk_corelist&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;dpdk_lcore&amp;lt;/code&amp;gt; fields. In this example, a two port NIC and both links are used. There must be one core for the main &amp;lt;code&amp;gt;dpdk&amp;lt;/code&amp;gt; thread (in this example &amp;lt;code&amp;gt;core #2&amp;lt;/code&amp;gt; because it is not otherwise used in the file) and then separate cores assigned to each NIC link (in this example &amp;lt;code&amp;gt;core #3&amp;lt;/code&amp;gt; for the one of the NIC links and &amp;lt;code&amp;gt;core #4&amp;lt;/code&amp;gt; for the other NIC link).&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;dpdk_ipv4&amp;lt;/code&amp;gt; fields to your desired IP range(s).&lt;br /&gt;
** &amp;lt;code&amp;gt;192.168.30.2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;192.168.40.2&amp;lt;/code&amp;gt; on a default X3xx system&lt;br /&gt;
** &amp;lt;code&amp;gt;192.168.10.2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;192.168.20.2&amp;lt;/code&amp;gt; on a default N3xx system&lt;br /&gt;
** &amp;lt;code&amp;gt;192.168.10.2&amp;lt;/code&amp;gt; on a default E320 system&lt;br /&gt;
** &amp;lt;code&amp;gt;192.168.10.2&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;192.168.20.2&amp;lt;/code&amp;gt; on a default X4xx systems&lt;br /&gt;
&lt;br /&gt;
    [use_dpdk=1]&lt;br /&gt;
    dpdk_mtu=9000&lt;br /&gt;
    dpdk_driver=/usr/lib/x86_64-linux-gnu/dpdk/pmds-20.0/&lt;br /&gt;
    dpdk_corelist=2,3,4&lt;br /&gt;
    dpdk_num_mbufs=4096&lt;br /&gt;
    dpdk_num_desc=4096&lt;br /&gt;
    dpdk_mbuf_cache_size=315&lt;br /&gt;
    &lt;br /&gt;
    [dpdk_mac=aa:bb:cc:dd:ee:f1]&lt;br /&gt;
    dpdk_lcore=3&lt;br /&gt;
    dpdk_ipv4=192.168.10.1/24&lt;br /&gt;
    &lt;br /&gt;
    [dpdk_mac=aa:bb:cc:dd:ee:f2]&lt;br /&gt;
    dpdk_lcore=4&lt;br /&gt;
    dpdk_ipv4=192.168.20.1/24&lt;br /&gt;
&lt;br /&gt;
'''Notes:'''&lt;br /&gt;
* Additional information on the [https://files.ettus.com/manual/page_dpdk.html#dpdk_nic_config UHD DPDK configuration file is in the UHD manual].&lt;br /&gt;
* The number of cores listed must be used exactly within the file.&lt;br /&gt;
* The number of NIC link(s) listed must exactly match those specified in the UHD instantiation args.&lt;br /&gt;
* A simple way to move between different DPDK configurations is to create different files and then symlink from the desired file to &amp;lt;code&amp;gt;uhd.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Additional Host Configuration for NIC Vendors ==&lt;br /&gt;
&lt;br /&gt;
The process for this step is different for Intel and Mellanox NICs and is detailed in individual sections below.&lt;br /&gt;
&lt;br /&gt;
=== Intel X520 / X710 ===&lt;br /&gt;
&lt;br /&gt;
The Intel based NICs will use the &amp;lt;code&amp;gt;vfio-pci&amp;lt;/code&amp;gt; driver which must be loaded:&lt;br /&gt;
&lt;br /&gt;
    sudo modprobe vfio-pci&lt;br /&gt;
&lt;br /&gt;
Next, you will need to rebind the NIC to the &amp;lt;code&amp;gt;vfio-pci&amp;lt;/code&amp;gt; drivers. &lt;br /&gt;
&lt;br /&gt;
First, identify the PCI address your NIC is at via the following command, noting that for older DPDK the command does not contain the trailing &amp;lt;code&amp;gt;.py&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    dpdk-devbind.py -s&lt;br /&gt;
&lt;br /&gt;
Note the PCI address that your NIC is connected to for the next step.&lt;br /&gt;
&lt;br /&gt;
Before the next step, you will need to turn off the NIC first before doing the rebind. &lt;br /&gt;
&lt;br /&gt;
In Ubuntu under &amp;lt;code&amp;gt;System&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Network&amp;lt;/code&amp;gt; -&amp;gt; click the switches to &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; for the 10Gb ports, then run the &amp;lt;code&amp;gt;dpdk-devbind&amp;lt;/code&amp;gt; commands:&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Your PCI address will likely be different than &amp;lt;code&amp;gt;02:00.0&amp;lt;/code&amp;gt; as shown in the example below.&lt;br /&gt;
&lt;br /&gt;
    sudo dpdk-devbind.py --bind=vfio-pci 02:00.0&lt;br /&gt;
    sudo dpdk-devbind.py --bind=vfio-pci 02:00.1&lt;br /&gt;
&lt;br /&gt;
You should now see the NICs listed under DPDK devices&lt;br /&gt;
&lt;br /&gt;
    # dpdk-devbind.py -s&lt;br /&gt;
    &lt;br /&gt;
    Network devices using DPDK-compatible driver&lt;br /&gt;
    ============================================&lt;br /&gt;
    0000:02:00.0 '82599ES 10-Gigabit SFI/SFP+ Network Connection 10fb' drv=vfio-pci unused=ixgbe&lt;br /&gt;
    0000:02:00.1 '82599ES 10-Gigabit SFI/SFP+ Network Connection 10fb' drv=vfio-pci unused=ixgbe&lt;br /&gt;
&lt;br /&gt;
'''Note:''' More info can be found here on the rebinding process:  https://doc.dpdk.org/guides-24.11/linux_gsg/linux_drivers.html#binding-and-unbinding-network-ports-to-from-the-kernel-modules&lt;br /&gt;
&lt;br /&gt;
=== Mellanox NICs ===&lt;br /&gt;
&lt;br /&gt;
The NVIDIA Mellanox (&amp;quot;Mellanox&amp;quot;) NICs do ''not'' require rebinding using the &amp;lt;code&amp;gt;vfio-pci&amp;lt;/code&amp;gt; driver. Mellanox provides system IC drivers and additional drivers for DPDK to handle the binding to and from VFIO-PCI. In general the Mellanox system-provided NIC and DPDK drivers should work and you should not need to install Mellanox drivers.&lt;br /&gt;
&lt;br /&gt;
If for some reason your host OS does not provide Mellanox DPDK drivers, then these can be installed manually. For example:&lt;br /&gt;
&lt;br /&gt;
    sudo apt install librte-pmd-mlx5&lt;br /&gt;
    sudo modprobe -a ib_uverbs mlx5_core mlx5_ib&lt;br /&gt;
&lt;br /&gt;
If for some reason you are running into issues using a Mellanox NIC, then you can [https://network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/ download and install the latest Mellanox drivers from the Mellanox website] (https://network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/).&lt;br /&gt;
&lt;br /&gt;
The MLX5 poll mode driver library (librte_pmd_mlx5) in DPDK provides support for Mellanox ConnextX-4 through -7 NICs. For DPDK 20 and older only this driver must be enabled manually with the build option &amp;lt;code&amp;gt;CONFIG_RTE_LIBRTE_MLX5_PMD=y&amp;lt;/code&amp;gt; when building DPDK. We recommend DPDK 21 and newer when possible; these versions are easy to build from source using &amp;lt;code&amp;gt;meson&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ninja&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Running UHD Applications with DPDK ==&lt;br /&gt;
&lt;br /&gt;
UHD based application (including GNU Radio flowgraphs) can now be ran using a DPDK transport by passing in the Device Argument: &amp;lt;code&amp;gt;use_dpdk=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Important Note:''' In order for UHD to use DPDK, the UHD application ''must'' be ran as the &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; user; this can be done either by prepending &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; to the command or becoming the roort user via &amp;lt;code&amp;gt;sudo su&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For example, running the &amp;lt;code&amp;gt;benchmark_rate&amp;lt;/code&amp;gt; utility after issuing &amp;lt;code&amp;gt;sudo su&amp;lt;/code&amp;gt; (one can also run this command simply as &amp;lt;code&amp;gt;sudo /usr/local/lib/uhd/examples/benchmark_rate ....&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cd /usr/local/lib/uhd/examples&lt;br /&gt;
&lt;br /&gt;
# ./benchmark_rate --rx_rate 125e6 --rx_subdev &amp;quot;A:0 B:0&amp;quot; --rx_channels 0,1 --tx_rate 125e6 --tx_subdev &amp;quot;A:0 B:0&amp;quot; --tx_channels 0,1 --args &amp;quot;addr=192.168.10.2,second_addr=192.168.20.2,mgmt_addr=10.2.1.19,master_clock_rate=125e6,use_dpdk=1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[INFO] [UHD] linux; GNU C++ version 7.3.0; Boost_106501; UHD_3.14.0.HEAD-0-gabf0db4e&lt;br /&gt;
EAL: Detected 8 lcore(s)&lt;br /&gt;
EAL: Some devices want iova as va but pa will be used because.. EAL: IOMMU does not support IOVA as VA&lt;br /&gt;
EAL: No free hugepages reported in hugepages-1048576kB&lt;br /&gt;
EAL: Probing VFIO support...&lt;br /&gt;
EAL: VFIO support initialized&lt;br /&gt;
EAL: PCI device 0000:02:00.0 on NUMA socket -1&lt;br /&gt;
EAL:   Invalid NUMA socket, default to 0&lt;br /&gt;
EAL:   probe driver: 8086:10fb net_ixgbe&lt;br /&gt;
EAL:   using IOMMU type 1 (Type 1)&lt;br /&gt;
EAL: Ignore mapping IO port bar(2)&lt;br /&gt;
EAL: PCI device 0000:02:00.1 on NUMA socket -1&lt;br /&gt;
EAL:   Invalid NUMA socket, default to 0&lt;br /&gt;
EAL:   probe driver: 8086:10fb net_ixgbe&lt;br /&gt;
EAL: Ignore mapping IO port bar(2)&lt;br /&gt;
PMD: ixgbe_dev_link_status_print():  Port 0: Link Down&lt;br /&gt;
EAL: Port 0 MAC: aa bb cc dd ee f1&lt;br /&gt;
EAL: Port 0 UP: 1&lt;br /&gt;
PMD: ixgbe_dev_link_status_print():  Port 1: Link Down&lt;br /&gt;
EAL: Port 1 MAC: aa bb cc dd ee f2&lt;br /&gt;
EAL: Port 1 UP: 1&lt;br /&gt;
EAL: Init DONE!&lt;br /&gt;
EAL: Starting I/O threads!&lt;br /&gt;
USER2: Thread 1 started&lt;br /&gt;
[00:00:00.000003] Creating the usrp device with: addr=192.168.10.2,second_addr=192.168.20.2,mgmt_addr=10.2.1.19,master_clock_rate=125e6,use_dpdk=1...&lt;br /&gt;
[INFO] [MPMD] Initializing 1 device(s) in parallel with args: mgmt_addr=10.2.1.19,type=n3xx,product=n310,serial=313ABDA,claimed=False,addr=192.168.10.2,second_addr=192.168.20.2,master_clock_rate=125e6,use_dpdk=1&lt;br /&gt;
[INFO] [MPM.PeriphManager] init() called with device args 'product=n310,time_source=internal,master_clock_rate=125e6,clock_source=internal,use_dpdk=1,second_addr=192.168.20.2,mgmt_addr=10.2.1.19'.&lt;br /&gt;
[INFO] [0/DmaFIFO_0] Initializing block control (NOC ID: 0xF1F0D00000000004)&lt;br /&gt;
[INFO] [0/DmaFIFO_0] BIST passed (Throughput: 1344 MB/s)&lt;br /&gt;
[INFO] [0/DmaFIFO_0] BIST passed (Throughput: 1341 MB/s)&lt;br /&gt;
[INFO] [0/DmaFIFO_0] BIST passed (Throughput: 1348 MB/s)&lt;br /&gt;
[INFO] [0/DmaFIFO_0] BIST passed (Throughput: 1347 MB/s)&lt;br /&gt;
[INFO] [0/Radio_0] Initializing block control (NOC ID: 0x12AD100000011312)&lt;br /&gt;
[INFO] [0/Radio_1] Initializing block control (NOC ID: 0x12AD100000011312)&lt;br /&gt;
[INFO] [0/DDC_0] Initializing block control (NOC ID: 0xDDC0000000000000)&lt;br /&gt;
[INFO] [0/DDC_1] Initializing block control (NOC ID: 0xDDC0000000000000)&lt;br /&gt;
[INFO] [0/DUC_0] Initializing block control (NOC ID: 0xD0C0000000000002)&lt;br /&gt;
[INFO] [0/DUC_1] Initializing block control (NOC ID: 0xD0C0000000000002)&lt;br /&gt;
Using Device: Single USRP:&lt;br /&gt;
  Device: N300-Series Device&lt;br /&gt;
  Mboard 0: ni-n3xx-313ABDA&lt;br /&gt;
  RX Channel: 0&lt;br /&gt;
    RX DSP: 0&lt;br /&gt;
    RX Dboard: A&lt;br /&gt;
    RX Subdev: Magnesium&lt;br /&gt;
  RX Channel: 1&lt;br /&gt;
    RX DSP: 0&lt;br /&gt;
    RX Dboard: B&lt;br /&gt;
    RX Subdev: Magnesium&lt;br /&gt;
  TX Channel: 0&lt;br /&gt;
    TX DSP: 0&lt;br /&gt;
    TX Dboard: A&lt;br /&gt;
    TX Subdev: Magnesium&lt;br /&gt;
  TX Channel: 1&lt;br /&gt;
    TX DSP: 0&lt;br /&gt;
    TX Dboard: B&lt;br /&gt;
    TX Subdev: Magnesium&lt;br /&gt;
&lt;br /&gt;
[00:00:03.728707] Setting device timestamp to 0...&lt;br /&gt;
[INFO] [MULTI_USRP]     1) catch time transition at pps edge&lt;br /&gt;
[INFO] [MULTI_USRP]     2) set times next pps (synchronously)&lt;br /&gt;
[00:00:05.331920] Testing receive rate 125.000000 Msps on 2 channels&lt;br /&gt;
[00:00:05.610789] Testing transmit rate 125.000000 Msps on 2 channels&lt;br /&gt;
[00:00:15.878071] Benchmark complete.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Benchmark rate summary:&lt;br /&gt;
  Num received samples:     2557247854&lt;br /&gt;
  Num dropped samples:      0&lt;br /&gt;
  Num overruns detected:    0&lt;br /&gt;
  Num transmitted samples:  2504266704&lt;br /&gt;
  Num sequence errors (Tx): 0&lt;br /&gt;
  Num sequence errors (Rx): 0&lt;br /&gt;
  Num underruns detected:   0&lt;br /&gt;
  Num late commands:        0&lt;br /&gt;
  Num timeouts (Tx):        0&lt;br /&gt;
  Num timeouts (Rx):        0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tuning Notes ==&lt;br /&gt;
&lt;br /&gt;
=== General Host Performance Tuning App Note ===&lt;br /&gt;
&lt;br /&gt;
Perform the [https://kb.ettus.com/USRP_Host_Performance_Tuning_Tips_and_Tricks general host performance tuning tips and tricks].&lt;br /&gt;
&lt;br /&gt;
=== Increasing &amp;lt;code&amp;gt;num_recv_frames&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
If you experience &amp;lt;code&amp;gt;Overflows&amp;lt;/code&amp;gt; at higher data rates, adding the device argument &amp;lt;code&amp;gt;num_recv_frames=512&amp;lt;/code&amp;gt; can help.&lt;br /&gt;
&lt;br /&gt;
=== Full Rate Streaming (UHD 3.x only) ===&lt;br /&gt;
&lt;br /&gt;
If you're streaming data at the full master clock rate, and there is no interpolation or decimation being performed on the FPGA, you can skip the DUC and DDC blocks within the FPGA with the following parameters:&lt;br /&gt;
&lt;br /&gt;
    skip_ddc=1&lt;br /&gt;
    skip_duc=1&lt;br /&gt;
&lt;br /&gt;
=== Full Rate on X3xx ===&lt;br /&gt;
&lt;br /&gt;
If you're streaming two transmit channels at full rate (200e6) on the X3xx platform, you should additionally set the following device arg:&lt;br /&gt;
&lt;br /&gt;
    enable_tx_dual_eth=1&lt;br /&gt;
&lt;br /&gt;
=== Isolate Cores/CPUs ===&lt;br /&gt;
&lt;br /&gt;
Isolating the cores that are used for DPDK can improve performance. This can be done by adding the &amp;lt;code&amp;gt;isolcpus&amp;lt;/code&amp;gt; parameter to your &amp;lt;code&amp;gt;/etc/default/grub&amp;lt;/code&amp;gt; file in the &amp;lt;code&amp;gt;GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; (the &amp;quot;&amp;lt;code&amp;gt;GRUB_CONFIG&amp;lt;/code&amp;gt;&amp;quot;). For example, to isolate cores 2 through and including 4, add this entry:&lt;br /&gt;
&lt;br /&gt;
    isolcpus=2-4&lt;br /&gt;
&lt;br /&gt;
NOTE: After saving the &amp;lt;code&amp;gt;GRUB_CONFIG&amp;lt;/code&amp;gt; file, execute &amp;lt;code&amp;gt;sudo update-grub&amp;lt;/code&amp;gt; and then reboot the computer for the changes to take effect. It is OK to isolate core used by DPDK via this method.&lt;br /&gt;
&lt;br /&gt;
=== Disable System Interrupts on Cores/CPUs ===&lt;br /&gt;
&lt;br /&gt;
Disabling system interrupts can improve the jitter and performance generally by 1-3%. This can be done by adding the parameters &amp;lt;code&amp;gt;nohz_full&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;rcu_nocbs&amp;lt;/code&amp;gt; to your &amp;lt;code&amp;gt;GRUB_CONFIG&amp;lt;/code&amp;gt;. For example, to disable system interrupts on cores 2 through and including 4, add this entry:&lt;br /&gt;
&lt;br /&gt;
    nohz_full=2-4 rcu_nocbs=2-4&lt;br /&gt;
&lt;br /&gt;
NOTE: After saving the &amp;lt;code&amp;gt;GRUB_CONFIG&amp;lt;/code&amp;gt; file, execute &amp;lt;code&amp;gt;sudo update-grub&amp;lt;/code&amp;gt; and then reboot the computer for the changes to take effect. It is OK to isolate core used by DPDK via this method.&lt;br /&gt;
&lt;br /&gt;
=== Streaming on Multiple Channels using 1 Thread Per Stream ===&lt;br /&gt;
&lt;br /&gt;
If you're streaming on multiple channels simultaneously, you can create multiple streamer objects on separate threads. This can be accomplished with the &amp;lt;code&amp;gt;benchmark_rate&amp;lt;/code&amp;gt; example by using the parameter &amp;lt;code&amp;gt;--multi_streamer&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Elevated Streaming Thread Priority ===&lt;br /&gt;
&lt;br /&gt;
In UHD 4, streaming thread priorities can be elevated with the &amp;lt;code&amp;gt;uhd::set_thread_priority_safe()&amp;lt;/code&amp;gt; function call. This can be accomplished with the &amp;lt;code&amp;gt;benchmark_rate&amp;lt;/code&amp;gt; example by using parameter &amp;lt;code&amp;gt;--priority high&amp;lt;/code&amp;gt;. Note that if the [https://kb.ettus.com/USRP_Host_Performance_Tuning_Tips_and_Tricks#Thread_Priority_Scheduling Thread Schedule Priority] has not been enabled for the current user then this parameter requires &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; to work.&lt;br /&gt;
&lt;br /&gt;
=== Extra &amp;lt;code&amp;gt;nice&amp;lt;/code&amp;gt; Priority ===&lt;br /&gt;
&lt;br /&gt;
Beyond elevating streaming thread priority, one can also increase the [https://www.man7.org/linux/man-pages/man1/nice.1.html &amp;lt;code&amp;gt;nice&amp;lt;/code&amp;gt; priority level] to maximum to increase the amount of CPU time for the process and its thread by prepending the following to the command being issued:&lt;br /&gt;
&lt;br /&gt;
    sudo nice -n -20&lt;br /&gt;
&lt;br /&gt;
=== Limit Execution CPUs/Cores ===&lt;br /&gt;
&lt;br /&gt;
With Linux one can limit the cores being used by the threads in a process via a [https://man7.org/linux/man-pages/man1/taskset.1.html &amp;lt;code&amp;gt;taskset&amp;lt;/code&amp;gt;] prepended to a command being executed. When combining with the other techniques listed here, one can fairly well constrain a process and its thread to specific cores and give them maximum CPU time. Note that when using DPDK the MAC cores specified in &amp;lt;code&amp;gt;uhd.conf&amp;lt;/code&amp;gt; will already be included as part of the &amp;lt;code&amp;gt;taskset&amp;lt;/code&amp;gt; (but those cores will not be isolated nor have system interrupts disabled on them unless using that setting as noted above); it generally won't hurt to include the DPDK cores as part of the overall &amp;lt;code&amp;gt;taskset&amp;lt;/code&amp;gt; but it's not required. For example, to limit process/thread execution to cores 2 through and including 4, one would prepend the following (note that &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; is ''not'' required):&lt;br /&gt;
&lt;br /&gt;
    taskset -c &amp;quot;2-4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NOTE: For best performance do ''not'' include the cores used by DPDK in the &amp;lt;code&amp;gt;dpdk_corelist&amp;lt;/code&amp;gt; argument in the &amp;lt;code&amp;gt;taskset&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Stopping Extraneous Processes ===&lt;br /&gt;
&lt;br /&gt;
The Linux kernel spawns a number of processes and threads that spend most of their time sleeping; one cannot stop these processes/threads. That said, in a typical Linux install (for example Ubuntu) there will be a graphical desktop (e.g., &amp;lt;code&amp;gt;gdm&amp;lt;/code&amp;gt;) and various daemons started up by user request (e.g., &amp;lt;code&amp;gt;containerd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;docker&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;snapd&amp;lt;/code&amp;gt;). Most of these daemons can be controlled by &amp;lt;code&amp;gt;systemctl&amp;lt;/code&amp;gt;; some must be manually quit. Any process that runs regularly stands a chance of interrupting the UHD and DPDK threads, and thus stopping, quitting, or disabling those processes can increase performance. For example, the following commands stop various daemons that execute regularly on Ubuntu; these need to be executed with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; and some might not exist on your specific system and for these the command will do nothing so it's OK to run it:&lt;br /&gt;
&lt;br /&gt;
    systemctl stop containerd containerd.socket&lt;br /&gt;
    systemctl stop docker docker.socket&lt;br /&gt;
    systemctl stop dbus dbus.socket&lt;br /&gt;
    systemctl stop snapd snapd.socket&lt;br /&gt;
    systemctl stop udev systemd-udevd-control.socket systemd-udevd-kernel.socket&lt;br /&gt;
&lt;br /&gt;
The following command stops the main Ubuntu desktop GUI, so running it will render the system accessible only via networking (e.g., &amp;lt;code&amp;gt;ssh&amp;lt;/code&amp;gt;), so make sure network access is enabled before executing this command:&lt;br /&gt;
&lt;br /&gt;
    systemctl stop gdm&lt;br /&gt;
&lt;br /&gt;
=== Disable Hyper-threading ===&lt;br /&gt;
&lt;br /&gt;
In some applications which require the highest possible CPU performance per core, disabling hyper-threading can provide roughly a 10% increase in core performance, at the cost of having fewer core threads. Hyper-threading is disabled within the BIOS and how to do this varies by motherboard manufacturer. With other techniques listed here, disabling hyper-threading should only be done as a last resort to eek absolute maximum performance from the CPU.&lt;br /&gt;
&lt;br /&gt;
=== Additional Tuning Notes from Intel ===&lt;br /&gt;
&lt;br /&gt;
* Performance report from Intel on DPDK 17.11: https://fast.dpdk.org/doc/perf/DPDK_17_11_Intel_NIC_performance_report.pdf&lt;br /&gt;
* How to get best performance with NICs on Intel platforms: https://doc.dpdk.org/guides/linux_gsg/nic_perf_intel_platform.html&lt;br /&gt;
&lt;br /&gt;
== Known Issues / Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Regular Overflows on multi-CPU Systems ===&lt;br /&gt;
&lt;br /&gt;
On Multi-CPU systems each CPU is a NUMA node. The NUMA node contains all of the cores on the CPU. For best performance when using CPU/core isolation (&amp;quot;isocpus&amp;quot; per AAA above) make sure that all of the cores are in the same NUMA node.&lt;br /&gt;
&lt;br /&gt;
=== Underruns Every Second with DPDK + Ubuntu ===&lt;br /&gt;
&lt;br /&gt;
With Linux kernels 5.10 and beyond, we have observed periodic underruns on systems that otherwise have no issues. These Linux kernel versions are the default for Ubuntu 20.04.3 LTS and later. The underrun issue is due to the &amp;lt;code&amp;gt;RT_RUNTIME_SHARE&amp;lt;/code&amp;gt; feature being disabled by default in these versions of the Linux kernel (shown as &amp;lt;code&amp;gt;NO_RT_RUNTIME_SHARE&amp;lt;/code&amp;gt;). The following procedure can be used to enable this feature. This process was tested on Linux kernel version 5.13; the procedure may be slightly different on other kernel versions. To determine the Linux kernel version of your system, in a terminal issue the command &amp;lt;code&amp;gt;uname -r&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo -s&lt;br /&gt;
$ cd /sys/kernel/debug/sched&lt;br /&gt;
$ cat features | tr ' ' '\n' | grep RUNTIME_SHARE&lt;br /&gt;
NO_RT_RUNTIME_SHARE&lt;br /&gt;
$ echo RT_RUNTIME_SHARE &amp;gt; features&lt;br /&gt;
$ cat features | tr ' ' '\n' | grep RUNTIME_SHARE&lt;br /&gt;
RT_RUNTIME_SHARE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Application Notes]]&lt;/div&gt;</summary>
		<author><name>MartinAnderseck</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=About_Sampling_Rates_and_Master_Clock_Rates_for_the_USRP_X440&amp;diff=6943</id>
		<title>About Sampling Rates and Master Clock Rates for the USRP X440</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=About_Sampling_Rates_and_Master_Clock_Rates_for_the_USRP_X440&amp;diff=6943"/>
				<updated>2026-04-30T10:46:57Z</updated>
		
		<summary type="html">&lt;p&gt;MartinAnderseck: Added new rates after UHD 4.10 release.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- Title: About Sampling Rates and Master Clock Rates for the USRP X440 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Application Note Number and Authors ==&lt;br /&gt;
&lt;br /&gt;
'''AN-055''' by Marian Koop and Martin Anderseck&lt;br /&gt;
&amp;lt;!-- Internal use only: please do keep this updated!&lt;br /&gt;
==Revision History==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Author&lt;br /&gt;
!Details&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2023-09-22&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Marian Koop &lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Initial creation&lt;br /&gt;
|} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;overview&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Overview = &lt;br /&gt;
This application note guides users through the selection process of Master Clock Rates (MCR) for the [https://kb.ettus.com/X440#X440 USRP X440]. It will highlight possible implications and side effects as well as design specific differences to other USRPs (like the X410).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;x440-cfg_considerations&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= USRP X440 Configuration Considerations = &lt;br /&gt;
The USRP X440 is a [https://uhd.readthedocs.io/en/latest/page_fbx.html#fbx_too balun-coupled transceiver] without built-in RF signal conditioning. Compared to other RF architectures this enables the USRP X440 to access the full RF bandwidth available to the ADC/DAC, but also requires additional frequency planning. To achieve this, the USRP X440 utilizes its ADC/DAC in direct sampling mode and is susceptible to various effects that may distort the signal of interest. These can be separated into distortions from both signal processing and from the ADC/DAC design.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;converter_rate-mcr-iq_rate&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Relationship between RF-ADC/DAC Converter Rate, USRP Master Clock Rate (MCR), Data IQ rate ==&lt;br /&gt;
Except for the 200 MHz variant, the default USRP X440 FPGA images do not contain a configurable DDC&amp;lt;ref&amp;gt;Digital Down Conversion&amp;lt;/ref&amp;gt;/DUC&amp;lt;ref&amp;gt;Digital Up Conversion&amp;lt;/ref&amp;gt; block. This means that the IQ sample rate (F&amp;lt;sub&amp;gt;IQ&amp;lt;/sub&amp;gt;) is the same as the Master Clock Rate (MCR) that goes into the RFNoC Radio block. However, unlike most other USRPs the USRP X440 supports a highly variable MCR. The RF Data Converter sampling rate (F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;) is chosen by UHD based on the MCR and the available resampling factors of 2, 4, or 8, and defaults to the highest achievable values with these factors. This can be overridden if the desired MCR can be achieved with multiple converter rates (see device argument [https://uhd.readthedocs.io/en/latest/page_usrp_x4xx.html#x4xx_usage_args converter_rate]). The inverse calculation - divide the converter rate by 8, 4 or 2 - has to be done to derive the master clock rate if a specific converter rate shall be used. Figure 1 depicts the simplified signal path block diagram for the USRP X440.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|+ Figure 1. Simplified USRP X440 Signal Path&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-X440_signal_path.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dsp-distortions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Aliases and Nyquist Zones ==&lt;br /&gt;
By itself the USRP X440 can sample input signals at frequencies above the Nyquist frequency&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Nyquist_frequency Nyquist frequency]&amp;lt;/ref&amp;gt;, which is half of the ADC converter sampling rate (F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;). However, this method introduces aliasing effects, which cause unwanted signals to appear as mirror images around multiples of the Nyquist frequency (F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/2) in the output spectrum. The first Nyquist zone (N1) is the frequency range from 0 to F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/2, and the second Nyquist zone (N2) goes from F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/2 to F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;. Other Nyquist zones are numbered in ascending order, each spanning F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/2. The digital passband in each Nyquist zone can be calculated as 0.4 * F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt; (see also &amp;lt;ref&amp;gt;[https://docs.xilinx.com/r/en-US/pg269-rf-data-converter/RF-ADC-Decimation-Filters-Gen-1/Gen-2 Xilinx RF-ADC Decimation Filters (Gen-1)]&amp;lt;/ref&amp;gt;). The following figure depicts the Nyquist zones for the minimum and maximum RF-ADC converter rates supported by the USRP X440. Note that the illustrations do not show the effects of external, analog filters on the achievable passband within a Nyquist zone. A typical expectation is, that the unusable frequency range around each Nyquist zone boundary (also often referred to as a guard band) increases with ascending Nyquist zone order and results in decreasing, lopsided achievable passbands.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|+ Figure 2. Nyquist Zones&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-X440_nyquist_zones.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Knowledge of signal aliases can both be exploited and create uncertainties. Applications could utilize intentional under sampling (also referred as &amp;quot;bandpass sampling&amp;quot;) to receive signals at greater than F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/2. The same effect may on the other hand lead to garbled or distorted signal detection if the signal of interest spans multiple Nyquist zones or interferer signals are aliased into the observed spectrum. Both effects are depicted in figure 3.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|+ Figure 3. Aliases - Wanted and unwanted&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-wanted_and_unwanted_aliases.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Applications should therefore prefer converter rates that can contain the desired signal spectrum in a single Nyquist zone, or split the signal spectrum among multiple channels and devices. While the USRP X440 does not limit the utilized Nyquist zone, performance degrades in higher orders zones and application should focus on operating in Nyquist zones 1 and 2 (For RX, zone 3 is possible, but zones 4 and higher result into significant performance degradation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adc-distortions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== RF-ADC Spurs to consider and how to predict them ==&lt;br /&gt;
Another kind of distortion originates from the ADC/DAC itself. The USRP X440 uses the Xilinx RFDC, which is a design that combines multiple converters to &lt;br /&gt;
achieve high RF-ADC rates. An RF-ADC in this design has 8 sub-ADCs that are interleaved together. The resulting offset spurs are minimized by the integrated self-calibration (see also &amp;lt;ref&amp;gt;[https://docs.xilinx.com/r/en-US/pg269-rf-data-converter/Key-CAL-Features-and-Guidance-Summary Key CAL Features and Guidance Summary]&amp;lt;/ref&amp;gt;) executed by UHD but may still be detectable in the signal spectrum.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|+ Figure 4. RF-ADC Spurs with MCR = 500 MHz&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-adc_distortions.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Even with the best calibration the RF-ADC spurs may still be detectable in the captured spectrum. Knowledge of the location of the spurs, in particular the RF-ADC offset spur may be used during frequency planning to select an MCR (and converter rate) that exclude the offset spur frequencies from the capture spectrum. RF-ADC input spurs on the other hand will be more difficult to avoid, but as rule of thumb for modulated input signals carrier frequencies that fall on an RF-ADC offset spur frequency should be avoided (because offset and input spurs would superimpose each other).&lt;br /&gt;
&lt;br /&gt;
=== How to predict offset spurs ===&lt;br /&gt;
Any residual DC offset not corrected appears as a spur at k*F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/N, where F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt; is the composite converter rate of the RF-ADC, N is the number of sub-RF-ADCs interleaved together (8 for X4xx devices), and k = 0, 1, 2, … N.&lt;br /&gt;
For more information on expected spurs levels, refer to OIS at &amp;lt;ref&amp;gt;[https://docs.xilinx.com/r/en-US/ds926-zynq-ultrascale-plus-rfsoc/RF-ADC-Performance-Characteristics RF-ADC Performance Characteristics]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== How to predict input spurs ===&lt;br /&gt;
Any residual difference from gain and time skew correction results in spurious signals at +/-f&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt; + (k/N)*F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;, where F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt; is the converter rate of the RF-ADC, N is the number of sub-RF-ADCs (8 for X4xx devices), and f&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt; is the frequency of the input signal.&lt;br /&gt;
For more information on expected spurs levels, refer to GTIS at &amp;lt;ref&amp;gt;[https://docs.xilinx.com/r/en-US/ds926-zynq-ultrascale-plus-rfsoc/RF-ADC-Performance-Characteristics RF-ADC Performance Characteristics]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dac-distortions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== RF-DAC Distortions ==&lt;br /&gt;
Like the RF-ADC, the RF-DAC is also not an ideal circuitry and suffers from zero-order hold reconstruction. To counter this undesired attenuation in all but the first Nyquist zone, the Xilinx RF-DAC offers a Mix-Mode, which improves the power response in the second Nyquist zone and is utilized by the USRP X440. This, together with an inverse sinc filter to counter residual distortion limits the practical use of the RF-DAC to the first two Nyquist zones. For more information on the RF-DAC mix-mode and inverse sinc filter characteristics, refer to &amp;lt;ref&amp;gt;[https://docs.xilinx.com/r/en-US/pg269-rf-data-converter/RF-DAC-Nyquist-Zone-Operation RF-DAC Nyquist Zone Operation]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|+ Figure 5 &amp;lt;ref&amp;gt;[https://docs.xilinx.com/viewer/attachment/wIPPkVrh~0jtjy6aqWeihQ/q5kXcl5Z7lFon2v535oW0w Xilinx: Ideal DAC Output Response, Normalised to Fsample]&amp;lt;/ref&amp;gt;. RF-DAC Mix-Mode and normal, ideal roll-off sinc response.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-dac_roll-off_sinc_response.png|350px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
source: https://docs.xilinx.com/viewer/attachment/wIPPkVrh~0jtjy6aqWeihQ/q5kXcl5Z7lFon2v535oW0w&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Note: Due to the direct sampling architecture without filters on the FBX daughterboard, TX ports will output the converter rate (Fc) with a low power (&amp;lt;-50 dBm) as soon as the corresponding ADCs and DACs are enabled, even if the DACs are not actively transmitting. This is a known limitation of the X440 and FBX design. For instance when acquiring a signal on the RX1 port of RF0, the converter rate (Fc) can be measured on the TX/RX0 port of RF0. While operation around the converter rate (Fc) is not recommended anyway, it is possible to suppress the converter rate (Fc) by using a frontend module with a sufficiently high attenuation at the converter rate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dual-rate&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Dual Rate ==&lt;br /&gt;
Unlike previous USRPs, the USRP X440 supports the operation at two different master clock rates simultaneously. All channels on the first daughterboard will run on the first master clock rate / sampling rate and all channels on the second daughterboard will run on the second configured master clock rate / sampling rate. The main motivation for having two different master clock rates is the direct sampling architecture of the USRP X440 without signal conditioning and filtering. While [[#dsp-distortions|Aliases and Nyquist Zones]] describes the challenges of that, with dual rate this feature can be used to capture an RF spectrum that exceeds the bandwidth abilities of the single rate operation. Using a second rate, one can close the Nyquist gap of the other and monitor a wider spectrum for further processing.&lt;br /&gt;
As the clocks of both radios are derived from a common clocking chip, not all combinations are possible. Refer to [[#X440-supported-dual-rates|X440 Supported Dual Rates]] for possible RF Data Converter sampling rate combinations. The section about the [[#converter_rate-mcr-iq_rate|Relationship between RFADC/DAC Converter Rate, USRP Master Clock Rate (MCR) and Data IQ rate]] explains how to derive valid master clock rates from the RF Data converter sampling rates.&lt;br /&gt;
&lt;br /&gt;
Note: When using different MCRs for both daughterboards, the device will skip the multi-tile synchronization. That means that the phase relationship between channels may not be preserved over retunes and reboots for channels of the same daughterboard and no defined phase relationship will be preserved between channels of different daughterboards.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;use-cases&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Use cases =&lt;br /&gt;
== Scan Spectrum within single Nyquist zone ==&lt;br /&gt;
=== Spectrum Capture between 1.7 and 1.9 GHz. ===&lt;br /&gt;
* Min Bandwidth: 200 MHz&lt;br /&gt;
* Minimum IQ Rate: 250 MSps&lt;br /&gt;
==== Option 1: MCR = 250 MHz, RF-ADC converter rate = 2 GHz ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-1700-1800_250e6_2000e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This is not the best option because our spectrum of interest is very close to a Nyquist zone boundary.&lt;br /&gt;
&lt;br /&gt;
==== Option 2: MCR = 300 MHz, RF-ADC converter rate = 2.4 GHz ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-1700-1800_300e6_2400e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This option is better, the spectrum of interest is well within a Nyquist zone. Within the bandwidth of interest falls one of the ADC offset spurs. If the input signal is relatively strong, the impact from this small spur is negligible. If on the other hand the input signal strength is on the low end (for the X440), then maybe a different MCR should be considered.&lt;br /&gt;
&lt;br /&gt;
==== Option 3: MCR = 320 MHz, RF-ADC converter rate = 2.56 GHz ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-1700-1800_320e6_2560e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This option avoids a potential impact of an ADC offset spur in the observed spectrum. The only drawback to option 2 is the slightly higher data rate during host post-processing.&lt;br /&gt;
&lt;br /&gt;
=== Spectrum Capture between 500 MHz and 1.5 GHz. ===&lt;br /&gt;
The USRP X440 ships with multiple [https://uhd.readthedocs.io/en/latest/page_usrp_x4xx.html#x4xx_updating_fpga_types FPGA image flavors]. These either support 400 MHz or 1600 MHz RF bandwidth per channel. To address this use case, users have the option of using a bit file with 1600 MHz RF bandwidth to capture a contiguous spectrum, or use a 400 MHz bit file and create a stitched spectrum during host side post-processing. &lt;br /&gt;
==== Using 1600 MHz image ====&lt;br /&gt;
* Min Bandwidth: 1000 MHz&lt;br /&gt;
* Minimum IQ Rate: 1250 MSps&lt;br /&gt;
===== Option 1: MCR = 1280 MHz, RF-ADC converter rate = 2.56 GHz =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_1250e6_2560e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
Bad option, because desired spectrum spans multiple Nyquist zones.&lt;br /&gt;
&lt;br /&gt;
===== Option 2: MCR = 1600 MHz, RF-ADC converter rate = 3.2 GHz =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_1600e6_3200e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This is not the best option because our spectrum of interest is very close to a Nyquist zone boundary.&lt;br /&gt;
&lt;br /&gt;
===== Option 3: MCR = 1689.6 MHz, RF-ADC converter rate = 3.3792 GHz =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_1689e6_3379e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This option would work. If the input signal strength is low, using an even higher MCR would reduce the number of potential ADC offset spurs. This needs to be traded off against a higher data rate during host post-processing.&lt;br /&gt;
&lt;br /&gt;
==== Using 400 MHz image ====&lt;br /&gt;
Due to the smaller bandwidth addressing the use case will require the use of multiple channels. The captured spectra than needs to be stitched (combined) together.&lt;br /&gt;
* Max Bandwidth: 400 MHz&lt;br /&gt;
===== Option 1: MCR 400 MHz, RF-ADC converter rate = 3.2 GHz, 3 channels =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_400e6_3200e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This is not the best option because our spectrum of interest boundary is very close to a Nyquist zone boundary.&lt;br /&gt;
&lt;br /&gt;
===== Option 2: MCR 450 MHz, RF-ADC converter rate = 3.6 GHz, 3 channels =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_450e6_3600e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This option would work. Since the spectrum of interest is larger than the per channel bandwidth the captured spectrum may contain potential ADC offset spurs. For the spectrum of interest the 3 channels would nicely use tune frequencies (680, 1000, 1320 MHz) that do not match ADC offset spur frequencies.&lt;br /&gt;
&lt;br /&gt;
===== Option 3: MCR 512 MHz, RF-ADC converter rate = 4.096 GHz, 3 channels =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_512e6_4096e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This option would work as well. Like in option 2, the spectrum of interest may contain one potential ADC offset spur (compared to 2 in option 2). The drawback to option 2 is of course again the higher data rate during host post-processing that may be offset by only having to stitch less spectra (2 vs 3) together.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Scan Spectrum that spans multiple Nyquist Zones ==&lt;br /&gt;
&lt;br /&gt;
=== Tradeoffs: spectrum hole vs. use multiple mcrs/devices ===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scan Spectrum with dual master clock rate ==&lt;br /&gt;
=== Spectrum capture between 1.0 and 2.4 GHz (L-band) ===&lt;br /&gt;
* Combination of two RF-ADC converter rates: 4096 MHz and 2560 MHz&lt;br /&gt;
* Derived master clock rates: 1024 MHz (resampling factor 4) and 1280 MHz (resampling factor 2). The resampling factors are chosen to produce master clock rates which allow capturing a sufficient bandwidth to not have any gaps.&lt;br /&gt;
* Center frequencies: 1.23 GHz and 2.0 GHz respectively&lt;br /&gt;
* 1600 MHz FPGA image required due to the bandwidth requirements&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:AN055-L-band-dual-rate.jpg|800px|center]]&lt;br /&gt;
|}&lt;br /&gt;
In the picture you can see a light-green band between 1.0 GHz and 2.4 GHz which can be covered using two different rates: Radio0 operates at MCR=1024 MHz in its first Nyquist zone and radio1 operates at 1280 MHz in its second Nyquist zone. The coverage is shown as light-blue boxes in both frequency charts. Starting with UHD 4.6, the X440_L_band_capture.py example demonstrates this use case and by default uses center frequencies of 0.9 GHz and 2 GHz respectively. These were choosen to conveniently display the two individual spectra next to each other in a continuous spectra view without any overlap. Practical applications on the other hand need to take into account that the well usable bandwidth of each channel is only about 0.8 * MCR. For the chosen MCRs this means that the first radio has a usable bandwidth of 819.2 MHz and the second one of 1024 MHz. Taking into account that a typical RF passband in the first Nyquist zone has a passband of up to 0.4 * F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt; and the need for some overlap of the two spectra, the center frequency of radio0 should be set to 1.230 GHz (usable bandwidth spans from ~820 MHz to ~1640 MHz). Radio1 will be used in its second Nyquist zone, so the center frequency should be 2.0 GHz (usable bandwidth from ~1.5 GHz to ~2.5 GHz). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;appendix&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Appendix =&lt;br /&gt;
&amp;lt;span id=&amp;quot;x440-mcrs&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== X440 Supported Master Clock Rates (MCR) ==&lt;br /&gt;
Note: The selected FPGA bitfile may further limit the maximum supported master clock rate.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; margin:auto&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! MCR (MHz) !! RFDC Converter Rate (GHz)&lt;br /&gt;
|-&lt;br /&gt;
| 125.0 || 1.0&lt;br /&gt;
|-&lt;br /&gt;
| 128.0 || 1.024&lt;br /&gt;
|-&lt;br /&gt;
| 133.12 || 1.06496&lt;br /&gt;
|-&lt;br /&gt;
| 150.0 || 1.2&lt;br /&gt;
|-&lt;br /&gt;
| 153.6 || 1.2288&lt;br /&gt;
|-&lt;br /&gt;
| 160.0 || 1.28&lt;br /&gt;
|-&lt;br /&gt;
| 163.84 || 1.31072&lt;br /&gt;
|-&lt;br /&gt;
| 184.32 || 1.47456&lt;br /&gt;
|-&lt;br /&gt;
| 199.68 || 1.59744&lt;br /&gt;
|-&lt;br /&gt;
| 200.0 || 1.6&lt;br /&gt;
|-&lt;br /&gt;
| 204.8 || 1.6384&lt;br /&gt;
|-&lt;br /&gt;
| 240.0 || 1.92&lt;br /&gt;
|-&lt;br /&gt;
| 245.76 || 1.96608&lt;br /&gt;
|-&lt;br /&gt;
| 250.0 || 2.0, 1.0&lt;br /&gt;
|-&lt;br /&gt;
| 256.0 || 2.048, 1.024&lt;br /&gt;
|-&lt;br /&gt;
| 266.24 || 2.12992, 1.06496&lt;br /&gt;
|-&lt;br /&gt;
| 300.0 || 2.4, 1.2&lt;br /&gt;
|-&lt;br /&gt;
| 307.2 || 2.4576, 1.2288&lt;br /&gt;
|-&lt;br /&gt;
| 320.0 || 2.56, 1.28&lt;br /&gt;
|-&lt;br /&gt;
| 327.68 || 2.62144, 1.31072&lt;br /&gt;
|-&lt;br /&gt;
| 360.0 || 2.88, 1.44&lt;br /&gt;
|-&lt;br /&gt;
| 368.64 || 1.47456, 2.94912&lt;br /&gt;
|-&lt;br /&gt;
| 375.0 || 3.0, 1.5&lt;br /&gt;
|-&lt;br /&gt;
| 384.0 || 1.536, 3.072&lt;br /&gt;
|-&lt;br /&gt;
| 399.36 || 3.19488, 1.59744&lt;br /&gt;
|-&lt;br /&gt;
| 400.0 || 3.2, 1.6&lt;br /&gt;
|-&lt;br /&gt;
| 409.6 || 3.2768, 1.6384&lt;br /&gt;
|-&lt;br /&gt;
| 450.0 || 1.8, 3.6&lt;br /&gt;
|-&lt;br /&gt;
| 460.8 || 1.8432, 3.6864&lt;br /&gt;
|-&lt;br /&gt;
| 480.0 || 3.84, 1.92&lt;br /&gt;
|-&lt;br /&gt;
| 491.52 || 3.93216, 1.96608&lt;br /&gt;
|-&lt;br /&gt;
| 500.0 || 4.0, 2.0, 1.0&lt;br /&gt;
|-&lt;br /&gt;
| 512.0 || 1.024, 2.048, 4.096&lt;br /&gt;
|-&lt;br /&gt;
| 532.48 || 1.06496, 2.12992&lt;br /&gt;
|-&lt;br /&gt;
| 552.96 || 2.21184, 1.10592&lt;br /&gt;
|-&lt;br /&gt;
| 599.04 || 1.19808, 2.39616&lt;br /&gt;
|-&lt;br /&gt;
| 600.0 || 1.2, 2.4&lt;br /&gt;
|-&lt;br /&gt;
| 614.4 || 1.2288, 2.4576&lt;br /&gt;
|-&lt;br /&gt;
| 625.0 || 1.25, 2.5&lt;br /&gt;
|-&lt;br /&gt;
| 640.0 || 2.56, 1.28&lt;br /&gt;
|-&lt;br /&gt;
| 655.36 || 1.31072, 2.62144&lt;br /&gt;
|-&lt;br /&gt;
| 665.6 || 1.3312, 2.6624&lt;br /&gt;
|-&lt;br /&gt;
| 720.0 || 1.44, 2.88&lt;br /&gt;
|-&lt;br /&gt;
| 737.28 || 1.47456, 2.94912&lt;br /&gt;
|-&lt;br /&gt;
| 750.0 || 1.5, 3.0&lt;br /&gt;
|-&lt;br /&gt;
| 768.0 || 1.536, 3.072&lt;br /&gt;
|-&lt;br /&gt;
| 798.72 || 3.19488, 1.59744&lt;br /&gt;
|-&lt;br /&gt;
| 800.0 || 1.6, 3.2&lt;br /&gt;
|-&lt;br /&gt;
| 819.2 || 3.2768, 1.6384&lt;br /&gt;
|-&lt;br /&gt;
| 840.0 || 1.68, 3.36&lt;br /&gt;
|-&lt;br /&gt;
| 860.16 || 3.44064, 1.72032&lt;br /&gt;
|-&lt;br /&gt;
| 875.0 || 3.5, 1.75&lt;br /&gt;
|-&lt;br /&gt;
| 896.0 || 3.584, 1.792&lt;br /&gt;
|-&lt;br /&gt;
| 900.0 || 1.8, 3.6&lt;br /&gt;
|-&lt;br /&gt;
| 921.6 || 1.8432, 3.6864&lt;br /&gt;
|-&lt;br /&gt;
| 931.84 || 1.86368, 3.72736&lt;br /&gt;
|-&lt;br /&gt;
| 960.0 || 3.84, 1.92&lt;br /&gt;
|-&lt;br /&gt;
| 983.04 || 1.96608, 3.93216&lt;br /&gt;
|-&lt;br /&gt;
| 998.4 || 3.9936, 1.9968&lt;br /&gt;
|-&lt;br /&gt;
| 1000.0 || 4.0, 2.0&lt;br /&gt;
|-&lt;br /&gt;
| 1024.0 || 4.096, 2.048&lt;br /&gt;
|-&lt;br /&gt;
| 1050.0 || 2.1&lt;br /&gt;
|-&lt;br /&gt;
| 1064.96 || 2.12992&lt;br /&gt;
|-&lt;br /&gt;
| 1075.2 || 2.1504&lt;br /&gt;
|-&lt;br /&gt;
| 1080.0 || 2.16&lt;br /&gt;
|-&lt;br /&gt;
| 1105.92 || 2.21184&lt;br /&gt;
|-&lt;br /&gt;
| 1120.0 || 2.24&lt;br /&gt;
|-&lt;br /&gt;
| 1125.0 || 2.25&lt;br /&gt;
|-&lt;br /&gt;
| 1146.88 || 2.29376&lt;br /&gt;
|-&lt;br /&gt;
| 1152.0 || 2.304&lt;br /&gt;
|-&lt;br /&gt;
| 1198.08 || 2.39616&lt;br /&gt;
|-&lt;br /&gt;
| 1200.0 || 2.4&lt;br /&gt;
|-&lt;br /&gt;
| 1228.8 || 2.4576&lt;br /&gt;
|-&lt;br /&gt;
| 1250.0 || 2.5&lt;br /&gt;
|-&lt;br /&gt;
| 1280.0 || 2.56&lt;br /&gt;
|-&lt;br /&gt;
| 1290.24 || 2.58048&lt;br /&gt;
|-&lt;br /&gt;
| 1310.72 || 2.62144&lt;br /&gt;
|-&lt;br /&gt;
| 1331.2 || 2.6624&lt;br /&gt;
|-&lt;br /&gt;
| 1350.0 || 2.7&lt;br /&gt;
|-&lt;br /&gt;
| 1382.4 || 2.7648&lt;br /&gt;
|-&lt;br /&gt;
| 1397.76 || 2.79552&lt;br /&gt;
|-&lt;br /&gt;
| 1400.0 || 2.8&lt;br /&gt;
|-&lt;br /&gt;
| 1433.6 || 2.8672&lt;br /&gt;
|-&lt;br /&gt;
| 1440.0 || 2.88&lt;br /&gt;
|-&lt;br /&gt;
| 1474.56 || 2.94912&lt;br /&gt;
|-&lt;br /&gt;
| 1500.0 || 3.0&lt;br /&gt;
|-&lt;br /&gt;
| 1536.0 || 3.072&lt;br /&gt;
|-&lt;br /&gt;
| 1600.0 || 3.2&lt;br /&gt;
|-&lt;br /&gt;
| 1625.0 || 3.25&lt;br /&gt;
|-&lt;br /&gt;
| 1638.4 || 3.2768&lt;br /&gt;
|-&lt;br /&gt;
| 1650.0 || 3.3&lt;br /&gt;
|-&lt;br /&gt;
| 1658.88 || 3.31776&lt;br /&gt;
|-&lt;br /&gt;
| 1664.0 || 3.328&lt;br /&gt;
|-&lt;br /&gt;
| 1680.0 || 3.36&lt;br /&gt;
|-&lt;br /&gt;
| 1689.6 || 3.3792&lt;br /&gt;
|-&lt;br /&gt;
| 1720.32 || 3.44064&lt;br /&gt;
|-&lt;br /&gt;
| 1730.56 || 3.46112&lt;br /&gt;
|-&lt;br /&gt;
| 1750.0 || 3.5&lt;br /&gt;
|-&lt;br /&gt;
| 1760.0 || 3.52&lt;br /&gt;
|-&lt;br /&gt;
| 1792.0 || 3.584&lt;br /&gt;
|-&lt;br /&gt;
| 1797.12 || 3.59424&lt;br /&gt;
|-&lt;br /&gt;
| 1800.0 || 3.6&lt;br /&gt;
|-&lt;br /&gt;
| 1802.24 || 3.60448&lt;br /&gt;
|-&lt;br /&gt;
| 1843.2 || 3.6864&lt;br /&gt;
|-&lt;br /&gt;
| 1863.68 || 3.72736&lt;br /&gt;
|-&lt;br /&gt;
| 1875.0 || 3.75&lt;br /&gt;
|-&lt;br /&gt;
| 1920.0 || 3.84&lt;br /&gt;
|-&lt;br /&gt;
| 1950.0 || 3.9&lt;br /&gt;
|-&lt;br /&gt;
| 1966.08 || 3.93216&lt;br /&gt;
|-&lt;br /&gt;
| 1996.8 || 3.9936&lt;br /&gt;
|-&lt;br /&gt;
| 2000.0 || 4.0&lt;br /&gt;
|-&lt;br /&gt;
| 2027.52 || 4.05504&lt;br /&gt;
|-&lt;br /&gt;
| 2048.0 || 4.096&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;X440-supported-dual-rates&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== X440 Supported Master Clock Rate combinations (Dual Rate) ==&lt;br /&gt;
&amp;lt;b&amp;gt;Important:&amp;lt;/b&amp;gt; For the best RF performance it is required to configure the master clock rate that is connected to the higher RF-ADC/DAC converter rate on the first radio and the MCR connected to the lower converter rate second. Not all master clock rate combinations listed in this table will comply to this requirement by themselves. Specifying the converter_rate argument or swapping the master clock rates will help resolving issues. The selected FPGA bitfile may further limit the maximum supported master clock rate.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; margin:auto&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| MCR0 (MHz) || MCR1 (MHz)&lt;br /&gt;
|-&lt;br /&gt;
| 125.0 || 250.0, 375.0, 500.0, 750.0, 875.0, 1000.0, 1125.0, 1625.0, 1750.0, 1875.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 128.0 || 384.0, 512.0, 768.0, 1152.0&lt;br /&gt;
|-&lt;br /&gt;
| 133.12 || 266.24, 399.36, 532.48, 665.6, 798.72, 931.84, 1064.96, 1198.08, 1331.2, 1730.56, 1863.68, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 150.0 || 300.0, 450.0, 600.0, 750.0, 900.0, 1050.0, 1350.0, 1500.0, 1650.0, 1800.0, 1950.0&lt;br /&gt;
|-&lt;br /&gt;
| 153.6 || 307.2, 614.4, 1228.8&lt;br /&gt;
|-&lt;br /&gt;
| 160.0 || 320.0, 640.0, 800.0, 1120.0, 1280.0, 1600.0, 1760.0&lt;br /&gt;
|-&lt;br /&gt;
| 163.84 || 327.68, 655.36, 1146.88, 1310.72, 1474.56, 1802.24&lt;br /&gt;
|-&lt;br /&gt;
| 184.32 || 368.64, 552.96, 737.28, 1105.92, 1290.24, 1474.56, 1658.88, 1843.2, 2027.52&lt;br /&gt;
|-&lt;br /&gt;
| 199.68 || 399.36, 599.04, 798.72, 998.4, 1198.08, 1397.76, 1797.12, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 200.0 || 400.0, 800.0, 1200.0, 1400.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 204.8 || 409.6, 819.2, 1433.6, 1638.4&lt;br /&gt;
|-&lt;br /&gt;
| 240.0 || 360.0, 480.0, 600.0, 720.0, 840.0, 960.0, 1440.0, 1680.0, 1800.0, 1920.0&lt;br /&gt;
|-&lt;br /&gt;
| 245.76 || 491.52, 860.16, 983.04, 1720.32, 1966.08&lt;br /&gt;
|-&lt;br /&gt;
| 250.0 || 125.0, 375.0, 500.0, 750.0, 875.0, 1000.0, 1500.0, 1625.0, 1750.0, 1875.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 256.0 || 640.0, 896.0, 1024.0, 1280.0, 1664.0, 1792.0, 2048.0&lt;br /&gt;
|-&lt;br /&gt;
| 266.24 || 133.12, 399.36, 532.48, 665.6, 798.72, 931.84, 1064.96, 1331.2, 1730.56, 1863.68, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 300.0 || 150.0, 450.0, 600.0, 750.0, 900.0, 1050.0, 1500.0, 1650.0, 1800.0, 1950.0&lt;br /&gt;
|-&lt;br /&gt;
| 307.2 || 153.6, 614.4, 1228.8&lt;br /&gt;
|-&lt;br /&gt;
| 320.0 || 160.0, 640.0, 800.0, 1120.0, 1280.0, 1600.0, 1760.0&lt;br /&gt;
|-&lt;br /&gt;
| 327.68 || 163.84, 655.36, 1146.88, 1310.72, 1802.24&lt;br /&gt;
|-&lt;br /&gt;
| 360.0 || 240.0, 600.0, 720.0, 1080.0, 1800.0&lt;br /&gt;
|-&lt;br /&gt;
| 368.64 || 184.32, 552.96, 737.28, 1105.92, 1290.24, 1474.56, 1658.88, 1843.2, 2027.52&lt;br /&gt;
|-&lt;br /&gt;
| 375.0 || 125.0, 250.0, 750.0, 1125.0, 1500.0, 1875.0&lt;br /&gt;
|-&lt;br /&gt;
| 384.0 || 128.0, 768.0, 1152.0, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 399.36 || 133.12, 199.68, 266.24, 599.04, 665.6, 798.72, 998.4, 1198.08, 1331.2, 1397.76, 1797.12, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 400.0 || 200.0, 800.0, 1200.0, 1400.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 409.6 || 204.8, 819.2, 1433.6, 1638.4&lt;br /&gt;
|-&lt;br /&gt;
| 450.0 || 150.0, 300.0, 600.0, 750.0, 900.0, 1350.0, 1500.0, 1800.0&lt;br /&gt;
|-&lt;br /&gt;
| 460.8 || 768.0, 921.6, 1075.2, 1382.4, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 480.0 || 240.0, 720.0, 840.0, 960.0, 1440.0, 1680.0, 1920.0&lt;br /&gt;
|-&lt;br /&gt;
| 491.52 || 245.76, 860.16, 983.04, 1720.32, 1966.08&lt;br /&gt;
|-&lt;br /&gt;
| 500.0 || 125.0, 250.0, 750.0, 875.0, 1000.0, 1500.0, 1750.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 512.0 || 128.0, 768.0, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 532.48 || 133.12, 266.24, 798.72, 931.84, 1064.96, 1331.2, 1863.68&lt;br /&gt;
|-&lt;br /&gt;
| 552.96 || 184.32, 368.64, 737.28, 1105.92, 1290.24, 1474.56, 1658.88, 1843.2&lt;br /&gt;
|-&lt;br /&gt;
| 599.04 || 199.68, 399.36, 798.72, 998.4, 1198.08, 1397.76, 1797.12, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 600.0 || 150.0, 240.0, 300.0, 360.0, 450.0, 720.0, 900.0, 1000.0, 1050.0, 1500.0, 1800.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 614.4 || 153.6, 307.2, 1228.8&lt;br /&gt;
|-&lt;br /&gt;
| 625.0 || 1250.0&lt;br /&gt;
|-&lt;br /&gt;
| 640.0 || 160.0, 256.0, 320.0, 800.0, 1120.0, 1280.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 655.36 || 163.84, 327.68, 1146.88, 1310.72&lt;br /&gt;
|-&lt;br /&gt;
| 665.6 || 133.12, 266.24, 399.36, 798.72, 1331.2, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 720.0 || 240.0, 360.0, 480.0, 600.0, 960.0, 1440.0, 1680.0, 1800.0, 1920.0&lt;br /&gt;
|-&lt;br /&gt;
| 737.28 || 184.32, 368.64, 552.96, 1105.92, 1290.24, 1474.56, 1843.2&lt;br /&gt;
|-&lt;br /&gt;
| 750.0 || 125.0, 150.0, 250.0, 300.0, 375.0, 450.0, 500.0, 900.0, 1000.0, 1125.0, 1500.0, 1750.0, 1875.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 768.0 || 128.0, 384.0, 460.8, 512.0, 921.6, 1152.0, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 798.72 || 133.12, 199.68, 266.24, 399.36, 532.48, 599.04, 665.6, 998.4, 1064.96, 1198.08, 1331.2, 1397.76, 1863.68, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 800.0 || 160.0, 200.0, 320.0, 400.0, 640.0, 1200.0, 1400.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 819.2 || 204.8, 409.6, 1433.6, 1638.4&lt;br /&gt;
|-&lt;br /&gt;
| 840.0 || 240.0, 480.0, 1680.0&lt;br /&gt;
|-&lt;br /&gt;
| 860.16 || 245.76, 491.52, 1720.32&lt;br /&gt;
|-&lt;br /&gt;
| 875.0 || 125.0, 250.0, 500.0, 1750.0&lt;br /&gt;
|-&lt;br /&gt;
| 896.0 || 256.0, 1792.0&lt;br /&gt;
|-&lt;br /&gt;
| 900.0 || 150.0, 300.0, 450.0, 600.0, 750.0, 1500.0, 1800.0&lt;br /&gt;
|-&lt;br /&gt;
| 921.6 || 460.8, 768.0, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 931.84 || 133.12, 266.24, 532.48, 1863.68&lt;br /&gt;
|-&lt;br /&gt;
| 960.0 || 240.0, 480.0, 720.0, 1440.0, 1920.0&lt;br /&gt;
|-&lt;br /&gt;
| 983.04 || 245.76, 491.52, 1966.08&lt;br /&gt;
|-&lt;br /&gt;
| 998.4 || 199.68, 399.36, 599.04, 798.72, 1198.08, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 1000.0 || 125.0, 250.0, 500.0, 600.0, 750.0, 1500.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 1024.0 || 256.0, 1280.0, 2048.0&lt;br /&gt;
|-&lt;br /&gt;
| 1050.0 || 150.0, 300.0, 600.0&lt;br /&gt;
|-&lt;br /&gt;
| 1064.96 || 133.12, 266.24, 532.48, 798.72, 1331.2&lt;br /&gt;
|-&lt;br /&gt;
| 1075.2 || 460.8&lt;br /&gt;
|-&lt;br /&gt;
| 1080.0 || 360.0&lt;br /&gt;
|-&lt;br /&gt;
| 1105.92 || 184.32, 368.64, 552.96, 737.28, 1474.56, 1658.88, 1843.2&lt;br /&gt;
|-&lt;br /&gt;
| 1120.0 || 160.0, 320.0, 640.0&lt;br /&gt;
|-&lt;br /&gt;
| 1125.0 || 125.0, 375.0, 750.0, 1500.0, 1875.0&lt;br /&gt;
|-&lt;br /&gt;
| 1146.88 || 163.84, 327.68, 655.36&lt;br /&gt;
|-&lt;br /&gt;
| 1152.0 || 128.0, 384.0, 768.0, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 1198.08 || 133.12, 199.68, 399.36, 599.04, 798.72, 998.4, 1797.12, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 1200.0 || 200.0, 400.0, 800.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 1228.8 || 153.6, 307.2, 614.4&lt;br /&gt;
|-&lt;br /&gt;
| 1250.0 || 625.0&lt;br /&gt;
|-&lt;br /&gt;
| 1280.0 || 160.0, 256.0, 320.0, 640.0, 1024.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 1290.24 || 184.32, 368.64, 552.96, 737.28&lt;br /&gt;
|-&lt;br /&gt;
| 1310.72 || 163.84, 327.68, 655.36&lt;br /&gt;
|-&lt;br /&gt;
| 1331.2 || 133.12, 266.24, 399.36, 532.48, 665.6, 798.72, 1064.96, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 1350.0 || 150.0, 450.0&lt;br /&gt;
|-&lt;br /&gt;
| 1382.4 || 460.8&lt;br /&gt;
|-&lt;br /&gt;
| 1397.76 || 199.68, 399.36, 599.04, 798.72&lt;br /&gt;
|-&lt;br /&gt;
| 1400.0 || 200.0, 400.0, 800.0&lt;br /&gt;
|-&lt;br /&gt;
| 1433.6 || 204.8, 409.6, 819.2&lt;br /&gt;
|-&lt;br /&gt;
| 1440.0 || 240.0, 480.0, 720.0, 960.0, 1920.0&lt;br /&gt;
|-&lt;br /&gt;
| 1474.56 || 163.84, 184.32, 368.64, 552.96, 737.28, 1105.92&lt;br /&gt;
|-&lt;br /&gt;
| 1500.0 || 150.0, 250.0, 300.0, 375.0, 450.0, 500.0, 600.0, 750.0, 900.0, 1000.0, 1125.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 1536.0 || 384.0, 460.8, 512.0, 768.0, 921.6, 1152.0&lt;br /&gt;
|-&lt;br /&gt;
| 1600.0 || 160.0, 200.0, 320.0, 400.0, 640.0, 800.0, 1200.0, 1280.0&lt;br /&gt;
|-&lt;br /&gt;
| 1625.0 || 125.0, 250.0&lt;br /&gt;
|-&lt;br /&gt;
| 1638.4 || 204.8, 409.6, 819.2&lt;br /&gt;
|-&lt;br /&gt;
| 1650.0 || 150.0, 300.0&lt;br /&gt;
|-&lt;br /&gt;
| 1658.88 || 184.32, 368.64, 552.96, 1105.92&lt;br /&gt;
|-&lt;br /&gt;
| 1664.0 || 256.0&lt;br /&gt;
|-&lt;br /&gt;
| 1680.0 || 240.0, 480.0, 720.0, 840.0&lt;br /&gt;
|-&lt;br /&gt;
| 1720.32 || 245.76, 491.52, 860.16&lt;br /&gt;
|-&lt;br /&gt;
| 1730.56 || 133.12, 266.24&lt;br /&gt;
|-&lt;br /&gt;
| 1750.0 || 125.0, 250.0, 500.0, 750.0, 875.0&lt;br /&gt;
|-&lt;br /&gt;
| 1760.0 || 160.0, 320.0&lt;br /&gt;
|-&lt;br /&gt;
| 1792.0 || 256.0, 896.0&lt;br /&gt;
|-&lt;br /&gt;
| 1797.12 || 199.68, 399.36, 599.04, 1198.08&lt;br /&gt;
|-&lt;br /&gt;
| 1800.0 || 150.0, 240.0, 300.0, 360.0, 450.0, 600.0, 720.0, 900.0&lt;br /&gt;
|-&lt;br /&gt;
| 1802.24 || 163.84, 327.68&lt;br /&gt;
|-&lt;br /&gt;
| 1843.2 || 184.32, 368.64, 552.96, 737.28, 1105.92&lt;br /&gt;
|-&lt;br /&gt;
| 1863.68 || 133.12, 266.24, 532.48, 798.72, 931.84&lt;br /&gt;
|-&lt;br /&gt;
| 1875.0 || 125.0, 250.0, 375.0, 750.0, 1125.0&lt;br /&gt;
|-&lt;br /&gt;
| 1920.0 || 240.0, 480.0, 720.0, 960.0, 1440.0&lt;br /&gt;
|-&lt;br /&gt;
| 1950.0 || 150.0, 300.0&lt;br /&gt;
|-&lt;br /&gt;
| 1966.08 || 245.76, 491.52, 983.04&lt;br /&gt;
|-&lt;br /&gt;
| 1996.8 || 133.12, 199.68, 266.24, 399.36, 599.04, 665.6, 798.72, 998.4, 1198.08, 1331.2&lt;br /&gt;
|-&lt;br /&gt;
| 2000.0 || 125.0, 250.0, 500.0, 600.0, 750.0, 1000.0, 1500.0&lt;br /&gt;
|-&lt;br /&gt;
| 2027.52 || 184.32, 368.64&lt;br /&gt;
|-&lt;br /&gt;
| 2048.0 || 256.0, 1024.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;references&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== References and Related Documentation ==&lt;br /&gt;
* [https://www.ni.com/en/solutions/aerospace-defense/radar-electronic-warfare-sigint/advantages-of-direct-rf-sampling-architectures.html Advantages of Direct RF Sampling Architectures]&lt;br /&gt;
* [https://docs.xilinx.com/r/en-US/pg269-rf-data-converter Zynq UltraScale+ RFSoC RF Data Converter v2.6 Gen 1/2/3/DFE LogiCORE IP Product Guide (PG269)]&lt;br /&gt;
* [https://events.gnuradio.org/event/21/contributions/392/attachments/123/285/Lo%20and%20behold,%20no%20LO.pdf GRcon 23 - Lo and behold, no LO!]&lt;br /&gt;
* [https://docs.xilinx.com/r/en-US/ds926-zynq-ultrascale-plus-rfsoc/RF-ADC-Electrical-Characteristics Zynq UltraScale+ RFSoC Data Sheet: DC and AC Switching Characteristics (DS926)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Footnotes =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>MartinAnderseck</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Knowledge_Base&amp;diff=6939</id>
		<title>Knowledge Base</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Knowledge_Base&amp;diff=6939"/>
				<updated>2026-04-27T08:20:56Z</updated>
		
		<summary type="html">&lt;p&gt;MartinAnderseck: Updated the X4xx motherboards GSG link to point to the manual&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Ettus Research Knowledge Base (KB). The KB is continuously being updated and expanded. If you have any suggestions, or do not find what you are looking for, then please [http://www.ettus.com/contact Contact Us].&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
== [[Getting Started Guides|&amp;lt;i class=&amp;quot;fa fa-road&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Getting Started Guides]] ==&lt;br /&gt;
&lt;br /&gt;
'''Motherboards'''&lt;br /&gt;
* [[B200/B210/B200mini/B205mini/B206mini Getting Started Guides|B200/B210/B200mini/B205mini/B206mini]]&lt;br /&gt;
* [[Ettus USRP E300 Embedded Family Getting Started Guides|E310/E312/E313]]&lt;br /&gt;
* [[E320 Getting Started Guide|E320]]&lt;br /&gt;
* [[N200/N210 Getting Started Guides|N200/N210]]&lt;br /&gt;
* [[USRP N300/N310/N320/N321 Getting Started Guide|N300/N310/N320/N321]]&lt;br /&gt;
* [[X300/X310 Getting Started Guides|X300/X310]]&lt;br /&gt;
* [[USRP-2974 Getting Started Guide|USRP-2974]]&lt;br /&gt;
* [https://uhd.readthedocs.io/en/latest/page_usrp_x4xx.html#x4xx_getting_started X410/X420/X440]&lt;br /&gt;
&lt;br /&gt;
'''Daughterboards'''&lt;br /&gt;
* [[OBX Getting Started Guides|OBX]]&lt;br /&gt;
* [[BasicTX/BasicRX Getting Started Guides|BasicTX/BasicRX]]&lt;br /&gt;
* [[CBX Getting Started Guides|CBX]]&lt;br /&gt;
* [[LFTX/LFRX Getting Started Guides|LFTX/LFRX]]&lt;br /&gt;
* [[SBX Getting Started Guides|SBX]]&lt;br /&gt;
* [[TwinRX Getting Started Guides|TwinRX]]&lt;br /&gt;
* [[UBX Getting Started Guides|UBX]]&lt;br /&gt;
* [[WBX Getting Started Guides|WBX]]&lt;br /&gt;
&lt;br /&gt;
'''Other'''&lt;br /&gt;
* [[Getting_Started_with_RFNoC_in_UHD_4.0|RFNoC Development (UHD 4.x)]]&lt;br /&gt;
* [[RFNoC_4_Migration_Guide|RFNoC Migration Guide (UHD 3.x to UHD 4.x)]]&lt;br /&gt;
* [[Getting_Started_with_RFNoC_Development|RFNoC Development (UHD 3.x)]]&lt;br /&gt;
* [[Live SDR Environment Getting Started Guides|Live SDR Environment]]&lt;br /&gt;
* [[OctoClock CDA-2990 Getting Started Guides|OctoClock CDA-2990]]&lt;br /&gt;
* [[Using Ethernet-Based Synchronization on the USRP™ N3xx Devices|White Rabbit]]&lt;br /&gt;
* [[Getting Started with DPDK and UHD|DPDK]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Hardware Resources|&amp;lt;i class=&amp;quot;fa fa-cogs&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Hardware Resources]] ==&lt;br /&gt;
'''Motherboards'''&lt;br /&gt;
* [[B200/B210/B200mini/B205mini/B206mini]]&lt;br /&gt;
* [[Ettus USRP E300 Embedded Family Hardware Resources|E310/E312/E313]]&lt;br /&gt;
* [[E320|E320]]&lt;br /&gt;
* [[N200/N210]]&lt;br /&gt;
* [[N300/N310]]&lt;br /&gt;
* [[N320/N321]]&lt;br /&gt;
* [[X300/X310]]&lt;br /&gt;
* [[USRP-2974]]&lt;br /&gt;
* [[X410]]&lt;br /&gt;
* [[X440]]&lt;br /&gt;
&lt;br /&gt;
'''Daughterboards'''&lt;br /&gt;
* [[OBX]]&lt;br /&gt;
* [[BasicTX/BasicRX]]&lt;br /&gt;
* [[CBX]]&lt;br /&gt;
* [[LFTX/LFRX]]&lt;br /&gt;
* [[SBX]]&lt;br /&gt;
* [[TwinRX]]&lt;br /&gt;
* [[UBX]]&lt;br /&gt;
* [[WBX]]&lt;br /&gt;
&lt;br /&gt;
'''Other'''&lt;br /&gt;
* [[OctoClock CDA-2990]]&lt;br /&gt;
* [[GPSDO]]&lt;br /&gt;
* [[Antennas]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Software Resources|&amp;lt;i class=&amp;quot;fa fa-desktop&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Software Resources]] ==&lt;br /&gt;
'''Ettus Products'''&lt;br /&gt;
* [[UHD]]&lt;br /&gt;
* [[UHD Python API]]&lt;br /&gt;
* [[RFNoC|RFNoC (UHD 4.x)]]&lt;br /&gt;
* [[RFNoC (UHD 3.0)|RFNoC (UHD 3.x)]]&lt;br /&gt;
&lt;br /&gt;
'''Third Party'''&lt;br /&gt;
* [[GNU Radio]]&lt;br /&gt;
* [[LabVIEW]]&lt;br /&gt;
* [[Matlab/Simulink]]&lt;br /&gt;
* [[OpenBTS]]&lt;br /&gt;
* [[Eurecom OpenAirInterface (OAI)]]&lt;br /&gt;
* [[srsLTE/srsUE]]&lt;br /&gt;
* [[Gqrx]]&lt;br /&gt;
* [[Fosphor]]&lt;br /&gt;
&lt;br /&gt;
'''Reference Architectures'''&lt;br /&gt;
* [[Multichannel RF Reference Architecture]]&lt;br /&gt;
* [[OAI Reference Architecture for 5G and 6G Research with USRP]]&lt;br /&gt;
* [[5G OAI Neural Receiver Testbed with USRP X410]]&lt;br /&gt;
* [[AI-Based Spectrum Sensing with Nvidia Jetson and USRP]]&lt;br /&gt;
* [[5G OAI End-to-End Reference Architecture with USRP]]&lt;br /&gt;
* [[5G srsRAN End-to-End Reference Architecture with USRP]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[UHD and USRP User Manual|&amp;lt;i class=&amp;quot;fa fa-flag&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; UHD and USRP User Manual]] ==&lt;br /&gt;
&lt;br /&gt;
'''Software'''&lt;br /&gt;
* [https://uhd.readthedocs.io/ UHD Manual (master)]&lt;br /&gt;
* [https://files.ettus.com/manual_archive/ UHD Manual Archive (previous releases)]&lt;br /&gt;
&lt;br /&gt;
'''Motherboards'''&lt;br /&gt;
* [https://files.ettus.com/manual/page_usrp_b200.html  B200/B210/B200mini/B205mini/B206mini]&lt;br /&gt;
* [https://files.ettus.com/manual/page_usrp_x3x0.html X300/X310]&lt;br /&gt;
* [https://files.ettus.com/manual/page_usrp2.html N200/N210]&lt;br /&gt;
* [https://files.ettus.com/manual/page_usrp_n3xx.html N300/N310/N320/N321]&lt;br /&gt;
* [https://files.ettus.com/manual/page_usrp_e3xx.html E310/E312/E313/E320]&lt;br /&gt;
* [https://files.ettus.com/manual/page_usrp_x4xx.html X410/X440]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Daughterboards'''&lt;br /&gt;
* [https://files.ettus.com/manual/page_dboards.html#dboards_basictx BasicRX/LFRX]&lt;br /&gt;
* [https://files.ettus.com/manual/page_dboards.html#dboards_basicrx BasicTX/LFTX]&lt;br /&gt;
* [https://files.ettus.com/manual/page_dboards.html#dboards_cbx CBX]&lt;br /&gt;
* [https://files.ettus.com/manual/page_dboards.html#dboards_sbx SBX]&lt;br /&gt;
* [https://files.ettus.com/manual/page_dboards.html#dboards_wbx WBX]&lt;br /&gt;
* [https://files.ettus.com/manual/page_dboards.html#dboards_ubx UBX]&lt;br /&gt;
* [https://files.ettus.com/manual/page_dboards.html#dboards_twinrx TwinRX]&lt;br /&gt;
&lt;br /&gt;
'''Other'''&lt;br /&gt;
* [https://files.ettus.com/manual/page_octoclock.html OctoClock]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Application Notes|&amp;lt;i class=&amp;quot;fa fa-file-text-o&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Application Notes]] ==&lt;br /&gt;
Application Notes (AN) and technical articles written by engineers, for engineers. These articles offer experienced analysis, design ideas, reference designs, and tutorials—to make you productive and successful using USRP devices.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Additional Resources|&amp;lt;i class=&amp;quot;fa fa-book&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Additional Resources]] ==&lt;br /&gt;
* [[Workshop_Tutorial|Workshop/Tutorial]]&lt;br /&gt;
* [[Suggested Reading|Suggested Reading]]&lt;br /&gt;
* [[Suggested Videos|Suggested Videos]]&lt;br /&gt;
* [[CGRAN]]&lt;br /&gt;
* [[SDR Events]]&lt;br /&gt;
* [[GNU Radio Conference]]&lt;br /&gt;
* [[NEWSDR]]&lt;br /&gt;
* [[FOSDEM]]&lt;br /&gt;
* [[Cyberspectrum]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Technical Support|&amp;lt;i class=&amp;quot;fa fa-life-ring&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Technical Support]] ==&lt;br /&gt;
* [[Email|Email]]&lt;br /&gt;
* [[Mailing Lists|Mailing Lists]]&lt;br /&gt;
* [[Matrix|GNU Radio Matrix Chat Server]]&lt;br /&gt;
* [[SDR_Boston_Slack|SDR Boston Slack Chat Server]]&lt;br /&gt;
* [[StackExchange|StackExchange]]&lt;br /&gt;
* [[NI_SRM|NI Service Request Manager (SRM)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Faq|&amp;lt;i class=&amp;quot;fa fa-info-circle&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; FAQ]] ==&lt;br /&gt;
* [[Technical FAQ|Technical]]&lt;br /&gt;
* [[Licensing FAQ|Licensing]]&lt;br /&gt;
* [[RFNoC_Frequently_Asked_Questions|RFNoC]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Legacy Products| &amp;lt;i class=&amp;quot;fa fa-hourglass-end&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Legacy Products]] ==&lt;br /&gt;
'''Motherboards'''&lt;br /&gt;
* [[USRP1|USRP1]]&lt;br /&gt;
* [[USRP2|USRP2]]&lt;br /&gt;
* [[E100/E110|E100/E110]]&lt;br /&gt;
* [[B100]]&lt;br /&gt;
&lt;br /&gt;
'''Daughterboards'''&lt;br /&gt;
* [[DBSRX2]]&lt;br /&gt;
* [[TVRX2]]&lt;br /&gt;
* [[XCVR2450]]&lt;/div&gt;</summary>
		<author><name>MartinAnderseck</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Knowledge_Base&amp;diff=6938</id>
		<title>Knowledge Base</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Knowledge_Base&amp;diff=6938"/>
				<updated>2026-04-27T08:15:24Z</updated>
		
		<summary type="html">&lt;p&gt;MartinAnderseck: Made the &amp;quot;UHD manual (master)&amp;quot; link point towards readthedocs instead of the last release.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Ettus Research Knowledge Base (KB). The KB is continuously being updated and expanded. If you have any suggestions, or do not find what you are looking for, then please [http://www.ettus.com/contact Contact Us].&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
== [[Getting Started Guides|&amp;lt;i class=&amp;quot;fa fa-road&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Getting Started Guides]] ==&lt;br /&gt;
&lt;br /&gt;
'''Motherboards'''&lt;br /&gt;
* [[B200/B210/B200mini/B205mini/B206mini Getting Started Guides|B200/B210/B200mini/B205mini/B206mini]]&lt;br /&gt;
* [[Ettus USRP E300 Embedded Family Getting Started Guides|E310/E312/E313]]&lt;br /&gt;
* [[E320 Getting Started Guide|E320]]&lt;br /&gt;
* [[N200/N210 Getting Started Guides|N200/N210]]&lt;br /&gt;
* [[USRP N300/N310/N320/N321 Getting Started Guide|N300/N310/N320/N321]]&lt;br /&gt;
* [[X300/X310 Getting Started Guides|X300/X310]]&lt;br /&gt;
* [[USRP-2974 Getting Started Guide|USRP-2974]]&lt;br /&gt;
* [[USRP X410/X440 Getting Started Guide|X410/X440]]&lt;br /&gt;
&lt;br /&gt;
'''Daughterboards'''&lt;br /&gt;
* [[OBX Getting Started Guides|OBX]]&lt;br /&gt;
* [[BasicTX/BasicRX Getting Started Guides|BasicTX/BasicRX]]&lt;br /&gt;
* [[CBX Getting Started Guides|CBX]]&lt;br /&gt;
* [[LFTX/LFRX Getting Started Guides|LFTX/LFRX]]&lt;br /&gt;
* [[SBX Getting Started Guides|SBX]]&lt;br /&gt;
* [[TwinRX Getting Started Guides|TwinRX]]&lt;br /&gt;
* [[UBX Getting Started Guides|UBX]]&lt;br /&gt;
* [[WBX Getting Started Guides|WBX]]&lt;br /&gt;
&lt;br /&gt;
'''Other'''&lt;br /&gt;
* [[Getting_Started_with_RFNoC_in_UHD_4.0|RFNoC Development (UHD 4.x)]]&lt;br /&gt;
* [[RFNoC_4_Migration_Guide|RFNoC Migration Guide (UHD 3.x to UHD 4.x)]]&lt;br /&gt;
* [[Getting_Started_with_RFNoC_Development|RFNoC Development (UHD 3.x)]]&lt;br /&gt;
* [[Live SDR Environment Getting Started Guides|Live SDR Environment]]&lt;br /&gt;
* [[OctoClock CDA-2990 Getting Started Guides|OctoClock CDA-2990]]&lt;br /&gt;
* [[Using Ethernet-Based Synchronization on the USRP™ N3xx Devices|White Rabbit]]&lt;br /&gt;
* [[Getting Started with DPDK and UHD|DPDK]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Hardware Resources|&amp;lt;i class=&amp;quot;fa fa-cogs&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Hardware Resources]] ==&lt;br /&gt;
'''Motherboards'''&lt;br /&gt;
* [[B200/B210/B200mini/B205mini/B206mini]]&lt;br /&gt;
* [[Ettus USRP E300 Embedded Family Hardware Resources|E310/E312/E313]]&lt;br /&gt;
* [[E320|E320]]&lt;br /&gt;
* [[N200/N210]]&lt;br /&gt;
* [[N300/N310]]&lt;br /&gt;
* [[N320/N321]]&lt;br /&gt;
* [[X300/X310]]&lt;br /&gt;
* [[USRP-2974]]&lt;br /&gt;
* [[X410]]&lt;br /&gt;
* [[X440]]&lt;br /&gt;
&lt;br /&gt;
'''Daughterboards'''&lt;br /&gt;
* [[OBX]]&lt;br /&gt;
* [[BasicTX/BasicRX]]&lt;br /&gt;
* [[CBX]]&lt;br /&gt;
* [[LFTX/LFRX]]&lt;br /&gt;
* [[SBX]]&lt;br /&gt;
* [[TwinRX]]&lt;br /&gt;
* [[UBX]]&lt;br /&gt;
* [[WBX]]&lt;br /&gt;
&lt;br /&gt;
'''Other'''&lt;br /&gt;
* [[OctoClock CDA-2990]]&lt;br /&gt;
* [[GPSDO]]&lt;br /&gt;
* [[Antennas]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Software Resources|&amp;lt;i class=&amp;quot;fa fa-desktop&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Software Resources]] ==&lt;br /&gt;
'''Ettus Products'''&lt;br /&gt;
* [[UHD]]&lt;br /&gt;
* [[UHD Python API]]&lt;br /&gt;
* [[RFNoC|RFNoC (UHD 4.x)]]&lt;br /&gt;
* [[RFNoC (UHD 3.0)|RFNoC (UHD 3.x)]]&lt;br /&gt;
&lt;br /&gt;
'''Third Party'''&lt;br /&gt;
* [[GNU Radio]]&lt;br /&gt;
* [[LabVIEW]]&lt;br /&gt;
* [[Matlab/Simulink]]&lt;br /&gt;
* [[OpenBTS]]&lt;br /&gt;
* [[Eurecom OpenAirInterface (OAI)]]&lt;br /&gt;
* [[srsLTE/srsUE]]&lt;br /&gt;
* [[Gqrx]]&lt;br /&gt;
* [[Fosphor]]&lt;br /&gt;
&lt;br /&gt;
'''Reference Architectures'''&lt;br /&gt;
* [[Multichannel RF Reference Architecture]]&lt;br /&gt;
* [[OAI Reference Architecture for 5G and 6G Research with USRP]]&lt;br /&gt;
* [[5G OAI Neural Receiver Testbed with USRP X410]]&lt;br /&gt;
* [[AI-Based Spectrum Sensing with Nvidia Jetson and USRP]]&lt;br /&gt;
* [[5G OAI End-to-End Reference Architecture with USRP]]&lt;br /&gt;
* [[5G srsRAN End-to-End Reference Architecture with USRP]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[UHD and USRP User Manual|&amp;lt;i class=&amp;quot;fa fa-flag&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; UHD and USRP User Manual]] ==&lt;br /&gt;
&lt;br /&gt;
'''Software'''&lt;br /&gt;
* [https://uhd.readthedocs.io/ UHD Manual (master)]&lt;br /&gt;
* [https://files.ettus.com/manual_archive/ UHD Manual Archive (previous releases)]&lt;br /&gt;
&lt;br /&gt;
'''Motherboards'''&lt;br /&gt;
* [https://files.ettus.com/manual/page_usrp_b200.html  B200/B210/B200mini/B205mini/B206mini]&lt;br /&gt;
* [https://files.ettus.com/manual/page_usrp_x3x0.html X300/X310]&lt;br /&gt;
* [https://files.ettus.com/manual/page_usrp2.html N200/N210]&lt;br /&gt;
* [https://files.ettus.com/manual/page_usrp_n3xx.html N300/N310/N320/N321]&lt;br /&gt;
* [https://files.ettus.com/manual/page_usrp_e3xx.html E310/E312/E313/E320]&lt;br /&gt;
* [https://files.ettus.com/manual/page_usrp_x4xx.html X410/X440]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Daughterboards'''&lt;br /&gt;
* [https://files.ettus.com/manual/page_dboards.html#dboards_basictx BasicRX/LFRX]&lt;br /&gt;
* [https://files.ettus.com/manual/page_dboards.html#dboards_basicrx BasicTX/LFTX]&lt;br /&gt;
* [https://files.ettus.com/manual/page_dboards.html#dboards_cbx CBX]&lt;br /&gt;
* [https://files.ettus.com/manual/page_dboards.html#dboards_sbx SBX]&lt;br /&gt;
* [https://files.ettus.com/manual/page_dboards.html#dboards_wbx WBX]&lt;br /&gt;
* [https://files.ettus.com/manual/page_dboards.html#dboards_ubx UBX]&lt;br /&gt;
* [https://files.ettus.com/manual/page_dboards.html#dboards_twinrx TwinRX]&lt;br /&gt;
&lt;br /&gt;
'''Other'''&lt;br /&gt;
* [https://files.ettus.com/manual/page_octoclock.html OctoClock]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Application Notes|&amp;lt;i class=&amp;quot;fa fa-file-text-o&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Application Notes]] ==&lt;br /&gt;
Application Notes (AN) and technical articles written by engineers, for engineers. These articles offer experienced analysis, design ideas, reference designs, and tutorials—to make you productive and successful using USRP devices.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Additional Resources|&amp;lt;i class=&amp;quot;fa fa-book&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Additional Resources]] ==&lt;br /&gt;
* [[Workshop_Tutorial|Workshop/Tutorial]]&lt;br /&gt;
* [[Suggested Reading|Suggested Reading]]&lt;br /&gt;
* [[Suggested Videos|Suggested Videos]]&lt;br /&gt;
* [[CGRAN]]&lt;br /&gt;
* [[SDR Events]]&lt;br /&gt;
* [[GNU Radio Conference]]&lt;br /&gt;
* [[NEWSDR]]&lt;br /&gt;
* [[FOSDEM]]&lt;br /&gt;
* [[Cyberspectrum]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Technical Support|&amp;lt;i class=&amp;quot;fa fa-life-ring&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Technical Support]] ==&lt;br /&gt;
* [[Email|Email]]&lt;br /&gt;
* [[Mailing Lists|Mailing Lists]]&lt;br /&gt;
* [[Matrix|GNU Radio Matrix Chat Server]]&lt;br /&gt;
* [[SDR_Boston_Slack|SDR Boston Slack Chat Server]]&lt;br /&gt;
* [[StackExchange|StackExchange]]&lt;br /&gt;
* [[NI_SRM|NI Service Request Manager (SRM)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Faq|&amp;lt;i class=&amp;quot;fa fa-info-circle&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; FAQ]] ==&lt;br /&gt;
* [[Technical FAQ|Technical]]&lt;br /&gt;
* [[Licensing FAQ|Licensing]]&lt;br /&gt;
* [[RFNoC_Frequently_Asked_Questions|RFNoC]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Legacy Products| &amp;lt;i class=&amp;quot;fa fa-hourglass-end&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Legacy Products]] ==&lt;br /&gt;
'''Motherboards'''&lt;br /&gt;
* [[USRP1|USRP1]]&lt;br /&gt;
* [[USRP2|USRP2]]&lt;br /&gt;
* [[E100/E110|E100/E110]]&lt;br /&gt;
* [[B100]]&lt;br /&gt;
&lt;br /&gt;
'''Daughterboards'''&lt;br /&gt;
* [[DBSRX2]]&lt;br /&gt;
* [[TVRX2]]&lt;br /&gt;
* [[XCVR2450]]&lt;/div&gt;</summary>
		<author><name>MartinAnderseck</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP_X410/X440_Getting_Started_Guide&amp;diff=6052</id>
		<title>USRP X410/X440 Getting Started Guide</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=USRP_X410/X440_Getting_Started_Guide&amp;diff=6052"/>
				<updated>2024-08-07T13:19:38Z</updated>
		
		<summary type="html">&lt;p&gt;MartinAnderseck: Changed 30dB attenuation warning from X440 to X410.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Kit Contents==&lt;br /&gt;
===X4x0===&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* NI Ettus USRP X410 or X440&lt;br /&gt;
* DC Power Supply (12V, 20A)&lt;br /&gt;
* 1 Gigabit Ethernet Cat-5e Cable (3m)&lt;br /&gt;
* USB-A to USB-C Cable (1m)&lt;br /&gt;
* Getting Started Guide URL (QR Code)&lt;br /&gt;
* Safety, Environmental, and Regulatory Information&lt;br /&gt;
||[[File:X410.jpg|450px|center]]&lt;br /&gt;
||[[File:X440.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==USRP X440 Design Considerations==&lt;br /&gt;
* https://kb.ettus.com/About_Sampling_Rates_and_Master_Clock_Rates_for_the_USRP_X440&lt;br /&gt;
&lt;br /&gt;
==You Will Need==&lt;br /&gt;
* For Network Mode: A host computer with an available 1 or 10 Gigabit Ethernet interface for sample streaming. In addition to the Ethernet interface used for sampling streaming, your host computer will require a separate 1 Gigabit Ethernet interface for command and control streaming.&lt;br /&gt;
 &lt;br /&gt;
* For Stand-Alone Embedded Mode: A host computer with an available 1 Gigabit Ethernet port or a USB 2.0 port to remotely access the embedded Linux operating system running on ARM CPU.&lt;br /&gt;
&lt;br /&gt;
==Proper Care and Handling==&lt;br /&gt;
&lt;br /&gt;
All Ettus Research products are individually tested before shipment. The USRP is guaranteed to be functional at the time it is received by the customer. Improper use or handling of the USRP can cause the device to become non-functional. Take the following precautions to prevent damage to the unit.&lt;br /&gt;
&lt;br /&gt;
* Never allow metal objects to touch the circuit board while powered.&lt;br /&gt;
* Always properly terminate the transmit port with an antenna or 50Ω load.&lt;br /&gt;
* Always handle the board with proper anti-static methods.&lt;br /&gt;
* Never allow the board to directly or indirectly come into contact with any voltage spikes.&lt;br /&gt;
* Never allow any water or condensing moisture to come into contact with the device.&lt;br /&gt;
* Always use caution with FPGA, firmware, or software modifications.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |X410: Never apply more than +14 dBm continuous &amp;lt;=3GHz, +17 dBm continuous &amp;gt;3GHz, or +20dBm more than 5 minutes &amp;gt;3GHz of power into any RF input.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |X440: Never apply more than +13 dBm continuous &amp;lt;=2.5GHz, +17 dBm continuous between 2.5GHz and 3.6 GHz, or +20dBm continuous between 3.6 GHz and 4 GHz of power into any RF input.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |X410: Always use at least 30dB attenuation if operating in loopback configuration.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Install and Setup the Software Tools on Your Host Computer==&lt;br /&gt;
In order to use your Universal Software Radio Peripheral (USRP™), you must have the software tools correctly installed and configured on your host computer. The easiest way to install USRP Hardware Driver (UHD) is by getting a binary installer package for your operating system as described in the UHD manual about [https://files.ettus.com/manual/page_install.html Binary Installation]. If no binary packages are available for your operating system or you want to modify the sources by yourself, a step-by-step guide is available at the Building and Installing the USRP Open-Source Toolchain (UHD and GNU Radio) on [[Building and Installing the USRP Open-Source Toolchain (UHD and GNU Radio) on Linux|Linux]], [[Building and Installing the USRP Open-Source Toolchain (UHD and GNU Radio) on OS X|OS X]] and [[Building and Installing the USRP Open Source Toolchain (UHD and GNU Radio) on Windows|Windows]] Application Notes.&lt;br /&gt;
&lt;br /&gt;
To find the latest release of UHD, see the UHD repository at https://github.com/EttusResearch/uhd.&lt;br /&gt;
&lt;br /&gt;
The USRP X410 requires UHD version 4.1 or later.&lt;br /&gt;
The USRP X440 requires UHD version 4.5 or later. &lt;br /&gt;
&lt;br /&gt;
'''When you receive a brand-new device, it is strongly recommended that you download the latest filesystem image from the Ettus Research website update the unit. It is not recommended that you use the filesystem from the factory as-is. Instructions on downloading the latest filesystem image and updating it is listed below.'''&lt;br /&gt;
&lt;br /&gt;
'''Note that if you are operating the device in Network Mode, the version of UHD running on the host computer and the USRP X4x0 must match.'''&lt;br /&gt;
&lt;br /&gt;
==Assembling the X4x0==&lt;br /&gt;
Inside the kit you will find the X4x0 and an X4x0 power supply. Plug these in, connect the 1GbE RJ45 interface to your network, and power on the device by pressing the power button.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==The STM32 Microcontroller==&lt;br /&gt;
&lt;br /&gt;
The STM32 microcontroller (also referred to as the &amp;quot;SCU&amp;quot;) controls various low-level features of the X4x0 series motherboard: It controls the power sequencing, reads out fan speeds and some of the temperature sensors. It is connected to the RFSoC via an I2C bus. It is running software based on Chromium EC.&lt;br /&gt;
&lt;br /&gt;
It is possible to log into the STM32 using the serial interface (see Connecting to the Microcontroller). This will allow certain low-level controls, such as remote power cycling should the CPU have become unresponsive for whatever reason.&lt;br /&gt;
&lt;br /&gt;
===Updating the SCU===&lt;br /&gt;
&lt;br /&gt;
The writable SCU image file is stored on the filesystem under /lib/firmware/ni/ec-titanium-revX.RW.bin (where X is a revision compatibility number). To update, simply replace the .bin file with the updated version and reboot.&lt;br /&gt;
&lt;br /&gt;
==eMMC Storage==&lt;br /&gt;
&lt;br /&gt;
The main non-volatile storage of the USRP is a 16 GB eMMC storage. This storage can be made accessible as a USB Mass Storage device through the USB-OTG connector on the back panel.&lt;br /&gt;
&lt;br /&gt;
The entire root file system (Linux kernel, libraries) and any user data are stored on the eMMC. It is partitioned into four partitions:&lt;br /&gt;
&lt;br /&gt;
Boot partition (contains the bootloader). This partition usually does not require modification.&lt;br /&gt;
A data partition, mounted in /data. This is the only partition that is not erased during file system updates.&lt;br /&gt;
Two identical system partitions (root file systems). These contain the operating system and the home directory (anything mounted under / that is not the data or boot partition). The reason there are two of these is to enable remote updates: An update running on one partition can update the other one without any effect to the currently running system. Note that the system partitions are erased during updates and are thus unsuitable for permanently storing information.&lt;br /&gt;
Note: It is possible to access the currently inactive root file system by mounting it. After logging into the device using serial console or SSH (see the following two sections), run the following commands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir temp&lt;br /&gt;
&lt;br /&gt;
$ mount /dev/mmcblk0p3 temp # This assumes mmcblk0p3 is currently not mounted&lt;br /&gt;
&lt;br /&gt;
$ ls temp # You are now accessing the idle partition:&lt;br /&gt;
&lt;br /&gt;
bin   data  etc   lib         media  proc  sbin  tmp    usr&lt;br /&gt;
boot  dev   home  lost+found  mnt    run   sys   uboot  var&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The device node in the mount command might differ, depending on which partition is currently already mounted.&lt;br /&gt;
&lt;br /&gt;
==USB Access to eMMC==&lt;br /&gt;
&lt;br /&gt;
While Mender should be used for routine filesystem updates (see Updating Filesystems), it is also possible to access the X4x0's internal eMMC from an external host over USB. This allows accessing or modifying the filesystem, as well as the ability to flash the device with an entirely new filesystem.&lt;br /&gt;
&lt;br /&gt;
In order to do so, you'll need an external computer with two USB ports, and two USB cables to connect the computer to your X4x0. The instructions below assume a Linux host.&lt;br /&gt;
&lt;br /&gt;
First, connect to the APU serial console at a baud rate of 115200. Boot the device, and stop the boot sequence by typing noautoboot at the prompt. Then, run the following command in the U-boot command prompt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ums 0 mmc 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will start the USB mass storage gadget to expose the eMMC as a USB mass storage device. You should see a spinning indicator on the console, which indicates the gadget is active.&lt;br /&gt;
&lt;br /&gt;
Next, connect your external computer to the X4x0's USB to PS port using an OTG cable. Your computer should recognize the X4x0 as a mass storage device, and you should see an entry in your kernel logs (dmesg) that looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
usb 3-1: New USB device found, idVendor=3923, idProduct=7a7d, bcdDevice= 2.23&lt;br /&gt;
usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0&lt;br /&gt;
usb 3-1: Product: USB download gadget&lt;br /&gt;
usb 3-1: Manufacturer: National Instruments&lt;br /&gt;
sd 6:0:0:0: [sdc] 30932992 512-byte logical blocks: (15.8 GB/14.8 GiB)&lt;br /&gt;
sdc: sdc1 sdc2 sdc3 sdc4&lt;br /&gt;
sd 6:0:0:0: [sdc] Attached SCSI removable disk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The exact output will depend on your machine, but from this log you can see that the X4x0 was recognized and /dev/sdc is the block device representing the eMMC, with 4 partitions detected (see eMMC Storage for details on the partition layout).&lt;br /&gt;
&lt;br /&gt;
It is now possible to treat the X4x0's eMMC as you would any other USB drive: the individual partitions can be mounted and accessed, or the entire block device can be read/written.&lt;br /&gt;
&lt;br /&gt;
Once you're finished accessing the device over USB, the u-boot gadget may be stopped by hitting Ctrl-C at the APU serial console.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Flashing the eMMC ==&lt;br /&gt;
&lt;br /&gt;
Once the X4x0's eMMC is accessible over USB, it's possible to write the filesystem image and thus change the device's filesystem. You can obtain the latest filesystem image by running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uhd_images_downloader -t sdimg -t x4xx&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The output of this command will indicate where the downloaded images were put, or specify a custom location using using the &amp;lt;code&amp;gt;-i INSTALL_LOCATION&amp;lt;/code&amp;gt; argument.&lt;br /&gt;
&lt;br /&gt;
There are 2 ways to write the image to the X4x0's eMMC: using &amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;bmaptool&amp;lt;/code&amp;gt;. Run one of the following commands, replacing &amp;lt;code&amp;gt;/dev/sdX&amp;lt;/code&amp;gt; with the block device of the X4x0's eMMC (found in the device's kernel log or by running &amp;lt;code&amp;gt;lsblk&amp;lt;/code&amp;gt;). Take care to use the correct block device or else you might overwrite the wrong drive!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo dd if=/path/to/usrp_x4xx_fs.sdimg of=/dev/sdX bs=1M&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo bmaptool copy --bmap /path/to/usrp_x4xx_fs.sdimg.bmap /path/to/usrp_x4xx_fs.sdimg /dev/sdX&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The former is generally preferred as it will always work, even if it slower than the latter.&lt;br /&gt;
&lt;br /&gt;
==Using a USRP X4x0 from UHD==&lt;br /&gt;
Like any other USRP, all X4x0 USRPs are controlled by the UHD software. To integrate a USRP X4x0 into your C++ application, you would generate a UHD device in the same way you would for any other USRP:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;auto usrp = uhd::usrp::multi_usrp::make(&amp;quot;type=x4xx&amp;quot;);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For a list of which arguments can be passed into make(), see Section Device Arguments.&lt;br /&gt;
&lt;br /&gt;
==Updating Filesystems==&lt;br /&gt;
&lt;br /&gt;
Mender is a third-party software that enables remote updating of the root file system without physically accessing the device (see also the [https://mender.io/ Mender website]). Mender can be executed locally on the device, or a Mender server can be set up which can be used to remotely update an arbitrary number of USRP devices. Mender servers can be self-hosted, or hosted by Mender (see mender.io for pricing and availability).&lt;br /&gt;
&lt;br /&gt;
When updating the file system using Mender, the tool will overwrite the root file system partition that is not currently mounted (note: the onboard flash storage contains two separate root file system partitions, only one is ever used at a single time). Any data stored on that partition will be permanently lost, including the currently loaded FPGA image. After updating that partition, it will reboot into the newly updated partition. Only if the update is confirmed by the user, the update will be made permanent. This means that if an update fails, the device will be always able to reboot into the partition from which the update was originally launched (which presumably is in a working state). Another update can be launched now to correct the previous, failed update, until it works.&lt;br /&gt;
&lt;br /&gt;
To obtain the file system Mender image (these are files with a &amp;lt;code&amp;gt;.mender&amp;lt;/code&amp;gt; suffix), run the following command on the host computer with Internet access:&lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader -t mender -t x4xx --yes&lt;br /&gt;
&lt;br /&gt;
NOTE: In the output of the command, the folder destination where the images are saved is printed out.&lt;br /&gt;
&lt;br /&gt;
Next, you will need to copy this Mender file system image to the USRP X4xx. This can be done with the Linux utility &amp;lt;code&amp;gt;scp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    $ scp /usr/local/share/uhd/images/usrp_x4xx_fs.mender root@192.168.1.51:~/. &lt;br /&gt;
&lt;br /&gt;
Note: The path and IP may different for your configuration, the command above assumes you're using the default installation path of &amp;lt;code&amp;gt;/usr/local&amp;lt;/code&amp;gt; and that the X4xx's IP is &amp;lt;code&amp;gt;192.168.1.51&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
After copying the Mender file system image to the X4xx, connect to the X4xx using either the Serial Console, or via SSH to gain shell access.&lt;br /&gt;
&lt;br /&gt;
On the X4xx, run &amp;lt;code&amp;gt;mender install /path/to/latest.mender&amp;lt;/code&amp;gt; to update the file system:&lt;br /&gt;
&lt;br /&gt;
    $ mender install /home/root/usrp_x4xx_fs.mender&lt;br /&gt;
&lt;br /&gt;
The artifact can also be stored on a remote server:&lt;br /&gt;
    $ mender install &amp;lt;nowiki&amp;gt;http://server.name/path/to/latest.mender&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This procedure will take a few minutes to complete. After mender has logged a successful update, reboot the device:&lt;br /&gt;
    $ reboot&lt;br /&gt;
&lt;br /&gt;
If the reboot worked, and the device seems functional, commit the changes so that the boot loader knows to permanently boot into this partition:&lt;br /&gt;
    $ mender -commit&lt;br /&gt;
&lt;br /&gt;
To identify the currently installed Mender artifact from the command line, the following file can be queried on the X4x0:&lt;br /&gt;
    $ cat /etc/mender/artifact_info&lt;br /&gt;
&lt;br /&gt;
If you are using a Mender server, the updates can be initiated from a web dashboard. From there, you can start the updates without having to log into the device, and you can update groups of USRPs with a few clicks in a web GUI. The dashboard can also be used to inspect the state of USRPs. This is a simple way to update groups of rack-mounted USRPs with custom file systems.&lt;br /&gt;
&lt;br /&gt;
If you are running a hosted server, the updates can be initiated from a web dashboard. From there, you can start the updates without having to log into the device, and can update groups of USRPs with a few clicks in a web GUI. The dashboard can also be used to inspect the state of USRPs. This is a simple way to update groups of rack-mounted USRPs with custom file systems.&lt;br /&gt;
&lt;br /&gt;
==Network Interfaces==&lt;br /&gt;
The Ettus USRP X4x0 has various network interfaces:&lt;br /&gt;
&lt;br /&gt;
eth0: RJ45 port.&lt;br /&gt;
&lt;br /&gt;
The RJ45 port comes up with a default configuration of DHCP, that will request a network address from your DHCP server (if available on your network). This interface is agnostic of FPGA image flavor.&lt;br /&gt;
&lt;br /&gt;
int0: internal interface for network communication between the embedded ARM processor and FPGA.&lt;br /&gt;
&lt;br /&gt;
The internal network interface is configured with a static address: 169.254.0.1/24. This interface is agnostic of FPGA image flavor.&lt;br /&gt;
&lt;br /&gt;
sfpX [, sfpX_1, sfpX_2, sfpX_3]: QSFP28 network interface(s), up-to four (one per lane) based on implemented protocol.&lt;br /&gt;
&lt;br /&gt;
Each QSFP28 port has four high-speed transceiver lanes. Therefore, depending on the FPGA image flavor, up-to four different network interfaces may exist per QSFP28 port, using the sfpXfor the first lane, and sfpX_1-3 for the other three lanes. Each network interface has a default static IP address. Note that for multi-lane protocols, such as 100 GbE, a single interface is used (sfpX).&lt;br /&gt;
The configuration files for these network interfaces are stored in: &amp;lt;code&amp;gt;/data/network/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! Interface Name&lt;br /&gt;
! Description&lt;br /&gt;
! Default Configuration&lt;br /&gt;
! Configuration File&lt;br /&gt;
! Example: X4_200/X4_400 FPGA image&lt;br /&gt;
|-&lt;br /&gt;
| eth0&lt;br /&gt;
| RJ45&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | DHCP&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | eth0.network&lt;br /&gt;
| DHCP&lt;br /&gt;
|-&lt;br /&gt;
| int0&lt;br /&gt;
| Internal&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | 169.254.0.1/24&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | int0.network&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | 169.254.0.1/24&lt;br /&gt;
|-&lt;br /&gt;
| sfp0&lt;br /&gt;
| QSFP28 0 (4-lanes interface or lane 0)&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | 192.168.10.2/24&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | sfp0.network&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | 192.168.10.2/24&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color:#FFF;&amp;quot; | sfp0_1&lt;br /&gt;
| QSFP28 0 (lane 1)&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | 192.168.11.2/24&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | sfp0_1.network&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | 192.168.11.2/24&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color:#FFF;&amp;quot; | sfp0_2&lt;br /&gt;
| QSFP28 0 (lane 2)&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | 192.168.12.2/24&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | sfp0_2.network&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | 192.168.12.2/24&lt;br /&gt;
|-&lt;br /&gt;
| sfp0_3&lt;br /&gt;
| QSFP28 0 (lane 3)&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | 192.168.13.2/24&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | sfp0_3.network&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | 192.168.13.2/24&lt;br /&gt;
|-&lt;br /&gt;
| sfp1&lt;br /&gt;
| QSFP28 1 (4-lanes interface or lane 0)&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | 192.168.20.2/24&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | sfp1.network&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | N/C&lt;br /&gt;
|-&lt;br /&gt;
| sfp1_1&lt;br /&gt;
| QSFP28 1 (lane 1)&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | 192.168.21.2/24&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | sfp1_1.network&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | N/C&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color:#FFF;&amp;quot; | sfp1_2&lt;br /&gt;
| QSFP28 1 (lane 2)&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | 192.168.22.2/24&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | sfp1_2.network&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | N/C&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color:#FFF;&amp;quot; | sfp1_3&lt;br /&gt;
| QSFP28 1 (lane 3)&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | 192.168.23.2/24&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | sfp1_3.network&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | N/C&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Network Connectivity==&lt;br /&gt;
Once the X4x0 has booted, determine the IP address and verify network connectivity by running uhd_find_devices on the host computer:&lt;br /&gt;
&lt;br /&gt;
X410:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ uhd_find_devices&lt;br /&gt;
&lt;br /&gt;
-- UHD Device 0&lt;br /&gt;
&lt;br /&gt;
Device Address:&lt;br /&gt;
serial: 1234ABC&lt;br /&gt;
addr: 10.2.161.10&lt;br /&gt;
claimed: False&lt;br /&gt;
mgmt_addr: 10.2.161.10&lt;br /&gt;
product: x410&lt;br /&gt;
type: x4xx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
X440:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ uhd_find_devices&lt;br /&gt;
&lt;br /&gt;
-- UHD Device 0&lt;br /&gt;
&lt;br /&gt;
Device Address:&lt;br /&gt;
serial: 1234ABC&lt;br /&gt;
addr: 10.2.161.10&lt;br /&gt;
claimed: False&lt;br /&gt;
mgmt_addr: 10.2.161.10&lt;br /&gt;
product: x440&lt;br /&gt;
type: x4xx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By default, an X4x0 will use DHCP to attempt to find an address.&lt;br /&gt;
&lt;br /&gt;
At this point, you should run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uhd_usrp_probe --args addr=&amp;lt;IP address&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
to ensure functionality of the device.&lt;br /&gt;
&lt;br /&gt;
Note: If you receive the following error:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: RuntimeError: Graph edge list is empty for rx channel 0&amp;lt;/code&amp;gt;&lt;br /&gt;
then you will need to download a UHD-compatible FPGA as described in Updating the FPGA or using the following command (it assumes that FPGA images have been downloaded previously using uhd_images_downloader, or that the command is run on the device itself):&lt;br /&gt;
&lt;br /&gt;
X410:&lt;br /&gt;
&amp;lt;code&amp;gt;uhd_image_loader --args type=x4xx,addr=&amp;lt;ip address&amp;gt;,fpga=X4_200&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
X440:&lt;br /&gt;
&amp;lt;code&amp;gt;uhd_image_loader --args type=x4xx,addr=&amp;lt;ip address&amp;gt;,fpga=X4_400&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When running on the device, use &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; as the IP address.&lt;br /&gt;
&lt;br /&gt;
You can now use existing UHD examples or applications (such as rx_sample_to_file, rx_ascii_art_dft, or tx_waveforms) or other UHD-compatible applications to start receiving and transmitting with the device.&lt;br /&gt;
&lt;br /&gt;
See Network Interfaces for further details on the various network interfaces available on the X4x0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Network Status LEDs===&lt;br /&gt;
The Ettus USRP X4x0 is equipped with status LEDs for its network-capable ports: RJ45 and QSFP28s, see RJ45 LED Behavior and QSFP28 LED Behavior accordingly.&lt;br /&gt;
&lt;br /&gt;
====RJ45 LED Behavior====&lt;br /&gt;
The RJ45 port has two independent LEDs: green (right) and yellow (left). The table below summarizes the LEDs' behavior. Note that link speed indication is not currently supported.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|- style=&amp;quot;font-weight:bold; text-align:center; vertical-align:middle;&amp;quot;&lt;br /&gt;
! Link / Activity&lt;br /&gt;
! Green LED&lt;br /&gt;
! Yellow LED&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | No Link&lt;br /&gt;
| Off&lt;br /&gt;
| Off&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | Link / No Activity&lt;br /&gt;
| On&lt;br /&gt;
| Off&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | Link / Activity&lt;br /&gt;
| On&lt;br /&gt;
| Blinking&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====QSFP28 LED Behavior====&lt;br /&gt;
Each QSFP28 connector has four LEDs, one for each high-speed transceiver lane. The table below summarizes the LEDs' behavior, note that for multi-lane protocols, such as 100 GbE, the corresponding LEDs are ganged together. Within the same image, multiple speeds on the same port (e.g., both 10 GbE and 100 GbE) are not supported, therefore link speed indication is not supported.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|- style=&amp;quot;font-weight:bold; text-align:center; vertical-align:middle;&amp;quot;&lt;br /&gt;
! Link / Activity&lt;br /&gt;
! QSFP28 LED (4 Total)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | No Link&lt;br /&gt;
| Off&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | Link / No Activity&lt;br /&gt;
| Green (solid)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot; | Link / Activity&lt;br /&gt;
| Amber (blinking)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Security-related Settings==&lt;br /&gt;
The X4x0 ships without a root password set. It is possible to ssh into the device by simply connecting as root, and thus gaining access to all subsystems. To set a password, run the command&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$ passwd&amp;lt;/code&amp;gt;&lt;br /&gt;
on the device.&lt;br /&gt;
&lt;br /&gt;
==Serial Connection==&lt;br /&gt;
It is possible to gain access to the device using a serial terminal emulator. To do so, the USB debug port needs to be connected to a separate computer to gain access. Most Linux, OSX, or other Unix flavors have a tool called 'screen' which can be used for this purpose, by running the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$ sudo screen /dev/ttyUSB2 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
In this command, we prepend 'sudo' to elevate user privileges (by default, accessing serial ports is not available to regular users), we specify the device node (in this case, /dev/ttyUSB2), and the baud rate (115200).&lt;br /&gt;
&lt;br /&gt;
The exact device node depends on your operating system's driver and other USB devices that might be already connected. Modern Linux systems offer alternatives to simply trying device nodes; instead, the OS might have a directory of symlinks under /dev/serial/by-id:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;$ ls /dev/serial/by-id&lt;br /&gt;
usb-Digilent_Digilent_USB_Device_2516351DDCC0-if02-port0&lt;br /&gt;
usb-Digilent_Digilent_USB_Device_2516351DDCC0-if03-port0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: Exact names depend on the host operating system version and may differ.&lt;br /&gt;
&lt;br /&gt;
The first (with the if02 suffix) connects to the STM32 microcontroller (SCU), whereas the second (with the if03 suffix) connects to Linux running on the RFSoC APU.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$ sudo screen /dev/serial/by-id/usb-Digilent_Digilent_USB_Device_2516351DDCC0-if03-port0 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
After entering the username root (no password is set by default), you should be presented with a shell prompt similar to the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;root@ni-x4xx-1234ABC:~#&amp;lt;/code&amp;gt;&lt;br /&gt;
On this prompt, you can enter any Linux command available. Using the default configuration, the serial console will also show all kernel log messages (unlike when using SSH, for example), and give access to the boot loader (U-boot prompt). This can be used to debug kernel or bootloader issues more efficiently than when logged in via SSH.&lt;br /&gt;
&lt;br /&gt;
==Connecting to the Microcontroller==&lt;br /&gt;
The microcontroller (which controls the power sequencing, among other things) also has a serial console available. To connect to the microcontroller, use the other UART device. In the example above:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$ sudo screen /dev/serial/by-id/usb-Digilent_Digilent_USB_Device_2516351DDCC0-if02-port0 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It provides a very simple prompt. The command 'help' will list all available commands. A direct connection to the microcontroller can be used to hard-reset the device without physically accessing it and other low-level diagnostics. For example, running the command reboot will emulate a reset button press, resetting the state of the device, while the command powerbtn will emulate a power button press, turning the device back on again.&lt;br /&gt;
&lt;br /&gt;
==SSH Connection==&lt;br /&gt;
The USRP X4x0 has two network connections: The dual QSFP28 ports, and an RJ45 connector. The latter is by default configured by DHCP; by plugging it into into 1 Gigabit switch on a DHCP-capable network, it will get assigned an IP address and thus be accessible via ssh.&lt;br /&gt;
&lt;br /&gt;
In case your network setup does not include a DHCP server, refer to the section Serial Connection. A serial login can be used to assign an IP address manually.&lt;br /&gt;
&lt;br /&gt;
After the device obtained an IP address you can log in from a Linux or OSX machine by typing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$ ssh root@ni-x4xx-1234ABC # Replace with your actual device name!&amp;lt;/code&amp;gt;&lt;br /&gt;
Depending on your network setup, using a .local domain may work:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$ ssh root@ni-x4xx-1234ABC.local&amp;lt;/code&amp;gt;&lt;br /&gt;
Of course, you can also connect to the IP address directly if you know it (or set it manually using the serial console).&lt;br /&gt;
&lt;br /&gt;
Note: The device's hostname is derived from its serial number by default (&amp;lt;code&amp;gt;ni-x4xx-$SERIAL&amp;lt;/code&amp;gt;). You can change the hostname by creating the file &amp;lt;code&amp;gt;/data/network/hostname&amp;lt;/code&amp;gt;, saving the desired hostname in it, then rebooting.&lt;br /&gt;
&lt;br /&gt;
On Microsoft Windows, the connection can be established using a tool such as PuTTY, by selecting a username of root without password.&lt;br /&gt;
&lt;br /&gt;
Like with the serial console, you should be presented with a prompt like the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;root@ni-x4xx-1234ABC:~#&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Autoboot ==&lt;br /&gt;
&lt;br /&gt;
The USRP X4x0 can be configured to power on and boot automatically when power is applied. This setting can be controlled using the &amp;lt;code&amp;gt;eeprom-set-autoboot&amp;lt;/code&amp;gt; script. This script is executed directly on the USRP X4x0. To enable autoboot, run &amp;lt;code&amp;gt;eeprom-set-autoboot on&amp;lt;/code&amp;gt;; to disable autoboot, run &amp;lt;code&amp;gt;eeprom-set-autoboot off&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Updating the FPGA==&lt;br /&gt;
&lt;br /&gt;
The FPGA can be updated simply using uhd_image_loader:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uhd_image_loader --args type=x4xx,addr=&amp;lt;IP address of device&amp;gt; --fpga-path &amp;lt;path to .bit&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uhd_image_loader --args type=x4xx,addr=&amp;lt;IP address of device&amp;gt;,fpga=FPGA_TYPE&amp;lt;/code&amp;gt;&lt;br /&gt;
A UHD install will likely have pre-built images in /usr/share/uhd/images/. Up-to-date images can be downloaded using the uhd_images_downloader script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uhd_images_downloader&amp;lt;/code&amp;gt;&lt;br /&gt;
will download images into /usr/share/uhd/images/ (the path may differ, depending on how UHD was installed).&lt;br /&gt;
&lt;br /&gt;
Also note that the USRP already ships with compatible FPGA images on the device - these images can be loaded by SSH'ing into the device and running:&lt;br /&gt;
&lt;br /&gt;
X410:&lt;br /&gt;
&amp;lt;code&amp;gt;uhd_image_loader --args type=x4xx,mgmt_addr=127.0.0.1,fpga=X4_200&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
X440:&lt;br /&gt;
&amp;lt;code&amp;gt;uhd_image_loader --args type=x4xx,mgmt_addr=127.0.0.1,fpga=X4_400&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FPGA Image Flavors==&lt;br /&gt;
Unlike the USRP X310 or other third-generation USRP devices, the FPGA image flavors do not only encode how the QSFP28 connectors are configured, but also which master clock rates are available. This is because the data converter configuration is part of the FPGA image (the ADCs/DACs on the X4x0 are on the same die as the FPGA). The image flavors consist of two short strings, separated by an underscore, e.g. X4_200 (X410) or X4_400 (X440) is an image flavor which contains 4x 10 GbE, and can handle an analog bandwidth of 200 MHz or 400 MHz respectively. The first two characters describe the configuration of the QSFP28 ports: 'X' stands for 10 GbE, 'C' stands for 100 GbE. For details see [https://files.ettus.com/manual/page_usrp_x4xx.html#x4xx_updating_fpga_types FPGA Image Flavor] in the [https://files.ettus.com/manual USRP Hardware Driver and USRP Manual].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The analog bandwidth determines the available master clock rates. &lt;br /&gt;
&lt;br /&gt;
X410: As of UHD 4.1, only the X4_200 image is shipped with UHD, which allows a 245.76 MHz or 250 MHz master clock rate. With UHD 4.2, the CG_400 image was added allowing for 491.52 MHz and 500 MHz master clock rates. With UHD 4.5, the UC_200 image (245.76 MHz and 250 MHz master clock rate) was added.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
X440: As of UHD 4.5, UHD ships with X4_400, X4_1600, CG_400 and CG_1600 images. The X4_400 and CG_400 images allow master clock rates between 125 MHz and 512 MHz and the usage of all 8 channels while the X4_1600 and CG_1600 images allow master clock rates between 125 MHz and 2048 MHz but only the usage of channels 0 and 4.&lt;br /&gt;
&lt;br /&gt;
Any other images are considered experimental (unsupported).&lt;br /&gt;
&lt;br /&gt;
==Device Arguments==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;vertical-align:middle;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;&lt;br /&gt;
! Key&lt;br /&gt;
! Description&lt;br /&gt;
! Example Value&lt;br /&gt;
|-&lt;br /&gt;
| addr&lt;br /&gt;
| IPv4 address of primary SFP+ port to connect to.&lt;br /&gt;
| addr=192.168.30.2&lt;br /&gt;
|-&lt;br /&gt;
| second_addr&lt;br /&gt;
| IPv4 address of secondary SFP+ port to connect to.&lt;br /&gt;
| second_addr=192.168.40.2&lt;br /&gt;
|-&lt;br /&gt;
| mgmt_addr&lt;br /&gt;
| IPv4 address or hostname to which to connect the RPC client. Defaults to `addr'.&lt;br /&gt;
| mgmt_addr=ni-sulfur-311FE00&lt;br /&gt;
|-&lt;br /&gt;
| find_all&lt;br /&gt;
| When using broadcast, find all devices, even if unreachable via CHDR.&lt;br /&gt;
| find_all=1&lt;br /&gt;
|-&lt;br /&gt;
| master_clock_rate&lt;br /&gt;
| Master Clock Rate in Hz.&lt;br /&gt;
| master_clock_rate=250e6&lt;br /&gt;
|-&lt;br /&gt;
| converter_rate&lt;br /&gt;
| Converter Rate in Hz. Only X440 and together with master_clock_rate.&lt;br /&gt;
| master_clock_rate=250e6,converter_rate=1000e6&lt;br /&gt;
|-&lt;br /&gt;
| serialize_init&lt;br /&gt;
| Force serial initialization of daughterboards.&lt;br /&gt;
| serialize_init=1&lt;br /&gt;
|-&lt;br /&gt;
| skip_init&lt;br /&gt;
| Skip the initialization process for the device.&lt;br /&gt;
| skip_init=1&lt;br /&gt;
|-&lt;br /&gt;
| time_source&lt;br /&gt;
| Specify the time (PPS) source.&lt;br /&gt;
| time_source=internal&lt;br /&gt;
|-&lt;br /&gt;
| clock_source&lt;br /&gt;
| Specify the reference clock source.&lt;br /&gt;
| clock_source=internal&lt;br /&gt;
|-&lt;br /&gt;
| ref_clk_freq&lt;br /&gt;
| Specify the external reference clock frequency, default is 10 MHz.&lt;br /&gt;
| ref_clk_freq=20e6&lt;br /&gt;
|-&lt;br /&gt;
| discovery_port&lt;br /&gt;
| Override default value for MPM discovery port.&lt;br /&gt;
| discovery_port=49700&lt;br /&gt;
|-&lt;br /&gt;
| rpc_port&lt;br /&gt;
| Override default value for MPM RPC port.&lt;br /&gt;
| rpc_port=49701&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This is only a subset of the existing device arguments. For a complete list please consult the [https://files.ettus.com/manual/page_usrp_x4xx.html#x4xx_usage_args UHD user manual of the X4x0 device series]. &lt;br /&gt;
&lt;br /&gt;
==GPS==&lt;br /&gt;
&lt;br /&gt;
The USRP X4x0 includes a Jackson Labs LTE-Lite GPS module. Its antenna port is on the rear panel (see Front and Back Panels). When the X4x0 has access to GPS satellite signals, it can use this module to read out the current GPS time and location as well as to discipline an onboard OCXO.&lt;br /&gt;
&lt;br /&gt;
To use the GPS as a clock and time reference, simply use gpsdo as a clock or time source. Alternatively, set gpsdo as a synchronization source:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Set clock/time individually:&lt;br /&gt;
usrp-&amp;gt;set_clock_source(&amp;quot;gpsdo&amp;quot;);&lt;br /&gt;
usrp-&amp;gt;set_time_source(&amp;quot;gpsdo&amp;quot;);&lt;br /&gt;
// This is equivalent to the previous commands, but faster, as it sets&lt;br /&gt;
// both settings simultaneously and avoids duplicating settings that are shared&lt;br /&gt;
// between these calls.&lt;br /&gt;
usrp-&amp;gt;set_sync_source(&amp;quot;clock_source=gpsdo,time_source=gpsdo&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note the GPS module is not always enabled. Its power-on status can be queried using the gps_enabled GPS sensor (see also The Sensor API). When disabled, none of the sensors will return useful (if any) values.&lt;br /&gt;
&lt;br /&gt;
When selecting gpsdo as a clock source, the GPS will always be enabled. Note that acquiring a GPS lock can take some time after enabling the GPS, so if a UHD application is enabling the GPS dynamically, it might take some time before a GPS lock is reported.&lt;br /&gt;
&lt;br /&gt;
==Front-Panel Programmable GPIOs==&lt;br /&gt;
&lt;br /&gt;
The USRP X4x0 has two HDMI front-panel connectors, which are connected to the FPGA. For a &lt;br /&gt;
description of the GPIO control API, see the&lt;br /&gt;
[https://files.ettus.com/manual/page_x400_gpio_api.html USRP X4x0 GPIO UHD Manual Entry],&lt;br /&gt;
[https://files.ettus.com/manual/page_usrp_x4xx.html#x4xx_usage_gpio the USRP X4x0 Series Manual],&lt;br /&gt;
the [https://files.ettus.com/manual/page_zbx.html#zbx_atr ZBX ATR section] (X410) and the&lt;br /&gt;
[https://files.ettus.com/manual/page_fbx.html#fbx_atr FBX ATR section] (X440).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Subdev Specifications==&lt;br /&gt;
&lt;br /&gt;
The RF ports on the front panel of the X410 + ZBX correspond to the following subdev specifications:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! Label&lt;br /&gt;
! style=&amp;quot;text-align:center; vertical-align:middle; font-weight:bold;&amp;quot; | Subdev Spec&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot;&lt;br /&gt;
| DB 0 / RF 0&lt;br /&gt;
| A:0&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot;&lt;br /&gt;
| DB 0 / RF 1&lt;br /&gt;
| A:1&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot;&lt;br /&gt;
| DB 1 / RF 0&lt;br /&gt;
| B:0&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot;&lt;br /&gt;
| DB 1 / RF 1&lt;br /&gt;
| B:1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The RF ports on the front panel of the X440 + FBX correspond to the following subdev specifications (for xx_400 FPGA images):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! Label&lt;br /&gt;
! style=&amp;quot;text-align:center; vertical-align:middle; font-weight:bold;&amp;quot; | Subdev Spec&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot;&lt;br /&gt;
| DB 0 / RF 0&lt;br /&gt;
| A:0&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot;&lt;br /&gt;
| DB 0 / RF 1&lt;br /&gt;
| A:1&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot;&lt;br /&gt;
| DB 0 / RF 2&lt;br /&gt;
| A:2&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot;&lt;br /&gt;
| DB 0 / RF 3&lt;br /&gt;
| A:3&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot;&lt;br /&gt;
| DB 1 / RF 0&lt;br /&gt;
| B:0&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot;&lt;br /&gt;
| DB 1 / RF 1&lt;br /&gt;
| B:1&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot;&lt;br /&gt;
| DB 1 / RF 2&lt;br /&gt;
| B:2&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle; background-color:#FFF;&amp;quot;&lt;br /&gt;
| DB 1 / RF 3&lt;br /&gt;
| B:3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When using a xx_1600 FPGA image on X440, only A:0 and B:0 are available.&lt;br /&gt;
&lt;br /&gt;
The subdev spec slot identifiers &amp;quot;A&amp;quot; and &amp;quot;B&amp;quot; are not reflected on the front panel. They were set to match valid subdev specifications of previous USRPs, maintaining backward compatibility.&lt;br /&gt;
&lt;br /&gt;
These values can be used for uhd::usrp::multi_usrp::set_rx_subdev_spec() and uhd::usrp::multi_usrp::set_tx_subdev_spec() as with other USRPs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rear Panel Status LEDs==&lt;br /&gt;
&lt;br /&gt;
The USRP X4x0 is equipped with four LEDs located on the device's rear panel. Each LED supports four different states: Off, Green, Red, and Amber. One LED (PWR) indicates the device's power state (see Power LED below). The other three LEDs (LED 0, LED 1, and LED 2) are user-configurable, different behaviors are supported for each of these LEDs (see User-configurable LEDs below).&lt;br /&gt;
&lt;br /&gt;
[[File:x4xx_rearpanel_status_leds.png|125px]]&lt;br /&gt;
&lt;br /&gt;
===X4x0 Rear Panel Status LEDs===&lt;br /&gt;
Power LED&lt;br /&gt;
The USRP X4x0's PWR LED is reserved to visually indicate the user the device's power state. Power LED Behavior describes what each LED state represents.&lt;br /&gt;
&lt;br /&gt;
===Power LED Behavior===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#FFF;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;&lt;br /&gt;
! PWR LED State&lt;br /&gt;
! style=&amp;quot;vertical-align:middle;&amp;quot; | Meaning&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle;&amp;quot;&lt;br /&gt;
| Off&lt;br /&gt;
| No power is applied&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle;&amp;quot;&lt;br /&gt;
| Amber&lt;br /&gt;
| Power is good but X4x0 is powered off&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle;&amp;quot;&lt;br /&gt;
| Green&lt;br /&gt;
| Power is good and X4x0 is powered on&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle;&amp;quot;&lt;br /&gt;
| Red&lt;br /&gt;
| Power error state&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===User-configurable LEDs===&lt;br /&gt;
The USRP X4x0's user-configurable rear panel status LEDs (LED 0, LED 1, and LED 2) allow the user to have visual indication of various device conditions. Supported LED Behaviors provides a complete list of the supported behaviors for each user-configurable LED. By default, these LEDs are configured as described in LEDs Default Behavior.&lt;br /&gt;
&lt;br /&gt;
The user may alter the default LEDs behavior either temporarily or persistently, see the Temporarily change the LED Behavior or Persistently in the UHD manual to change the LED Behavior accordingly.&lt;br /&gt;
&lt;br /&gt;
https://files.ettus.com/manual/page_usrp_x4xx.html&lt;br /&gt;
&lt;br /&gt;
==Technical Support and Community Knowledge Base==&lt;br /&gt;
Technical support for USRP hardware is available through email only. If the product arrived in a non­functional state or you require technical assistance, please contact [mailto:support@ettus.com support@ettus.com]. Please allow 24 to 48 hours for response by email, depending on holidays and weekends, although we are often able to reply more quickly than that.&lt;br /&gt;
&lt;br /&gt;
We also recommend that you subscribe to the community mailing lists. The mailing lists have a responsive and knowledgeable community of hundreds of developers and technical users who are located around the world. When you join the community, you will be connected to this group of people who can help you learn about SDR and respond to your technical and specific questions. Often your question can be answered quickly on the mailing lists. Each mailing list also provides an archive of all past conversations and discussions going back many years. Your question or problem may have already been addressed before, and a relevant or helpful solution may already exist in the archive.&lt;br /&gt;
&lt;br /&gt;
Discussions involving the USRP hardware and the UHD software itself are best addressed through the '''u​srp­-users''' ​mailing list at [http://usrp-users.ettus.com http://usrp-users.ettus.com].&lt;br /&gt;
&lt;br /&gt;
Discussions involving the use of [http://gnuradio.org/ GNU Radio] with USRP hardware and UHD software are best addressed through the '''d​iscuss­-gnuradio'''​ mailing list at [https://lists.gnu.org/mailman/listinfo/discuss­gnuradio https://lists.gnu.org/mailman/listinfo/discuss­gnuradio]​.&lt;br /&gt;
&lt;br /&gt;
Discussions involving the use of [http://openbts.org/ OpenBTS®] with USRP hardware and UHD software are best addressed through the '''o​penbts­-discuss​''' mailing list at [https://lists.sourceforge.net/lists/listinfo/openbts­discuss​ https://lists.sourceforge.net/lists/listinfo/openbts­discuss​].​&lt;br /&gt;
&lt;br /&gt;
The support page on our website is located at [https://www.ettus.com/support https://www.ettus.com/support]​. The Knowledge Base is located at ​[https://kb.ettus.com https://kb.ettus.com]​.&lt;br /&gt;
&lt;br /&gt;
==Legal Considerations==&lt;br /&gt;
Every country has laws governing the transmission and reception of radio signals. Users are solely responsible for insuring they use their USRP system in compliance with all applicable laws and regulations. Before attempting to transmit and/or receive on any frequency, we recommend that you determine what licenses may be required and what restrictions may apply.&lt;br /&gt;
&lt;br /&gt;
*NOTE: This USRP product is a piece of test equipment.&lt;br /&gt;
&lt;br /&gt;
==Sales and Ordering Support==&lt;br /&gt;
If you have any non­-technical questions related to your order, then please contact us by email at [mailto:orders@ettus.com orders@ettus.com]​, or by phone at +1­408­610­6399 (Monday-Friday, 8 AM - 5 PM, Pacific Time). Please be sure to include your order number and the serial number of your USRP.&lt;br /&gt;
&lt;br /&gt;
==Terms and Conditions of Sale==&lt;br /&gt;
Terms and conditions of sale can be accessed online at the following link: http://www.ettus.com/legal/terms-and-conditions-of-sale&lt;br /&gt;
&lt;br /&gt;
[[Category:Getting Started Guides]]&lt;br /&gt;
[[Category:X4x0]]&lt;/div&gt;</summary>
		<author><name>MartinAnderseck</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Building_and_Installing_the_USRP_Open-Source_Toolchain_(UHD_and_GNU_Radio)_on_Linux&amp;diff=6022</id>
		<title>Building and Installing the USRP Open-Source Toolchain (UHD and GNU Radio) on Linux</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Building_and_Installing_the_USRP_Open-Source_Toolchain_(UHD_and_GNU_Radio)_on_Linux&amp;diff=6022"/>
				<updated>2024-02-22T10:59:01Z</updated>
		
		<summary type="html">&lt;p&gt;MartinAnderseck: Add Ubuntu 22 dependencies, removing dependencies for Ubuntu 14.04 (will reach end of life in April this year and doesn't have standard support for years already), 15.*, 17.* and 18.10 (all three no LTS versions)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Application Note Number==&lt;br /&gt;
'''AN-445'''&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This Application Note provides a comprehensive guide for building, installing, and maintaining the open-source toolchain for the USRP (UHD and GNU Radio) from source code on the Linux platform. The Ubuntu and Fedora distributions are specifically discussed. Several other alternate installation methods are also discussed.&lt;br /&gt;
&lt;br /&gt;
http://files.ettus.com/manual/page_build_guide.html#build_instructions_unix&lt;br /&gt;
&lt;br /&gt;
==UHD on Linux==&lt;br /&gt;
&lt;br /&gt;
UHD is fully supported on Linux, using the GCC compiler, and should work on most major Linux distributions.&lt;br /&gt;
&lt;br /&gt;
==Devices==&lt;br /&gt;
This document applies only to the USRP X300, X310, B200, B210, B200mini, N200, N210 devices. The E310 and E312 devices are embedded devices, and are fundamentally different from the other non-embedded USRP devices, and are not addressed by this document.&lt;br /&gt;
&lt;br /&gt;
==Install Linux==&lt;br /&gt;
&lt;br /&gt;
If you already have a recent version of Linux installed, then you may be able to skip this section. If you are starting from scratch, or simply want to start with a fresh new installation of Linux, then please follow the instructions and recommendations in this section.&lt;br /&gt;
&lt;br /&gt;
We suggest that you use either Ubuntu 16.04.5, Ubuntu 18.04, Ubuntu 18.10, Fedora 27, 28, 29, and that you use a 64-bit architecture, not a 32-bit architecture. There are several re-spins of Ubuntu, such as Xubuntu, Lubuntu, Kubuntu, Linux Mint, all of which should also work. For the purposes of this document, these re-spins can be considered equivalent. Both Ubuntu and Fedora are known to work well with UHD and GNU Radio.&lt;br /&gt;
&lt;br /&gt;
Download and install Ubuntu, Xubuntu, Linux Mint, or Fedora from the links below. Download the appropriate ISO image, and write it to a USB flash drive. Be sure to verify that the ISO file was not corrupted during the download process by checking the MD5 and/or SHA1 hash.&lt;br /&gt;
&lt;br /&gt;
* [http://www.ubuntu.com/download/desktop Ubuntu download page]&lt;br /&gt;
* [http://www.xubuntu.org/getxubuntu/ Xubuntu download page]&lt;br /&gt;
* [https://www.linuxmint.com/download.php Linux Mint download page]&lt;br /&gt;
* [https://getfedora.org/en/workstation/download/ Fedora download page]&lt;br /&gt;
&lt;br /&gt;
You can learn more about Ubuntu, Xubuntu, Linux Mint, and Fedora at the links below.&lt;br /&gt;
&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Ubuntu_%28operating_system%29 Wikipedia article on Ubuntu]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Xubuntu Wikipedia article on Xubuntu]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Linux_Mint Wikipedia article on Linux Mint]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Fedora_%28operating_system%29 Wikipedia article on Fedora]&lt;br /&gt;
&lt;br /&gt;
There are many tools for writing an ISO image to a USB flash drive. In Linux, you can use the &amp;quot;dd&amp;quot; utility, or the UNetbootin utility. On Ubuntu systems, there is also the Startup Disk Creator utility as well.&lt;br /&gt;
&lt;br /&gt;
* [http://unetbootin.sourceforge.net/ UNetbootin homepage]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/UNetbootin Wikipedia article on UNetbootin]&lt;br /&gt;
&lt;br /&gt;
* [https://launchpad.net/usb-creator Startup Disk Creator homepage]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Startup_Disk_Creator Wikipedia article on Startup Disk Creator]&lt;br /&gt;
* [http://www.ubuntu.com/download/desktop/create-a-usb-stick-on-ubuntu Article about Startup Disk Creator]&lt;br /&gt;
&lt;br /&gt;
Be sure to use a USB flash drive with at least 8 GB capacity, and use a USB 3.0 flash drive, not a USB 2.0 flash drive. If you use a slower USB 2.0 flash drive, then the install process will take significantly longer.&lt;br /&gt;
&lt;br /&gt;
==Update and Install dependencies==&lt;br /&gt;
&lt;br /&gt;
Before building UHD and GNU Radio, you need to make sure that all the dependencies are first installed.&lt;br /&gt;
&lt;br /&gt;
However, before installing any dependencies, you should first make sure that all the packages that are already installed on your system are up-to-date. You can do this from a GUI, or from the command-line, as shown below.&lt;br /&gt;
&lt;br /&gt;
On Ubuntu systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get update&lt;br /&gt;
&lt;br /&gt;
On Fedora 21 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo yum update&lt;br /&gt;
&lt;br /&gt;
On Fedora 22, 23, 24 and 25 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo dnf update&lt;br /&gt;
&lt;br /&gt;
Once the system has been updated, then install the required dependencies for UHD and GNU Radio.&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 22.04 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install autoconf automake build-essential ccache cmake cpufrequtils doxygen ethtool fort77 g++ gir1.2-gtk-3.0 git gobject-introspection gpsd gpsd-clients inetutils-tools libasound2-dev libboost-all-dev libcomedi-dev libcppunit-dev libfftw3-bin libfftw3-dev libfftw3-doc libfontconfig1-dev libgmp-dev libgps-dev libgsl-dev liblog4cpp5-dev libncurses5 libncurses5-dev libpulse-dev libqt5opengl5-dev libqwt-qt5-dev libsdl1.2-dev libtool libudev-dev libusb-1.0-0 libusb-1.0-0-dev libusb-dev libxi-dev libxrender-dev libzmq3-dev libzmq5 ncurses-bin python3-cheetah python3-click python3-click-plugins python3-click-threading python3-dev python3-docutils python3-gi python3-gi-cairo python3-gps python3-lxml python3-mako python3-numpy python3-opengl python3-pyqt5 python3-requests python3-scipy python3-setuptools python3-six python3-sphinx python3-yaml python3-zmq python3-ruamel.yaml swig wget&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 20.04 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install autoconf automake build-essential ccache cmake cpufrequtils doxygen ethtool fort77 g++ gir1.2-gtk-3.0 git gobject-introspection gpsd gpsd-clients inetutils-tools libasound2-dev libboost-all-dev libcomedi-dev libcppunit-dev libfftw3-bin libfftw3-dev libfftw3-doc libfontconfig1-dev libgmp-dev libgps-dev libgsl-dev liblog4cpp5-dev libncurses5 libncurses5-dev libpulse-dev libqt5opengl5-dev libqwt-qt5-dev libsdl1.2-dev libtool libudev-dev libusb-1.0-0 libusb-1.0-0-dev libusb-dev libxi-dev libxrender-dev libzmq3-dev libzmq5 ncurses-bin python3-cheetah python3-click python3-click-plugins python3-click-threading python3-dev python3-docutils python3-gi python3-gi-cairo python3-gps python3-lxml python3-mako python3-numpy python3-numpy-dbg python3-opengl python3-pyqt5 python3-requests python3-scipy python3-setuptools python3-six python3-sphinx python3-yaml python3-zmq python3-ruamel.yaml swig wget&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 18.04 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-1.14-0 libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libqwt6abi1 libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev libncurses5-dbg libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-dev libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk3.0 git libqt4-dev python-numpy ccache python-opengl libgsl-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwtplot3d-qt5-dev pyqt4-dev-tools python-qwt5-qt4 cmake git wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq3-dev libzmq5 python-requests python-sphinx libcomedi-dev python-zmq libqwt-dev libqwt6abi1 python-six libgps-dev libgps23 gpsd gpsd-clients python-gps python-setuptools&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 16.04 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-1.13-0v5 libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libqwt6abi1 libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev libncurses5-dbg libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-dev libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk3.0 git-core libqt4-dev python-numpy ccache python-opengl libgsl-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwt5-qt4-dev libqwtplot3d-qt4-dev pyqt4-dev-tools python-qwt5-qt4 cmake git-core wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq-dev libzmq1 python-requests python-sphinx libcomedi-dev python-zmq python-setuptools&lt;br /&gt;
&lt;br /&gt;
On Fedora 21 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo yum -y groupinstall &amp;quot;Engineering and Scientific&amp;quot; &amp;quot;Development Tools&amp;quot; &amp;quot;Software Development Tools&amp;quot; &amp;quot;C Development Tools and Libraries&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    sudo yum -y install fftw-devel cppunit-devel wxPython-devel boost-devel alsa-lib-devel numpy gsl-devel python-devel pygsl python-cheetah python-mako python-lxml PyOpenGL qt-devel qt qt4 qt4-devel PyQt4-devel qwt-devel qwtplot3d-qt4-devel libusbx-devel cmake git wget python-docutils cppzmq-devel PyQwt PyQwt-devel qwt-devel gtk2-engines xmlrpc-c-&amp;quot;*&amp;quot; tkinter orc orc-devel python-sphinx SDL-devel swig  zeromq2-devel python-zmq comedilib comedilib-devel thrift-devel python-thrift scipy zeromq zeromq-devel&lt;br /&gt;
			  &lt;br /&gt;
On Fedora 22, 23, 24 and 25 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo dnf -y groupinstall &amp;quot;Engineering and Scientific&amp;quot; &amp;quot;Development Tools&amp;quot; &amp;quot;C Development Tools and Libraries&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
    sudo dnf -y install fftw-devel cppunit-devel wxPython-devel boost-devel alsa-lib-devel numpy gsl-devel python-devel pygsl python-cheetah python-mako python-lxml PyOpenGL qt-devel PyQt4-devel qwt-devel qwtplot3d-qt4-devel libusbx-devel cmake python-docutils PyQwt PyQwt-devel gtk2-engines xmlrpc-c-&amp;quot;*&amp;quot; tkinter orc-devel python-sphinx SDL-devel swig perl-ZMQ-LibZMQ2 perl-ZMQ-LibZMQ2 zeromq zeromq-devel python-requests gcc-c++ doxygen zeromq-ada-devel cppzmq-devel perl-ZeroMQ amavisd-new-zeromq amavisd-new-snmp-zeromq php-zmq python-zmq czmq uwsgi-logger-zeromq comedilib comedilib-devel pygtk2 ncurses-&amp;quot;*&amp;quot; thrift-devel python-thrift scipy&lt;br /&gt;
&lt;br /&gt;
After installing the dependencies, you should reboot the system.&lt;br /&gt;
&lt;br /&gt;
If the installation of the dependencies completes without any errors, then you can proceed to build and install UHD and GNU Radio.&lt;br /&gt;
&lt;br /&gt;
==Building and installing UHD from source code==&lt;br /&gt;
&lt;br /&gt;
UHD is open-source, and is hosted on GitHub. You can browse the code online at the link below, which points to version 3.14.0.0, which is the the latest release at the time of this writing.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/EttusResearch/uhd/tree/v3.14.0.0 UHD repository on GitHub]&lt;br /&gt;
&lt;br /&gt;
There are several good reasons to build GNU Radio from source code, especially for doing development and prototyping. It it enables an easy way to customize the location of the installation, and to install multiple UHD versions in parallel, and switch between them. It also provides much more flexibility in upgrading and downgrading versions, and allows the user to modify the code and create customized versions, which could possibly include a patch or other bug-fix.&lt;br /&gt;
&lt;br /&gt;
To build UHD from source code, clone the GitHub repository, check out a branch or tagged release of the repository, and build and install. Please follow the steps below. Make sure that no USRP device is connected to the system at this point.&lt;br /&gt;
&lt;br /&gt;
First, make a folder to hold the repository.&lt;br /&gt;
&lt;br /&gt;
    cd $HOME&lt;br /&gt;
    mkdir workarea&lt;br /&gt;
    cd workarea&lt;br /&gt;
&lt;br /&gt;
Next, clone the repository and change into the cloned directory.&lt;br /&gt;
&lt;br /&gt;
    git clone &amp;lt;nowiki&amp;gt;https://github.com/EttusResearch/uhd&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
    cd uhd&lt;br /&gt;
&lt;br /&gt;
Next, checkout the desired UHD version. You can get a full listing of tagged releases by running the command:&lt;br /&gt;
&lt;br /&gt;
    git tag -l&lt;br /&gt;
&lt;br /&gt;
''Example truncated output of &amp;lt;code&amp;gt;git tag -l&amp;lt;/code&amp;gt;:''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git tag -l&lt;br /&gt;
...&lt;br /&gt;
release_003_009_004&lt;br /&gt;
release_003_009_005&lt;br /&gt;
release_003_010_000_000&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note''': As of UHD Version 3.10.0.0, the versioning scheme has changed to be a quadruplet format. Each element and version will follow the format of: '''Major.API.ABI.Patch'''. Additional details on this versioning change can be found [https://files.ettus.com/manual/page_semver.html here]. &lt;br /&gt;
&lt;br /&gt;
After identifying the version and corresponding release tag you need, check it out:&lt;br /&gt;
&lt;br /&gt;
    # Example: For UHD 3.9.5:&lt;br /&gt;
    git checkout release_003_009_005&lt;br /&gt;
&lt;br /&gt;
    # Example: For UHD 3.14.0.0&lt;br /&gt;
    git checkout v3.14.0.0&lt;br /&gt;
&lt;br /&gt;
Next, create a build folder within the repository.&lt;br /&gt;
&lt;br /&gt;
    cd host&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
&lt;br /&gt;
Next, invoke CMake.&lt;br /&gt;
&lt;br /&gt;
    cmake ..&lt;br /&gt;
&lt;br /&gt;
'''Note''': By default, UHD will be installed into the prefix &amp;lt;code&amp;gt;/usr/local&amp;lt;/code&amp;gt;. This can be changed by adding &amp;lt;code&amp;gt;-DCMAKE_INSTALL_PREFIX=XXX&amp;lt;/code&amp;gt; to install into the prefix &amp;lt;code&amp;gt;XXX&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
'''Note''': if the shell &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; is set such that &amp;lt;code&amp;gt;/bin&amp;lt;/code&amp;gt; comes before &amp;lt;code&amp;gt;/usr/bin&amp;lt;/code&amp;gt;, then this step is likely to fail because cmake will set the &amp;lt;code&amp;gt;FIND_ROOT_PATH&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; and this setting will fail as a prefix for Boost headers or libraries. The cmake output will include messages such as&lt;br /&gt;
&lt;br /&gt;
    --   Boost include directories: /include&lt;br /&gt;
    --   Boost library directories: /lib/x86_64-linux-gnu&lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
    CMake Error in lib/CMakeLists.txt:&lt;br /&gt;
      Imported target &amp;quot;Boost::chrono&amp;quot; includes non-existent path&lt;br /&gt;
        &amp;quot;/include&amp;quot;&lt;br /&gt;
      in its INTERFACE_INCLUDE_DIRECTORIES.  Possible reasons include:&lt;br /&gt;
      * The path was deleted, renamed, or moved to another location.&lt;br /&gt;
      * An install or uninstall procedure did not complete successfully.&lt;br /&gt;
      * The installation package was faulty and references files it does not provide.&lt;br /&gt;
&lt;br /&gt;
One of the following 3 options should fix this situation:&lt;br /&gt;
&lt;br /&gt;
      1. &amp;lt;code&amp;gt;/usr/bin/cmake ..&amp;lt;/code&amp;gt;&lt;br /&gt;
      2. &amp;lt;code&amp;gt;PATH=/usr/bin:$PATH cmake ..&amp;lt;/code&amp;gt;&lt;br /&gt;
      3. &amp;lt;code&amp;gt;cmake -DCMAKE_FIND_ROOT_PATH=/usr ..&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once the cmake command succeeds without errors, build UHD.&lt;br /&gt;
&lt;br /&gt;
    make&lt;br /&gt;
&lt;br /&gt;
'''Note''': Use the &amp;lt;code&amp;gt;-j&amp;lt;/code&amp;gt; parameter to use more than the default one CPU core, e.g. &amp;lt;code&amp;gt;make -j8&amp;lt;/code&amp;gt; for 8 CPU cores.&lt;br /&gt;
&lt;br /&gt;
Next, you can optionally run some basic tests to verify that the build process completed properly.&lt;br /&gt;
&lt;br /&gt;
    make test&lt;br /&gt;
&lt;br /&gt;
Next, install UHD, using the default install prefix, which will install UHD under the /usr/local/lib folder. You need to run this as root due to the permissions on that folder.&lt;br /&gt;
&lt;br /&gt;
    sudo make install&lt;br /&gt;
&lt;br /&gt;
Next, update the system's shared library cache.&lt;br /&gt;
&lt;br /&gt;
    sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Finally, make sure that the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable is defined and includes the folder under which UHD was installed. Most commonly, you can add the line below to the end of your &amp;lt;code&amp;gt;$HOME/.bashrc&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&lt;br /&gt;
    export LD_LIBRARY_PATH=/usr/local/lib&lt;br /&gt;
&lt;br /&gt;
On Fedora 22/23/24/25 you will need to set the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/usr/local/lib64&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    export LD_LIBRARY_PATH=/usr/local/lib64&lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable is already defined with other folders in your &amp;lt;code&amp;gt;$HOME/.bashrc&amp;lt;/code&amp;gt; file, then add the line below to the end of your &amp;lt;code&amp;gt;$HOME/.bashrc&amp;lt;/code&amp;gt; file to preserve the current settings.&lt;br /&gt;
 &lt;br /&gt;
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib&lt;br /&gt;
&lt;br /&gt;
For Fedora 21/22/23/24/25&lt;br /&gt;
&lt;br /&gt;
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64&lt;br /&gt;
&lt;br /&gt;
For this change to take effect, you will need to close the current terminal window, and open a new terminal.&lt;br /&gt;
&lt;br /&gt;
At this point, UHD should be installed and ready to use. You can quickly test this, with no USRP device attached, by running &amp;lt;code&amp;gt;uhd_find_devices&amp;lt;/code&amp;gt;. You should see something similar to the following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
linux; GNU C++ version 4.8.4; Boost_105400; UHD_003.010.000.HEAD-0-g6e1ac3fc&lt;br /&gt;
&lt;br /&gt;
No UHD Devices Found&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Downloading the UHD FPGA Images===&lt;br /&gt;
You can now download the UHD FPGA Images for this installation. This can be done by running the command &amp;lt;code&amp;gt;uhd_images_downloader&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader&lt;br /&gt;
&lt;br /&gt;
Note: Since this installation is being installed to a system level directory (e.g. &amp;lt;code&amp;gt;/usr/local&amp;lt;/code&amp;gt;), the &amp;lt;code&amp;gt;uhd_images_downloader&amp;lt;/code&amp;gt; command requires &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; privileges.&lt;br /&gt;
&lt;br /&gt;
Example ouput for UHD 3.13.3.0:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo uhd_images_downloader &lt;br /&gt;
Images destination:      /usr/local/share/uhd/images&lt;br /&gt;
Downloading images from: http://files.ettus.com/binaries/images/uhd-images_003.010.003.000-release.zip&lt;br /&gt;
Downloading images to:   /tmp/tmpm46JDg/uhd-images_003.010.003.000-release.zip&lt;br /&gt;
57009 kB / 57009 kB (100%)&lt;br /&gt;
&lt;br /&gt;
Images successfully installed to: /usr/local/share/uhd/images&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example output for UHD 3.13:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo uhd_images_downloader&lt;br /&gt;
[INFO] Images destination: /usr/local/share/uhd/images&lt;br /&gt;
[INFO] No inventory file found at /usr/local/share/uhd/images/inventory.json. Creating an empty one.&lt;br /&gt;
00006 kB / 00006 kB (100%) usrp1_b100_fw_default-g6bea23d.zip&lt;br /&gt;
19484 kB / 19484 kB (100%) x3xx_x310_fpga_default-g494ae8bb.zip&lt;br /&gt;
02757 kB / 02757 kB (100%) usrp2_n210_fpga_default-g6bea23d.zip&lt;br /&gt;
02109 kB / 02109 kB (100%) n230_n230_fpga_default-g494ae8bb.zip&lt;br /&gt;
00522 kB / 00522 kB (100%) usrp1_b100_fpga_default-g6bea23d.zip&lt;br /&gt;
00474 kB / 00474 kB (100%) b2xx_b200_fpga_default-g494ae8bb.zip&lt;br /&gt;
02415 kB / 02415 kB (100%) usrp2_n200_fpga_default-g6bea23d.zip&lt;br /&gt;
05920 kB / 05920 kB (100%) e3xx_e320_fpga_default-g494ae8bb.zip&lt;br /&gt;
15883 kB / 15883 kB (100%) n3xx_n310_fpga_default-g494ae8bb.zip&lt;br /&gt;
00506 kB / 00506 kB (100%) b2xx_b205mini_fpga_default-g494ae8bb.zip&lt;br /&gt;
18676 kB / 18676 kB (100%) x3xx_x300_fpga_default-g494ae8bb.zip&lt;br /&gt;
00017 kB / 00017 kB (100%) octoclock_octoclock_fw_default-g14000041.zip&lt;br /&gt;
04839 kB / 04839 kB (100%) usb_common_windrv_default-g14000041.zip&lt;br /&gt;
00007 kB / 00007 kB (100%) usrp2_usrp2_fw_default-g6bea23d.zip&lt;br /&gt;
00009 kB / 00009 kB (100%) usrp2_n200_fw_default-g6bea23d.zip&lt;br /&gt;
00450 kB / 00450 kB (100%) usrp2_usrp2_fpga_default-g6bea23d.zip&lt;br /&gt;
00142 kB / 00142 kB (100%) b2xx_common_fw_default-g3ff4186b.zip&lt;br /&gt;
00460 kB / 00460 kB (100%) b2xx_b200mini_fpga_default-g494ae8bb.zip&lt;br /&gt;
00319 kB / 00319 kB (100%) usrp1_usrp1_fpga_default-g6bea23d.zip&lt;br /&gt;
00009 kB / 00009 kB (100%) usrp2_n210_fw_default-g6bea23d.zip&lt;br /&gt;
11537 kB / 11537 kB (100%) n3xx_n300_fpga_default-g494ae8bb.zip&lt;br /&gt;
05349 kB / 05349 kB (100%) e3xx_e310_fpga_default-g494ae8bb.zip&lt;br /&gt;
00866 kB / 00866 kB (100%) b2xx_b210_fpga_default-g494ae8bb.zip&lt;br /&gt;
[INFO] Images download complete.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Building and installing GNU Radio from source code==&lt;br /&gt;
&lt;br /&gt;
As with UHD, GNU Radio is open-source and is hosted on GitHub. You can browse the code online at the link below, which points to version &amp;lt;code&amp;gt;v3.7.13.4&amp;lt;/code&amp;gt;, which is the the latest release at the time of this writing.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/gnuradio/gnuradio/tree/v3.7.13.4 GNU Radio repository on GitHub]&lt;br /&gt;
&lt;br /&gt;
Note: GNU Radio is currently transitioning from major branches of 3.7.x.x to 3.8.x.x. It is generally recommend at this time to use either the &amp;lt;code&amp;gt;v3.7.13.4&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;maint-3.7&amp;lt;/code&amp;gt; branch of GNU Radio. The &amp;lt;code&amp;gt;master&amp;lt;/code&amp;gt; branch includes many major changes such as converting to use Python 3 and may be unstable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As with UHD, there are several good reasons to build GNU Radio from source code, especially for doing development and prototyping. It it enables an easy way to customize the location of the installation, and to install multiple GNU Radio versions in parallel, and switch between them. It also provides much more flexibility in upgrading and downgrading versions, and allows the user to modify the code and create customized versions, which could possibly include a patch or other bug-fix.&lt;br /&gt;
&lt;br /&gt;
Similar to the process for UHD, to build GNU Radio from source code, clone the GitHub repository, check out a branch or tagged release of the repository, and build and install. Please follow the steps below. Make sure that no USRP device is connected to the system at this point.&lt;br /&gt;
&lt;br /&gt;
First, make a folder to hold the repository.&lt;br /&gt;
&lt;br /&gt;
    cd $HOME&lt;br /&gt;
    cd workarea&lt;br /&gt;
&lt;br /&gt;
Next, clone the repository.&lt;br /&gt;
&lt;br /&gt;
    git clone --recursive &amp;lt;nowiki&amp;gt;https://github.com/gnuradio/gnuradio&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, go into the repository and check out the desired GNU Radio version.&lt;br /&gt;
&lt;br /&gt;
    cd gnuradio&lt;br /&gt;
&lt;br /&gt;
To checkout the &amp;lt;code&amp;gt;v3.7.13.4&amp;lt;/code&amp;gt; branch:&lt;br /&gt;
&lt;br /&gt;
    git checkout v3.7.13.4&lt;br /&gt;
&lt;br /&gt;
Or to checkout the &amp;lt;code&amp;gt;maint-3.7&amp;lt;/code&amp;gt; branch:&lt;br /&gt;
&lt;br /&gt;
    git checkout maint-3.7&lt;br /&gt;
&lt;br /&gt;
Next, update the submodules:&lt;br /&gt;
&lt;br /&gt;
    git submodule update --init --recursive&lt;br /&gt;
&lt;br /&gt;
Next, create a build folder within the repository, invoke CMake, and build GNU Radio:&lt;br /&gt;
&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake ../&lt;br /&gt;
    make&lt;br /&gt;
&lt;br /&gt;
Next, you can optionally run some basic tests to verify that the build process completed properly.&lt;br /&gt;
&lt;br /&gt;
    make test&lt;br /&gt;
&lt;br /&gt;
Next, install GNU Radio, using the default install prefix, which will install GNU Radio under the /usr/local/lib folder. You need to run this as root due to the permissions on that folder.&lt;br /&gt;
&lt;br /&gt;
    sudo make install&lt;br /&gt;
&lt;br /&gt;
Finally, update the system's shared library cache.&lt;br /&gt;
&lt;br /&gt;
    sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
At this point, GNU Radio should be installed and ready to use. You can quickly test this, with no USRP device attached, by running the following quick tests.&lt;br /&gt;
&lt;br /&gt;
    gnuradio-config-info --version&lt;br /&gt;
    gnuradio-config-info --prefix&lt;br /&gt;
    gnuradio-config-info --enabled-components&lt;br /&gt;
&lt;br /&gt;
There is a simple flowgraph that you can run that does not require any USRP hardware. It's called the dialtone test, and it produces a PSTN dial tone on the computer's speakers. Running it verifies that all the libraries can be found, and that the GNU Radio run-time is working.&lt;br /&gt;
&lt;br /&gt;
    python $HOME/workarea/gnuradio/gr-audio/examples/python/dial_tone.py&lt;br /&gt;
&lt;br /&gt;
You can try launching the GNU Radio Companion (GRC) tool, a visual tool for building and running GNU Radio flowgraphs.&lt;br /&gt;
&lt;br /&gt;
    gnuradio-companion&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;gnuradio-companion&amp;quot; does not start and complains about the &amp;lt;code&amp;gt;PYTHONPATH&amp;lt;/code&amp;gt; environment variable, then you may have to set this in your &amp;lt;code&amp;gt;$HOME/.bashrc&amp;lt;/code&amp;gt; file, as shown below.&lt;br /&gt;
&lt;br /&gt;
    export PYTHONPATH=/usr/local/lib/python2.7/dist-packages&lt;br /&gt;
&lt;br /&gt;
On Fedora 21/22/23/24, the &amp;lt;code&amp;gt;PYTHONPATH&amp;lt;/code&amp;gt; environment variable will need to be set to:&lt;br /&gt;
&lt;br /&gt;
    export PYTHONPATH=/usr/lib/python2.7/site-packages:/usr/local/lib64/python2.7/site-packages/&lt;br /&gt;
&lt;br /&gt;
==Configuring USB==&lt;br /&gt;
&lt;br /&gt;
On Linux, udev handles USB plug and unplug events. The following commands install a udev rule so that non-root users may access the device. This step is only necessary for devices that use USB to connect to the host computer, such as the B200, B210, and B200mini. This setting should take effect immediately and does not require a reboot or logout/login. Be sure that no USRP device is connected via USB when running these commands.&lt;br /&gt;
&lt;br /&gt;
    cd $HOME/workarea/uhd/host/utils&lt;br /&gt;
    sudo cp uhd-usrp.rules /etc/udev/rules.d/&lt;br /&gt;
    sudo udevadm control --reload-rules&lt;br /&gt;
    sudo udevadm trigger&lt;br /&gt;
&lt;br /&gt;
==Configuring Ethernet==&lt;br /&gt;
&lt;br /&gt;
For USRP devices that use Ethernet to connect to the host computer, such as the N200, N210, X300, X310, set a static IP address for your system of 192.168.10.1, with a netmask of 255.255.255.0. The default IP address of the USRP is 192.168.10.2, with a netmask of 255.255.255.0. You should probably set the IP address using the graphical Network Manager. If you set the IP address from the command line with &amp;lt;code&amp;gt;ifconfig&amp;lt;/code&amp;gt;, Network Manager will probably overwrite these settings.&lt;br /&gt;
&lt;br /&gt;
==Connect the USRP==&lt;br /&gt;
&lt;br /&gt;
The installation of UHD and GNU Radio should now be complete. At this point, connect the USRP to the host computer.&lt;br /&gt;
&lt;br /&gt;
If the interface is Ethernet, then open a terminal window, and try to ping the USRP with &amp;quot;ping 192.168.10.2&amp;quot;. The USRP should respond to the ping requests.&lt;br /&gt;
&lt;br /&gt;
If the interface is USB, then open a terminal window, and run &amp;quot;&amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt;&amp;quot;. You should see the USRP listed on the USB bus with a VID of &amp;lt;code&amp;gt;2500&amp;lt;/code&amp;gt; and PID of &amp;lt;code&amp;gt;0020&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0021&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0022&amp;lt;/code&amp;gt;, for B200, B210, B200mini, respectively.&lt;br /&gt;
&lt;br /&gt;
Also try running &amp;quot;&amp;lt;code&amp;gt;uhd_find_devices&amp;lt;/code&amp;gt;&amp;quot; and &amp;quot;&amp;lt;code&amp;gt;uhd_usrp_probe&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Thread priority scheduling==&lt;br /&gt;
&lt;br /&gt;
When UHD spawns a new thread, it may try to boost the thread's scheduling priority. If setting the new priority fails, the UHD software prints a warning to the console, as shown below. This warning is harmless; it simply means that the thread will retain a normal or default scheduling priority.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UHD Warning:&lt;br /&gt;
    Unable to set the thread priority. Performance may be negatively affected.&lt;br /&gt;
    Please see the general application notes in the manual for instructions.&lt;br /&gt;
    EnvironmentError: OSError: error in pthread_setschedparam&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To address this issue, non-privileged (non-root) users need to be given special permission to change the scheduling priority. This can be enabled by creating a group &amp;lt;code&amp;gt;usrp&amp;lt;/code&amp;gt;, adding your user to it, and then appending the line &amp;lt;code&amp;gt;@usrp - rtprio  99&amp;lt;/code&amp;gt; to the file &amp;lt;code&amp;gt;/etc/security/limits.conf&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    sudo groupadd usrp&lt;br /&gt;
    sudo usermod -aG usrp $USER&lt;br /&gt;
&lt;br /&gt;
Then add the line below to end of the file &amp;lt;code&amp;gt;/etc/security/limits.conf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    @usrp - rtprio  99&lt;br /&gt;
&lt;br /&gt;
You must log out and log back into the account for the settings to take effect. In most Linux distributions, a list of groups and group members can be found in the &amp;lt;code&amp;gt;/etc/group&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
There is further documentation about this in the User Manual at the link below.&lt;br /&gt;
&lt;br /&gt;
* [http://files.ettus.com/manual/page_general.html#general_threading_prio Threading Notes section of the User Manual]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Application Notes]]&lt;/div&gt;</summary>
		<author><name>MartinAnderseck</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Building_and_Installing_the_USRP_Open-Source_Toolchain_(UHD_and_GNU_Radio)_on_Linux&amp;diff=6019</id>
		<title>Building and Installing the USRP Open-Source Toolchain (UHD and GNU Radio) on Linux</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Building_and_Installing_the_USRP_Open-Source_Toolchain_(UHD_and_GNU_Radio)_on_Linux&amp;diff=6019"/>
				<updated>2024-02-14T13:47:26Z</updated>
		
		<summary type="html">&lt;p&gt;MartinAnderseck: Made the -j parameter statement clearer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Application Note Number==&lt;br /&gt;
'''AN-445'''&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This Application Note provides a comprehensive guide for building, installing, and maintaining the open-source toolchain for the USRP (UHD and GNU Radio) from source code on the Linux platform. The Ubuntu and Fedora distributions are specifically discussed. Several other alternate installation methods are also discussed.&lt;br /&gt;
&lt;br /&gt;
http://files.ettus.com/manual/page_build_guide.html#build_instructions_unix&lt;br /&gt;
&lt;br /&gt;
==UHD on Linux==&lt;br /&gt;
&lt;br /&gt;
UHD is fully supported on Linux, using the GCC compiler, and should work on most major Linux distributions.&lt;br /&gt;
&lt;br /&gt;
==Devices==&lt;br /&gt;
This document applies only to the USRP X300, X310, B200, B210, B200mini, N200, N210 devices. The E310 and E312 devices are embedded devices, and are fundamentally different from the other non-embedded USRP devices, and are not addressed by this document.&lt;br /&gt;
&lt;br /&gt;
==Install Linux==&lt;br /&gt;
&lt;br /&gt;
If you already have a recent version of Linux installed, then you may be able to skip this section. If you are starting from scratch, or simply want to start with a fresh new installation of Linux, then please follow the instructions and recommendations in this section.&lt;br /&gt;
&lt;br /&gt;
We suggest that you use either Ubuntu 16.04.5, Ubuntu 18.04, Ubuntu 18.10, Fedora 27, 28, 29, and that you use a 64-bit architecture, not a 32-bit architecture. There are several re-spins of Ubuntu, such as Xubuntu, Lubuntu, Kubuntu, Linux Mint, all of which should also work. For the purposes of this document, these re-spins can be considered equivalent. Both Ubuntu and Fedora are known to work well with UHD and GNU Radio.&lt;br /&gt;
&lt;br /&gt;
Download and install Ubuntu, Xubuntu, Linux Mint, or Fedora from the links below. Download the appropriate ISO image, and write it to a USB flash drive. Be sure to verify that the ISO file was not corrupted during the download process by checking the MD5 and/or SHA1 hash.&lt;br /&gt;
&lt;br /&gt;
* [http://www.ubuntu.com/download/desktop Ubuntu download page]&lt;br /&gt;
* [http://www.xubuntu.org/getxubuntu/ Xubuntu download page]&lt;br /&gt;
* [https://www.linuxmint.com/download.php Linux Mint download page]&lt;br /&gt;
* [https://getfedora.org/en/workstation/download/ Fedora download page]&lt;br /&gt;
&lt;br /&gt;
You can learn more about Ubuntu, Xubuntu, Linux Mint, and Fedora at the links below.&lt;br /&gt;
&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Ubuntu_%28operating_system%29 Wikipedia article on Ubuntu]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Xubuntu Wikipedia article on Xubuntu]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Linux_Mint Wikipedia article on Linux Mint]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Fedora_%28operating_system%29 Wikipedia article on Fedora]&lt;br /&gt;
&lt;br /&gt;
There are many tools for writing an ISO image to a USB flash drive. In Linux, you can use the &amp;quot;dd&amp;quot; utility, or the UNetbootin utility. On Ubuntu systems, there is also the Startup Disk Creator utility as well.&lt;br /&gt;
&lt;br /&gt;
* [http://unetbootin.sourceforge.net/ UNetbootin homepage]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/UNetbootin Wikipedia article on UNetbootin]&lt;br /&gt;
&lt;br /&gt;
* [https://launchpad.net/usb-creator Startup Disk Creator homepage]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Startup_Disk_Creator Wikipedia article on Startup Disk Creator]&lt;br /&gt;
* [http://www.ubuntu.com/download/desktop/create-a-usb-stick-on-ubuntu Article about Startup Disk Creator]&lt;br /&gt;
&lt;br /&gt;
Be sure to use a USB flash drive with at least 8 GB capacity, and use a USB 3.0 flash drive, not a USB 2.0 flash drive. If you use a slower USB 2.0 flash drive, then the install process will take significantly longer.&lt;br /&gt;
&lt;br /&gt;
==Update and Install dependencies==&lt;br /&gt;
&lt;br /&gt;
Before building UHD and GNU Radio, you need to make sure that all the dependencies are first installed.&lt;br /&gt;
&lt;br /&gt;
However, before installing any dependencies, you should first make sure that all the packages that are already installed on your system are up-to-date. You can do this from a GUI, or from the command-line, as shown below.&lt;br /&gt;
&lt;br /&gt;
On Ubuntu systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get update&lt;br /&gt;
&lt;br /&gt;
On Fedora 21 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo yum update&lt;br /&gt;
&lt;br /&gt;
On Fedora 22, 23, 24 and 25 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo dnf update&lt;br /&gt;
&lt;br /&gt;
Once the system has been updated, then install the required dependencies for UHD and GNU Radio.&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 20.04 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install autoconf automake build-essential ccache cmake cpufrequtils doxygen ethtool fort77 g++ gir1.2-gtk-3.0 git gobject-introspection gpsd gpsd-clients inetutils-tools libasound2-dev libboost-all-dev libcomedi-dev libcppunit-dev libfftw3-bin libfftw3-dev libfftw3-doc libfontconfig1-dev libgmp-dev libgps-dev libgsl-dev liblog4cpp5-dev libncurses5 libncurses5-dev libpulse-dev libqt5opengl5-dev libqwt-qt5-dev libsdl1.2-dev libtool libudev-dev libusb-1.0-0 libusb-1.0-0-dev libusb-dev libxi-dev libxrender-dev libzmq3-dev libzmq5 ncurses-bin python3-cheetah python3-click python3-click-plugins python3-click-threading python3-dev python3-docutils python3-gi python3-gi-cairo python3-gps python3-lxml python3-mako python3-numpy python3-numpy-dbg python3-opengl python3-pyqt5 python3-requests python3-scipy python3-setuptools python3-six python3-sphinx python3-yaml python3-zmq python3-ruamel.yaml swig wget&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 18.10 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-1.14-0 libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libqwt6abi1 libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev libncurses6-dbg libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-dev libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk3.0 git libqt4-dev python-numpy ccache python-opengl libgsl-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwtplot3d-qt5-dev pyqt4-dev-tools python-qwt5-qt4 cmake git wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq3-dev libzmq5 python-requests python-sphinx libcomedi-dev python-zmq libqwt-dev libqwt6abi1 python-six libgps-dev libgps23 gpsd gpsd-clients python-gps python-setuptools&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 18.04 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-1.14-0 libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libqwt6abi1 libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev libncurses5-dbg libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-dev libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk3.0 git libqt4-dev python-numpy ccache python-opengl libgsl-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwtplot3d-qt5-dev pyqt4-dev-tools python-qwt5-qt4 cmake git wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq3-dev libzmq5 python-requests python-sphinx libcomedi-dev python-zmq libqwt-dev libqwt6abi1 python-six libgps-dev libgps23 gpsd gpsd-clients python-gps python-setuptools&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 17.04 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-1.13-0v5 libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libqwt6abi1 libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev libncurses5-dbg libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-dev libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk3.0 git-core libqt4-dev python-numpy ccache python-opengl libgsl-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwt5-qt4-dev libqwtplot3d-qt4-dev pyqt4-dev-tools python-qwt5-qt4 cmake git-core wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq3-dev libzmq5 python-requests python-sphinx libcomedi-dev python-zmq python-setuptools&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 16.04 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-1.13-0v5 libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libqwt6abi1 libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev libncurses5-dbg libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-dev libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk3.0 git-core libqt4-dev python-numpy ccache python-opengl libgsl-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwt5-qt4-dev libqwtplot3d-qt4-dev pyqt4-dev-tools python-qwt5-qt4 cmake git-core wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq-dev libzmq1 python-requests python-sphinx libcomedi-dev python-zmq python-setuptools&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 15.04 and 15.10 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libqwt6 libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev  libncurses5-dbg libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-1.13-0v5 libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk2.8 git-core libqt4-dev python-numpy ccache python-opengl libgsl0-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwt5-qt4-dev libqwtplot3d-qt4-dev pyqt4-dev-tools python-qwt5-qt4 cmake git-core wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq-dev libzmq1 python-requests python-sphinx libcomedi-dev python-zmq python-setuptools&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 14.04 and 14.10 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-1.13-0 libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev libncurses5-dbg   libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-dev libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk2.8 git-core libqt4-dev python-numpy ccache python-opengl libgsl0-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwt5-qt4-dev libqwtplot3d-qt4-dev pyqt4-dev-tools python-qwt5-qt4 cmake git-core wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq1 libzmq-dev python-requests python-sphinx libcomedi-dev python-setuptools&lt;br /&gt;
&lt;br /&gt;
On Fedora 21 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo yum -y groupinstall &amp;quot;Engineering and Scientific&amp;quot; &amp;quot;Development Tools&amp;quot; &amp;quot;Software Development Tools&amp;quot; &amp;quot;C Development Tools and Libraries&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    sudo yum -y install fftw-devel cppunit-devel wxPython-devel boost-devel alsa-lib-devel numpy gsl-devel python-devel pygsl python-cheetah python-mako python-lxml PyOpenGL qt-devel qt qt4 qt4-devel PyQt4-devel qwt-devel qwtplot3d-qt4-devel libusbx-devel cmake git wget python-docutils cppzmq-devel PyQwt PyQwt-devel qwt-devel gtk2-engines xmlrpc-c-&amp;quot;*&amp;quot; tkinter orc orc-devel python-sphinx SDL-devel swig  zeromq2-devel python-zmq comedilib comedilib-devel thrift-devel python-thrift scipy zeromq zeromq-devel&lt;br /&gt;
			  &lt;br /&gt;
On Fedora 22, 23, 24 and 25 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo dnf -y groupinstall &amp;quot;Engineering and Scientific&amp;quot; &amp;quot;Development Tools&amp;quot; &amp;quot;C Development Tools and Libraries&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
    sudo dnf -y install fftw-devel cppunit-devel wxPython-devel boost-devel alsa-lib-devel numpy gsl-devel python-devel pygsl python-cheetah python-mako python-lxml PyOpenGL qt-devel PyQt4-devel qwt-devel qwtplot3d-qt4-devel libusbx-devel cmake python-docutils PyQwt PyQwt-devel gtk2-engines xmlrpc-c-&amp;quot;*&amp;quot; tkinter orc-devel python-sphinx SDL-devel swig perl-ZMQ-LibZMQ2 perl-ZMQ-LibZMQ2 zeromq zeromq-devel python-requests gcc-c++ doxygen zeromq-ada-devel cppzmq-devel perl-ZeroMQ amavisd-new-zeromq amavisd-new-snmp-zeromq php-zmq python-zmq czmq uwsgi-logger-zeromq comedilib comedilib-devel pygtk2 ncurses-&amp;quot;*&amp;quot; thrift-devel python-thrift scipy&lt;br /&gt;
&lt;br /&gt;
After installing the dependencies, you should reboot the system.&lt;br /&gt;
&lt;br /&gt;
If the installation of the dependencies completes without any errors, then you can proceed to build and install UHD and GNU Radio.&lt;br /&gt;
&lt;br /&gt;
==Building and installing UHD from source code==&lt;br /&gt;
&lt;br /&gt;
UHD is open-source, and is hosted on GitHub. You can browse the code online at the link below, which points to version 3.14.0.0, which is the the latest release at the time of this writing.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/EttusResearch/uhd/tree/v3.14.0.0 UHD repository on GitHub]&lt;br /&gt;
&lt;br /&gt;
There are several good reasons to build GNU Radio from source code, especially for doing development and prototyping. It it enables an easy way to customize the location of the installation, and to install multiple UHD versions in parallel, and switch between them. It also provides much more flexibility in upgrading and downgrading versions, and allows the user to modify the code and create customized versions, which could possibly include a patch or other bug-fix.&lt;br /&gt;
&lt;br /&gt;
To build UHD from source code, clone the GitHub repository, check out a branch or tagged release of the repository, and build and install. Please follow the steps below. Make sure that no USRP device is connected to the system at this point.&lt;br /&gt;
&lt;br /&gt;
First, make a folder to hold the repository.&lt;br /&gt;
&lt;br /&gt;
    cd $HOME&lt;br /&gt;
    mkdir workarea&lt;br /&gt;
    cd workarea&lt;br /&gt;
&lt;br /&gt;
Next, clone the repository and change into the cloned directory.&lt;br /&gt;
&lt;br /&gt;
    git clone &amp;lt;nowiki&amp;gt;https://github.com/EttusResearch/uhd&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
    cd uhd&lt;br /&gt;
&lt;br /&gt;
Next, checkout the desired UHD version. You can get a full listing of tagged releases by running the command:&lt;br /&gt;
&lt;br /&gt;
    git tag -l&lt;br /&gt;
&lt;br /&gt;
''Example truncated output of &amp;lt;code&amp;gt;git tag -l&amp;lt;/code&amp;gt;:''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git tag -l&lt;br /&gt;
...&lt;br /&gt;
release_003_009_004&lt;br /&gt;
release_003_009_005&lt;br /&gt;
release_003_010_000_000&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note''': As of UHD Version 3.10.0.0, the versioning scheme has changed to be a quadruplet format. Each element and version will follow the format of: '''Major.API.ABI.Patch'''. Additional details on this versioning change can be found [https://files.ettus.com/manual/page_semver.html here]. &lt;br /&gt;
&lt;br /&gt;
After identifying the version and corresponding release tag you need, check it out:&lt;br /&gt;
&lt;br /&gt;
    # Example: For UHD 3.9.5:&lt;br /&gt;
    git checkout release_003_009_005&lt;br /&gt;
&lt;br /&gt;
    # Example: For UHD 3.14.0.0&lt;br /&gt;
    git checkout v3.14.0.0&lt;br /&gt;
&lt;br /&gt;
Next, create a build folder within the repository.&lt;br /&gt;
&lt;br /&gt;
    cd host&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
&lt;br /&gt;
Next, invoke CMake.&lt;br /&gt;
&lt;br /&gt;
    cmake ..&lt;br /&gt;
&lt;br /&gt;
'''Note''': By default, UHD will be installed into the prefix &amp;lt;code&amp;gt;/usr/local&amp;lt;/code&amp;gt;. This can be changed by adding &amp;lt;code&amp;gt;-DCMAKE_INSTALL_PREFIX=XXX&amp;lt;/code&amp;gt; to install into the prefix &amp;lt;code&amp;gt;XXX&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
'''Note''': if the shell &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; is set such that &amp;lt;code&amp;gt;/bin&amp;lt;/code&amp;gt; comes before &amp;lt;code&amp;gt;/usr/bin&amp;lt;/code&amp;gt;, then this step is likely to fail because cmake will set the &amp;lt;code&amp;gt;FIND_ROOT_PATH&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; and this setting will fail as a prefix for Boost headers or libraries. The cmake output will include messages such as&lt;br /&gt;
&lt;br /&gt;
    --   Boost include directories: /include&lt;br /&gt;
    --   Boost library directories: /lib/x86_64-linux-gnu&lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
    CMake Error in lib/CMakeLists.txt:&lt;br /&gt;
      Imported target &amp;quot;Boost::chrono&amp;quot; includes non-existent path&lt;br /&gt;
        &amp;quot;/include&amp;quot;&lt;br /&gt;
      in its INTERFACE_INCLUDE_DIRECTORIES.  Possible reasons include:&lt;br /&gt;
      * The path was deleted, renamed, or moved to another location.&lt;br /&gt;
      * An install or uninstall procedure did not complete successfully.&lt;br /&gt;
      * The installation package was faulty and references files it does not provide.&lt;br /&gt;
&lt;br /&gt;
One of the following 3 options should fix this situation:&lt;br /&gt;
&lt;br /&gt;
      1. &amp;lt;code&amp;gt;/usr/bin/cmake ..&amp;lt;/code&amp;gt;&lt;br /&gt;
      2. &amp;lt;code&amp;gt;PATH=/usr/bin:$PATH cmake ..&amp;lt;/code&amp;gt;&lt;br /&gt;
      3. &amp;lt;code&amp;gt;cmake -DCMAKE_FIND_ROOT_PATH=/usr ..&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once the cmake command succeeds without errors, build UHD.&lt;br /&gt;
&lt;br /&gt;
    make&lt;br /&gt;
&lt;br /&gt;
'''Note''': Use the &amp;lt;code&amp;gt;-j&amp;lt;/code&amp;gt; parameter to use more than the default one CPU core, e.g. &amp;lt;code&amp;gt;make -j8&amp;lt;/code&amp;gt; for 8 CPU cores.&lt;br /&gt;
&lt;br /&gt;
Next, you can optionally run some basic tests to verify that the build process completed properly.&lt;br /&gt;
&lt;br /&gt;
    make test&lt;br /&gt;
&lt;br /&gt;
Next, install UHD, using the default install prefix, which will install UHD under the /usr/local/lib folder. You need to run this as root due to the permissions on that folder.&lt;br /&gt;
&lt;br /&gt;
    sudo make install&lt;br /&gt;
&lt;br /&gt;
Next, update the system's shared library cache.&lt;br /&gt;
&lt;br /&gt;
    sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Finally, make sure that the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable is defined and includes the folder under which UHD was installed. Most commonly, you can add the line below to the end of your &amp;lt;code&amp;gt;$HOME/.bashrc&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&lt;br /&gt;
    export LD_LIBRARY_PATH=/usr/local/lib&lt;br /&gt;
&lt;br /&gt;
On Fedora 22/23/24/25 you will need to set the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/usr/local/lib64&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    export LD_LIBRARY_PATH=/usr/local/lib64&lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable is already defined with other folders in your &amp;lt;code&amp;gt;$HOME/.bashrc&amp;lt;/code&amp;gt; file, then add the line below to the end of your &amp;lt;code&amp;gt;$HOME/.bashrc&amp;lt;/code&amp;gt; file to preserve the current settings.&lt;br /&gt;
 &lt;br /&gt;
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib&lt;br /&gt;
&lt;br /&gt;
For Fedora 21/22/23/24/25&lt;br /&gt;
&lt;br /&gt;
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64&lt;br /&gt;
&lt;br /&gt;
For this change to take effect, you will need to close the current terminal window, and open a new terminal.&lt;br /&gt;
&lt;br /&gt;
At this point, UHD should be installed and ready to use. You can quickly test this, with no USRP device attached, by running &amp;lt;code&amp;gt;uhd_find_devices&amp;lt;/code&amp;gt;. You should see something similar to the following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
linux; GNU C++ version 4.8.4; Boost_105400; UHD_003.010.000.HEAD-0-g6e1ac3fc&lt;br /&gt;
&lt;br /&gt;
No UHD Devices Found&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Downloading the UHD FPGA Images===&lt;br /&gt;
You can now download the UHD FPGA Images for this installation. This can be done by running the command &amp;lt;code&amp;gt;uhd_images_downloader&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader&lt;br /&gt;
&lt;br /&gt;
Note: Since this installation is being installed to a system level directory (e.g. &amp;lt;code&amp;gt;/usr/local&amp;lt;/code&amp;gt;), the &amp;lt;code&amp;gt;uhd_images_downloader&amp;lt;/code&amp;gt; command requires &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; privileges.&lt;br /&gt;
&lt;br /&gt;
Example ouput for UHD 3.13.3.0:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo uhd_images_downloader &lt;br /&gt;
Images destination:      /usr/local/share/uhd/images&lt;br /&gt;
Downloading images from: http://files.ettus.com/binaries/images/uhd-images_003.010.003.000-release.zip&lt;br /&gt;
Downloading images to:   /tmp/tmpm46JDg/uhd-images_003.010.003.000-release.zip&lt;br /&gt;
57009 kB / 57009 kB (100%)&lt;br /&gt;
&lt;br /&gt;
Images successfully installed to: /usr/local/share/uhd/images&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example output for UHD 3.13:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo uhd_images_downloader&lt;br /&gt;
[INFO] Images destination: /usr/local/share/uhd/images&lt;br /&gt;
[INFO] No inventory file found at /usr/local/share/uhd/images/inventory.json. Creating an empty one.&lt;br /&gt;
00006 kB / 00006 kB (100%) usrp1_b100_fw_default-g6bea23d.zip&lt;br /&gt;
19484 kB / 19484 kB (100%) x3xx_x310_fpga_default-g494ae8bb.zip&lt;br /&gt;
02757 kB / 02757 kB (100%) usrp2_n210_fpga_default-g6bea23d.zip&lt;br /&gt;
02109 kB / 02109 kB (100%) n230_n230_fpga_default-g494ae8bb.zip&lt;br /&gt;
00522 kB / 00522 kB (100%) usrp1_b100_fpga_default-g6bea23d.zip&lt;br /&gt;
00474 kB / 00474 kB (100%) b2xx_b200_fpga_default-g494ae8bb.zip&lt;br /&gt;
02415 kB / 02415 kB (100%) usrp2_n200_fpga_default-g6bea23d.zip&lt;br /&gt;
05920 kB / 05920 kB (100%) e3xx_e320_fpga_default-g494ae8bb.zip&lt;br /&gt;
15883 kB / 15883 kB (100%) n3xx_n310_fpga_default-g494ae8bb.zip&lt;br /&gt;
00506 kB / 00506 kB (100%) b2xx_b205mini_fpga_default-g494ae8bb.zip&lt;br /&gt;
18676 kB / 18676 kB (100%) x3xx_x300_fpga_default-g494ae8bb.zip&lt;br /&gt;
00017 kB / 00017 kB (100%) octoclock_octoclock_fw_default-g14000041.zip&lt;br /&gt;
04839 kB / 04839 kB (100%) usb_common_windrv_default-g14000041.zip&lt;br /&gt;
00007 kB / 00007 kB (100%) usrp2_usrp2_fw_default-g6bea23d.zip&lt;br /&gt;
00009 kB / 00009 kB (100%) usrp2_n200_fw_default-g6bea23d.zip&lt;br /&gt;
00450 kB / 00450 kB (100%) usrp2_usrp2_fpga_default-g6bea23d.zip&lt;br /&gt;
00142 kB / 00142 kB (100%) b2xx_common_fw_default-g3ff4186b.zip&lt;br /&gt;
00460 kB / 00460 kB (100%) b2xx_b200mini_fpga_default-g494ae8bb.zip&lt;br /&gt;
00319 kB / 00319 kB (100%) usrp1_usrp1_fpga_default-g6bea23d.zip&lt;br /&gt;
00009 kB / 00009 kB (100%) usrp2_n210_fw_default-g6bea23d.zip&lt;br /&gt;
11537 kB / 11537 kB (100%) n3xx_n300_fpga_default-g494ae8bb.zip&lt;br /&gt;
05349 kB / 05349 kB (100%) e3xx_e310_fpga_default-g494ae8bb.zip&lt;br /&gt;
00866 kB / 00866 kB (100%) b2xx_b210_fpga_default-g494ae8bb.zip&lt;br /&gt;
[INFO] Images download complete.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Building and installing GNU Radio from source code==&lt;br /&gt;
&lt;br /&gt;
As with UHD, GNU Radio is open-source and is hosted on GitHub. You can browse the code online at the link below, which points to version &amp;lt;code&amp;gt;v3.7.13.4&amp;lt;/code&amp;gt;, which is the the latest release at the time of this writing.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/gnuradio/gnuradio/tree/v3.7.13.4 GNU Radio repository on GitHub]&lt;br /&gt;
&lt;br /&gt;
Note: GNU Radio is currently transitioning from major branches of 3.7.x.x to 3.8.x.x. It is generally recommend at this time to use either the &amp;lt;code&amp;gt;v3.7.13.4&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;maint-3.7&amp;lt;/code&amp;gt; branch of GNU Radio. The &amp;lt;code&amp;gt;master&amp;lt;/code&amp;gt; branch includes many major changes such as converting to use Python 3 and may be unstable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As with UHD, there are several good reasons to build GNU Radio from source code, especially for doing development and prototyping. It it enables an easy way to customize the location of the installation, and to install multiple GNU Radio versions in parallel, and switch between them. It also provides much more flexibility in upgrading and downgrading versions, and allows the user to modify the code and create customized versions, which could possibly include a patch or other bug-fix.&lt;br /&gt;
&lt;br /&gt;
Similar to the process for UHD, to build GNU Radio from source code, clone the GitHub repository, check out a branch or tagged release of the repository, and build and install. Please follow the steps below. Make sure that no USRP device is connected to the system at this point.&lt;br /&gt;
&lt;br /&gt;
First, make a folder to hold the repository.&lt;br /&gt;
&lt;br /&gt;
    cd $HOME&lt;br /&gt;
    cd workarea&lt;br /&gt;
&lt;br /&gt;
Next, clone the repository.&lt;br /&gt;
&lt;br /&gt;
    git clone --recursive &amp;lt;nowiki&amp;gt;https://github.com/gnuradio/gnuradio&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, go into the repository and check out the desired GNU Radio version.&lt;br /&gt;
&lt;br /&gt;
    cd gnuradio&lt;br /&gt;
&lt;br /&gt;
To checkout the &amp;lt;code&amp;gt;v3.7.13.4&amp;lt;/code&amp;gt; branch:&lt;br /&gt;
&lt;br /&gt;
    git checkout v3.7.13.4&lt;br /&gt;
&lt;br /&gt;
Or to checkout the &amp;lt;code&amp;gt;maint-3.7&amp;lt;/code&amp;gt; branch:&lt;br /&gt;
&lt;br /&gt;
    git checkout maint-3.7&lt;br /&gt;
&lt;br /&gt;
Next, update the submodules:&lt;br /&gt;
&lt;br /&gt;
    git submodule update --init --recursive&lt;br /&gt;
&lt;br /&gt;
Next, create a build folder within the repository, invoke CMake, and build GNU Radio:&lt;br /&gt;
&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake ../&lt;br /&gt;
    make&lt;br /&gt;
&lt;br /&gt;
Next, you can optionally run some basic tests to verify that the build process completed properly.&lt;br /&gt;
&lt;br /&gt;
    make test&lt;br /&gt;
&lt;br /&gt;
Next, install GNU Radio, using the default install prefix, which will install GNU Radio under the /usr/local/lib folder. You need to run this as root due to the permissions on that folder.&lt;br /&gt;
&lt;br /&gt;
    sudo make install&lt;br /&gt;
&lt;br /&gt;
Finally, update the system's shared library cache.&lt;br /&gt;
&lt;br /&gt;
    sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
At this point, GNU Radio should be installed and ready to use. You can quickly test this, with no USRP device attached, by running the following quick tests.&lt;br /&gt;
&lt;br /&gt;
    gnuradio-config-info --version&lt;br /&gt;
    gnuradio-config-info --prefix&lt;br /&gt;
    gnuradio-config-info --enabled-components&lt;br /&gt;
&lt;br /&gt;
There is a simple flowgraph that you can run that does not require any USRP hardware. It's called the dialtone test, and it produces a PSTN dial tone on the computer's speakers. Running it verifies that all the libraries can be found, and that the GNU Radio run-time is working.&lt;br /&gt;
&lt;br /&gt;
    python $HOME/workarea/gnuradio/gr-audio/examples/python/dial_tone.py&lt;br /&gt;
&lt;br /&gt;
You can try launching the GNU Radio Companion (GRC) tool, a visual tool for building and running GNU Radio flowgraphs.&lt;br /&gt;
&lt;br /&gt;
    gnuradio-companion&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;gnuradio-companion&amp;quot; does not start and complains about the &amp;lt;code&amp;gt;PYTHONPATH&amp;lt;/code&amp;gt; environment variable, then you may have to set this in your &amp;lt;code&amp;gt;$HOME/.bashrc&amp;lt;/code&amp;gt; file, as shown below.&lt;br /&gt;
&lt;br /&gt;
    export PYTHONPATH=/usr/local/lib/python2.7/dist-packages&lt;br /&gt;
&lt;br /&gt;
On Fedora 21/22/23/24, the &amp;lt;code&amp;gt;PYTHONPATH&amp;lt;/code&amp;gt; environment variable will need to be set to:&lt;br /&gt;
&lt;br /&gt;
    export PYTHONPATH=/usr/lib/python2.7/site-packages:/usr/local/lib64/python2.7/site-packages/&lt;br /&gt;
&lt;br /&gt;
==Configuring USB==&lt;br /&gt;
&lt;br /&gt;
On Linux, udev handles USB plug and unplug events. The following commands install a udev rule so that non-root users may access the device. This step is only necessary for devices that use USB to connect to the host computer, such as the B200, B210, and B200mini. This setting should take effect immediately and does not require a reboot or logout/login. Be sure that no USRP device is connected via USB when running these commands.&lt;br /&gt;
&lt;br /&gt;
    cd $HOME/workarea/uhd/host/utils&lt;br /&gt;
    sudo cp uhd-usrp.rules /etc/udev/rules.d/&lt;br /&gt;
    sudo udevadm control --reload-rules&lt;br /&gt;
    sudo udevadm trigger&lt;br /&gt;
&lt;br /&gt;
==Configuring Ethernet==&lt;br /&gt;
&lt;br /&gt;
For USRP devices that use Ethernet to connect to the host computer, such as the N200, N210, X300, X310, set a static IP address for your system of 192.168.10.1, with a netmask of 255.255.255.0. The default IP address of the USRP is 192.168.10.2, with a netmask of 255.255.255.0. You should probably set the IP address using the graphical Network Manager. If you set the IP address from the command line with &amp;lt;code&amp;gt;ifconfig&amp;lt;/code&amp;gt;, Network Manager will probably overwrite these settings.&lt;br /&gt;
&lt;br /&gt;
==Connect the USRP==&lt;br /&gt;
&lt;br /&gt;
The installation of UHD and GNU Radio should now be complete. At this point, connect the USRP to the host computer.&lt;br /&gt;
&lt;br /&gt;
If the interface is Ethernet, then open a terminal window, and try to ping the USRP with &amp;quot;ping 192.168.10.2&amp;quot;. The USRP should respond to the ping requests.&lt;br /&gt;
&lt;br /&gt;
If the interface is USB, then open a terminal window, and run &amp;quot;&amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt;&amp;quot;. You should see the USRP listed on the USB bus with a VID of &amp;lt;code&amp;gt;2500&amp;lt;/code&amp;gt; and PID of &amp;lt;code&amp;gt;0020&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0021&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0022&amp;lt;/code&amp;gt;, for B200, B210, B200mini, respectively.&lt;br /&gt;
&lt;br /&gt;
Also try running &amp;quot;&amp;lt;code&amp;gt;uhd_find_devices&amp;lt;/code&amp;gt;&amp;quot; and &amp;quot;&amp;lt;code&amp;gt;uhd_usrp_probe&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Thread priority scheduling==&lt;br /&gt;
&lt;br /&gt;
When UHD spawns a new thread, it may try to boost the thread's scheduling priority. If setting the new priority fails, the UHD software prints a warning to the console, as shown below. This warning is harmless; it simply means that the thread will retain a normal or default scheduling priority.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UHD Warning:&lt;br /&gt;
    Unable to set the thread priority. Performance may be negatively affected.&lt;br /&gt;
    Please see the general application notes in the manual for instructions.&lt;br /&gt;
    EnvironmentError: OSError: error in pthread_setschedparam&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To address this issue, non-privileged (non-root) users need to be given special permission to change the scheduling priority. This can be enabled by creating a group &amp;lt;code&amp;gt;usrp&amp;lt;/code&amp;gt;, adding your user to it, and then appending the line &amp;lt;code&amp;gt;@usrp - rtprio  99&amp;lt;/code&amp;gt; to the file &amp;lt;code&amp;gt;/etc/security/limits.conf&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    sudo groupadd usrp&lt;br /&gt;
    sudo usermod -aG usrp $USER&lt;br /&gt;
&lt;br /&gt;
Then add the line below to end of the file &amp;lt;code&amp;gt;/etc/security/limits.conf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    @usrp - rtprio  99&lt;br /&gt;
&lt;br /&gt;
You must log out and log back into the account for the settings to take effect. In most Linux distributions, a list of groups and group members can be found in the &amp;lt;code&amp;gt;/etc/group&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
There is further documentation about this in the User Manual at the link below.&lt;br /&gt;
&lt;br /&gt;
* [http://files.ettus.com/manual/page_general.html#general_threading_prio Threading Notes section of the User Manual]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Application Notes]]&lt;/div&gt;</summary>
		<author><name>MartinAnderseck</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Building_and_Installing_the_USRP_Open-Source_Toolchain_(UHD_and_GNU_Radio)_on_Linux&amp;diff=6018</id>
		<title>Building and Installing the USRP Open-Source Toolchain (UHD and GNU Radio) on Linux</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Building_and_Installing_the_USRP_Open-Source_Toolchain_(UHD_and_GNU_Radio)_on_Linux&amp;diff=6018"/>
				<updated>2024-02-14T13:17:13Z</updated>
		
		<summary type="html">&lt;p&gt;MartinAnderseck: Adding hints for new developers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Application Note Number==&lt;br /&gt;
'''AN-445'''&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This Application Note provides a comprehensive guide for building, installing, and maintaining the open-source toolchain for the USRP (UHD and GNU Radio) from source code on the Linux platform. The Ubuntu and Fedora distributions are specifically discussed. Several other alternate installation methods are also discussed.&lt;br /&gt;
&lt;br /&gt;
http://files.ettus.com/manual/page_build_guide.html#build_instructions_unix&lt;br /&gt;
&lt;br /&gt;
==UHD on Linux==&lt;br /&gt;
&lt;br /&gt;
UHD is fully supported on Linux, using the GCC compiler, and should work on most major Linux distributions.&lt;br /&gt;
&lt;br /&gt;
==Devices==&lt;br /&gt;
This document applies only to the USRP X300, X310, B200, B210, B200mini, N200, N210 devices. The E310 and E312 devices are embedded devices, and are fundamentally different from the other non-embedded USRP devices, and are not addressed by this document.&lt;br /&gt;
&lt;br /&gt;
==Install Linux==&lt;br /&gt;
&lt;br /&gt;
If you already have a recent version of Linux installed, then you may be able to skip this section. If you are starting from scratch, or simply want to start with a fresh new installation of Linux, then please follow the instructions and recommendations in this section.&lt;br /&gt;
&lt;br /&gt;
We suggest that you use either Ubuntu 16.04.5, Ubuntu 18.04, Ubuntu 18.10, Fedora 27, 28, 29, and that you use a 64-bit architecture, not a 32-bit architecture. There are several re-spins of Ubuntu, such as Xubuntu, Lubuntu, Kubuntu, Linux Mint, all of which should also work. For the purposes of this document, these re-spins can be considered equivalent. Both Ubuntu and Fedora are known to work well with UHD and GNU Radio.&lt;br /&gt;
&lt;br /&gt;
Download and install Ubuntu, Xubuntu, Linux Mint, or Fedora from the links below. Download the appropriate ISO image, and write it to a USB flash drive. Be sure to verify that the ISO file was not corrupted during the download process by checking the MD5 and/or SHA1 hash.&lt;br /&gt;
&lt;br /&gt;
* [http://www.ubuntu.com/download/desktop Ubuntu download page]&lt;br /&gt;
* [http://www.xubuntu.org/getxubuntu/ Xubuntu download page]&lt;br /&gt;
* [https://www.linuxmint.com/download.php Linux Mint download page]&lt;br /&gt;
* [https://getfedora.org/en/workstation/download/ Fedora download page]&lt;br /&gt;
&lt;br /&gt;
You can learn more about Ubuntu, Xubuntu, Linux Mint, and Fedora at the links below.&lt;br /&gt;
&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Ubuntu_%28operating_system%29 Wikipedia article on Ubuntu]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Xubuntu Wikipedia article on Xubuntu]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Linux_Mint Wikipedia article on Linux Mint]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Fedora_%28operating_system%29 Wikipedia article on Fedora]&lt;br /&gt;
&lt;br /&gt;
There are many tools for writing an ISO image to a USB flash drive. In Linux, you can use the &amp;quot;dd&amp;quot; utility, or the UNetbootin utility. On Ubuntu systems, there is also the Startup Disk Creator utility as well.&lt;br /&gt;
&lt;br /&gt;
* [http://unetbootin.sourceforge.net/ UNetbootin homepage]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/UNetbootin Wikipedia article on UNetbootin]&lt;br /&gt;
&lt;br /&gt;
* [https://launchpad.net/usb-creator Startup Disk Creator homepage]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Startup_Disk_Creator Wikipedia article on Startup Disk Creator]&lt;br /&gt;
* [http://www.ubuntu.com/download/desktop/create-a-usb-stick-on-ubuntu Article about Startup Disk Creator]&lt;br /&gt;
&lt;br /&gt;
Be sure to use a USB flash drive with at least 8 GB capacity, and use a USB 3.0 flash drive, not a USB 2.0 flash drive. If you use a slower USB 2.0 flash drive, then the install process will take significantly longer.&lt;br /&gt;
&lt;br /&gt;
==Update and Install dependencies==&lt;br /&gt;
&lt;br /&gt;
Before building UHD and GNU Radio, you need to make sure that all the dependencies are first installed.&lt;br /&gt;
&lt;br /&gt;
However, before installing any dependencies, you should first make sure that all the packages that are already installed on your system are up-to-date. You can do this from a GUI, or from the command-line, as shown below.&lt;br /&gt;
&lt;br /&gt;
On Ubuntu systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get update&lt;br /&gt;
&lt;br /&gt;
On Fedora 21 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo yum update&lt;br /&gt;
&lt;br /&gt;
On Fedora 22, 23, 24 and 25 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo dnf update&lt;br /&gt;
&lt;br /&gt;
Once the system has been updated, then install the required dependencies for UHD and GNU Radio.&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 20.04 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install autoconf automake build-essential ccache cmake cpufrequtils doxygen ethtool fort77 g++ gir1.2-gtk-3.0 git gobject-introspection gpsd gpsd-clients inetutils-tools libasound2-dev libboost-all-dev libcomedi-dev libcppunit-dev libfftw3-bin libfftw3-dev libfftw3-doc libfontconfig1-dev libgmp-dev libgps-dev libgsl-dev liblog4cpp5-dev libncurses5 libncurses5-dev libpulse-dev libqt5opengl5-dev libqwt-qt5-dev libsdl1.2-dev libtool libudev-dev libusb-1.0-0 libusb-1.0-0-dev libusb-dev libxi-dev libxrender-dev libzmq3-dev libzmq5 ncurses-bin python3-cheetah python3-click python3-click-plugins python3-click-threading python3-dev python3-docutils python3-gi python3-gi-cairo python3-gps python3-lxml python3-mako python3-numpy python3-numpy-dbg python3-opengl python3-pyqt5 python3-requests python3-scipy python3-setuptools python3-six python3-sphinx python3-yaml python3-zmq python3-ruamel.yaml swig wget&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 18.10 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-1.14-0 libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libqwt6abi1 libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev libncurses6-dbg libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-dev libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk3.0 git libqt4-dev python-numpy ccache python-opengl libgsl-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwtplot3d-qt5-dev pyqt4-dev-tools python-qwt5-qt4 cmake git wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq3-dev libzmq5 python-requests python-sphinx libcomedi-dev python-zmq libqwt-dev libqwt6abi1 python-six libgps-dev libgps23 gpsd gpsd-clients python-gps python-setuptools&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 18.04 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-1.14-0 libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libqwt6abi1 libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev libncurses5-dbg libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-dev libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk3.0 git libqt4-dev python-numpy ccache python-opengl libgsl-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwtplot3d-qt5-dev pyqt4-dev-tools python-qwt5-qt4 cmake git wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq3-dev libzmq5 python-requests python-sphinx libcomedi-dev python-zmq libqwt-dev libqwt6abi1 python-six libgps-dev libgps23 gpsd gpsd-clients python-gps python-setuptools&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 17.04 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-1.13-0v5 libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libqwt6abi1 libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev libncurses5-dbg libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-dev libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk3.0 git-core libqt4-dev python-numpy ccache python-opengl libgsl-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwt5-qt4-dev libqwtplot3d-qt4-dev pyqt4-dev-tools python-qwt5-qt4 cmake git-core wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq3-dev libzmq5 python-requests python-sphinx libcomedi-dev python-zmq python-setuptools&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 16.04 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-1.13-0v5 libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libqwt6abi1 libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev libncurses5-dbg libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-dev libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk3.0 git-core libqt4-dev python-numpy ccache python-opengl libgsl-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwt5-qt4-dev libqwtplot3d-qt4-dev pyqt4-dev-tools python-qwt5-qt4 cmake git-core wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq-dev libzmq1 python-requests python-sphinx libcomedi-dev python-zmq python-setuptools&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 15.04 and 15.10 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libqwt6 libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev  libncurses5-dbg libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-1.13-0v5 libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk2.8 git-core libqt4-dev python-numpy ccache python-opengl libgsl0-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwt5-qt4-dev libqwtplot3d-qt4-dev pyqt4-dev-tools python-qwt5-qt4 cmake git-core wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq-dev libzmq1 python-requests python-sphinx libcomedi-dev python-zmq python-setuptools&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 14.04 and 14.10 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-1.13-0 libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev libncurses5-dbg   libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-dev libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk2.8 git-core libqt4-dev python-numpy ccache python-opengl libgsl0-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwt5-qt4-dev libqwtplot3d-qt4-dev pyqt4-dev-tools python-qwt5-qt4 cmake git-core wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq1 libzmq-dev python-requests python-sphinx libcomedi-dev python-setuptools&lt;br /&gt;
&lt;br /&gt;
On Fedora 21 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo yum -y groupinstall &amp;quot;Engineering and Scientific&amp;quot; &amp;quot;Development Tools&amp;quot; &amp;quot;Software Development Tools&amp;quot; &amp;quot;C Development Tools and Libraries&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    sudo yum -y install fftw-devel cppunit-devel wxPython-devel boost-devel alsa-lib-devel numpy gsl-devel python-devel pygsl python-cheetah python-mako python-lxml PyOpenGL qt-devel qt qt4 qt4-devel PyQt4-devel qwt-devel qwtplot3d-qt4-devel libusbx-devel cmake git wget python-docutils cppzmq-devel PyQwt PyQwt-devel qwt-devel gtk2-engines xmlrpc-c-&amp;quot;*&amp;quot; tkinter orc orc-devel python-sphinx SDL-devel swig  zeromq2-devel python-zmq comedilib comedilib-devel thrift-devel python-thrift scipy zeromq zeromq-devel&lt;br /&gt;
			  &lt;br /&gt;
On Fedora 22, 23, 24 and 25 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo dnf -y groupinstall &amp;quot;Engineering and Scientific&amp;quot; &amp;quot;Development Tools&amp;quot; &amp;quot;C Development Tools and Libraries&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
    sudo dnf -y install fftw-devel cppunit-devel wxPython-devel boost-devel alsa-lib-devel numpy gsl-devel python-devel pygsl python-cheetah python-mako python-lxml PyOpenGL qt-devel PyQt4-devel qwt-devel qwtplot3d-qt4-devel libusbx-devel cmake python-docutils PyQwt PyQwt-devel gtk2-engines xmlrpc-c-&amp;quot;*&amp;quot; tkinter orc-devel python-sphinx SDL-devel swig perl-ZMQ-LibZMQ2 perl-ZMQ-LibZMQ2 zeromq zeromq-devel python-requests gcc-c++ doxygen zeromq-ada-devel cppzmq-devel perl-ZeroMQ amavisd-new-zeromq amavisd-new-snmp-zeromq php-zmq python-zmq czmq uwsgi-logger-zeromq comedilib comedilib-devel pygtk2 ncurses-&amp;quot;*&amp;quot; thrift-devel python-thrift scipy&lt;br /&gt;
&lt;br /&gt;
After installing the dependencies, you should reboot the system.&lt;br /&gt;
&lt;br /&gt;
If the installation of the dependencies completes without any errors, then you can proceed to build and install UHD and GNU Radio.&lt;br /&gt;
&lt;br /&gt;
==Building and installing UHD from source code==&lt;br /&gt;
&lt;br /&gt;
UHD is open-source, and is hosted on GitHub. You can browse the code online at the link below, which points to version 3.14.0.0, which is the the latest release at the time of this writing.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/EttusResearch/uhd/tree/v3.14.0.0 UHD repository on GitHub]&lt;br /&gt;
&lt;br /&gt;
There are several good reasons to build GNU Radio from source code, especially for doing development and prototyping. It it enables an easy way to customize the location of the installation, and to install multiple UHD versions in parallel, and switch between them. It also provides much more flexibility in upgrading and downgrading versions, and allows the user to modify the code and create customized versions, which could possibly include a patch or other bug-fix.&lt;br /&gt;
&lt;br /&gt;
To build UHD from source code, clone the GitHub repository, check out a branch or tagged release of the repository, and build and install. Please follow the steps below. Make sure that no USRP device is connected to the system at this point.&lt;br /&gt;
&lt;br /&gt;
First, make a folder to hold the repository.&lt;br /&gt;
&lt;br /&gt;
    cd $HOME&lt;br /&gt;
    mkdir workarea&lt;br /&gt;
    cd workarea&lt;br /&gt;
&lt;br /&gt;
Next, clone the repository and change into the cloned directory.&lt;br /&gt;
&lt;br /&gt;
    git clone &amp;lt;nowiki&amp;gt;https://github.com/EttusResearch/uhd&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
    cd uhd&lt;br /&gt;
&lt;br /&gt;
Next, checkout the desired UHD version. You can get a full listing of tagged releases by running the command:&lt;br /&gt;
&lt;br /&gt;
    git tag -l&lt;br /&gt;
&lt;br /&gt;
''Example truncated output of &amp;lt;code&amp;gt;git tag -l&amp;lt;/code&amp;gt;:''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git tag -l&lt;br /&gt;
...&lt;br /&gt;
release_003_009_004&lt;br /&gt;
release_003_009_005&lt;br /&gt;
release_003_010_000_000&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note''': As of UHD Version 3.10.0.0, the versioning scheme has changed to be a quadruplet format. Each element and version will follow the format of: '''Major.API.ABI.Patch'''. Additional details on this versioning change can be found [https://files.ettus.com/manual/page_semver.html here]. &lt;br /&gt;
&lt;br /&gt;
After identifying the version and corresponding release tag you need, check it out:&lt;br /&gt;
&lt;br /&gt;
    # Example: For UHD 3.9.5:&lt;br /&gt;
    git checkout release_003_009_005&lt;br /&gt;
&lt;br /&gt;
    # Example: For UHD 3.14.0.0&lt;br /&gt;
    git checkout v3.14.0.0&lt;br /&gt;
&lt;br /&gt;
Next, create a build folder within the repository.&lt;br /&gt;
&lt;br /&gt;
    cd host&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
&lt;br /&gt;
Next, invoke CMake.&lt;br /&gt;
&lt;br /&gt;
    cmake ..&lt;br /&gt;
&lt;br /&gt;
'''Note''': By default, UHD will be installed into the prefix &amp;lt;code&amp;gt;/usr/local&amp;lt;/code&amp;gt;. This can be changed by adding &amp;lt;code&amp;gt;-DCMAKE_INSTALL_PREFIX=XXX&amp;lt;/code&amp;gt; to install into the prefix &amp;lt;code&amp;gt;XXX&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
'''Note''': if the shell &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; is set such that &amp;lt;code&amp;gt;/bin&amp;lt;/code&amp;gt; comes before &amp;lt;code&amp;gt;/usr/bin&amp;lt;/code&amp;gt;, then this step is likely to fail because cmake will set the &amp;lt;code&amp;gt;FIND_ROOT_PATH&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; and this setting will fail as a prefix for Boost headers or libraries. The cmake output will include messages such as&lt;br /&gt;
&lt;br /&gt;
    --   Boost include directories: /include&lt;br /&gt;
    --   Boost library directories: /lib/x86_64-linux-gnu&lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
    CMake Error in lib/CMakeLists.txt:&lt;br /&gt;
      Imported target &amp;quot;Boost::chrono&amp;quot; includes non-existent path&lt;br /&gt;
        &amp;quot;/include&amp;quot;&lt;br /&gt;
      in its INTERFACE_INCLUDE_DIRECTORIES.  Possible reasons include:&lt;br /&gt;
      * The path was deleted, renamed, or moved to another location.&lt;br /&gt;
      * An install or uninstall procedure did not complete successfully.&lt;br /&gt;
      * The installation package was faulty and references files it does not provide.&lt;br /&gt;
&lt;br /&gt;
One of the following 3 options should fix this situation:&lt;br /&gt;
&lt;br /&gt;
      1. &amp;lt;code&amp;gt;/usr/bin/cmake ..&amp;lt;/code&amp;gt;&lt;br /&gt;
      2. &amp;lt;code&amp;gt;PATH=/usr/bin:$PATH cmake ..&amp;lt;/code&amp;gt;&lt;br /&gt;
      3. &amp;lt;code&amp;gt;cmake -DCMAKE_FIND_ROOT_PATH=/usr ..&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once the cmake command succeeds without errors, build UHD.&lt;br /&gt;
&lt;br /&gt;
    make&lt;br /&gt;
&lt;br /&gt;
'''Note''': Use e.g. &amp;lt;code&amp;gt;make -j4&amp;lt;/code&amp;gt; to use 4 CPU cores during the build.&lt;br /&gt;
&lt;br /&gt;
Next, you can optionally run some basic tests to verify that the build process completed properly.&lt;br /&gt;
&lt;br /&gt;
    make test&lt;br /&gt;
&lt;br /&gt;
Next, install UHD, using the default install prefix, which will install UHD under the /usr/local/lib folder. You need to run this as root due to the permissions on that folder.&lt;br /&gt;
&lt;br /&gt;
    sudo make install&lt;br /&gt;
&lt;br /&gt;
Next, update the system's shared library cache.&lt;br /&gt;
&lt;br /&gt;
    sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Finally, make sure that the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable is defined and includes the folder under which UHD was installed. Most commonly, you can add the line below to the end of your &amp;lt;code&amp;gt;$HOME/.bashrc&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&lt;br /&gt;
    export LD_LIBRARY_PATH=/usr/local/lib&lt;br /&gt;
&lt;br /&gt;
On Fedora 22/23/24/25 you will need to set the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/usr/local/lib64&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    export LD_LIBRARY_PATH=/usr/local/lib64&lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable is already defined with other folders in your &amp;lt;code&amp;gt;$HOME/.bashrc&amp;lt;/code&amp;gt; file, then add the line below to the end of your &amp;lt;code&amp;gt;$HOME/.bashrc&amp;lt;/code&amp;gt; file to preserve the current settings.&lt;br /&gt;
 &lt;br /&gt;
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib&lt;br /&gt;
&lt;br /&gt;
For Fedora 21/22/23/24/25&lt;br /&gt;
&lt;br /&gt;
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64&lt;br /&gt;
&lt;br /&gt;
For this change to take effect, you will need to close the current terminal window, and open a new terminal.&lt;br /&gt;
&lt;br /&gt;
At this point, UHD should be installed and ready to use. You can quickly test this, with no USRP device attached, by running &amp;lt;code&amp;gt;uhd_find_devices&amp;lt;/code&amp;gt;. You should see something similar to the following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
linux; GNU C++ version 4.8.4; Boost_105400; UHD_003.010.000.HEAD-0-g6e1ac3fc&lt;br /&gt;
&lt;br /&gt;
No UHD Devices Found&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Downloading the UHD FPGA Images===&lt;br /&gt;
You can now download the UHD FPGA Images for this installation. This can be done by running the command &amp;lt;code&amp;gt;uhd_images_downloader&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader&lt;br /&gt;
&lt;br /&gt;
Note: Since this installation is being installed to a system level directory (e.g. &amp;lt;code&amp;gt;/usr/local&amp;lt;/code&amp;gt;), the &amp;lt;code&amp;gt;uhd_images_downloader&amp;lt;/code&amp;gt; command requires &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; privileges.&lt;br /&gt;
&lt;br /&gt;
Example ouput for UHD 3.13.3.0:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo uhd_images_downloader &lt;br /&gt;
Images destination:      /usr/local/share/uhd/images&lt;br /&gt;
Downloading images from: http://files.ettus.com/binaries/images/uhd-images_003.010.003.000-release.zip&lt;br /&gt;
Downloading images to:   /tmp/tmpm46JDg/uhd-images_003.010.003.000-release.zip&lt;br /&gt;
57009 kB / 57009 kB (100%)&lt;br /&gt;
&lt;br /&gt;
Images successfully installed to: /usr/local/share/uhd/images&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example output for UHD 3.13:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo uhd_images_downloader&lt;br /&gt;
[INFO] Images destination: /usr/local/share/uhd/images&lt;br /&gt;
[INFO] No inventory file found at /usr/local/share/uhd/images/inventory.json. Creating an empty one.&lt;br /&gt;
00006 kB / 00006 kB (100%) usrp1_b100_fw_default-g6bea23d.zip&lt;br /&gt;
19484 kB / 19484 kB (100%) x3xx_x310_fpga_default-g494ae8bb.zip&lt;br /&gt;
02757 kB / 02757 kB (100%) usrp2_n210_fpga_default-g6bea23d.zip&lt;br /&gt;
02109 kB / 02109 kB (100%) n230_n230_fpga_default-g494ae8bb.zip&lt;br /&gt;
00522 kB / 00522 kB (100%) usrp1_b100_fpga_default-g6bea23d.zip&lt;br /&gt;
00474 kB / 00474 kB (100%) b2xx_b200_fpga_default-g494ae8bb.zip&lt;br /&gt;
02415 kB / 02415 kB (100%) usrp2_n200_fpga_default-g6bea23d.zip&lt;br /&gt;
05920 kB / 05920 kB (100%) e3xx_e320_fpga_default-g494ae8bb.zip&lt;br /&gt;
15883 kB / 15883 kB (100%) n3xx_n310_fpga_default-g494ae8bb.zip&lt;br /&gt;
00506 kB / 00506 kB (100%) b2xx_b205mini_fpga_default-g494ae8bb.zip&lt;br /&gt;
18676 kB / 18676 kB (100%) x3xx_x300_fpga_default-g494ae8bb.zip&lt;br /&gt;
00017 kB / 00017 kB (100%) octoclock_octoclock_fw_default-g14000041.zip&lt;br /&gt;
04839 kB / 04839 kB (100%) usb_common_windrv_default-g14000041.zip&lt;br /&gt;
00007 kB / 00007 kB (100%) usrp2_usrp2_fw_default-g6bea23d.zip&lt;br /&gt;
00009 kB / 00009 kB (100%) usrp2_n200_fw_default-g6bea23d.zip&lt;br /&gt;
00450 kB / 00450 kB (100%) usrp2_usrp2_fpga_default-g6bea23d.zip&lt;br /&gt;
00142 kB / 00142 kB (100%) b2xx_common_fw_default-g3ff4186b.zip&lt;br /&gt;
00460 kB / 00460 kB (100%) b2xx_b200mini_fpga_default-g494ae8bb.zip&lt;br /&gt;
00319 kB / 00319 kB (100%) usrp1_usrp1_fpga_default-g6bea23d.zip&lt;br /&gt;
00009 kB / 00009 kB (100%) usrp2_n210_fw_default-g6bea23d.zip&lt;br /&gt;
11537 kB / 11537 kB (100%) n3xx_n300_fpga_default-g494ae8bb.zip&lt;br /&gt;
05349 kB / 05349 kB (100%) e3xx_e310_fpga_default-g494ae8bb.zip&lt;br /&gt;
00866 kB / 00866 kB (100%) b2xx_b210_fpga_default-g494ae8bb.zip&lt;br /&gt;
[INFO] Images download complete.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Building and installing GNU Radio from source code==&lt;br /&gt;
&lt;br /&gt;
As with UHD, GNU Radio is open-source and is hosted on GitHub. You can browse the code online at the link below, which points to version &amp;lt;code&amp;gt;v3.7.13.4&amp;lt;/code&amp;gt;, which is the the latest release at the time of this writing.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/gnuradio/gnuradio/tree/v3.7.13.4 GNU Radio repository on GitHub]&lt;br /&gt;
&lt;br /&gt;
Note: GNU Radio is currently transitioning from major branches of 3.7.x.x to 3.8.x.x. It is generally recommend at this time to use either the &amp;lt;code&amp;gt;v3.7.13.4&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;maint-3.7&amp;lt;/code&amp;gt; branch of GNU Radio. The &amp;lt;code&amp;gt;master&amp;lt;/code&amp;gt; branch includes many major changes such as converting to use Python 3 and may be unstable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As with UHD, there are several good reasons to build GNU Radio from source code, especially for doing development and prototyping. It it enables an easy way to customize the location of the installation, and to install multiple GNU Radio versions in parallel, and switch between them. It also provides much more flexibility in upgrading and downgrading versions, and allows the user to modify the code and create customized versions, which could possibly include a patch or other bug-fix.&lt;br /&gt;
&lt;br /&gt;
Similar to the process for UHD, to build GNU Radio from source code, clone the GitHub repository, check out a branch or tagged release of the repository, and build and install. Please follow the steps below. Make sure that no USRP device is connected to the system at this point.&lt;br /&gt;
&lt;br /&gt;
First, make a folder to hold the repository.&lt;br /&gt;
&lt;br /&gt;
    cd $HOME&lt;br /&gt;
    cd workarea&lt;br /&gt;
&lt;br /&gt;
Next, clone the repository.&lt;br /&gt;
&lt;br /&gt;
    git clone --recursive &amp;lt;nowiki&amp;gt;https://github.com/gnuradio/gnuradio&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, go into the repository and check out the desired GNU Radio version.&lt;br /&gt;
&lt;br /&gt;
    cd gnuradio&lt;br /&gt;
&lt;br /&gt;
To checkout the &amp;lt;code&amp;gt;v3.7.13.4&amp;lt;/code&amp;gt; branch:&lt;br /&gt;
&lt;br /&gt;
    git checkout v3.7.13.4&lt;br /&gt;
&lt;br /&gt;
Or to checkout the &amp;lt;code&amp;gt;maint-3.7&amp;lt;/code&amp;gt; branch:&lt;br /&gt;
&lt;br /&gt;
    git checkout maint-3.7&lt;br /&gt;
&lt;br /&gt;
Next, update the submodules:&lt;br /&gt;
&lt;br /&gt;
    git submodule update --init --recursive&lt;br /&gt;
&lt;br /&gt;
Next, create a build folder within the repository, invoke CMake, and build GNU Radio:&lt;br /&gt;
&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake ../&lt;br /&gt;
    make&lt;br /&gt;
&lt;br /&gt;
Next, you can optionally run some basic tests to verify that the build process completed properly.&lt;br /&gt;
&lt;br /&gt;
    make test&lt;br /&gt;
&lt;br /&gt;
Next, install GNU Radio, using the default install prefix, which will install GNU Radio under the /usr/local/lib folder. You need to run this as root due to the permissions on that folder.&lt;br /&gt;
&lt;br /&gt;
    sudo make install&lt;br /&gt;
&lt;br /&gt;
Finally, update the system's shared library cache.&lt;br /&gt;
&lt;br /&gt;
    sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
At this point, GNU Radio should be installed and ready to use. You can quickly test this, with no USRP device attached, by running the following quick tests.&lt;br /&gt;
&lt;br /&gt;
    gnuradio-config-info --version&lt;br /&gt;
    gnuradio-config-info --prefix&lt;br /&gt;
    gnuradio-config-info --enabled-components&lt;br /&gt;
&lt;br /&gt;
There is a simple flowgraph that you can run that does not require any USRP hardware. It's called the dialtone test, and it produces a PSTN dial tone on the computer's speakers. Running it verifies that all the libraries can be found, and that the GNU Radio run-time is working.&lt;br /&gt;
&lt;br /&gt;
    python $HOME/workarea/gnuradio/gr-audio/examples/python/dial_tone.py&lt;br /&gt;
&lt;br /&gt;
You can try launching the GNU Radio Companion (GRC) tool, a visual tool for building and running GNU Radio flowgraphs.&lt;br /&gt;
&lt;br /&gt;
    gnuradio-companion&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;gnuradio-companion&amp;quot; does not start and complains about the &amp;lt;code&amp;gt;PYTHONPATH&amp;lt;/code&amp;gt; environment variable, then you may have to set this in your &amp;lt;code&amp;gt;$HOME/.bashrc&amp;lt;/code&amp;gt; file, as shown below.&lt;br /&gt;
&lt;br /&gt;
    export PYTHONPATH=/usr/local/lib/python2.7/dist-packages&lt;br /&gt;
&lt;br /&gt;
On Fedora 21/22/23/24, the &amp;lt;code&amp;gt;PYTHONPATH&amp;lt;/code&amp;gt; environment variable will need to be set to:&lt;br /&gt;
&lt;br /&gt;
    export PYTHONPATH=/usr/lib/python2.7/site-packages:/usr/local/lib64/python2.7/site-packages/&lt;br /&gt;
&lt;br /&gt;
==Configuring USB==&lt;br /&gt;
&lt;br /&gt;
On Linux, udev handles USB plug and unplug events. The following commands install a udev rule so that non-root users may access the device. This step is only necessary for devices that use USB to connect to the host computer, such as the B200, B210, and B200mini. This setting should take effect immediately and does not require a reboot or logout/login. Be sure that no USRP device is connected via USB when running these commands.&lt;br /&gt;
&lt;br /&gt;
    cd $HOME/workarea/uhd/host/utils&lt;br /&gt;
    sudo cp uhd-usrp.rules /etc/udev/rules.d/&lt;br /&gt;
    sudo udevadm control --reload-rules&lt;br /&gt;
    sudo udevadm trigger&lt;br /&gt;
&lt;br /&gt;
==Configuring Ethernet==&lt;br /&gt;
&lt;br /&gt;
For USRP devices that use Ethernet to connect to the host computer, such as the N200, N210, X300, X310, set a static IP address for your system of 192.168.10.1, with a netmask of 255.255.255.0. The default IP address of the USRP is 192.168.10.2, with a netmask of 255.255.255.0. You should probably set the IP address using the graphical Network Manager. If you set the IP address from the command line with &amp;lt;code&amp;gt;ifconfig&amp;lt;/code&amp;gt;, Network Manager will probably overwrite these settings.&lt;br /&gt;
&lt;br /&gt;
==Connect the USRP==&lt;br /&gt;
&lt;br /&gt;
The installation of UHD and GNU Radio should now be complete. At this point, connect the USRP to the host computer.&lt;br /&gt;
&lt;br /&gt;
If the interface is Ethernet, then open a terminal window, and try to ping the USRP with &amp;quot;ping 192.168.10.2&amp;quot;. The USRP should respond to the ping requests.&lt;br /&gt;
&lt;br /&gt;
If the interface is USB, then open a terminal window, and run &amp;quot;&amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt;&amp;quot;. You should see the USRP listed on the USB bus with a VID of &amp;lt;code&amp;gt;2500&amp;lt;/code&amp;gt; and PID of &amp;lt;code&amp;gt;0020&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0021&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0022&amp;lt;/code&amp;gt;, for B200, B210, B200mini, respectively.&lt;br /&gt;
&lt;br /&gt;
Also try running &amp;quot;&amp;lt;code&amp;gt;uhd_find_devices&amp;lt;/code&amp;gt;&amp;quot; and &amp;quot;&amp;lt;code&amp;gt;uhd_usrp_probe&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Thread priority scheduling==&lt;br /&gt;
&lt;br /&gt;
When UHD spawns a new thread, it may try to boost the thread's scheduling priority. If setting the new priority fails, the UHD software prints a warning to the console, as shown below. This warning is harmless; it simply means that the thread will retain a normal or default scheduling priority.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UHD Warning:&lt;br /&gt;
    Unable to set the thread priority. Performance may be negatively affected.&lt;br /&gt;
    Please see the general application notes in the manual for instructions.&lt;br /&gt;
    EnvironmentError: OSError: error in pthread_setschedparam&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To address this issue, non-privileged (non-root) users need to be given special permission to change the scheduling priority. This can be enabled by creating a group &amp;lt;code&amp;gt;usrp&amp;lt;/code&amp;gt;, adding your user to it, and then appending the line &amp;lt;code&amp;gt;@usrp - rtprio  99&amp;lt;/code&amp;gt; to the file &amp;lt;code&amp;gt;/etc/security/limits.conf&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    sudo groupadd usrp&lt;br /&gt;
    sudo usermod -aG usrp $USER&lt;br /&gt;
&lt;br /&gt;
Then add the line below to end of the file &amp;lt;code&amp;gt;/etc/security/limits.conf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    @usrp - rtprio  99&lt;br /&gt;
&lt;br /&gt;
You must log out and log back into the account for the settings to take effect. In most Linux distributions, a list of groups and group members can be found in the &amp;lt;code&amp;gt;/etc/group&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
There is further documentation about this in the User Manual at the link below.&lt;br /&gt;
&lt;br /&gt;
* [http://files.ettus.com/manual/page_general.html#general_threading_prio Threading Notes section of the User Manual]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Application Notes]]&lt;/div&gt;</summary>
		<author><name>MartinAnderseck</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=About_Sampling_Rates_and_Master_Clock_Rates_for_the_USRP_X440&amp;diff=6004</id>
		<title>About Sampling Rates and Master Clock Rates for the USRP X440</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=About_Sampling_Rates_and_Master_Clock_Rates_for_the_USRP_X440&amp;diff=6004"/>
				<updated>2024-01-16T10:10:46Z</updated>
		
		<summary type="html">&lt;p&gt;MartinAnderseck: Add note about Fc in the TX as soon as ADCs/DACs are turned on.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- Title: About Sampling Rates and Master Clock Rates for the USRP X440 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Application Note Number and Authors ==&lt;br /&gt;
&lt;br /&gt;
'''AN-055''' by Marian Koop and Martin Anderseck&lt;br /&gt;
&amp;lt;!-- Internal use only: please do keep this updated!&lt;br /&gt;
==Revision History==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Author&lt;br /&gt;
!Details&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2023-09-22&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Marian Koop &lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Initial creation&lt;br /&gt;
|} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;overview&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Overview = &lt;br /&gt;
This application note guides users through the selection process of Master Clock Rates (MCR) for the [https://kb.ettus.com/X440#X440 USRP X440]. It will highlight possible implications and side effects as well as design specific differences to other USRPs (like the X410).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;x440-cfg_considerations&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= USRP X440 Configuration Considerations = &lt;br /&gt;
The USRP X440 is a [https://uhd.readthedocs.io/en/latest/page_fbx.html#fbx_too balun-coupled transceiver] without built-in RF signal conditioning. Compared to other RF architectures this enables the USRP X440 to access the full RF bandwidth available to the ADC/DAC, but also requires additional frequency planning. To achieve this, the USRP X440 utilizes its ADC/DAC in direct sampling mode and is susceptible to various effects that may distort the signal of interest. These can be separated into distortions from both signal processing and from the ADC/DAC design.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;converter_rate-mcr-iq_rate&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Relationship between RF-ADC/DAC Converter Rate, USRP Master Clock Rate (MCR), Data IQ rate ==&lt;br /&gt;
Except for the 200 MHz variant, the default USRP X440 FPGA images do not contain a configurable DDC&amp;lt;ref&amp;gt;Digital Down Conversion&amp;lt;/ref&amp;gt;/DUC&amp;lt;ref&amp;gt;Digital Up Conversion&amp;lt;/ref&amp;gt; block. This means that the IQ sample rate (F&amp;lt;sub&amp;gt;IQ&amp;lt;/sub&amp;gt;) is the same as the Master Clock Rate (MCR) that goes into the RFNoC Radio block. However, unlike most other USRPs the USRP X440 supports a highly variable MCR. The RF Data Converter sampling rate (F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;) is chosen by UHD based on the MCR and the available resampling factors of 2, 4, or 8, and defaults to the highest achievable values with these factors. This can be overridden if the desired MCR can be achieved with multiple converter rates (see device argument [https://uhd.readthedocs.io/en/latest/page_usrp_x4xx.html#x4xx_usage_args converter_rate]). The inverse calculation - divide the converter rate by 8, 4 or 2 - has to be done to derive the master clock rate if a specific converter rate shall be used. Figure 1 depicts the simplified signal path block diagram for the USRP X440.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|+ Figure 1. Simplified USRP X440 Signal Path&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-X440_signal_path.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dsp-distortions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Aliases and Nyquist Zones ==&lt;br /&gt;
By itself the USRP X440 can sample input signals at frequencies above the Nyquist frequency&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Nyquist_frequency Nyquist frequency]&amp;lt;/ref&amp;gt;, which is half of the ADC converter sampling rate (F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;). However, this method introduces aliasing effects, which cause unwanted signals to appear as mirror images around multiples of the Nyquist frequency (F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/2) in the output spectrum. The first Nyquist zone (N1) is the frequency range from 0 to F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/2, and the second Nyquist zone (N2) goes from F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/2 to F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;. Other Nyquist zones are numbered in ascending order, each spanning F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/2. The digital passband in each Nyquist zone can be calculated as 0.4 * F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt; (see also &amp;lt;ref&amp;gt;[https://docs.xilinx.com/r/en-US/pg269-rf-data-converter/RF-ADC-Decimation-Filters-Gen-1/Gen-2 Xilinx RF-ADC Decimation Filters (Gen-1)]&amp;lt;/ref&amp;gt;). The following figure depicts the Nyquist zones for the minimum and maximum RF-ADC converter rates supported by the USRP X440. Note that the illustrations do not show the effects of external, analog filters on the achievable passband within a Nyquist zone. A typical expectation is, that the unusable frequency range around each Nyquist zone boundary (also often referred to as a guard band) increases with ascending Nyquist zone order and results in decreasing, lopsided achievable passbands.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|+ Figure 2. Nyquist Zones&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-X440_nyquist_zones.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Knowledge of signal aliases can both be exploited and create uncertainties. Applications could utilize intentional under sampling (also referred as &amp;quot;bandpass sampling&amp;quot;) to receive signals at greater than F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/2. The same effect may on the other hand lead to garbled or distorted signal detection if the signal of interest spans multiple Nyquist zones or interferer signals are aliased into the observed spectrum. Both effects are depicted in figure 3.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|+ Figure 3. Aliases - Wanted and unwanted&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-wanted_and_unwanted_aliases.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Applications should therefore prefer converter rates that can contain the desired signal spectrum in a single Nyquist zone, or split the signal spectrum among multiple channels and devices. While the USRP X440 does not limit the utilized Nyquist zone, performance degrades in higher orders zones and application should focus on operating in Nyquist zones 1 and 2 (For RX, zone 3 is possible, but zones 4 and higher result into significant performance degradation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adc-distortions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== RF-ADC Spurs to consider and how to predict them ==&lt;br /&gt;
Another kind of distortion originates from the ADC/DAC itself. The USRP X440 uses the Xilinx RFDC, which is a design that combines multiple converters to &lt;br /&gt;
achieve high RF-ADC rates. An RF-ADC in this design has 8 sub-ADCs that are interleaved together. The resulting offset spurs are minimized by the integrated self-calibration (see also &amp;lt;ref&amp;gt;[https://docs.xilinx.com/r/en-US/pg269-rf-data-converter/Key-CAL-Features-and-Guidance-Summary Key CAL Features and Guidance Summary]&amp;lt;/ref&amp;gt;) executed by UHD but may still be detectable in the signal spectrum.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|+ Figure 4. RF-ADC Spurs with MCR = 500 MHz&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-adc_distortions.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Even with the best calibration the RF-ADC spurs may still be detectable in the captured spectrum. Knowledge of the location of the spurs, in particular the RF-ADC offset spur may be used during frequency planning to select an MCR (and converter rate) that exclude the offset spur frequencies from the capture spectrum. RF-ADC input spurs on the other hand will be more difficult to avoid, but as rule of thumb for modulated input signals carrier frequencies that fall on an RF-ADC offset spur frequency should be avoided (because offset and input spurs would superimpose each other).&lt;br /&gt;
&lt;br /&gt;
=== How to predict offset spurs ===&lt;br /&gt;
Any residual DC offset not corrected appears as a spur at k*F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/N, where F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt; is the composite converter rate of the RF-ADC, N is the number of sub-RF-ADCs interleaved together (8 for X4xx devices), and k = 0, 1, 2, … N.&lt;br /&gt;
For more information on expected spurs levels, refer to OIS at &amp;lt;ref&amp;gt;[https://docs.xilinx.com/r/en-US/ds926-zynq-ultrascale-plus-rfsoc/RF-ADC-Performance-Characteristics RF-ADC Performance Characteristics]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== How to predict input spurs ===&lt;br /&gt;
Any residual difference from gain and time skew correction results in spurious signals at +/-f&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt; + (k/N)*F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;, where F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt; is the converter rate of the RF-ADC, N is the number of sub-RF-ADCs (8 for X4xx devices), and f&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt; is the frequency of the input signal.&lt;br /&gt;
For more information on expected spurs levels, refer to GTIS at &amp;lt;ref&amp;gt;[https://docs.xilinx.com/r/en-US/ds926-zynq-ultrascale-plus-rfsoc/RF-ADC-Performance-Characteristics RF-ADC Performance Characteristics]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dac-distortions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== RF-DAC Distortions ==&lt;br /&gt;
Like the RF-ADC, the RF-DAC is also not an ideal circuitry and suffers from zero-order hold reconstruction. To counter this undesired attenuation in all but the first Nyquist zone, the Xilinx RF-DAC offers a Mix-Mode, which improves the power response in the second Nyquist zone and is utilized by the USRP X440. This, together with an inverse sinc filter to counter residual distortion limits the practical use of the RF-DAC to the first two Nyquist zones. For more information on the RF-DAC mix-mode and inverse sinc filter characteristics, refer to &amp;lt;ref&amp;gt;[https://docs.xilinx.com/r/en-US/pg269-rf-data-converter/RF-DAC-Nyquist-Zone-Operation RF-DAC Nyquist Zone Operation]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|+ Figure 5 &amp;lt;ref&amp;gt;[https://docs.xilinx.com/viewer/attachment/wIPPkVrh~0jtjy6aqWeihQ/q5kXcl5Z7lFon2v535oW0w Xilinx: Ideal DAC Output Response, Normalised to Fsample]&amp;lt;/ref&amp;gt;. RF-DAC Mix-Mode and normal, ideal roll-off sinc response.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-dac_roll-off_sinc_response.png|350px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
source: https://docs.xilinx.com/viewer/attachment/wIPPkVrh~0jtjy6aqWeihQ/q5kXcl5Z7lFon2v535oW0w&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Note: Due to the direct sampling architecture without filters on the FBX daughterboard, TX ports will output the converter rate (Fc) with a low power (&amp;lt;-50 dBm) as soon as the corresponding ADCs and DACs are enabled, even if the DACs are not actively transmitting. This is a known limitation of the X440 and FBX design. For instance when acquiring a signal on the RX1 port of RF0, the converter rate (Fc) can be measured on the TX/RX0 port of RF0. While operation around the converter rate (Fc) is not recommended anyway, it is possible to suppress the converter rate (Fc) by using a frontend module with a sufficiently high attenuation at the converter rate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dual-rate&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Dual Rate ==&lt;br /&gt;
Unlike previous USRPs, the USRP X440 supports the operation at two different master clock rates simultaneously. All channels on the first daughterboard will run on the first master clock rate / sampling rate and all channels on the second daughterboard will run on the second configured master clock rate / sampling rate. The main motivation for having two different master clock rates is the direct sampling architecture of the USRP X440 without signal conditioning and filtering. While [[#dsp-distortions|Aliases and Nyquist Zones]] describes the challenges of that, with dual rate this feature can be used to capture an RF spectrum that exceeds the bandwidth abilities of the single rate operation. Using a second rate, one can close the Nyquist gap of the other and monitor a wider spectrum for further processing.&lt;br /&gt;
As the clocks of both radios are derived from a common clocking chip, not all combinations are possible. Refer to [[#X440-supported-dual-rates|X440 Supported Dual Rates]] for possible RF Data Converter sampling rate combinations. The section about the [[#converter_rate-mcr-iq_rate|Relationship between RFADC/DAC Converter Rate, USRP Master Clock Rate (MCR) and Data IQ rate]] explains how to derive valid master clock rates from the RF Data converter sampling rates.&lt;br /&gt;
&lt;br /&gt;
Note: When using different MCRs for both daughterboards, the device will skip the multi-tile synchronization. That means that the phase relationship between channels may not be preserved over retunes and reboots for channels of the same daughterboard and no defined phase relationship will be preserved between channels of different daughterboards.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;use-cases&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Use cases =&lt;br /&gt;
== Scan Spectrum within single Nyquist zone ==&lt;br /&gt;
=== Spectrum Capture between 1.7 and 1.9 GHz. ===&lt;br /&gt;
* Min Bandwidth: 200 MHz&lt;br /&gt;
* Minimum IQ Rate: 250 MSps&lt;br /&gt;
==== Option 1: MCR = 250 MHz, RF-ADC converter rate = 2 GHz ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-1700-1800_250e6_2000e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This is not the best option because our spectrum of interest is very close to a Nyquist zone boundary.&lt;br /&gt;
&lt;br /&gt;
==== Option 2: MCR = 300 MHz, RF-ADC converter rate = 2.4 GHz ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-1700-1800_300e6_2400e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This option is better, the spectrum of interest is well within a Nyquist zone. Within the bandwidth of interest falls one of the ADC offset spurs. If the input signal is relatively strong, the impact from this small spur is negligible. If on the other hand the input signal strength is on the low end (for the X440), then maybe a different MCR should be considered.&lt;br /&gt;
&lt;br /&gt;
==== Option 3: MCR = 320 MHz, RF-ADC converter rate = 2.56 GHz ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-1700-1800_320e6_2560e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This option avoids a potential impact of an ADC offset spur in the observed spectrum. The only drawback to option 2 is the slightly higher data rate during host post-processing.&lt;br /&gt;
&lt;br /&gt;
=== Spectrum Capture between 500 MHz and 1.5 GHz. ===&lt;br /&gt;
The USRP X440 ships with multiple [https://uhd.readthedocs.io/en/latest/page_usrp_x4xx.html#x4xx_updating_fpga_types FPGA image flavors]. These either support 400 MHz or 1600 MHz RF bandwidth per channel. To address this use case, users have the option of using a bit file with 1600 MHz RF bandwidth to capture a contiguous spectrum, or use a 400 MHz bit file and create a stitched spectrum during host side post-processing. &lt;br /&gt;
==== Using 1600 MHz image ====&lt;br /&gt;
* Min Bandwidth: 1000 MHz&lt;br /&gt;
* Minimum IQ Rate: 1250 MSps&lt;br /&gt;
===== Option 1: MCR = 1280 MHz, RF-ADC converter rate = 2.56 GHz =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_1250e6_2560e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
Bad option, because desired spectrum spans multiple Nyquist zones.&lt;br /&gt;
&lt;br /&gt;
===== Option 2: MCR = 1600 MHz, RF-ADC converter rate = 3.2 GHz =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_1600e6_3200e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This is not the best option because our spectrum of interest is very close to a Nyquist zone boundary.&lt;br /&gt;
&lt;br /&gt;
===== Option 3: MCR = 1689.6 MHz, RF-ADC converter rate = 3.3792 GHz =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_1689e6_3379e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This option would work. If the input signal strength is low, using an even higher MCR would reduce the number of potential ADC offset spurs. This needs to be traded off against a higher data rate during host post-processing.&lt;br /&gt;
&lt;br /&gt;
==== Using 400 MHz image ====&lt;br /&gt;
Due to the smaller bandwidth addressing the use case will require the use of multiple channels. The captured spectra than needs to be stitched (combined) together.&lt;br /&gt;
* Max Bandwidth: 400 MHz&lt;br /&gt;
===== Option 1: MCR 400 MHz, RF-ADC converter rate = 3.2 GHz, 3 channels =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_400e6_3200e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This is not the best option because our spectrum of interest boundary is very close to a Nyquist zone boundary.&lt;br /&gt;
&lt;br /&gt;
===== Option 2: MCR 450 MHz, RF-ADC converter rate = 3.6 GHz, 3 channels =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_450e6_3600e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This option would work. Since the spectrum of interest is larger than the per channel bandwidth the captured spectrum may contain potential ADC offset spurs. For the spectrum of interest the 3 channels would nicely use tune frequencies (680, 1000, 1320 MHz) that do not match ADC offset spur frequencies.&lt;br /&gt;
&lt;br /&gt;
===== Option 3: MCR 512 MHz, RF-ADC converter rate = 4.096 GHz, 3 channels =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_512e6_4096e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This option would work as well. Like in option 2, the spectrum of interest may contain one potential ADC offset spur (compared to 2 in option 2). The drawback to option 2 is of course again the higher data rate during host post-processing that may be offset by only having to stitch less spectra (2 vs 3) together.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Scan Spectrum that spans multiple Nyquist Zones ==&lt;br /&gt;
&lt;br /&gt;
=== Tradeoffs: spectrum hole vs. use multiple mcrs/devices ===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scan Spectrum with dual master clock rate ==&lt;br /&gt;
=== Spectrum capture between 1.0 and 2.4 GHz (L-band) ===&lt;br /&gt;
* Combination of two RF-ADC converter rates: 4096 MHz and 2560 MHz&lt;br /&gt;
* Derived master clock rates: 1024 MHz (resampling factor 4) and 1280 MHz (resampling factor 2). The resampling factors are chosen to produce master clock rates which allow capturing a sufficient bandwidth to not have any gaps.&lt;br /&gt;
* Center frequencies: 1.23 GHz and 2.0 GHz respectively&lt;br /&gt;
* 1600 MHz FPGA image required due to the bandwidth requirements&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:AN055-L-band-dual-rate.jpg|800px|center]]&lt;br /&gt;
|}&lt;br /&gt;
In the picture you can see a light-green band between 1.0 GHz and 2.4 GHz which can be covered using two different rates: Radio0 operates at MCR=1024 MHz in its first Nyquist zone and radio1 operates at 1280 MHz in its second Nyquist zone. The coverage is shown as light-blue boxes in both frequency charts. Starting with UHD 4.6, the X440_L_band_capture.py example demonstrates this use case and by default uses center frequencies of 0.9 GHz and 2 GHz respectively. These were choosen to conveniently display the two individual spectra next to each other in a continuous spectra view without any overlap. Practical applications on the other hand need to take into account that the well usable bandwidth of each channel is only about 0.8 * MCR. For the chosen MCRs this means that the first radio has a usable bandwidth of 819.2 MHz and the second one of 1024 MHz. Taking into account that a typical RF passband in the first Nyquist zone has a passband of up to 0.4 * F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt; and the need for some overlap of the two spectra, the center frequency of radio0 should be set to 1.230 GHz (usable bandwidth spans from ~820 MHz to ~1640 MHz). Radio1 will be used in its second Nyquist zone, so the center frequency should be 2.0 GHz (usable bandwidth from ~1.5 GHz to ~2.5 GHz). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;appendix&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Appendix =&lt;br /&gt;
&amp;lt;span id=&amp;quot;x440-mcrs&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== X440 Supported Master Clock Rates (MCR) ==&lt;br /&gt;
Note: The selected FPGA bitfile may further limit the maximum supported master clock rate.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; margin:auto&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! MCR (MHz) !! RFDC Converter Rate (GHz)&lt;br /&gt;
|-&lt;br /&gt;
| 125.0 || 1.0&lt;br /&gt;
|-&lt;br /&gt;
| 128.0 || 1.024&lt;br /&gt;
|-&lt;br /&gt;
| 133.12 || 1.06496&lt;br /&gt;
|-&lt;br /&gt;
| 150.0 || 1.2&lt;br /&gt;
|-&lt;br /&gt;
| 153.6 || 1.2288&lt;br /&gt;
|-&lt;br /&gt;
| 160.0 || 1.28&lt;br /&gt;
|-&lt;br /&gt;
| 163.84 || 1.31072&lt;br /&gt;
|-&lt;br /&gt;
| 184.32 || 1.47456&lt;br /&gt;
|-&lt;br /&gt;
| 199.68 || 1.59744&lt;br /&gt;
|-&lt;br /&gt;
| 200.0 || 1.6&lt;br /&gt;
|-&lt;br /&gt;
| 204.8 || 1.6384&lt;br /&gt;
|-&lt;br /&gt;
| 240.0 || 1.92&lt;br /&gt;
|-&lt;br /&gt;
| 245.76 || 1.96608&lt;br /&gt;
|-&lt;br /&gt;
| 250.0 || 2.0, 1.0&lt;br /&gt;
|-&lt;br /&gt;
| 256.0 || 2.048, 1.024&lt;br /&gt;
|-&lt;br /&gt;
| 266.24 || 2.12992, 1.06496&lt;br /&gt;
|-&lt;br /&gt;
| 300.0 || 2.4, 1.2&lt;br /&gt;
|-&lt;br /&gt;
| 307.2 || 2.4576, 1.2288&lt;br /&gt;
|-&lt;br /&gt;
| 320.0 || 2.56, 1.28&lt;br /&gt;
|-&lt;br /&gt;
| 327.68 || 2.62144, 1.31072&lt;br /&gt;
|-&lt;br /&gt;
| 360.0 || 2.88, 1.44&lt;br /&gt;
|-&lt;br /&gt;
| 368.64 || 1.47456, 2.94912&lt;br /&gt;
|-&lt;br /&gt;
| 375.0 || 3.0, 1.5&lt;br /&gt;
|-&lt;br /&gt;
| 384.0 || 1.536, 3.072&lt;br /&gt;
|-&lt;br /&gt;
| 399.36 || 3.19488, 1.59744&lt;br /&gt;
|-&lt;br /&gt;
| 400.0 || 3.2, 1.6&lt;br /&gt;
|-&lt;br /&gt;
| 409.6 || 3.2768, 1.6384&lt;br /&gt;
|-&lt;br /&gt;
| 450.0 || 1.8, 3.6&lt;br /&gt;
|-&lt;br /&gt;
| 460.8 || 1.8432, 3.6864&lt;br /&gt;
|-&lt;br /&gt;
| 480.0 || 3.84, 1.92&lt;br /&gt;
|-&lt;br /&gt;
| 491.52 || 3.93216, 1.96608&lt;br /&gt;
|-&lt;br /&gt;
| 500.0 || 4.0, 2.0, 1.0&lt;br /&gt;
|-&lt;br /&gt;
| 512.0 || 1.024, 2.048, 4.096&lt;br /&gt;
|-&lt;br /&gt;
| 532.48 || 1.06496, 2.12992&lt;br /&gt;
|-&lt;br /&gt;
| 552.96 || 2.21184, 1.10592&lt;br /&gt;
|-&lt;br /&gt;
| 599.04 || 1.19808, 2.39616&lt;br /&gt;
|-&lt;br /&gt;
| 600.0 || 1.2, 2.4&lt;br /&gt;
|-&lt;br /&gt;
| 614.4 || 1.2288, 2.4576&lt;br /&gt;
|-&lt;br /&gt;
| 625.0 || 1.25, 2.5&lt;br /&gt;
|-&lt;br /&gt;
| 640.0 || 2.56, 1.28&lt;br /&gt;
|-&lt;br /&gt;
| 655.36 || 1.31072, 2.62144&lt;br /&gt;
|-&lt;br /&gt;
| 665.6 || 1.3312, 2.6624&lt;br /&gt;
|-&lt;br /&gt;
| 720.0 || 1.44, 2.88&lt;br /&gt;
|-&lt;br /&gt;
| 737.28 || 1.47456, 2.94912&lt;br /&gt;
|-&lt;br /&gt;
| 750.0 || 1.5, 3.0&lt;br /&gt;
|-&lt;br /&gt;
| 768.0 || 1.536, 3.072&lt;br /&gt;
|-&lt;br /&gt;
| 798.72 || 3.19488, 1.59744&lt;br /&gt;
|-&lt;br /&gt;
| 800.0 || 1.6, 3.2&lt;br /&gt;
|-&lt;br /&gt;
| 819.2 || 3.2768, 1.6384&lt;br /&gt;
|-&lt;br /&gt;
| 840.0 || 1.68, 3.36&lt;br /&gt;
|-&lt;br /&gt;
| 860.16 || 3.44064, 1.72032&lt;br /&gt;
|-&lt;br /&gt;
| 875.0 || 3.5, 1.75&lt;br /&gt;
|-&lt;br /&gt;
| 896.0 || 3.584, 1.792&lt;br /&gt;
|-&lt;br /&gt;
| 900.0 || 1.8, 3.6&lt;br /&gt;
|-&lt;br /&gt;
| 921.6 || 1.8432, 3.6864&lt;br /&gt;
|-&lt;br /&gt;
| 931.84 || 1.86368, 3.72736&lt;br /&gt;
|-&lt;br /&gt;
| 960.0 || 3.84, 1.92&lt;br /&gt;
|-&lt;br /&gt;
| 983.04 || 1.96608, 3.93216&lt;br /&gt;
|-&lt;br /&gt;
| 998.4 || 3.9936, 1.9968&lt;br /&gt;
|-&lt;br /&gt;
| 1000.0 || 4.0, 2.0&lt;br /&gt;
|-&lt;br /&gt;
| 1024.0 || 4.096, 2.048&lt;br /&gt;
|-&lt;br /&gt;
| 1050.0 || 2.1&lt;br /&gt;
|-&lt;br /&gt;
| 1064.96 || 2.12992&lt;br /&gt;
|-&lt;br /&gt;
| 1075.2 || 2.1504&lt;br /&gt;
|-&lt;br /&gt;
| 1080.0 || 2.16&lt;br /&gt;
|-&lt;br /&gt;
| 1105.92 || 2.21184&lt;br /&gt;
|-&lt;br /&gt;
| 1120.0 || 2.24&lt;br /&gt;
|-&lt;br /&gt;
| 1125.0 || 2.25&lt;br /&gt;
|-&lt;br /&gt;
| 1146.88 || 2.29376&lt;br /&gt;
|-&lt;br /&gt;
| 1152.0 || 2.304&lt;br /&gt;
|-&lt;br /&gt;
| 1198.08 || 2.39616&lt;br /&gt;
|-&lt;br /&gt;
| 1200.0 || 2.4&lt;br /&gt;
|-&lt;br /&gt;
| 1228.8 || 2.4576&lt;br /&gt;
|-&lt;br /&gt;
| 1280.0 || 2.56&lt;br /&gt;
|-&lt;br /&gt;
| 1290.24 || 2.58048&lt;br /&gt;
|-&lt;br /&gt;
| 1310.72 || 2.62144&lt;br /&gt;
|-&lt;br /&gt;
| 1331.2 || 2.6624&lt;br /&gt;
|-&lt;br /&gt;
| 1350.0 || 2.7&lt;br /&gt;
|-&lt;br /&gt;
| 1382.4 || 2.7648&lt;br /&gt;
|-&lt;br /&gt;
| 1397.76 || 2.79552&lt;br /&gt;
|-&lt;br /&gt;
| 1400.0 || 2.8&lt;br /&gt;
|-&lt;br /&gt;
| 1433.6 || 2.8672&lt;br /&gt;
|-&lt;br /&gt;
| 1440.0 || 2.88&lt;br /&gt;
|-&lt;br /&gt;
| 1474.56 || 2.94912&lt;br /&gt;
|-&lt;br /&gt;
| 1500.0 || 3.0&lt;br /&gt;
|-&lt;br /&gt;
| 1536.0 || 3.072&lt;br /&gt;
|-&lt;br /&gt;
| 1600.0 || 3.2&lt;br /&gt;
|-&lt;br /&gt;
| 1625.0 || 3.25&lt;br /&gt;
|-&lt;br /&gt;
| 1638.4 || 3.2768&lt;br /&gt;
|-&lt;br /&gt;
| 1650.0 || 3.3&lt;br /&gt;
|-&lt;br /&gt;
| 1658.88 || 3.31776&lt;br /&gt;
|-&lt;br /&gt;
| 1664.0 || 3.328&lt;br /&gt;
|-&lt;br /&gt;
| 1680.0 || 3.36&lt;br /&gt;
|-&lt;br /&gt;
| 1689.6 || 3.3792&lt;br /&gt;
|-&lt;br /&gt;
| 1720.32 || 3.44064&lt;br /&gt;
|-&lt;br /&gt;
| 1730.56 || 3.46112&lt;br /&gt;
|-&lt;br /&gt;
| 1750.0 || 3.5&lt;br /&gt;
|-&lt;br /&gt;
| 1760.0 || 3.52&lt;br /&gt;
|-&lt;br /&gt;
| 1792.0 || 3.584&lt;br /&gt;
|-&lt;br /&gt;
| 1797.12 || 3.59424&lt;br /&gt;
|-&lt;br /&gt;
| 1800.0 || 3.6&lt;br /&gt;
|-&lt;br /&gt;
| 1802.24 || 3.60448&lt;br /&gt;
|-&lt;br /&gt;
| 1843.2 || 3.6864&lt;br /&gt;
|-&lt;br /&gt;
| 1863.68 || 3.72736&lt;br /&gt;
|-&lt;br /&gt;
| 1875.0 || 3.75&lt;br /&gt;
|-&lt;br /&gt;
| 1920.0 || 3.84&lt;br /&gt;
|-&lt;br /&gt;
| 1950.0 || 3.9&lt;br /&gt;
|-&lt;br /&gt;
| 1966.08 || 3.93216&lt;br /&gt;
|-&lt;br /&gt;
| 1996.8 || 3.9936&lt;br /&gt;
|-&lt;br /&gt;
| 2000.0 || 4.0&lt;br /&gt;
|-&lt;br /&gt;
| 2027.52 || 4.05504&lt;br /&gt;
|-&lt;br /&gt;
| 2048.0 || 4.096&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;X440-supported-dual-rates&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== X440 Supported Master Clock Rate combinations (Dual Rate) ==&lt;br /&gt;
&amp;lt;b&amp;gt;Important:&amp;lt;/b&amp;gt; For the best RF performance it is required to configure the master clock rate that is connected to the higher RF-ADC/DAC converter rate on the first radio and the MCR connected to the lower converter rate second. Not all master clock rate combinations listed in this table will comply to this requirement by themselves. Specifying the converter_rate argument or swapping the master clock rates will help resolving issues. The selected FPGA bitfile may further limit the maximum supported master clock rate.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; margin:auto&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| MCR0 (MHz) || MCR1 (MHz)&lt;br /&gt;
|-&lt;br /&gt;
| 125.0 || 250.0, 375.0, 500.0, 750.0, 875.0, 1000.0, 1125.0, 1625.0, 1750.0, 1875.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 128.0 || 384.0, 512.0, 768.0, 1152.0&lt;br /&gt;
|-&lt;br /&gt;
| 133.12 || 266.24, 399.36, 532.48, 665.6, 798.72, 931.84, 1064.96, 1198.08, 1331.2, 1730.56, 1863.68, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 150.0 || 300.0, 450.0, 600.0, 750.0, 900.0, 1050.0, 1350.0, 1500.0, 1650.0, 1800.0, 1950.0&lt;br /&gt;
|-&lt;br /&gt;
| 153.6 || 307.2, 614.4, 1228.8&lt;br /&gt;
|-&lt;br /&gt;
| 160.0 || 320.0, 640.0, 800.0, 1120.0, 1280.0, 1600.0, 1760.0&lt;br /&gt;
|-&lt;br /&gt;
| 163.84 || 327.68, 655.36, 1146.88, 1310.72, 1474.56, 1802.24&lt;br /&gt;
|-&lt;br /&gt;
| 184.32 || 368.64, 552.96, 737.28, 1105.92, 1290.24, 1474.56, 1658.88, 1843.2, 2027.52&lt;br /&gt;
|-&lt;br /&gt;
| 199.68 || 399.36, 599.04, 798.72, 998.4, 1198.08, 1397.76, 1797.12, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 200.0 || 400.0, 800.0, 1200.0, 1400.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 204.8 || 409.6, 819.2, 1433.6, 1638.4&lt;br /&gt;
|-&lt;br /&gt;
| 240.0 || 360.0, 480.0, 600.0, 720.0, 840.0, 960.0, 1440.0, 1680.0, 1800.0, 1920.0&lt;br /&gt;
|-&lt;br /&gt;
| 245.76 || 491.52, 860.16, 983.04, 1720.32, 1966.08&lt;br /&gt;
|-&lt;br /&gt;
| 250.0 || 125.0, 375.0, 500.0, 750.0, 875.0, 1000.0, 1500.0, 1625.0, 1750.0, 1875.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 256.0 || 640.0, 896.0, 1024.0, 1280.0, 1664.0, 1792.0, 2048.0&lt;br /&gt;
|-&lt;br /&gt;
| 266.24 || 133.12, 399.36, 532.48, 665.6, 798.72, 931.84, 1064.96, 1331.2, 1730.56, 1863.68, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 300.0 || 150.0, 450.0, 600.0, 750.0, 900.0, 1050.0, 1500.0, 1650.0, 1800.0, 1950.0&lt;br /&gt;
|-&lt;br /&gt;
| 307.2 || 153.6, 614.4, 1228.8&lt;br /&gt;
|-&lt;br /&gt;
| 320.0 || 160.0, 640.0, 800.0, 1120.0, 1280.0, 1600.0, 1760.0&lt;br /&gt;
|-&lt;br /&gt;
| 327.68 || 163.84, 655.36, 1146.88, 1310.72, 1802.24&lt;br /&gt;
|-&lt;br /&gt;
| 360.0 || 240.0, 600.0, 720.0, 1080.0, 1800.0&lt;br /&gt;
|-&lt;br /&gt;
| 368.64 || 184.32, 552.96, 737.28, 1105.92, 1290.24, 1474.56, 1658.88, 1843.2, 2027.52&lt;br /&gt;
|-&lt;br /&gt;
| 375.0 || 125.0, 250.0, 750.0, 1125.0, 1500.0, 1875.0&lt;br /&gt;
|-&lt;br /&gt;
| 384.0 || 128.0, 768.0, 1152.0, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 399.36 || 133.12, 199.68, 266.24, 599.04, 665.6, 798.72, 998.4, 1198.08, 1331.2, 1397.76, 1797.12, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 400.0 || 200.0, 800.0, 1200.0, 1400.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 409.6 || 204.8, 819.2, 1433.6, 1638.4&lt;br /&gt;
|-&lt;br /&gt;
| 450.0 || 150.0, 300.0, 600.0, 750.0, 900.0, 1350.0, 1500.0, 1800.0&lt;br /&gt;
|-&lt;br /&gt;
| 460.8 || 768.0, 921.6, 1075.2, 1382.4, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 480.0 || 240.0, 720.0, 840.0, 960.0, 1440.0, 1680.0, 1920.0&lt;br /&gt;
|-&lt;br /&gt;
| 491.52 || 245.76, 860.16, 983.04, 1720.32, 1966.08&lt;br /&gt;
|-&lt;br /&gt;
| 500.0 || 125.0, 250.0, 750.0, 875.0, 1000.0, 1500.0, 1750.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 512.0 || 128.0, 768.0, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 532.48 || 133.12, 266.24, 798.72, 931.84, 1064.96, 1331.2, 1863.68&lt;br /&gt;
|-&lt;br /&gt;
| 552.96 || 184.32, 368.64, 737.28, 1105.92, 1290.24, 1474.56, 1658.88, 1843.2&lt;br /&gt;
|-&lt;br /&gt;
| 599.04 || 199.68, 399.36, 798.72, 998.4, 1198.08, 1397.76, 1797.12, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 600.0 || 150.0, 240.0, 300.0, 360.0, 450.0, 720.0, 900.0, 1000.0, 1050.0, 1500.0, 1800.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 614.4 || 153.6, 307.2, 1228.8&lt;br /&gt;
|-&lt;br /&gt;
| 640.0 || 160.0, 256.0, 320.0, 800.0, 1120.0, 1280.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 655.36 || 163.84, 327.68, 1146.88, 1310.72&lt;br /&gt;
|-&lt;br /&gt;
| 665.6 || 133.12, 266.24, 399.36, 798.72, 1331.2, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 720.0 || 240.0, 360.0, 480.0, 600.0, 960.0, 1440.0, 1680.0, 1800.0, 1920.0&lt;br /&gt;
|-&lt;br /&gt;
| 737.28 || 184.32, 368.64, 552.96, 1105.92, 1290.24, 1474.56, 1843.2&lt;br /&gt;
|-&lt;br /&gt;
| 750.0 || 125.0, 150.0, 250.0, 300.0, 375.0, 450.0, 500.0, 900.0, 1000.0, 1125.0, 1500.0, 1750.0, 1875.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 768.0 || 128.0, 384.0, 460.8, 512.0, 921.6, 1152.0, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 798.72 || 133.12, 199.68, 266.24, 399.36, 532.48, 599.04, 665.6, 998.4, 1064.96, 1198.08, 1331.2, 1397.76, 1863.68, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 800.0 || 160.0, 200.0, 320.0, 400.0, 640.0, 1200.0, 1400.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 819.2 || 204.8, 409.6, 1433.6, 1638.4&lt;br /&gt;
|-&lt;br /&gt;
| 840.0 || 240.0, 480.0, 1680.0&lt;br /&gt;
|-&lt;br /&gt;
| 860.16 || 245.76, 491.52, 1720.32&lt;br /&gt;
|-&lt;br /&gt;
| 875.0 || 125.0, 250.0, 500.0, 1750.0&lt;br /&gt;
|-&lt;br /&gt;
| 896.0 || 256.0, 1792.0&lt;br /&gt;
|-&lt;br /&gt;
| 900.0 || 150.0, 300.0, 450.0, 600.0, 750.0, 1500.0, 1800.0&lt;br /&gt;
|-&lt;br /&gt;
| 921.6 || 460.8, 768.0, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 931.84 || 133.12, 266.24, 532.48, 1863.68&lt;br /&gt;
|-&lt;br /&gt;
| 960.0 || 240.0, 480.0, 720.0, 1440.0, 1920.0&lt;br /&gt;
|-&lt;br /&gt;
| 983.04 || 245.76, 491.52, 1966.08&lt;br /&gt;
|-&lt;br /&gt;
| 998.4 || 199.68, 399.36, 599.04, 798.72, 1198.08, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 1000.0 || 125.0, 250.0, 500.0, 600.0, 750.0, 1500.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 1024.0 || 256.0, 1280.0, 2048.0&lt;br /&gt;
|-&lt;br /&gt;
| 1050.0 || 150.0, 300.0, 600.0&lt;br /&gt;
|-&lt;br /&gt;
| 1064.96 || 133.12, 266.24, 532.48, 798.72, 1331.2&lt;br /&gt;
|-&lt;br /&gt;
| 1075.2 || 460.8&lt;br /&gt;
|-&lt;br /&gt;
| 1080.0 || 360.0&lt;br /&gt;
|-&lt;br /&gt;
| 1105.92 || 184.32, 368.64, 552.96, 737.28, 1474.56, 1658.88, 1843.2&lt;br /&gt;
|-&lt;br /&gt;
| 1120.0 || 160.0, 320.0, 640.0&lt;br /&gt;
|-&lt;br /&gt;
| 1125.0 || 125.0, 375.0, 750.0, 1500.0, 1875.0&lt;br /&gt;
|-&lt;br /&gt;
| 1146.88 || 163.84, 327.68, 655.36&lt;br /&gt;
|-&lt;br /&gt;
| 1152.0 || 128.0, 384.0, 768.0, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 1198.08 || 133.12, 199.68, 399.36, 599.04, 798.72, 998.4, 1797.12, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 1200.0 || 200.0, 400.0, 800.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 1228.8 || 153.6, 307.2, 614.4&lt;br /&gt;
|-&lt;br /&gt;
| 1280.0 || 160.0, 256.0, 320.0, 640.0, 1024.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 1290.24 || 184.32, 368.64, 552.96, 737.28&lt;br /&gt;
|-&lt;br /&gt;
| 1310.72 || 163.84, 327.68, 655.36&lt;br /&gt;
|-&lt;br /&gt;
| 1331.2 || 133.12, 266.24, 399.36, 532.48, 665.6, 798.72, 1064.96, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 1350.0 || 150.0, 450.0&lt;br /&gt;
|-&lt;br /&gt;
| 1382.4 || 460.8&lt;br /&gt;
|-&lt;br /&gt;
| 1397.76 || 199.68, 399.36, 599.04, 798.72&lt;br /&gt;
|-&lt;br /&gt;
| 1400.0 || 200.0, 400.0, 800.0&lt;br /&gt;
|-&lt;br /&gt;
| 1433.6 || 204.8, 409.6, 819.2&lt;br /&gt;
|-&lt;br /&gt;
| 1440.0 || 240.0, 480.0, 720.0, 960.0, 1920.0&lt;br /&gt;
|-&lt;br /&gt;
| 1474.56 || 163.84, 184.32, 368.64, 552.96, 737.28, 1105.92&lt;br /&gt;
|-&lt;br /&gt;
| 1500.0 || 150.0, 250.0, 300.0, 375.0, 450.0, 500.0, 600.0, 750.0, 900.0, 1000.0, 1125.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 1536.0 || 384.0, 460.8, 512.0, 768.0, 921.6, 1152.0&lt;br /&gt;
|-&lt;br /&gt;
| 1600.0 || 160.0, 200.0, 320.0, 400.0, 640.0, 800.0, 1200.0, 1280.0&lt;br /&gt;
|-&lt;br /&gt;
| 1625.0 || 125.0, 250.0&lt;br /&gt;
|-&lt;br /&gt;
| 1638.4 || 204.8, 409.6, 819.2&lt;br /&gt;
|-&lt;br /&gt;
| 1650.0 || 150.0, 300.0&lt;br /&gt;
|-&lt;br /&gt;
| 1658.88 || 184.32, 368.64, 552.96, 1105.92&lt;br /&gt;
|-&lt;br /&gt;
| 1664.0 || 256.0&lt;br /&gt;
|-&lt;br /&gt;
| 1680.0 || 240.0, 480.0, 720.0, 840.0&lt;br /&gt;
|-&lt;br /&gt;
| 1720.32 || 245.76, 491.52, 860.16&lt;br /&gt;
|-&lt;br /&gt;
| 1730.56 || 133.12, 266.24&lt;br /&gt;
|-&lt;br /&gt;
| 1750.0 || 125.0, 250.0, 500.0, 750.0, 875.0&lt;br /&gt;
|-&lt;br /&gt;
| 1760.0 || 160.0, 320.0&lt;br /&gt;
|-&lt;br /&gt;
| 1792.0 || 256.0, 896.0&lt;br /&gt;
|-&lt;br /&gt;
| 1797.12 || 199.68, 399.36, 599.04, 1198.08&lt;br /&gt;
|-&lt;br /&gt;
| 1800.0 || 150.0, 240.0, 300.0, 360.0, 450.0, 600.0, 720.0, 900.0&lt;br /&gt;
|-&lt;br /&gt;
| 1802.24 || 163.84, 327.68&lt;br /&gt;
|-&lt;br /&gt;
| 1843.2 || 184.32, 368.64, 552.96, 737.28, 1105.92&lt;br /&gt;
|-&lt;br /&gt;
| 1863.68 || 133.12, 266.24, 532.48, 798.72, 931.84&lt;br /&gt;
|-&lt;br /&gt;
| 1875.0 || 125.0, 250.0, 375.0, 750.0, 1125.0&lt;br /&gt;
|-&lt;br /&gt;
| 1920.0 || 240.0, 480.0, 720.0, 960.0, 1440.0&lt;br /&gt;
|-&lt;br /&gt;
| 1950.0 || 150.0, 300.0&lt;br /&gt;
|-&lt;br /&gt;
| 1966.08 || 245.76, 491.52, 983.04&lt;br /&gt;
|-&lt;br /&gt;
| 1996.8 || 133.12, 199.68, 266.24, 399.36, 599.04, 665.6, 798.72, 998.4, 1198.08, 1331.2&lt;br /&gt;
|-&lt;br /&gt;
| 2000.0 || 125.0, 250.0, 500.0, 600.0, 750.0, 1000.0, 1500.0&lt;br /&gt;
|-&lt;br /&gt;
| 2027.52 || 184.32, 368.64&lt;br /&gt;
|-&lt;br /&gt;
| 2048.0 || 256.0, 1024.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;references&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== References and Related Documentation ==&lt;br /&gt;
* [https://www.ni.com/en/solutions/aerospace-defense/radar-electronic-warfare-sigint/advantages-of-direct-rf-sampling-architectures.html Advantages of Direct RF Sampling Architectures]&lt;br /&gt;
* [https://docs.xilinx.com/r/en-US/pg269-rf-data-converter Zynq UltraScale+ RFSoC RF Data Converter v2.6 Gen 1/2/3/DFE LogiCORE IP Product Guide (PG269)]&lt;br /&gt;
* [https://events.gnuradio.org/event/21/contributions/392/attachments/123/285/Lo%20and%20behold,%20no%20LO.pdf GRcon 23 - Lo and behold, no LO!]&lt;br /&gt;
* [https://docs.xilinx.com/r/en-US/ds926-zynq-ultrascale-plus-rfsoc/RF-ADC-Electrical-Characteristics Zynq UltraScale+ RFSoC Data Sheet: DC and AC Switching Characteristics (DS926)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Footnotes =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>MartinAnderseck</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=About_Sampling_Rates_and_Master_Clock_Rates_for_the_USRP_X440&amp;diff=5998</id>
		<title>About Sampling Rates and Master Clock Rates for the USRP X440</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=About_Sampling_Rates_and_Master_Clock_Rates_for_the_USRP_X440&amp;diff=5998"/>
				<updated>2024-01-05T13:36:05Z</updated>
		
		<summary type="html">&lt;p&gt;MartinAnderseck: Spelling...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- Title: About Sampling Rates and Master Clock Rates for the USRP X440 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Application Note Number and Authors ==&lt;br /&gt;
&lt;br /&gt;
'''AN-055''' by Marian Koop and Martin Anderseck&lt;br /&gt;
&amp;lt;!-- Internal use only: please do keep this updated!&lt;br /&gt;
==Revision History==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Author&lt;br /&gt;
!Details&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2023-09-22&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Marian Koop &lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Initial creation&lt;br /&gt;
|} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;overview&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Overview = &lt;br /&gt;
This application note guides users through the selection process of Master Clock Rates (MCR) for the [https://kb.ettus.com/X440#X440 USRP X440]. It will highlight possible implications and side effects as well as design specific differences to other USRPs (like the X410).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;x440-cfg_considerations&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= USRP X440 Configuration Considerations = &lt;br /&gt;
The USRP X440 is a [https://uhd.readthedocs.io/en/latest/page_fbx.html#fbx_too balun-coupled transceiver] without built-in RF signal conditioning. Compared to other RF architectures this enables the USRP X440 to access the full RF bandwidth available to the ADC/DAC, but also requires additional frequency planning. To achieve this, the USRP X440 utilizes its ADC/DAC in direct sampling mode and is susceptible to various effects that may distort the signal of interest. These can be separated into distortions from both signal processing and from the ADC/DAC design.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;converter_rate-mcr-iq_rate&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Relationship between RF-ADC/DAC Converter Rate, USRP Master Clock Rate (MCR), Data IQ rate ==&lt;br /&gt;
Except for the 200 MHz variant, the default USRP X440 FPGA images do not contain a configurable DDC&amp;lt;ref&amp;gt;Digital Down Conversion&amp;lt;/ref&amp;gt;/DUC&amp;lt;ref&amp;gt;Digital Up Conversion&amp;lt;/ref&amp;gt; block. This means that the IQ sample rate (F&amp;lt;sub&amp;gt;IQ&amp;lt;/sub&amp;gt;) is the same as the Master Clock Rate (MCR) that goes into the RFNoC Radio block. However, unlike most other USRPs the USRP X440 supports a highly variable MCR. The RF Data Converter sampling rate (F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;) is chosen by UHD based on the MCR and the available resampling factors of 2, 4, or 8, and defaults to the highest achievable values with these factors. This can be overridden if the desired MCR can be achieved with multiple converter rates (see device argument [https://uhd.readthedocs.io/en/latest/page_usrp_x4xx.html#x4xx_usage_args converter_rate]). The inverse calculation - divide the converter rate by 8, 4 or 2 - has to be done to derive the master clock rate if a specific converter rate shall be used. Figure 1 depicts the simplified signal path block diagram for the USRP X440.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|+ Figure 1. Simplified USRP X440 Signal Path&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-X440_signal_path.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dsp-distortions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Aliases and Nyquist Zones ==&lt;br /&gt;
By itself the USRP X440 can sample input signals at frequencies above the Nyquist frequency&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Nyquist_frequency Nyquist frequency]&amp;lt;/ref&amp;gt;, which is half of the ADC converter sampling rate (F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;). However, this method introduces aliasing effects, which cause unwanted signals to appear as mirror images around multiples of the Nyquist frequency (F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/2) in the output spectrum. The first Nyquist zone (N1) is the frequency range from 0 to F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/2, and the second Nyquist zone (N2) goes from F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/2 to F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;. Other Nyquist zones are numbered in ascending order, each spanning F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/2. The digital passband in each Nyquist zone can be calculated as 0.4 * F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt; (see also &amp;lt;ref&amp;gt;[https://docs.xilinx.com/r/en-US/pg269-rf-data-converter/RF-ADC-Decimation-Filters-Gen-1/Gen-2 Xilinx RF-ADC Decimation Filters (Gen-1)]&amp;lt;/ref&amp;gt;). The following figure depicts the Nyquist zones for the minimum and maximum RF-ADC converter rates supported by the USRP X440. Note that the illustrations do not show the effects of external, analog filters on the achievable passband within a Nyquist zone. A typical expectation is, that the unusable frequency range around each Nyquist zone boundary (also often referred to as a guard band) increases with ascending Nyquist zone order and results in decreasing, lopsided achievable passbands.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|+ Figure 2. Nyquist Zones&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-X440_nyquist_zones.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Knowledge of signal aliases can both be exploited and create uncertainties. Applications could utilize intentional under sampling (also referred as &amp;quot;bandpass sampling&amp;quot;) to receive signals at greater than F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/2. The same effect may on the other hand lead to garbled or distorted signal detection if the signal of interest spans multiple Nyquist zones or interferer signals are aliased into the observed spectrum. Both effects are depicted in figure 3.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|+ Figure 3. Aliases - Wanted and unwanted&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-wanted_and_unwanted_aliases.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Applications should therefore prefer converter rates that can contain the desired signal spectrum in a single Nyquist zone, or split the signal spectrum among multiple channels and devices. While the USRP X440 does not limit the utilized Nyquist zone, performance degrades in higher orders zones and application should focus on operating in Nyquist zones 1 and 2 (For RX, zone 3 is possible, but zones 4 and higher result into significant performance degradation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adc-distortions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== RF-ADC Spurs to consider and how to predict them ==&lt;br /&gt;
Another kind of distortion originates from the ADC/DAC itself. The USRP X440 uses the Xilinx RFDC, which is a design that combines multiple converters to &lt;br /&gt;
achieve high RF-ADC rates. An RF-ADC in this design has 8 sub-ADCs that are interleaved together. The resulting offset spurs are minimized by the integrated self-calibration (see also &amp;lt;ref&amp;gt;[https://docs.xilinx.com/r/en-US/pg269-rf-data-converter/Key-CAL-Features-and-Guidance-Summary Key CAL Features and Guidance Summary]&amp;lt;/ref&amp;gt;) executed by UHD but may still be detectable in the signal spectrum.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|+ Figure 4. RF-ADC Spurs with MCR = 500 MHz&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-adc_distortions.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Even with the best calibration the RF-ADC spurs may still be detectable in the captured spectrum. Knowledge of the location of the spurs, in particular the RF-ADC offset spur may be used during frequency planning to select an MCR (and converter rate) that exclude the offset spur frequencies from the capture spectrum. RF-ADC input spurs on the other hand will be more difficult to avoid, but as rule of thumb for modulated input signals carrier frequencies that fall on an RF-ADC offset spur frequency should be avoided (because offset and input spurs would superimpose each other).&lt;br /&gt;
&lt;br /&gt;
=== How to predict offset spurs ===&lt;br /&gt;
Any residual DC offset not corrected appears as a spur at k*F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/N, where F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt; is the composite converter rate of the RF-ADC, N is the number of sub-RF-ADCs interleaved together (8 for X4xx devices), and k = 0, 1, 2, … N.&lt;br /&gt;
For more information on expected spurs levels, refer to OIS at &amp;lt;ref&amp;gt;[https://docs.xilinx.com/r/en-US/ds926-zynq-ultrascale-plus-rfsoc/RF-ADC-Performance-Characteristics RF-ADC Performance Characteristics]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== How to predict input spurs ===&lt;br /&gt;
Any residual difference from gain and time skew correction results in spurious signals at +/-f&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt; + (k/N)*F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;, where F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt; is the converter rate of the RF-ADC, N is the number of sub-RF-ADCs (8 for X4xx devices), and f&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt; is the frequency of the input signal.&lt;br /&gt;
For more information on expected spurs levels, refer to GTIS at &amp;lt;ref&amp;gt;[https://docs.xilinx.com/r/en-US/ds926-zynq-ultrascale-plus-rfsoc/RF-ADC-Performance-Characteristics RF-ADC Performance Characteristics]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dac-distortions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== RF-DAC Distortions ==&lt;br /&gt;
Like the RF-ADC, the RF-DAC is also not an ideal circuitry and suffers from zero-order hold reconstruction. To counter this undesired attenuation in all but the first Nyquist zone, the Xilinx RF-DAC offers a Mix-Mode, which improves the power response in the second Nyquist zone and is utilized by the USRP X440. This, together with an inverse sinc filter to counter residual distortion limits the practical use of the RF-DAC to the first two Nyquist zones. For more information on the RF-DAC mix-mode and inverse sinc filter characteristics, refer to &amp;lt;ref&amp;gt;[https://docs.xilinx.com/r/en-US/pg269-rf-data-converter/RF-DAC-Nyquist-Zone-Operation RF-DAC Nyquist Zone Operation]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|+ Figure 5 &amp;lt;ref&amp;gt;[https://docs.xilinx.com/viewer/attachment/wIPPkVrh~0jtjy6aqWeihQ/q5kXcl5Z7lFon2v535oW0w Xilinx: Ideal DAC Output Response, Normalised to Fsample]&amp;lt;/ref&amp;gt;. RF-DAC Mix-Mode and normal, ideal roll-off sinc response.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-dac_roll-off_sinc_response.png|350px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
source: https://docs.xilinx.com/viewer/attachment/wIPPkVrh~0jtjy6aqWeihQ/q5kXcl5Z7lFon2v535oW0w&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dual-rate&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Dual Rate ==&lt;br /&gt;
Unlike previous USRPs, the USRP X440 supports the operation at two different master clock rates simultaneously. All channels on the first daughterboard will run on the first master clock rate / sampling rate and all channels on the second daughterboard will run on the second configured master clock rate / sampling rate. The main motivation for having two different master clock rates is the direct sampling architecture of the USRP X440 without signal conditioning and filtering. While [[#dsp-distortions|Aliases and Nyquist Zones]] describes the challenges of that, with dual rate this feature can be used to capture an RF spectrum that exceeds the bandwidth abilities of the single rate operation. Using a second rate, one can close the Nyquist gap of the other and monitor a wider spectrum for further processing.&lt;br /&gt;
As the clocks of both radios are derived from a common clocking chip, not all combinations are possible. Refer to [[#X440-supported-dual-rates|X440 Supported Dual Rates]] for possible RF Data Converter sampling rate combinations. The section about the [[#converter_rate-mcr-iq_rate|Relationship between RFADC/DAC Converter Rate, USRP Master Clock Rate (MCR) and Data IQ rate]] explains how to derive valid master clock rates from the RF Data converter sampling rates.&lt;br /&gt;
&lt;br /&gt;
Note: When using different MCRs for both daughterboards, the device will skip the multi-tile synchronization. That means that the phase relationship between channels may not be preserved over retunes and reboots for channels of the same daughterboard and no defined phase relationship will be preserved between channels of different daughterboards.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;use-cases&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Use cases =&lt;br /&gt;
== Scan Spectrum within single Nyquist zone ==&lt;br /&gt;
=== Spectrum Capture between 1.7 and 1.9 GHz. ===&lt;br /&gt;
* Min Bandwidth: 200 MHz&lt;br /&gt;
* Minimum IQ Rate: 250 MSps&lt;br /&gt;
==== Option 1: MCR = 250 MHz, RF-ADC converter rate = 2 GHz ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-1700-1800_250e6_2000e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This is not the best option because our spectrum of interest is very close to a Nyquist zone boundary.&lt;br /&gt;
&lt;br /&gt;
==== Option 2: MCR = 300 MHz, RF-ADC converter rate = 2.4 GHz ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-1700-1800_300e6_2400e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This option is better, the spectrum of interest is well within a Nyquist zone. Within the bandwidth of interest falls one of the ADC offset spurs. If the input signal is relatively strong, the impact from this small spur is negligible. If on the other hand the input signal strength is on the low end (for the X440), then maybe a different MCR should be considered.&lt;br /&gt;
&lt;br /&gt;
==== Option 3: MCR = 320 MHz, RF-ADC converter rate = 2.56 GHz ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-1700-1800_320e6_2560e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This option avoids a potential impact of an ADC offset spur in the observed spectrum. The only drawback to option 2 is the slightly higher data rate during host post-processing.&lt;br /&gt;
&lt;br /&gt;
=== Spectrum Capture between 500 MHz and 1.5 GHz. ===&lt;br /&gt;
The USRP X440 ships with multiple [https://uhd.readthedocs.io/en/latest/page_usrp_x4xx.html#x4xx_updating_fpga_types FPGA image flavors]. These either support 400 MHz or 1600 MHz RF bandwidth per channel. To address this use case, users have the option of using a bit file with 1600 MHz RF bandwidth to capture a contiguous spectrum, or use a 400 MHz bit file and create a stitched spectrum during host side post-processing. &lt;br /&gt;
==== Using 1600 MHz image ====&lt;br /&gt;
* Min Bandwidth: 1000 MHz&lt;br /&gt;
* Minimum IQ Rate: 1250 MSps&lt;br /&gt;
===== Option 1: MCR = 1280 MHz, RF-ADC converter rate = 2.56 GHz =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_1250e6_2560e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
Bad option, because desired spectrum spans multiple Nyquist zones.&lt;br /&gt;
&lt;br /&gt;
===== Option 2: MCR = 1600 MHz, RF-ADC converter rate = 3.2 GHz =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_1600e6_3200e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This is not the best option because our spectrum of interest is very close to a Nyquist zone boundary.&lt;br /&gt;
&lt;br /&gt;
===== Option 3: MCR = 1689.6 MHz, RF-ADC converter rate = 3.3792 GHz =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_1689e6_3379e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This option would work. If the input signal strength is low, using an even higher MCR would reduce the number of potential ADC offset spurs. This needs to be traded off against a higher data rate during host post-processing.&lt;br /&gt;
&lt;br /&gt;
==== Using 400 MHz image ====&lt;br /&gt;
Due to the smaller bandwidth addressing the use case will require the use of multiple channels. The captured spectra than needs to be stitched (combined) together.&lt;br /&gt;
* Max Bandwidth: 400 MHz&lt;br /&gt;
===== Option 1: MCR 400 MHz, RF-ADC converter rate = 3.2 GHz, 3 channels =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_400e6_3200e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This is not the best option because our spectrum of interest boundary is very close to a Nyquist zone boundary.&lt;br /&gt;
&lt;br /&gt;
===== Option 2: MCR 450 MHz, RF-ADC converter rate = 3.6 GHz, 3 channels =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_450e6_3600e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This option would work. Since the spectrum of interest is larger than the per channel bandwidth the captured spectrum may contain potential ADC offset spurs. For the spectrum of interest the 3 channels would nicely use tune frequencies (680, 1000, 1320 MHz) that do not match ADC offset spur frequencies.&lt;br /&gt;
&lt;br /&gt;
===== Option 3: MCR 512 MHz, RF-ADC converter rate = 4.096 GHz, 3 channels =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_512e6_4096e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This option would work as well. Like in option 2, the spectrum of interest may contain one potential ADC offset spur (compared to 2 in option 2). The drawback to option 2 is of course again the higher data rate during host post-processing that may be offset by only having to stitch less spectra (2 vs 3) together.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Scan Spectrum that spans multiple Nyquist Zones ==&lt;br /&gt;
&lt;br /&gt;
=== Tradeoffs: spectrum hole vs. use multiple mcrs/devices ===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scan Spectrum with dual master clock rate ==&lt;br /&gt;
=== Spectrum capture between 1.0 and 2.4 GHz (L-band) ===&lt;br /&gt;
* Combination of two RF-ADC converter rates: 4096 MHz and 2560 MHz&lt;br /&gt;
* Derived master clock rates: 1024 MHz (resampling factor 4) and 1280 MHz (resampling factor 2). The resampling factors are chosen to produce master clock rates which allow capturing a sufficient bandwidth to not have any gaps.&lt;br /&gt;
* Center frequencies: 1.23 GHz and 2.0 GHz respectively&lt;br /&gt;
* 1600 MHz FPGA image required due to the bandwidth requirements&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:AN055-L-band-dual-rate.jpg|800px|center]]&lt;br /&gt;
|}&lt;br /&gt;
In the picture you can see a light-green band between 1.0 GHz and 2.4 GHz which can be covered using two different rates: Radio0 operates at MCR=1024 MHz in its first Nyquist zone and radio1 operates at 1280 MHz in its second Nyquist zone. The coverage is shown as light-blue boxes in both frequency charts. Starting with UHD 4.6, the X440_L_band_capture.py example demonstrates this use case and by default uses center frequencies of 0.9 GHz and 2 GHz respectively. These were choosen to conveniently display the two individual spectra next to each other in a continuous spectra view without any overlap. Practical applications on the other hand need to take into account that the well usable bandwidth of each channel is only about 0.8 * MCR. For the chosen MCRs this means that the first radio has a usable bandwidth of 819.2 MHz and the second one of 1024 MHz. Taking into account that a typical RF passband in the first Nyquist zone has a passband of up to 0.4 * F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt; and the need for some overlap of the two spectra, the center frequency of radio0 should be set to 1.230 GHz (usable bandwidth spans from ~820 MHz to ~1640 MHz). Radio1 will be used in its second Nyquist zone, so the center frequency should be 2.0 GHz (usable bandwidth from ~1.5 GHz to ~2.5 GHz). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;appendix&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Appendix =&lt;br /&gt;
&amp;lt;span id=&amp;quot;x440-mcrs&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== X440 Supported Master Clock Rates (MCR) ==&lt;br /&gt;
Note: The selected FPGA bitfile may further limit the maximum supported master clock rate.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; margin:auto&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! MCR (MHz) !! RFDC Converter Rate (GHz)&lt;br /&gt;
|-&lt;br /&gt;
| 125.0 || 1.0&lt;br /&gt;
|-&lt;br /&gt;
| 128.0 || 1.024&lt;br /&gt;
|-&lt;br /&gt;
| 133.12 || 1.06496&lt;br /&gt;
|-&lt;br /&gt;
| 150.0 || 1.2&lt;br /&gt;
|-&lt;br /&gt;
| 153.6 || 1.2288&lt;br /&gt;
|-&lt;br /&gt;
| 160.0 || 1.28&lt;br /&gt;
|-&lt;br /&gt;
| 163.84 || 1.31072&lt;br /&gt;
|-&lt;br /&gt;
| 184.32 || 1.47456&lt;br /&gt;
|-&lt;br /&gt;
| 199.68 || 1.59744&lt;br /&gt;
|-&lt;br /&gt;
| 200.0 || 1.6&lt;br /&gt;
|-&lt;br /&gt;
| 204.8 || 1.6384&lt;br /&gt;
|-&lt;br /&gt;
| 240.0 || 1.92&lt;br /&gt;
|-&lt;br /&gt;
| 245.76 || 1.96608&lt;br /&gt;
|-&lt;br /&gt;
| 250.0 || 2.0, 1.0&lt;br /&gt;
|-&lt;br /&gt;
| 256.0 || 2.048, 1.024&lt;br /&gt;
|-&lt;br /&gt;
| 266.24 || 2.12992, 1.06496&lt;br /&gt;
|-&lt;br /&gt;
| 300.0 || 2.4, 1.2&lt;br /&gt;
|-&lt;br /&gt;
| 307.2 || 2.4576, 1.2288&lt;br /&gt;
|-&lt;br /&gt;
| 320.0 || 2.56, 1.28&lt;br /&gt;
|-&lt;br /&gt;
| 327.68 || 2.62144, 1.31072&lt;br /&gt;
|-&lt;br /&gt;
| 360.0 || 2.88, 1.44&lt;br /&gt;
|-&lt;br /&gt;
| 368.64 || 1.47456, 2.94912&lt;br /&gt;
|-&lt;br /&gt;
| 375.0 || 3.0, 1.5&lt;br /&gt;
|-&lt;br /&gt;
| 384.0 || 1.536, 3.072&lt;br /&gt;
|-&lt;br /&gt;
| 399.36 || 3.19488, 1.59744&lt;br /&gt;
|-&lt;br /&gt;
| 400.0 || 3.2, 1.6&lt;br /&gt;
|-&lt;br /&gt;
| 409.6 || 3.2768, 1.6384&lt;br /&gt;
|-&lt;br /&gt;
| 450.0 || 1.8, 3.6&lt;br /&gt;
|-&lt;br /&gt;
| 460.8 || 1.8432, 3.6864&lt;br /&gt;
|-&lt;br /&gt;
| 480.0 || 3.84, 1.92&lt;br /&gt;
|-&lt;br /&gt;
| 491.52 || 3.93216, 1.96608&lt;br /&gt;
|-&lt;br /&gt;
| 500.0 || 4.0, 2.0, 1.0&lt;br /&gt;
|-&lt;br /&gt;
| 512.0 || 1.024, 2.048, 4.096&lt;br /&gt;
|-&lt;br /&gt;
| 532.48 || 1.06496, 2.12992&lt;br /&gt;
|-&lt;br /&gt;
| 552.96 || 2.21184, 1.10592&lt;br /&gt;
|-&lt;br /&gt;
| 599.04 || 1.19808, 2.39616&lt;br /&gt;
|-&lt;br /&gt;
| 600.0 || 1.2, 2.4&lt;br /&gt;
|-&lt;br /&gt;
| 614.4 || 1.2288, 2.4576&lt;br /&gt;
|-&lt;br /&gt;
| 625.0 || 1.25, 2.5&lt;br /&gt;
|-&lt;br /&gt;
| 640.0 || 2.56, 1.28&lt;br /&gt;
|-&lt;br /&gt;
| 655.36 || 1.31072, 2.62144&lt;br /&gt;
|-&lt;br /&gt;
| 665.6 || 1.3312, 2.6624&lt;br /&gt;
|-&lt;br /&gt;
| 720.0 || 1.44, 2.88&lt;br /&gt;
|-&lt;br /&gt;
| 737.28 || 1.47456, 2.94912&lt;br /&gt;
|-&lt;br /&gt;
| 750.0 || 1.5, 3.0&lt;br /&gt;
|-&lt;br /&gt;
| 768.0 || 1.536, 3.072&lt;br /&gt;
|-&lt;br /&gt;
| 798.72 || 3.19488, 1.59744&lt;br /&gt;
|-&lt;br /&gt;
| 800.0 || 1.6, 3.2&lt;br /&gt;
|-&lt;br /&gt;
| 819.2 || 3.2768, 1.6384&lt;br /&gt;
|-&lt;br /&gt;
| 840.0 || 1.68, 3.36&lt;br /&gt;
|-&lt;br /&gt;
| 860.16 || 3.44064, 1.72032&lt;br /&gt;
|-&lt;br /&gt;
| 875.0 || 3.5, 1.75&lt;br /&gt;
|-&lt;br /&gt;
| 896.0 || 3.584, 1.792&lt;br /&gt;
|-&lt;br /&gt;
| 900.0 || 1.8, 3.6&lt;br /&gt;
|-&lt;br /&gt;
| 921.6 || 1.8432, 3.6864&lt;br /&gt;
|-&lt;br /&gt;
| 931.84 || 1.86368, 3.72736&lt;br /&gt;
|-&lt;br /&gt;
| 960.0 || 3.84, 1.92&lt;br /&gt;
|-&lt;br /&gt;
| 983.04 || 1.96608, 3.93216&lt;br /&gt;
|-&lt;br /&gt;
| 998.4 || 3.9936, 1.9968&lt;br /&gt;
|-&lt;br /&gt;
| 1000.0 || 4.0, 2.0&lt;br /&gt;
|-&lt;br /&gt;
| 1024.0 || 4.096, 2.048&lt;br /&gt;
|-&lt;br /&gt;
| 1050.0 || 2.1&lt;br /&gt;
|-&lt;br /&gt;
| 1064.96 || 2.12992&lt;br /&gt;
|-&lt;br /&gt;
| 1075.2 || 2.1504&lt;br /&gt;
|-&lt;br /&gt;
| 1080.0 || 2.16&lt;br /&gt;
|-&lt;br /&gt;
| 1105.92 || 2.21184&lt;br /&gt;
|-&lt;br /&gt;
| 1120.0 || 2.24&lt;br /&gt;
|-&lt;br /&gt;
| 1125.0 || 2.25&lt;br /&gt;
|-&lt;br /&gt;
| 1146.88 || 2.29376&lt;br /&gt;
|-&lt;br /&gt;
| 1152.0 || 2.304&lt;br /&gt;
|-&lt;br /&gt;
| 1198.08 || 2.39616&lt;br /&gt;
|-&lt;br /&gt;
| 1200.0 || 2.4&lt;br /&gt;
|-&lt;br /&gt;
| 1228.8 || 2.4576&lt;br /&gt;
|-&lt;br /&gt;
| 1280.0 || 2.56&lt;br /&gt;
|-&lt;br /&gt;
| 1290.24 || 2.58048&lt;br /&gt;
|-&lt;br /&gt;
| 1310.72 || 2.62144&lt;br /&gt;
|-&lt;br /&gt;
| 1331.2 || 2.6624&lt;br /&gt;
|-&lt;br /&gt;
| 1350.0 || 2.7&lt;br /&gt;
|-&lt;br /&gt;
| 1382.4 || 2.7648&lt;br /&gt;
|-&lt;br /&gt;
| 1397.76 || 2.79552&lt;br /&gt;
|-&lt;br /&gt;
| 1400.0 || 2.8&lt;br /&gt;
|-&lt;br /&gt;
| 1433.6 || 2.8672&lt;br /&gt;
|-&lt;br /&gt;
| 1440.0 || 2.88&lt;br /&gt;
|-&lt;br /&gt;
| 1474.56 || 2.94912&lt;br /&gt;
|-&lt;br /&gt;
| 1500.0 || 3.0&lt;br /&gt;
|-&lt;br /&gt;
| 1536.0 || 3.072&lt;br /&gt;
|-&lt;br /&gt;
| 1600.0 || 3.2&lt;br /&gt;
|-&lt;br /&gt;
| 1625.0 || 3.25&lt;br /&gt;
|-&lt;br /&gt;
| 1638.4 || 3.2768&lt;br /&gt;
|-&lt;br /&gt;
| 1650.0 || 3.3&lt;br /&gt;
|-&lt;br /&gt;
| 1658.88 || 3.31776&lt;br /&gt;
|-&lt;br /&gt;
| 1664.0 || 3.328&lt;br /&gt;
|-&lt;br /&gt;
| 1680.0 || 3.36&lt;br /&gt;
|-&lt;br /&gt;
| 1689.6 || 3.3792&lt;br /&gt;
|-&lt;br /&gt;
| 1720.32 || 3.44064&lt;br /&gt;
|-&lt;br /&gt;
| 1730.56 || 3.46112&lt;br /&gt;
|-&lt;br /&gt;
| 1750.0 || 3.5&lt;br /&gt;
|-&lt;br /&gt;
| 1760.0 || 3.52&lt;br /&gt;
|-&lt;br /&gt;
| 1792.0 || 3.584&lt;br /&gt;
|-&lt;br /&gt;
| 1797.12 || 3.59424&lt;br /&gt;
|-&lt;br /&gt;
| 1800.0 || 3.6&lt;br /&gt;
|-&lt;br /&gt;
| 1802.24 || 3.60448&lt;br /&gt;
|-&lt;br /&gt;
| 1843.2 || 3.6864&lt;br /&gt;
|-&lt;br /&gt;
| 1863.68 || 3.72736&lt;br /&gt;
|-&lt;br /&gt;
| 1875.0 || 3.75&lt;br /&gt;
|-&lt;br /&gt;
| 1920.0 || 3.84&lt;br /&gt;
|-&lt;br /&gt;
| 1950.0 || 3.9&lt;br /&gt;
|-&lt;br /&gt;
| 1966.08 || 3.93216&lt;br /&gt;
|-&lt;br /&gt;
| 1996.8 || 3.9936&lt;br /&gt;
|-&lt;br /&gt;
| 2000.0 || 4.0&lt;br /&gt;
|-&lt;br /&gt;
| 2027.52 || 4.05504&lt;br /&gt;
|-&lt;br /&gt;
| 2048.0 || 4.096&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;X440-supported-dual-rates&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== X440 Supported Master Clock Rate combinations (Dual Rate) ==&lt;br /&gt;
&amp;lt;b&amp;gt;Important:&amp;lt;/b&amp;gt; For the best RF performance it is required to configure the master clock rate that is connected to the higher RF-ADC/DAC converter rate on the first radio and the MCR connected to the lower converter rate second. Not all master clock rate combinations listed in this table will comply to this requirement by themselves. Specifying the converter_rate argument or swapping the master clock rates will help resolving issues. The selected FPGA bitfile may further limit the maximum supported master clock rate.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; margin:auto&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| MCR0 (MHz) || MCR1 (MHz)&lt;br /&gt;
|-&lt;br /&gt;
| 125.0 || 250.0, 375.0, 500.0, 750.0, 875.0, 1000.0, 1125.0, 1625.0, 1750.0, 1875.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 128.0 || 384.0, 512.0, 768.0, 1152.0&lt;br /&gt;
|-&lt;br /&gt;
| 133.12 || 266.24, 399.36, 532.48, 665.6, 798.72, 931.84, 1064.96, 1198.08, 1331.2, 1730.56, 1863.68, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 150.0 || 300.0, 450.0, 600.0, 750.0, 900.0, 1050.0, 1350.0, 1500.0, 1650.0, 1800.0, 1950.0&lt;br /&gt;
|-&lt;br /&gt;
| 153.6 || 307.2, 614.4, 1228.8&lt;br /&gt;
|-&lt;br /&gt;
| 160.0 || 320.0, 640.0, 800.0, 1120.0, 1280.0, 1600.0, 1760.0&lt;br /&gt;
|-&lt;br /&gt;
| 163.84 || 327.68, 655.36, 1146.88, 1310.72, 1474.56, 1802.24&lt;br /&gt;
|-&lt;br /&gt;
| 184.32 || 368.64, 552.96, 737.28, 1105.92, 1290.24, 1474.56, 1658.88, 1843.2, 2027.52&lt;br /&gt;
|-&lt;br /&gt;
| 199.68 || 399.36, 599.04, 798.72, 998.4, 1198.08, 1397.76, 1797.12, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 200.0 || 400.0, 800.0, 1200.0, 1400.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 204.8 || 409.6, 819.2, 1433.6, 1638.4&lt;br /&gt;
|-&lt;br /&gt;
| 240.0 || 360.0, 480.0, 600.0, 720.0, 840.0, 960.0, 1440.0, 1680.0, 1800.0, 1920.0&lt;br /&gt;
|-&lt;br /&gt;
| 245.76 || 491.52, 860.16, 983.04, 1720.32, 1966.08&lt;br /&gt;
|-&lt;br /&gt;
| 250.0 || 125.0, 375.0, 500.0, 750.0, 875.0, 1000.0, 1500.0, 1625.0, 1750.0, 1875.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 256.0 || 640.0, 896.0, 1024.0, 1280.0, 1664.0, 1792.0, 2048.0&lt;br /&gt;
|-&lt;br /&gt;
| 266.24 || 133.12, 399.36, 532.48, 665.6, 798.72, 931.84, 1064.96, 1331.2, 1730.56, 1863.68, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 300.0 || 150.0, 450.0, 600.0, 750.0, 900.0, 1050.0, 1500.0, 1650.0, 1800.0, 1950.0&lt;br /&gt;
|-&lt;br /&gt;
| 307.2 || 153.6, 614.4, 1228.8&lt;br /&gt;
|-&lt;br /&gt;
| 320.0 || 160.0, 640.0, 800.0, 1120.0, 1280.0, 1600.0, 1760.0&lt;br /&gt;
|-&lt;br /&gt;
| 327.68 || 163.84, 655.36, 1146.88, 1310.72, 1802.24&lt;br /&gt;
|-&lt;br /&gt;
| 360.0 || 240.0, 600.0, 720.0, 1080.0, 1800.0&lt;br /&gt;
|-&lt;br /&gt;
| 368.64 || 184.32, 552.96, 737.28, 1105.92, 1290.24, 1474.56, 1658.88, 1843.2, 2027.52&lt;br /&gt;
|-&lt;br /&gt;
| 375.0 || 125.0, 250.0, 750.0, 1125.0, 1500.0, 1875.0&lt;br /&gt;
|-&lt;br /&gt;
| 384.0 || 128.0, 768.0, 1152.0, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 399.36 || 133.12, 199.68, 266.24, 599.04, 665.6, 798.72, 998.4, 1198.08, 1331.2, 1397.76, 1797.12, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 400.0 || 200.0, 800.0, 1200.0, 1400.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 409.6 || 204.8, 819.2, 1433.6, 1638.4&lt;br /&gt;
|-&lt;br /&gt;
| 450.0 || 150.0, 300.0, 600.0, 750.0, 900.0, 1350.0, 1500.0, 1800.0&lt;br /&gt;
|-&lt;br /&gt;
| 460.8 || 768.0, 921.6, 1075.2, 1382.4, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 480.0 || 240.0, 720.0, 840.0, 960.0, 1440.0, 1680.0, 1920.0&lt;br /&gt;
|-&lt;br /&gt;
| 491.52 || 245.76, 860.16, 983.04, 1720.32, 1966.08&lt;br /&gt;
|-&lt;br /&gt;
| 500.0 || 125.0, 250.0, 750.0, 875.0, 1000.0, 1500.0, 1750.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 512.0 || 128.0, 768.0, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 532.48 || 133.12, 266.24, 798.72, 931.84, 1064.96, 1331.2, 1863.68&lt;br /&gt;
|-&lt;br /&gt;
| 552.96 || 184.32, 368.64, 737.28, 1105.92, 1290.24, 1474.56, 1658.88, 1843.2&lt;br /&gt;
|-&lt;br /&gt;
| 599.04 || 199.68, 399.36, 798.72, 998.4, 1198.08, 1397.76, 1797.12, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 600.0 || 150.0, 240.0, 300.0, 360.0, 450.0, 720.0, 900.0, 1000.0, 1050.0, 1500.0, 1800.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 614.4 || 153.6, 307.2, 1228.8&lt;br /&gt;
|-&lt;br /&gt;
| 640.0 || 160.0, 256.0, 320.0, 800.0, 1120.0, 1280.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 655.36 || 163.84, 327.68, 1146.88, 1310.72&lt;br /&gt;
|-&lt;br /&gt;
| 665.6 || 133.12, 266.24, 399.36, 798.72, 1331.2, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 720.0 || 240.0, 360.0, 480.0, 600.0, 960.0, 1440.0, 1680.0, 1800.0, 1920.0&lt;br /&gt;
|-&lt;br /&gt;
| 737.28 || 184.32, 368.64, 552.96, 1105.92, 1290.24, 1474.56, 1843.2&lt;br /&gt;
|-&lt;br /&gt;
| 750.0 || 125.0, 150.0, 250.0, 300.0, 375.0, 450.0, 500.0, 900.0, 1000.0, 1125.0, 1500.0, 1750.0, 1875.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 768.0 || 128.0, 384.0, 460.8, 512.0, 921.6, 1152.0, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 798.72 || 133.12, 199.68, 266.24, 399.36, 532.48, 599.04, 665.6, 998.4, 1064.96, 1198.08, 1331.2, 1397.76, 1863.68, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 800.0 || 160.0, 200.0, 320.0, 400.0, 640.0, 1200.0, 1400.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 819.2 || 204.8, 409.6, 1433.6, 1638.4&lt;br /&gt;
|-&lt;br /&gt;
| 840.0 || 240.0, 480.0, 1680.0&lt;br /&gt;
|-&lt;br /&gt;
| 860.16 || 245.76, 491.52, 1720.32&lt;br /&gt;
|-&lt;br /&gt;
| 875.0 || 125.0, 250.0, 500.0, 1750.0&lt;br /&gt;
|-&lt;br /&gt;
| 896.0 || 256.0, 1792.0&lt;br /&gt;
|-&lt;br /&gt;
| 900.0 || 150.0, 300.0, 450.0, 600.0, 750.0, 1500.0, 1800.0&lt;br /&gt;
|-&lt;br /&gt;
| 921.6 || 460.8, 768.0, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 931.84 || 133.12, 266.24, 532.48, 1863.68&lt;br /&gt;
|-&lt;br /&gt;
| 960.0 || 240.0, 480.0, 720.0, 1440.0, 1920.0&lt;br /&gt;
|-&lt;br /&gt;
| 983.04 || 245.76, 491.52, 1966.08&lt;br /&gt;
|-&lt;br /&gt;
| 998.4 || 199.68, 399.36, 599.04, 798.72, 1198.08, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 1000.0 || 125.0, 250.0, 500.0, 600.0, 750.0, 1500.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 1024.0 || 256.0, 1280.0, 2048.0&lt;br /&gt;
|-&lt;br /&gt;
| 1050.0 || 150.0, 300.0, 600.0&lt;br /&gt;
|-&lt;br /&gt;
| 1064.96 || 133.12, 266.24, 532.48, 798.72, 1331.2&lt;br /&gt;
|-&lt;br /&gt;
| 1075.2 || 460.8&lt;br /&gt;
|-&lt;br /&gt;
| 1080.0 || 360.0&lt;br /&gt;
|-&lt;br /&gt;
| 1105.92 || 184.32, 368.64, 552.96, 737.28, 1474.56, 1658.88, 1843.2&lt;br /&gt;
|-&lt;br /&gt;
| 1120.0 || 160.0, 320.0, 640.0&lt;br /&gt;
|-&lt;br /&gt;
| 1125.0 || 125.0, 375.0, 750.0, 1500.0, 1875.0&lt;br /&gt;
|-&lt;br /&gt;
| 1146.88 || 163.84, 327.68, 655.36&lt;br /&gt;
|-&lt;br /&gt;
| 1152.0 || 128.0, 384.0, 768.0, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 1198.08 || 133.12, 199.68, 399.36, 599.04, 798.72, 998.4, 1797.12, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 1200.0 || 200.0, 400.0, 800.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 1228.8 || 153.6, 307.2, 614.4&lt;br /&gt;
|-&lt;br /&gt;
| 1280.0 || 160.0, 256.0, 320.0, 640.0, 1024.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 1290.24 || 184.32, 368.64, 552.96, 737.28&lt;br /&gt;
|-&lt;br /&gt;
| 1310.72 || 163.84, 327.68, 655.36&lt;br /&gt;
|-&lt;br /&gt;
| 1331.2 || 133.12, 266.24, 399.36, 532.48, 665.6, 798.72, 1064.96, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 1350.0 || 150.0, 450.0&lt;br /&gt;
|-&lt;br /&gt;
| 1382.4 || 460.8&lt;br /&gt;
|-&lt;br /&gt;
| 1397.76 || 199.68, 399.36, 599.04, 798.72&lt;br /&gt;
|-&lt;br /&gt;
| 1400.0 || 200.0, 400.0, 800.0&lt;br /&gt;
|-&lt;br /&gt;
| 1433.6 || 204.8, 409.6, 819.2&lt;br /&gt;
|-&lt;br /&gt;
| 1440.0 || 240.0, 480.0, 720.0, 960.0, 1920.0&lt;br /&gt;
|-&lt;br /&gt;
| 1474.56 || 163.84, 184.32, 368.64, 552.96, 737.28, 1105.92&lt;br /&gt;
|-&lt;br /&gt;
| 1500.0 || 150.0, 250.0, 300.0, 375.0, 450.0, 500.0, 600.0, 750.0, 900.0, 1000.0, 1125.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 1536.0 || 384.0, 460.8, 512.0, 768.0, 921.6, 1152.0&lt;br /&gt;
|-&lt;br /&gt;
| 1600.0 || 160.0, 200.0, 320.0, 400.0, 640.0, 800.0, 1200.0, 1280.0&lt;br /&gt;
|-&lt;br /&gt;
| 1625.0 || 125.0, 250.0&lt;br /&gt;
|-&lt;br /&gt;
| 1638.4 || 204.8, 409.6, 819.2&lt;br /&gt;
|-&lt;br /&gt;
| 1650.0 || 150.0, 300.0&lt;br /&gt;
|-&lt;br /&gt;
| 1658.88 || 184.32, 368.64, 552.96, 1105.92&lt;br /&gt;
|-&lt;br /&gt;
| 1664.0 || 256.0&lt;br /&gt;
|-&lt;br /&gt;
| 1680.0 || 240.0, 480.0, 720.0, 840.0&lt;br /&gt;
|-&lt;br /&gt;
| 1720.32 || 245.76, 491.52, 860.16&lt;br /&gt;
|-&lt;br /&gt;
| 1730.56 || 133.12, 266.24&lt;br /&gt;
|-&lt;br /&gt;
| 1750.0 || 125.0, 250.0, 500.0, 750.0, 875.0&lt;br /&gt;
|-&lt;br /&gt;
| 1760.0 || 160.0, 320.0&lt;br /&gt;
|-&lt;br /&gt;
| 1792.0 || 256.0, 896.0&lt;br /&gt;
|-&lt;br /&gt;
| 1797.12 || 199.68, 399.36, 599.04, 1198.08&lt;br /&gt;
|-&lt;br /&gt;
| 1800.0 || 150.0, 240.0, 300.0, 360.0, 450.0, 600.0, 720.0, 900.0&lt;br /&gt;
|-&lt;br /&gt;
| 1802.24 || 163.84, 327.68&lt;br /&gt;
|-&lt;br /&gt;
| 1843.2 || 184.32, 368.64, 552.96, 737.28, 1105.92&lt;br /&gt;
|-&lt;br /&gt;
| 1863.68 || 133.12, 266.24, 532.48, 798.72, 931.84&lt;br /&gt;
|-&lt;br /&gt;
| 1875.0 || 125.0, 250.0, 375.0, 750.0, 1125.0&lt;br /&gt;
|-&lt;br /&gt;
| 1920.0 || 240.0, 480.0, 720.0, 960.0, 1440.0&lt;br /&gt;
|-&lt;br /&gt;
| 1950.0 || 150.0, 300.0&lt;br /&gt;
|-&lt;br /&gt;
| 1966.08 || 245.76, 491.52, 983.04&lt;br /&gt;
|-&lt;br /&gt;
| 1996.8 || 133.12, 199.68, 266.24, 399.36, 599.04, 665.6, 798.72, 998.4, 1198.08, 1331.2&lt;br /&gt;
|-&lt;br /&gt;
| 2000.0 || 125.0, 250.0, 500.0, 600.0, 750.0, 1000.0, 1500.0&lt;br /&gt;
|-&lt;br /&gt;
| 2027.52 || 184.32, 368.64&lt;br /&gt;
|-&lt;br /&gt;
| 2048.0 || 256.0, 1024.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;references&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== References and Related Documentation ==&lt;br /&gt;
* [https://www.ni.com/en/solutions/aerospace-defense/radar-electronic-warfare-sigint/advantages-of-direct-rf-sampling-architectures.html Advantages of Direct RF Sampling Architectures]&lt;br /&gt;
* [https://docs.xilinx.com/r/en-US/pg269-rf-data-converter Zynq UltraScale+ RFSoC RF Data Converter v2.6 Gen 1/2/3/DFE LogiCORE IP Product Guide (PG269)]&lt;br /&gt;
* [https://events.gnuradio.org/event/21/contributions/392/attachments/123/285/Lo%20and%20behold,%20no%20LO.pdf GRcon 23 - Lo and behold, no LO!]&lt;br /&gt;
* [https://docs.xilinx.com/r/en-US/ds926-zynq-ultrascale-plus-rfsoc/RF-ADC-Electrical-Characteristics Zynq UltraScale+ RFSoC Data Sheet: DC and AC Switching Characteristics (DS926)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Footnotes =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>MartinAnderseck</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=About_Sampling_Rates_and_Master_Clock_Rates_for_the_USRP_X440&amp;diff=5997</id>
		<title>About Sampling Rates and Master Clock Rates for the USRP X440</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=About_Sampling_Rates_and_Master_Clock_Rates_for_the_USRP_X440&amp;diff=5997"/>
				<updated>2024-01-05T09:42:58Z</updated>
		
		<summary type="html">&lt;p&gt;MartinAnderseck: Added note about phase coherence in dual rate case.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- Title: About Sampling Rates and Master Clock Rates for the USRP X440 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Application Note Number and Authors ==&lt;br /&gt;
&lt;br /&gt;
'''AN-055''' by Marian Koop and Martin Anderseck&lt;br /&gt;
&amp;lt;!-- Internal use only: please do keep this updated!&lt;br /&gt;
==Revision History==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Author&lt;br /&gt;
!Details&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2023-09-22&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Marian Koop &lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Initial creation&lt;br /&gt;
|} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;overview&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Overview = &lt;br /&gt;
This application note guides users through the selection process of Master Clock Rates (MCR) for the [https://kb.ettus.com/X440#X440 USRP X440]. It will highlight possible implications and side effects as well as design specific differences to other USRPs (like the X410).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;x440-cfg_considerations&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= USRP X440 Configuration Considerations = &lt;br /&gt;
The USRP X440 is a [https://uhd.readthedocs.io/en/latest/page_fbx.html#fbx_too balun-coupled transceiver] without built-in RF signal conditioning. Compared to other RF architectures this enables the USRP X440 to access the full RF bandwidth available to the ADC/DAC, but also requires additional frequency planning. To achieve this, the USRP X440 utilizes its ADC/DAC in direct sampling mode and is susceptible to various effects that may distort the signal of interest. These can be separated into distortions from both signal processing and from the ADC/DAC design.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;converter_rate-mcr-iq_rate&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Relationship between RF-ADC/DAC Converter Rate, USRP Master Clock Rate (MCR), Data IQ rate ==&lt;br /&gt;
Except for the 200 MHz variant, the default USRP X440 FPGA images do not contain a configurable DDC&amp;lt;ref&amp;gt;Digital Down Conversion&amp;lt;/ref&amp;gt;/DUC&amp;lt;ref&amp;gt;Digital Up Conversion&amp;lt;/ref&amp;gt; block. This means that the IQ sample rate (F&amp;lt;sub&amp;gt;IQ&amp;lt;/sub&amp;gt;) is the same as the Master Clock Rate (MCR) that goes into the RFNoC Radio block. However, unlike most other USRPs the USRP X440 supports a highly variable MCR. The RF Data Converter sampling rate (F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;) is chosen by UHD based on the MCR and the available resampling factors of 2, 4, or 8, and defaults to the highest achievable values with these factors. This can be overridden if the desired MCR can be achieved with multiple converter rates (see device argument [https://uhd.readthedocs.io/en/latest/page_usrp_x4xx.html#x4xx_usage_args converter_rate]). The inverse calculation - divide the converter rate by 8, 4 or 2 - has to be done to derive the master clock rate if a specific converter rate shall be used. Figure 1 depicts the simplified signal path block diagram for the USRP X440.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|+ Figure 1. Simplified USRP X440 Signal Path&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-X440_signal_path.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dsp-distortions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Aliases and Nyquist Zones ==&lt;br /&gt;
By itself the USRP X440 can sample input signals at frequencies above the Nyquist frequency&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Nyquist_frequency Nyquist frequency]&amp;lt;/ref&amp;gt;, which is half of the ADC converter sampling rate (F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;). However, this method introduces aliasing effects, which cause unwanted signals to appear as mirror images around multiples of the Nyquist frequency (F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/2) in the output spectrum. The first Nyquist zone (N1) is the frequency range from 0 to F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/2, and the second Nyquist zone (N2) goes from F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/2 to F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;. Other Nyquist zones are numbered in ascending order, each spanning F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/2. The digital passband in each Nyquist zone can be calculated as 0.4 * F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt; (see also &amp;lt;ref&amp;gt;[https://docs.xilinx.com/r/en-US/pg269-rf-data-converter/RF-ADC-Decimation-Filters-Gen-1/Gen-2 Xilinx RF-ADC Decimation Filters (Gen-1)]&amp;lt;/ref&amp;gt;). The following figure depicts the Nyquist zones for the minimum and maximum RF-ADC converter rates supported by the USRP X440. Note that the illustrations do not show the effects of external, analog filters on the achievable passband within a Nyquist zone. A typical expectation is, that the unusable frequency range around each Nyquist zone boundary (also often referred to as a guard band) increases with ascending Nyquist zone order and results in decreasing, lopsided achievable passbands.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|+ Figure 2. Nyquist Zones&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-X440_nyquist_zones.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Knowledge of signal aliases can both be exploited and create uncertainties. Applications could utilize intentional under sampling (also referred as &amp;quot;bandpass sampling&amp;quot;) to receive signals at greater than F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/2. The same effect may on the other hand lead to garbled or distorted signal detection if the signal of interest spans multiple Nyquist zones or interferer signals are aliased into the observed spectrum. Both effects are depicted in figure 3.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|+ Figure 3. Aliases - Wanted and unwanted&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-wanted_and_unwanted_aliases.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Applications should therefore prefer converter rates that can contain the desired signal spectrum in a single Nyquist zone, or split the signal spectrum among multiple channels and devices. While the USRP X440 does not limit the utilized Nyquist zone, performance degrades in higher orders zones and application should focus on operating in Nyquist zones 1 and 2 (For RX, zone 3 is possible, but zones 4 and higher result into significant performance degradation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adc-distortions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== RF-ADC Spurs to consider and how to predict them ==&lt;br /&gt;
Another kind of distortion originates from the ADC/DAC itself. The USRP X440 uses the Xilinx RFDC, which is a design that combines multiple converters to &lt;br /&gt;
achieve high RF-ADC rates. An RF-ADC in this design has 8 sub-ADCs that are interleaved together. The resulting offset spurs are minimized by the integrated self-calibration (see also &amp;lt;ref&amp;gt;[https://docs.xilinx.com/r/en-US/pg269-rf-data-converter/Key-CAL-Features-and-Guidance-Summary Key CAL Features and Guidance Summary]&amp;lt;/ref&amp;gt;) executed by UHD but may still be detectable in the signal spectrum.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|+ Figure 4. RF-ADC Spurs with MCR = 500 MHz&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-adc_distortions.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Even with the best calibration the RF-ADC spurs may still be detectable in the captured spectrum. Knowledge of the location of the spurs, in particular the RF-ADC offset spur may be used during frequency planning to select an MCR (and converter rate) that exclude the offset spur frequencies from the capture spectrum. RF-ADC input spurs on the other hand will be more difficult to avoid, but as rule of thumb for modulated input signals carrier frequencies that fall on an RF-ADC offset spur frequency should be avoided (because offset and input spurs would superimpose each other).&lt;br /&gt;
&lt;br /&gt;
=== How to predict offset spurs ===&lt;br /&gt;
Any residual DC offset not corrected appears as a spur at k*F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/N, where F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt; is the composite converter rate of the RF-ADC, N is the number of sub-RF-ADCs interleaved together (8 for X4xx devices), and k = 0, 1, 2, … N.&lt;br /&gt;
For more information on expected spurs levels, refer to OIS at &amp;lt;ref&amp;gt;[https://docs.xilinx.com/r/en-US/ds926-zynq-ultrascale-plus-rfsoc/RF-ADC-Performance-Characteristics RF-ADC Performance Characteristics]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== How to predict input spurs ===&lt;br /&gt;
Any residual difference from gain and time skew correction results in spurious signals at +/-f&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt; + (k/N)*F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;, where F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt; is the converter rate of the RF-ADC, N is the number of sub-RF-ADCs (8 for X4xx devices), and f&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt; is the frequency of the input signal.&lt;br /&gt;
For more information on expected spurs levels, refer to GTIS at &amp;lt;ref&amp;gt;[https://docs.xilinx.com/r/en-US/ds926-zynq-ultrascale-plus-rfsoc/RF-ADC-Performance-Characteristics RF-ADC Performance Characteristics]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dac-distortions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== RF-DAC Distortions ==&lt;br /&gt;
Like the RF-ADC, the RF-DAC is also not an ideal circuitry and suffers from zero-order hold reconstruction. To counter this undesired attenuation in all but the first Nyquist zone, the Xilinx RF-DAC offers a Mix-Mode, which improves the power response in the second Nyquist zone and is utilized by the USRP X440. This, together with an inverse sinc filter to counter residual distortion limits the practical use of the RF-DAC to the first two Nyquist zones. For more information on the RF-DAC mix-mode and inverse sinc filter characteristics, refer to &amp;lt;ref&amp;gt;[https://docs.xilinx.com/r/en-US/pg269-rf-data-converter/RF-DAC-Nyquist-Zone-Operation RF-DAC Nyquist Zone Operation]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|+ Figure 5 &amp;lt;ref&amp;gt;[https://docs.xilinx.com/viewer/attachment/wIPPkVrh~0jtjy6aqWeihQ/q5kXcl5Z7lFon2v535oW0w Xilinx: Ideal DAC Output Response, Normalised to Fsample]&amp;lt;/ref&amp;gt;. RF-DAC Mix-Mode and normal, ideal roll-off sinc response.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-dac_roll-off_sinc_response.png|350px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
source: https://docs.xilinx.com/viewer/attachment/wIPPkVrh~0jtjy6aqWeihQ/q5kXcl5Z7lFon2v535oW0w&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dual-rate&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Dual Rate ==&lt;br /&gt;
Unlike previous USRPs, the USRP X440 supports the operation at two different master clock rates simultaneously. All channels on the first daughterboard will run on the first master clock rate / sampling rate and all channels on the second daughterboard will run on the second configured master clock rate / sampling rate. The main motivation for having two different master clock rates is the direct sampling architecture of the USRP X440 without signal conditioning and filtering. While [[#dsp-distortions|Aliases and Nyquist Zones]] describes the challenges of that, with dual rate this feature can be used to capture an RF spectrum that exceeds the bandwidth abilities of the single rate operation. Using a second rate, one can close the Nyquist gap of the other and monitor a wider spectrum for further processing.&lt;br /&gt;
As the clocks of both radios are derived from a common clocking chip, not all combinations are possible. Refer to [[#X440-supported-dual-rates|X440 Supported Dual Rates]] for possible RF Data Converter sampling rate combinations. The section about the [[#converter_rate-mcr-iq_rate|Relationship between RFADC/DAC Converter Rate, USRP Master Clock Rate (MCR) and Data IQ rate]] explains how to derive valid master clock rates from the RF Data converter sampling rates.&lt;br /&gt;
&lt;br /&gt;
Note: When using different MCRs for both daughterboards, the device will skip the multi-tile synchronization. That means that the phase relationship between channels may not be preserved over retunes and reboots for channels of the same daughterboard and no defined phase relationship will be preserved between channels of different daughtherboards.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;use-cases&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Use cases =&lt;br /&gt;
== Scan Spectrum within single Nyquist zone ==&lt;br /&gt;
=== Spectrum Capture between 1.7 and 1.9 GHz. ===&lt;br /&gt;
* Min Bandwidth: 200 MHz&lt;br /&gt;
* Minimum IQ Rate: 250 MSps&lt;br /&gt;
==== Option 1: MCR = 250 MHz, RF-ADC converter rate = 2 GHz ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-1700-1800_250e6_2000e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This is not the best option because our spectrum of interest is very close to a Nyquist zone boundary.&lt;br /&gt;
&lt;br /&gt;
==== Option 2: MCR = 300 MHz, RF-ADC converter rate = 2.4 GHz ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-1700-1800_300e6_2400e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This option is better, the spectrum of interest is well within a Nyquist zone. Within the bandwidth of interest falls one of the ADC offset spurs. If the input signal is relatively strong, the impact from this small spur is negligible. If on the other hand the input signal strength is on the low end (for the X440), then maybe a different MCR should be considered.&lt;br /&gt;
&lt;br /&gt;
==== Option 3: MCR = 320 MHz, RF-ADC converter rate = 2.56 GHz ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-1700-1800_320e6_2560e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This option avoids a potential impact of an ADC offset spur in the observed spectrum. The only drawback to option 2 is the slightly higher data rate during host post-processing.&lt;br /&gt;
&lt;br /&gt;
=== Spectrum Capture between 500 MHz and 1.5 GHz. ===&lt;br /&gt;
The USRP X440 ships with multiple [https://uhd.readthedocs.io/en/latest/page_usrp_x4xx.html#x4xx_updating_fpga_types FPGA image flavors]. These either support 400 MHz or 1600 MHz RF bandwidth per channel. To address this use case, users have the option of using a bit file with 1600 MHz RF bandwidth to capture a contiguous spectrum, or use a 400 MHz bit file and create a stitched spectrum during host side post-processing. &lt;br /&gt;
==== Using 1600 MHz image ====&lt;br /&gt;
* Min Bandwidth: 1000 MHz&lt;br /&gt;
* Minimum IQ Rate: 1250 MSps&lt;br /&gt;
===== Option 1: MCR = 1280 MHz, RF-ADC converter rate = 2.56 GHz =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_1250e6_2560e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
Bad option, because desired spectrum spans multiple Nyquist zones.&lt;br /&gt;
&lt;br /&gt;
===== Option 2: MCR = 1600 MHz, RF-ADC converter rate = 3.2 GHz =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_1600e6_3200e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This is not the best option because our spectrum of interest is very close to a Nyquist zone boundary.&lt;br /&gt;
&lt;br /&gt;
===== Option 3: MCR = 1689.6 MHz, RF-ADC converter rate = 3.3792 GHz =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_1689e6_3379e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This option would work. If the input signal strength is low, using an even higher MCR would reduce the number of potential ADC offset spurs. This needs to be traded off against a higher data rate during host post-processing.&lt;br /&gt;
&lt;br /&gt;
==== Using 400 MHz image ====&lt;br /&gt;
Due to the smaller bandwidth addressing the use case will require the use of multiple channels. The captured spectra than needs to be stitched (combined) together.&lt;br /&gt;
* Max Bandwidth: 400 MHz&lt;br /&gt;
===== Option 1: MCR 400 MHz, RF-ADC converter rate = 3.2 GHz, 3 channels =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_400e6_3200e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This is not the best option because our spectrum of interest boundary is very close to a Nyquist zone boundary.&lt;br /&gt;
&lt;br /&gt;
===== Option 2: MCR 450 MHz, RF-ADC converter rate = 3.6 GHz, 3 channels =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_450e6_3600e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This option would work. Since the spectrum of interest is larger than the per channel bandwidth the captured spectrum may contain potential ADC offset spurs. For the spectrum of interest the 3 channels would nicely use tune frequencies (680, 1000, 1320 MHz) that do not match ADC offset spur frequencies.&lt;br /&gt;
&lt;br /&gt;
===== Option 3: MCR 512 MHz, RF-ADC converter rate = 4.096 GHz, 3 channels =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_512e6_4096e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This option would work as well. Like in option 2, the spectrum of interest may contain one potential ADC offset spur (compared to 2 in option 2). The drawback to option 2 is of course again the higher data rate during host post-processing that may be offset by only having to stitch less spectra (2 vs 3) together.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Scan Spectrum that spans multiple Nyquist Zones ==&lt;br /&gt;
&lt;br /&gt;
=== Tradeoffs: spectrum hole vs. use multiple mcrs/devices ===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scan Spectrum with dual master clock rate ==&lt;br /&gt;
=== Spectrum capture between 1.0 and 2.4 GHz (L-band) ===&lt;br /&gt;
* Combination of two RF-ADC converter rates: 4096 MHz and 2560 MHz&lt;br /&gt;
* Derived master clock rates: 1024 MHz (resampling factor 4) and 1280 MHz (resampling factor 2). The resampling factors are chosen to produce master clock rates which allow capturing a sufficient bandwidth to not have any gaps.&lt;br /&gt;
* Center frequencies: 1.23 GHz and 2.0 GHz respectively&lt;br /&gt;
* 1600 MHz FPGA image required due to the bandwidth requirements&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:AN055-L-band-dual-rate.jpg|800px|center]]&lt;br /&gt;
|}&lt;br /&gt;
In the picture you can see a light-green band between 1.0 GHz and 2.4 GHz which can be covered using two different rates: Radio0 operates at MCR=1024 MHz in its first Nyquist zone and radio1 operates at 1280 MHz in its second Nyquist zone. The coverage is shown as light-blue boxes in both frequency charts. Starting with UHD 4.6, the X440_L_band_capture.py example demonstrates this use case and by default uses center frequencies of 0.9 GHz and 2 GHz respectively. These were choosen to conveniently display the two individual spectra next to each other in a continuous spectra view without any overlap. Practical applications on the other hand need to take into account that the well usable bandwidth of each channel is only about 0.8 * MCR. For the chosen MCRs this means that the first radio has a usable bandwidth of 819.2 MHz and the second one of 1024 MHz. Taking into account that a typical RF passband in the first Nyquist zone has a passband of up to 0.4 * F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt; and the need for some overlap of the two spectra, the center frequency of radio0 should be set to 1.230 GHz (usable bandwidth spans from ~820 MHz to ~1640 MHz). Radio1 will be used in its second Nyquist zone, so the center frequency should be 2.0 GHz (usable bandwidth from ~1.5 GHz to ~2.5 GHz). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;appendix&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Appendix =&lt;br /&gt;
&amp;lt;span id=&amp;quot;x440-mcrs&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== X440 Supported Master Clock Rates (MCR) ==&lt;br /&gt;
Note: The selected FPGA bitfile may further limit the maximum supported master clock rate.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; margin:auto&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! MCR (MHz) !! RFDC Converter Rate (GHz)&lt;br /&gt;
|-&lt;br /&gt;
| 125.0 || 1.0&lt;br /&gt;
|-&lt;br /&gt;
| 128.0 || 1.024&lt;br /&gt;
|-&lt;br /&gt;
| 133.12 || 1.06496&lt;br /&gt;
|-&lt;br /&gt;
| 150.0 || 1.2&lt;br /&gt;
|-&lt;br /&gt;
| 153.6 || 1.2288&lt;br /&gt;
|-&lt;br /&gt;
| 160.0 || 1.28&lt;br /&gt;
|-&lt;br /&gt;
| 163.84 || 1.31072&lt;br /&gt;
|-&lt;br /&gt;
| 184.32 || 1.47456&lt;br /&gt;
|-&lt;br /&gt;
| 199.68 || 1.59744&lt;br /&gt;
|-&lt;br /&gt;
| 200.0 || 1.6&lt;br /&gt;
|-&lt;br /&gt;
| 204.8 || 1.6384&lt;br /&gt;
|-&lt;br /&gt;
| 240.0 || 1.92&lt;br /&gt;
|-&lt;br /&gt;
| 245.76 || 1.96608&lt;br /&gt;
|-&lt;br /&gt;
| 250.0 || 2.0, 1.0&lt;br /&gt;
|-&lt;br /&gt;
| 256.0 || 2.048, 1.024&lt;br /&gt;
|-&lt;br /&gt;
| 266.24 || 2.12992, 1.06496&lt;br /&gt;
|-&lt;br /&gt;
| 300.0 || 2.4, 1.2&lt;br /&gt;
|-&lt;br /&gt;
| 307.2 || 2.4576, 1.2288&lt;br /&gt;
|-&lt;br /&gt;
| 320.0 || 2.56, 1.28&lt;br /&gt;
|-&lt;br /&gt;
| 327.68 || 2.62144, 1.31072&lt;br /&gt;
|-&lt;br /&gt;
| 360.0 || 2.88, 1.44&lt;br /&gt;
|-&lt;br /&gt;
| 368.64 || 1.47456, 2.94912&lt;br /&gt;
|-&lt;br /&gt;
| 375.0 || 3.0, 1.5&lt;br /&gt;
|-&lt;br /&gt;
| 384.0 || 1.536, 3.072&lt;br /&gt;
|-&lt;br /&gt;
| 399.36 || 3.19488, 1.59744&lt;br /&gt;
|-&lt;br /&gt;
| 400.0 || 3.2, 1.6&lt;br /&gt;
|-&lt;br /&gt;
| 409.6 || 3.2768, 1.6384&lt;br /&gt;
|-&lt;br /&gt;
| 450.0 || 1.8, 3.6&lt;br /&gt;
|-&lt;br /&gt;
| 460.8 || 1.8432, 3.6864&lt;br /&gt;
|-&lt;br /&gt;
| 480.0 || 3.84, 1.92&lt;br /&gt;
|-&lt;br /&gt;
| 491.52 || 3.93216, 1.96608&lt;br /&gt;
|-&lt;br /&gt;
| 500.0 || 4.0, 2.0, 1.0&lt;br /&gt;
|-&lt;br /&gt;
| 512.0 || 1.024, 2.048, 4.096&lt;br /&gt;
|-&lt;br /&gt;
| 532.48 || 1.06496, 2.12992&lt;br /&gt;
|-&lt;br /&gt;
| 552.96 || 2.21184, 1.10592&lt;br /&gt;
|-&lt;br /&gt;
| 599.04 || 1.19808, 2.39616&lt;br /&gt;
|-&lt;br /&gt;
| 600.0 || 1.2, 2.4&lt;br /&gt;
|-&lt;br /&gt;
| 614.4 || 1.2288, 2.4576&lt;br /&gt;
|-&lt;br /&gt;
| 625.0 || 1.25, 2.5&lt;br /&gt;
|-&lt;br /&gt;
| 640.0 || 2.56, 1.28&lt;br /&gt;
|-&lt;br /&gt;
| 655.36 || 1.31072, 2.62144&lt;br /&gt;
|-&lt;br /&gt;
| 665.6 || 1.3312, 2.6624&lt;br /&gt;
|-&lt;br /&gt;
| 720.0 || 1.44, 2.88&lt;br /&gt;
|-&lt;br /&gt;
| 737.28 || 1.47456, 2.94912&lt;br /&gt;
|-&lt;br /&gt;
| 750.0 || 1.5, 3.0&lt;br /&gt;
|-&lt;br /&gt;
| 768.0 || 1.536, 3.072&lt;br /&gt;
|-&lt;br /&gt;
| 798.72 || 3.19488, 1.59744&lt;br /&gt;
|-&lt;br /&gt;
| 800.0 || 1.6, 3.2&lt;br /&gt;
|-&lt;br /&gt;
| 819.2 || 3.2768, 1.6384&lt;br /&gt;
|-&lt;br /&gt;
| 840.0 || 1.68, 3.36&lt;br /&gt;
|-&lt;br /&gt;
| 860.16 || 3.44064, 1.72032&lt;br /&gt;
|-&lt;br /&gt;
| 875.0 || 3.5, 1.75&lt;br /&gt;
|-&lt;br /&gt;
| 896.0 || 3.584, 1.792&lt;br /&gt;
|-&lt;br /&gt;
| 900.0 || 1.8, 3.6&lt;br /&gt;
|-&lt;br /&gt;
| 921.6 || 1.8432, 3.6864&lt;br /&gt;
|-&lt;br /&gt;
| 931.84 || 1.86368, 3.72736&lt;br /&gt;
|-&lt;br /&gt;
| 960.0 || 3.84, 1.92&lt;br /&gt;
|-&lt;br /&gt;
| 983.04 || 1.96608, 3.93216&lt;br /&gt;
|-&lt;br /&gt;
| 998.4 || 3.9936, 1.9968&lt;br /&gt;
|-&lt;br /&gt;
| 1000.0 || 4.0, 2.0&lt;br /&gt;
|-&lt;br /&gt;
| 1024.0 || 4.096, 2.048&lt;br /&gt;
|-&lt;br /&gt;
| 1050.0 || 2.1&lt;br /&gt;
|-&lt;br /&gt;
| 1064.96 || 2.12992&lt;br /&gt;
|-&lt;br /&gt;
| 1075.2 || 2.1504&lt;br /&gt;
|-&lt;br /&gt;
| 1080.0 || 2.16&lt;br /&gt;
|-&lt;br /&gt;
| 1105.92 || 2.21184&lt;br /&gt;
|-&lt;br /&gt;
| 1120.0 || 2.24&lt;br /&gt;
|-&lt;br /&gt;
| 1125.0 || 2.25&lt;br /&gt;
|-&lt;br /&gt;
| 1146.88 || 2.29376&lt;br /&gt;
|-&lt;br /&gt;
| 1152.0 || 2.304&lt;br /&gt;
|-&lt;br /&gt;
| 1198.08 || 2.39616&lt;br /&gt;
|-&lt;br /&gt;
| 1200.0 || 2.4&lt;br /&gt;
|-&lt;br /&gt;
| 1228.8 || 2.4576&lt;br /&gt;
|-&lt;br /&gt;
| 1280.0 || 2.56&lt;br /&gt;
|-&lt;br /&gt;
| 1290.24 || 2.58048&lt;br /&gt;
|-&lt;br /&gt;
| 1310.72 || 2.62144&lt;br /&gt;
|-&lt;br /&gt;
| 1331.2 || 2.6624&lt;br /&gt;
|-&lt;br /&gt;
| 1350.0 || 2.7&lt;br /&gt;
|-&lt;br /&gt;
| 1382.4 || 2.7648&lt;br /&gt;
|-&lt;br /&gt;
| 1397.76 || 2.79552&lt;br /&gt;
|-&lt;br /&gt;
| 1400.0 || 2.8&lt;br /&gt;
|-&lt;br /&gt;
| 1433.6 || 2.8672&lt;br /&gt;
|-&lt;br /&gt;
| 1440.0 || 2.88&lt;br /&gt;
|-&lt;br /&gt;
| 1474.56 || 2.94912&lt;br /&gt;
|-&lt;br /&gt;
| 1500.0 || 3.0&lt;br /&gt;
|-&lt;br /&gt;
| 1536.0 || 3.072&lt;br /&gt;
|-&lt;br /&gt;
| 1600.0 || 3.2&lt;br /&gt;
|-&lt;br /&gt;
| 1625.0 || 3.25&lt;br /&gt;
|-&lt;br /&gt;
| 1638.4 || 3.2768&lt;br /&gt;
|-&lt;br /&gt;
| 1650.0 || 3.3&lt;br /&gt;
|-&lt;br /&gt;
| 1658.88 || 3.31776&lt;br /&gt;
|-&lt;br /&gt;
| 1664.0 || 3.328&lt;br /&gt;
|-&lt;br /&gt;
| 1680.0 || 3.36&lt;br /&gt;
|-&lt;br /&gt;
| 1689.6 || 3.3792&lt;br /&gt;
|-&lt;br /&gt;
| 1720.32 || 3.44064&lt;br /&gt;
|-&lt;br /&gt;
| 1730.56 || 3.46112&lt;br /&gt;
|-&lt;br /&gt;
| 1750.0 || 3.5&lt;br /&gt;
|-&lt;br /&gt;
| 1760.0 || 3.52&lt;br /&gt;
|-&lt;br /&gt;
| 1792.0 || 3.584&lt;br /&gt;
|-&lt;br /&gt;
| 1797.12 || 3.59424&lt;br /&gt;
|-&lt;br /&gt;
| 1800.0 || 3.6&lt;br /&gt;
|-&lt;br /&gt;
| 1802.24 || 3.60448&lt;br /&gt;
|-&lt;br /&gt;
| 1843.2 || 3.6864&lt;br /&gt;
|-&lt;br /&gt;
| 1863.68 || 3.72736&lt;br /&gt;
|-&lt;br /&gt;
| 1875.0 || 3.75&lt;br /&gt;
|-&lt;br /&gt;
| 1920.0 || 3.84&lt;br /&gt;
|-&lt;br /&gt;
| 1950.0 || 3.9&lt;br /&gt;
|-&lt;br /&gt;
| 1966.08 || 3.93216&lt;br /&gt;
|-&lt;br /&gt;
| 1996.8 || 3.9936&lt;br /&gt;
|-&lt;br /&gt;
| 2000.0 || 4.0&lt;br /&gt;
|-&lt;br /&gt;
| 2027.52 || 4.05504&lt;br /&gt;
|-&lt;br /&gt;
| 2048.0 || 4.096&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;X440-supported-dual-rates&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== X440 Supported Master Clock Rate combinations (Dual Rate) ==&lt;br /&gt;
&amp;lt;b&amp;gt;Important:&amp;lt;/b&amp;gt; For the best RF performance it is required to configure the master clock rate that is connected to the higher RF-ADC/DAC converter rate on the first radio and the MCR connected to the lower converter rate second. Not all master clock rate combinations listed in this table will comply to this requirement by themselves. Specifying the converter_rate argument or swapping the master clock rates will help resolving issues. The selected FPGA bitfile may further limit the maximum supported master clock rate.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; margin:auto&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| MCR0 (MHz) || MCR1 (MHz)&lt;br /&gt;
|-&lt;br /&gt;
| 125.0 || 250.0, 375.0, 500.0, 750.0, 875.0, 1000.0, 1125.0, 1625.0, 1750.0, 1875.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 128.0 || 384.0, 512.0, 768.0, 1152.0&lt;br /&gt;
|-&lt;br /&gt;
| 133.12 || 266.24, 399.36, 532.48, 665.6, 798.72, 931.84, 1064.96, 1198.08, 1331.2, 1730.56, 1863.68, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 150.0 || 300.0, 450.0, 600.0, 750.0, 900.0, 1050.0, 1350.0, 1500.0, 1650.0, 1800.0, 1950.0&lt;br /&gt;
|-&lt;br /&gt;
| 153.6 || 307.2, 614.4, 1228.8&lt;br /&gt;
|-&lt;br /&gt;
| 160.0 || 320.0, 640.0, 800.0, 1120.0, 1280.0, 1600.0, 1760.0&lt;br /&gt;
|-&lt;br /&gt;
| 163.84 || 327.68, 655.36, 1146.88, 1310.72, 1474.56, 1802.24&lt;br /&gt;
|-&lt;br /&gt;
| 184.32 || 368.64, 552.96, 737.28, 1105.92, 1290.24, 1474.56, 1658.88, 1843.2, 2027.52&lt;br /&gt;
|-&lt;br /&gt;
| 199.68 || 399.36, 599.04, 798.72, 998.4, 1198.08, 1397.76, 1797.12, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 200.0 || 400.0, 800.0, 1200.0, 1400.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 204.8 || 409.6, 819.2, 1433.6, 1638.4&lt;br /&gt;
|-&lt;br /&gt;
| 240.0 || 360.0, 480.0, 600.0, 720.0, 840.0, 960.0, 1440.0, 1680.0, 1800.0, 1920.0&lt;br /&gt;
|-&lt;br /&gt;
| 245.76 || 491.52, 860.16, 983.04, 1720.32, 1966.08&lt;br /&gt;
|-&lt;br /&gt;
| 250.0 || 125.0, 375.0, 500.0, 750.0, 875.0, 1000.0, 1500.0, 1625.0, 1750.0, 1875.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 256.0 || 640.0, 896.0, 1024.0, 1280.0, 1664.0, 1792.0, 2048.0&lt;br /&gt;
|-&lt;br /&gt;
| 266.24 || 133.12, 399.36, 532.48, 665.6, 798.72, 931.84, 1064.96, 1331.2, 1730.56, 1863.68, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 300.0 || 150.0, 450.0, 600.0, 750.0, 900.0, 1050.0, 1500.0, 1650.0, 1800.0, 1950.0&lt;br /&gt;
|-&lt;br /&gt;
| 307.2 || 153.6, 614.4, 1228.8&lt;br /&gt;
|-&lt;br /&gt;
| 320.0 || 160.0, 640.0, 800.0, 1120.0, 1280.0, 1600.0, 1760.0&lt;br /&gt;
|-&lt;br /&gt;
| 327.68 || 163.84, 655.36, 1146.88, 1310.72, 1802.24&lt;br /&gt;
|-&lt;br /&gt;
| 360.0 || 240.0, 600.0, 720.0, 1080.0, 1800.0&lt;br /&gt;
|-&lt;br /&gt;
| 368.64 || 184.32, 552.96, 737.28, 1105.92, 1290.24, 1474.56, 1658.88, 1843.2, 2027.52&lt;br /&gt;
|-&lt;br /&gt;
| 375.0 || 125.0, 250.0, 750.0, 1125.0, 1500.0, 1875.0&lt;br /&gt;
|-&lt;br /&gt;
| 384.0 || 128.0, 768.0, 1152.0, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 399.36 || 133.12, 199.68, 266.24, 599.04, 665.6, 798.72, 998.4, 1198.08, 1331.2, 1397.76, 1797.12, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 400.0 || 200.0, 800.0, 1200.0, 1400.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 409.6 || 204.8, 819.2, 1433.6, 1638.4&lt;br /&gt;
|-&lt;br /&gt;
| 450.0 || 150.0, 300.0, 600.0, 750.0, 900.0, 1350.0, 1500.0, 1800.0&lt;br /&gt;
|-&lt;br /&gt;
| 460.8 || 768.0, 921.6, 1075.2, 1382.4, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 480.0 || 240.0, 720.0, 840.0, 960.0, 1440.0, 1680.0, 1920.0&lt;br /&gt;
|-&lt;br /&gt;
| 491.52 || 245.76, 860.16, 983.04, 1720.32, 1966.08&lt;br /&gt;
|-&lt;br /&gt;
| 500.0 || 125.0, 250.0, 750.0, 875.0, 1000.0, 1500.0, 1750.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 512.0 || 128.0, 768.0, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 532.48 || 133.12, 266.24, 798.72, 931.84, 1064.96, 1331.2, 1863.68&lt;br /&gt;
|-&lt;br /&gt;
| 552.96 || 184.32, 368.64, 737.28, 1105.92, 1290.24, 1474.56, 1658.88, 1843.2&lt;br /&gt;
|-&lt;br /&gt;
| 599.04 || 199.68, 399.36, 798.72, 998.4, 1198.08, 1397.76, 1797.12, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 600.0 || 150.0, 240.0, 300.0, 360.0, 450.0, 720.0, 900.0, 1000.0, 1050.0, 1500.0, 1800.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 614.4 || 153.6, 307.2, 1228.8&lt;br /&gt;
|-&lt;br /&gt;
| 640.0 || 160.0, 256.0, 320.0, 800.0, 1120.0, 1280.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 655.36 || 163.84, 327.68, 1146.88, 1310.72&lt;br /&gt;
|-&lt;br /&gt;
| 665.6 || 133.12, 266.24, 399.36, 798.72, 1331.2, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 720.0 || 240.0, 360.0, 480.0, 600.0, 960.0, 1440.0, 1680.0, 1800.0, 1920.0&lt;br /&gt;
|-&lt;br /&gt;
| 737.28 || 184.32, 368.64, 552.96, 1105.92, 1290.24, 1474.56, 1843.2&lt;br /&gt;
|-&lt;br /&gt;
| 750.0 || 125.0, 150.0, 250.0, 300.0, 375.0, 450.0, 500.0, 900.0, 1000.0, 1125.0, 1500.0, 1750.0, 1875.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 768.0 || 128.0, 384.0, 460.8, 512.0, 921.6, 1152.0, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 798.72 || 133.12, 199.68, 266.24, 399.36, 532.48, 599.04, 665.6, 998.4, 1064.96, 1198.08, 1331.2, 1397.76, 1863.68, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 800.0 || 160.0, 200.0, 320.0, 400.0, 640.0, 1200.0, 1400.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 819.2 || 204.8, 409.6, 1433.6, 1638.4&lt;br /&gt;
|-&lt;br /&gt;
| 840.0 || 240.0, 480.0, 1680.0&lt;br /&gt;
|-&lt;br /&gt;
| 860.16 || 245.76, 491.52, 1720.32&lt;br /&gt;
|-&lt;br /&gt;
| 875.0 || 125.0, 250.0, 500.0, 1750.0&lt;br /&gt;
|-&lt;br /&gt;
| 896.0 || 256.0, 1792.0&lt;br /&gt;
|-&lt;br /&gt;
| 900.0 || 150.0, 300.0, 450.0, 600.0, 750.0, 1500.0, 1800.0&lt;br /&gt;
|-&lt;br /&gt;
| 921.6 || 460.8, 768.0, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 931.84 || 133.12, 266.24, 532.48, 1863.68&lt;br /&gt;
|-&lt;br /&gt;
| 960.0 || 240.0, 480.0, 720.0, 1440.0, 1920.0&lt;br /&gt;
|-&lt;br /&gt;
| 983.04 || 245.76, 491.52, 1966.08&lt;br /&gt;
|-&lt;br /&gt;
| 998.4 || 199.68, 399.36, 599.04, 798.72, 1198.08, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 1000.0 || 125.0, 250.0, 500.0, 600.0, 750.0, 1500.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 1024.0 || 256.0, 1280.0, 2048.0&lt;br /&gt;
|-&lt;br /&gt;
| 1050.0 || 150.0, 300.0, 600.0&lt;br /&gt;
|-&lt;br /&gt;
| 1064.96 || 133.12, 266.24, 532.48, 798.72, 1331.2&lt;br /&gt;
|-&lt;br /&gt;
| 1075.2 || 460.8&lt;br /&gt;
|-&lt;br /&gt;
| 1080.0 || 360.0&lt;br /&gt;
|-&lt;br /&gt;
| 1105.92 || 184.32, 368.64, 552.96, 737.28, 1474.56, 1658.88, 1843.2&lt;br /&gt;
|-&lt;br /&gt;
| 1120.0 || 160.0, 320.0, 640.0&lt;br /&gt;
|-&lt;br /&gt;
| 1125.0 || 125.0, 375.0, 750.0, 1500.0, 1875.0&lt;br /&gt;
|-&lt;br /&gt;
| 1146.88 || 163.84, 327.68, 655.36&lt;br /&gt;
|-&lt;br /&gt;
| 1152.0 || 128.0, 384.0, 768.0, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 1198.08 || 133.12, 199.68, 399.36, 599.04, 798.72, 998.4, 1797.12, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 1200.0 || 200.0, 400.0, 800.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 1228.8 || 153.6, 307.2, 614.4&lt;br /&gt;
|-&lt;br /&gt;
| 1280.0 || 160.0, 256.0, 320.0, 640.0, 1024.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 1290.24 || 184.32, 368.64, 552.96, 737.28&lt;br /&gt;
|-&lt;br /&gt;
| 1310.72 || 163.84, 327.68, 655.36&lt;br /&gt;
|-&lt;br /&gt;
| 1331.2 || 133.12, 266.24, 399.36, 532.48, 665.6, 798.72, 1064.96, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 1350.0 || 150.0, 450.0&lt;br /&gt;
|-&lt;br /&gt;
| 1382.4 || 460.8&lt;br /&gt;
|-&lt;br /&gt;
| 1397.76 || 199.68, 399.36, 599.04, 798.72&lt;br /&gt;
|-&lt;br /&gt;
| 1400.0 || 200.0, 400.0, 800.0&lt;br /&gt;
|-&lt;br /&gt;
| 1433.6 || 204.8, 409.6, 819.2&lt;br /&gt;
|-&lt;br /&gt;
| 1440.0 || 240.0, 480.0, 720.0, 960.0, 1920.0&lt;br /&gt;
|-&lt;br /&gt;
| 1474.56 || 163.84, 184.32, 368.64, 552.96, 737.28, 1105.92&lt;br /&gt;
|-&lt;br /&gt;
| 1500.0 || 150.0, 250.0, 300.0, 375.0, 450.0, 500.0, 600.0, 750.0, 900.0, 1000.0, 1125.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 1536.0 || 384.0, 460.8, 512.0, 768.0, 921.6, 1152.0&lt;br /&gt;
|-&lt;br /&gt;
| 1600.0 || 160.0, 200.0, 320.0, 400.0, 640.0, 800.0, 1200.0, 1280.0&lt;br /&gt;
|-&lt;br /&gt;
| 1625.0 || 125.0, 250.0&lt;br /&gt;
|-&lt;br /&gt;
| 1638.4 || 204.8, 409.6, 819.2&lt;br /&gt;
|-&lt;br /&gt;
| 1650.0 || 150.0, 300.0&lt;br /&gt;
|-&lt;br /&gt;
| 1658.88 || 184.32, 368.64, 552.96, 1105.92&lt;br /&gt;
|-&lt;br /&gt;
| 1664.0 || 256.0&lt;br /&gt;
|-&lt;br /&gt;
| 1680.0 || 240.0, 480.0, 720.0, 840.0&lt;br /&gt;
|-&lt;br /&gt;
| 1720.32 || 245.76, 491.52, 860.16&lt;br /&gt;
|-&lt;br /&gt;
| 1730.56 || 133.12, 266.24&lt;br /&gt;
|-&lt;br /&gt;
| 1750.0 || 125.0, 250.0, 500.0, 750.0, 875.0&lt;br /&gt;
|-&lt;br /&gt;
| 1760.0 || 160.0, 320.0&lt;br /&gt;
|-&lt;br /&gt;
| 1792.0 || 256.0, 896.0&lt;br /&gt;
|-&lt;br /&gt;
| 1797.12 || 199.68, 399.36, 599.04, 1198.08&lt;br /&gt;
|-&lt;br /&gt;
| 1800.0 || 150.0, 240.0, 300.0, 360.0, 450.0, 600.0, 720.0, 900.0&lt;br /&gt;
|-&lt;br /&gt;
| 1802.24 || 163.84, 327.68&lt;br /&gt;
|-&lt;br /&gt;
| 1843.2 || 184.32, 368.64, 552.96, 737.28, 1105.92&lt;br /&gt;
|-&lt;br /&gt;
| 1863.68 || 133.12, 266.24, 532.48, 798.72, 931.84&lt;br /&gt;
|-&lt;br /&gt;
| 1875.0 || 125.0, 250.0, 375.0, 750.0, 1125.0&lt;br /&gt;
|-&lt;br /&gt;
| 1920.0 || 240.0, 480.0, 720.0, 960.0, 1440.0&lt;br /&gt;
|-&lt;br /&gt;
| 1950.0 || 150.0, 300.0&lt;br /&gt;
|-&lt;br /&gt;
| 1966.08 || 245.76, 491.52, 983.04&lt;br /&gt;
|-&lt;br /&gt;
| 1996.8 || 133.12, 199.68, 266.24, 399.36, 599.04, 665.6, 798.72, 998.4, 1198.08, 1331.2&lt;br /&gt;
|-&lt;br /&gt;
| 2000.0 || 125.0, 250.0, 500.0, 600.0, 750.0, 1000.0, 1500.0&lt;br /&gt;
|-&lt;br /&gt;
| 2027.52 || 184.32, 368.64&lt;br /&gt;
|-&lt;br /&gt;
| 2048.0 || 256.0, 1024.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;references&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== References and Related Documentation ==&lt;br /&gt;
* [https://www.ni.com/en/solutions/aerospace-defense/radar-electronic-warfare-sigint/advantages-of-direct-rf-sampling-architectures.html Advantages of Direct RF Sampling Architectures]&lt;br /&gt;
* [https://docs.xilinx.com/r/en-US/pg269-rf-data-converter Zynq UltraScale+ RFSoC RF Data Converter v2.6 Gen 1/2/3/DFE LogiCORE IP Product Guide (PG269)]&lt;br /&gt;
* [https://events.gnuradio.org/event/21/contributions/392/attachments/123/285/Lo%20and%20behold,%20no%20LO.pdf GRcon 23 - Lo and behold, no LO!]&lt;br /&gt;
* [https://docs.xilinx.com/r/en-US/ds926-zynq-ultrascale-plus-rfsoc/RF-ADC-Electrical-Characteristics Zynq UltraScale+ RFSoC Data Sheet: DC and AC Switching Characteristics (DS926)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Footnotes =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>MartinAnderseck</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=About_Sampling_Rates_and_Master_Clock_Rates_for_the_USRP_X440&amp;diff=5900</id>
		<title>About Sampling Rates and Master Clock Rates for the USRP X440</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=About_Sampling_Rates_and_Master_Clock_Rates_for_the_USRP_X440&amp;diff=5900"/>
				<updated>2023-11-20T10:30:52Z</updated>
		
		<summary type="html">&lt;p&gt;MartinAnderseck: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- Title: About Sampling Rates and Master Clock Rates for the USRP X440 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Application Note Number and Authors ==&lt;br /&gt;
&lt;br /&gt;
'''AN-055''' by Marian Koop and Martin Anderseck&lt;br /&gt;
&amp;lt;!-- Internal use only: please do keep this updated!&lt;br /&gt;
==Revision History==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Author&lt;br /&gt;
!Details&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2023-09-22&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Marian Koop &lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Initial creation&lt;br /&gt;
|} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;overview&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Overview = &lt;br /&gt;
This application note guides users through the selection process of Master Clock Rates (MCR) for the [https://kb.ettus.com/X440#X440 USRP X440]. It will highlight possible implications and side effects as well as design specific differences to other USRPs (like the X410).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;x440-cfg_considerations&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= USRP X440 Configuration Considerations = &lt;br /&gt;
The USRP X440 is a [https://uhd.readthedocs.io/en/latest/page_fbx.html#fbx_too balun-coupled transceiver] without built-in RF signal conditioning. Compared to other RF architectures this enables the USRP X440 to access the full RF bandwidth available to the ADC/DAC, but also requires additional frequency planning. To achieve this, the USRP X440 utilizes its ADC/DAC in direct sampling mode and is susceptible to various effects that may distort the signal of interest. These can be separated into distortions from both signal processing and from the ADC/DAC design.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;converter_rate-mcr-iq_rate&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Relationship between RF-ADC/DAC Converter Rate, USRP Master Clock Rate (MCR), Data IQ rate ==&lt;br /&gt;
Except for the 200 MHz variant, the default USRP X440 FPGA images do not contain a configurable DDC&amp;lt;ref&amp;gt;Digital Down Conversion&amp;lt;/ref&amp;gt;/DUC&amp;lt;ref&amp;gt;Digital Up Conversion&amp;lt;/ref&amp;gt; block. This means that the IQ sample rate (F&amp;lt;sub&amp;gt;IQ&amp;lt;/sub&amp;gt;) is the same as the Master Clock Rate (MCR) that goes into the RFNoC Radio block. However, unlike most other USRPs the USRP X440 supports a highly variable MCR. The RF Data Converter sampling rate (F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;) is chosen by UHD based on the MCR and the available resampling factors of 2, 4, or 8, and defaults to the highest achievable values with these factors. This can be overridden if the desired MCR can be achieved with multiple converter rates (see device argument [https://uhd.readthedocs.io/en/latest/page_usrp_x4xx.html#x4xx_usage_args converter_rate]). The inverse calculation - divide the converter rate by 8, 4 or 2 - has to be done to derive the master clock rate if a specific converter rate shall be used. Figure 1 depicts the simplified signal path block diagram for the USRP X440.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|+ Figure 1. Simplified USRP X440 Signal Path&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-X440_signal_path.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dsp-distortions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Aliases and Nyquist Zones ==&lt;br /&gt;
By itself the USRP X440 can sample input signals at frequencies above the Nyquist frequency&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Nyquist_frequency Nyquist frequency]&amp;lt;/ref&amp;gt;, which is half of the ADC converter sampling rate (F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;). However, this method introduces aliasing effects, which cause unwanted signals to appear as mirror images around multiples of the Nyquist frequency (F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/2) in the output spectrum. The first Nyquist zone (N1) is the frequency range from 0 to F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/2, and the second Nyquist zone (N2) goes from F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/2 to F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;. Other Nyquist zones are numbered in ascending order, each spanning F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/2. The digital passband in each Nyquist zone can be calculated as 0.4 * F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt; (see also &amp;lt;ref&amp;gt;[https://docs.xilinx.com/r/en-US/pg269-rf-data-converter/RF-ADC-Decimation-Filters-Gen-1/Gen-2 Xilinx RF-ADC Decimation Filters (Gen-1)]&amp;lt;/ref&amp;gt;). The following figure depicts the Nyquist zones for the minimum and maximum RF-ADC converter rates supported by the USRP X440. Note that the illustrations do not show the effects of external, analog filters on the achievable passband within a Nyquist zone. A typical expectation is, that the unusable frequency range around each Nyquist zone boundary (also often referred to as a guard band) increases with ascending Nyquist zone order and results in decreasing, lopsided achievable passbands.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|+ Figure 2. Nyquist Zones&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-X440_nyquist_zones.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Knowledge of signal aliases can both be exploited and create uncertainties. Applications could utilize intentional under sampling (also referred as &amp;quot;bandpass sampling&amp;quot;) to receive signals at greater than F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/2. The same effect may on the other hand lead to garbled or distorted signal detection if the signal of interest spans multiple Nyquist zones or interferer signals are aliased into the observed spectrum. Both effects are depicted in figure 3.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|+ Figure 3. Aliases - Wanted and unwanted&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-wanted_and_unwanted_aliases.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Applications should therefore prefer converter rates that can contain the desired signal spectrum in a single Nyquist zone, or split the signal spectrum among multiple channels and devices. While the USRP X440 does not limit the utilized Nyquist zone, performance degrades in higher orders zones and application should focus on operating in Nyquist zones 1 and 2 (For RX, zone 3 is possible, but zones 4 and higher result into significant performance degradation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adc-distortions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== RF-ADC Spurs to consider and how to predict them ==&lt;br /&gt;
Another kind of distortion originates from the ADC/DAC itself. The USRP X440 uses the Xilinx RFDC, which is a design that combines multiple converters to &lt;br /&gt;
achieve high RF-ADC rates. An RF-ADC in this design has 8 sub-ADCs that are interleaved together. The resulting offset spurs are minimized by the integrated self-calibration (see also &amp;lt;ref&amp;gt;[https://docs.xilinx.com/r/en-US/pg269-rf-data-converter/Key-CAL-Features-and-Guidance-Summary Key CAL Features and Guidance Summary]&amp;lt;/ref&amp;gt;) executed by UHD but may still be detectable in the signal spectrum.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|+ Figure 4. RF-ADC Spurs with MCR = 500 MHz&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-adc_distortions.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Even with the best calibration the RF-ADC spurs may still be detectable in the captured spectrum. Knowledge of the location of the spurs, in particular the RF-ADC offset spur may be used during frequency planning to select an MCR (and converter rate) that exclude the offset spur frequencies from the capture spectrum. RF-ADC input spurs on the other hand will be more difficult to avoid, but as rule of thumb for modulated input signals carrier frequencies that fall on an RF-ADC offset spur frequency should be avoided (because offset and input spurs would superimpose each other).&lt;br /&gt;
&lt;br /&gt;
=== How to predict offset spurs ===&lt;br /&gt;
Any residual DC offset not corrected appears as a spur at k*F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;/N, where F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt; is the composite converter rate of the RF-ADC, N is the number of sub-RF-ADCs interleaved together (8 for X4xx devices), and k = 0, 1, 2, … N.&lt;br /&gt;
For more information on expected spurs levels, refer to OIS at &amp;lt;ref&amp;gt;[https://docs.xilinx.com/r/en-US/ds926-zynq-ultrascale-plus-rfsoc/RF-ADC-Performance-Characteristics RF-ADC Performance Characteristics]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== How to predict input spurs ===&lt;br /&gt;
Any residual difference from gain and time skew correction results in spurious signals at +/-f&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt; + (k/N)*F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;, where F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt; is the converter rate of the RF-ADC, N is the number of sub-RF-ADCs (8 for X4xx devices), and f&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt; is the frequency of the input signal.&lt;br /&gt;
For more information on expected spurs levels, refer to GTIS at &amp;lt;ref&amp;gt;[https://docs.xilinx.com/r/en-US/ds926-zynq-ultrascale-plus-rfsoc/RF-ADC-Performance-Characteristics RF-ADC Performance Characteristics]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dac-distortions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== RF-DAC Distortions ==&lt;br /&gt;
Like the RF-ADC, the RF-DAC is also not an ideal circuitry and suffers from zero-order hold reconstruction. To counter this undesired attenuation in all but the first Nyquist zone, the Xilinx RF-DAC offers a Mix-Mode, which improves the power response in the second Nyquist zone and is utilized by the USRP X440. This, together with an inverse sinc filter to counter residual distortion limits the practical use of the RF-DAC to the first two Nyquist zones. For more information on the RF-DAC mix-mode and inverse sinc filter characteristics, refer to &amp;lt;ref&amp;gt;[https://docs.xilinx.com/r/en-US/pg269-rf-data-converter/RF-DAC-Nyquist-Zone-Operation RF-DAC Nyquist Zone Operation]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|+ Figure 5 &amp;lt;ref&amp;gt;[https://docs.xilinx.com/viewer/attachment/wIPPkVrh~0jtjy6aqWeihQ/q5kXcl5Z7lFon2v535oW0w Xilinx: Ideal DAC Output Response, Normalised to Fsample]&amp;lt;/ref&amp;gt;. RF-DAC Mix-Mode and normal, ideal roll-off sinc response.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-dac_roll-off_sinc_response.png|350px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
source: https://docs.xilinx.com/viewer/attachment/wIPPkVrh~0jtjy6aqWeihQ/q5kXcl5Z7lFon2v535oW0w&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dual-rate&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Dual Rate ==&lt;br /&gt;
Unlike previous USRPs, the USRP X440 supports the operation at two different master clock rates simultaneously. All channels on the first daughterboard will run on the first master clock rate / sampling rate and all channels on the second daughterboard will run on the second configured master clock rate / sampling rate. The main motivation for having two different master clock rates is the direct sampling architecture of the USRP X440 without signal conditioning and filtering. While [[#dsp-distortions|Aliases and Nyquist Zones]] describes the challenges of that, with dual rate this feature can be used to capture an RF spectrum that exceeds the bandwidth abilities of the single rate operation. Using a second rate, one can close the Nyquist gap of the other and monitor a wider spectrum for further processing.&lt;br /&gt;
As the clocks of both radios are derived from a common clocking chip, not all combinations are possible. Refer to [[#X440-supported-dual-rates|X440 Supported Dual Rates]] for possible RF Data Converter sampling rate combinations. The section about the [[#converter_rate-mcr-iq_rate|Relationship between RFADC/DAC Converter Rate, USRP Master Clock Rate (MCR) and Data IQ rate]] explains how to derive valid master clock rates from the RF Data converter sampling rates.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;use-cases&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Use cases =&lt;br /&gt;
== Scan Spectrum within single Nyquist zone ==&lt;br /&gt;
=== Spectrum Capture between 1.7 and 1.9 GHz. ===&lt;br /&gt;
* Min Bandwidth: 200 MHz&lt;br /&gt;
* Minimum IQ Rate: 250 MSps&lt;br /&gt;
==== Option 1: MCR = 250 MHz, RF-ADC converter rate = 2 GHz ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-1700-1800_250e6_2000e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This is not the best option because our spectrum of interest is very close to a Nyquist zone boundary.&lt;br /&gt;
&lt;br /&gt;
==== Option 2: MCR = 300 MHz, RF-ADC converter rate = 2.4 GHz ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-1700-1800_300e6_2400e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This option is better, the spectrum of interest is well within a Nyquist zone. Within the bandwidth of interest falls one of the ADC offset spurs. If the input signal is relatively strong, the impact from this small spur is negligible. If on the other hand the input signal strength is on the low end (for the X440), then maybe a different MCR should be considered.&lt;br /&gt;
&lt;br /&gt;
==== Option 3: MCR = 320 MHz, RF-ADC converter rate = 2.56 GHz ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-1700-1800_320e6_2560e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This option avoids a potential impact of an ADC offset spur in the observed spectrum. The only drawback to option 2 is the slightly higher data rate during host post-processing.&lt;br /&gt;
&lt;br /&gt;
=== Spectrum Capture between 500 MHz and 1.5 GHz. ===&lt;br /&gt;
The USRP X440 ships with multiple [https://uhd.readthedocs.io/en/latest/page_usrp_x4xx.html#x4xx_updating_fpga_types FPGA image flavors]. These either support 400 MHz or 1600 MHz RF bandwidth per channel. To address this use case, users have the option of using a bit file with 1600 MHz RF bandwidth to capture a contiguous spectrum, or use a 400 MHz bit file and create a stitched spectrum during host side post-processing. &lt;br /&gt;
==== Using 1600 MHz image ====&lt;br /&gt;
* Min Bandwidth: 1000 MHz&lt;br /&gt;
* Minimum IQ Rate: 1250 MSps&lt;br /&gt;
===== Option 1: MCR = 1280 MHz, RF-ADC converter rate = 2.56 GHz =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_1250e6_2560e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
Bad option, because desired spectrum spans multiple Nyquist zones.&lt;br /&gt;
&lt;br /&gt;
===== Option 2: MCR = 1600 MHz, RF-ADC converter rate = 3.2 GHz =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_1600e6_3200e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This is not the best option because our spectrum of interest is very close to a Nyquist zone boundary.&lt;br /&gt;
&lt;br /&gt;
===== Option 3: MCR = 1689.6 MHz, RF-ADC converter rate = 3.3792 GHz =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_1689e6_3379e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This option would work. If the input signal strength is low, using an even higher MCR would reduce the number of potential ADC offset spurs. This needs to be traded off against a higher data rate during host post-processing.&lt;br /&gt;
&lt;br /&gt;
==== Using 400 MHz image ====&lt;br /&gt;
Due to the smaller bandwidth addressing the use case will require the use of multiple channels. The captured spectra than needs to be stitched (combined) together.&lt;br /&gt;
* Max Bandwidth: 400 MHz&lt;br /&gt;
===== Option 1: MCR 400 MHz, RF-ADC converter rate = 3.2 GHz, 3 channels =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_400e6_3200e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This is not the best option because our spectrum of interest boundary is very close to a Nyquist zone boundary.&lt;br /&gt;
&lt;br /&gt;
===== Option 2: MCR 450 MHz, RF-ADC converter rate = 3.6 GHz, 3 channels =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_450e6_3600e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This option would work. Since the spectrum of interest is larger than the per channel bandwidth the captured spectrum may contain potential ADC offset spurs. For the spectrum of interest the 3 channels would nicely use tune frequencies (680, 1000, 1320 MHz) that do not match ADC offset spur frequencies.&lt;br /&gt;
&lt;br /&gt;
===== Option 3: MCR 512 MHz, RF-ADC converter rate = 4.096 GHz, 3 channels =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:ANxxx-500-1500_512e6_4096e6.jpg|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
This option would work as well. Like in option 2, the spectrum of interest may contain one potential ADC offset spur (compared to 2 in option 2). The drawback to option 2 is of course again the higher data rate during host post-processing that may be offset by only having to stitch less spectra (2 vs 3) together.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Scan Spectrum that spans multiple Nyquist Zones ==&lt;br /&gt;
&lt;br /&gt;
=== Tradeoffs: spectrum hole vs. use multiple mcrs/devices ===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scan Spectrum with dual master clock rate ==&lt;br /&gt;
=== Spectrum capture between 1.0 and 2.4 GHz (L-band) ===&lt;br /&gt;
* Combination of two RF-ADC converter rates: 4096 MHz and 2560 MHz&lt;br /&gt;
* Derived master clock rates: 1024 MHz (resampling factor 4) and 1280 MHz (resampling factor 2). The resampling factors are chosen to produce master clock rates which allow capturing a sufficient bandwidth to not have any gaps.&lt;br /&gt;
* Center frequencies: 1.23 GHz and 2.0 GHz respectively&lt;br /&gt;
* 1600 MHz FPGA image required due to the bandwidth requirements&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; border-style: none; background-color:#ffffff;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style: none;&amp;quot; | [[File:AN055-L-band-dual-rate.jpg|800px|center]]&lt;br /&gt;
|}&lt;br /&gt;
In the picture you can see a light-green band between 1.0 GHz and 2.4 GHz which can be covered using two different rates: Radio0 operates at MCR=1024 MHz in its first Nyquist zone and radio1 operates at 1280 MHz in its second Nyquist zone. The coverage is shown as light-blue boxes in both frequency charts. Starting with UHD 4.6, the X440_L_band_capture.py example demonstrates this use case and by default uses center frequencies of 0.9 GHz and 2 GHz respectively. These were choosen to conveniently display the two individual spectra next to each other in a continuous spectra view without any overlap. Practical applications on the other hand need to take into account that the well usable bandwidth of each channel is only about 0.8 * MCR. For the chosen MCRs this means that the first radio has a usable bandwidth of 819.2 MHz and the second one of 1024 MHz. Taking into account that a typical RF passband in the first Nyquist zone has a passband of up to 0.4 * F&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt; and the need for some overlap of the two spectra, the center frequency of radio0 should be set to 1.230 GHz (usable bandwidth spans from ~820 MHz to ~1640 MHz). Radio1 will be used in its second Nyquist zone, so the center frequency should be 2.0 GHz (usable bandwidth from ~1.5 GHz to ~2.5 GHz). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;appendix&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Appendix =&lt;br /&gt;
&amp;lt;span id=&amp;quot;x440-mcrs&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== X440 Supported Master Clock Rates (MCR) ==&lt;br /&gt;
Note: The selected FPGA bitfile may further limit the maximum supported master clock rate.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; margin:auto&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! MCR (MHz) !! RFDC Converter Rate (GHz)&lt;br /&gt;
|-&lt;br /&gt;
| 125.0 || 1.0&lt;br /&gt;
|-&lt;br /&gt;
| 128.0 || 1.024&lt;br /&gt;
|-&lt;br /&gt;
| 133.12 || 1.06496&lt;br /&gt;
|-&lt;br /&gt;
| 150.0 || 1.2&lt;br /&gt;
|-&lt;br /&gt;
| 153.6 || 1.2288&lt;br /&gt;
|-&lt;br /&gt;
| 160.0 || 1.28&lt;br /&gt;
|-&lt;br /&gt;
| 163.84 || 1.31072&lt;br /&gt;
|-&lt;br /&gt;
| 184.32 || 1.47456&lt;br /&gt;
|-&lt;br /&gt;
| 199.68 || 1.59744&lt;br /&gt;
|-&lt;br /&gt;
| 200.0 || 1.6&lt;br /&gt;
|-&lt;br /&gt;
| 204.8 || 1.6384&lt;br /&gt;
|-&lt;br /&gt;
| 240.0 || 1.92&lt;br /&gt;
|-&lt;br /&gt;
| 245.76 || 1.96608&lt;br /&gt;
|-&lt;br /&gt;
| 250.0 || 2.0, 1.0&lt;br /&gt;
|-&lt;br /&gt;
| 256.0 || 2.048, 1.024&lt;br /&gt;
|-&lt;br /&gt;
| 266.24 || 2.12992, 1.06496&lt;br /&gt;
|-&lt;br /&gt;
| 300.0 || 2.4, 1.2&lt;br /&gt;
|-&lt;br /&gt;
| 307.2 || 2.4576, 1.2288&lt;br /&gt;
|-&lt;br /&gt;
| 320.0 || 2.56, 1.28&lt;br /&gt;
|-&lt;br /&gt;
| 327.68 || 2.62144, 1.31072&lt;br /&gt;
|-&lt;br /&gt;
| 360.0 || 2.88, 1.44&lt;br /&gt;
|-&lt;br /&gt;
| 368.64 || 1.47456, 2.94912&lt;br /&gt;
|-&lt;br /&gt;
| 375.0 || 3.0, 1.5&lt;br /&gt;
|-&lt;br /&gt;
| 384.0 || 1.536, 3.072&lt;br /&gt;
|-&lt;br /&gt;
| 399.36 || 3.19488, 1.59744&lt;br /&gt;
|-&lt;br /&gt;
| 400.0 || 3.2, 1.6&lt;br /&gt;
|-&lt;br /&gt;
| 409.6 || 3.2768, 1.6384&lt;br /&gt;
|-&lt;br /&gt;
| 450.0 || 1.8, 3.6&lt;br /&gt;
|-&lt;br /&gt;
| 460.8 || 1.8432, 3.6864&lt;br /&gt;
|-&lt;br /&gt;
| 480.0 || 3.84, 1.92&lt;br /&gt;
|-&lt;br /&gt;
| 491.52 || 3.93216, 1.96608&lt;br /&gt;
|-&lt;br /&gt;
| 500.0 || 4.0, 2.0, 1.0&lt;br /&gt;
|-&lt;br /&gt;
| 512.0 || 1.024, 2.048, 4.096&lt;br /&gt;
|-&lt;br /&gt;
| 532.48 || 1.06496, 2.12992&lt;br /&gt;
|-&lt;br /&gt;
| 552.96 || 2.21184, 1.10592&lt;br /&gt;
|-&lt;br /&gt;
| 599.04 || 1.19808, 2.39616&lt;br /&gt;
|-&lt;br /&gt;
| 600.0 || 1.2, 2.4&lt;br /&gt;
|-&lt;br /&gt;
| 614.4 || 1.2288, 2.4576&lt;br /&gt;
|-&lt;br /&gt;
| 625.0 || 1.25, 2.5&lt;br /&gt;
|-&lt;br /&gt;
| 640.0 || 2.56, 1.28&lt;br /&gt;
|-&lt;br /&gt;
| 655.36 || 1.31072, 2.62144&lt;br /&gt;
|-&lt;br /&gt;
| 665.6 || 1.3312, 2.6624&lt;br /&gt;
|-&lt;br /&gt;
| 720.0 || 1.44, 2.88&lt;br /&gt;
|-&lt;br /&gt;
| 737.28 || 1.47456, 2.94912&lt;br /&gt;
|-&lt;br /&gt;
| 750.0 || 1.5, 3.0&lt;br /&gt;
|-&lt;br /&gt;
| 768.0 || 1.536, 3.072&lt;br /&gt;
|-&lt;br /&gt;
| 798.72 || 3.19488, 1.59744&lt;br /&gt;
|-&lt;br /&gt;
| 800.0 || 1.6, 3.2&lt;br /&gt;
|-&lt;br /&gt;
| 819.2 || 3.2768, 1.6384&lt;br /&gt;
|-&lt;br /&gt;
| 840.0 || 1.68, 3.36&lt;br /&gt;
|-&lt;br /&gt;
| 860.16 || 3.44064, 1.72032&lt;br /&gt;
|-&lt;br /&gt;
| 875.0 || 3.5, 1.75&lt;br /&gt;
|-&lt;br /&gt;
| 896.0 || 3.584, 1.792&lt;br /&gt;
|-&lt;br /&gt;
| 900.0 || 1.8, 3.6&lt;br /&gt;
|-&lt;br /&gt;
| 921.6 || 1.8432, 3.6864&lt;br /&gt;
|-&lt;br /&gt;
| 931.84 || 1.86368, 3.72736&lt;br /&gt;
|-&lt;br /&gt;
| 960.0 || 3.84, 1.92&lt;br /&gt;
|-&lt;br /&gt;
| 983.04 || 1.96608, 3.93216&lt;br /&gt;
|-&lt;br /&gt;
| 998.4 || 3.9936, 1.9968&lt;br /&gt;
|-&lt;br /&gt;
| 1000.0 || 4.0, 2.0&lt;br /&gt;
|-&lt;br /&gt;
| 1024.0 || 4.096, 2.048&lt;br /&gt;
|-&lt;br /&gt;
| 1050.0 || 2.1&lt;br /&gt;
|-&lt;br /&gt;
| 1064.96 || 2.12992&lt;br /&gt;
|-&lt;br /&gt;
| 1075.2 || 2.1504&lt;br /&gt;
|-&lt;br /&gt;
| 1080.0 || 2.16&lt;br /&gt;
|-&lt;br /&gt;
| 1105.92 || 2.21184&lt;br /&gt;
|-&lt;br /&gt;
| 1120.0 || 2.24&lt;br /&gt;
|-&lt;br /&gt;
| 1125.0 || 2.25&lt;br /&gt;
|-&lt;br /&gt;
| 1146.88 || 2.29376&lt;br /&gt;
|-&lt;br /&gt;
| 1152.0 || 2.304&lt;br /&gt;
|-&lt;br /&gt;
| 1198.08 || 2.39616&lt;br /&gt;
|-&lt;br /&gt;
| 1200.0 || 2.4&lt;br /&gt;
|-&lt;br /&gt;
| 1228.8 || 2.4576&lt;br /&gt;
|-&lt;br /&gt;
| 1280.0 || 2.56&lt;br /&gt;
|-&lt;br /&gt;
| 1290.24 || 2.58048&lt;br /&gt;
|-&lt;br /&gt;
| 1310.72 || 2.62144&lt;br /&gt;
|-&lt;br /&gt;
| 1331.2 || 2.6624&lt;br /&gt;
|-&lt;br /&gt;
| 1350.0 || 2.7&lt;br /&gt;
|-&lt;br /&gt;
| 1382.4 || 2.7648&lt;br /&gt;
|-&lt;br /&gt;
| 1397.76 || 2.79552&lt;br /&gt;
|-&lt;br /&gt;
| 1400.0 || 2.8&lt;br /&gt;
|-&lt;br /&gt;
| 1433.6 || 2.8672&lt;br /&gt;
|-&lt;br /&gt;
| 1440.0 || 2.88&lt;br /&gt;
|-&lt;br /&gt;
| 1474.56 || 2.94912&lt;br /&gt;
|-&lt;br /&gt;
| 1500.0 || 3.0&lt;br /&gt;
|-&lt;br /&gt;
| 1536.0 || 3.072&lt;br /&gt;
|-&lt;br /&gt;
| 1600.0 || 3.2&lt;br /&gt;
|-&lt;br /&gt;
| 1625.0 || 3.25&lt;br /&gt;
|-&lt;br /&gt;
| 1638.4 || 3.2768&lt;br /&gt;
|-&lt;br /&gt;
| 1650.0 || 3.3&lt;br /&gt;
|-&lt;br /&gt;
| 1658.88 || 3.31776&lt;br /&gt;
|-&lt;br /&gt;
| 1664.0 || 3.328&lt;br /&gt;
|-&lt;br /&gt;
| 1680.0 || 3.36&lt;br /&gt;
|-&lt;br /&gt;
| 1689.6 || 3.3792&lt;br /&gt;
|-&lt;br /&gt;
| 1720.32 || 3.44064&lt;br /&gt;
|-&lt;br /&gt;
| 1730.56 || 3.46112&lt;br /&gt;
|-&lt;br /&gt;
| 1750.0 || 3.5&lt;br /&gt;
|-&lt;br /&gt;
| 1760.0 || 3.52&lt;br /&gt;
|-&lt;br /&gt;
| 1792.0 || 3.584&lt;br /&gt;
|-&lt;br /&gt;
| 1797.12 || 3.59424&lt;br /&gt;
|-&lt;br /&gt;
| 1800.0 || 3.6&lt;br /&gt;
|-&lt;br /&gt;
| 1802.24 || 3.60448&lt;br /&gt;
|-&lt;br /&gt;
| 1843.2 || 3.6864&lt;br /&gt;
|-&lt;br /&gt;
| 1863.68 || 3.72736&lt;br /&gt;
|-&lt;br /&gt;
| 1875.0 || 3.75&lt;br /&gt;
|-&lt;br /&gt;
| 1920.0 || 3.84&lt;br /&gt;
|-&lt;br /&gt;
| 1950.0 || 3.9&lt;br /&gt;
|-&lt;br /&gt;
| 1966.08 || 3.93216&lt;br /&gt;
|-&lt;br /&gt;
| 1996.8 || 3.9936&lt;br /&gt;
|-&lt;br /&gt;
| 2000.0 || 4.0&lt;br /&gt;
|-&lt;br /&gt;
| 2027.52 || 4.05504&lt;br /&gt;
|-&lt;br /&gt;
| 2048.0 || 4.096&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;X440-supported-dual-rates&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== X440 Supported Master Clock Rate combinations (Dual Rate) ==&lt;br /&gt;
&amp;lt;b&amp;gt;Important:&amp;lt;/b&amp;gt; For the best RF performance it is required to configure the master clock rate that is connected to the higher RF-ADC/DAC converter rate on the first radio and the MCR connected to the lower converter rate second. Not all master clock rate combinations listed in this table will comply to this requirement by themselves. Specifying the converter_rate argument or swapping the master clock rates will help resolving issues. The selected FPGA bitfile may further limit the maximum supported master clock rate.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; margin:auto&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| MCR0 (MHz) || MCR1 (MHz)&lt;br /&gt;
|-&lt;br /&gt;
| 125.0 || 250.0, 375.0, 500.0, 750.0, 875.0, 1000.0, 1125.0, 1625.0, 1750.0, 1875.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 128.0 || 384.0, 512.0, 768.0, 1152.0&lt;br /&gt;
|-&lt;br /&gt;
| 133.12 || 266.24, 399.36, 532.48, 665.6, 798.72, 931.84, 1064.96, 1198.08, 1331.2, 1730.56, 1863.68, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 150.0 || 300.0, 450.0, 600.0, 750.0, 900.0, 1050.0, 1350.0, 1500.0, 1650.0, 1800.0, 1950.0&lt;br /&gt;
|-&lt;br /&gt;
| 153.6 || 307.2, 614.4, 1228.8&lt;br /&gt;
|-&lt;br /&gt;
| 160.0 || 320.0, 640.0, 800.0, 1120.0, 1280.0, 1600.0, 1760.0&lt;br /&gt;
|-&lt;br /&gt;
| 163.84 || 327.68, 655.36, 1146.88, 1310.72, 1474.56, 1802.24&lt;br /&gt;
|-&lt;br /&gt;
| 184.32 || 368.64, 552.96, 737.28, 1105.92, 1290.24, 1474.56, 1658.88, 1843.2, 2027.52&lt;br /&gt;
|-&lt;br /&gt;
| 199.68 || 399.36, 599.04, 798.72, 998.4, 1198.08, 1397.76, 1797.12, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 200.0 || 400.0, 800.0, 1200.0, 1400.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 204.8 || 409.6, 819.2, 1433.6, 1638.4&lt;br /&gt;
|-&lt;br /&gt;
| 240.0 || 360.0, 480.0, 600.0, 720.0, 840.0, 960.0, 1440.0, 1680.0, 1800.0, 1920.0&lt;br /&gt;
|-&lt;br /&gt;
| 245.76 || 491.52, 860.16, 983.04, 1720.32, 1966.08&lt;br /&gt;
|-&lt;br /&gt;
| 250.0 || 125.0, 375.0, 500.0, 750.0, 875.0, 1000.0, 1500.0, 1625.0, 1750.0, 1875.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 256.0 || 640.0, 896.0, 1024.0, 1280.0, 1664.0, 1792.0, 2048.0&lt;br /&gt;
|-&lt;br /&gt;
| 266.24 || 133.12, 399.36, 532.48, 665.6, 798.72, 931.84, 1064.96, 1331.2, 1730.56, 1863.68, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 300.0 || 150.0, 450.0, 600.0, 750.0, 900.0, 1050.0, 1500.0, 1650.0, 1800.0, 1950.0&lt;br /&gt;
|-&lt;br /&gt;
| 307.2 || 153.6, 614.4, 1228.8&lt;br /&gt;
|-&lt;br /&gt;
| 320.0 || 160.0, 640.0, 800.0, 1120.0, 1280.0, 1600.0, 1760.0&lt;br /&gt;
|-&lt;br /&gt;
| 327.68 || 163.84, 655.36, 1146.88, 1310.72, 1802.24&lt;br /&gt;
|-&lt;br /&gt;
| 360.0 || 240.0, 600.0, 720.0, 1080.0, 1800.0&lt;br /&gt;
|-&lt;br /&gt;
| 368.64 || 184.32, 552.96, 737.28, 1105.92, 1290.24, 1474.56, 1658.88, 1843.2, 2027.52&lt;br /&gt;
|-&lt;br /&gt;
| 375.0 || 125.0, 250.0, 750.0, 1125.0, 1500.0, 1875.0&lt;br /&gt;
|-&lt;br /&gt;
| 384.0 || 128.0, 768.0, 1152.0, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 399.36 || 133.12, 199.68, 266.24, 599.04, 665.6, 798.72, 998.4, 1198.08, 1331.2, 1397.76, 1797.12, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 400.0 || 200.0, 800.0, 1200.0, 1400.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 409.6 || 204.8, 819.2, 1433.6, 1638.4&lt;br /&gt;
|-&lt;br /&gt;
| 450.0 || 150.0, 300.0, 600.0, 750.0, 900.0, 1350.0, 1500.0, 1800.0&lt;br /&gt;
|-&lt;br /&gt;
| 460.8 || 768.0, 921.6, 1075.2, 1382.4, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 480.0 || 240.0, 720.0, 840.0, 960.0, 1440.0, 1680.0, 1920.0&lt;br /&gt;
|-&lt;br /&gt;
| 491.52 || 245.76, 860.16, 983.04, 1720.32, 1966.08&lt;br /&gt;
|-&lt;br /&gt;
| 500.0 || 125.0, 250.0, 750.0, 875.0, 1000.0, 1500.0, 1750.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 512.0 || 128.0, 768.0, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 532.48 || 133.12, 266.24, 798.72, 931.84, 1064.96, 1331.2, 1863.68&lt;br /&gt;
|-&lt;br /&gt;
| 552.96 || 184.32, 368.64, 737.28, 1105.92, 1290.24, 1474.56, 1658.88, 1843.2&lt;br /&gt;
|-&lt;br /&gt;
| 599.04 || 199.68, 399.36, 798.72, 998.4, 1198.08, 1397.76, 1797.12, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 600.0 || 150.0, 240.0, 300.0, 360.0, 450.0, 720.0, 900.0, 1000.0, 1050.0, 1500.0, 1800.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 614.4 || 153.6, 307.2, 1228.8&lt;br /&gt;
|-&lt;br /&gt;
| 640.0 || 160.0, 256.0, 320.0, 800.0, 1120.0, 1280.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 655.36 || 163.84, 327.68, 1146.88, 1310.72&lt;br /&gt;
|-&lt;br /&gt;
| 665.6 || 133.12, 266.24, 399.36, 798.72, 1331.2, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 720.0 || 240.0, 360.0, 480.0, 600.0, 960.0, 1440.0, 1680.0, 1800.0, 1920.0&lt;br /&gt;
|-&lt;br /&gt;
| 737.28 || 184.32, 368.64, 552.96, 1105.92, 1290.24, 1474.56, 1843.2&lt;br /&gt;
|-&lt;br /&gt;
| 750.0 || 125.0, 150.0, 250.0, 300.0, 375.0, 450.0, 500.0, 900.0, 1000.0, 1125.0, 1500.0, 1750.0, 1875.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 768.0 || 128.0, 384.0, 460.8, 512.0, 921.6, 1152.0, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 798.72 || 133.12, 199.68, 266.24, 399.36, 532.48, 599.04, 665.6, 998.4, 1064.96, 1198.08, 1331.2, 1397.76, 1863.68, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 800.0 || 160.0, 200.0, 320.0, 400.0, 640.0, 1200.0, 1400.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 819.2 || 204.8, 409.6, 1433.6, 1638.4&lt;br /&gt;
|-&lt;br /&gt;
| 840.0 || 240.0, 480.0, 1680.0&lt;br /&gt;
|-&lt;br /&gt;
| 860.16 || 245.76, 491.52, 1720.32&lt;br /&gt;
|-&lt;br /&gt;
| 875.0 || 125.0, 250.0, 500.0, 1750.0&lt;br /&gt;
|-&lt;br /&gt;
| 896.0 || 256.0, 1792.0&lt;br /&gt;
|-&lt;br /&gt;
| 900.0 || 150.0, 300.0, 450.0, 600.0, 750.0, 1500.0, 1800.0&lt;br /&gt;
|-&lt;br /&gt;
| 921.6 || 460.8, 768.0, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 931.84 || 133.12, 266.24, 532.48, 1863.68&lt;br /&gt;
|-&lt;br /&gt;
| 960.0 || 240.0, 480.0, 720.0, 1440.0, 1920.0&lt;br /&gt;
|-&lt;br /&gt;
| 983.04 || 245.76, 491.52, 1966.08&lt;br /&gt;
|-&lt;br /&gt;
| 998.4 || 199.68, 399.36, 599.04, 798.72, 1198.08, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 1000.0 || 125.0, 250.0, 500.0, 600.0, 750.0, 1500.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 1024.0 || 256.0, 1280.0, 2048.0&lt;br /&gt;
|-&lt;br /&gt;
| 1050.0 || 150.0, 300.0, 600.0&lt;br /&gt;
|-&lt;br /&gt;
| 1064.96 || 133.12, 266.24, 532.48, 798.72, 1331.2&lt;br /&gt;
|-&lt;br /&gt;
| 1075.2 || 460.8&lt;br /&gt;
|-&lt;br /&gt;
| 1080.0 || 360.0&lt;br /&gt;
|-&lt;br /&gt;
| 1105.92 || 184.32, 368.64, 552.96, 737.28, 1474.56, 1658.88, 1843.2&lt;br /&gt;
|-&lt;br /&gt;
| 1120.0 || 160.0, 320.0, 640.0&lt;br /&gt;
|-&lt;br /&gt;
| 1125.0 || 125.0, 375.0, 750.0, 1500.0, 1875.0&lt;br /&gt;
|-&lt;br /&gt;
| 1146.88 || 163.84, 327.68, 655.36&lt;br /&gt;
|-&lt;br /&gt;
| 1152.0 || 128.0, 384.0, 768.0, 1536.0&lt;br /&gt;
|-&lt;br /&gt;
| 1198.08 || 133.12, 199.68, 399.36, 599.04, 798.72, 998.4, 1797.12, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 1200.0 || 200.0, 400.0, 800.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 1228.8 || 153.6, 307.2, 614.4&lt;br /&gt;
|-&lt;br /&gt;
| 1280.0 || 160.0, 256.0, 320.0, 640.0, 1024.0, 1600.0&lt;br /&gt;
|-&lt;br /&gt;
| 1290.24 || 184.32, 368.64, 552.96, 737.28&lt;br /&gt;
|-&lt;br /&gt;
| 1310.72 || 163.84, 327.68, 655.36&lt;br /&gt;
|-&lt;br /&gt;
| 1331.2 || 133.12, 266.24, 399.36, 532.48, 665.6, 798.72, 1064.96, 1996.8&lt;br /&gt;
|-&lt;br /&gt;
| 1350.0 || 150.0, 450.0&lt;br /&gt;
|-&lt;br /&gt;
| 1382.4 || 460.8&lt;br /&gt;
|-&lt;br /&gt;
| 1397.76 || 199.68, 399.36, 599.04, 798.72&lt;br /&gt;
|-&lt;br /&gt;
| 1400.0 || 200.0, 400.0, 800.0&lt;br /&gt;
|-&lt;br /&gt;
| 1433.6 || 204.8, 409.6, 819.2&lt;br /&gt;
|-&lt;br /&gt;
| 1440.0 || 240.0, 480.0, 720.0, 960.0, 1920.0&lt;br /&gt;
|-&lt;br /&gt;
| 1474.56 || 163.84, 184.32, 368.64, 552.96, 737.28, 1105.92&lt;br /&gt;
|-&lt;br /&gt;
| 1500.0 || 150.0, 250.0, 300.0, 375.0, 450.0, 500.0, 600.0, 750.0, 900.0, 1000.0, 1125.0, 2000.0&lt;br /&gt;
|-&lt;br /&gt;
| 1536.0 || 384.0, 460.8, 512.0, 768.0, 921.6, 1152.0&lt;br /&gt;
|-&lt;br /&gt;
| 1600.0 || 160.0, 200.0, 320.0, 400.0, 640.0, 800.0, 1200.0, 1280.0&lt;br /&gt;
|-&lt;br /&gt;
| 1625.0 || 125.0, 250.0&lt;br /&gt;
|-&lt;br /&gt;
| 1638.4 || 204.8, 409.6, 819.2&lt;br /&gt;
|-&lt;br /&gt;
| 1650.0 || 150.0, 300.0&lt;br /&gt;
|-&lt;br /&gt;
| 1658.88 || 184.32, 368.64, 552.96, 1105.92&lt;br /&gt;
|-&lt;br /&gt;
| 1664.0 || 256.0&lt;br /&gt;
|-&lt;br /&gt;
| 1680.0 || 240.0, 480.0, 720.0, 840.0&lt;br /&gt;
|-&lt;br /&gt;
| 1720.32 || 245.76, 491.52, 860.16&lt;br /&gt;
|-&lt;br /&gt;
| 1730.56 || 133.12, 266.24&lt;br /&gt;
|-&lt;br /&gt;
| 1750.0 || 125.0, 250.0, 500.0, 750.0, 875.0&lt;br /&gt;
|-&lt;br /&gt;
| 1760.0 || 160.0, 320.0&lt;br /&gt;
|-&lt;br /&gt;
| 1792.0 || 256.0, 896.0&lt;br /&gt;
|-&lt;br /&gt;
| 1797.12 || 199.68, 399.36, 599.04, 1198.08&lt;br /&gt;
|-&lt;br /&gt;
| 1800.0 || 150.0, 240.0, 300.0, 360.0, 450.0, 600.0, 720.0, 900.0&lt;br /&gt;
|-&lt;br /&gt;
| 1802.24 || 163.84, 327.68&lt;br /&gt;
|-&lt;br /&gt;
| 1843.2 || 184.32, 368.64, 552.96, 737.28, 1105.92&lt;br /&gt;
|-&lt;br /&gt;
| 1863.68 || 133.12, 266.24, 532.48, 798.72, 931.84&lt;br /&gt;
|-&lt;br /&gt;
| 1875.0 || 125.0, 250.0, 375.0, 750.0, 1125.0&lt;br /&gt;
|-&lt;br /&gt;
| 1920.0 || 240.0, 480.0, 720.0, 960.0, 1440.0&lt;br /&gt;
|-&lt;br /&gt;
| 1950.0 || 150.0, 300.0&lt;br /&gt;
|-&lt;br /&gt;
| 1966.08 || 245.76, 491.52, 983.04&lt;br /&gt;
|-&lt;br /&gt;
| 1996.8 || 133.12, 199.68, 266.24, 399.36, 599.04, 665.6, 798.72, 998.4, 1198.08, 1331.2&lt;br /&gt;
|-&lt;br /&gt;
| 2000.0 || 125.0, 250.0, 500.0, 600.0, 750.0, 1000.0, 1500.0&lt;br /&gt;
|-&lt;br /&gt;
| 2027.52 || 184.32, 368.64&lt;br /&gt;
|-&lt;br /&gt;
| 2048.0 || 256.0, 1024.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;references&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== References and Related Documentation ==&lt;br /&gt;
* [https://www.ni.com/en/solutions/aerospace-defense/radar-electronic-warfare-sigint/advantages-of-direct-rf-sampling-architectures.html Advantages of Direct RF Sampling Architectures]&lt;br /&gt;
* [https://docs.xilinx.com/r/en-US/pg269-rf-data-converter Zynq UltraScale+ RFSoC RF Data Converter v2.6 Gen 1/2/3/DFE LogiCORE IP Product Guide (PG269)]&lt;br /&gt;
* [https://events.gnuradio.org/event/21/contributions/392/attachments/123/285/Lo%20and%20behold,%20no%20LO.pdf GRcon 23 - Lo and behold, no LO!]&lt;br /&gt;
* [https://docs.xilinx.com/r/en-US/ds926-zynq-ultrascale-plus-rfsoc/RF-ADC-Electrical-Characteristics Zynq UltraScale+ RFSoC Data Sheet: DC and AC Switching Characteristics (DS926)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Footnotes =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>MartinAnderseck</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:ANxxx-X440_signal_path.jpg&amp;diff=5899</id>
		<title>File:ANxxx-X440 signal path.jpg</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:ANxxx-X440_signal_path.jpg&amp;diff=5899"/>
				<updated>2023-11-18T08:43:54Z</updated>
		
		<summary type="html">&lt;p&gt;MartinAnderseck: MartinAnderseck uploaded a new version of File:ANxxx-X440 signal path.jpg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>MartinAnderseck</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:AN055-L-band-dual-rate.jpg&amp;diff=5892</id>
		<title>File:AN055-L-band-dual-rate.jpg</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:AN055-L-band-dual-rate.jpg&amp;diff=5892"/>
				<updated>2023-11-16T12:25:04Z</updated>
		
		<summary type="html">&lt;p&gt;MartinAnderseck: Graph that shows how the L-band spectrum can be captured by using two different master clock rates (and with this two ADC/DAC converter rates) on a USRP X440.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Graph that shows how the L-band spectrum can be captured by using two different master clock rates (and with this two ADC/DAC converter rates) on a USRP X440.&lt;/div&gt;</summary>
		<author><name>MartinAnderseck</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP_N300/N310/N320/N321_Getting_Started_Guide&amp;diff=5292</id>
		<title>USRP N300/N310/N320/N321 Getting Started Guide</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=USRP_N300/N310/N320/N321_Getting_Started_Guide&amp;diff=5292"/>
				<updated>2022-03-14T07:12:17Z</updated>
		
		<summary type="html">&lt;p&gt;MartinAnderseck: Updated the Mender image update procedure.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Kit Contents==&lt;br /&gt;
===N300===&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* USRP N300&lt;br /&gt;
* DC Power Supply (12V, 7A)&lt;br /&gt;
* 1 RJ45 – SFP+ Adapter&lt;br /&gt;
* 1 Gigabit Ethernet Cat-5e Cable (3m)&lt;br /&gt;
* USB-A to Micro USB-B Cable (1m)&lt;br /&gt;
* Getting Started Guide&lt;br /&gt;
* Ettus Research Sticker&lt;br /&gt;
||[[File:n300 kit.png|450px|center]]&lt;br /&gt;
|}&lt;br /&gt;
===N310===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* USRP N310&lt;br /&gt;
* DC Power Supply (12V, 7A)&lt;br /&gt;
* 1 RJ45 – SFP+ Adapter&lt;br /&gt;
* 1 Gigabit Ethernet Cat-5e Cable (3m)&lt;br /&gt;
* USB-A to Micro USB-B Cable (1m)&lt;br /&gt;
* Getting Started Guide&lt;br /&gt;
* Ettus Research Sticker&lt;br /&gt;
||[[File:n310 kit.png|500px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===N320===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* USRP N320&lt;br /&gt;
* DC Power Supply (12V, 7A)&lt;br /&gt;
* 1 RJ45 – SFP+ Adapter&lt;br /&gt;
* 1 Gigabit Ethernet Cat-5e Cable (3m)&lt;br /&gt;
* USB-A to Micro USB-B Cable (1m)&lt;br /&gt;
* Getting Started Guide&lt;br /&gt;
* Ettus Research Sticker&lt;br /&gt;
|[[File:n320 kit.png|500px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===N321===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* USRP N321&lt;br /&gt;
* DC Power Supply (12V, 7A)&lt;br /&gt;
* 1 RJ45 – SFP+ Adapter&lt;br /&gt;
* 1 Gigabit Ethernet Cat-5e Cable (3m)&lt;br /&gt;
* USB-A to Micro USB-B Cable (1m)&lt;br /&gt;
* Getting Started Guide&lt;br /&gt;
* Ettus Research Sticker&lt;br /&gt;
||[[File:n321 kit.png|500px|center]] &lt;br /&gt;
|}&lt;br /&gt;
==Verify the Contents of Your Kit==&lt;br /&gt;
Ensure that your kit contains all the items listed above. If any items are missing, please contact sales@ettus.com​ immediately.&lt;br /&gt;
&lt;br /&gt;
==You Will Need==&lt;br /&gt;
* microSD Card Writer&lt;br /&gt;
&lt;br /&gt;
* For Network Mode: A host computer with an available 1 or 10 Gigabit Ethernet interface for sample streaming. In addition to the Ethernet interface used for sampling streaming, your host computer will require a separate 1 Gigabit Ethernet interface for command and control streaming.&lt;br /&gt;
 &lt;br /&gt;
* For Stand-Alone Embedded Mode: A host computer with an available 1 Gigabit Ethernet port or a USB 2.0 port to remotely access the embedded Linux operating system running on ARM CPU.&lt;br /&gt;
&lt;br /&gt;
==Proper Care and Handling==&lt;br /&gt;
All Ettus Research products are individually tested before shipment. The USRP is guaranteed to be functional at the time it is received by the customer. Improper use or handling of the USRP can cause the device to become non-functional. Take the following precautions to prevent damage to the unit.&lt;br /&gt;
&lt;br /&gt;
* Never allow metal objects to touch the circuit board while powered.&lt;br /&gt;
* Always properly terminate the transmit port with an antenna or 50Ω load.&lt;br /&gt;
* Always handle the board with proper anti-static methods.&lt;br /&gt;
* Never allow the board to directly or indirectly come into contact with any voltage spikes.&lt;br /&gt;
* Never allow any water or condensing moisture to come into contact with the device.&lt;br /&gt;
* Always use caution with FPGA, firmware, or software modifications.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Never apply more than -15 dBm of power into any RF input.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Always use at least 30dB attenuation if operating in loopback configuration&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Install and Setup the Software Tools on Your Host Computer==&lt;br /&gt;
In order to use your Universal Software Radio Peripheral (USRP™), you must have the software tools correctly installed and configured on your host computer. A step-by-step guide for doing this is available at the Building and Installing the USRP Open-Source Toolchain (UHD and GNU Radio) on [[Building and Installing the USRP Open-Source Toolchain (UHD and GNU Radio) on Linux|Linux]], [[Building and Installing the USRP Open-Source Toolchain (UHD and GNU Radio) on OS X|OS X]] and [[Building and Installing the USRP Open Source Toolchain (UHD and GNU Radio) on Windows|Windows]] Application Notes.&lt;br /&gt;
&lt;br /&gt;
To find the latest release of UHD, see the UHD repository at https://github.com/EttusResearch/uhd.&lt;br /&gt;
&lt;br /&gt;
The USRP N310 requires UHD version 3.11.0.0 or later. &lt;br /&gt;
&lt;br /&gt;
The USRP N300 requires UHD version 3.12.0.0 or later.&lt;br /&gt;
&lt;br /&gt;
The USRP N320/N321 requires UHD version 3.14.0.0 or later. &lt;br /&gt;
&lt;br /&gt;
White Rabbit Ethernet-Based Synchronization of the N3xx USRP requires UHD version 3.12.0.0 or later. For additional details on White Rabbit Ethernet-Based Synchronization, please see the application note, [[Using Ethernet-Based Synchronization on the USRP™ N3xx Devices]].&lt;br /&gt;
&lt;br /&gt;
'''When you receive a brand-new device, it is strongly recommended that you download the most recent filesystem image from the Ettus Research website and write it to the SD card that comes with the unit. It is not recommended that you use the SD card from the factory as-is. Instructions on downloading the latest filesystem image and writing it to the SD card are listed below.'''&lt;br /&gt;
&lt;br /&gt;
'''Note that if you are operating the device in Network Mode, the version of UHD running on the host computer and the USRP N3xx must match.'''&lt;br /&gt;
&lt;br /&gt;
==Connecting the Device==&lt;br /&gt;
===Interfaces Overview===&lt;br /&gt;
Listed below are the interfaces to connect to the USRP N3xx. Each interface has specific functionality, limitations and purpose. &lt;br /&gt;
&lt;br /&gt;
'''Serial Console'''&lt;br /&gt;
&lt;br /&gt;
The Serial Console provides a low level interface to the device typically used for debugging.&lt;br /&gt;
&lt;br /&gt;
'''1 Gigabit RJ45 Connection'''&lt;br /&gt;
&lt;br /&gt;
The 1 Gigabit RJ45 Connection interfaces with the on-board ARM CPU. When operated in &amp;quot;Network mode&amp;quot;, this interface can optionally be used for UHD management traffic. Regardless of the operation mode (Network vs Embedded) this interface can be used to connect to the ARM via SSH. By default, the 1Gb RJ45 connection is configured to use a DHCP assigned IP address.&lt;br /&gt;
&lt;br /&gt;
'''Dual SFP+ Connections'''&lt;br /&gt;
&lt;br /&gt;
The Dual SFP+ Connections support multiple configurations for streaming high-speed, low-latency data, depending upon the FPGA image which is loaded.&lt;br /&gt;
&lt;br /&gt;
'''QSFP+ Connection (N320/ N321 Only)'''&lt;br /&gt;
&lt;br /&gt;
The QSFP+ Connection supports 2 x 10Gb lanes for streaming high-speed, low-latency data, while the onboard SFP0 connection is used for White Rabbit Ethernet-Based Synchronization.&lt;br /&gt;
&lt;br /&gt;
===Setting up a Serial Console Connection===&lt;br /&gt;
It is possible to gain shell access to the device using a serial terminal emulator via the Serial Console port. Most Linux, OSX, or other Unix based operating systems have a tool called &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt; which can be used for this purpose. &lt;br /&gt;
&lt;br /&gt;
If you do not have &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt; installed, it can be installed via your package manager. For Ubuntu/Debian based operating systems it can be installed with &amp;lt;code&amp;gt;apt&amp;lt;/code&amp;gt; such as:&lt;br /&gt;
&lt;br /&gt;
    sudo apt install screen&lt;br /&gt;
&lt;br /&gt;
The default Baud Rate for the Serial Console is: &amp;lt;code&amp;gt;115200&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The exact device node you should attach to depends on your operating system's driver and other USB devices that might already be connected. Modern Linux systems offer alternatives to simply trying device nodes; instead, the OS might have a directory of symlinks under &amp;lt;code&amp;gt;/dev/serial/by-id&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    $ ls /dev/serial/by-id&lt;br /&gt;
    usb-Digilent_Digilent_USB_Device_25163511FE00-if00-port0&lt;br /&gt;
    usb-Digilent_Digilent_USB_Device_25163511FE00-if01-port0&lt;br /&gt;
    usb-Silicon_Labs_CP2105_Dual_USB_to_UART_Bridge_Controller_007F6CB5-if00-port0&lt;br /&gt;
    usb-Silicon_Labs_CP2105_Dual_USB_to_UART_Bridge_Controller_007F6CB5-if01-port0&lt;br /&gt;
&lt;br /&gt;
NOTE: Exact names depend on the host operating system version and may differ.&lt;br /&gt;
&lt;br /&gt;
Every N3XX series device connected to USB will by default show up as four different devices. The devices labeled &amp;lt;code&amp;gt;&amp;quot;USB_to_UART_Bridge_Controller&amp;quot;&amp;lt;/code&amp;gt; are the devices that offer a serial prompt. The first (with the &amp;lt;code&amp;gt;if00&amp;lt;/code&amp;gt; suffix) connects to the &amp;lt;code&amp;gt;ARM CPU&amp;lt;/code&amp;gt;, whereas the second connects to the &amp;lt;code&amp;gt;STM32 Microcontroller&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
If you have multiple N3xx Serial Consoles connected to a single host, you may have to empirically test nodes. &lt;br /&gt;
&lt;br /&gt;
Connecting to the ARM CPU can be performed with the command:&lt;br /&gt;
&lt;br /&gt;
    $ sudo screen /dev/serial/by-id/usb-Silicon_Labs_CP2105_Dual_USB_to_UART_Bridge_Controller_007F6CB5-if00-port0 115200&lt;br /&gt;
&lt;br /&gt;
Upon starting the USRP N3xx, boot messages will appear and rapidly update. Once the boot process successfully completes, a login prompt like the following should appear:&lt;br /&gt;
&lt;br /&gt;
    OpenEmbedded test ni-n3xx-313ABDA ttyPS0&lt;br /&gt;
    &lt;br /&gt;
    ni-n3xx-313ABDA login: &lt;br /&gt;
&lt;br /&gt;
Enter the username: ​&amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;​ &lt;br /&gt;
&lt;br /&gt;
By default, the &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; user's password is left blank. Press the &amp;lt;code&amp;gt;Enter&amp;lt;/code&amp;gt; key when prompted for a password.&lt;br /&gt;
&lt;br /&gt;
You should now be presented with a shell prompt similar to the following:&lt;br /&gt;
&lt;br /&gt;
    root@ni-n3xx-&amp;lt;motherboard serial #&amp;gt;:~#&lt;br /&gt;
&lt;br /&gt;
Using the default configuration, the serial console will show all kernel log messages (which are not available when using SSH), and give access to the boot loader (U-boot prompt). This can be used to debug kernel or boot-loader issues more efficiently than when logged in via SSH.&lt;br /&gt;
&lt;br /&gt;
====Connecting to the microcontroller====&lt;br /&gt;
&lt;br /&gt;
Using the Serial Console interface, it is possible to connect to the STM32 microcontroller with the command below. The STM32 controls the power sequencing and several other low level device operations.&lt;br /&gt;
&lt;br /&gt;
    $ sudo screen /dev/serial/by-id/usb-Silicon_Labs_CP2105_Dual_USB_to_UART_Bridge_Controller_007F6CB5-if01-port0 115200&lt;br /&gt;
&lt;br /&gt;
The STM32 interface provides a very simple prompt. The command &amp;lt;code&amp;gt;help&amp;lt;/code&amp;gt; will list all available commands. A direct connection to the microcontroller can be used to hard-reset the device without physically accessing it (i.e., emulating a power button press) and other low-level diagnostics.&lt;br /&gt;
&lt;br /&gt;
===Connecting to the ARM via SSH===&lt;br /&gt;
By default, the RJ45 1Gb management interface is configured to be assigned a DHCP IP address. &lt;br /&gt;
&lt;br /&gt;
If you have access to a network which provides a DHCP server (such as a common router's LAN), attach the RJ45 1Gb port to this network. Details vary by vendor, however, most router management interfaces will provide a list of attached devices to the LAN including their IP address.&lt;br /&gt;
&lt;br /&gt;
Without access to a router management interface, you can identify the IP address by connecting to the ARM CPU via Serial Console as detailed in the section above and running the command &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Example Output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ip a&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast qlen 1000&lt;br /&gt;
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 192.168.1.151/24 brd 192.168.1.255 scope global dynamic eth0&lt;br /&gt;
       valid_lft 42865sec preferred_lft 42865sec&lt;br /&gt;
3: sfp0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 9000 qdisc pfifo_fast qlen 1000&lt;br /&gt;
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 192.168.10.2/24 brd 192.168.10.255 scope global sfp0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
4: sfp1: &amp;lt;NO-CARRIER,BROADCAST,MULTICAST,UP&amp;gt; mtu 9000 qdisc pfifo_fast qlen 1000&lt;br /&gt;
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you do not have access to a network with a DHCP server, you can create one using the Linux utility &amp;lt;code&amp;gt;dnsmasq&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    $ sudo dnsmasq -i &amp;lt;ETHERNET_ADAPTER_NAME&amp;gt; --dhcp-range=192.168.1.151,192.168.1.254 --except-interface=lo --bind-dynamic --no-daemon&lt;br /&gt;
&lt;br /&gt;
NOTE: Modify the value &amp;lt;code&amp;gt;&amp;lt;ETHERNET_ADAPTER_NAME&amp;gt;&amp;lt;/code&amp;gt; to match the interface you would like to create a DHCP server on.&lt;br /&gt;
&lt;br /&gt;
After the device has obtained an IP address, you can remotely log into it from a Linux or macOS system with SSH, as shown below:&lt;br /&gt;
&lt;br /&gt;
    $ ssh root@192.168.1.151&lt;br /&gt;
&lt;br /&gt;
NOTE: The IP address may vary depending on your network setup.&lt;br /&gt;
&lt;br /&gt;
NOTE: The &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; password default password is empty/blank.&lt;br /&gt;
&lt;br /&gt;
On Microsoft Windows, the SSH connection can be established using the third-party program ​Putty​. &lt;br /&gt;
&lt;br /&gt;
After logging in, you should be presented with a shell like the following:&lt;br /&gt;
&lt;br /&gt;
    root@ni-n3xx-&amp;lt;motherboard serial #&amp;gt;:~#&lt;br /&gt;
&lt;br /&gt;
==Updating the Linux File System==&lt;br /&gt;
Before operating the device, it is​ ​strongly​ recommended to update to the latest version of the Embedded Linux file system. If you are operating the device in Network Mode, the version of UHD running on the host machine and N3xx USRP must match. &lt;br /&gt;
&lt;br /&gt;
There is two ways to update the file system for the N3xx USRP: &lt;br /&gt;
&lt;br /&gt;
1. Mender&lt;br /&gt;
&lt;br /&gt;
2. Physically remove microSD card from device and write a new file system to the microSD card. &lt;br /&gt;
&lt;br /&gt;
===File System Partition Layout===&lt;br /&gt;
The SD Card is divided into four partitions. There is two root file system partitions, a boot partition and a data partition. &lt;br /&gt;
&lt;br /&gt;
Any data you would like to preserve through Mender updates should be saved to the &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; partition, which is mounted at &amp;lt;code&amp;gt;/data&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Updating the file system with Mender===&lt;br /&gt;
Mender is third-party software that enables remote updating of the root file system without physically accessing the device (see also the Mender website https://mender.io). Mender can be executed locally on the device, or a Mender server can be set up which can be used to remotely update an arbitrary number of USRP devices. Users can host their own local Mender server, or use servers hosted by Mender as a paid service; contact Mender for more information. &lt;br /&gt;
&lt;br /&gt;
====Mender Update Process====&lt;br /&gt;
When updating the file system using Mender, the tool will overwrite the root file system partition that is not currently mounted. Any data stored in the root partitions will be permanently lost with a Mender update.&lt;br /&gt;
&lt;br /&gt;
After updating a partition with Mender, it will reboot into the newly updated partition. Only if the update is confirmed by the user, the update will be made permanent. This means that if an update fails, the device will be always able to reboot into the partition from which the update was originally launched, which presumably is in a working state. Another update can be launched now to correct the previous, failed update, until it works.&lt;br /&gt;
&lt;br /&gt;
To obtain the file system Mender image (these are files with a &amp;lt;code&amp;gt;.mender&amp;lt;/code&amp;gt; suffix), run the following command on the host computer with Internet access:&lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader -t mender -t n3xx --yes&lt;br /&gt;
&lt;br /&gt;
Example Output:    &lt;br /&gt;
    [INFO] Images destination: /usr/local/share/uhd/images&lt;br /&gt;
    451639 kB / 451639 kB (100%) n3xx_common_mender_default-v3.14.0.0.zip&lt;br /&gt;
    [INFO] Images download complete.&lt;br /&gt;
&lt;br /&gt;
NOTE: In the output of the command, the folder destination where the images are saved is printed out.&lt;br /&gt;
&lt;br /&gt;
Next, you will need to copy this Mender file system image to the USRP N3xx. This can be done with the Linux utility &amp;lt;code&amp;gt;scp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    $ scp /usr/local/share/uhd/images/usrp_n3xx_fs.mender root@192.168.1.51:~/. &lt;br /&gt;
&lt;br /&gt;
Note: The path and IP may different for your configuration, the command above assumes you're using the default installation path of &amp;lt;code&amp;gt;/usr/local&amp;lt;/code&amp;gt; and that the N3xx's IP is &amp;lt;code&amp;gt;192.168.1.51&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
After copying the Mender file system image to the N3xx, connect to the N3xx using either the Serial Console, or via SSH to gain shell access.&lt;br /&gt;
&lt;br /&gt;
On the N3xx, run &amp;lt;code&amp;gt;mender install /path/to/latest.mender&amp;lt;/code&amp;gt; to update the file system:&lt;br /&gt;
&lt;br /&gt;
    $ mender install /home/root/usrp_n3xx_fs.mender&lt;br /&gt;
&lt;br /&gt;
The artifact can also be stored on a remote server:&lt;br /&gt;
    $ mender install &amp;lt;nowiki&amp;gt;http://server.name/path/to/latest.mender&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This procedure will take a few minutes to complete. After mender has logged a successful update, reboot the device:&lt;br /&gt;
    $ reboot&lt;br /&gt;
&lt;br /&gt;
If the reboot worked, and the device seems functional, commit the changes so that the boot loader knows to permanently boot into this partition:&lt;br /&gt;
    $ mender -commit&lt;br /&gt;
&lt;br /&gt;
To identify the currently installed Mender artifact from the command line, the following file can be queried on the N3xx:&lt;br /&gt;
    $ cat /etc/mender/artifact_info&lt;br /&gt;
&lt;br /&gt;
If you are using a Mender server, the updates can be initiated from a web dashboard. From there, you can start the updates without having to log into the device, and you can update groups of USRPs with a few clicks in a web GUI. The dashboard can also be used to inspect the state of USRPs. This is a simple way to update groups of rack-mounted USRPs with custom file systems.&lt;br /&gt;
&lt;br /&gt;
For more information on updating the file-system, refer to the UHD Manual at ​https://uhd.ettus.com​.&lt;br /&gt;
&lt;br /&gt;
===Updating the files system by writing the disk image===&lt;br /&gt;
Please see the separate application note, [[Writing the USRP File System Disk Image to a SD Card]], for step-by-step instructions on writing the file system image to the SD card.&lt;br /&gt;
&lt;br /&gt;
==Updating the Network Configurations==&lt;br /&gt;
The USRP N3xx systemd network configuration files are located either at: &amp;lt;code&amp;gt;/etc/systemd/network/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    # ls /etc/systemd/network/&lt;br /&gt;
    eth0.network  sfp0.network  sfp1.network&lt;br /&gt;
&lt;br /&gt;
or for newer version of the file system: &amp;lt;code&amp;gt;/data/network/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    # ls /data/network/&lt;br /&gt;
    eth0.network  int0.network  sfp0.network  sfp1.network&lt;br /&gt;
&lt;br /&gt;
For details on configuration please refer to the [https://www.freedesktop.org/software/systemd/man/systemd.network.html systemd-networkd manual pages].&lt;br /&gt;
&lt;br /&gt;
The factory settings are as follows:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
eth0 (DHCP):&lt;br /&gt;
&lt;br /&gt;
    [Match]&lt;br /&gt;
    Name=eth0&lt;br /&gt;
&lt;br /&gt;
    [Network]&lt;br /&gt;
    DHCP=ipv4&lt;br /&gt;
&lt;br /&gt;
    [DHCP]&lt;br /&gt;
    UseHostname=false&lt;br /&gt;
&lt;br /&gt;
sfp0 (static):&lt;br /&gt;
&lt;br /&gt;
    [Match]&lt;br /&gt;
    Name=sfp0&lt;br /&gt;
&lt;br /&gt;
    [Network]&lt;br /&gt;
    Address=192.168.10.2/24&lt;br /&gt;
&lt;br /&gt;
    [Link]&lt;br /&gt;
    MTUBytes=9000&lt;br /&gt;
&lt;br /&gt;
sfp1 (static):&lt;br /&gt;
&lt;br /&gt;
    [Match]&lt;br /&gt;
    Name=sfp1&lt;br /&gt;
&lt;br /&gt;
    [Network]&lt;br /&gt;
    Address=192.168.20.2/24&lt;br /&gt;
&lt;br /&gt;
    [Link]&lt;br /&gt;
    MTUBytes=9000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additional notes on networking:&lt;br /&gt;
&lt;br /&gt;
* Care needs to be taken when editing these files on the device, since &amp;lt;code&amp;gt;vi&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;vim&amp;lt;/code&amp;gt; sometimes generates undo files (e.g. &amp;lt;code&amp;gt;/etc/systemd/network/sfp0.network~&amp;lt;/code&amp;gt;), that &amp;lt;code&amp;gt;systemd-networkd&amp;lt;/code&amp;gt; might accidentally pick up.&lt;br /&gt;
* Temporarily setting the IP addresses or MTU sizes via &amp;lt;code&amp;gt;ifconfig&amp;lt;/code&amp;gt; or other command line tools will only change the value until the next reboot or reload of the FPGA image.&lt;br /&gt;
* If the MTU of the device and host computers differ, streaming issues can occur.&lt;br /&gt;
* Streaming via SFP0 at 1 Gb rates requires a MTU of &amp;lt;code&amp;gt;1500&amp;lt;/code&amp;gt;&lt;br /&gt;
* Streaming via SFP0 at 10 Gb rates requires a MTU of &amp;lt;code&amp;gt;9000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For addition details on network configuration here: https://files.ettus.com/manual/page_usrp_n3xx.html#n3xx_network_configuration&lt;br /&gt;
&lt;br /&gt;
==Updating the FPGA Image==&lt;br /&gt;
&lt;br /&gt;
===Network Mode FPGA Image Update===&lt;br /&gt;
The FPGA image should match the version of UHD installed on the host computer, when operated in Network mode. Connect the device to the host computer using either the RJ45 or SFP+ port, refer to the section above for detailed instructions. &lt;br /&gt;
&lt;br /&gt;
To obtain all the FPGA images for a specific version of UHD, run the following command on the host computer with internet access:&lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader&lt;br /&gt;
&lt;br /&gt;
Example Output:&lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader&lt;br /&gt;
    [INFO] Images destination: /usr/local/share/uhd/images&lt;br /&gt;
    00006 kB / 00006 kB (100%) usrp1_b100_fw_default-g6bea23d.zip&lt;br /&gt;
    19810 kB / 19810 kB (100%) x3xx_x310_fpga_default-gf1ba32fe.zip&lt;br /&gt;
    02757 kB / 02757 kB (100%) usrp2_n210_fpga_default-g6bea23d.zip&lt;br /&gt;
    02123 kB / 02123 kB (100%) n230_n230_fpga_default-ge57dfe0.zip&lt;br /&gt;
    00522 kB / 00522 kB (100%) usrp1_b100_fpga_default-g6bea23d.zip&lt;br /&gt;
    00491 kB / 00491 kB (100%) b2xx_b200_fpga_default-ge57dfe0.zip&lt;br /&gt;
    02415 kB / 02415 kB (100%) usrp2_n200_fpga_default-g6bea23d.zip&lt;br /&gt;
    08988 kB / 08988 kB (100%) e3xx_e320_fpga_default-g3de8954a.zip&lt;br /&gt;
    23045 kB / 23045 kB (100%) n3xx_n310_fpga_default-g3de8954a.zip&lt;br /&gt;
    00523 kB / 00523 kB (100%) b2xx_b205mini_fpga_default-ge57dfe0.zip&lt;br /&gt;
    18937 kB / 18937 kB (100%) x3xx_x300_fpga_default-gf1ba32fe.zip&lt;br /&gt;
    00017 kB / 00017 kB (100%) octoclock_octoclock_fw_default-g14000041.zip&lt;br /&gt;
    00007 kB / 00007 kB (100%) usrp2_usrp2_fw_default-g6bea23d.zip&lt;br /&gt;
    00009 kB / 00009 kB (100%) usrp2_n200_fw_default-g6bea23d.zip&lt;br /&gt;
    00450 kB / 00450 kB (100%) usrp2_usrp2_fpga_default-g6bea23d.zip&lt;br /&gt;
    00144 kB / 00144 kB (100%) b2xx_common_fw_default-ga69ab0c.zip&lt;br /&gt;
    25107 kB / 25107 kB (100%) n3xx_n320_fpga_default-g3de8954a.zip&lt;br /&gt;
    00464 kB / 00464 kB (100%) b2xx_b200mini_fpga_default-ge57dfe0.zip&lt;br /&gt;
    00319 kB / 00319 kB (100%) usrp1_usrp1_fpga_default-g6bea23d.zip&lt;br /&gt;
    04839 kB / 04839 kB (100%) usb_common_windrv_default-g14000041.zip&lt;br /&gt;
    00009 kB / 00009 kB (100%) usrp2_n210_fw_default-g6bea23d.zip&lt;br /&gt;
    16065 kB / 16065 kB (100%) n3xx_n300_fpga_default-g3de8954a.zip&lt;br /&gt;
    05578 kB / 05578 kB (100%) e3xx_e310_fpga_default-g4bc2c6f.zip&lt;br /&gt;
    00885 kB / 00885 kB (100%) b2xx_b210_fpga_default-ge57dfe0.zip&lt;br /&gt;
    [INFO] Images download complete.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NOTE: In the above example output, the Images Destination folder is printed:&lt;br /&gt;
&lt;br /&gt;
    [INFO] Images destination: /usr/local/share/uhd/images&lt;br /&gt;
&lt;br /&gt;
To list the N3xx FPGA images with a full path, run the command:&lt;br /&gt;
&lt;br /&gt;
    $ ls -w 1 /usr/local/share/uhd/images/usrp_n3*.bit&lt;br /&gt;
    &lt;br /&gt;
    /usr/local/share/uhd/images/usrp_n300_fpga_AA.bit&lt;br /&gt;
    /usr/local/share/uhd/images/usrp_n300_fpga_HG.bit&lt;br /&gt;
    /usr/local/share/uhd/images/usrp_n300_fpga_WX.bit&lt;br /&gt;
    /usr/local/share/uhd/images/usrp_n300_fpga_XG.bit&lt;br /&gt;
    /usr/local/share/uhd/images/usrp_n310_fpga_AA.bit&lt;br /&gt;
    /usr/local/share/uhd/images/usrp_n310_fpga_HG.bit&lt;br /&gt;
    /usr/local/share/uhd/images/usrp_n310_fpga_WX.bit&lt;br /&gt;
    /usr/local/share/uhd/images/usrp_n310_fpga_XG.bit&lt;br /&gt;
    /usr/local/share/uhd/images/usrp_n320_fpga_AQ.bit&lt;br /&gt;
    /usr/local/share/uhd/images/usrp_n320_fpga_HG.bit&lt;br /&gt;
    /usr/local/share/uhd/images/usrp_n320_fpga_WX.bit&lt;br /&gt;
    /usr/local/share/uhd/images/usrp_n320_fpga_XG.bit&lt;br /&gt;
    /usr/local/share/uhd/images/usrp_n320_fpga_XQ.bit&lt;br /&gt;
&lt;br /&gt;
To update the default &amp;lt;code&amp;gt;HG&amp;lt;/code&amp;gt; variant of FPGA image, run the command:&lt;br /&gt;
&lt;br /&gt;
    $ uhd_image_loader --args &amp;quot;type=n3xx,addr=&amp;lt;N3xx_IP_ADDR&amp;gt;,fpga=HG&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Example Output:&lt;br /&gt;
&lt;br /&gt;
    uhd_image_loader --args &amp;quot;type=n3xx,addr=192.168.1.151,fpga=HG&amp;quot;&lt;br /&gt;
    [INFO] [UHD] linux; GNU C++ version 5.4.0 20160609; Boost_105800; UHD_3.11.1.HEAD-0-gad6b0935&lt;br /&gt;
    [INFO] [MPMD] Initializing 1 device(s) in parallel with args: mgmt_addr=192.168.1.151,type=n3xx,product=n310,serial=313ABDA,claimed=False,skip_init=1&lt;br /&gt;
    [INFO] [MPM.main] Launching USRP/MPM, version: 3.11.1.0-gunknown&lt;br /&gt;
    [INFO] [MPM.main] Spawning RPC process...&lt;br /&gt;
    [INFO] [MPM.PeriphManager] Device serial number: 313ABDA&lt;br /&gt;
    [INFO] [MPM.PeriphManager] Found 2 daughterboard(s).&lt;br /&gt;
    [INFO] [MPM.PeriphManager.UDP] No CHDR interfaces found!&lt;br /&gt;
    [INFO] [MPM.PeriphManager.UDP] No CHDR interfaces found!&lt;br /&gt;
    [INFO] [MPM.RPCServer] RPC server ready!&lt;br /&gt;
    [INFO] [MPM.RPCServer] Spawning watchdog task...&lt;br /&gt;
    [INFO] [MPM.PeriphManager.UDP] No CHDR interfaces found!&lt;br /&gt;
    [INFO] [MPMD] Claimed device without full initialization.&lt;br /&gt;
    [INFO] [MPMD IMAGE LOADER] Starting update. This may take a while.&lt;br /&gt;
    [INFO] [MPM.PeriphManager] Updating component `fpga'&lt;br /&gt;
    [INFO] [MPM.PeriphManager] Updating component `dts'&lt;br /&gt;
    [INFO] [MPM.RPCServer] Resetting peripheral manager.&lt;br /&gt;
    [INFO] [MPM.PeriphManager] Device serial number: 313ABDA&lt;br /&gt;
    [INFO] [MPM.PeriphManager] Found 2 daughterboard(s).&lt;br /&gt;
    [INFO] [MPMD IMAGE LOADER] Update component function succeeded.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To load a different default FPGA image (i.e. &amp;lt;code&amp;gt;XG&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WG&amp;lt;/code&amp;gt;), modify the device argument &amp;lt;code&amp;gt;fpga=&amp;lt;/code&amp;gt; to a value of &amp;lt;code&amp;gt;fpga=XG&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;fpga=WG&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To specify the path to a custom FPGA image, use the ​&amp;lt;code&amp;gt;--fpga-path&amp;lt;/code&amp;gt;​ argument. &lt;br /&gt;
&lt;br /&gt;
    $ uhd_image_loader --args &amp;quot;type=n3xx,addr=&amp;lt;N3xx_IP_ADDR&amp;gt;&amp;quot; --fpga-path=/path/to/custom/fpga.bit&lt;br /&gt;
&lt;br /&gt;
The Verilog code for the FPGA in the USRP N3xx is open-source, and users are free to modify and customize it for their needs. However, certain modifications may result in either bricking the device, or even in physical damage to the unit. Please note that modifications to the FPGA are made at the risk of the user, and may not be covered by the warranty of the device.&lt;br /&gt;
&lt;br /&gt;
===Embedded Mode FPGA Image Update===&lt;br /&gt;
&lt;br /&gt;
It is possible to update the FPGA image when operated in Embedded mode. Connect to the ARM CPU via Serial Console or SSH as detailed in the section above. &lt;br /&gt;
&lt;br /&gt;
Updating the FPGA image from the ARM CPU is the same as detailed above for a Network mode update, except it is not required to provide an &amp;lt;code&amp;gt;addr&amp;lt;/code&amp;gt; device argument. &lt;br /&gt;
&lt;br /&gt;
    uhd_image_loader --args &amp;quot;type=n3xx,fpga=HG&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ni-n3xx-313ABDA:~# uhd_image_loader --args &amp;quot;type=n3xx,fpga=HG&amp;quot;&lt;br /&gt;
[INFO] [UHD] linux; GNU C++ version 7.2.0; Boost_106400; UHD_3.11.1.0-0-unknown&lt;br /&gt;
[INFO] [MPMD] Initializing 1 device(s) in parallel with args: mgmt_addr=127.0.0.1,type=n3xx,product=n310,serial=313ABDA,claimed=False,skip_init=1&lt;br /&gt;
[INFO] [MPMD] Claimed device without full initialization.&lt;br /&gt;
[INFO] [MPMD IMAGE LOADER] Starting update. This may take a while.&lt;br /&gt;
[INFO] [MPM.PeriphManager] Updating component `fpga'&lt;br /&gt;
[INFO] [MPM.PeriphManager] Updating component `dts'&lt;br /&gt;
[INFO] [MPM.RPCServer] Resetting peripheral manager.&lt;br /&gt;
[INFO] [MPM.PeriphManager] Device serial number: 313ABDA&lt;br /&gt;
[INFO] [MPM.PeriphManager] Found 2 daughterboard(s).&lt;br /&gt;
[INFO] [MPMD IMAGE LOADER] Update component function succeeded.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more information on updating the FPGA image, refer to the UHD Manual at http://uhd.ettus.com​ .&lt;br /&gt;
&lt;br /&gt;
==Setting Up a Streaming Connection==&lt;br /&gt;
The device supports multiple, high-speed, low-latency interfaces on the SFP+ ports for streaming samples to the host computer. &lt;br /&gt;
&lt;br /&gt;
===1Gb Streaming SFP Port 0===&lt;br /&gt;
Complete the steps below to set up a streaming connection over the 1 Gigabit Ethernet interface on &amp;lt;code&amp;gt;SFP Port 0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When streaming via SFP Port 0 at 1 Gb speeds, it is important that the connection is direct between the Host and USRP. Placing a switch or other network gear between the Host and USRP can reduce throughput of the transport link. It is also generally recommended to avoid using USB to Ethernet Adapters for the high speed streaming interface, as they may limit performance or cause periodic flow control errors. &lt;br /&gt;
&lt;br /&gt;
NOTE: The &amp;lt;code&amp;gt;HG&amp;lt;/code&amp;gt; FPGA image must be loaded for &amp;lt;code&amp;gt;SFP Port 0&amp;lt;/code&amp;gt; to operate at 1Gb speeds. If the &amp;lt;code&amp;gt;XG&amp;lt;/code&amp;gt; image is loaded, the port will be unresponsive at 1Gb speeds. &lt;br /&gt;
&lt;br /&gt;
1. Configure your Host's Ethernet adapter as shown below. This interface should be separate from the 1Gb NIC/network which is connected to the 1Gb RJ45 management interface.&lt;br /&gt;
&lt;br /&gt;
    IP Address: 192.168.10.1&lt;br /&gt;
    Subnet Mask: 255.255.255.0&lt;br /&gt;
    Gateway: 0.0.0.0&lt;br /&gt;
    MTU: 1500&lt;br /&gt;
&lt;br /&gt;
NOTE: When operating &amp;lt;code&amp;gt;SFP Port 0&amp;lt;/code&amp;gt; at 1Gb speeds, it is important to set a MTU of &amp;lt;code&amp;gt;1500&amp;lt;/code&amp;gt; and not a value of &amp;lt;code&amp;gt;automatic&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Insert the ​ RJ45 – SFP+ adapter ​into​ &amp;lt;code&amp;gt;SFP Port 0&amp;lt;/code&amp;gt;​ .&lt;br /&gt;
&lt;br /&gt;
3. Connect the adapter to a host computer using the Ethernet cable to SFP0.&lt;br /&gt;
&lt;br /&gt;
The ​ Green LED​ above ​&amp;lt;code&amp;gt;SFP Port 0&amp;lt;/code&amp;gt;​ should illuminate.&lt;br /&gt;
&lt;br /&gt;
4. To test the connection,​ ​&amp;lt;code&amp;gt;ping&amp;lt;/code&amp;gt;​ the device at address &amp;lt;code&amp;gt;192.168.10.2​&amp;lt;/code&amp;gt; from the host, as shown&lt;br /&gt;
below:&lt;br /&gt;
&lt;br /&gt;
    $ ping 192.168.10.2&lt;br /&gt;
    PING 192.168.10.2 (192.168.10.2) 56(84) bytes of data.&lt;br /&gt;
    64 bytes from 192.168.10.2: icmp_seq=1 ttl=64 time=1.06 ms&lt;br /&gt;
    ^C&lt;br /&gt;
    --- 192.168.10.2 ping statistics ---&lt;br /&gt;
    1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
    rtt min/avg/max/mdev = 1.065/1.065/1.065/0.000 ms&lt;br /&gt;
    &lt;br /&gt;
Press &amp;lt;code&amp;gt;CTRL+C&amp;lt;/code&amp;gt; to stop the ping program. &lt;br /&gt;
&lt;br /&gt;
Proceed to the next section &amp;quot;Verifying Device Operation&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===10Gb Streaming SFP Port 1===&lt;br /&gt;
Complete the steps below to set up a streaming connection over the 10 Gigabit Ethernet interface on &amp;lt;code&amp;gt;SFP Port 1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
NOTE: Both the &amp;lt;code&amp;gt;HG&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;XG&amp;lt;/code&amp;gt; FPGA images support 10Gb speeds over SFP Port 1. &lt;br /&gt;
&lt;br /&gt;
1. Configure your Host's 10Gb Ethernet adapter as shown below. &lt;br /&gt;
&lt;br /&gt;
    IP Address: 192.168.20.1&lt;br /&gt;
    Subnet Mask: 255.255.255.0&lt;br /&gt;
    Gateway: 0.0.0.0&lt;br /&gt;
    MTU: 9000&lt;br /&gt;
&lt;br /&gt;
NOTE: When operating at 10Gb speeds, it is important to set a MTU of &amp;lt;code&amp;gt;9000&amp;lt;/code&amp;gt; and not a value of &amp;lt;code&amp;gt;automatic&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Connect the USRP to a host computer using either a 10Gb SFP or Fiber cable to &amp;lt;code&amp;gt;SFP Port 1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The ​ Green LED​ above ​&amp;lt;code&amp;gt;SFP Port 1&amp;lt;/code&amp;gt;​ should illuminate.&lt;br /&gt;
&lt;br /&gt;
3. To test the connection,​ ​&amp;lt;code&amp;gt;ping&amp;lt;/code&amp;gt;​ the device at address &amp;lt;code&amp;gt;192.168.20.2​&amp;lt;/code&amp;gt; from the host, as shown&lt;br /&gt;
below:&lt;br /&gt;
&lt;br /&gt;
    $ ping 192.168.20.2&lt;br /&gt;
&lt;br /&gt;
Press &amp;lt;code&amp;gt;CTRL+C&amp;lt;/code&amp;gt; to stop the ping program. &lt;br /&gt;
&lt;br /&gt;
Proceed to the next section &amp;quot;Verifying Device Operation&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Dual 10Gb Streaming SFP Ports 0/1===&lt;br /&gt;
Complete the steps below to set up a streaming connections over the Dual 10 Gigabit Ethernet interface on &amp;lt;code&amp;gt;SFP Ports 0/1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
NOTE: The &amp;lt;code&amp;gt;XG&amp;lt;/code&amp;gt; FPGA image must be loaded for &amp;lt;code&amp;gt;SFP Port 0&amp;lt;/code&amp;gt; to operate at 10 Gb speeds. If the &amp;lt;code&amp;gt;HG&amp;lt;/code&amp;gt; image is loaded, the port will be unresponsive at 10 Gb speeds. &lt;br /&gt;
&lt;br /&gt;
1. Configure your Host's #1 10Gb Ethernet adapter as shown below. &lt;br /&gt;
&lt;br /&gt;
    IP Address: 192.168.10.1&lt;br /&gt;
    Subnet Mask: 255.255.255.0&lt;br /&gt;
    Gateway: 0.0.0.0&lt;br /&gt;
    MTU: 9000&lt;br /&gt;
&lt;br /&gt;
2. Configure your Host's #2 10Gb Ethernet adapter as shown below. &lt;br /&gt;
&lt;br /&gt;
    IP Address: 192.168.20.1&lt;br /&gt;
    Subnet Mask: 255.255.255.0&lt;br /&gt;
    Gateway: 0.0.0.0&lt;br /&gt;
    MTU: 9000&lt;br /&gt;
&lt;br /&gt;
NOTE: When operating at 10Gb speeds, it is important to set a MTU of &amp;lt;code&amp;gt;9000&amp;lt;/code&amp;gt; and not a value of &amp;lt;code&amp;gt;automatic&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. Connect the USRP to a host computer using either a 10Gb SFP or Fiber cables to &amp;lt;code&amp;gt;SFP Ports 0/1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The ​Green LEDs​ above ​&amp;lt;code&amp;gt;SFP Ports 0/1&amp;lt;/code&amp;gt;​ should illuminate.&lt;br /&gt;
&lt;br /&gt;
4. To test the &amp;lt;code&amp;gt;SFP Port 0&amp;lt;/code&amp;gt; connection,​ ​&amp;lt;code&amp;gt;ping&amp;lt;/code&amp;gt;​ the device at address &amp;lt;code&amp;gt;192.168.10.2​&amp;lt;/code&amp;gt; from the host, as shown below:&lt;br /&gt;
&lt;br /&gt;
    $ ping 192.168.10.2&lt;br /&gt;
&lt;br /&gt;
Press &amp;lt;code&amp;gt;CTRL+C&amp;lt;/code&amp;gt; to stop the ping program. &lt;br /&gt;
&lt;br /&gt;
5. To test the &amp;lt;code&amp;gt;SFP Port 1&amp;lt;/code&amp;gt; connection,​ ​&amp;lt;code&amp;gt;ping&amp;lt;/code&amp;gt;​ the device at address &amp;lt;code&amp;gt;192.168.20.2​&amp;lt;/code&amp;gt; from the host, as shown below:&lt;br /&gt;
&lt;br /&gt;
    $ ping 192.168.20.2&lt;br /&gt;
&lt;br /&gt;
Press &amp;lt;code&amp;gt;CTRL+C&amp;lt;/code&amp;gt; to stop the ping program. &lt;br /&gt;
&lt;br /&gt;
Proceed to the next section &amp;quot;Verifying Device Operation&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
For more details on Network Setup and Configuration, please see the “Interfaces and Connectivity” section on the [[N300/N310]] or [[N320/N321]] hardware resources pages.&lt;br /&gt;
&lt;br /&gt;
==Verifying Device Operation==&lt;br /&gt;
Once you have successfully setup a management interface and streaming interface, you can now verify the devices operation using the included UHD utilities.&lt;br /&gt;
&lt;br /&gt;
===Subdevice Specification Mapping===&lt;br /&gt;
====N300====&lt;br /&gt;
The USRP N300 contains 2 channels, each represented on the front panel as &amp;lt;code&amp;gt;RF0-1&amp;lt;/code&amp;gt;. Below is the &amp;lt;code&amp;gt;subdev&amp;lt;/code&amp;gt; mapping of RF Ports.&lt;br /&gt;
&lt;br /&gt;
* RF0 = A:0&lt;br /&gt;
* RF1 = A:1&lt;br /&gt;
&lt;br /&gt;
====N310====&lt;br /&gt;
The USRP N310 contains 4 channels, each represented on the front panel as &amp;lt;code&amp;gt;RF0-3&amp;lt;/code&amp;gt;. Below is the &amp;lt;code&amp;gt;subdev&amp;lt;/code&amp;gt; mapping of RF Ports.&lt;br /&gt;
&lt;br /&gt;
=====UHD 3.11.x.x - 3.12.x.x=====&lt;br /&gt;
* RF0 = A:0&lt;br /&gt;
* RF1 = B:0&lt;br /&gt;
* RF2 = C:0&lt;br /&gt;
* RF3 = D:0&lt;br /&gt;
&lt;br /&gt;
=====UHD 3.13.x.x+=====&lt;br /&gt;
* RF0 = A:0&lt;br /&gt;
* RF1 = A:1&lt;br /&gt;
* RF2 = B:0&lt;br /&gt;
* RF3 = B:1&lt;br /&gt;
&lt;br /&gt;
====N320====&lt;br /&gt;
The USRP N320 contains 2 channels, each represented on the front panel as &amp;lt;code&amp;gt;RF0-1&amp;lt;/code&amp;gt;. Below is the &amp;lt;code&amp;gt;subdev&amp;lt;/code&amp;gt; mapping of RF Ports.&lt;br /&gt;
&lt;br /&gt;
* RF0 = A:0&lt;br /&gt;
* RF1 = B:0&lt;br /&gt;
&lt;br /&gt;
====N321====&lt;br /&gt;
The USRP N321 contains 2 channels, each represented on the front panel as &amp;lt;code&amp;gt;RF0-1&amp;lt;/code&amp;gt;. Below is the &amp;lt;code&amp;gt;subdev&amp;lt;/code&amp;gt; mapping of RF Ports.&lt;br /&gt;
&lt;br /&gt;
* RF0 = A:0&lt;br /&gt;
* RF1 = B:0&lt;br /&gt;
&lt;br /&gt;
Additional details of UHD Subdevice Specifications can be found here in the UHD Manual: http://files.ettus.com/manual/page_configuration.html#config_subdev&lt;br /&gt;
&lt;br /&gt;
===Supported Sample Rates===&lt;br /&gt;
&lt;br /&gt;
The USRP N300/N310 supports the three fixed Master Clock Rates listed below. &lt;br /&gt;
&lt;br /&gt;
* 122.88 MHz&lt;br /&gt;
* 125.00 MHz&lt;br /&gt;
* 153.60 MHz&lt;br /&gt;
&lt;br /&gt;
The USRP N320/N321 supports the three fixed Master Clock Rates listed below. &lt;br /&gt;
&lt;br /&gt;
* 200.00 MHz&lt;br /&gt;
* 245.76 MHz&lt;br /&gt;
* 250.00 MHz&lt;br /&gt;
&lt;br /&gt;
Sample rates as delivered to/from the host computer for USRP devices are constrained to follow several important rules.&lt;br /&gt;
&lt;br /&gt;
It is important to understand that strictly-integer decimation and interpolation are used within USRP hardware to meet the requested sample rate requirements of the application at hand. That means that the desired sample rate must meet the requirement that master-clock-rate/desired-sample-rate be an integer ratio. Further, it is strongly desirable for that ratio to be even. This ratio is the decimation (down-conversion) or interpolation (up-conversion) factor. The decimation or interpolation factor may be between 1 and 1024. There are further constraints on the decimation or interpolation factor. If the decimation or interpolation factor exceeds 128, then it must be evenly divisible by 2. If the decimation or interpolation factor exceeds 256, then it must be evenly divisible by 4.&lt;br /&gt;
&lt;br /&gt;
====Example Sample Rates====&lt;br /&gt;
Listed below are common sample rates for the given master clock rates. This is not a complete listing of the supported sample rates.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Master Clock Rate&lt;br /&gt;
!colspan=&amp;quot;20&amp;quot;|Decimation / Interpolation Rate &amp;lt;br&amp;gt; Host Sample Rate [Msps]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 1&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 4&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 8&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 10&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 12&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 14&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 16&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 18&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 20&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 30&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 32&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 64&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 100&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 128&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 200&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 256&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 512&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 1024&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 122.88e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 61.44e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 30.72e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 20.48e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 15.36e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 12.288e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 10.24e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 8.7771e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 7.68e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 6.8267e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 6.144e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 4.096e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 3.84e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 1.92e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 1.2288e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 960e3&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 614.4e3&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 480e3&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 240e3&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 120e3&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 125e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 62.5e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 31.25e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 20.833e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 15.625e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 12.5e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 10.417e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 8.9286e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 7.8125e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 6.9444e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 6.25e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 4.1667e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 3.90625e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 1.953125e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 1.25e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 976.5625e3&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 625e3&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 488.28125e3&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 244.14e3&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 122.07e3&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 153.6e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 76.8e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 38.4e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 25.6e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 19.2e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 15.36e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 12.8e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 10.971e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 9.6e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 8.5333e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 7.68e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 5.12e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 4.8e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2.4e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 1.536e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 1.2e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 768e3&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 600e3&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 300e3&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 150e3&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====N320/N321 Example Sample Rates====&lt;br /&gt;
Listed below are common sample rates for the given master clock rates. This is not a complete listing of the supported sample rates.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Master Clock Rate&lt;br /&gt;
!colspan=&amp;quot;20&amp;quot;|Decimation / Interpolation Rate &amp;lt;br&amp;gt; Host Sample Rate [Msps]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 1&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 4&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 8&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 10&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 12&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 14&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 16&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 18&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 20&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 30&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 32&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 64&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 100&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 128&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 200&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 256&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 512&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 1024&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 200e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 100e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 50e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 33.33e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 25e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 20e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 16.66e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 14.2857e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 12.5e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 11.11e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 10e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 6.667e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 6.25e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 3.125e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 1.5625e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 1e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 781.25e3&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 390.625e3&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 195.3125e3&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 245.76e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 122.88e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 61.44e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 30.72e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 20.48e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 15.36e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 12.288e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 10.24e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 8.7771e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 7.68e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 6.8267e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 6.144e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 4.096e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 3.84e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 1.92e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 1.2288e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 960e3&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 614.4e3&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 480e3&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 240e3&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 250e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 125e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 62.5e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 31.25e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 20.833e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 15.625e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 12.5e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 10.417e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 8.9286e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 7.8125e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 6.9444e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 6.25e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 4.1667e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 3.90625e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 1.953125e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 1.25e6&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 976.5625e3&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 625e3&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 488.28125e3&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 244.14e3&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Additional information on Sample Rates can be found here in the UHD Manual: http://files.ettus.com/manual/page_general.html#general_sampleratenotes&lt;br /&gt;
&lt;br /&gt;
===Probe the USRP===&lt;br /&gt;
&lt;br /&gt;
====N300/N310====&lt;br /&gt;
The UHD utility &amp;lt;code&amp;gt;uhd_usrp_probe&amp;lt;/code&amp;gt; provides detailed information of the USRP device.&lt;br /&gt;
&lt;br /&gt;
From your host computer, run the command &amp;lt;code&amp;gt;uhd_usrp_probe&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$  uhd_usrp_probe &lt;br /&gt;
[INFO] [UHD] linux; GNU C++ version 5.4.0 20160609; Boost_105800; UHD_3.13.1.HEAD-0-ga0a71d10&lt;br /&gt;
[INFO] [MPMD] Initializing 1 device(s) in parallel with args: mgmt_addr=192.168.10.2,type=n3xx,product=n310,serial=313ABDA,claimed=False,addr=192.168.10.2&lt;br /&gt;
[INFO] [MPM.main] Launching USRP/MPM, version: 3.13.1.0-gd3b7e90a&lt;br /&gt;
[INFO] [MPM.main] Spawning RPC process...&lt;br /&gt;
[INFO] [MPM.PeriphManager] Device serial number: 313ABDA&lt;br /&gt;
[INFO] [MPM.PeriphManager] Initialized 2 daughterboard(s).&lt;br /&gt;
[INFO] [MPM.PeriphManager] init() called with device args `time_source=internal,clock_source=internal'.&lt;br /&gt;
[INFO] [MPM.RPCServer] RPC server ready!&lt;br /&gt;
[INFO] [MPM.RPCServer] Spawning watchdog task...&lt;br /&gt;
[INFO] [0/DmaFIFO_0] Initializing block control (NOC ID: 0xF1F0D00000000004)&lt;br /&gt;
[INFO] [0/DmaFIFO_0] BIST passed (Throughput: 1355 MB/s)&lt;br /&gt;
[INFO] [MPM.PeriphManager] init() called with device args `mgmt_addr=192.168.10.2,clock_source=internal,time_source=internal,product=n310'.&lt;br /&gt;
[INFO] [0/DmaFIFO_0] BIST passed (Throughput: 1358 MB/s)&lt;br /&gt;
[INFO] [0/DmaFIFO_0] BIST passed (Throughput: 1355 MB/s)&lt;br /&gt;
[INFO] [0/DmaFIFO_0] BIST passed (Throughput: 1345 MB/s)&lt;br /&gt;
[INFO] [0/Radio_0] Initializing block control (NOC ID: 0x12AD100000011312)&lt;br /&gt;
[INFO] [0/Radio_1] Initializing block control (NOC ID: 0x12AD100000011312)&lt;br /&gt;
[INFO] [0/DDC_0] Initializing block control (NOC ID: 0xDDC0000000000000)&lt;br /&gt;
[INFO] [0/DDC_1] Initializing block control (NOC ID: 0xDDC0000000000000)&lt;br /&gt;
[INFO] [0/DUC_0] Initializing block control (NOC ID: 0xD0C0000000000002)&lt;br /&gt;
[INFO] [0/DUC_1] Initializing block control (NOC ID: 0xD0C0000000000002)&lt;br /&gt;
  _____________________________________________________&lt;br /&gt;
 /&lt;br /&gt;
|       Device: N300-Series Device&lt;br /&gt;
|     _____________________________________________________&lt;br /&gt;
|    /&lt;br /&gt;
|   |       Mboard: ni-n3xx-313ABDA&lt;br /&gt;
|   |   eeprom_version: 1&lt;br /&gt;
|   |   mpm_version: 3.13.1.0-gd3b7e90a&lt;br /&gt;
|   |   pid: 16962&lt;br /&gt;
|   |   product: n310&lt;br /&gt;
|   |   rev: 3&lt;br /&gt;
|   |   rpc_connection: remote&lt;br /&gt;
|   |   serial: 313ABDA&lt;br /&gt;
|   |   type: n3xx&lt;br /&gt;
|   |   MPM Version: 1.2&lt;br /&gt;
|   |   FPGA Version: 5.2&lt;br /&gt;
|   |   RFNoC capable: Yes&lt;br /&gt;
|   |   &lt;br /&gt;
|   |   Time sources:  internal, external, gpsdo, sfp0&lt;br /&gt;
|   |   Clock sources: external, internal, gpsdo&lt;br /&gt;
|   |   Sensors: gps_tpv, ref_locked, gps_time, gps_locked, temp, gps_sky, fan&lt;br /&gt;
|   |     _____________________________________________________&lt;br /&gt;
|   |    /&lt;br /&gt;
|   |   |       RX Dboard: A&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       RX Frontend: 0&lt;br /&gt;
|   |   |   |   Name: Magnesium&lt;br /&gt;
|   |   |   |   Antennas: TX/RX, RX2, CAL, LOCAL&lt;br /&gt;
|   |   |   |   Sensors: lo_locked, ad9371_lo_locked, lowband_lo_locked&lt;br /&gt;
|   |   |   |   Freq range: 1.000 to 6000.000 MHz&lt;br /&gt;
|   |   |   |   Gain range all: 0.0 to 75.0 step 0.5 dB&lt;br /&gt;
|   |   |   |   Gain range rfic: 0.0 to 0.0 step 0.0 dB&lt;br /&gt;
|   |   |   |   Gain range dsa: 0.0 to 0.0 step 0.0 dB&lt;br /&gt;
|   |   |   |   Gain range amp: 0.0 to 0.0 step 0.0 dB&lt;br /&gt;
|   |   |   |   Bandwidth range: 20000000.0 to 100000000.0 step 0.0 Hz&lt;br /&gt;
|   |   |   |   Connection Type: IQ&lt;br /&gt;
|   |   |   |   Uses LO offset: No&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       RX Frontend: 1&lt;br /&gt;
|   |   |   |   Name: Magnesium&lt;br /&gt;
|   |   |   |   Antennas: TX/RX, RX2, CAL, LOCAL&lt;br /&gt;
|   |   |   |   Sensors: lo_locked, ad9371_lo_locked, lowband_lo_locked&lt;br /&gt;
|   |   |   |   Freq range: 1.000 to 6000.000 MHz&lt;br /&gt;
|   |   |   |   Gain range all: 0.0 to 75.0 step 0.5 dB&lt;br /&gt;
|   |   |   |   Gain range rfic: 0.0 to 0.0 step 0.0 dB&lt;br /&gt;
|   |   |   |   Gain range dsa: 0.0 to 0.0 step 0.0 dB&lt;br /&gt;
|   |   |   |   Gain range amp: 0.0 to 0.0 step 0.0 dB&lt;br /&gt;
|   |   |   |   Bandwidth range: 20000000.0 to 100000000.0 step 0.0 Hz&lt;br /&gt;
|   |   |   |   Connection Type: IQ&lt;br /&gt;
|   |   |   |   Uses LO offset: No&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       RX Codec: A&lt;br /&gt;
|   |   |   |   Name: AD9371 Dual ADC&lt;br /&gt;
|   |   |   |   Gain Elements: None&lt;br /&gt;
|   |     _____________________________________________________&lt;br /&gt;
|   |    /&lt;br /&gt;
|   |   |       RX Dboard: B&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       RX Frontend: 0&lt;br /&gt;
|   |   |   |   Name: Magnesium&lt;br /&gt;
|   |   |   |   Antennas: TX/RX, RX2, CAL, LOCAL&lt;br /&gt;
|   |   |   |   Sensors: lo_locked, ad9371_lo_locked, lowband_lo_locked&lt;br /&gt;
|   |   |   |   Freq range: 1.000 to 6000.000 MHz&lt;br /&gt;
|   |   |   |   Gain range all: 0.0 to 75.0 step 0.5 dB&lt;br /&gt;
|   |   |   |   Gain range rfic: 0.0 to 0.0 step 0.0 dB&lt;br /&gt;
|   |   |   |   Gain range dsa: 0.0 to 0.0 step 0.0 dB&lt;br /&gt;
|   |   |   |   Gain range amp: 0.0 to 0.0 step 0.0 dB&lt;br /&gt;
|   |   |   |   Bandwidth range: 20000000.0 to 100000000.0 step 0.0 Hz&lt;br /&gt;
|   |   |   |   Connection Type: IQ&lt;br /&gt;
|   |   |   |   Uses LO offset: No&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       RX Frontend: 1&lt;br /&gt;
|   |   |   |   Name: Magnesium&lt;br /&gt;
|   |   |   |   Antennas: TX/RX, RX2, CAL, LOCAL&lt;br /&gt;
|   |   |   |   Sensors: lo_locked, ad9371_lo_locked, lowband_lo_locked&lt;br /&gt;
|   |   |   |   Freq range: 1.000 to 6000.000 MHz&lt;br /&gt;
|   |   |   |   Gain range all: 0.0 to 75.0 step 0.5 dB&lt;br /&gt;
|   |   |   |   Gain range rfic: 0.0 to 0.0 step 0.0 dB&lt;br /&gt;
|   |   |   |   Gain range dsa: 0.0 to 0.0 step 0.0 dB&lt;br /&gt;
|   |   |   |   Gain range amp: 0.0 to 0.0 step 0.0 dB&lt;br /&gt;
|   |   |   |   Bandwidth range: 20000000.0 to 100000000.0 step 0.0 Hz&lt;br /&gt;
|   |   |   |   Connection Type: IQ&lt;br /&gt;
|   |   |   |   Uses LO offset: No&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       RX Codec: B&lt;br /&gt;
|   |   |   |   Name: AD9371 Dual ADC&lt;br /&gt;
|   |   |   |   Gain Elements: None&lt;br /&gt;
|   |     _____________________________________________________&lt;br /&gt;
|   |    /&lt;br /&gt;
|   |   |       TX Dboard: A&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       TX Frontend: 0&lt;br /&gt;
|   |   |   |   Name: Magnesium&lt;br /&gt;
|   |   |   |   Antennas: TX/RX&lt;br /&gt;
|   |   |   |   Sensors: lo_locked, ad9371_lo_locked, lowband_lo_locked&lt;br /&gt;
|   |   |   |   Freq range: 1.000 to 6000.000 MHz&lt;br /&gt;
|   |   |   |   Gain range all: 0.0 to 65.0 step 0.5 dB&lt;br /&gt;
|   |   |   |   Gain range rfic: 0.0 to 0.0 step 0.0 dB&lt;br /&gt;
|   |   |   |   Gain range dsa: 0.0 to 0.0 step 0.0 dB&lt;br /&gt;
|   |   |   |   Gain range amp: 0.0 to 0.0 step 0.0 dB&lt;br /&gt;
|   |   |   |   Bandwidth range: 20000000.0 to 100000000.0 step 0.0 Hz&lt;br /&gt;
|   |   |   |   Connection Type: IQ&lt;br /&gt;
|   |   |   |   Uses LO offset: No&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       TX Frontend: 1&lt;br /&gt;
|   |   |   |   Name: Magnesium&lt;br /&gt;
|   |   |   |   Antennas: TX/RX&lt;br /&gt;
|   |   |   |   Sensors: lo_locked, ad9371_lo_locked, lowband_lo_locked&lt;br /&gt;
|   |   |   |   Freq range: 1.000 to 6000.000 MHz&lt;br /&gt;
|   |   |   |   Gain range all: 0.0 to 65.0 step 0.5 dB&lt;br /&gt;
|   |   |   |   Gain range rfic: 0.0 to 0.0 step 0.0 dB&lt;br /&gt;
|   |   |   |   Gain range dsa: 0.0 to 0.0 step 0.0 dB&lt;br /&gt;
|   |   |   |   Gain range amp: 0.0 to 0.0 step 0.0 dB&lt;br /&gt;
|   |   |   |   Bandwidth range: 20000000.0 to 100000000.0 step 0.0 Hz&lt;br /&gt;
|   |   |   |   Connection Type: IQ&lt;br /&gt;
|   |   |   |   Uses LO offset: No&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       TX Codec: A&lt;br /&gt;
|   |   |   |   Name: AD9371 Dual DAC&lt;br /&gt;
|   |   |   |   Gain Elements: None&lt;br /&gt;
|   |     _____________________________________________________&lt;br /&gt;
|   |    /&lt;br /&gt;
|   |   |       TX Dboard: B&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       TX Frontend: 0&lt;br /&gt;
|   |   |   |   Name: Magnesium&lt;br /&gt;
|   |   |   |   Antennas: TX/RX&lt;br /&gt;
|   |   |   |   Sensors: lo_locked, ad9371_lo_locked, lowband_lo_locked&lt;br /&gt;
|   |   |   |   Freq range: 1.000 to 6000.000 MHz&lt;br /&gt;
|   |   |   |   Gain range all: 0.0 to 65.0 step 0.5 dB&lt;br /&gt;
|   |   |   |   Gain range rfic: 0.0 to 0.0 step 0.0 dB&lt;br /&gt;
|   |   |   |   Gain range dsa: 0.0 to 0.0 step 0.0 dB&lt;br /&gt;
|   |   |   |   Gain range amp: 0.0 to 0.0 step 0.0 dB&lt;br /&gt;
|   |   |   |   Bandwidth range: 20000000.0 to 100000000.0 step 0.0 Hz&lt;br /&gt;
|   |   |   |   Connection Type: IQ&lt;br /&gt;
|   |   |   |   Uses LO offset: No&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       TX Frontend: 1&lt;br /&gt;
|   |   |   |   Name: Magnesium&lt;br /&gt;
|   |   |   |   Antennas: TX/RX&lt;br /&gt;
|   |   |   |   Sensors: lo_locked, ad9371_lo_locked, lowband_lo_locked&lt;br /&gt;
|   |   |   |   Freq range: 1.000 to 6000.000 MHz&lt;br /&gt;
|   |   |   |   Gain range all: 0.0 to 65.0 step 0.5 dB&lt;br /&gt;
|   |   |   |   Gain range rfic: 0.0 to 0.0 step 0.0 dB&lt;br /&gt;
|   |   |   |   Gain range dsa: 0.0 to 0.0 step 0.0 dB&lt;br /&gt;
|   |   |   |   Gain range amp: 0.0 to 0.0 step 0.0 dB&lt;br /&gt;
|   |   |   |   Bandwidth range: 20000000.0 to 100000000.0 step 0.0 Hz&lt;br /&gt;
|   |   |   |   Connection Type: IQ&lt;br /&gt;
|   |   |   |   Uses LO offset: No&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       TX Codec: B&lt;br /&gt;
|   |   |   |   Name: AD9371 Dual DAC&lt;br /&gt;
|   |   |   |   Gain Elements: None&lt;br /&gt;
|   |     _____________________________________________________&lt;br /&gt;
|   |    /&lt;br /&gt;
|   |   |       RFNoC blocks on this device:&lt;br /&gt;
|   |   |   &lt;br /&gt;
|   |   |   * DmaFIFO_0&lt;br /&gt;
|   |   |   * Radio_0&lt;br /&gt;
|   |   |   * Radio_1&lt;br /&gt;
|   |   |   * DDC_0&lt;br /&gt;
|   |   |   * DDC_1&lt;br /&gt;
|   |   |   * DUC_0&lt;br /&gt;
|   |   |   * DUC_1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====N320====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$ uhd_usrp_probe &lt;br /&gt;
[INFO] [UHD] linux; GNU C++ version 7.3.0; Boost_106600; UHD_3.14.0.0-0-g6875d061&lt;br /&gt;
[INFO] [MPMD] Initializing 1 device(s) in parallel with args: mgmt_addr=127.0.0.1,type=n3xx,product=n320,serial=3181FFA,claimed=False&lt;br /&gt;
[INFO] [MPM.main] Launching USRP/MPM, version: 3.14.0.0-g6875d061&lt;br /&gt;
[INFO] [MPM.main] Spawning RPC process...&lt;br /&gt;
[INFO] [MPM.PeriphManager] Device serial number: 3181FFA&lt;br /&gt;
[INFO] [MPM.Rhodium-0] Successfully loaded all peripherals!&lt;br /&gt;
[INFO] [MPM.Rhodium-1] Successfully loaded all peripherals!&lt;br /&gt;
[INFO] [MPM.PeriphManager] Initialized 2 daughterboard(s).&lt;br /&gt;
[INFO] [MPM.PeriphManager] No QSFP board detected: Assuming it is disabled in the device tree overlay (e.g., HG, XG images).&lt;br /&gt;
[INFO] [MPM.PeriphManager] init() called with device args `time_source=internal,clock_source=internal'.&lt;br /&gt;
[INFO] [MPM.Rhodium-0] init() called with args `time_source=internal,clock_source=internal'&lt;br /&gt;
[INFO] [MPM.Rhodium-1] init() called with args `time_source=internal,clock_source=internal'&lt;br /&gt;
[INFO] [MPM.Rhodium-0.init.LMK04828] LMK initialized and locked!&lt;br /&gt;
[INFO] [MPM.Rhodium-1.init.LMK04828] LMK initialized and locked!&lt;br /&gt;
[INFO] [MPM.Rhodium-1.DAC37J82] DAC PLL Locked!&lt;br /&gt;
[INFO] [MPM.Rhodium-1.AD9695] ADC PLL Locked!&lt;br /&gt;
[INFO] [MPM.Rhodium-1.init] JESD204B Link Initialization &amp;amp; Training Complete&lt;br /&gt;
[INFO] [MPM.Rhodium-0.DAC37J82] DAC PLL Locked!&lt;br /&gt;
[INFO] [MPM.Rhodium-0.AD9695] ADC PLL Locked!&lt;br /&gt;
[INFO] [MPM.Rhodium-0.init] JESD204B Link Initialization &amp;amp; Training Complete&lt;br /&gt;
[INFO] [MPM.RPCServer] RPC server ready!&lt;br /&gt;
[INFO] [MPM.RPCServer] Spawning watchdog task...&lt;br /&gt;
[INFO] [MPM.PeriphManager] init() called with device args `mgmt_addr=127.0.0.1,clock_source=internal,time_source=internal,product=n320'.&lt;br /&gt;
[INFO] [MPM.Rhodium-0] init() called with args `mgmt_addr=127.0.0.1,clock_source=internal,time_source=internal,product=n320'&lt;br /&gt;
[INFO] [MPM.Rhodium-1] init() called with args `mgmt_addr=127.0.0.1,clock_source=internal,time_source=internal,product=n320'&lt;br /&gt;
[INFO] [0/Replay_0] Initializing block control (NOC ID: 0x4E91A00000000004)&lt;br /&gt;
[INFO] [0/Radio_0] Initializing block control (NOC ID: 0x12AD100000000320)&lt;br /&gt;
[INFO] [0/Radio_1] Initializing block control (NOC ID: 0x12AD100000000320)&lt;br /&gt;
[INFO] [0/DDC_0] Initializing block control (NOC ID: 0xDDC0000000000001)&lt;br /&gt;
[INFO] [0/DDC_1] Initializing block control (NOC ID: 0xDDC0000000000001)&lt;br /&gt;
[INFO] [0/DUC_0] Initializing block control (NOC ID: 0xD0C0000000000000)&lt;br /&gt;
[INFO] [0/DUC_1] Initializing block control (NOC ID: 0xD0C0000000000000)&lt;br /&gt;
[INFO] [0/FIFO_0] Initializing block control (NOC ID: 0xF1F0000000000000)&lt;br /&gt;
[INFO] [0/FIFO_1] Initializing block control (NOC ID: 0xF1F0000000000000)&lt;br /&gt;
  _____________________________________________________&lt;br /&gt;
 /&lt;br /&gt;
|       Device: N300-Series Device&lt;br /&gt;
|     _____________________________________________________&lt;br /&gt;
|    /&lt;br /&gt;
|   |       Mboard: ni-n3xx-3181FFA&lt;br /&gt;
|   |   eeprom_version: 2&lt;br /&gt;
|   |   mpm_version: 3.14.0.0-g6875d061&lt;br /&gt;
|   |   pid: 16962&lt;br /&gt;
|   |   product: n320&lt;br /&gt;
|   |   rev: 6&lt;br /&gt;
|   |   rpc_connection: local&lt;br /&gt;
|   |   serial: 3181FFA&lt;br /&gt;
|   |   type: n3xx&lt;br /&gt;
|   |   MPM Version: 1.2&lt;br /&gt;
|   |   FPGA Version: 5.3&lt;br /&gt;
|   |   FPGA git hash: 3de8954.clean&lt;br /&gt;
|   |   RFNoC capable: Yes&lt;br /&gt;
|   |   &lt;br /&gt;
|   |   Time sources:  internal, external, gpsdo, sfp0&lt;br /&gt;
|   |   Clock sources: external, internal, gpsdo&lt;br /&gt;
|   |   Sensors: gps_tpv, temp, gps_sky, fan, gps_time, gps_locked, ref_locked, gps_gpgga&lt;br /&gt;
|   |     _____________________________________________________&lt;br /&gt;
|   |    /&lt;br /&gt;
|   |   |       RX Dboard: A&lt;br /&gt;
|   |   |   ID: Unknown (0x0152)&lt;br /&gt;
|   |   |   Serial: 3175A79&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       RX Frontend: 0&lt;br /&gt;
|   |   |   |   Name: Rhodium&lt;br /&gt;
|   |   |   |   Antennas: TX/RX, RX2, CAL, TERM&lt;br /&gt;
|   |   |   |   Sensors: lo_locked&lt;br /&gt;
|   |   |   |   Freq range: 1.000 to 6000.000 MHz&lt;br /&gt;
|   |   |   |   Gain range all: 0.0 to 60.0 step 1.0 dB&lt;br /&gt;
|   |   |   |   Bandwidth range: 250000000.0 to 250000000.0 step 0.0 Hz&lt;br /&gt;
|   |   |   |   Connection Type: &lt;br /&gt;
|   |   |   |   Uses LO offset: No&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       RX Codec: A&lt;br /&gt;
|   |   |   |   Name: ad9695-625&lt;br /&gt;
|   |   |   |   Gain Elements: None&lt;br /&gt;
|   |     _____________________________________________________&lt;br /&gt;
|   |    /&lt;br /&gt;
|   |   |       RX Dboard: B&lt;br /&gt;
|   |   |   ID: Unknown (0x0152)&lt;br /&gt;
|   |   |   Serial: 3175A67&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       RX Frontend: 0&lt;br /&gt;
|   |   |   |   Name: Rhodium&lt;br /&gt;
|   |   |   |   Antennas: TX/RX, RX2, CAL, TERM&lt;br /&gt;
|   |   |   |   Sensors: lo_locked&lt;br /&gt;
|   |   |   |   Freq range: 1.000 to 6000.000 MHz&lt;br /&gt;
|   |   |   |   Gain range all: 0.0 to 60.0 step 1.0 dB&lt;br /&gt;
|   |   |   |   Bandwidth range: 250000000.0 to 250000000.0 step 0.0 Hz&lt;br /&gt;
|   |   |   |   Connection Type: &lt;br /&gt;
|   |   |   |   Uses LO offset: No&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       RX Codec: B&lt;br /&gt;
|   |   |   |   Name: ad9695-625&lt;br /&gt;
|   |   |   |   Gain Elements: None&lt;br /&gt;
|   |     _____________________________________________________&lt;br /&gt;
|   |    /&lt;br /&gt;
|   |   |       TX Dboard: A&lt;br /&gt;
|   |   |   ID: Unknown (0x0152)&lt;br /&gt;
|   |   |   Serial: 3175A79&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       TX Frontend: 0&lt;br /&gt;
|   |   |   |   Name: Rhodium&lt;br /&gt;
|   |   |   |   Antennas: TX/RX, CAL, TERM&lt;br /&gt;
|   |   |   |   Sensors: lo_locked&lt;br /&gt;
|   |   |   |   Freq range: 1.000 to 6000.000 MHz&lt;br /&gt;
|   |   |   |   Gain range all: 0.0 to 60.0 step 1.0 dB&lt;br /&gt;
|   |   |   |   Bandwidth range: 250000000.0 to 250000000.0 step 0.0 Hz&lt;br /&gt;
|   |   |   |   Connection Type: &lt;br /&gt;
|   |   |   |   Uses LO offset: No&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       TX Codec: A&lt;br /&gt;
|   |   |   |   Name: dac37j82&lt;br /&gt;
|   |   |   |   Gain Elements: None&lt;br /&gt;
|   |     _____________________________________________________&lt;br /&gt;
|   |    /&lt;br /&gt;
|   |   |       TX Dboard: B&lt;br /&gt;
|   |   |   ID: Unknown (0x0152)&lt;br /&gt;
|   |   |   Serial: 3175A67&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       TX Frontend: 0&lt;br /&gt;
|   |   |   |   Name: Rhodium&lt;br /&gt;
|   |   |   |   Antennas: TX/RX, CAL, TERM&lt;br /&gt;
|   |   |   |   Sensors: lo_locked&lt;br /&gt;
|   |   |   |   Freq range: 1.000 to 6000.000 MHz&lt;br /&gt;
|   |   |   |   Gain range all: 0.0 to 60.0 step 1.0 dB&lt;br /&gt;
|   |   |   |   Bandwidth range: 250000000.0 to 250000000.0 step 0.0 Hz&lt;br /&gt;
|   |   |   |   Connection Type: &lt;br /&gt;
|   |   |   |   Uses LO offset: No&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       TX Codec: B&lt;br /&gt;
|   |   |   |   Name: dac37j82&lt;br /&gt;
|   |   |   |   Gain Elements: None&lt;br /&gt;
|   |     _____________________________________________________&lt;br /&gt;
|   |    /&lt;br /&gt;
|   |   |       RFNoC blocks on this device:&lt;br /&gt;
|   |   |   &lt;br /&gt;
|   |   |   * Replay_0&lt;br /&gt;
|   |   |   * Radio_0&lt;br /&gt;
|   |   |   * Radio_1&lt;br /&gt;
|   |   |   * DDC_0&lt;br /&gt;
|   |   |   * DDC_1&lt;br /&gt;
|   |   |   * DUC_0&lt;br /&gt;
|   |   |   * DUC_1&lt;br /&gt;
|   |   |   * FIFO_0&lt;br /&gt;
|   |   |   * FIFO_1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====N321====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ uhd_usrp_probe&lt;br /&gt;
[INFO] [UHD] linux; GNU C++ version 7.3.1 20180712 (Red Hat 7.3.1-6); Boost_106400; UHD_3.14.0.0-0-g6875d061&lt;br /&gt;
[INFO] [MPMD] Initializing 1 device(s) in parallel with args: mgmt_addr=192.168.20.2,type=n3xx,product=n320,serial=3166646,claimed=False,addr=192.168.20.2&lt;br /&gt;
[INFO] [MPM.PeriphManager] init() called with device args `time_source=internal,clock_source=internal,product=n320,mgmt_addr=192.168.20.2'.&lt;br /&gt;
[INFO] [MPM.Rhodium-0] init() called with args `time_source=internal,clock_source=internal,product=n320,mgmt_addr=192.168.20.2'&lt;br /&gt;
[INFO] [MPM.Rhodium-1] init() called with args `time_source=internal,clock_source=internal,product=n320,mgmt_addr=192.168.20.2'&lt;br /&gt;
[INFO] [0/Replay_0] Initializing block control (NOC ID: 0x4E91A00000000004)&lt;br /&gt;
[INFO] [0/Radio_0] Initializing block control (NOC ID: 0x12AD100000000320)&lt;br /&gt;
[INFO] [0/Radio_1] Initializing block control (NOC ID: 0x12AD100000000320)&lt;br /&gt;
[INFO] [0/DDC_0] Initializing block control (NOC ID: 0xDDC0000000000001)&lt;br /&gt;
[INFO] [0/DDC_1] Initializing block control (NOC ID: 0xDDC0000000000001)&lt;br /&gt;
[INFO] [0/DUC_0] Initializing block control (NOC ID: 0xD0C0000000000000)&lt;br /&gt;
[INFO] [0/DUC_1] Initializing block control (NOC ID: 0xD0C0000000000000)&lt;br /&gt;
[INFO] [0/FIFO_0] Initializing block control (NOC ID: 0xF1F0000000000000)&lt;br /&gt;
[INFO] [0/FIFO_1] Initializing block control (NOC ID: 0xF1F0000000000000)&lt;br /&gt;
  _____________________________________________________&lt;br /&gt;
 /&lt;br /&gt;
|       Device: N300-Series Device&lt;br /&gt;
|     _____________________________________________________&lt;br /&gt;
|    /&lt;br /&gt;
|   |       Mboard: ni-n3xx-3166646&lt;br /&gt;
|   |   eeprom_version: 2&lt;br /&gt;
|   |   mpm_version: 3.14.0.0-g6875d061&lt;br /&gt;
|   |   pid: 16962&lt;br /&gt;
|   |   product: n320&lt;br /&gt;
|   |   rev: 6&lt;br /&gt;
|   |   rpc_connection: remote&lt;br /&gt;
|   |   serial: 3166646&lt;br /&gt;
|   |   type: n3xx&lt;br /&gt;
|   |   MPM Version: 1.2&lt;br /&gt;
|   |   FPGA Version: 5.3&lt;br /&gt;
|   |   FPGA git hash: 3de8954.clean&lt;br /&gt;
|   |   RFNoC capable: Yes&lt;br /&gt;
|   |   &lt;br /&gt;
|   |   Time sources:  internal, external, gpsdo, sfp0&lt;br /&gt;
|   |   Clock sources: external, internal, gpsdo&lt;br /&gt;
|   |   Sensors: gps_sky, gps_time, gps_gpgga, gps_locked, fan, gps_tpv, ref_locked, temp&lt;br /&gt;
|   |     _____________________________________________________&lt;br /&gt;
|   |    /&lt;br /&gt;
|   |   |       RX Dboard: B&lt;br /&gt;
|   |   |   ID: Unknown (0x0152)&lt;br /&gt;
|   |   |   Serial: 316D814&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       RX Frontend: 0&lt;br /&gt;
|   |   |   |   Name: Rhodium&lt;br /&gt;
|   |   |   |   Antennas: TX/RX, RX2, CAL, TERM&lt;br /&gt;
|   |   |   |   Sensors: lo_locked&lt;br /&gt;
|   |   |   |   Freq range: 1.000 to 6000.000 MHz&lt;br /&gt;
|   |   |   |   Gain range all: 0.0 to 60.0 step 1.0 dB&lt;br /&gt;
|   |   |   |   Bandwidth range: 250000000.0 to 250000000.0 step 0.0 Hz&lt;br /&gt;
|   |   |   |   Connection Type: &lt;br /&gt;
|   |   |   |   Uses LO offset: No&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       RX Codec: B&lt;br /&gt;
|   |   |   |   Name: ad9695-625&lt;br /&gt;
|   |   |   |   Gain Elements: None&lt;br /&gt;
|   |     _____________________________________________________&lt;br /&gt;
|   |    /&lt;br /&gt;
|   |   |       RX Dboard: A&lt;br /&gt;
|   |   |   ID: Unknown (0x0152)&lt;br /&gt;
|   |   |   Serial: 316D810&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       RX Frontend: 0&lt;br /&gt;
|   |   |   |   Name: Rhodium&lt;br /&gt;
|   |   |   |   Antennas: TX/RX, RX2, CAL, TERM&lt;br /&gt;
|   |   |   |   Sensors: lo_locked&lt;br /&gt;
|   |   |   |   Freq range: 1.000 to 6000.000 MHz&lt;br /&gt;
|   |   |   |   Gain range all: 0.0 to 60.0 step 1.0 dB&lt;br /&gt;
|   |   |   |   Bandwidth range: 250000000.0 to 250000000.0 step 0.0 Hz&lt;br /&gt;
|   |   |   |   Connection Type: &lt;br /&gt;
|   |   |   |   Uses LO offset: No&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       RX Codec: A&lt;br /&gt;
|   |   |   |   Name: ad9695-625&lt;br /&gt;
|   |   |   |   Gain Elements: None&lt;br /&gt;
|   |     _____________________________________________________&lt;br /&gt;
|   |    /&lt;br /&gt;
|   |   |       TX Dboard: B&lt;br /&gt;
|   |   |   ID: Unknown (0x0152)&lt;br /&gt;
|   |   |   Serial: 316D814&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       TX Frontend: 0&lt;br /&gt;
|   |   |   |   Name: Rhodium&lt;br /&gt;
|   |   |   |   Antennas: TX/RX, CAL, TERM&lt;br /&gt;
|   |   |   |   Sensors: lo_locked&lt;br /&gt;
|   |   |   |   Freq range: 1.000 to 6000.000 MHz&lt;br /&gt;
|   |   |   |   Gain range all: 0.0 to 60.0 step 1.0 dB&lt;br /&gt;
|   |   |   |   Bandwidth range: 250000000.0 to 250000000.0 step 0.0 Hz&lt;br /&gt;
|   |   |   |   Connection Type: &lt;br /&gt;
|   |   |   |   Uses LO offset: No&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       TX Codec: B&lt;br /&gt;
|   |   |   |   Name: dac37j82&lt;br /&gt;
|   |   |   |   Gain Elements: None&lt;br /&gt;
|   |     _____________________________________________________&lt;br /&gt;
|   |    /&lt;br /&gt;
|   |   |       TX Dboard: A&lt;br /&gt;
|   |   |   ID: Unknown (0x0152)&lt;br /&gt;
|   |   |   Serial: 316D810&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       TX Frontend: 0&lt;br /&gt;
|   |   |   |   Name: Rhodium&lt;br /&gt;
|   |   |   |   Antennas: TX/RX, CAL, TERM&lt;br /&gt;
|   |   |   |   Sensors: lo_locked&lt;br /&gt;
|   |   |   |   Freq range: 1.000 to 6000.000 MHz&lt;br /&gt;
|   |   |   |   Gain range all: 0.0 to 60.0 step 1.0 dB&lt;br /&gt;
|   |   |   |   Bandwidth range: 250000000.0 to 250000000.0 step 0.0 Hz&lt;br /&gt;
|   |   |   |   Connection Type: &lt;br /&gt;
|   |   |   |   Uses LO offset: No&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       TX Codec: A&lt;br /&gt;
|   |   |   |   Name: dac37j82&lt;br /&gt;
|   |   |   |   Gain Elements: None&lt;br /&gt;
|   |     _____________________________________________________&lt;br /&gt;
|   |    /&lt;br /&gt;
|   |   |       RFNoC blocks on this device:&lt;br /&gt;
|   |   |   &lt;br /&gt;
|   |   |   * Replay_0&lt;br /&gt;
|   |   |   * Radio_0&lt;br /&gt;
|   |   |   * Radio_1&lt;br /&gt;
|   |   |   * DDC_0&lt;br /&gt;
|   |   |   * DDC_1&lt;br /&gt;
|   |   |   * DUC_0&lt;br /&gt;
|   |   |   * DUC_1&lt;br /&gt;
|   |   |   * FIFO_0&lt;br /&gt;
|   |   |   * FIFO_1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see warnings such as:&lt;br /&gt;
&lt;br /&gt;
    [WARNING] [UDP] The recv buffer could not be resized sufficiently.&lt;br /&gt;
&lt;br /&gt;
You need to resize the socket buffers for your network interface card:&lt;br /&gt;
&lt;br /&gt;
    sudo sysctl -w net.core.rmem_max=288000&lt;br /&gt;
    sudo sysctl -w net.core.wmem_max=288000&lt;br /&gt;
    sudo sysctl -w net.core.rmem_max=33554432&lt;br /&gt;
&lt;br /&gt;
===ASCII Art Example===&lt;br /&gt;
The UHD driver includes several example programs, which may serve as test programs or the basis for your application program. The source code can be obtained from the UHD repository on github at: https://github.com/EttusResearch/uhd/tree/master/host/examples&lt;br /&gt;
&lt;br /&gt;
You can quickly verify the operation of your USRP N3xx by running the &amp;lt;code&amp;gt;rx_ascii_art_dft&amp;lt;/code&amp;gt; UHD example program. &lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;rx_ascii_art_dft&amp;lt;/code&amp;gt; utility is a simple console ­based, real-time FFT display tool. It is not graphical in nature, so it can be easily run over an SSH connection within a terminal window, and does not need any graphical capability, such as X Windows, to be installed. It can also be run over a serial console connection, although this is not recommended, as the formatting may not render correctly.&lt;br /&gt;
&lt;br /&gt;
You can run a simple test of the N3xx USRP by connecting an antenna and observing the spectrum of a commercial FM radio station in real-time, following the steps below:&lt;br /&gt;
&lt;br /&gt;
1. Attach an antenna to the &amp;lt;code&amp;gt;Ch0/RX2&amp;lt;/code&amp;gt;­ antenna port of the N3xx.&lt;br /&gt;
&lt;br /&gt;
2. From your host computer, run the command:&lt;br /&gt;
&lt;br /&gt;
'''N300/N310'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ /usr/local/lib/uhd/examples/rx_ascii_art_dft --args &amp;quot;master_clock_rate=125e6,mgmt_addr=192.168.1.151,addr=192.168.10.2&amp;quot; --freq 98.5e6 --rate 2.5e6 --gain 50 --ref-lvl=&amp;quot;-50&amp;quot; --dyn-rng 90 --ant &amp;quot;RX2&amp;quot; --subdev &amp;quot;A:0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N320/N321'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ /usr/local/lib/uhd/examples/rx_ascii_art_dft --args &amp;quot;master_clock_rate=250e6,mgmt_addr=192.168.1.151,addr=192.168.10.2&amp;quot; --freq 98.5e6 --rate 2.5e6 --gain 50 --ref-lvl=&amp;quot;-50&amp;quot; --dyn-rng 90 --ant &amp;quot;RX2&amp;quot; --subdev &amp;quot;A:0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: Modify the command­ line argument &amp;lt;code&amp;gt;freq&amp;lt;/code&amp;gt; ​above to specify a tuning frequency for a strong local FM radio station. You will also need to update the IP Address to match your device IP.&lt;br /&gt;
&lt;br /&gt;
3. You should see a real-time FFT display of 2.5 MHz of spectrum, centered at the specified tuning frequency.&lt;br /&gt;
&lt;br /&gt;
4. Type &amp;quot;&amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt;&amp;quot; or &amp;lt;code&amp;gt;Ctrl­-C&amp;lt;/code&amp;gt; to stop the program and to return to the Linux command line.&lt;br /&gt;
&lt;br /&gt;
5. You can run with the &amp;lt;code&amp;gt;​­­--help&amp;lt;/code&amp;gt; ​argument to see a description of all available command-line options.&lt;br /&gt;
&lt;br /&gt;
Example Output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ /usr/local/lib/uhd/examples/rx_ascii_art_dft --args &amp;quot;master_clock_rate=125e6,mgmt_addr=192.168.1.151,addr=192.168.10.2&amp;quot; --freq 98.5e6 --rate 2.5e6 --gain 50 --ref-lvl=&amp;quot;-50&amp;quot; --dyn-rng 90 --ant &amp;quot;RX2&amp;quot; --subdev &amp;quot;A:0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Creating the usrp device with: master_clock_rate=125e6,mgmt_addr=192.168.1.151,addr=192.168.10.2...&lt;br /&gt;
[INFO] [UHD] linux; GNU C++ version 5.4.0 20160609; Boost_105800; UHD_3.11.1.HEAD-0-gad6b0935&lt;br /&gt;
[INFO] [MPMD] Initializing 1 device(s) in parallel with args: mgmt_addr=192.168.1.151,type=n3xx,product=n310,serial=313ABDA,claimed=False,master_clock_rate=125e6,addr=192.168.10.2&lt;br /&gt;
[INFO] [MPM.main] Launching USRP/MPM, version: 3.11.1.0-gunknown&lt;br /&gt;
[INFO] [MPM.main] Spawning RPC process...&lt;br /&gt;
[INFO] [MPM.PeriphManager] Device serial number: 313ABDA&lt;br /&gt;
[INFO] [MPM.PeriphManager] Found 2 daughterboard(s).&lt;br /&gt;
[INFO] [MPM.RPCServer] RPC server ready!&lt;br /&gt;
[INFO] [MPM.RPCServer] Spawning watchdog task...&lt;br /&gt;
[INFO] [MPM.PeriphManager] init() called with device args `mgmt_addr=192.168.1.151,product=n310,master_clock_rate=125e6'.&lt;br /&gt;
[INFO] [0/DmaFIFO_0] Initializing block control (NOC ID: 0xF1F0D00000000004)&lt;br /&gt;
[INFO] [0/DmaFIFO_0] BIST passed (Throughput: 1336 MB/s)&lt;br /&gt;
[INFO] [0/DmaFIFO_0] BIST passed (Throughput: 1338 MB/s)&lt;br /&gt;
[INFO] [0/DmaFIFO_0] BIST passed (Throughput: 1346 MB/s)&lt;br /&gt;
[INFO] [0/DmaFIFO_0] BIST passed (Throughput: 1350 MB/s)&lt;br /&gt;
[INFO] [0/Radio_0] Initializing block control (NOC ID: 0x12AD100000000310)&lt;br /&gt;
[INFO] [0/Radio_1] Initializing block control (NOC ID: 0x12AD100000000310)&lt;br /&gt;
[INFO] [0/Radio_2] Initializing block control (NOC ID: 0x12AD100000000310)&lt;br /&gt;
[INFO] [0/Radio_3] Initializing block control (NOC ID: 0x12AD100000000310)&lt;br /&gt;
[INFO] [0/DDC_0] Initializing block control (NOC ID: 0xDDC0000000000001)&lt;br /&gt;
[INFO] [0/DDC_1] Initializing block control (NOC ID: 0xDDC0000000000001)&lt;br /&gt;
[INFO] [0/DDC_2] Initializing block control (NOC ID: 0xDDC0000000000001)&lt;br /&gt;
[INFO] [0/DDC_3] Initializing block control (NOC ID: 0xDDC0000000000001)&lt;br /&gt;
[INFO] [0/DUC_0] Initializing block control (NOC ID: 0xD0C0000000000000)&lt;br /&gt;
[INFO] [0/DUC_1] Initializing block control (NOC ID: 0xD0C0000000000000)&lt;br /&gt;
[INFO] [0/DUC_2] Initializing block control (NOC ID: 0xD0C0000000000000)&lt;br /&gt;
[INFO] [0/DUC_3] Initializing block control (NOC ID: 0xD0C0000000000000)&lt;br /&gt;
Using Device: Single USRP:&lt;br /&gt;
  Device: N300-Series Device&lt;br /&gt;
  Mboard 0: ni-n3xx-313ABDA&lt;br /&gt;
  RX Channel: 0&lt;br /&gt;
    RX DSP: 0&lt;br /&gt;
    RX Dboard: A&lt;br /&gt;
    RX Subdev: Magnesium&lt;br /&gt;
  TX Channel: 0&lt;br /&gt;
    TX DSP: 0&lt;br /&gt;
    TX Dboard: A&lt;br /&gt;
    TX Subdev: Magnesium&lt;br /&gt;
  TX Channel: 1&lt;br /&gt;
    TX DSP: 0&lt;br /&gt;
    TX Dboard: B&lt;br /&gt;
    TX Subdev: Magnesium&lt;br /&gt;
  TX Channel: 2&lt;br /&gt;
    TX DSP: 0&lt;br /&gt;
    TX Dboard: C&lt;br /&gt;
    TX Subdev: Magnesium&lt;br /&gt;
  TX Channel: 3&lt;br /&gt;
    TX DSP: 0&lt;br /&gt;
    TX Dboard: D&lt;br /&gt;
    TX Subdev: Magnesium&lt;br /&gt;
&lt;br /&gt;
Setting RX Rate: 2.500000 Msps...&lt;br /&gt;
Actual RX Rate: 2.500000 Msps...&lt;br /&gt;
&lt;br /&gt;
Setting RX Freq: 98.500000 MHz...&lt;br /&gt;
Actual RX Freq: 98.500000 MHz...&lt;br /&gt;
&lt;br /&gt;
Setting RX Gain: 50.000000 dB...&lt;br /&gt;
Actual RX Gain: 50.000000 dB...&lt;br /&gt;
&lt;br /&gt;
Checking RX: all_los: locked ...&lt;br /&gt;
&lt;br /&gt;
Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Benchmarking your system===&lt;br /&gt;
Included with the UHD driver example programs is a utility, &amp;lt;code&amp;gt;benchmark_rate&amp;lt;/code&amp;gt; to benchmark the transport link of the system. &lt;br /&gt;
&lt;br /&gt;
A system's maximum performance is dependent upon many factors. &amp;lt;code&amp;gt;benchmark_rate&amp;lt;/code&amp;gt; will exercise the transport link and CPU of the system. &lt;br /&gt;
&lt;br /&gt;
====1 Gb Interface====&lt;br /&gt;
NOTE: This example requires the &amp;lt;code&amp;gt;HG&amp;lt;/code&amp;gt; FPGA image to be loaded.&lt;br /&gt;
&lt;br /&gt;
'''N300/N310'''&lt;br /&gt;
&lt;br /&gt;
This example will test one full-duplex stream using &amp;quot;RF0/A:0&amp;quot;, at a rate of 3.84 MS/s, for 60 seconds:&lt;br /&gt;
&lt;br /&gt;
    /usr/local/lib/uhd/examples/benchmark_rate  \&lt;br /&gt;
    --args &amp;quot;type=n3xx,mgmt_addr=192.168.1.151,addr=192.168.10.2,master_clock_rate=122.88e6&amp;quot; \&lt;br /&gt;
    --duration 60 \&lt;br /&gt;
    --channels &amp;quot;0&amp;quot; \&lt;br /&gt;
    --rx_rate 3.84e6 \&lt;br /&gt;
    --rx_subdev &amp;quot;A:0&amp;quot; \&lt;br /&gt;
    --tx_rate 3.84e6 \&lt;br /&gt;
    --tx_subdev &amp;quot;A:0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''N310'''&lt;br /&gt;
&lt;br /&gt;
This example will test four full-duplex streams at 1.25 MS/s, for 60 seconds:&lt;br /&gt;
&lt;br /&gt;
    /usr/local/lib/uhd/examples/benchmark_rate  \&lt;br /&gt;
    --args &amp;quot;type=n3xx,mgmt_addr=192.168.1.151,addr=192.168.10.2,master_clock_rate=125e6&amp;quot; \&lt;br /&gt;
    --duration 60 \&lt;br /&gt;
    --channels &amp;quot;0,1,2,3&amp;quot; \&lt;br /&gt;
    --rx_rate 1.25e6 \&lt;br /&gt;
    --rx_subdev &amp;quot;A:0 A:1 B:0 B:1&amp;quot; \&lt;br /&gt;
    --tx_rate 1.25e6 \&lt;br /&gt;
    --tx_subdev &amp;quot;A:0 A:1 B:0 B:1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''N320/N321'''&lt;br /&gt;
&lt;br /&gt;
This example will test one full-duplex stream using &amp;quot;RF0/A:0&amp;quot;, at a rate of 3.84 MS/s, for 60 seconds:&lt;br /&gt;
&lt;br /&gt;
    /usr/local/lib/uhd/examples/benchmark_rate  \&lt;br /&gt;
    --args &amp;quot;type=n3xx,mgmt_addr=192.168.1.151,addr=192.168.10.2,master_clock_rate=245.76e6&amp;quot; \&lt;br /&gt;
    --duration 60 \&lt;br /&gt;
    --channels &amp;quot;0&amp;quot; \&lt;br /&gt;
    --rx_rate 3.84e6 \&lt;br /&gt;
    --rx_subdev &amp;quot;A:0&amp;quot; \&lt;br /&gt;
    --tx_rate 3.84e6 \&lt;br /&gt;
    --tx_subdev &amp;quot;A:0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
When streaming samples over a 1 Gb transport link, the maximum accumulative rate for all channels is 25 MS/s with a &amp;lt;code&amp;gt;sc16&amp;lt;/code&amp;gt; OTW format. To achieve higher streaming rates, it is recommended to use the 10 Gb interfaces.&lt;br /&gt;
&lt;br /&gt;
====10 Gb Interface SFP 1====&lt;br /&gt;
NOTE: This example will work with either the &amp;lt;code&amp;gt;HG&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;XG&amp;lt;/code&amp;gt; FPGA image.&lt;br /&gt;
&lt;br /&gt;
'''N300/N310'''&lt;br /&gt;
&lt;br /&gt;
This example will test one full-duplex stream using &amp;quot;RF0/A:0&amp;quot;, at a rate of 31.25 MS/s, for 60 seconds:&lt;br /&gt;
&lt;br /&gt;
    /usr/local/lib/uhd/examples/benchmark_rate  \&lt;br /&gt;
    --args &amp;quot;type=n3xx,mgmt_addr=192.168.1.151,addr=192.168.20.2,master_clock_rate=125e6&amp;quot; \&lt;br /&gt;
    --duration 60 \&lt;br /&gt;
    --channels &amp;quot;0&amp;quot; \&lt;br /&gt;
    --rx_rate 31.25e6 \&lt;br /&gt;
    --rx_subdev &amp;quot;A:0&amp;quot; \&lt;br /&gt;
    --tx_rate 31.25e6 \&lt;br /&gt;
    --tx_subdev &amp;quot;A:0&amp;quot;  &lt;br /&gt;
&lt;br /&gt;
'''N320/N321'''&lt;br /&gt;
&lt;br /&gt;
This example will test one full-duplex stream using &amp;quot;RF0/A:0&amp;quot;, at a rate of 31.25 MS/s, for 60 seconds:&lt;br /&gt;
&lt;br /&gt;
    /usr/local/lib/uhd/examples/benchmark_rate  \&lt;br /&gt;
    --args &amp;quot;type=n3xx,mgmt_addr=192.168.1.151,addr=192.168.20.2,master_clock_rate=250e6&amp;quot; \&lt;br /&gt;
    --duration 60 \&lt;br /&gt;
    --channels &amp;quot;0&amp;quot; \&lt;br /&gt;
    --rx_rate 31.25e6 \&lt;br /&gt;
    --rx_subdev &amp;quot;A:0&amp;quot; \&lt;br /&gt;
    --tx_rate 31.25e6 \&lt;br /&gt;
    --tx_subdev &amp;quot;A:0&amp;quot;  &lt;br /&gt;
&lt;br /&gt;
'''N310'''&lt;br /&gt;
&lt;br /&gt;
This example will test four full-duplex streams at 30.72 MS/s, for 60 seconds:&lt;br /&gt;
&lt;br /&gt;
    /usr/local/lib/uhd/examples/benchmark_rate  \&lt;br /&gt;
    --args &amp;quot;type=n3xx,mgmt_addr=192.168.1.151,addr=192.168.20.2,master_clock_rate=122.88e6&amp;quot; \&lt;br /&gt;
    --duration 60 \&lt;br /&gt;
    --channels &amp;quot;0,1,2,3&amp;quot; \&lt;br /&gt;
    --rx_rate 30.72e6 \&lt;br /&gt;
    --rx_subdev &amp;quot;A:0 A:1 B:0 B:1&amp;quot; \&lt;br /&gt;
    --tx_rate 30.72e6 \&lt;br /&gt;
    --tx_subdev &amp;quot;A:0 A:1 B:0 B:1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''N320/N321'''&lt;br /&gt;
&lt;br /&gt;
This example will test two full-duplex streams at 30.72 MS/s, for 60 seconds:&lt;br /&gt;
&lt;br /&gt;
    /usr/local/lib/uhd/examples/benchmark_rate  \&lt;br /&gt;
    --args &amp;quot;type=n3xx,mgmt_addr=192.168.1.151,addr=192.168.20.2,master_clock_rate=245.76e6&amp;quot; \&lt;br /&gt;
    --duration 60 \&lt;br /&gt;
    --channels &amp;quot;0,1,2,3&amp;quot; \&lt;br /&gt;
    --rx_rate 30.72e6 \&lt;br /&gt;
    --rx_subdev &amp;quot;A:0 B:0&amp;quot; \&lt;br /&gt;
    --tx_rate 30.72e6 \&lt;br /&gt;
    --tx_subdev &amp;quot;A:0 B:0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====Dual 10 Gb Interface====&lt;br /&gt;
NOTE: This example requires the &amp;lt;code&amp;gt;XG&amp;lt;/code&amp;gt; FPGA image to be loaded.&lt;br /&gt;
&lt;br /&gt;
'''N310'''&lt;br /&gt;
&lt;br /&gt;
This example will test four full-duplex streams at 62.5 MS/s, for 60 seconds:&lt;br /&gt;
&lt;br /&gt;
    /usr/local/lib/uhd/examples/benchmark_rate  \&lt;br /&gt;
    --args &amp;quot;type=n3xx,mgmt_addr=192.168.1.151,addr=192.168.10.2,second_addr=192.168.20.2,master_clock_rate=125e6&amp;quot; \&lt;br /&gt;
    --duration 60 \&lt;br /&gt;
    --channels &amp;quot;0,1,2,3&amp;quot; \&lt;br /&gt;
    --rx_rate 62.5e6 \&lt;br /&gt;
    --rx_subdev &amp;quot;A:0 A:1 B:0 B:1&amp;quot; \&lt;br /&gt;
    --tx_rate 62.5e6 \&lt;br /&gt;
    --tx_subdev &amp;quot;A:0 A:1 B:0 B:1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''N320/N321'''&lt;br /&gt;
&lt;br /&gt;
This example will test two full-duplex streams at 62.5 MS/s, for 60 seconds:&lt;br /&gt;
&lt;br /&gt;
    /usr/local/lib/uhd/examples/benchmark_rate  \&lt;br /&gt;
    --args &amp;quot;type=n3xx,mgmt_addr=192.168.1.151,addr=192.168.10.2,second_addr=192.168.20.2,master_clock_rate=250e6&amp;quot; \&lt;br /&gt;
    --duration 60 \&lt;br /&gt;
    --channels &amp;quot;0,1,2,3&amp;quot; \&lt;br /&gt;
    --rx_rate 62.5e6 \&lt;br /&gt;
    --rx_subdev &amp;quot;A:0 B:0&amp;quot; \&lt;br /&gt;
    --tx_rate 62.5e6 \&lt;br /&gt;
    --tx_subdev &amp;quot;A:0 B:0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==USRP N3xx Device Specific Operations==&lt;br /&gt;
&lt;br /&gt;
===White Rabbit Ethernet-Based Synchronization===&lt;br /&gt;
* [[Using Ethernet-Based Synchronization on the USRP™ N3xx Devices]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===N320/N321===&lt;br /&gt;
* [[USRP N320/N321 LO Distribution]]&lt;br /&gt;
* [[5G NR EVM Measurements with the USRP N320/N321]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Turning the Device Off/On===&lt;br /&gt;
To avoid damaging the file system and causing any corruption, do not turn the device off with the power button without first shutting down the system. Use this command to cleanly and properly shut the system down:&lt;br /&gt;
&lt;br /&gt;
    shutdown ­-h now&lt;br /&gt;
&lt;br /&gt;
===Enable Auto Booting===&lt;br /&gt;
Auto booting of the N3xx when power is applied can be configured by enabling the flag on the device's EEPROM with the following command:&lt;br /&gt;
&lt;br /&gt;
    eeprom-set-flags 0x1&lt;br /&gt;
&lt;br /&gt;
===Default Password===&lt;br /&gt;
The default user is &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; and the password is empty (no password).&lt;br /&gt;
&lt;br /&gt;
It is recommended to update the &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; password, which can be done with the command &amp;lt;code&amp;gt;passwd&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Example Output:&lt;br /&gt;
&lt;br /&gt;
    root@ni-n3xx-serial:~# passwd&lt;br /&gt;
    Changing password for root&lt;br /&gt;
    New password: &lt;br /&gt;
    Re-enter new password: &lt;br /&gt;
    passwd: password changed.&lt;br /&gt;
&lt;br /&gt;
==Technical Support and Community Knowledge Base==&lt;br /&gt;
Technical support for USRP hardware is available through email only. If the product arrived in a non­functional state or you require technical assistance, please contact [mailto:support@ettus.com support@ettus.com]. Please allow 24 to 48 hours for response by email, depending on holidays and weekends, although we are often able to reply more quickly than that.&lt;br /&gt;
&lt;br /&gt;
We also recommend that you subscribe to the community mailing lists. The mailing lists have a responsive and knowledgeable community of hundreds of developers and technical users who are located around the world. When you join the community, you will be connected to this group of people who can help you learn about SDR and respond to your technical and specific questions. Often your question can be answered quickly on the mailing lists. Each mailing list also provides an archive of all past conversations and discussions going back many years. Your question or problem may have already been addressed before, and a relevant or helpful solution may already exist in the archive.&lt;br /&gt;
&lt;br /&gt;
Discussions involving the USRP hardware and the UHD software itself are best addressed through the '''u​srp­-users''' ​mailing list at [http://usrp-users.ettus.com http://usrp-users.ettus.com].&lt;br /&gt;
&lt;br /&gt;
Discussions involving the use of [http://gnuradio.org/ GNU Radio] with USRP hardware and UHD software are best addressed through the '''d​iscuss­-gnuradio'''​ mailing list at [https://lists.gnu.org/mailman/listinfo/discuss­gnuradio https://lists.gnu.org/mailman/listinfo/discuss­gnuradio]​.&lt;br /&gt;
&lt;br /&gt;
Discussions involving the use of [http://openbts.org/ OpenBTS®] with USRP hardware and UHD software are best addressed through the '''o​penbts­-discuss​''' mailing list at [https://lists.sourceforge.net/lists/listinfo/openbts­discuss​ https://lists.sourceforge.net/lists/listinfo/openbts­discuss​].​&lt;br /&gt;
&lt;br /&gt;
The support page on our website is located at [https://www.ettus.com/support https://www.ettus.com/support]​. The Knowledge Base is located at ​[https://kb.ettus.com https://kb.ettus.com]​.&lt;br /&gt;
&lt;br /&gt;
==Legal Considerations==&lt;br /&gt;
Every country has laws governing the transmission and reception of radio signals. Users are solely responsible for insuring they use their USRP system in compliance with all applicable laws and regulations. Before attempting to transmit and/or receive on any frequency, we recommend that you determine what licenses may be required and what restrictions may apply.&lt;br /&gt;
&lt;br /&gt;
*NOTE: This USRP product is a piece of test equipment.&lt;br /&gt;
&lt;br /&gt;
==Sales and Ordering Support==&lt;br /&gt;
If you have any non­-technical questions related to your order, then please contact us by email at [mailto:orders@ettus.com orders@ettus.com]​, or by phone at +1­408­610­6399 (Monday-Friday, 8 AM - 5 PM, Pacific Time). Please be sure to include your order number and the serial number of your USRP.&lt;br /&gt;
&lt;br /&gt;
==Terms and Conditions of Sale==&lt;br /&gt;
Terms and conditions of sale can be accessed online at the following link: http://www.ettus.com/legal/terms-and-conditions-of-sale&lt;br /&gt;
&lt;br /&gt;
[[Category:Getting Started Guides]]&lt;br /&gt;
[[Category:N300]]&lt;br /&gt;
[[Category:N310]]&lt;br /&gt;
&lt;br /&gt;
[[Category:N320]]&lt;br /&gt;
&lt;br /&gt;
[[Category:N321]]&lt;/div&gt;</summary>
		<author><name>MartinAnderseck</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Building_and_Installing_the_USRP_Open-Source_Toolchain_(UHD_and_GNU_Radio)_on_Linux&amp;diff=5259</id>
		<title>Building and Installing the USRP Open-Source Toolchain (UHD and GNU Radio) on Linux</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Building_and_Installing_the_USRP_Open-Source_Toolchain_(UHD_and_GNU_Radio)_on_Linux&amp;diff=5259"/>
				<updated>2022-02-04T14:33:49Z</updated>
		
		<summary type="html">&lt;p&gt;MartinAnderseck: Removed the revision history from the page itself. The history can be checked much better in the wiki history functionality.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Application Note Number==&lt;br /&gt;
'''AN-445'''&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This Application Note provides a comprehensive guide for building, installing, and maintaining the open-source toolchain for the USRP (UHD and GNU Radio) from source code on the Linux platform. The Ubuntu and Fedora distributions are specifically discussed. Several other alternate installation methods are also discussed.&lt;br /&gt;
&lt;br /&gt;
http://files.ettus.com/manual/page_build_guide.html#build_instructions_unix&lt;br /&gt;
&lt;br /&gt;
==UHD on Linux==&lt;br /&gt;
&lt;br /&gt;
UHD is fully supported on Linux, using the GCC compiler, and should work on most major Linux distributions.&lt;br /&gt;
&lt;br /&gt;
==Devices==&lt;br /&gt;
This document applies only to the USRP X300, X310, B200, B210, B200mini, N200, N210 devices. The E310 and E312 devices are embedded devices, and are fundamentally different from the other non-embedded USRP devices, and are not addressed by this document.&lt;br /&gt;
&lt;br /&gt;
==Install Linux==&lt;br /&gt;
&lt;br /&gt;
If you already have a recent version of Linux installed, then you may be able to skip this section. If you are starting from scratch, or simply want to start with a fresh new installation of Linux, then please follow the instructions and recommendations in this section.&lt;br /&gt;
&lt;br /&gt;
We suggest that you use either Ubuntu 16.04.5, Ubuntu 18.04, Ubuntu 18.10, Fedora 27, 28, 29, and that you use a 64-bit architecture, not a 32-bit architecture. There are several re-spins of Ubuntu, such as Xubuntu, Lubuntu, Kubuntu, Linux Mint, all of which should also work. For the purposes of this document, these re-spins can be considered equivalent. Both Ubuntu and Fedora are known to work well with UHD and GNU Radio.&lt;br /&gt;
&lt;br /&gt;
Download and install Ubuntu, Xubuntu, Linux Mint, or Fedora from the links below. Download the appropriate ISO image, and write it to a USB flash drive. Be sure to verify that the ISO file was not corrupted during the download process by checking the MD5 and/or SHA1 hash.&lt;br /&gt;
&lt;br /&gt;
* [http://www.ubuntu.com/download/desktop Ubuntu download page]&lt;br /&gt;
* [http://www.xubuntu.org/getxubuntu/ Xubuntu download page]&lt;br /&gt;
* [https://www.linuxmint.com/download.php Linux Mint download page]&lt;br /&gt;
* [https://getfedora.org/en/workstation/download/ Fedora download page]&lt;br /&gt;
&lt;br /&gt;
You can learn more about Ubuntu, Xubuntu, Linux Mint, and Fedora at the links below.&lt;br /&gt;
&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Ubuntu_%28operating_system%29 Wikipedia article on Ubuntu]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Xubuntu Wikipedia article on Xubuntu]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Linux_Mint Wikipedia article on Linux Mint]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Fedora_%28operating_system%29 Wikipedia article on Fedora]&lt;br /&gt;
&lt;br /&gt;
There are many tools for writing an ISO image to a USB flash drive. In Linux, you can use the &amp;quot;dd&amp;quot; utility, or the UNetbootin utility. On Ubuntu systems, there is also the Startup Disk Creator utility as well.&lt;br /&gt;
&lt;br /&gt;
* [http://unetbootin.sourceforge.net/ UNetbootin homepage]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/UNetbootin Wikipedia article on UNetbootin]&lt;br /&gt;
&lt;br /&gt;
* [https://launchpad.net/usb-creator Startup Disk Creator homepage]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Startup_Disk_Creator Wikipedia article on Startup Disk Creator]&lt;br /&gt;
* [http://www.ubuntu.com/download/desktop/create-a-usb-stick-on-ubuntu Article about Startup Disk Creator]&lt;br /&gt;
&lt;br /&gt;
Be sure to use a USB flash drive with at least 8 GB capacity, and use a USB 3.0 flash drive, not a USB 2.0 flash drive. If you use a slower USB 2.0 flash drive, then the install process will take significantly longer.&lt;br /&gt;
&lt;br /&gt;
==Update and Install dependencies==&lt;br /&gt;
&lt;br /&gt;
Before building UHD and GNU Radio, you need to make sure that all the dependencies are first installed.&lt;br /&gt;
&lt;br /&gt;
However, before installing any dependencies, you should first make sure that all the packages that are already installed on your system are up-to-date. You can do this from a GUI, or from the command-line, as shown below.&lt;br /&gt;
&lt;br /&gt;
On Ubuntu systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get update&lt;br /&gt;
&lt;br /&gt;
On Fedora 21 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo yum update&lt;br /&gt;
&lt;br /&gt;
On Fedora 22, 23, 24 and 25 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo dnf update&lt;br /&gt;
&lt;br /&gt;
Once the system has been updated, then install the required dependencies for UHD and GNU Radio.&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 20.04 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install autoconf automake build-essential ccache cmake cpufrequtils doxygen ethtool fort77 g++ gir1.2-gtk-3.0 git gobject-introspection gpsd gpsd-clients inetutils-tools libasound2-dev libboost-all-dev libcomedi-dev libcppunit-dev libfftw3-bin libfftw3-dev libfftw3-doc libfontconfig1-dev libgmp-dev libgps-dev libgsl-dev liblog4cpp5-dev libncurses5 libncurses5-dev libpulse-dev libqt5opengl5-dev libqwt-qt5-dev libsdl1.2-dev libtool libudev-dev libusb-1.0-0 libusb-1.0-0-dev libusb-dev libxi-dev libxrender-dev libzmq3-dev libzmq5 ncurses-bin python3-cheetah python3-click python3-click-plugins python3-click-threading python3-dev python3-docutils python3-gi python3-gi-cairo python3-gps python3-lxml python3-mako python3-numpy python3-numpy-dbg python3-opengl python3-pyqt5 python3-requests python3-scipy python3-setuptools python3-six python3-sphinx python3-yaml python3-zmq python3-ruamel.yaml swig wget&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 18.10 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-1.14-0 libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libqwt6abi1 libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev libncurses6-dbg libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-dev libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk3.0 git libqt4-dev python-numpy ccache python-opengl libgsl-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwtplot3d-qt5-dev pyqt4-dev-tools python-qwt5-qt4 cmake git wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq3-dev libzmq5 python-requests python-sphinx libcomedi-dev python-zmq libqwt-dev libqwt6abi1 python-six libgps-dev libgps23 gpsd gpsd-clients python-gps python-setuptools&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 18.04 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-1.14-0 libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libqwt6abi1 libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev libncurses5-dbg libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-dev libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk3.0 git libqt4-dev python-numpy ccache python-opengl libgsl-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwtplot3d-qt5-dev pyqt4-dev-tools python-qwt5-qt4 cmake git wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq3-dev libzmq5 python-requests python-sphinx libcomedi-dev python-zmq libqwt-dev libqwt6abi1 python-six libgps-dev libgps23 gpsd gpsd-clients python-gps python-setuptools&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 17.04 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-1.13-0v5 libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libqwt6abi1 libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev libncurses5-dbg libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-dev libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk3.0 git-core libqt4-dev python-numpy ccache python-opengl libgsl-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwt5-qt4-dev libqwtplot3d-qt4-dev pyqt4-dev-tools python-qwt5-qt4 cmake git-core wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq3-dev libzmq5 python-requests python-sphinx libcomedi-dev python-zmq python-setuptools&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 16.04 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-1.13-0v5 libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libqwt6abi1 libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev libncurses5-dbg libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-dev libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk3.0 git-core libqt4-dev python-numpy ccache python-opengl libgsl-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwt5-qt4-dev libqwtplot3d-qt4-dev pyqt4-dev-tools python-qwt5-qt4 cmake git-core wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq-dev libzmq1 python-requests python-sphinx libcomedi-dev python-zmq python-setuptools&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 15.04 and 15.10 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libqwt6 libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev  libncurses5-dbg libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-1.13-0v5 libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk2.8 git-core libqt4-dev python-numpy ccache python-opengl libgsl0-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwt5-qt4-dev libqwtplot3d-qt4-dev pyqt4-dev-tools python-qwt5-qt4 cmake git-core wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq-dev libzmq1 python-requests python-sphinx libcomedi-dev python-zmq python-setuptools&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 14.04 and 14.10 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-1.13-0 libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev libncurses5-dbg   libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-dev libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk2.8 git-core libqt4-dev python-numpy ccache python-opengl libgsl0-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwt5-qt4-dev libqwtplot3d-qt4-dev pyqt4-dev-tools python-qwt5-qt4 cmake git-core wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq1 libzmq-dev python-requests python-sphinx libcomedi-dev python-setuptools&lt;br /&gt;
&lt;br /&gt;
On Fedora 21 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo yum -y groupinstall &amp;quot;Engineering and Scientific&amp;quot; &amp;quot;Development Tools&amp;quot; &amp;quot;Software Development Tools&amp;quot; &amp;quot;C Development Tools and Libraries&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    sudo yum -y install fftw-devel cppunit-devel wxPython-devel boost-devel alsa-lib-devel numpy gsl-devel python-devel pygsl python-cheetah python-mako python-lxml PyOpenGL qt-devel qt qt4 qt4-devel PyQt4-devel qwt-devel qwtplot3d-qt4-devel libusbx-devel cmake git wget python-docutils cppzmq-devel PyQwt PyQwt-devel qwt-devel gtk2-engines xmlrpc-c-&amp;quot;*&amp;quot; tkinter orc orc-devel python-sphinx SDL-devel swig  zeromq2-devel python-zmq comedilib comedilib-devel thrift-devel python-thrift scipy zeromq zeromq-devel&lt;br /&gt;
			  &lt;br /&gt;
On Fedora 22, 23, 24 and 25 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo dnf -y groupinstall &amp;quot;Engineering and Scientific&amp;quot; &amp;quot;Development Tools&amp;quot; &amp;quot;C Development Tools and Libraries&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
    sudo dnf -y install fftw-devel cppunit-devel wxPython-devel boost-devel alsa-lib-devel numpy gsl-devel python-devel pygsl python-cheetah python-mako python-lxml PyOpenGL qt-devel PyQt4-devel qwt-devel qwtplot3d-qt4-devel libusbx-devel cmake python-docutils PyQwt PyQwt-devel gtk2-engines xmlrpc-c-&amp;quot;*&amp;quot; tkinter orc-devel python-sphinx SDL-devel swig perl-ZMQ-LibZMQ2 perl-ZMQ-LibZMQ2 zeromq zeromq-devel python-requests gcc-c++ doxygen zeromq-ada-devel cppzmq-devel perl-ZeroMQ amavisd-new-zeromq amavisd-new-snmp-zeromq php-zmq python-zmq czmq uwsgi-logger-zeromq comedilib comedilib-devel pygtk2 ncurses-&amp;quot;*&amp;quot; thrift-devel python-thrift scipy&lt;br /&gt;
&lt;br /&gt;
After installing the dependencies, you should reboot the system.&lt;br /&gt;
&lt;br /&gt;
If the installation of the dependencies completes without any errors, then you can proceed to build and install UHD and GNU Radio.&lt;br /&gt;
&lt;br /&gt;
==Building and installing UHD from source code==&lt;br /&gt;
&lt;br /&gt;
UHD is open-source, and is hosted on GitHub. You can browse the code online at the link below, which points to version 3.14.0.0, which is the the latest release at the time of this writing.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/EttusResearch/uhd/tree/v3.14.0.0 UHD repository on GitHub]&lt;br /&gt;
&lt;br /&gt;
There are several good reasons to build GNU Radio from source code, especially for doing development and prototyping. It it enables an easy way to customize the location of the installation, and to install multiple UHD versions in parallel, and switch between them. It also provides much more flexibility in upgrading and downgrading versions, and allows the user to modify the code and create customized versions, which could possibly include a patch or other bug-fix.&lt;br /&gt;
&lt;br /&gt;
To build UHD from source code, clone the GitHub repository, check out a branch or tagged release of the repository, and build and install. Please follow the steps below. Make sure that no USRP device is connected to the system at this point.&lt;br /&gt;
&lt;br /&gt;
First, make a folder to hold the repository.&lt;br /&gt;
&lt;br /&gt;
    cd $HOME&lt;br /&gt;
    mkdir workarea&lt;br /&gt;
    cd workarea&lt;br /&gt;
&lt;br /&gt;
Next, clone the repository and change into the cloned directory.&lt;br /&gt;
&lt;br /&gt;
    git clone &amp;lt;nowiki&amp;gt;https://github.com/EttusResearch/uhd&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
    cd uhd&lt;br /&gt;
&lt;br /&gt;
Next, checkout the desired UHD version. You can get a full listing of tagged releases by running the command:&lt;br /&gt;
&lt;br /&gt;
    git tag -l&lt;br /&gt;
&lt;br /&gt;
''Example truncated output of &amp;lt;code&amp;gt;git tag -l&amp;lt;/code&amp;gt;:''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git tag -l&lt;br /&gt;
...&lt;br /&gt;
release_003_009_004&lt;br /&gt;
release_003_009_005&lt;br /&gt;
release_003_010_000_000&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note''': As of UHD Version 3.10.0.0, the versioning scheme has changed to be a quadruplet format. Each element and version will follow the format of: '''Major.API.ABI.Patch'''. Additional details on this versioning change can be found [https://files.ettus.com/manual/page_semver.html here]. &lt;br /&gt;
&lt;br /&gt;
After identifying the version and corresponding release tag you need, check it out:&lt;br /&gt;
&lt;br /&gt;
    # Example: For UHD 3.9.5:&lt;br /&gt;
    git checkout release_003_009_005&lt;br /&gt;
&lt;br /&gt;
    # Example: For UHD 3.14.0.0&lt;br /&gt;
    git checkout v3.14.0.0&lt;br /&gt;
&lt;br /&gt;
Next, create a build folder within the repository.&lt;br /&gt;
&lt;br /&gt;
    cd host&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
&lt;br /&gt;
Next, invoke CMake.&lt;br /&gt;
&lt;br /&gt;
    cmake ..&lt;br /&gt;
&lt;br /&gt;
'''Note''': if the shell &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; is set such that &amp;lt;code&amp;gt;/bin&amp;lt;/code&amp;gt; comes before &amp;lt;code&amp;gt;/usr/bin&amp;lt;/code&amp;gt;, then this step is likely to fail because cmake will set the &amp;lt;code&amp;gt;FIND_ROOT_PATH&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; and this setting will fail as a prefix for Boost headers or libraries. The cmake output will include messages such as&lt;br /&gt;
&lt;br /&gt;
    --   Boost include directories: /include&lt;br /&gt;
    --   Boost library directories: /lib/x86_64-linux-gnu&lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
    CMake Error in lib/CMakeLists.txt:&lt;br /&gt;
      Imported target &amp;quot;Boost::chrono&amp;quot; includes non-existent path&lt;br /&gt;
        &amp;quot;/include&amp;quot;&lt;br /&gt;
      in its INTERFACE_INCLUDE_DIRECTORIES.  Possible reasons include:&lt;br /&gt;
      * The path was deleted, renamed, or moved to another location.&lt;br /&gt;
      * An install or uninstall procedure did not complete successfully.&lt;br /&gt;
      * The installation package was faulty and references files it does not provide.&lt;br /&gt;
&lt;br /&gt;
One of the following 3 options should fix this situation:&lt;br /&gt;
&lt;br /&gt;
      1. &amp;lt;code&amp;gt;/usr/bin/cmake ..&amp;lt;/code&amp;gt;&lt;br /&gt;
      2. &amp;lt;code&amp;gt;PATH=/usr/bin:$PATH cmake ..&amp;lt;/code&amp;gt;&lt;br /&gt;
      3. &amp;lt;code&amp;gt;cmake -DCMAKE_FIND_ROOT_PATH=/usr ..&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once the cmake command succeeds without errors, build UHD.&lt;br /&gt;
&lt;br /&gt;
    make&lt;br /&gt;
&lt;br /&gt;
Next, you can optionally run some basic tests to verify that the build process completed properly.&lt;br /&gt;
&lt;br /&gt;
    make test&lt;br /&gt;
&lt;br /&gt;
Next, install UHD, using the default install prefix, which will install UHD under the /usr/local/lib folder. You need to run this as root due to the permissions on that folder.&lt;br /&gt;
&lt;br /&gt;
    sudo make install&lt;br /&gt;
&lt;br /&gt;
Next, update the system's shared library cache.&lt;br /&gt;
&lt;br /&gt;
    sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Finally, make sure that the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable is defined and includes the folder under which UHD was installed. Most commonly, you can add the line below to the end of your &amp;lt;code&amp;gt;$HOME/.bashrc&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&lt;br /&gt;
    export LD_LIBRARY_PATH=/usr/local/lib&lt;br /&gt;
&lt;br /&gt;
On Fedora 22/23/24/25 you will need to set the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/usr/local/lib64&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    export LD_LIBRARY_PATH=/usr/local/lib64&lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable is already defined with other folders in your &amp;lt;code&amp;gt;$HOME/.bashrc&amp;lt;/code&amp;gt; file, then add the line below to the end of your &amp;lt;code&amp;gt;$HOME/.bashrc&amp;lt;/code&amp;gt; file to preserve the current settings.&lt;br /&gt;
 &lt;br /&gt;
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib&lt;br /&gt;
&lt;br /&gt;
For Fedora 21/22/23/24/25&lt;br /&gt;
&lt;br /&gt;
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64&lt;br /&gt;
&lt;br /&gt;
For this change to take effect, you will need to close the current terminal window, and open a new terminal.&lt;br /&gt;
&lt;br /&gt;
At this point, UHD should be installed and ready to use. You can quickly test this, with no USRP device attached, by running &amp;lt;code&amp;gt;uhd_find_devices&amp;lt;/code&amp;gt;. You should see something similar to the following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
linux; GNU C++ version 4.8.4; Boost_105400; UHD_003.010.000.HEAD-0-g6e1ac3fc&lt;br /&gt;
&lt;br /&gt;
No UHD Devices Found&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Downloading the UHD FPGA Images===&lt;br /&gt;
You can now download the UHD FPGA Images for this installation. This can be done by running the command &amp;lt;code&amp;gt;uhd_images_downloader&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader&lt;br /&gt;
&lt;br /&gt;
Note: Since this installation is being installed to a system level directory (e.g. &amp;lt;code&amp;gt;/usr/local&amp;lt;/code&amp;gt;), the &amp;lt;code&amp;gt;uhd_images_downloader&amp;lt;/code&amp;gt; command requires &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; privileges.&lt;br /&gt;
&lt;br /&gt;
Example ouput for UHD 3.13.3.0:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo uhd_images_downloader &lt;br /&gt;
Images destination:      /usr/local/share/uhd/images&lt;br /&gt;
Downloading images from: http://files.ettus.com/binaries/images/uhd-images_003.010.003.000-release.zip&lt;br /&gt;
Downloading images to:   /tmp/tmpm46JDg/uhd-images_003.010.003.000-release.zip&lt;br /&gt;
57009 kB / 57009 kB (100%)&lt;br /&gt;
&lt;br /&gt;
Images successfully installed to: /usr/local/share/uhd/images&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example output for UHD 3.13:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo uhd_images_downloader&lt;br /&gt;
[INFO] Images destination: /usr/local/share/uhd/images&lt;br /&gt;
[INFO] No inventory file found at /usr/local/share/uhd/images/inventory.json. Creating an empty one.&lt;br /&gt;
00006 kB / 00006 kB (100%) usrp1_b100_fw_default-g6bea23d.zip&lt;br /&gt;
19484 kB / 19484 kB (100%) x3xx_x310_fpga_default-g494ae8bb.zip&lt;br /&gt;
02757 kB / 02757 kB (100%) usrp2_n210_fpga_default-g6bea23d.zip&lt;br /&gt;
02109 kB / 02109 kB (100%) n230_n230_fpga_default-g494ae8bb.zip&lt;br /&gt;
00522 kB / 00522 kB (100%) usrp1_b100_fpga_default-g6bea23d.zip&lt;br /&gt;
00474 kB / 00474 kB (100%) b2xx_b200_fpga_default-g494ae8bb.zip&lt;br /&gt;
02415 kB / 02415 kB (100%) usrp2_n200_fpga_default-g6bea23d.zip&lt;br /&gt;
05920 kB / 05920 kB (100%) e3xx_e320_fpga_default-g494ae8bb.zip&lt;br /&gt;
15883 kB / 15883 kB (100%) n3xx_n310_fpga_default-g494ae8bb.zip&lt;br /&gt;
00506 kB / 00506 kB (100%) b2xx_b205mini_fpga_default-g494ae8bb.zip&lt;br /&gt;
18676 kB / 18676 kB (100%) x3xx_x300_fpga_default-g494ae8bb.zip&lt;br /&gt;
00017 kB / 00017 kB (100%) octoclock_octoclock_fw_default-g14000041.zip&lt;br /&gt;
04839 kB / 04839 kB (100%) usb_common_windrv_default-g14000041.zip&lt;br /&gt;
00007 kB / 00007 kB (100%) usrp2_usrp2_fw_default-g6bea23d.zip&lt;br /&gt;
00009 kB / 00009 kB (100%) usrp2_n200_fw_default-g6bea23d.zip&lt;br /&gt;
00450 kB / 00450 kB (100%) usrp2_usrp2_fpga_default-g6bea23d.zip&lt;br /&gt;
00142 kB / 00142 kB (100%) b2xx_common_fw_default-g3ff4186b.zip&lt;br /&gt;
00460 kB / 00460 kB (100%) b2xx_b200mini_fpga_default-g494ae8bb.zip&lt;br /&gt;
00319 kB / 00319 kB (100%) usrp1_usrp1_fpga_default-g6bea23d.zip&lt;br /&gt;
00009 kB / 00009 kB (100%) usrp2_n210_fw_default-g6bea23d.zip&lt;br /&gt;
11537 kB / 11537 kB (100%) n3xx_n300_fpga_default-g494ae8bb.zip&lt;br /&gt;
05349 kB / 05349 kB (100%) e3xx_e310_fpga_default-g494ae8bb.zip&lt;br /&gt;
00866 kB / 00866 kB (100%) b2xx_b210_fpga_default-g494ae8bb.zip&lt;br /&gt;
[INFO] Images download complete.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Building and installing GNU Radio from source code==&lt;br /&gt;
&lt;br /&gt;
As with UHD, GNU Radio is open-source and is hosted on GitHub. You can browse the code online at the link below, which points to version &amp;lt;code&amp;gt;v3.7.13.4&amp;lt;/code&amp;gt;, which is the the latest release at the time of this writing.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/gnuradio/gnuradio/tree/v3.7.13.4 GNU Radio repository on GitHub]&lt;br /&gt;
&lt;br /&gt;
Note: GNU Radio is currently transitioning from major branches of 3.7.x.x to 3.8.x.x. It is generally recommend at this time to use either the &amp;lt;code&amp;gt;v3.7.13.4&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;maint-3.7&amp;lt;/code&amp;gt; branch of GNU Radio. The &amp;lt;code&amp;gt;master&amp;lt;/code&amp;gt; branch includes many major changes such as converting to use Python 3 and may be unstable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As with UHD, there are several good reasons to build GNU Radio from source code, especially for doing development and prototyping. It it enables an easy way to customize the location of the installation, and to install multiple GNU Radio versions in parallel, and switch between them. It also provides much more flexibility in upgrading and downgrading versions, and allows the user to modify the code and create customized versions, which could possibly include a patch or other bug-fix.&lt;br /&gt;
&lt;br /&gt;
Similar to the process for UHD, to build GNU Radio from source code, clone the GitHub repository, check out a branch or tagged release of the repository, and build and install. Please follow the steps below. Make sure that no USRP device is connected to the system at this point.&lt;br /&gt;
&lt;br /&gt;
First, make a folder to hold the repository.&lt;br /&gt;
&lt;br /&gt;
    cd $HOME&lt;br /&gt;
    cd workarea&lt;br /&gt;
&lt;br /&gt;
Next, clone the repository.&lt;br /&gt;
&lt;br /&gt;
    git clone --recursive &amp;lt;nowiki&amp;gt;https://github.com/gnuradio/gnuradio&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, go into the repository and check out the desired GNU Radio version.&lt;br /&gt;
&lt;br /&gt;
    cd gnuradio&lt;br /&gt;
&lt;br /&gt;
To checkout the &amp;lt;code&amp;gt;v3.7.13.4&amp;lt;/code&amp;gt; branch:&lt;br /&gt;
&lt;br /&gt;
    git checkout v3.7.13.4&lt;br /&gt;
&lt;br /&gt;
Or to checkout the &amp;lt;code&amp;gt;maint-3.7&amp;lt;/code&amp;gt; branch:&lt;br /&gt;
&lt;br /&gt;
    git checkout maint-3.7&lt;br /&gt;
&lt;br /&gt;
Next, update the submodules:&lt;br /&gt;
&lt;br /&gt;
    git submodule update --init --recursive&lt;br /&gt;
&lt;br /&gt;
Next, create a build folder within the repository, invoke CMake, and build GNU Radio:&lt;br /&gt;
&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake ../&lt;br /&gt;
    make&lt;br /&gt;
&lt;br /&gt;
Next, you can optionally run some basic tests to verify that the build process completed properly.&lt;br /&gt;
&lt;br /&gt;
    make test&lt;br /&gt;
&lt;br /&gt;
Next, install GNU Radio, using the default install prefix, which will install GNU Radio under the /usr/local/lib folder. You need to run this as root due to the permissions on that folder.&lt;br /&gt;
&lt;br /&gt;
    sudo make install&lt;br /&gt;
&lt;br /&gt;
Finally, update the system's shared library cache.&lt;br /&gt;
&lt;br /&gt;
    sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
At this point, GNU Radio should be installed and ready to use. You can quickly test this, with no USRP device attached, by running the following quick tests.&lt;br /&gt;
&lt;br /&gt;
    gnuradio-config-info --version&lt;br /&gt;
    gnuradio-config-info --prefix&lt;br /&gt;
    gnuradio-config-info --enabled-components&lt;br /&gt;
&lt;br /&gt;
There is a simple flowgraph that you can run that does not require any USRP hardware. It's called the dialtone test, and it produces a PSTN dial tone on the computer's speakers. Running it verifies that all the libraries can be found, and that the GNU Radio run-time is working.&lt;br /&gt;
&lt;br /&gt;
    python $HOME/workarea/gnuradio/gr-audio/examples/python/dial_tone.py&lt;br /&gt;
&lt;br /&gt;
You can try launching the GNU Radio Companion (GRC) tool, a visual tool for building and running GNU Radio flowgraphs.&lt;br /&gt;
&lt;br /&gt;
    gnuradio-companion&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;gnuradio-companion&amp;quot; does not start and complains about the &amp;lt;code&amp;gt;PYTHONPATH&amp;lt;/code&amp;gt; environment variable, then you may have to set this in your &amp;lt;code&amp;gt;$HOME/.bashrc&amp;lt;/code&amp;gt; file, as shown below.&lt;br /&gt;
&lt;br /&gt;
    export PYTHONPATH=/usr/local/lib/python2.7/dist-packages&lt;br /&gt;
&lt;br /&gt;
On Fedora 21/22/23/24, the &amp;lt;code&amp;gt;PYTHONPATH&amp;lt;/code&amp;gt; environment variable will need to be set to:&lt;br /&gt;
&lt;br /&gt;
    export PYTHONPATH=/usr/lib/python2.7/site-packages:/usr/local/lib64/python2.7/site-packages/&lt;br /&gt;
&lt;br /&gt;
==Configuring USB==&lt;br /&gt;
&lt;br /&gt;
On Linux, udev handles USB plug and unplug events. The following commands install a udev rule so that non-root users may access the device. This step is only necessary for devices that use USB to connect to the host computer, such as the B200, B210, and B200mini. This setting should take effect immediately and does not require a reboot or logout/login. Be sure that no USRP device is connected via USB when running these commands.&lt;br /&gt;
&lt;br /&gt;
    cd $HOME/workarea/uhd/host/utils&lt;br /&gt;
    sudo cp uhd-usrp.rules /etc/udev/rules.d/&lt;br /&gt;
    sudo udevadm control --reload-rules&lt;br /&gt;
    sudo udevadm trigger&lt;br /&gt;
&lt;br /&gt;
==Configuring Ethernet==&lt;br /&gt;
&lt;br /&gt;
For USRP devices that use Ethernet to connect to the host computer, such as the N200, N210, X300, X310, set a static IP address for your system of 192.168.10.1, with a netmask of 255.255.255.0. The default IP address of the USRP is 192.168.10.2, with a netmask of 255.255.255.0. You should probably set the IP address using the graphical Network Manager. If you set the IP address from the command line with &amp;lt;code&amp;gt;ifconfig&amp;lt;/code&amp;gt;, Network Manager will probably overwrite these settings.&lt;br /&gt;
&lt;br /&gt;
==Connect the USRP==&lt;br /&gt;
&lt;br /&gt;
The installation of UHD and GNU Radio should now be complete. At this point, connect the USRP to the host computer.&lt;br /&gt;
&lt;br /&gt;
If the interface is Ethernet, then open a terminal window, and try to ping the USRP with &amp;quot;ping 192.168.10.2&amp;quot;. The USRP should respond to the ping requests.&lt;br /&gt;
&lt;br /&gt;
If the interface is USB, then open a terminal window, and run &amp;quot;&amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt;&amp;quot;. You should see the USRP listed on the USB bus with a VID of &amp;lt;code&amp;gt;2500&amp;lt;/code&amp;gt; and PID of &amp;lt;code&amp;gt;0020&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0021&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0022&amp;lt;/code&amp;gt;, for B200, B210, B200mini, respectively.&lt;br /&gt;
&lt;br /&gt;
Also try running &amp;quot;&amp;lt;code&amp;gt;uhd_find_devices&amp;lt;/code&amp;gt;&amp;quot; and &amp;quot;&amp;lt;code&amp;gt;uhd_usrp_probe&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Thread priority scheduling==&lt;br /&gt;
&lt;br /&gt;
When UHD spawns a new thread, it may try to boost the thread's scheduling priority. If setting the new priority fails, the UHD software prints a warning to the console, as shown below. This warning is harmless; it simply means that the thread will retain a normal or default scheduling priority.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UHD Warning:&lt;br /&gt;
    Unable to set the thread priority. Performance may be negatively affected.&lt;br /&gt;
    Please see the general application notes in the manual for instructions.&lt;br /&gt;
    EnvironmentError: OSError: error in pthread_setschedparam&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To address this issue, non-privileged (non-root) users need to be given special permission to change the scheduling priority. This can be enabled by creating a group &amp;lt;code&amp;gt;usrp&amp;lt;/code&amp;gt;, adding your user to it, and then appending the line &amp;lt;code&amp;gt;@usrp - rtprio  99&amp;lt;/code&amp;gt; to the file &amp;lt;code&amp;gt;/etc/security/limits.conf&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    sudo groupadd usrp&lt;br /&gt;
    sudo usermod -aG usrp $USER&lt;br /&gt;
&lt;br /&gt;
Then add the line below to end of the file &amp;lt;code&amp;gt;/etc/security/limits.conf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    @usrp - rtprio  99&lt;br /&gt;
&lt;br /&gt;
You must log out and log back into the account for the settings to take effect. In most Linux distributions, a list of groups and group members can be found in the &amp;lt;code&amp;gt;/etc/group&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
There is further documentation about this in the User Manual at the link below.&lt;br /&gt;
&lt;br /&gt;
* [http://files.ettus.com/manual/page_general.html#general_threading_prio Threading Notes section of the User Manual]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Application Notes]]&lt;/div&gt;</summary>
		<author><name>MartinAnderseck</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=RFNoC_4_Migration_Guide&amp;diff=5240</id>
		<title>RFNoC 4 Migration Guide</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=RFNoC_4_Migration_Guide&amp;diff=5240"/>
				<updated>2021-11-19T10:06:38Z</updated>
		
		<summary type="html">&lt;p&gt;MartinAnderseck: /* GNU Radio 3.8 */ Added link to official GNU Radio build instructions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Abstract=&lt;br /&gt;
&lt;br /&gt;
The UHD 4.0 release includes a major upgrade to the RFNoC framework called RFNoC 4. This article is a guide to aid users in migrating their existing RFNoC blocks from RFNoC 3 to RFNoC 4. The RFNoC Block Development Environment section provides guidance on how to setup an environment for developing out-of-tree RFNoC blocks in RFNoC 4. The UHD, FPGA, GNU Radio Migration sections provide general information on topics that most users will encounter when migrating their blocks. Finally, an equivalent RFNoC 3 and RFNoC 4 implementation of a digital gain RFNoC Block has been provided as a reference.&lt;br /&gt;
&lt;br /&gt;
=Prerequisites=&lt;br /&gt;
&lt;br /&gt;
===Dependencies (Ubuntu 20.04)===&lt;br /&gt;
  sudo apt-get install autoconf automake build-essential ccache cmake cpufrequtils doxygen ethtool \&lt;br /&gt;
  g++ git inetutils-tools libboost-all-dev libncurses5 libncurses5-dev libusb-1.0-0 libusb-1.0-0-dev \&lt;br /&gt;
  libusb-dev python3-dev python3-mako python3-numpy python3-requests python3-scipy python3-setuptools \&lt;br /&gt;
  python3-ruamel.yaml libtinfo5 libncurses5&lt;br /&gt;
&lt;br /&gt;
===Vivado 2019.1 Design Edition===&lt;br /&gt;
&lt;br /&gt;
Please reference to Xilinx (xilinx.com) for installation instructions.&lt;br /&gt;
&lt;br /&gt;
''Note: The dependencies step above included installing libtinfo5 libncurses5, which is a workaround for getting Vivado 2019.1 to run on Ubuntu 20.04''&lt;br /&gt;
&lt;br /&gt;
===UHD 4.0===&lt;br /&gt;
  git clone --branch UHD-4.0 https://github.com/ettusresearch/uhd.git uhd&lt;br /&gt;
  mkdir uhd/host/build; cd uhd/host/build&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
===GNU Radio 3.8===&lt;br /&gt;
'' Note: If your design does not use GNU Radio, then installing GNU Radio and gr-ettus is not required ''&lt;br /&gt;
&lt;br /&gt;
  git clone --branch maint-3.8 --recursive https://github.com/gnuradio/gnuradio.git gnuradio&lt;br /&gt;
  mkdir gnuradio/build; cd gnuradio/build;&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
Please refer to the [https://wiki.gnuradio.org/index.php/UbuntuInstall GNU Radio Build Instructions] for dependencies and a more detailed description.&lt;br /&gt;
&lt;br /&gt;
===gr-ettus===&lt;br /&gt;
  git clone --branch maint-3.8-uhd4.0 https://github.com/ettusresearch/gr-ettus.git gr-ettus&lt;br /&gt;
  mkdir gr-ettus/build; cd gr-ettus/build;&lt;br /&gt;
  cmake -DENABLE_QT=True ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
=RFNoC Block Development Environment=&lt;br /&gt;
&lt;br /&gt;
Two options exist for developing RFNoC blocks depending on whether the your RFNoC block integrates with GNU Radio in an out-of-tree module or if it only uses UHD’s C++ API in a standalone application. The sections below outline how to setup the development environment for each scenario.&lt;br /&gt;
&lt;br /&gt;
===Migrating a GNU Radio Out-of-Tree Module===&lt;br /&gt;
&lt;br /&gt;
The tool rfnocmodtool automates the process of creating GNU Radio out-of-tree (OOT) modules that also have support for RFNoC blocks. This tool is part of gr-ettus and it has been ported to RFNoC 4.&lt;br /&gt;
&lt;br /&gt;
Due to changes in almost every source file, it is recommended to use rfnocmodtool to generate a new RFNoC block from scratch and then update the generated “skeleton” files.&lt;br /&gt;
&lt;br /&gt;
====Creating a RFNoC Block with rfnocmodtool====&lt;br /&gt;
&lt;br /&gt;
The following steps show how to create an OOT module called ''example'' and RFNoC block called ''gain'' using rfnocmodtool. The naming is only for example purposes.&lt;br /&gt;
&lt;br /&gt;
  rfnocmodtool newmod&lt;br /&gt;
  Name of the new module: '''example'''&lt;br /&gt;
  &lt;br /&gt;
  cd rfnoc-tutorial&lt;br /&gt;
  rfnocmodtool add&lt;br /&gt;
  Enter name of block/code (without module name prefix): '''gain'''&lt;br /&gt;
  Enter valid argument list, including default arguments: ''(leave blank)''&lt;br /&gt;
  Add Python QA code? [y/N] '''N'''&lt;br /&gt;
  Add C++ QA code? [y/N] '''N'''&lt;br /&gt;
  Block NoC ID (Hexadecimal): ''(Enter Noc ID of your block)''&lt;br /&gt;
  Skip Block Controllers Generation? [UHD block ctrl files] [y/N] '''N'''&lt;br /&gt;
  Skip Block interface files Generation? [GRC block ctrl files] [y/N] '''N'''&lt;br /&gt;
&lt;br /&gt;
''Note: Noc IDs have been reduced from 64-bits in RFNoC 3 to 32-bits in RFNoC 4''&lt;br /&gt;
&lt;br /&gt;
The following are the relevant files that need to be updated when migrating your RFNoC Block.&lt;br /&gt;
&lt;br /&gt;
  rfnoc-example/&lt;br /&gt;
      grc/&lt;br /&gt;
          example_gain.block.yml           – RFNoC Block GNU Radio Companion YAML file&lt;br /&gt;
      examples/&lt;br /&gt;
          gain.grc                         – Example flowgraph using gain RFNoC Block&lt;br /&gt;
      include/tutorial/&lt;br /&gt;
          gain.h                           – GNU Radio block C++ header&lt;br /&gt;
          gain_block_ctrl.hpp              – RFNoC Block Controller C++ header&lt;br /&gt;
      lib/&lt;br /&gt;
          gain_impl.cc                     – GNU Radio block C++ source&lt;br /&gt;
          gain_impl.h                      – GNU Radio block C++ header&lt;br /&gt;
          gain_block_ctrl_impl.cpp         – RFNoC Block Controller C++ source&lt;br /&gt;
      rfnoc/blocks/&lt;br /&gt;
          gain.yml                         – RFNoC Block Description YAML file&lt;br /&gt;
      rfnoc/fpga/rfnoc_block_gain&lt;br /&gt;
          noc_shell_gain.v                 – RFNoC Block Noc Shell Verilog Source&lt;br /&gt;
          rfnoc_block_gain.v               – RFNoC Block Verilog Source&lt;br /&gt;
          rfnoc_block_gain_tb.v            – RFNoC Block Testbench&lt;br /&gt;
      rfnoc/icores&lt;br /&gt;
          gain_x310_rfnoc_image_core.yml   – Image Core YAML file with gain block&lt;br /&gt;
&lt;br /&gt;
====Building OOT module====&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-tutorial&lt;br /&gt;
  mkdir build; cd build&lt;br /&gt;
  cmake -DUHD_FPGA_DIR=''(path to uhd/fpga directory)'' ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
====Running a testbench====&lt;br /&gt;
CMake automatically creates makefile targets to run the generated testbench code for each added RFNoC block. For example, here is how to run the gain block testbench:&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-tutorial/build&lt;br /&gt;
  make rfnoc_block_gain_tb&lt;br /&gt;
&lt;br /&gt;
====Building a FPGA image====&lt;br /&gt;
CMake automatically creates makefile targets to build FPGA images using the generated image core yaml files found in rfnoc/icore. Every RFNoC block created by rfnocmodtool automatically has an image core yaml file generated in that directory. For example, here is how to build an FPGA image using the image core yaml file generated for the gain block:&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-tutorial/build&lt;br /&gt;
  make gain_x310_rfnoc_image_core&lt;br /&gt;
&lt;br /&gt;
===Migrating a Standalone UHD C++ Application===&lt;br /&gt;
&lt;br /&gt;
For applications that only use the UHD API, an example out-of-tree (UHD source tree) RFNoC block exists called rfnoc-example. It is located in the UHD source at uhd/host/examples/rfnoc-example. This directory can be copied outside of the UHD source tree and used a starting point to migrate your RFNoC block.&lt;br /&gt;
&lt;br /&gt;
The following are the relevant files that need to be updated when migrating your RFNoC Block.&lt;br /&gt;
&lt;br /&gt;
  rfnoc-example/&lt;br /&gt;
      apps/&lt;br /&gt;
          init_gain_block.cpp         – Example C++ application testing gain block&lt;br /&gt;
      blocks/&lt;br /&gt;
          gain.yml                    – RFNoC Block Description YAML file&lt;br /&gt;
      fpga/rfnoc_block_gain&lt;br /&gt;
          noc_shell_gain.v            – RFNoC Block Noc Shell Verilog Source&lt;br /&gt;
          rfnoc_block_gain.v          – RFNoC Block Verilog Source&lt;br /&gt;
          rfnoc_block_gain_tb.v       – RFNoC Block Testbench&lt;br /&gt;
      icores/&lt;br /&gt;
          x310_rfnoc_image_core.yml   – Example Image Core YAML file&lt;br /&gt;
      include/rfnoc/example&lt;br /&gt;
          gain_block_control.hpp      – RFNoC Block Controller C++ header&lt;br /&gt;
      lib/&lt;br /&gt;
          gain_block_control.cpp      – RFNoC Block Controller C++ source&lt;br /&gt;
&lt;br /&gt;
====Building rfnoc-example====&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-example&lt;br /&gt;
  mkdir build; cd build&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
====Running a testbench====&lt;br /&gt;
CMake automatically creates makefile targets to run RFNoC Block testbench simulations. For every RFNoC block subdirectory listed in the CMakeLists.txt file in the rfnoc-example/fpga directory, a target with the RFNoC block name appended with “_tb” is added as a makefile target. For example, here is how to run the gain RFNoC block testbench:&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-example/build&lt;br /&gt;
  make rfnoc_block_gain_tb&lt;br /&gt;
&lt;br /&gt;
====Building a FPGA image====&lt;br /&gt;
CMake automatically creates makefile targets to build a FPGA image for each image core yaml file listed in the CMakeLists.txt file in the rfnoc-example/icore directory. Each image core yaml file must be listed in the CMakeLists.txt. For example, here is how to build an FPGA image using the image core yaml file generated for the gain block:&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-tutorial/build&lt;br /&gt;
  make gain_x310_rfnoc_image_core&lt;br /&gt;
&lt;br /&gt;
=Example RFNoC 3 to RFNoC 4 Block Migration=&lt;br /&gt;
&lt;br /&gt;
This ZIP archive, [[File:migration_example.zip]], contains equivalent RFNoC 3 and RFNoC 4 versions of a digital gain RFNoC Block. The following sections will refer to files in this archive to show how the file structure changes when migrating from RFNoC 3 to RFNoC 4.&lt;br /&gt;
&lt;br /&gt;
=UHD Software Migration=&lt;br /&gt;
&lt;br /&gt;
Migration reference files for this section from Gain RFNoC Block example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Description       || RFNoC 3 Files         || RFNoC 4 Files&lt;br /&gt;
|-&lt;br /&gt;
| Block Description || rfnoc/blocks/gain.xml || lib/gain_block_ctrl_impl.cpp &amp;lt;br&amp;gt;include/example/gain_block_ctrl.hpp&lt;br /&gt;
|-&lt;br /&gt;
| Block Controller  || rfnoc/blocks/gain.yml || lib/gain_block_ctrl_impl.cpp &amp;lt;br&amp;gt;include/example/gain_block_ctrl.hpp&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Note: Files are relative to the rfnoc-example directory in the respective rfnoc3 and rfnoc4 directories''&lt;br /&gt;
&lt;br /&gt;
===Noc Script XML Replaced by Block Description YAML===&lt;br /&gt;
&lt;br /&gt;
RFNoC 3 used Noc Script XML, a domain specific language, to describe the configuration of a RFNoC block: the Noc ID, register names and addresses, args for writing to the registers, and the input/output ports.&lt;br /&gt;
&lt;br /&gt;
RFNoC 4 replaces the Noc Script XML file with an easier to read and edit Block Description YAML file format. From a high level, the Block Description YAML file serves a similar function as the Noc Script XML file, with some similarities and key differences outlined in table below:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Item       || Noc Script XML              || Block Descript YAML || RFNoC 4 Notes&lt;br /&gt;
|-&lt;br /&gt;
| Block Name&lt;br /&gt;
||&lt;br /&gt;
  &amp;lt;name&amp;gt;gain&amp;lt;/name&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
  module_name: gain&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Noc ID&lt;br /&gt;
||&lt;br /&gt;
  &amp;lt;id&amp;gt;B160000000000000&amp;lt;/id&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
  noc_id: 0xB16&lt;br /&gt;
||&lt;br /&gt;
Noc ID are limited to 32-bits&lt;br /&gt;
|-&lt;br /&gt;
| Registers&lt;br /&gt;
||&lt;br /&gt;
  &amp;lt;registers&amp;gt;&lt;br /&gt;
    &amp;lt;setreg&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;GAIN&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;address&amp;gt;128&amp;lt;/address&amp;gt;&lt;br /&gt;
    &amp;lt;/setreg&amp;gt;&lt;br /&gt;
  &amp;lt;/registers&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
Registers must be defined in the Block Controller&lt;br /&gt;
|-&lt;br /&gt;
| Arguments&lt;br /&gt;
||&lt;br /&gt;
  &amp;lt;args&amp;gt;&lt;br /&gt;
    &amp;lt;arg&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;gain&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;type&amp;gt;int&amp;lt;/type&amp;gt;&lt;br /&gt;
      ...&lt;br /&gt;
    &amp;lt;/arg&amp;gt;&lt;br /&gt;
  &amp;lt;/args&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
Args are implemented with properties in the Block Controller&lt;br /&gt;
|-&lt;br /&gt;
| Data Ports&lt;br /&gt;
||&lt;br /&gt;
  &amp;lt;ports&amp;gt;&lt;br /&gt;
    &amp;lt;sink&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;in&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;/sink&amp;gt;&lt;br /&gt;
    &amp;lt;source&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;out&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;/source&amp;gt;&lt;br /&gt;
  &amp;lt;/ports&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
  data:&lt;br /&gt;
      fpga_iface: axis_pyld_ctxt&lt;br /&gt;
      clk_domain: rfnoc_chdr&lt;br /&gt;
      inputs:&lt;br /&gt;
          in:&lt;br /&gt;
             ...&lt;br /&gt;
      outputs:&lt;br /&gt;
          out:&lt;br /&gt;
             ...&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Control Ports&lt;br /&gt;
||&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
  control:&lt;br /&gt;
      sw_iface: nocscript&lt;br /&gt;
      fpga_iface: ctrlport&lt;br /&gt;
      interface_direction: slave&lt;br /&gt;
      ...&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Clocking&lt;br /&gt;
||&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
  clocks:&lt;br /&gt;
      - name: rfnoc_chdr&lt;br /&gt;
        freq: &amp;quot;[]&amp;quot;&lt;br /&gt;
      - name: rfnoc_ctrl&lt;br /&gt;
        freq: &amp;quot;[]&amp;quot;&lt;br /&gt;
||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Note: For a more detailed description of the RFNoC 4 Block Description YAML syntax and the various options, see the [https://files.ettus.com/app_notes/RFNoC_Specification.pdf RFNoC Specification].''&lt;br /&gt;
&lt;br /&gt;
===RFNoC API Changes===&lt;br /&gt;
&lt;br /&gt;
Much of the user facing RFNoC software API has not changed or remains very similar between RFNoC 3 and RFNoC 4. The table below outlines some of the notable differences:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! RFNoC 3       || RFNoC 4              || RFNoC 4 Notes&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  usrp = uhd::device3::make(...)&lt;br /&gt;
||&lt;br /&gt;
  graph = uhd::rfnoc::rfnoc_graph::make()&lt;br /&gt;
||&lt;br /&gt;
No longer need to create a device3 object&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  usrp-&amp;gt;get_block_ctrl(...)&lt;br /&gt;
||&lt;br /&gt;
  graph-&amp;gt;get_block(...)&lt;br /&gt;
||&lt;br /&gt;
Rename&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
  graph-&amp;gt;enumerate_static_connections()&lt;br /&gt;
||&lt;br /&gt;
Used to check static connections, usually for detecting hwen a DDC or DUC is statically connected to the radio and requires setting the sample&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  usrp-&amp;gt;get_tx_streamer(...)&lt;br /&gt;
||&lt;br /&gt;
  graph-&amp;gt;create_tx_streamer(...)&lt;br /&gt;
||&lt;br /&gt;
Rename&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  usrp-&amp;gt;get_rx_streamer(...)&lt;br /&gt;
||&lt;br /&gt;
  graph-&amp;gt;create_rx_streamer(...)&lt;br /&gt;
||&lt;br /&gt;
Rename&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
  graph-&amp;gt;commit()&lt;br /&gt;
||&lt;br /&gt;
Commit graph and run initial checks&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  sr_write(...)&lt;br /&gt;
||&lt;br /&gt;
  regs().poke32(...)&lt;br /&gt;
||&lt;br /&gt;
Address increments by 4&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  sr_read32(...)&lt;br /&gt;
||&lt;br /&gt;
  regs().peek32(...)&lt;br /&gt;
||&lt;br /&gt;
Address increments by 4&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  sr_read64(...)&lt;br /&gt;
||&lt;br /&gt;
  regs().poke64(...)&lt;br /&gt;
||&lt;br /&gt;
Address increments by 8&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  set_arg(...)&lt;br /&gt;
||&lt;br /&gt;
  set_property(...)&lt;br /&gt;
||&lt;br /&gt;
Block args replaced with block properties concept&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  get_arg(...)&lt;br /&gt;
||&lt;br /&gt;
  get_property(...)&lt;br /&gt;
||&lt;br /&gt;
Block args replaced with block properties concept&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Block Properties===&lt;br /&gt;
&lt;br /&gt;
In RFNoC 3, RFNoC blocks can have arguments (also known as args) that are used to write user registers. This is implemented in the Noc Script XML in the &amp;lt;args&amp;gt; section.&lt;br /&gt;
&lt;br /&gt;
RFNoC 4 expands and generalizes this concept with block properties: a high-level representation of the state of the block. Zero or more properties can be defined by the user in their RFNoC Block’s Block Controller C++ class. When read or written to, they can trigger a call back to a user defined resolver function. The [https://files.ettus.com/app_notes/RFNoC_Specification.pdf RFNoC Specification] provides more details on properties in the “Block Properties” section.&lt;br /&gt;
&lt;br /&gt;
The following shows an example of how to migrate a RFNoC 3 Noc Script XML “arg” based register write to a RFNoC 4 property based implementation in the Block Controller:&lt;br /&gt;
&lt;br /&gt;
====RFNoC 3 Noc Script XML snippet====&lt;br /&gt;
  &amp;lt;registers&amp;gt;&lt;br /&gt;
    &amp;lt;setreg&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;GAIN&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;address&amp;gt;128&amp;lt;/address&amp;gt;&lt;br /&gt;
    &amp;lt;/setreg&amp;gt;&lt;br /&gt;
  &amp;lt;/registers&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;args&amp;gt;&lt;br /&gt;
    &amp;lt;arg&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;gain&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;type&amp;gt;int&amp;lt;/type&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;check&amp;gt;GE($gain, 0) AND LE($gain, 32767)&amp;lt;/check&amp;gt;&lt;br /&gt;
      &amp;lt;check_message&amp;gt;Gain must be in the range [0, 32767]&amp;lt;/check_message&amp;gt;&lt;br /&gt;
      &amp;lt;action&amp;gt;SR_WRITE(&amp;quot;GAIN&amp;quot;, $gain)&amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;/arg&amp;gt;&lt;br /&gt;
  &amp;lt;/args&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RFNoC 4 Block Controller Class====&lt;br /&gt;
&lt;br /&gt;
  // &amp;lt;registers&amp;gt;&lt;br /&gt;
  //    &amp;lt;setreg&amp;gt;&lt;br /&gt;
  //      &amp;lt;name&amp;gt;GAIN&amp;lt;/name&amp;gt;&lt;br /&gt;
  //      &amp;lt;address&amp;gt;128&amp;lt;/address&amp;gt;&lt;br /&gt;
  //    &amp;lt;/setreg&amp;gt;&lt;br /&gt;
  // &amp;lt;/registers&amp;gt;&lt;br /&gt;
  // Note: In RFNoC 4, register addresses can start at address 0 instead of address 128 as in RFNoC 3.&lt;br /&gt;
  const uint32_t gain_block_ctrl::REG_GAIN_ADDR = 128;&lt;br /&gt;
  const uint32_t gain_block_ctrl::REG_GAIN_DEFAULT = 1;&lt;br /&gt;
  &lt;br /&gt;
  class gain_block_ctrl_impl : public gain_block_ctrl&lt;br /&gt;
  {&lt;br /&gt;
  public:&lt;br /&gt;
      RFNOC_BLOCK_CONSTRUCTOR(gain_block_ctrl)&lt;br /&gt;
      {&lt;br /&gt;
          _register_props();&lt;br /&gt;
      }&lt;br /&gt;
  private:&lt;br /&gt;
      void _register_props()&lt;br /&gt;
      {&lt;br /&gt;
          register_property(&amp;amp;_user_reg, [this]() {&lt;br /&gt;
              int user_reg = this-&amp;gt;_user_reg.get();&lt;br /&gt;
              // &amp;lt;check&amp;gt;GE($gain, 0) AND LE($gain, 32767)&amp;lt;/check&amp;gt;&lt;br /&gt;
              // &amp;lt;check_message&amp;gt;Gain must be in the range [0, 32767]&amp;lt;/check_message&amp;gt;&lt;br /&gt;
              if (user_reg &amp;lt; 0 || user_reg &amp;gt; 32767) {&lt;br /&gt;
                  throw uhd::value_error(&amp;quot;Size value must be in [0,32767]&amp;quot;);&lt;br /&gt;
              }&lt;br /&gt;
              // &amp;lt;action&amp;gt;SR_WRITE(&amp;quot;GAIN&amp;quot;, $gain)&amp;lt;/action&amp;gt;&lt;br /&gt;
              this-&amp;gt;regs().poke32(REG_USER_ADDR, user_reg);&lt;br /&gt;
          });&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
  // &amp;lt;name&amp;gt;gain&amp;lt;/name&amp;gt;&lt;br /&gt;
  // &amp;lt;type&amp;gt;int&amp;lt;/type&amp;gt;&lt;br /&gt;
  // &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
  property_t&amp;lt;int&amp;gt; _user_reg{&amp;quot;gain&amp;quot;, REG_USER_DEFAULT, {res_source_info::USER}};&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
As the above shows, writing to a register can be replicated with a property and a resolver function. Of course, the resolver function can also be made much more sophisticated. For additional examples, see the in-tree block controllers in uhd/host/lib/rfnoc.&lt;br /&gt;
&lt;br /&gt;
=FPGA Migration=&lt;br /&gt;
&lt;br /&gt;
Migration reference files for this section from Gain RFNoC Block example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Description        || RFNoC 3 Files                                       || RFNoC 4 Files&lt;br /&gt;
|-&lt;br /&gt;
| Block Verilog Code || rfnoc/fpga-src/noc_block_gain.v                     || rfnoc/fpga/rfnoc_block_gain/rfnoc_block_gain.v&lt;br /&gt;
|-&lt;br /&gt;
| Block Noc Shell    || N/A                                                 || rfnoc/fpga/rfnoc_block_gain/noc_shell_gain.v&lt;br /&gt;
|-&lt;br /&gt;
| Block Testbnech    || rfnoc/testbench/noc_block_gain/noc_block_gain_tb.sv || rfnoc/fpga/rfnoc_block_gain/rfnoc_block_gain_tb.sv&lt;br /&gt;
|-&lt;br /&gt;
| Image Core         || N/A                                                 || rfnoc/icores/gain_x310_rfnoc_image_core.yml&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Note: Files are relative to the rfnoc-example directory in the respective rfnoc3 and rfnoc4 directories''&lt;br /&gt;
&lt;br /&gt;
===Noc Shell Changes===&lt;br /&gt;
&lt;br /&gt;
RFNoC 4 replaces the highly parameterized RFNoC 3 Noc Shell with a per-block customized Noc Shell generated from the block’s Block Description YAML file. The Noc Shell generated via rfnocmodtool or the existing one in rfnoc-example is acceptable for most blocks that require one input and output data port.&lt;br /&gt;
&lt;br /&gt;
====Generating a Custom Noc Shell====&lt;br /&gt;
&lt;br /&gt;
Some blocks may need multiple data ports or other modifications. This requires editing the Block Description YAML file and then using the Python script rfnoc_create_verilog.py (found in uhd/host/utils/rfnoc_blocktool) to generate a new Noc Shell instance.&lt;br /&gt;
&lt;br /&gt;
The argument “-c” is used to provide the YAML file location. “-d” provides the output destination directory.&lt;br /&gt;
&lt;br /&gt;
''Note: It is suggested to not set the destination directory to your existing RFNoC block code, as the script will automatically overwrite the existing code!''&lt;br /&gt;
&lt;br /&gt;
Example usage:&lt;br /&gt;
  rfnoc_create_verilog.py -c ./rfnoc-example/rfnoc/blocks/gain.yml -d ./output/&lt;br /&gt;
&lt;br /&gt;
====Changing Noc ID without using rfnoc_create_verilog====&lt;br /&gt;
&lt;br /&gt;
In the generated Noc Shell Verilog code, a block’s Noc ID can be changed by updating the NOC_ID parameter on the ''backend_iface'' module. Make sure this matches the Noc ID in both the Block Description YAML file and Block Controller C++ code.&lt;br /&gt;
&lt;br /&gt;
====Goodbye AXI Wrapper====&lt;br /&gt;
&lt;br /&gt;
The RFNoC 3 version of Noc Shell outputs / accepts CHDR data packets consisting of a header, optional timestamp, and payload on a 64-bit AXI stream bus. Most designs then used a module called AXI Wrapper to handle the conversion between CHDR data packets and sample streams on a 32-bit AXI stream bus. AXI Wrapper also supported SIMPLE_MODE which for some use cases could transparently handle the header portion of the CHDR data packet. Otherwise, the user would need to set the header via m_axis_data_tuser.&lt;br /&gt;
&lt;br /&gt;
In RFNoC 4, Noc Shell has absorbed AXI Wrapper’s functionality. Noc Shell outputs two AXI stream buses per input / output port: a payload and context bus. The payload bus is in most cases identical to AXI Wrapper’s output: a 32-bit stream of samples on an AXI Stream bus with packets delimited by tlast. The context AXI stream bus carries the header, optional timestamp, and optional metadata. If your block used AXI Wrapper’s SIMPLE_MODE, then you can loop the context bus back into Noc Shell. If not, you will need to modify the context bus data. Refer to the [https://files.ettus.com/app_notes/RFNoC_Specification.pdf RFNoC Specification] for the format and timing diagram of the context bus.&lt;br /&gt;
&lt;br /&gt;
''Important Note: If your block used the AXI Rate Change module, Noc Shell has another data port mode to support this use case called '''axis_data''' that can be set in the Block Descriptor YAML file (see the fpga_iface entry). This mode causes the Noc Shell data ports to look more like AXI Wrapper’s and therefore makes them compatible with AXI Rate Change. See the DDC, DUC, or Keep One in N RFNoC Blocks for an example.''&lt;br /&gt;
&lt;br /&gt;
===Settings Bus replaced by CtrlPort===&lt;br /&gt;
&lt;br /&gt;
CtrlPort replaces the Settings Bus in RFNoC 4. The CtrlPort bus is similar to the Settings Bus with a few key differences. The table below compares the signaling between the two bus formats and provides notes on any differences. Timing diagrams and additional information on the CtrlPort bus is also available in the [https://files.ettus.com/app_notes/RFNoC_Specification.pdf RFNoC Specification].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Settings Bus (RFNoC 3) || CtrlPort (RFNoC 4)                              || RFNoC 4 Notes&lt;br /&gt;
|-&lt;br /&gt;
| set_stb                || ctrlport_reg_wr                                 || Write strobe&lt;br /&gt;
|-&lt;br /&gt;
| set_addr               || ctrlport_req_addr                               || 20-bits instead of 8-bits, increments by 4 instead of by 1, no reserved addresses (versus addresses 0-127 for Settings Bus)&lt;br /&gt;
|-&lt;br /&gt;
| set_data               || ctrlport_req_data                               || Write data&lt;br /&gt;
|-&lt;br /&gt;
| N/A                    || ctrlport_req_rd                                 || Read strobe equivalent of ctrlport_req_wr&lt;br /&gt;
|-&lt;br /&gt;
| rb_addr                || N/A                                             || CtrlPort uses ctrlport_req_addr for both '''read and write''' addresses&lt;br /&gt;
|-&lt;br /&gt;
| rb_data                || ctrlport_resp_data                              || Read data, 32-bits instead of 64-bits&lt;br /&gt;
|-&lt;br /&gt;
| rb_stb                 || N/A                                             || CtrlPort requires ack strobe for '''reads and writes'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
One additional difference when using CtrlPort is that there is not an equivalent Settings Register module. The bus is simple enough to setup a clocked process to handle reading from and writing to registers. See the Verilog example below:&lt;br /&gt;
&lt;br /&gt;
  // Note: Register addresses increment by 4&lt;br /&gt;
  localparam REG_USER_ADDR    = 0; // Address for example user register&lt;br /&gt;
  localparam REG_USER_DEFAULT = 0; // Default value for user register&lt;br /&gt;
  &lt;br /&gt;
  reg [31:0] reg_user = REG_USER_DEFAULT;&lt;br /&gt;
  &lt;br /&gt;
  always @(posedge ctrlport_clk) begin&lt;br /&gt;
    if (ctrlport_rst) begin&lt;br /&gt;
      reg_user = REG_USER_DEFAULT;&lt;br /&gt;
    end else begin&lt;br /&gt;
      // Default assignment&lt;br /&gt;
      m_ctrlport_resp_ack &amp;lt;= 0;&lt;br /&gt;
  &lt;br /&gt;
      // Read user register&lt;br /&gt;
      if (m_ctrlport_req_rd) begin // Read request&lt;br /&gt;
        case (m_ctrlport_req_addr)&lt;br /&gt;
          REG_USER_ADDR: begin&lt;br /&gt;
            m_ctrlport_resp_ack  &amp;lt;= 1;&lt;br /&gt;
            m_ctrlport_resp_data &amp;lt;= reg_user;&lt;br /&gt;
          end&lt;br /&gt;
        endcase&lt;br /&gt;
      end&lt;br /&gt;
  &lt;br /&gt;
      // Write user register&lt;br /&gt;
      if (m_ctrlport_req_wr) begin // Write requst&lt;br /&gt;
        case (m_ctrlport_req_addr)&lt;br /&gt;
          REG_USER_ADDR: begin&lt;br /&gt;
            m_ctrlport_resp_ack &amp;lt;= 1;&lt;br /&gt;
            reg_user            &amp;lt;= m_ctrlport_req_data[31:0];&lt;br /&gt;
          end&lt;br /&gt;
        endcase&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
''Important Note: For blocks that make heavy use of the Settings Bus and/or Settings Registers, there is a CtrlPort to Settings Bus bridge available called '''ctrlport_to_settings_bus'''. See the Keep One In N RFNoC Block for example code on how to interface with it.''&lt;br /&gt;
&lt;br /&gt;
===Testbench Infrastructure===&lt;br /&gt;
&lt;br /&gt;
While RFNoC 4 does overhaul the RFNoC 3 testbench infrastructure API, most of the high level concepts remain the same. The table below outlines some of the commonly used RFNoC 3 functions / code and the RFNoC 4 equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Operation                || RFNoC 3                                                       || RFNoC 4&lt;br /&gt;
|-&lt;br /&gt;
| Setup RFNoC&lt;br /&gt;
||&lt;br /&gt;
  `RFNOC_SIM_INIT(...)&lt;br /&gt;
  `RFNOC_ADD_BLOCK(...)&lt;br /&gt;
  `RFNOC_CONNECT(...)&lt;br /&gt;
||&lt;br /&gt;
  RfnocBlockCtrlBfm #(...) blk_ctrl = new(...);&lt;br /&gt;
  blk_ctrl.connect_master_data_port(...)&lt;br /&gt;
  blk_ctrl.connect_slave_data_port(...)&lt;br /&gt;
''Note: Instantiate one Block Controller BFM per RFNoC Block''&lt;br /&gt;
|-&lt;br /&gt;
| Setup Test Cases&lt;br /&gt;
||&lt;br /&gt;
  `TEST_CASE_START(...)&lt;br /&gt;
  `TEST_CASE_DONE(...)&lt;br /&gt;
||&lt;br /&gt;
  test.start_test(...)&lt;br /&gt;
  test.end_test()&lt;br /&gt;
|-&lt;br /&gt;
| Register Read&lt;br /&gt;
||&lt;br /&gt;
  tb_streamer.read_reg(...)&lt;br /&gt;
||&lt;br /&gt;
  blk_ctrl.reg_read(...)&lt;br /&gt;
|-&lt;br /&gt;
| Register Write&lt;br /&gt;
||&lt;br /&gt;
  tb_streamer.write_reg(...)&lt;br /&gt;
||&lt;br /&gt;
  blk_ctrl.reg_write(...)&lt;br /&gt;
|-&lt;br /&gt;
| Send Data / Samples&lt;br /&gt;
||&lt;br /&gt;
  tb_streamer.send(...)&lt;br /&gt;
||&lt;br /&gt;
  blk_ctrl.send_items(...)&lt;br /&gt;
|-&lt;br /&gt;
| Receive Data / Samples&lt;br /&gt;
||&lt;br /&gt;
  tb_streamer.recv(...)&lt;br /&gt;
||&lt;br /&gt;
  blk_ctrl.recv_items(...)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Building FPGA images using Image Core YAML Files===&lt;br /&gt;
&lt;br /&gt;
RFNoC 4 replaces uhd_image_builder, the RFNoC 3 FPGA image building tool, with a new tool called rfnoc_image_builder. This tool produces a FPGA bitstream based on an Image Core YAML file that describes the device configuration (e.g. X310 with dual 10GigE) and included RFNoC blocks along with their connections (both static and dynamic), clocking, and I/O.&lt;br /&gt;
&lt;br /&gt;
Both rfnocmodtool and the UHD in-tree example called rfnoc-example automatically setup make targets to handle running rfnoc_image_builder. If you want to use rfnoc_image_builder directly, more details can be found in the [https://kb.ettus.com/Getting_Started_with_RFNoC_in_UHD_4.0 Getting Started with RFNoC in UHD 4.0].&lt;br /&gt;
&lt;br /&gt;
=GNU Radio Software Migration=&lt;br /&gt;
&lt;br /&gt;
RFNoC 4 supports GNU Radio 3.8 only. Most of your RFNoC Block’s GNU Radio related changes will be due to API differences between GNU Radio 3.7 to 3.8. These changes are outside of the scope of this article. Instead, refer to [https://wiki.gnuradio.org/index.php/GNU_Radio_3.8_OOT_Module_Porting_Guide GNU Radio 3.8 Migration Guide] and [https://wiki.gnuradio.org/index.php/YAML_GRC GNU Radio Companion YAML] sites for more information.&lt;br /&gt;
&lt;br /&gt;
Migration reference files for this section from Gain RFNoC Block example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Description              || RFNoC 3 Files                                                 || RFNoC 4 Files&lt;br /&gt;
|-&lt;br /&gt;
| GNU Radio Block          || lib/gain_impl.cc&amp;lt;br&amp;gt;lib/gain_impl.h&amp;lt;br&amp;gt;include/example/gain.h || lib/gain_impl.cc&amp;lt;br&amp;gt;lib/gain_impl.h&amp;lt;br&amp;gt;include/example/gain.h&lt;br /&gt;
|-&lt;br /&gt;
| GRC Block Description    || grc/gain.xml                                                  || grc/gain.yml&lt;br /&gt;
|-&lt;br /&gt;
| Example GRC Flowgraph    || examples/gain.grc                                             || examples/gain.grc&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Note: Files are relative to the rfnoc-example directory in the respective rfnoc3 and rfnoc4 directories''&lt;br /&gt;
&lt;br /&gt;
===RX &amp;amp; TX Streamer Blocks===&lt;br /&gt;
&lt;br /&gt;
When transition between a RFNoC block and a GNU Radio block or vice versa, you must insert either a RX stream or TX streamer block respectively. This differs from RFNoC 3, where a RFNoC block could be directly connected to a GNU Radio block.&lt;br /&gt;
&lt;br /&gt;
[[File:rx_tx_streamer.png|border]]&lt;br /&gt;
&lt;br /&gt;
===Setting RFNoC Block Properties Directly in GNU Radio===&lt;br /&gt;
&lt;br /&gt;
The base class for RFNoC Block’s in GNU Radio have a set of functions that provide a shortcut to getting and setting properties without writing custom class methods. The table below lists the functions.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property Type     || Set Property             || Get Property&lt;br /&gt;
|-&lt;br /&gt;
| Integer           || set_int_property(...)    || get_int_property(...)&lt;br /&gt;
|-&lt;br /&gt;
| Double            || set_double_property(...) || get_double_property(...)&lt;br /&gt;
|-&lt;br /&gt;
| Bool              || set_bool_property(...)   || get_bool_property(...)&lt;br /&gt;
|-&lt;br /&gt;
| String            || set_string_property(...) || get_string_property(...)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Example code for GNU Radio Companion YAML Block Description file'''&lt;br /&gt;
  templates:&lt;br /&gt;
    imports: |-&lt;br /&gt;
      import example&lt;br /&gt;
    make: |-&lt;br /&gt;
      example.gain(&lt;br /&gt;
        self.rfnoc_graph,&lt;br /&gt;
        uhd.device_addr(${block_args}),&lt;br /&gt;
        ${device_select},&lt;br /&gt;
        ${instance_select})&lt;br /&gt;
      self.${id}.set_int_property('gain', ${gain})&lt;br /&gt;
    callbacks:&lt;br /&gt;
    - set_int_property('gain', ${gain})&lt;/div&gt;</summary>
		<author><name>MartinAnderseck</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=RFNoC_4_Migration_Guide&amp;diff=5239</id>
		<title>RFNoC 4 Migration Guide</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=RFNoC_4_Migration_Guide&amp;diff=5239"/>
				<updated>2021-11-19T10:00:16Z</updated>
		
		<summary type="html">&lt;p&gt;MartinAnderseck: /* Dependencies (Ubuntu 20.04) */ Bringing back libtinfo5 libncurses5, removal was way too quick.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Abstract=&lt;br /&gt;
&lt;br /&gt;
The UHD 4.0 release includes a major upgrade to the RFNoC framework called RFNoC 4. This article is a guide to aid users in migrating their existing RFNoC blocks from RFNoC 3 to RFNoC 4. The RFNoC Block Development Environment section provides guidance on how to setup an environment for developing out-of-tree RFNoC blocks in RFNoC 4. The UHD, FPGA, GNU Radio Migration sections provide general information on topics that most users will encounter when migrating their blocks. Finally, an equivalent RFNoC 3 and RFNoC 4 implementation of a digital gain RFNoC Block has been provided as a reference.&lt;br /&gt;
&lt;br /&gt;
=Prerequisites=&lt;br /&gt;
&lt;br /&gt;
===Dependencies (Ubuntu 20.04)===&lt;br /&gt;
  sudo apt-get install autoconf automake build-essential ccache cmake cpufrequtils doxygen ethtool \&lt;br /&gt;
  g++ git inetutils-tools libboost-all-dev libncurses5 libncurses5-dev libusb-1.0-0 libusb-1.0-0-dev \&lt;br /&gt;
  libusb-dev python3-dev python3-mako python3-numpy python3-requests python3-scipy python3-setuptools \&lt;br /&gt;
  python3-ruamel.yaml libtinfo5 libncurses5&lt;br /&gt;
&lt;br /&gt;
===Vivado 2019.1 Design Edition===&lt;br /&gt;
&lt;br /&gt;
Please reference to Xilinx (xilinx.com) for installation instructions.&lt;br /&gt;
&lt;br /&gt;
''Note: The dependencies step above included installing libtinfo5 libncurses5, which is a workaround for getting Vivado 2019.1 to run on Ubuntu 20.04''&lt;br /&gt;
&lt;br /&gt;
===UHD 4.0===&lt;br /&gt;
  git clone --branch UHD-4.0 https://github.com/ettusresearch/uhd.git uhd&lt;br /&gt;
  mkdir uhd/host/build; cd uhd/host/build&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
===GNU Radio 3.8===&lt;br /&gt;
'' Note: If your design does not use GNU Radio, then installing GNU Radio and gr-ettus is not required ''&lt;br /&gt;
&lt;br /&gt;
  git clone --branch maint-3.8 --recursive https://github.com/gnuradio/gnuradio.git gnuradio&lt;br /&gt;
  mkdir gnuradio/build; cd gnuradio/build;&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
===gr-ettus===&lt;br /&gt;
  git clone --branch maint-3.8-uhd4.0 https://github.com/ettusresearch/gr-ettus.git gr-ettus&lt;br /&gt;
  mkdir gr-ettus/build; cd gr-ettus/build;&lt;br /&gt;
  cmake -DENABLE_QT=True ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
=RFNoC Block Development Environment=&lt;br /&gt;
&lt;br /&gt;
Two options exist for developing RFNoC blocks depending on whether the your RFNoC block integrates with GNU Radio in an out-of-tree module or if it only uses UHD’s C++ API in a standalone application. The sections below outline how to setup the development environment for each scenario.&lt;br /&gt;
&lt;br /&gt;
===Migrating a GNU Radio Out-of-Tree Module===&lt;br /&gt;
&lt;br /&gt;
The tool rfnocmodtool automates the process of creating GNU Radio out-of-tree (OOT) modules that also have support for RFNoC blocks. This tool is part of gr-ettus and it has been ported to RFNoC 4.&lt;br /&gt;
&lt;br /&gt;
Due to changes in almost every source file, it is recommended to use rfnocmodtool to generate a new RFNoC block from scratch and then update the generated “skeleton” files.&lt;br /&gt;
&lt;br /&gt;
====Creating a RFNoC Block with rfnocmodtool====&lt;br /&gt;
&lt;br /&gt;
The following steps show how to create an OOT module called ''example'' and RFNoC block called ''gain'' using rfnocmodtool. The naming is only for example purposes.&lt;br /&gt;
&lt;br /&gt;
  rfnocmodtool newmod&lt;br /&gt;
  Name of the new module: '''example'''&lt;br /&gt;
  &lt;br /&gt;
  cd rfnoc-tutorial&lt;br /&gt;
  rfnocmodtool add&lt;br /&gt;
  Enter name of block/code (without module name prefix): '''gain'''&lt;br /&gt;
  Enter valid argument list, including default arguments: ''(leave blank)''&lt;br /&gt;
  Add Python QA code? [y/N] '''N'''&lt;br /&gt;
  Add C++ QA code? [y/N] '''N'''&lt;br /&gt;
  Block NoC ID (Hexadecimal): ''(Enter Noc ID of your block)''&lt;br /&gt;
  Skip Block Controllers Generation? [UHD block ctrl files] [y/N] '''N'''&lt;br /&gt;
  Skip Block interface files Generation? [GRC block ctrl files] [y/N] '''N'''&lt;br /&gt;
&lt;br /&gt;
''Note: Noc IDs have been reduced from 64-bits in RFNoC 3 to 32-bits in RFNoC 4''&lt;br /&gt;
&lt;br /&gt;
The following are the relevant files that need to be updated when migrating your RFNoC Block.&lt;br /&gt;
&lt;br /&gt;
  rfnoc-example/&lt;br /&gt;
      grc/&lt;br /&gt;
          example_gain.block.yml           – RFNoC Block GNU Radio Companion YAML file&lt;br /&gt;
      examples/&lt;br /&gt;
          gain.grc                         – Example flowgraph using gain RFNoC Block&lt;br /&gt;
      include/tutorial/&lt;br /&gt;
          gain.h                           – GNU Radio block C++ header&lt;br /&gt;
          gain_block_ctrl.hpp              – RFNoC Block Controller C++ header&lt;br /&gt;
      lib/&lt;br /&gt;
          gain_impl.cc                     – GNU Radio block C++ source&lt;br /&gt;
          gain_impl.h                      – GNU Radio block C++ header&lt;br /&gt;
          gain_block_ctrl_impl.cpp         – RFNoC Block Controller C++ source&lt;br /&gt;
      rfnoc/blocks/&lt;br /&gt;
          gain.yml                         – RFNoC Block Description YAML file&lt;br /&gt;
      rfnoc/fpga/rfnoc_block_gain&lt;br /&gt;
          noc_shell_gain.v                 – RFNoC Block Noc Shell Verilog Source&lt;br /&gt;
          rfnoc_block_gain.v               – RFNoC Block Verilog Source&lt;br /&gt;
          rfnoc_block_gain_tb.v            – RFNoC Block Testbench&lt;br /&gt;
      rfnoc/icores&lt;br /&gt;
          gain_x310_rfnoc_image_core.yml   – Image Core YAML file with gain block&lt;br /&gt;
&lt;br /&gt;
====Building OOT module====&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-tutorial&lt;br /&gt;
  mkdir build; cd build&lt;br /&gt;
  cmake -DUHD_FPGA_DIR=''(path to uhd/fpga directory)'' ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
====Running a testbench====&lt;br /&gt;
CMake automatically creates makefile targets to run the generated testbench code for each added RFNoC block. For example, here is how to run the gain block testbench:&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-tutorial/build&lt;br /&gt;
  make rfnoc_block_gain_tb&lt;br /&gt;
&lt;br /&gt;
====Building a FPGA image====&lt;br /&gt;
CMake automatically creates makefile targets to build FPGA images using the generated image core yaml files found in rfnoc/icore. Every RFNoC block created by rfnocmodtool automatically has an image core yaml file generated in that directory. For example, here is how to build an FPGA image using the image core yaml file generated for the gain block:&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-tutorial/build&lt;br /&gt;
  make gain_x310_rfnoc_image_core&lt;br /&gt;
&lt;br /&gt;
===Migrating a Standalone UHD C++ Application===&lt;br /&gt;
&lt;br /&gt;
For applications that only use the UHD API, an example out-of-tree (UHD source tree) RFNoC block exists called rfnoc-example. It is located in the UHD source at uhd/host/examples/rfnoc-example. This directory can be copied outside of the UHD source tree and used a starting point to migrate your RFNoC block.&lt;br /&gt;
&lt;br /&gt;
The following are the relevant files that need to be updated when migrating your RFNoC Block.&lt;br /&gt;
&lt;br /&gt;
  rfnoc-example/&lt;br /&gt;
      apps/&lt;br /&gt;
          init_gain_block.cpp         – Example C++ application testing gain block&lt;br /&gt;
      blocks/&lt;br /&gt;
          gain.yml                    – RFNoC Block Description YAML file&lt;br /&gt;
      fpga/rfnoc_block_gain&lt;br /&gt;
          noc_shell_gain.v            – RFNoC Block Noc Shell Verilog Source&lt;br /&gt;
          rfnoc_block_gain.v          – RFNoC Block Verilog Source&lt;br /&gt;
          rfnoc_block_gain_tb.v       – RFNoC Block Testbench&lt;br /&gt;
      icores/&lt;br /&gt;
          x310_rfnoc_image_core.yml   – Example Image Core YAML file&lt;br /&gt;
      include/rfnoc/example&lt;br /&gt;
          gain_block_control.hpp      – RFNoC Block Controller C++ header&lt;br /&gt;
      lib/&lt;br /&gt;
          gain_block_control.cpp      – RFNoC Block Controller C++ source&lt;br /&gt;
&lt;br /&gt;
====Building rfnoc-example====&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-example&lt;br /&gt;
  mkdir build; cd build&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
====Running a testbench====&lt;br /&gt;
CMake automatically creates makefile targets to run RFNoC Block testbench simulations. For every RFNoC block subdirectory listed in the CMakeLists.txt file in the rfnoc-example/fpga directory, a target with the RFNoC block name appended with “_tb” is added as a makefile target. For example, here is how to run the gain RFNoC block testbench:&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-example/build&lt;br /&gt;
  make rfnoc_block_gain_tb&lt;br /&gt;
&lt;br /&gt;
====Building a FPGA image====&lt;br /&gt;
CMake automatically creates makefile targets to build a FPGA image for each image core yaml file listed in the CMakeLists.txt file in the rfnoc-example/icore directory. Each image core yaml file must be listed in the CMakeLists.txt. For example, here is how to build an FPGA image using the image core yaml file generated for the gain block:&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-tutorial/build&lt;br /&gt;
  make gain_x310_rfnoc_image_core&lt;br /&gt;
&lt;br /&gt;
=Example RFNoC 3 to RFNoC 4 Block Migration=&lt;br /&gt;
&lt;br /&gt;
This ZIP archive, [[File:migration_example.zip]], contains equivalent RFNoC 3 and RFNoC 4 versions of a digital gain RFNoC Block. The following sections will refer to files in this archive to show how the file structure changes when migrating from RFNoC 3 to RFNoC 4.&lt;br /&gt;
&lt;br /&gt;
=UHD Software Migration=&lt;br /&gt;
&lt;br /&gt;
Migration reference files for this section from Gain RFNoC Block example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Description       || RFNoC 3 Files         || RFNoC 4 Files&lt;br /&gt;
|-&lt;br /&gt;
| Block Description || rfnoc/blocks/gain.xml || lib/gain_block_ctrl_impl.cpp &amp;lt;br&amp;gt;include/example/gain_block_ctrl.hpp&lt;br /&gt;
|-&lt;br /&gt;
| Block Controller  || rfnoc/blocks/gain.yml || lib/gain_block_ctrl_impl.cpp &amp;lt;br&amp;gt;include/example/gain_block_ctrl.hpp&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Note: Files are relative to the rfnoc-example directory in the respective rfnoc3 and rfnoc4 directories''&lt;br /&gt;
&lt;br /&gt;
===Noc Script XML Replaced by Block Description YAML===&lt;br /&gt;
&lt;br /&gt;
RFNoC 3 used Noc Script XML, a domain specific language, to describe the configuration of a RFNoC block: the Noc ID, register names and addresses, args for writing to the registers, and the input/output ports.&lt;br /&gt;
&lt;br /&gt;
RFNoC 4 replaces the Noc Script XML file with an easier to read and edit Block Description YAML file format. From a high level, the Block Description YAML file serves a similar function as the Noc Script XML file, with some similarities and key differences outlined in table below:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Item       || Noc Script XML              || Block Descript YAML || RFNoC 4 Notes&lt;br /&gt;
|-&lt;br /&gt;
| Block Name&lt;br /&gt;
||&lt;br /&gt;
  &amp;lt;name&amp;gt;gain&amp;lt;/name&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
  module_name: gain&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Noc ID&lt;br /&gt;
||&lt;br /&gt;
  &amp;lt;id&amp;gt;B160000000000000&amp;lt;/id&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
  noc_id: 0xB16&lt;br /&gt;
||&lt;br /&gt;
Noc ID are limited to 32-bits&lt;br /&gt;
|-&lt;br /&gt;
| Registers&lt;br /&gt;
||&lt;br /&gt;
  &amp;lt;registers&amp;gt;&lt;br /&gt;
    &amp;lt;setreg&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;GAIN&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;address&amp;gt;128&amp;lt;/address&amp;gt;&lt;br /&gt;
    &amp;lt;/setreg&amp;gt;&lt;br /&gt;
  &amp;lt;/registers&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
Registers must be defined in the Block Controller&lt;br /&gt;
|-&lt;br /&gt;
| Arguments&lt;br /&gt;
||&lt;br /&gt;
  &amp;lt;args&amp;gt;&lt;br /&gt;
    &amp;lt;arg&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;gain&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;type&amp;gt;int&amp;lt;/type&amp;gt;&lt;br /&gt;
      ...&lt;br /&gt;
    &amp;lt;/arg&amp;gt;&lt;br /&gt;
  &amp;lt;/args&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
Args are implemented with properties in the Block Controller&lt;br /&gt;
|-&lt;br /&gt;
| Data Ports&lt;br /&gt;
||&lt;br /&gt;
  &amp;lt;ports&amp;gt;&lt;br /&gt;
    &amp;lt;sink&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;in&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;/sink&amp;gt;&lt;br /&gt;
    &amp;lt;source&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;out&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;/source&amp;gt;&lt;br /&gt;
  &amp;lt;/ports&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
  data:&lt;br /&gt;
      fpga_iface: axis_pyld_ctxt&lt;br /&gt;
      clk_domain: rfnoc_chdr&lt;br /&gt;
      inputs:&lt;br /&gt;
          in:&lt;br /&gt;
             ...&lt;br /&gt;
      outputs:&lt;br /&gt;
          out:&lt;br /&gt;
             ...&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Control Ports&lt;br /&gt;
||&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
  control:&lt;br /&gt;
      sw_iface: nocscript&lt;br /&gt;
      fpga_iface: ctrlport&lt;br /&gt;
      interface_direction: slave&lt;br /&gt;
      ...&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Clocking&lt;br /&gt;
||&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
  clocks:&lt;br /&gt;
      - name: rfnoc_chdr&lt;br /&gt;
        freq: &amp;quot;[]&amp;quot;&lt;br /&gt;
      - name: rfnoc_ctrl&lt;br /&gt;
        freq: &amp;quot;[]&amp;quot;&lt;br /&gt;
||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Note: For a more detailed description of the RFNoC 4 Block Description YAML syntax and the various options, see the [https://files.ettus.com/app_notes/RFNoC_Specification.pdf RFNoC Specification].''&lt;br /&gt;
&lt;br /&gt;
===RFNoC API Changes===&lt;br /&gt;
&lt;br /&gt;
Much of the user facing RFNoC software API has not changed or remains very similar between RFNoC 3 and RFNoC 4. The table below outlines some of the notable differences:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! RFNoC 3       || RFNoC 4              || RFNoC 4 Notes&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  usrp = uhd::device3::make(...)&lt;br /&gt;
||&lt;br /&gt;
  graph = uhd::rfnoc::rfnoc_graph::make()&lt;br /&gt;
||&lt;br /&gt;
No longer need to create a device3 object&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  usrp-&amp;gt;get_block_ctrl(...)&lt;br /&gt;
||&lt;br /&gt;
  graph-&amp;gt;get_block(...)&lt;br /&gt;
||&lt;br /&gt;
Rename&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
  graph-&amp;gt;enumerate_static_connections()&lt;br /&gt;
||&lt;br /&gt;
Used to check static connections, usually for detecting hwen a DDC or DUC is statically connected to the radio and requires setting the sample&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  usrp-&amp;gt;get_tx_streamer(...)&lt;br /&gt;
||&lt;br /&gt;
  graph-&amp;gt;create_tx_streamer(...)&lt;br /&gt;
||&lt;br /&gt;
Rename&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  usrp-&amp;gt;get_rx_streamer(...)&lt;br /&gt;
||&lt;br /&gt;
  graph-&amp;gt;create_rx_streamer(...)&lt;br /&gt;
||&lt;br /&gt;
Rename&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
  graph-&amp;gt;commit()&lt;br /&gt;
||&lt;br /&gt;
Commit graph and run initial checks&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  sr_write(...)&lt;br /&gt;
||&lt;br /&gt;
  regs().poke32(...)&lt;br /&gt;
||&lt;br /&gt;
Address increments by 4&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  sr_read32(...)&lt;br /&gt;
||&lt;br /&gt;
  regs().peek32(...)&lt;br /&gt;
||&lt;br /&gt;
Address increments by 4&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  sr_read64(...)&lt;br /&gt;
||&lt;br /&gt;
  regs().poke64(...)&lt;br /&gt;
||&lt;br /&gt;
Address increments by 8&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  set_arg(...)&lt;br /&gt;
||&lt;br /&gt;
  set_property(...)&lt;br /&gt;
||&lt;br /&gt;
Block args replaced with block properties concept&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  get_arg(...)&lt;br /&gt;
||&lt;br /&gt;
  get_property(...)&lt;br /&gt;
||&lt;br /&gt;
Block args replaced with block properties concept&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Block Properties===&lt;br /&gt;
&lt;br /&gt;
In RFNoC 3, RFNoC blocks can have arguments (also known as args) that are used to write user registers. This is implemented in the Noc Script XML in the &amp;lt;args&amp;gt; section.&lt;br /&gt;
&lt;br /&gt;
RFNoC 4 expands and generalizes this concept with block properties: a high-level representation of the state of the block. Zero or more properties can be defined by the user in their RFNoC Block’s Block Controller C++ class. When read or written to, they can trigger a call back to a user defined resolver function. The [https://files.ettus.com/app_notes/RFNoC_Specification.pdf RFNoC Specification] provides more details on properties in the “Block Properties” section.&lt;br /&gt;
&lt;br /&gt;
The following shows an example of how to migrate a RFNoC 3 Noc Script XML “arg” based register write to a RFNoC 4 property based implementation in the Block Controller:&lt;br /&gt;
&lt;br /&gt;
====RFNoC 3 Noc Script XML snippet====&lt;br /&gt;
  &amp;lt;registers&amp;gt;&lt;br /&gt;
    &amp;lt;setreg&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;GAIN&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;address&amp;gt;128&amp;lt;/address&amp;gt;&lt;br /&gt;
    &amp;lt;/setreg&amp;gt;&lt;br /&gt;
  &amp;lt;/registers&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;args&amp;gt;&lt;br /&gt;
    &amp;lt;arg&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;gain&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;type&amp;gt;int&amp;lt;/type&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;check&amp;gt;GE($gain, 0) AND LE($gain, 32767)&amp;lt;/check&amp;gt;&lt;br /&gt;
      &amp;lt;check_message&amp;gt;Gain must be in the range [0, 32767]&amp;lt;/check_message&amp;gt;&lt;br /&gt;
      &amp;lt;action&amp;gt;SR_WRITE(&amp;quot;GAIN&amp;quot;, $gain)&amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;/arg&amp;gt;&lt;br /&gt;
  &amp;lt;/args&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RFNoC 4 Block Controller Class====&lt;br /&gt;
&lt;br /&gt;
  // &amp;lt;registers&amp;gt;&lt;br /&gt;
  //    &amp;lt;setreg&amp;gt;&lt;br /&gt;
  //      &amp;lt;name&amp;gt;GAIN&amp;lt;/name&amp;gt;&lt;br /&gt;
  //      &amp;lt;address&amp;gt;128&amp;lt;/address&amp;gt;&lt;br /&gt;
  //    &amp;lt;/setreg&amp;gt;&lt;br /&gt;
  // &amp;lt;/registers&amp;gt;&lt;br /&gt;
  // Note: In RFNoC 4, register addresses can start at address 0 instead of address 128 as in RFNoC 3.&lt;br /&gt;
  const uint32_t gain_block_ctrl::REG_GAIN_ADDR = 128;&lt;br /&gt;
  const uint32_t gain_block_ctrl::REG_GAIN_DEFAULT = 1;&lt;br /&gt;
  &lt;br /&gt;
  class gain_block_ctrl_impl : public gain_block_ctrl&lt;br /&gt;
  {&lt;br /&gt;
  public:&lt;br /&gt;
      RFNOC_BLOCK_CONSTRUCTOR(gain_block_ctrl)&lt;br /&gt;
      {&lt;br /&gt;
          _register_props();&lt;br /&gt;
      }&lt;br /&gt;
  private:&lt;br /&gt;
      void _register_props()&lt;br /&gt;
      {&lt;br /&gt;
          register_property(&amp;amp;_user_reg, [this]() {&lt;br /&gt;
              int user_reg = this-&amp;gt;_user_reg.get();&lt;br /&gt;
              // &amp;lt;check&amp;gt;GE($gain, 0) AND LE($gain, 32767)&amp;lt;/check&amp;gt;&lt;br /&gt;
              // &amp;lt;check_message&amp;gt;Gain must be in the range [0, 32767]&amp;lt;/check_message&amp;gt;&lt;br /&gt;
              if (user_reg &amp;lt; 0 || user_reg &amp;gt; 32767) {&lt;br /&gt;
                  throw uhd::value_error(&amp;quot;Size value must be in [0,32767]&amp;quot;);&lt;br /&gt;
              }&lt;br /&gt;
              // &amp;lt;action&amp;gt;SR_WRITE(&amp;quot;GAIN&amp;quot;, $gain)&amp;lt;/action&amp;gt;&lt;br /&gt;
              this-&amp;gt;regs().poke32(REG_USER_ADDR, user_reg);&lt;br /&gt;
          });&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
  // &amp;lt;name&amp;gt;gain&amp;lt;/name&amp;gt;&lt;br /&gt;
  // &amp;lt;type&amp;gt;int&amp;lt;/type&amp;gt;&lt;br /&gt;
  // &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
  property_t&amp;lt;int&amp;gt; _user_reg{&amp;quot;gain&amp;quot;, REG_USER_DEFAULT, {res_source_info::USER}};&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
As the above shows, writing to a register can be replicated with a property and a resolver function. Of course, the resolver function can also be made much more sophisticated. For additional examples, see the in-tree block controllers in uhd/host/lib/rfnoc.&lt;br /&gt;
&lt;br /&gt;
=FPGA Migration=&lt;br /&gt;
&lt;br /&gt;
Migration reference files for this section from Gain RFNoC Block example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Description        || RFNoC 3 Files                                       || RFNoC 4 Files&lt;br /&gt;
|-&lt;br /&gt;
| Block Verilog Code || rfnoc/fpga-src/noc_block_gain.v                     || rfnoc/fpga/rfnoc_block_gain/rfnoc_block_gain.v&lt;br /&gt;
|-&lt;br /&gt;
| Block Noc Shell    || N/A                                                 || rfnoc/fpga/rfnoc_block_gain/noc_shell_gain.v&lt;br /&gt;
|-&lt;br /&gt;
| Block Testbnech    || rfnoc/testbench/noc_block_gain/noc_block_gain_tb.sv || rfnoc/fpga/rfnoc_block_gain/rfnoc_block_gain_tb.sv&lt;br /&gt;
|-&lt;br /&gt;
| Image Core         || N/A                                                 || rfnoc/icores/gain_x310_rfnoc_image_core.yml&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Note: Files are relative to the rfnoc-example directory in the respective rfnoc3 and rfnoc4 directories''&lt;br /&gt;
&lt;br /&gt;
===Noc Shell Changes===&lt;br /&gt;
&lt;br /&gt;
RFNoC 4 replaces the highly parameterized RFNoC 3 Noc Shell with a per-block customized Noc Shell generated from the block’s Block Description YAML file. The Noc Shell generated via rfnocmodtool or the existing one in rfnoc-example is acceptable for most blocks that require one input and output data port.&lt;br /&gt;
&lt;br /&gt;
====Generating a Custom Noc Shell====&lt;br /&gt;
&lt;br /&gt;
Some blocks may need multiple data ports or other modifications. This requires editing the Block Description YAML file and then using the Python script rfnoc_create_verilog.py (found in uhd/host/utils/rfnoc_blocktool) to generate a new Noc Shell instance.&lt;br /&gt;
&lt;br /&gt;
The argument “-c” is used to provide the YAML file location. “-d” provides the output destination directory.&lt;br /&gt;
&lt;br /&gt;
''Note: It is suggested to not set the destination directory to your existing RFNoC block code, as the script will automatically overwrite the existing code!''&lt;br /&gt;
&lt;br /&gt;
Example usage:&lt;br /&gt;
  rfnoc_create_verilog.py -c ./rfnoc-example/rfnoc/blocks/gain.yml -d ./output/&lt;br /&gt;
&lt;br /&gt;
====Changing Noc ID without using rfnoc_create_verilog====&lt;br /&gt;
&lt;br /&gt;
In the generated Noc Shell Verilog code, a block’s Noc ID can be changed by updating the NOC_ID parameter on the ''backend_iface'' module. Make sure this matches the Noc ID in both the Block Description YAML file and Block Controller C++ code.&lt;br /&gt;
&lt;br /&gt;
====Goodbye AXI Wrapper====&lt;br /&gt;
&lt;br /&gt;
The RFNoC 3 version of Noc Shell outputs / accepts CHDR data packets consisting of a header, optional timestamp, and payload on a 64-bit AXI stream bus. Most designs then used a module called AXI Wrapper to handle the conversion between CHDR data packets and sample streams on a 32-bit AXI stream bus. AXI Wrapper also supported SIMPLE_MODE which for some use cases could transparently handle the header portion of the CHDR data packet. Otherwise, the user would need to set the header via m_axis_data_tuser.&lt;br /&gt;
&lt;br /&gt;
In RFNoC 4, Noc Shell has absorbed AXI Wrapper’s functionality. Noc Shell outputs two AXI stream buses per input / output port: a payload and context bus. The payload bus is in most cases identical to AXI Wrapper’s output: a 32-bit stream of samples on an AXI Stream bus with packets delimited by tlast. The context AXI stream bus carries the header, optional timestamp, and optional metadata. If your block used AXI Wrapper’s SIMPLE_MODE, then you can loop the context bus back into Noc Shell. If not, you will need to modify the context bus data. Refer to the [https://files.ettus.com/app_notes/RFNoC_Specification.pdf RFNoC Specification] for the format and timing diagram of the context bus.&lt;br /&gt;
&lt;br /&gt;
''Important Note: If your block used the AXI Rate Change module, Noc Shell has another data port mode to support this use case called '''axis_data''' that can be set in the Block Descriptor YAML file (see the fpga_iface entry). This mode causes the Noc Shell data ports to look more like AXI Wrapper’s and therefore makes them compatible with AXI Rate Change. See the DDC, DUC, or Keep One in N RFNoC Blocks for an example.''&lt;br /&gt;
&lt;br /&gt;
===Settings Bus replaced by CtrlPort===&lt;br /&gt;
&lt;br /&gt;
CtrlPort replaces the Settings Bus in RFNoC 4. The CtrlPort bus is similar to the Settings Bus with a few key differences. The table below compares the signaling between the two bus formats and provides notes on any differences. Timing diagrams and additional information on the CtrlPort bus is also available in the [https://files.ettus.com/app_notes/RFNoC_Specification.pdf RFNoC Specification].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Settings Bus (RFNoC 3) || CtrlPort (RFNoC 4)                              || RFNoC 4 Notes&lt;br /&gt;
|-&lt;br /&gt;
| set_stb                || ctrlport_reg_wr                                 || Write strobe&lt;br /&gt;
|-&lt;br /&gt;
| set_addr               || ctrlport_req_addr                               || 20-bits instead of 8-bits, increments by 4 instead of by 1, no reserved addresses (versus addresses 0-127 for Settings Bus)&lt;br /&gt;
|-&lt;br /&gt;
| set_data               || ctrlport_req_data                               || Write data&lt;br /&gt;
|-&lt;br /&gt;
| N/A                    || ctrlport_req_rd                                 || Read strobe equivalent of ctrlport_req_wr&lt;br /&gt;
|-&lt;br /&gt;
| rb_addr                || N/A                                             || CtrlPort uses ctrlport_req_addr for both '''read and write''' addresses&lt;br /&gt;
|-&lt;br /&gt;
| rb_data                || ctrlport_resp_data                              || Read data, 32-bits instead of 64-bits&lt;br /&gt;
|-&lt;br /&gt;
| rb_stb                 || N/A                                             || CtrlPort requires ack strobe for '''reads and writes'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
One additional difference when using CtrlPort is that there is not an equivalent Settings Register module. The bus is simple enough to setup a clocked process to handle reading from and writing to registers. See the Verilog example below:&lt;br /&gt;
&lt;br /&gt;
  // Note: Register addresses increment by 4&lt;br /&gt;
  localparam REG_USER_ADDR    = 0; // Address for example user register&lt;br /&gt;
  localparam REG_USER_DEFAULT = 0; // Default value for user register&lt;br /&gt;
  &lt;br /&gt;
  reg [31:0] reg_user = REG_USER_DEFAULT;&lt;br /&gt;
  &lt;br /&gt;
  always @(posedge ctrlport_clk) begin&lt;br /&gt;
    if (ctrlport_rst) begin&lt;br /&gt;
      reg_user = REG_USER_DEFAULT;&lt;br /&gt;
    end else begin&lt;br /&gt;
      // Default assignment&lt;br /&gt;
      m_ctrlport_resp_ack &amp;lt;= 0;&lt;br /&gt;
  &lt;br /&gt;
      // Read user register&lt;br /&gt;
      if (m_ctrlport_req_rd) begin // Read request&lt;br /&gt;
        case (m_ctrlport_req_addr)&lt;br /&gt;
          REG_USER_ADDR: begin&lt;br /&gt;
            m_ctrlport_resp_ack  &amp;lt;= 1;&lt;br /&gt;
            m_ctrlport_resp_data &amp;lt;= reg_user;&lt;br /&gt;
          end&lt;br /&gt;
        endcase&lt;br /&gt;
      end&lt;br /&gt;
  &lt;br /&gt;
      // Write user register&lt;br /&gt;
      if (m_ctrlport_req_wr) begin // Write requst&lt;br /&gt;
        case (m_ctrlport_req_addr)&lt;br /&gt;
          REG_USER_ADDR: begin&lt;br /&gt;
            m_ctrlport_resp_ack &amp;lt;= 1;&lt;br /&gt;
            reg_user            &amp;lt;= m_ctrlport_req_data[31:0];&lt;br /&gt;
          end&lt;br /&gt;
        endcase&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
''Important Note: For blocks that make heavy use of the Settings Bus and/or Settings Registers, there is a CtrlPort to Settings Bus bridge available called '''ctrlport_to_settings_bus'''. See the Keep One In N RFNoC Block for example code on how to interface with it.''&lt;br /&gt;
&lt;br /&gt;
===Testbench Infrastructure===&lt;br /&gt;
&lt;br /&gt;
While RFNoC 4 does overhaul the RFNoC 3 testbench infrastructure API, most of the high level concepts remain the same. The table below outlines some of the commonly used RFNoC 3 functions / code and the RFNoC 4 equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Operation                || RFNoC 3                                                       || RFNoC 4&lt;br /&gt;
|-&lt;br /&gt;
| Setup RFNoC&lt;br /&gt;
||&lt;br /&gt;
  `RFNOC_SIM_INIT(...)&lt;br /&gt;
  `RFNOC_ADD_BLOCK(...)&lt;br /&gt;
  `RFNOC_CONNECT(...)&lt;br /&gt;
||&lt;br /&gt;
  RfnocBlockCtrlBfm #(...) blk_ctrl = new(...);&lt;br /&gt;
  blk_ctrl.connect_master_data_port(...)&lt;br /&gt;
  blk_ctrl.connect_slave_data_port(...)&lt;br /&gt;
''Note: Instantiate one Block Controller BFM per RFNoC Block''&lt;br /&gt;
|-&lt;br /&gt;
| Setup Test Cases&lt;br /&gt;
||&lt;br /&gt;
  `TEST_CASE_START(...)&lt;br /&gt;
  `TEST_CASE_DONE(...)&lt;br /&gt;
||&lt;br /&gt;
  test.start_test(...)&lt;br /&gt;
  test.end_test()&lt;br /&gt;
|-&lt;br /&gt;
| Register Read&lt;br /&gt;
||&lt;br /&gt;
  tb_streamer.read_reg(...)&lt;br /&gt;
||&lt;br /&gt;
  blk_ctrl.reg_read(...)&lt;br /&gt;
|-&lt;br /&gt;
| Register Write&lt;br /&gt;
||&lt;br /&gt;
  tb_streamer.write_reg(...)&lt;br /&gt;
||&lt;br /&gt;
  blk_ctrl.reg_write(...)&lt;br /&gt;
|-&lt;br /&gt;
| Send Data / Samples&lt;br /&gt;
||&lt;br /&gt;
  tb_streamer.send(...)&lt;br /&gt;
||&lt;br /&gt;
  blk_ctrl.send_items(...)&lt;br /&gt;
|-&lt;br /&gt;
| Receive Data / Samples&lt;br /&gt;
||&lt;br /&gt;
  tb_streamer.recv(...)&lt;br /&gt;
||&lt;br /&gt;
  blk_ctrl.recv_items(...)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Building FPGA images using Image Core YAML Files===&lt;br /&gt;
&lt;br /&gt;
RFNoC 4 replaces uhd_image_builder, the RFNoC 3 FPGA image building tool, with a new tool called rfnoc_image_builder. This tool produces a FPGA bitstream based on an Image Core YAML file that describes the device configuration (e.g. X310 with dual 10GigE) and included RFNoC blocks along with their connections (both static and dynamic), clocking, and I/O.&lt;br /&gt;
&lt;br /&gt;
Both rfnocmodtool and the UHD in-tree example called rfnoc-example automatically setup make targets to handle running rfnoc_image_builder. If you want to use rfnoc_image_builder directly, more details can be found in the [https://kb.ettus.com/Getting_Started_with_RFNoC_in_UHD_4.0 Getting Started with RFNoC in UHD 4.0].&lt;br /&gt;
&lt;br /&gt;
=GNU Radio Software Migration=&lt;br /&gt;
&lt;br /&gt;
RFNoC 4 supports GNU Radio 3.8 only. Most of your RFNoC Block’s GNU Radio related changes will be due to API differences between GNU Radio 3.7 to 3.8. These changes are outside of the scope of this article. Instead, refer to [https://wiki.gnuradio.org/index.php/GNU_Radio_3.8_OOT_Module_Porting_Guide GNU Radio 3.8 Migration Guide] and [https://wiki.gnuradio.org/index.php/YAML_GRC GNU Radio Companion YAML] sites for more information.&lt;br /&gt;
&lt;br /&gt;
Migration reference files for this section from Gain RFNoC Block example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Description              || RFNoC 3 Files                                                 || RFNoC 4 Files&lt;br /&gt;
|-&lt;br /&gt;
| GNU Radio Block          || lib/gain_impl.cc&amp;lt;br&amp;gt;lib/gain_impl.h&amp;lt;br&amp;gt;include/example/gain.h || lib/gain_impl.cc&amp;lt;br&amp;gt;lib/gain_impl.h&amp;lt;br&amp;gt;include/example/gain.h&lt;br /&gt;
|-&lt;br /&gt;
| GRC Block Description    || grc/gain.xml                                                  || grc/gain.yml&lt;br /&gt;
|-&lt;br /&gt;
| Example GRC Flowgraph    || examples/gain.grc                                             || examples/gain.grc&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Note: Files are relative to the rfnoc-example directory in the respective rfnoc3 and rfnoc4 directories''&lt;br /&gt;
&lt;br /&gt;
===RX &amp;amp; TX Streamer Blocks===&lt;br /&gt;
&lt;br /&gt;
When transition between a RFNoC block and a GNU Radio block or vice versa, you must insert either a RX stream or TX streamer block respectively. This differs from RFNoC 3, where a RFNoC block could be directly connected to a GNU Radio block.&lt;br /&gt;
&lt;br /&gt;
[[File:rx_tx_streamer.png|border]]&lt;br /&gt;
&lt;br /&gt;
===Setting RFNoC Block Properties Directly in GNU Radio===&lt;br /&gt;
&lt;br /&gt;
The base class for RFNoC Block’s in GNU Radio have a set of functions that provide a shortcut to getting and setting properties without writing custom class methods. The table below lists the functions.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property Type     || Set Property             || Get Property&lt;br /&gt;
|-&lt;br /&gt;
| Integer           || set_int_property(...)    || get_int_property(...)&lt;br /&gt;
|-&lt;br /&gt;
| Double            || set_double_property(...) || get_double_property(...)&lt;br /&gt;
|-&lt;br /&gt;
| Bool              || set_bool_property(...)   || get_bool_property(...)&lt;br /&gt;
|-&lt;br /&gt;
| String            || set_string_property(...) || get_string_property(...)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Example code for GNU Radio Companion YAML Block Description file'''&lt;br /&gt;
  templates:&lt;br /&gt;
    imports: |-&lt;br /&gt;
      import example&lt;br /&gt;
    make: |-&lt;br /&gt;
      example.gain(&lt;br /&gt;
        self.rfnoc_graph,&lt;br /&gt;
        uhd.device_addr(${block_args}),&lt;br /&gt;
        ${device_select},&lt;br /&gt;
        ${instance_select})&lt;br /&gt;
      self.${id}.set_int_property('gain', ${gain})&lt;br /&gt;
    callbacks:&lt;br /&gt;
    - set_int_property('gain', ${gain})&lt;/div&gt;</summary>
		<author><name>MartinAnderseck</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=RFNoC_4_Migration_Guide&amp;diff=5233</id>
		<title>RFNoC 4 Migration Guide</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=RFNoC_4_Migration_Guide&amp;diff=5233"/>
				<updated>2021-11-01T10:54:41Z</updated>
		
		<summary type="html">&lt;p&gt;MartinAnderseck: /* Dependencies (Ubuntu 20.04) */ Remove GNU Radio dependencies (not required for UHD only)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Abstract=&lt;br /&gt;
&lt;br /&gt;
The UHD 4.0 release includes a major upgrade to the RFNoC framework called RFNoC 4. This article is a guide to aid users in migrating their existing RFNoC blocks from RFNoC 3 to RFNoC 4. The RFNoC Block Development Environment section provides guidance on how to setup an environment for developing out-of-tree RFNoC blocks in RFNoC 4. The UHD, FPGA, GNU Radio Migration sections provide general information on topics that most users will encounter when migrating their blocks. Finally, an equivalent RFNoC 3 and RFNoC 4 implementation of a digital gain RFNoC Block has been provided as a reference.&lt;br /&gt;
&lt;br /&gt;
=Prerequisites=&lt;br /&gt;
&lt;br /&gt;
===Dependencies (Ubuntu 20.04)===&lt;br /&gt;
  sudo apt-get install autoconf automake build-essential ccache cmake cpufrequtils doxygen ethtool \&lt;br /&gt;
  g++ git inetutils-tools libboost-all-dev libncurses5 libncurses5-dev libusb-1.0-0 libusb-1.0-0-dev \&lt;br /&gt;
  libusb-dev python3-dev python3-mako python3-numpy python3-requests python3-scipy python3-setuptools \&lt;br /&gt;
  python3-ruamel.yaml&lt;br /&gt;
&lt;br /&gt;
===Vivado 2019.1 Design Edition===&lt;br /&gt;
&lt;br /&gt;
Please reference to Xilinx (xilinx.com) for installation instructions.&lt;br /&gt;
&lt;br /&gt;
''Note: The dependencies step above included installing libtinfo5 libncurses5, which is a workaround for getting Vivado 2019.1 to run on Ubuntu 20.04''&lt;br /&gt;
&lt;br /&gt;
===UHD 4.0===&lt;br /&gt;
  git clone --branch UHD-4.0 https://github.com/ettusresearch/uhd.git uhd&lt;br /&gt;
  mkdir uhd/host/build; cd uhd/host/build&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
===GNU Radio 3.8===&lt;br /&gt;
'' Note: If your design does not use GNU Radio, then installing GNU Radio and gr-ettus is not required ''&lt;br /&gt;
&lt;br /&gt;
  git clone --branch maint-3.8 --recursive https://github.com/gnuradio/gnuradio.git gnuradio&lt;br /&gt;
  mkdir gnuradio/build; cd gnuradio/build;&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
===gr-ettus===&lt;br /&gt;
  git clone --branch maint-3.8-uhd4.0 https://github.com/ettusresearch/gr-ettus.git gr-ettus&lt;br /&gt;
  mkdir gr-ettus/build; cd gr-ettus/build;&lt;br /&gt;
  cmake -DENABLE_QT=True ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
=RFNoC Block Development Environment=&lt;br /&gt;
&lt;br /&gt;
Two options exist for developing RFNoC blocks depending on whether the your RFNoC block integrates with GNU Radio in an out-of-tree module or if it only uses UHD’s C++ API in a standalone application. The sections below outline how to setup the development environment for each scenario.&lt;br /&gt;
&lt;br /&gt;
===Migrating a GNU Radio Out-of-Tree Module===&lt;br /&gt;
&lt;br /&gt;
The tool rfnocmodtool automates the process of creating GNU Radio out-of-tree (OOT) modules that also have support for RFNoC blocks. This tool is part of gr-ettus and it has been ported to RFNoC 4.&lt;br /&gt;
&lt;br /&gt;
Due to changes in almost every source file, it is recommended to use rfnocmodtool to generate a new RFNoC block from scratch and then update the generated “skeleton” files.&lt;br /&gt;
&lt;br /&gt;
====Creating a RFNoC Block with rfnocmodtool====&lt;br /&gt;
&lt;br /&gt;
The following steps show how to create an OOT module called ''example'' and RFNoC block called ''gain'' using rfnocmodtool. The naming is only for example purposes.&lt;br /&gt;
&lt;br /&gt;
  rfnocmodtool newmod&lt;br /&gt;
  Name of the new module: '''example'''&lt;br /&gt;
  &lt;br /&gt;
  cd rfnoc-tutorial&lt;br /&gt;
  rfnocmodtool add&lt;br /&gt;
  Enter name of block/code (without module name prefix): '''gain'''&lt;br /&gt;
  Enter valid argument list, including default arguments: ''(leave blank)''&lt;br /&gt;
  Add Python QA code? [y/N] '''N'''&lt;br /&gt;
  Add C++ QA code? [y/N] '''N'''&lt;br /&gt;
  Block NoC ID (Hexadecimal): ''(Enter Noc ID of your block)''&lt;br /&gt;
  Skip Block Controllers Generation? [UHD block ctrl files] [y/N] '''N'''&lt;br /&gt;
  Skip Block interface files Generation? [GRC block ctrl files] [y/N] '''N'''&lt;br /&gt;
&lt;br /&gt;
''Note: Noc IDs have been reduced from 64-bits in RFNoC 3 to 32-bits in RFNoC 4''&lt;br /&gt;
&lt;br /&gt;
The following are the relevant files that need to be updated when migrating your RFNoC Block.&lt;br /&gt;
&lt;br /&gt;
  rfnoc-example/&lt;br /&gt;
      grc/&lt;br /&gt;
          example_gain.block.yml           – RFNoC Block GNU Radio Companion YAML file&lt;br /&gt;
      examples/&lt;br /&gt;
          gain.grc                         – Example flowgraph using gain RFNoC Block&lt;br /&gt;
      include/tutorial/&lt;br /&gt;
          gain.h                           – GNU Radio block C++ header&lt;br /&gt;
          gain_block_ctrl.hpp              – RFNoC Block Controller C++ header&lt;br /&gt;
      lib/&lt;br /&gt;
          gain_impl.cc                     – GNU Radio block C++ source&lt;br /&gt;
          gain_impl.h                      – GNU Radio block C++ header&lt;br /&gt;
          gain_block_ctrl_impl.cpp         – RFNoC Block Controller C++ source&lt;br /&gt;
      rfnoc/blocks/&lt;br /&gt;
          gain.yml                         – RFNoC Block Description YAML file&lt;br /&gt;
      rfnoc/fpga/rfnoc_block_gain&lt;br /&gt;
          noc_shell_gain.v                 – RFNoC Block Noc Shell Verilog Source&lt;br /&gt;
          rfnoc_block_gain.v               – RFNoC Block Verilog Source&lt;br /&gt;
          rfnoc_block_gain_tb.v            – RFNoC Block Testbench&lt;br /&gt;
      rfnoc/icores&lt;br /&gt;
          gain_x310_rfnoc_image_core.yml   – Image Core YAML file with gain block&lt;br /&gt;
&lt;br /&gt;
====Building OOT module====&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-tutorial&lt;br /&gt;
  mkdir build; cd build&lt;br /&gt;
  cmake -DUHD_FPGA_DIR=''(path to uhd/fpga directory)'' ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
====Running a testbench====&lt;br /&gt;
CMake automatically creates makefile targets to run the generated testbench code for each added RFNoC block. For example, here is how to run the gain block testbench:&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-tutorial/build&lt;br /&gt;
  make rfnoc_block_gain_tb&lt;br /&gt;
&lt;br /&gt;
====Building a FPGA image====&lt;br /&gt;
CMake automatically creates makefile targets to build FPGA images using the generated image core yaml files found in rfnoc/icore. Every RFNoC block created by rfnocmodtool automatically has an image core yaml file generated in that directory. For example, here is how to build an FPGA image using the image core yaml file generated for the gain block:&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-tutorial/build&lt;br /&gt;
  make gain_x310_rfnoc_image_core&lt;br /&gt;
&lt;br /&gt;
===Migrating a Standalone UHD C++ Application===&lt;br /&gt;
&lt;br /&gt;
For applications that only use the UHD API, an example out-of-tree (UHD source tree) RFNoC block exists called rfnoc-example. It is located in the UHD source at uhd/host/examples/rfnoc-example. This directory can be copied outside of the UHD source tree and used a starting point to migrate your RFNoC block.&lt;br /&gt;
&lt;br /&gt;
The following are the relevant files that need to be updated when migrating your RFNoC Block.&lt;br /&gt;
&lt;br /&gt;
  rfnoc-example/&lt;br /&gt;
      apps/&lt;br /&gt;
          init_gain_block.cpp         – Example C++ application testing gain block&lt;br /&gt;
      blocks/&lt;br /&gt;
          gain.yml                    – RFNoC Block Description YAML file&lt;br /&gt;
      fpga/rfnoc_block_gain&lt;br /&gt;
          noc_shell_gain.v            – RFNoC Block Noc Shell Verilog Source&lt;br /&gt;
          rfnoc_block_gain.v          – RFNoC Block Verilog Source&lt;br /&gt;
          rfnoc_block_gain_tb.v       – RFNoC Block Testbench&lt;br /&gt;
      icores/&lt;br /&gt;
          x310_rfnoc_image_core.yml   – Example Image Core YAML file&lt;br /&gt;
      include/rfnoc/example&lt;br /&gt;
          gain_block_control.hpp      – RFNoC Block Controller C++ header&lt;br /&gt;
      lib/&lt;br /&gt;
          gain_block_control.cpp      – RFNoC Block Controller C++ source&lt;br /&gt;
&lt;br /&gt;
====Building rfnoc-example====&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-example&lt;br /&gt;
  mkdir build; cd build&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
====Running a testbench====&lt;br /&gt;
CMake automatically creates makefile targets to run RFNoC Block testbench simulations. For every RFNoC block subdirectory listed in the CMakeLists.txt file in the rfnoc-example/fpga directory, a target with the RFNoC block name appended with “_tb” is added as a makefile target. For example, here is how to run the gain RFNoC block testbench:&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-example/build&lt;br /&gt;
  make rfnoc_block_gain_tb&lt;br /&gt;
&lt;br /&gt;
====Building a FPGA image====&lt;br /&gt;
CMake automatically creates makefile targets to build a FPGA image for each image core yaml file listed in the CMakeLists.txt file in the rfnoc-example/icore directory. Each image core yaml file must be listed in the CMakeLists.txt. For example, here is how to build an FPGA image using the image core yaml file generated for the gain block:&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-tutorial/build&lt;br /&gt;
  make gain_x310_rfnoc_image_core&lt;br /&gt;
&lt;br /&gt;
=Example RFNoC 3 to RFNoC 4 Block Migration=&lt;br /&gt;
&lt;br /&gt;
This ZIP archive, [[File:migration_example.zip]], contains equivalent RFNoC 3 and RFNoC 4 versions of a digital gain RFNoC Block. The following sections will refer to files in this archive to show how the file structure changes when migrating from RFNoC 3 to RFNoC 4.&lt;br /&gt;
&lt;br /&gt;
=UHD Software Migration=&lt;br /&gt;
&lt;br /&gt;
Migration reference files for this section from Gain RFNoC Block example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Description       || RFNoC 3 Files         || RFNoC 4 Files&lt;br /&gt;
|-&lt;br /&gt;
| Block Description || rfnoc/blocks/gain.xml || lib/gain_block_ctrl_impl.cpp &amp;lt;br&amp;gt;include/example/gain_block_ctrl.hpp&lt;br /&gt;
|-&lt;br /&gt;
| Block Controller  || rfnoc/blocks/gain.yml || lib/gain_block_ctrl_impl.cpp &amp;lt;br&amp;gt;include/example/gain_block_ctrl.hpp&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Note: Files are relative to the rfnoc-example directory in the respective rfnoc3 and rfnoc4 directories''&lt;br /&gt;
&lt;br /&gt;
===Noc Script XML Replaced by Block Description YAML===&lt;br /&gt;
&lt;br /&gt;
RFNoC 3 used Noc Script XML, a domain specific language, to describe the configuration of a RFNoC block: the Noc ID, register names and addresses, args for writing to the registers, and the input/output ports.&lt;br /&gt;
&lt;br /&gt;
RFNoC 4 replaces the Noc Script XML file with an easier to read and edit Block Description YAML file format. From a high level, the Block Description YAML file serves a similar function as the Noc Script XML file, with some similarities and key differences outlined in table below:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Item       || Noc Script XML              || Block Descript YAML || RFNoC 4 Notes&lt;br /&gt;
|-&lt;br /&gt;
| Block Name&lt;br /&gt;
||&lt;br /&gt;
  &amp;lt;name&amp;gt;gain&amp;lt;/name&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
  module_name: gain&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Noc ID&lt;br /&gt;
||&lt;br /&gt;
  &amp;lt;id&amp;gt;B160000000000000&amp;lt;/id&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
  noc_id: 0xB16&lt;br /&gt;
||&lt;br /&gt;
Noc ID are limited to 32-bits&lt;br /&gt;
|-&lt;br /&gt;
| Registers&lt;br /&gt;
||&lt;br /&gt;
  &amp;lt;registers&amp;gt;&lt;br /&gt;
    &amp;lt;setreg&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;GAIN&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;address&amp;gt;128&amp;lt;/address&amp;gt;&lt;br /&gt;
    &amp;lt;/setreg&amp;gt;&lt;br /&gt;
  &amp;lt;/registers&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
Registers must be defined in the Block Controller&lt;br /&gt;
|-&lt;br /&gt;
| Arguments&lt;br /&gt;
||&lt;br /&gt;
  &amp;lt;args&amp;gt;&lt;br /&gt;
    &amp;lt;arg&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;gain&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;type&amp;gt;int&amp;lt;/type&amp;gt;&lt;br /&gt;
      ...&lt;br /&gt;
    &amp;lt;/arg&amp;gt;&lt;br /&gt;
  &amp;lt;/args&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
Args are implemented with properties in the Block Controller&lt;br /&gt;
|-&lt;br /&gt;
| Data Ports&lt;br /&gt;
||&lt;br /&gt;
  &amp;lt;ports&amp;gt;&lt;br /&gt;
    &amp;lt;sink&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;in&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;/sink&amp;gt;&lt;br /&gt;
    &amp;lt;source&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;out&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;/source&amp;gt;&lt;br /&gt;
  &amp;lt;/ports&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
  data:&lt;br /&gt;
      fpga_iface: axis_pyld_ctxt&lt;br /&gt;
      clk_domain: rfnoc_chdr&lt;br /&gt;
      inputs:&lt;br /&gt;
          in:&lt;br /&gt;
             ...&lt;br /&gt;
      outputs:&lt;br /&gt;
          out:&lt;br /&gt;
             ...&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Control Ports&lt;br /&gt;
||&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
  control:&lt;br /&gt;
      sw_iface: nocscript&lt;br /&gt;
      fpga_iface: ctrlport&lt;br /&gt;
      interface_direction: slave&lt;br /&gt;
      ...&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Clocking&lt;br /&gt;
||&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
  clocks:&lt;br /&gt;
      - name: rfnoc_chdr&lt;br /&gt;
        freq: &amp;quot;[]&amp;quot;&lt;br /&gt;
      - name: rfnoc_ctrl&lt;br /&gt;
        freq: &amp;quot;[]&amp;quot;&lt;br /&gt;
||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Note: For a more detailed description of the RFNoC 4 Block Description YAML syntax and the various options, see the [https://files.ettus.com/app_notes/RFNoC_Specification.pdf RFNoC Specification].''&lt;br /&gt;
&lt;br /&gt;
===RFNoC API Changes===&lt;br /&gt;
&lt;br /&gt;
Much of the user facing RFNoC software API has not changed or remains very similar between RFNoC 3 and RFNoC 4. The table below outlines some of the notable differences:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! RFNoC 3       || RFNoC 4              || RFNoC 4 Notes&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  usrp = uhd::device3::make(...)&lt;br /&gt;
||&lt;br /&gt;
  graph = uhd::rfnoc::rfnoc_graph::make()&lt;br /&gt;
||&lt;br /&gt;
No longer need to create a device3 object&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  usrp-&amp;gt;get_block_ctrl(...)&lt;br /&gt;
||&lt;br /&gt;
  graph-&amp;gt;get_block(...)&lt;br /&gt;
||&lt;br /&gt;
Rename&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
  graph-&amp;gt;enumerate_static_connections()&lt;br /&gt;
||&lt;br /&gt;
Used to check static connections, usually for detecting hwen a DDC or DUC is statically connected to the radio and requires setting the sample&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  usrp-&amp;gt;get_tx_streamer(...)&lt;br /&gt;
||&lt;br /&gt;
  graph-&amp;gt;create_tx_streamer(...)&lt;br /&gt;
||&lt;br /&gt;
Rename&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  usrp-&amp;gt;get_rx_streamer(...)&lt;br /&gt;
||&lt;br /&gt;
  graph-&amp;gt;create_rx_streamer(...)&lt;br /&gt;
||&lt;br /&gt;
Rename&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
  graph-&amp;gt;commit()&lt;br /&gt;
||&lt;br /&gt;
Commit graph and run initial checks&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  sr_write(...)&lt;br /&gt;
||&lt;br /&gt;
  regs().poke32(...)&lt;br /&gt;
||&lt;br /&gt;
Address increments by 4&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  sr_read32(...)&lt;br /&gt;
||&lt;br /&gt;
  regs().peek32(...)&lt;br /&gt;
||&lt;br /&gt;
Address increments by 4&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  sr_read64(...)&lt;br /&gt;
||&lt;br /&gt;
  regs().poke64(...)&lt;br /&gt;
||&lt;br /&gt;
Address increments by 8&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  set_arg(...)&lt;br /&gt;
||&lt;br /&gt;
  set_property(...)&lt;br /&gt;
||&lt;br /&gt;
Block args replaced with block properties concept&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  get_arg(...)&lt;br /&gt;
||&lt;br /&gt;
  get_property(...)&lt;br /&gt;
||&lt;br /&gt;
Block args replaced with block properties concept&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Block Properties===&lt;br /&gt;
&lt;br /&gt;
In RFNoC 3, RFNoC blocks can have arguments (also known as args) that are used to write user registers. This is implemented in the Noc Script XML in the &amp;lt;args&amp;gt; section.&lt;br /&gt;
&lt;br /&gt;
RFNoC 4 expands and generalizes this concept with block properties: a high-level representation of the state of the block. Zero or more properties can be defined by the user in their RFNoC Block’s Block Controller C++ class. When read or written to, they can trigger a call back to a user defined resolver function. The [https://files.ettus.com/app_notes/RFNoC_Specification.pdf RFNoC Specification] provides more details on properties in the “Block Properties” section.&lt;br /&gt;
&lt;br /&gt;
The following shows an example of how to migrate a RFNoC 3 Noc Script XML “arg” based register write to a RFNoC 4 property based implementation in the Block Controller:&lt;br /&gt;
&lt;br /&gt;
====RFNoC 3 Noc Script XML snippet====&lt;br /&gt;
  &amp;lt;registers&amp;gt;&lt;br /&gt;
    &amp;lt;setreg&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;GAIN&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;address&amp;gt;128&amp;lt;/address&amp;gt;&lt;br /&gt;
    &amp;lt;/setreg&amp;gt;&lt;br /&gt;
  &amp;lt;/registers&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;args&amp;gt;&lt;br /&gt;
    &amp;lt;arg&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;gain&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;type&amp;gt;int&amp;lt;/type&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;check&amp;gt;GE($gain, 0) AND LE($gain, 32767)&amp;lt;/check&amp;gt;&lt;br /&gt;
      &amp;lt;check_message&amp;gt;Gain must be in the range [0, 32767]&amp;lt;/check_message&amp;gt;&lt;br /&gt;
      &amp;lt;action&amp;gt;SR_WRITE(&amp;quot;GAIN&amp;quot;, $gain)&amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;/arg&amp;gt;&lt;br /&gt;
  &amp;lt;/args&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RFNoC 4 Block Controller Class====&lt;br /&gt;
&lt;br /&gt;
  // &amp;lt;registers&amp;gt;&lt;br /&gt;
  //    &amp;lt;setreg&amp;gt;&lt;br /&gt;
  //      &amp;lt;name&amp;gt;GAIN&amp;lt;/name&amp;gt;&lt;br /&gt;
  //      &amp;lt;address&amp;gt;128&amp;lt;/address&amp;gt;&lt;br /&gt;
  //    &amp;lt;/setreg&amp;gt;&lt;br /&gt;
  // &amp;lt;/registers&amp;gt;&lt;br /&gt;
  // Note: In RFNoC 4, register addresses can start at address 0 instead of address 128 as in RFNoC 3.&lt;br /&gt;
  const uint32_t gain_block_ctrl::REG_GAIN_ADDR = 128;&lt;br /&gt;
  const uint32_t gain_block_ctrl::REG_GAIN_DEFAULT = 1;&lt;br /&gt;
  &lt;br /&gt;
  class gain_block_ctrl_impl : public gain_block_ctrl&lt;br /&gt;
  {&lt;br /&gt;
  public:&lt;br /&gt;
      RFNOC_BLOCK_CONSTRUCTOR(gain_block_ctrl)&lt;br /&gt;
      {&lt;br /&gt;
          _register_props();&lt;br /&gt;
      }&lt;br /&gt;
  private:&lt;br /&gt;
      void _register_props()&lt;br /&gt;
      {&lt;br /&gt;
          register_property(&amp;amp;_user_reg, [this]() {&lt;br /&gt;
              int user_reg = this-&amp;gt;_user_reg.get();&lt;br /&gt;
              // &amp;lt;check&amp;gt;GE($gain, 0) AND LE($gain, 32767)&amp;lt;/check&amp;gt;&lt;br /&gt;
              // &amp;lt;check_message&amp;gt;Gain must be in the range [0, 32767]&amp;lt;/check_message&amp;gt;&lt;br /&gt;
              if (user_reg &amp;lt; 0 || user_reg &amp;gt; 32767) {&lt;br /&gt;
                  throw uhd::value_error(&amp;quot;Size value must be in [0,32767]&amp;quot;);&lt;br /&gt;
              }&lt;br /&gt;
              // &amp;lt;action&amp;gt;SR_WRITE(&amp;quot;GAIN&amp;quot;, $gain)&amp;lt;/action&amp;gt;&lt;br /&gt;
              this-&amp;gt;regs().poke32(REG_USER_ADDR, user_reg);&lt;br /&gt;
          });&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
  // &amp;lt;name&amp;gt;gain&amp;lt;/name&amp;gt;&lt;br /&gt;
  // &amp;lt;type&amp;gt;int&amp;lt;/type&amp;gt;&lt;br /&gt;
  // &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
  property_t&amp;lt;int&amp;gt; _user_reg{&amp;quot;gain&amp;quot;, REG_USER_DEFAULT, {res_source_info::USER}};&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
As the above shows, writing to a register can be replicated with a property and a resolver function. Of course, the resolver function can also be made much more sophisticated. For additional examples, see the in-tree block controllers in uhd/host/lib/rfnoc.&lt;br /&gt;
&lt;br /&gt;
=FPGA Migration=&lt;br /&gt;
&lt;br /&gt;
Migration reference files for this section from Gain RFNoC Block example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Description        || RFNoC 3 Files                                       || RFNoC 4 Files&lt;br /&gt;
|-&lt;br /&gt;
| Block Verilog Code || rfnoc/fpga-src/noc_block_gain.v                     || rfnoc/fpga/rfnoc_block_gain/rfnoc_block_gain.v&lt;br /&gt;
|-&lt;br /&gt;
| Block Noc Shell    || N/A                                                 || rfnoc/fpga/rfnoc_block_gain/noc_shell_gain.v&lt;br /&gt;
|-&lt;br /&gt;
| Block Testbnech    || rfnoc/testbench/noc_block_gain/noc_block_gain_tb.sv || rfnoc/fpga/rfnoc_block_gain/rfnoc_block_gain_tb.sv&lt;br /&gt;
|-&lt;br /&gt;
| Image Core         || N/A                                                 || rfnoc/icores/gain_x310_rfnoc_image_core.yml&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Note: Files are relative to the rfnoc-example directory in the respective rfnoc3 and rfnoc4 directories''&lt;br /&gt;
&lt;br /&gt;
===Noc Shell Changes===&lt;br /&gt;
&lt;br /&gt;
RFNoC 4 replaces the highly parameterized RFNoC 3 Noc Shell with a per-block customized Noc Shell generated from the block’s Block Description YAML file. The Noc Shell generated via rfnocmodtool or the existing one in rfnoc-example is acceptable for most blocks that require one input and output data port.&lt;br /&gt;
&lt;br /&gt;
====Generating a Custom Noc Shell====&lt;br /&gt;
&lt;br /&gt;
Some blocks may need multiple data ports or other modifications. This requires editing the Block Description YAML file and then using the Python script rfnoc_create_verilog.py (found in uhd/host/utils/rfnoc_blocktool) to generate a new Noc Shell instance.&lt;br /&gt;
&lt;br /&gt;
The argument “-c” is used to provide the YAML file location. “-d” provides the output destination directory.&lt;br /&gt;
&lt;br /&gt;
''Note: It is suggested to not set the destination directory to your existing RFNoC block code, as the script will automatically overwrite the existing code!''&lt;br /&gt;
&lt;br /&gt;
Example usage:&lt;br /&gt;
  rfnoc_create_verilog.py -c ./rfnoc-example/rfnoc/blocks/gain.yml -d ./output/&lt;br /&gt;
&lt;br /&gt;
====Changing Noc ID without using rfnoc_create_verilog====&lt;br /&gt;
&lt;br /&gt;
In the generated Noc Shell Verilog code, a block’s Noc ID can be changed by updating the NOC_ID parameter on the ''backend_iface'' module. Make sure this matches the Noc ID in both the Block Description YAML file and Block Controller C++ code.&lt;br /&gt;
&lt;br /&gt;
====Goodbye AXI Wrapper====&lt;br /&gt;
&lt;br /&gt;
The RFNoC 3 version of Noc Shell outputs / accepts CHDR data packets consisting of a header, optional timestamp, and payload on a 64-bit AXI stream bus. Most designs then used a module called AXI Wrapper to handle the conversion between CHDR data packets and sample streams on a 32-bit AXI stream bus. AXI Wrapper also supported SIMPLE_MODE which for some use cases could transparently handle the header portion of the CHDR data packet. Otherwise, the user would need to set the header via m_axis_data_tuser.&lt;br /&gt;
&lt;br /&gt;
In RFNoC 4, Noc Shell has absorbed AXI Wrapper’s functionality. Noc Shell outputs two AXI stream buses per input / output port: a payload and context bus. The payload bus is in most cases identical to AXI Wrapper’s output: a 32-bit stream of samples on an AXI Stream bus with packets delimited by tlast. The context AXI stream bus carries the header, optional timestamp, and optional metadata. If your block used AXI Wrapper’s SIMPLE_MODE, then you can loop the context bus back into Noc Shell. If not, you will need to modify the context bus data. Refer to the [https://files.ettus.com/app_notes/RFNoC_Specification.pdf RFNoC Specification] for the format and timing diagram of the context bus.&lt;br /&gt;
&lt;br /&gt;
''Important Note: If your block used the AXI Rate Change module, Noc Shell has another data port mode to support this use case called '''axis_data''' that can be set in the Block Descriptor YAML file (see the fpga_iface entry). This mode causes the Noc Shell data ports to look more like AXI Wrapper’s and therefore makes them compatible with AXI Rate Change. See the DDC, DUC, or Keep One in N RFNoC Blocks for an example.''&lt;br /&gt;
&lt;br /&gt;
===Settings Bus replaced by CtrlPort===&lt;br /&gt;
&lt;br /&gt;
CtrlPort replaces the Settings Bus in RFNoC 4. The CtrlPort bus is similar to the Settings Bus with a few key differences. The table below compares the signaling between the two bus formats and provides notes on any differences. Timing diagrams and additional information on the CtrlPort bus is also available in the [https://files.ettus.com/app_notes/RFNoC_Specification.pdf RFNoC Specification].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Settings Bus (RFNoC 3) || CtrlPort (RFNoC 4)                              || RFNoC 4 Notes&lt;br /&gt;
|-&lt;br /&gt;
| set_stb                || ctrlport_reg_wr                                 || Write strobe&lt;br /&gt;
|-&lt;br /&gt;
| set_addr               || ctrlport_req_addr                               || 20-bits instead of 8-bits, increments by 4 instead of by 1, no reserved addresses (versus addresses 0-127 for Settings Bus)&lt;br /&gt;
|-&lt;br /&gt;
| set_data               || ctrlport_req_data                               || Write data&lt;br /&gt;
|-&lt;br /&gt;
| N/A                    || ctrlport_req_rd                                 || Read strobe equivalent of ctrlport_req_wr&lt;br /&gt;
|-&lt;br /&gt;
| rb_addr                || N/A                                             || CtrlPort uses ctrlport_req_addr for both '''read and write''' addresses&lt;br /&gt;
|-&lt;br /&gt;
| rb_data                || ctrlport_resp_data                              || Read data, 32-bits instead of 64-bits&lt;br /&gt;
|-&lt;br /&gt;
| rb_stb                 || N/A                                             || CtrlPort requires ack strobe for '''reads and writes'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
One additional difference when using CtrlPort is that there is not an equivalent Settings Register module. The bus is simple enough to setup a clocked process to handle reading from and writing to registers. See the Verilog example below:&lt;br /&gt;
&lt;br /&gt;
  // Note: Register addresses increment by 4&lt;br /&gt;
  localparam REG_USER_ADDR    = 0; // Address for example user register&lt;br /&gt;
  localparam REG_USER_DEFAULT = 0; // Default value for user register&lt;br /&gt;
  &lt;br /&gt;
  reg [31:0] reg_user = REG_USER_DEFAULT;&lt;br /&gt;
  &lt;br /&gt;
  always @(posedge ctrlport_clk) begin&lt;br /&gt;
    if (ctrlport_rst) begin&lt;br /&gt;
      reg_user = REG_USER_DEFAULT;&lt;br /&gt;
    end else begin&lt;br /&gt;
      // Default assignment&lt;br /&gt;
      m_ctrlport_resp_ack &amp;lt;= 0;&lt;br /&gt;
  &lt;br /&gt;
      // Read user register&lt;br /&gt;
      if (m_ctrlport_req_rd) begin // Read request&lt;br /&gt;
        case (m_ctrlport_req_addr)&lt;br /&gt;
          REG_USER_ADDR: begin&lt;br /&gt;
            m_ctrlport_resp_ack  &amp;lt;= 1;&lt;br /&gt;
            m_ctrlport_resp_data &amp;lt;= reg_user;&lt;br /&gt;
          end&lt;br /&gt;
        endcase&lt;br /&gt;
      end&lt;br /&gt;
  &lt;br /&gt;
      // Write user register&lt;br /&gt;
      if (m_ctrlport_req_wr) begin // Write requst&lt;br /&gt;
        case (m_ctrlport_req_addr)&lt;br /&gt;
          REG_USER_ADDR: begin&lt;br /&gt;
            m_ctrlport_resp_ack &amp;lt;= 1;&lt;br /&gt;
            reg_user            &amp;lt;= m_ctrlport_req_data[31:0];&lt;br /&gt;
          end&lt;br /&gt;
        endcase&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
''Important Note: For blocks that make heavy use of the Settings Bus and/or Settings Registers, there is a CtrlPort to Settings Bus bridge available called '''ctrlport_to_settings_bus'''. See the Keep One In N RFNoC Block for example code on how to interface with it.''&lt;br /&gt;
&lt;br /&gt;
===Testbench Infrastructure===&lt;br /&gt;
&lt;br /&gt;
While RFNoC 4 does overhaul the RFNoC 3 testbench infrastructure API, most of the high level concepts remain the same. The table below outlines some of the commonly used RFNoC 3 functions / code and the RFNoC 4 equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Operation                || RFNoC 3                                                       || RFNoC 4&lt;br /&gt;
|-&lt;br /&gt;
| Setup RFNoC&lt;br /&gt;
||&lt;br /&gt;
  `RFNOC_SIM_INIT(...)&lt;br /&gt;
  `RFNOC_ADD_BLOCK(...)&lt;br /&gt;
  `RFNOC_CONNECT(...)&lt;br /&gt;
||&lt;br /&gt;
  RfnocBlockCtrlBfm #(...) blk_ctrl = new(...);&lt;br /&gt;
  blk_ctrl.connect_master_data_port(...)&lt;br /&gt;
  blk_ctrl.connect_slave_data_port(...)&lt;br /&gt;
''Note: Instantiate one Block Controller BFM per RFNoC Block''&lt;br /&gt;
|-&lt;br /&gt;
| Setup Test Cases&lt;br /&gt;
||&lt;br /&gt;
  `TEST_CASE_START(...)&lt;br /&gt;
  `TEST_CASE_DONE(...)&lt;br /&gt;
||&lt;br /&gt;
  test.start_test(...)&lt;br /&gt;
  test.end_test()&lt;br /&gt;
|-&lt;br /&gt;
| Register Read&lt;br /&gt;
||&lt;br /&gt;
  tb_streamer.read_reg(...)&lt;br /&gt;
||&lt;br /&gt;
  blk_ctrl.reg_read(...)&lt;br /&gt;
|-&lt;br /&gt;
| Register Write&lt;br /&gt;
||&lt;br /&gt;
  tb_streamer.write_reg(...)&lt;br /&gt;
||&lt;br /&gt;
  blk_ctrl.reg_write(...)&lt;br /&gt;
|-&lt;br /&gt;
| Send Data / Samples&lt;br /&gt;
||&lt;br /&gt;
  tb_streamer.send(...)&lt;br /&gt;
||&lt;br /&gt;
  blk_ctrl.send_items(...)&lt;br /&gt;
|-&lt;br /&gt;
| Receive Data / Samples&lt;br /&gt;
||&lt;br /&gt;
  tb_streamer.recv(...)&lt;br /&gt;
||&lt;br /&gt;
  blk_ctrl.recv_items(...)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Building FPGA images using Image Core YAML Files===&lt;br /&gt;
&lt;br /&gt;
RFNoC 4 replaces uhd_image_builder, the RFNoC 3 FPGA image building tool, with a new tool called rfnoc_image_builder. This tool produces a FPGA bitstream based on an Image Core YAML file that describes the device configuration (e.g. X310 with dual 10GigE) and included RFNoC blocks along with their connections (both static and dynamic), clocking, and I/O.&lt;br /&gt;
&lt;br /&gt;
Both rfnocmodtool and the UHD in-tree example called rfnoc-example automatically setup make targets to handle running rfnoc_image_builder. If you want to use rfnoc_image_builder directly, more details can be found in the [https://kb.ettus.com/Getting_Started_with_RFNoC_in_UHD_4.0 Getting Started with RFNoC in UHD 4.0].&lt;br /&gt;
&lt;br /&gt;
=GNU Radio Software Migration=&lt;br /&gt;
&lt;br /&gt;
RFNoC 4 supports GNU Radio 3.8 only. Most of your RFNoC Block’s GNU Radio related changes will be due to API differences between GNU Radio 3.7 to 3.8. These changes are outside of the scope of this article. Instead, refer to [https://wiki.gnuradio.org/index.php/GNU_Radio_3.8_OOT_Module_Porting_Guide GNU Radio 3.8 Migration Guide] and [https://wiki.gnuradio.org/index.php/YAML_GRC GNU Radio Companion YAML] sites for more information.&lt;br /&gt;
&lt;br /&gt;
Migration reference files for this section from Gain RFNoC Block example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Description              || RFNoC 3 Files                                                 || RFNoC 4 Files&lt;br /&gt;
|-&lt;br /&gt;
| GNU Radio Block          || lib/gain_impl.cc&amp;lt;br&amp;gt;lib/gain_impl.h&amp;lt;br&amp;gt;include/example/gain.h || lib/gain_impl.cc&amp;lt;br&amp;gt;lib/gain_impl.h&amp;lt;br&amp;gt;include/example/gain.h&lt;br /&gt;
|-&lt;br /&gt;
| GRC Block Description    || grc/gain.xml                                                  || grc/gain.yml&lt;br /&gt;
|-&lt;br /&gt;
| Example GRC Flowgraph    || examples/gain.grc                                             || examples/gain.grc&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Note: Files are relative to the rfnoc-example directory in the respective rfnoc3 and rfnoc4 directories''&lt;br /&gt;
&lt;br /&gt;
===RX &amp;amp; TX Streamer Blocks===&lt;br /&gt;
&lt;br /&gt;
When transition between a RFNoC block and a GNU Radio block or vice versa, you must insert either a RX stream or TX streamer block respectively. This differs from RFNoC 3, where a RFNoC block could be directly connected to a GNU Radio block.&lt;br /&gt;
&lt;br /&gt;
[[File:rx_tx_streamer.png|border]]&lt;br /&gt;
&lt;br /&gt;
===Setting RFNoC Block Properties Directly in GNU Radio===&lt;br /&gt;
&lt;br /&gt;
The base class for RFNoC Block’s in GNU Radio have a set of functions that provide a shortcut to getting and setting properties without writing custom class methods. The table below lists the functions.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property Type     || Set Property             || Get Property&lt;br /&gt;
|-&lt;br /&gt;
| Integer           || set_int_property(...)    || get_int_property(...)&lt;br /&gt;
|-&lt;br /&gt;
| Double            || set_double_property(...) || get_double_property(...)&lt;br /&gt;
|-&lt;br /&gt;
| Bool              || set_bool_property(...)   || get_bool_property(...)&lt;br /&gt;
|-&lt;br /&gt;
| String            || set_string_property(...) || get_string_property(...)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Example code for GNU Radio Companion YAML Block Description file'''&lt;br /&gt;
  templates:&lt;br /&gt;
    imports: |-&lt;br /&gt;
      import example&lt;br /&gt;
    make: |-&lt;br /&gt;
      example.gain(&lt;br /&gt;
        self.rfnoc_graph,&lt;br /&gt;
        uhd.device_addr(${block_args}),&lt;br /&gt;
        ${device_select},&lt;br /&gt;
        ${instance_select})&lt;br /&gt;
      self.${id}.set_int_property('gain', ${gain})&lt;br /&gt;
    callbacks:&lt;br /&gt;
    - set_int_property('gain', ${gain})&lt;/div&gt;</summary>
		<author><name>MartinAnderseck</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=RFNoC_4_Migration_Guide&amp;diff=5232</id>
		<title>RFNoC 4 Migration Guide</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=RFNoC_4_Migration_Guide&amp;diff=5232"/>
				<updated>2021-11-01T10:53:44Z</updated>
		
		<summary type="html">&lt;p&gt;MartinAnderseck: /* Vivado 2019.1 Design Edition */ Fix typo in Ubuntu&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Abstract=&lt;br /&gt;
&lt;br /&gt;
The UHD 4.0 release includes a major upgrade to the RFNoC framework called RFNoC 4. This article is a guide to aid users in migrating their existing RFNoC blocks from RFNoC 3 to RFNoC 4. The RFNoC Block Development Environment section provides guidance on how to setup an environment for developing out-of-tree RFNoC blocks in RFNoC 4. The UHD, FPGA, GNU Radio Migration sections provide general information on topics that most users will encounter when migrating their blocks. Finally, an equivalent RFNoC 3 and RFNoC 4 implementation of a digital gain RFNoC Block has been provided as a reference.&lt;br /&gt;
&lt;br /&gt;
=Prerequisites=&lt;br /&gt;
&lt;br /&gt;
===Dependencies (Ubuntu 20.04)===&lt;br /&gt;
  sudo apt-get -y install autoconf automake build-essential ccache cmake cpufrequtils \&lt;br /&gt;
  doxygen ethtool fort77 g++ gir1.2-gtk-3.0 git gobject-introspection gpsd gpsd-clients \&lt;br /&gt;
  inetutils-tools libasound2-dev libboost-all-dev libcomedi-dev libcppunit-dev libfftw3-bin \&lt;br /&gt;
  libfftw3-dev libfftw3-doc libfontconfig1-dev libgmp-dev libgps-dev libgsl-dev liblog4cpp5-dev \&lt;br /&gt;
  libncurses5 libncurses5-dev libpulse-dev libqt5opengl5-dev libqwt-qt5-dev libsdl1.2-dev libtool \&lt;br /&gt;
  libudev-dev libusb-1.0-0 libusb-1.0-0-dev libusb-dev libxi-dev libxrender-dev libzmq3-dev \&lt;br /&gt;
  libzmq5 ncurses-bin python3-cheetah python3-click python3-click-plugins python3-click-threading \&lt;br /&gt;
  python3-dev python3-docutils python3-gi python3-gi-cairo python3-gps python3-lxml python3-mako \&lt;br /&gt;
  python3-numpy python3-numpy-dbg python3-opengl python3-pyqt5 python3-requests python3-scipy \&lt;br /&gt;
  python3-setuptools python3-six python3-sphinx python3-yaml python3-zmq python3-ruamel.yaml swig wget&lt;br /&gt;
&lt;br /&gt;
===Vivado 2019.1 Design Edition===&lt;br /&gt;
&lt;br /&gt;
Please reference to Xilinx (xilinx.com) for installation instructions.&lt;br /&gt;
&lt;br /&gt;
''Note: The dependencies step above included installing libtinfo5 libncurses5, which is a workaround for getting Vivado 2019.1 to run on Ubuntu 20.04''&lt;br /&gt;
&lt;br /&gt;
===UHD 4.0===&lt;br /&gt;
  git clone --branch UHD-4.0 https://github.com/ettusresearch/uhd.git uhd&lt;br /&gt;
  mkdir uhd/host/build; cd uhd/host/build&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
===GNU Radio 3.8===&lt;br /&gt;
'' Note: If your design does not use GNU Radio, then installing GNU Radio and gr-ettus is not required ''&lt;br /&gt;
&lt;br /&gt;
  git clone --branch maint-3.8 --recursive https://github.com/gnuradio/gnuradio.git gnuradio&lt;br /&gt;
  mkdir gnuradio/build; cd gnuradio/build;&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
===gr-ettus===&lt;br /&gt;
  git clone --branch maint-3.8-uhd4.0 https://github.com/ettusresearch/gr-ettus.git gr-ettus&lt;br /&gt;
  mkdir gr-ettus/build; cd gr-ettus/build;&lt;br /&gt;
  cmake -DENABLE_QT=True ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
=RFNoC Block Development Environment=&lt;br /&gt;
&lt;br /&gt;
Two options exist for developing RFNoC blocks depending on whether the your RFNoC block integrates with GNU Radio in an out-of-tree module or if it only uses UHD’s C++ API in a standalone application. The sections below outline how to setup the development environment for each scenario.&lt;br /&gt;
&lt;br /&gt;
===Migrating a GNU Radio Out-of-Tree Module===&lt;br /&gt;
&lt;br /&gt;
The tool rfnocmodtool automates the process of creating GNU Radio out-of-tree (OOT) modules that also have support for RFNoC blocks. This tool is part of gr-ettus and it has been ported to RFNoC 4.&lt;br /&gt;
&lt;br /&gt;
Due to changes in almost every source file, it is recommended to use rfnocmodtool to generate a new RFNoC block from scratch and then update the generated “skeleton” files.&lt;br /&gt;
&lt;br /&gt;
====Creating a RFNoC Block with rfnocmodtool====&lt;br /&gt;
&lt;br /&gt;
The following steps show how to create an OOT module called ''example'' and RFNoC block called ''gain'' using rfnocmodtool. The naming is only for example purposes.&lt;br /&gt;
&lt;br /&gt;
  rfnocmodtool newmod&lt;br /&gt;
  Name of the new module: '''example'''&lt;br /&gt;
  &lt;br /&gt;
  cd rfnoc-tutorial&lt;br /&gt;
  rfnocmodtool add&lt;br /&gt;
  Enter name of block/code (without module name prefix): '''gain'''&lt;br /&gt;
  Enter valid argument list, including default arguments: ''(leave blank)''&lt;br /&gt;
  Add Python QA code? [y/N] '''N'''&lt;br /&gt;
  Add C++ QA code? [y/N] '''N'''&lt;br /&gt;
  Block NoC ID (Hexadecimal): ''(Enter Noc ID of your block)''&lt;br /&gt;
  Skip Block Controllers Generation? [UHD block ctrl files] [y/N] '''N'''&lt;br /&gt;
  Skip Block interface files Generation? [GRC block ctrl files] [y/N] '''N'''&lt;br /&gt;
&lt;br /&gt;
''Note: Noc IDs have been reduced from 64-bits in RFNoC 3 to 32-bits in RFNoC 4''&lt;br /&gt;
&lt;br /&gt;
The following are the relevant files that need to be updated when migrating your RFNoC Block.&lt;br /&gt;
&lt;br /&gt;
  rfnoc-example/&lt;br /&gt;
      grc/&lt;br /&gt;
          example_gain.block.yml           – RFNoC Block GNU Radio Companion YAML file&lt;br /&gt;
      examples/&lt;br /&gt;
          gain.grc                         – Example flowgraph using gain RFNoC Block&lt;br /&gt;
      include/tutorial/&lt;br /&gt;
          gain.h                           – GNU Radio block C++ header&lt;br /&gt;
          gain_block_ctrl.hpp              – RFNoC Block Controller C++ header&lt;br /&gt;
      lib/&lt;br /&gt;
          gain_impl.cc                     – GNU Radio block C++ source&lt;br /&gt;
          gain_impl.h                      – GNU Radio block C++ header&lt;br /&gt;
          gain_block_ctrl_impl.cpp         – RFNoC Block Controller C++ source&lt;br /&gt;
      rfnoc/blocks/&lt;br /&gt;
          gain.yml                         – RFNoC Block Description YAML file&lt;br /&gt;
      rfnoc/fpga/rfnoc_block_gain&lt;br /&gt;
          noc_shell_gain.v                 – RFNoC Block Noc Shell Verilog Source&lt;br /&gt;
          rfnoc_block_gain.v               – RFNoC Block Verilog Source&lt;br /&gt;
          rfnoc_block_gain_tb.v            – RFNoC Block Testbench&lt;br /&gt;
      rfnoc/icores&lt;br /&gt;
          gain_x310_rfnoc_image_core.yml   – Image Core YAML file with gain block&lt;br /&gt;
&lt;br /&gt;
====Building OOT module====&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-tutorial&lt;br /&gt;
  mkdir build; cd build&lt;br /&gt;
  cmake -DUHD_FPGA_DIR=''(path to uhd/fpga directory)'' ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
====Running a testbench====&lt;br /&gt;
CMake automatically creates makefile targets to run the generated testbench code for each added RFNoC block. For example, here is how to run the gain block testbench:&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-tutorial/build&lt;br /&gt;
  make rfnoc_block_gain_tb&lt;br /&gt;
&lt;br /&gt;
====Building a FPGA image====&lt;br /&gt;
CMake automatically creates makefile targets to build FPGA images using the generated image core yaml files found in rfnoc/icore. Every RFNoC block created by rfnocmodtool automatically has an image core yaml file generated in that directory. For example, here is how to build an FPGA image using the image core yaml file generated for the gain block:&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-tutorial/build&lt;br /&gt;
  make gain_x310_rfnoc_image_core&lt;br /&gt;
&lt;br /&gt;
===Migrating a Standalone UHD C++ Application===&lt;br /&gt;
&lt;br /&gt;
For applications that only use the UHD API, an example out-of-tree (UHD source tree) RFNoC block exists called rfnoc-example. It is located in the UHD source at uhd/host/examples/rfnoc-example. This directory can be copied outside of the UHD source tree and used a starting point to migrate your RFNoC block.&lt;br /&gt;
&lt;br /&gt;
The following are the relevant files that need to be updated when migrating your RFNoC Block.&lt;br /&gt;
&lt;br /&gt;
  rfnoc-example/&lt;br /&gt;
      apps/&lt;br /&gt;
          init_gain_block.cpp         – Example C++ application testing gain block&lt;br /&gt;
      blocks/&lt;br /&gt;
          gain.yml                    – RFNoC Block Description YAML file&lt;br /&gt;
      fpga/rfnoc_block_gain&lt;br /&gt;
          noc_shell_gain.v            – RFNoC Block Noc Shell Verilog Source&lt;br /&gt;
          rfnoc_block_gain.v          – RFNoC Block Verilog Source&lt;br /&gt;
          rfnoc_block_gain_tb.v       – RFNoC Block Testbench&lt;br /&gt;
      icores/&lt;br /&gt;
          x310_rfnoc_image_core.yml   – Example Image Core YAML file&lt;br /&gt;
      include/rfnoc/example&lt;br /&gt;
          gain_block_control.hpp      – RFNoC Block Controller C++ header&lt;br /&gt;
      lib/&lt;br /&gt;
          gain_block_control.cpp      – RFNoC Block Controller C++ source&lt;br /&gt;
&lt;br /&gt;
====Building rfnoc-example====&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-example&lt;br /&gt;
  mkdir build; cd build&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
====Running a testbench====&lt;br /&gt;
CMake automatically creates makefile targets to run RFNoC Block testbench simulations. For every RFNoC block subdirectory listed in the CMakeLists.txt file in the rfnoc-example/fpga directory, a target with the RFNoC block name appended with “_tb” is added as a makefile target. For example, here is how to run the gain RFNoC block testbench:&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-example/build&lt;br /&gt;
  make rfnoc_block_gain_tb&lt;br /&gt;
&lt;br /&gt;
====Building a FPGA image====&lt;br /&gt;
CMake automatically creates makefile targets to build a FPGA image for each image core yaml file listed in the CMakeLists.txt file in the rfnoc-example/icore directory. Each image core yaml file must be listed in the CMakeLists.txt. For example, here is how to build an FPGA image using the image core yaml file generated for the gain block:&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-tutorial/build&lt;br /&gt;
  make gain_x310_rfnoc_image_core&lt;br /&gt;
&lt;br /&gt;
=Example RFNoC 3 to RFNoC 4 Block Migration=&lt;br /&gt;
&lt;br /&gt;
This ZIP archive, [[File:migration_example.zip]], contains equivalent RFNoC 3 and RFNoC 4 versions of a digital gain RFNoC Block. The following sections will refer to files in this archive to show how the file structure changes when migrating from RFNoC 3 to RFNoC 4.&lt;br /&gt;
&lt;br /&gt;
=UHD Software Migration=&lt;br /&gt;
&lt;br /&gt;
Migration reference files for this section from Gain RFNoC Block example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Description       || RFNoC 3 Files         || RFNoC 4 Files&lt;br /&gt;
|-&lt;br /&gt;
| Block Description || rfnoc/blocks/gain.xml || lib/gain_block_ctrl_impl.cpp &amp;lt;br&amp;gt;include/example/gain_block_ctrl.hpp&lt;br /&gt;
|-&lt;br /&gt;
| Block Controller  || rfnoc/blocks/gain.yml || lib/gain_block_ctrl_impl.cpp &amp;lt;br&amp;gt;include/example/gain_block_ctrl.hpp&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Note: Files are relative to the rfnoc-example directory in the respective rfnoc3 and rfnoc4 directories''&lt;br /&gt;
&lt;br /&gt;
===Noc Script XML Replaced by Block Description YAML===&lt;br /&gt;
&lt;br /&gt;
RFNoC 3 used Noc Script XML, a domain specific language, to describe the configuration of a RFNoC block: the Noc ID, register names and addresses, args for writing to the registers, and the input/output ports.&lt;br /&gt;
&lt;br /&gt;
RFNoC 4 replaces the Noc Script XML file with an easier to read and edit Block Description YAML file format. From a high level, the Block Description YAML file serves a similar function as the Noc Script XML file, with some similarities and key differences outlined in table below:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Item       || Noc Script XML              || Block Descript YAML || RFNoC 4 Notes&lt;br /&gt;
|-&lt;br /&gt;
| Block Name&lt;br /&gt;
||&lt;br /&gt;
  &amp;lt;name&amp;gt;gain&amp;lt;/name&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
  module_name: gain&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Noc ID&lt;br /&gt;
||&lt;br /&gt;
  &amp;lt;id&amp;gt;B160000000000000&amp;lt;/id&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
  noc_id: 0xB16&lt;br /&gt;
||&lt;br /&gt;
Noc ID are limited to 32-bits&lt;br /&gt;
|-&lt;br /&gt;
| Registers&lt;br /&gt;
||&lt;br /&gt;
  &amp;lt;registers&amp;gt;&lt;br /&gt;
    &amp;lt;setreg&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;GAIN&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;address&amp;gt;128&amp;lt;/address&amp;gt;&lt;br /&gt;
    &amp;lt;/setreg&amp;gt;&lt;br /&gt;
  &amp;lt;/registers&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
Registers must be defined in the Block Controller&lt;br /&gt;
|-&lt;br /&gt;
| Arguments&lt;br /&gt;
||&lt;br /&gt;
  &amp;lt;args&amp;gt;&lt;br /&gt;
    &amp;lt;arg&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;gain&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;type&amp;gt;int&amp;lt;/type&amp;gt;&lt;br /&gt;
      ...&lt;br /&gt;
    &amp;lt;/arg&amp;gt;&lt;br /&gt;
  &amp;lt;/args&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
Args are implemented with properties in the Block Controller&lt;br /&gt;
|-&lt;br /&gt;
| Data Ports&lt;br /&gt;
||&lt;br /&gt;
  &amp;lt;ports&amp;gt;&lt;br /&gt;
    &amp;lt;sink&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;in&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;/sink&amp;gt;&lt;br /&gt;
    &amp;lt;source&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;out&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;/source&amp;gt;&lt;br /&gt;
  &amp;lt;/ports&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
  data:&lt;br /&gt;
      fpga_iface: axis_pyld_ctxt&lt;br /&gt;
      clk_domain: rfnoc_chdr&lt;br /&gt;
      inputs:&lt;br /&gt;
          in:&lt;br /&gt;
             ...&lt;br /&gt;
      outputs:&lt;br /&gt;
          out:&lt;br /&gt;
             ...&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Control Ports&lt;br /&gt;
||&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
  control:&lt;br /&gt;
      sw_iface: nocscript&lt;br /&gt;
      fpga_iface: ctrlport&lt;br /&gt;
      interface_direction: slave&lt;br /&gt;
      ...&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Clocking&lt;br /&gt;
||&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
  clocks:&lt;br /&gt;
      - name: rfnoc_chdr&lt;br /&gt;
        freq: &amp;quot;[]&amp;quot;&lt;br /&gt;
      - name: rfnoc_ctrl&lt;br /&gt;
        freq: &amp;quot;[]&amp;quot;&lt;br /&gt;
||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Note: For a more detailed description of the RFNoC 4 Block Description YAML syntax and the various options, see the [https://files.ettus.com/app_notes/RFNoC_Specification.pdf RFNoC Specification].''&lt;br /&gt;
&lt;br /&gt;
===RFNoC API Changes===&lt;br /&gt;
&lt;br /&gt;
Much of the user facing RFNoC software API has not changed or remains very similar between RFNoC 3 and RFNoC 4. The table below outlines some of the notable differences:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! RFNoC 3       || RFNoC 4              || RFNoC 4 Notes&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  usrp = uhd::device3::make(...)&lt;br /&gt;
||&lt;br /&gt;
  graph = uhd::rfnoc::rfnoc_graph::make()&lt;br /&gt;
||&lt;br /&gt;
No longer need to create a device3 object&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  usrp-&amp;gt;get_block_ctrl(...)&lt;br /&gt;
||&lt;br /&gt;
  graph-&amp;gt;get_block(...)&lt;br /&gt;
||&lt;br /&gt;
Rename&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
  graph-&amp;gt;enumerate_static_connections()&lt;br /&gt;
||&lt;br /&gt;
Used to check static connections, usually for detecting hwen a DDC or DUC is statically connected to the radio and requires setting the sample&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  usrp-&amp;gt;get_tx_streamer(...)&lt;br /&gt;
||&lt;br /&gt;
  graph-&amp;gt;create_tx_streamer(...)&lt;br /&gt;
||&lt;br /&gt;
Rename&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  usrp-&amp;gt;get_rx_streamer(...)&lt;br /&gt;
||&lt;br /&gt;
  graph-&amp;gt;create_rx_streamer(...)&lt;br /&gt;
||&lt;br /&gt;
Rename&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
  graph-&amp;gt;commit()&lt;br /&gt;
||&lt;br /&gt;
Commit graph and run initial checks&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  sr_write(...)&lt;br /&gt;
||&lt;br /&gt;
  regs().poke32(...)&lt;br /&gt;
||&lt;br /&gt;
Address increments by 4&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  sr_read32(...)&lt;br /&gt;
||&lt;br /&gt;
  regs().peek32(...)&lt;br /&gt;
||&lt;br /&gt;
Address increments by 4&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  sr_read64(...)&lt;br /&gt;
||&lt;br /&gt;
  regs().poke64(...)&lt;br /&gt;
||&lt;br /&gt;
Address increments by 8&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  set_arg(...)&lt;br /&gt;
||&lt;br /&gt;
  set_property(...)&lt;br /&gt;
||&lt;br /&gt;
Block args replaced with block properties concept&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  get_arg(...)&lt;br /&gt;
||&lt;br /&gt;
  get_property(...)&lt;br /&gt;
||&lt;br /&gt;
Block args replaced with block properties concept&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Block Properties===&lt;br /&gt;
&lt;br /&gt;
In RFNoC 3, RFNoC blocks can have arguments (also known as args) that are used to write user registers. This is implemented in the Noc Script XML in the &amp;lt;args&amp;gt; section.&lt;br /&gt;
&lt;br /&gt;
RFNoC 4 expands and generalizes this concept with block properties: a high-level representation of the state of the block. Zero or more properties can be defined by the user in their RFNoC Block’s Block Controller C++ class. When read or written to, they can trigger a call back to a user defined resolver function. The [https://files.ettus.com/app_notes/RFNoC_Specification.pdf RFNoC Specification] provides more details on properties in the “Block Properties” section.&lt;br /&gt;
&lt;br /&gt;
The following shows an example of how to migrate a RFNoC 3 Noc Script XML “arg” based register write to a RFNoC 4 property based implementation in the Block Controller:&lt;br /&gt;
&lt;br /&gt;
====RFNoC 3 Noc Script XML snippet====&lt;br /&gt;
  &amp;lt;registers&amp;gt;&lt;br /&gt;
    &amp;lt;setreg&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;GAIN&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;address&amp;gt;128&amp;lt;/address&amp;gt;&lt;br /&gt;
    &amp;lt;/setreg&amp;gt;&lt;br /&gt;
  &amp;lt;/registers&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;args&amp;gt;&lt;br /&gt;
    &amp;lt;arg&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;gain&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;type&amp;gt;int&amp;lt;/type&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;check&amp;gt;GE($gain, 0) AND LE($gain, 32767)&amp;lt;/check&amp;gt;&lt;br /&gt;
      &amp;lt;check_message&amp;gt;Gain must be in the range [0, 32767]&amp;lt;/check_message&amp;gt;&lt;br /&gt;
      &amp;lt;action&amp;gt;SR_WRITE(&amp;quot;GAIN&amp;quot;, $gain)&amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;/arg&amp;gt;&lt;br /&gt;
  &amp;lt;/args&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RFNoC 4 Block Controller Class====&lt;br /&gt;
&lt;br /&gt;
  // &amp;lt;registers&amp;gt;&lt;br /&gt;
  //    &amp;lt;setreg&amp;gt;&lt;br /&gt;
  //      &amp;lt;name&amp;gt;GAIN&amp;lt;/name&amp;gt;&lt;br /&gt;
  //      &amp;lt;address&amp;gt;128&amp;lt;/address&amp;gt;&lt;br /&gt;
  //    &amp;lt;/setreg&amp;gt;&lt;br /&gt;
  // &amp;lt;/registers&amp;gt;&lt;br /&gt;
  // Note: In RFNoC 4, register addresses can start at address 0 instead of address 128 as in RFNoC 3.&lt;br /&gt;
  const uint32_t gain_block_ctrl::REG_GAIN_ADDR = 128;&lt;br /&gt;
  const uint32_t gain_block_ctrl::REG_GAIN_DEFAULT = 1;&lt;br /&gt;
  &lt;br /&gt;
  class gain_block_ctrl_impl : public gain_block_ctrl&lt;br /&gt;
  {&lt;br /&gt;
  public:&lt;br /&gt;
      RFNOC_BLOCK_CONSTRUCTOR(gain_block_ctrl)&lt;br /&gt;
      {&lt;br /&gt;
          _register_props();&lt;br /&gt;
      }&lt;br /&gt;
  private:&lt;br /&gt;
      void _register_props()&lt;br /&gt;
      {&lt;br /&gt;
          register_property(&amp;amp;_user_reg, [this]() {&lt;br /&gt;
              int user_reg = this-&amp;gt;_user_reg.get();&lt;br /&gt;
              // &amp;lt;check&amp;gt;GE($gain, 0) AND LE($gain, 32767)&amp;lt;/check&amp;gt;&lt;br /&gt;
              // &amp;lt;check_message&amp;gt;Gain must be in the range [0, 32767]&amp;lt;/check_message&amp;gt;&lt;br /&gt;
              if (user_reg &amp;lt; 0 || user_reg &amp;gt; 32767) {&lt;br /&gt;
                  throw uhd::value_error(&amp;quot;Size value must be in [0,32767]&amp;quot;);&lt;br /&gt;
              }&lt;br /&gt;
              // &amp;lt;action&amp;gt;SR_WRITE(&amp;quot;GAIN&amp;quot;, $gain)&amp;lt;/action&amp;gt;&lt;br /&gt;
              this-&amp;gt;regs().poke32(REG_USER_ADDR, user_reg);&lt;br /&gt;
          });&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
  // &amp;lt;name&amp;gt;gain&amp;lt;/name&amp;gt;&lt;br /&gt;
  // &amp;lt;type&amp;gt;int&amp;lt;/type&amp;gt;&lt;br /&gt;
  // &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
  property_t&amp;lt;int&amp;gt; _user_reg{&amp;quot;gain&amp;quot;, REG_USER_DEFAULT, {res_source_info::USER}};&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
As the above shows, writing to a register can be replicated with a property and a resolver function. Of course, the resolver function can also be made much more sophisticated. For additional examples, see the in-tree block controllers in uhd/host/lib/rfnoc.&lt;br /&gt;
&lt;br /&gt;
=FPGA Migration=&lt;br /&gt;
&lt;br /&gt;
Migration reference files for this section from Gain RFNoC Block example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Description        || RFNoC 3 Files                                       || RFNoC 4 Files&lt;br /&gt;
|-&lt;br /&gt;
| Block Verilog Code || rfnoc/fpga-src/noc_block_gain.v                     || rfnoc/fpga/rfnoc_block_gain/rfnoc_block_gain.v&lt;br /&gt;
|-&lt;br /&gt;
| Block Noc Shell    || N/A                                                 || rfnoc/fpga/rfnoc_block_gain/noc_shell_gain.v&lt;br /&gt;
|-&lt;br /&gt;
| Block Testbnech    || rfnoc/testbench/noc_block_gain/noc_block_gain_tb.sv || rfnoc/fpga/rfnoc_block_gain/rfnoc_block_gain_tb.sv&lt;br /&gt;
|-&lt;br /&gt;
| Image Core         || N/A                                                 || rfnoc/icores/gain_x310_rfnoc_image_core.yml&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Note: Files are relative to the rfnoc-example directory in the respective rfnoc3 and rfnoc4 directories''&lt;br /&gt;
&lt;br /&gt;
===Noc Shell Changes===&lt;br /&gt;
&lt;br /&gt;
RFNoC 4 replaces the highly parameterized RFNoC 3 Noc Shell with a per-block customized Noc Shell generated from the block’s Block Description YAML file. The Noc Shell generated via rfnocmodtool or the existing one in rfnoc-example is acceptable for most blocks that require one input and output data port.&lt;br /&gt;
&lt;br /&gt;
====Generating a Custom Noc Shell====&lt;br /&gt;
&lt;br /&gt;
Some blocks may need multiple data ports or other modifications. This requires editing the Block Description YAML file and then using the Python script rfnoc_create_verilog.py (found in uhd/host/utils/rfnoc_blocktool) to generate a new Noc Shell instance.&lt;br /&gt;
&lt;br /&gt;
The argument “-c” is used to provide the YAML file location. “-d” provides the output destination directory.&lt;br /&gt;
&lt;br /&gt;
''Note: It is suggested to not set the destination directory to your existing RFNoC block code, as the script will automatically overwrite the existing code!''&lt;br /&gt;
&lt;br /&gt;
Example usage:&lt;br /&gt;
  rfnoc_create_verilog.py -c ./rfnoc-example/rfnoc/blocks/gain.yml -d ./output/&lt;br /&gt;
&lt;br /&gt;
====Changing Noc ID without using rfnoc_create_verilog====&lt;br /&gt;
&lt;br /&gt;
In the generated Noc Shell Verilog code, a block’s Noc ID can be changed by updating the NOC_ID parameter on the ''backend_iface'' module. Make sure this matches the Noc ID in both the Block Description YAML file and Block Controller C++ code.&lt;br /&gt;
&lt;br /&gt;
====Goodbye AXI Wrapper====&lt;br /&gt;
&lt;br /&gt;
The RFNoC 3 version of Noc Shell outputs / accepts CHDR data packets consisting of a header, optional timestamp, and payload on a 64-bit AXI stream bus. Most designs then used a module called AXI Wrapper to handle the conversion between CHDR data packets and sample streams on a 32-bit AXI stream bus. AXI Wrapper also supported SIMPLE_MODE which for some use cases could transparently handle the header portion of the CHDR data packet. Otherwise, the user would need to set the header via m_axis_data_tuser.&lt;br /&gt;
&lt;br /&gt;
In RFNoC 4, Noc Shell has absorbed AXI Wrapper’s functionality. Noc Shell outputs two AXI stream buses per input / output port: a payload and context bus. The payload bus is in most cases identical to AXI Wrapper’s output: a 32-bit stream of samples on an AXI Stream bus with packets delimited by tlast. The context AXI stream bus carries the header, optional timestamp, and optional metadata. If your block used AXI Wrapper’s SIMPLE_MODE, then you can loop the context bus back into Noc Shell. If not, you will need to modify the context bus data. Refer to the [https://files.ettus.com/app_notes/RFNoC_Specification.pdf RFNoC Specification] for the format and timing diagram of the context bus.&lt;br /&gt;
&lt;br /&gt;
''Important Note: If your block used the AXI Rate Change module, Noc Shell has another data port mode to support this use case called '''axis_data''' that can be set in the Block Descriptor YAML file (see the fpga_iface entry). This mode causes the Noc Shell data ports to look more like AXI Wrapper’s and therefore makes them compatible with AXI Rate Change. See the DDC, DUC, or Keep One in N RFNoC Blocks for an example.''&lt;br /&gt;
&lt;br /&gt;
===Settings Bus replaced by CtrlPort===&lt;br /&gt;
&lt;br /&gt;
CtrlPort replaces the Settings Bus in RFNoC 4. The CtrlPort bus is similar to the Settings Bus with a few key differences. The table below compares the signaling between the two bus formats and provides notes on any differences. Timing diagrams and additional information on the CtrlPort bus is also available in the [https://files.ettus.com/app_notes/RFNoC_Specification.pdf RFNoC Specification].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Settings Bus (RFNoC 3) || CtrlPort (RFNoC 4)                              || RFNoC 4 Notes&lt;br /&gt;
|-&lt;br /&gt;
| set_stb                || ctrlport_reg_wr                                 || Write strobe&lt;br /&gt;
|-&lt;br /&gt;
| set_addr               || ctrlport_req_addr                               || 20-bits instead of 8-bits, increments by 4 instead of by 1, no reserved addresses (versus addresses 0-127 for Settings Bus)&lt;br /&gt;
|-&lt;br /&gt;
| set_data               || ctrlport_req_data                               || Write data&lt;br /&gt;
|-&lt;br /&gt;
| N/A                    || ctrlport_req_rd                                 || Read strobe equivalent of ctrlport_req_wr&lt;br /&gt;
|-&lt;br /&gt;
| rb_addr                || N/A                                             || CtrlPort uses ctrlport_req_addr for both '''read and write''' addresses&lt;br /&gt;
|-&lt;br /&gt;
| rb_data                || ctrlport_resp_data                              || Read data, 32-bits instead of 64-bits&lt;br /&gt;
|-&lt;br /&gt;
| rb_stb                 || N/A                                             || CtrlPort requires ack strobe for '''reads and writes'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
One additional difference when using CtrlPort is that there is not an equivalent Settings Register module. The bus is simple enough to setup a clocked process to handle reading from and writing to registers. See the Verilog example below:&lt;br /&gt;
&lt;br /&gt;
  // Note: Register addresses increment by 4&lt;br /&gt;
  localparam REG_USER_ADDR    = 0; // Address for example user register&lt;br /&gt;
  localparam REG_USER_DEFAULT = 0; // Default value for user register&lt;br /&gt;
  &lt;br /&gt;
  reg [31:0] reg_user = REG_USER_DEFAULT;&lt;br /&gt;
  &lt;br /&gt;
  always @(posedge ctrlport_clk) begin&lt;br /&gt;
    if (ctrlport_rst) begin&lt;br /&gt;
      reg_user = REG_USER_DEFAULT;&lt;br /&gt;
    end else begin&lt;br /&gt;
      // Default assignment&lt;br /&gt;
      m_ctrlport_resp_ack &amp;lt;= 0;&lt;br /&gt;
  &lt;br /&gt;
      // Read user register&lt;br /&gt;
      if (m_ctrlport_req_rd) begin // Read request&lt;br /&gt;
        case (m_ctrlport_req_addr)&lt;br /&gt;
          REG_USER_ADDR: begin&lt;br /&gt;
            m_ctrlport_resp_ack  &amp;lt;= 1;&lt;br /&gt;
            m_ctrlport_resp_data &amp;lt;= reg_user;&lt;br /&gt;
          end&lt;br /&gt;
        endcase&lt;br /&gt;
      end&lt;br /&gt;
  &lt;br /&gt;
      // Write user register&lt;br /&gt;
      if (m_ctrlport_req_wr) begin // Write requst&lt;br /&gt;
        case (m_ctrlport_req_addr)&lt;br /&gt;
          REG_USER_ADDR: begin&lt;br /&gt;
            m_ctrlport_resp_ack &amp;lt;= 1;&lt;br /&gt;
            reg_user            &amp;lt;= m_ctrlport_req_data[31:0];&lt;br /&gt;
          end&lt;br /&gt;
        endcase&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
''Important Note: For blocks that make heavy use of the Settings Bus and/or Settings Registers, there is a CtrlPort to Settings Bus bridge available called '''ctrlport_to_settings_bus'''. See the Keep One In N RFNoC Block for example code on how to interface with it.''&lt;br /&gt;
&lt;br /&gt;
===Testbench Infrastructure===&lt;br /&gt;
&lt;br /&gt;
While RFNoC 4 does overhaul the RFNoC 3 testbench infrastructure API, most of the high level concepts remain the same. The table below outlines some of the commonly used RFNoC 3 functions / code and the RFNoC 4 equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Operation                || RFNoC 3                                                       || RFNoC 4&lt;br /&gt;
|-&lt;br /&gt;
| Setup RFNoC&lt;br /&gt;
||&lt;br /&gt;
  `RFNOC_SIM_INIT(...)&lt;br /&gt;
  `RFNOC_ADD_BLOCK(...)&lt;br /&gt;
  `RFNOC_CONNECT(...)&lt;br /&gt;
||&lt;br /&gt;
  RfnocBlockCtrlBfm #(...) blk_ctrl = new(...);&lt;br /&gt;
  blk_ctrl.connect_master_data_port(...)&lt;br /&gt;
  blk_ctrl.connect_slave_data_port(...)&lt;br /&gt;
''Note: Instantiate one Block Controller BFM per RFNoC Block''&lt;br /&gt;
|-&lt;br /&gt;
| Setup Test Cases&lt;br /&gt;
||&lt;br /&gt;
  `TEST_CASE_START(...)&lt;br /&gt;
  `TEST_CASE_DONE(...)&lt;br /&gt;
||&lt;br /&gt;
  test.start_test(...)&lt;br /&gt;
  test.end_test()&lt;br /&gt;
|-&lt;br /&gt;
| Register Read&lt;br /&gt;
||&lt;br /&gt;
  tb_streamer.read_reg(...)&lt;br /&gt;
||&lt;br /&gt;
  blk_ctrl.reg_read(...)&lt;br /&gt;
|-&lt;br /&gt;
| Register Write&lt;br /&gt;
||&lt;br /&gt;
  tb_streamer.write_reg(...)&lt;br /&gt;
||&lt;br /&gt;
  blk_ctrl.reg_write(...)&lt;br /&gt;
|-&lt;br /&gt;
| Send Data / Samples&lt;br /&gt;
||&lt;br /&gt;
  tb_streamer.send(...)&lt;br /&gt;
||&lt;br /&gt;
  blk_ctrl.send_items(...)&lt;br /&gt;
|-&lt;br /&gt;
| Receive Data / Samples&lt;br /&gt;
||&lt;br /&gt;
  tb_streamer.recv(...)&lt;br /&gt;
||&lt;br /&gt;
  blk_ctrl.recv_items(...)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Building FPGA images using Image Core YAML Files===&lt;br /&gt;
&lt;br /&gt;
RFNoC 4 replaces uhd_image_builder, the RFNoC 3 FPGA image building tool, with a new tool called rfnoc_image_builder. This tool produces a FPGA bitstream based on an Image Core YAML file that describes the device configuration (e.g. X310 with dual 10GigE) and included RFNoC blocks along with their connections (both static and dynamic), clocking, and I/O.&lt;br /&gt;
&lt;br /&gt;
Both rfnocmodtool and the UHD in-tree example called rfnoc-example automatically setup make targets to handle running rfnoc_image_builder. If you want to use rfnoc_image_builder directly, more details can be found in the [https://kb.ettus.com/Getting_Started_with_RFNoC_in_UHD_4.0 Getting Started with RFNoC in UHD 4.0].&lt;br /&gt;
&lt;br /&gt;
=GNU Radio Software Migration=&lt;br /&gt;
&lt;br /&gt;
RFNoC 4 supports GNU Radio 3.8 only. Most of your RFNoC Block’s GNU Radio related changes will be due to API differences between GNU Radio 3.7 to 3.8. These changes are outside of the scope of this article. Instead, refer to [https://wiki.gnuradio.org/index.php/GNU_Radio_3.8_OOT_Module_Porting_Guide GNU Radio 3.8 Migration Guide] and [https://wiki.gnuradio.org/index.php/YAML_GRC GNU Radio Companion YAML] sites for more information.&lt;br /&gt;
&lt;br /&gt;
Migration reference files for this section from Gain RFNoC Block example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Description              || RFNoC 3 Files                                                 || RFNoC 4 Files&lt;br /&gt;
|-&lt;br /&gt;
| GNU Radio Block          || lib/gain_impl.cc&amp;lt;br&amp;gt;lib/gain_impl.h&amp;lt;br&amp;gt;include/example/gain.h || lib/gain_impl.cc&amp;lt;br&amp;gt;lib/gain_impl.h&amp;lt;br&amp;gt;include/example/gain.h&lt;br /&gt;
|-&lt;br /&gt;
| GRC Block Description    || grc/gain.xml                                                  || grc/gain.yml&lt;br /&gt;
|-&lt;br /&gt;
| Example GRC Flowgraph    || examples/gain.grc                                             || examples/gain.grc&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Note: Files are relative to the rfnoc-example directory in the respective rfnoc3 and rfnoc4 directories''&lt;br /&gt;
&lt;br /&gt;
===RX &amp;amp; TX Streamer Blocks===&lt;br /&gt;
&lt;br /&gt;
When transition between a RFNoC block and a GNU Radio block or vice versa, you must insert either a RX stream or TX streamer block respectively. This differs from RFNoC 3, where a RFNoC block could be directly connected to a GNU Radio block.&lt;br /&gt;
&lt;br /&gt;
[[File:rx_tx_streamer.png|border]]&lt;br /&gt;
&lt;br /&gt;
===Setting RFNoC Block Properties Directly in GNU Radio===&lt;br /&gt;
&lt;br /&gt;
The base class for RFNoC Block’s in GNU Radio have a set of functions that provide a shortcut to getting and setting properties without writing custom class methods. The table below lists the functions.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property Type     || Set Property             || Get Property&lt;br /&gt;
|-&lt;br /&gt;
| Integer           || set_int_property(...)    || get_int_property(...)&lt;br /&gt;
|-&lt;br /&gt;
| Double            || set_double_property(...) || get_double_property(...)&lt;br /&gt;
|-&lt;br /&gt;
| Bool              || set_bool_property(...)   || get_bool_property(...)&lt;br /&gt;
|-&lt;br /&gt;
| String            || set_string_property(...) || get_string_property(...)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Example code for GNU Radio Companion YAML Block Description file'''&lt;br /&gt;
  templates:&lt;br /&gt;
    imports: |-&lt;br /&gt;
      import example&lt;br /&gt;
    make: |-&lt;br /&gt;
      example.gain(&lt;br /&gt;
        self.rfnoc_graph,&lt;br /&gt;
        uhd.device_addr(${block_args}),&lt;br /&gt;
        ${device_select},&lt;br /&gt;
        ${instance_select})&lt;br /&gt;
      self.${id}.set_int_property('gain', ${gain})&lt;br /&gt;
    callbacks:&lt;br /&gt;
    - set_int_property('gain', ${gain})&lt;/div&gt;</summary>
		<author><name>MartinAnderseck</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=RFNoC_4_Migration_Guide&amp;diff=5231</id>
		<title>RFNoC 4 Migration Guide</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=RFNoC_4_Migration_Guide&amp;diff=5231"/>
				<updated>2021-10-29T10:04:54Z</updated>
		
		<summary type="html">&lt;p&gt;MartinAnderseck: /* Dependencies (Ubuntu 20.04) */ Adding full dependencies list to align with other sources&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Abstract=&lt;br /&gt;
&lt;br /&gt;
The UHD 4.0 release includes a major upgrade to the RFNoC framework called RFNoC 4. This article is a guide to aid users in migrating their existing RFNoC blocks from RFNoC 3 to RFNoC 4. The RFNoC Block Development Environment section provides guidance on how to setup an environment for developing out-of-tree RFNoC blocks in RFNoC 4. The UHD, FPGA, GNU Radio Migration sections provide general information on topics that most users will encounter when migrating their blocks. Finally, an equivalent RFNoC 3 and RFNoC 4 implementation of a digital gain RFNoC Block has been provided as a reference.&lt;br /&gt;
&lt;br /&gt;
=Prerequisites=&lt;br /&gt;
&lt;br /&gt;
===Dependencies (Ubuntu 20.04)===&lt;br /&gt;
  sudo apt-get -y install autoconf automake build-essential ccache cmake cpufrequtils \&lt;br /&gt;
  doxygen ethtool fort77 g++ gir1.2-gtk-3.0 git gobject-introspection gpsd gpsd-clients \&lt;br /&gt;
  inetutils-tools libasound2-dev libboost-all-dev libcomedi-dev libcppunit-dev libfftw3-bin \&lt;br /&gt;
  libfftw3-dev libfftw3-doc libfontconfig1-dev libgmp-dev libgps-dev libgsl-dev liblog4cpp5-dev \&lt;br /&gt;
  libncurses5 libncurses5-dev libpulse-dev libqt5opengl5-dev libqwt-qt5-dev libsdl1.2-dev libtool \&lt;br /&gt;
  libudev-dev libusb-1.0-0 libusb-1.0-0-dev libusb-dev libxi-dev libxrender-dev libzmq3-dev \&lt;br /&gt;
  libzmq5 ncurses-bin python3-cheetah python3-click python3-click-plugins python3-click-threading \&lt;br /&gt;
  python3-dev python3-docutils python3-gi python3-gi-cairo python3-gps python3-lxml python3-mako \&lt;br /&gt;
  python3-numpy python3-numpy-dbg python3-opengl python3-pyqt5 python3-requests python3-scipy \&lt;br /&gt;
  python3-setuptools python3-six python3-sphinx python3-yaml python3-zmq python3-ruamel.yaml swig wget&lt;br /&gt;
&lt;br /&gt;
===Vivado 2019.1 Design Edition===&lt;br /&gt;
&lt;br /&gt;
Please reference to Xilinx (xilinx.com) for installation instructions.&lt;br /&gt;
&lt;br /&gt;
''Note: The dependencies step above included installing libtinfo5 libncurses5, which is a workaround for getting Vivado 2019.1 to run on Ubunbtu 20.04''&lt;br /&gt;
&lt;br /&gt;
===UHD 4.0===&lt;br /&gt;
  git clone --branch UHD-4.0 https://github.com/ettusresearch/uhd.git uhd&lt;br /&gt;
  mkdir uhd/host/build; cd uhd/host/build&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
===GNU Radio 3.8===&lt;br /&gt;
'' Note: If your design does not use GNU Radio, then installing GNU Radio and gr-ettus is not required ''&lt;br /&gt;
&lt;br /&gt;
  git clone --branch maint-3.8 --recursive https://github.com/gnuradio/gnuradio.git gnuradio&lt;br /&gt;
  mkdir gnuradio/build; cd gnuradio/build;&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
===gr-ettus===&lt;br /&gt;
  git clone --branch maint-3.8-uhd4.0 https://github.com/ettusresearch/gr-ettus.git gr-ettus&lt;br /&gt;
  mkdir gr-ettus/build; cd gr-ettus/build;&lt;br /&gt;
  cmake -DENABLE_QT=True ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
=RFNoC Block Development Environment=&lt;br /&gt;
&lt;br /&gt;
Two options exist for developing RFNoC blocks depending on whether the your RFNoC block integrates with GNU Radio in an out-of-tree module or if it only uses UHD’s C++ API in a standalone application. The sections below outline how to setup the development environment for each scenario.&lt;br /&gt;
&lt;br /&gt;
===Migrating a GNU Radio Out-of-Tree Module===&lt;br /&gt;
&lt;br /&gt;
The tool rfnocmodtool automates the process of creating GNU Radio out-of-tree (OOT) modules that also have support for RFNoC blocks. This tool is part of gr-ettus and it has been ported to RFNoC 4.&lt;br /&gt;
&lt;br /&gt;
Due to changes in almost every source file, it is recommended to use rfnocmodtool to generate a new RFNoC block from scratch and then update the generated “skeleton” files.&lt;br /&gt;
&lt;br /&gt;
====Creating a RFNoC Block with rfnocmodtool====&lt;br /&gt;
&lt;br /&gt;
The following steps show how to create an OOT module called ''example'' and RFNoC block called ''gain'' using rfnocmodtool. The naming is only for example purposes.&lt;br /&gt;
&lt;br /&gt;
  rfnocmodtool newmod&lt;br /&gt;
  Name of the new module: '''example'''&lt;br /&gt;
  &lt;br /&gt;
  cd rfnoc-tutorial&lt;br /&gt;
  rfnocmodtool add&lt;br /&gt;
  Enter name of block/code (without module name prefix): '''gain'''&lt;br /&gt;
  Enter valid argument list, including default arguments: ''(leave blank)''&lt;br /&gt;
  Add Python QA code? [y/N] '''N'''&lt;br /&gt;
  Add C++ QA code? [y/N] '''N'''&lt;br /&gt;
  Block NoC ID (Hexadecimal): ''(Enter Noc ID of your block)''&lt;br /&gt;
  Skip Block Controllers Generation? [UHD block ctrl files] [y/N] '''N'''&lt;br /&gt;
  Skip Block interface files Generation? [GRC block ctrl files] [y/N] '''N'''&lt;br /&gt;
&lt;br /&gt;
''Note: Noc IDs have been reduced from 64-bits in RFNoC 3 to 32-bits in RFNoC 4''&lt;br /&gt;
&lt;br /&gt;
The following are the relevant files that need to be updated when migrating your RFNoC Block.&lt;br /&gt;
&lt;br /&gt;
  rfnoc-example/&lt;br /&gt;
      grc/&lt;br /&gt;
          example_gain.block.yml           – RFNoC Block GNU Radio Companion YAML file&lt;br /&gt;
      examples/&lt;br /&gt;
          gain.grc                         – Example flowgraph using gain RFNoC Block&lt;br /&gt;
      include/tutorial/&lt;br /&gt;
          gain.h                           – GNU Radio block C++ header&lt;br /&gt;
          gain_block_ctrl.hpp              – RFNoC Block Controller C++ header&lt;br /&gt;
      lib/&lt;br /&gt;
          gain_impl.cc                     – GNU Radio block C++ source&lt;br /&gt;
          gain_impl.h                      – GNU Radio block C++ header&lt;br /&gt;
          gain_block_ctrl_impl.cpp         – RFNoC Block Controller C++ source&lt;br /&gt;
      rfnoc/blocks/&lt;br /&gt;
          gain.yml                         – RFNoC Block Description YAML file&lt;br /&gt;
      rfnoc/fpga/rfnoc_block_gain&lt;br /&gt;
          noc_shell_gain.v                 – RFNoC Block Noc Shell Verilog Source&lt;br /&gt;
          rfnoc_block_gain.v               – RFNoC Block Verilog Source&lt;br /&gt;
          rfnoc_block_gain_tb.v            – RFNoC Block Testbench&lt;br /&gt;
      rfnoc/icores&lt;br /&gt;
          gain_x310_rfnoc_image_core.yml   – Image Core YAML file with gain block&lt;br /&gt;
&lt;br /&gt;
====Building OOT module====&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-tutorial&lt;br /&gt;
  mkdir build; cd build&lt;br /&gt;
  cmake -DUHD_FPGA_DIR=''(path to uhd/fpga directory)'' ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
====Running a testbench====&lt;br /&gt;
CMake automatically creates makefile targets to run the generated testbench code for each added RFNoC block. For example, here is how to run the gain block testbench:&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-tutorial/build&lt;br /&gt;
  make rfnoc_block_gain_tb&lt;br /&gt;
&lt;br /&gt;
====Building a FPGA image====&lt;br /&gt;
CMake automatically creates makefile targets to build FPGA images using the generated image core yaml files found in rfnoc/icore. Every RFNoC block created by rfnocmodtool automatically has an image core yaml file generated in that directory. For example, here is how to build an FPGA image using the image core yaml file generated for the gain block:&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-tutorial/build&lt;br /&gt;
  make gain_x310_rfnoc_image_core&lt;br /&gt;
&lt;br /&gt;
===Migrating a Standalone UHD C++ Application===&lt;br /&gt;
&lt;br /&gt;
For applications that only use the UHD API, an example out-of-tree (UHD source tree) RFNoC block exists called rfnoc-example. It is located in the UHD source at uhd/host/examples/rfnoc-example. This directory can be copied outside of the UHD source tree and used a starting point to migrate your RFNoC block.&lt;br /&gt;
&lt;br /&gt;
The following are the relevant files that need to be updated when migrating your RFNoC Block.&lt;br /&gt;
&lt;br /&gt;
  rfnoc-example/&lt;br /&gt;
      apps/&lt;br /&gt;
          init_gain_block.cpp         – Example C++ application testing gain block&lt;br /&gt;
      blocks/&lt;br /&gt;
          gain.yml                    – RFNoC Block Description YAML file&lt;br /&gt;
      fpga/rfnoc_block_gain&lt;br /&gt;
          noc_shell_gain.v            – RFNoC Block Noc Shell Verilog Source&lt;br /&gt;
          rfnoc_block_gain.v          – RFNoC Block Verilog Source&lt;br /&gt;
          rfnoc_block_gain_tb.v       – RFNoC Block Testbench&lt;br /&gt;
      icores/&lt;br /&gt;
          x310_rfnoc_image_core.yml   – Example Image Core YAML file&lt;br /&gt;
      include/rfnoc/example&lt;br /&gt;
          gain_block_control.hpp      – RFNoC Block Controller C++ header&lt;br /&gt;
      lib/&lt;br /&gt;
          gain_block_control.cpp      – RFNoC Block Controller C++ source&lt;br /&gt;
&lt;br /&gt;
====Building rfnoc-example====&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-example&lt;br /&gt;
  mkdir build; cd build&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
====Running a testbench====&lt;br /&gt;
CMake automatically creates makefile targets to run RFNoC Block testbench simulations. For every RFNoC block subdirectory listed in the CMakeLists.txt file in the rfnoc-example/fpga directory, a target with the RFNoC block name appended with “_tb” is added as a makefile target. For example, here is how to run the gain RFNoC block testbench:&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-example/build&lt;br /&gt;
  make rfnoc_block_gain_tb&lt;br /&gt;
&lt;br /&gt;
====Building a FPGA image====&lt;br /&gt;
CMake automatically creates makefile targets to build a FPGA image for each image core yaml file listed in the CMakeLists.txt file in the rfnoc-example/icore directory. Each image core yaml file must be listed in the CMakeLists.txt. For example, here is how to build an FPGA image using the image core yaml file generated for the gain block:&lt;br /&gt;
&lt;br /&gt;
  cd rfnoc-tutorial/build&lt;br /&gt;
  make gain_x310_rfnoc_image_core&lt;br /&gt;
&lt;br /&gt;
=Example RFNoC 3 to RFNoC 4 Block Migration=&lt;br /&gt;
&lt;br /&gt;
This ZIP archive, [[File:migration_example.zip]], contains equivalent RFNoC 3 and RFNoC 4 versions of a digital gain RFNoC Block. The following sections will refer to files in this archive to show how the file structure changes when migrating from RFNoC 3 to RFNoC 4.&lt;br /&gt;
&lt;br /&gt;
=UHD Software Migration=&lt;br /&gt;
&lt;br /&gt;
Migration reference files for this section from Gain RFNoC Block example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Description       || RFNoC 3 Files         || RFNoC 4 Files&lt;br /&gt;
|-&lt;br /&gt;
| Block Description || rfnoc/blocks/gain.xml || lib/gain_block_ctrl_impl.cpp &amp;lt;br&amp;gt;include/example/gain_block_ctrl.hpp&lt;br /&gt;
|-&lt;br /&gt;
| Block Controller  || rfnoc/blocks/gain.yml || lib/gain_block_ctrl_impl.cpp &amp;lt;br&amp;gt;include/example/gain_block_ctrl.hpp&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Note: Files are relative to the rfnoc-example directory in the respective rfnoc3 and rfnoc4 directories''&lt;br /&gt;
&lt;br /&gt;
===Noc Script XML Replaced by Block Description YAML===&lt;br /&gt;
&lt;br /&gt;
RFNoC 3 used Noc Script XML, a domain specific language, to describe the configuration of a RFNoC block: the Noc ID, register names and addresses, args for writing to the registers, and the input/output ports.&lt;br /&gt;
&lt;br /&gt;
RFNoC 4 replaces the Noc Script XML file with an easier to read and edit Block Description YAML file format. From a high level, the Block Description YAML file serves a similar function as the Noc Script XML file, with some similarities and key differences outlined in table below:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Item       || Noc Script XML              || Block Descript YAML || RFNoC 4 Notes&lt;br /&gt;
|-&lt;br /&gt;
| Block Name&lt;br /&gt;
||&lt;br /&gt;
  &amp;lt;name&amp;gt;gain&amp;lt;/name&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
  module_name: gain&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Noc ID&lt;br /&gt;
||&lt;br /&gt;
  &amp;lt;id&amp;gt;B160000000000000&amp;lt;/id&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
  noc_id: 0xB16&lt;br /&gt;
||&lt;br /&gt;
Noc ID are limited to 32-bits&lt;br /&gt;
|-&lt;br /&gt;
| Registers&lt;br /&gt;
||&lt;br /&gt;
  &amp;lt;registers&amp;gt;&lt;br /&gt;
    &amp;lt;setreg&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;GAIN&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;address&amp;gt;128&amp;lt;/address&amp;gt;&lt;br /&gt;
    &amp;lt;/setreg&amp;gt;&lt;br /&gt;
  &amp;lt;/registers&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
Registers must be defined in the Block Controller&lt;br /&gt;
|-&lt;br /&gt;
| Arguments&lt;br /&gt;
||&lt;br /&gt;
  &amp;lt;args&amp;gt;&lt;br /&gt;
    &amp;lt;arg&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;gain&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;type&amp;gt;int&amp;lt;/type&amp;gt;&lt;br /&gt;
      ...&lt;br /&gt;
    &amp;lt;/arg&amp;gt;&lt;br /&gt;
  &amp;lt;/args&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
Args are implemented with properties in the Block Controller&lt;br /&gt;
|-&lt;br /&gt;
| Data Ports&lt;br /&gt;
||&lt;br /&gt;
  &amp;lt;ports&amp;gt;&lt;br /&gt;
    &amp;lt;sink&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;in&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;/sink&amp;gt;&lt;br /&gt;
    &amp;lt;source&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;out&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;/source&amp;gt;&lt;br /&gt;
  &amp;lt;/ports&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
  data:&lt;br /&gt;
      fpga_iface: axis_pyld_ctxt&lt;br /&gt;
      clk_domain: rfnoc_chdr&lt;br /&gt;
      inputs:&lt;br /&gt;
          in:&lt;br /&gt;
             ...&lt;br /&gt;
      outputs:&lt;br /&gt;
          out:&lt;br /&gt;
             ...&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Control Ports&lt;br /&gt;
||&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
  control:&lt;br /&gt;
      sw_iface: nocscript&lt;br /&gt;
      fpga_iface: ctrlport&lt;br /&gt;
      interface_direction: slave&lt;br /&gt;
      ...&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Clocking&lt;br /&gt;
||&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
  clocks:&lt;br /&gt;
      - name: rfnoc_chdr&lt;br /&gt;
        freq: &amp;quot;[]&amp;quot;&lt;br /&gt;
      - name: rfnoc_ctrl&lt;br /&gt;
        freq: &amp;quot;[]&amp;quot;&lt;br /&gt;
||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Note: For a more detailed description of the RFNoC 4 Block Description YAML syntax and the various options, see the [https://files.ettus.com/app_notes/RFNoC_Specification.pdf RFNoC Specification].''&lt;br /&gt;
&lt;br /&gt;
===RFNoC API Changes===&lt;br /&gt;
&lt;br /&gt;
Much of the user facing RFNoC software API has not changed or remains very similar between RFNoC 3 and RFNoC 4. The table below outlines some of the notable differences:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! RFNoC 3       || RFNoC 4              || RFNoC 4 Notes&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  usrp = uhd::device3::make(...)&lt;br /&gt;
||&lt;br /&gt;
  graph = uhd::rfnoc::rfnoc_graph::make()&lt;br /&gt;
||&lt;br /&gt;
No longer need to create a device3 object&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  usrp-&amp;gt;get_block_ctrl(...)&lt;br /&gt;
||&lt;br /&gt;
  graph-&amp;gt;get_block(...)&lt;br /&gt;
||&lt;br /&gt;
Rename&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
  graph-&amp;gt;enumerate_static_connections()&lt;br /&gt;
||&lt;br /&gt;
Used to check static connections, usually for detecting hwen a DDC or DUC is statically connected to the radio and requires setting the sample&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  usrp-&amp;gt;get_tx_streamer(...)&lt;br /&gt;
||&lt;br /&gt;
  graph-&amp;gt;create_tx_streamer(...)&lt;br /&gt;
||&lt;br /&gt;
Rename&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  usrp-&amp;gt;get_rx_streamer(...)&lt;br /&gt;
||&lt;br /&gt;
  graph-&amp;gt;create_rx_streamer(...)&lt;br /&gt;
||&lt;br /&gt;
Rename&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
N/A&lt;br /&gt;
||&lt;br /&gt;
  graph-&amp;gt;commit()&lt;br /&gt;
||&lt;br /&gt;
Commit graph and run initial checks&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  sr_write(...)&lt;br /&gt;
||&lt;br /&gt;
  regs().poke32(...)&lt;br /&gt;
||&lt;br /&gt;
Address increments by 4&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  sr_read32(...)&lt;br /&gt;
||&lt;br /&gt;
  regs().peek32(...)&lt;br /&gt;
||&lt;br /&gt;
Address increments by 4&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  sr_read64(...)&lt;br /&gt;
||&lt;br /&gt;
  regs().poke64(...)&lt;br /&gt;
||&lt;br /&gt;
Address increments by 8&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  set_arg(...)&lt;br /&gt;
||&lt;br /&gt;
  set_property(...)&lt;br /&gt;
||&lt;br /&gt;
Block args replaced with block properties concept&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
  get_arg(...)&lt;br /&gt;
||&lt;br /&gt;
  get_property(...)&lt;br /&gt;
||&lt;br /&gt;
Block args replaced with block properties concept&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Block Properties===&lt;br /&gt;
&lt;br /&gt;
In RFNoC 3, RFNoC blocks can have arguments (also known as args) that are used to write user registers. This is implemented in the Noc Script XML in the &amp;lt;args&amp;gt; section.&lt;br /&gt;
&lt;br /&gt;
RFNoC 4 expands and generalizes this concept with block properties: a high-level representation of the state of the block. Zero or more properties can be defined by the user in their RFNoC Block’s Block Controller C++ class. When read or written to, they can trigger a call back to a user defined resolver function. The [https://files.ettus.com/app_notes/RFNoC_Specification.pdf RFNoC Specification] provides more details on properties in the “Block Properties” section.&lt;br /&gt;
&lt;br /&gt;
The following shows an example of how to migrate a RFNoC 3 Noc Script XML “arg” based register write to a RFNoC 4 property based implementation in the Block Controller:&lt;br /&gt;
&lt;br /&gt;
====RFNoC 3 Noc Script XML snippet====&lt;br /&gt;
  &amp;lt;registers&amp;gt;&lt;br /&gt;
    &amp;lt;setreg&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;GAIN&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;address&amp;gt;128&amp;lt;/address&amp;gt;&lt;br /&gt;
    &amp;lt;/setreg&amp;gt;&lt;br /&gt;
  &amp;lt;/registers&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;args&amp;gt;&lt;br /&gt;
    &amp;lt;arg&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;gain&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;type&amp;gt;int&amp;lt;/type&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;check&amp;gt;GE($gain, 0) AND LE($gain, 32767)&amp;lt;/check&amp;gt;&lt;br /&gt;
      &amp;lt;check_message&amp;gt;Gain must be in the range [0, 32767]&amp;lt;/check_message&amp;gt;&lt;br /&gt;
      &amp;lt;action&amp;gt;SR_WRITE(&amp;quot;GAIN&amp;quot;, $gain)&amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;/arg&amp;gt;&lt;br /&gt;
  &amp;lt;/args&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RFNoC 4 Block Controller Class====&lt;br /&gt;
&lt;br /&gt;
  // &amp;lt;registers&amp;gt;&lt;br /&gt;
  //    &amp;lt;setreg&amp;gt;&lt;br /&gt;
  //      &amp;lt;name&amp;gt;GAIN&amp;lt;/name&amp;gt;&lt;br /&gt;
  //      &amp;lt;address&amp;gt;128&amp;lt;/address&amp;gt;&lt;br /&gt;
  //    &amp;lt;/setreg&amp;gt;&lt;br /&gt;
  // &amp;lt;/registers&amp;gt;&lt;br /&gt;
  // Note: In RFNoC 4, register addresses can start at address 0 instead of address 128 as in RFNoC 3.&lt;br /&gt;
  const uint32_t gain_block_ctrl::REG_GAIN_ADDR = 128;&lt;br /&gt;
  const uint32_t gain_block_ctrl::REG_GAIN_DEFAULT = 1;&lt;br /&gt;
  &lt;br /&gt;
  class gain_block_ctrl_impl : public gain_block_ctrl&lt;br /&gt;
  {&lt;br /&gt;
  public:&lt;br /&gt;
      RFNOC_BLOCK_CONSTRUCTOR(gain_block_ctrl)&lt;br /&gt;
      {&lt;br /&gt;
          _register_props();&lt;br /&gt;
      }&lt;br /&gt;
  private:&lt;br /&gt;
      void _register_props()&lt;br /&gt;
      {&lt;br /&gt;
          register_property(&amp;amp;_user_reg, [this]() {&lt;br /&gt;
              int user_reg = this-&amp;gt;_user_reg.get();&lt;br /&gt;
              // &amp;lt;check&amp;gt;GE($gain, 0) AND LE($gain, 32767)&amp;lt;/check&amp;gt;&lt;br /&gt;
              // &amp;lt;check_message&amp;gt;Gain must be in the range [0, 32767]&amp;lt;/check_message&amp;gt;&lt;br /&gt;
              if (user_reg &amp;lt; 0 || user_reg &amp;gt; 32767) {&lt;br /&gt;
                  throw uhd::value_error(&amp;quot;Size value must be in [0,32767]&amp;quot;);&lt;br /&gt;
              }&lt;br /&gt;
              // &amp;lt;action&amp;gt;SR_WRITE(&amp;quot;GAIN&amp;quot;, $gain)&amp;lt;/action&amp;gt;&lt;br /&gt;
              this-&amp;gt;regs().poke32(REG_USER_ADDR, user_reg);&lt;br /&gt;
          });&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
  // &amp;lt;name&amp;gt;gain&amp;lt;/name&amp;gt;&lt;br /&gt;
  // &amp;lt;type&amp;gt;int&amp;lt;/type&amp;gt;&lt;br /&gt;
  // &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
  property_t&amp;lt;int&amp;gt; _user_reg{&amp;quot;gain&amp;quot;, REG_USER_DEFAULT, {res_source_info::USER}};&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
As the above shows, writing to a register can be replicated with a property and a resolver function. Of course, the resolver function can also be made much more sophisticated. For additional examples, see the in-tree block controllers in uhd/host/lib/rfnoc.&lt;br /&gt;
&lt;br /&gt;
=FPGA Migration=&lt;br /&gt;
&lt;br /&gt;
Migration reference files for this section from Gain RFNoC Block example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Description        || RFNoC 3 Files                                       || RFNoC 4 Files&lt;br /&gt;
|-&lt;br /&gt;
| Block Verilog Code || rfnoc/fpga-src/noc_block_gain.v                     || rfnoc/fpga/rfnoc_block_gain/rfnoc_block_gain.v&lt;br /&gt;
|-&lt;br /&gt;
| Block Noc Shell    || N/A                                                 || rfnoc/fpga/rfnoc_block_gain/noc_shell_gain.v&lt;br /&gt;
|-&lt;br /&gt;
| Block Testbnech    || rfnoc/testbench/noc_block_gain/noc_block_gain_tb.sv || rfnoc/fpga/rfnoc_block_gain/rfnoc_block_gain_tb.sv&lt;br /&gt;
|-&lt;br /&gt;
| Image Core         || N/A                                                 || rfnoc/icores/gain_x310_rfnoc_image_core.yml&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Note: Files are relative to the rfnoc-example directory in the respective rfnoc3 and rfnoc4 directories''&lt;br /&gt;
&lt;br /&gt;
===Noc Shell Changes===&lt;br /&gt;
&lt;br /&gt;
RFNoC 4 replaces the highly parameterized RFNoC 3 Noc Shell with a per-block customized Noc Shell generated from the block’s Block Description YAML file. The Noc Shell generated via rfnocmodtool or the existing one in rfnoc-example is acceptable for most blocks that require one input and output data port.&lt;br /&gt;
&lt;br /&gt;
====Generating a Custom Noc Shell====&lt;br /&gt;
&lt;br /&gt;
Some blocks may need multiple data ports or other modifications. This requires editing the Block Description YAML file and then using the Python script rfnoc_create_verilog.py (found in uhd/host/utils/rfnoc_blocktool) to generate a new Noc Shell instance.&lt;br /&gt;
&lt;br /&gt;
The argument “-c” is used to provide the YAML file location. “-d” provides the output destination directory.&lt;br /&gt;
&lt;br /&gt;
''Note: It is suggested to not set the destination directory to your existing RFNoC block code, as the script will automatically overwrite the existing code!''&lt;br /&gt;
&lt;br /&gt;
Example usage:&lt;br /&gt;
  rfnoc_create_verilog.py -c ./rfnoc-example/rfnoc/blocks/gain.yml -d ./output/&lt;br /&gt;
&lt;br /&gt;
====Changing Noc ID without using rfnoc_create_verilog====&lt;br /&gt;
&lt;br /&gt;
In the generated Noc Shell Verilog code, a block’s Noc ID can be changed by updating the NOC_ID parameter on the ''backend_iface'' module. Make sure this matches the Noc ID in both the Block Description YAML file and Block Controller C++ code.&lt;br /&gt;
&lt;br /&gt;
====Goodbye AXI Wrapper====&lt;br /&gt;
&lt;br /&gt;
The RFNoC 3 version of Noc Shell outputs / accepts CHDR data packets consisting of a header, optional timestamp, and payload on a 64-bit AXI stream bus. Most designs then used a module called AXI Wrapper to handle the conversion between CHDR data packets and sample streams on a 32-bit AXI stream bus. AXI Wrapper also supported SIMPLE_MODE which for some use cases could transparently handle the header portion of the CHDR data packet. Otherwise, the user would need to set the header via m_axis_data_tuser.&lt;br /&gt;
&lt;br /&gt;
In RFNoC 4, Noc Shell has absorbed AXI Wrapper’s functionality. Noc Shell outputs two AXI stream buses per input / output port: a payload and context bus. The payload bus is in most cases identical to AXI Wrapper’s output: a 32-bit stream of samples on an AXI Stream bus with packets delimited by tlast. The context AXI stream bus carries the header, optional timestamp, and optional metadata. If your block used AXI Wrapper’s SIMPLE_MODE, then you can loop the context bus back into Noc Shell. If not, you will need to modify the context bus data. Refer to the [https://files.ettus.com/app_notes/RFNoC_Specification.pdf RFNoC Specification] for the format and timing diagram of the context bus.&lt;br /&gt;
&lt;br /&gt;
''Important Note: If your block used the AXI Rate Change module, Noc Shell has another data port mode to support this use case called '''axis_data''' that can be set in the Block Descriptor YAML file (see the fpga_iface entry). This mode causes the Noc Shell data ports to look more like AXI Wrapper’s and therefore makes them compatible with AXI Rate Change. See the DDC, DUC, or Keep One in N RFNoC Blocks for an example.''&lt;br /&gt;
&lt;br /&gt;
===Settings Bus replaced by CtrlPort===&lt;br /&gt;
&lt;br /&gt;
CtrlPort replaces the Settings Bus in RFNoC 4. The CtrlPort bus is similar to the Settings Bus with a few key differences. The table below compares the signaling between the two bus formats and provides notes on any differences. Timing diagrams and additional information on the CtrlPort bus is also available in the [https://files.ettus.com/app_notes/RFNoC_Specification.pdf RFNoC Specification].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Settings Bus (RFNoC 3) || CtrlPort (RFNoC 4)                              || RFNoC 4 Notes&lt;br /&gt;
|-&lt;br /&gt;
| set_stb                || ctrlport_reg_wr                                 || Write strobe&lt;br /&gt;
|-&lt;br /&gt;
| set_addr               || ctrlport_req_addr                               || 20-bits instead of 8-bits, increments by 4 instead of by 1, no reserved addresses (versus addresses 0-127 for Settings Bus)&lt;br /&gt;
|-&lt;br /&gt;
| set_data               || ctrlport_req_data                               || Write data&lt;br /&gt;
|-&lt;br /&gt;
| N/A                    || ctrlport_req_rd                                 || Read strobe equivalent of ctrlport_req_wr&lt;br /&gt;
|-&lt;br /&gt;
| rb_addr                || N/A                                             || CtrlPort uses ctrlport_req_addr for both '''read and write''' addresses&lt;br /&gt;
|-&lt;br /&gt;
| rb_data                || ctrlport_resp_data                              || Read data, 32-bits instead of 64-bits&lt;br /&gt;
|-&lt;br /&gt;
| rb_stb                 || N/A                                             || CtrlPort requires ack strobe for '''reads and writes'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
One additional difference when using CtrlPort is that there is not an equivalent Settings Register module. The bus is simple enough to setup a clocked process to handle reading from and writing to registers. See the Verilog example below:&lt;br /&gt;
&lt;br /&gt;
  // Note: Register addresses increment by 4&lt;br /&gt;
  localparam REG_USER_ADDR    = 0; // Address for example user register&lt;br /&gt;
  localparam REG_USER_DEFAULT = 0; // Default value for user register&lt;br /&gt;
  &lt;br /&gt;
  reg [31:0] reg_user = REG_USER_DEFAULT;&lt;br /&gt;
  &lt;br /&gt;
  always @(posedge ctrlport_clk) begin&lt;br /&gt;
    if (ctrlport_rst) begin&lt;br /&gt;
      reg_user = REG_USER_DEFAULT;&lt;br /&gt;
    end else begin&lt;br /&gt;
      // Default assignment&lt;br /&gt;
      m_ctrlport_resp_ack &amp;lt;= 0;&lt;br /&gt;
  &lt;br /&gt;
      // Read user register&lt;br /&gt;
      if (m_ctrlport_req_rd) begin // Read request&lt;br /&gt;
        case (m_ctrlport_req_addr)&lt;br /&gt;
          REG_USER_ADDR: begin&lt;br /&gt;
            m_ctrlport_resp_ack  &amp;lt;= 1;&lt;br /&gt;
            m_ctrlport_resp_data &amp;lt;= reg_user;&lt;br /&gt;
          end&lt;br /&gt;
        endcase&lt;br /&gt;
      end&lt;br /&gt;
  &lt;br /&gt;
      // Write user register&lt;br /&gt;
      if (m_ctrlport_req_wr) begin // Write requst&lt;br /&gt;
        case (m_ctrlport_req_addr)&lt;br /&gt;
          REG_USER_ADDR: begin&lt;br /&gt;
            m_ctrlport_resp_ack &amp;lt;= 1;&lt;br /&gt;
            reg_user            &amp;lt;= m_ctrlport_req_data[31:0];&lt;br /&gt;
          end&lt;br /&gt;
        endcase&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
''Important Note: For blocks that make heavy use of the Settings Bus and/or Settings Registers, there is a CtrlPort to Settings Bus bridge available called '''ctrlport_to_settings_bus'''. See the Keep One In N RFNoC Block for example code on how to interface with it.''&lt;br /&gt;
&lt;br /&gt;
===Testbench Infrastructure===&lt;br /&gt;
&lt;br /&gt;
While RFNoC 4 does overhaul the RFNoC 3 testbench infrastructure API, most of the high level concepts remain the same. The table below outlines some of the commonly used RFNoC 3 functions / code and the RFNoC 4 equivalent.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Operation                || RFNoC 3                                                       || RFNoC 4&lt;br /&gt;
|-&lt;br /&gt;
| Setup RFNoC&lt;br /&gt;
||&lt;br /&gt;
  `RFNOC_SIM_INIT(...)&lt;br /&gt;
  `RFNOC_ADD_BLOCK(...)&lt;br /&gt;
  `RFNOC_CONNECT(...)&lt;br /&gt;
||&lt;br /&gt;
  RfnocBlockCtrlBfm #(...) blk_ctrl = new(...);&lt;br /&gt;
  blk_ctrl.connect_master_data_port(...)&lt;br /&gt;
  blk_ctrl.connect_slave_data_port(...)&lt;br /&gt;
''Note: Instantiate one Block Controller BFM per RFNoC Block''&lt;br /&gt;
|-&lt;br /&gt;
| Setup Test Cases&lt;br /&gt;
||&lt;br /&gt;
  `TEST_CASE_START(...)&lt;br /&gt;
  `TEST_CASE_DONE(...)&lt;br /&gt;
||&lt;br /&gt;
  test.start_test(...)&lt;br /&gt;
  test.end_test()&lt;br /&gt;
|-&lt;br /&gt;
| Register Read&lt;br /&gt;
||&lt;br /&gt;
  tb_streamer.read_reg(...)&lt;br /&gt;
||&lt;br /&gt;
  blk_ctrl.reg_read(...)&lt;br /&gt;
|-&lt;br /&gt;
| Register Write&lt;br /&gt;
||&lt;br /&gt;
  tb_streamer.write_reg(...)&lt;br /&gt;
||&lt;br /&gt;
  blk_ctrl.reg_write(...)&lt;br /&gt;
|-&lt;br /&gt;
| Send Data / Samples&lt;br /&gt;
||&lt;br /&gt;
  tb_streamer.send(...)&lt;br /&gt;
||&lt;br /&gt;
  blk_ctrl.send_items(...)&lt;br /&gt;
|-&lt;br /&gt;
| Receive Data / Samples&lt;br /&gt;
||&lt;br /&gt;
  tb_streamer.recv(...)&lt;br /&gt;
||&lt;br /&gt;
  blk_ctrl.recv_items(...)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Building FPGA images using Image Core YAML Files===&lt;br /&gt;
&lt;br /&gt;
RFNoC 4 replaces uhd_image_builder, the RFNoC 3 FPGA image building tool, with a new tool called rfnoc_image_builder. This tool produces a FPGA bitstream based on an Image Core YAML file that describes the device configuration (e.g. X310 with dual 10GigE) and included RFNoC blocks along with their connections (both static and dynamic), clocking, and I/O.&lt;br /&gt;
&lt;br /&gt;
Both rfnocmodtool and the UHD in-tree example called rfnoc-example automatically setup make targets to handle running rfnoc_image_builder. If you want to use rfnoc_image_builder directly, more details can be found in the [https://kb.ettus.com/Getting_Started_with_RFNoC_in_UHD_4.0 Getting Started with RFNoC in UHD 4.0].&lt;br /&gt;
&lt;br /&gt;
=GNU Radio Software Migration=&lt;br /&gt;
&lt;br /&gt;
RFNoC 4 supports GNU Radio 3.8 only. Most of your RFNoC Block’s GNU Radio related changes will be due to API differences between GNU Radio 3.7 to 3.8. These changes are outside of the scope of this article. Instead, refer to [https://wiki.gnuradio.org/index.php/GNU_Radio_3.8_OOT_Module_Porting_Guide GNU Radio 3.8 Migration Guide] and [https://wiki.gnuradio.org/index.php/YAML_GRC GNU Radio Companion YAML] sites for more information.&lt;br /&gt;
&lt;br /&gt;
Migration reference files for this section from Gain RFNoC Block example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Description              || RFNoC 3 Files                                                 || RFNoC 4 Files&lt;br /&gt;
|-&lt;br /&gt;
| GNU Radio Block          || lib/gain_impl.cc&amp;lt;br&amp;gt;lib/gain_impl.h&amp;lt;br&amp;gt;include/example/gain.h || lib/gain_impl.cc&amp;lt;br&amp;gt;lib/gain_impl.h&amp;lt;br&amp;gt;include/example/gain.h&lt;br /&gt;
|-&lt;br /&gt;
| GRC Block Description    || grc/gain.xml                                                  || grc/gain.yml&lt;br /&gt;
|-&lt;br /&gt;
| Example GRC Flowgraph    || examples/gain.grc                                             || examples/gain.grc&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Note: Files are relative to the rfnoc-example directory in the respective rfnoc3 and rfnoc4 directories''&lt;br /&gt;
&lt;br /&gt;
===RX &amp;amp; TX Streamer Blocks===&lt;br /&gt;
&lt;br /&gt;
When transition between a RFNoC block and a GNU Radio block or vice versa, you must insert either a RX stream or TX streamer block respectively. This differs from RFNoC 3, where a RFNoC block could be directly connected to a GNU Radio block.&lt;br /&gt;
&lt;br /&gt;
[[File:rx_tx_streamer.png|border]]&lt;br /&gt;
&lt;br /&gt;
===Setting RFNoC Block Properties Directly in GNU Radio===&lt;br /&gt;
&lt;br /&gt;
The base class for RFNoC Block’s in GNU Radio have a set of functions that provide a shortcut to getting and setting properties without writing custom class methods. The table below lists the functions.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property Type     || Set Property             || Get Property&lt;br /&gt;
|-&lt;br /&gt;
| Integer           || set_int_property(...)    || get_int_property(...)&lt;br /&gt;
|-&lt;br /&gt;
| Double            || set_double_property(...) || get_double_property(...)&lt;br /&gt;
|-&lt;br /&gt;
| Bool              || set_bool_property(...)   || get_bool_property(...)&lt;br /&gt;
|-&lt;br /&gt;
| String            || set_string_property(...) || get_string_property(...)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Example code for GNU Radio Companion YAML Block Description file'''&lt;br /&gt;
  templates:&lt;br /&gt;
    imports: |-&lt;br /&gt;
      import example&lt;br /&gt;
    make: |-&lt;br /&gt;
      example.gain(&lt;br /&gt;
        self.rfnoc_graph,&lt;br /&gt;
        uhd.device_addr(${block_args}),&lt;br /&gt;
        ${device_select},&lt;br /&gt;
        ${instance_select})&lt;br /&gt;
      self.${id}.set_int_property('gain', ${gain})&lt;br /&gt;
    callbacks:&lt;br /&gt;
    - set_int_property('gain', ${gain})&lt;/div&gt;</summary>
		<author><name>MartinAnderseck</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Building_and_Installing_the_USRP_Open-Source_Toolchain_(UHD_and_GNU_Radio)_on_Linux&amp;diff=5230</id>
		<title>Building and Installing the USRP Open-Source Toolchain (UHD and GNU Radio) on Linux</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Building_and_Installing_the_USRP_Open-Source_Toolchain_(UHD_and_GNU_Radio)_on_Linux&amp;diff=5230"/>
				<updated>2021-10-29T09:58:26Z</updated>
		
		<summary type="html">&lt;p&gt;MartinAnderseck: Added python3-ruamel.yaml to Ubuntu 20.04 dependencies to align with other sources.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Application Note Number==&lt;br /&gt;
'''AN-445'''&lt;br /&gt;
&lt;br /&gt;
==Revision History==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Author&lt;br /&gt;
!Details&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2016-05-01   &lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Neel Pandeya &lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Initial creation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This Application Note provides a comprehensive guide for building, installing, and maintaining the open-source toolchain for the USRP (UHD and GNU Radio) from source code on the Linux platform. The Ubuntu and Fedora distributions are specifically discussed. Several other alternate installation methods are also discussed.&lt;br /&gt;
&lt;br /&gt;
http://files.ettus.com/manual/page_build_guide.html#build_instructions_unix&lt;br /&gt;
&lt;br /&gt;
==UHD on Linux==&lt;br /&gt;
&lt;br /&gt;
UHD is fully supported on Linux, using the GCC compiler, and should work on most major Linux distributions.&lt;br /&gt;
&lt;br /&gt;
==Devices==&lt;br /&gt;
This document applies only to the USRP X300, X310, B200, B210, B200mini, N200, N210 devices. The E310 and E312 devices are embedded devices, and are fundamentally different from the other non-embedded USRP devices, and are not addressed by this document.&lt;br /&gt;
&lt;br /&gt;
==Install Linux==&lt;br /&gt;
&lt;br /&gt;
If you already have a recent version of Linux installed, then you may be able to skip this section. If you are starting from scratch, or simply want to start with a fresh new installation of Linux, then please follow the instructions and recommendations in this section.&lt;br /&gt;
&lt;br /&gt;
We suggest that you use either Ubuntu 16.04.5, Ubuntu 18.04, Ubuntu 18.10, Fedora 27, 28, 29, and that you use a 64-bit architecture, not a 32-bit architecture. There are several re-spins of Ubuntu, such as Xubuntu, Lubuntu, Kubuntu, Linux Mint, all of which should also work. For the purposes of this document, these re-spins can be considered equivalent. Both Ubuntu and Fedora are known to work well with UHD and GNU Radio.&lt;br /&gt;
&lt;br /&gt;
Download and install Ubuntu, Xubuntu, Linux Mint, or Fedora from the links below. Download the appropriate ISO image, and write it to a USB flash drive. Be sure to verify that the ISO file was not corrupted during the download process by checking the MD5 and/or SHA1 hash.&lt;br /&gt;
&lt;br /&gt;
* [http://www.ubuntu.com/download/desktop Ubuntu download page]&lt;br /&gt;
* [http://www.xubuntu.org/getxubuntu/ Xubuntu download page]&lt;br /&gt;
* [https://www.linuxmint.com/download.php Linux Mint download page]&lt;br /&gt;
* [https://getfedora.org/en/workstation/download/ Fedora download page]&lt;br /&gt;
&lt;br /&gt;
You can learn more about Ubuntu, Xubuntu, Linux Mint, and Fedora at the links below.&lt;br /&gt;
&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Ubuntu_%28operating_system%29 Wikipedia article on Ubuntu]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Xubuntu Wikipedia article on Xubuntu]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Linux_Mint Wikipedia article on Linux Mint]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Fedora_%28operating_system%29 Wikipedia article on Fedora]&lt;br /&gt;
&lt;br /&gt;
There are many tools for writing an ISO image to a USB flash drive. In Linux, you can use the &amp;quot;dd&amp;quot; utility, or the UNetbootin utility. On Ubuntu systems, there is also the Startup Disk Creator utility as well.&lt;br /&gt;
&lt;br /&gt;
* [http://unetbootin.sourceforge.net/ UNetbootin homepage]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/UNetbootin Wikipedia article on UNetbootin]&lt;br /&gt;
&lt;br /&gt;
* [https://launchpad.net/usb-creator Startup Disk Creator homepage]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Startup_Disk_Creator Wikipedia article on Startup Disk Creator]&lt;br /&gt;
* [http://www.ubuntu.com/download/desktop/create-a-usb-stick-on-ubuntu Article about Startup Disk Creator]&lt;br /&gt;
&lt;br /&gt;
Be sure to use a USB flash drive with at least 8 GB capacity, and use a USB 3.0 flash drive, not a USB 2.0 flash drive. If you use a slower USB 2.0 flash drive, then the install process will take significantly longer.&lt;br /&gt;
&lt;br /&gt;
==Update and Install dependencies==&lt;br /&gt;
&lt;br /&gt;
Before building UHD and GNU Radio, you need to make sure that all the dependencies are first installed.&lt;br /&gt;
&lt;br /&gt;
However, before installing any dependencies, you should first make sure that all the packages that are already installed on your system are up-to-date. You can do this from a GUI, or from the command-line, as shown below.&lt;br /&gt;
&lt;br /&gt;
On Ubuntu systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get update&lt;br /&gt;
&lt;br /&gt;
On Fedora 21 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo yum update&lt;br /&gt;
&lt;br /&gt;
On Fedora 22, 23, 24 and 25 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo dnf update&lt;br /&gt;
&lt;br /&gt;
Once the system has been updated, then install the required dependencies for UHD and GNU Radio.&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 20.04 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install autoconf automake build-essential ccache cmake cpufrequtils doxygen ethtool fort77 g++ gir1.2-gtk-3.0 git gobject-introspection gpsd gpsd-clients inetutils-tools libasound2-dev libboost-all-dev libcomedi-dev libcppunit-dev libfftw3-bin libfftw3-dev libfftw3-doc libfontconfig1-dev libgmp-dev libgps-dev libgsl-dev liblog4cpp5-dev libncurses5 libncurses5-dev libpulse-dev libqt5opengl5-dev libqwt-qt5-dev libsdl1.2-dev libtool libudev-dev libusb-1.0-0 libusb-1.0-0-dev libusb-dev libxi-dev libxrender-dev libzmq3-dev libzmq5 ncurses-bin python3-cheetah python3-click python3-click-plugins python3-click-threading python3-dev python3-docutils python3-gi python3-gi-cairo python3-gps python3-lxml python3-mako python3-numpy python3-numpy-dbg python3-opengl python3-pyqt5 python3-requests python3-scipy python3-setuptools python3-six python3-sphinx python3-yaml python3-zmq python3-ruamel.yaml swig wget&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 18.10 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-1.14-0 libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libqwt6abi1 libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev libncurses6-dbg libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-dev libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk3.0 git libqt4-dev python-numpy ccache python-opengl libgsl-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwtplot3d-qt5-dev pyqt4-dev-tools python-qwt5-qt4 cmake git wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq3-dev libzmq5 python-requests python-sphinx libcomedi-dev python-zmq libqwt-dev libqwt6abi1 python-six libgps-dev libgps23 gpsd gpsd-clients python-gps python-setuptools&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 18.04 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-1.14-0 libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libqwt6abi1 libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev libncurses5-dbg libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-dev libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk3.0 git libqt4-dev python-numpy ccache python-opengl libgsl-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwtplot3d-qt5-dev pyqt4-dev-tools python-qwt5-qt4 cmake git wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq3-dev libzmq5 python-requests python-sphinx libcomedi-dev python-zmq libqwt-dev libqwt6abi1 python-six libgps-dev libgps23 gpsd gpsd-clients python-gps python-setuptools&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 17.04 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-1.13-0v5 libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libqwt6abi1 libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev libncurses5-dbg libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-dev libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk3.0 git-core libqt4-dev python-numpy ccache python-opengl libgsl-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwt5-qt4-dev libqwtplot3d-qt4-dev pyqt4-dev-tools python-qwt5-qt4 cmake git-core wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq3-dev libzmq5 python-requests python-sphinx libcomedi-dev python-zmq python-setuptools&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 16.04 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-1.13-0v5 libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libqwt6abi1 libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev libncurses5-dbg libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-dev libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk3.0 git-core libqt4-dev python-numpy ccache python-opengl libgsl-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwt5-qt4-dev libqwtplot3d-qt4-dev pyqt4-dev-tools python-qwt5-qt4 cmake git-core wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq-dev libzmq1 python-requests python-sphinx libcomedi-dev python-zmq python-setuptools&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 15.04 and 15.10 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libqwt6 libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev  libncurses5-dbg libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-1.13-0v5 libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk2.8 git-core libqt4-dev python-numpy ccache python-opengl libgsl0-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwt5-qt4-dev libqwtplot3d-qt4-dev pyqt4-dev-tools python-qwt5-qt4 cmake git-core wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq-dev libzmq1 python-requests python-sphinx libcomedi-dev python-zmq python-setuptools&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 14.04 and 14.10 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-1.13-0 libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev libncurses5-dbg   libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-dev libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk2.8 git-core libqt4-dev python-numpy ccache python-opengl libgsl0-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwt5-qt4-dev libqwtplot3d-qt4-dev pyqt4-dev-tools python-qwt5-qt4 cmake git-core wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq1 libzmq-dev python-requests python-sphinx libcomedi-dev python-setuptools&lt;br /&gt;
&lt;br /&gt;
On Fedora 21 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo yum -y groupinstall &amp;quot;Engineering and Scientific&amp;quot; &amp;quot;Development Tools&amp;quot; &amp;quot;Software Development Tools&amp;quot; &amp;quot;C Development Tools and Libraries&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    sudo yum -y install fftw-devel cppunit-devel wxPython-devel boost-devel alsa-lib-devel numpy gsl-devel python-devel pygsl python-cheetah python-mako python-lxml PyOpenGL qt-devel qt qt4 qt4-devel PyQt4-devel qwt-devel qwtplot3d-qt4-devel libusbx-devel cmake git wget python-docutils cppzmq-devel PyQwt PyQwt-devel qwt-devel gtk2-engines xmlrpc-c-&amp;quot;*&amp;quot; tkinter orc orc-devel python-sphinx SDL-devel swig  zeromq2-devel python-zmq comedilib comedilib-devel thrift-devel python-thrift scipy zeromq zeromq-devel&lt;br /&gt;
			  &lt;br /&gt;
On Fedora 22, 23, 24 and 25 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo dnf -y groupinstall &amp;quot;Engineering and Scientific&amp;quot; &amp;quot;Development Tools&amp;quot; &amp;quot;C Development Tools and Libraries&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
    sudo dnf -y install fftw-devel cppunit-devel wxPython-devel boost-devel alsa-lib-devel numpy gsl-devel python-devel pygsl python-cheetah python-mako python-lxml PyOpenGL qt-devel PyQt4-devel qwt-devel qwtplot3d-qt4-devel libusbx-devel cmake python-docutils PyQwt PyQwt-devel gtk2-engines xmlrpc-c-&amp;quot;*&amp;quot; tkinter orc-devel python-sphinx SDL-devel swig perl-ZMQ-LibZMQ2 perl-ZMQ-LibZMQ2 zeromq zeromq-devel python-requests gcc-c++ doxygen zeromq-ada-devel cppzmq-devel perl-ZeroMQ amavisd-new-zeromq amavisd-new-snmp-zeromq php-zmq python-zmq czmq uwsgi-logger-zeromq comedilib comedilib-devel pygtk2 ncurses-&amp;quot;*&amp;quot; thrift-devel python-thrift scipy&lt;br /&gt;
&lt;br /&gt;
After installing the dependencies, you should reboot the system.&lt;br /&gt;
&lt;br /&gt;
If the installation of the dependencies completes without any errors, then you can proceed to build and install UHD and GNU Radio.&lt;br /&gt;
&lt;br /&gt;
==Building and installing UHD from source code==&lt;br /&gt;
&lt;br /&gt;
UHD is open-source, and is hosted on GitHub. You can browse the code online at the link below, which points to version 3.14.0.0, which is the the latest release at the time of this writing.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/EttusResearch/uhd/tree/v3.14.0.0 UHD repository on GitHub]&lt;br /&gt;
&lt;br /&gt;
There are several good reasons to build GNU Radio from source code, especially for doing development and prototyping. It it enables an easy way to customize the location of the installation, and to install multiple UHD versions in parallel, and switch between them. It also provides much more flexibility in upgrading and downgrading versions, and allows the user to modify the code and create customized versions, which could possibly include a patch or other bug-fix.&lt;br /&gt;
&lt;br /&gt;
To build UHD from source code, clone the GitHub repository, check out a branch or tagged release of the repository, and build and install. Please follow the steps below. Make sure that no USRP device is connected to the system at this point.&lt;br /&gt;
&lt;br /&gt;
First, make a folder to hold the repository.&lt;br /&gt;
&lt;br /&gt;
    cd $HOME&lt;br /&gt;
    mkdir workarea&lt;br /&gt;
    cd workarea&lt;br /&gt;
&lt;br /&gt;
Next, clone the repository and change into the cloned directory.&lt;br /&gt;
&lt;br /&gt;
    git clone &amp;lt;nowiki&amp;gt;https://github.com/EttusResearch/uhd&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
    cd uhd&lt;br /&gt;
&lt;br /&gt;
Next, checkout the desired UHD version. You can get a full listing of tagged releases by running the command:&lt;br /&gt;
&lt;br /&gt;
    git tag -l&lt;br /&gt;
&lt;br /&gt;
''Example truncated output of &amp;lt;code&amp;gt;git tag -l&amp;lt;/code&amp;gt;:''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git tag -l&lt;br /&gt;
...&lt;br /&gt;
release_003_009_004&lt;br /&gt;
release_003_009_005&lt;br /&gt;
release_003_010_000_000&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note''': As of UHD Version 3.10.0.0, the versioning scheme has changed to be a quadruplet format. Each element and version will follow the format of: '''Major.API.ABI.Patch'''. Additional details on this versioning change can be found [https://files.ettus.com/manual/page_semver.html here]. &lt;br /&gt;
&lt;br /&gt;
After identifying the version and corresponding release tag you need, check it out:&lt;br /&gt;
&lt;br /&gt;
    # Example: For UHD 3.9.5:&lt;br /&gt;
    git checkout release_003_009_005&lt;br /&gt;
&lt;br /&gt;
    # Example: For UHD 3.14.0.0&lt;br /&gt;
    git checkout v3.14.0.0&lt;br /&gt;
&lt;br /&gt;
Next, create a build folder within the repository.&lt;br /&gt;
&lt;br /&gt;
    cd host&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
&lt;br /&gt;
Next, invoke CMake.&lt;br /&gt;
&lt;br /&gt;
    cmake ..&lt;br /&gt;
&lt;br /&gt;
'''Note''': if the shell &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; is set such that &amp;lt;code&amp;gt;/bin&amp;lt;/code&amp;gt; comes before &amp;lt;code&amp;gt;/usr/bin&amp;lt;/code&amp;gt;, then this step is likely to fail because cmake will set the &amp;lt;code&amp;gt;FIND_ROOT_PATH&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; and this setting will fail as a prefix for Boost headers or libraries. The cmake output will include messages such as&lt;br /&gt;
&lt;br /&gt;
    --   Boost include directories: /include&lt;br /&gt;
    --   Boost library directories: /lib/x86_64-linux-gnu&lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
    CMake Error in lib/CMakeLists.txt:&lt;br /&gt;
      Imported target &amp;quot;Boost::chrono&amp;quot; includes non-existent path&lt;br /&gt;
        &amp;quot;/include&amp;quot;&lt;br /&gt;
      in its INTERFACE_INCLUDE_DIRECTORIES.  Possible reasons include:&lt;br /&gt;
      * The path was deleted, renamed, or moved to another location.&lt;br /&gt;
      * An install or uninstall procedure did not complete successfully.&lt;br /&gt;
      * The installation package was faulty and references files it does not provide.&lt;br /&gt;
&lt;br /&gt;
One of the following 3 options should fix this situation:&lt;br /&gt;
&lt;br /&gt;
      1. &amp;lt;code&amp;gt;/usr/bin/cmake ..&amp;lt;/code&amp;gt;&lt;br /&gt;
      2. &amp;lt;code&amp;gt;PATH=/usr/bin:$PATH cmake ..&amp;lt;/code&amp;gt;&lt;br /&gt;
      3. &amp;lt;code&amp;gt;cmake -DCMAKE_FIND_ROOT_PATH=/usr ..&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once the cmake command succeeds without errors, build UHD.&lt;br /&gt;
&lt;br /&gt;
    make&lt;br /&gt;
&lt;br /&gt;
Next, you can optionally run some basic tests to verify that the build process completed properly.&lt;br /&gt;
&lt;br /&gt;
    make test&lt;br /&gt;
&lt;br /&gt;
Next, install UHD, using the default install prefix, which will install UHD under the /usr/local/lib folder. You need to run this as root due to the permissions on that folder.&lt;br /&gt;
&lt;br /&gt;
    sudo make install&lt;br /&gt;
&lt;br /&gt;
Next, update the system's shared library cache.&lt;br /&gt;
&lt;br /&gt;
    sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Finally, make sure that the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable is defined and includes the folder under which UHD was installed. Most commonly, you can add the line below to the end of your &amp;lt;code&amp;gt;$HOME/.bashrc&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&lt;br /&gt;
    export LD_LIBRARY_PATH=/usr/local/lib&lt;br /&gt;
&lt;br /&gt;
On Fedora 22/23/24/25 you will need to set the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/usr/local/lib64&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    export LD_LIBRARY_PATH=/usr/local/lib64&lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable is already defined with other folders in your &amp;lt;code&amp;gt;$HOME/.bashrc&amp;lt;/code&amp;gt; file, then add the line below to the end of your &amp;lt;code&amp;gt;$HOME/.bashrc&amp;lt;/code&amp;gt; file to preserve the current settings.&lt;br /&gt;
 &lt;br /&gt;
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib&lt;br /&gt;
&lt;br /&gt;
For Fedora 21/22/23/24/25&lt;br /&gt;
&lt;br /&gt;
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64&lt;br /&gt;
&lt;br /&gt;
For this change to take effect, you will need to close the current terminal window, and open a new terminal.&lt;br /&gt;
&lt;br /&gt;
At this point, UHD should be installed and ready to use. You can quickly test this, with no USRP device attached, by running &amp;lt;code&amp;gt;uhd_find_devices&amp;lt;/code&amp;gt;. You should see something similar to the following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
linux; GNU C++ version 4.8.4; Boost_105400; UHD_003.010.000.HEAD-0-g6e1ac3fc&lt;br /&gt;
&lt;br /&gt;
No UHD Devices Found&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Downloading the UHD FPGA Images===&lt;br /&gt;
You can now download the UHD FPGA Images for this installation. This can be done by running the command &amp;lt;code&amp;gt;uhd_images_downloader&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader&lt;br /&gt;
&lt;br /&gt;
Note: Since this installation is being installed to a system level directory (e.g. &amp;lt;code&amp;gt;/usr/local&amp;lt;/code&amp;gt;), the &amp;lt;code&amp;gt;uhd_images_downloader&amp;lt;/code&amp;gt; command requires &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; privileges.&lt;br /&gt;
&lt;br /&gt;
Example ouput for UHD 3.13.3.0:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo uhd_images_downloader &lt;br /&gt;
Images destination:      /usr/local/share/uhd/images&lt;br /&gt;
Downloading images from: http://files.ettus.com/binaries/images/uhd-images_003.010.003.000-release.zip&lt;br /&gt;
Downloading images to:   /tmp/tmpm46JDg/uhd-images_003.010.003.000-release.zip&lt;br /&gt;
57009 kB / 57009 kB (100%)&lt;br /&gt;
&lt;br /&gt;
Images successfully installed to: /usr/local/share/uhd/images&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example output for UHD 3.13:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo uhd_images_downloader&lt;br /&gt;
[INFO] Images destination: /usr/local/share/uhd/images&lt;br /&gt;
[INFO] No inventory file found at /usr/local/share/uhd/images/inventory.json. Creating an empty one.&lt;br /&gt;
00006 kB / 00006 kB (100%) usrp1_b100_fw_default-g6bea23d.zip&lt;br /&gt;
19484 kB / 19484 kB (100%) x3xx_x310_fpga_default-g494ae8bb.zip&lt;br /&gt;
02757 kB / 02757 kB (100%) usrp2_n210_fpga_default-g6bea23d.zip&lt;br /&gt;
02109 kB / 02109 kB (100%) n230_n230_fpga_default-g494ae8bb.zip&lt;br /&gt;
00522 kB / 00522 kB (100%) usrp1_b100_fpga_default-g6bea23d.zip&lt;br /&gt;
00474 kB / 00474 kB (100%) b2xx_b200_fpga_default-g494ae8bb.zip&lt;br /&gt;
02415 kB / 02415 kB (100%) usrp2_n200_fpga_default-g6bea23d.zip&lt;br /&gt;
05920 kB / 05920 kB (100%) e3xx_e320_fpga_default-g494ae8bb.zip&lt;br /&gt;
15883 kB / 15883 kB (100%) n3xx_n310_fpga_default-g494ae8bb.zip&lt;br /&gt;
00506 kB / 00506 kB (100%) b2xx_b205mini_fpga_default-g494ae8bb.zip&lt;br /&gt;
18676 kB / 18676 kB (100%) x3xx_x300_fpga_default-g494ae8bb.zip&lt;br /&gt;
00017 kB / 00017 kB (100%) octoclock_octoclock_fw_default-g14000041.zip&lt;br /&gt;
04839 kB / 04839 kB (100%) usb_common_windrv_default-g14000041.zip&lt;br /&gt;
00007 kB / 00007 kB (100%) usrp2_usrp2_fw_default-g6bea23d.zip&lt;br /&gt;
00009 kB / 00009 kB (100%) usrp2_n200_fw_default-g6bea23d.zip&lt;br /&gt;
00450 kB / 00450 kB (100%) usrp2_usrp2_fpga_default-g6bea23d.zip&lt;br /&gt;
00142 kB / 00142 kB (100%) b2xx_common_fw_default-g3ff4186b.zip&lt;br /&gt;
00460 kB / 00460 kB (100%) b2xx_b200mini_fpga_default-g494ae8bb.zip&lt;br /&gt;
00319 kB / 00319 kB (100%) usrp1_usrp1_fpga_default-g6bea23d.zip&lt;br /&gt;
00009 kB / 00009 kB (100%) usrp2_n210_fw_default-g6bea23d.zip&lt;br /&gt;
11537 kB / 11537 kB (100%) n3xx_n300_fpga_default-g494ae8bb.zip&lt;br /&gt;
05349 kB / 05349 kB (100%) e3xx_e310_fpga_default-g494ae8bb.zip&lt;br /&gt;
00866 kB / 00866 kB (100%) b2xx_b210_fpga_default-g494ae8bb.zip&lt;br /&gt;
[INFO] Images download complete.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Building and installing GNU Radio from source code==&lt;br /&gt;
&lt;br /&gt;
As with UHD, GNU Radio is open-source and is hosted on GitHub. You can browse the code online at the link below, which points to version &amp;lt;code&amp;gt;v3.7.13.4&amp;lt;/code&amp;gt;, which is the the latest release at the time of this writing.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/gnuradio/gnuradio/tree/v3.7.13.4 GNU Radio repository on GitHub]&lt;br /&gt;
&lt;br /&gt;
Note: GNU Radio is currently transitioning from major branches of 3.7.x.x to 3.8.x.x. It is generally recommend at this time to use either the &amp;lt;code&amp;gt;v3.7.13.4&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;maint-3.7&amp;lt;/code&amp;gt; branch of GNU Radio. The &amp;lt;code&amp;gt;master&amp;lt;/code&amp;gt; branch includes many major changes such as converting to use Python 3 and may be unstable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As with UHD, there are several good reasons to build GNU Radio from source code, especially for doing development and prototyping. It it enables an easy way to customize the location of the installation, and to install multiple GNU Radio versions in parallel, and switch between them. It also provides much more flexibility in upgrading and downgrading versions, and allows the user to modify the code and create customized versions, which could possibly include a patch or other bug-fix.&lt;br /&gt;
&lt;br /&gt;
Similar to the process for UHD, to build GNU Radio from source code, clone the GitHub repository, check out a branch or tagged release of the repository, and build and install. Please follow the steps below. Make sure that no USRP device is connected to the system at this point.&lt;br /&gt;
&lt;br /&gt;
First, make a folder to hold the repository.&lt;br /&gt;
&lt;br /&gt;
    cd $HOME&lt;br /&gt;
    cd workarea&lt;br /&gt;
&lt;br /&gt;
Next, clone the repository.&lt;br /&gt;
&lt;br /&gt;
    git clone --recursive &amp;lt;nowiki&amp;gt;https://github.com/gnuradio/gnuradio&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, go into the repository and check out the desired GNU Radio version.&lt;br /&gt;
&lt;br /&gt;
    cd gnuradio&lt;br /&gt;
&lt;br /&gt;
To checkout the &amp;lt;code&amp;gt;v3.7.13.4&amp;lt;/code&amp;gt; branch:&lt;br /&gt;
&lt;br /&gt;
    git checkout v3.7.13.4&lt;br /&gt;
&lt;br /&gt;
Or to checkout the &amp;lt;code&amp;gt;maint-3.7&amp;lt;/code&amp;gt; branch:&lt;br /&gt;
&lt;br /&gt;
    git checkout maint-3.7&lt;br /&gt;
&lt;br /&gt;
Next, update the submodules:&lt;br /&gt;
&lt;br /&gt;
    git submodule update --init --recursive&lt;br /&gt;
&lt;br /&gt;
Next, create a build folder within the repository, invoke CMake, and build GNU Radio:&lt;br /&gt;
&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake ../&lt;br /&gt;
    make&lt;br /&gt;
&lt;br /&gt;
Next, you can optionally run some basic tests to verify that the build process completed properly.&lt;br /&gt;
&lt;br /&gt;
    make test&lt;br /&gt;
&lt;br /&gt;
Next, install GNU Radio, using the default install prefix, which will install GNU Radio under the /usr/local/lib folder. You need to run this as root due to the permissions on that folder.&lt;br /&gt;
&lt;br /&gt;
    sudo make install&lt;br /&gt;
&lt;br /&gt;
Finally, update the system's shared library cache.&lt;br /&gt;
&lt;br /&gt;
    sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
At this point, GNU Radio should be installed and ready to use. You can quickly test this, with no USRP device attached, by running the following quick tests.&lt;br /&gt;
&lt;br /&gt;
    gnuradio-config-info --version&lt;br /&gt;
    gnuradio-config-info --prefix&lt;br /&gt;
    gnuradio-config-info --enabled-components&lt;br /&gt;
&lt;br /&gt;
There is a simple flowgraph that you can run that does not require any USRP hardware. It's called the dialtone test, and it produces a PSTN dial tone on the computer's speakers. Running it verifies that all the libraries can be found, and that the GNU Radio run-time is working.&lt;br /&gt;
&lt;br /&gt;
    python $HOME/workarea/gnuradio/gr-audio/examples/python/dial_tone.py&lt;br /&gt;
&lt;br /&gt;
You can try launching the GNU Radio Companion (GRC) tool, a visual tool for building and running GNU Radio flowgraphs.&lt;br /&gt;
&lt;br /&gt;
    gnuradio-companion&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;gnuradio-companion&amp;quot; does not start and complains about the &amp;lt;code&amp;gt;PYTHONPATH&amp;lt;/code&amp;gt; environment variable, then you may have to set this in your &amp;lt;code&amp;gt;$HOME/.bashrc&amp;lt;/code&amp;gt; file, as shown below.&lt;br /&gt;
&lt;br /&gt;
    export PYTHONPATH=/usr/local/lib/python2.7/dist-packages&lt;br /&gt;
&lt;br /&gt;
On Fedora 21/22/23/24, the &amp;lt;code&amp;gt;PYTHONPATH&amp;lt;/code&amp;gt; environment variable will need to be set to:&lt;br /&gt;
&lt;br /&gt;
    export PYTHONPATH=/usr/lib/python2.7/site-packages:/usr/local/lib64/python2.7/site-packages/&lt;br /&gt;
&lt;br /&gt;
==Configuring USB==&lt;br /&gt;
&lt;br /&gt;
On Linux, udev handles USB plug and unplug events. The following commands install a udev rule so that non-root users may access the device. This step is only necessary for devices that use USB to connect to the host computer, such as the B200, B210, and B200mini. This setting should take effect immediately and does not require a reboot or logout/login. Be sure that no USRP device is connected via USB when running these commands.&lt;br /&gt;
&lt;br /&gt;
    cd $HOME/workarea/uhd/host/utils&lt;br /&gt;
    sudo cp uhd-usrp.rules /etc/udev/rules.d/&lt;br /&gt;
    sudo udevadm control --reload-rules&lt;br /&gt;
    sudo udevadm trigger&lt;br /&gt;
&lt;br /&gt;
==Configuring Ethernet==&lt;br /&gt;
&lt;br /&gt;
For USRP devices that use Ethernet to connect to the host computer, such as the N200, N210, X300, X310, set a static IP address for your system of 192.168.10.1, with a netmask of 255.255.255.0. The default IP address of the USRP is 192.168.10.2, with a netmask of 255.255.255.0. You should probably set the IP address using the graphical Network Manager. If you set the IP address from the command line with &amp;lt;code&amp;gt;ifconfig&amp;lt;/code&amp;gt;, Network Manager will probably overwrite these settings.&lt;br /&gt;
&lt;br /&gt;
==Connect the USRP==&lt;br /&gt;
&lt;br /&gt;
The installation of UHD and GNU Radio should now be complete. At this point, connect the USRP to the host computer.&lt;br /&gt;
&lt;br /&gt;
If the interface is Ethernet, then open a terminal window, and try to ping the USRP with &amp;quot;ping 192.168.10.2&amp;quot;. The USRP should respond to the ping requests.&lt;br /&gt;
&lt;br /&gt;
If the interface is USB, then open a terminal window, and run &amp;quot;&amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt;&amp;quot;. You should see the USRP listed on the USB bus with a VID of &amp;lt;code&amp;gt;2500&amp;lt;/code&amp;gt; and PID of &amp;lt;code&amp;gt;0020&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0021&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0022&amp;lt;/code&amp;gt;, for B200, B210, B200mini, respectively.&lt;br /&gt;
&lt;br /&gt;
Also try running &amp;quot;&amp;lt;code&amp;gt;uhd_find_devices&amp;lt;/code&amp;gt;&amp;quot; and &amp;quot;&amp;lt;code&amp;gt;uhd_usrp_probe&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Thread priority scheduling==&lt;br /&gt;
&lt;br /&gt;
When UHD spawns a new thread, it may try to boost the thread's scheduling priority. If setting the new priority fails, the UHD software prints a warning to the console, as shown below. This warning is harmless; it simply means that the thread will retain a normal or default scheduling priority.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UHD Warning:&lt;br /&gt;
    Unable to set the thread priority. Performance may be negatively affected.&lt;br /&gt;
    Please see the general application notes in the manual for instructions.&lt;br /&gt;
    EnvironmentError: OSError: error in pthread_setschedparam&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To address this issue, non-privileged (non-root) users need to be given special permission to change the scheduling priority. This can be enabled by creating a group &amp;lt;code&amp;gt;usrp&amp;lt;/code&amp;gt;, adding your user to it, and then appending the line &amp;lt;code&amp;gt;@usrp - rtprio  99&amp;lt;/code&amp;gt; to the file &amp;lt;code&amp;gt;/etc/security/limits.conf&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    sudo groupadd usrp&lt;br /&gt;
    sudo usermod -aG usrp $USER&lt;br /&gt;
&lt;br /&gt;
Then add the line below to end of the file &amp;lt;code&amp;gt;/etc/security/limits.conf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    @usrp - rtprio  99&lt;br /&gt;
&lt;br /&gt;
You must log out and log back into the account for the settings to take effect. In most Linux distributions, a list of groups and group members can be found in the &amp;lt;code&amp;gt;/etc/group&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
There is further documentation about this in the User Manual at the link below.&lt;br /&gt;
&lt;br /&gt;
* [http://files.ettus.com/manual/page_general.html#general_threading_prio Threading Notes section of the User Manual]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Application Notes]]&lt;/div&gt;</summary>
		<author><name>MartinAnderseck</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=UHD_Python_API&amp;diff=5129</id>
		<title>UHD Python API</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=UHD_Python_API&amp;diff=5129"/>
				<updated>2021-09-09T11:54:36Z</updated>
		
		<summary type="html">&lt;p&gt;MartinAnderseck: Removed invalid link to old mailinglist post and instead added link to manual which covers some typical issues on Windows systems.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== What's the UHD Python API? ==&lt;br /&gt;
&lt;br /&gt;
As the name suggests, it exposes the UHD API into Python. We use &amp;lt;code&amp;gt;Boost.Python&amp;lt;/code&amp;gt;&lt;br /&gt;
to generate a Python module which exposes most of the C++ API, and some extra&lt;br /&gt;
features. The Python API is currently part of master branch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The USRP Hardware Driver and USRP Manual covers most information about the UHD Python API and can be found here: https://files.ettus.com/manual/page_python.html&lt;br /&gt;
&lt;br /&gt;
== How can I use it? ==&lt;br /&gt;
&lt;br /&gt;
In order to test the Python API, check out the &amp;lt;code&amp;gt;master&amp;lt;/code&amp;gt; branch and build it like always. When running CMake, make sure that the Python API was enabled (&amp;lt;code&amp;gt;-DENABLE_PYTHON_API=ON&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
The output from CMake should look something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- ######################################################&lt;br /&gt;
-- # UHD enabled components                              &lt;br /&gt;
-- ######################################################&lt;br /&gt;
--   * LibUHD&lt;br /&gt;
--   * LibUHD - C API&lt;br /&gt;
--   * LibUHD - Python API&lt;br /&gt;
--   * Examples&lt;br /&gt;
--   * Utils&lt;br /&gt;
--   * Tests&lt;br /&gt;
--   * USB&lt;br /&gt;
--   * B100&lt;br /&gt;
--   * B200&lt;br /&gt;
--   * USRP1&lt;br /&gt;
--   * USRP2&lt;br /&gt;
--   * X300&lt;br /&gt;
--   * N230&lt;br /&gt;
--   * OctoClock&lt;br /&gt;
--   * Manual&lt;br /&gt;
--   * API/Doxygen&lt;br /&gt;
--   * Man Pages&lt;br /&gt;
-- &lt;br /&gt;
-- ######################################################&lt;br /&gt;
-- # UHD disabled components                             &lt;br /&gt;
-- ######################################################&lt;br /&gt;
--   * GPSD&lt;br /&gt;
--   * E100&lt;br /&gt;
--   * E300&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please refer to the [https://files.ettus.com/manual/page_python.html USRP Manual] for extended instructions especially when installing on Windows.&lt;br /&gt;
Once it's built and installed, you'll be able to import the &amp;lt;code&amp;gt;uhd&amp;lt;/code&amp;gt; Python&lt;br /&gt;
module. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; import uhd&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; my_usrp = uhd.usrp.MultiUSRP(&amp;quot;type=b200&amp;quot;)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; my_usrp.set_rx_gain(70)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have some examples in &amp;lt;code&amp;gt;[https://github.com/EttusResearch/uhd/tree/master/host/examples/python host/examples/python]&amp;lt;/code&amp;gt;. The examples are very&lt;br /&gt;
simple, but concise.&lt;br /&gt;
&lt;br /&gt;
==Example: pyuhd_rx_to_file.py==&lt;br /&gt;
This Python example is based on the C++ example &amp;lt;code&amp;gt;uhd/host/examples/rx_samples_to_file.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import uhd&lt;br /&gt;
import numpy as np&lt;br /&gt;
import argparse&lt;br /&gt;
&lt;br /&gt;
def parse_args():&lt;br /&gt;
    parser = argparse.ArgumentParser()&lt;br /&gt;
    parser.add_argument(&amp;quot;-a&amp;quot;, &amp;quot;--args&amp;quot;, default=&amp;quot;&amp;quot;, type=str)&lt;br /&gt;
    parser.add_argument(&amp;quot;-o&amp;quot;, &amp;quot;--output-file&amp;quot;, type=str, required=True)&lt;br /&gt;
    parser.add_argument(&amp;quot;-f&amp;quot;, &amp;quot;--freq&amp;quot;, type=float, required=True)&lt;br /&gt;
    parser.add_argument(&amp;quot;-r&amp;quot;, &amp;quot;--rate&amp;quot;, default=1e6, type=float)&lt;br /&gt;
    parser.add_argument(&amp;quot;-d&amp;quot;, &amp;quot;--duration&amp;quot;, default=5.0, type=float)&lt;br /&gt;
    parser.add_argument(&amp;quot;-c&amp;quot;, &amp;quot;--channels&amp;quot;, default=0, nargs=&amp;quot;+&amp;quot;, type=int)&lt;br /&gt;
    parser.add_argument(&amp;quot;-g&amp;quot;, &amp;quot;--gain&amp;quot;, type=int, default=10)&lt;br /&gt;
    return parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    args = parse_args()&lt;br /&gt;
    usrp = uhd.usrp.MultiUSRP(args.args)&lt;br /&gt;
    num_samps = int(np.ceil(args.duration*args.rate))&lt;br /&gt;
    if not isinstance(args.channels, list):&lt;br /&gt;
        args.channels = [args.channels]&lt;br /&gt;
    samps = usrp.recv_num_samps(num_samps, args.freq, args.rate, args.channels, args.gain)&lt;br /&gt;
    with open(args.output_file, 'wb') as f:&lt;br /&gt;
        np.save(f, samps, allow_pickle=False, fix_imports=False)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== What about documentation? ==&lt;br /&gt;
&lt;br /&gt;
Documentation is currently pretty sparse. The best we can do right now is to ask&lt;br /&gt;
users to infer the documentation from the C++ API. For example, the Python has&lt;br /&gt;
an object called &amp;lt;code&amp;gt;MultiUSRP&amp;lt;/code&amp;gt; which is an equivalent of the C++ &amp;lt;code&amp;gt;multi_usrp&amp;lt;/code&amp;gt; API.&lt;br /&gt;
The methods on both classes are the same, and take the same arguments.&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
'''Does it support Python 2 and 3?'''&lt;br /&gt;
&lt;br /&gt;
Yes.&lt;br /&gt;
&lt;br /&gt;
'''Does it require GNU Radio?'''&lt;br /&gt;
&lt;br /&gt;
No.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Does it use SWIG?'''&lt;br /&gt;
&lt;br /&gt;
No, it uses &amp;lt;code&amp;gt;Boost.Python&amp;lt;/code&amp;gt;. We didn't want to add another dependency to UHD (i.e., SWIG) and Boost was already a dependency of UHD. It also doesn't require the C API.&lt;br /&gt;
&lt;br /&gt;
'''How does this relate to the Python API in gr-uhd?''' &lt;br /&gt;
&lt;br /&gt;
It serves an entirely different purpose. This Python API is for people writing standalone applications for USRPs that *don't* use GNU Radio. &amp;lt;code&amp;gt;gr-uhd&amp;lt;/code&amp;gt; is staying the way it is, and is going nowhere. If you're using GNU Radio, you probably don't care about this.&lt;br /&gt;
&lt;br /&gt;
'''Are the UHD Python API and the gr-uhd Python API compatible?'''&lt;br /&gt;
&lt;br /&gt;
Short answer: No. Long answer: There are very few cases where it makes sense to mix these APIs, so no. However, this means that a &amp;lt;code&amp;gt;TimeSpec&amp;lt;/code&amp;gt; from the &amp;lt;code&amp;gt;Boost.Python&amp;lt;/code&amp;gt; API is not convertible into a &amp;lt;code&amp;gt;time_spec_t&amp;lt;/code&amp;gt; from the &amp;lt;code&amp;gt;gr-uhd&amp;lt;/code&amp;gt; API.&lt;br /&gt;
&lt;br /&gt;
'''When will it be released?'''&lt;br /&gt;
&lt;br /&gt;
It is currently on &amp;lt;code&amp;gt;master&amp;lt;/code&amp;gt; branch, and will become part of the next major release.&lt;br /&gt;
&lt;br /&gt;
'''Does it support RFNoC API?'''&lt;br /&gt;
&lt;br /&gt;
Not yet, but it's in the pipeline. We wanted to get the basics (i.e. &amp;lt;code&amp;gt;multi_usrp&amp;lt;/code&amp;gt; API) right first.&lt;br /&gt;
&lt;br /&gt;
'''What's the streaming performance?'''&lt;br /&gt;
&lt;br /&gt;
Worse than straight C++, but not a lot, thanks to NumPy. You can run &amp;lt;code&amp;gt;host/examples/benchmark_rate.py&amp;lt;/code&amp;gt; if you want to see for yourself.&lt;br /&gt;
Overall, &amp;lt;code&amp;gt;recv()&amp;lt;/code&amp;gt; calls are pretty efficient if you've preallocated a NumPy array, because we can cast that to a straight pointer (and also skip any type checking!) and then it's not that different from a &amp;lt;code&amp;gt;recv()&amp;lt;/code&amp;gt; call in a C++ app. However, consuming the data is limited by how fast you can handle that in Python.&lt;/div&gt;</summary>
		<author><name>MartinAnderseck</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Building_and_Installing_the_USRP_Open_Source_Toolchain_(UHD_and_GNU_Radio)_on_Windows&amp;diff=5128</id>
		<title>Building and Installing the USRP Open Source Toolchain (UHD and GNU Radio) on Windows</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Building_and_Installing_the_USRP_Open_Source_Toolchain_(UHD_and_GNU_Radio)_on_Windows&amp;diff=5128"/>
				<updated>2021-08-25T09:11:55Z</updated>
		
		<summary type="html">&lt;p&gt;MartinAnderseck: Updated version number of current libUSB release.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Application Note Number==&lt;br /&gt;
'''AN-611'''&lt;br /&gt;
&amp;lt;!-- Internal use only: please do keep this updated!&lt;br /&gt;
==Revision History==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Author&lt;br /&gt;
!Details&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2016-01-19&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Derek Kozel&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Initial creation&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2017-03-07&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Nate Temple&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Update GNU Radio instructions &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2018-12-14&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Sam Reiter&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Update UHD instructions &lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This Application Note provides a step-by-step guide for building, installing, and updating the open-source toolchain, specifically UHD and GNU Radio, for the USRP from source code on Windows.&lt;br /&gt;
&lt;br /&gt;
==UHD on Windows==&lt;br /&gt;
&lt;br /&gt;
UHD is fully supported on Windows 7, 8, 8.1, and 10 and can be compiled using Visual Studio 2013, 2015, or 2017. The future target is to support the latest three OS and Visual Studio releases.&lt;br /&gt;
&lt;br /&gt;
==Setup the Environment==&lt;br /&gt;
&lt;br /&gt;
The following dependencies are required for a regular build.&lt;br /&gt;
&lt;br /&gt;
* Microsoft Windows (7, 8, 8.1, 10)&lt;br /&gt;
* Microsoft Visual Studio (2013, 2015, 2017)&lt;br /&gt;
* CMake (2.8.0 or later)&lt;br /&gt;
* Boost (1.53 or later)&lt;br /&gt;
* LibUSB (1.0 or later)&lt;br /&gt;
* Python (2.7.x)&lt;br /&gt;
* Mako (0.5.0 or later)&lt;br /&gt;
* Doxygen (1.8 or later, optional)&lt;br /&gt;
* NSIS (2.50 or later, optional)&lt;br /&gt;
&lt;br /&gt;
Optional Tools:&lt;br /&gt;
&lt;br /&gt;
* 7zip (http://www.7-zip.org/download.html) &lt;br /&gt;
* msysGit (https://gitforwindows.org/)&lt;br /&gt;
&lt;br /&gt;
==Installing the dependencies==&lt;br /&gt;
&lt;br /&gt;
===Microsoft Visual Studio===&lt;br /&gt;
&lt;br /&gt;
The free version of Visual Studio is sufficient for building UHD. This guide was tested using Windows 10 x64 and Microsoft Visual Studio Community 2017 (v15.9).&lt;br /&gt;
&lt;br /&gt;
Users will need to install the &amp;quot;Desktop Development for C++&amp;quot; Workload for Visual Studio. This can be found in:&lt;br /&gt;
&lt;br /&gt;
Tools &amp;gt;&amp;gt; Get Tools and Features... &amp;gt;&amp;gt; Workloads&lt;br /&gt;
&lt;br /&gt;
https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads&lt;br /&gt;
&lt;br /&gt;
https://www.visualstudio.com/downloads/&lt;br /&gt;
&lt;br /&gt;
===CMake===&lt;br /&gt;
&lt;br /&gt;
CMake is a cross-platform build system used to configure and generate the files necessary to compile and test UHD for a particular computer environment.&lt;br /&gt;
&lt;br /&gt;
Made sure to download the &amp;quot;.msi&amp;quot; file, not the &amp;quot;.zip&amp;quot; file. During installation select the option to &amp;quot;Add CMake to the system PATH for the current user&amp;quot; or for &amp;quot;all users&amp;quot;, depending on which is more applicable for your Windows usage.&lt;br /&gt;
&lt;br /&gt;
CMake 3.13.2 (win64-x64) was used for the guide. UHD has been tested to work through CMake 3.17.2.&lt;br /&gt;
&lt;br /&gt;
https://cmake.org/download/&lt;br /&gt;
&lt;br /&gt;
===Boost===&lt;br /&gt;
&lt;br /&gt;
Boost is a set of C++ libraries providing useful algorithms and data structures.&lt;br /&gt;
&lt;br /&gt;
UHD builds with Boost through 1.72.0. From the link below, select the version of Boost you wish to build against. At the bottom of the directory listing will be a file &amp;quot;DEPENDENCY_VERSIONS.txt&amp;quot;. Review this file to determine the correct version of the Boost installer to download for your specific MSVC version. The Boost binary installer must be selected to match the version of MSVC being used to compile UHD and architecture of Windows being run -- 32 or 64 bit. Watch out as Microsoft has done the version numbering of MSVC such that the year and version number do not match. Here are the recent entries in the noted file:&lt;br /&gt;
&lt;br /&gt;
  Microsoft Visual Studio 2013 - msvc-12.0 - Update 5&lt;br /&gt;
  Microsoft Visual Studio 2015 - msvc-14.0 - Update 3&lt;br /&gt;
  Microsoft Visual Studio 2017 - msvc-14.1 - VS 15.9.17&lt;br /&gt;
  Microsoft Visual Studio 2019 - msvc-14.2 - VS 16.3.6&lt;br /&gt;
&lt;br /&gt;
Note that VS2019 support (MSVC Toolset 14.2) starts unofficially with Boost 1.70.0, and then officially with 1.71.0.&lt;br /&gt;
&lt;br /&gt;
After the Boost installer executable is downloaded, find it in the Windows File Explorer, right click on it and &amp;quot;Run as administrator&amp;quot;. During the install, select the destination location of &amp;quot;C:\Program Files\Boost\&amp;quot; for the install; the installer will append the Boost directory and version info, such that the full destination will actually be, for example, &amp;quot;C:\Program Files\Boost\boost_1_68_0&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
VS2017 uses the MSVC Toolset 14.1 so boost_1_68_0-msvc-14.1-64 was selected for this tutorial, and installed as &amp;quot;C:\Program Files\Boost\boost_1_68_0&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
https://sourceforge.net/projects/boost/files/boost-binaries/&lt;br /&gt;
&lt;br /&gt;
===LibUSB===&lt;br /&gt;
&lt;br /&gt;
LibUSB is a cross-platform library providing access to USB devices. UHD is compatible through LibUSB 1.0.24 (the current release as of this update).&lt;br /&gt;
&lt;br /&gt;
LibUSB releases are distributed as 7zip or tar.bz2 archives. There are plenty of free &amp;quot;unzip&amp;quot; programs available that can extract the files in either archive type; Windows does not provide this capability, so you'll need to download one of these programs. We are using the &amp;quot;7Zip&amp;quot; program as linked in the “Setting Up the Environment” Section. After installing 7zip the LibUSB release archive can be extracted by right clicking on the downloaded file and selecting &amp;lt;tt&amp;gt;7zip &amp;gt;&amp;gt; Extract files&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
LibUSB 1.0.22 was used for the guide and extracted to &amp;lt;syntaxhighlight lang=&amp;quot;irc&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;C:\Users\username\libusb-1.0.22&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
https://sourceforge.net/projects/libusb/files/libusb-1.0/&lt;br /&gt;
&lt;br /&gt;
'''Note''': The directory to which you extract libusb must not contain spaces. This is to say that &amp;lt;syntaxhighlight lang=&amp;quot;irc&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;C:\Users\user name\libusb-1.0.22&amp;lt;/syntaxhighlight&amp;gt; will cause compile issues moving forward.&lt;br /&gt;
&lt;br /&gt;
===Python===&lt;br /&gt;
&lt;br /&gt;
Python is a widely-used general-purpose, high-level programming language. UHD includes several utilities written in Python and has several scripts which are part of the build process. UHD is compatible with Python 2.7, and 3.5 through 3.8. The default Python install will be 32 bit. To get the 64-bit install, you have to select it specifically -- &amp;quot;Download Windows x86-64 executable installer&amp;quot; for Python 3.0+ or &amp;quot;Download Windows x86-64 MSI installer&amp;quot; for Python 2.7 (any version). When installing Python make sure to add to the PATH so that &amp;quot;python.exe&amp;quot; is available from the commandline.&lt;br /&gt;
&lt;br /&gt;
The Python 2.7.15 was used for this tutorial.&lt;br /&gt;
&lt;br /&gt;
https://www.python.org/downloads/windows/&lt;br /&gt;
&lt;br /&gt;
For building the LibUHD Python API the Python libraries NumPy and ruamel.yaml are required. NumPy adds support for large matrices and arrays and mathematical functions around them. ruamel.yaml is used for parsing/emitting YAML.&lt;br /&gt;
To install them open a command line (Ctrl-X, select Run, type &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;cmd.exe&amp;lt;/syntaxhighlight&amp;gt; and click OK)&lt;br /&gt;
&lt;br /&gt;
    cd C:\Python27\Scripts&lt;br /&gt;
    pip.exe install numpy&lt;br /&gt;
    pip.exe install ruamel.yaml&lt;br /&gt;
&lt;br /&gt;
===Mako===&lt;br /&gt;
&lt;br /&gt;
Mako is a python template library used to generate source files and is&lt;br /&gt;
distributed using a Python package management system.&lt;br /&gt;
&lt;br /&gt;
Open a command line (Ctrl-X, select Run, type &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;cmd.exe&amp;lt;/syntaxhighlight&amp;gt; and click OK)&lt;br /&gt;
&lt;br /&gt;
    cd C:\Python27\Scripts&lt;br /&gt;
    pip.exe install mako&lt;br /&gt;
&lt;br /&gt;
This installed version 1.0.7 at the time of writing this guide.&lt;br /&gt;
&lt;br /&gt;
===Doxygen===&lt;br /&gt;
&lt;br /&gt;
Doxygen is a documentation generator which creates the HTML manual from text in the source code. It optional for building UHD.&lt;br /&gt;
&lt;br /&gt;
Version 1.8.14 was used for this guide.&lt;br /&gt;
&lt;br /&gt;
https://sourceforge.net/projects/doxygen/files/rel-1.8.14/&lt;br /&gt;
&lt;br /&gt;
===NSIS===&lt;br /&gt;
&lt;br /&gt;
NSIS is a toolkit for creating Windows installers. NSIS is used for creating binary packages of UHD enabling easy distribution and installation of UHD, associated utilities, and examples.&lt;br /&gt;
&lt;br /&gt;
Version 3.03 was used for this guide.&lt;br /&gt;
&lt;br /&gt;
https://sourceforge.net/projects/nsis/files/NSIS%203/&lt;br /&gt;
&lt;br /&gt;
==Obtain the UHD source code==&lt;br /&gt;
&lt;br /&gt;
The UHD source code is stored in a GIT repository: https://www.github.com/EttusResearch/uhd . From this link, one can download an archive of the UHD source code for any release, the current public codebase itself, and the code state for some branches or tags. Which one you download is up to your needs. We generally recommend the latest release, which can be downloaded from our Github repository or from our website as noted below.&lt;br /&gt;
&lt;br /&gt;
For the purposes of this guide, the archive was [https://files.ettus.com/binaries/uhd/uhd_003.015.000.000-release/uhd_3.15.0.0-release.tar.xz downloaded from our website], and extracted as &amp;lt;syntaxhighlight lang=&amp;quot;irc&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;C:\Users\username\uhd-release\&amp;lt;/syntaxhighlight&amp;gt;. Please note that most UHD archives will extract to a directory name that corresponds to the UHD version; for example the one noted extracts to &amp;quot;uhd_3.15.0.0-release&amp;quot;. After extraction, we change the directory name to that as noted (&amp;quot;uhd-release&amp;quot;) and move it into the directory as noted. You can install the UHD source wherever you want to, of course; for this article we choose this location and use it later as such.&lt;br /&gt;
&lt;br /&gt;
===From a release source archive===&lt;br /&gt;
&lt;br /&gt;
Archives of the source code for each stable release can be downloaded from the Ettus website.&lt;br /&gt;
&lt;br /&gt;
http://files.ettus.com/binaries/uhd/&lt;br /&gt;
&lt;br /&gt;
7zip can be used to extract the &amp;lt;tt&amp;gt;tar.gz&amp;lt;/tt&amp;gt; archive to a location of your choosing.&lt;br /&gt;
&lt;br /&gt;
This guide used the Git repository to obtain the newest release of UHD, read on for details.&lt;br /&gt;
&lt;br /&gt;
===From the Git repository===&lt;br /&gt;
&lt;br /&gt;
The latest development code, as well as tagged releases, is available from the git repository hosted on GitHub&lt;br /&gt;
&lt;br /&gt;
https://www.github.com/EttusResearch/uhd&lt;br /&gt;
&lt;br /&gt;
For step-by-step instructions using a git client, see section [https://kb.ettus.com/Building_and_Installing_the_USRP_Open-Source_Toolchain_(UHD_and_GNU_Radio)_on_Linux#Building_and_installing_UHD_from_source_code Building and installing UHD from source code] in the UHD Linux Installation Guide. Return to this document after you have successfully checked out your desired release of UHD, and note that some directory names moving forward may differ slightly.&lt;br /&gt;
&lt;br /&gt;
==Building==&lt;br /&gt;
&lt;br /&gt;
All prerequisites have now been installed and downloaded. You are encouraged to restart your machine before continuing. &lt;br /&gt;
&lt;br /&gt;
===Configuring the Building===&lt;br /&gt;
&lt;br /&gt;
* Open the Cmake GUI&lt;br /&gt;
* Select source code directory&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;irc&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;C:\Users\username\uhd-release\host\&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Select binary build directory (this may require creating the folder \build\)&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;irc&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;C:\Users\username\uhd-release\host\build\&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Check the Advanced checkbox&lt;br /&gt;
* Click Configure&lt;br /&gt;
** Set Visual Studio 15 2017 Win64 as the compiler&lt;br /&gt;
** Click “Finish” and allow CMake to Generate&lt;br /&gt;
* Change or add the following entries&lt;br /&gt;
*; '''Boost_INCLUDE_DIR''' : &amp;lt;syntaxhighlight lang=&amp;quot;irc&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;C:\Program Files\Boost\boost_1_68_0\&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Add the following entries with type PATH&lt;br /&gt;
*; '''Boost_LIBRARY_DIRS''' : &amp;lt;syntaxhighlight lang=&amp;quot;irc&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;C:\Program Files\Boost\boost_1_68_0\lib64-msvc-14.1\&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*; '''LIBUSB_INCLUDE_DIRS''' : &amp;lt;syntaxhighlight lang=&amp;quot;irc&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;C:\Users\username\libusb-1.0.22\include\libusb-1.0\&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Add the following entry with type FILEPATH&lt;br /&gt;
*; '''LIBUSB_LIBRARIES''' : &amp;lt;syntaxhighlight lang=&amp;quot;irc&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;C:\Users\username\libusb-1.0.22\MS64/dll\libusb-1.0.lib&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Click Generate&lt;br /&gt;
&lt;br /&gt;
===Compiling UHD===&lt;br /&gt;
&lt;br /&gt;
Open Visual Studio 2017 and open the UHD project file generated by CMake.&lt;br /&gt;
; &amp;lt;tt&amp;gt;File &amp;gt; Open Project&amp;lt;/tt&amp;gt; : &amp;lt;syntaxhighlight lang=&amp;quot;irc&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;C:\Users\username\uhd-release\host\build\UHD.sln&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Change the build type from Debug to Release. The '''ALL_BUILD''' project should be selected in the Solution Explorer, select it if this is not the case. Run the build, &amp;lt;tt&amp;gt;Build &amp;gt; Build '''ALL_BUILD'''&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Installing UHD==&lt;br /&gt;
&lt;br /&gt;
Select the '''INSTALL''' project in the Solution Explorer and run the build, &amp;lt;tt&amp;gt;Build &amp;gt; Build '''INSTALL'''&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Visual Studio must be run as Administrator for this to succeed as it needs write permission for the &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;C:\Program Files&amp;lt;/syntaxhighlight&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===Compiling a binary installer===&lt;br /&gt;
&lt;br /&gt;
Building the '''PACKAGE''' project will produce a binary installer if NSIS is installed. This installer with be for either 64 bit or 32 bit as chosen during the CMake step. Select the '''PACKAGE''' project in the Solution Explorer and run the build, &amp;lt;tt&amp;gt; Build &amp;gt; '''Package'''&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Running UHD==&lt;br /&gt;
&lt;br /&gt;
Running programs using UHD requires the Visual Studio C++ Runtime Redistributable to be installed. The version of the C++ Runtime Redistributable must match the version of Visual Studio used to compile the program.&lt;br /&gt;
&lt;br /&gt;
* [https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads Visual Studio 2017]&lt;br /&gt;
* [https://www.microsoft.com/en-us/download/details.aspx?id=48145 Visual Studio 2015]&lt;br /&gt;
* [https://support.microsoft.com/en-us/kb/2977003 Visual Studio 2012 and 2013]&lt;br /&gt;
&lt;br /&gt;
==Installing the USB driver==&lt;br /&gt;
&lt;br /&gt;
If a USB connected USRP is used then the USB drivers must be installed. The drivers are located at http://files.ettus.com/binaries/misc/erllc_uhd_winusb_driver.zip.&lt;br /&gt;
&lt;br /&gt;
There is a known issue with Windows 10 where an error message is shown at the end of driver installation. However resetting or power cycling the USRP enables full functionality.&lt;br /&gt;
&lt;br /&gt;
==Note on Dependencies for Current and Previous Versions==&lt;br /&gt;
&lt;br /&gt;
It should be noted that this guide is intended to serve as an example; the software versions and dependencies listed above are not the only possible combinations. Be sure to review the [http://files.ettus.com/manual/page_build_guide.html Build Dependencies] in the [http://files.ettus.com/manual/index.html USRP Hardware Driver and USRP Manual] for information regarding the minimum required driver versions for your build of UHD. To preserve the software stack from the previous iteration of this Application Note, here is an example driver stack for Windows 7 + VS 2013:&lt;br /&gt;
&lt;br /&gt;
* Microsoft Windows 7 x64&lt;br /&gt;
* Microsoft Visual Studio 2013&lt;br /&gt;
* CMake 3.4.1 win32-x86&lt;br /&gt;
* Boost 1.58.0 msvc-12.0 x64&lt;br /&gt;
* LibUSB 1.0.20&lt;br /&gt;
* Python 2.7.11&lt;br /&gt;
* Mako 1.0.3&lt;br /&gt;
* Doxygen 1.8&lt;br /&gt;
* NSIS 2.50&lt;br /&gt;
&lt;br /&gt;
==GNU Radio and UHD==&lt;br /&gt;
Building GNU Radio from source on Windows is still an involved process due to the large number of dependencies. A set of scripts have been developed to automate the process by Geof Nieboer. The links below will detail the process to building GNU Radio + UHD. &lt;br /&gt;
&lt;br /&gt;
'''Note:''' The linked instructions below will build GNU Radio along with UHD, which is separate from the instructions above within this Application Note. The scripts linked below are not maintained by Ettus Research, and are considered third-party binary packages, and are not directly supported by Ettus Research.&lt;br /&gt;
&lt;br /&gt;
https://github.com/gnieboer/gnuradio_windows_build_scripts&lt;br /&gt;
http://www.gcndevelopment.com/gnuradio/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Application Notes]]&lt;/div&gt;</summary>
		<author><name>MartinAnderseck</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Building_and_Installing_the_USRP_Open_Source_Toolchain_(UHD_and_GNU_Radio)_on_Windows&amp;diff=5126</id>
		<title>Building and Installing the USRP Open Source Toolchain (UHD and GNU Radio) on Windows</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Building_and_Installing_the_USRP_Open_Source_Toolchain_(UHD_and_GNU_Radio)_on_Windows&amp;diff=5126"/>
				<updated>2021-08-24T14:56:49Z</updated>
		
		<summary type="html">&lt;p&gt;MartinAnderseck: Added information about dependencies NumPy and ruamel.yaml required for building the Python API for UHD.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Application Note Number==&lt;br /&gt;
'''AN-611'''&lt;br /&gt;
&amp;lt;!-- Internal use only: please do keep this updated!&lt;br /&gt;
==Revision History==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Author&lt;br /&gt;
!Details&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2016-01-19&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Derek Kozel&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Initial creation&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2017-03-07&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Nate Temple&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Update GNU Radio instructions &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2018-12-14&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Sam Reiter&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Update UHD instructions &lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This Application Note provides a step-by-step guide for building, installing, and updating the open-source toolchain, specifically UHD and GNU Radio, for the USRP from source code on Windows.&lt;br /&gt;
&lt;br /&gt;
==UHD on Windows==&lt;br /&gt;
&lt;br /&gt;
UHD is fully supported on Windows 7, 8, 8.1, and 10 and can be compiled using Visual Studio 2013, 2015, or 2017. The future target is to support the latest three OS and Visual Studio releases.&lt;br /&gt;
&lt;br /&gt;
==Setup the Environment==&lt;br /&gt;
&lt;br /&gt;
The following dependencies are required for a regular build.&lt;br /&gt;
&lt;br /&gt;
* Microsoft Windows (7, 8, 8.1, 10)&lt;br /&gt;
* Microsoft Visual Studio (2013, 2015, 2017)&lt;br /&gt;
* CMake (2.8.0 or later)&lt;br /&gt;
* Boost (1.53 or later)&lt;br /&gt;
* LibUSB (1.0 or later)&lt;br /&gt;
* Python (2.7.x)&lt;br /&gt;
* Mako (0.5.0 or later)&lt;br /&gt;
* Doxygen (1.8 or later, optional)&lt;br /&gt;
* NSIS (2.50 or later, optional)&lt;br /&gt;
&lt;br /&gt;
Optional Tools:&lt;br /&gt;
&lt;br /&gt;
* 7zip (http://www.7-zip.org/download.html) &lt;br /&gt;
* msysGit (https://gitforwindows.org/)&lt;br /&gt;
&lt;br /&gt;
==Installing the dependencies==&lt;br /&gt;
&lt;br /&gt;
===Microsoft Visual Studio===&lt;br /&gt;
&lt;br /&gt;
The free version of Visual Studio is sufficient for building UHD. This guide was tested using Windows 10 x64 and Microsoft Visual Studio Community 2017 (v15.9).&lt;br /&gt;
&lt;br /&gt;
Users will need to install the &amp;quot;Desktop Development for C++&amp;quot; Workload for Visual Studio. This can be found in:&lt;br /&gt;
&lt;br /&gt;
Tools &amp;gt;&amp;gt; Get Tools and Features... &amp;gt;&amp;gt; Workloads&lt;br /&gt;
&lt;br /&gt;
https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads&lt;br /&gt;
&lt;br /&gt;
https://www.visualstudio.com/downloads/&lt;br /&gt;
&lt;br /&gt;
===CMake===&lt;br /&gt;
&lt;br /&gt;
CMake is a cross-platform build system used to configure and generate the files necessary to compile and test UHD for a particular computer environment.&lt;br /&gt;
&lt;br /&gt;
Made sure to download the &amp;quot;.msi&amp;quot; file, not the &amp;quot;.zip&amp;quot; file. During installation select the option to &amp;quot;Add CMake to the system PATH for the current user&amp;quot; or for &amp;quot;all users&amp;quot;, depending on which is more applicable for your Windows usage.&lt;br /&gt;
&lt;br /&gt;
CMake 3.13.2 (win64-x64) was used for the guide. UHD has been tested to work through CMake 3.17.2.&lt;br /&gt;
&lt;br /&gt;
https://cmake.org/download/&lt;br /&gt;
&lt;br /&gt;
===Boost===&lt;br /&gt;
&lt;br /&gt;
Boost is a set of C++ libraries providing useful algorithms and data structures.&lt;br /&gt;
&lt;br /&gt;
UHD builds with Boost through 1.72.0. From the link below, select the version of Boost you wish to build against. At the bottom of the directory listing will be a file &amp;quot;DEPENDENCY_VERSIONS.txt&amp;quot;. Review this file to determine the correct version of the Boost installer to download for your specific MSVC version. The Boost binary installer must be selected to match the version of MSVC being used to compile UHD and architecture of Windows being run -- 32 or 64 bit. Watch out as Microsoft has done the version numbering of MSVC such that the year and version number do not match. Here are the recent entries in the noted file:&lt;br /&gt;
&lt;br /&gt;
  Microsoft Visual Studio 2013 - msvc-12.0 - Update 5&lt;br /&gt;
  Microsoft Visual Studio 2015 - msvc-14.0 - Update 3&lt;br /&gt;
  Microsoft Visual Studio 2017 - msvc-14.1 - VS 15.9.17&lt;br /&gt;
  Microsoft Visual Studio 2019 - msvc-14.2 - VS 16.3.6&lt;br /&gt;
&lt;br /&gt;
Note that VS2019 support (MSVC Toolset 14.2) starts unofficially with Boost 1.70.0, and then officially with 1.71.0.&lt;br /&gt;
&lt;br /&gt;
After the Boost installer executable is downloaded, find it in the Windows File Explorer, right click on it and &amp;quot;Run as administrator&amp;quot;. During the install, select the destination location of &amp;quot;C:\Program Files\Boost\&amp;quot; for the install; the installer will append the Boost directory and version info, such that the full destination will actually be, for example, &amp;quot;C:\Program Files\Boost\boost_1_68_0&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
VS2017 uses the MSVC Toolset 14.1 so boost_1_68_0-msvc-14.1-64 was selected for this tutorial, and installed as &amp;quot;C:\Program Files\Boost\boost_1_68_0&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
https://sourceforge.net/projects/boost/files/boost-binaries/&lt;br /&gt;
&lt;br /&gt;
===LibUSB===&lt;br /&gt;
&lt;br /&gt;
LibUSB is a cross-platform library providing access to USB devices. UHD is compatible through LibUSB 1.0.23 (the current release as of this update).&lt;br /&gt;
&lt;br /&gt;
LibUSB releases are distributed as 7zip or tar.bz2 archives. There are plenty of free &amp;quot;unzip&amp;quot; programs available that can extract the files in either archive type; Windows does not provide this capability, so you'll need to download one of these programs. We are using the &amp;quot;7Zip&amp;quot; program as linked in the “Setting Up the Environment” Section. After installing 7zip the LibUSB release archive can be extracted by right clicking on the downloaded file and selecting &amp;lt;tt&amp;gt;7zip &amp;gt;&amp;gt; Extract files&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
LibUSB 1.0.22 was used for the guide and extracted to &amp;lt;syntaxhighlight lang=&amp;quot;irc&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;C:\Users\username\libusb-1.0.22&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
https://sourceforge.net/projects/libusb/files/libusb-1.0/&lt;br /&gt;
&lt;br /&gt;
'''Note''': The directory to which you extract libusb must not contain spaces. This is to say that &amp;lt;syntaxhighlight lang=&amp;quot;irc&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;C:\Users\user name\libusb-1.0.22&amp;lt;/syntaxhighlight&amp;gt; will cause compile issues moving forward.&lt;br /&gt;
&lt;br /&gt;
===Python===&lt;br /&gt;
&lt;br /&gt;
Python is a widely-used general-purpose, high-level programming language. UHD includes several utilities written in Python and has several scripts which are part of the build process. UHD is compatible with Python 2.7, and 3.5 through 3.8. The default Python install will be 32 bit. To get the 64-bit install, you have to select it specifically -- &amp;quot;Download Windows x86-64 executable installer&amp;quot; for Python 3.0+ or &amp;quot;Download Windows x86-64 MSI installer&amp;quot; for Python 2.7 (any version). When installing Python make sure to add to the PATH so that &amp;quot;python.exe&amp;quot; is available from the commandline.&lt;br /&gt;
&lt;br /&gt;
The Python 2.7.15 was used for this tutorial.&lt;br /&gt;
&lt;br /&gt;
https://www.python.org/downloads/windows/&lt;br /&gt;
&lt;br /&gt;
For building the LibUHD Python API the Python libraries NumPy and ruamel.yaml are required. NumPy adds support for large matrices and arrays and mathematical functions around them. ruamel.yaml is used for parsing/emitting YAML.&lt;br /&gt;
To install them open a command line (Ctrl-X, select Run, type &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;cmd.exe&amp;lt;/syntaxhighlight&amp;gt; and click OK)&lt;br /&gt;
&lt;br /&gt;
    cd C:\Python27\Scripts&lt;br /&gt;
    pip.exe install numpy&lt;br /&gt;
    pip.exe install ruamel.yaml&lt;br /&gt;
&lt;br /&gt;
===Mako===&lt;br /&gt;
&lt;br /&gt;
Mako is a python template library used to generate source files and is&lt;br /&gt;
distributed using a Python package management system.&lt;br /&gt;
&lt;br /&gt;
Open a command line (Ctrl-X, select Run, type &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;cmd.exe&amp;lt;/syntaxhighlight&amp;gt; and click OK)&lt;br /&gt;
&lt;br /&gt;
    cd C:\Python27\Scripts&lt;br /&gt;
    pip.exe install mako&lt;br /&gt;
&lt;br /&gt;
This installed version 1.0.7 at the time of writing this guide.&lt;br /&gt;
&lt;br /&gt;
===Doxygen===&lt;br /&gt;
&lt;br /&gt;
Doxygen is a documentation generator which creates the HTML manual from text in the source code. It optional for building UHD.&lt;br /&gt;
&lt;br /&gt;
Version 1.8.14 was used for this guide.&lt;br /&gt;
&lt;br /&gt;
https://sourceforge.net/projects/doxygen/files/rel-1.8.14/&lt;br /&gt;
&lt;br /&gt;
===NSIS===&lt;br /&gt;
&lt;br /&gt;
NSIS is a toolkit for creating Windows installers. NSIS is used for creating binary packages of UHD enabling easy distribution and installation of UHD, associated utilities, and examples.&lt;br /&gt;
&lt;br /&gt;
Version 3.03 was used for this guide.&lt;br /&gt;
&lt;br /&gt;
https://sourceforge.net/projects/nsis/files/NSIS%203/&lt;br /&gt;
&lt;br /&gt;
==Obtain the UHD source code==&lt;br /&gt;
&lt;br /&gt;
The UHD source code is stored in a GIT repository: https://www.github.com/EttusResearch/uhd . From this link, one can download an archive of the UHD source code for any release, the current public codebase itself, and the code state for some branches or tags. Which one you download is up to your needs. We generally recommend the latest release, which can be downloaded from our Github repository or from our website as noted below.&lt;br /&gt;
&lt;br /&gt;
For the purposes of this guide, the archive was [https://files.ettus.com/binaries/uhd/uhd_003.015.000.000-release/uhd_3.15.0.0-release.tar.xz downloaded from our website], and extracted as &amp;lt;syntaxhighlight lang=&amp;quot;irc&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;C:\Users\username\uhd-release\&amp;lt;/syntaxhighlight&amp;gt;. Please note that most UHD archives will extract to a directory name that corresponds to the UHD version; for example the one noted extracts to &amp;quot;uhd_3.15.0.0-release&amp;quot;. After extraction, we change the directory name to that as noted (&amp;quot;uhd-release&amp;quot;) and move it into the directory as noted. You can install the UHD source wherever you want to, of course; for this article we choose this location and use it later as such.&lt;br /&gt;
&lt;br /&gt;
===From a release source archive===&lt;br /&gt;
&lt;br /&gt;
Archives of the source code for each stable release can be downloaded from the Ettus website.&lt;br /&gt;
&lt;br /&gt;
http://files.ettus.com/binaries/uhd/&lt;br /&gt;
&lt;br /&gt;
7zip can be used to extract the &amp;lt;tt&amp;gt;tar.gz&amp;lt;/tt&amp;gt; archive to a location of your choosing.&lt;br /&gt;
&lt;br /&gt;
This guide used the Git repository to obtain the newest release of UHD, read on for details.&lt;br /&gt;
&lt;br /&gt;
===From the Git repository===&lt;br /&gt;
&lt;br /&gt;
The latest development code, as well as tagged releases, is available from the git repository hosted on GitHub&lt;br /&gt;
&lt;br /&gt;
https://www.github.com/EttusResearch/uhd&lt;br /&gt;
&lt;br /&gt;
For step-by-step instructions using a git client, see section [https://kb.ettus.com/Building_and_Installing_the_USRP_Open-Source_Toolchain_(UHD_and_GNU_Radio)_on_Linux#Building_and_installing_UHD_from_source_code Building and installing UHD from source code] in the UHD Linux Installation Guide. Return to this document after you have successfully checked out your desired release of UHD, and note that some directory names moving forward may differ slightly.&lt;br /&gt;
&lt;br /&gt;
==Building==&lt;br /&gt;
&lt;br /&gt;
All prerequisites have now been installed and downloaded. You are encouraged to restart your machine before continuing. &lt;br /&gt;
&lt;br /&gt;
===Configuring the Building===&lt;br /&gt;
&lt;br /&gt;
* Open the Cmake GUI&lt;br /&gt;
* Select source code directory&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;irc&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;C:\Users\username\uhd-release\host\&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Select binary build directory (this may require creating the folder \build\)&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;irc&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;C:\Users\username\uhd-release\host\build\&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Check the Advanced checkbox&lt;br /&gt;
* Click Configure&lt;br /&gt;
** Set Visual Studio 15 2017 Win64 as the compiler&lt;br /&gt;
** Click “Finish” and allow CMake to Generate&lt;br /&gt;
* Change or add the following entries&lt;br /&gt;
*; '''Boost_INCLUDE_DIR''' : &amp;lt;syntaxhighlight lang=&amp;quot;irc&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;C:\Program Files\Boost\boost_1_68_0\&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Add the following entries with type PATH&lt;br /&gt;
*; '''Boost_LIBRARY_DIRS''' : &amp;lt;syntaxhighlight lang=&amp;quot;irc&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;C:\Program Files\Boost\boost_1_68_0\lib64-msvc-14.1\&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*; '''LIBUSB_INCLUDE_DIRS''' : &amp;lt;syntaxhighlight lang=&amp;quot;irc&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;C:\Users\username\libusb-1.0.22\include\libusb-1.0\&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Add the following entry with type FILEPATH&lt;br /&gt;
*; '''LIBUSB_LIBRARIES''' : &amp;lt;syntaxhighlight lang=&amp;quot;irc&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;C:\Users\username\libusb-1.0.22\MS64/dll\libusb-1.0.lib&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Click Generate&lt;br /&gt;
&lt;br /&gt;
===Compiling UHD===&lt;br /&gt;
&lt;br /&gt;
Open Visual Studio 2017 and open the UHD project file generated by CMake.&lt;br /&gt;
; &amp;lt;tt&amp;gt;File &amp;gt; Open Project&amp;lt;/tt&amp;gt; : &amp;lt;syntaxhighlight lang=&amp;quot;irc&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;C:\Users\username\uhd-release\host\build\UHD.sln&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Change the build type from Debug to Release. The '''ALL_BUILD''' project should be selected in the Solution Explorer, select it if this is not the case. Run the build, &amp;lt;tt&amp;gt;Build &amp;gt; Build '''ALL_BUILD'''&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Installing UHD==&lt;br /&gt;
&lt;br /&gt;
Select the '''INSTALL''' project in the Solution Explorer and run the build, &amp;lt;tt&amp;gt;Build &amp;gt; Build '''INSTALL'''&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Visual Studio must be run as Administrator for this to succeed as it needs write permission for the &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;C:\Program Files&amp;lt;/syntaxhighlight&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===Compiling a binary installer===&lt;br /&gt;
&lt;br /&gt;
Building the '''PACKAGE''' project will produce a binary installer if NSIS is installed. This installer with be for either 64 bit or 32 bit as chosen during the CMake step. Select the '''PACKAGE''' project in the Solution Explorer and run the build, &amp;lt;tt&amp;gt; Build &amp;gt; '''Package'''&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Running UHD==&lt;br /&gt;
&lt;br /&gt;
Running programs using UHD requires the Visual Studio C++ Runtime Redistributable to be installed. The version of the C++ Runtime Redistributable must match the version of Visual Studio used to compile the program.&lt;br /&gt;
&lt;br /&gt;
* [https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads Visual Studio 2017]&lt;br /&gt;
* [https://www.microsoft.com/en-us/download/details.aspx?id=48145 Visual Studio 2015]&lt;br /&gt;
* [https://support.microsoft.com/en-us/kb/2977003 Visual Studio 2012 and 2013]&lt;br /&gt;
&lt;br /&gt;
==Installing the USB driver==&lt;br /&gt;
&lt;br /&gt;
If a USB connected USRP is used then the USB drivers must be installed. The drivers are located at http://files.ettus.com/binaries/misc/erllc_uhd_winusb_driver.zip.&lt;br /&gt;
&lt;br /&gt;
There is a known issue with Windows 10 where an error message is shown at the end of driver installation. However resetting or power cycling the USRP enables full functionality.&lt;br /&gt;
&lt;br /&gt;
==Note on Dependencies for Current and Previous Versions==&lt;br /&gt;
&lt;br /&gt;
It should be noted that this guide is intended to serve as an example; the software versions and dependencies listed above are not the only possible combinations. Be sure to review the [http://files.ettus.com/manual/page_build_guide.html Build Dependencies] in the [http://files.ettus.com/manual/index.html USRP Hardware Driver and USRP Manual] for information regarding the minimum required driver versions for your build of UHD. To preserve the software stack from the previous iteration of this Application Note, here is an example driver stack for Windows 7 + VS 2013:&lt;br /&gt;
&lt;br /&gt;
* Microsoft Windows 7 x64&lt;br /&gt;
* Microsoft Visual Studio 2013&lt;br /&gt;
* CMake 3.4.1 win32-x86&lt;br /&gt;
* Boost 1.58.0 msvc-12.0 x64&lt;br /&gt;
* LibUSB 1.0.20&lt;br /&gt;
* Python 2.7.11&lt;br /&gt;
* Mako 1.0.3&lt;br /&gt;
* Doxygen 1.8&lt;br /&gt;
* NSIS 2.50&lt;br /&gt;
&lt;br /&gt;
==GNU Radio and UHD==&lt;br /&gt;
Building GNU Radio from source on Windows is still an involved process due to the large number of dependencies. A set of scripts have been developed to automate the process by Geof Nieboer. The links below will detail the process to building GNU Radio + UHD. &lt;br /&gt;
&lt;br /&gt;
'''Note:''' The linked instructions below will build GNU Radio along with UHD, which is separate from the instructions above within this Application Note. The scripts linked below are not maintained by Ettus Research, and are considered third-party binary packages, and are not directly supported by Ettus Research.&lt;br /&gt;
&lt;br /&gt;
https://github.com/gnieboer/gnuradio_windows_build_scripts&lt;br /&gt;
http://www.gcndevelopment.com/gnuradio/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Application Notes]]&lt;/div&gt;</summary>
		<author><name>MartinAnderseck</name></author>	</entry>

	</feed>