<?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=JonathonPendlum</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=JonathonPendlum"/>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/Special:Contributions/JonathonPendlum"/>
		<updated>2026-09-02T08:07:42Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP_N300/N310/N320/N321_Getting_Started_Guide&amp;diff=7183</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=7183"/>
				<updated>2026-08-05T14:30:00Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: Correct 1Gb Streaming SFP Port 0 section, &amp;quot;RJ45 - SFP+ adapter&amp;quot; corrected to &amp;quot;SFP to RJ45 adapter&amp;quot;&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 SFP to RJ45 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 SFP to RJ45 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 SFP to RJ45 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 SFP to RJ45 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;
&lt;br /&gt;
==Verify the Contents of Your Kit==&lt;br /&gt;
&lt;br /&gt;
Ensure that your kit contains all the items listed above.&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;
&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;
    $ sudo uhd_images_downloader -t mender -t n3xx --yes&lt;br /&gt;
&lt;br /&gt;
Example Output:&lt;br /&gt;
    [INFO] Using base URL: https://files.ettus.com/binaries/cache/&lt;br /&gt;
    [INFO] Images destination: /usr/local/share/uhd/images&lt;br /&gt;
    365684 kB / 365684 kB (100%) n3xx_common_mender_default-v4.6.0.0.zip&lt;br /&gt;
    [INFO] Images download complete.&lt;br /&gt;
&lt;br /&gt;
The downloaded &amp;quot;zip&amp;quot; archive is extracted into the &amp;lt;code&amp;gt;Images destination&amp;lt;/code&amp;gt; directory with the filename &amp;lt;code&amp;gt;usrp_n3xx_fs.mender&amp;lt;/code&amp;gt;. Next, you will need to copy this Mender file system image from the &amp;lt;code&amp;gt;Images destination&amp;lt;/code&amp;gt; directory to the USRP N3xx to have its filesystem changed. This can be done with the Linux utility &amp;lt;code&amp;gt;scp&amp;lt;/code&amp;gt;, for example as follows:&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 be different for your configuration; the command above assumes you're using the default UHD 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 to gain shell access via either the Serial Console or SSH.&lt;br /&gt;
&lt;br /&gt;
On the N3xx, you first need to determine the version of UHD currently running on the USRP; an easy way to do this is via the command&lt;br /&gt;
    # uhd_config_info --version&lt;br /&gt;
&lt;br /&gt;
Example output:&lt;br /&gt;
    UHD 3.14.1.1-0-g0347a6d8&lt;br /&gt;
&lt;br /&gt;
The mender command to execute is different for UHD version 4.0 or newer versus prior to version 4.0. For the former use &amp;lt;code&amp;gt;mender install&amp;lt;/code&amp;gt; followed by the mender file; for the latter use &amp;lt;code&amp;gt;mender -f -rootfs&amp;lt;/code&amp;gt; followed by the mender file. Starting with UHD version 4.0 one can use mender to upgrade or downgrade the UHD filesystem version between any UHD v4 versions (e.g., 4.1 to 4.6; 4.6 to 4.1). The following commands assume that the UHD filesystem is version 4; if not then substitute the other mender command.&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;mender install /path/to/latest.mender&amp;lt;/code&amp;gt; to update the file system, e.g.:&lt;br /&gt;
&lt;br /&gt;
    # mender install 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 quite a few minutes to complete. While executing, mender will show progress, e.g.:&lt;br /&gt;
    ................................   0% 1024 KiB&lt;br /&gt;
    ...&lt;br /&gt;
    ................................   1% 4096 KiB&lt;br /&gt;
    ...&lt;br /&gt;
    ................................  99% 386048 KiB&lt;br /&gt;
    ............                     100% 386458 KiB&lt;br /&gt;
    INFO[3865] wrote 7851737088/7851737088 bytes of update to device /dev/mmcblk0p3  module=device&lt;br /&gt;
    INFO[3871] Enabling partition with new image installed to be a boot candidate: 3  module=device&lt;br /&gt;
&lt;br /&gt;
After mender has logged a successful update, reboot the device:&lt;br /&gt;
    # reboot&lt;br /&gt;
&lt;br /&gt;
Upon reboot log back in to the USRP N3xx and run the command &amp;lt;code&amp;gt;uhd_find_devices&amp;lt;/code&amp;gt; to verify that the UHD version is as desired and that the command runs successfully -- it should find at a minimum the USRP it is being executed on and will find more if other USRPs are on the same network.&lt;br /&gt;
&lt;br /&gt;
If upon reboot the device is not working or the UHD version is not as desired, then the easiest way forward is to [https://kb.ettus.com/USRP_N300/N310/N320/N321_Getting_Started_Guide#Updating_the_files_system_by_writing_the_disk_image overwrite the sdcard filesystem manually] with the desired UHD version.&lt;br /&gt;
&lt;br /&gt;
If upon reboot everything is as desired and the device seems functional, then 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;
    # mender show-artifact&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 filesystem, refer to the [https://files.ettus.com/manual/ UHD Manual]​.&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 at: &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;
or for older versions of the file system: &amp;lt;code&amp;gt;/etc/systemd/network/&amp;lt;/code&amp;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;
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 ​SFP to RJ45 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;
[[Category:Getting Started Guides]]&lt;br /&gt;
[[Category:N300]]&lt;br /&gt;
[[Category:N310]]&lt;br /&gt;
[[Category:N320]]&lt;br /&gt;
[[Category:N321]]&lt;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP_N300/N310/N320/N321_Getting_Started_Guide&amp;diff=7182</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=7182"/>
				<updated>2026-08-05T14:27:08Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: Corrected Kit Contents section, devices ship with SFP to RJ45 Adapter, not SFP+&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 SFP to RJ45 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 SFP to RJ45 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 SFP to RJ45 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 SFP to RJ45 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;
&lt;br /&gt;
==Verify the Contents of Your Kit==&lt;br /&gt;
&lt;br /&gt;
Ensure that your kit contains all the items listed above.&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;
&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;
    $ sudo uhd_images_downloader -t mender -t n3xx --yes&lt;br /&gt;
&lt;br /&gt;
Example Output:&lt;br /&gt;
    [INFO] Using base URL: https://files.ettus.com/binaries/cache/&lt;br /&gt;
    [INFO] Images destination: /usr/local/share/uhd/images&lt;br /&gt;
    365684 kB / 365684 kB (100%) n3xx_common_mender_default-v4.6.0.0.zip&lt;br /&gt;
    [INFO] Images download complete.&lt;br /&gt;
&lt;br /&gt;
The downloaded &amp;quot;zip&amp;quot; archive is extracted into the &amp;lt;code&amp;gt;Images destination&amp;lt;/code&amp;gt; directory with the filename &amp;lt;code&amp;gt;usrp_n3xx_fs.mender&amp;lt;/code&amp;gt;. Next, you will need to copy this Mender file system image from the &amp;lt;code&amp;gt;Images destination&amp;lt;/code&amp;gt; directory to the USRP N3xx to have its filesystem changed. This can be done with the Linux utility &amp;lt;code&amp;gt;scp&amp;lt;/code&amp;gt;, for example as follows:&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 be different for your configuration; the command above assumes you're using the default UHD 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 to gain shell access via either the Serial Console or SSH.&lt;br /&gt;
&lt;br /&gt;
On the N3xx, you first need to determine the version of UHD currently running on the USRP; an easy way to do this is via the command&lt;br /&gt;
    # uhd_config_info --version&lt;br /&gt;
&lt;br /&gt;
Example output:&lt;br /&gt;
    UHD 3.14.1.1-0-g0347a6d8&lt;br /&gt;
&lt;br /&gt;
The mender command to execute is different for UHD version 4.0 or newer versus prior to version 4.0. For the former use &amp;lt;code&amp;gt;mender install&amp;lt;/code&amp;gt; followed by the mender file; for the latter use &amp;lt;code&amp;gt;mender -f -rootfs&amp;lt;/code&amp;gt; followed by the mender file. Starting with UHD version 4.0 one can use mender to upgrade or downgrade the UHD filesystem version between any UHD v4 versions (e.g., 4.1 to 4.6; 4.6 to 4.1). The following commands assume that the UHD filesystem is version 4; if not then substitute the other mender command.&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;mender install /path/to/latest.mender&amp;lt;/code&amp;gt; to update the file system, e.g.:&lt;br /&gt;
&lt;br /&gt;
    # mender install 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 quite a few minutes to complete. While executing, mender will show progress, e.g.:&lt;br /&gt;
    ................................   0% 1024 KiB&lt;br /&gt;
    ...&lt;br /&gt;
    ................................   1% 4096 KiB&lt;br /&gt;
    ...&lt;br /&gt;
    ................................  99% 386048 KiB&lt;br /&gt;
    ............                     100% 386458 KiB&lt;br /&gt;
    INFO[3865] wrote 7851737088/7851737088 bytes of update to device /dev/mmcblk0p3  module=device&lt;br /&gt;
    INFO[3871] Enabling partition with new image installed to be a boot candidate: 3  module=device&lt;br /&gt;
&lt;br /&gt;
After mender has logged a successful update, reboot the device:&lt;br /&gt;
    # reboot&lt;br /&gt;
&lt;br /&gt;
Upon reboot log back in to the USRP N3xx and run the command &amp;lt;code&amp;gt;uhd_find_devices&amp;lt;/code&amp;gt; to verify that the UHD version is as desired and that the command runs successfully -- it should find at a minimum the USRP it is being executed on and will find more if other USRPs are on the same network.&lt;br /&gt;
&lt;br /&gt;
If upon reboot the device is not working or the UHD version is not as desired, then the easiest way forward is to [https://kb.ettus.com/USRP_N300/N310/N320/N321_Getting_Started_Guide#Updating_the_files_system_by_writing_the_disk_image overwrite the sdcard filesystem manually] with the desired UHD version.&lt;br /&gt;
&lt;br /&gt;
If upon reboot everything is as desired and the device seems functional, then 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;
    # mender show-artifact&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 filesystem, refer to the [https://files.ettus.com/manual/ UHD Manual]​.&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 at: &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;
or for older versions of the file system: &amp;lt;code&amp;gt;/etc/systemd/network/&amp;lt;/code&amp;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;
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;
[[Category:Getting Started Guides]]&lt;br /&gt;
[[Category:N300]]&lt;br /&gt;
[[Category:N310]]&lt;br /&gt;
[[Category:N320]]&lt;br /&gt;
[[Category:N321]]&lt;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Writing_the_USRP_File_System_Disk_Image_to_a_SD_Card&amp;diff=7179</id>
		<title>Writing the USRP File System Disk Image to a SD Card</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Writing_the_USRP_File_System_Disk_Image_to_a_SD_Card&amp;diff=7179"/>
				<updated>2026-07-30T04:11:32Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: Add missing dd flags&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Application Note Number==&lt;br /&gt;
'''AN-630'''&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;| 2018-12-12&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Nate Temple&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Initial creation&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This application note will provide step-by-step instructions on writing a file system disk image to a SD card using Linux.&lt;br /&gt;
&lt;br /&gt;
==Required Tools==&lt;br /&gt;
* Computer with USB2/3 Interface &lt;br /&gt;
* UHD Installation&lt;br /&gt;
* microSD card to USB Adapter&lt;br /&gt;
&lt;br /&gt;
==Downloading the File System Image==&lt;br /&gt;
To obtain the file system SD card image for your USRP device, run the command in the next step on the host computer with UHD installed and Internet access. &lt;br /&gt;
&lt;br /&gt;
===N3xx===&lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader -t sdimg -t n3xx&lt;br /&gt;
&lt;br /&gt;
Example Output for UHD 3.15.0.0:&lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader -t sdimg -t n3xx&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;
    845962 kB / 845962 kB (100%) n3xx_common_sdimg_default-v3.15.0.0.zip&lt;br /&gt;
    [INFO] Images download complete.&lt;br /&gt;
&lt;br /&gt;
===E31x===&lt;br /&gt;
&lt;br /&gt;
The Release 4 image comes in two varieties: SG1 and SG3. The variety that you will need depends on the product number of your E310. To see which version you need look over at [https://kb.ettus.com/E310/E312#SD_Card_Images E310/E312 - Ettus Knowledge Base]&lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader -t sdimg -t e310 -t sg1&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
    $ sudo uhd_images_downloader -t sdimg -t e310 -t sg3&lt;br /&gt;
&lt;br /&gt;
Example Output for UHD 3.15.0.0 for E310 SG3:&lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader -t sdimg -t e310 -t sg3&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;
    561236 kB / 561236 kB (100%) e3xx_e310_sg3_sdimg_default-v3.15.0.0.zip&lt;br /&gt;
    [INFO] Images download complete.&lt;br /&gt;
&lt;br /&gt;
===E320===&lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader -t sdimg -t e320&lt;br /&gt;
&lt;br /&gt;
Example Output for UHD 3.15.0.0:&lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader -t sdimg -t e320&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;
    795674 kB / 795674 kB (100%) e3xx_e320_sdimg_default-v3.15.0.0.zip&lt;br /&gt;
    [INFO] Images download complete.&lt;br /&gt;
&lt;br /&gt;
==Identifying UHD Installation Prefix==&lt;br /&gt;
&lt;br /&gt;
In the output of the &amp;lt;code&amp;gt;uhd_images_downloader&amp;lt;/code&amp;gt; command above, the folder destination where the images are saved is printed out.&lt;br /&gt;
&lt;br /&gt;
An alternative method to identify your installation prefix is to run the command:&lt;br /&gt;
&lt;br /&gt;
    $ uhd_config_info --install-prefix&lt;br /&gt;
&lt;br /&gt;
Example Output:&lt;br /&gt;
&lt;br /&gt;
    Install prefix: /usr/local&lt;br /&gt;
&lt;br /&gt;
The default folder location for FPGA and SD card images is:&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;UHD_INSTALL_PREFIX&amp;gt;/share/uhd/images/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Writing the File System Image with Linux==&lt;br /&gt;
&lt;br /&gt;
===Identifying SD Card Mount Location===&lt;br /&gt;
&lt;br /&gt;
Insert the microSD card into the host computer.&lt;br /&gt;
&lt;br /&gt;
To identify the device where the microSD card is, run the command:&lt;br /&gt;
&lt;br /&gt;
    dmesg | tail&lt;br /&gt;
&lt;br /&gt;
Example Output (partially truncated for readability):&lt;br /&gt;
&lt;br /&gt;
    [21265.575488] usb-storage 1-2:1.0: USB Mass Storage device detected&lt;br /&gt;
    [21266.586983] scsi 0:0:0:0: Direct-Access     Generic  Mass-Storage     1.11 PQ: 0 ANSI: 2&lt;br /&gt;
    [21266.588024] sd 0:0:0:0: Attached scsi generic sg0 type 0&lt;br /&gt;
    [21267.299812] sd 0:0:0:0: [sdb] 31116288 512-byte logical blocks: (15.9 Gb/14.8 GiB)&lt;br /&gt;
    [21267.302687]  sdb: sdb1 sdb2 sdb3 sdb4&lt;br /&gt;
&lt;br /&gt;
NOTE: In this specific example configuration, the SD card has been attached to &amp;lt;code&amp;gt;sdb&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Another method to finding the device node the disk is attached at is to use the Linux utility &amp;lt;code&amp;gt;lsblk&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Example Output:&lt;br /&gt;
&lt;br /&gt;
    $ lsblk&lt;br /&gt;
    NAME           MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT&lt;br /&gt;
    sdb      8:16   1 14.9G  0 disk&lt;br /&gt;
    ├─sdb1   8:17   1   16M  0 part /media/user/boot&lt;br /&gt;
    ├─sdb2   8:18   1  1.9G  0 part /media/user/primary&lt;br /&gt;
    ├─sdb3   8:19   1  1.9G  0 part /media/user/secondary&lt;br /&gt;
    └─sdb4   8:20   1   11G  0 part /media/user/data&lt;br /&gt;
&lt;br /&gt;
===Unmount Auto-mounted Partitions===&lt;br /&gt;
&lt;br /&gt;
Some operating systems by default will auto-mount the partitions on a block device when it is attached. Before writing a new disk image to the SD card, you should first unmount any mounted partitions. This can be done with the Linux utility &amp;lt;code&amp;gt;umount&amp;lt;/code&amp;gt; as shown below:&lt;br /&gt;
&lt;br /&gt;
    $ sudo umount /media/user/data&lt;br /&gt;
    $ sudo umount /media/user/primary&lt;br /&gt;
    $ sudo umount /media/user/secondary&lt;br /&gt;
    $ sudo umount /media/user/boot&lt;br /&gt;
&lt;br /&gt;
Running the command &amp;lt;code&amp;gt;lsblk&amp;lt;/code&amp;gt; again will show these partitions have been unmounted:&lt;br /&gt;
&lt;br /&gt;
Example Output:&lt;br /&gt;
&lt;br /&gt;
    $ lsblk&lt;br /&gt;
    NAME           MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT&lt;br /&gt;
    sdb      8:16   1 14.9G  0 disk&lt;br /&gt;
    ├─sdb1   8:17   1   16M  0 part&lt;br /&gt;
    ├─sdb2   8:18   1  1.9G  0 part&lt;br /&gt;
    ├─sdb3   8:19   1  1.9G  0 part&lt;br /&gt;
    └─sdb4   8:20   1   11G  0 part&lt;br /&gt;
&lt;br /&gt;
===Writing the SD Card Image===&lt;br /&gt;
&lt;br /&gt;
====Using dd to write the disk image====&lt;br /&gt;
&lt;br /&gt;
'''WARNING:''' The Linux utility &amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt; can cause unrecoverable data loss if the incorrect disk is selected, or if the parameters are input incorrectly. Ensure you have selected the correct input and output parameters for your system configuration.&lt;br /&gt;
&lt;br /&gt;
NOTE: You must use a 16 Gb or larger SD card for the N3xx and E320 file system images.&lt;br /&gt;
&lt;br /&gt;
The ​&amp;lt;code&amp;gt;&amp;lt;SD_CARD_DEV_NAME&amp;gt;​&amp;lt;/code&amp;gt; device node depends on your operating system and which other devices are plugged in. Typical values are ​&amp;lt;code&amp;gt;sdb&amp;lt;/code&amp;gt;​ or &amp;lt;code&amp;gt;mmcblk0​&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;&amp;lt;IMAGE&amp;gt;&amp;lt;/code&amp;gt; value will depend upon which file system image you're writing. Examples for the N300/N310 and E320 are listed below:&lt;br /&gt;
&lt;br /&gt;
'''N3xx'''&lt;br /&gt;
    &amp;lt;IMAGE&amp;gt;=/usr/local/share/uhd/images/usrp_n3xx_fs.sdimg&lt;br /&gt;
&lt;br /&gt;
'''E320'''&lt;br /&gt;
    &amp;lt;IMAGE&amp;gt;=/usr/local/share/uhd/images/usrp_e320_fs.sdimg&lt;br /&gt;
&lt;br /&gt;
Write the disk image with the command:&lt;br /&gt;
&lt;br /&gt;
    $ sudo dd if=&amp;lt;IMAGE&amp;gt; of=&amp;lt;SD_CARD_DEV_NAME&amp;gt; bs=1M status=progress oflag=direct conv=fsync&lt;br /&gt;
&lt;br /&gt;
This step of writing the disk image to the SD card can take several minutes to complete.&lt;br /&gt;
&lt;br /&gt;
Example Output:&lt;br /&gt;
&lt;br /&gt;
    $ sudo dd if=/usr/local/share/uhd/images/usrp_&amp;lt;deivce&amp;gt;_fs.sdimg of=/dev/sdb bs=1M status=progress oflag=direct conv=fsync&lt;br /&gt;
    15160+0 records in&lt;br /&gt;
    15160+0 records out&lt;br /&gt;
    15896412160 bytes (16 Gb, 15 GiB) copied, 1160.93 s, 13.7 MB/s&lt;br /&gt;
&lt;br /&gt;
You can now remove the microSD card from your host computer and insert it into the USRP.&lt;br /&gt;
&lt;br /&gt;
[[Category:Application Notes]]&lt;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=N200/N210_Getting_Started_Guides&amp;diff=6946</id>
		<title>N200/N210 Getting Started Guides</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=N200/N210_Getting_Started_Guides&amp;diff=6946"/>
				<updated>2026-05-06T14:39:28Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: Add EOL notice&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==End-of-Life (EOL)==&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;'''Please note that this product is now End-of-Life (EOL) and is no longer available for sale through Ettus Research. It is not recommended for use in new designs or in new projects.'''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kit Contents==&lt;br /&gt;
* USRP N200/N210&lt;br /&gt;
* 1 Gigabit Ethernet Cable&lt;br /&gt;
* Power Supply&lt;br /&gt;
* 2 SMA-Bulkhead Cables&lt;br /&gt;
{|&lt;br /&gt;
||[[File:Product n200.jpg|250px|center]]&lt;br /&gt;
||[[File:Product n210.jpg|250px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Verify the Contents of Your Kit==&lt;br /&gt;
Make sure that your kit contains all the items listed above. If any items are missing, please contact your sales agent or Ettus Research Technical support immediately.&lt;br /&gt;
&lt;br /&gt;
==You Will Need==&lt;br /&gt;
* A host computer with an available 1-GigE port&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 easily cause the device to become non-functional. Listed below are some examples of actions which can 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 boards.&lt;br /&gt;
*Always use caution with FPGA, firmware, or software modifications.&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;
==Assembly==&lt;br /&gt;
The USRP N200/N210 and compatible RF daughterboards are shipped separately.  To operate the device you will need to install the RF daughterboards and supplied bulkhead cables.  This can be accomplished by removing the top plate of the USRP N200/N210, which is secured with two screws.  After installation, the daughterboards and cables should be secured with the hardware provided.  The device must be powered off when installing daughterboards to avoid potential damage. For detailed step-by-step instructions on assembling up your USRP N200/N210, see the [[USRP N Series Quick Start (Daughterboard Installation)]] page.&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. Release 3.8.4 or later of the USRP Hardware Driver, UHD, is required. It is recommended to use the latest stable version of UHD that is available. &lt;br /&gt;
&lt;br /&gt;
If you have a USB stick with the [[Live SDR Environment]] installed on it, then you may boot your host computer from that. The LiveUSB SDR Environment does not require anything to be installed on your host computer, and contains a Linux-based environment with the UHD software and the GNU Radio framework already installed. More information about the [[Live SDR Environment]] is available at the [[Live SDR Environment Getting Started Guides]] page.&lt;br /&gt;
&lt;br /&gt;
==Test and Verify the Operation of the USRP==&lt;br /&gt;
Once the software tools are installed on the host computer, or using the [[Live SDR Environment]], verify the correct operation of the USRP by running the utility programs on the host computer. More information is available at the [[Verifying the Operation of the USRP Using UHD and GNU Radio]] Application Note.&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;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=N200/N210&amp;diff=6945</id>
		<title>N200/N210</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=N200/N210&amp;diff=6945"/>
				<updated>2026-05-06T14:37:22Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: Add EOL notice&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==End-of-Life (EOL)==&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;'''Please note that this product is now End-of-Life (EOL) and is no longer available for sale through Ettus Research. It is not recommended for use in new designs or in new projects.'''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Device Overview ==&lt;br /&gt;
&lt;br /&gt;
The USRP Network Series offers high-bandwidth, high-dynamic range processing capability. The Gigabit Ethernet interface of the USRP Network Series allows high-speed streaming capability up to 50 MS/s in both directions (8-bit samples). These features, combined with plug-and-play MIMO capability make the USRP Network an ideal candidate for software defined radio systems with demanding performance requirements.&lt;br /&gt;
&lt;br /&gt;
== Key Features==&lt;br /&gt;
&lt;br /&gt;
===N200===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
*50 MHz of RF bandwidth with 8 bit samples&lt;br /&gt;
*25 MHz of RF bandwidth with 16 bit samples&lt;br /&gt;
*Gigabit Ethernet connectivity&lt;br /&gt;
*MIMO capable - requires two or more USRP N200 devices as motherboard has one daughterboard slot (1 RX + 1 TX connectors)&lt;br /&gt;
*Onboard FPGA processing&lt;br /&gt;
*FPGA: Xilinx® Spartan® 3A-DSP XC3SD1800A&lt;br /&gt;
*ADCs: 14-bits 100 MS/s&lt;br /&gt;
*DACs: 16-bits 400 MS/s&lt;br /&gt;
*Ability to lock to external 5 or 10 MHz clock reference&lt;br /&gt;
*TCXO Frequency Reference (~2.5ppm)&lt;br /&gt;
*Optional internal GPS locked reference oscillator&lt;br /&gt;
*FPGA code can be changed with Xilinx® ISE® WebPACK™ tools&lt;br /&gt;
*Frequency range: DC - 6 GHz with suitable daughterboard&lt;br /&gt;
|[[File:Product n200.jpg|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===N210===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
*50 MHz of RF bandwidth with 8 bit samples&lt;br /&gt;
*25 MHz of RF bandwidth with 16 bit samples&lt;br /&gt;
*Gigabit Ethernet connectivity&lt;br /&gt;
*MIMO capable - requires two or more USRP N210 devices as motherboard has one daughterboard slot (1 RX + 1 TX connectors)&lt;br /&gt;
*Onboard FPGA processing&lt;br /&gt;
*FPGA: Xilinx® Spartan® 3A-DSP XC3SD3400A&lt;br /&gt;
*ADCs: 14-bits 100 MS/s&lt;br /&gt;
*DACs: 16-bits 400 MS/s&lt;br /&gt;
*Ability to lock to external 5 or 10 MHz clock reference&lt;br /&gt;
*TCXO Frequency Reference (~2.5ppm)&lt;br /&gt;
*Optional internal GPS locked reference oscillator&lt;br /&gt;
*FPGA code can only be changed with the paid version of the Xilinx® ISE® Design Suite tools&lt;br /&gt;
*Frequency range: DC - 6 GHz with suitable daughterboard&lt;br /&gt;
|[[File:Product n210.jpg|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Compatible Daughterboards==&lt;br /&gt;
&lt;br /&gt;
* SBX-40&lt;br /&gt;
* UBX-40&lt;br /&gt;
* WBX-40&lt;br /&gt;
* CBX-40&lt;br /&gt;
* LFRX / LFTX&lt;br /&gt;
* BasicRX / BasicTX&lt;br /&gt;
* DBSRX2 (EOL)&lt;br /&gt;
* RFX Series (EOL)&lt;br /&gt;
* TVRX2 (EOL)&lt;br /&gt;
&lt;br /&gt;
==RF Specifications==&lt;br /&gt;
&lt;br /&gt;
===RF Performance Data (with WBX)===&lt;br /&gt;
&lt;br /&gt;
* SSB/LO Suppression -35/50 dBc&lt;br /&gt;
* Phase Noise 1.8 GHz 10kHz -80 dBc/Hz&lt;br /&gt;
* Phase Noise 1.8 GHz 100kHz -100 dBc/Hz&lt;br /&gt;
* Phase Noise 1.8 GHz 1MHz -137 dBc/Hz&lt;br /&gt;
* Power Output 15 dBm&lt;br /&gt;
* IIP3 (@ typ NF) 0 dBm&lt;br /&gt;
* Typical Noise Figure 5 dB&lt;br /&gt;
&lt;br /&gt;
==Hardware Specifications==&lt;br /&gt;
&lt;br /&gt;
* Ettus Research recommends to always use the latest stable version of UHD&lt;br /&gt;
&lt;br /&gt;
===N200===&lt;br /&gt;
&lt;br /&gt;
* Current Hardware Revision: 4&lt;br /&gt;
* Minimum version of UHD required: 3.8.0&lt;br /&gt;
&lt;br /&gt;
===N210===&lt;br /&gt;
&lt;br /&gt;
* Current Hardware Revision: 4&lt;br /&gt;
* Minimum version of UHD required: 3.8.0&lt;br /&gt;
&lt;br /&gt;
==Physical Specifications==&lt;br /&gt;
&lt;br /&gt;
===Dimensions===&lt;br /&gt;
&lt;br /&gt;
22 x 16 x 5 cm&lt;br /&gt;
&lt;br /&gt;
===Weight===&lt;br /&gt;
&lt;br /&gt;
1.2 kg&lt;br /&gt;
&lt;br /&gt;
===Drawings===&lt;br /&gt;
&lt;br /&gt;
* [[File:cu usrp-n2x0 motherboard.pdf]]&lt;br /&gt;
* [[File:cu ettus-usrp-n2x0.pdf]]&lt;br /&gt;
&lt;br /&gt;
===CAD/STP Models===&lt;br /&gt;
&lt;br /&gt;
====N2xx====&lt;br /&gt;
&lt;br /&gt;
* [[Media:cu usrp-n2x0 motherboard.stp.gz| Motherboard]]&lt;br /&gt;
&lt;br /&gt;
====N2xx Enclosure====&lt;br /&gt;
&lt;br /&gt;
* [[Media:cu ettus-usrp-n2x0.stp.gz|Enclosure]]&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
&lt;br /&gt;
* N200/N210: 25 °C&lt;br /&gt;
&lt;br /&gt;
===Operating Humidity Range===&lt;br /&gt;
&lt;br /&gt;
* 10% to 90% non-condensing&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
&lt;br /&gt;
===N200/N210===&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/schematics/n200/n2xx.pdf N200/N210 Schematics]&lt;br /&gt;
&lt;br /&gt;
==Key Component Datasheets==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%&amp;quot;&lt;br /&gt;
!Part Number&lt;br /&gt;
!Description&lt;br /&gt;
!Schematic ID (Page)&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/AD9777.pdf AD9777]&lt;br /&gt;
|Dual Channel, 16-Bit DAC&lt;br /&gt;
|U3 (1)&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/ads62p45.pdf ADS62P4X]&lt;br /&gt;
|Dual Channel, 14-Bit ADC&lt;br /&gt;
|U2 (1)&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.xilinx.com/support/documentation/data_sheets/ds529.pdf XC3SD3400AFG676]&lt;br /&gt;
|FPGA&lt;br /&gt;
|U1 (2,8,9,10,11,12)&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/AD9510.pdf AD9510]&lt;br /&gt;
|Clock Distribution IC&lt;br /&gt;
|U9 (4)&lt;br /&gt;
|-&lt;br /&gt;
|[http://download.siliconexpert.com/pdfs/2008/04/26/isys/lsi/ds06-161gphy_et1011c_09-28-2007.pdf ET1011C2]&lt;br /&gt;
|Gigabit Ethernet Transceiver&lt;br /&gt;
|U12 (6)&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.cypress.com/file/43236/download CY7C1354C]&lt;br /&gt;
|Pipelined SRAM&lt;br /&gt;
|U19 (7)&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/max232.pdf MAX232]&lt;br /&gt;
|Drivers/Receiver &lt;br /&gt;
|U25 (10)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==FPGA==&lt;br /&gt;
&lt;br /&gt;
* Utilization statistics are subject to change between UHD releases. This information is current as of UHD 3.9.4 and was taken directly from Xilinx Vivado 2014.4.&lt;br /&gt;
&lt;br /&gt;
===N200===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Device utilization summary:&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
Selected Device : 3sd1800afg676-5&lt;br /&gt;
&lt;br /&gt;
 Number of Slices:                    18356  out of  16640   110% (*)&lt;br /&gt;
 Number of Slice Flip Flops:          20466  out of  33280    61%&lt;br /&gt;
 Number of 4 input LUTs:              32968  out of  33280    99%&lt;br /&gt;
    Number used as logic:             28511&lt;br /&gt;
    Number used as Shift registers:    3945&lt;br /&gt;
    Number used as RAMs:                512&lt;br /&gt;
 Number of IOs:                         338&lt;br /&gt;
 Number of bonded IOBs:                 331  out of    519    63%&lt;br /&gt;
    IOB Flip Flops:                     342&lt;br /&gt;
 Number of BRAMs:                        41  out of     84    48%&lt;br /&gt;
 Number of GCLKs:                         6  out of     24    25%&lt;br /&gt;
 Number of DCMs:                          1  out of      8    12%&lt;br /&gt;
 Number of DSP48s:                       31  out of     84    36%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===N210===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Device utilization summary:&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
Selected Device : 3sd3400afg676-5&lt;br /&gt;
&lt;br /&gt;
 Number of Slices:                    18349  out of  23872    76%&lt;br /&gt;
 Number of Slice Flip Flops:          20475  out of  47744    42%&lt;br /&gt;
 Number of 4 input LUTs:              32986  out of  47744    69%&lt;br /&gt;
    Number used as logic:             28529&lt;br /&gt;
    Number used as Shift registers:    3945&lt;br /&gt;
    Number used as RAMs:                512&lt;br /&gt;
 Number of IOs:                         338&lt;br /&gt;
 Number of bonded IOBs:                 331  out of    469    70%&lt;br /&gt;
    IOB Flip Flops:                     342&lt;br /&gt;
 Number of BRAMs:                        41  out of    126    32%&lt;br /&gt;
 Number of GCLKs:                         6  out of     24    25%&lt;br /&gt;
 Number of DCMs:                          1  out of      8    12%&lt;br /&gt;
 Number of DSP48s:                       31  out of    126    24%&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interfaces and Connectivity==&lt;br /&gt;
&lt;br /&gt;
===N200/N210===&lt;br /&gt;
&lt;br /&gt;
* Gigabit Ethernet&lt;br /&gt;
&lt;br /&gt;
==Certifications==&lt;br /&gt;
&lt;br /&gt;
===RoHS===&lt;br /&gt;
&lt;br /&gt;
As of December 1st, 2010 all Ettus Research products are RoHS compliant unless otherwise noted. More information can be found at [http://ettus.com/legal/rohs-information http://ettus.com/legal/rohs-information]&lt;br /&gt;
&lt;br /&gt;
===China RoHS===&lt;br /&gt;
&lt;br /&gt;
'''Management Methods for Controlling Pollution Caused by Electronic Information Products Regulation'''&lt;br /&gt;
&lt;br /&gt;
'''Chinese Customers''' &lt;br /&gt;
&lt;br /&gt;
National Instruments is in compliance with the Chinese policy on the Restriction of Hazardous Substances (RoHS) used in Electronic Information Products. For more information about the National Instruments China RoHS compliance, visit [http://www.ni.com/environment/rohs_china ni.com/environment/rohs_china].&lt;br /&gt;
&lt;br /&gt;
==Letter of Volatility==&lt;br /&gt;
&lt;br /&gt;
Found on the [https://www.ni.com/en/support/documentation/product-certifications.html NI Product Certifications lookup tool] [https://www.ni.com/pdf/manuals/377355a.pdf here].&lt;br /&gt;
&lt;br /&gt;
==Recovering the N200/N210==&lt;br /&gt;
&lt;br /&gt;
For a detailed guide to recovering the N200/N210, please see the [[N200/N210 Device Recovery]] application note.&lt;br /&gt;
&lt;br /&gt;
==Downloads==&lt;br /&gt;
&lt;br /&gt;
[https://files.ettus.com/manual/md_fpga.html FPGA Resources]&lt;br /&gt;
&lt;br /&gt;
[https://files.ettus.com/binaries/uhd_stable/ UHD Stable Binaries]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/EttusResearch/uhd UHD Source Code on Github]&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Synchronizing_USRP_Events_Using_Timed_Commands_in_UHD&amp;diff=6467</id>
		<title>Synchronizing USRP Events Using Timed Commands in UHD</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Synchronizing_USRP_Events_Using_Timed_Commands_in_UHD&amp;diff=6467"/>
				<updated>2025-12-27T07:29:29Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: Make example clearer by showing that the set_rx_freq() call has a channel parameter&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Application Note Number==&lt;br /&gt;
'''AN-883'''&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-03-1   &lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Sam Reiter&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Initial creation&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This AN discusses Timed Commands in UHD. We will explore use cases, theory of operation, and multi_usrp based examples of timed command used in UHD 3.x.&lt;br /&gt;
&lt;br /&gt;
==Timed Commands: Overview and Usecases==&lt;br /&gt;
&lt;br /&gt;
Timed Commands are an important aspect of using a USRP. They allow a user to coordinate USRP state changes with nanosecond precision across multiple devices. Examples of timed command use cases include:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Configuring multiple channels of a single USRP to change frequency simultaneously.&lt;br /&gt;
&amp;lt;li&amp;gt; Configuring the channels on multiple USRPs to synchronously retune and ensure a predictable phase offset between channels ([https://kb.ettus.com/Synchronization_and_MIMO_Capability_with_USRP_Devices#MIMO_Capability_of_Ettus_Research_USRP_Devices if supported by daughterboard]). &lt;br /&gt;
&amp;lt;li&amp;gt; Changing the state of a USRP's GPIO line at an absolute time. &lt;br /&gt;
&amp;lt;li&amp;gt; Coordinating a simultaneous change of gain and frequency in a USRP.&lt;br /&gt;
&amp;lt;li&amp;gt; Scheduling frequency hopping at set time increments.&lt;br /&gt;
&amp;lt;li&amp;gt; Using RFNoC blocks like the Replay Block to transmit phase coherent bursts. &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===A System-Level Example===&lt;br /&gt;
A common use case of timed commands is to ensure a predictable and repeatable phase offset between the channels of multiple USRPs. Before we dive into the low level details of timed commands, lets take a high level look at where they are used in configuring a phase coherent MIMO system.&lt;br /&gt;
&lt;br /&gt;
There are four key elements required for phase coherent operation of resync-capable USRPs:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; All USRPs share a common reference clock (10MHz Ref)&lt;br /&gt;
&amp;lt;li&amp;gt; All USRPs share a common sense of time (PPS)&lt;br /&gt;
&amp;lt;li&amp;gt; LO and DSP tuning is synchronous&lt;br /&gt;
&amp;lt;li&amp;gt; Streaming is started synchronously &lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
LO sharing is implemented in some USRP products, but will not be covered in this example. Here is a physical configuration satisfying the requirements listed above:&lt;br /&gt;
&lt;br /&gt;
[[File:Mimo Setup.png|1200px|center]]&lt;br /&gt;
&amp;lt;center&amp;gt;Figure 1 - Example system configuration with Host PC, Octoclock, and X310 radios&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now that the system has all the physical connections necessary, we need to coordinate things in our host code. This will include importing the 10MHz Ref and PPS as well as ensuring synchronous tuning and streaming. &lt;br /&gt;
&lt;br /&gt;
First, we need to create a &amp;lt;code&amp;gt;multi_usrp&amp;lt;/code&amp;gt; object that contains both USRPs in our physical configuration:&lt;br /&gt;
&lt;br /&gt;
 uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(&amp;quot;addr0=192.168.10.2,addr1=192.168.10.3&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Next, we'll let the USRPs know that they should expect a 10MHz clock on their &amp;quot;Ref In&amp;quot; port, and a PPS signal on their &amp;quot;PPS In&amp;quot; port:&lt;br /&gt;
&lt;br /&gt;
 usrp-&amp;gt;set_clock_source(&amp;quot;external&amp;quot;); &lt;br /&gt;
 usrp-&amp;gt;set_time_source(&amp;quot;external&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
At this point, both USRPs are locked to an external reference and a common PPS signal. Next we want to tell both USRPs to reset their sense of time to 0.000s on the next PPS edge:&lt;br /&gt;
&lt;br /&gt;
 usrp-&amp;gt;set_time_next_pps(uhd::time_spec_t(0.0));&lt;br /&gt;
 std::this_thread::sleep_for(std::chrono::milliseconds(1000));&lt;br /&gt;
&lt;br /&gt;
We won't cover it much in this application note, but for now understand &amp;lt;code&amp;gt;time_spec_t&amp;lt;/code&amp;gt; is the UHD API's means of formatting time values for a USRP. After we reset the USRP's sense of time, we wait 1 second to ensure a PPS rising edge occurs and latches the 0.000s value to both USRPs. At this point, both USRPs should have a shared sense of time. We've now satisfied the first and second requirements for phase coherent USRP operation. Let's move on to synchronously tuning using timed commands:&lt;br /&gt;
&lt;br /&gt;
 usrp-&amp;gt;clear_command_time();&lt;br /&gt;
 &lt;br /&gt;
 usrp-&amp;gt;set_command_time(usrp-&amp;gt;get_time_now() + uhd::time_spec_t(0.1)); //set cmd time for .1s in the future&lt;br /&gt;
 &lt;br /&gt;
 uhd::tune_request_t tune_request(freq);&lt;br /&gt;
 usrp-&amp;gt;set_rx_freq(tune_request, channel); // Call once per channel&lt;br /&gt;
 std::this_thread::sleep_for(std::chrono::milliseconds(110)); //sleep 110ms (~10ms after retune occurs) to allow LO to lock&lt;br /&gt;
 &lt;br /&gt;
 usrp-&amp;gt;clear_command_time();&lt;br /&gt;
&lt;br /&gt;
With the above code block, we are able to set a command time equal to the current time + 0.1s. Any commands that are called after &amp;lt;code&amp;gt;set_command_time()&amp;lt;/code&amp;gt; will be sent to the USRP with a timestamp corresponding to the argument passed to &amp;lt;code&amp;gt;set_command_time()&amp;lt;/code&amp;gt;. Because of this timestamp, the USRP will wait until the command time passes to execute the tune request. This will ensure that the LO and DSP chain of our USRPs are retuned synchronously (on the same clock cycle), satisfying the third requirement for phase coherent operation.&lt;br /&gt;
&lt;br /&gt;
The final step in configuring our system is to set up synchronous streaming from both radios. For this example, we'll set up synchronous RX streaming using the following code:&lt;br /&gt;
&lt;br /&gt;
 // create a receive streamer&lt;br /&gt;
 uhd::stream_args_t stream_args(&amp;quot;fc32&amp;quot;, wire); // complex floats&lt;br /&gt;
 stream_args.channels             = &amp;quot;0,1,2,3&amp;quot;;&lt;br /&gt;
 uhd::rx_streamer::sptr rx_stream = usrp-&amp;gt;get_rx_stream(stream_args);&lt;br /&gt;
 &lt;br /&gt;
 // setup streaming&lt;br /&gt;
 uhd::stream_cmd_t stream_cmd(uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS);&lt;br /&gt;
 stream_cmd.stream_now = false;&lt;br /&gt;
 stream_cmd.time_spec  = uhd::time_spec_t(usrp-&amp;gt;get_time_now() + uhd::time_spec_t(1.0));&lt;br /&gt;
 rx_stream-&amp;gt;issue_stream_cmd(stream_cmd);&lt;br /&gt;
&lt;br /&gt;
Our system will begin to stream data 1s after the time returned by &amp;lt;code&amp;gt;usrp-&amp;gt;get_time_now()&amp;lt;/code&amp;gt;. Data sent to the host will be phase coherent between the 4 RX channels in this system. This architecture allows a system with X310 + UBX daughterboards to maintain a known phase relationship between channels across runs of code and system power cycles.&lt;br /&gt;
&lt;br /&gt;
For more detail, see [https://files.ettus.com/manual/page_sync.html USRP Manual: Device Synchronization]&lt;br /&gt;
&lt;br /&gt;
==Clocking and Timekeeping in the USRP==&lt;br /&gt;
&lt;br /&gt;
In this section, we will cover several key topics relating to USRP synchronization and the use of timed commands in UHD. This is the low level detail section of this application note.&lt;br /&gt;
&lt;br /&gt;
===PPS (Pulse Per Second)===&lt;br /&gt;
&lt;br /&gt;
PPS is a signal used by USRPs for time synchronization. With a shared PPS, the sense of time can be aligned across several USRPs, allowing for the synchronization of timed command execution on an arbitrary number of radio channels. Within the context of a USRP, a PPS signal is expected to have the following properties:&lt;br /&gt;
&lt;br /&gt;
*1Hz&lt;br /&gt;
*TTL Signal Levels&lt;br /&gt;
*25% duty cycle&lt;br /&gt;
&lt;br /&gt;
A USRP's PPS can be derived from a GPSDO automatically, from an externally supplied PPS signal, or via internal PPS synthesis (not supported in legacy USRPs).&lt;br /&gt;
&lt;br /&gt;
A PPS trigger is used to coordinate time alignment events across multiple devices. For example, the USRPs internal sense of time (the &amp;lt;code&amp;gt;vita_time&amp;lt;/code&amp;gt; counter) can be synchronously set/reset across multiple USRPs via UHD API calls such as: &lt;br /&gt;
&lt;br /&gt;
 set_time_next_pps&lt;br /&gt;
&lt;br /&gt;
 set_time_unknown_pps&lt;br /&gt;
&lt;br /&gt;
Ettus Research recommends the [https://www.ettus.com/all-products/octoclock/ Octoclock] for distribution of PPS and 10MHz REF signals across multiple devices, and the [https://www.ettus.com/all-products/octoclock-g/ Octoclock-G] for this functionality as well as tight alignment with GPS time. For further information on PPS and other common reference signals, see the [https://files.ettus.com/manual/page_sync.html UHD Manual: Device Synchronization].&lt;br /&gt;
&lt;br /&gt;
===CHDR Packet Types and Structure===&lt;br /&gt;
&lt;br /&gt;
CHDR (pronounced &amp;quot;Cheddar&amp;quot;, like the cheese) or &amp;quot;Compressed Header&amp;quot; packets are the packet type used to pass data and commands between a host computer and USRP. CHDR is a derivative of the VITA 49 (VRT) protocol which is proprietary to USRP devices. See [https://files.ettus.com/manual/page_rtp.html UHD Manual: Radio Transport Protocols] for more information.&lt;br /&gt;
&lt;br /&gt;
There are 4 types of packets used in the USRP:&lt;br /&gt;
*Data &lt;br /&gt;
*Flow Control&lt;br /&gt;
*Command &lt;br /&gt;
*Command Response&lt;br /&gt;
&lt;br /&gt;
The type of CHDR packet is determined by the value of bits 63 and 62 in the CHDR header:  &lt;br /&gt;
&lt;br /&gt;
[[File:packet breakdown.png|1200px|center]]&lt;br /&gt;
&amp;lt;center&amp;gt;Figure 2 - Expanded view of CHDR packet composition&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
All of these packet types have a single bit (61) used to denote whether an optional timestamp is included. If present, a timestamp is a 64-bit value representing an absolute time value. In this application note, we’re concerned with the use and functionality of command packets with a timestamp present, also known as “timed commands”.&lt;br /&gt;
&lt;br /&gt;
===Command Queue===&lt;br /&gt;
As commands are passed from host to USRP, they are added to a FIFO on the USRP's FPGA. This FIFO is called the command queue and all commands that are sent to the USRP must pass through a command queue. Each block in the FPGA that handles data also has its own command queue. The command queue FIFO is not to be confused with the data FIFOs used to buffer data between blocks (pictured in Figure 3). &lt;br /&gt;
&lt;br /&gt;
Every command queue maintains a sense of time. The mechanism for acquiring this sense of time is different between the Radio Core and other IP cores (including custom RFNoC blocks) and will be explored later in this application note. When commands enter the command queue, their timestamp is compared against the command queue's sense of time and the commands are executed when Queue Time &amp;gt;= Command Time. Commands without timestamps are executed immediately when they're at the front of the queue. Command queues in the USRP do not support on-the-fly reordering, meaning a command at the front of the queue will block subsequent commands from executing even if their timestamp has passed.  &lt;br /&gt;
&lt;br /&gt;
Every IP core on a USRP, including the Radio Core, DDC, DUC, and custom blocks, includes one command queue per data stream (certain blocks are designed to pass multiple data streams). The depth of this command queue varies from device to device is determined at FPGA compilation time based on user settings and available resources. An overflow of the command queue will result in a system halt and often requires a physical reset of the FPGA. Here are the default command queue depths for various USRP models:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
!USRP&lt;br /&gt;
!FPGA&lt;br /&gt;
!Default CMD Queue Depth (Radio Core)&lt;br /&gt;
!Default CMD Queue Depth (IP Cores)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|X300&lt;br /&gt;
|Xilinx Kintex-7 XC7K325T&lt;br /&gt;
|8&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|X310&lt;br /&gt;
|Xilinx Kintex-7 XC7K410T&lt;br /&gt;
|8&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|E310/E312/E313&lt;br /&gt;
|Xilinx Zynq 7020 SoC&lt;br /&gt;
|8&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|E320&lt;br /&gt;
|Xilinx Zynq 7045 SoC&lt;br /&gt;
|8&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|N300&lt;br /&gt;
|Xilinx Zynq-7035 SoC&lt;br /&gt;
|8&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|N310/N320/N321&lt;br /&gt;
|Xilinx Zynq-7100 SoC&lt;br /&gt;
|8&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|B200/B200mini&lt;br /&gt;
|Xilinx Spartan 6 XC6SLX75&lt;br /&gt;
|8&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|B210/B205mini/B206mini&lt;br /&gt;
|Xilinx Spartan 6 XC6SLX150&lt;br /&gt;
|8&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|N200&lt;br /&gt;
|Xilinx Spartan 3A-DSP XC3SD1800A&lt;br /&gt;
|64&lt;br /&gt;
|64&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|N210&lt;br /&gt;
|Xilinx Spartan 3A-DSP XC3SD3400A&lt;br /&gt;
|64&lt;br /&gt;
|64&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;center&amp;gt;Table 1 - Default command queue depth of various USRPs&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Radio Core Block Timing===&lt;br /&gt;
&lt;br /&gt;
The Radio Core is the heart of the USRP's functionality. The radio core is responsible for controlling all TX and RX daughterboard components (synthesizer, signal path, gain and attenuation elements, etc.), GPIO, setting up data streaming to/from DACs and ADCs, and related error handling. &lt;br /&gt;
&lt;br /&gt;
[[File:rfnoc with ubx.png|1200px|center]]&lt;br /&gt;
&amp;lt;center&amp;gt;Figure 3 - RFNoC Architecture with UBX daughterboard&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In addition to the functionality listed above, the Radio Core is also responsible for maintaining the USRP's sense of absolute time. This absolute time value is stored as a 64-bit counter called the &amp;quot;VITA time&amp;quot; or &amp;lt;code&amp;gt;vita_time&amp;lt;/code&amp;gt; in UHD. The &amp;lt;code&amp;gt;vita_time&amp;lt;/code&amp;gt; counter is incremented off of the FPGA's base clock and local to the Radio Core USRP, meaning that other RFNoC blocks can not reference this counter value directly. This sense of absolute time is a subtle yet important difference between the Radio Core and other RFNoC blocks, which can also execute timed commands but do so based on the timestamps (and sample rate) of packets which pass through these blocks.&lt;br /&gt;
&lt;br /&gt;
===General IP Core Timing===&lt;br /&gt;
The next case to cover is the handling of timed commands within FPGA blocks that are not the Radio Core. The Digital Down Converter (DDC) and Digital Up Converter (DUC) are two default USRP FPGA blocks that fall into this category. These blocks are responsible for performing digital frequency shifts on IQ samples that are passed through them. Precise execution of these frequency shifts are essential to phase coherent operation of the USRP.&lt;br /&gt;
&lt;br /&gt;
IP Cores like the DDC and DUC are reliant on the timestamp of packets (and the sample rate of the radio) to derive a sense of time. In the case of the receive chain, samples that are digitized by an ADC are then packaged into a CHDR Packet by the Radio Core (with an included timestamp equal to &amp;lt;code&amp;gt;vita_time&amp;lt;/code&amp;gt;) and are then passed downstream to the DDC. The DDC will read the timestamps of the incoming samples and apply any queued frequency shift precisely on the first sample with a timestamp &amp;gt;= the command time. &lt;br /&gt;
&lt;br /&gt;
With this method, a USRP can begin receiving data at absolute time &amp;lt;code&amp;gt;t0&amp;lt;/code&amp;gt;, tune it's LO at an absolute time of &amp;lt;code&amp;gt;t1&amp;lt;/code&amp;gt;, and then apply a frequency shift in the DDC &amp;lt;u&amp;gt;at the point in data&amp;lt;/u&amp;gt; corresponding to &amp;lt;code&amp;gt;t1&amp;lt;/code&amp;gt;, resulting in a physical and digital frequency change that begin on the exact same sample.&lt;br /&gt;
&lt;br /&gt;
The reverse process holds true for the transmit chain. One often overlooked difference is that the host must pass along at least 1 sample with a timestamp included in the metadata. Without this timestamped packet, the DUC can not derive a sense of time and therefore will never execute timed commands that are in its queue. This will either result in a command queue overflow or a &amp;quot;No Response Packet&amp;quot; runtime error from &amp;lt;code&amp;gt;ctrl_iface.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Miscellaneous Timed Command Notes===&lt;br /&gt;
&lt;br /&gt;
====Types of timed commands====&lt;br /&gt;
* The majority timing operations amount a sequence of peeks and pokes to FPGA registers. Examples include gain changes, tune requests, etc. The timestamp of a timed command corresponds to the beginning of this peek/poke sequence. &lt;br /&gt;
* The timing of data transmission (TX) is a bit more involved, requiring queueing of samples, and arming of the device for a timed transmission. This is handled by the FPGA when a timestamp is present in the first TX sample's metadata.&lt;br /&gt;
* A timed receive operation (RX) requires that a stream command with a timestamp be issued to the radio (see &amp;lt;code&amp;gt;stream_cmd.time_spec&amp;lt;/code&amp;gt; in the &amp;quot;System Level Example&amp;quot;). This syntax is different than a TX operation and does not involve sample metadata.&lt;br /&gt;
&lt;br /&gt;
====Timed commands on AD93xx-based devices====&lt;br /&gt;
*Timed commands are supported on AD93xx-based USRPs (E3xx, B2xx, N300/N310), with a few caveats:&lt;br /&gt;
**Timed commands do not allow for phase resync of the AD93xx internal LO.&lt;br /&gt;
**All functions that directly interact with the AD93xx (tuning, gain change, etc) are subject to the scheduling of the AD93xx. The determinism of these operations are not guaranteed.&lt;br /&gt;
*Timed commands for TX and RX on AD936x devices are supported, with caveats:&lt;br /&gt;
**There will be a delay between an absolute time passing and the AD936x actually beginning a streaming operation. This delay has been observed to be consistent ''for streaming'', but other operations like gain setting require SPI readback from the RFIC and are non-deterministic.&lt;br /&gt;
**This is to say that a timed streaming command to begin TX and RX at the same time, on an AD936x-based device (which is in external loopback) should result in a consistent delay between TX and RX down to the sample. Other RFIC operations like changing gain or tuning LO frequency will not have this consistency.&lt;br /&gt;
&lt;br /&gt;
====Are timed commands blocking?====&lt;br /&gt;
*No. Timed commands are passed from host to USRP and are added to a queue while host code progresses.&lt;br /&gt;
&lt;br /&gt;
===Summary===&lt;br /&gt;
Modern USRPs pass packets using the CHDR protocol. These packets can be used to issue commands to the USRP and may have an associated timestamp. A command with an included timestamp is called a timed command and it's important to understand how the USRP handles these timed commands. All blocks in a USRP's FPGA have a command queue and maintain a sense of time, however the Radio Core has the unique ability to store an absolute sense of time known as as the &amp;lt;code&amp;gt;vita_time&amp;lt;/code&amp;gt;. When timed commands are issued to the USRP, they are added to a command FIFO of finite depth and are executed when the timestamp in the header of the command packet is &amp;gt;= the RFNoC block's sense of time. Utilizing these timed commands correctly allows for various USRP functionality to be executed with nanosecond precision, enabling time and phase coherent operation across multiple devices.&lt;br /&gt;
&lt;br /&gt;
==UHD API for Event Timing==&lt;br /&gt;
&lt;br /&gt;
===Overview of Relevant Methods===&lt;br /&gt;
&lt;br /&gt;
In this section, we will list and briefly describe commands that are commonly used in USRP event timing. Some less common methods which require a more detailed explanation can be found in [https://files.ettus.com/manual/classuhd_1_1usrp_1_1multi__usrp.html The multi_usrp Class Reference].&lt;br /&gt;
&lt;br /&gt;
====Get USRP Time====&lt;br /&gt;
&lt;br /&gt;
Get the current time in the USRP time registers:&lt;br /&gt;
&lt;br /&gt;
 get_time_now()&lt;br /&gt;
&lt;br /&gt;
Get the time when the last pps pulse occurred:&lt;br /&gt;
&lt;br /&gt;
 get_time_last_pps()&lt;br /&gt;
&lt;br /&gt;
Get the currently set time source:&lt;br /&gt;
&lt;br /&gt;
 get_time_source()&lt;br /&gt;
&lt;br /&gt;
====Set USRP Time====&lt;br /&gt;
&lt;br /&gt;
Sets the time registers on the USRP immediately:&lt;br /&gt;
&lt;br /&gt;
 set_time_now()&lt;br /&gt;
&lt;br /&gt;
Set the time registers on the usrp at the next pps tick:&lt;br /&gt;
&lt;br /&gt;
 set_time_next_pps()&lt;br /&gt;
&lt;br /&gt;
Set the time source for the USRP device:&lt;br /&gt;
&lt;br /&gt;
 set_time_source()&lt;br /&gt;
&lt;br /&gt;
====Timed Commands====&lt;br /&gt;
&lt;br /&gt;
Clear the command time so future commands are sent ASAP.&lt;br /&gt;
&lt;br /&gt;
 clear_command_time()&lt;br /&gt;
&lt;br /&gt;
Set the time at which the control commands will take effect.&lt;br /&gt;
 &lt;br /&gt;
 set_command_time()&lt;br /&gt;
&lt;br /&gt;
====USRP TX Metadata ([https://files.ettus.com/manual/structuhd_1_1tx__metadata__t.html tx_metadata_t Struct Reference])====&lt;br /&gt;
&lt;br /&gt;
Default TX metadata constructor: &lt;br /&gt;
&lt;br /&gt;
 tx_metadata_t()&lt;br /&gt;
&lt;br /&gt;
Indicates whether a TX packet has a timestamp included:&lt;br /&gt;
&lt;br /&gt;
 md.has_time_spec&lt;br /&gt;
&lt;br /&gt;
Sets the timestamp that will be added to a TX packet&lt;br /&gt;
&lt;br /&gt;
 md.time_spec&lt;br /&gt;
&lt;br /&gt;
====USRP Stream Cmd ([https://files.ettus.com/manual/structuhd_1_1rx__metadata__t.html rx_metadata_t Struct Reference])====&lt;br /&gt;
&lt;br /&gt;
Default stream command constructor:&lt;br /&gt;
&lt;br /&gt;
 stream_cmd_t()&lt;br /&gt;
&lt;br /&gt;
Member function indicating whether the stream will begin immediately:&lt;br /&gt;
&lt;br /&gt;
 stream_cmd.stream_now&lt;br /&gt;
&lt;br /&gt;
Indicates the point in time for an RX stream to begin:&lt;br /&gt;
&lt;br /&gt;
 stream_cmd.time_spec&lt;br /&gt;
&lt;br /&gt;
Issue a stream command to the USRP:&lt;br /&gt;
&lt;br /&gt;
 issue_stream_cmd(stream_cmd)&lt;br /&gt;
&lt;br /&gt;
==Example: Using Timed Commands to Control GPIO==&lt;br /&gt;
&lt;br /&gt;
The following code uses timed commands to vary a USRP's bottom 4 GPIO lines between high and low. This can be copy-pasted into existing USRP examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    /********************************************/&lt;br /&gt;
    /*********** begin gpio operations **********/&lt;br /&gt;
    /********************************************/&lt;br /&gt;
&lt;br /&gt;
    // set up some catch-all masks&lt;br /&gt;
    uint32_t gpio_line = 0xF; // only the bottom 4 lines: 0xF = 00001111 = Pin 0, 1, 2, 3&lt;br /&gt;
    uint32_t all_one = 0xFF;&lt;br /&gt;
    uint32_t all_zero = 0x00;&lt;br /&gt;
&lt;br /&gt;
    // reset usrp time to 0.00&lt;br /&gt;
    usrp-&amp;gt;set_time_source(&amp;quot;internal&amp;quot;);&lt;br /&gt;
    usrp-&amp;gt;set_time_next_pps(uhd::time_spec_t(0.0));&lt;br /&gt;
    std::this_thread::sleep_for(std::chrono::milliseconds(2000));&lt;br /&gt;
&lt;br /&gt;
    uhd::time_spec_t now_time = usrp-&amp;gt;get_time_last_pps();        // define t=0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // set gpio pins up for output&lt;br /&gt;
    usrp-&amp;gt;set_gpio_attr(&amp;quot;FP0&amp;quot;, &amp;quot;DDR&amp;quot;, all_one, gpio_line, 0);&lt;br /&gt;
    usrp-&amp;gt;set_gpio_attr(&amp;quot;FP0&amp;quot;, &amp;quot;CTRL&amp;quot;, all_zero, gpio_line, 0);&lt;br /&gt;
    usrp-&amp;gt;set_gpio_attr(&amp;quot;FP0&amp;quot;, &amp;quot;OUT&amp;quot;, all_one, gpio_line, 0);     // reset HIGH (async)&lt;br /&gt;
&lt;br /&gt;
    // set all gpio lines to output 0&lt;br /&gt;
    usrp-&amp;gt;clear_command_time();&lt;br /&gt;
    usrp-&amp;gt;set_command_time(now_time + uhd::time_spec_t(2.0));&lt;br /&gt;
    usrp-&amp;gt;set_gpio_attr(&amp;quot;FP0&amp;quot;, &amp;quot;OUT&amp;quot;, all_zero, gpio_line, 0);    // set LOW @ t=2&lt;br /&gt;
&lt;br /&gt;
    // set all gpio lines to output 1&lt;br /&gt;
    usrp-&amp;gt;clear_command_time();&lt;br /&gt;
    usrp-&amp;gt;set_command_time(now_time + uhd::time_spec_t(4.0));&lt;br /&gt;
    usrp-&amp;gt;set_gpio_attr(&amp;quot;FP0&amp;quot;, &amp;quot;OUT&amp;quot;, all_one, gpio_line, 0);    // set HIGH @ t=4&lt;br /&gt;
&lt;br /&gt;
    // set all gpio lines to output 0&lt;br /&gt;
    usrp-&amp;gt;clear_command_time();&lt;br /&gt;
    usrp-&amp;gt;set_command_time(now_time + uhd::time_spec_t(6.0));&lt;br /&gt;
    usrp-&amp;gt;set_gpio_attr(&amp;quot;FP0&amp;quot;, &amp;quot;OUT&amp;quot;, all_zero, gpio_line, 0);   // set LOW @ t=6&lt;br /&gt;
&lt;br /&gt;
    usrp-&amp;gt;clear_command_time();&lt;br /&gt;
&lt;br /&gt;
    /********************************************/&lt;br /&gt;
    /*********** quit gpio operations ***********/&lt;br /&gt;
    /********************************************/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A low-cost logic analyzer can be used to monitor the GPIO line states:&lt;br /&gt;
&lt;br /&gt;
[[File:gpio example.png|1000px|center]]&lt;br /&gt;
&amp;lt;center&amp;gt;Figure 4 - Logic analyzer readout from timed GPIO example&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Application Notes]]&lt;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=RFNoC_Frequently_Asked_Questions&amp;diff=6221</id>
		<title>RFNoC Frequently Asked Questions</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=RFNoC_Frequently_Asked_Questions&amp;diff=6221"/>
				<updated>2025-10-09T13:53:02Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: Add FAQ for Vivado build error when using custom SystemVerilog packages&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Configuring the Stream Endpoint Buffer Size in RFNoC ==&lt;br /&gt;
&lt;br /&gt;
=== What is the SEP buffer size? ===&lt;br /&gt;
&lt;br /&gt;
Each stream endpoint (SEP) has an ingress buffer to store data received from others stream endpoints. This size of this buffer affects the data transfer rate that can be achieved when streaming to that endpoint. A larger ingress buffer in the stream endpoint means that there is more space to put data, minimizing idle time on the network. Additionally, streamers can queue up data before it is needed, reducing the chance of a buffer underflow.&lt;br /&gt;
&lt;br /&gt;
=== How do I set the SEP buffer size? ===&lt;br /&gt;
&lt;br /&gt;
The stream endpoint buffer size is set by adding a parameter under the endpoint you want to configure in the RFNoC image core YAML file. There are two parameters you can use to set the stream endpoint ingress buffer size in your RFNoC image core YAML file.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;buff_size&amp;lt;/code&amp;gt;: Buffer size in CHDR words. The size in bytes depends on the CHDR width. For example, if the &amp;lt;code&amp;gt;chdr_width&amp;lt;/code&amp;gt; parameter for the device is 64, then each CHDR word is 8 bytes. So a buff size of 32768 would be 262,144 bytes or 256 KiB. See [https://github.com/EttusResearch/uhd/blob/197cdc4f665cbd4e6394a7eeb44b405f67ab10b1/fpga/usrp3/top/x300/x310_rfnoc_image_core.yml#L20 here] for an example.&lt;br /&gt;
* &amp;lt;code&amp;gt;buff_size_bytes&amp;lt;/code&amp;gt;:  Buffer size in bytes. See [https://github.com/EttusResearch/uhd/blob/197cdc4f665cbd4e6394a7eeb44b405f67ab10b1/fpga/usrp3/top/x400/x410_200_rfnoc_image_core.yml#L21 here] for an example.&lt;br /&gt;
&lt;br /&gt;
=== To what value should I set the SEP buffer size? ===&lt;br /&gt;
&lt;br /&gt;
The buffer size should be a power of two in size to make optimal use of FPGA RAM resources. The default FPGA bitstreams typically set them to the largest size the FPGA can fit in order to maximize performance. Here are some general recommendations:&lt;br /&gt;
&lt;br /&gt;
* Set to &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; if you don't need to send data to that SEP.&lt;br /&gt;
* Set to &amp;lt;code&amp;gt;8192&amp;lt;/code&amp;gt; bytes (8 KiB = 1 MTU) minimum in order to stream data packets.&lt;br /&gt;
* Set to &amp;lt;code&amp;gt;32768&amp;lt;/code&amp;gt; bytes (32 KiB = 4 MTU) in order to stream at maximum rates between SEPs on the same FPGA.&lt;br /&gt;
* Set to &amp;lt;code&amp;gt;262144&amp;lt;/code&amp;gt; bytes (256 KiB = 32 MTU) or lager for high performance streaming between a host computer and the FPGA.&lt;br /&gt;
&lt;br /&gt;
Note that the requirements are application-dependent, so optimal sizes for your application may be different. MTU refers to the maximum transmission unit, which is the largest CHDR packet supported by the FPGA.&lt;br /&gt;
&lt;br /&gt;
If you need to free up FPGA resources (particularly block RAM) for your application, you can reduce the SEP buffer sizes. Just keep in mind that the maximum streaming rate may be affected.&lt;br /&gt;
&lt;br /&gt;
== USRP DRAM ==&lt;br /&gt;
&lt;br /&gt;
=== How much and what speed DRAM is available on each USRP? ===&lt;br /&gt;
&lt;br /&gt;
The table below summarizes the DRAM that is connected to the USRP for use by RFNoC.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ USRP DRAM Summary&lt;br /&gt;
|-&lt;br /&gt;
! USRP Model !! DRAM Size !! Default DRAM Speed !! Default User Interface&lt;br /&gt;
|-&lt;br /&gt;
| E31x || 512 MiB || 16-bit @ 800 MT/s (1.6 GB/s) || 2 ch x 64-bit @ 100 MHz&lt;br /&gt;
|-&lt;br /&gt;
| E320 || 2 GiB || 32-bit @ 1333 MT/s (5.33 GB/s) || 4 ch x 64-bit @ 300 MHz&lt;br /&gt;
|-&lt;br /&gt;
| N3xx || 2 GiB || 32-bit @ 1300 MT/s (5.2 GB/s) || 4 ch x 64-bit @ 303.819 MHz&lt;br /&gt;
|-&lt;br /&gt;
| X3xx || 1 GiB || 32-bit @ 1200 MT/s (4.8 GB/s) || 2 ch x 64-bit @ 300 MHz&lt;br /&gt;
|-&lt;br /&gt;
| X410 (100 and 200 MHz BW) || 4 GiB || 64-bit @ 2.0 GT/s (16.0 GB/s) || 4 x 64-bit @ 250 MHz&lt;br /&gt;
|-&lt;br /&gt;
| X410 (400 MHz BW) || 4 GiB per bank&amp;lt;br&amp;gt;(8 GiB total) || 64-bit @ 2.0 GT/s (16.0 GB/s) per bank&amp;lt;br&amp;gt;(32.0 GB/s total) || 4 x 128-bit @ 250 MHz (using 2 banks)&lt;br /&gt;
|-&lt;br /&gt;
| X440 (400 MHz BW) || 4 GiB per bank&amp;lt;br&amp;gt;(8 GiB total) || 64-bit @ 2.4 GT/s (19.2 GB/s) per bank&amp;lt;br&amp;gt;(38.4 GB/s total) || 8 x 128-bit @ 300 MHz (using 2 banks)&lt;br /&gt;
|-&lt;br /&gt;
| X440 (1600 MHz BW) || 4 GiB per bank&amp;lt;br&amp;gt;(8 GiB total) || 64-bit @ 2.4 GT/s (19.2 GB/s) per bank&amp;lt;br&amp;gt;(38.4 GB/s total) || 2 x 512-bit @ 300 MHz (using 2 banks)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== What DRAM data rates can I expect on each USRP? ===&lt;br /&gt;
&lt;br /&gt;
DRAM performance is highly application-specific. For example, reading vs. reading and writing simultaneously, one data stream vs. multiple data streams, random access vs. sequential access, etc., can give dramatically different performance. Below are some measurements taken on different USRPs where a Null-Source-Sink RFNoC block is directly connected to a DMA FIFO block to test maximum streaming rates through the DRAM. The DRAM is shared between channels, so throughput goes down as the number of channels going through the DRAM is increased.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Example DRAM Throughput (Per Channel)&lt;br /&gt;
|-&lt;br /&gt;
! USRP Model !! BIST (MB/s) !! 1 Ch (MS/s) !! 2 Ch (MS/s) !! 3 Ch (MS/s) !! 4 Ch (MS/s)&lt;br /&gt;
|-&lt;br /&gt;
| E31x || 666 || 166 || 91 || N/A || N/A&lt;br /&gt;
|-&lt;br /&gt;
| E320 || 1361 || 340 || 299 || 191 || 148&lt;br /&gt;
|-&lt;br /&gt;
| N3xx || 1368 || 341 || 295 || 191 || 144&lt;br /&gt;
|-&lt;br /&gt;
| X3xx || 1347 || 336 || 274 || N/A || N/A&lt;br /&gt;
|-&lt;br /&gt;
| X410 (100 and 200 MHz BW) || 1288 || 321|| 316|| 314 || 303&lt;br /&gt;
|-&lt;br /&gt;
| X410 (400 MHz BW) || 2801 || 697 || 672 || 672 || 672&lt;br /&gt;
|-&lt;br /&gt;
| X440 (400 MHz BW) || 3360 || 798 || 784 || 616 || 461&lt;br /&gt;
|-&lt;br /&gt;
| X440 (1600 MHz BW) || 8118 || 2007 || 2007 || N/A || N/A&lt;br /&gt;
|}&lt;br /&gt;
Notes:&lt;br /&gt;
# E31x, N3xx, and X410 were tested using UHD 4.2. E320 and X3xx were tested using UHD 4.3.&lt;br /&gt;
# BIST refers to the built-in self test, which gives a measure of raw data throughput for a single channel.&lt;br /&gt;
# For MS/s, we assume 4 bytes per sample (sc16).&lt;br /&gt;
# X410 with 400 MHz bandwidth uses two independent memory banks, with channels 0-1 on Bank 0, and channels 2-3 on Bank 1 by default. The traffic flows on Bank 0 and Bank 1 are independent and do not affect each other. Therefore, a 4-channel configuration has the same performance as a 2-channel configuration.&lt;br /&gt;
# X440 uses two independent memory banks. For 400 MHz, channels 0-3 are on Bank 0 and channels 4-7 are on Bank 1 by default. For 1600 MHz, channel 0 is on Bank 0 and channel 1 is on bank 1 by default. The traffic flows on Bank 0 and Bank 1 are independent and do not affect each other. Therefore, a 2-channel configuration has the same performance as a 1-channel configuration.&lt;br /&gt;
&lt;br /&gt;
=== What can the DRAM be used for? ===&lt;br /&gt;
&lt;br /&gt;
* '''DMA FIFO Block:''' The DMA FIFO block is used in situations where you need a large buffer to store samples.&lt;br /&gt;
&lt;br /&gt;
* '''Replay Block:''' The Replay block is used to record and play back RF data. For example, you can record data from a host computer, then play it back over the radio. Or, record data from the radio, then play it back later to the host for analysis, or play it back to a radio at a specific timestamp. See [[Using the RFNoC Replay Block in UHD 4]] for additional information. The Replay block also has a FIFO capability for situations in which the DMA FIFO block is not available in your FPGA image.&lt;br /&gt;
&lt;br /&gt;
* '''Custom Blocks:''' You can also create your own RFNoC block that uses DRAM. Refer to the DMA FIFO and/or Replay blocks as examples.&lt;br /&gt;
&lt;br /&gt;
=== How do I add the Replay/DMA FIFO block to my FPGA image? ===&lt;br /&gt;
&lt;br /&gt;
If the block you want is not included by default in the FPGA image you are using, you can add it to the RFNoC image core YAML file and rebuild the FPGA image using Vivado. See [[Getting Started with RFNoC in UHD 4.0]] for additional information on customizing an RFNoC image.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' DRAM is not enabled by default on E31x FPGA builds because the FPGA is not large enough to fit the default image with DRAM. You will need to remove components from your RFNoC image's YAML file to make room, then build the E31x image with the variable DRAM=1 set, or modify the E31x Makefile to enable DRAM by default.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' The default DRAM configuration used for X410 and X440 changes depending on the configured bandwidth. The default parameters to use for each image type is shown in the table below.&lt;br /&gt;
&lt;br /&gt;
When adding the blocks to your RFNoC image core YAML file, the parameters must be set correctly for the type of USRP you intend to use. The memory data width (&amp;lt;code&amp;gt;MEM_DATA_W&amp;lt;/code&amp;gt;) and address width (&amp;lt;code&amp;gt;MEM_ADDR_W&amp;lt;/code&amp;gt;) must match exactly. The number of ports (&amp;lt;code&amp;gt;NUM_PORTS&amp;lt;/code&amp;gt;) must not exceed the maximum number available. You can use fewer ports to save resources if you don't need all the DRAM ports.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ RFNoC Block Memory Parameters&lt;br /&gt;
|-&lt;br /&gt;
! USRP Model !! MEM_DATA_W !! MEM_ADDR_W !! NUM_PORTS (Max)&lt;br /&gt;
|-&lt;br /&gt;
| E31x || 64 || 29 || 2&lt;br /&gt;
|-&lt;br /&gt;
| E320 || 64 || 31 || 4&lt;br /&gt;
|-&lt;br /&gt;
| N3xx || 64 || 31 || 4&lt;br /&gt;
|-&lt;br /&gt;
| X3xx || 64 || 30 || 2&lt;br /&gt;
|-&lt;br /&gt;
| X410 (100 and 200 MHz BW) || 64 || 32 || 4&lt;br /&gt;
|-&lt;br /&gt;
| X410 (400 MHz BW) || 128 || 32 || 4&lt;br /&gt;
|-&lt;br /&gt;
| X440 (400 MHz BW) || 128 || 32 || 8&lt;br /&gt;
|-&lt;br /&gt;
| X440 (1600 MHz BW) || 512 || 32 || 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The DMA FIFO has a few additional parameters that should be provided. The clock rate (&amp;lt;code&amp;gt;MEM_CLK_RATE&amp;lt;/code&amp;gt;) must match the value below for the built-in self test (BIST) to work correctly. The base address (&amp;lt;code&amp;gt;FIFO_ADDR_BASE&amp;lt;/code&amp;gt;) and address mask (&amp;lt;code&amp;gt;FIFO_ADDR_MASK&amp;lt;/code&amp;gt;) are written as Verilog constants and can be changed depending on your application. The &amp;lt;code&amp;gt;FIFO_ADDR_BASE&amp;lt;/code&amp;gt; parameter contains the byte address for the first byte of the memory region to use for each port. The &amp;lt;code&amp;gt;FIFO_ADDR_MASK&amp;lt;/code&amp;gt; parameter contains the address mask for each port, which tells the FIFO how much memory to use for each port. For example, an address mask of &amp;lt;code&amp;gt;30'h1FFFFFFF&amp;lt;/code&amp;gt; means that 0x1FFFFFFF+1 bytes (i.e., 0x20000000 bytes or 512 MiB) will be used by the corresponding port. The address mask must be 1 less than a power of 2.&lt;br /&gt;
&lt;br /&gt;
The example values in the table below use the entire memory and divide it evenly between all available ports. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ DMA FIFO Parameters&lt;br /&gt;
|-&lt;br /&gt;
! USRP Model !! MEM_CLK_RATE !! FIFO_ADDR_BASE !! FIFO_ADDR_MASK&lt;br /&gt;
|-&lt;br /&gt;
| E31x || &amp;quot;200e6&amp;quot; || &amp;quot;{29'h10000000, 29'h00000000}&amp;quot; || &amp;quot;{29'h0FFFFFFF, 29'h0FFFFFFF}&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| E320 || &amp;quot;300e6&amp;quot; || &amp;quot;{31'h60000000, 31'h40000000, 31'h20000000, 31'h00000000}&amp;quot; || &amp;quot;{31'h1FFFFFFF, 31'h1FFFFFFF, 31'h1FFFFFFF, 31'h1FFFFFFF}&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| N3xx || &amp;quot;303819444&amp;quot; || &amp;quot;{31'h60000000, 31'h40000000, 31'h20000000, 31'h00000000}&amp;quot; || &amp;quot;{31'h1FFFFFFF, 31'h1FFFFFFF, 31'h1FFFFFFF, 31'h1FFFFFFF}&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| X3xx || &amp;quot;300e6&amp;quot; || &amp;quot;{30'h20000000, 30'h00000000}&amp;quot; || &amp;quot;{30'h1FFFFFFF, 30'h1FFFFFFF}&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| X410 (100 and 200 MHz BW) || &amp;quot;250e6&amp;quot; || &amp;quot;{32'hC0000000, 32'h80000000, 32'h40000000, 32'h00000000}&amp;quot; || &amp;quot;{32'h3FFFFFFF, 32'h3FFFFFFF, 32'h3FFFFFFF, 32'h3FFFFFFF}&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| X410 (400 MHz BW) || &amp;quot;250e6&amp;quot; || &amp;quot;{32'h80000000, 32'h00000000, 32'h80000000, 32'h00000000}&amp;quot; || &amp;quot;{32'h7FFFFFFF, 32'h7FFFFFFF, 32'h7FFFFFFF, 32'h7FFFFFFF}&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| X440 (400 MHz BW) || &amp;quot;300e6&amp;quot; || &amp;quot;{32'hC0000000, 32'h80000000, 32'h40000000, 32'h00000000, 32'hC0000000, 32'h80000000, 32'h40000000, 32'h00000000}&amp;quot; || &amp;quot;{32'h3FFFFFFF, 32'h3FFFFFFF, 32'h3FFFFFFF, 32'h3FFFFFFF, 32'h3FFFFFFF, 32'h3FFFFFFF, 32'h3FFFFFFF, 32'h3FFFFFFF}&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| X440 (1600 MHz BW) || &amp;quot;300e6&amp;quot; || &amp;quot;{32'h00000000, 32'h00000000}&amp;quot; || &amp;quot;{32'hFFFFFFFF, 32'hFFFFFFFF}&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Replay Example ====&lt;br /&gt;
&lt;br /&gt;
See [https://github.com/EttusResearch/uhd/blob/197cdc4f665cbd4e6394a7eeb44b405f67ab10b1/fpga/usrp3/top/x300/x310_rfnoc_image_core.yml#L69 x310_rfnoc_image_core.yml] for an example of how to instantiate the Replay block in the RFNoC image core YAML description. The following is a generic example that can be used for any USRP:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
noc_blocks:&lt;br /&gt;
  # Instantiate the replay block&lt;br /&gt;
  replay0:&lt;br /&gt;
    block_desc: 'replay.yml'&lt;br /&gt;
    parameters:&lt;br /&gt;
      NUM_PORTS: &amp;lt;see table&amp;gt;&lt;br /&gt;
      MEM_DATA_W: &amp;lt;see table&amp;gt;&lt;br /&gt;
      MEM_ADDR_W: &amp;lt;see table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
connections:&lt;br /&gt;
  # Connect each port of the replay block to a stream endpoint&lt;br /&gt;
  - { srcblk: &amp;lt;epN&amp;gt;,   srcport: out0,  dstblk: replay0, dstport: in_0 }&lt;br /&gt;
  - { srcblk: replay0, srcport: out_0, dstblk: &amp;lt;epN&amp;gt;,   dstport: in0  }&lt;br /&gt;
  - { srcblk: &amp;lt;epN+1&amp;gt;, srcport: out0,  dstblk: replay0, dstport: in_1 }&lt;br /&gt;
  - { srcblk: replay0, srcport: out_1, dstblk: &amp;lt;epN+1&amp;gt;, dstport: in0  }&lt;br /&gt;
  ... repeat for each remaining Replay port&lt;br /&gt;
  # Connect the replay block memory interface to the USRP DRAM&lt;br /&gt;
  - { srcblk: replay0, srcport: axi_ram, dstblk: _device_, dstport: dram }&lt;br /&gt;
&lt;br /&gt;
Connect the DRAM clock to the block:&lt;br /&gt;
clk_domains:&lt;br /&gt;
  # Connect the DRAM clock to the replay block&lt;br /&gt;
  - { srcblk: _device_, srcport: dram, dstblk: replay0, dstport: mem }&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DMA FIFO Example ====&lt;br /&gt;
&lt;br /&gt;
See [https://github.com/EttusResearch/uhd/blob/197cdc4f665cbd4e6394a7eeb44b405f67ab10b1/fpga/usrp3/top/e320/e320_rfnoc_image_core.yml#L49 e320_rfnoc_image_core.yml] for an example of how to instantiate the DMA FIFO block in the RFNoC image core YAML description. The following is a generic example that can be used for any USRP:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
noc_blocks:&lt;br /&gt;
  # Instantiate the DMA FIFO block&lt;br /&gt;
  fifo0:&lt;br /&gt;
    block_desc: 'axi_ram_fifo.yml'&lt;br /&gt;
    parameters:&lt;br /&gt;
      NUM_PORTS: &amp;lt;see table&amp;gt;&lt;br /&gt;
      MEM_DATA_W: &amp;lt;see table&amp;gt;&lt;br /&gt;
      MEM_ADDR_W: &amp;lt;see table&amp;gt;&lt;br /&gt;
      FIFO_ADDR_BASE: &amp;lt;see table&amp;gt;&lt;br /&gt;
      FIFO_ADDR_MASK: &amp;lt;see table&amp;gt;&lt;br /&gt;
      MEM_CLK_RATE: &amp;lt;see table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
connections:&lt;br /&gt;
  # Connect each port of the DMA FIFO block to a stream endpoint, or insert it&lt;br /&gt;
  # into the data path where desired. This examples uses stream endpoints.&lt;br /&gt;
  - { srcblk: &amp;lt;epN&amp;gt;,   srcport: out0,  dstblk: fifo0,   dstport: in_0 }&lt;br /&gt;
  - { srcblk: replay0, srcport: out_0, dstblk: &amp;lt;epN&amp;gt;,   dstport: in0  }&lt;br /&gt;
  - { srcblk: &amp;lt;epN+1&amp;gt;, srcport: out0,  dstblk: fifo0,   dstport: in_1 }&lt;br /&gt;
  - { srcblk: fifo0,   srcport: out_1, dstblk: &amp;lt;epN+1&amp;gt;, dstport: in0  }&lt;br /&gt;
  ... repeat for each remaining FIFO port&lt;br /&gt;
  # Connect the DMA FIFO block memory interface to the USRP DRAM&lt;br /&gt;
  - { srcblk: fifo0, srcport: axi_ram, dstblk: _device_, dstport: dram }&lt;br /&gt;
&lt;br /&gt;
clk_domains:&lt;br /&gt;
  # Connect the DRAM clock to the replay block&lt;br /&gt;
  - { srcblk: _device_, srcport: dram, dstblk: fifo0,  dstport: mem }&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== RFNoC Clocks ==&lt;br /&gt;
&lt;br /&gt;
=== What clocks are available for me to use? ===&lt;br /&gt;
&lt;br /&gt;
Each device has different clocks available. See below for a list of clocks exposed to RFNoC. Although they have intended purposes, you can use any of these clocks for any purpose. The &amp;lt;code&amp;gt;rfnoc_chdr_clock&amp;lt;/code&amp;gt; is a good default choice. This clock is always available in your block, even if it is not explicitly connected in the RFNoC image YAML description.&lt;br /&gt;
&lt;br /&gt;
=== What are the clock frequencies? ===&lt;br /&gt;
&lt;br /&gt;
See the table below for the clock rates. The radio clock rate depends on the master clock rate.&lt;br /&gt;
&lt;br /&gt;
====E31x====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Clock Name !! Description !! Frequency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_chdr&amp;lt;/code&amp;gt; || RFNoC CHDR clock || 100 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_ctrl&amp;lt;/code&amp;gt; || RFNoC Control clock || 40 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dram&amp;lt;/code&amp;gt; || DRAM interface clock || 100 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt; || Radio interface clock || Same as master clock rate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====E320====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Clock Name !! Description !! Frequency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_chdr&amp;lt;/code&amp;gt; || RFNoC CHDR clock || 200 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_ctrl&amp;lt;/code&amp;gt; || RFNoC Control clock || 40 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dram&amp;lt;/code&amp;gt; || DRAM interface clock || 166.667 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt; || Radio interface clock || Same as master clock rate (200 kHz to 61.44 MHz)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====N300/N310====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Clock Name !! Description !! Frequency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_chdr&amp;lt;/code&amp;gt; || RFNoC CHDR clock || 200 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_ctrl&amp;lt;/code&amp;gt; || RFNoC Control clock || 40 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ce&amp;lt;/code&amp;gt; || Compute Engine clock || 266.667 MHz (available in UHD 4.6 and later)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dram&amp;lt;/code&amp;gt; || DRAM interface clock || 303.819 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt; || Radio interface clock || Same as master clock rate (122.88 MHz, 125.0 MHz, or 153.6 MHz)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====N32x====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Clock Name !! Description !! Frequency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_chdr&amp;lt;/code&amp;gt; || RFNoC CHDR clock || 200 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_ctrl&amp;lt;/code&amp;gt; || RFNoC Control clock || 40 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ce&amp;lt;/code&amp;gt; || Compute Engine clock || 266.667 MHz (available in UHD 4.6 and later)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dram&amp;lt;/code&amp;gt; || DRAM interface clock || 303.819 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt; || Radio interface clock || Same as master clock rate (200 MHz, 245.76 MHz, or 250 MHz)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====X3xx====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Clock Name !! Description !! Frequency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_chdr&amp;lt;/code&amp;gt; || RFNoC CHDR clock || 187.5 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_ctrl&amp;lt;/code&amp;gt; || RFNoC Control clock || 93.75 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ce&amp;lt;/code&amp;gt; || Compute Engine clock || 214.286 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dram&amp;lt;/code&amp;gt; || DRAM interface clock || 300 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt; || Radio interface clock || Same as master clock rate (184.32 MHz or 200 MHz)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====X410====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Clock Name !! Description !! Frequency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_chdr&amp;lt;/code&amp;gt; || RFNoC CHDR clock || 200 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_ctrl&amp;lt;/code&amp;gt; || RFNoC Control clock || 40 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ce&amp;lt;/code&amp;gt; || Compute Engine clock || 266.667 MHz (available in UHD 4.6 and later)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dram&amp;lt;/code&amp;gt; || DRAM interface clock || 250 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt; || Radio interface clock || 122.88 MHz when master clock rate is 122.88, 245.76, or 491.52 MHz&amp;lt;br&amp;gt;125 MHz when master clock rate is 125, 250, or 500 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio_2x&amp;lt;/code&amp;gt; || Radio interface clock 2x || Twice the frequency of &amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====X440====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Clock Name !! Description !! Frequency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_chdr&amp;lt;/code&amp;gt; || RFNoC CHDR clock || 200 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_ctrl&amp;lt;/code&amp;gt; || RFNoC Control clock || 40 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ce&amp;lt;/code&amp;gt; || Compute Engine clock || 266.667 MHz (available in UHD 4.6 and later)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dram&amp;lt;/code&amp;gt; || DRAM interface clock || 300 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio0&amp;lt;/code&amp;gt; || Radio interface clock for daughterboard 0 || Daughterboard 0 master clock rate divided by 8 (e.g., 62.5 MHz if master clock rate is 500 MHz)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio1&amp;lt;/code&amp;gt; || Radio interface clock for daughterboard 1 || Daughterboard 1 master clock rate divided by 8&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio0_2x&amp;lt;/code&amp;gt; || Radio interface clock 2x for daughterboard 0 || Twice the frequency of &amp;lt;code&amp;gt;radio0&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio1_2x&amp;lt;/code&amp;gt; || Radio interface clock 2x for daughterboard 1 || Twice the frequency of &amp;lt;code&amp;gt;radio1&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== How do I add a clock with a different frequency? ===&lt;br /&gt;
&lt;br /&gt;
If you only need the clock within your own RFNoC block, you can modify the HDL for your block to generate the clock that you need from one of the available clocks. To do this, add a new clock to your block's YAML description, connect the available clock to your block in the YAML description of your RFNoC image, then add a Xilinx MMCM IP instance to your block's HDL and connect the available clock to its input.&lt;br /&gt;
&lt;br /&gt;
Starting with UHD 4.7, you can add clock generation modules that create new clocks based on the existing clocks. Note that you must create such a module as an HDL module: Describing clocks in the YAML files will not cause them to be generated for you.&lt;br /&gt;
&lt;br /&gt;
Assuming you have such a module, describe the clocks in the module's YAML files as such:&lt;br /&gt;
&lt;br /&gt;
 clocks:&lt;br /&gt;
    - name: ce&lt;br /&gt;
      direction: in&lt;br /&gt;
    - name: my_clk&lt;br /&gt;
      direction: out&lt;br /&gt;
&lt;br /&gt;
Now you will have a new clock called &amp;lt;code&amp;gt;my_clk&amp;lt;/code&amp;gt;, which is derived from the &amp;lt;code&amp;gt;ce&amp;lt;/code&amp;gt; clock.&lt;br /&gt;
&lt;br /&gt;
In older versions of UHD, adding custom clocks is not directly supported. If you can't use any of the available clocks, you can modify the HDL code to generate a clock.&lt;br /&gt;
&lt;br /&gt;
If the clock is needed by multiple RFNoC blocks, or if you want to change an existing clock, you can modify the HDL for the USRP you are using to add or change a clock. If you add a new clock to the RFNoC image core, you must also update the BSP YAML file (located in [https://github.com/EttusResearch/uhd/tree/master/host/include/uhd/rfnoc/core &amp;lt;repo&amp;gt;/host/include/uhd/rfnoc/core]) so that the &amp;lt;code&amp;gt;rfnoc_image_builder&amp;lt;/code&amp;gt; knows that the clock exists. How and where the clocks are generated varies between USRPs. Please refer to the source code for that USRP ([https://github.com/EttusResearch/uhd/tree/master/fpga/usrp3/top &amp;lt;repo&amp;gt;/fpga/usrp3/top]).&lt;br /&gt;
&lt;br /&gt;
== Xilinx Vivado ==&lt;br /&gt;
&lt;br /&gt;
=== Do I need a Vivado license to build FPGA images? ===&lt;br /&gt;
&lt;br /&gt;
All RFNoC-capable USRPs use Xilinx FPGAs that require a license to use Vivado, except for E31x USRPs, which can use the free Vivado HL WebPACK Edition. Vivado is required to build FPGAs for RFNoC.&lt;br /&gt;
&lt;br /&gt;
=== Which version and edition of Vivado should I install? ===&lt;br /&gt;
&lt;br /&gt;
You should always use the Vivado version specified in the UHD documentation for your UHD release, including any required patches. See the [https://files.ettus.com/manual/md_usrp3_build_instructions.html UHD User Manual] for the latest Vivado version requirements.&lt;br /&gt;
&lt;br /&gt;
The exact version string can be found in the &amp;lt;code&amp;gt;setupenv.sh&amp;lt;/code&amp;gt; script for the FPGA target you intend to build (e.g., &amp;lt;code&amp;gt;fpga/usrp3/top/x400/setupenv.sh&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Do I need to install all components of Vivado? ===&lt;br /&gt;
&lt;br /&gt;
No. You only need to install device support for the FPGA you intend to build. Other devices can be unchecked to save disk space. The following FPGA types are used by USRPs:&lt;br /&gt;
&lt;br /&gt;
* '''SoCs &amp;gt; Zynq-7000:''' E31x, E320, N3xx&lt;br /&gt;
* '''SOCs &amp;gt; Zynq UltraScale+ RFSoC:''' X410&lt;br /&gt;
* '''7 Series &amp;gt; Kintex-7''': X3xx&lt;br /&gt;
&lt;br /&gt;
The Software Development Kit (SDK) is typically not required, but can be installed if desired.&lt;br /&gt;
&lt;br /&gt;
The Cable Drivers are needed if you plan to do JTAG download or debug. Note that on Linux, the cable drivers are copied to the install folder, but are not installed onto your system automatically. See Xilinx UG973 for instructions on installing the cable drivers on Linux.&lt;br /&gt;
&lt;br /&gt;
=== How do I get Vivado 2021.1 to work on Ubuntu 22.04 and later? ===&lt;br /&gt;
&lt;br /&gt;
Vivado needs the &amp;lt;code&amp;gt;libncurses5&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;libtinfo5&amp;lt;/code&amp;gt;, which are no longer included by default in recent Ubuntu installations. To install them, run the following commands:&lt;br /&gt;
&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 wget http://security.ubuntu.com/ubuntu/pool/universe/n/ncurses/libtinfo5_6.3-2ubuntu0.1_amd64.deb&lt;br /&gt;
 sudo apt install ./libtinfo5_6.3-2ubuntu0.1_amd64.deb&lt;br /&gt;
 wget http://security.ubuntu.com/ubuntu/pool/universe/n/ncurses/libncurses5_6.3-2ubuntu0.1_amd64.deb&lt;br /&gt;
 sudo apt install ./libncurses5_6.3-2ubuntu0.1_amd64.deb&lt;br /&gt;
&lt;br /&gt;
=== Can I use a different Vivado version? ===&lt;br /&gt;
&lt;br /&gt;
While it is technically possible to use a different Vivado version, doing so comes with significant risks. Vivado versions are not fully compatible with each other, and changing the version usually leads to FPGA build failures. Furthermore, the shipping FPGA images for each UHD release are tested and validated using the specified Vivado version. Other versions are untested. For these reasons, the build process checks the Vivado version and will raise an error if you run &amp;lt;code&amp;gt;setupenv.sh&amp;lt;/code&amp;gt; with an unsupported version installed.&lt;br /&gt;
&lt;br /&gt;
Because alternative versions are untested, using a different Vivado version is strongly discouraged. If you choose to proceed anyway, you must:&lt;br /&gt;
&lt;br /&gt;
* Update the Vivado version string in the setupenv.sh script for your FPGA target.&lt;br /&gt;
* Update all IP blocks to versions compatible with the new Vivado release, and modify any connections in the USRP code to match the updated IP interfaces. Failure to update the IP blocks will result in errors about the IP being locked. Incorrect or incomplete updates to IP connections may cause build failures or result in a non-functional FPGA image.&lt;br /&gt;
* Additional changes may be required depending on the Vivado version and the specific USRP target you are building. Unfortunately, it's not possible to predict these changes in advance.&lt;br /&gt;
&lt;br /&gt;
== Building FPGA Images ==&lt;br /&gt;
&lt;br /&gt;
=== Why did my FPGA build fail to meet timing constraints? ===&lt;br /&gt;
&lt;br /&gt;
FPGAs have clocks that trigger the transfer of data between internal registers. The Vivado tool does a timing check near the end of the build to ensure that the paths from each driving register or port to each receiving register or port are not too long for the specified clock period or delay constraints. When it says &amp;quot;The design did not satisfy timing constraints&amp;quot; it means that Vivado couldn't arrange the logic on the chip in a way that meets all requirements. There are several reasons this might happen:&lt;br /&gt;
&lt;br /&gt;
* You added new logic to the design with too much logic between registers. In this case, you should modify your design to make meeting timing easier.&lt;br /&gt;
* You added new logic, but made a mistake in which you're trying to use the wrong clock or reset, which makes it difficult to meet timing. In this case you need to correct the mistake in your design.&lt;br /&gt;
* The design has become too crowded, making it difficult for the tools to meet the timing requirements. In this case you need to remove something to make more room.&lt;br /&gt;
* Bad luck. The tools use pseudorandom algorithms to find solutions to really hard problems, and sometimes it doesn't find a good solution even when one is possible. In this case you can make a minor change to the design and build again to see if it does better the second time. If you don't change anything, Vivado will normally give you identical results for each build. In UHD 4.4 and later you can add the &amp;lt;code&amp;gt;BUILD_SEED=1&amp;lt;/code&amp;gt; option to the &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; arguments to change a build seed that will affect the build results. Using a different seed number for each build will ensure that you get a unique build result each time. 0 is the default seed if not specified. Random build failures occur occasionally for some FPGA targets, in which case you should retry the build with a different seed.&lt;br /&gt;
&lt;br /&gt;
The FPGA tools produce a timing report that says exactly which path failed to meet timing. Sometimes that can point you in the right direction. But sometimes the path indicated only failed because of another path that's even more difficult. Open &amp;lt;code&amp;gt;post_route_timing_summary.rpt&amp;lt;/code&amp;gt; in the build output folder and search for &amp;quot;(VIOLATED)&amp;quot; to find the path(s) that failed.&lt;br /&gt;
&lt;br /&gt;
=== My design doesn't fit in the FPGA. What can I do to reduce the size? ===&lt;br /&gt;
&lt;br /&gt;
Read the &amp;lt;code&amp;gt;post_synth_util.rpt&amp;lt;/code&amp;gt; to determine what resource(s) you are running out of in order to know what kinds of changes are needed. Below are several easy ways to reduce the resource utilization of the FPGA.&lt;br /&gt;
&lt;br /&gt;
* If you are not using all RF channels of your device, modify the FPGA YAML file to remove the DDC, DUC, and Radio blocks for the unused channels, then regenerate the FPGA code using &amp;lt;code&amp;gt;rfnoc_image_builder&amp;lt;/code&amp;gt;. Note that you may need at least one Radio block for RFNoC to work properly. You may also remove the DDC and/or the DUC if your application uses full bandwidth for one or more channels and therefore doesn't require up or down conversion.&lt;br /&gt;
* If you are not using DRAM, remove the Replay or DMA FIFO blocks. Also, on X4xx, change the &amp;lt;code&amp;gt;DRAM_CH&amp;lt;/code&amp;gt; variable to 0 in the Makefile for the FPGA target you are building.&lt;br /&gt;
* If you do not need all SFP ports, use a build target that matches your needs. For example, on X4xx, the &amp;quot;X1&amp;quot; option (one 10 Gbps lane) uses the least resources whereas &amp;quot;X4&amp;quot; (four 10 Gbps lanes) uses a lot more, and the &amp;quot;CG&amp;quot; option (four 25 Gbps lanes) uses the most.&lt;br /&gt;
* If you do not need the full bandwidth of the device, use a smaller bandwidth option. For example, on X410, the &amp;quot;_100&amp;quot; option (100 MHz bandwidth) uses less resources than the &amp;quot;_200&amp;quot; option (200 MHz bandwidth).&lt;br /&gt;
* Add the &amp;lt;code&amp;gt;crossbar_routes&amp;lt;/code&amp;gt; definition to the FPGA YAML file to include only the crossbar paths required for your application. This is an advanced feature in UHD 4.5 and later. This must be done carefully to avoid removing essential paths. See the X440 YAML files for examples.&lt;br /&gt;
&lt;br /&gt;
Other reductions are possible but require advanced knowledge of UHD and/or RFNoC to avoid breaking key functionality of the device.&lt;br /&gt;
&lt;br /&gt;
=== How do I create a Vivado project for my FPGA build? ===&lt;br /&gt;
&lt;br /&gt;
Vivado supports two modes of operation known as &amp;quot;project mode&amp;quot; and &amp;quot;non-project mode&amp;quot;. Project mode is more user-friendly because it creates a project file that is managed by Vivado and works natively in the Vivado GUI. Non-project mode is generally used by more advanced users who want full control over the Vivado build process and is typically used in fully scripted or automated build flows. The USRP build flow in UHD uses non-project mode. As a result, there is no Vivado project file by default.&lt;br /&gt;
&lt;br /&gt;
It is possible to create a project file from the USRP build flow with the following steps:&lt;br /&gt;
&lt;br /&gt;
# Start the USRP FPGA build in the GUI. In UHD 4.7 and later, this can be done by adding the &amp;lt;code&amp;gt;-g&amp;lt;/code&amp;gt; argument to the &amp;lt;code&amp;gt;rfnoc_image_builder&amp;lt;/code&amp;gt; command. In UHD 4.6 and earlier, this can be done by adding &amp;lt;code&amp;gt;GUI=1&amp;lt;/code&amp;gt; to the &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; arguments. Example: &amp;lt;code&amp;gt;make X410_X4_200 GUI=1&amp;lt;/code&amp;gt;&lt;br /&gt;
# After the build completes, run the following command in the TCL Console of Vivado to create the project file and switch to project mode:&amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;save_project_as project_name project_dir&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;In this example, &amp;quot;project_name&amp;quot; is the name you want to give the project file and &amp;quot;project_dir&amp;quot; is the directory in which you want to put the project.&lt;br /&gt;
# Set the compile order to automatic: &amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;set_property source_mgmt_mode All [current_project]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In some cases, it may also be necessary to reset the output products for some of the IP. If you get an error message about a BD sub-design being not generated for the synthesis target, then navigate to the &amp;quot;IP Sources&amp;quot; tab in the Project Manager Sources window, then right-click on affected IP and select &amp;quot;Reset Output Products...&amp;quot;, then click &amp;quot;Reset&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
This project file can now be used independently of the normal FPGA build flow in UHD. It is up to the user to update this project file as the design changes since it will not be managed by the normal build flow in UHD.&lt;br /&gt;
&lt;br /&gt;
=== My FPGA takes a long time to build. What can I do to make builds faster? ===&lt;br /&gt;
&lt;br /&gt;
High-performance computers are recommended for FPGA builds since an FPGA build can take several hours.&lt;br /&gt;
&lt;br /&gt;
The build process is divided into two steps, IP generation and the FPGA build.&lt;br /&gt;
&lt;br /&gt;
==== IP Generation ====&lt;br /&gt;
&lt;br /&gt;
This process can take several hours by default and is run automatically, if needed, when you build an FPGA target. Fortunately, this only needs to be done once for each USRP type and won't run again unless IP is changed.&lt;br /&gt;
&lt;br /&gt;
You can speed up the IP generation by running this step with multiple jobs. For example:&lt;br /&gt;
&lt;br /&gt;
    $ make -j 4 X410_IP&lt;br /&gt;
&lt;br /&gt;
This example will build four IP cores at a time. Note that this generally requires 4 times as much memory and needs at least 4 CPU cores. You can adjust the number of parallel jobs based on the amount of system memory and/or CPU cores you have available.&lt;br /&gt;
&lt;br /&gt;
==== FPGA Build ====&lt;br /&gt;
&lt;br /&gt;
Unfortunately, increasing the number of jobs does not speed up FPGA performance because there is only one Vivado instance for the FPGA build. Vivado, by default, will use multiple CPU cores, where possible, but this does not significantly improve build performance since many parts of the build are not easily parallelizable.&lt;br /&gt;
&lt;br /&gt;
One way to shorten the build time is to reduce the size of the design. See above on how to reduce the size of your design.&lt;br /&gt;
&lt;br /&gt;
In the case where you need to build multiple FPGA types, you can use the jobs option with &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; to build multiple FPGAs simultaneously, which can dramatically reduce the time required per build. Note that this requires a significant amount of memory and CPU cores and therefore is only recommended for systems that can handle such loads. An example is shown below for building two FPGA images in parallel:&lt;br /&gt;
&lt;br /&gt;
    $ make -j 2 X410_X4_200 X410_CG_400&lt;br /&gt;
&lt;br /&gt;
It is also possible to open separate terminal instances and run one build in each instance to get the same effect. Do not build the same FPGA target in multiple instances, since multiple builds for the same target would conflict as they try to access and update the same files.&lt;br /&gt;
&lt;br /&gt;
=== When I start an FPGA build or use rfnoc_image_builder, I get an error &amp;quot;setupenv.sh: source: not found&amp;quot; and the build fails. What happened? ===&lt;br /&gt;
&lt;br /&gt;
In some Linux distributions (e.g. Ubuntu) &amp;lt;code&amp;gt;dash&amp;lt;/code&amp;gt; is set as default shell which can cause FPGA builds to fail.&lt;br /&gt;
&lt;br /&gt;
Below is an example of the error. Note, that your message may look somewhat different depending on UHD version and USRP target but the important lines are marked in bold.&lt;br /&gt;
&lt;br /&gt;
    rfnoc_image_builder -y e320_rfnoc_image_core_fft.yml -t E320_1G&lt;br /&gt;
    Using FPGA directory /home/someuser/uhd/fpga&lt;br /&gt;
    Selected device: e320&lt;br /&gt;
    Build artifacts directory already exists (contents will be overwritten).&lt;br /&gt;
    Launching build with the following settings:&lt;br /&gt;
     * FPGA Directory: /home/someuser/uhd/fpga/usrp3/top/e320&lt;br /&gt;
     * Build Artifacts Directory: /home/someuser/uhd/fpga/usrp3/top/e320/build-usrp_e320_fpga_1G&lt;br /&gt;
     * Build Output Directory: /home/someuser/uhd/fpga/usrp3/top/e320/build&lt;br /&gt;
     * Build IP Directory: /home/someuser/uhd/fpga/usrp3/top/e320/build-ip&lt;br /&gt;
    Executing the following command: . ./setupenv.sh &amp;amp;&amp;amp; make E320_1G BUILD_DIR=/home/someuser/uhd/fpga/usrp3/top/e320/build-usrp_e320_fpga_1G IMAGE_CORE_NAME=usrp_e320_fpga_1G&lt;br /&gt;
    '''/bin/sh: 6: ./setupenv.sh: Bad substitution'''&lt;br /&gt;
    '''/bin/sh: 8: ./setupenv.sh: declare: not found'''&lt;br /&gt;
    /bin/sh: 9: ./setupenv.sh: PRODUCT_ID_MAP[E320]=zynq/xc7z045/ffg900/-3: not found&lt;br /&gt;
    '''/bin/sh: 15: ./setupenv.sh: source: not found'''&lt;br /&gt;
    Build finished with return code 127.&lt;br /&gt;
&lt;br /&gt;
It is recommended to set the default shell to &amp;lt;code&amp;gt;bash&amp;lt;/code&amp;gt; by running the following command in the terminal. When asked &amp;lt;code&amp;gt;Use dash as the default system shell (/bin/sh)?&amp;lt;/code&amp;gt; choose &amp;lt;code&amp;gt;&amp;lt;No&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    $ sudo dpkg-reconfigure dash&lt;br /&gt;
&lt;br /&gt;
Confirm your default shell was changed to bash by running this command:&lt;br /&gt;
&lt;br /&gt;
    $ ll /bin/sh&lt;br /&gt;
&lt;br /&gt;
You should see output similar to this:&lt;br /&gt;
&lt;br /&gt;
    lrwxrwxrwx 1 root root 4 Oct 10  2020 /bin/sh -&amp;gt; bash*&lt;br /&gt;
&lt;br /&gt;
=== My FPGA build failed with a cryptic message or no message at all. How do I debug this? ===&lt;br /&gt;
&lt;br /&gt;
When you build an FPGA target, a build directory is created in the FPGA's top directory that contains all the build outputs. Here you'll find the &amp;lt;code&amp;gt;build.log&amp;lt;/code&amp;gt; file as well as report files and checkpoints. Not all log information is printed to the console during build, so make sure you check the &amp;lt;code&amp;gt;build.log&amp;lt;/code&amp;gt; file for details. It may contain a useful error message that was not printed to the console.&lt;br /&gt;
&lt;br /&gt;
Builds often fail when Vivado encounters an internal error or runs out of memory. For internal errors, the error message is typically not very helpful and is often due to a bug in Vivado. When Vivado runs out of memory, it may immediately terminate without giving any error message at all. Consider monitoring the memory usage during the FPGA build to see if you are approaching your system's limit.&lt;br /&gt;
&lt;br /&gt;
If you have made changes to the design, try building an unmodified FPGA image from scratch to ensure the build process is working properly on your system. If this works, try adding your changes incrementally until the section of code causing the problem is identified.&lt;br /&gt;
&lt;br /&gt;
Note that such errors are often beyond the control of Ettus Research and reaching out to Xilinx support is a better option if it is truly a Vivado issue.&lt;br /&gt;
&lt;br /&gt;
=== I get a warning saying that an IP is locked, which results in errors later in the IP generation process. How do I resolve this? ===&lt;br /&gt;
&lt;br /&gt;
Vivado &amp;quot;locks&amp;quot; IP, for example, when it needs to be updated for the running version of Vivado or FPGA device type. This is intended to force the user to fix the issue and to avoid building incompatible IP. Build failures related to IP being locked should never occur during a normal build. The IP version in the UHD repo always matches the Vivado version required for that release of UHD.&lt;br /&gt;
&lt;br /&gt;
This can happen if you have used the wrong version of Vivado or do not have the correct Vivado patches installed. Refer to the &amp;lt;code&amp;gt;Generation 3 USRP Build Documentation&amp;lt;/code&amp;gt; section of the [[UHD and USRP User Manual|UHD Manual] for the required version and patches. When you run the `source setenv.sh` step to setup your environment, the script will check to make sure you are using the correct version.&lt;br /&gt;
&lt;br /&gt;
In some cases, reinstalling Vivado might be required.&lt;br /&gt;
&lt;br /&gt;
Once the correct Vivado version and patches are installed, you will need to remove all build products (to remove any locked IP that was generated) and retry the build. For example:&lt;br /&gt;
&lt;br /&gt;
    $ source setupenv.sh     # Setup environment and check the Vivado version&lt;br /&gt;
    $ make cleanall          # Remove any bad IP that was generated&lt;br /&gt;
    $ make X410_X4_200       # Start the build process again&lt;br /&gt;
&lt;br /&gt;
=== I see a &amp;quot;CRITICAL WARNING&amp;quot; in the build log. Is this expected? ===&lt;br /&gt;
&lt;br /&gt;
There are many critical warnings that appear during the build process that can be safely ignored. For example, you may see the following:&lt;br /&gt;
&lt;br /&gt;
    CRITICAL WARNING: [Vivado 12-1790] Evaluation License Warning: This design contains one or more IP cores that use separately licensed features. If the design has been configured to make use of evaluation features, please note that these features will cease to function after a certain period of time. Please consult the core datasheet to determine whether the core which you have configured will be affected. Evaluation features should NOT be used in production systems.&lt;br /&gt;
&lt;br /&gt;
The FPGA builds include IP for which the licenses are included with Vivado, but Vivado prints the warnings anyway. As long as you have a Vivado license and a bitstream was successfully generated, the IP should work as expected.&lt;br /&gt;
&lt;br /&gt;
=== Why does my build fail when I use a custom SystemVerilog package with in my RFNoC block? ===&lt;br /&gt;
&lt;br /&gt;
One potential cause is due to the order of files in your block's Makefile.srcs. The SystemVerilog file with the package definition must be listed ''before'' any other module that imports the package. Otherwise, Vivado will fail with a &amp;quot;X is not declared&amp;quot; error during synthesis.&lt;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Knowledge_Base&amp;diff=6220</id>
		<title>Knowledge Base</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Knowledge_Base&amp;diff=6220"/>
				<updated>2025-10-09T13:48:32Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: Add RFNoC FAQ link&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;
&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://files.ettus.com/manual/ 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>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=RFNoC_Frequently_Asked_Questions&amp;diff=6148</id>
		<title>RFNoC Frequently Asked Questions</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=RFNoC_Frequently_Asked_Questions&amp;diff=6148"/>
				<updated>2025-07-23T07:00:32Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: Add how to install libraries required for Vivado 2021.1 installation on Ubuntu&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Configuring the Stream Endpoint Buffer Size in RFNoC ==&lt;br /&gt;
&lt;br /&gt;
=== What is the SEP buffer size? ===&lt;br /&gt;
&lt;br /&gt;
Each stream endpoint (SEP) has an ingress buffer to store data received from others stream endpoints. This size of this buffer affects the data transfer rate that can be achieved when streaming to that endpoint. A larger ingress buffer in the stream endpoint means that there is more space to put data, minimizing idle time on the network. Additionally, streamers can queue up data before it is needed, reducing the chance of a buffer underflow.&lt;br /&gt;
&lt;br /&gt;
=== How do I set the SEP buffer size? ===&lt;br /&gt;
&lt;br /&gt;
The stream endpoint buffer size is set by adding a parameter under the endpoint you want to configure in the RFNoC image core YAML file. There are two parameters you can use to set the stream endpoint ingress buffer size in your RFNoC image core YAML file.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;buff_size&amp;lt;/code&amp;gt;: Buffer size in CHDR words. The size in bytes depends on the CHDR width. For example, if the &amp;lt;code&amp;gt;chdr_width&amp;lt;/code&amp;gt; parameter for the device is 64, then each CHDR word is 8 bytes. So a buff size of 32768 would be 262,144 bytes or 256 KiB. See [https://github.com/EttusResearch/uhd/blob/197cdc4f665cbd4e6394a7eeb44b405f67ab10b1/fpga/usrp3/top/x300/x310_rfnoc_image_core.yml#L20 here] for an example.&lt;br /&gt;
* &amp;lt;code&amp;gt;buff_size_bytes&amp;lt;/code&amp;gt;:  Buffer size in bytes. See [https://github.com/EttusResearch/uhd/blob/197cdc4f665cbd4e6394a7eeb44b405f67ab10b1/fpga/usrp3/top/x400/x410_200_rfnoc_image_core.yml#L21 here] for an example.&lt;br /&gt;
&lt;br /&gt;
=== To what value should I set the SEP buffer size? ===&lt;br /&gt;
&lt;br /&gt;
The buffer size should be a power of two in size to make optimal use of FPGA RAM resources. The default FPGA bitstreams typically set them to the largest size the FPGA can fit in order to maximize performance. Here are some general recommendations:&lt;br /&gt;
&lt;br /&gt;
* Set to &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; if you don't need to send data to that SEP.&lt;br /&gt;
* Set to &amp;lt;code&amp;gt;8192&amp;lt;/code&amp;gt; bytes (8 KiB = 1 MTU) minimum in order to stream data packets.&lt;br /&gt;
* Set to &amp;lt;code&amp;gt;32768&amp;lt;/code&amp;gt; bytes (32 KiB = 4 MTU) in order to stream at maximum rates between SEPs on the same FPGA.&lt;br /&gt;
* Set to &amp;lt;code&amp;gt;262144&amp;lt;/code&amp;gt; bytes (256 KiB = 32 MTU) or lager for high performance streaming between a host computer and the FPGA.&lt;br /&gt;
&lt;br /&gt;
Note that the requirements are application-dependent, so optimal sizes for your application may be different. MTU refers to the maximum transmission unit, which is the largest CHDR packet supported by the FPGA.&lt;br /&gt;
&lt;br /&gt;
If you need to free up FPGA resources (particularly block RAM) for your application, you can reduce the SEP buffer sizes. Just keep in mind that the maximum streaming rate may be affected.&lt;br /&gt;
&lt;br /&gt;
== USRP DRAM ==&lt;br /&gt;
&lt;br /&gt;
=== How much and what speed DRAM is available on each USRP? ===&lt;br /&gt;
&lt;br /&gt;
The table below summarizes the DRAM that is connected to the USRP for use by RFNoC.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ USRP DRAM Summary&lt;br /&gt;
|-&lt;br /&gt;
! USRP Model !! DRAM Size !! Default DRAM Speed !! Default User Interface&lt;br /&gt;
|-&lt;br /&gt;
| E31x || 512 MiB || 16-bit @ 800 MT/s (1.6 GB/s) || 2 ch x 64-bit @ 100 MHz&lt;br /&gt;
|-&lt;br /&gt;
| E320 || 2 GiB || 32-bit @ 1333 MT/s (5.33 GB/s) || 4 ch x 64-bit @ 300 MHz&lt;br /&gt;
|-&lt;br /&gt;
| N3xx || 2 GiB || 32-bit @ 1300 MT/s (5.2 GB/s) || 4 ch x 64-bit @ 303.819 MHz&lt;br /&gt;
|-&lt;br /&gt;
| X3xx || 1 GiB || 32-bit @ 1200 MT/s (4.8 GB/s) || 2 ch x 64-bit @ 300 MHz&lt;br /&gt;
|-&lt;br /&gt;
| X410 (100 and 200 MHz BW) || 4 GiB || 64-bit @ 2.0 GT/s (16.0 GB/s) || 4 x 64-bit @ 250 MHz&lt;br /&gt;
|-&lt;br /&gt;
| X410 (400 MHz BW) || 4 GiB per bank&amp;lt;br&amp;gt;(8 GiB total) || 64-bit @ 2.0 GT/s (16.0 GB/s) per bank&amp;lt;br&amp;gt;(32.0 GB/s total) || 4 x 128-bit @ 250 MHz (using 2 banks)&lt;br /&gt;
|-&lt;br /&gt;
| X440 (400 MHz BW) || 4 GiB per bank&amp;lt;br&amp;gt;(8 GiB total) || 64-bit @ 2.4 GT/s (19.2 GB/s) per bank&amp;lt;br&amp;gt;(38.4 GB/s total) || 8 x 128-bit @ 300 MHz (using 2 banks)&lt;br /&gt;
|-&lt;br /&gt;
| X440 (1600 MHz BW) || 4 GiB per bank&amp;lt;br&amp;gt;(8 GiB total) || 64-bit @ 2.4 GT/s (19.2 GB/s) per bank&amp;lt;br&amp;gt;(38.4 GB/s total) || 2 x 512-bit @ 300 MHz (using 2 banks)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== What DRAM data rates can I expect on each USRP? ===&lt;br /&gt;
&lt;br /&gt;
DRAM performance is highly application-specific. For example, reading vs. reading and writing simultaneously, one data stream vs. multiple data streams, random access vs. sequential access, etc., can give dramatically different performance. Below are some measurements taken on different USRPs where a Null-Source-Sink RFNoC block is directly connected to a DMA FIFO block to test maximum streaming rates through the DRAM. The DRAM is shared between channels, so throughput goes down as the number of channels going through the DRAM is increased.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Example DRAM Throughput (Per Channel)&lt;br /&gt;
|-&lt;br /&gt;
! USRP Model !! BIST (MB/s) !! 1 Ch (MS/s) !! 2 Ch (MS/s) !! 3 Ch (MS/s) !! 4 Ch (MS/s)&lt;br /&gt;
|-&lt;br /&gt;
| E31x || 666 || 166 || 91 || N/A || N/A&lt;br /&gt;
|-&lt;br /&gt;
| E320 || 1361 || 340 || 299 || 191 || 148&lt;br /&gt;
|-&lt;br /&gt;
| N3xx || 1368 || 341 || 295 || 191 || 144&lt;br /&gt;
|-&lt;br /&gt;
| X3xx || 1347 || 336 || 274 || N/A || N/A&lt;br /&gt;
|-&lt;br /&gt;
| X410 (100 and 200 MHz BW) || 1288 || 321|| 316|| 314 || 303&lt;br /&gt;
|-&lt;br /&gt;
| X410 (400 MHz BW) || 2801 || 697 || 672 || 672 || 672&lt;br /&gt;
|-&lt;br /&gt;
| X440 (400 MHz BW) || 3360 || 798 || 784 || 616 || 461&lt;br /&gt;
|-&lt;br /&gt;
| X440 (1600 MHz BW) || 8118 || 2007 || 2007 || N/A || N/A&lt;br /&gt;
|}&lt;br /&gt;
Notes:&lt;br /&gt;
# E31x, N3xx, and X410 were tested using UHD 4.2. E320 and X3xx were tested using UHD 4.3.&lt;br /&gt;
# BIST refers to the built-in self test, which gives a measure of raw data throughput for a single channel.&lt;br /&gt;
# For MS/s, we assume 4 bytes per sample (sc16).&lt;br /&gt;
# X410 with 400 MHz bandwidth uses two independent memory banks, with channels 0-1 on Bank 0, and channels 2-3 on Bank 1 by default. The traffic flows on Bank 0 and Bank 1 are independent and do not affect each other. Therefore, a 4-channel configuration has the same performance as a 2-channel configuration.&lt;br /&gt;
# X440 uses two independent memory banks. For 400 MHz, channels 0-3 are on Bank 0 and channels 4-7 are on Bank 1 by default. For 1600 MHz, channel 0 is on Bank 0 and channel 1 is on bank 1 by default. The traffic flows on Bank 0 and Bank 1 are independent and do not affect each other. Therefore, a 2-channel configuration has the same performance as a 1-channel configuration.&lt;br /&gt;
&lt;br /&gt;
=== What can the DRAM be used for? ===&lt;br /&gt;
&lt;br /&gt;
* '''DMA FIFO Block:''' The DMA FIFO block is used in situations where you need a large buffer to store samples.&lt;br /&gt;
&lt;br /&gt;
* '''Replay Block:''' The Replay block is used to record and play back RF data. For example, you can record data from a host computer, then play it back over the radio. Or, record data from the radio, then play it back later to the host for analysis, or play it back to a radio at a specific timestamp. See [[Using the RFNoC Replay Block in UHD 4]] for additional information. The Replay block also has a FIFO capability for situations in which the DMA FIFO block is not available in your FPGA image.&lt;br /&gt;
&lt;br /&gt;
* '''Custom Blocks:''' You can also create your own RFNoC block that uses DRAM. Refer to the DMA FIFO and/or Replay blocks as examples.&lt;br /&gt;
&lt;br /&gt;
=== How do I add the Replay/DMA FIFO block to my FPGA image? ===&lt;br /&gt;
&lt;br /&gt;
If the block you want is not included by default in the FPGA image you are using, you can add it to the RFNoC image core YAML file and rebuild the FPGA image using Vivado. See [[Getting Started with RFNoC in UHD 4.0]] for additional information on customizing an RFNoC image.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' DRAM is not enabled by default on E31x FPGA builds because the FPGA is not large enough to fit the default image with DRAM. You will need to remove components from your RFNoC image's YAML file to make room, then build the E31x image with the variable DRAM=1 set, or modify the E31x Makefile to enable DRAM by default.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' The default DRAM configuration used for X410 and X440 changes depending on the configured bandwidth. The default parameters to use for each image type is shown in the table below.&lt;br /&gt;
&lt;br /&gt;
When adding the blocks to your RFNoC image core YAML file, the parameters must be set correctly for the type of USRP you intend to use. The memory data width (&amp;lt;code&amp;gt;MEM_DATA_W&amp;lt;/code&amp;gt;) and address width (&amp;lt;code&amp;gt;MEM_ADDR_W&amp;lt;/code&amp;gt;) must match exactly. The number of ports (&amp;lt;code&amp;gt;NUM_PORTS&amp;lt;/code&amp;gt;) must not exceed the maximum number available. You can use fewer ports to save resources if you don't need all the DRAM ports.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ RFNoC Block Memory Parameters&lt;br /&gt;
|-&lt;br /&gt;
! USRP Model !! MEM_DATA_W !! MEM_ADDR_W !! NUM_PORTS (Max)&lt;br /&gt;
|-&lt;br /&gt;
| E31x || 64 || 29 || 2&lt;br /&gt;
|-&lt;br /&gt;
| E320 || 64 || 31 || 4&lt;br /&gt;
|-&lt;br /&gt;
| N3xx || 64 || 31 || 4&lt;br /&gt;
|-&lt;br /&gt;
| X3xx || 64 || 30 || 2&lt;br /&gt;
|-&lt;br /&gt;
| X410 (100 and 200 MHz BW) || 64 || 32 || 4&lt;br /&gt;
|-&lt;br /&gt;
| X410 (400 MHz BW) || 128 || 32 || 4&lt;br /&gt;
|-&lt;br /&gt;
| X440 (400 MHz BW) || 128 || 32 || 8&lt;br /&gt;
|-&lt;br /&gt;
| X440 (1600 MHz BW) || 512 || 32 || 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The DMA FIFO has a few additional parameters that should be provided. The clock rate (&amp;lt;code&amp;gt;MEM_CLK_RATE&amp;lt;/code&amp;gt;) must match the value below for the built-in self test (BIST) to work correctly. The base address (&amp;lt;code&amp;gt;FIFO_ADDR_BASE&amp;lt;/code&amp;gt;) and address mask (&amp;lt;code&amp;gt;FIFO_ADDR_MASK&amp;lt;/code&amp;gt;) are written as Verilog constants and can be changed depending on your application. The &amp;lt;code&amp;gt;FIFO_ADDR_BASE&amp;lt;/code&amp;gt; parameter contains the byte address for the first byte of the memory region to use for each port. The &amp;lt;code&amp;gt;FIFO_ADDR_MASK&amp;lt;/code&amp;gt; parameter contains the address mask for each port, which tells the FIFO how much memory to use for each port. For example, an address mask of &amp;lt;code&amp;gt;30'h1FFFFFFF&amp;lt;/code&amp;gt; means that 0x1FFFFFFF+1 bytes (i.e., 0x20000000 bytes or 512 MiB) will be used by the corresponding port. The address mask must be 1 less than a power of 2.&lt;br /&gt;
&lt;br /&gt;
The example values in the table below use the entire memory and divide it evenly between all available ports. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ DMA FIFO Parameters&lt;br /&gt;
|-&lt;br /&gt;
! USRP Model !! MEM_CLK_RATE !! FIFO_ADDR_BASE !! FIFO_ADDR_MASK&lt;br /&gt;
|-&lt;br /&gt;
| E31x || &amp;quot;200e6&amp;quot; || &amp;quot;{29'h10000000, 29'h00000000}&amp;quot; || &amp;quot;{29'h0FFFFFFF, 29'h0FFFFFFF}&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| E320 || &amp;quot;300e6&amp;quot; || &amp;quot;{31'h60000000, 31'h40000000, 31'h20000000, 31'h00000000}&amp;quot; || &amp;quot;{31'h1FFFFFFF, 31'h1FFFFFFF, 31'h1FFFFFFF, 31'h1FFFFFFF}&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| N3xx || &amp;quot;303819444&amp;quot; || &amp;quot;{31'h60000000, 31'h40000000, 31'h20000000, 31'h00000000}&amp;quot; || &amp;quot;{31'h1FFFFFFF, 31'h1FFFFFFF, 31'h1FFFFFFF, 31'h1FFFFFFF}&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| X3xx || &amp;quot;300e6&amp;quot; || &amp;quot;{30'h20000000, 30'h00000000}&amp;quot; || &amp;quot;{30'h1FFFFFFF, 30'h1FFFFFFF}&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| X410 (100 and 200 MHz BW) || &amp;quot;250e6&amp;quot; || &amp;quot;{32'hC0000000, 32'h80000000, 32'h40000000, 32'h00000000}&amp;quot; || &amp;quot;{32'h3FFFFFFF, 32'h3FFFFFFF, 32'h3FFFFFFF, 32'h3FFFFFFF}&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| X410 (400 MHz BW) || &amp;quot;250e6&amp;quot; || &amp;quot;{32'h80000000, 32'h00000000, 32'h80000000, 32'h00000000}&amp;quot; || &amp;quot;{32'h7FFFFFFF, 32'h7FFFFFFF, 32'h7FFFFFFF, 32'h7FFFFFFF}&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| X440 (400 MHz BW) || &amp;quot;300e6&amp;quot; || &amp;quot;{32'hC0000000, 32'h80000000, 32'h40000000, 32'h00000000, 32'hC0000000, 32'h80000000, 32'h40000000, 32'h00000000}&amp;quot; || &amp;quot;{32'h3FFFFFFF, 32'h3FFFFFFF, 32'h3FFFFFFF, 32'h3FFFFFFF, 32'h3FFFFFFF, 32'h3FFFFFFF, 32'h3FFFFFFF, 32'h3FFFFFFF}&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| X440 (1600 MHz BW) || &amp;quot;300e6&amp;quot; || &amp;quot;{32'h00000000, 32'h00000000}&amp;quot; || &amp;quot;{32'hFFFFFFFF, 32'hFFFFFFFF}&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Replay Example ====&lt;br /&gt;
&lt;br /&gt;
See [https://github.com/EttusResearch/uhd/blob/197cdc4f665cbd4e6394a7eeb44b405f67ab10b1/fpga/usrp3/top/x300/x310_rfnoc_image_core.yml#L69 x310_rfnoc_image_core.yml] for an example of how to instantiate the Replay block in the RFNoC image core YAML description. The following is a generic example that can be used for any USRP:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
noc_blocks:&lt;br /&gt;
  # Instantiate the replay block&lt;br /&gt;
  replay0:&lt;br /&gt;
    block_desc: 'replay.yml'&lt;br /&gt;
    parameters:&lt;br /&gt;
      NUM_PORTS: &amp;lt;see table&amp;gt;&lt;br /&gt;
      MEM_DATA_W: &amp;lt;see table&amp;gt;&lt;br /&gt;
      MEM_ADDR_W: &amp;lt;see table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
connections:&lt;br /&gt;
  # Connect each port of the replay block to a stream endpoint&lt;br /&gt;
  - { srcblk: &amp;lt;epN&amp;gt;,   srcport: out0,  dstblk: replay0, dstport: in_0 }&lt;br /&gt;
  - { srcblk: replay0, srcport: out_0, dstblk: &amp;lt;epN&amp;gt;,   dstport: in0  }&lt;br /&gt;
  - { srcblk: &amp;lt;epN+1&amp;gt;, srcport: out0,  dstblk: replay0, dstport: in_1 }&lt;br /&gt;
  - { srcblk: replay0, srcport: out_1, dstblk: &amp;lt;epN+1&amp;gt;, dstport: in0  }&lt;br /&gt;
  ... repeat for each remaining Replay port&lt;br /&gt;
  # Connect the replay block memory interface to the USRP DRAM&lt;br /&gt;
  - { srcblk: replay0, srcport: axi_ram, dstblk: _device_, dstport: dram }&lt;br /&gt;
&lt;br /&gt;
Connect the DRAM clock to the block:&lt;br /&gt;
clk_domains:&lt;br /&gt;
  # Connect the DRAM clock to the replay block&lt;br /&gt;
  - { srcblk: _device_, srcport: dram, dstblk: replay0, dstport: mem }&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DMA FIFO Example ====&lt;br /&gt;
&lt;br /&gt;
See [https://github.com/EttusResearch/uhd/blob/197cdc4f665cbd4e6394a7eeb44b405f67ab10b1/fpga/usrp3/top/e320/e320_rfnoc_image_core.yml#L49 e320_rfnoc_image_core.yml] for an example of how to instantiate the DMA FIFO block in the RFNoC image core YAML description. The following is a generic example that can be used for any USRP:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
noc_blocks:&lt;br /&gt;
  # Instantiate the DMA FIFO block&lt;br /&gt;
  fifo0:&lt;br /&gt;
    block_desc: 'axi_ram_fifo.yml'&lt;br /&gt;
    parameters:&lt;br /&gt;
      NUM_PORTS: &amp;lt;see table&amp;gt;&lt;br /&gt;
      MEM_DATA_W: &amp;lt;see table&amp;gt;&lt;br /&gt;
      MEM_ADDR_W: &amp;lt;see table&amp;gt;&lt;br /&gt;
      FIFO_ADDR_BASE: &amp;lt;see table&amp;gt;&lt;br /&gt;
      FIFO_ADDR_MASK: &amp;lt;see table&amp;gt;&lt;br /&gt;
      MEM_CLK_RATE: &amp;lt;see table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
connections:&lt;br /&gt;
  # Connect each port of the DMA FIFO block to a stream endpoint, or insert it&lt;br /&gt;
  # into the data path where desired. This examples uses stream endpoints.&lt;br /&gt;
  - { srcblk: &amp;lt;epN&amp;gt;,   srcport: out0,  dstblk: fifo0,   dstport: in_0 }&lt;br /&gt;
  - { srcblk: replay0, srcport: out_0, dstblk: &amp;lt;epN&amp;gt;,   dstport: in0  }&lt;br /&gt;
  - { srcblk: &amp;lt;epN+1&amp;gt;, srcport: out0,  dstblk: fifo0,   dstport: in_1 }&lt;br /&gt;
  - { srcblk: fifo0,   srcport: out_1, dstblk: &amp;lt;epN+1&amp;gt;, dstport: in0  }&lt;br /&gt;
  ... repeat for each remaining FIFO port&lt;br /&gt;
  # Connect the DMA FIFO block memory interface to the USRP DRAM&lt;br /&gt;
  - { srcblk: fifo0, srcport: axi_ram, dstblk: _device_, dstport: dram }&lt;br /&gt;
&lt;br /&gt;
clk_domains:&lt;br /&gt;
  # Connect the DRAM clock to the replay block&lt;br /&gt;
  - { srcblk: _device_, srcport: dram, dstblk: fifo0,  dstport: mem }&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== RFNoC Clocks ==&lt;br /&gt;
&lt;br /&gt;
=== What clocks are available for me to use? ===&lt;br /&gt;
&lt;br /&gt;
Each device has different clocks available. See below for a list of clocks exposed to RFNoC. Although they have intended purposes, you can use any of these clocks for any purpose. The &amp;lt;code&amp;gt;rfnoc_chdr_clock&amp;lt;/code&amp;gt; is a good default choice. This clock is always available in your block, even if it is not explicitly connected in the RFNoC image YAML description.&lt;br /&gt;
&lt;br /&gt;
=== What are the clock frequencies? ===&lt;br /&gt;
&lt;br /&gt;
See the table below for the clock rates. The radio clock rate depends on the master clock rate.&lt;br /&gt;
&lt;br /&gt;
====E31x====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Clock Name !! Description !! Frequency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_chdr&amp;lt;/code&amp;gt; || RFNoC CHDR clock || 100 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_ctrl&amp;lt;/code&amp;gt; || RFNoC Control clock || 40 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dram&amp;lt;/code&amp;gt; || DRAM interface clock || 100 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt; || Radio interface clock || Same as master clock rate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====E320====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Clock Name !! Description !! Frequency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_chdr&amp;lt;/code&amp;gt; || RFNoC CHDR clock || 200 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_ctrl&amp;lt;/code&amp;gt; || RFNoC Control clock || 40 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dram&amp;lt;/code&amp;gt; || DRAM interface clock || 166.667 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt; || Radio interface clock || Same as master clock rate (200 kHz to 61.44 MHz)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====N300/N310====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Clock Name !! Description !! Frequency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_chdr&amp;lt;/code&amp;gt; || RFNoC CHDR clock || 200 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_ctrl&amp;lt;/code&amp;gt; || RFNoC Control clock || 40 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ce&amp;lt;/code&amp;gt; || Compute Engine clock || 266.667 MHz (available in UHD 4.6 and later)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dram&amp;lt;/code&amp;gt; || DRAM interface clock || 303.819 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt; || Radio interface clock || Same as master clock rate (122.88 MHz, 125.0 MHz, or 153.6 MHz)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====N32x====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Clock Name !! Description !! Frequency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_chdr&amp;lt;/code&amp;gt; || RFNoC CHDR clock || 200 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_ctrl&amp;lt;/code&amp;gt; || RFNoC Control clock || 40 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ce&amp;lt;/code&amp;gt; || Compute Engine clock || 266.667 MHz (available in UHD 4.6 and later)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dram&amp;lt;/code&amp;gt; || DRAM interface clock || 303.819 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt; || Radio interface clock || Same as master clock rate (200 MHz, 245.76 MHz, or 250 MHz)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====X3xx====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Clock Name !! Description !! Frequency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_chdr&amp;lt;/code&amp;gt; || RFNoC CHDR clock || 187.5 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_ctrl&amp;lt;/code&amp;gt; || RFNoC Control clock || 93.75 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ce&amp;lt;/code&amp;gt; || Compute Engine clock || 214.286 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dram&amp;lt;/code&amp;gt; || DRAM interface clock || 300 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt; || Radio interface clock || Same as master clock rate (184.32 MHz or 200 MHz)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====X410====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Clock Name !! Description !! Frequency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_chdr&amp;lt;/code&amp;gt; || RFNoC CHDR clock || 200 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_ctrl&amp;lt;/code&amp;gt; || RFNoC Control clock || 40 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ce&amp;lt;/code&amp;gt; || Compute Engine clock || 266.667 MHz (available in UHD 4.6 and later)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dram&amp;lt;/code&amp;gt; || DRAM interface clock || 250 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt; || Radio interface clock || 122.88 MHz when master clock rate is 122.88, 245.76, or 491.52 MHz&amp;lt;br&amp;gt;125 MHz when master clock rate is 125, 250, or 500 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio_2x&amp;lt;/code&amp;gt; || Radio interface clock 2x || Twice the frequency of &amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====X440====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Clock Name !! Description !! Frequency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_chdr&amp;lt;/code&amp;gt; || RFNoC CHDR clock || 200 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_ctrl&amp;lt;/code&amp;gt; || RFNoC Control clock || 40 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ce&amp;lt;/code&amp;gt; || Compute Engine clock || 266.667 MHz (available in UHD 4.6 and later)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dram&amp;lt;/code&amp;gt; || DRAM interface clock || 300 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio0&amp;lt;/code&amp;gt; || Radio interface clock for daughterboard 0 || Daughterboard 0 master clock rate divided by 8 (e.g., 62.5 MHz if master clock rate is 500 MHz)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio1&amp;lt;/code&amp;gt; || Radio interface clock for daughterboard 1 || Daughterboard 1 master clock rate divided by 8&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio0_2x&amp;lt;/code&amp;gt; || Radio interface clock 2x for daughterboard 0 || Twice the frequency of &amp;lt;code&amp;gt;radio0&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio1_2x&amp;lt;/code&amp;gt; || Radio interface clock 2x for daughterboard 1 || Twice the frequency of &amp;lt;code&amp;gt;radio1&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== How do I add a clock with a different frequency? ===&lt;br /&gt;
&lt;br /&gt;
If you only need the clock within your own RFNoC block, you can modify the HDL for your block to generate the clock that you need from one of the available clocks. To do this, add a new clock to your block's YAML description, connect the available clock to your block in the YAML description of your RFNoC image, then add a Xilinx MMCM IP instance to your block's HDL and connect the available clock to its input.&lt;br /&gt;
&lt;br /&gt;
Starting with UHD 4.7, you can add clock generation modules that create new clocks based on the existing clocks. Note that you must create such a module as an HDL module: Describing clocks in the YAML files will not cause them to be generated for you.&lt;br /&gt;
&lt;br /&gt;
Assuming you have such a module, describe the clocks in the module's YAML files as such:&lt;br /&gt;
&lt;br /&gt;
 clocks:&lt;br /&gt;
    - name: ce&lt;br /&gt;
      direction: in&lt;br /&gt;
    - name: my_clk&lt;br /&gt;
      direction: out&lt;br /&gt;
&lt;br /&gt;
Now you will have a new clock called &amp;lt;code&amp;gt;my_clk&amp;lt;/code&amp;gt;, which is derived from the &amp;lt;code&amp;gt;ce&amp;lt;/code&amp;gt; clock.&lt;br /&gt;
&lt;br /&gt;
In older versions of UHD, adding custom clocks is not directly supported. If you can't use any of the available clocks, you can modify the HDL code to generate a clock.&lt;br /&gt;
&lt;br /&gt;
If the clock is needed by multiple RFNoC blocks, or if you want to change an existing clock, you can modify the HDL for the USRP you are using to add or change a clock. If you add a new clock to the RFNoC image core, you must also update the BSP YAML file (located in [https://github.com/EttusResearch/uhd/tree/master/host/include/uhd/rfnoc/core &amp;lt;repo&amp;gt;/host/include/uhd/rfnoc/core]) so that the &amp;lt;code&amp;gt;rfnoc_image_builder&amp;lt;/code&amp;gt; knows that the clock exists. How and where the clocks are generated varies between USRPs. Please refer to the source code for that USRP ([https://github.com/EttusResearch/uhd/tree/master/fpga/usrp3/top &amp;lt;repo&amp;gt;/fpga/usrp3/top]).&lt;br /&gt;
&lt;br /&gt;
== Xilinx Vivado ==&lt;br /&gt;
&lt;br /&gt;
=== Do I need a Vivado license to build custom RFNoC FPGA images? ===&lt;br /&gt;
&lt;br /&gt;
All RFNoC-capable USRPs use Xilinx FPGAs that require a license to use Vivado, except for E31x USRPs, which can use the free Vivado HL WebPACK Edition. Vivado is required to build FPGAs for RFNoC. &lt;br /&gt;
&lt;br /&gt;
=== Which version and edition of Vivado do I need? ===&lt;br /&gt;
&lt;br /&gt;
See the [https://files.ettus.com/manual/md_usrp3_build_instructions.html UHD User Manual] for the latest Vivado version requirements. UHD versions 4.0 through 4.2 require Vivado 2019.1.&lt;br /&gt;
&lt;br /&gt;
For E31x devices, you can use the free Vivado HL Webpack. For all other USRPs, you can use Design Edition or System Edition. We recommend Design Edition, unless you plan to use System Generator for DSP. System Generator is not required by RFNoC.&lt;br /&gt;
&lt;br /&gt;
=== Can I use a different Vivado version from the one required by my UHD version? ===&lt;br /&gt;
&lt;br /&gt;
This is technically possible, but it can be a lot of work to convert and adapt all of the IP to a new Vivado version, and your custom combination of UHD and Vivado versions will not have been tested or validated by Ettus Research. Therefore, this is not recommended or supported.&lt;br /&gt;
&lt;br /&gt;
=== Do I need to install all components of Vivado? ===&lt;br /&gt;
&lt;br /&gt;
No. You only need to install device support for the FPGA you intend to build. Other devices can be unchecked to save disk space. The following FPGA types are used by USRPs:&lt;br /&gt;
&lt;br /&gt;
* '''SoCs &amp;gt; Zynq-7000:''' E31x, E320, N3xx&lt;br /&gt;
* '''SOCs &amp;gt; Zynq UltraScale+ RFSoC:''' X410&lt;br /&gt;
* '''7 Series &amp;gt; Kintex-7''': X3xx&lt;br /&gt;
&lt;br /&gt;
The Software Development Kit (SDK) is typically not required, but can be installed if desired.&lt;br /&gt;
&lt;br /&gt;
The Cable Drivers are needed if you plan to do JTAG download or debug. Note that on Linux, the cable drivers are copied to the install folder, but are not installed onto your system automatically. See Xilinx UG973 for instructions on installing the cable drivers on Linux.&lt;br /&gt;
&lt;br /&gt;
=== Why does the Vivado 2021.1 installer get stuck or not start on Ubuntu? ===&lt;br /&gt;
&lt;br /&gt;
The Vivado installer needs the libncurses5 and libtinfo5 libraries to run correctly. They can be installed by running the following commands:&lt;br /&gt;
&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 wget http://security.ubuntu.com/ubuntu/pool/universe/n/ncurses/libtinfo5_6.3-2ubuntu0.1_amd64.deb&lt;br /&gt;
 sudo apt install ./libtinfo5_6.3-2ubuntu0.1_amd64.deb&lt;br /&gt;
 wget http://security.ubuntu.com/ubuntu/pool/universe/n/ncurses/libncurses5_6.3-2ubuntu0.1_amd64.deb&lt;br /&gt;
 sudo apt install ./libncurses5_6.3-2ubuntu0.1_amd64.deb&lt;br /&gt;
&lt;br /&gt;
== Building FPGA Images ==&lt;br /&gt;
&lt;br /&gt;
=== Why did my FPGA build fail to meet timing constraints? ===&lt;br /&gt;
&lt;br /&gt;
FPGAs have clocks that trigger the transfer of data between internal registers. The Vivado tool does a timing check near the end of the build to ensure that the paths from each driving register or port to each receiving register or port are not too long for the specified clock period or delay constraints. When it says &amp;quot;The design did not satisfy timing constraints&amp;quot; it means that Vivado couldn't arrange the logic on the chip in a way that meets all requirements. There are several reasons this might happen:&lt;br /&gt;
&lt;br /&gt;
* You added new logic to the design with too much logic between registers. In this case, you should modify your design to make meeting timing easier.&lt;br /&gt;
* You added new logic, but made a mistake in which you're trying to use the wrong clock or reset, which makes it difficult to meet timing. In this case you need to correct the mistake in your design.&lt;br /&gt;
* The design has become too crowded, making it difficult for the tools to meet the timing requirements. In this case you need to remove something to make more room.&lt;br /&gt;
* Bad luck. The tools use pseudorandom algorithms to find solutions to really hard problems, and sometimes it doesn't find a good solution even when one is possible. In this case you can make a minor change to the design and build again to see if it does better the second time. If you don't change anything, Vivado will normally give you identical results for each build. In UHD 4.4 and later you can add the &amp;lt;code&amp;gt;BUILD_SEED=1&amp;lt;/code&amp;gt; option to the &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; arguments to change a build seed that will affect the build results. Using a different seed number for each build will ensure that you get a unique build result each time. 0 is the default seed if not specified. Random build failures occur occasionally for some FPGA targets, in which case you should retry the build with a different seed.&lt;br /&gt;
&lt;br /&gt;
The FPGA tools produce a timing report that says exactly which path failed to meet timing. Sometimes that can point you in the right direction. But sometimes the path indicated only failed because of another path that's even more difficult. Open &amp;lt;code&amp;gt;post_route_timing_summary.rpt&amp;lt;/code&amp;gt; in the build output folder and search for &amp;quot;(VIOLATED)&amp;quot; to find the path(s) that failed.&lt;br /&gt;
&lt;br /&gt;
=== My design doesn't fit in the FPGA. What can I do to reduce the size? ===&lt;br /&gt;
&lt;br /&gt;
Read the &amp;lt;code&amp;gt;post_synth_util.rpt&amp;lt;/code&amp;gt; to determine what resource(s) you are running out of in order to know what kinds of changes are needed. Below are several easy ways to reduce the resource utilization of the FPGA.&lt;br /&gt;
&lt;br /&gt;
* If you are not using all RF channels of your device, modify the FPGA YAML file to remove the DDC, DUC, and Radio blocks for the unused channels, then regenerate the FPGA code using &amp;lt;code&amp;gt;rfnoc_image_builder&amp;lt;/code&amp;gt;. Note that you may need at least one Radio block for RFNoC to work properly. You may also remove the DDC and/or the DUC if your application uses full bandwidth for one or more channels and therefore doesn't require up or down conversion.&lt;br /&gt;
* If you are not using DRAM, remove the Replay or DMA FIFO blocks. Also, on X4xx, change the &amp;lt;code&amp;gt;DRAM_CH&amp;lt;/code&amp;gt; variable to 0 in the Makefile for the FPGA target you are building.&lt;br /&gt;
* If you do not need all SFP ports, use a build target that matches your needs. For example, on X4xx, the &amp;quot;X1&amp;quot; option (one 10 Gbps lane) uses the least resources whereas &amp;quot;X4&amp;quot; (four 10 Gbps lanes) uses a lot more, and the &amp;quot;CG&amp;quot; option (four 25 Gbps lanes) uses the most.&lt;br /&gt;
* If you do not need the full bandwidth of the device, use a smaller bandwidth option. For example, on X410, the &amp;quot;_100&amp;quot; option (100 MHz bandwidth) uses less resources than the &amp;quot;_200&amp;quot; option (200 MHz bandwidth).&lt;br /&gt;
* Add the &amp;lt;code&amp;gt;crossbar_routes&amp;lt;/code&amp;gt; definition to the FPGA YAML file to include only the crossbar paths required for your application. This is an advanced feature in UHD 4.5 and later. This must be done carefully to avoid removing essential paths. See the X440 YAML files for examples.&lt;br /&gt;
&lt;br /&gt;
Other reductions are possible but require advanced knowledge of UHD and/or RFNoC to avoid breaking key functionality of the device.&lt;br /&gt;
&lt;br /&gt;
=== How do I create a Vivado project for my FPGA build? ===&lt;br /&gt;
&lt;br /&gt;
Vivado supports two modes of operation known as &amp;quot;project mode&amp;quot; and &amp;quot;non-project mode&amp;quot;. Project mode is more user-friendly because it creates a project file that is managed by Vivado and works natively in the Vivado GUI. Non-project mode is generally used by more advanced users who want full control over the Vivado build process and is typically used in fully scripted or automated build flows. The USRP build flow in UHD uses non-project mode. As a result, there is no Vivado project file by default.&lt;br /&gt;
&lt;br /&gt;
It is possible to create a project file from the USRP build flow with the following steps:&lt;br /&gt;
&lt;br /&gt;
# Start the USRP FPGA build in the GUI. In UHD 4.7 and later, this can be done by adding the &amp;lt;code&amp;gt;-g&amp;lt;/code&amp;gt; argument to the &amp;lt;code&amp;gt;rfnoc_image_builder&amp;lt;/code&amp;gt; command. In UHD 4.6 and earlier, this can be done by adding &amp;lt;code&amp;gt;GUI=1&amp;lt;/code&amp;gt; to the &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; arguments. Example: &amp;lt;code&amp;gt;make X410_X4_200 GUI=1&amp;lt;/code&amp;gt;&lt;br /&gt;
# After the build completes, run the following command in the TCL Console of Vivado to create the project file and switch to project mode:&amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;save_project_as project_name project_dir&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;In this example, &amp;quot;project_name&amp;quot; is the name you want to give the project file and &amp;quot;project_dir&amp;quot; is the directory in which you want to put the project.&lt;br /&gt;
# Set the compile order to automatic: &amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;set_property source_mgmt_mode All [current_project]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In some cases, it may also be necessary to reset the output products for some of the IP. If you get an error message about a BD sub-design being not generated for the synthesis target, then navigate to the &amp;quot;IP Sources&amp;quot; tab in the Project Manager Sources window, then right-click on affected IP and select &amp;quot;Reset Output Products...&amp;quot;, then click &amp;quot;Reset&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
This project file can now be used independently of the normal FPGA build flow in UHD. It is up to the user to update this project file as the design changes since it will not be managed by the normal build flow in UHD.&lt;br /&gt;
&lt;br /&gt;
=== My FPGA takes a long time to build. What can I do to make builds faster? ===&lt;br /&gt;
&lt;br /&gt;
High-performance computers are recommended for FPGA builds since an FPGA build can take several hours.&lt;br /&gt;
&lt;br /&gt;
The build process is divided into two steps, IP generation and the FPGA build.&lt;br /&gt;
&lt;br /&gt;
==== IP Generation ====&lt;br /&gt;
&lt;br /&gt;
This process can take several hours by default and is run automatically, if needed, when you build an FPGA target. Fortunately, this only needs to be done once for each USRP type and won't run again unless IP is changed.&lt;br /&gt;
&lt;br /&gt;
You can speed up the IP generation by running this step with multiple jobs. For example:&lt;br /&gt;
&lt;br /&gt;
    $ make -j 4 X410_IP&lt;br /&gt;
&lt;br /&gt;
This example will build four IP cores at a time. Note that this generally requires 4 times as much memory and needs at least 4 CPU cores. You can adjust the number of parallel jobs based on the amount of system memory and/or CPU cores you have available.&lt;br /&gt;
&lt;br /&gt;
==== FPGA Build ====&lt;br /&gt;
&lt;br /&gt;
Unfortunately, increasing the number of jobs does not speed up FPGA performance because there is only one Vivado instance for the FPGA build. Vivado, by default, will use multiple CPU cores, where possible, but this does not significantly improve build performance since many parts of the build are not easily parallelizable.&lt;br /&gt;
&lt;br /&gt;
One way to shorten the build time is to reduce the size of the design. See above on how to reduce the size of your design.&lt;br /&gt;
&lt;br /&gt;
In the case where you need to build multiple FPGA types, you can use the jobs option with &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; to build multiple FPGAs simultaneously, which can dramatically reduce the time required per build. Note that this requires a significant amount of memory and CPU cores and therefore is only recommended for systems that can handle such loads. An example is shown below for building two FPGA images in parallel:&lt;br /&gt;
&lt;br /&gt;
    $ make -j 2 X410_X4_200 X410_CG_400&lt;br /&gt;
&lt;br /&gt;
It is also possible to open separate terminal instances and run one build in each instance to get the same effect. Do not build the same FPGA target in multiple instances, since multiple builds for the same target would conflict as they try to access and update the same files.&lt;br /&gt;
&lt;br /&gt;
=== When I start an FPGA build or use rfnoc_image_builder, I get an error &amp;quot;setupenv.sh: source: not found&amp;quot; and the build fails. What happened? ===&lt;br /&gt;
&lt;br /&gt;
In some Linux distributions (e.g. Ubuntu) &amp;lt;code&amp;gt;dash&amp;lt;/code&amp;gt; is set as default shell which can cause FPGA builds to fail.&lt;br /&gt;
&lt;br /&gt;
Below is an example of the error. Note, that your message may look somewhat different depending on UHD version and USRP target but the important lines are marked in bold.&lt;br /&gt;
&lt;br /&gt;
    rfnoc_image_builder -y e320_rfnoc_image_core_fft.yml -t E320_1G&lt;br /&gt;
    Using FPGA directory /home/someuser/uhd/fpga&lt;br /&gt;
    Selected device: e320&lt;br /&gt;
    Build artifacts directory already exists (contents will be overwritten).&lt;br /&gt;
    Launching build with the following settings:&lt;br /&gt;
     * FPGA Directory: /home/someuser/uhd/fpga/usrp3/top/e320&lt;br /&gt;
     * Build Artifacts Directory: /home/someuser/uhd/fpga/usrp3/top/e320/build-usrp_e320_fpga_1G&lt;br /&gt;
     * Build Output Directory: /home/someuser/uhd/fpga/usrp3/top/e320/build&lt;br /&gt;
     * Build IP Directory: /home/someuser/uhd/fpga/usrp3/top/e320/build-ip&lt;br /&gt;
    Executing the following command: . ./setupenv.sh &amp;amp;&amp;amp; make E320_1G BUILD_DIR=/home/someuser/uhd/fpga/usrp3/top/e320/build-usrp_e320_fpga_1G IMAGE_CORE_NAME=usrp_e320_fpga_1G&lt;br /&gt;
    '''/bin/sh: 6: ./setupenv.sh: Bad substitution'''&lt;br /&gt;
    '''/bin/sh: 8: ./setupenv.sh: declare: not found'''&lt;br /&gt;
    /bin/sh: 9: ./setupenv.sh: PRODUCT_ID_MAP[E320]=zynq/xc7z045/ffg900/-3: not found&lt;br /&gt;
    '''/bin/sh: 15: ./setupenv.sh: source: not found'''&lt;br /&gt;
    Build finished with return code 127.&lt;br /&gt;
&lt;br /&gt;
It is recommended to set the default shell to &amp;lt;code&amp;gt;bash&amp;lt;/code&amp;gt; by running the following command in the terminal. When asked &amp;lt;code&amp;gt;Use dash as the default system shell (/bin/sh)?&amp;lt;/code&amp;gt; choose &amp;lt;code&amp;gt;&amp;lt;No&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    $ sudo dpkg-reconfigure dash&lt;br /&gt;
&lt;br /&gt;
Confirm your default shell was changed to bash by running this command:&lt;br /&gt;
&lt;br /&gt;
    $ ll /bin/sh&lt;br /&gt;
&lt;br /&gt;
You should see output similar to this:&lt;br /&gt;
&lt;br /&gt;
    lrwxrwxrwx 1 root root 4 Oct 10  2020 /bin/sh -&amp;gt; bash*&lt;br /&gt;
&lt;br /&gt;
=== My FPGA build failed with a cryptic message or no message at all. How do I debug this? ===&lt;br /&gt;
&lt;br /&gt;
When you build an FPGA target, a build directory is created in the FPGA's top directory that contains all the build outputs. Here you'll find the &amp;lt;code&amp;gt;build.log&amp;lt;/code&amp;gt; file as well as report files and checkpoints. Not all log information is printed to the console during build, so make sure you check the &amp;lt;code&amp;gt;build.log&amp;lt;/code&amp;gt; file for details. It may contain a useful error message that was not printed to the console.&lt;br /&gt;
&lt;br /&gt;
Builds often fail when Vivado encounters an internal error or runs out of memory. For internal errors, the error message is typically not very helpful and is often due to a bug in Vivado. When Vivado runs out of memory, it may immediately terminate without giving any error message at all. Consider monitoring the memory usage during the FPGA build to see if you are approaching your system's limit.&lt;br /&gt;
&lt;br /&gt;
If you have made changes to the design, try building an unmodified FPGA image from scratch to ensure the build process is working properly on your system. If this works, try adding your changes incrementally until the section of code causing the problem is identified.&lt;br /&gt;
&lt;br /&gt;
Note that such errors are often beyond the control of Ettus Research and reaching out to Xilinx support is a better option if it is truly a Vivado issue.&lt;br /&gt;
&lt;br /&gt;
=== I get a warning saying that an IP is locked, which results in errors later in the IP generation process. How do I resolve this? ===&lt;br /&gt;
&lt;br /&gt;
Vivado &amp;quot;locks&amp;quot; IP, for example, when it needs to be updated for the running version of Vivado or FPGA device type. This is intended to force the user to fix the issue and to avoid building incompatible IP. Build failures related to IP being locked should never occur during a normal build. The IP version in the UHD repo always matches the Vivado version required for that release of UHD.&lt;br /&gt;
&lt;br /&gt;
This can happen if you have used the wrong version of Vivado or do not have the correct Vivado patches installed. Refer to the &amp;lt;code&amp;gt;Generation 3 USRP Build Documentation&amp;lt;/code&amp;gt; section of the [[UHD and USRP User Manual|UHD Manual] for the required version and patches. When you run the `source setenv.sh` step to setup your environment, the script will check to make sure you are using the correct version.&lt;br /&gt;
&lt;br /&gt;
In some cases, reinstalling Vivado might be required.&lt;br /&gt;
&lt;br /&gt;
Once the correct Vivado version and patches are installed, you will need to remove all build products (to remove any locked IP that was generated) and retry the build. For example:&lt;br /&gt;
&lt;br /&gt;
    $ source setupenv.sh     # Setup environment and check the Vivado version&lt;br /&gt;
    $ make cleanall          # Remove any bad IP that was generated&lt;br /&gt;
    $ make X410_X4_200       # Start the build process again&lt;br /&gt;
&lt;br /&gt;
=== I see a &amp;quot;CRITICAL WARNING&amp;quot; in the build log. Is this expected? ===&lt;br /&gt;
&lt;br /&gt;
There are many critical warnings that appear during the build process that can be safely ignored. For example, you may see the following:&lt;br /&gt;
&lt;br /&gt;
    CRITICAL WARNING: [Vivado 12-1790] Evaluation License Warning: This design contains one or more IP cores that use separately licensed features. If the design has been configured to make use of evaluation features, please note that these features will cease to function after a certain period of time. Please consult the core datasheet to determine whether the core which you have configured will be affected. Evaluation features should NOT be used in production systems.&lt;br /&gt;
&lt;br /&gt;
The FPGA builds include IP for which the licenses are included with Vivado, but Vivado prints the warnings anyway. As long as you have a Vivado license and a bitstream was successfully generated, the IP should work as expected.&lt;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP_Host_Performance_Tuning_Tips_and_Tricks&amp;diff=6127</id>
		<title>USRP Host Performance Tuning Tips and Tricks</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=USRP_Host_Performance_Tuning_Tips_and_Tricks&amp;diff=6127"/>
				<updated>2025-05-22T19:28:20Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: Add instructions on how to make adjusting the network buffer sizes persistent after reboot&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Application Note Number==&lt;br /&gt;
'''AN-088'''&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
This application note provides various tips and tricks for tuning your host computer for best performance when working with USRP devices.&lt;br /&gt;
&lt;br /&gt;
==CPU Governor==&lt;br /&gt;
Ensure your CPU governor is set to &amp;lt;code&amp;gt;performance&amp;lt;/code&amp;gt;. This can be done with the Linux utility &amp;lt;code&amp;gt;cpufrequtils&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Install &amp;lt;code&amp;gt;cpufrequtils&amp;lt;/code&amp;gt; with the command below:&lt;br /&gt;
&lt;br /&gt;
    sudo apt install cpufrequtils&lt;br /&gt;
&lt;br /&gt;
You can then set the CPU governor to &amp;lt;code&amp;gt;performance&amp;lt;/code&amp;gt; per core by issuing the command:&lt;br /&gt;
&lt;br /&gt;
    sudo cpufreq-set -c $core_number -g performance&lt;br /&gt;
&lt;br /&gt;
To set the CPU governor to &amp;lt;code&amp;gt;performance&amp;lt;/code&amp;gt; for all cores:&lt;br /&gt;
&lt;br /&gt;
    for ((i=0;i&amp;lt;$(nproc --all);i++)); do sudo cpufreq-set -c $i -r -g performance; done&lt;br /&gt;
&lt;br /&gt;
You can then verify that the CPU governor has been set by running the command:&lt;br /&gt;
&lt;br /&gt;
    cpufreq-info&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;
==Adjust Network Buffers==&lt;br /&gt;
This applies to USRP devices connected via Ethernet, such as the N200, N210, N300, N310, N320, N321, X300, X310, E320, X410, X440.&lt;br /&gt;
&lt;br /&gt;
Note that these settings will not persist across a reboot.&lt;br /&gt;
&lt;br /&gt;
    sudo sysctl -w net.core.wmem_max=33554432&lt;br /&gt;
    sudo sysctl -w net.core.rmem_max=33554432&lt;br /&gt;
    sudo sysctl -w net.core.wmem_default=33554432&lt;br /&gt;
    sudo sysctl -w net.core.rmem_default=33554432&lt;br /&gt;
&lt;br /&gt;
To make these settings persistent, set or add the following in &amp;lt;code&amp;gt;/etc/sysctl.conf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    net.core.wmem_max=33554432&lt;br /&gt;
    net.core.rmem_max=33554432&lt;br /&gt;
    net.core.wmem_default=33554432&lt;br /&gt;
    net.core.rmem_default=33554432&lt;br /&gt;
&lt;br /&gt;
==Adjust Ethernet MTU==&lt;br /&gt;
This applies to Ethernet connected USRPs (N2xx, N3xx, X3xx, E320).&lt;br /&gt;
&lt;br /&gt;
For 1 Gigabit connections, the MTU should be set to &amp;lt;code&amp;gt;1500&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For 10 Gigabit connections, the MTU should be set to &amp;lt;code&amp;gt;9000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
It is important to set the value and '''not''' leave it is &amp;lt;code&amp;gt;automatic&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Increasing Ring Buffers==&lt;br /&gt;
This applies to Ethernet connected USRPs using a 10 Gb interface (X3xx, N3xx, E320).&lt;br /&gt;
&lt;br /&gt;
Increasing the Ring Buffers on the NIC may help prevent flow control errors at higher rates.&lt;br /&gt;
&lt;br /&gt;
    sudo ethtool -G &amp;lt;interface&amp;gt; tx 4096 rx 4096&lt;br /&gt;
&lt;br /&gt;
== DPDK == &lt;br /&gt;
DPDK is supported on N3xx, X3xx and E320 USRPs. DPDK replaces the traditional Linux networking stack with a low overhead user-land based driver. Additional details of using DPDK can be found in the UHD Manual located at the following link: https://files.ettus.com/manual/page_dpdk.html &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;
== Disable KPTI Protections for Spectre/Meltdown==&lt;br /&gt;
In some cases, disabling the KPTI protections for the Linux Kernel can increase performance by 10-15%. It is important to note the ramification making this modification can have. This modification is only recommended for systems that absolutely require the best performance and are not connected to the internet.&lt;br /&gt;
&lt;br /&gt;
* https://en.wikipedia.org/wiki/Meltdown_(security_vulnerability)&lt;br /&gt;
* https://en.wikipedia.org/wiki/Spectre_(security_vulnerability)&lt;br /&gt;
&lt;br /&gt;
Disabling KPTI protections can be done by adding the lines below to your &amp;lt;code&amp;gt;/etc/default/grub&amp;lt;/code&amp;gt; file at &amp;lt;code&amp;gt;GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    pti=off spectre_v2=off l1tf=off nospec_store_bypass_disable no_stf_barrier&lt;br /&gt;
&lt;br /&gt;
After modifying the &amp;lt;code&amp;gt;grub&amp;lt;/code&amp;gt; file, run the following command to update your configuration and reboot:&lt;br /&gt;
&lt;br /&gt;
    sudo update-grub&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Application Notes]]&lt;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=RFNoC_Frequently_Asked_Questions&amp;diff=6126</id>
		<title>RFNoC Frequently Asked Questions</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=RFNoC_Frequently_Asked_Questions&amp;diff=6126"/>
				<updated>2025-05-22T18:41:19Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: Added FAQ about FPGA build failures due to dash being the default shell instead of bash&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Configuring the Stream Endpoint Buffer Size in RFNoC ==&lt;br /&gt;
&lt;br /&gt;
=== What is the SEP buffer size? ===&lt;br /&gt;
&lt;br /&gt;
Each stream endpoint (SEP) has an ingress buffer to store data received from others stream endpoints. This size of this buffer affects the data transfer rate that can be achieved when streaming to that endpoint. A larger ingress buffer in the stream endpoint means that there is more space to put data, minimizing idle time on the network. Additionally, streamers can queue up data before it is needed, reducing the chance of a buffer underflow.&lt;br /&gt;
&lt;br /&gt;
=== How do I set the SEP buffer size? ===&lt;br /&gt;
&lt;br /&gt;
The stream endpoint buffer size is set by adding a parameter under the endpoint you want to configure in the RFNoC image core YAML file. There are two parameters you can use to set the stream endpoint ingress buffer size in your RFNoC image core YAML file.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;buff_size&amp;lt;/code&amp;gt;: Buffer size in CHDR words. The size in bytes depends on the CHDR width. For example, if the &amp;lt;code&amp;gt;chdr_width&amp;lt;/code&amp;gt; parameter for the device is 64, then each CHDR word is 8 bytes. So a buff size of 32768 would be 262,144 bytes or 256 KiB. See [https://github.com/EttusResearch/uhd/blob/197cdc4f665cbd4e6394a7eeb44b405f67ab10b1/fpga/usrp3/top/x300/x310_rfnoc_image_core.yml#L20 here] for an example.&lt;br /&gt;
* &amp;lt;code&amp;gt;buff_size_bytes&amp;lt;/code&amp;gt;:  Buffer size in bytes. See [https://github.com/EttusResearch/uhd/blob/197cdc4f665cbd4e6394a7eeb44b405f67ab10b1/fpga/usrp3/top/x400/x410_200_rfnoc_image_core.yml#L21 here] for an example.&lt;br /&gt;
&lt;br /&gt;
=== To what value should I set the SEP buffer size? ===&lt;br /&gt;
&lt;br /&gt;
The buffer size should be a power of two in size to make optimal use of FPGA RAM resources. The default FPGA bitstreams typically set them to the largest size the FPGA can fit in order to maximize performance. Here are some general recommendations:&lt;br /&gt;
&lt;br /&gt;
* Set to &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; if you don't need to send data to that SEP.&lt;br /&gt;
* Set to &amp;lt;code&amp;gt;8192&amp;lt;/code&amp;gt; bytes (8 KiB = 1 MTU) minimum in order to stream data packets.&lt;br /&gt;
* Set to &amp;lt;code&amp;gt;32768&amp;lt;/code&amp;gt; bytes (32 KiB = 4 MTU) in order to stream at maximum rates between SEPs on the same FPGA.&lt;br /&gt;
* Set to &amp;lt;code&amp;gt;262144&amp;lt;/code&amp;gt; bytes (256 KiB = 32 MTU) or lager for high performance streaming between a host computer and the FPGA.&lt;br /&gt;
&lt;br /&gt;
Note that the requirements are application-dependent, so optimal sizes for your application may be different. MTU refers to the maximum transmission unit, which is the largest CHDR packet supported by the FPGA.&lt;br /&gt;
&lt;br /&gt;
If you need to free up FPGA resources (particularly block RAM) for your application, you can reduce the SEP buffer sizes. Just keep in mind that the maximum streaming rate may be affected.&lt;br /&gt;
&lt;br /&gt;
== USRP DRAM ==&lt;br /&gt;
&lt;br /&gt;
=== How much and what speed DRAM is available on each USRP? ===&lt;br /&gt;
&lt;br /&gt;
The table below summarizes the DRAM that is connected to the USRP for use by RFNoC.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ USRP DRAM Summary&lt;br /&gt;
|-&lt;br /&gt;
! USRP Model !! DRAM Size !! Default DRAM Speed !! Default User Interface&lt;br /&gt;
|-&lt;br /&gt;
| E31x || 512 MiB || 16-bit @ 800 MT/s (1.6 GB/s) || 2 ch x 64-bit @ 100 MHz&lt;br /&gt;
|-&lt;br /&gt;
| E320 || 2 GiB || 32-bit @ 1333 MT/s (5.33 GB/s) || 4 ch x 64-bit @ 300 MHz&lt;br /&gt;
|-&lt;br /&gt;
| N3xx || 2 GiB || 32-bit @ 1300 MT/s (5.2 GB/s) || 4 ch x 64-bit @ 303.819 MHz&lt;br /&gt;
|-&lt;br /&gt;
| X3xx || 1 GiB || 32-bit @ 1200 MT/s (4.8 GB/s) || 2 ch x 64-bit @ 300 MHz&lt;br /&gt;
|-&lt;br /&gt;
| X410 (100 and 200 MHz BW) || 4 GiB || 64-bit @ 2.0 GT/s (16.0 GB/s) || 4 x 64-bit @ 250 MHz&lt;br /&gt;
|-&lt;br /&gt;
| X410 (400 MHz BW) || 4 GiB per bank&amp;lt;br&amp;gt;(8 GiB total) || 64-bit @ 2.0 GT/s (16.0 GB/s) per bank&amp;lt;br&amp;gt;(32.0 GB/s total) || 4 x 128-bit @ 250 MHz (using 2 banks)&lt;br /&gt;
|-&lt;br /&gt;
| X440 (400 MHz BW) || 4 GiB per bank&amp;lt;br&amp;gt;(8 GiB total) || 64-bit @ 2.4 GT/s (19.2 GB/s) per bank&amp;lt;br&amp;gt;(38.4 GB/s total) || 8 x 128-bit @ 300 MHz (using 2 banks)&lt;br /&gt;
|-&lt;br /&gt;
| X440 (1600 MHz BW) || 4 GiB per bank&amp;lt;br&amp;gt;(8 GiB total) || 64-bit @ 2.4 GT/s (19.2 GB/s) per bank&amp;lt;br&amp;gt;(38.4 GB/s total) || 2 x 512-bit @ 300 MHz (using 2 banks)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== What DRAM data rates can I expect on each USRP? ===&lt;br /&gt;
&lt;br /&gt;
DRAM performance is highly application-specific. For example, reading vs. reading and writing simultaneously, one data stream vs. multiple data streams, random access vs. sequential access, etc., can give dramatically different performance. Below are some measurements taken on different USRPs where a Null-Source-Sink RFNoC block is directly connected to a DMA FIFO block to test maximum streaming rates through the DRAM. The DRAM is shared between channels, so throughput goes down as the number of channels going through the DRAM is increased.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Example DRAM Throughput (Per Channel)&lt;br /&gt;
|-&lt;br /&gt;
! USRP Model !! BIST (MB/s) !! 1 Ch (MS/s) !! 2 Ch (MS/s) !! 3 Ch (MS/s) !! 4 Ch (MS/s)&lt;br /&gt;
|-&lt;br /&gt;
| E31x || 666 || 166 || 91 || N/A || N/A&lt;br /&gt;
|-&lt;br /&gt;
| E320 || 1361 || 340 || 299 || 191 || 148&lt;br /&gt;
|-&lt;br /&gt;
| N3xx || 1368 || 341 || 295 || 191 || 144&lt;br /&gt;
|-&lt;br /&gt;
| X3xx || 1347 || 336 || 274 || N/A || N/A&lt;br /&gt;
|-&lt;br /&gt;
| X410 (100 and 200 MHz BW) || 1288 || 321|| 316|| 314 || 303&lt;br /&gt;
|-&lt;br /&gt;
| X410 (400 MHz BW) || 2801 || 697 || 672 || 672 || 672&lt;br /&gt;
|-&lt;br /&gt;
| X440 (400 MHz BW) || 3360 || 798 || 784 || 616 || 461&lt;br /&gt;
|-&lt;br /&gt;
| X440 (1600 MHz BW) || 8118 || 2007 || 2007 || N/A || N/A&lt;br /&gt;
|}&lt;br /&gt;
Notes:&lt;br /&gt;
# E31x, N3xx, and X410 were tested using UHD 4.2. E320 and X3xx were tested using UHD 4.3.&lt;br /&gt;
# BIST refers to the built-in self test, which gives a measure of raw data throughput for a single channel.&lt;br /&gt;
# For MS/s, we assume 4 bytes per sample (sc16).&lt;br /&gt;
# X410 with 400 MHz bandwidth uses two independent memory banks, with channels 0-1 on Bank 0, and channels 2-3 on Bank 1 by default. The traffic flows on Bank 0 and Bank 1 are independent and do not affect each other. Therefore, a 4-channel configuration has the same performance as a 2-channel configuration.&lt;br /&gt;
# X440 uses two independent memory banks. For 400 MHz, channels 0-3 are on Bank 0 and channels 4-7 are on Bank 1 by default. For 1600 MHz, channel 0 is on Bank 0 and channel 1 is on bank 1 by default. The traffic flows on Bank 0 and Bank 1 are independent and do not affect each other. Therefore, a 2-channel configuration has the same performance as a 1-channel configuration.&lt;br /&gt;
&lt;br /&gt;
=== What can the DRAM be used for? ===&lt;br /&gt;
&lt;br /&gt;
* '''DMA FIFO Block:''' The DMA FIFO block is used in situations where you need a large buffer to store samples.&lt;br /&gt;
&lt;br /&gt;
* '''Replay Block:''' The Replay block is used to record and play back RF data. For example, you can record data from a host computer, then play it back over the radio. Or, record data from the radio, then play it back later to the host for analysis, or play it back to a radio at a specific timestamp. See [[Using the RFNoC Replay Block in UHD 4]] for additional information. The Replay block also has a FIFO capability for situations in which the DMA FIFO block is not available in your FPGA image.&lt;br /&gt;
&lt;br /&gt;
* '''Custom Blocks:''' You can also create your own RFNoC block that uses DRAM. Refer to the DMA FIFO and/or Replay blocks as examples.&lt;br /&gt;
&lt;br /&gt;
=== How do I add the Replay/DMA FIFO block to my FPGA image? ===&lt;br /&gt;
&lt;br /&gt;
If the block you want is not included by default in the FPGA image you are using, you can add it to the RFNoC image core YAML file and rebuild the FPGA image using Vivado. See [[Getting Started with RFNoC in UHD 4.0]] for additional information on customizing an RFNoC image.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' DRAM is not enabled by default on E31x FPGA builds because the FPGA is not large enough to fit the default image with DRAM. You will need to remove components from your RFNoC image's YAML file to make room, then build the E31x image with the variable DRAM=1 set, or modify the E31x Makefile to enable DRAM by default.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' The default DRAM configuration used for X410 and X440 changes depending on the configured bandwidth. The default parameters to use for each image type is shown in the table below.&lt;br /&gt;
&lt;br /&gt;
When adding the blocks to your RFNoC image core YAML file, the parameters must be set correctly for the type of USRP you intend to use. The memory data width (&amp;lt;code&amp;gt;MEM_DATA_W&amp;lt;/code&amp;gt;) and address width (&amp;lt;code&amp;gt;MEM_ADDR_W&amp;lt;/code&amp;gt;) must match exactly. The number of ports (&amp;lt;code&amp;gt;NUM_PORTS&amp;lt;/code&amp;gt;) must not exceed the maximum number available. You can use fewer ports to save resources if you don't need all the DRAM ports.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ RFNoC Block Memory Parameters&lt;br /&gt;
|-&lt;br /&gt;
! USRP Model !! MEM_DATA_W !! MEM_ADDR_W !! NUM_PORTS (Max)&lt;br /&gt;
|-&lt;br /&gt;
| E31x || 64 || 29 || 2&lt;br /&gt;
|-&lt;br /&gt;
| E320 || 64 || 31 || 4&lt;br /&gt;
|-&lt;br /&gt;
| N3xx || 64 || 31 || 4&lt;br /&gt;
|-&lt;br /&gt;
| X3xx || 64 || 30 || 2&lt;br /&gt;
|-&lt;br /&gt;
| X410 (100 and 200 MHz BW) || 64 || 32 || 4&lt;br /&gt;
|-&lt;br /&gt;
| X410 (400 MHz BW) || 128 || 32 || 4&lt;br /&gt;
|-&lt;br /&gt;
| X440 (400 MHz BW) || 128 || 32 || 8&lt;br /&gt;
|-&lt;br /&gt;
| X440 (1600 MHz BW) || 512 || 32 || 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The DMA FIFO has a few additional parameters that should be provided. The clock rate (&amp;lt;code&amp;gt;MEM_CLK_RATE&amp;lt;/code&amp;gt;) must match the value below for the built-in self test (BIST) to work correctly. The base address (&amp;lt;code&amp;gt;FIFO_ADDR_BASE&amp;lt;/code&amp;gt;) and address mask (&amp;lt;code&amp;gt;FIFO_ADDR_MASK&amp;lt;/code&amp;gt;) are written as Verilog constants and can be changed depending on your application. The &amp;lt;code&amp;gt;FIFO_ADDR_BASE&amp;lt;/code&amp;gt; parameter contains the byte address for the first byte of the memory region to use for each port. The &amp;lt;code&amp;gt;FIFO_ADDR_MASK&amp;lt;/code&amp;gt; parameter contains the address mask for each port, which tells the FIFO how much memory to use for each port. For example, an address mask of &amp;lt;code&amp;gt;30'h1FFFFFFF&amp;lt;/code&amp;gt; means that 0x1FFFFFFF+1 bytes (i.e., 0x20000000 bytes or 512 MiB) will be used by the corresponding port. The address mask must be 1 less than a power of 2.&lt;br /&gt;
&lt;br /&gt;
The example values in the table below use the entire memory and divide it evenly between all available ports. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ DMA FIFO Parameters&lt;br /&gt;
|-&lt;br /&gt;
! USRP Model !! MEM_CLK_RATE !! FIFO_ADDR_BASE !! FIFO_ADDR_MASK&lt;br /&gt;
|-&lt;br /&gt;
| E31x || &amp;quot;200e6&amp;quot; || &amp;quot;{29'h10000000, 29'h00000000}&amp;quot; || &amp;quot;{29'h0FFFFFFF, 29'h0FFFFFFF}&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| E320 || &amp;quot;300e6&amp;quot; || &amp;quot;{31'h60000000, 31'h40000000, 31'h20000000, 31'h00000000}&amp;quot; || &amp;quot;{31'h1FFFFFFF, 31'h1FFFFFFF, 31'h1FFFFFFF, 31'h1FFFFFFF}&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| N3xx || &amp;quot;303819444&amp;quot; || &amp;quot;{31'h60000000, 31'h40000000, 31'h20000000, 31'h00000000}&amp;quot; || &amp;quot;{31'h1FFFFFFF, 31'h1FFFFFFF, 31'h1FFFFFFF, 31'h1FFFFFFF}&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| X3xx || &amp;quot;300e6&amp;quot; || &amp;quot;{30'h20000000, 30'h00000000}&amp;quot; || &amp;quot;{30'h1FFFFFFF, 30'h1FFFFFFF}&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| X410 (100 and 200 MHz BW) || &amp;quot;250e6&amp;quot; || &amp;quot;{32'hC0000000, 32'h80000000, 32'h40000000, 32'h00000000}&amp;quot; || &amp;quot;{32'h3FFFFFFF, 32'h3FFFFFFF, 32'h3FFFFFFF, 32'h3FFFFFFF}&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| X410 (400 MHz BW) || &amp;quot;250e6&amp;quot; || &amp;quot;{32'h80000000, 32'h00000000, 32'h80000000, 32'h00000000}&amp;quot; || &amp;quot;{32'h7FFFFFFF, 32'h7FFFFFFF, 32'h7FFFFFFF, 32'h7FFFFFFF}&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| X440 (400 MHz BW) || &amp;quot;300e6&amp;quot; || &amp;quot;{32'hC0000000, 32'h80000000, 32'h40000000, 32'h00000000, 32'hC0000000, 32'h80000000, 32'h40000000, 32'h00000000}&amp;quot; || &amp;quot;{32'h3FFFFFFF, 32'h3FFFFFFF, 32'h3FFFFFFF, 32'h3FFFFFFF, 32'h3FFFFFFF, 32'h3FFFFFFF, 32'h3FFFFFFF, 32'h3FFFFFFF}&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| X440 (1600 MHz BW) || &amp;quot;300e6&amp;quot; || &amp;quot;{32'h00000000, 32'h00000000}&amp;quot; || &amp;quot;{32'hFFFFFFFF, 32'hFFFFFFFF}&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Replay Example ====&lt;br /&gt;
&lt;br /&gt;
See [https://github.com/EttusResearch/uhd/blob/197cdc4f665cbd4e6394a7eeb44b405f67ab10b1/fpga/usrp3/top/x300/x310_rfnoc_image_core.yml#L69 x310_rfnoc_image_core.yml] for an example of how to instantiate the Replay block in the RFNoC image core YAML description. The following is a generic example that can be used for any USRP:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
noc_blocks:&lt;br /&gt;
  # Instantiate the replay block&lt;br /&gt;
  replay0:&lt;br /&gt;
    block_desc: 'replay.yml'&lt;br /&gt;
    parameters:&lt;br /&gt;
      NUM_PORTS: &amp;lt;see table&amp;gt;&lt;br /&gt;
      MEM_DATA_W: &amp;lt;see table&amp;gt;&lt;br /&gt;
      MEM_ADDR_W: &amp;lt;see table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
connections:&lt;br /&gt;
  # Connect each port of the replay block to a stream endpoint&lt;br /&gt;
  - { srcblk: &amp;lt;epN&amp;gt;,   srcport: out0,  dstblk: replay0, dstport: in_0 }&lt;br /&gt;
  - { srcblk: replay0, srcport: out_0, dstblk: &amp;lt;epN&amp;gt;,   dstport: in0  }&lt;br /&gt;
  - { srcblk: &amp;lt;epN+1&amp;gt;, srcport: out0,  dstblk: replay0, dstport: in_1 }&lt;br /&gt;
  - { srcblk: replay0, srcport: out_1, dstblk: &amp;lt;epN+1&amp;gt;, dstport: in0  }&lt;br /&gt;
  ... repeat for each remaining Replay port&lt;br /&gt;
  # Connect the replay block memory interface to the USRP DRAM&lt;br /&gt;
  - { srcblk: replay0, srcport: axi_ram, dstblk: _device_, dstport: dram }&lt;br /&gt;
&lt;br /&gt;
Connect the DRAM clock to the block:&lt;br /&gt;
clk_domains:&lt;br /&gt;
  # Connect the DRAM clock to the replay block&lt;br /&gt;
  - { srcblk: _device_, srcport: dram, dstblk: replay0, dstport: mem }&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DMA FIFO Example ====&lt;br /&gt;
&lt;br /&gt;
See [https://github.com/EttusResearch/uhd/blob/197cdc4f665cbd4e6394a7eeb44b405f67ab10b1/fpga/usrp3/top/e320/e320_rfnoc_image_core.yml#L49 e320_rfnoc_image_core.yml] for an example of how to instantiate the DMA FIFO block in the RFNoC image core YAML description. The following is a generic example that can be used for any USRP:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
noc_blocks:&lt;br /&gt;
  # Instantiate the DMA FIFO block&lt;br /&gt;
  fifo0:&lt;br /&gt;
    block_desc: 'axi_ram_fifo.yml'&lt;br /&gt;
    parameters:&lt;br /&gt;
      NUM_PORTS: &amp;lt;see table&amp;gt;&lt;br /&gt;
      MEM_DATA_W: &amp;lt;see table&amp;gt;&lt;br /&gt;
      MEM_ADDR_W: &amp;lt;see table&amp;gt;&lt;br /&gt;
      FIFO_ADDR_BASE: &amp;lt;see table&amp;gt;&lt;br /&gt;
      FIFO_ADDR_MASK: &amp;lt;see table&amp;gt;&lt;br /&gt;
      MEM_CLK_RATE: &amp;lt;see table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
connections:&lt;br /&gt;
  # Connect each port of the DMA FIFO block to a stream endpoint, or insert it&lt;br /&gt;
  # into the data path where desired. This examples uses stream endpoints.&lt;br /&gt;
  - { srcblk: &amp;lt;epN&amp;gt;,   srcport: out0,  dstblk: fifo0,   dstport: in_0 }&lt;br /&gt;
  - { srcblk: replay0, srcport: out_0, dstblk: &amp;lt;epN&amp;gt;,   dstport: in0  }&lt;br /&gt;
  - { srcblk: &amp;lt;epN+1&amp;gt;, srcport: out0,  dstblk: fifo0,   dstport: in_1 }&lt;br /&gt;
  - { srcblk: fifo0,   srcport: out_1, dstblk: &amp;lt;epN+1&amp;gt;, dstport: in0  }&lt;br /&gt;
  ... repeat for each remaining FIFO port&lt;br /&gt;
  # Connect the DMA FIFO block memory interface to the USRP DRAM&lt;br /&gt;
  - { srcblk: fifo0, srcport: axi_ram, dstblk: _device_, dstport: dram }&lt;br /&gt;
&lt;br /&gt;
clk_domains:&lt;br /&gt;
  # Connect the DRAM clock to the replay block&lt;br /&gt;
  - { srcblk: _device_, srcport: dram, dstblk: fifo0,  dstport: mem }&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== RFNoC Clocks ==&lt;br /&gt;
&lt;br /&gt;
=== What clocks are available for me to use? ===&lt;br /&gt;
&lt;br /&gt;
Each device has different clocks available. See below for a list of clocks exposed to RFNoC. Although they have intended purposes, you can use any of these clocks for any purpose. The &amp;lt;code&amp;gt;rfnoc_chdr_clock&amp;lt;/code&amp;gt; is a good default choice. This clock is always available in your block, even if it is not explicitly connected in the RFNoC image YAML description.&lt;br /&gt;
&lt;br /&gt;
=== What are the clock frequencies? ===&lt;br /&gt;
&lt;br /&gt;
See the table below for the clock rates. The radio clock rate depends on the master clock rate.&lt;br /&gt;
&lt;br /&gt;
====E31x====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Clock Name !! Description !! Frequency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_chdr&amp;lt;/code&amp;gt; || RFNoC CHDR clock || 100 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_ctrl&amp;lt;/code&amp;gt; || RFNoC Control clock || 40 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dram&amp;lt;/code&amp;gt; || DRAM interface clock || 100 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt; || Radio interface clock || Same as master clock rate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====E320====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Clock Name !! Description !! Frequency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_chdr&amp;lt;/code&amp;gt; || RFNoC CHDR clock || 200 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_ctrl&amp;lt;/code&amp;gt; || RFNoC Control clock || 40 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dram&amp;lt;/code&amp;gt; || DRAM interface clock || 166.667 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt; || Radio interface clock || Same as master clock rate (200 kHz to 61.44 MHz)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====N300/N310====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Clock Name !! Description !! Frequency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_chdr&amp;lt;/code&amp;gt; || RFNoC CHDR clock || 200 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_ctrl&amp;lt;/code&amp;gt; || RFNoC Control clock || 40 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ce&amp;lt;/code&amp;gt; || Compute Engine clock || 266.667 MHz (available in UHD 4.6 and later)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dram&amp;lt;/code&amp;gt; || DRAM interface clock || 303.819 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt; || Radio interface clock || Same as master clock rate (122.88 MHz, 125.0 MHz, or 153.6 MHz)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====N32x====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Clock Name !! Description !! Frequency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_chdr&amp;lt;/code&amp;gt; || RFNoC CHDR clock || 200 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_ctrl&amp;lt;/code&amp;gt; || RFNoC Control clock || 40 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ce&amp;lt;/code&amp;gt; || Compute Engine clock || 266.667 MHz (available in UHD 4.6 and later)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dram&amp;lt;/code&amp;gt; || DRAM interface clock || 303.819 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt; || Radio interface clock || Same as master clock rate (200 MHz, 245.76 MHz, or 250 MHz)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====X3xx====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Clock Name !! Description !! Frequency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_chdr&amp;lt;/code&amp;gt; || RFNoC CHDR clock || 187.5 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_ctrl&amp;lt;/code&amp;gt; || RFNoC Control clock || 93.75 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ce&amp;lt;/code&amp;gt; || Compute Engine clock || 214.286 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dram&amp;lt;/code&amp;gt; || DRAM interface clock || 300 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt; || Radio interface clock || Same as master clock rate (184.32 MHz or 200 MHz)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====X410====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Clock Name !! Description !! Frequency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_chdr&amp;lt;/code&amp;gt; || RFNoC CHDR clock || 200 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_ctrl&amp;lt;/code&amp;gt; || RFNoC Control clock || 40 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ce&amp;lt;/code&amp;gt; || Compute Engine clock || 266.667 MHz (available in UHD 4.6 and later)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dram&amp;lt;/code&amp;gt; || DRAM interface clock || 250 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt; || Radio interface clock || 122.88 MHz when master clock rate is 122.88, 245.76, or 491.52 MHz&amp;lt;br&amp;gt;125 MHz when master clock rate is 125, 250, or 500 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio_2x&amp;lt;/code&amp;gt; || Radio interface clock 2x || Twice the frequency of &amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====X440====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Clock Name !! Description !! Frequency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_chdr&amp;lt;/code&amp;gt; || RFNoC CHDR clock || 200 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rfnoc_ctrl&amp;lt;/code&amp;gt; || RFNoC Control clock || 40 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ce&amp;lt;/code&amp;gt; || Compute Engine clock || 266.667 MHz (available in UHD 4.6 and later)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dram&amp;lt;/code&amp;gt; || DRAM interface clock || 300 MHz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio0&amp;lt;/code&amp;gt; || Radio interface clock for daughterboard 0 || Daughterboard 0 master clock rate divided by 8 (e.g., 62.5 MHz if master clock rate is 500 MHz)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio1&amp;lt;/code&amp;gt; || Radio interface clock for daughterboard 1 || Daughterboard 1 master clock rate divided by 8&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio0_2x&amp;lt;/code&amp;gt; || Radio interface clock 2x for daughterboard 0 || Twice the frequency of &amp;lt;code&amp;gt;radio0&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;radio1_2x&amp;lt;/code&amp;gt; || Radio interface clock 2x for daughterboard 1 || Twice the frequency of &amp;lt;code&amp;gt;radio1&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== How do I add a clock with a different frequency? ===&lt;br /&gt;
&lt;br /&gt;
If you only need the clock within your own RFNoC block, you can modify the HDL for your block to generate the clock that you need from one of the available clocks. To do this, add a new clock to your block's YAML description, connect the available clock to your block in the YAML description of your RFNoC image, then add a Xilinx MMCM IP instance to your block's HDL and connect the available clock to its input.&lt;br /&gt;
&lt;br /&gt;
Starting with UHD 4.7, you can add clock generation modules that create new clocks based on the existing clocks. Note that you must create such a module as an HDL module: Describing clocks in the YAML files will not cause them to be generated for you.&lt;br /&gt;
&lt;br /&gt;
Assuming you have such a module, describe the clocks in the module's YAML files as such:&lt;br /&gt;
&lt;br /&gt;
 clocks:&lt;br /&gt;
    - name: ce&lt;br /&gt;
      direction: in&lt;br /&gt;
    - name: my_clk&lt;br /&gt;
      direction: out&lt;br /&gt;
&lt;br /&gt;
Now you will have a new clock called &amp;lt;code&amp;gt;my_clk&amp;lt;/code&amp;gt;, which is derived from the &amp;lt;code&amp;gt;ce&amp;lt;/code&amp;gt; clock.&lt;br /&gt;
&lt;br /&gt;
In older versions of UHD, adding custom clocks is not directly supported. If you can't use any of the available clocks, you can modify the HDL code to generate a clock.&lt;br /&gt;
&lt;br /&gt;
If the clock is needed by multiple RFNoC blocks, or if you want to change an existing clock, you can modify the HDL for the USRP you are using to add or change a clock. If you add a new clock to the RFNoC image core, you must also update the BSP YAML file (located in [https://github.com/EttusResearch/uhd/tree/master/host/include/uhd/rfnoc/core &amp;lt;repo&amp;gt;/host/include/uhd/rfnoc/core]) so that the &amp;lt;code&amp;gt;rfnoc_image_builder&amp;lt;/code&amp;gt; knows that the clock exists. How and where the clocks are generated varies between USRPs. Please refer to the source code for that USRP ([https://github.com/EttusResearch/uhd/tree/master/fpga/usrp3/top &amp;lt;repo&amp;gt;/fpga/usrp3/top]).&lt;br /&gt;
&lt;br /&gt;
== Xilinx Vivado ==&lt;br /&gt;
&lt;br /&gt;
=== Do I need a Vivado license to build custom RFNoC FPGA images? ===&lt;br /&gt;
&lt;br /&gt;
All RFNoC-capable USRPs use Xilinx FPGAs that require a license to use Vivado, except for E31x USRPs, which can use the free Vivado HL WebPACK Edition. Vivado is required to build FPGAs for RFNoC. &lt;br /&gt;
&lt;br /&gt;
=== Which version and edition of Vivado do I need? ===&lt;br /&gt;
&lt;br /&gt;
See the [https://files.ettus.com/manual/md_usrp3_build_instructions.html UHD User Manual] for the latest Vivado version requirements. UHD versions 4.0 through 4.2 require Vivado 2019.1.&lt;br /&gt;
&lt;br /&gt;
For E31x devices, you can use the free Vivado HL Webpack. For all other USRPs, you can use Design Edition or System Edition. We recommend Design Edition, unless you plan to use System Generator for DSP. System Generator is not required by RFNoC.&lt;br /&gt;
&lt;br /&gt;
=== Can I use a different Vivado version from the one required by my UHD version? ===&lt;br /&gt;
&lt;br /&gt;
This is technically possible, but it can be a lot of work to convert and adapt all of the IP to a new Vivado version, and your custom combination of UHD and Vivado versions will not have been tested or validated by Ettus Research. Therefore, this is not recommended or supported.&lt;br /&gt;
&lt;br /&gt;
=== Do I need to install all components of Vivado? ===&lt;br /&gt;
&lt;br /&gt;
No. You only need to install device support for the FPGA you intend to build. Other devices can be unchecked to save disk space. The following FPGA types are used by USRPs:&lt;br /&gt;
&lt;br /&gt;
* '''SoCs &amp;gt; Zynq-7000:''' E31x, E320, N3xx&lt;br /&gt;
* '''SOCs &amp;gt; Zynq UltraScale+ RFSoC:''' X410&lt;br /&gt;
* '''7 Series &amp;gt; Kintex-7''': X3xx&lt;br /&gt;
&lt;br /&gt;
The Software Development Kit (SDK) is typically not required, but can be installed if desired.&lt;br /&gt;
&lt;br /&gt;
The Cable Drivers are needed if you plan to do JTAG download or debug. Note that on Linux, the cable drivers are copied to the install folder, but are not installed onto your system automatically. See Xilinx UG973 for instructions on installing the cable drivers on Linux.&lt;br /&gt;
&lt;br /&gt;
== Building FPGA Images ==&lt;br /&gt;
&lt;br /&gt;
=== Why did my FPGA build fail to meet timing constraints? ===&lt;br /&gt;
&lt;br /&gt;
FPGAs have clocks that trigger the transfer of data between internal registers. The Vivado tool does a timing check near the end of the build to ensure that the paths from each driving register or port to each receiving register or port are not too long for the specified clock period or delay constraints. When it says &amp;quot;The design did not satisfy timing constraints&amp;quot; it means that Vivado couldn't arrange the logic on the chip in a way that meets all requirements. There are several reasons this might happen:&lt;br /&gt;
&lt;br /&gt;
* You added new logic to the design with too much logic between registers. In this case, you should modify your design to make meeting timing easier.&lt;br /&gt;
* You added new logic, but made a mistake in which you're trying to use the wrong clock or reset, which makes it difficult to meet timing. In this case you need to correct the mistake in your design.&lt;br /&gt;
* The design has become too crowded, making it difficult for the tools to meet the timing requirements. In this case you need to remove something to make more room.&lt;br /&gt;
* Bad luck. The tools use pseudorandom algorithms to find solutions to really hard problems, and sometimes it doesn't find a good solution even when one is possible. In this case you can make a minor change to the design and build again to see if it does better the second time. If you don't change anything, Vivado will normally give you identical results for each build. In UHD 4.4 and later you can add the &amp;lt;code&amp;gt;BUILD_SEED=1&amp;lt;/code&amp;gt; option to the &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; arguments to change a build seed that will affect the build results. Using a different seed number for each build will ensure that you get a unique build result each time. 0 is the default seed if not specified. Random build failures occur occasionally for some FPGA targets, in which case you should retry the build with a different seed.&lt;br /&gt;
&lt;br /&gt;
The FPGA tools produce a timing report that says exactly which path failed to meet timing. Sometimes that can point you in the right direction. But sometimes the path indicated only failed because of another path that's even more difficult. Open &amp;lt;code&amp;gt;post_route_timing_summary.rpt&amp;lt;/code&amp;gt; in the build output folder and search for &amp;quot;(VIOLATED)&amp;quot; to find the path(s) that failed.&lt;br /&gt;
&lt;br /&gt;
=== My design doesn't fit in the FPGA. What can I do to reduce the size? ===&lt;br /&gt;
&lt;br /&gt;
Read the &amp;lt;code&amp;gt;post_synth_util.rpt&amp;lt;/code&amp;gt; to determine what resource(s) you are running out of in order to know what kinds of changes are needed. Below are several easy ways to reduce the resource utilization of the FPGA.&lt;br /&gt;
&lt;br /&gt;
* If you are not using all RF channels of your device, modify the FPGA YAML file to remove the DDC, DUC, and Radio blocks for the unused channels, then regenerate the FPGA code using &amp;lt;code&amp;gt;rfnoc_image_builder&amp;lt;/code&amp;gt;. Note that you may need at least one Radio block for RFNoC to work properly. You may also remove the DDC and/or the DUC if your application uses full bandwidth for one or more channels and therefore doesn't require up or down conversion.&lt;br /&gt;
* If you are not using DRAM, remove the Replay or DMA FIFO blocks. Also, on X4xx, change the &amp;lt;code&amp;gt;DRAM_CH&amp;lt;/code&amp;gt; variable to 0 in the Makefile for the FPGA target you are building.&lt;br /&gt;
* If you do not need all SFP ports, use a build target that matches your needs. For example, on X4xx, the &amp;quot;X1&amp;quot; option (one 10 Gbps lane) uses the least resources whereas &amp;quot;X4&amp;quot; (four 10 Gbps lanes) uses a lot more, and the &amp;quot;CG&amp;quot; option (four 25 Gbps lanes) uses the most.&lt;br /&gt;
* If you do not need the full bandwidth of the device, use a smaller bandwidth option. For example, on X410, the &amp;quot;_100&amp;quot; option (100 MHz bandwidth) uses less resources than the &amp;quot;_200&amp;quot; option (200 MHz bandwidth).&lt;br /&gt;
* Add the &amp;lt;code&amp;gt;crossbar_routes&amp;lt;/code&amp;gt; definition to the FPGA YAML file to include only the crossbar paths required for your application. This is an advanced feature in UHD 4.5 and later. This must be done carefully to avoid removing essential paths. See the X440 YAML files for examples.&lt;br /&gt;
&lt;br /&gt;
Other reductions are possible but require advanced knowledge of UHD and/or RFNoC to avoid breaking key functionality of the device.&lt;br /&gt;
&lt;br /&gt;
=== How do I create a Vivado project for my FPGA build? ===&lt;br /&gt;
&lt;br /&gt;
Vivado supports two modes of operation known as &amp;quot;project mode&amp;quot; and &amp;quot;non-project mode&amp;quot;. Project mode is more user-friendly because it creates a project file that is managed by Vivado and works natively in the Vivado GUI. Non-project mode is generally used by more advanced users who want full control over the Vivado build process and is typically used in fully scripted or automated build flows. The USRP build flow in UHD uses non-project mode. As a result, there is no Vivado project file by default.&lt;br /&gt;
&lt;br /&gt;
It is possible to create a project file from the USRP build flow with the following steps:&lt;br /&gt;
&lt;br /&gt;
# Start the USRP FPGA build in the GUI. In UHD 4.7 and later, this can be done by adding the &amp;lt;code&amp;gt;-g&amp;lt;/code&amp;gt; argument to the &amp;lt;code&amp;gt;rfnoc_image_builder&amp;lt;/code&amp;gt; command. In UHD 4.6 and earlier, this can be done by adding &amp;lt;code&amp;gt;GUI=1&amp;lt;/code&amp;gt; to the &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; arguments. Example: &amp;lt;code&amp;gt;make X410_X4_200 GUI=1&amp;lt;/code&amp;gt;&lt;br /&gt;
# After the build completes, run the following command in the TCL Console of Vivado to create the project file and switch to project mode:&amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;save_project_as project_name project_dir&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;In this example, &amp;quot;project_name&amp;quot; is the name you want to give the project file and &amp;quot;project_dir&amp;quot; is the directory in which you want to put the project.&lt;br /&gt;
# Set the compile order to automatic: &amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;set_property source_mgmt_mode All [current_project]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In some cases, it may also be necessary to reset the output products for some of the IP. If you get an error message about a BD sub-design being not generated for the synthesis target, then navigate to the &amp;quot;IP Sources&amp;quot; tab in the Project Manager Sources window, then right-click on affected IP and select &amp;quot;Reset Output Products...&amp;quot;, then click &amp;quot;Reset&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
This project file can now be used independently of the normal FPGA build flow in UHD. It is up to the user to update this project file as the design changes since it will not be managed by the normal build flow in UHD.&lt;br /&gt;
&lt;br /&gt;
=== My FPGA takes a long time to build. What can I do to make builds faster? ===&lt;br /&gt;
&lt;br /&gt;
High-performance computers are recommended for FPGA builds since an FPGA build can take several hours.&lt;br /&gt;
&lt;br /&gt;
The build process is divided into two steps, IP generation and the FPGA build.&lt;br /&gt;
&lt;br /&gt;
==== IP Generation ====&lt;br /&gt;
&lt;br /&gt;
This process can take several hours by default and is run automatically, if needed, when you build an FPGA target. Fortunately, this only needs to be done once for each USRP type and won't run again unless IP is changed.&lt;br /&gt;
&lt;br /&gt;
You can speed up the IP generation by running this step with multiple jobs. For example:&lt;br /&gt;
&lt;br /&gt;
    $ make -j 4 X410_IP&lt;br /&gt;
&lt;br /&gt;
This example will build four IP cores at a time. Note that this generally requires 4 times as much memory and needs at least 4 CPU cores. You can adjust the number of parallel jobs based on the amount of system memory and/or CPU cores you have available.&lt;br /&gt;
&lt;br /&gt;
==== FPGA Build ====&lt;br /&gt;
&lt;br /&gt;
Unfortunately, increasing the number of jobs does not speed up FPGA performance because there is only one Vivado instance for the FPGA build. Vivado, by default, will use multiple CPU cores, where possible, but this does not significantly improve build performance since many parts of the build are not easily parallelizable.&lt;br /&gt;
&lt;br /&gt;
One way to shorten the build time is to reduce the size of the design. See above on how to reduce the size of your design.&lt;br /&gt;
&lt;br /&gt;
In the case where you need to build multiple FPGA types, you can use the jobs option with &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; to build multiple FPGAs simultaneously, which can dramatically reduce the time required per build. Note that this requires a significant amount of memory and CPU cores and therefore is only recommended for systems that can handle such loads. An example is shown below for building two FPGA images in parallel:&lt;br /&gt;
&lt;br /&gt;
    $ make -j 2 X410_X4_200 X410_CG_400&lt;br /&gt;
&lt;br /&gt;
It is also possible to open separate terminal instances and run one build in each instance to get the same effect. Do not build the same FPGA target in multiple instances, since multiple builds for the same target would conflict as they try to access and update the same files.&lt;br /&gt;
&lt;br /&gt;
=== When I start an FPGA build or use rfnoc_image_builder, I get an error &amp;quot;setupenv.sh: source: not found&amp;quot; and the build fails. What happened? ===&lt;br /&gt;
&lt;br /&gt;
In some Linux distributions (e.g. Ubuntu) &amp;lt;code&amp;gt;dash&amp;lt;/code&amp;gt; is set as default shell which can cause FPGA builds to fail.&lt;br /&gt;
&lt;br /&gt;
Below is an example of the error. Note, that your message may look somewhat different depending on UHD version and USRP target but the important lines are marked in bold.&lt;br /&gt;
&lt;br /&gt;
    rfnoc_image_builder -y e320_rfnoc_image_core_fft.yml -t E320_1G&lt;br /&gt;
    Using FPGA directory /home/someuser/uhd/fpga&lt;br /&gt;
    Selected device: e320&lt;br /&gt;
    Build artifacts directory already exists (contents will be overwritten).&lt;br /&gt;
    Launching build with the following settings:&lt;br /&gt;
     * FPGA Directory: /home/someuser/uhd/fpga/usrp3/top/e320&lt;br /&gt;
     * Build Artifacts Directory: /home/someuser/uhd/fpga/usrp3/top/e320/build-usrp_e320_fpga_1G&lt;br /&gt;
     * Build Output Directory: /home/someuser/uhd/fpga/usrp3/top/e320/build&lt;br /&gt;
     * Build IP Directory: /home/someuser/uhd/fpga/usrp3/top/e320/build-ip&lt;br /&gt;
    Executing the following command: . ./setupenv.sh &amp;amp;&amp;amp; make E320_1G BUILD_DIR=/home/someuser/uhd/fpga/usrp3/top/e320/build-usrp_e320_fpga_1G IMAGE_CORE_NAME=usrp_e320_fpga_1G&lt;br /&gt;
    '''/bin/sh: 6: ./setupenv.sh: Bad substitution'''&lt;br /&gt;
    '''/bin/sh: 8: ./setupenv.sh: declare: not found'''&lt;br /&gt;
    /bin/sh: 9: ./setupenv.sh: PRODUCT_ID_MAP[E320]=zynq/xc7z045/ffg900/-3: not found&lt;br /&gt;
    '''/bin/sh: 15: ./setupenv.sh: source: not found'''&lt;br /&gt;
    Build finished with return code 127.&lt;br /&gt;
&lt;br /&gt;
It is recommended to set the default shell to &amp;lt;code&amp;gt;bash&amp;lt;/code&amp;gt; by running the following command in the terminal. When asked &amp;lt;code&amp;gt;Use dash as the default system shell (/bin/sh)?&amp;lt;/code&amp;gt; choose &amp;lt;code&amp;gt;&amp;lt;No&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    $ sudo dpkg-reconfigure dash&lt;br /&gt;
&lt;br /&gt;
Confirm your default shell was changed to bash by running this command:&lt;br /&gt;
&lt;br /&gt;
    $ ll /bin/sh&lt;br /&gt;
&lt;br /&gt;
You should see output similar to this:&lt;br /&gt;
&lt;br /&gt;
    lrwxrwxrwx 1 root root 4 Oct 10  2020 /bin/sh -&amp;gt; bash*&lt;br /&gt;
&lt;br /&gt;
=== My FPGA build failed with a cryptic message or no message at all. How do I debug this? ===&lt;br /&gt;
&lt;br /&gt;
When you build an FPGA target, a build directory is created in the FPGA's top directory that contains all the build outputs. Here you'll find the &amp;lt;code&amp;gt;build.log&amp;lt;/code&amp;gt; file as well as report files and checkpoints. Not all log information is printed to the console during build, so make sure you check the &amp;lt;code&amp;gt;build.log&amp;lt;/code&amp;gt; file for details. It may contain a useful error message that was not printed to the console.&lt;br /&gt;
&lt;br /&gt;
Builds often fail when Vivado encounters an internal error or runs out of memory. For internal errors, the error message is typically not very helpful and is often due to a bug in Vivado. When Vivado runs out of memory, it may immediately terminate without giving any error message at all. Consider monitoring the memory usage during the FPGA build to see if you are approaching your system's limit.&lt;br /&gt;
&lt;br /&gt;
If you have made changes to the design, try building an unmodified FPGA image from scratch to ensure the build process is working properly on your system. If this works, try adding your changes incrementally until the section of code causing the problem is identified.&lt;br /&gt;
&lt;br /&gt;
Note that such errors are often beyond the control of Ettus Research and reaching out to Xilinx support is a better option if it is truly a Vivado issue.&lt;br /&gt;
&lt;br /&gt;
=== I get a warning saying that an IP is locked, which results in errors later in the IP generation process. How do I resolve this? ===&lt;br /&gt;
&lt;br /&gt;
Vivado &amp;quot;locks&amp;quot; IP, for example, when it needs to be updated for the running version of Vivado or FPGA device type. This is intended to force the user to fix the issue and to avoid building incompatible IP. Build failures related to IP being locked should never occur during a normal build. The IP version in the UHD repo always matches the Vivado version required for that release of UHD.&lt;br /&gt;
&lt;br /&gt;
This can happen if you have used the wrong version of Vivado or do not have the correct Vivado patches installed. Refer to the &amp;lt;code&amp;gt;Generation 3 USRP Build Documentation&amp;lt;/code&amp;gt; section of the [[UHD and USRP User Manual|UHD Manual] for the required version and patches. When you run the `source setenv.sh` step to setup your environment, the script will check to make sure you are using the correct version.&lt;br /&gt;
&lt;br /&gt;
In some cases, reinstalling Vivado might be required.&lt;br /&gt;
&lt;br /&gt;
Once the correct Vivado version and patches are installed, you will need to remove all build products (to remove any locked IP that was generated) and retry the build. For example:&lt;br /&gt;
&lt;br /&gt;
    $ source setupenv.sh     # Setup environment and check the Vivado version&lt;br /&gt;
    $ make cleanall          # Remove any bad IP that was generated&lt;br /&gt;
    $ make X410_X4_200       # Start the build process again&lt;br /&gt;
&lt;br /&gt;
=== I see a &amp;quot;CRITICAL WARNING&amp;quot; in the build log. Is this expected? ===&lt;br /&gt;
&lt;br /&gt;
There are many critical warnings that appear during the build process that can be safely ignored. For example, you may see the following:&lt;br /&gt;
&lt;br /&gt;
    CRITICAL WARNING: [Vivado 12-1790] Evaluation License Warning: This design contains one or more IP cores that use separately licensed features. If the design has been configured to make use of evaluation features, please note that these features will cease to function after a certain period of time. Please consult the core datasheet to determine whether the core which you have configured will be affected. Evaluation features should NOT be used in production systems.&lt;br /&gt;
&lt;br /&gt;
The FPGA builds include IP for which the licenses are included with Vivado, but Vivado prints the warnings anyway. As long as you have a Vivado license and a bitstream was successfully generated, the IP should work as expected.&lt;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Writing_the_USRP_File_System_Disk_Image_to_a_SD_Card&amp;diff=6125</id>
		<title>Writing the USRP File System Disk Image to a SD Card</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Writing_the_USRP_File_System_Disk_Image_to_a_SD_Card&amp;diff=6125"/>
				<updated>2025-05-18T19:28:22Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: Update dd flags to remove the need to run &amp;quot;sync&amp;quot; after the command completes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Application Note Number==&lt;br /&gt;
'''AN-630'''&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;| 2018-12-12&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Nate Temple&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Initial creation&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This application note will provide step-by-step instructions on writing a file system disk image to a SD card using Linux.&lt;br /&gt;
&lt;br /&gt;
==Required Tools==&lt;br /&gt;
* Computer with USB2/3 Interface &lt;br /&gt;
* UHD Installation&lt;br /&gt;
* microSD card to USB Adapter&lt;br /&gt;
&lt;br /&gt;
==Downloading the File System Image==&lt;br /&gt;
To obtain the file system SD card image for your USRP device, run the command in the next step on the host computer with UHD installed and Internet access. &lt;br /&gt;
&lt;br /&gt;
===N3xx===&lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader -t sdimg -t n3xx&lt;br /&gt;
&lt;br /&gt;
Example Output for UHD 3.15.0.0:&lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader -t sdimg -t n3xx&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;
    845962 kB / 845962 kB (100%) n3xx_common_sdimg_default-v3.15.0.0.zip&lt;br /&gt;
    [INFO] Images download complete.&lt;br /&gt;
&lt;br /&gt;
===E31x===&lt;br /&gt;
&lt;br /&gt;
The Release 4 image comes in two varieties: SG1 and SG3. The variety that you will need depends on the product number of your E310. To see which version you need look over at [https://kb.ettus.com/E310/E312#SD_Card_Images E310/E312 - Ettus Knowledge Base]&lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader -t sdimg -t e310 -t sg1&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
    $ sudo uhd_images_downloader -t sdimg -t e310 -t sg3&lt;br /&gt;
&lt;br /&gt;
Example Output for UHD 3.15.0.0 for E310 SG3:&lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader -t sdimg -t e310 -t sg3&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;
    561236 kB / 561236 kB (100%) e3xx_e310_sg3_sdimg_default-v3.15.0.0.zip&lt;br /&gt;
    [INFO] Images download complete.&lt;br /&gt;
&lt;br /&gt;
===E320===&lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader -t sdimg -t e320&lt;br /&gt;
&lt;br /&gt;
Example Output for UHD 3.15.0.0:&lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader -t sdimg -t e320&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;
    795674 kB / 795674 kB (100%) e3xx_e320_sdimg_default-v3.15.0.0.zip&lt;br /&gt;
    [INFO] Images download complete.&lt;br /&gt;
&lt;br /&gt;
==Identifying UHD Installation Prefix==&lt;br /&gt;
&lt;br /&gt;
In the output of the &amp;lt;code&amp;gt;uhd_images_downloader&amp;lt;/code&amp;gt; command above, the folder destination where the images are saved is printed out.&lt;br /&gt;
&lt;br /&gt;
An alternative method to identify your installation prefix is to run the command:&lt;br /&gt;
&lt;br /&gt;
    $ uhd_config_info --install-prefix&lt;br /&gt;
&lt;br /&gt;
Example Output:&lt;br /&gt;
&lt;br /&gt;
    Install prefix: /usr/local&lt;br /&gt;
&lt;br /&gt;
The default folder location for FPGA and SD card images is:&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;UHD_INSTALL_PREFIX&amp;gt;/share/uhd/images/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Writing the File System Image with Linux==&lt;br /&gt;
&lt;br /&gt;
===Identifying SD Card Mount Location===&lt;br /&gt;
&lt;br /&gt;
Insert the microSD card into the host computer.&lt;br /&gt;
&lt;br /&gt;
To identify the device where the microSD card is, run the command:&lt;br /&gt;
&lt;br /&gt;
    dmesg | tail&lt;br /&gt;
&lt;br /&gt;
Example Output (partially truncated for readability):&lt;br /&gt;
&lt;br /&gt;
    [21265.575488] usb-storage 1-2:1.0: USB Mass Storage device detected&lt;br /&gt;
    [21266.586983] scsi 0:0:0:0: Direct-Access     Generic  Mass-Storage     1.11 PQ: 0 ANSI: 2&lt;br /&gt;
    [21266.588024] sd 0:0:0:0: Attached scsi generic sg0 type 0&lt;br /&gt;
    [21267.299812] sd 0:0:0:0: [sdb] 31116288 512-byte logical blocks: (15.9 Gb/14.8 GiB)&lt;br /&gt;
    [21267.302687]  sdb: sdb1 sdb2 sdb3 sdb4&lt;br /&gt;
&lt;br /&gt;
NOTE: In this specific example configuration, the SD card has been attached to &amp;lt;code&amp;gt;sdb&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Another method to finding the device node the disk is attached at is to use the Linux utility &amp;lt;code&amp;gt;lsblk&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Example Output:&lt;br /&gt;
&lt;br /&gt;
    $ lsblk&lt;br /&gt;
    NAME           MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT&lt;br /&gt;
    sdb      8:16   1 14.9G  0 disk&lt;br /&gt;
    ├─sdb1   8:17   1   16M  0 part /media/user/boot&lt;br /&gt;
    ├─sdb2   8:18   1  1.9G  0 part /media/user/primary&lt;br /&gt;
    ├─sdb3   8:19   1  1.9G  0 part /media/user/secondary&lt;br /&gt;
    └─sdb4   8:20   1   11G  0 part /media/user/data&lt;br /&gt;
&lt;br /&gt;
===Unmount Auto-mounted Partitions===&lt;br /&gt;
&lt;br /&gt;
Some operating systems by default will auto-mount the partitions on a block device when it is attached. Before writing a new disk image to the SD card, you should first unmount any mounted partitions. This can be done with the Linux utility &amp;lt;code&amp;gt;umount&amp;lt;/code&amp;gt; as shown below:&lt;br /&gt;
&lt;br /&gt;
    $ sudo umount /media/user/data&lt;br /&gt;
    $ sudo umount /media/user/primary&lt;br /&gt;
    $ sudo umount /media/user/secondary&lt;br /&gt;
    $ sudo umount /media/user/boot&lt;br /&gt;
&lt;br /&gt;
Running the command &amp;lt;code&amp;gt;lsblk&amp;lt;/code&amp;gt; again will show these partitions have been unmounted:&lt;br /&gt;
&lt;br /&gt;
Example Output:&lt;br /&gt;
&lt;br /&gt;
    $ lsblk&lt;br /&gt;
    NAME           MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT&lt;br /&gt;
    sdb      8:16   1 14.9G  0 disk&lt;br /&gt;
    ├─sdb1   8:17   1   16M  0 part&lt;br /&gt;
    ├─sdb2   8:18   1  1.9G  0 part&lt;br /&gt;
    ├─sdb3   8:19   1  1.9G  0 part&lt;br /&gt;
    └─sdb4   8:20   1   11G  0 part&lt;br /&gt;
&lt;br /&gt;
===Writing the SD Card Image===&lt;br /&gt;
&lt;br /&gt;
====Using dd to write the disk image====&lt;br /&gt;
&lt;br /&gt;
'''WARNING:''' The Linux utility &amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt; can cause unrecoverable data loss if the incorrect disk is selected, or if the parameters are input incorrectly. Ensure you have selected the correct input and output parameters for your system configuration.&lt;br /&gt;
&lt;br /&gt;
NOTE: You must use a 16 Gb or larger SD card for the N3xx and E320 file system images.&lt;br /&gt;
&lt;br /&gt;
The ​&amp;lt;code&amp;gt;&amp;lt;SD_CARD_DEV_NAME&amp;gt;​&amp;lt;/code&amp;gt; device node depends on your operating system and which other devices are plugged in. Typical values are ​&amp;lt;code&amp;gt;sdb&amp;lt;/code&amp;gt;​ or &amp;lt;code&amp;gt;mmcblk0​&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;&amp;lt;IMAGE&amp;gt;&amp;lt;/code&amp;gt; value will depend upon which file system image you're writing. Examples for the N300/N310 and E320 are listed below:&lt;br /&gt;
&lt;br /&gt;
'''N3xx'''&lt;br /&gt;
    &amp;lt;IMAGE&amp;gt;=/usr/local/share/uhd/images/usrp_n3xx_fs.sdimg&lt;br /&gt;
&lt;br /&gt;
'''E320'''&lt;br /&gt;
    &amp;lt;IMAGE&amp;gt;=/usr/local/share/uhd/images/usrp_e320_fs.sdimg&lt;br /&gt;
&lt;br /&gt;
Write the disk image with the command:&lt;br /&gt;
&lt;br /&gt;
    $ sudo dd if=&amp;lt;IMAGE&amp;gt; of=&amp;lt;SD_CARD_DEV_NAME&amp;gt; bs=1M&lt;br /&gt;
&lt;br /&gt;
This step of writing the disk image to the SD card can take several minutes to complete.&lt;br /&gt;
&lt;br /&gt;
Example Output:&lt;br /&gt;
&lt;br /&gt;
    $ sudo dd if=/usr/local/share/uhd/images/usrp_&amp;lt;deivce&amp;gt;_fs.sdimg of=/dev/sdb bs=1M status=progress oflag=direct conv=fsync&lt;br /&gt;
    15160+0 records in&lt;br /&gt;
    15160+0 records out&lt;br /&gt;
    15896412160 bytes (16 Gb, 15 GiB) copied, 1160.93 s, 13.7 MB/s&lt;br /&gt;
&lt;br /&gt;
You can now remove the microSD card from your host computer and insert it into the USRP.&lt;br /&gt;
&lt;br /&gt;
[[Category:Application Notes]]&lt;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Getting_Started_with_DPDK_and_UHD&amp;diff=6116</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=6116"/>
				<updated>2025-03-17T14:02:42Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: /* Dependencies */&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;
* 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 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. 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;
&lt;br /&gt;
DPDK releases come twice per year in April (version X.04) and November (version X.11). The first release is more of a beta while the second is more of a formal release. While either ''can'' be used with UHD, we recommend just the formal releases with version ending in 11.&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:&lt;br /&gt;
&lt;br /&gt;
    dpdk-devbind --status&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 --bind=vfio-pci 02:00.0&lt;br /&gt;
    sudo dpdk-devbind --bind=vfio-pci 02:00.1&lt;br /&gt;
&lt;br /&gt;
Now if you run &amp;lt;code&amp;gt;dpdk-devbind --status&amp;lt;/code&amp;gt; again, you should see the NICs listed under DPDK devices&lt;br /&gt;
&lt;br /&gt;
    # dpdk-devbind --status&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;
&lt;br /&gt;
'''Note:''' More info can be found here on the rebinding process:  https://doc.dpdk.org/guides-17.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 Mellanox NICs do not require rebinding using the &amp;lt;code&amp;gt;vfio-pci&amp;lt;/code&amp;gt; driver. Mellanox provides additional drivers for DPDK.&lt;br /&gt;
&lt;br /&gt;
Install and activate the Mellanox drivers:&lt;br /&gt;
&lt;br /&gt;
    sudo apt install librte-pmd-mlx5-17.11&lt;br /&gt;
    sudo modprobe -a ib_uverbs mlx5_core mlx5_ib&lt;br /&gt;
&lt;br /&gt;
For 18.11 you can download and install the latest Mellanox drivers from the mellanox website (https://www.mellanox.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 and ConnectX-5 cards. 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.&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. Using &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; will not work, you should switch to the &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; user by running &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:&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>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=RFNoC_4_Migration_Guide&amp;diff=6095</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=6095"/>
				<updated>2024-10-28T15:02:40Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: Update Prerequisites section to UHD 4.6&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 &amp;amp; 22.04)===&lt;br /&gt;
  sudo apt-get install autoconf automake build-essential cmake cpufrequtils doxygen ethtool \&lt;br /&gt;
  g++ git inetutils-tools libboost-all-dev libusb-1.0-0 libusb-1.0-0-dev libudev-dev \&lt;br /&gt;
  libspdlog-dev doxygen swig python3-docutils python3-mako python3-numpy python3-requests \&lt;br /&gt;
  python3-ruamel.yaml python3-setuptools cmake build-essential git g++ libgmp-dev swig \&lt;br /&gt;
  python3-sphinx python3-lxml doxygen libfftw3-dev libsdl1.2-dev libgsl-dev libqwt-qt5-dev \&lt;br /&gt;
  libqt5opengl5-dev python3-pyqt5 liblog4cpp5-dev libzmq3-dev python3-yaml python3-click \&lt;br /&gt;
  python3-click-plugins python3-zmq python3-scipy python3-gi python3-gi-cairo \&lt;br /&gt;
  gir1.2-gtk-3.0 libcodec2-dev libgsm1-dev pybind11-dev python3-matplotlib libsndfile1-dev \&lt;br /&gt;
  python3-jsonschema python3-pygccxml libtinfo5 libncurses5&lt;br /&gt;
&lt;br /&gt;
===Vivado 2021.1 Design Edition===&lt;br /&gt;
&lt;br /&gt;
Please refer to the dependencies section on the [https://files.ettus.com/manual_archive/v4.6.0.0/html/md_usrp3_build_instructions.html FPGA build page] in UHD's manual.&lt;br /&gt;
&lt;br /&gt;
''Note 1: Make sure to install [https://support.xilinx.com/s/article/76780?language=en_US AR76780 Patch for Vivado 2021.1]''&lt;br /&gt;
&lt;br /&gt;
''Note 2: The dependencies step above includes installing libtinfo5 libncurses5, which is a workaround for getting Vivado 2021.1 to run on Ubuntu 20.04 &amp;amp; 22.04''&lt;br /&gt;
&lt;br /&gt;
===UHD 4.6===&lt;br /&gt;
  git clone --branch UHD-4.6 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;
You can also reference the [https://wiki.gnuradio.org/index.php/UbuntuInstall GNU Radio Build Instructions] for more detailed information.&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 the 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, for example the DDC and DUC blocks are usually statically connected to the radio block&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 callback 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    = 0;&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 [https://github.com/EttusResearch/uhd/tree/master/host/lib/rfnoc 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 the 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 are 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 the 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>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=B200/B210/B200mini/B205mini/B206mini&amp;diff=6036</id>
		<title>B200/B210/B200mini/B205mini/B206mini</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=B200/B210/B200mini/B205mini/B206mini&amp;diff=6036"/>
				<updated>2024-04-24T16:09:29Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: Fix incorrect input power level&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The USRP Bus Series provides a fully integrated, single board, Universal Software Radio Peripheral platform with continuous frequency coverage from 70 MHz – 6 GHz. Designed for low-cost experimentation, it combines a fully integrated direct conversion transceiver providing up to 56MHz of real-time bandwidth, an open and reprogrammable Spartan6 FPGA, and fast and convenient bus-powered SuperSpeed USB 3.0 connectivity.&lt;br /&gt;
&lt;br /&gt;
== Key Features==&lt;br /&gt;
=== B200===&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Xilinx Spartan 6 XC6SLX75 FPGA&lt;br /&gt;
* Analog Devices AD9364 RFIC direct-conversion transceiver&lt;br /&gt;
* Frequency range: 70 MHz - 6 GHz&lt;br /&gt;
* Up to 56 MHz of instantaneous bandwidth&lt;br /&gt;
* Full duplex, SISO (1 Tx &amp;amp; 1 Rx)&lt;br /&gt;
* Fast and convenient bus-powered USB 3.0 connectivity&lt;br /&gt;
* Optional Board Mounted GPSDO&lt;br /&gt;
|[[File:Product b200.png|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== B210===&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Xilinx Spartan 6 XC6SLX150 FPGA&lt;br /&gt;
* Analog Devices AD9361 RFIC direct-conversion transceiver&lt;br /&gt;
* Frequency range: 70 MHz - 6 GHz&lt;br /&gt;
* Up to 56 MHz of instantaneous bandwidth (61.44MS/s quadrature)&lt;br /&gt;
* Full duplex, MIMO (2 Tx &amp;amp; 2 Rx)&lt;br /&gt;
* Fast and convenient bus-powered USB 3.0 connectivity&lt;br /&gt;
* Optional Board Mounted GPSDO &lt;br /&gt;
|[[File:Product b210.png|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== B200mini===&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Xilinx Spartan-6 XC6SLX75 FPGA&lt;br /&gt;
* Analog Devices AD9364 RFIC direct-conversion transceiver&lt;br /&gt;
* Frequency range: 70 MHz - 6 GHz&lt;br /&gt;
* Up to 56 MHz of instantaneous bandwidth&lt;br /&gt;
* Full duplex, SISO (1 Tx &amp;amp; 1 Rx)&lt;br /&gt;
* Fast and convenient bus-powered USB 3.0 connectivity&lt;br /&gt;
|[[File:Product b200 mini.png|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== B200mini-i===&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Industrial-grade Xilinx Spartan-6 XC6SLX75 FPGA&lt;br /&gt;
* Analog Devices AD9364 RFIC direct-conversion transceiver&lt;br /&gt;
* Frequency range: 70 MHz - 6 GHz&lt;br /&gt;
* Up to 56 MHz of instantaneous bandwidth&lt;br /&gt;
* Full duplex, SISO (1 Tx &amp;amp; 1 Rx)&lt;br /&gt;
* Fast and convenient bus-powered USB 3.0 connectivity&lt;br /&gt;
|[[File:Product b200 mini i.png|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== B205mini-i===&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Industrial-grade Xilinx Spartan-6 XC6SLX150 FPGA&lt;br /&gt;
* Analog Devices AD9364 RFIC direct-conversion transceiver&lt;br /&gt;
* Frequency range: 70 MHz - 6 GHz&lt;br /&gt;
* Up to 56 MHz of instantaneous bandwidth&lt;br /&gt;
* Full duplex, SISO (1 Tx &amp;amp; 1 Rx)&lt;br /&gt;
* Fast and convenient bus-powered USB 3.0 connectivity&lt;br /&gt;
|[[File:Product b200 mini i.png|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Frontend Specifications==&lt;br /&gt;
===Tuning===&lt;br /&gt;
&lt;br /&gt;
The RF frontend has individually tunable receive and transmit chains. On the B200 and B200 mini, there is one transmit and one receive RF frontend. On the B210, both transmit and receive can be used in a MIMO configuration. For the MIMO case on the B210 only, both receive frontends share the RX LO, and both transmit frontends share the TX LO. Each LO is independently tunable between 50 MHz and 6 GHz and can be used with 1 or 2 channels; all channels using the same LO must use the same sampling parameters, including the sample rate and RF center frequency.&lt;br /&gt;
&lt;br /&gt;
===Gains===&lt;br /&gt;
All frontends have individual analog gain controls. The receive frontends have 76 dB of available gain; and the transmit frontends have 89.8 dB of available gain. Gain settings are application specific, but it is recommended that users consider using at least half of the available gain to get reasonable dynamic range.&lt;br /&gt;
&lt;br /&gt;
===Bandwidths===&lt;br /&gt;
The analog frontend has a seamlessly adjustable bandwidth of 200 kHz to 56 MHz.&lt;br /&gt;
&lt;br /&gt;
Generally, when requesting any possible master clock rate, UHD will automatically configure the analog filters to avoid any aliasing (RX) or out-of-band emissions whilst letting through the cleanest possible signal.&lt;br /&gt;
&lt;br /&gt;
If you, however, happen to have a very strong interferer within half the master clock rate of your RX LO frequency, you might want to reduce this analog bandwidth. You can do so by calling uhd::usrp::multi_usrp::set_rx_bandwidth(bw).&lt;br /&gt;
&lt;br /&gt;
The property to control the analog RX bandwidth is bandwidth/value.&lt;br /&gt;
&lt;br /&gt;
UHD will not allow you to set bandwidths larger than your current master clock rate.&lt;br /&gt;
&lt;br /&gt;
==RF Specifications==&lt;br /&gt;
The USRP B200/B210/B200mini/B205mini are derived from the Analog devices AD936x integrated transceiver chip, the overall RF performance of the device is largely governed by the transceiver chip itself. &lt;br /&gt;
&lt;br /&gt;
===RF Performance===&lt;br /&gt;
* SSB/LO Suppression -35/50 dBc&lt;br /&gt;
* Phase Noise 3.5 GHz 1.0 deg RMS&lt;br /&gt;
* Phase Noise 6 GHz 1.5 deg RMS&lt;br /&gt;
* Power Output &amp;gt;10dBm&lt;br /&gt;
* IIP3 (@ typ NF) -20dBm&lt;br /&gt;
* Typical Noise Figure &amp;lt;8dB&lt;br /&gt;
* Maximum Input Power: -15 dBm&lt;br /&gt;
&lt;br /&gt;
===Input/Output Impedance===&lt;br /&gt;
All RF Ports are matched to 50 Ohm with -10dB or better return loss generally. Detailed test is pending.&lt;br /&gt;
&lt;br /&gt;
===Input Power Levels===&lt;br /&gt;
* The maximum input power for the B200/B210/B200mini/B205mini is -15 dBm.&lt;br /&gt;
&lt;br /&gt;
===RF Performance Data===&lt;br /&gt;
====B200mini / B205mini====&lt;br /&gt;
* [[Media:B200mini B205 RF Performance Data 20160119.pdf]]&lt;br /&gt;
&lt;br /&gt;
====B200 / B210====&lt;br /&gt;
* [[Media:B200 RF Performance.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Hardware Specifications==&lt;br /&gt;
* Ettus Research recommends to always use the latest stable version of UHD&lt;br /&gt;
&lt;br /&gt;
=== B200===&lt;br /&gt;
* Current Hardware Revision: 6&lt;br /&gt;
* Minimum version of UHD required: 3.8.4&lt;br /&gt;
* B200 Rev 5 (AD9364-based board) requires minimum UHD 3.8.4&lt;br /&gt;
&lt;br /&gt;
=== B210===&lt;br /&gt;
* Current Hardware Revision: 5&lt;br /&gt;
* Minimum version of UHD required: 3.6.0&lt;br /&gt;
&lt;br /&gt;
=== B200mini===&lt;br /&gt;
* Current Hardware Revision: 2&lt;br /&gt;
* Minimum version of UHD required: 3.9.0&lt;br /&gt;
&lt;br /&gt;
=== B200mini-i===&lt;br /&gt;
* Current Hardware Revision: 2&lt;br /&gt;
* Minimum version of UHD required: 3.9.0&lt;br /&gt;
&lt;br /&gt;
=== B205mini-i===&lt;br /&gt;
* Current Hardware Revision: 1&lt;br /&gt;
* Minimum version of UHD required: 3.9.2&lt;br /&gt;
&lt;br /&gt;
==Physical Specifications==&lt;br /&gt;
===Dimensions===&lt;br /&gt;
* B200mini/B205mini 5.0 x 8.4 cm&lt;br /&gt;
* B200/B210 9.7 x 15.5 x 1.5 cm&lt;br /&gt;
&lt;br /&gt;
===Weight===&lt;br /&gt;
* B200mini 24.0 g&lt;br /&gt;
* B200/B210 350 g&lt;br /&gt;
&lt;br /&gt;
===Drawings===&lt;br /&gt;
====B200mini====&lt;br /&gt;
* [[Media:B200mini_drawing.png| Board only]]&lt;br /&gt;
* [[Media:cu usrp-b200mini.pdf| B20xmini Enclosure]]&lt;br /&gt;
&lt;br /&gt;
====B200====&lt;br /&gt;
* [[Media:cu ettus b200 cca.pdf| Board only]]&lt;br /&gt;
&lt;br /&gt;
====B210====&lt;br /&gt;
* [[Media:cu ettus b210 cca.pdf| Board only]]&lt;br /&gt;
&lt;br /&gt;
====B200/B210 Enclosure====&lt;br /&gt;
* [[Media:cu ettus-b2xx-full-enclosure.pdf|Enclosure]]&lt;br /&gt;
&lt;br /&gt;
===CAD/STP Models===&lt;br /&gt;
====B200mini====&lt;br /&gt;
* [[Media:B200mini.stp.tar.gz| B200mini with Enclosure]]&lt;br /&gt;
* [[Media:B200mini enclosure-only.stp.tar.gz| Enclosure only]]&lt;br /&gt;
* [[Media:cu ettus b200mini cca.stp.tar.gz| Board only ]]&lt;br /&gt;
&lt;br /&gt;
====B20xmini-i====&lt;br /&gt;
* [[Media:b20xmini-i._thermal_insert.stp.tar.gz| B20xmini-i Thermal Insert]]&lt;br /&gt;
&lt;br /&gt;
====B200====&lt;br /&gt;
* [[Media:cu ettus b200 cca.stp.tar.gz| Board only]]&lt;br /&gt;
&lt;br /&gt;
====B210====&lt;br /&gt;
* [[Media:cu ettus b210 cca.stp.gz| Board only]]&lt;br /&gt;
&lt;br /&gt;
====B200/B210 Enclosure====&lt;br /&gt;
* [[Media:cu ettus-b200-b210-case.zip|Enclosure]]&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* B200 / B210: 25 °C&lt;br /&gt;
* B200mini - Board Only: 0 - 40 °C &lt;br /&gt;
* B200mini - With Enclosure: -20 - 60°C &lt;br /&gt;
* B200mini-i / B205mini-i - Board Only:   0 - 45 °C &lt;br /&gt;
* B200mini-i / B205mini-i - With I-Grade Enclosure: -40 - 75°C&lt;br /&gt;
&lt;br /&gt;
===Operating Humidity Range===&lt;br /&gt;
* 10% to 90% non-condensing&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
===B200mini/B200mini-i/B205mini-i===&lt;br /&gt;
[http://files.ettus.com/schematics/b200mini/b200mini.pdf B200mini/B200mini-i/B205mini-i Schematics]&lt;br /&gt;
&lt;br /&gt;
===B200/B210===&lt;br /&gt;
[http://files.ettus.com/schematics/b200/b210.pdf B200/B210 Schematics]&lt;br /&gt;
&lt;br /&gt;
==Key Component Datasheets==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%&amp;quot;&lt;br /&gt;
!Part Number&lt;br /&gt;
!Description&lt;br /&gt;
!Schematic ID (Page)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/TCM1-63AX+.pdf Mini-Circuits TCM1-63AX+]&lt;br /&gt;
|Transformer&lt;br /&gt;
|T1 (1,3); T2 (1,3)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.analog.com/en/products/rf-microwave/integrated-transceivers-transmitters-receivers/wideband-transceivers-ic/ad9364.html#product-overview Analog Devices AD9364]&lt;br /&gt;
|RF Transceiver&lt;br /&gt;
|U1 (2)&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.analog.com/en/products/rf-microwave/integrated-transceivers-transmitters-receivers/wideband-transceivers-ic/ad9361.html#product-overview Analog Devices AD9361]&lt;br /&gt;
|RF Transceiver&lt;br /&gt;
|U2 (2,8)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/en/design-center/landing-pages/001/ad9361-ad9364-integ-rf-agile-transceiver-design-res.html AD9361/AD9364 Product Page]&lt;br /&gt;
|RF Transceiver&lt;br /&gt;
| - &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.xilinx.com/products/silicon-devices/fpga/spartan-6.html Xilinx Spartan-6 Product Page]&lt;br /&gt;
|FPGA&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|U1 (2,3,4,6); PG1 (6); U18B, U18C (7); U18D (8); U18E, U18F (9); U18G, U18H (10)&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.xilinx.com/support/documentation/data_sheets/ds160.pdf XC6SLX75 / XC6SLX150]&lt;br /&gt;
|FPGA&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADF4001.pdf ADF4001]&lt;br /&gt;
|Frequency Synthesizer&lt;br /&gt;
|U101 (1)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.cypress.com/file/140296/download CYUSB3014]&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|FX3: SuperSpeed USB Controller&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|U3 (5,6); U13 (5)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.cypress.com/applications/ez-usb-fx3-superspeed-usb-30-peripheral-controller-collateral-guide EZ-USB FX3™ Product Page]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.skyworksinc.com/uploads/documents/SKY13317_373LF_200914K.pdf SKY13317]&lt;br /&gt;
|Antenna Switch&lt;br /&gt;
|U801, U810 (8)&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.anaren.com/sites/default/files/BD3150L50100A00%20Data%20sheet%20Rev%20C.pdf BD3150L50100A00]&lt;br /&gt;
|Balun&lt;br /&gt;
|U802, U808, U809, U815 (8)&lt;br /&gt;
|-&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/PGA-102+.pdf PGA−102+]&lt;br /&gt;
|Amplifier&lt;br /&gt;
|U804, U817 (8)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|[http://www.ctscorp.com/wp-content/uploads/2015/11/008-0371-0.pdf VCTCXO]&lt;br /&gt;
|VCTCXO (B200mini only)&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.ctscorp.com/wp-content/uploads/2015/11/008-0334-0.pdf 525L20DA40M0000]&lt;br /&gt;
|VCTCXO (B200/B210 only)&lt;br /&gt;
| X100 (1)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.jackson-labs.com/index.php/products/lc_xo Jackson Labs LC_XO] [http://www.jackson-labs.com/assets/uploads/main/LC_XO_specsheet.pdf Spec Sheet] [http://www.jackson-labs.com/assets/uploads/main/LC_XO_Manual.pdf Manual]&lt;br /&gt;
|Optional GPSDO (B200/B210 only)&lt;br /&gt;
|U100 (1)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Enclosures==&lt;br /&gt;
&lt;br /&gt;
* SMA connectors should be torqued to 4 inch-pounds&lt;br /&gt;
&lt;br /&gt;
===B200mini===&lt;br /&gt;
* [https://www.ettus.com/all-products/usrp-b200mini-enclosure/ B200mini C-Grade Enclosure]&lt;br /&gt;
* [https://www.ettus.com/all-products/usrp-b200mini-i-enclosure/ B200mini I-Grade Enclosure]&lt;br /&gt;
&lt;br /&gt;
===B205mini===&lt;br /&gt;
* [https://www.ettus.com/all-products/usrp-b205mini-i-enclosure/ B205mini I-Grade Enclosure]&lt;br /&gt;
&lt;br /&gt;
===B200/B210===&lt;br /&gt;
* [https://www.ettus.com/product/details/USRP-B200-Enclosure USRP B200/B210 Enclosure]&lt;br /&gt;
** Full Steel Enclosure&lt;br /&gt;
** Compatible with green USRP B200 and B210 devices (revision 6 or later)&lt;br /&gt;
** Front and rear K-Slots for anti-theft protection&lt;br /&gt;
&lt;br /&gt;
==FPGA==&lt;br /&gt;
* Utilization statistics are subject to change between UHD releases. This information is current as of UHD 3.9.4.&lt;br /&gt;
===B200===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Device utilization summary:&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
Selected Device : 6slx75fgg484-3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Slice Logic Utilization:&lt;br /&gt;
 Number of Slice Registers:           15781  out of  93296    16%&lt;br /&gt;
 Number of Slice LUTs:                19987  out of  46648    42%&lt;br /&gt;
    Number used as Logic:             15983  out of  46648    34%&lt;br /&gt;
    Number used as Memory:             4004  out of  11072    36%&lt;br /&gt;
       Number used as RAM:              972&lt;br /&gt;
       Number used as SRL:             3032&lt;br /&gt;
&lt;br /&gt;
Slice Logic Distribution:&lt;br /&gt;
 Number of LUT Flip Flop pairs used:  24062&lt;br /&gt;
   Number with an unused Flip Flop:    8281  out of  24062    34%&lt;br /&gt;
   Number with an unused LUT:          4075  out of  24062    16%&lt;br /&gt;
   Number of fully used LUT-FF pairs: 11706  out of  24062    48%&lt;br /&gt;
   Number of unique control sets:       434&lt;br /&gt;
&lt;br /&gt;
IO Utilization:&lt;br /&gt;
 Number of IOs:                         172&lt;br /&gt;
 Number of bonded IOBs:                 155  out of    280    55%&lt;br /&gt;
    IOB Flip Flops/Latches:             124&lt;br /&gt;
&lt;br /&gt;
Specific Feature Utilization:&lt;br /&gt;
 Number of Block RAM/FIFO:              144  out of    172    83%&lt;br /&gt;
    Number using Block RAM only:        144&lt;br /&gt;
 Number of BUFG/BUFGCTRLs:                4  out of     16    25%&lt;br /&gt;
 Number of DSP48A1s:                     76  out of    132    57%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===B210===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Device utilization summary:&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
Selected Device : 6slx150fgg484-3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Slice Logic Utilization:&lt;br /&gt;
 Number of Slice Registers:           29310  out of  184304   15%&lt;br /&gt;
 Number of Slice LUTs:                36486  out of  92152    39%&lt;br /&gt;
    Number used as Logic:             29279  out of  92152    31%&lt;br /&gt;
    Number used as Memory:             7207  out of  21680    33%&lt;br /&gt;
       Number used as RAM:             1752&lt;br /&gt;
       Number used as SRL:             5455&lt;br /&gt;
&lt;br /&gt;
Slice Logic Distribution:&lt;br /&gt;
 Number of LUT Flip Flop pairs used:  43635&lt;br /&gt;
   Number with an unused Flip Flop:   14325  out of  43635    32%&lt;br /&gt;
   Number with an unused LUT:          7149  out of  43635    16%&lt;br /&gt;
   Number of fully used LUT-FF pairs: 22161  out of  43635    50%&lt;br /&gt;
   Number of unique control sets:       723&lt;br /&gt;
&lt;br /&gt;
IO Utilization:&lt;br /&gt;
 Number of IOs:                         180&lt;br /&gt;
 Number of bonded IOBs:                 163  out of    338    48%&lt;br /&gt;
    IOB Flip Flops/Latches:             148&lt;br /&gt;
&lt;br /&gt;
Specific Feature Utilization:&lt;br /&gt;
 Number of Block RAM/FIFO:              186  out of    268    69%&lt;br /&gt;
    Number using Block RAM only:        186&lt;br /&gt;
 Number of BUFG/BUFGCTRLs:                4  out of     16    25%&lt;br /&gt;
 Number of DSP48A1s:                    152  out of    180    84%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===B200mini===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Device utilization summary:&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
Selected Device : 6slx75csg484-3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Slice Logic Utilization:&lt;br /&gt;
 Number of Slice Registers:           15949  out of  93296    17%&lt;br /&gt;
 Number of Slice LUTs:                19963  out of  46648    42%&lt;br /&gt;
    Number used as Logic:             16140  out of  46648    34%&lt;br /&gt;
    Number used as Memory:             3823  out of  11072    34%&lt;br /&gt;
       Number used as RAM:              972&lt;br /&gt;
       Number used as SRL:             2851&lt;br /&gt;
&lt;br /&gt;
Slice Logic Distribution:&lt;br /&gt;
 Number of LUT Flip Flop pairs used:  23859&lt;br /&gt;
   Number with an unused Flip Flop:    7910  out of  23859    33%&lt;br /&gt;
   Number with an unused LUT:          3896  out of  23859    16%&lt;br /&gt;
   Number of fully used LUT-FF pairs: 12053  out of  23859    50%&lt;br /&gt;
   Number of unique control sets:       429&lt;br /&gt;
&lt;br /&gt;
IO Utilization:&lt;br /&gt;
 Number of IOs:                         123&lt;br /&gt;
 Number of bonded IOBs:                 114  out of    328    34%&lt;br /&gt;
    IOB Flip Flops/Latches:             147&lt;br /&gt;
&lt;br /&gt;
Specific Feature Utilization:&lt;br /&gt;
 Number of Block RAM/FIFO:              110  out of    172    63%&lt;br /&gt;
    Number using Block RAM only:        110&lt;br /&gt;
 Number of BUFG/BUFGCTRLs:                6  out of     16    37%&lt;br /&gt;
 Number of DSP48A1s:                     76  out of    132    57%&lt;br /&gt;
 Number of PLL_ADVs:                      1  out of      6    16%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===B205mini===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Device utilization summary:&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
Selected Device : 6slx150csg484-3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Slice Logic Utilization:&lt;br /&gt;
 Number of Slice Registers:           15949  out of  184304     8%&lt;br /&gt;
 Number of Slice LUTs:                19963  out of  92152    21%&lt;br /&gt;
    Number used as Logic:             16140  out of  92152    17%&lt;br /&gt;
    Number used as Memory:             3823  out of  21680    17%&lt;br /&gt;
       Number used as RAM:              972&lt;br /&gt;
       Number used as SRL:             2851&lt;br /&gt;
&lt;br /&gt;
Slice Logic Distribution:&lt;br /&gt;
 Number of LUT Flip Flop pairs used:  23859&lt;br /&gt;
   Number with an unused Flip Flop:    7910  out of  23859    33%&lt;br /&gt;
   Number with an unused LUT:          3896  out of  23859    16%&lt;br /&gt;
   Number of fully used LUT-FF pairs: 12053  out of  23859    50%&lt;br /&gt;
   Number of unique control sets:       429&lt;br /&gt;
&lt;br /&gt;
IO Utilization:&lt;br /&gt;
 Number of IOs:                         123&lt;br /&gt;
 Number of bonded IOBs:                 114  out of    338    33%&lt;br /&gt;
    IOB Flip Flops/Latches:             147&lt;br /&gt;
&lt;br /&gt;
Specific Feature Utilization:&lt;br /&gt;
 Number of Block RAM/FIFO:              110  out of    268    41%&lt;br /&gt;
    Number using Block RAM only:        110&lt;br /&gt;
 Number of BUFG/BUFGCTRLs:                6  out of     16    37%&lt;br /&gt;
 Number of DSP48A1s:                     76  out of    180    42%&lt;br /&gt;
 Number of PLL_ADVs:                      1  out of      6    16%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interfaces and Connectivity==&lt;br /&gt;
B200/B210/B200mini - USB 3.0&lt;br /&gt;
&lt;br /&gt;
===GPIO===&lt;br /&gt;
====Power on state====&lt;br /&gt;
The hardware power on state and UHD initial state for the front-panel GPIOs is high-Z. For the B2xx, B2xxmini there are no external pull-ups/pull-downs for the GPIO pins, but the FPGAs do have them and they are configured as follows: B2xx: pull-up, B2xxmini: pull-up.&lt;br /&gt;
&lt;br /&gt;
====Output Current====&lt;br /&gt;
The GPIOs are configured as LVCMOS33 outputs with pull-ups on the B2xx. The strength for LVCMOS and LVTTL on Spartan 6 is 12 mA if not otherwise specified.&lt;br /&gt;
&lt;br /&gt;
===Timing Reference Input===&lt;br /&gt;
====B200mini/B200mini-i/B205mini-i====&lt;br /&gt;
* 1-PPS or 10 MHz input&lt;br /&gt;
&lt;br /&gt;
=====1-PPS=====&lt;br /&gt;
* Maximum: -5V / +5V&lt;br /&gt;
* Minimum: 0V / +2.5V&lt;br /&gt;
&lt;br /&gt;
=====10 MHz=====&lt;br /&gt;
* Maximum: 0V / +5V&lt;br /&gt;
* Minimum: 0V / +1.8V&lt;br /&gt;
'''OR'''&lt;br /&gt;
* +10dBm ~ +27dBm&lt;br /&gt;
&lt;br /&gt;
====B200/B210====&lt;br /&gt;
=====1-PPS=====&lt;br /&gt;
* Maximum: 5V&lt;br /&gt;
=====10 MHz=====&lt;br /&gt;
* Maximum: 15dBm (3.5Vpp into 50 ohms)&lt;br /&gt;
&lt;br /&gt;
==Certifications==&lt;br /&gt;
===RoHS===&lt;br /&gt;
As of December 1st, 2010 all Ettus Research products are RoHS compliant unless otherwise noted. More information can be found at [http://ettus.com/legal/rohs-information http://ettus.com/legal/rohs-information]&lt;br /&gt;
&lt;br /&gt;
===China RoHS=== &lt;br /&gt;
'''Management Methods for Controlling Pollution Caused by Electronic Information Products Regulation'''&lt;br /&gt;
&lt;br /&gt;
'''Chinese Customers''' &lt;br /&gt;
&lt;br /&gt;
National Instruments is in compliance with the Chinese policy on the Restriction of Hazardous Substances (RoHS) used in Electronic Information Products. For more information about the National Instruments China RoHS compliance, visit [http://www.ni.com/environment/rohs_china ni.com/environment/rohs_china].&lt;br /&gt;
&lt;br /&gt;
===Certifications for European Union===&lt;br /&gt;
In order to ensure compliance with EU certifications for radio equipment, a ferrite bead (included in kits with NI part number 785825-01 and 785826-01) should be affixed onto the GPIO cable, if in use. This is achieved by opening the snap-on ferrite bead and enclosing it around the GPIO cable(s).&lt;br /&gt;
&lt;br /&gt;
In addition to the part numbers listed above, these ferrite beads can be sourced through Fair-Rite using part number 0443164251.&lt;br /&gt;
&lt;br /&gt;
==Certificate of Volatility==&lt;br /&gt;
&lt;br /&gt;
Found on the [https://www.ni.com/en/support/documentation/product-certifications.html NI Product Certifications lookup tool] [https://www.ni.com/pdf/manuals/377354a.pdf here].&lt;br /&gt;
&lt;br /&gt;
==Downloads==&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/manual/md_fpga.html FPGA Resources]&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/binaries/uhd_stable/ UHD Stable Binaries]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/EttusResearch/uhd UHD Source Code on Github]&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
This is a list of frequently asked questions on the USRP [https://www.ettus.com/product/details/UB200-KIT B200]/[https://www.ettus.com/product/details/UB210-KIT B210]/[https://www.ettus.com/product/details/USRP-B200mini B200mini]. If you have questions that are not answered in this document, please contact us - [mailto:info@ettus.com info@ettus.com].&lt;br /&gt;
&lt;br /&gt;
'''Will the USRP [https://www.ettus.com/product/details/UB200-KIT B200]/[https://www.ettus.com/product/details/UB210-KIT B210] work with USB 2.0?'''&lt;br /&gt;
&lt;br /&gt;
Yes, both the USRP B200 and USRP B210 will fall back to the USB 2.0 standard if a USB 3.0 port is not available. There are several things to consider. First, the USB 2.0 data rates are slower. Depending on the USB controller, operating system, and other factors, you may achieve a sample rate up to 8 MS/s with USB 2.0. Also, you may not be able to bus-power the USRP B200/B210 in USB 2.0 mode.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''What samples rates should I expect with USB 3.0? USB 2.0?'''&lt;br /&gt;
&lt;br /&gt;
The performance and throughput of USB 3.0 can vary between host controllers. Ettus Research recommends using the Intel Series 7, 8, and 9 USB controllers. In Linux, the command &amp;lt;code&amp;gt;lspci&amp;lt;/code&amp;gt; will show the USB controller on the system.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''When can I power the USRP B200/B210/B200mini off USB?'''&lt;br /&gt;
&lt;br /&gt;
The experience will vary across various controllers. Generally speaking, bus-power is ideal for SISO operation. If you are using both channels of a USRP B210 we recommend an external power supply. We [https://www.ettus.com/all-products/powersupply/ sell an external power supply that works with a variety of USRPs].&lt;br /&gt;
&lt;br /&gt;
MIMO operation with the USRP B210 is not recommended when using the USRP B210 on bus-power. It is also not recommended to run the B210 on bus-power if a GPS-disciplined oscillator is installed.&lt;br /&gt;
&lt;br /&gt;
'''How much power does the USRP consume?'''&lt;br /&gt;
&lt;br /&gt;
The table below shows power consumption (Watts) of a USRP B210 run with a 6V power supply. Figures on a 5V supply (USB power), or with a USRP B200 will be moderately lower. The sample rates shown are aggregate sample rates on the USB 3.0 interface.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&lt;br /&gt;
!5 Msps&lt;br /&gt;
!15.36 Msps&lt;br /&gt;
!30.72 Msps&lt;br /&gt;
!56 Msps&lt;br /&gt;
!61.44 Msps&lt;br /&gt;
|-&lt;br /&gt;
|1 RX&lt;br /&gt;
|1.92&lt;br /&gt;
|2.112&lt;br /&gt;
|2.184&lt;br /&gt;
|2.508&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|2 RX&lt;br /&gt;
|2.148&lt;br /&gt;
|2.436&lt;br /&gt;
|2.508&lt;br /&gt;
|2.64&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|1 TX&lt;br /&gt;
|2.184&lt;br /&gt;
|2.34&lt;br /&gt;
|2.352&lt;br /&gt;
|2.22&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|2 TX&lt;br /&gt;
|2.76&lt;br /&gt;
|2.88&lt;br /&gt;
|2.904&lt;br /&gt;
|2.64&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Full Duplex (1x1)&lt;br /&gt;
|2.508&lt;br /&gt;
|2.736&lt;br /&gt;
|2.796&lt;br /&gt;
|3.168&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|2x2 MIMO&lt;br /&gt;
|3.252&lt;br /&gt;
|3.588&lt;br /&gt;
|3.672&lt;br /&gt;
|4.11&lt;br /&gt;
|4.092&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Can I build a multi-unit system with the USRP B200/B210?'''&lt;br /&gt;
&lt;br /&gt;
It is possible to synchronize multiple USRP B200/B210 devices using the 10 MHz/1 PPS inputs and an external distribution system like to the OctoClock-G. However, [http://www.ettus.com/kb/detail/usrp-b200-and-b210-usb-30-streaming-rate-benchmarks USB 3.0/2.0 performance] varies dramatically when multiple devices are streaming through the same controller. Generally, we recommend using the USRP N200/N210 if you need to build a high-channel count system.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Can I access the source code for the USRP B200/B210?'''&lt;br /&gt;
&lt;br /&gt;
Yes. The USRP B200/B210 is supported by the USRP Hardware DriverTM software. You can find the driver and FPGA source code for the USRP B200/B210, and all other USRP models, in the UHD git repository:&lt;br /&gt;
&lt;br /&gt;
http://files.ettus.com/manual/page_build_guide.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''What operating systems does the USRP B200/B210 work on?'''&lt;br /&gt;
&lt;br /&gt;
The USRP B200/B210 is supported on [http://files.ettus.com/manual/page_install.html Linux, OSX (MacOSX / macOS) and Windows].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Does the USRP B200/B210 work with GNU Radio?'''&lt;br /&gt;
&lt;br /&gt;
Yes. The USRP B200/B210 work with our GNU Radio plugin - gr-uhd.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Does the USRP B200/B210 work with MATLAB and Simulink?'''&lt;br /&gt;
&lt;br /&gt;
Yes. You need to install the [http://www.mathworks.com/hardware-support/usrp.html Communications System Toolbox Support Package for USRP Radio].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Does the USRP B200/B210 work with OpenBTS?'''&lt;br /&gt;
&lt;br /&gt;
Yes. This is a third-party application and you can find instructions here: [http://wush.net/trac/rangepublic/wiki/BuildInstallRun OpenBTS - Build, Install, Run.]&lt;br /&gt;
&lt;br /&gt;
For support, please sign up and contact the [https://lists.sourceforge.net/lists/listinfo/openbts-discuss OpenBTS mailing list].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''What tools do I need to program the FPGA?'''&lt;br /&gt;
&lt;br /&gt;
The USRP [https://www.ettus.com/product/details/UB200-KIT B200] and USRP [https://www.ettus.com/product/details/UB210-KIT B210] include a Spartan 6 XC6SLX75 and XC6S150, respectively. The USRP B200 can be programmed with the free version of Xilinx tools, while the larger FPGA on the USRP B210 requires a licensed seat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Can I use a GPSDO with the USRP B200/B210?'''&lt;br /&gt;
&lt;br /&gt;
Ettus Research offers a [https://www.ettus.com/product/details/GPSDO-MINI Board-Mounted GPS-Disciplined OCXO] and a [https://www.ettus.com/product/details/GPSDO-TCXO-MODULE Board-Mounted GPS-Disciplined TCXO], which are compatible with the USRP B200/B210. These provide a high-accuracy XO, which can be disciplined to the global GPS standard. Please note: When the GPSDO OCXO model is integrated on the USRP B200/B210, the device should be powered with an external supply instead of USB bus power. The TCXO version can be USB bus powered.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Getting_Started_with_RFNoC_Development&amp;diff=5919</id>
		<title>Getting Started with RFNoC Development</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Getting_Started_with_RFNoC_Development&amp;diff=5919"/>
				<updated>2023-12-01T05:04:07Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: Emphasize that this application is deprecated&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Application Note Number==&lt;br /&gt;
&lt;br /&gt;
'''AN-823'''&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-07-12&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Martin Braun&amp;lt;br&amp;gt; Nicolas Cuervo&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Initial creation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2017-01-10&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Team&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Added “Digital Gain” example&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2017-05-08&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Jose Loera&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Updated example code. Update to Testbench section.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2017-08-26&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Jose Loera&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Updated following sections: '''Abstract'''(This AN is specific to USRP X300/X310), '''Using a graphical interface'''(updated GUI image with newest version and the explanation section), '''Testing out the custom block'''(Updated GRC image that has correct Sampling Rate for RFNoC:Radio block).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2017-09-07&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Jose Loera&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Added link to Video that follows this App Note in the Resources section. Also [https://youtube.com/watch?v=j-EfyPVpaJ8 here]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2019-10-24&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Michael Dickens&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Fixed list of USRPs that this AN is applicable to: all current 3rd generation USRP hardware.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
'''Note: This application note is DEPRECATED. It applies only to using RFNoC in UHD 3.x. The latest Getting Started in RFNoC application note is available here: [[Getting Started with RFNoC in UHD 4.0]].'''&lt;br /&gt;
&lt;br /&gt;
This application note guides a user through basic information on the RFNoC architecture, installing necessary software to develop custom RFNoC blocks, also called Computation Engines (CE), and walks through the steps of creating a custom RFNoC block using an example. RFNoC is currently supported on any 3rd generation USRP hardware, currently: E310/E312, E320, N300/N310/N320/N321, and X300/X310.  '''However''', this document primarily covers using RFNoC for the USRP X300/X310 and E310/E312. Using RFNoC with the other USRPs is similar to that documented herein.&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
First sections deal with installing tools and validating correct tool installation in order to do RFNoC development. Later sections deal with creating a custom RFNoC block, using the built-in testbench architecture, building an FPGA image with the custom block and finally testing out the new block within GNU Radio.&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
The RFNoC code base is open source, including code that executes on the host, as well as code targeted to the USRP hardware (FPGA and microcontroller firmware). RFNoC is available under the open-source GNU Lesser General Public License (LGPL). For more information on our licensing policy, please contact [mailto:info@ettus.com info@ettus.com].&lt;br /&gt;
&lt;br /&gt;
==Prerequisites==&lt;br /&gt;
RFNoC is only supported on 3rd generation USRP hardware as noted in the Abstract.&lt;br /&gt;
&lt;br /&gt;
In order to build custom USRP FPGA images and RFNoC blocks the following hardware and software are needed.&lt;br /&gt;
&lt;br /&gt;
* '''Ubuntu 14.04.5 or 16.04.1 (preferred):''' Currently PyBOMBS (which can be used to install the ''Software build tools''), works most reliably in Ubuntu, and thus, we recommend using this distribution. Also, a majority of the scripts used during the build process are Linux (Ubuntu) specific. A PC with multiple cores and 8GB+ of RAM is recommended.&lt;br /&gt;
&lt;br /&gt;
* '''Xilinx Vivado tools (version 2017.4):''' The specific version depends on the branch and state of the FPGA code. The default install location is &amp;lt;code&amp;gt;/opt/Xilinx/Vivado&amp;lt;/code&amp;gt;. Once all of the Software build tools are installed the specific version for the downloaded code can be found in the &amp;lt;code&amp;gt;setupenv.sh&amp;lt;/code&amp;gt; file located in the &amp;lt;code&amp;gt;{USER_PREFIX}/src/uhd-fpga/usrp3/top/{DEVICE}&amp;lt;/code&amp;gt; directory. Further information can be found [http://files.ettus.com/manual/md_usrp3_build_instructions.html here].&lt;br /&gt;
&lt;br /&gt;
* '''Software build tools:''' If UHD can be or has been compiled from source on the development PC then all the necessary software build components are present (PyBOMBS can be used to set all this up and instructions on how to do so are given in a following step).&lt;br /&gt;
&lt;br /&gt;
* Any 3rd generation USRP hardware as noted in the Abstract.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:'''&lt;br /&gt;
* The edition of Xilinx Vivado that is required will depend on which USRP device is being used.&lt;br /&gt;
** X3xx series devices: Design Edition or System Edition.&lt;br /&gt;
** E3xx series devices: Design Edition, System Edition, or the free WebPack Edition.&lt;br /&gt;
* Other operating systems can be used, but the exact steps on how to proceed are not given in this Application Note.&lt;br /&gt;
* In some Linux distributions (e.g. Ubuntu) &amp;lt;code&amp;gt;dash&amp;lt;/code&amp;gt; is set as default shell, which may cause some issues. It is recommended to set the shell to &amp;lt;code&amp;gt;bash&amp;lt;/code&amp;gt; by running the following commands in the terminal. Choose &amp;lt;code&amp;gt;&amp;lt;No&amp;gt;&amp;lt;/code&amp;gt; when prompted by the first command and the second command will validate the that bash will be used.&lt;br /&gt;
&lt;br /&gt;
    $ sudo dpkg-reconfigure dash&lt;br /&gt;
    $ ll /bin/sh&lt;br /&gt;
&lt;br /&gt;
==Creating a development environment==&lt;br /&gt;
While this Application Note goes through the process of integrating GNU Radio into the RFNoC development flow, it is by no means required to use or develop within the RFNoC framework, but it makes it a great deal easier to use a framework on top of RFNoC for aspects such as visualization and other features. GNU Radio is freely available and more information about it can be found [http://gnuradio.org/ here].&lt;br /&gt;
&lt;br /&gt;
The following software packages are required in order to setup a development environment/sandbox:&lt;br /&gt;
&lt;br /&gt;
* UHD&lt;br /&gt;
* GNU Radio &lt;br /&gt;
* gr-ettus&lt;br /&gt;
&lt;br /&gt;
===Create development environment using PyBOMBS===&lt;br /&gt;
The cleanest way to set this up is to install everything into a dedicated directory. [https://github.com/gnuradio/pybombs PyBOMBS] is the simplest way to do this. If not already installed, PyBOMBS can be setup with the following commands:&lt;br /&gt;
&lt;br /&gt;
    $ sudo apt-get install git&lt;br /&gt;
    $ sudo apt-get install python-setuptools python-dev python-pip build-essential &lt;br /&gt;
    &lt;br /&gt;
    $ sudo pip install git+https://github.com/gnuradio/pybombs.git&lt;br /&gt;
    $ pybombs recipes add gr-recipes git+https://github.com/gnuradio/gr-recipes.git&lt;br /&gt;
    $ pybombs recipes add ettus git+https://github.com/EttusResearch/ettus-pybombs.git&lt;br /&gt;
&lt;br /&gt;
These commands will do the following:&lt;br /&gt;
* Install &amp;lt;code&amp;gt;Git&amp;lt;/code&amp;gt;&lt;br /&gt;
* Install &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; and other Python dependencies&lt;br /&gt;
* Install the latest &amp;lt;code&amp;gt;PyBOMBS&amp;lt;/code&amp;gt; from its Git repository&lt;br /&gt;
* Add the &amp;lt;code&amp;gt;gr-recipes&amp;lt;/code&amp;gt; recipes which are used to install GNU Radio specific software&lt;br /&gt;
* Add the &amp;lt;code&amp;gt;ettus&amp;lt;/code&amp;gt; recipes which are used to install Ettus Research specific software&lt;br /&gt;
&lt;br /&gt;
From here, PyBOMBS can be used to setup and install the development environment/sandbox by running the following command:&lt;br /&gt;
&lt;br /&gt;
    $ pybombs prefix init ~/rfnoc -R rfnoc -a rfnoc&lt;br /&gt;
&lt;br /&gt;
This will do the following:&lt;br /&gt;
&lt;br /&gt;
* Create a directory in the user’s home directory called &amp;lt;code&amp;gt;rfnoc&amp;lt;/code&amp;gt; (any valid directory name will work)&lt;br /&gt;
&lt;br /&gt;
* Give the prefix an alias of &amp;lt;code&amp;gt;rfnoc&amp;lt;/code&amp;gt; ( &amp;lt;code&amp;gt;[-a alias]&amp;lt;/code&amp;gt;, e.g. &amp;lt;code&amp;gt;–a rfnoc&amp;lt;/code&amp;gt; ), which would be the name given to this path. This name will be used in further steps that use PyBOMBS. When creating the first prefix and omitting the alias, the prefix will be setup as the default.&lt;br /&gt;
&lt;br /&gt;
* Use the &amp;lt;code&amp;gt;rfnoc&amp;lt;/code&amp;gt; prefix recipe ( as opposed to a package recipe like &amp;lt;code&amp;gt;gqrx&amp;lt;/code&amp;gt; ) to clone UHD, FPGA, GNU Radio, and gr-ettus sources into the &amp;lt;code&amp;gt;~/rfnoc&amp;lt;/code&amp;gt; directory as well as compile and install all the software&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' A user can specify how many cores are used by builds when using PyBOMBS. The default is set to 4. For example, this will set the number of cores used to 3:&lt;br /&gt;
&lt;br /&gt;
    $ pybombs config makewidth 3&lt;br /&gt;
&lt;br /&gt;
The value will be written into a configuration file and then applied to subsequent PyBOMBS commands. This value can temporarily be overridden for a specific build by specifying the &amp;lt;code&amp;gt;--config makewidth=X&amp;lt;/code&amp;gt; argument, where “&amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;” is an integer number. If the user only has 4 cores it is recommend to use this argument in the pybombs command to limit the number of cores to &amp;lt;4 (e.g. 3) so that the computer stays responsive. Following are 2 examples, one using less cores and the other using more cores:&lt;br /&gt;
&lt;br /&gt;
    $ pybombs --config makewidth=3 prefix init ~/rfnoc -R rfnoc -a rfnoc &lt;br /&gt;
    $ pybombs --config makewidth=7 prefix init ~/rfnoc -R rfnoc -a rfnoc&lt;br /&gt;
&lt;br /&gt;
Then, it is necessary to setup the PyBOMBS environment, so that the system/terminal session will have the environmental variables pointing to this newly created prefix, which is done with the following commands:&lt;br /&gt;
&lt;br /&gt;
    $ cd ~/rfnoc&lt;br /&gt;
    $ source ./setup_env.sh&lt;br /&gt;
&lt;br /&gt;
Once the previous command is run, this terminal session will have access to the environmental variables that allow the complete use of the set of software that was just installed with PyBOMBS. If access to the software is needed in other terminals the same command must be run within them.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' Throughout the rest of this document the term &amp;lt;code&amp;gt;{USER_PREFIX}&amp;lt;/code&amp;gt; will used at the beginning of different directories. For example, &amp;lt;code&amp;gt;{USER_PREFIX}/src/uhd-fpga/usrp3/tools/scripts&amp;lt;/code&amp;gt; is a directory that contains useful scripts for compiling. The term &amp;lt;code&amp;gt;{USER_PREFIX}&amp;lt;/code&amp;gt; is used to denote the folders that precede the &amp;lt;code&amp;gt;/src&amp;lt;/code&amp;gt; directory. Examples of what &amp;lt;code&amp;gt;{USER_PREFIX}&amp;lt;/code&amp;gt; could be: &amp;lt;code&amp;gt;/home/user/rfnoc&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/home/user/myDevfolder/&amp;lt;/code&amp;gt;. On many Linux environments using &amp;lt;code&amp;gt;~/&amp;lt;/code&amp;gt; at the beginning of the target directory path is equivalent to the user’s home directory.( i.e &amp;lt;code&amp;gt;~/&amp;lt;/code&amp;gt; is equal to &amp;lt;code&amp;gt;/home/user/&amp;lt;/code&amp;gt;). So &amp;lt;code&amp;gt;{USER_PREFIX}&amp;lt;/code&amp;gt; could also look like &amp;lt;code&amp;gt;~/rfnoc&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;~/myDevfolder/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Create the development environment manually===&lt;br /&gt;
As an alternative to using PyBOMBS, manually installing and configuring the software is done by following the individual install notes for [http://gnuradio.org/redmine/projects/gnuradio/wiki/InstallingGRFromSource GNU Radio], [https://files.ettus.com/manual/page_build_guide.html UHD] and [https://github.com/EttusResearch/gr-ettus gr-ettus] and by making sure they are reachable by linkers and compilers.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' The Application Note found [https://kb.ettus.com/Building_and_Installing_the_USRP_Open-Source_Toolchain_(UHD_and_GNU_Radio)_on_Linux here] goes through the process of manually installing UHD and GNU Radio on Linux platforms.&lt;br /&gt;
&lt;br /&gt;
To manually download the software, use these &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt; commands, which will select the correct branches:&lt;br /&gt;
&lt;br /&gt;
    $ git clone --recursive -b rfnoc-devel https://github.com/EttusResearch/uhd.git &lt;br /&gt;
    $ git clone --recursive -b maint https://github.com/gnuradio/gnuradio.git # master branch is also fine instead of maint&lt;br /&gt;
    $ git clone -b master https://github.com/EttusResearch/gr-ettus.git &lt;br /&gt;
    $ git clone -b rfnoc-devel https://github.com/EttusResearch/fpga.git&lt;br /&gt;
&lt;br /&gt;
If UHD, GNU Radio and/or gr-ettus are already installed, it would be sufficient to checkout the branches mentioned and update them them (&amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt;). Thereafter, rebuild each of the repositories (rebuild order: UHD, GNU Radio, gr-ettus).&lt;br /&gt;
&lt;br /&gt;
===Verify Environment===&lt;br /&gt;
Running the command “&amp;lt;code&amp;gt;uhd_config_info&amp;lt;/code&amp;gt;” with the “&amp;lt;code&amp;gt;--version&amp;lt;/code&amp;gt;” flag will verify that the installation has been completed successfully.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' The version string output from this command may differ, however it should be similar to the output below.&lt;br /&gt;
&lt;br /&gt;
    $ uhd_config_info --version&lt;br /&gt;
    linux; GNU C++ version 5.4.0 20160609; Boost_105800; UHD_4.0.0.rfnoc-devel-161- g83150fdd&lt;br /&gt;
    &lt;br /&gt;
    4.0.0.rfnoc-devel-161-g83150fdd&lt;br /&gt;
&lt;br /&gt;
===Testing the default FPGA image and building from existing blocks===&lt;br /&gt;
&lt;br /&gt;
It is recommended to spend a moment looking at the Ettus Research default image, which is pre-built with a set of RFNoC blocks, as well as building a custom image with a unique set of pre-built RFNoC blocks. To get the default image(s), run the following command:&lt;br /&gt;
&lt;br /&gt;
    $ uhd_images_downloader&lt;br /&gt;
&lt;br /&gt;
Ettus Research will be updating the default image(s) occasionally, and &amp;lt;code&amp;gt;uhd_images_downloader&amp;lt;/code&amp;gt; can be run anytime after running &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; and re-installing to pull the most current images. Images are stored in the &amp;lt;code&amp;gt;{USER_PREFIX}/share/uhd/images&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
The following images have the corresponding RFNoC blocks (Computation Engines):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Image Name&lt;br /&gt;
!Included Blocks&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&amp;lt;code&amp;gt;usrp_x300_fpga_HG.bit&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;usrp_x300_fpga_XG.bit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;usrp_x310_fpga_HG.bit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;usrp_x310_fpga_XG.bit&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2x DDC, 2x DUC&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&amp;lt;code&amp;gt;usrp_x300_fpga_RFNOC_HG.bit&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;usrp_x300_fpga_RFNOC_XG.bit&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;DUC, DDC (one channel), fosphor, window, fft, 2x AXI FIFOs&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&amp;lt;code&amp;gt;usrp_x310_fpga_RFNOC_HG.bit&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;usrp_x310_fpga_RFNOC_XG.bit&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;DUC, DDC (one channel), fosphor, window, fft, 2x AXI FIFOs, Keep One in N, FIR, Siggen&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&amp;lt;code&amp;gt;usrp_e310_fpga.bit&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;usrp_e310_fpga_sg3.bit&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;1x DDC, 1x DUC&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&amp;lt;code&amp;gt;usrp_e310_fpga_RFNOC.bit (sg1 version)&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;usrp_e310_fpga_RFNOC_sg3.bit&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;fosphor, window, fft, 2x AXI FIFOs, FIR&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Instructions on flashing the image to a device can be found [http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_load_fpga_imgs here] for X3xx series and [http://files.ettus.com/manual/page_usrp_e3x0.html#e3x0_load_fpga_imgs here] for E3xx series.&lt;br /&gt;
  &lt;br /&gt;
'''NOTE:''' FPGA images are specific to the USRP device '''NOT''' the USRP series. For example, a USRP X300 FPGA image will '''NOT''' work on a USRP X310 and vice versa. Loading an image that does not correspond to a USRP device will likely brick the device.&lt;br /&gt;
&lt;br /&gt;
By following the steps above the following should now be available:&lt;br /&gt;
* UHD/RFNoC code downloaded and installed&lt;br /&gt;
* FPGA code available&lt;br /&gt;
* A valid RFNoC image on your X3xx or E3xx series device&lt;br /&gt;
&lt;br /&gt;
====Inspect default images====&lt;br /&gt;
Run the following command, with a USRP connected to your PC, to verify current image on the USRP.&lt;br /&gt;
&lt;br /&gt;
    $ uhd_usrp_probe&lt;br /&gt;
&lt;br /&gt;
If an RFNoC image was successfully loaded onto the USRP, there will be a lot of output text (RFNoC code is currently very verbose). The final lines of the output should be similar to the following for an USRP X310 ( e.g. &amp;lt;code&amp;gt;usrp_x310_fpga_HG&amp;lt;/code&amp;gt; ):&lt;br /&gt;
&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;
Final output for &amp;lt;code&amp;gt;usrp_x310_fpga_RFNOC_HG.bit&amp;lt;/code&amp;gt; image:&lt;br /&gt;
&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;
    |   |   |   * DUC_0&lt;br /&gt;
    |   |   |   * FFT_0&lt;br /&gt;
    |   |   |   * Window_0&lt;br /&gt;
    |   |   |   * FIR_0&lt;br /&gt;
    |   |   |   * SigGen_0&lt;br /&gt;
    |   |   |   * KeepOneInN_0&lt;br /&gt;
    |   |   |   * fosphor_0&lt;br /&gt;
    |   |   |   * FIFO_0&lt;br /&gt;
    |   |   |   * FIFO_1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' The actual names and number of blocks can differ. The list of blocks should start with the &amp;lt;code&amp;gt;DmaFIFO_x&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Radio_x&amp;lt;/code&amp;gt;, and then a couple more lines of block IDs should follow.&lt;br /&gt;
&lt;br /&gt;
====Build custom image with pre-built RFNoC blocks====&lt;br /&gt;
Because of the growing number of RFNoC blocks, the user has the option to build an FPGA image with a set of pre-built RFNoC blocks of their choosing. The following steps describe the process for doing this and by so doing will also validate proper tool installation. Because compilation can take a couple of hours, it is recommended the user begin this process while continuing the rest of this guide.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' FPGA compilations can run in the background, however they are very resource intensive. If the user intents to use the same computer that is compiling to walk through the rest of this Application Note, it is recommended that the computer has plenty of resources.&lt;br /&gt;
&lt;br /&gt;
The script to initiate a compile is called &amp;lt;code&amp;gt;uhd_image_builder.py&amp;lt;/code&amp;gt;, and is located in the &amp;lt;code&amp;gt;{USER_PREFIX}/src/uhd-fpga/usrp3/tools/scripts&amp;lt;/code&amp;gt; directory. Run the help menu by typing:&lt;br /&gt;
&lt;br /&gt;
    $ cd {USER_PREFIX}/src/uhd-fpga/usrp3/tools/scripts &lt;br /&gt;
    $ ./uhd_image_builder.py --help&lt;br /&gt;
&lt;br /&gt;
A more detailed discussion of this script is given in an upcoming section. For now, compiling an FPGA image that has 2 RFNoC blocks (&amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;fft&amp;lt;/code&amp;gt;) and some &amp;lt;code&amp;gt;FIFOs&amp;lt;/code&amp;gt;, is done by running the script with the following arguments.&lt;br /&gt;
&lt;br /&gt;
Example for an X310 USRP:&lt;br /&gt;
&lt;br /&gt;
    $ ./uhd_image_builder.py window fft -d x310 -t X310_RFNOC_HG -m 5 --fill-with-fifos&lt;br /&gt;
&lt;br /&gt;
Example for an E310 USRP with Speed Grade 3 (sg3) FPGA:&lt;br /&gt;
&lt;br /&gt;
    $ ./uhd_image_builder.py window fft -d e310 -t E310_RFNOC_sg3 -m 5 --fill-with-fifos&lt;br /&gt;
&lt;br /&gt;
At the end of a successful compilation process, write the new image to a USRP. If the image was compiled for a USRP X310, the following command will load the new image. Update the &amp;lt;code&amp;gt;{IP_Address}&amp;lt;/code&amp;gt; of the USRP and &amp;lt;code&amp;gt;{USER_PREFIX}&amp;lt;/code&amp;gt; to the appropriate values for your configuration before running the command.&lt;br /&gt;
&lt;br /&gt;
    $ uhd_image_loader --args &amp;quot;type=x300,addr={IP_ADDRESS}&amp;quot; --fpga-path {USER_PREFIX}/src/uhd-fpga/usrp3/top/x300/build/usrp_x310_fpga_RFNOC_HG.bit&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' FPGA images are specific to the USRP device '''NOT''' the USRP series. For example, a USRP X300 FPGA image will '''NOT''' work on a USRP X310 and vice versa. Loading an image that does not correspond to a USRP device will likely brick the device. Additional instructions on flashing a custom image to a device can be found [http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_load_fpga_imgs here] for X3xx series and [http://files.ettus.com/manual/page_usrp_e3x0.html#e3x0_load_fpga_imgs here] for E3xx series.&lt;br /&gt;
&lt;br /&gt;
After the image has been successfully written to the USRP, power-cycle it and run the “&amp;lt;code&amp;gt;uhd_usrp_probe&amp;lt;/code&amp;gt;” utility to view the newly compiled blocks.&lt;br /&gt;
&lt;br /&gt;
    $ uhd_usrp_probe&lt;br /&gt;
&lt;br /&gt;
The final lines of output for the image built for the X310 is as follows:&lt;br /&gt;
&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;
    |   |   |   * Window_0&lt;br /&gt;
    |   |   |   * FFT_0&lt;br /&gt;
    |   |   |   * FIFO_0&lt;br /&gt;
    |   |   |   * FIFO_1&lt;br /&gt;
    |   |   |   * FIFO_2&lt;br /&gt;
&lt;br /&gt;
===Getting started with UHD + RFNoC===&lt;br /&gt;
The following new examples included within the &amp;lt;code&amp;gt;rfnoc-devel&amp;lt;/code&amp;gt; branch of UHD, are a good reference on how to use RFNoC from UHD.&lt;br /&gt;
&lt;br /&gt;
The following example is based off of &amp;lt;code&amp;gt;rx_samples_to_file.cpp&amp;lt;/code&amp;gt;. The example can be configured to place an RFNoC block in between the radio and host.&lt;br /&gt;
&lt;br /&gt;
    rfnoc_rx_to_file.cpp&lt;br /&gt;
&lt;br /&gt;
This next example chains a null source to another block and streams the data to the host.&lt;br /&gt;
&lt;br /&gt;
    rfnoc_nullsource_ce_rx.cpp&lt;br /&gt;
&lt;br /&gt;
These examples demonstrate the core features and flexibility of RFNoC.&lt;br /&gt;
&lt;br /&gt;
For more information on UHD and UHD development please refer to the [https://kb.ettus.com/UHD UHD Software Resource page], [https://kb.ettus.com/Getting_Started_with_UHD_and_C%2B%2B Getting Started with UHD and C++ Application Note] or directly to the [http://files.ettus.com/manual/ UHD user manual].&lt;br /&gt;
&lt;br /&gt;
===Getting started with GNU Radio + RFNoC===&lt;br /&gt;
A good way of getting started with RFNoC in a more visual way is to use GNU Radio. The &amp;lt;code&amp;gt;gr-ettus&amp;lt;/code&amp;gt; out-of-tree module (OOT) allows a user to use RFNoC blocks in their local GNU Radio / GNU Radio Companion (GRC) installation. This GNU Radio OOT contains blocks that allow you to configure your FPGA through GRC.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' As blocks in the &amp;lt;code&amp;gt;gr-ettus&amp;lt;/code&amp;gt; OOT mature, they will be upstreamed to &amp;lt;code&amp;gt;gr-uhd&amp;lt;/code&amp;gt;. Also, &amp;lt;code&amp;gt;gr-ettus&amp;lt;/code&amp;gt; is a container used by Ettus Research to disseminate experimental or under-development features for &amp;lt;code&amp;gt;gr-uhd&amp;lt;/code&amp;gt;. It is not a replacement for &amp;lt;code&amp;gt;gr-uhd&amp;lt;/code&amp;gt; (in fact, the latter is a requirement for &amp;lt;code&amp;gt;gr-ettus&amp;lt;/code&amp;gt;).&lt;br /&gt;
    &lt;br /&gt;
Examples can be run from &amp;lt;code&amp;gt;gr-ettus/examples/rfnoc&amp;lt;/code&amp;gt;, provided that the appropriate RFNoC blocks are compiled into the FPGA image currently running on the USRP.&lt;br /&gt;
&lt;br /&gt;
A couple of rules for building GNU Radio flowgraphs with RFNoC blocks:&lt;br /&gt;
&lt;br /&gt;
* You always need a &amp;lt;code&amp;gt;Device3&amp;lt;/code&amp;gt; object in your flow graph (it does not get connected, see screenshot below).&lt;br /&gt;
* You should have at least two RFNoC blocks connected together. Going &amp;lt;code&amp;gt;GNU Radio Block&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;RFNoC Block&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;GNU Radio Block&amp;lt;/code&amp;gt; is not recommended (it will work, but with suboptimal performance).&lt;br /&gt;
&lt;br /&gt;
The GNU Radio flowgraph &amp;lt;code&amp;gt;rfnoc_ddc.grc&amp;lt;/code&amp;gt; is an example that can be run using the default RFNoC image. Below are screenshots of the flowgraph and what it produces.&lt;br /&gt;
&lt;br /&gt;
[[File:rfnoc gsg an 1.png|center|800px|]]&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' Copy Block: In the RFNoC domain, streams of data can not be split as easily as they are in the GNU Radio domain. The “copy” block depicted in the screenshot above serves the function as a stream splitter. Its main purpose, when “enabled”, is to copy the samples it is getting at its input and put them into the output, but here it is also serving as a boundary between a RFNoC-domain and a GNURadio-domain. In the flowgraph above, after this boundary is passed, the data stream can easily be split into the two sinks to have them run simultaneously (standard GNU Radio functionality). It is possible to connect the GNU Radio blocks directly to RFNoC blocks without a “copy” block, but only one would work at a time (the other ones would have to be disabled). Another way to split data streams from the RFNoC-domain is to use the ”RFNoC: split stream” block, which would split the streams in the RFNoC domain, but this is not very useful here as we are, in any case, moving into the GNURadio-domain.&lt;br /&gt;
&lt;br /&gt;
[[File:rfnoc gsg an 2.png|center|800px|]]&lt;br /&gt;
&lt;br /&gt;
For more information on GNURadio development please refer to the [http://gnuradio.org/doc/doxygen/ GNURadio user's manual and API].&lt;br /&gt;
&lt;br /&gt;
==Starting a custom RFNoC block using RFNoC Modtool==&lt;br /&gt;
The figure below shows the basic structure of the RFNoC Stack. Corresponding code is needed in each of the three sections in order to build a custom RFNoC block with GNU Radio integration. A tool called RFNoC Modtool was created in order to minimize the effort needed to implement a new RFNoC block. RFNoC Modtool creates a custom GNU Radio OOT module with the basic structure and the necessary files for each of these sections. RFNoC Modtool is currently a part of the GNU Radio OOT module &amp;lt;code&amp;gt;gr-ettus&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:rfnoc gsg an 3.png|center|800px|]]&lt;br /&gt;
&lt;br /&gt;
===RFNoC Modtool Utilization===&lt;br /&gt;
'''NOTE:''' Console outputs may vary depending on the version of UHD the user is running. However, functionality should be the same or similar.&lt;br /&gt;
&lt;br /&gt;
Because the RFNoC Modtool has similar functionality to the &amp;lt;code&amp;gt;gr_modtool&amp;lt;/code&amp;gt; [ [http://gnuradio.org/redmine/projects/gnuradio/wiki/OutOfTreeModules gr_modtool] ] provided by GNU Radio, those that have worked with &amp;lt;code&amp;gt;gr_modtool&amp;lt;/code&amp;gt; in the past will find the RFNoC Modtool familiar.&lt;br /&gt;
&lt;br /&gt;
To check the usage of the tool, run the following:&lt;br /&gt;
&lt;br /&gt;
    $ rfnocmodtool help&lt;br /&gt;
    linux; GNU C++ version 5.4.0 20160609; Boost_105800; UHD_4.0.0.rfnoc-devel-162-g335a1317&lt;br /&gt;
    &lt;br /&gt;
    Usage:&lt;br /&gt;
    rfnocmodtool &amp;lt;command&amp;gt; [options] -- Run &amp;lt;command&amp;gt; with the given options.&lt;br /&gt;
    rfnocmodtool help -- Show a list of commands.&lt;br /&gt;
    rfnocmodtool help &amp;lt;command&amp;gt; -- Shows the help for a given command. &lt;br /&gt;
    &lt;br /&gt;
    List of possible commands:&lt;br /&gt;
    &lt;br /&gt;
    Name      Aliases          Description&lt;br /&gt;
    =====================================================================&lt;br /&gt;
    disable   dis              Disable block (comments out CMake entries for files) &lt;br /&gt;
    info      getinfo,inf      Return information about a given module &lt;br /&gt;
    remove    rm,del           Remove block (delete files and remove Makefile entries) &lt;br /&gt;
    makexml   mx               Make XML file for GRC block bindings &lt;br /&gt;
    add       insert           Add block to the out-of-tree module. &lt;br /&gt;
    newmod    nm,create        Create a new out-of-tree module &lt;br /&gt;
    rename    mv               Rename a block in the out-of-tree module.&lt;br /&gt;
&lt;br /&gt;
===Creating an RFNoC OOT Module===&lt;br /&gt;
&lt;br /&gt;
To start generating an RFNoC OOT module navigate to the source location ( i.e. &amp;lt;code&amp;gt;cd ~/{USER_PREFIX}/src&amp;lt;/code&amp;gt; ) and type:&lt;br /&gt;
    $ rfnocmodtool newmod [NAME OF THE MODULE]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Where &amp;lt;code&amp;gt;[NAME OF THE MODULE]&amp;lt;/code&amp;gt; is a name the user gives the new module. In the following, a module is created with the name “&amp;lt;code&amp;gt;tutorial&amp;lt;/code&amp;gt;”. If the user does not write the name of the module following the &amp;lt;code&amp;gt;newmod&amp;lt;/code&amp;gt; command the tool will ask for it interactively. Running this command will create a folder containing the basic folders that you may need for a functional module.&lt;br /&gt;
&lt;br /&gt;
    $ rfnocmodtool newmod tutorial&lt;br /&gt;
    linux; GNU C++ version 5.4.0 20160609; Boost_105800; UHD_4.0.0.rfnoc-devel-162-g335a1317&lt;br /&gt;
    &lt;br /&gt;
    Creating out-of-tree module in ./rfnoc-tutorial... Done.&lt;br /&gt;
    Use 'rfnocmodtool add' to add a new block to this currently empty module.&lt;br /&gt;
&lt;br /&gt;
To see what files and directories were created run:&lt;br /&gt;
&lt;br /&gt;
    $ ls rfnoc-tutorial/&lt;br /&gt;
    apps  cmake  CMakeLists.txt  docs  examples  grc  include  lib  MANIFEST.md  python  README.md  rfnoc  swig&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In contrast with &amp;lt;code&amp;gt;gr_modtool&amp;lt;/code&amp;gt;, this includes a folder called &amp;lt;code&amp;gt;rfnoc&amp;lt;/code&amp;gt;, which is where the UHD/FPGA files are located.&lt;br /&gt;
&lt;br /&gt;
===Adding custom blocks to OOT Module===&lt;br /&gt;
In order to add blocks to a module, navigate to the folder just created and use the &amp;lt;code&amp;gt;add&amp;lt;/code&amp;gt; command of &amp;lt;code&amp;gt;rfnocmodtool&amp;lt;/code&amp;gt;. Continuing with the example above, run the following:&lt;br /&gt;
&lt;br /&gt;
    $ cd rfnoc-tutorial&lt;br /&gt;
    $ rfnocmodtool add [NAME OF THE BLOCK]&lt;br /&gt;
&lt;br /&gt;
For demonstrative purposes, a block named &amp;lt;code&amp;gt;gain&amp;lt;/code&amp;gt; will be created. The &amp;lt;code&amp;gt;gain&amp;lt;/code&amp;gt; block will multiply samples that pass through it by a constant. As before, if the name is not given, the tool will ask the user for the name. There are several arguments that can be passed to the tool, but running the tool without any of these arguments will give the following interactive parsing output:&lt;br /&gt;
&lt;br /&gt;
    $ rfnocmodtool add gain&lt;br /&gt;
    linux; GNU C++ version 5.4.0 20160609; Boost_105800; UHD_4.0.0.rfnoc-devel-162-g335a1317&lt;br /&gt;
    &lt;br /&gt;
    RFNoC module name identified: tutorial&lt;br /&gt;
    Block/code identifier: gain&lt;br /&gt;
    Enter valid argument list, including default arguments: &lt;br /&gt;
    Block NoC ID (Hexadecimal): 1111222233334444&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;
Hitting &amp;lt;code&amp;gt;enter&amp;lt;/code&amp;gt; on each one of the options will take the default values.&lt;br /&gt;
&lt;br /&gt;
The following is a description of the valid argument list items:&lt;br /&gt;
&lt;br /&gt;
* '''NoC ID:''' This ID is a Hexadecimal number which serves as identification between the hardware part and the software part of the design. It can be as long as 16 0-9 A-F digits. If a NoC ID is not provided, it will be set to a random number.&lt;br /&gt;
&lt;br /&gt;
* '''Block Controllers Generation:''' The block controllers are the C++ control that the user can apply to the UHD-part of the design. In these files, the user can add more control over this layer of the design. Depending on the complexity of the block it may be possible to add all necessary control using NoCScript (more details on NoCScript can be found in the section labeled UHD Integration). In this case the cpp/hpp block control files generation are not needed. Default is to generate as their existence will be ignored if not edited.&lt;br /&gt;
&lt;br /&gt;
* '''Block Interface:''' Add more design specific functionality to the design at the GNU Radio interface by generating these block-interface files and adding necessary logic.  Depending on the complexity of the block it may be possible to add all necessary control using NoC-Script. In this case the block-interface files are not needed. Default is to generate as their existence will be ignored if not edited.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' If the user does not intend to use the block controllers or is not sure if they are needed, the presence of them in the design will do no harm. It is recommended to add them. This leaves the possibility to add more functions inside them in a future stage of development. &lt;br /&gt;
&lt;br /&gt;
After finishing the parsing, the following files will be generated/edited:&lt;br /&gt;
&lt;br /&gt;
    Adding file 'lib/gain_impl.h'...&lt;br /&gt;
    Adding file 'lib/gain_impl.cc'...&lt;br /&gt;
    Adding file 'include/tutorial/gain.h'...&lt;br /&gt;
    Adding file 'include/tutorial/gain_block_ctrl.hpp'...&lt;br /&gt;
    Adding file 'lib/gain_block_ctrl_impl.cpp'...&lt;br /&gt;
    Editing swig/tutorial_swig.i...&lt;br /&gt;
    Adding file 'python/qa_gain.py'...&lt;br /&gt;
    Editing python/CMakeLists.txt...&lt;br /&gt;
    Adding file 'grc/tutorial_gain.xml'...&lt;br /&gt;
    Adding file 'rfnoc/blocks/gain.xml'...&lt;br /&gt;
    Adding file 'rfnoc/fpga-src/noc_block_gain.v'...&lt;br /&gt;
    rfnoc/testbenches/noc_block_gain_tb folder created&lt;br /&gt;
    Adding file 'rfnoc/testbenches/noc_block_gain_tb/noc_block_gain_tb.sv'...&lt;br /&gt;
    Adding file 'rfnoc/testbenches/noc_block_gain_tb/Makefile'...&lt;br /&gt;
    Adding file 'rfnoc/testbenches/noc_block_gain_tb/CMakeLists.txt'...&lt;br /&gt;
&lt;br /&gt;
==Creating FPGA portion of custom RFNoC Block==&lt;br /&gt;
===RFNoC FPGA User Interface (API)===&lt;br /&gt;
RFNoC blocks or Computation Engines (CEs) in the FPGA use a NoC Shell instance to interface with the rest of RFNoC. NoC Shell implements RFNoC's core functionality: packet muxing and demuxing, flow control, and the settings register bus (i.e. write/read control/status registers). The NoC Shell has an interface to the RFNoC AXI stream crossbar and a user interface. NoC Shell AXI stream interfaces expect CHDR packets with a proper header. See the manual for information on [https://files.ettus.com/manual/page_rtp.html CHDR and SID].&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' AXI Stream is an ARM AMBA standard interface. Xilinx has an [http://www.xilinx.com/support/documentation/ip_documentation/ug761_axi_reference_guide.pdf AXI Reference Guide] with more details on this standard.&lt;br /&gt;
&lt;br /&gt;
[[File:rfnoc gsg an 4.png|center|800px|]]&lt;br /&gt;
&lt;br /&gt;
Many designs will want to use an AXI Stream interface with only sample data. However, as stated earlier, the NoC Shell block expects CHDR packets. To ease interfacing user code, the AXI Wrapper block provides the necessary logic to strip and insert the CHDR header, effectively converting packetized sample data into streaming sample data and vice versa. The example RFNoC blocks &amp;lt;code&amp;gt;noc_block_fft.v&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;noc_block_fir.v&amp;lt;/code&amp;gt; show how AXI Wrapper is used to implement existing Xilinx AXI Stream based IP within a computation engine.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' AXI Wrapper also supports AXI Stream buses for configuration. These buses are driven via the setting register bus and do not have back pressure. They also consume two user register addresses per bus.&lt;br /&gt;
&lt;br /&gt;
The primary user interface consists of four AXI stream interfaces ( &amp;lt;code&amp;gt;tready, tvalid, tlast, tdata&amp;lt;/code&amp;gt; ) and a settings register bus ( 8-bit, valid user register addresses: &amp;lt;code&amp;gt;128-255&amp;lt;/code&amp;gt; ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
AXI Stream signals:&lt;br /&gt;
* '''m_axis_data_tdata:''' Input sample data packets &lt;br /&gt;
** Data coming from host or another CE&lt;br /&gt;
* '''s_axis_data_tdata:''' Output sample data packets &lt;br /&gt;
** Data going to another CE or host&lt;br /&gt;
* '''m_axis_data_tready:''' Input signal to CE&lt;br /&gt;
** Used to notify CE that downstream CE is ready for data &lt;br /&gt;
* '''s_axis_data_tready:''' Output signal to CE&lt;br /&gt;
** Used to notify upstream CE that CE is ready for data &lt;br /&gt;
* '''m_axis_data_tvalid:''' Input signal to CE&lt;br /&gt;
** Used to indicate upstream CE has valid data &lt;br /&gt;
* '''s_axis_data_tvalid:''' Output signal to CE&lt;br /&gt;
** Used to indicate to downstream CE that CE has valid data &lt;br /&gt;
* '''m_axis_data_tlast:''' Input signal to CE&lt;br /&gt;
** Used to delimit packets from upstream CE &lt;br /&gt;
* '''s_axis_data_tlast:''' Output signal to CE&lt;br /&gt;
** Used to delimit packets to downstream CE&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; |[[File:rfnoc gsg an 5.png|right|500px|]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:rfnoc gsg an 6.png|center|800px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
Settings Bus signals:&lt;br /&gt;
* '''set_stb:''' Assert to write '''set_data''' to register at '''set_addr'''ess&lt;br /&gt;
* '''set_addr:''' Register address to set&lt;br /&gt;
* '''set_data:''' Data to set&lt;br /&gt;
* '''rb_data:''' Data to read back&lt;br /&gt;
* '''rb_strobe:''' Assert to read '''rb_data''' from register at '''set_addr'''ess&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; |[[File:rfnoc gsg an 7.png|right|500px|]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
For the &amp;lt;code&amp;gt;gain&amp;lt;/code&amp;gt; example block the following architecture is desired:&lt;br /&gt;
&lt;br /&gt;
[[File:rfnoc gsg an 8.png|center|800px|]]&lt;br /&gt;
&lt;br /&gt;
Open the file &amp;lt;code&amp;gt;rfnoc-tutorial/rfnoc/fpga-src/noc_block_gain.v&amp;lt;/code&amp;gt; that contains the RFNoC block skeleton code that was created when the &amp;lt;code&amp;gt;$ rfnocmodtool add gain&amp;lt;/code&amp;gt; command was run and modify the following ('''BOLD''' indicates changes to the skeleton code).&lt;br /&gt;
&lt;br /&gt;
    '''localparam [7:0] SR_GAIN = SR_USER_REG_BASE;'''&lt;br /&gt;
    localparam [7:0] SR_TEST_REG_1 = SR_USER_REG_BASE + 8'd1;&lt;br /&gt;
    &lt;br /&gt;
    '''wire [15:0] gain;'''&lt;br /&gt;
    '''setting_reg #('''&lt;br /&gt;
      '''.my_addr(SR_GAIN), .awidth(8), .width(16))'''&lt;br /&gt;
    '''sr_gain ('''&lt;br /&gt;
      '''.clk(ce_clk), .rst(ce_rst),'''&lt;br /&gt;
      '''.strobe(set_stb), .addr(set_addr), .in(set_data), .out(gain), .changed());'''&lt;br /&gt;
    &lt;br /&gt;
     always @(posedge ce_clk) begin&lt;br /&gt;
        case(rb_addr)&lt;br /&gt;
          '''8'd0 : rb_data &amp;lt;= {48'd0, gain};'''&lt;br /&gt;
          8'd1 : rb_data &amp;lt;= {32'd0, test_reg_1};&lt;br /&gt;
          default : rb_data &amp;lt;= 64'h0BADC0DE0BADC0DE;&lt;br /&gt;
        endcase&lt;br /&gt;
     end&lt;br /&gt;
     &lt;br /&gt;
     '''wire [31:0] pipe_in_tdata;'''&lt;br /&gt;
     '''wire pipe_in_tvalid, pipe_in_tlast;'''&lt;br /&gt;
     '''wire pipe_in_tready;'''&lt;br /&gt;
 &lt;br /&gt;
     '''wire [31:0] pipe_out_tdata;'''&lt;br /&gt;
     '''wire pipe_out_tvalid, pipe_out_tlast;'''&lt;br /&gt;
     '''wire pipe_out_tready;'''&lt;br /&gt;
 &lt;br /&gt;
     '''// Adding FIFO to ensure Pipeline'''&lt;br /&gt;
     '''axi_fifo_flop #(.WIDTH(32+1))'''&lt;br /&gt;
     '''pipeline0_axi_fifo_flop ('''&lt;br /&gt;
       '''.clk(ce_clk),'''&lt;br /&gt;
       '''.reset(ce_rst),'''&lt;br /&gt;
       '''.clear(clear_tx_seqnum),'''&lt;br /&gt;
       '''.i_tdata({m_axis_data_tlast,m_axis_data_tdata}),'''&lt;br /&gt;
       '''.i_tvalid(m_axis_data_tvalid),'''&lt;br /&gt;
       '''.i_tready(m_axis_data_tready),'''&lt;br /&gt;
       '''.o_tdata({pipe_in_tlast,pipe_in_tdata}),'''&lt;br /&gt;
       '''.o_tvalid(pipe_in_tvalid),'''&lt;br /&gt;
       '''.o_tready(pipe_in_tready));'''  &lt;br /&gt;
 &lt;br /&gt;
     '''wire [15:0] i = pipe_in_tdata[31:16];'''&lt;br /&gt;
     '''wire [15:0] q = pipe_in_tdata[15:0];'''&lt;br /&gt;
 &lt;br /&gt;
     '''wire [31:0] i_mult_gain = i*gain;'''&lt;br /&gt;
     '''wire [31:0] q_mult_gain = q*gain;'''&lt;br /&gt;
 &lt;br /&gt;
     '''wire [31:0] mult_gain = {i_mult_gain[15:0], q_mult_gain[15:0]};'''&lt;br /&gt;
     '''axi_fifo_flop #(.WIDTH(32+1))'''&lt;br /&gt;
     '''pipeline1_axi_fifo_flop ('''&lt;br /&gt;
       '''.clk(ce_clk),'''&lt;br /&gt;
       '''.reset(ce_rst),'''&lt;br /&gt;
       '''.clear(clear_tx_seqnum),'''&lt;br /&gt;
       '''.i_tdata({pipe_in_tlast,mult_gain}),'''&lt;br /&gt;
       '''.i_tvalid(pipe_in_tvalid),'''&lt;br /&gt;
       '''.i_tready(pipe_in_tready),'''&lt;br /&gt;
       '''.o_tdata({pipe_out_tlast,pipe_out_tdata}),'''&lt;br /&gt;
       '''.o_tvalid(pipe_out_tvalid),'''&lt;br /&gt;
       '''.o_tready(pipe_out_tready));'''&lt;br /&gt;
 &lt;br /&gt;
     '''/* Output Signals */'''&lt;br /&gt;
     '''assign pipe_out_tready = s_axis_data_tready;'''&lt;br /&gt;
     '''assign s_axis_data_tvalid = pipe_out_tvalid;'''&lt;br /&gt;
     '''assign s_axis_data_tlast  = pipe_out_tlast;'''&lt;br /&gt;
     '''assign s_axis_data_tdata  = pipe_out_tdata;'''&lt;br /&gt;
&lt;br /&gt;
The following is a block diagram of the code created by the above Verilog:&lt;br /&gt;
&lt;br /&gt;
[[File:gain_block_diagram_v01.png|center|800px|]]&lt;br /&gt;
&lt;br /&gt;
'''NOTE:'''  In order to meet timing, FIFO blocks were added to either side of the Multiplication process.&lt;br /&gt;
&lt;br /&gt;
===Creating and running HDL testbenches===&lt;br /&gt;
In order to make the coding iteration process more efficient, it is recommended to create testbenches for all RFNoC blocks before compiling them into the FPGA image. This allows for flaw and/or bug detection early in the design. RFNoC Modtool provides the structure and files ( e.g. noc_block_{USER_BLOCK_NAME}_tb ) for the testbenches of each of the OOT blocks that are added with the &amp;lt;code&amp;gt;$ rfnocmodtool add&amp;lt;/code&amp;gt; command.&lt;br /&gt;
&lt;br /&gt;
Below is a figure that shows the general testbench architecture  that is created by the RFNoC Modtool. This architecture allows a user to test their custom block in the exact same environment it will be placed in when it is built into the RFNoC architecture. Other benefits of the testbench architecture include:&lt;br /&gt;
* Testing through multiple blocks (e.g. FILTER -&amp;gt; FFT -&amp;gt; AVE) &lt;br /&gt;
* Testing with multiple streams (e.g. RFNoC block ADD/SUB takes 2 streams, one that will have a constant added to it and one that will have a constant subtracted from it)&lt;br /&gt;
* Data transfer abstraction (e.g. RFNoC Sim Lib API calls to &amp;lt;code&amp;gt;tb_streamer.send&amp;lt;/code&amp;gt; and  &amp;lt;code&amp;gt;tb_streamer.recv&amp;lt;/code&amp;gt; which take care of all the AXI stream signaling)&lt;br /&gt;
&lt;br /&gt;
[[File:rfnoc gsg an 9.png|center|800px|]]&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' The &amp;lt;code&amp;gt;noc_block_tb&amp;lt;/code&amp;gt; block is an instantiation of the &amp;lt;code&amp;gt;noc_block_export_io&amp;lt;/code&amp;gt; that is used in testbenches to communicate to the RFNoC architecture. This makes it possible to talk “RFNoC” to the user’s custom block and as such the custom block has a complete RFNoC experience (signaling, flowcontrol, addressing, etc)&lt;br /&gt;
&lt;br /&gt;
From the [[Getting Started with RFNoC Development#Adding_custom_blocks_to_OOT_Module|Adding custom blocks to OOT Module section]] where the &amp;lt;code&amp;gt;gain&amp;lt;/code&amp;gt; block was initially created, the last files generated were:&lt;br /&gt;
&lt;br /&gt;
    rfnoc/testbenches/noc_block_gain_tb folder created&lt;br /&gt;
    Adding file 'rfnoc/testbenches/noc_block_gain_tb/noc_block_gain_tb.sv'...&lt;br /&gt;
    Adding file 'rfnoc/testbenches/noc_block_gain_tb/Makefile'...&lt;br /&gt;
    Adding file 'rfnoc/testbenches/noc_block_gain_tb/CMakeLists.txt'...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;noc_block_gain_tb&amp;lt;/code&amp;gt; is a folder generated to contain all the files related to the test bench of the &amp;lt;code&amp;gt;gain&amp;lt;/code&amp;gt; block. Each time a new OOT block is created, a new folder will be generated as well. &lt;br /&gt;
&lt;br /&gt;
Inside of this folder are the following three files:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CMakeLists.txt:&amp;lt;/code&amp;gt; this is an empty file used, so far, only to increase the scope of the compilers.&lt;br /&gt;
* &amp;lt;code&amp;gt;noc_block_gain_tb.sv:&amp;lt;/code&amp;gt; this is a ''System Verilog'' file, in which user custom tests are to be located.  This is the '''only''' file that needs to be modified.&lt;br /&gt;
* &amp;lt;code&amp;gt;Makefile:&amp;lt;/code&amp;gt; This file determines the directives that run the simulation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;noc_block_gain_tb.sv&amp;lt;/code&amp;gt; testbench skeleton code creates the following architecture:&lt;br /&gt;
&lt;br /&gt;
[[File:testbench_arch_gain_v01.png|center|800px|]]&lt;br /&gt;
&lt;br /&gt;
Open the file &amp;lt;code&amp;gt;rfnoc-tutorial/rfnoc/testbenches/noc_block_gain_tb/noc_block_gain_tb.sv&amp;lt;/code&amp;gt; and modify the following lines:&lt;br /&gt;
&lt;br /&gt;
Right under the “Verification” section:&lt;br /&gt;
&lt;br /&gt;
    initial begin : tb_main&lt;br /&gt;
      string s;&lt;br /&gt;
      logic [31:0] random_word;&lt;br /&gt;
      logic [63:0] readback;&lt;br /&gt;
      '''logic [15:0] gain;'''&lt;br /&gt;
&lt;br /&gt;
In the “Test 4 -- Write / readback user registers” section:&lt;br /&gt;
    &lt;br /&gt;
    `TEST_CASE_START(&amp;quot;Write / readback user registers&amp;quot;);&lt;br /&gt;
    random_word = $random();&lt;br /&gt;
    '''tb_streamer.write_user_reg(sid_noc_block_gain, noc_block_gain.SR_GAIN, random_word[15:0]);'''&lt;br /&gt;
    '''tb_streamer.read_user_reg(sid_noc_block_gain, 0, readback);'''&lt;br /&gt;
    '''$sformat(s, &amp;quot;User register 0 incorrect readback! Expected: %0d, Actual %0d&amp;quot;, readback[15:0], random_word[15:0]);'''&lt;br /&gt;
    '''`ASSERT_ERROR(readback[15:0] == random_word[15:0], s);'''&lt;br /&gt;
    &lt;br /&gt;
In the “Test 5 -- Test sequence” section:&lt;br /&gt;
&lt;br /&gt;
    `TEST_CASE_START(&amp;quot;Test sequence&amp;quot;);&lt;br /&gt;
    '''gain = 100;'''&lt;br /&gt;
    '''tb_streamer.write_user_reg(sid_noc_block_gain, noc_block_gain.SR_GAIN, gain);'''&lt;br /&gt;
    fork&lt;br /&gt;
      begin&lt;br /&gt;
        cvita_payload_t send_payload;&lt;br /&gt;
        for (int i = 0; i &amp;lt; SPP/2; i++) begin&lt;br /&gt;
          send_payload.push_back(64'(i));&lt;br /&gt;
        end&lt;br /&gt;
        tb_streamer.send(send_payload);&lt;br /&gt;
      end&lt;br /&gt;
      begin&lt;br /&gt;
        cvita_payload_t recv_payload;&lt;br /&gt;
        cvita_metadata_t md;&lt;br /&gt;
        logic [63:0] expected_value;&lt;br /&gt;
        tb_streamer.recv(recv_payload,md);&lt;br /&gt;
        for (int i = 0; i &amp;lt; SPP/2; i++) begin&lt;br /&gt;
          '''expected_value = i*gain;'''&lt;br /&gt;
&lt;br /&gt;
Test #4 verifies that we can write and readback the &amp;lt;code&amp;gt;gain&amp;lt;/code&amp;gt; value. Test #5 writes to the &amp;lt;code&amp;gt;gain&amp;lt;/code&amp;gt; register, sends a sample set in the form of a ramp (1, 2, 3, 4, etc) to the RFNoC gain block and finally reads the values from the &amp;lt;code&amp;gt;gain&amp;lt;/code&amp;gt; block and compares them to expected values. The followings steps will allow the user to run this testbench.&lt;br /&gt;
&lt;br /&gt;
From within the &amp;lt;code&amp;gt;rfnoc-tutorial&amp;lt;/code&amp;gt; directory, create a &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; directory and enter it by running:&lt;br /&gt;
&lt;br /&gt;
    $ mkdir build &amp;amp;&amp;amp; cd build/&lt;br /&gt;
&lt;br /&gt;
The next step is to run &amp;lt;code&amp;gt;cmake&amp;lt;/code&amp;gt;. If PyBOMBS was used to create the development sandbox, &amp;lt;code&amp;gt;cmake&amp;lt;/code&amp;gt; will automatically detect the location of the &amp;lt;code&amp;gt;fpga&amp;lt;/code&amp;gt; repository. If PyBOMBS was not used, the user must provide the location of where the &amp;lt;code&amp;gt;fpga&amp;lt;/code&amp;gt; repository is installed.&lt;br /&gt;
&lt;br /&gt;
If PyBOMBS used, run:&lt;br /&gt;
&lt;br /&gt;
    $ cmake ../&lt;br /&gt;
&lt;br /&gt;
If PyBOMBS not used, run:&lt;br /&gt;
&lt;br /&gt;
    $ cmake [-DUHD_FPGA_DIR=/PATH/TO/FPGA/REPOSITORY] ../&lt;br /&gt;
&lt;br /&gt;
Final output from the &amp;lt;code&amp;gt;$ cmake ../&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
    -- Configuring done&lt;br /&gt;
    -- Generating done&lt;br /&gt;
    -- Build files have been written to: /home/widow/rfnoc/src/rfnoc-tutorial/build&lt;br /&gt;
&lt;br /&gt;
The following command will modify the necessary files and set the correct path to the simulation tools. From now on, every time a new block is added, this command will be run automatically. Remember, only run the following command once for each OOT module (not RFNoC block, but OOT module) created:&lt;br /&gt;
&lt;br /&gt;
    $ make test_tb&lt;br /&gt;
    Scanning dependencies of target test_tb&lt;br /&gt;
    Built target test_tb&lt;br /&gt;
&lt;br /&gt;
Testbenches can be executed by running the command:&lt;br /&gt;
&lt;br /&gt;
    $ make noc_block_[name_of_your_block]_tb &lt;br /&gt;
&lt;br /&gt;
The gain block testbench can be run by running the following command:&lt;br /&gt;
&lt;br /&gt;
    $ make noc_block_gain_tb&lt;br /&gt;
&lt;br /&gt;
The simulation will start.  Final output should look like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ========================================================&lt;br /&gt;
    TESTBENCH STARTED: noc_block_gain&lt;br /&gt;
    ========================================================&lt;br /&gt;
    [TEST CASE   1] (t=000000000) BEGIN: Wait for Reset...&lt;br /&gt;
    [TEST CASE   1] (t=000001002) DONE... Passed&lt;br /&gt;
    [TEST CASE   2] (t=000001002) BEGIN: Check NoC ID...&lt;br /&gt;
    Read GAIN NOC ID: 1111222233334444&lt;br /&gt;
    [TEST CASE   2] (t=000001238) DONE... Passed&lt;br /&gt;
    [TEST CASE   3] (t=000001238) BEGIN: Connect RFNoC blocks...&lt;br /&gt;
    Connecting noc_block_tb (SID: 1:0) to noc_block_gain (SID: 0:0)&lt;br /&gt;
    Connecting noc_block_gain (SID: 0:0) to noc_block_tb (SID: 1:0)&lt;br /&gt;
    [TEST CASE   3] (t=000005457) DONE... Passed&lt;br /&gt;
    [TEST CASE   4] (t=000005457) BEGIN: Write / readback user registers...&lt;br /&gt;
    [TEST CASE   4] (t=000006888) DONE... Passed&lt;br /&gt;
    [TEST CASE   5] (t=000006888) BEGIN: Test sequence...&lt;br /&gt;
    [TEST CASE   5] (t=000007633) DONE... Passed&lt;br /&gt;
    ========================================================&lt;br /&gt;
    '''TESTBENCH FINISHED: noc_block_gain'''&lt;br /&gt;
    ''' - Time elapsed:   7700 ns'''             &lt;br /&gt;
    ''' - Tests Expected: 5'''&lt;br /&gt;
    ''' - Tests Run:      5'''&lt;br /&gt;
    ''' - Tests Passed:   5'''&lt;br /&gt;
    '''Result: PASSED'''   &lt;br /&gt;
    ========================================================&lt;br /&gt;
    $finish called at time : 7700 ns : File &amp;quot;/home/widow/rfnoc/src/rfnoc-tutorial/rfnoc/testbenches/noc_block_gain_tb/noc_block_gain_tb.sv&amp;quot; Line 10&lt;br /&gt;
    INFO: [USF-XSim-96] XSim completed. Design snapshot 'noc_block_gain_tb_behav' loaded.&lt;br /&gt;
    INFO: [USF-XSim-97] XSim simulation ran for 1000000000us&lt;br /&gt;
    launch_simulation: Time (s): cpu = 00:00:10 ; elapsed = 00:00:12 . Memory (MB): peak = 966.387 ; gain = 54.848 ; free physical = 3080 ; free virtual = 29888&lt;br /&gt;
    # if [string equal $vivado_mode &amp;quot;batch&amp;quot;] {&lt;br /&gt;
    #     puts &amp;quot;BUILDER: Closing project&amp;quot;&lt;br /&gt;
    #     close_project&lt;br /&gt;
    # } else {&lt;br /&gt;
    #     puts &amp;quot;BUILDER: In GUI mode. Leaving project open.&amp;quot;&lt;br /&gt;
    # }&lt;br /&gt;
    BUILDER: Closing project&lt;br /&gt;
    ****** Webtalk v2015.4 (64-bit)&lt;br /&gt;
      **** SW Build 1412921 on Wed Nov 18 09:44:32 MST 2015&lt;br /&gt;
      **** IP Build 1412160 on Tue Nov 17 13:47:24 MST 2015&lt;br /&gt;
        ** Copyright 1986-2015 Xilinx, Inc. All Rights Reserved.&lt;br /&gt;
    &lt;br /&gt;
    source /home/widow/rfnoc/src/rfnoc-tutorial/rfnoc/testbenches/noc_block_gain_tb/xsim_proj/xsim_proj.hw/webtalk/labtool_webtalk.tcl -notrace&lt;br /&gt;
    INFO: [Common 17-206] Exiting Webtalk at Tue Jan 10 23:26:20 2017...&lt;br /&gt;
    INFO: [Common 17-206] Exiting Vivado at Tue Jan 10 23:26:22 2017...&lt;br /&gt;
    Built target noc_block_gain_tb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With every custom block created, a &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; directive will be available to run the simulation from the &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===Building the FPGA image with a custom user block===&lt;br /&gt;
In this section steps are given on how to initiate an FPGA build while incorporating the user’s custom RFNoC block. The first sections give general information on building RFNoC images. The remaining two sections show how to initiate FPGA builds using a command line interface and using a graphical interface (coming out soon), respectively.&lt;br /&gt;
&lt;br /&gt;
====Discussion on number of blocks in an FPGA image====&lt;br /&gt;
There is a maximum number of blocks that can be added for each device. The maximum amount of computation engines (CEs/RFNoC blocks) that each device can use is 16, but the amount of custom blocks that can be added depends on the device. &lt;br /&gt;
&lt;br /&gt;
If using a device from the X3xx series, from the 16 CEs, there are 6 that will be always added and are not subject to direct customization: 1 CE for the AXI bus, 1 CE for the Ethernet Interface, 2 Radios and 2 Dma FIFOS. Because of this, the application will only allow a number of 10 custom blocks on the X3xx series. &lt;br /&gt;
&lt;br /&gt;
If using a device from the E3xx series, 2 CE engines are always added and are not subject to direct customization: 1 CE for the AXI bus and 1 Radio. This would virtually allow 14 slots for custom blocks. However, given the size of the FPGA on the E3xx series of devices, the application only allows a number of 6 custom blocks. &lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' Blocks with higher resource utilization may fill up the FPGA and force the user to include less blocks.&lt;br /&gt;
&lt;br /&gt;
Verify the current maximum values by running the &amp;lt;code&amp;gt;uhd_images_builder.py&amp;lt;/code&amp;gt; utility from the scripts directory.&lt;br /&gt;
&lt;br /&gt;
    $ cd {USER_PREFIX}/src/uhd-fpga/usrp3/tools/scripts&lt;br /&gt;
    $ uhd_image_builder.py --help&lt;br /&gt;
&lt;br /&gt;
====Discussion on FPGA image targets====&lt;br /&gt;
RFNoC target names follow the pattern &amp;lt;code&amp;gt;{DEVICE}_RFNOC_{BUILD_TYPE}&amp;lt;/code&amp;gt; with the following build types: &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;HG:&amp;lt;/code&amp;gt; 1GigE on SFP+ Port0, 10Gig on SFP+ Port&lt;br /&gt;
* &amp;lt;code&amp;gt;XG:&amp;lt;/code&amp;gt; 10GigE on both SFP+ ports&lt;br /&gt;
* &amp;lt;code&amp;gt;HLS:&amp;lt;/code&amp;gt; Vivado High Level Synthesis enabled&lt;br /&gt;
* &amp;lt;code&amp;gt;sgX:&amp;lt;/code&amp;gt; Speed grade for E300 devices (1 or 3)&lt;br /&gt;
&lt;br /&gt;
Some examples are:&lt;br /&gt;
* &amp;lt;code&amp;gt;X310_RFNOC_HG&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;X300_RFNOC_HG&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;X310_RFNOC_XG&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;X300_RFNOC_XG&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;X310_RFNOC_HLS_HG&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;X300_RFNOC_HLS_HG&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;E310_RFNOC&amp;lt;/code&amp;gt; (this is for the speed grade 1 FPGA version of E310, append &amp;lt;code&amp;gt;_sg3&amp;lt;/code&amp;gt; for speed grade 3)&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' E310, E312 and E313 all have the same FPGA hardware and therefore will use the &amp;lt;code&amp;gt;E310_RFNOC_{BUILD_TYPE}&amp;lt;/code&amp;gt; target. USRP E3xx devices have either &amp;lt;code&amp;gt;sg1&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;sg3&amp;lt;/code&amp;gt; hardware, please visit [http://files.ettus.com/e3xx_images/README here] to find out how to differentiate.&lt;br /&gt;
&lt;br /&gt;
Additional information about the build targets can be found at the build instructions for USRP3, found [http://files.ettus.com/manual/md_usrp3_build_instructions.html here].&lt;br /&gt;
&lt;br /&gt;
====Image building using the command line====&lt;br /&gt;
The script &amp;lt;code&amp;gt;uhd_image_builder.py&amp;lt;/code&amp;gt; is used to generate the NoC block instantiation file and build the FPGA image. Run the help menu by typing:&lt;br /&gt;
&lt;br /&gt;
    $ cd {USER_PREFIX}/src/uhd-fpga/usrp3/tools/scripts&lt;br /&gt;
    $ ./uhd_image_builder.py --help&lt;br /&gt;
         &lt;br /&gt;
    usage: uhd_image_builder.py [-h] [-I INCLUDE_DIR [INCLUDE_DIR ...]]&lt;br /&gt;
                                [-m MAX_NUM_BLOCKS] [--fill-with-fifos]&lt;br /&gt;
                                [-o OUTFILE] [-d DEVICE] [-t TARGET] [-g] [-c]&lt;br /&gt;
                                [blocks [blocks ...]]&lt;br /&gt;
    &lt;br /&gt;
    Generate the NoC block instantiation file&lt;br /&gt;
    &lt;br /&gt;
    positional arguments:&lt;br /&gt;
      blocks                List block names to instantiate.&lt;br /&gt;
    &lt;br /&gt;
    optional arguments:&lt;br /&gt;
      -h, --help            show this help message and exit&lt;br /&gt;
      -I INCLUDE_DIR [INCLUDE_DIR ...], --include-dir INCLUDE_DIR [INCLUDE_DIR ...]&lt;br /&gt;
                            Path directory of the RFNoC Out-of-Tree module&lt;br /&gt;
      -m MAX_NUM_BLOCKS, --max-num-blocks MAX_NUM_BLOCKS&lt;br /&gt;
                            Maximum number of blocks (Max. Allowed for x310|x300:&lt;br /&gt;
                            10, for e300: 6)&lt;br /&gt;
      --fill-with-fifos     If the number of blocks provided was smaller than the&lt;br /&gt;
                            max number, fill the rest with FIFOs&lt;br /&gt;
      -o OUTFILE, --outfile OUTFILE&lt;br /&gt;
                            Output /path/filename - By running this directive, you&lt;br /&gt;
                            won't build your IP&lt;br /&gt;
      -d DEVICE, --device DEVICE&lt;br /&gt;
                            Device to be programmed [x300, x310, e310]&lt;br /&gt;
      -t TARGET, --target TARGET&lt;br /&gt;
                            Build target - image type [X3X0_RFNOC_HG,&lt;br /&gt;
                            X3X0_RFNOC_XG, E310_RFNOC_sg3...]&lt;br /&gt;
      -g, --GUI             Open Vivado GUI during the FPGA building process&lt;br /&gt;
      -c, --clean-all       Cleans the IP before a new build&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here are details on the usage of the script which is followed by an example:&lt;br /&gt;
&lt;br /&gt;
'''Blocks:''' The first arguments are the names of RFNoC blocks that the user wants to have compiled into the new image which are separated by a space. They can be custom blocks from the user’s OOT module or from the ones that are provided from Ettus, or a combination. Blocks provided by Ettus Research are listed (among other sources necessary for the FPGA build) in the &amp;lt;code&amp;gt;{USER_PREFIX}/src/uhd-fpga/usrp3/lib/rfnoc/Makefile.srcs&amp;lt;/code&amp;gt; file. &lt;br /&gt;
&lt;br /&gt;
These blocks can be identified by the following pattern: &lt;br /&gt;
&lt;br /&gt;
    noc_block_{NAME}.v&lt;br /&gt;
&lt;br /&gt;
However, as all the RFNoC blocks have the same &amp;lt;code&amp;gt;noc_block_&amp;lt;/code&amp;gt; prefix, for simplicity this prefix is omitted when listing the blocks in the &amp;lt;code&amp;gt;uhd_image_builder.py&amp;lt;/code&amp;gt; utility. As an example of the incorrect and correct way of adding blocks, consider the following examples when adding the &amp;lt;code&amp;gt;noc_block_null_source_sink&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;noc_block_siggen&amp;lt;/code&amp;gt; blocks:&lt;br /&gt;
&lt;br /&gt;
Incorrect method:  &lt;br /&gt;
&lt;br /&gt;
    $ ./uhd_image_builder.py noc_block_null_source_sink noc_block_siggen ...&lt;br /&gt;
&lt;br /&gt;
Correct method:&lt;br /&gt;
&lt;br /&gt;
    $ ./uhd_image_builder.py null_source_sink siggen ...&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' Blocks generated by the RFNoC Modtool follow the same naming convention.&lt;br /&gt;
&lt;br /&gt;
There is an increasing list of pre-built blocks. Here is a sample:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;axi_fifo_loopback&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;axi_dma_fifo&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;fir_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;fft&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;null_source_sink&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;schmidl_cox&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;packet_resizer&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;split_stream&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;vector_iir&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;addsub&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;keep_one_in_n&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;pfb&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;export_io&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;conv_encoder_qpsk&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;siggen&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;logpwr&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;fosphor&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;moving_avg&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ddc&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;duc&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
RFNoC related blocks generally reside in &amp;lt;code&amp;gt;fpga/usrp3/lib/rfnoc/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!Block&lt;br /&gt;
!Filename&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|FIFO&lt;br /&gt;
|[https://github.com/EttusResearch/fpga/blob/maint/usrp3/lib/rfnoc/noc_block_axi_fifo_loopback.v noc_block_axi_fifo_loopback.v]&lt;br /&gt;
|Simple FIFO loopback / passthrough block.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|FFT&lt;br /&gt;
|[https://github.com/EttusResearch/fpga/blob/maint/usrp3/lib/rfnoc/noc_block_fft.v noc_block_fft.v]&lt;br /&gt;
|Xilinx coregen based Fast Fourier Transform up to length 4096.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|FIR&lt;br /&gt;
|[https://github.com/EttusResearch/fpga/blob/maint/usrp3/lib/rfnoc/noc_block_fir_filter.v noc_block_fir_filter.v]&lt;br /&gt;
|Xilinx coregen based Finite Impulse Response Filter, 41 taps, reconfigurable tap coefficients.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|Window&lt;br /&gt;
|[https://github.com/EttusResearch/fpga/blob/maint/usrp3/lib/rfnoc/noc_block_window.v noc_block_window.v]&lt;br /&gt;
|Windowing block for use with FFT block.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Vector IIR&lt;br /&gt;
|[https://github.com/EttusResearch/fpga/blob/maint/usrp3/lib/rfnoc/noc_block_vector_iir.v noc_block_vector_iir.v]&lt;br /&gt;
|Single pole IIR with configurable coefficients that filters data along vectors (i.e. parallel streams of samples). Useful with FFT output.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Keep One in N&lt;br /&gt;
|[https://github.com/EttusResearch/fpga/blob/maint/usrp3/lib/rfnoc/noc_block_keep_one_in_n.v noc_block_keep_one_in_n.v]&lt;br /&gt;
|Keeps one packet every N packets.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|AddSub&lt;br /&gt;
|[https://github.com/EttusResearch/fpga/blob/maint/usrp3/lib/rfnoc/noc_block_addsub.v noc_block_addsub.v]&lt;br /&gt;
|Example of using multiple block ports in a single RFNoC block to add and subtract streams.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Null Source Sink&lt;br /&gt;
|[https://github.com/EttusResearch/fpga/blob/maint/usrp3/lib/rfnoc/noc_block_null_source_sink.v noc_block_null_source_sink.v]&lt;br /&gt;
|Generates dummy packets and can consume packets at a configurable rate. Useful for testing.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Packet Resizer&lt;br /&gt;
|[https://github.com/EttusResearch/fpga/blob/maint/usrp3/lib/rfnoc/noc_block_packet_resizer.v noc_block_packet_resizer.v]&lt;br /&gt;
|Resizes input packets to a configurable size (larger or smaller than source packets).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Split Stream&lt;br /&gt;
|[https://github.com/EttusResearch/fpga/blob/maint/usrp3/lib/rfnoc/noc_block_split_stream.v noc_block_split_stream.v]&lt;br /&gt;
|Replicates an input stream to a configurable number of output streams.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' There is a restriction on the amount of blocks that can added into the FPGA image, see the section in this Application Note labeled [[Getting_Started_with_RFNoC_Development#Discussion_on_number_of_blocks_in_an_FPGA_image|Discussion on number of blocks in an FPGA image]] for more information. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-I INCLUDE_DIR:&amp;lt;/code&amp;gt; The &amp;lt;code&amp;gt;-I&amp;lt;/code&amp;gt; directive provides the path to top OOT directory, which contains the users &amp;lt;code&amp;gt;rfnoc/fpga-src&amp;lt;/code&amp;gt; directory which contains the custom blocks. This path is needed by the Xilinx Vivado tool. Inside the &amp;lt;code&amp;gt;fpga-src&amp;lt;/code&amp;gt; directory there is a file called &amp;lt;code&amp;gt;Makefile.srcs&amp;lt;/code&amp;gt; that contains the path of the OOT module and a list of all the custom OOT blocks. This is an auto generated file, which is amended every time a new block is added to the OOT module. Manually modifying this file is not recommended. If there are multiple OOT modules with various custom blocks that reside in different directories the way to include them all is by separating the different paths by a space (e.g. &amp;lt;code&amp;gt;-I /first/OOT/path/ /second/OOT/path/&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
'''IMPORTANT:''' Please be sure to terminate the path of your OOT with the &amp;quot;/&amp;quot; character. Otherwise the path might not be recognized.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-d DEVICE:&amp;lt;/code&amp;gt; The &amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt; directive directs the script on which USRP device the build is for. If no &amp;lt;code&amp;gt;–d&amp;lt;/code&amp;gt; is included the default is &amp;lt;code&amp;gt;–d x310&amp;lt;/code&amp;gt;. Generation-3 USRPs and above all support RFNoC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-t TARGET:&amp;lt;/code&amp;gt; The &amp;lt;code&amp;gt;–t&amp;lt;/code&amp;gt; directive directs the script on which type of image to build for the chosen device. With each USRP device there are several build options to choose from. Detailed information about the build targets can be found at the build instructions for USRP3, found [http://files.ettus.com/manual/md_usrp3_build_instructions.html here]. If &amp;lt;code&amp;gt;-t&amp;lt;/code&amp;gt; is not included, a default target will be chosen for the given device. For example, the default &amp;lt;code&amp;gt;X310_RFNOC_HG&amp;lt;/code&amp;gt; target builds for the &amp;lt;code&amp;gt;–d x310&amp;lt;/code&amp;gt; device. More details on targets can be found in the section of this Application Note labeled [[Getting Started with RFNoC Development#Discussion_on_FPGA_image_targets|Discussion on FPGA image targets]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-m MAX_NUM_BLOCKS:&amp;lt;/code&amp;gt; The &amp;lt;code&amp;gt;–m&amp;lt;/code&amp;gt; directive specifies the max number of RFNoC blocks to build on the FPGA image. An RFNoC image does not need to fill all available slots with RFNoC blocks.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--fill-with-fifos:&amp;lt;/code&amp;gt; The &amp;lt;code&amp;gt;--fill-with-fifos&amp;lt;/code&amp;gt; directive will fill the empty RFNoC block slots with FIFOS. As an example, if a user indicates three RFNoC blocks by name and also specifies &amp;lt;code&amp;gt;–m 5&amp;lt;/code&amp;gt; then the other two slots will be filed with FIFOs. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-o OUTFILE:&amp;lt;/code&amp;gt; With the &amp;lt;code&amp;gt;-o&amp;lt;/code&amp;gt; directive, the RFNoC blocks instantiation file is generated and saved at the desired path with the given name for the user to inspect. The FPGA image will NOT build if this directive is provided. The purpose of the &amp;lt;code&amp;gt;uhd_image_builder.py&amp;lt;/code&amp;gt; script is to auto generate an instantiation file and populate the source files needed for the Xilinx Vivado tool to build the FPGA image, however, it may be desirable to only see the effect of adding a custom OOT module in the &amp;lt;code&amp;gt;fpga/&amp;lt;/code&amp;gt; directory, or for inspecting the instantiation file. When the directive is not provided the &amp;lt;code&amp;gt;rfnoc_ce_auto_inst_x3x0.v&amp;lt;/code&amp;gt; file is overwritten and the FPGA image build process will start automatically (standard use).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-g, --GUI:&amp;lt;/code&amp;gt; Open Vivado GUI during the FPGA building process&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-c, --clean-all:&amp;lt;/code&amp;gt; Cleans the IP before a new build&lt;br /&gt;
&lt;br /&gt;
Here is how to create an X310 FPGA image incorporating the &amp;lt;code&amp;gt;gain&amp;lt;/code&amp;gt; block that was created earlier in this Application Note:&lt;br /&gt;
&lt;br /&gt;
    $ cd {USER_PREFIX}/src/uhd-fpga/usrp3/tools/scripts     &lt;br /&gt;
    $ ./uhd_image_builder.py gain ddc fft -I {USER_PREFIX}/src/rfnoc-tutorial/ -d x310 -t X310_RFNOC_HG -m 6 --fill-with-fifos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
At the end of a successful compilation process, write the new image to a USRP. The following command will load the new image. Update the &amp;lt;code&amp;gt;{IP_Address}&amp;lt;/code&amp;gt; of the USRP and &amp;lt;code&amp;gt;{USER_PREFIX}&amp;lt;/code&amp;gt; to the appropriate values for your configuration before running the command.&lt;br /&gt;
&lt;br /&gt;
    $ uhd_image_loader --args &amp;quot;type=x300,addr={IP_ADDRESS}&amp;quot; --fpga-path {USER_PREFIX}/src/uhd-fpga/usrp3/top/x300/build/usrp_x310_fpga_RFNOC_HG.bit&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' &lt;br /&gt;
* The FPGA image building process may take over an hour.&lt;br /&gt;
&lt;br /&gt;
* FPGA images are specific to the USRP device NOT the USRP series. For example, a USRP X300 FPGA image will '''NOT''' work on a USRP X310 and vice versa. Loading an image that does not correspond to a USRP device will likely brick the device. Additional instructions on flashing a custom image to a device can be found [http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_load_fpga_imgs here] for X3xx series and [http://files.ettus.com/manual/page_usrp_e3x0.html#e3x0_load_fpga_imgs here] for E3xx series.&lt;br /&gt;
&lt;br /&gt;
* [Environment setup] - The &amp;lt;code&amp;gt;uhd_image_builder.py&amp;lt;/code&amp;gt; script will also set up the Xilinx Vivado environment by automatically running the &amp;lt;code&amp;gt;setupenv.sh&amp;lt;/code&amp;gt; script located in the &amp;lt;code&amp;gt;{USER_PREFIX}/src/uhd-fpga/usrp3/top/{device}&amp;lt;/code&amp;gt; directory. The &amp;lt;code&amp;gt;setupenv.sh&amp;lt;/code&amp;gt; script assumes that Xilinx Vivado is installed in the default location of &amp;lt;code&amp;gt;/opt/Xilinx/Vivado&amp;lt;/code&amp;gt;.  If the installation is in a different directory the &amp;lt;code&amp;gt;setupenv_base.sh&amp;lt;/code&amp;gt; script will need to be modified. The script is located at: &amp;lt;code&amp;gt;{USER_PREFIX}/src/uhd-fpga/usrp3/tools/scripts/setupenv_base.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Besides the custom &amp;lt;code&amp;gt;gain&amp;lt;/code&amp;gt; block, a &amp;lt;code&amp;gt;DDC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;FFT&amp;lt;/code&amp;gt; block are also being added along with three &amp;lt;code&amp;gt;FIFOs&amp;lt;/code&amp;gt;.  The &amp;lt;code&amp;gt;DDC&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FFT&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;FIFO&amp;lt;/code&amp;gt; blocks are already in the script's path and therefore do not need their path specified (they ship with the Ettus Research FPGA code). The reason three FIFOs are added is because the max number of blocks was specified to be 6 ( &amp;lt;code&amp;gt;-m 6&amp;lt;/code&amp;gt; ) and since only 3 blocks were specifically named the other three slots are filled with FIFOs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:rfnoc gsg an 10.png|center|800px|]]&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' Instructions on flashing the image to a device can be found [http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_load_fpga_imgs here] for X3xx series and [http://files.ettus.com/manual/page_usrp_e3x0.html#e3x0_load_fpga_imgs here] for E3xx series. FPGA images are specific to the USRP device '''NOT''' the USRP series. For example, a USRP X300 FPGA image will '''NOT''' work on a USRP X310 and vice versa. Loading an image that does not correspond to a USRP device will likely brick the device. &lt;br /&gt;
&lt;br /&gt;
Once the newly compiled image is loaded onto a USRP X3xx running the following command will show what RFNoC blocks are available on the FPGA:&lt;br /&gt;
&lt;br /&gt;
    $ uhd_usrp_probe &lt;br /&gt;
    &lt;br /&gt;
    &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;
    |   |   |   * '''Block_0'''&lt;br /&gt;
    |   |   |   * DDC_0&lt;br /&gt;
    |   |   |   * FFT_0&lt;br /&gt;
    |   |   |   * FIFO_0&lt;br /&gt;
    |   |   |   * FIFO_1&lt;br /&gt;
    |   |   |   * FIFO_2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' The reason the custom block is called &amp;lt;code&amp;gt;Block_0&amp;lt;/code&amp;gt; and not &amp;lt;code&amp;gt;gain_0&amp;lt;/code&amp;gt; is because there is still host side software/files that need updated in order for this block to populate it’s proper name. A following section (UHD Integration) will step through the process of updating those host side files.&lt;br /&gt;
&lt;br /&gt;
====Using a graphical interface====&lt;br /&gt;
A graphical user interface for FPGA generation and building is shipped along with the &amp;lt;code&amp;gt;uhd_image_builder.py&amp;lt;/code&amp;gt; script. This intuitive application aids in setting up a custom FPGA build. &lt;br /&gt;
&lt;br /&gt;
This utility is located in the same &amp;lt;code&amp;gt;scripts&amp;lt;/code&amp;gt; directory as &amp;lt;code&amp;gt;uhd_image_builder.py&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
To run it, enter the following commands:&lt;br /&gt;
&lt;br /&gt;
    $ cd {USER_PREFIX}/src/uhd-fpga/usrp3/tools/scripts/&lt;br /&gt;
    $ ./uhd_image_builder_gui&lt;br /&gt;
&lt;br /&gt;
The application will then be launched:&lt;br /&gt;
&lt;br /&gt;
[[File:rfnoc gsg an 11.png|center|800px|]]&lt;br /&gt;
&lt;br /&gt;
'''1. Select build target:''' In this panel the available build targets are listed. This list may vary depending on which branch of the FPGA repository this user is using. Only RFNoC targets are listed. The build type descriptions are:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;HG:&amp;lt;/code&amp;gt; 1GigE on SFP+ Port0, 10Gig on SFP+ Port1&lt;br /&gt;
* &amp;lt;code&amp;gt;XG:&amp;lt;/code&amp;gt; 10GigE on both SFP+ ports&lt;br /&gt;
* &amp;lt;code&amp;gt;HLS:&amp;lt;/code&amp;gt; Vivado High Level Synthesis enabled&lt;br /&gt;
* &amp;lt;code&amp;gt;sgX:&amp;lt;/code&amp;gt; Speed grade for E300 devices (1 or 3)&lt;br /&gt;
&lt;br /&gt;
'''2. List of blocks available:''' In this panel the available blocks are listed that can be included into a custom design. This list separates the RFNoC blocks provided by Ettus Research and the OOT modules and corresponding blocks that the user adds. Given the hardware differences between the X3xx and E3xx devices, this list will dynamically change when a different device is selected from the panel on the left. This implies that it is necessary to add the OOT modules for each device independently. This is accomplished by using the &amp;lt;code&amp;gt;Add OOT Blocks&amp;lt;/code&amp;gt; feature of the application, details of which are explained at #7 (&amp;lt;code&amp;gt;Add OOT Blocks&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
'''3. Blocks in current design:''' This section gives information on the MAX number of blocks for a given USRP (based on the target selection). There is a maximum number of blocks that can be added for each device. See the section in this App Note labeled &amp;quot;Discussion on number of blocks in an FPGA image&amp;quot; for more information.&lt;br /&gt;
&lt;br /&gt;
'''4. Blocks in current design:''' This panel will be populated by adding elements from the available blocks. All the blocks listed in here will be compiled into the FPGA custom image. There is a maximum number of blocks that can be added for each device. See the section in this App Note labeled &amp;quot;Discussion on number of blocks in an FPGA image&amp;quot; for more information. &lt;br /&gt;
&lt;br /&gt;
'''5. Add button (&amp;gt;&amp;gt;):''' Manually add the blocks from the central panel into your design.&lt;br /&gt;
&lt;br /&gt;
'''6. Remove button (&amp;lt;&amp;lt;):''' Remove blocks from the current design (far-left panel)&lt;br /&gt;
&lt;br /&gt;
'''7. Fill with FIFOs:''' By checking this box, the design will fill any available/unspecified block slots with FIFOs. The number of FIFO blocks that will be instantiated is based on the rules of amount of blocks explained at #3. When less than the max amount of blocks are needed for certain implementation, many users choose to fill their design with FIFO blocks. &lt;br /&gt;
&lt;br /&gt;
'''8. Open Vivado GUI:''' Open Vivado GUI during the FPGA building process. This allows the user to save a Vivado project with all IP and work within the Vivado GUI for development.&lt;br /&gt;
&lt;br /&gt;
'''9. Clean IP:''' Cleans the IP before a new build (recompiles all IP).&lt;br /&gt;
&lt;br /&gt;
'''10. Add OOT blocks:''' Manually add RFNoC Modtool-generated OOT modules by pointing the application to the &amp;lt;code&amp;gt;Makefile.srcs&amp;lt;/code&amp;gt; file, which is located in the &amp;lt;code&amp;gt;{USER_PREFIX}/src/{USER-OOT-moddir}/rfnoc/fpga-srcs/&amp;lt;/code&amp;gt; directory. After adding this file, blocks will appear under “&amp;lt;code&amp;gt;OOT blocks for XXXX devices&amp;lt;/code&amp;gt;”&lt;br /&gt;
&lt;br /&gt;
'''11. Show Instantiation File:''' The application auto-generates the instantiation file that is going to be used by Vivado to build the FPGA image. This instantiation file can be viewed and edited before starting the build by clicking this button. &lt;br /&gt;
&lt;br /&gt;
'''12. Import from GRC:''' If the user has a GNU Radio flowgraph with RFNoC blocks already in it, this application can read what RFNoC blocks are in the flowgraph and populate the &amp;lt;code&amp;gt;Blocks in current design&amp;lt;/code&amp;gt; section of the application with the necessary RFNoC blocks. '''NOTE:''' All RFNoC blocks pulled from a &amp;lt;code&amp;gt;.grc&amp;lt;/code&amp;gt; file must be in the of &amp;lt;code&amp;gt;List of blocks available&amp;lt;/code&amp;gt; before beginning the build.&lt;br /&gt;
&lt;br /&gt;
'''13. Generate .bit file:''' Start the build by clicking this button. &lt;br /&gt;
&lt;br /&gt;
'''14. uhd_image_builder command:''' The command line command with arguments is dynamically build here as the user selects different options. The user could save this command to use next time they build/compile an FPGA image to avoid having to select all options again. &lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' See the latter end of the previous section for additional information on what to expect once the compile has started as well as final output.&lt;br /&gt;
&lt;br /&gt;
==Creating Software/Host portion of custom RFNoC Block==&lt;br /&gt;
Now that the FPGA portion is complete the next step is to add software integration to UHD and GNU Radio as depicted in the RFNoC Stack below.&lt;br /&gt;
&lt;br /&gt;
[[File:rfnoc gsg an 12.png|center|800px|]]&lt;br /&gt;
&lt;br /&gt;
===UHD integration===&lt;br /&gt;
Despite the data processing happening on the FPGA, the host software still has a lot of responsibilities in order for an RFNoC application to function. For example, it needs to know which settings registers are available within an RFNoC block, or what kind of input and output a block has. All of this information goes into the &amp;lt;code&amp;gt;Block Declaration&amp;lt;/code&amp;gt;, which is an XML file that is readable by UHD. Often, some simple logic needs to be embedded in the XML file, which we can do by using a simple scripting language called Noc-Script. Changes to the block declaration file are immediately imported into UHD every time an application is executed, and therefore, no software development toolchain needs to be set up.&lt;br /&gt;
&lt;br /&gt;
The list of things declared by the block declaration file includes:&lt;br /&gt;
&lt;br /&gt;
* Block name and Noc-ID&lt;br /&gt;
* Registers&lt;br /&gt;
* Inputs and outputs (including types)&lt;br /&gt;
&lt;br /&gt;
In some cases, additional C++ code is required to properly control a block from software. In this case, a &amp;lt;code&amp;gt;Block Controller&amp;lt;/code&amp;gt; file is required as well as the declaration file. In most cases, the default block controller provided by UHD is sufficient, so no C++ code needs to be written. Writing custom block controllers requires more effort, and means having to set up a programming toolchain. A common reason to write custom C++ block controllers is if setting a register requires a lot of computation, which is not feasible to do within a block declaration file (e.g., using Noc-Script).&lt;br /&gt;
&lt;br /&gt;
Skeleton code for both the block declaration and the block controller (if required) can be generated through RFNoC Modtool.&lt;br /&gt;
&lt;br /&gt;
Because the &amp;lt;code&amp;gt;gain&amp;lt;/code&amp;gt; block does not require anything other than simply reading and writing to a single register the default block controller will suffice for this example. However, we will need to add information about the register.&lt;br /&gt;
&lt;br /&gt;
Open the &amp;lt;code&amp;gt;gain.xml&amp;lt;/code&amp;gt; file located in the &amp;lt;code&amp;gt;/rfnoc-tutorial/rfnoc/blocks&amp;lt;/code&amp;gt; directory and add the following:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
    &amp;lt;nowiki&amp;gt;&amp;lt;!--Default XML file--&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
    &amp;lt;nocblock&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;gain&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;blockname&amp;gt;gain&amp;lt;/blockname&amp;gt;&lt;br /&gt;
      &amp;lt;ids&amp;gt;&lt;br /&gt;
        &amp;lt;id revision=&amp;quot;0&amp;quot;&amp;gt;1111222233334444&amp;lt;/id&amp;gt;&lt;br /&gt;
      &amp;lt;/ids&amp;gt;&lt;br /&gt;
      '''&amp;lt;nowiki&amp;gt;&amp;lt;!-- Registers --&amp;gt;&amp;lt;/nowiki&amp;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;
      '''&amp;lt;nowiki&amp;gt;&amp;lt;!-- Args --&amp;gt;&amp;lt;/nowiki&amp;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;double&amp;lt;/type&amp;gt;'''&lt;br /&gt;
          '''&amp;lt;value&amp;gt;1.0&amp;lt;/value&amp;gt;'''&lt;br /&gt;
          '''&amp;lt;check&amp;gt;GE($gain, 0.0) AND LE($gain, 32767.0)&amp;lt;/check&amp;gt;'''&lt;br /&gt;
          '''&amp;lt;check_message&amp;gt;Invalid gain.&amp;lt;/check_message&amp;gt;'''&lt;br /&gt;
          '''&amp;lt;action&amp;gt;'''&lt;br /&gt;
            '''SR_WRITE(&amp;quot;GAIN&amp;quot;, IROUND($gain))'''&lt;br /&gt;
          '''&amp;lt;/action&amp;gt;'''&lt;br /&gt;
        '''&amp;lt;/arg&amp;gt;'''&lt;br /&gt;
      '''&amp;lt;/args&amp;gt;'''&lt;br /&gt;
      &amp;lt;nowiki&amp;gt;&amp;lt;!--One input, one output. If this is used, better have all the info the C++ file.--&amp;gt;&amp;lt;/nowiki&amp;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;in0&amp;lt;/name&amp;gt;'''&lt;br /&gt;
          '''&amp;lt;type&amp;gt;sc16&amp;lt;/type&amp;gt;'''&lt;br /&gt;
        &amp;lt;/sink&amp;gt;&lt;br /&gt;
        &amp;lt;nowiki&amp;gt;&amp;lt;source&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
          '''&amp;lt;name&amp;gt;out0&amp;lt;/name&amp;gt;'''&lt;br /&gt;
          '''&amp;lt;type&amp;gt;sc16&amp;lt;/type&amp;gt;'''&lt;br /&gt;
        &amp;lt;nowiki&amp;gt;&amp;lt;/source&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
      &amp;lt;/ports&amp;gt;&lt;br /&gt;
    &amp;lt;/nocblock&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===GNU Radio Integration===&lt;br /&gt;
GNU Radio is built around the concept of blocks, similarly to RFNoC. When mapping RFNoC into an application, the simple constraint is made that every RFNoC block maps to a single GNU Radio block. Thus, when creating mixed GNU Radio/RFNoC applications, there is a very clear 1:1 mapping between what’s happening in RFNoC and GNU Radio.&lt;br /&gt;
&lt;br /&gt;
Since most RFNoC blocks behave very similar to one another from GNU Radio’s perspective, it is generally not required to write C++ code for another block. Rather, a default block provided by RFNoC can be used with appropriate configuration. However, in some cases it may be desirable or even necessary to write a custom GNU Radio block for more specific controlling of the underlying RFNoC block. GNU Radio allows writing blocks in either C++ or Python, but since UHD and RFNoC do not have a Python API, a custom wrapper for an RFNoC block needs to be written in C++. RFNoC Modtool will create skeleton files for this purpose.&lt;br /&gt;
&lt;br /&gt;
The most popular and effective way to use GNU Radio is through the graphical interface, the GNU Radio Companion (GRC). GRC requires a separate description of every GNU Radio block in order to become available in the graphical UI, and the same is true for an RFNoC block that is wrapped in a GNU Radio block (even if the generic RFNoC block wrapper is used). For GNU Radio 3.7 and earlier, GRC bindings for blocks are written as XML files with interspersed Cheetah or Python statements. For a more detailed tutorial on how to write these files, refer to the [http://gnuradio.org/redmine/projects/gnuradio/wiki GNU Radio Documentation] and associated [http://gnuradio.org/redmine/projects/gnuradio/wiki/Guided_Tutorials tutorials].&lt;br /&gt;
&lt;br /&gt;
====GNU Radio Block Code====&lt;br /&gt;
&lt;br /&gt;
* C++ or Python, although RFNoC blocks need to be written in C++ (if at all)&lt;br /&gt;
* How does GNU Radio interface to RFNoC?&lt;br /&gt;
** via C++ infrastructure code in &amp;lt;code&amp;gt;gr-ettus&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;gr-ettus&amp;lt;/code&amp;gt; provides a base RFNoC block class&lt;br /&gt;
** Users extend base class for their RFNoC blocks&lt;br /&gt;
** Many blocks can use base class “as is”&lt;br /&gt;
** No C++ or Python code!&lt;br /&gt;
* &amp;lt;code&amp;gt;rfnoc-tutorial/lib/gain_impl.cc&amp;lt;/code&amp;gt;&lt;br /&gt;
** The gain block does not need anything additional&lt;br /&gt;
&lt;br /&gt;
====GNU Radio Companion Bindings====&lt;br /&gt;
* XML&lt;br /&gt;
* Describes GNU Radio blocks to GRC&lt;br /&gt;
* No recompilation&lt;br /&gt;
* Requirement of GNU Radio Companion&lt;br /&gt;
* Not strictly necessary for GNU Radio&lt;br /&gt;
* Tutorial on how to write them:&lt;br /&gt;
** [http://gnuradio.org/redmine/projects/gnuradio/wiki/GNURadioCompanion http://gnuradio.org/redmine/projects/gnuradio/wiki/GNURadioCompanion ]&lt;br /&gt;
* Skeleton file generated by RFNoC Modtool&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Open the &amp;lt;code&amp;gt;tutorial-gain.xml&amp;lt;/code&amp;gt; file located in the &amp;lt;code&amp;gt;rfnoc-tutorial/grc&amp;lt;/code&amp;gt; directory and edit as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;nowiki&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
    &amp;lt;block&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;RFNoC: gain&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;key&amp;gt;tutorial_gain&amp;lt;/key&amp;gt;&lt;br /&gt;
      &amp;lt;category&amp;gt;tutorial&amp;lt;/category&amp;gt;&lt;br /&gt;
      &amp;lt;import&amp;gt;import tutorial&amp;lt;/import&amp;gt;&lt;br /&gt;
      &amp;lt;make&amp;gt;tutorial.gain(&lt;br /&gt;
        self.device3,&lt;br /&gt;
        uhd.stream_args( \# TX Stream Args&lt;br /&gt;
            cpu_format=&amp;quot;'''fc32'''&amp;quot;,&lt;br /&gt;
            otw_format=&amp;quot;'''sc16'''&amp;quot;,&lt;br /&gt;
            args=&amp;quot;gr_vlen={0},{1}&amp;quot;.format(${grvlen}, &amp;quot;&amp;quot; if $grvlen == 1 else &amp;quot;spp={0}&amp;quot;.format($grvlen)),&lt;br /&gt;
        ),&lt;br /&gt;
        uhd.stream_args( \# RX Stream Args&lt;br /&gt;
            cpu_format=&amp;quot;'''fc32'''&amp;quot;,&lt;br /&gt;
            otw_format=&amp;quot;'''sc16'''&amp;quot;,&lt;br /&gt;
            args=&amp;quot;gr_vlen={0},{1}&amp;quot;.format(${grvlen}, &amp;quot;&amp;quot; if $grvlen == 1 else &amp;quot;spp={0}&amp;quot;.format($grvlen)),&lt;br /&gt;
        ),&lt;br /&gt;
        $block_index, $device_index,&lt;br /&gt;
      )&lt;br /&gt;
    '''self.$(id).set_arg(&amp;quot;gain&amp;quot;, $gain)'''&lt;br /&gt;
      '''&amp;lt;/make&amp;gt;'''&lt;br /&gt;
      '''&amp;lt;callback&amp;gt;set_arg(&amp;quot;gain&amp;quot;, $gain)&amp;lt;/callback&amp;gt;'''&lt;br /&gt;
      &amp;lt;nowiki&amp;gt;&amp;lt;!-- Make one 'param' node for every Parameter you want settable from the GUI.&lt;br /&gt;
           Sub-nodes:&lt;br /&gt;
           * name&lt;br /&gt;
           * key (makes the value accessible as $keyname, e.g. in the make node)&lt;br /&gt;
           * type --&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
         .  &lt;br /&gt;
         .&lt;br /&gt;
         .&lt;br /&gt;
    &lt;br /&gt;
        &amp;lt;option&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Byte&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;key&amp;gt;u8&amp;lt;/key&amp;gt;&lt;br /&gt;
        &amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/param&amp;gt;&lt;br /&gt;
      &amp;lt;param&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;'''Gain'''&amp;lt;/name&amp;gt;&lt;br /&gt;
        &amp;lt;key&amp;gt;'''gain'''&amp;lt;/key&amp;gt;&lt;br /&gt;
        '''&amp;lt;value&amp;gt;1.0&amp;lt;/value&amp;gt;'''&lt;br /&gt;
        &amp;lt;type&amp;gt;'''real'''&amp;lt;/type&amp;gt;&lt;br /&gt;
      &amp;lt;/param&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
      &amp;lt;nowiki&amp;gt;&amp;lt;!-- Make one 'sink' node per input. Sub-nodes:&lt;br /&gt;
           * name (an identifier for the GUI)&lt;br /&gt;
           * type&lt;br /&gt;
           * vlen&lt;br /&gt;
           * optional (set to 1 for optional inputs) --&amp;gt;&amp;lt;/nowiki&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;type&amp;gt;'''complex'''&amp;lt;/type&amp;gt;&lt;br /&gt;
        &amp;lt;vlen&amp;gt;$grvlen&amp;lt;/vlen&amp;gt;&lt;br /&gt;
        &amp;lt;domain&amp;gt;rfnoc&amp;lt;/domain&amp;gt;&lt;br /&gt;
      &amp;lt;/sink&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
      &amp;lt;nowiki&amp;gt;&amp;lt;!-- Make one 'source' node per output. Sub-nodes:&lt;br /&gt;
           * name (an identifier for the GUI)&lt;br /&gt;
           * type&lt;br /&gt;
           * vlen&lt;br /&gt;
           * optional (set to 1 for optional inputs) --&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
      &amp;lt;nowiki&amp;gt;&amp;lt;source&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;out&amp;lt;/name&amp;gt;&lt;br /&gt;
        &amp;lt;type&amp;gt;'''complex'''&amp;lt;/type&amp;gt;&lt;br /&gt;
        &amp;lt;vlen&amp;gt;$grvlen&amp;lt;/vlen&amp;gt;&lt;br /&gt;
        &amp;lt;domain&amp;gt;rfnoc&amp;lt;/domain&amp;gt;&lt;br /&gt;
      &amp;lt;nowiki&amp;gt;&amp;lt;/source&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
    &amp;lt;/block&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' Indentation spacing is important in the &amp;lt;code&amp;gt;&amp;lt;make&amp;gt;&amp;lt;/code&amp;gt; section.&lt;br /&gt;
&lt;br /&gt;
===Compile, Install and Verify===&lt;br /&gt;
&lt;br /&gt;
    $ cd {USER_PREFIX}/src/rfnoc-tutorial/build&lt;br /&gt;
    $ make install&lt;br /&gt;
    &lt;br /&gt;
    $ uhd_usrp_probe &lt;br /&gt;
    &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;
    |   |   |   * '''gain_0'''&lt;br /&gt;
    |   |   |   * DDC_0&lt;br /&gt;
    |   |   |   * FFT_0&lt;br /&gt;
    |   |   |   * FIFO_0&lt;br /&gt;
    |   |   |   * FIFO_1&lt;br /&gt;
    |   |   |   * FIFO_2&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' In the case where the &amp;lt;code&amp;gt;gain_0&amp;lt;/code&amp;gt; does not appear but &amp;lt;code&amp;gt;Block_0&amp;lt;/code&amp;gt; does: Most likely, the XML block declaration file (see [[Getting_Started_with_RFNoC_Development#UHD_integration|UHD Integration]] section) for the block contains a NoC-ID that does not match with any NoC-ID defined in the hardware part of the design. The user has to be certain that the description files are up-to-date and that the NoC-ID matches in the SW and HW side. See the [[Getting_Started_with_RFNoC_Development#UHD_integration|UHD Integration]] section to update those host side files.&lt;br /&gt;
&lt;br /&gt;
==Testing out the custom block==&lt;br /&gt;
At this point the custom &amp;lt;code&amp;gt;gain&amp;lt;/code&amp;gt; RFNoc Block (Computation Engine) can be used within a GNU Radio flowgraph. Below is an example GRC flowgraph using our new block as well as the output application it produces. &lt;br /&gt;
&lt;br /&gt;
[[File:rfnoc gsg an 13.png|center|800px|]]&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' Copy Block: In the RFNoC domain, streams of data can not be split as easily as they are in the GNU Radio domain. The “copy” block depicted in the screenshot above serves the function as a stream splitter . It’s main purpose, when “enabled”, is to copy the samples it is getting at its input and putting then into the output, but here it is also serving as a boundary between a RFNoC-domain and a GNURadio-domain. In the flowgraph above. after this boundary is passed, the data stream can easily be split into the two sinks to have them run simultaneously (standard GNU Radio functionality). It is possible to connect the GNU Radio blocks directly to RFNoC blocks without a “copy” block, but only one would work at a time (the other ones would have to be disabled). Another way to split data streams from the RFNoC-domain is to use the ”RFNoC: split stream” block, which would split the streams in the RFNoC domain, but this is not very useful here as we are, in any case, moving into the GNURadio-domain.&lt;br /&gt;
&lt;br /&gt;
[[File:rfnoc gsg an 14.png|center|800px|]]&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
===Xilinx Vivado===&lt;br /&gt;
====Compile issues====&lt;br /&gt;
=====Synthesis is failing=====&lt;br /&gt;
Verify all the correct Xilinx [[Getting Started with RFNoC Development#Prerequisites|prerequisite software]] is installed.&lt;br /&gt;
&lt;br /&gt;
Additional helpful information can be found in the following Xilinx forum posts:&lt;br /&gt;
* https://forums.xilinx.com/t5/Synthesis/Synthesis-failed-without-reporting-any-error/td-p/686000&lt;br /&gt;
* https://forums.xilinx.com/t5/Installation-and-Licensing/Vivado-on-Linux-synthesis-fails-with-no-error-message/td-p/732143&lt;br /&gt;
&lt;br /&gt;
====Environment Setup====&lt;br /&gt;
The &amp;lt;code&amp;gt;uhd_image_builder.py&amp;lt;/code&amp;gt; script will also set up the Xilinx Vivado environment by automatically running the &amp;lt;code&amp;gt;setupenv.sh&amp;lt;/code&amp;gt; located in the &amp;lt;code&amp;gt;{USER_PREFIX}/src/uhd-fpga/usrp3/top/{device}&amp;lt;/code&amp;gt; directory. The &amp;lt;code&amp;gt;setupenv.sh&amp;lt;/code&amp;gt; script assumes that Xilinx Vivado is installed in the default location of &amp;lt;code&amp;gt;/opt/Xilinx/Vivado&amp;lt;/code&amp;gt;. If the installation is in a different directory, then the &amp;lt;code&amp;gt;setupenv_base.sh&amp;lt;/code&amp;gt; script will need to be modified. The script is located at: &amp;lt;code&amp;gt;{USER_PREFIX}/src/uhd-fpga/usrp3_rfnoc/tools/scripts/setupenv_base.sh&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Reference Files==&lt;br /&gt;
The following reference files are included within the gain_src.tar.gz archive linked below:&lt;br /&gt;
&lt;br /&gt;
* gain.xml		&lt;br /&gt;
* noc_block_gain.v	&lt;br /&gt;
* noc_block_gain_tb.sv	&lt;br /&gt;
* tutorial_gain.xml&lt;br /&gt;
* rfnoc_gain.grc&lt;br /&gt;
&lt;br /&gt;
[[Media:gain src.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
==Links and Additional Resources==&lt;br /&gt;
===RFNoC additional resources===&lt;br /&gt;
* [https://youtube.com/watch?v=j-EfyPVpaJ8 Video: RFNoC Getting Started Video Tutorial]&lt;br /&gt;
* [https://kb.ettus.com/Mailing_Lists USRP Mailing List]&lt;br /&gt;
* [https://kb.ettus.com/RFNoC RFNoC Software Resources Page]&lt;br /&gt;
* [https://www.ettus.com/content/files/RFNoC_Wireless_at_VT_Intro.pdf RFNoC Introduction]&lt;br /&gt;
* [https://www.ettus.com/content/files/RFNoC_Wireless_at_VT_FPGA.pdf RFNoC Deep Dive: FPGA]&lt;br /&gt;
* [https://www.ettus.com/content/files/RFNoC_Wireless_at_VT_Host.pdf RFNoC Deep Dive: Host side]&lt;br /&gt;
* [https://www.youtube.com/watch?v=8cPd3t88djE Video: RFNoC presented at Wireless @ Virginia Tech, 2015 ]&lt;br /&gt;
** Explaining the slides of Intro, FPGA and Host presentations above (in that order).&lt;br /&gt;
* [https://www.youtube.com/watch?v=51rpjJ2W0Qs Video: It's the RFNoC Life for Us by Martin Braun at GRCon16, 2016]&lt;br /&gt;
&lt;br /&gt;
===GNU Radio resources===&lt;br /&gt;
* [http://gnuradio.org/redmine/projects/gnuradio/wiki/OutOfTreeModules GNU Radio OutOfTree Modules tutorial]&lt;br /&gt;
* [http://gnuradio.org/redmine/projects/gnuradio/wiki/InstallingGRFromSource GNU Radio Installation]&lt;br /&gt;
* [http://gnuradio.org/redmine/projects/gnuradio/wiki/Tutorials GNU Radio Tutorials]&lt;br /&gt;
&lt;br /&gt;
===UHD resources===&lt;br /&gt;
* [http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com USRP Mailing List]&lt;br /&gt;
* [https://kb.ettus.com/UHD UHD Software Resources Page]&lt;br /&gt;
* [http://files.ettus.com/manual/md_usrp3_build_instructions.html USRP3 build instructions]&lt;br /&gt;
* [http://files.ettus.com/manual/ UHD Manual]&lt;br /&gt;
&lt;br /&gt;
===Other resources===&lt;br /&gt;
* [https://www.xilinx.com/support/documentation/ip_documentation/ug761_axi_reference_guide.pdf Xilinx - AXI reference guide]&lt;br /&gt;
* [https://kb.ettus.com/Building_and_Installing_the_USRP_Open-Source_Toolchain_(UHD_and_GNU_Radio)_on_Linux UHD + GNU Radio Application Note (Linux)]&lt;br /&gt;
* [http://gnuradio.org/redmine/projects/pybombs/wiki PyBOMBS]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Application Notes]]&lt;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=X300/X310&amp;diff=5891</id>
		<title>X300/X310</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=X300/X310&amp;diff=5891"/>
				<updated>2023-10-27T21:01:14Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: Fix missing link in FAQ for programming FPGA&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The Ettus Research USRP X310 is a high-performance, scalable software defined radio (SDR) platform for designing and deploying next generation wireless communications systems. The hardware architecture combines two extended-bandwidth daughterboard slots covering DC – 6 GHz with up to 160 MHz of baseband bandwidth, multiple high-speed interface options (PCIe, dual 10 GigE, dual 1 GigE), and a large user-programmable Kintex-7 FPGA in a convenient desktop or rack-mountable half-wide 1U form factor.&lt;br /&gt;
&lt;br /&gt;
== Key Features==&lt;br /&gt;
===X300===&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Xilinx Kintex-7 XC7K325T FPGA&lt;br /&gt;
* 14 bit 200 MS/s ADC&lt;br /&gt;
* 16 bit 800 MS/s DAC&lt;br /&gt;
* Frequency range: DC - 6 GHz with suitable daughterboard&lt;br /&gt;
* Up 160MHz bandwidth per channel&lt;br /&gt;
* Two wide-bandwidth RF daughterboard slots&lt;br /&gt;
* Optional GPSDO&lt;br /&gt;
* Multiple high-speed interfaces (Dual 10G, PCIe Express, ExpressCard, Dual 1G)&lt;br /&gt;
|[[File:Product x300.jpg|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===X310===&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Xilinx Kintex-7 XC7K410T FPGA&lt;br /&gt;
* 14 bit 200 MS/s ADC&lt;br /&gt;
* 16 bit 800 MS/s DAC&lt;br /&gt;
* Frequency range: DC - 6 GHz with suitable daughterboard&lt;br /&gt;
* Up 160MHz bandwidth per channel&lt;br /&gt;
* Two wide-bandwidth RF daughterboard slots&lt;br /&gt;
* Optional GPSDO&lt;br /&gt;
* Multiple high-speed interfaces (Dual 10G, PCIe Express, ExpressCard, Dual 1G)&lt;br /&gt;
|[[File:Product x310.jpg|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Compatible Daughterboards==&lt;br /&gt;
* WBX-120 / WBX-40&lt;br /&gt;
* SBX-120 / SBX-40&lt;br /&gt;
* CBX-120 / CBX-40&lt;br /&gt;
* UBX-160 / UBX-40&lt;br /&gt;
* BasicTX / BasicRX&lt;br /&gt;
* LFRX / LFTX&lt;br /&gt;
* TwinRX&lt;br /&gt;
* DBSRX2 (EOL)&lt;br /&gt;
* RFX Series (EOL)&lt;br /&gt;
* TVRX2 (EOL)&lt;br /&gt;
&lt;br /&gt;
==RF Specifications==&lt;br /&gt;
===RF Performance Data (with SBX-120)===&lt;br /&gt;
* SSB/LO Suppression -35/50 dBc&lt;br /&gt;
* Phase Noise 3.5 GHz 1.0 deg RMS&lt;br /&gt;
* Phase Noise 6 GHz 1.5 deg RMS&lt;br /&gt;
* Power Output &amp;gt;10dBm&lt;br /&gt;
* IIP3 (@ typ NF) 0dBm&lt;br /&gt;
* Typical Noise Figure 8dB&lt;br /&gt;
&lt;br /&gt;
==Hardware Specifications==&lt;br /&gt;
* Ettus Research recommends to always use the latest stable version of UHD&lt;br /&gt;
&lt;br /&gt;
===X300===&lt;br /&gt;
* Current Hardware Revision: 8&lt;br /&gt;
* Minimum version of UHD required: 3.9.0&lt;br /&gt;
&lt;br /&gt;
===X310===&lt;br /&gt;
* Current Hardware Revision: 8&lt;br /&gt;
* Minimum version of UHD required: 3.9.0&lt;br /&gt;
&lt;br /&gt;
===Clocking and Sampling Rates===&lt;br /&gt;
There are two master clock rates (MCR) supported on the X300 and X310: 200.0 MHz and 184.32 MHz.&lt;br /&gt;
&lt;br /&gt;
The sampling rate must be an integer decimation rate of the MCR. Ideally, this decimation factor should be an even number. An odd decimation factor will result in additional unwanted attenuation (roll-off from the CIC filter in the DUC and DDC blocks in the FPGA). The valid decimation rates are between 1 and 1024.&lt;br /&gt;
&lt;br /&gt;
For the MCR of 200.0 MHz, the achievable sampling rates using an even decimation factor are 200.0, 100.0, 50.0, 33.33, 25.0, 20.0, 16.67, 14.286 Msps, ... 195.31 Ksps.&lt;br /&gt;
&lt;br /&gt;
For the MCR of 184.32 MHz, the achievable sampling rates using an even decimation factor are 184.32, 92.16, 46.08, 30.72, 23.04, 18.432, 15.36, 13.166 Msps, ... 180.0 Ksps.&lt;br /&gt;
&lt;br /&gt;
If the desired sampling rate is not directly supported by the hardware, then it will be necessary to re-sample in software. This can be done in C++ using libraries such as Liquid DSP [https://github.com/jgaeddert/liquid-dsp], or can be done in GNU Radio, in which there are three blocks that perform sampling rate conversion.&lt;br /&gt;
&lt;br /&gt;
==Physical Specifications==&lt;br /&gt;
&lt;br /&gt;
===Dimensions===&lt;br /&gt;
27.7 x 21.8 x 3.9 cm&lt;br /&gt;
&lt;br /&gt;
===Weight===&lt;br /&gt;
With 2x SBX-120: 1.7kg&lt;br /&gt;
&lt;br /&gt;
===Drawings===&lt;br /&gt;
* [[Media:cu ettus-x3xx.pdf| Enclosure]]&lt;br /&gt;
* [[Media:cu x3xx motherboard cca.pdf| Motherboard]]&lt;br /&gt;
* [[Media:cu Rackmount Ettus-X3xx.pdf| Rackmount kit]]&lt;br /&gt;
&lt;br /&gt;
===CAD/STP Models===&lt;br /&gt;
====X3xx====&lt;br /&gt;
* [[Media:cu x3xx motherboard cca.stp.gz| Motherboard]]&lt;br /&gt;
&lt;br /&gt;
====X3xx Enclosure====&lt;br /&gt;
* [[Media:cu ettus x3xx.stp.gz|Enclosure]]&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* X300/X310: 25 °C&lt;br /&gt;
&lt;br /&gt;
===Operating Humidity Range===&lt;br /&gt;
* 10% to 90% non-condensing&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
===X300/X310===&lt;br /&gt;
[http://files.ettus.com/schematics/x300/x3xx.pdf X300/X310 Schematics]&lt;br /&gt;
&lt;br /&gt;
==Key Component Datasheets==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%&amp;quot;&lt;br /&gt;
!Part Number&lt;br /&gt;
!Description&lt;br /&gt;
!Schematic ID (Page)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.xilinx.com/support/documentation/data_sheets/ds180_7Series_Overview.pdf XC7K325T] / [http://www.xilinx.com/support/documentation/data_sheets/ds180_7Series_Overview.pdf XC7K410T]&lt;br /&gt;
|FPGA&lt;br /&gt;
|U23 (3,5,8,9,10,18)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/AD9146.PDF AD9146]&lt;br /&gt;
|Dual Channel, 16-Bit, 1230 MSPS DAC&lt;br /&gt;
|U12, U36 (7)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/slas635b/slas635b.pdf ADS62P48]&lt;br /&gt;
|Dual Channel, 14-Bit 210 MSPS ADC&lt;br /&gt;
|U11, U35 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.fairchildsemi.com/datasheets/FI/FIN1002.pdf FIN1002]&lt;br /&gt;
|High Speed Differential Receiver&lt;br /&gt;
|U3, U5, U31, U32 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/20001203U.pdf 24LC256T]&lt;br /&gt;
|EEPROM&lt;br /&gt;
|U530 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/lmk04816.pdf LMK04816BISQ/NOPB_1/3]&lt;br /&gt;
|Jitter Cleaner With Dual Loop PLLs&lt;br /&gt;
|U531 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.micrel.com/_PDF/HBW/sy89547l.pdf SY89547LMGTR]&lt;br /&gt;
|Multiplexer&lt;br /&gt;
|U506 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/sn74aup1t17.pdf SN74AUP1T17]&lt;br /&gt;
|Single Schmitt-Trigger Buffer Gate&lt;br /&gt;
|U6, U519 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps54620.pdf TPS54620RGYT]&lt;br /&gt;
|Synchronous Step Down SWIFT™ Converter&lt;br /&gt;
|U515 (21); U516 (26)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/1764fb.pdf LT1764EQ-3.3]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U27 (21); U516 (26)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps7a47.pdf TPS7A47]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U28, U532 (21)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/3603fc.pdf LTC3603EUF_TRPBF]&lt;br /&gt;
|Monolithic Synchronous Step-Down Regulator&lt;br /&gt;
|U517 (23); U500 (25); U514, U513 (27)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps77625.pdf TPS77625_SM]&lt;br /&gt;
|Low-Dropout Voltage Regulators&lt;br /&gt;
|U30 (23)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps79318-ep.pdf TPS79318_SM]&lt;br /&gt;
|Low-Dropout Voltage Regulators&lt;br /&gt;
|U510 (27)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Media:agile9598503.pdf|OSC-96MHZ-724821-01]]&lt;br /&gt;
|Voltage Controlled Crystal Oscillator&lt;br /&gt;
|U25 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==GPSDO==&lt;br /&gt;
* Support GPSDO NMEA Strings&lt;br /&gt;
* [http://www.jackson-labs.com/assets/uploads/main/LC_XO_specsheet.pdf JacksonLabs LC_XO]&lt;br /&gt;
&lt;br /&gt;
===Sensors===&lt;br /&gt;
You can query the lock status with the &amp;lt;code&amp;gt;gps_locked&amp;lt;/code&amp;gt; sensor, as well as obtain raw NMEA sentences using the &amp;lt;code&amp;gt;gps_gprmc&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;gps_gpgga&amp;lt;/code&amp;gt; sensors. Location information can be parsed out of the &amp;lt;code&amp;gt;gps_gpgga&amp;lt;/code&amp;gt; sensor by using &amp;lt;code&amp;gt;gpsd&amp;lt;/code&amp;gt; or another NMEA parser.&lt;br /&gt;
&lt;br /&gt;
==FPGA==&lt;br /&gt;
* Utilization statistics are subject to change between UHD releases. This information is current as of UHD 3.9.4 and was taken directly from Xilinx Vivado 2014.4.&lt;br /&gt;
&lt;br /&gt;
===X300===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1. Slice Logic&lt;br /&gt;
--------------&lt;br /&gt;
&lt;br /&gt;
+----------------------------+-------+-----------+-------+&lt;br /&gt;
|          Site Type         |  Used | Available | Util% |&lt;br /&gt;
+----------------------------+-------+-----------+-------+&lt;br /&gt;
| Slice LUTs                 | 61622 |    203800 | 30.23 |&lt;br /&gt;
|   LUT as Logic             | 52887 |    203800 | 25.95 |&lt;br /&gt;
|   LUT as Memory            |  8735 |     64000 | 13.64 |&lt;br /&gt;
|     LUT as Distributed RAM |  1878 |           |       |&lt;br /&gt;
|     LUT as Shift Register  |  6857 |           |       |&lt;br /&gt;
| Slice Registers            | 62961 |    407600 | 15.44 |&lt;br /&gt;
|   Register as Flip Flop    | 62961 |    407600 | 15.44 |&lt;br /&gt;
|   Register as Latch        |     0 |    407600 |  0.00 |&lt;br /&gt;
| F7 Muxes                   |  1209 |    101900 |  1.18 |&lt;br /&gt;
| F8 Muxes                   |   150 |     50950 |  0.29 |&lt;br /&gt;
+----------------------------+-------+-----------+-------+&lt;br /&gt;
&lt;br /&gt;
3. Memory&lt;br /&gt;
---------&lt;br /&gt;
&lt;br /&gt;
+-------------------+------+-----------+-------+&lt;br /&gt;
|     Site Type     | Used | Available | Util% |&lt;br /&gt;
+-------------------+------+-----------+-------+&lt;br /&gt;
| Block RAM Tile    |  409 |       445 | 91.91 |&lt;br /&gt;
|   RAMB36/FIFO*    |  398 |       445 | 89.43 |&lt;br /&gt;
|     RAMB36E1 only |  398 |           |       |&lt;br /&gt;
|   RAMB18          |   22 |       890 |  2.47 |&lt;br /&gt;
|     RAMB18E1 only |   22 |           |       |&lt;br /&gt;
+-------------------+------+-----------+-------+&lt;br /&gt;
* Note: Each Block RAM Tile only has one FIFO logic available and therefore can accommodate only one FIFO36E1 or one FIFO18E1. However, if a FIFO18E1 occupies a Block RAM Tile, that tile can still accommodate a RAMB18E1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. DSP&lt;br /&gt;
------&lt;br /&gt;
&lt;br /&gt;
+----------------+------+-----------+-------+&lt;br /&gt;
|    Site Type   | Used | Available | Util% |&lt;br /&gt;
+----------------+------+-----------+-------+&lt;br /&gt;
| DSPs           |  123 |       840 | 14.64 |&lt;br /&gt;
|   DSP48E1 only |  123 |           |       |&lt;br /&gt;
+----------------+------+-----------+-------+&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===X310===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1. Slice Logic&lt;br /&gt;
--------------&lt;br /&gt;
&lt;br /&gt;
+----------------------------+-------+-----------+-------+&lt;br /&gt;
|          Site Type         |  Used | Available | Util% |&lt;br /&gt;
+----------------------------+-------+-----------+-------+&lt;br /&gt;
| Slice LUTs                 | 61616 |    254200 | 24.23 |&lt;br /&gt;
|   LUT as Logic             | 52885 |    254200 | 20.80 |&lt;br /&gt;
|   LUT as Memory            |  8731 |     90600 |  9.63 |&lt;br /&gt;
|     LUT as Distributed RAM |  1878 |           |       |&lt;br /&gt;
|     LUT as Shift Register  |  6853 |           |       |&lt;br /&gt;
| Slice Registers            | 62958 |    508400 | 12.38 |&lt;br /&gt;
|   Register as Flip Flop    | 62958 |    508400 | 12.38 |&lt;br /&gt;
|   Register as Latch        |     0 |    508400 |  0.00 |&lt;br /&gt;
| F7 Muxes                   |  1209 |    127100 |  0.95 |&lt;br /&gt;
| F8 Muxes                   |   150 |     63550 |  0.23 |&lt;br /&gt;
+----------------------------+-------+-----------+-------+&lt;br /&gt;
&lt;br /&gt;
3. Memory&lt;br /&gt;
---------&lt;br /&gt;
&lt;br /&gt;
+-------------------+------+-----------+-------+&lt;br /&gt;
|     Site Type     | Used | Available | Util% |&lt;br /&gt;
+-------------------+------+-----------+-------+&lt;br /&gt;
| Block RAM Tile    |  409 |       795 | 51.44 |&lt;br /&gt;
|   RAMB36/FIFO*    |  398 |       795 | 50.06 |&lt;br /&gt;
|     RAMB36E1 only |  398 |           |       |&lt;br /&gt;
|   RAMB18          |   22 |      1590 |  1.38 |&lt;br /&gt;
|     RAMB18E1 only |   22 |           |       |&lt;br /&gt;
+-------------------+------+-----------+-------+&lt;br /&gt;
* Note: Each Block RAM Tile only has one FIFO logic available and therefore can accommodate only one FIFO36E1 or one FIFO18E1. However, if a FIFO18E1 occupies a Block RAM Tile, that tile can still accommodate a RAMB18E1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. DSP&lt;br /&gt;
------&lt;br /&gt;
&lt;br /&gt;
+----------------+------+-----------+-------+&lt;br /&gt;
|    Site Type   | Used | Available | Util% |&lt;br /&gt;
+----------------+------+-----------+-------+&lt;br /&gt;
| DSPs           |  123 |      1540 |  7.98 |&lt;br /&gt;
|   DSP48E1 only |  123 |           |       |&lt;br /&gt;
+----------------+------+-----------+-------+&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===FPGA User Modifications===&lt;br /&gt;
The Verilog code for the FPGA in the USRP X300 and USRP X310 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. Specifically, changing the I/O interface of the FPGA in any way (do not remove any of the I/O for the PCIe interface, such as &amp;lt;code&amp;gt;x300_pcie_int&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;LvFpga_Chinch_Interface&amp;lt;/code&amp;gt;), or modifying the pin and timing constraint files, could result in physical damage to other components on the motherboard, external to the FPGA, and doing this will void the warranty. Also, even if the PCIe interface is not being used, you cannot remove or reassign these pins in the constraint file. The constraint files should not be modified. 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;
&lt;br /&gt;
==Firmware==&lt;br /&gt;
&lt;br /&gt;
The USRP X300 series runs a small amount of software within the FPGA, within a ZPU soft processor. Its main responsibility is to provide access to some registers, handle the networking stacks, and monitor the USRP status.&lt;br /&gt;
&lt;br /&gt;
The source code for the ZPU is stored in &amp;lt;code&amp;gt;firmware/usrp3/&amp;lt;/code&amp;gt; in the UHD repository. To modify the firmware, you need to download a recent ZPU compiler (e.g. from https://github.com/zylin/zpugcc/tree/master/releases/20150428). Unpack the tarball (e.g., into &amp;lt;code&amp;gt;/usr/local&amp;lt;/code&amp;gt;) and make sure the &amp;lt;code&amp;gt;zpu-elf-gcc&amp;lt;/code&amp;gt; binary is in your path. Then, execute the following steps:&lt;br /&gt;
* Create and enter a build directory: &amp;lt;code&amp;gt;mkdir build &amp;amp;&amp;amp; cd build&amp;lt;/code&amp;gt;&lt;br /&gt;
* Run cmake: &amp;lt;code&amp;gt;cmake /path/to/firmware/usrp3/&amp;lt;/code&amp;gt;&lt;br /&gt;
** If all is correctly configured, and the ZPU compiler can be found, this will pass without errors.&lt;br /&gt;
* Build the firmware: &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
** This should yield output similar to this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Scanning dependencies of target x300&lt;br /&gt;
[ 79%] Generating x300_main.map&lt;br /&gt;
[ 83%] Generating x300_main.bin&lt;br /&gt;
[ 87%] Generating x300_main.ihx&lt;br /&gt;
[ 91%] Generating x300_main.dump&lt;br /&gt;
[ 95%] Generating x300_main.rom&lt;br /&gt;
[100%] Generating x300_main.coe&lt;br /&gt;
[100%] Built target x300&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* These files will be copied into the &amp;lt;code&amp;gt;build/x310&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
* To non-persistently load the newly built firmware image into the running FPGA image, simply launch a UHD session with the &amp;lt;code&amp;gt;fw&amp;lt;/code&amp;gt; parameter. The binary must be within UHD's image dir, e.g. by copying x300_main.bin to the default image directory (e.g., &amp;lt;code&amp;gt;/usr/local/share/uhd/images&amp;lt;/code&amp;gt;) or by temporarily setting the &amp;lt;code&amp;gt;UHD_IMAGES_DIR&amp;lt;/code&amp;gt; variable:&lt;br /&gt;
&lt;br /&gt;
 UHD_IMAGES_DIR=/path/to/build/x300 uhd_usrp_probe --args type=x300,fw=x300_main.bin&lt;br /&gt;
&lt;br /&gt;
* To permanently bake the firmware image into the FPGA bitfile, copy the file &amp;lt;code&amp;gt;x300_main.coe&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;fpga/usrp3/top/x300/ip/bootram/bootram.coe&amp;lt;/code&amp;gt; and rebuild the bitfile.&lt;br /&gt;
&lt;br /&gt;
==Interfaces and Connectivity==&lt;br /&gt;
Follow the links below for additional information on configuring each interface for the USRP X300 or X310 SDRs.&lt;br /&gt;
&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_10gige Dual 10 Gigabit Ethernet] - 200 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_pcie PCIe Express (Desktop)] - 200 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_pcie_laptop ExpressCard (Laptop)] - 50 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_1gige Dual 1 Gigabit Ethernet] - 25 MS/s Full Duplex @ 16-bit&lt;br /&gt;
&lt;br /&gt;
===Front Panel===&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;width:50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
* '''JTAG''': USB connector for the on-board USB-JTAG programmer&lt;br /&gt;
* '''RF A Group'''&lt;br /&gt;
** '''TX/RX LED''': Indicates that data is streaming on the TX/RX channel on daughterboard A&lt;br /&gt;
** '''RX2 LED''': Indicates that data is streaming on the RX2 channel on daughterboard A&lt;br /&gt;
* '''REF''': Indicates that the external Reference Clock is locked&lt;br /&gt;
* '''PPS''': Indicates a valid PPS signal by pulsing once per second&lt;br /&gt;
* '''AUX I/O''': Front panel GPIO connector.&lt;br /&gt;
* '''GPS''': Indicates that GPS reference is locked&lt;br /&gt;
* '''LINK''': Indicates that the host computer is communicating with the device (Activity)&lt;br /&gt;
* '''RF B Group'''&lt;br /&gt;
** '''TX/RX LED''': Indicates that data is streaming on the TX/RX channel on daughterboard B&lt;br /&gt;
** '''RX2 LED''': Indicates that data is streaming on the RX2 channel on daughterboard B&lt;br /&gt;
* '''PWR''': Power switch&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | [[File:x3x0 fp overlay.png]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Rear Panel===&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;width:50%&amp;quot; |&lt;br /&gt;
* '''PWR''': Connector for the USRP-X Series power supply&lt;br /&gt;
* '''1G/10G ETH''': SFP+ ports for Ethernet interfaces&lt;br /&gt;
* '''REF OUT''': Output port for the exported reference clock&lt;br /&gt;
* '''REF IN''': Reference clock input&lt;br /&gt;
* '''PCIe x4''': Connector for Cabled PCI Express link&lt;br /&gt;
* '''PPS/TRIG OUT''': Output port for the PPS signal&lt;br /&gt;
* '''PPS/TRIG IN''': Input port for the PPS signal&lt;br /&gt;
* '''GPS''': Connection for the GPS antenna&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | [[File:x3x0 rp overlay.png]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Ref Clock - 10 MHz===&lt;br /&gt;
Using an external 10 MHz reference clock, a square wave will offer the best phase noise performance, but a sinusoid is acceptable. The power level of the reference clock cannot exceed +15 dBm.&lt;br /&gt;
&lt;br /&gt;
===PPS - Pulse Per Second===&lt;br /&gt;
Using a PPS signal for timestamp synchronization requires a square wave signal with the following a 5Vpp amplitude.&lt;br /&gt;
&lt;br /&gt;
To test the PPS input, you can use the following tool from the UHD examples:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;args&amp;gt;&amp;lt;/code&amp;gt; are device address arguments (optional if only one USRP device is on your machine)&lt;br /&gt;
&lt;br /&gt;
    cd &amp;lt;install-path&amp;gt;/lib/uhd/examples ./test_pps_input –args=&amp;lt;args&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Front Panel GPIO===&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;width:50%&amp;quot; |&lt;br /&gt;
The GPIO port is not meant to drive big loads. You should not try to source more than 5mA per pin.&lt;br /&gt;
&lt;br /&gt;
The +3.3V is for ESD clamping purposes only and not designed to deliver high currents.&lt;br /&gt;
&lt;br /&gt;
The switching speed is below 10 MHz.&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | [[File:x3x0 gpio conn.png]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Power on state====&lt;br /&gt;
The hardware power on state and UHD initial state for the front-panel GPIOs is high-Z. For the X3xx, there are no external pull-ups/pull-downs for the GPIO pins, but the FPGAs do have them and they are configured as follows: X3xx: pull-down.&lt;br /&gt;
&lt;br /&gt;
====Pin Mapping====&lt;br /&gt;
* Pin 1: +3.3V&lt;br /&gt;
* Pin 2: Data[0]&lt;br /&gt;
* Pin 3: Data[1]&lt;br /&gt;
* Pin 4: Data[2]&lt;br /&gt;
* Pin 5: Data[3]&lt;br /&gt;
* Pin 6: Data[4]&lt;br /&gt;
* Pin 7: Data[5]&lt;br /&gt;
* Pin 8: Data[6]&lt;br /&gt;
* Pin 9: Data[7]&lt;br /&gt;
* Pin 10: Data[8]&lt;br /&gt;
* Pin 11: Data[9]&lt;br /&gt;
* Pin 12: Data[10]&lt;br /&gt;
* Pin 13: Data[11]&lt;br /&gt;
* Pin 14: 0V&lt;br /&gt;
* Pin 15: 0V&lt;br /&gt;
&lt;br /&gt;
'''Note''': Please see the [http://files.ettus.com/manual/page_gpio_api.html E3x0/X3x0 GPIO API] for information on configuring and using the GPIO bus.&lt;br /&gt;
&lt;br /&gt;
===On-Board LEDs===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!LED &lt;br /&gt;
!Detail&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| DS1 &lt;br /&gt;
| 1.2V &lt;br /&gt;
| Power &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| DS2 &lt;br /&gt;
| TXRX1 &lt;br /&gt;
| Red: TX, Green: RX &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| DS3 &lt;br /&gt;
| RX1 &lt;br /&gt;
| Green: RX &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| DS4 &lt;br /&gt;
| REF &lt;br /&gt;
| Reference Lock &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| DS5 &lt;br /&gt;
| PPS &lt;br /&gt;
| Flashes on Edge &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| DS6 &lt;br /&gt;
| GPS &lt;br /&gt;
| GPS Lock &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| DS7 &lt;br /&gt;
| SFP0 &lt;br /&gt;
| Link, Right, Green&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| DS8 &lt;br /&gt;
| SFP0 &lt;br /&gt;
| Link Activity, Left, Yellow&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| DS10 &lt;br /&gt;
| TXRX2 &lt;br /&gt;
| Red: TX Green: RX &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| DS11 &lt;br /&gt;
| RX2 &lt;br /&gt;
| Green: RX &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| DS12 &lt;br /&gt;
| 6V &lt;br /&gt;
| Daughterboard Power &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| DS13 &lt;br /&gt;
| 3.8V &lt;br /&gt;
| Power &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| DS14 &lt;br /&gt;
| 3.3V &lt;br /&gt;
| Management Power &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| DS15 &lt;br /&gt;
| 3.3V &lt;br /&gt;
| Auxiliary Management Power &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| DS16 &lt;br /&gt;
| 3.3V &lt;br /&gt;
| FPGA Power &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| DS19 &lt;br /&gt;
| SFP1 &lt;br /&gt;
| Link Active, Left, Yellow&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| DS20 &lt;br /&gt;
| SFP1 &lt;br /&gt;
| Link, Right, Green&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| DS21 &lt;br /&gt;
| LINK &lt;br /&gt;
| Link Activity &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Power Connector===&lt;br /&gt;
Model: PDP-40 by CUI Inc.&lt;br /&gt;
&lt;br /&gt;
Power plug connectors for custom power harnesses can be purchased here: https://www.digikey.com/products/en?KeyWords=CP-7340-ND&amp;amp;WT.z_cid=sp_102_buynow&lt;br /&gt;
&lt;br /&gt;
Assembly instructions: [[Media:pdp-40.pdf]]&lt;br /&gt;
&lt;br /&gt;
====Pin Detail====&lt;br /&gt;
* Pins #1 / #2: 12v&lt;br /&gt;
* Pins #3 / #4: Ground&lt;br /&gt;
&lt;br /&gt;
[[File:pdp 40 power detail.png]]&lt;br /&gt;
&lt;br /&gt;
==Certifications==&lt;br /&gt;
===RoHS===&lt;br /&gt;
As of December 1st, 2010 all Ettus Research products are RoHS compliant unless otherwise noted. More information can be found at [http://ettus.com/legal/rohs-information http://ettus.com/legal/rohs-information]&lt;br /&gt;
&lt;br /&gt;
===China RoHS=== &lt;br /&gt;
'''Management Methods for Controlling Pollution Caused by Electronic Information Products Regulation'''&lt;br /&gt;
&lt;br /&gt;
'''Chinese Customers''' &lt;br /&gt;
&lt;br /&gt;
National Instruments is in compliance with the Chinese policy on the Restriction of Hazardous Substances (RoHS) used in Electronic Information Products. For more information about the National Instruments China RoHS compliance, visit [http://www.ni.com/environment/rohs_china ni.com/environment/rohs_china].&lt;br /&gt;
&lt;br /&gt;
==Certificate of Volatility==&lt;br /&gt;
&lt;br /&gt;
Found on the [https://www.ni.com/en/support/documentation/product-certifications.html NI Product Certifications lookup tool] [https://www.ni.com/pdf/manuals/377356a.pdf here].&lt;br /&gt;
&lt;br /&gt;
==Downloads==&lt;br /&gt;
[http://files.ettus.com/manual/md_fpga.html FPGA Resources]&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/binaries/uhd_stable/ UHD Stable Binaries]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/EttusResearch/uhd UHD Source Code on Github]&lt;br /&gt;
&lt;br /&gt;
==Choosing USRP X310 vs USRP X300==&lt;br /&gt;
In terms of host bandwidth, interface options, and all other hardware features the USRP X300 and USRP 310 are identical. However, the USRP X310 provides a larger FPGA, a Xilinx XC7K410T, as opposed to XC7K325T.  While both options provide a significant amount of free resources for custom FPGA development, the XC7K410T provides additional design margin, which translates to ease of development and future expandability.   Most users choose the USRP X310 for their development.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|USRP X300 and X310 FPGA Resource Summary&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|Resource Type&lt;br /&gt;
|USRP X300 (XC7K325T)&lt;br /&gt;
|USRP X310 (XC7K410T)&lt;br /&gt;
|-&lt;br /&gt;
|Count&lt;br /&gt;
|Count&lt;br /&gt;
|-&lt;br /&gt;
|DSP48 Blocks&lt;br /&gt;
|840&lt;br /&gt;
|1540&lt;br /&gt;
|-&lt;br /&gt;
|Block Rams (18kB)&lt;br /&gt;
|890&lt;br /&gt;
|1590&lt;br /&gt;
|-&lt;br /&gt;
|Logic Cells&lt;br /&gt;
|326,080&lt;br /&gt;
|406,720&lt;br /&gt;
|-&lt;br /&gt;
|Slices (logic)&lt;br /&gt;
|50,950&lt;br /&gt;
|63,550&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For up-to-date information on FPGA resource utilization in the stock FPGA design, please see &amp;quot;USRP 300/X310 FPGA Resources&amp;quot; in the Ettus Research knowledge base (https://kb.ettus.com).&lt;br /&gt;
&lt;br /&gt;
==Choosing an RF Daughterboard==&lt;br /&gt;
With the increased sample rates used by the USRP X300 and USRP X310, these new device can support extended-bandwidth daughterboards.  The WBX-120, SBX-120, and CBX-120 are recommended to take advantage of the full bandwidth capability of the USRP X300 and X310.  The WBX-120, SBX-120, and CBX-120 have been upgraded from their predecessors (40 MHz) to use 120 MHz baseband filters.  You can select your daughterboard based on the center frequency of your primary application.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
!Daughterboard&lt;br /&gt;
!Frequency Range&lt;br /&gt;
!Bandwidth&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|WBX-120&lt;br /&gt;
|50 MHz - 2200 MHz&lt;br /&gt;
|120 MHz&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SBX-120&lt;br /&gt;
|400 MHz - 4400 MHz&lt;br /&gt;
|120 MHz&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|CBX-120&lt;br /&gt;
|1200 MHz - 6000 MHz&lt;br /&gt;
|120 MHz&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|UBX-160&lt;br /&gt;
|10 MHz - 6000 MHz&lt;br /&gt;
|160 MHz&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|TwinRX&lt;br /&gt;
|10 MHz - 6000 MHz&lt;br /&gt;
|80 MHz per channel, 160 MHz total&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If your application is in the HF frequency range, the LFRX and LFTX are recommended for up to 30 MHz of bandwidth per channel.  The BasicRX and BasicTX are ideal for configurations that use an external frontend for tuning and filtering with either an IF or baseband interface.&lt;br /&gt;
&lt;br /&gt;
The USRP X300 and X310 are backward compatible with legacy daughterboards except for the RFX Series and XCVR2450.  Please note, while there are two daughterboard slots, the USRP X300/X310 can only support a single TVRX2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you plan to transmit or receive over the air, you should also purchase an antenna.&lt;br /&gt;
&lt;br /&gt;
==Choosing a Host Interface==&lt;br /&gt;
&lt;br /&gt;
The USRP X300/X310 provide three interface options – 1 Gigabit Ethernet (1 GigE), 10 Gigabit Ethernet (10 GigE), and PCI-Express (PCIe). The PCIe interface is always available regardless of what FPGA image is loaded. Ettus ships two FPGA image variants, the HG or HGS image which has one 1 GigE interfaces and one 10 GigE interfaces, and the XG image which has two 10 GigE interfaces. Generally, Ettus Research recommends using 10 GigE to achieve the maximum throughput available from the USRP X300/X310.  PCIe is recommended for applications that require the lowest possible latency, which is a desirable characteristic for PHY/MAC research.  If your application does not require the full bandwidth of the USRP ™ X300 and X310, the 1 GigE interface serves as a cost-effective fall-back option.  Ettus Research provides a complete interface kit for each of these options, which is also shown in Table 3.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|Table 3 - Interface Performance Summary&lt;br /&gt;
|-&lt;br /&gt;
!Interface&lt;br /&gt;
!Throughput (MS/s @ 16-bit)&lt;br /&gt;
!Target&lt;br /&gt;
!Recommended Kit&lt;br /&gt;
|-&lt;br /&gt;
|1 Gigabit&lt;br /&gt;
|25 MS/s&lt;br /&gt;
|Desktop/Laptop&lt;br /&gt;
|Components provided with USRP X300/X310 kit.&lt;br /&gt;
For additional connections, purchase the following:&lt;br /&gt;
[https://www.ettus.com/product/details/1GIGE-KIT SFP Adapter + GigE Cable]&lt;br /&gt;
|-&lt;br /&gt;
|10 Gigabit&lt;br /&gt;
|200 MS/s&lt;br /&gt;
|Desktop&lt;br /&gt;
|[https://www.ettus.com/product/details/10GIGE-KIT 10 GigE Interface Kit]&lt;br /&gt;
|-&lt;br /&gt;
|PCI-Express &lt;br /&gt;
(PCIe, 4 lane)&lt;br /&gt;
|200 MS/S&lt;br /&gt;
|Desktop&lt;br /&gt;
|[https://www.ettus.com/product/details/PCIE-KIT PCI-Express Desktop Kit]&lt;br /&gt;
|-&lt;br /&gt;
|Express Card&lt;br /&gt;
(PCIe, 1 lane)&lt;br /&gt;
|50 MS/s&lt;br /&gt;
|Laptop&lt;br /&gt;
|[https://www.ettus.com/product/details/ECARD-KIT ExpressCard Kit]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Connectivity 2.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;Figure 2 - Host Interface Options&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===10 Gigabit Ethernet===&lt;br /&gt;
See [https://kb.ettus.com/Using_Dual_10_Gigabit_Ethernet_on_the_USRP_X300/X310 this app note] for how to use the X3x0 with dual 10 GbE links.&lt;br /&gt;
&lt;br /&gt;
'''Recommended 10 Gigabit Ethernet Cards'''&lt;br /&gt;
* Intel X520-DA2&lt;br /&gt;
** [http://ark.intel.com/products/39776/Intel-Ethernet-Converged-Network-Adapter-X520-DA2 Intel® Ethernet Converged Network Adapter X520-DA2]&lt;br /&gt;
* Intel X520-DA1&lt;br /&gt;
** [http://ark.intel.com/products/68669/Intel-Ethernet-Converged-Network-Adapter-X520-DA1 Intel® Ethernet Converged Network Adapter X520-DA1 ]&lt;br /&gt;
* Intel X710-DA2&lt;br /&gt;
** [http://ark.intel.com/products/83964/Intel-Ethernet-Converged-Network-Adapter-X710-DA2 Intel® Ethernet Converged Network Adapter X710-DA2 ]&lt;br /&gt;
* Intel X710-DA4&lt;br /&gt;
** [http://ark.intel.com/products/83965/Intel-Ethernet-Converged-Network-Adapter-X710-DA4 Intel® Ethernet Converged Network Adapter X710-DA4 ]&lt;br /&gt;
* Mellanox MCX4121A-ACAT&lt;br /&gt;
** [https://store.mellanox.com/products/mellanox-mcx4121a-acat-connectx-4-lx-en-network-interface-card-25gbe-dual-port-sfp28-pcie3-0-x8-rohs-r6.html Mellanox MCX4121A-ACAT ]&lt;br /&gt;
&lt;br /&gt;
==International Power Supply Options==&lt;br /&gt;
The power supply provided with the USRP X300/X310 kit is packaged with a power cord that is compatible with power outlets in the US/Japan.  If you are not using the USRP X300/X310 in the US/Japan, we recommend purchasing the International USRP X300/X310 Power Cord set.  &lt;br /&gt;
&lt;br /&gt;
==Option: GPS Disciplined, Oven-Controlled Oscillator (GPSDO)==&lt;br /&gt;
The USRP X300 and USRP X310 provide the option to integrate a high-accuracy GPS-disciplined oscillator (GPSDO).  The GPSDO improves the accuracy of the internal frequency reference to 20 ppb, or 0.1 ppb if the GPS is synchronized to the GPS constellation.  When synchronized to the GPS constellation, all USRP ™ devices will also be synchronized in time within 50 ns.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
!Internal TCXO&lt;br /&gt;
!GPS-Disciplined Clock&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Reference&lt;br /&gt;
|TCXO&lt;br /&gt;
|OCXO&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Accuracy (unlocked)&lt;br /&gt;
|± 2.5ppm&lt;br /&gt;
± 2,500 Hz @ 1 GHz&lt;br /&gt;
|± 25 ppb&lt;br /&gt;
± 25 Hz @ 1 GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Accuracy&lt;br /&gt;
|&lt;br /&gt;
|± 0.01ppb&lt;br /&gt;
|-&lt;br /&gt;
|(GPS-Disciplined)&lt;br /&gt;
|&lt;br /&gt;
|~ ± 0.01 Hz @ 1 GHz&lt;br /&gt;
|-&lt;br /&gt;
|GPS Time Sync Accuracy&lt;br /&gt;
|&lt;br /&gt;
|±50ns to UTC Time**&lt;br /&gt;
|-&lt;br /&gt;
|10 MHz Reference Phase Drift with GPS Sync&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;±20ns After 1 Hour**&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Option: Antenna Kit for GPSDO==&lt;br /&gt;
The GPSDO Mini Kit will improve the accuracy of the USRP reference clock, even if it does not receive signals from the GPS Constellation.  However, to achieve the best accuracy possible, and to achieve global timing alignment across multiple USRPs, Ettus Research recommends the GPSDO Mini Antenna Kit.&lt;br /&gt;
&lt;br /&gt;
==Option: General Purpose Input/Output (GPIO) Kit==&lt;br /&gt;
The USRP X300 and X310 include a DB15 connector on the front panel that provides convenient access to GPIO signals.  Each pin can be configured as an input or output, uses 3.3V-level logic, and is protected with basic anti-static circuitry.  These pins can be used to control external devices like RF switches and amplifiers, trigger software events on the host, or even provide basic debugging functionality.  The USRP GPIO Kit is an affordable option that provides access to these signals with a DB15 cable and a breakout board.  The breakout board allows the user to connect external devices through a terminal block.  The user can also solder wires and components into the dedicated prototyping area.&lt;br /&gt;
&lt;br /&gt;
==Option: Cables for MIMO Expansion==&lt;br /&gt;
Multiple USRP X300/X310s can be synchronized for coherent operation by sharing a common 10 MHz and 1 PPS signal.  We recommend using a star-distribution topology with an OctoClock or OctoClock-G, as seen in Figure 4.  This requires matched length cables to be used for both 10 MHz and 1 PPS.&lt;br /&gt;
&lt;br /&gt;
For more information about MIMO operation, please see the MIMO and Synchronization Application Note.&lt;br /&gt;
[[File:8mimo.png|700px|center]]&lt;br /&gt;
&amp;lt;center&amp;gt;Figure 4 - Star-Distribution of 10 MHz/PPS Signals with OctoClock&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Option: USRP X300/X310 Rackmount==&lt;br /&gt;
&lt;br /&gt;
The USRP X300 and X310 were designed to be used with a [https://www.ettus.com/all-products/rackmount-1u/ 1U Rackmount Assembly] for building high-density MIMO systems in a compact and well-organized setup. This mount supports one or two compatible USRPs, and if two are mounted then there are rubber standoffs between the USRPs to avoid both direct contact and surface scratching. If the user will be developing in a laboratory environment or building a high-channel count USRP system, then a 1U Rackmount Assembly is highly recommended. This specific mount is compatible with only the USRP X300 and X310, and allows the integration of up to four bidirectional -- or eight receive-only -- RF channels per 1U.&lt;br /&gt;
&lt;br /&gt;
==Guidance on SFP+ Adapters for Fiber Connectivity on USRP X300/X310==&lt;br /&gt;
&lt;br /&gt;
Ettus Research currently offers direct-connect, copper cabling accessories for the USRP X300 and USRP X310. However, it is also possible to use multi-mode fiber instead of copper connections for these devices. &lt;br /&gt;
&lt;br /&gt;
The USRP X Series is compatible with most brands of SFP+ fiber adapters. In some cases, other equipment in the systems such as 1/10 Gigabith Ethernet switches are only compatible with specific brands of SFP+ adapters and cables. As a general rule, we recommend checking compatibility with the switches and network cards in your system before purchasing an adapter.&lt;br /&gt;
&lt;br /&gt;
Ettus Research does test the USRP X Series devices with our [https://www.ettus.com/product/details/10GIGE-KIT 10 Gigabit Ethernet Connectivity Kit] and a Blade Networks G8124 1/10 GigE switch. Here are is a list of known-good cables and adapters.&lt;br /&gt;
&lt;br /&gt;
Ettus Research has only tested multi-mode fiber accessories.&lt;br /&gt;
&lt;br /&gt;
===Known-Good Adapters===&lt;br /&gt;
* [https://approvedoptics.com/blade-networks-bn-ckm-sp-sr/ Approved Optics Blade Networks BN-CKM-SP-SR-A]&lt;br /&gt;
&lt;br /&gt;
===Known-Good Cables===&lt;br /&gt;
* [https://www.colfaxdirect.com/store/pc/viewPrd.asp?idproduct=995&amp;amp;idcategory=2 Myricom Fiber Cables for 10GBase-SR, 3 Meters 10G-SR-3M]&lt;br /&gt;
&lt;br /&gt;
==Guidance on 10Gb SFP+ to RJ45 Adapters==&lt;br /&gt;
&lt;br /&gt;
Many new motherboards come equipped with an onboard 10Gb RJ45 NIC. It is possible to use a SFP+ to RJ45 adapter and operate at 10Gb speeds using a Cat6/7 Ethernet cables.&lt;br /&gt;
&lt;br /&gt;
Ettus Research has tested the adapters linked below.&lt;br /&gt;
&lt;br /&gt;
===Known-Good Adapters===&lt;br /&gt;
* [https://www.amazon.com/10Gtek-SFP-10G-T-S-Compatible-10GBase-T-Transceiver/dp/B01KFBFL16/ 10Gtek SFP+ to RJ45 Copper Module]&lt;br /&gt;
* [https://www.prolabs.com/products/transceivers/brocade/sfpplus/100-1000-10000base/10g-sfpp-t-c ProLabs 10G-SFPP-T-C]&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
USRP™ X300 and USRP™ X310 SDRs Frequently Asked Questions&lt;br /&gt;
&lt;br /&gt;
* '''What is the bandwidth of the USRP X300/X310'''&lt;br /&gt;
&lt;br /&gt;
The ADC rate on each analog RX channel is 200 MS/s quadrature, which provides a theoretical analog bandwidth of approximately 80% of the Nyquist bandwidth of +/- 100 MHz (+/- 80 MHz around the center frequency).  The resulting maximum theoretical analog bandwidth is 160 MHz.  The actual analog bandwidth may be reduced due the RF daughterboard selected.&lt;br /&gt;
&lt;br /&gt;
RF Daughterboard Bandwidths: See the daughterboard specifications [link]&lt;br /&gt;
&lt;br /&gt;
FPGA Processing Bandwidth: Up to 200 MS/s quadrature.&lt;br /&gt;
&lt;br /&gt;
Host Bandwidth:  Up to 200 MS/s quadrature, dependent on selected interface&lt;br /&gt;
&lt;br /&gt;
For more information about achieving the maximum bandwidth with a USRP X300/X310, please see the &amp;quot;USRP X300/X310 Configuration Guide&amp;quot; or the &amp;quot;USRP System Bandwidth&amp;quot; application note.&lt;br /&gt;
&lt;br /&gt;
* '''How can I program the USRP X300/X310'''&lt;br /&gt;
&lt;br /&gt;
Like all other USRP models, the USRP X300 and X310 are compatible with the USRP Hardware Driver™ (UHD) architecture.  The UHD architecture is a common driver that allows users to develop and execute applications on a host-PC.  UHD provides a direct C++ API to control and stream to/from the USRP  X300/X310.  It also provides compatibility with a variety of third-party software frameworks including GNU Radio, LabVIEW, and Matlab.  You may also customize the FPGA image provided with UHD to integrate your own signal processing. For more information about UHD, and supported software frameworks, please see:&lt;br /&gt;
&lt;br /&gt;
http://files.ettus.com/manual/&lt;br /&gt;
&lt;br /&gt;
* '''How do I update the FPGA images and firmware with the latest from UHD'''&lt;br /&gt;
&lt;br /&gt;
You can find more information about updating the FPGA image in the UHD manual: https://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_getting_started_fpga_update&lt;br /&gt;
&lt;br /&gt;
* '''How can I modify the FPGA of the USRP X300/X310'''&lt;br /&gt;
&lt;br /&gt;
The source code (Verilog) for the USRP X300/X310 is available in the UHD repository. The build process leverages the existing CMAKE build system used to compile the host-side driver.  A Linux-based setup will provide the best results.&lt;br /&gt;
&lt;br /&gt;
Which FPGA toolchain required to build the FPGA images will depend upon your version of UHD. For more details please see the [[UHD]] Software Resource page.&lt;br /&gt;
&lt;br /&gt;
* '''How much free space is available in the USRP X300/X310 FPGA'''&lt;br /&gt;
&lt;br /&gt;
Please see the USRP X300/X310 FPGA resources page for more information.&lt;br /&gt;
&lt;br /&gt;
* '''What type of PC setup is recommended for use with the USRP X300/X310'''&lt;br /&gt;
&lt;br /&gt;
The type of PC required depends heavily on the complexity and bandwidth of the application.  To demonstrate the USRP X300/X310, we typically use a desktop computer with a quadcore i7, 8+ GB of DDR3, and install the PCIe interface card that is also provide with the 10 GigE, PCIe, and ExpressCard interface kits.&lt;br /&gt;
&lt;br /&gt;
* '''What frequency range does the USRP X300/X310 cover'''&lt;br /&gt;
&lt;br /&gt;
The frequency range depends on the daughterboard select by the users.  For more information, please see the USRP X300/X310 Configuration Guide.&lt;br /&gt;
&lt;br /&gt;
* '''What components do I need to purchase for a complete USRP X300/X310 system'''&lt;br /&gt;
&lt;br /&gt;
For a more comprehensive guide, please see the USRP X300/X310 Configuration Guide.&lt;br /&gt;
&lt;br /&gt;
* '''What is the difference between the USRP X300/X310'''&lt;br /&gt;
&lt;br /&gt;
The USRP X310 includes a larger Kintex-7 series FPGA (XC7K410T) with additional development resources for more complex designs.  The USRP X300 includes the smaller XC7K325T FPGA.&lt;br /&gt;
&lt;br /&gt;
* '''What is the part number of the X300/X310 power connector'''&lt;br /&gt;
Model: PDP-40 by CUI Inc.&lt;br /&gt;
Power plug connectors for custom power harnesses can be purchased here: https://www.digikey.com/products/en?KeyWords=CP-7340-ND&amp;amp;WT.z_cid=sp_102_buynow&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Writing_the_USRP_File_System_Disk_Image_to_a_SD_Card&amp;diff=5886</id>
		<title>Writing the USRP File System Disk Image to a SD Card</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Writing_the_USRP_File_System_Disk_Image_to_a_SD_Card&amp;diff=5886"/>
				<updated>2023-09-25T21:28:12Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: Removed reference to bmaptool as it is not recommended for UHD 4.x images&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Application Note Number==&lt;br /&gt;
'''AN-630'''&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;| 2018-12-12&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Nate Temple&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Initial creation&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This application note will provide step-by-step instructions on writing a file system disk image to a SD card using Linux.&lt;br /&gt;
&lt;br /&gt;
==Required Tools==&lt;br /&gt;
* Computer with USB2/3 Interface &lt;br /&gt;
* UHD Installation&lt;br /&gt;
* microSD card to USB Adapter&lt;br /&gt;
&lt;br /&gt;
==Downloading the File System Image==&lt;br /&gt;
To obtain the file system SD card image for your USRP device, run the command in the next step on the host computer with UHD installed and Internet access. &lt;br /&gt;
&lt;br /&gt;
===N3xx===&lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader -t sdimg -t n3xx&lt;br /&gt;
&lt;br /&gt;
Example Output for UHD 3.15.0.0:&lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader -t sdimg -t n3xx&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;
    845962 kB / 845962 kB (100%) n3xx_common_sdimg_default-v3.15.0.0.zip&lt;br /&gt;
    [INFO] Images download complete.&lt;br /&gt;
&lt;br /&gt;
===E31x===&lt;br /&gt;
&lt;br /&gt;
The Release 4 image comes in two varieties: SG1 and SG3. The variety that you will need depends on the product number of your E310. To see which version you need look over at [https://kb.ettus.com/E310/E312#SD_Card_Images E310/E312 - Ettus Knowledge Base]&lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader -t sdimg -t e310 -t sg1&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
    $ sudo uhd_images_downloader -t sdimg -t e310 -t sg3&lt;br /&gt;
&lt;br /&gt;
Example Output for UHD 3.15.0.0 for E310 SG3:&lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader -t sdimg -t e310 -t sg3&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;
    561236 kB / 561236 kB (100%) e3xx_e310_sg3_sdimg_default-v3.15.0.0.zip&lt;br /&gt;
    [INFO] Images download complete.&lt;br /&gt;
&lt;br /&gt;
===E320===&lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader -t sdimg -t e320&lt;br /&gt;
&lt;br /&gt;
Example Output for UHD 3.15.0.0:&lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader -t sdimg -t e320&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;
    795674 kB / 795674 kB (100%) e3xx_e320_sdimg_default-v3.15.0.0.zip&lt;br /&gt;
    [INFO] Images download complete.&lt;br /&gt;
&lt;br /&gt;
==Identifying UHD Installation Prefix==&lt;br /&gt;
&lt;br /&gt;
In the output of the &amp;lt;code&amp;gt;uhd_images_downloader&amp;lt;/code&amp;gt; command above, the folder destination where the images are saved is printed out.&lt;br /&gt;
&lt;br /&gt;
An alternative method to identify your installation prefix is to run the command:&lt;br /&gt;
&lt;br /&gt;
    $ uhd_config_info --install-prefix&lt;br /&gt;
&lt;br /&gt;
Example Output:&lt;br /&gt;
&lt;br /&gt;
    Install prefix: /usr/local&lt;br /&gt;
&lt;br /&gt;
The default folder location for FPGA and SD card images is:&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;UHD_INSTALL_PREFIX&amp;gt;/share/uhd/images/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Writing the File System Image with Linux==&lt;br /&gt;
&lt;br /&gt;
===Identifying SD Card Mount Location===&lt;br /&gt;
&lt;br /&gt;
Insert the microSD card into the host computer.&lt;br /&gt;
&lt;br /&gt;
To identify the device where the microSD card is, run the command:&lt;br /&gt;
&lt;br /&gt;
    dmesg | tail&lt;br /&gt;
&lt;br /&gt;
Example Output (partially truncated for readability):&lt;br /&gt;
&lt;br /&gt;
    [21265.575488] usb-storage 1-2:1.0: USB Mass Storage device detected&lt;br /&gt;
    [21266.586983] scsi 0:0:0:0: Direct-Access     Generic  Mass-Storage     1.11 PQ: 0 ANSI: 2&lt;br /&gt;
    [21266.588024] sd 0:0:0:0: Attached scsi generic sg0 type 0&lt;br /&gt;
    [21267.299812] sd 0:0:0:0: [sdb] 31116288 512-byte logical blocks: (15.9 Gb/14.8 GiB)&lt;br /&gt;
    [21267.302687]  sdb: sdb1 sdb2 sdb3 sdb4&lt;br /&gt;
&lt;br /&gt;
NOTE: In this specific example configuration, the SD card has been attached to &amp;lt;code&amp;gt;sdb&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Another method to finding the device node the disk is attached at is to use the Linux utility &amp;lt;code&amp;gt;lsblk&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Example Output:&lt;br /&gt;
&lt;br /&gt;
    $ lsblk&lt;br /&gt;
    NAME           MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT&lt;br /&gt;
    sdb      8:16   1 14.9G  0 disk&lt;br /&gt;
    ├─sdb1   8:17   1   16M  0 part /media/user/boot&lt;br /&gt;
    ├─sdb2   8:18   1  1.9G  0 part /media/user/primary&lt;br /&gt;
    ├─sdb3   8:19   1  1.9G  0 part /media/user/secondary&lt;br /&gt;
    └─sdb4   8:20   1   11G  0 part /media/user/data&lt;br /&gt;
&lt;br /&gt;
===Unmount Auto-mounted Partitions===&lt;br /&gt;
&lt;br /&gt;
Some operating systems by default will auto-mount the partitions on a block device when it is attached. Before writing a new disk image to the SD card, you should first unmount any mounted partitions. This can be done with the Linux utility &amp;lt;code&amp;gt;umount&amp;lt;/code&amp;gt; as shown below:&lt;br /&gt;
&lt;br /&gt;
    $ sudo umount /media/user/data&lt;br /&gt;
    $ sudo umount /media/user/primary&lt;br /&gt;
    $ sudo umount /media/user/secondary&lt;br /&gt;
    $ sudo umount /media/user/boot&lt;br /&gt;
&lt;br /&gt;
Running the command &amp;lt;code&amp;gt;lsblk&amp;lt;/code&amp;gt; again will show these partitions have been unmounted:&lt;br /&gt;
&lt;br /&gt;
Example Output:&lt;br /&gt;
&lt;br /&gt;
    $ lsblk&lt;br /&gt;
    NAME           MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT&lt;br /&gt;
    sdb      8:16   1 14.9G  0 disk&lt;br /&gt;
    ├─sdb1   8:17   1   16M  0 part&lt;br /&gt;
    ├─sdb2   8:18   1  1.9G  0 part&lt;br /&gt;
    ├─sdb3   8:19   1  1.9G  0 part&lt;br /&gt;
    └─sdb4   8:20   1   11G  0 part&lt;br /&gt;
&lt;br /&gt;
===Writing the SD Card Image===&lt;br /&gt;
&lt;br /&gt;
====Using dd to write the disk image====&lt;br /&gt;
&lt;br /&gt;
'''WARNING:''' The Linux utility &amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt; can cause unrecoverable data loss if the incorrect disk is selected, or if the parameters are input incorrectly. Ensure you have selected the correct input and output parameters for your system configuration.&lt;br /&gt;
&lt;br /&gt;
NOTE: You must use a 16 Gb or larger SD card for the N3xx and E320 file system images.&lt;br /&gt;
&lt;br /&gt;
The ​&amp;lt;code&amp;gt;&amp;lt;SD_CARD_DEV_NAME&amp;gt;​&amp;lt;/code&amp;gt; device node depends on your operating system and which other devices are plugged in. Typical values are ​&amp;lt;code&amp;gt;sdb&amp;lt;/code&amp;gt;​ or &amp;lt;code&amp;gt;mmcblk0​&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;&amp;lt;IMAGE&amp;gt;&amp;lt;/code&amp;gt; value will depend upon which file system image you're writing. Examples for the N300/N310 and E320 are listed below:&lt;br /&gt;
&lt;br /&gt;
'''N3xx'''&lt;br /&gt;
    &amp;lt;IMAGE&amp;gt;=/usr/local/share/uhd/images/usrp_n3xx_fs.sdimg&lt;br /&gt;
&lt;br /&gt;
'''E320'''&lt;br /&gt;
    &amp;lt;IMAGE&amp;gt;=/usr/local/share/uhd/images/usrp_e320_fs.sdimg&lt;br /&gt;
&lt;br /&gt;
Write the disk image with the command:&lt;br /&gt;
&lt;br /&gt;
    $ sudo dd if=&amp;lt;IMAGE&amp;gt; of=&amp;lt;SD_CARD_DEV_NAME&amp;gt; bs=1M&lt;br /&gt;
&lt;br /&gt;
This step of writing the disk image to the SD card can take several minutes to complete.&lt;br /&gt;
&lt;br /&gt;
Example Output:&lt;br /&gt;
&lt;br /&gt;
    $ sudo dd if=/usr/local/share/uhd/images/usrp_&amp;lt;deivce&amp;gt;_fs.sdimg of=/dev/sdb bs=1M&lt;br /&gt;
    15160+0 records in&lt;br /&gt;
    15160+0 records out&lt;br /&gt;
    15896412160 bytes (16 Gb, 15 GiB) copied, 1160.93 s, 13.7 MB/s&lt;br /&gt;
&lt;br /&gt;
To ensure the disk is synchronized, run the &amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
    $ sync&lt;br /&gt;
&lt;br /&gt;
You can now remove the microSD card from your host computer and insert it into the USRP.&lt;br /&gt;
&lt;br /&gt;
[[Category:Application Notes]]&lt;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Ettus_USRP_E300_Embedded_Family_Getting_Started_Guides&amp;diff=5885</id>
		<title>Ettus USRP E300 Embedded Family Getting Started Guides</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Ettus_USRP_E300_Embedded_Family_Getting_Started_Guides&amp;diff=5885"/>
				<updated>2023-09-25T20:38:31Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: Fix mendor update commands&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Kit Contents==&lt;br /&gt;
&lt;br /&gt;
===E310===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* E310 USRP&lt;br /&gt;
* Power supply&lt;br /&gt;
* 2x SMB-to-SMA adapter&lt;br /&gt;
* 1 Gigabit Ethernet cable&lt;br /&gt;
* USB2-to-microUSB cable&lt;br /&gt;
* Imaged microSD card&lt;br /&gt;
* Getting started guide&lt;br /&gt;
|[[File:Product e310.png|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===E312===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* E312 USRP&lt;br /&gt;
* Power supply&lt;br /&gt;
* 2x SMB-to-SMA adapter&lt;br /&gt;
* 1 Gigabit Ethernet cable&lt;br /&gt;
* USB2-to-microUSB cable&lt;br /&gt;
* Imaged microSD card&lt;br /&gt;
* Getting started guide&lt;br /&gt;
|[[File:Product e312.png|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===E313===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Protective caps for input ports&lt;br /&gt;
* Surface mounting accessory&lt;br /&gt;
* Pole mounting accessory&lt;br /&gt;
* End conduit interface for USB devices &lt;br /&gt;
* Waterproof sleeve for DC power connector&lt;br /&gt;
* Waterproof sleeve for PoE (RJ45) connector&lt;br /&gt;
* Torx T-20 key&lt;br /&gt;
* Mounting accessory assembly guide&lt;br /&gt;
* Imaged microSD card&lt;br /&gt;
|[[File:E313.png|250px|center]] &lt;br /&gt;
''The USRP E313 is a fully assembled device that includes an USRP E310.''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Verify the Contents of Your Kit==&lt;br /&gt;
&lt;br /&gt;
Make sure that your kit contains all the items listed above. If any items are missing, please contact your sales agent or Ettus Research Technical support immediately.&lt;br /&gt;
&lt;br /&gt;
==You Will Need==&lt;br /&gt;
&lt;br /&gt;
* A host computer with an available USB 2.0 or 3.0 port&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 easily cause the device to become non-functional. Listed below are some examples of actions which can 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 boards.&lt;br /&gt;
*Always use caution with FPGA, firmware, or software modifications.&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 0 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;
&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. See the [[Ettus_USRP_E300_Embedded_Family_Hardware_Resources#Hardware_Specifications|Hardware Specifications]] section of the USRP Embedded Series Hardware Resources for additional details on which version of the USRP Hardware Driver, UHD, is required. It is recommended to use the latest stable version of UHD that is available. &lt;br /&gt;
&lt;br /&gt;
If you have a USB stick with the [[Live SDR Environment]] installed on it, then you may boot your host computer from that. The LiveUSB SDR Environment does not require anything to be installed on your host computer, and contains a Linux-based environment with the UHD software and the GNU Radio framework already installed. More information about the [[Live SDR Environment]] is available at the [[Live SDR Environment Getting Started Guides]] page.&lt;br /&gt;
&lt;br /&gt;
== USRP E31x Device Specific Operations ==&lt;br /&gt;
&lt;br /&gt;
=== Powering On the Hardware ===&lt;br /&gt;
&lt;br /&gt;
With older USRP E31x devices running Firmware version 1, connecting the AC power supply to the device will cause the unit to turn on and boot­. By default with Firmware 2.0 and newer the device no longer turns on when AC power is plugged in. To determine the firmware version, once the device is fully booted, login to it and execute&lt;br /&gt;
&lt;br /&gt;
    $ dmesg | grep -i &amp;quot;firmware version&amp;quot;&lt;br /&gt;
&lt;br /&gt;
If this is the first time powering on a USRP E312 (with battery), allow the battery to fully charge before disconnecting the AC power source.&lt;br /&gt;
&lt;br /&gt;
Once the device has completed the boot process, you are ready to start using the device over your preferred method of connectivity (Serial Console, Network, or USB peripherals)!&lt;br /&gt;
&lt;br /&gt;
=== Turning the Device Off/On ===&lt;br /&gt;
&lt;br /&gt;
You can power the device on and off by pressing the power button. To power the device off, hold the power button down until the button’s LED turns off -- this will take a couple of seconds, and then another 15 seconds for the device to fully shut down. To turn the device on, hold down the power button until the LED turns on.&lt;br /&gt;
&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;
=== Autoboot ===&lt;br /&gt;
&lt;br /&gt;
The USRP E31x can be configured to power on and boot automatically when power is applied.  If the firmware is older than 2.0 then it will ''probably'' need to be updated for autoboot to work reliably; email [mailto:support@ettus.com support@ettus.com] for more information.&lt;br /&gt;
&lt;br /&gt;
To control autoboot on the USRP E31x, first determine the version of UHD, for example by running&lt;br /&gt;
&lt;br /&gt;
    $ uhd_config_info --version&lt;br /&gt;
&lt;br /&gt;
on the device. The UHD version determines the filesystem location where the &amp;lt;code&amp;gt;autoboot&amp;lt;/code&amp;gt; file is located.&lt;br /&gt;
&lt;br /&gt;
* For UHD 4 and newer&lt;br /&gt;
&lt;br /&gt;
To enable autoboot:&lt;br /&gt;
&lt;br /&gt;
    $ echo 1 &amp;gt; /sys/devices/soc0/fpga-full/fpga-full:pmu/autoboot&lt;br /&gt;
&lt;br /&gt;
To disable autoboot:&lt;br /&gt;
&lt;br /&gt;
    $ echo 0 &amp;gt; /sys/devices/soc0/fpga-full/fpga-full:pmu/autoboot&lt;br /&gt;
&lt;br /&gt;
* For UHD 3.15 and older:&lt;br /&gt;
&lt;br /&gt;
To enable autoboot:&lt;br /&gt;
&lt;br /&gt;
    $ echo 1 &amp;gt; /sys/devices/axi_pmu.3/autoboot&lt;br /&gt;
&lt;br /&gt;
To disable autoboot:&lt;br /&gt;
&lt;br /&gt;
    $ echo 0 &amp;gt; /sys/devices/axi_pmu.3/autoboot&lt;br /&gt;
&lt;br /&gt;
Settings take place immediately; no reboot is required.&lt;br /&gt;
&lt;br /&gt;
=== Default Password ===&lt;br /&gt;
&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-e3x0-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;
==Serial Console Connectivity==&lt;br /&gt;
&lt;br /&gt;
The easiest way to first communicate with your E31x device is by using the USB Serial Console. Connect a micro­USB cable to the Serial Console port on the E31x and connect the other end to a PC. The console will appear as an “FTDI Serial Device” ­ thus, it will likely appear as a ttyUSB device in Linux or a COM port on Windows. In Windows, you will need to edit the properties of the device in ‘Device Manager’ and ‘Enable VCP’. On the PC, open a serial terminal to the E31x using the following parameters: B​aud Rate:​115200, D​ata:​8­bit, P​arity: None, S​top:​1­bit, F​low Control:​None.&lt;br /&gt;
&lt;br /&gt;
On Linux, the following command will typically handle the serial connection:&lt;br /&gt;
&lt;br /&gt;
    sudo screen /dev/ttyUSB0 115200&lt;br /&gt;
&lt;br /&gt;
You may have to change the device name.&lt;br /&gt;
&lt;br /&gt;
For additional information about using the serial console and instructions for communicating with the device over other methods (such as connecting with SSH over the network or using and LCD screen, keyboard, and mouse), please refer to the UHD Manual online: https://files.ettus.com/manual/page_usrp_e3xx.html&lt;br /&gt;
&lt;br /&gt;
==Network Connectivity==&lt;br /&gt;
&lt;br /&gt;
By default, the E31x device will run a DHCP client on its 1 Gigabit Ethernet port. Assuming your network resolves hostnames (depends on your routers / switches), if you connect the device to your network, you should see it appear with the hostname e​ttus­e300.​You can then access the device over SSH.&lt;br /&gt;
&lt;br /&gt;
If the hostname does not resolve, you can discover the IP address by logging into the device over the serial connection, or checking your network’s DHCP tables.&lt;br /&gt;
&lt;br /&gt;
Once you have logged in to the device, you can reconfigure the network settings (e.g., you could configure it for a static IP address, if you wish).&lt;br /&gt;
&lt;br /&gt;
==Updating the Linux File System==&lt;br /&gt;
&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 E310 USRP must match. &lt;br /&gt;
&lt;br /&gt;
There are two ways to update the file system for the E310 USRP: &lt;br /&gt;
&lt;br /&gt;
1. Mender, which is available starting with UHD 4.0.0.0 release only. If you are using UHD 3.15 or prior you'll need to update the microSD card to UHD4 before being able to use Mender to do updates.&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;
NOTE: File System Partition Layout&lt;br /&gt;
&lt;br /&gt;
The SD Card is divided into four partitions. There are two root file system partitions, a &amp;quot;boot&amp;quot; partition and a &amp;quot;data&amp;quot; partition. &lt;br /&gt;
&lt;br /&gt;
Any data you would like to preserve through Mender updates should be saved to the &amp;quot;data&amp;quot; partition, which is mounted at &amp;lt;code&amp;gt;/data&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===1. Updating the file system with Mender===&lt;br /&gt;
&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;
&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;
The USRP E31x release images come in two varieties, sg1 and sg1. The variety that you will need depends on the product number of your E31x, which is printed on the bottom of the device. You must use the appropriate files for your specific device. Incorrect files will not work, and will only boot as far as the U-Boot boot loader before stopping.&lt;br /&gt;
&lt;br /&gt;
For the E310, the product number will be &amp;lt;code&amp;gt;156333X-01L&amp;lt;/code&amp;gt;, where X is a letter from A to Z. For devices where X is A, B, C, D, use the &amp;lt;code&amp;gt;sg1&amp;lt;/code&amp;gt; files. For devices where X is E or later, use the &amp;lt;code&amp;gt;sg3&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&lt;br /&gt;
For the E312, the product number will be &amp;lt;code&amp;gt;140605X-01L&amp;lt;/code&amp;gt;, where X is a letter from A to Z. All E312 USRPs use the &amp;lt;code&amp;gt;sg3&amp;lt;/code&amp;gt; files.&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 e310 -t sg# --yes&lt;br /&gt;
&lt;br /&gt;
where &amp;quot;sg#&amp;quot; is the correct file type as found above, with &amp;quot;#&amp;quot; being either 1 or 3. Example Output:&lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader -t mender -t e310 -t sg3 --yes&lt;br /&gt;
    [INFO] Using base URL: https://files.ettus.com/binaries/cache/&lt;br /&gt;
    [INFO] Images destination: /usr/local/share/uhd/images&lt;br /&gt;
    292014 kB / 292014 kB (100%) e3xx_e310_sg3_mender_default-v4.0.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;
NOTE: Regardless of which file type is specified, the extracted mender file will have the same name: &amp;lt;code&amp;gt;usrp_e310_fs.mender&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Next, you will need to copy this Mender file system image to the USRP E310. 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;
Example code to execute:&lt;br /&gt;
&lt;br /&gt;
    $ scp /usr/local/share/uhd/images/usrp_e310_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 E310'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 E310, connect to the E310 using either the Serial Console, or via SSH to gain shell access.&lt;br /&gt;
&lt;br /&gt;
On the E310, 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;
    root@ni-e310-serial:~# mender install /home/root/usrp_e310_fs.mender&lt;br /&gt;
&lt;br /&gt;
Example Output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ni-e310-serial:~# mender install /home/root/usrp_e310_fs.mender                       &lt;br /&gt;
INFO[0000] Start updating from local image file: [/home/root/usrp_e310_fs.mender]  module=rootfs&lt;br /&gt;
Installing update from the artifact of size 399640064&lt;br /&gt;
INFO[0000] opening device /dev/mmcblk0p3 for writing     module=block_device&lt;br /&gt;
INFO[0000] partition /dev/mmcblk0p3 size: 2046820352     module=block_device&lt;br /&gt;
................................   0% 1024 KiB&lt;br /&gt;
................................   0% 2048 KiB&lt;br /&gt;
................................   0% 3072 KiB&lt;br /&gt;
[truncated for readability]&lt;br /&gt;
................................  99% 389120 KiB&lt;br /&gt;
................................  99% 390144 KiB&lt;br /&gt;
................................ 100% 390273 KiB&lt;br /&gt;
INFO[0740] wrote 2046820352/2046820352 bytes of update to device /dev/mmcblk0p3  module=device&lt;br /&gt;
INFO[0744] Enabling partition with new image installed to be a boot candidate: 3  module=device&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The artifact can also be stored on a remote server:&lt;br /&gt;
    $ mender install &amp;lt;http://server.name/path/to/latest.mender&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 E310:&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 [https://files.ettus.com/manual/page_usrp_e3xx.html UHD Manual]​.&lt;br /&gt;
&lt;br /&gt;
=====Troubleshooting Mender Update=====&lt;br /&gt;
&lt;br /&gt;
When updating an E31x USRP using mender,  it is possible that the update will not apply. For example, if the E31x v3.15.0.0 bootloader is misconfigured then it will not boot into an upgraded mender image. There are 2 solutions to this:&lt;br /&gt;
&lt;br /&gt;
A. Reimage SD card with full sdimg using dd or bmaptool&lt;br /&gt;
&lt;br /&gt;
This is the recommended solution. Follow the steps to [[Writing the USRP File System Disk Image to a SD Card|update using the sdimg]]. E31x v4.0.0.0 and later contains the bootloader fix to enable future mender updates.&lt;br /&gt;
&lt;br /&gt;
B. Manually reconfigure bootloader&lt;br /&gt;
&lt;br /&gt;
This solution requires some effort, but isn't too difficult. That said, because the SD card is easily accessible on most E31x this is not the recommended solution.&lt;br /&gt;
&lt;br /&gt;
1) Connect to the [[E310/E312_Getting_Started_Guides#Serial_Console_Connectivity|E31x via serial]]&lt;br /&gt;
&lt;br /&gt;
2) Boot the device and quickly enter &amp;quot;noautoboot&amp;quot; into the serial console. It can be helpful to have &amp;quot;noautoboot&amp;quot; copied to the clipboard. If completed successfully, you should have a prompt like this:&lt;br /&gt;
&lt;br /&gt;
    Automatic boot in 3s...&lt;br /&gt;
    Enter 'noautoboot' to enter prompt without timeout&lt;br /&gt;
    ni-e31x-uboot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you don't get this prompt, restart the device and try again.&lt;br /&gt;
&lt;br /&gt;
3) Configure the bootargs to support mender updates&lt;br /&gt;
&lt;br /&gt;
    setenv bootargs 'root=${​​​​​​​mender_kernel_root}​​​​​​​ rw rootwait uio_pdrv_genirq.of_id=usrp-uio'&lt;br /&gt;
    saveenv&lt;br /&gt;
&lt;br /&gt;
4) Reboot device and apply mender image&lt;br /&gt;
&lt;br /&gt;
NOTE: This solution may brick the E31x USRP if done incorrectly. To unbrick the USRP, follow the solution of overwriting the full SD card image.&lt;br /&gt;
&lt;br /&gt;
===2. Updating the files system by writing the disk image===&lt;br /&gt;
&lt;br /&gt;
The microSD card is accessible directly on the Board-only version of the E310 USRP. The E310 Full Enclosure version must be opened with the included Torx wrench. &lt;br /&gt;
&lt;br /&gt;
NOTE: This method will overwrite all data saved on the microSD card, including any data saved to the &amp;lt;code&amp;gt;/data&amp;lt;/code&amp;gt; partition.&lt;br /&gt;
&lt;br /&gt;
Please see [[Writing the USRP File System Disk Image to a SD Card|this application note]] for step-by-step instructions on writing the file system image to the microSD card.&lt;br /&gt;
&lt;br /&gt;
==Subdevice Specification Mapping==&lt;br /&gt;
&lt;br /&gt;
===E310/E312/E313===&lt;br /&gt;
&lt;br /&gt;
The USRP E31x contains 2 channels, each represented on the front panel as &amp;lt;code&amp;gt;TRX-A / RX2-A&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TRX-B / RX2-B&amp;lt;/code&amp;gt;. Below is the &amp;lt;code&amp;gt;subdev&amp;lt;/code&amp;gt; mapping of RF &lt;br /&gt;
&lt;br /&gt;
====UHD &amp;lt;3.15.x.x====&lt;br /&gt;
* TRX-A / RX2-A = A:0&lt;br /&gt;
* TRX-B / RX2-B = B:0&lt;br /&gt;
&lt;br /&gt;
====UHD 3.15.x.x+====&lt;br /&gt;
* TRX-A / RX2-A = A:0&lt;br /&gt;
* TRX-B / RX2-B = A:1&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;
==Example Programs==&lt;br /&gt;
The UHD driver includes several example programs, which may serve as test programs or the basis for your application program. These example programs are already installed on the E31x device, and 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;
==Test and Verify the Operation of the USRP==&lt;br /&gt;
You can quickly verify the operation of your USRP E31x by running the &amp;lt;code&amp;gt;rx_ascii_art_dft&amp;lt;/code&amp;gt; UHD example program.&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 E31x device by connecting an antenna and observing the spectrum of a commercial FM radio station in real­time. Please follow the steps listed below.&lt;br /&gt;
&lt;br /&gt;
1. Attach an antenna to the RX2­A antenna port of the E31x.&lt;br /&gt;
&lt;br /&gt;
2. Log into the E31x from an external host computer over Ethernet using an SSH client.&lt;br /&gt;
&lt;br /&gt;
3. At a terminal prompt running on the E31x, run:&lt;br /&gt;
&lt;br /&gt;
    /usr/lib/uhd/examples/rx_ascii_art_dft ­­--freq 88.1e6 ­­--rate 400e3 ­­--gain 30 ­­--ref­-lvl ­-30&lt;br /&gt;
&lt;br /&gt;
4. Modify the command­line argument &amp;quot;&amp;lt;code&amp;gt;freq&amp;lt;/code&amp;gt;&amp;quot; ​above to specify a tuning frequency for a strong local FM radio station.&lt;br /&gt;
&lt;br /&gt;
5. You should see a real­time FFT display of 400 KHz of spectrum, centered at the specified tuning frequency.&lt;br /&gt;
&lt;br /&gt;
6. 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;
7. You can adjust the size of your terminal window and then re­run the command to enlarge or shrink the FFT display.&lt;br /&gt;
&lt;br /&gt;
8. You can run with the &amp;quot;​­­help&amp;quot;​option to see a description of all available command­line options.&lt;br /&gt;
&lt;br /&gt;
Additional information is available at the [[Verifying the Operation of the USRP Using UHD and GNU Radio]] Application Note.&lt;br /&gt;
&lt;br /&gt;
==Battery (E312 Only)==&lt;br /&gt;
The USRP E312 is equipped with an integrated 3.7V, 3200mAh lithium­ion battery cell. After unboxing the USRP E312 , plug in the power adapter to an AC power source and fully charge the battery. This process with take approximately 2 hours. Do not leave the USRP E312 unit plugged in for more than 24 hours.&lt;br /&gt;
&lt;br /&gt;
The status LED in the power button indicates the power and charge status of the battery:&lt;br /&gt;
&lt;br /&gt;
Off: Indicates device is off and not charging.&lt;br /&gt;
*Slow Blinking Green: Indicates device is off and charging.&lt;br /&gt;
*Fast Blinking Green: Indicates device is on and charging.&lt;br /&gt;
*Solid Green: Indicates device is on and not charging (Battery is finished charging).&lt;br /&gt;
*Solid Orange: Indicates device is on and discharging.&lt;br /&gt;
*Fast Blinking Orange: Indicates device is on, discharging, and charge is below 10% charge.&lt;br /&gt;
*Fast Blinking Red: Indicates an error code:&lt;br /&gt;
&lt;br /&gt;
#Low Voltage Error&lt;br /&gt;
#Regulator Low Voltage Error&lt;br /&gt;
#FPGA Power Error&lt;br /&gt;
#DRAM Power Error&lt;br /&gt;
#1.8V Power Rail Error&lt;br /&gt;
#3.3V Power Rail Error&lt;br /&gt;
#Daughterboard / TX Power Error&lt;br /&gt;
#Charger Error&lt;br /&gt;
#Charger Temperature Error&lt;br /&gt;
#Battery Low Error&lt;br /&gt;
#Fuel Gauge Temperature Error&lt;br /&gt;
#Global (Enclosure) Temperature Error&lt;br /&gt;
&lt;br /&gt;
The battery life of the USRP E312 in idle mode is approximately 5 1/2 hours. The battery will enable the USRP E312 to operate for approximately 2 hours 20 minutes, when transmitting and receiving on both channels (2x2 MIMO), with maximum gain settings, at 5 GHz center frequency, and 1 MS/s sample rate. When the power button status LED is in the “Fast Blinking Orange” mode, plug the USRP E312 into an AC power source as soon as possible to recharge the battery.&lt;br /&gt;
&lt;br /&gt;
If the power button status LED indicates a “Low Voltage Error” (codes 1, 2, 3, 4, 5, 6, 7) or a “Battery Low Error” (code 10), plug the USRP E312 into an AC power source as soon as possible to recharge the battery.&lt;br /&gt;
&lt;br /&gt;
When the power button status LED indicates at “Temperature Error” or “Charger Error” (codes 8, 9, 11, or 12), power off the USRP E312 unit and allow it to cool down to room temperature. Then, plug in the USRP E312 to and AC power source and fully charge the battery.&lt;br /&gt;
&lt;br /&gt;
If error codes persist after cooling down and/or recharging the USRP E312, please contact [mailto:support@ettus.com support@ettus.com].&lt;br /&gt;
&lt;br /&gt;
You can purchase a replacement battery for the E312 at [https://www.ettus.com/product/details/E312-battery https://www.ettus.com/product/details/E312-battery].&lt;br /&gt;
&lt;br /&gt;
An Application Note covering the replacement of the E312 battery can be found at [[USRP E312 Battery Replacement Instructions]].&lt;br /&gt;
&lt;br /&gt;
==Battery Calibration Procedure==&lt;br /&gt;
In order for the battery gauge to give a usable indication of remaining charge it needs to be calibrated. The procedure for calibration is as follows:&lt;br /&gt;
&lt;br /&gt;
#Completely charge the battery.&lt;br /&gt;
#Type: &amp;lt;code&amp;gt;​echo 3200000 &amp;gt;/sys/class/power_supply/BAT/charge_now&amp;lt;/code&amp;gt;&lt;br /&gt;
#Unplug AC power.&lt;br /&gt;
#Replug AC power, and wait until charging completes.&lt;br /&gt;
&lt;br /&gt;
==Battery Safety Information==&lt;br /&gt;
To ensure proper use of the battery, please read the the battery specification sheet. This document is available at: [[Media:34118 datasheet.pdf]]&lt;br /&gt;
&lt;br /&gt;
Because batteries utilize a chemical reaction, battery performance will deteriorate over time even if stored for a long period of time without being used. In addition, if the various usage conditions such as charge, discharge, ambient temperature, etc. are not maintained within the specified ranges, the life expectancy of the battery may be shortened or the device in which the battery is used may be damaged by electrolyte leakage.&lt;br /&gt;
&lt;br /&gt;
===Handling===&lt;br /&gt;
*Do not expose the battery to flame or dispose of it in a fire.&lt;br /&gt;
*Do not put the battery in a charger or equipment with the wrong terminals connected.&lt;br /&gt;
*Do not short circuit the battery.&lt;br /&gt;
*Avoid excessive physical shock or vibration.&lt;br /&gt;
*Do not disassemble or deform the battery.&lt;br /&gt;
*Do not immerse in water.&lt;br /&gt;
*Do not use the battery mixed with other different make, type, or model batteries.&lt;br /&gt;
*Keep out of the reach of children.&lt;br /&gt;
*Do not use the battery if it appears damaged.&lt;br /&gt;
&lt;br /&gt;
===Charge and Discharge===&lt;br /&gt;
*Always charge the battery while it is installed in the USRP E312 and only use the DC power supply provided in the USRP E312 kit.&lt;br /&gt;
*Do not leave the battery charging for longer than 24 hours.&lt;br /&gt;
*Never use a modified or damaged USRP E312 DC power supply to charge the battery.&lt;br /&gt;
&lt;br /&gt;
===Storage===&lt;br /&gt;
*Store the battery in a cool, dry, and well­-ventilated area. &lt;br /&gt;
&lt;br /&gt;
===Disposal===&lt;br /&gt;
*Regulations vary for different countries. Dispose of the battery in accordance with local regulations.&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:E310]]&lt;br /&gt;
[[Category:E312]]&lt;br /&gt;
[[Category:E313]]&lt;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=E320_Getting_Started_Guide&amp;diff=5884</id>
		<title>E320 Getting Started Guide</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=E320_Getting_Started_Guide&amp;diff=5884"/>
				<updated>2023-09-25T20:33:08Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: Fix commands for mender update -- missed a command to fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Kit Contents==&lt;br /&gt;
&lt;br /&gt;
===E320 Board-only===&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* USRP E320&lt;br /&gt;
* Power connector (assembly required) &lt;br /&gt;
* 4 M3x0.5, M3x5 Standoffs &lt;br /&gt;
* 1 Gb Ethernet Cat-5e Cable (3m)&lt;br /&gt;
* USB-A to Micro USB-B Cable (1m)&lt;br /&gt;
* 1 Gb SFP+ to RJ45 Adapter&lt;br /&gt;
* Getting Started Guide&lt;br /&gt;
* Ettus Research Sticker&lt;br /&gt;
|[[File:e320 board only.jpg|500px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===E320 Full Enclosure===&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* USRP E320 in enclosure &lt;br /&gt;
* DC Power Supply (12V, 7A)&lt;br /&gt;
* 1 Gb Ethernet Cat-5e Cable (3m)&lt;br /&gt;
* USB-A to Micro USB-B Cable (1m)&lt;br /&gt;
* 1 Gb SFP+ to RJ45 Adapter&lt;br /&gt;
* Getting Started Guide&lt;br /&gt;
* Ettus Research Sticker&lt;br /&gt;
* T8 Torx Wrench&lt;br /&gt;
|[[File:e320 enclosure kit.jpg|500px|center]]&lt;br /&gt;
|}&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;
&lt;br /&gt;
* For Network Mode: A host computer with an 1 or 10 Gb Ethernet interface. If operating with the 10 Gb Ethernet interface, the &amp;quot;XG&amp;quot; FPGA image must be loaded before the SFP+ port will operate at 10 Gb speeds. Optionally a second 1 Gb Ethernet interface can be used to connect to the onboard ARM CPU for remote management. &lt;br /&gt;
&lt;br /&gt;
* For Embedded Mode: A host computer is only required for initial device configuration, remote control and management, or data visualization. The host computer can connect to the RJ45 1 Gb port or Serial Console port to remotely access the Open Embedded Linux operating system running on the ARM CPU. Once configured, the USRP E320 can operate as a stand-alone device without a connection to a remote host computer.  &lt;br /&gt;
&lt;br /&gt;
* For Board-only Version: A third-party 10-14V/3A power supply, which requires assembly with the power connect components included in the kit. An assembled power supply can be purchased here: https://www.ettus.com/product/details/12V-PWR&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 anything especially metal objects to touch the board while it is powered on. &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;
* Never touch the circuit board or heatsink while the device is powered on. &lt;br /&gt;
* All connections should be made/removed while is device is powered off. &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;
&lt;br /&gt;
To use your Universal Software Radio Peripheral (USRP™), you must have software tools correctly installed and configured on your host computer. Step-by-step guides for these software tools are found in the Application Notes for 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]].&lt;br /&gt;
&lt;br /&gt;
The USRP E320 requires UHD version 3.13.0.2 or later. It is strongly​ recommended to use the latest stable release of UHD on both the host computer and the USRP via the filesystem on the SD card. If this release fails to work in some way, then try the maintenance branch of the latest stable version. If you are operating the device in Network Mode, the version of UHD running on the host machine and E320 USRP must match to within the same maintenance release and branch. See the [https://github.com/ettusresearch/uhd UHD GitHub repository] for the latest release and maintenance branch.&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 E320. 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 ARM CPU and STM32 microcontroller, typically used for debugging. The serial console can also be used as a JTAG connection to the FPGA.&lt;br /&gt;
&lt;br /&gt;
'''1 Gb RJ45 Connection'''&lt;br /&gt;
&lt;br /&gt;
The 1 Gb 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 remote control and management traffic. Regardless of the operation mode (Host vs Embedded) this interface can be used to connect to the ARM via SSH. By default, the 1 Gb RJ45 connection is configured to use a DHCP assigned IP address.&lt;br /&gt;
&lt;br /&gt;
'''SFP+ Connection'''&lt;br /&gt;
&lt;br /&gt;
The SFP+ Connection supports multiple interfaces for streaming high-speed, low-latency data, depending upon which FPGA image is loaded.&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, OS X, or other Unix based operating systems have a utility 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 distribution's package manager. For Ubuntu/Debian based operating systems it can be installed with the package manager &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-FTDI_Dual_RS232-HS-if00-port0&lt;br /&gt;
    usb-FTDI_Dual_RS232-HS-if01-port0&lt;br /&gt;
    usb-Silicon_Labs_CP2105_Dual_USB_to_UART_Bridge_Controller_007F6A69-if00-port0&lt;br /&gt;
    usb-Silicon_Labs_CP2105_Dual_USB_to_UART_Bridge_Controller_007F6A69-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 E320 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;STM32 Microcontroller&amp;lt;/code&amp;gt;, whereas the second connects to the &amp;lt;code&amp;gt;ARM CPU&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you have multiple E320 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_007F6A69-if01-port0 115200&lt;br /&gt;
&lt;br /&gt;
Upon starting the USRP E320, 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;
    Alchemy 2018.04 ni-e320-serial ttyPS0&lt;br /&gt;
    ni-e320-serial 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-e320-&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_007F6A69-if00-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 1 Gb 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 1 Gb 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 8000 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;
&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.50,192.168.1.100 --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 systems with SSH, as shown below:&lt;br /&gt;
&lt;br /&gt;
    $ ssh root@192.168.1.51&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 is empty/blank.&lt;br /&gt;
&lt;br /&gt;
On Microsoft Windows, the SSH connection can be established using the third-party program, such as ​PuTTY.&lt;br /&gt;
&lt;br /&gt;
After logging in, you should be presented with a shell prompt like the following:&lt;br /&gt;
&lt;br /&gt;
    root@ni-e320-&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 E320 USRP must match. &lt;br /&gt;
&lt;br /&gt;
There is two ways to update the file system for the E320 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 are two root file system partitions, a &amp;quot;boot&amp;quot; partition and a &amp;quot;data&amp;quot; partition. &lt;br /&gt;
&lt;br /&gt;
Any data you would like to preserve through Mender updates should be saved to the &amp;quot;data&amp;quot; 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 e320 --yes&lt;br /&gt;
&lt;br /&gt;
Example Output:&lt;br /&gt;
    [INFO] Using base URL: https://files.ettus.com/binaries/cache/&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;
    301483 kB / 301483 kB (100%) e3xx_e320_mender_default-v4.4.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 E320. 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_e320_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 E320'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 E320, connect to the E320 using either the Serial Console, or via SSH to gain shell access.&lt;br /&gt;
&lt;br /&gt;
On the E320, 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;
    root@ni-e320-serial:~# mender install /home/root/usrp_e320_fs.mender&lt;br /&gt;
&lt;br /&gt;
Example Output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ni-e320-316E375:~# mender install /home/root/usrp_e320_fs.mender                       &lt;br /&gt;
INFO[0000] Start updating from local image file: [/home/root/usrp_e320_fs.mender]  module=rootfs&lt;br /&gt;
Installing update from the artifact of size 399640064&lt;br /&gt;
INFO[0000] opening device /dev/mmcblk0p3 for writing     module=block_device&lt;br /&gt;
INFO[0000] partition /dev/mmcblk0p3 size: 2046820352     module=block_device&lt;br /&gt;
................................   0% 1024 KiB&lt;br /&gt;
................................   0% 2048 KiB&lt;br /&gt;
................................   0% 3072 KiB&lt;br /&gt;
[truncated for readability]&lt;br /&gt;
................................  99% 389120 KiB&lt;br /&gt;
................................  99% 390144 KiB&lt;br /&gt;
................................ 100% 390273 KiB&lt;br /&gt;
INFO[0740] wrote 2046820352/2046820352 bytes of update to device /dev/mmcblk0p3  module=device&lt;br /&gt;
INFO[0744] Enabling partition with new image installed to be a boot candidate: 3  module=device&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The artifact can also be stored on a remote server:&lt;br /&gt;
    $ mender install &amp;lt;http://server.name/path/to/latest.mender&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 E320:&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 E3xx page in the Devices section of the UHD Manual at ​http://uhd.ettus.com​.&lt;br /&gt;
&lt;br /&gt;
===Updating the files system by writing the disk image===&lt;br /&gt;
The microSD card is accessible directly on the Board-only version of the E320 USRP. The E320 Full Enclosure version must be opened with the included Torx wrench. &lt;br /&gt;
&lt;br /&gt;
NOTE: This method will overwrite all data saved on the microSD card, including any data saved to the &amp;lt;code&amp;gt;/data&amp;lt;/code&amp;gt; partition.&lt;br /&gt;
&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 microSD card.&lt;br /&gt;
&lt;br /&gt;
==Updating the Network Configurations==&lt;br /&gt;
The USRP E320 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;
    # ls /etc/systemd/network/&lt;br /&gt;
    eth0.network  sfp0.network &lt;br /&gt;
&lt;br /&gt;
or for newer versions 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&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=v4&lt;br /&gt;
&lt;br /&gt;
    [DHCPv4]&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=8000&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;/data/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;8000&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_e320.html#e320_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. &lt;br /&gt;
&lt;br /&gt;
Network mode FPGA image updates must be made through the RJ45 management interface.&lt;br /&gt;
&lt;br /&gt;
To obtain all the FPGA images for your installed version of UHD, run the following command on the host computer with internet access:&lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader -t e320 -t fpga&lt;br /&gt;
&lt;br /&gt;
Example Output:&lt;br /&gt;
&lt;br /&gt;
    $ uhd_images_downloader -t e320 -t fpga&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;
    05920 kB / 05920 kB (100%) e3xx_e320_fpga_default-g494ae8bb.zip&lt;br /&gt;
    [INFO] Images download complete.&lt;br /&gt;
&lt;br /&gt;
There is two versions of the E320 FPGA images shipped with UHD:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;1G&amp;lt;/code&amp;gt; for 1 Gb rates on the SFP+ port (default image)&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;XG&amp;lt;/code&amp;gt; for 10 Gb rates on the SFP+ port&lt;br /&gt;
&lt;br /&gt;
In this example, we load the &amp;lt;code&amp;gt;XG&amp;lt;/code&amp;gt; variant of the FPGA image.&lt;br /&gt;
&lt;br /&gt;
    $ uhd_image_loader --args &amp;quot;type=e3xx,mgmt_addr=&amp;lt;E320_RJ45_IP_ADDR&amp;gt;,fpga=XG&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Example Output:&lt;br /&gt;
&lt;br /&gt;
    $ uhd_image_loader --args &amp;quot;mgmt_addr=192.168.1.51,type=e3xx,fpga=XG&amp;quot;&lt;br /&gt;
    [INFO] [UHD] linux; GNU C++ version 5.4.0 20160609; Boost_105800; UHD_3.13.1.0-1-gd3b7e90a&lt;br /&gt;
    [INFO] [MPMD] Initializing 1 device(s) in parallel with args: mgmt_addr=192.168.1.51,type=e3xx,product=e320,serial=316E375,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: 316E375&lt;br /&gt;
    [INFO] [MPMD IMAGE LOADER] Update component function succeeded.&lt;br /&gt;
    [INFO] [MPM.PeriphManager] Found 1 daughterboard(s).&lt;br /&gt;
&lt;br /&gt;
The FPGA is immediately updated, and this FPGA image will continue to be used. The device does not need to be power cycled to use the new image. &lt;br /&gt;
&lt;br /&gt;
To load a different FPGA image (i.e. &amp;lt;code&amp;gt;1G&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=1G&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=e3xx,mgmt_addr=&amp;lt;E320_RJ45_IP_ADDR&amp;gt;&amp;quot; --fpga-path=/path/to/custom/fpga.bit&lt;br /&gt;
&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; |The Verilog code for the FPGA in the USRP E320 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;
|}&lt;br /&gt;
&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 [[#Setting_up_a_Serial_Console_Connection|via Serial Console]] or [[E320_Getting_Started_Guide#Connecting_to_the_ARM_via_SSH| via SSH]]. It is generally recommend to use SSH over the RJ45 interface for remote management. &lt;br /&gt;
&lt;br /&gt;
Run the command &amp;lt;code&amp;gt;uhd_images_downloader&amp;lt;/code&amp;gt; to download the FPGA images to the device's file system:&lt;br /&gt;
&lt;br /&gt;
NOTE: The 1 Gb RJ45 management interface will require Internet access for this next step.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ni-e320-serial:~# python3 /usr/bin/uhd_images_downloader -t e320 -t fpga&lt;br /&gt;
[INFO] Images destination: /usr/share/uhd/images&lt;br /&gt;
[INFO] No inventory file found at /usr/share/uhd/images/inventory.json. Creating an empty one.&lt;br /&gt;
05920 kB / 05920 kB (100%) e3xx_e320_fpga_default-g494ae8bb.zip&lt;br /&gt;
[INFO] Images download complete.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: The default UHD FPGA Images destination within the E320's file-system is &amp;lt;code&amp;gt;/usr/share/uhd/images&amp;lt;/code&amp;gt;. The default UHD FPGA Images destination on a typical host installation is &amp;lt;code&amp;gt;/usr/local/share/uhd/images&amp;lt;/code&amp;gt;.&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:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ni-e320-serial:~# uhd_image_loader --args &amp;quot;type=e3xx,fpga=1G&amp;quot;&lt;br /&gt;
[INFO] [UHD] linux; GNU C++ version 7.3.0; Boost_106600; UHD_3.13.1.0-0-unknown&lt;br /&gt;
[INFO] [MPMD] Initializing 1 device(s) in parallel with args: mgmt_addr=127.0.0.1,type=e3xx,product=e320,serial=316E375,claimed=False,skip_init=1&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] [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: 316E375&lt;br /&gt;
[INFO] [MPMD IMAGE LOADER] Update component function succeeded.&lt;br /&gt;
[INFO] [MPM.PeriphManager] Found 1 daughterboard(s).&lt;br /&gt;
&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+ port for streaming samples to the host computer.&lt;br /&gt;
&lt;br /&gt;
===1 Gb Streaming via SFP+ Port ===&lt;br /&gt;
Complete the steps below to set up a streaming connection over the 1 Gb Ethernet interface on the &amp;lt;code&amp;gt;SFP+ Port&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
NOTE: The &amp;lt;code&amp;gt;1G&amp;lt;/code&amp;gt; FPGA image must be loaded for the &amp;lt;code&amp;gt;SFP+ Port&amp;lt;/code&amp;gt; to operate at 1 Gb 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 1 Gb Ethernet interface as shown below. This interface should be separate from the 1 Gb NIC/network which is connected to the 1 Gb 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 the &amp;lt;code&amp;gt;SFP+ Port&amp;lt;/code&amp;gt; at 1 Gb 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;. Mismatched MTU values on either the Host or E320 may cause flow control errors. Your computer may need to be restarted for the MTU value to take effect.&lt;br /&gt;
&lt;br /&gt;
2. Insert the RJ45-to-SFP+ adapter ​into the​ &amp;lt;code&amp;gt;SFP+ Port&amp;lt;/code&amp;gt;​.&lt;br /&gt;
&lt;br /&gt;
3. Connect the SFP+ adapter on the device to an Ethernet port on the host computer using a standard Ethernet cable.&lt;br /&gt;
&lt;br /&gt;
The ​ Green LED​ above the ​&amp;lt;code&amp;gt;SFP+ Port&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 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;
5. Verify your MTU is set correctly for 1 Gb speeds on the E320. See the section [[E320_Getting_Started_Guide#Updating_the_Network_Configurations|Updating the Network Configurations]] for additional details.&lt;br /&gt;
&lt;br /&gt;
Proceed to the next section [[E320_Getting_Started_Guide#Verifying_Device_Operation|Verifying Device Operation]].&lt;br /&gt;
&lt;br /&gt;
===10 Gb Streaming via SFP+ Port===&lt;br /&gt;
Load the &amp;lt;code&amp;gt;XG&amp;lt;/code&amp;gt; FPGA image for 10 Gb streaming as detailed in the section [[E320_Getting_Started_Guide#Updating_the_FPGA_Image|Updating the FPGA Image]]. You will need to use a 10 GigE cable that can be plugged in directly to the SFP+ connector on the board. &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 the &amp;lt;code&amp;gt;SFP+ Port&amp;lt;/code&amp;gt; to operate at 10 Gb speeds. If the &amp;lt;code&amp;gt;1G&amp;lt;/code&amp;gt; image is loaded, the port will be unresponsive at 10 Gb speeds. Mismatched MTU values on either the Host or E320 may cause flow control errors.&lt;br /&gt;
&lt;br /&gt;
1. Configure your Host's 10 Gb Ethernet interface 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: 8000&lt;br /&gt;
&lt;br /&gt;
NOTE: When operating the &amp;lt;code&amp;gt;SFP+ Port&amp;lt;/code&amp;gt; at 10 Gb speeds, it is important to set a MTU of &amp;lt;code&amp;gt;8000&amp;lt;/code&amp;gt; and not a value of &amp;lt;code&amp;gt;automatic&amp;lt;/code&amp;gt;. Mismatched MTU values on either the Host or E320 may cause flow control errors. Your computer may need to be restarted for the MTU value to take effect.&lt;br /&gt;
&lt;br /&gt;
2. Connect the SFP+ port on the device to an Ethernet port on the host computer using a 10 Gb SFP+ copper or fiber cable.&lt;br /&gt;
&lt;br /&gt;
The ​ Green LED​ above the ​&amp;lt;code&amp;gt;SFP+ Port&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 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;
5. Verify your MTU is set correctly for 10 Gb speeds on the E320. See the section [[E320_Getting_Started_Guide#Updating_the_Network_Configurations|Updating the Network Configurations]] for additional details.&lt;br /&gt;
&lt;br /&gt;
Proceed to the next section [[E320_Getting_Started_Guide#Verifying_Device_Operation|Verifying Device Operation]].&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 include UHD utilities.&lt;br /&gt;
&lt;br /&gt;
===Subdevice Specification Mapping===&lt;br /&gt;
The USRP E320 contains 2 channels, each represented on the front panel as &amp;lt;code&amp;gt;RF A&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;RF B&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;
'''E320'''&lt;br /&gt;
* RF A = A:0&lt;br /&gt;
* RF B = A:1&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 E320 supports master clock rate from 200 kHz to 61.44 MHz and can be changed by adding &amp;lt;code&amp;gt;master_clock_rate=&amp;lt;rate&amp;gt;&amp;lt;/code&amp;gt; to the default UHD args. The default master clock rate is 16 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;
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 E320===&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 --args &amp;quot;addr=192.168.10.2&amp;quot;&lt;br /&gt;
[INFO] [UHD] linux; GNU C++ version 5.4.0 20160609; Boost_105800; UHD_3.13.1.0-1-gd3b7e90a&lt;br /&gt;
[INFO] [MPMD] Initializing 1 device(s) in parallel with args: mgmt_addr=192.168.10.2,type=e3xx,product=e320,serial=316E375,claimed=False,addr=192.168.10.2&lt;br /&gt;
[INFO] [MPM.PeriphManager] init() called with device args `product=e320,mgmt_addr=192.168.10.2'.&lt;br /&gt;
[INFO] [0/DmaFIFO_0] Initializing block control (NOC ID: 0xF1F0D00000000000)&lt;br /&gt;
[INFO] [0/DmaFIFO_0] BIST passed (Throughput: 1343 MB/s)&lt;br /&gt;
[INFO] [0/DmaFIFO_0] BIST passed (Throughput: 1335 MB/s)&lt;br /&gt;
[INFO] [0/Radio_0] Initializing block control (NOC ID: 0x12AD100000003320)&lt;br /&gt;
[INFO] [0/DDC_0] Initializing block control (NOC ID: 0xDDC0000000000000)&lt;br /&gt;
[INFO] [0/DUC_0] Initializing block control (NOC ID: 0xD0C0000000000002)&lt;br /&gt;
[INFO] [0/Radio_0] Performing CODEC loopback test... &lt;br /&gt;
[INFO] [0/Radio_0] CODEC loopback test passed&lt;br /&gt;
[INFO] [0/Radio_0] Performing CODEC loopback test... &lt;br /&gt;
[INFO] [0/Radio_0] CODEC loopback test passed&lt;br /&gt;
  _____________________________________________________&lt;br /&gt;
 /&lt;br /&gt;
|       Device: E300-Series Device&lt;br /&gt;
|     _____________________________________________________&lt;br /&gt;
|    /&lt;br /&gt;
|   |       Mboard: ni-e320-316E375&lt;br /&gt;
|   |   eeprom_version: 2&lt;br /&gt;
|   |   mpm_version: 3.13.1.0-gd3b7e90a&lt;br /&gt;
|   |   pid: 58144&lt;br /&gt;
|   |   product: e320&lt;br /&gt;
|   |   rev: 2&lt;br /&gt;
|   |   rpc_connection: remote&lt;br /&gt;
|   |   serial: 316E375&lt;br /&gt;
|   |   type: e3xx&lt;br /&gt;
|   |   MPM Version: 1.2&lt;br /&gt;
|   |   FPGA Version: 3.0&lt;br /&gt;
|   |   RFNoC capable: Yes&lt;br /&gt;
|   |   &lt;br /&gt;
|   |   Time sources:  internal, external, gpsdo&lt;br /&gt;
|   |   Clock sources: external, internal, gpsdo&lt;br /&gt;
|   |   Sensors: gps_locked, temp_main_power, ref_locked, temp_rf_channelA, temp_fpga, gps_sky, temp_rf_channelB, fan, temp_internal, gps_tpv, gps_time&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: Neon&lt;br /&gt;
|   |   |   |   Antennas: RX2, TX/RX&lt;br /&gt;
|   |   |   |   Sensors: lo_locked, ad9361_temperature, rssi, lo_lock&lt;br /&gt;
|   |   |   |   Freq range: 70.000 to 6000.000 MHz&lt;br /&gt;
|   |   |   |   Gain range PGA: 0.0 to 76.0 step 1.0 dB&lt;br /&gt;
|   |   |   |   Bandwidth range: 20000000.0 to 40000000.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: Neon&lt;br /&gt;
|   |   |   |   Antennas: RX2, TX/RX&lt;br /&gt;
|   |   |   |   Sensors: lo_locked, ad9361_temperature, rssi, lo_lock&lt;br /&gt;
|   |   |   |   Freq range: 70.000 to 6000.000 MHz&lt;br /&gt;
|   |   |   |   Gain range PGA: 0.0 to 76.0 step 1.0 dB&lt;br /&gt;
|   |   |   |   Bandwidth range: 20000000.0 to 40000000.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: AD9361 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: Neon&lt;br /&gt;
|   |   |   |   Antennas: TX/RX&lt;br /&gt;
|   |   |   |   Sensors: lo_locked, ad9361_temperature&lt;br /&gt;
|   |   |   |   Freq range: 47.000 to 6000.000 MHz&lt;br /&gt;
|   |   |   |   Gain range PGA: 0.0 to 89.8 step 0.2 dB&lt;br /&gt;
|   |   |   |   Bandwidth range: 20000000.0 to 40000000.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: Neon&lt;br /&gt;
|   |   |   |   Antennas: TX/RX&lt;br /&gt;
|   |   |   |   Sensors: lo_locked, ad9361_temperature&lt;br /&gt;
|   |   |   |   Freq range: 47.000 to 6000.000 MHz&lt;br /&gt;
|   |   |   |   Gain range PGA: 0.0 to 89.8 step 0.2 dB&lt;br /&gt;
|   |   |   |   Bandwidth range: 20000000.0 to 40000000.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: AD9361 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;
|   |   |   * DDC_0&lt;br /&gt;
|   |   |   * DUC_0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&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 E320 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 E320 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;RF A / RX2&amp;lt;/code&amp;gt;­ antenna port of the E320.&lt;br /&gt;
&lt;br /&gt;
2. From your host computer, run the command:&lt;br /&gt;
&lt;br /&gt;
    $ /usr/local/lib/uhd/examples/rx_ascii_art_dft \&lt;br /&gt;
    --args &amp;quot;addr=192.168.10.2&amp;quot; \&lt;br /&gt;
    --freq 98.5e6 \&lt;br /&gt;
    --rate 2e6 \&lt;br /&gt;
    --gain 40 \&lt;br /&gt;
    --ref-lvl=&amp;quot;-30&amp;quot; \&lt;br /&gt;
    --dyn-rng 90 \&lt;br /&gt;
    --ant &amp;quot;RX2&amp;quot; \&lt;br /&gt;
    --subdev &amp;quot;A:0&amp;quot;&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 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; 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;
$ ./rx_ascii_art_dft --args &amp;quot;addr=192.168.10.2&amp;quot; --freq 98.5e6 --rate 2e6 --gain 40 --ref-lvl=&amp;quot;-30&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: addr=192.168.10.2...&lt;br /&gt;
[INFO] [UHD] linux; GNU C++ version 5.4.0 20160609; Boost_105800; UHD_3.13.1.0-1-gd3b7e90a&lt;br /&gt;
[INFO] [MPMD] Initializing 1 device(s) in parallel with args: mgmt_addr=192.168.10.2,type=e3xx,product=e320,serial=316E375,claimed=False,addr=192.168.10.2&lt;br /&gt;
[INFO] [0/DmaFIFO_0] Initializing block control (NOC ID: 0xF1F0D00000000000)&lt;br /&gt;
[INFO] [0/DmaFIFO_0] BIST passed (Throughput: 1334 MB/s)&lt;br /&gt;
[INFO] [0/DmaFIFO_0] BIST passed (Throughput: 1325 MB/s)&lt;br /&gt;
[INFO] [0/Radio_0] Initializing block control (NOC ID: 0x12AD100000003320)&lt;br /&gt;
[INFO] [0/DDC_0] Initializing block control (NOC ID: 0xDDC0000000000000)&lt;br /&gt;
[INFO] [0/DUC_0] Initializing block control (NOC ID: 0xD0C0000000000002)&lt;br /&gt;
[INFO] [MPM.PeriphManager] init() called with device args `product=e320,mgmt_addr=192.168.10.2'.&lt;br /&gt;
[INFO] [0/Radio_0] Performing CODEC loopback test... &lt;br /&gt;
[INFO] [0/Radio_0] CODEC loopback test passed&lt;br /&gt;
[INFO] [0/Radio_0] Performing CODEC loopback test... &lt;br /&gt;
[INFO] [0/Radio_0] CODEC loopback test passed&lt;br /&gt;
Using Device: Single USRP:&lt;br /&gt;
  Device: E300-Series Device&lt;br /&gt;
  Mboard 0: ni-e320-316E375&lt;br /&gt;
  RX Channel: 0&lt;br /&gt;
    RX DSP: 0&lt;br /&gt;
    RX Dboard: A&lt;br /&gt;
    RX Subdev: Neon&lt;br /&gt;
  TX Channel: 0&lt;br /&gt;
    TX DSP: 0&lt;br /&gt;
    TX Dboard: A&lt;br /&gt;
    TX Subdev: Neon&lt;br /&gt;
  TX Channel: 1&lt;br /&gt;
    TX DSP: 1&lt;br /&gt;
    TX Dboard: A&lt;br /&gt;
    TX Subdev: Neon&lt;br /&gt;
&lt;br /&gt;
Setting RX Rate: 2.000000 Msps...&lt;br /&gt;
Actual RX Rate: 2.000000 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: 40.000000 dB...&lt;br /&gt;
Actual RX Gain: 40.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;1G&amp;lt;/code&amp;gt; FPGA image to be loaded.&lt;br /&gt;
&lt;br /&gt;
This example will test one full-duplex stream using &amp;quot;RFA/A:0&amp;quot;, at a rate of 2 MS/s, for 60 seconds:&lt;br /&gt;
&lt;br /&gt;
    /usr/local/lib/uhd/examples/benchmark_rate  \&lt;br /&gt;
    --args &amp;quot;addr=192.168.10.2&amp;quot; \&lt;br /&gt;
    --duration 60 \&lt;br /&gt;
    --channels &amp;quot;0&amp;quot; \&lt;br /&gt;
    --rx_rate 2e6 \&lt;br /&gt;
    --rx_subdev &amp;quot;A:0&amp;quot; \&lt;br /&gt;
    --tx_rate 2e6 \&lt;br /&gt;
    --tx_subdev &amp;quot;A:0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
This example will test two full-duplex streams at 2 MS/s, for 60 seconds:&lt;br /&gt;
&lt;br /&gt;
    /usr/local/lib/uhd/examples/benchmark_rate  \&lt;br /&gt;
    --args &amp;quot;addr=192.168.10.2&amp;quot; \&lt;br /&gt;
    --duration 60 \&lt;br /&gt;
    --channels &amp;quot;0,1&amp;quot; \&lt;br /&gt;
    --rx_rate 2e6 \&lt;br /&gt;
    --rx_subdev &amp;quot;A:0 A:1&amp;quot; \&lt;br /&gt;
    --tx_rate 2e6 \&lt;br /&gt;
    --tx_subdev &amp;quot;A:0 A:1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
This example will test two full-duplex streams at 12.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;addr=192.168.10.2,master_clock_rate=25e6&amp;quot; \&lt;br /&gt;
    --duration 60 \&lt;br /&gt;
    --channels &amp;quot;0,1&amp;quot; \&lt;br /&gt;
    --rx_rate 12.5e6 \&lt;br /&gt;
    --rx_subdev &amp;quot;A:0 A:1&amp;quot; \&lt;br /&gt;
    --tx_rate 12.5e6 \&lt;br /&gt;
    --tx_subdev &amp;quot;A:0 A:1&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 ====&lt;br /&gt;
NOTE: These examples require the &amp;lt;code&amp;gt;XG&amp;lt;/code&amp;gt; FPGA image to be loaded.&lt;br /&gt;
&lt;br /&gt;
This example will test one full-duplex stream using &amp;quot;RFA/A:0&amp;quot;, at a rate of 61.44 MS/s, for 60 seconds:&lt;br /&gt;
&lt;br /&gt;
    /usr/local/lib/uhd/examples/benchmark_rate  \&lt;br /&gt;
    --args &amp;quot;addr=192.168.10.2,master_clock_rate=61.44e6&amp;quot; \&lt;br /&gt;
    --duration 60 \&lt;br /&gt;
    --channels &amp;quot;0&amp;quot; \&lt;br /&gt;
    --rx_rate 61.44e6 \&lt;br /&gt;
    --rx_subdev &amp;quot;A:0&amp;quot; \&lt;br /&gt;
    --tx_rate 61.44e6 \&lt;br /&gt;
    --tx_subdev &amp;quot;A:0&amp;quot; &lt;br /&gt;
&lt;br /&gt;
This example will test two full-duplex stream, at a rate of 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;addr=192.168.10.2,master_clock_rate=61.44e6&amp;quot; \&lt;br /&gt;
    --duration 60 \&lt;br /&gt;
    --channels &amp;quot;0,1&amp;quot; \&lt;br /&gt;
    --rx_rate 30.72e6 \&lt;br /&gt;
    --rx_subdev &amp;quot;A:0 A:1&amp;quot; \&lt;br /&gt;
    --tx_rate 30.72e6 \&lt;br /&gt;
    --tx_subdev &amp;quot;A:0 A:1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==USRP E320 Device Specific Operations==&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;
=== Autoboot ===&lt;br /&gt;
&lt;br /&gt;
The USRP E320 can be configured to power on and boot automatically when power is applied. By default, autoboot is disabled on all USRPs that support it. To control autoboot on the USRP E320, first determine the current value for &amp;lt;code&amp;gt;MCU_FLAGS[0]&amp;lt;/code&amp;gt; by running &amp;lt;code&amp;gt;eeprom-dump&amp;lt;/code&amp;gt;; the meaning of the &amp;lt;code&amp;gt;MCU_FLAGS[0]&amp;lt;/code&amp;gt; [https://files.ettus.com/manual/page_usrp_e3xx.html#e320_eeprom_flags is found in the UHD manual]. The least significant bit when &amp;lt;code&amp;gt;MCU_FLAGS[0]&amp;lt;/code&amp;gt; is viewed as a binary value controls the autoboot.&lt;br /&gt;
&lt;br /&gt;
For example&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ni-e320-XXXXXXX:~# eeprom-dump&lt;br /&gt;
-- PID/REV: e320 0002&lt;br /&gt;
-- MCU_FLAGS[0]: 00000008&lt;br /&gt;
-- MCU_FLAGS[1]: 00000000&lt;br /&gt;
-- MCU_FLAGS[2]: 00000000&lt;br /&gt;
-- MCU_FLAGS[3]: 00000000&lt;br /&gt;
-- Serial: XXXXXXX&lt;br /&gt;
-- eth_addr0: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- eth_addr1: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- eth_addr2: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- DT-Compat/MCU-Compat: 0000 0002&lt;br /&gt;
-- CRC: cbd79a61 (matches)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
shows &amp;lt;code&amp;gt;-- MCU_FLAGS[0]: 00000008&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;0x08&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;0b00001000&amp;lt;/code&amp;gt; in binary) indicates that autoboot is disabled. If this value were &amp;lt;code&amp;gt;0x09&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;0b00001001&amp;lt;/code&amp;gt; in binary) it would indicate that autoboot is enabled because least significant bit is 1; same would be true if this value is &amp;lt;code&amp;gt;0x01&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;0b00000001&amp;lt;/code&amp;gt; in binary).&lt;br /&gt;
&lt;br /&gt;
To enable or disable autoboot, copy the existing value of &amp;lt;code&amp;gt;MCU_FLAGS[0]&amp;lt;/code&amp;gt; retrieved by &amp;lt;code&amp;gt;eeprom-dump&amp;lt;/code&amp;gt; into &amp;lt;code&amp;gt;&amp;lt;MCU_FLAGS[0]&amp;gt;&amp;lt;/code&amp;gt; below and run the command:&lt;br /&gt;
&lt;br /&gt;
* Disable autoboot on USRP E320 (sets least significant bit to 0), regardless of whether currently enabled or disabled:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ni-e320-XXXXXXX:~# eeprom-set-flags $((0x&amp;lt;MCU_FLAGS[0]&amp;gt; &amp;amp; ~0x1))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Thus, for the value noted above (autoboot is already disabled, so this command doesn't actually change anything):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ni-e320-XXXXXXX:~# eeprom-set-flags $((0x00000008 &amp;amp; ~0x1))&lt;br /&gt;
-- PID/REV: e320 0002&lt;br /&gt;
-- MCU_FLAGS[0]: 00000008&lt;br /&gt;
-- MCU_FLAGS[1]: 00000000&lt;br /&gt;
-- MCU_FLAGS[2]: 00000000&lt;br /&gt;
-- MCU_FLAGS[3]: 00000000&lt;br /&gt;
-- Serial: XXXXXXX&lt;br /&gt;
-- eth_addr0: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- eth_addr1: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- eth_addr2: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- DT-Compat/MCU-Compat: 0000 0002&lt;br /&gt;
-- CRC: cbd79a61 (matches)&lt;br /&gt;
-- Reading back &lt;br /&gt;
-- PID/REV: e320 0002&lt;br /&gt;
-- MCU_FLAGS[0]: 00000008&lt;br /&gt;
-- MCU_FLAGS[1]: 00000000&lt;br /&gt;
-- MCU_FLAGS[2]: 00000000&lt;br /&gt;
-- MCU_FLAGS[3]: 00000000&lt;br /&gt;
-- Serial: XXXXXXX&lt;br /&gt;
-- eth_addr0: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- eth_addr1: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- eth_addr2: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- DT-Compat/MCU-Compat: 0000 0002&lt;br /&gt;
-- CRC: 448fb572 (matches)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Enable autoboot on USRP E320 (sets least significant bit to 1), regardless of whether currently enabled or disabled. For example when changing from autoboot disabled to enabled:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ni-e320-XXXXXXX:~# eeprom-set-flags $((0x&amp;lt;MCU_FLAGS[0]&amp;gt; | 0x1))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Thus, for the value noted above:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ni-e320-XXXXXXX:~# eeprom-set-flags $((0x00000008 | 0x1))&lt;br /&gt;
-- PID/REV: e320 0002&lt;br /&gt;
-- MCU_FLAGS[0]: 00000008&lt;br /&gt;
-- MCU_FLAGS[1]: 00000000&lt;br /&gt;
-- MCU_FLAGS[2]: 00000000&lt;br /&gt;
-- MCU_FLAGS[3]: 00000000&lt;br /&gt;
-- Serial: XXXXXXX&lt;br /&gt;
-- eth_addr0: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- eth_addr1: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- eth_addr2: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- DT-Compat/MCU-Compat: 0000 0002&lt;br /&gt;
-- CRC: cbd79a61 (matches)&lt;br /&gt;
-- Reading back &lt;br /&gt;
-- PID/REV: e320 0002&lt;br /&gt;
-- MCU_FLAGS[0]: 00000009&lt;br /&gt;
-- MCU_FLAGS[1]: 00000000&lt;br /&gt;
-- MCU_FLAGS[2]: 00000000&lt;br /&gt;
-- MCU_FLAGS[3]: 00000000&lt;br /&gt;
-- Serial: XXXXXXX&lt;br /&gt;
-- eth_addr0: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- eth_addr1: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- eth_addr2: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- DT-Compat/MCU-Compat: 0000 0002&lt;br /&gt;
-- CRC: 448fb572 (matches)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If setting this flag ''does not'' allow autoboot control on the USRP E320, then the device boot firmware needs to be updated. This update is accomplished via the following instructions.&lt;br /&gt;
&lt;br /&gt;
On the USRP E320 via ssh or serial terminal, [https://files.ettus.com/binaries/misc/upgrade_mcu_neon_v1.1.7358-a190641-musl-glibc-rev3-6.tar.gz download the update MCU firmware] and extract it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ni-e320-XXXXXXX:~# curl https://files.ettus.com/binaries/misc/upgrade_mcu_neon_v1.1.7358-a190641-musl-glibc-rev3-6.tar.gz | tar zxf -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This will create a directory &amp;lt;code&amp;gt;upgrade_mcu_neon_v1.1.7358-a190641-musl-glibc-rev3-6&amp;lt;/code&amp;gt;. Go into this directory and run the firmware flash script:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ni-e320-XXXXXXX:~# cd upgrade_mcu_neon_v1.1.7358-a190641-musl-glibc-rev3-6&lt;br /&gt;
root@ni-e320-XXXXXXX:~/upgrade_mcu_neon_v1.1.7358-a190641-musl-glibc-rev3-6# ./flash-firmware.sh&lt;br /&gt;
This script updates the microcontroller firmware (RO part). The change is&lt;br /&gt;
persistent across power cycles. Incorrect updates can only fixed be a manual&lt;br /&gt;
process which requires opening the enclosure.&lt;br /&gt;
&lt;br /&gt;
Updating the microcontroller firmware (RO part) is only required if the Ettus&lt;br /&gt;
Research support told you to do so.&lt;br /&gt;
&lt;br /&gt;
Press &amp;quot;y&amp;quot; to continue&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
At the prompt, press the &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; key to continue. Pressing any other key aborts the procedure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Press &amp;quot;y&amp;quot; to continue n&lt;br /&gt;
&lt;br /&gt;
aborting&lt;br /&gt;
root@ni-e320-317F9BF:~/upgrade_mcu_neon_v1.1.7358-a190641-musl-glibc-rev3-6# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Pressing the &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; key:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Press &amp;quot;y&amp;quot; to continue y&lt;br /&gt;
&lt;br /&gt;
This script will flash ec-neon-rev3.RO.flat to the device&lt;br /&gt;
old RO version:    neon_vX.X.XXXX-XXXXXXX&lt;br /&gt;
new RO version:    neon_v1.1.7358-a190641&lt;br /&gt;
&lt;br /&gt;
Press &amp;quot;y&amp;quot; to continue&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
At the prompt, press the &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; key ''again'' to continue. Pressing any other key aborts the procedure as before.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Press &amp;quot;y&amp;quot; to continue y&lt;br /&gt;
&lt;br /&gt;
./ectool --interface=dev reboot_ec RW&lt;br /&gt;
./ectool --interface=dev flashread 0x0 65536 ec-neon-rev3.RO.flat.old&lt;br /&gt;
Reading 65536 bytes at offset 0...&lt;br /&gt;
done.&lt;br /&gt;
./ectool --interface=dev flasherase 0x0 65536&lt;br /&gt;
Erasing 65536 bytes at offset 0...&lt;br /&gt;
done.&lt;br /&gt;
./ectool --interface=dev flashwrite 0x0 ec-neon-rev3.RO.flat&lt;br /&gt;
Reading 49592 bytes from ec-neon-rev3.RO.flat...&lt;br /&gt;
Writing to offset 0...&lt;br /&gt;
Write size 112...&lt;br /&gt;
done.&lt;br /&gt;
&lt;br /&gt;
copying new firmware files&lt;br /&gt;
'ec-neon-rev3.bin' -&amp;gt; '/lib/firmware/ni/ec-neon-rev3.bin'&lt;br /&gt;
'ec-neon-rev3.RW.bin' -&amp;gt; '/lib/firmware/ni/ec-neon-rev3.RW.bin'&lt;br /&gt;
root@ni-e320-317F9BF:~/upgrade_mcu_neon_v1.1.7358-a190641-musl-glibc-rev3-6# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once the script is done, reboot the USRP (e.g., &amp;lt;code&amp;gt;shutdown -r now&amp;lt;/code&amp;gt;), and when it comes up the autoboot flag should now work as desired. If these instructions ''do not'' work, then email [mailto:support@ettus.com support@ettus.com] and ask for alternative instructions on how to update the USRP E320 RO and RW boot firmware such that this EEPROM flag setting is honored.&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-e320-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;
==Known Issues==&lt;br /&gt;
===Problematic NICs===&lt;br /&gt;
In some streaming modes, the Intel I219-LM NIC can produce flow control and sequence errors. It is recommended to use a USB3 to 1 Gb Ethernet Adapter for hosts which have an I219-LM NIC.&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:E320]]&lt;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=E320_Getting_Started_Guide&amp;diff=5883</id>
		<title>E320 Getting Started Guide</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=E320_Getting_Started_Guide&amp;diff=5883"/>
				<updated>2023-09-25T20:31:07Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: Fix commands for mender update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Kit Contents==&lt;br /&gt;
&lt;br /&gt;
===E320 Board-only===&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* USRP E320&lt;br /&gt;
* Power connector (assembly required) &lt;br /&gt;
* 4 M3x0.5, M3x5 Standoffs &lt;br /&gt;
* 1 Gb Ethernet Cat-5e Cable (3m)&lt;br /&gt;
* USB-A to Micro USB-B Cable (1m)&lt;br /&gt;
* 1 Gb SFP+ to RJ45 Adapter&lt;br /&gt;
* Getting Started Guide&lt;br /&gt;
* Ettus Research Sticker&lt;br /&gt;
|[[File:e320 board only.jpg|500px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===E320 Full Enclosure===&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* USRP E320 in enclosure &lt;br /&gt;
* DC Power Supply (12V, 7A)&lt;br /&gt;
* 1 Gb Ethernet Cat-5e Cable (3m)&lt;br /&gt;
* USB-A to Micro USB-B Cable (1m)&lt;br /&gt;
* 1 Gb SFP+ to RJ45 Adapter&lt;br /&gt;
* Getting Started Guide&lt;br /&gt;
* Ettus Research Sticker&lt;br /&gt;
* T8 Torx Wrench&lt;br /&gt;
|[[File:e320 enclosure kit.jpg|500px|center]]&lt;br /&gt;
|}&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;
&lt;br /&gt;
* For Network Mode: A host computer with an 1 or 10 Gb Ethernet interface. If operating with the 10 Gb Ethernet interface, the &amp;quot;XG&amp;quot; FPGA image must be loaded before the SFP+ port will operate at 10 Gb speeds. Optionally a second 1 Gb Ethernet interface can be used to connect to the onboard ARM CPU for remote management. &lt;br /&gt;
&lt;br /&gt;
* For Embedded Mode: A host computer is only required for initial device configuration, remote control and management, or data visualization. The host computer can connect to the RJ45 1 Gb port or Serial Console port to remotely access the Open Embedded Linux operating system running on the ARM CPU. Once configured, the USRP E320 can operate as a stand-alone device without a connection to a remote host computer.  &lt;br /&gt;
&lt;br /&gt;
* For Board-only Version: A third-party 10-14V/3A power supply, which requires assembly with the power connect components included in the kit. An assembled power supply can be purchased here: https://www.ettus.com/product/details/12V-PWR&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 anything especially metal objects to touch the board while it is powered on. &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;
* Never touch the circuit board or heatsink while the device is powered on. &lt;br /&gt;
* All connections should be made/removed while is device is powered off. &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;
&lt;br /&gt;
To use your Universal Software Radio Peripheral (USRP™), you must have software tools correctly installed and configured on your host computer. Step-by-step guides for these software tools are found in the Application Notes for 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]].&lt;br /&gt;
&lt;br /&gt;
The USRP E320 requires UHD version 3.13.0.2 or later. It is strongly​ recommended to use the latest stable release of UHD on both the host computer and the USRP via the filesystem on the SD card. If this release fails to work in some way, then try the maintenance branch of the latest stable version. If you are operating the device in Network Mode, the version of UHD running on the host machine and E320 USRP must match to within the same maintenance release and branch. See the [https://github.com/ettusresearch/uhd UHD GitHub repository] for the latest release and maintenance branch.&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 E320. 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 ARM CPU and STM32 microcontroller, typically used for debugging. The serial console can also be used as a JTAG connection to the FPGA.&lt;br /&gt;
&lt;br /&gt;
'''1 Gb RJ45 Connection'''&lt;br /&gt;
&lt;br /&gt;
The 1 Gb 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 remote control and management traffic. Regardless of the operation mode (Host vs Embedded) this interface can be used to connect to the ARM via SSH. By default, the 1 Gb RJ45 connection is configured to use a DHCP assigned IP address.&lt;br /&gt;
&lt;br /&gt;
'''SFP+ Connection'''&lt;br /&gt;
&lt;br /&gt;
The SFP+ Connection supports multiple interfaces for streaming high-speed, low-latency data, depending upon which FPGA image is loaded.&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, OS X, or other Unix based operating systems have a utility 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 distribution's package manager. For Ubuntu/Debian based operating systems it can be installed with the package manager &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-FTDI_Dual_RS232-HS-if00-port0&lt;br /&gt;
    usb-FTDI_Dual_RS232-HS-if01-port0&lt;br /&gt;
    usb-Silicon_Labs_CP2105_Dual_USB_to_UART_Bridge_Controller_007F6A69-if00-port0&lt;br /&gt;
    usb-Silicon_Labs_CP2105_Dual_USB_to_UART_Bridge_Controller_007F6A69-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 E320 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;STM32 Microcontroller&amp;lt;/code&amp;gt;, whereas the second connects to the &amp;lt;code&amp;gt;ARM CPU&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you have multiple E320 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_007F6A69-if01-port0 115200&lt;br /&gt;
&lt;br /&gt;
Upon starting the USRP E320, 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;
    Alchemy 2018.04 ni-e320-serial ttyPS0&lt;br /&gt;
    ni-e320-serial 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-e320-&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_007F6A69-if00-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 1 Gb 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 1 Gb 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 8000 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;
&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.50,192.168.1.100 --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 systems with SSH, as shown below:&lt;br /&gt;
&lt;br /&gt;
    $ ssh root@192.168.1.51&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 is empty/blank.&lt;br /&gt;
&lt;br /&gt;
On Microsoft Windows, the SSH connection can be established using the third-party program, such as ​PuTTY.&lt;br /&gt;
&lt;br /&gt;
After logging in, you should be presented with a shell prompt like the following:&lt;br /&gt;
&lt;br /&gt;
    root@ni-e320-&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 E320 USRP must match. &lt;br /&gt;
&lt;br /&gt;
There is two ways to update the file system for the E320 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 are two root file system partitions, a &amp;quot;boot&amp;quot; partition and a &amp;quot;data&amp;quot; partition. &lt;br /&gt;
&lt;br /&gt;
Any data you would like to preserve through Mender updates should be saved to the &amp;quot;data&amp;quot; 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 e320 --yes&lt;br /&gt;
&lt;br /&gt;
Example Output:&lt;br /&gt;
    [INFO] Using base URL: https://files.ettus.com/binaries/cache/&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;
    301483 kB / 301483 kB (100%) e3xx_e320_mender_default-v4.4.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 E320. 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_e320_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 E320'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 E320, connect to the E320 using either the Serial Console, or via SSH to gain shell access.&lt;br /&gt;
&lt;br /&gt;
On the E320, 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;
    root@ni-e320-serial:~# mender install /home/root/usrp_e320_fs.mender&lt;br /&gt;
&lt;br /&gt;
Example Output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ni-e320-316E375:~# mender -rootfs /home/root/usrp_e320_fs.mender                       &lt;br /&gt;
INFO[0000] Start updating from local image file: [/home/root/usrp_e320_fs.mender]  module=rootfs&lt;br /&gt;
Installing update from the artifact of size 399640064&lt;br /&gt;
INFO[0000] opening device /dev/mmcblk0p3 for writing     module=block_device&lt;br /&gt;
INFO[0000] partition /dev/mmcblk0p3 size: 2046820352     module=block_device&lt;br /&gt;
................................   0% 1024 KiB&lt;br /&gt;
................................   0% 2048 KiB&lt;br /&gt;
................................   0% 3072 KiB&lt;br /&gt;
[truncated for readability]&lt;br /&gt;
................................  99% 389120 KiB&lt;br /&gt;
................................  99% 390144 KiB&lt;br /&gt;
................................ 100% 390273 KiB&lt;br /&gt;
INFO[0740] wrote 2046820352/2046820352 bytes of update to device /dev/mmcblk0p3  module=device&lt;br /&gt;
INFO[0744] Enabling partition with new image installed to be a boot candidate: 3  module=device&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The artifact can also be stored on a remote server:&lt;br /&gt;
    $ mender install &amp;lt;http://server.name/path/to/latest.mender&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 E320:&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 E3xx page in the Devices section of the UHD Manual at ​http://uhd.ettus.com​.&lt;br /&gt;
&lt;br /&gt;
===Updating the files system by writing the disk image===&lt;br /&gt;
The microSD card is accessible directly on the Board-only version of the E320 USRP. The E320 Full Enclosure version must be opened with the included Torx wrench. &lt;br /&gt;
&lt;br /&gt;
NOTE: This method will overwrite all data saved on the microSD card, including any data saved to the &amp;lt;code&amp;gt;/data&amp;lt;/code&amp;gt; partition.&lt;br /&gt;
&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 microSD card.&lt;br /&gt;
&lt;br /&gt;
==Updating the Network Configurations==&lt;br /&gt;
The USRP E320 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;
    # ls /etc/systemd/network/&lt;br /&gt;
    eth0.network  sfp0.network &lt;br /&gt;
&lt;br /&gt;
or for newer versions 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&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=v4&lt;br /&gt;
&lt;br /&gt;
    [DHCPv4]&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=8000&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;/data/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;8000&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_e320.html#e320_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. &lt;br /&gt;
&lt;br /&gt;
Network mode FPGA image updates must be made through the RJ45 management interface.&lt;br /&gt;
&lt;br /&gt;
To obtain all the FPGA images for your installed version of UHD, run the following command on the host computer with internet access:&lt;br /&gt;
&lt;br /&gt;
    $ sudo uhd_images_downloader -t e320 -t fpga&lt;br /&gt;
&lt;br /&gt;
Example Output:&lt;br /&gt;
&lt;br /&gt;
    $ uhd_images_downloader -t e320 -t fpga&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;
    05920 kB / 05920 kB (100%) e3xx_e320_fpga_default-g494ae8bb.zip&lt;br /&gt;
    [INFO] Images download complete.&lt;br /&gt;
&lt;br /&gt;
There is two versions of the E320 FPGA images shipped with UHD:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;1G&amp;lt;/code&amp;gt; for 1 Gb rates on the SFP+ port (default image)&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;XG&amp;lt;/code&amp;gt; for 10 Gb rates on the SFP+ port&lt;br /&gt;
&lt;br /&gt;
In this example, we load the &amp;lt;code&amp;gt;XG&amp;lt;/code&amp;gt; variant of the FPGA image.&lt;br /&gt;
&lt;br /&gt;
    $ uhd_image_loader --args &amp;quot;type=e3xx,mgmt_addr=&amp;lt;E320_RJ45_IP_ADDR&amp;gt;,fpga=XG&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Example Output:&lt;br /&gt;
&lt;br /&gt;
    $ uhd_image_loader --args &amp;quot;mgmt_addr=192.168.1.51,type=e3xx,fpga=XG&amp;quot;&lt;br /&gt;
    [INFO] [UHD] linux; GNU C++ version 5.4.0 20160609; Boost_105800; UHD_3.13.1.0-1-gd3b7e90a&lt;br /&gt;
    [INFO] [MPMD] Initializing 1 device(s) in parallel with args: mgmt_addr=192.168.1.51,type=e3xx,product=e320,serial=316E375,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: 316E375&lt;br /&gt;
    [INFO] [MPMD IMAGE LOADER] Update component function succeeded.&lt;br /&gt;
    [INFO] [MPM.PeriphManager] Found 1 daughterboard(s).&lt;br /&gt;
&lt;br /&gt;
The FPGA is immediately updated, and this FPGA image will continue to be used. The device does not need to be power cycled to use the new image. &lt;br /&gt;
&lt;br /&gt;
To load a different FPGA image (i.e. &amp;lt;code&amp;gt;1G&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=1G&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=e3xx,mgmt_addr=&amp;lt;E320_RJ45_IP_ADDR&amp;gt;&amp;quot; --fpga-path=/path/to/custom/fpga.bit&lt;br /&gt;
&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; |The Verilog code for the FPGA in the USRP E320 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;
|}&lt;br /&gt;
&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 [[#Setting_up_a_Serial_Console_Connection|via Serial Console]] or [[E320_Getting_Started_Guide#Connecting_to_the_ARM_via_SSH| via SSH]]. It is generally recommend to use SSH over the RJ45 interface for remote management. &lt;br /&gt;
&lt;br /&gt;
Run the command &amp;lt;code&amp;gt;uhd_images_downloader&amp;lt;/code&amp;gt; to download the FPGA images to the device's file system:&lt;br /&gt;
&lt;br /&gt;
NOTE: The 1 Gb RJ45 management interface will require Internet access for this next step.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ni-e320-serial:~# python3 /usr/bin/uhd_images_downloader -t e320 -t fpga&lt;br /&gt;
[INFO] Images destination: /usr/share/uhd/images&lt;br /&gt;
[INFO] No inventory file found at /usr/share/uhd/images/inventory.json. Creating an empty one.&lt;br /&gt;
05920 kB / 05920 kB (100%) e3xx_e320_fpga_default-g494ae8bb.zip&lt;br /&gt;
[INFO] Images download complete.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: The default UHD FPGA Images destination within the E320's file-system is &amp;lt;code&amp;gt;/usr/share/uhd/images&amp;lt;/code&amp;gt;. The default UHD FPGA Images destination on a typical host installation is &amp;lt;code&amp;gt;/usr/local/share/uhd/images&amp;lt;/code&amp;gt;.&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:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ni-e320-serial:~# uhd_image_loader --args &amp;quot;type=e3xx,fpga=1G&amp;quot;&lt;br /&gt;
[INFO] [UHD] linux; GNU C++ version 7.3.0; Boost_106600; UHD_3.13.1.0-0-unknown&lt;br /&gt;
[INFO] [MPMD] Initializing 1 device(s) in parallel with args: mgmt_addr=127.0.0.1,type=e3xx,product=e320,serial=316E375,claimed=False,skip_init=1&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] [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: 316E375&lt;br /&gt;
[INFO] [MPMD IMAGE LOADER] Update component function succeeded.&lt;br /&gt;
[INFO] [MPM.PeriphManager] Found 1 daughterboard(s).&lt;br /&gt;
&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+ port for streaming samples to the host computer.&lt;br /&gt;
&lt;br /&gt;
===1 Gb Streaming via SFP+ Port ===&lt;br /&gt;
Complete the steps below to set up a streaming connection over the 1 Gb Ethernet interface on the &amp;lt;code&amp;gt;SFP+ Port&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
NOTE: The &amp;lt;code&amp;gt;1G&amp;lt;/code&amp;gt; FPGA image must be loaded for the &amp;lt;code&amp;gt;SFP+ Port&amp;lt;/code&amp;gt; to operate at 1 Gb 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 1 Gb Ethernet interface as shown below. This interface should be separate from the 1 Gb NIC/network which is connected to the 1 Gb 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 the &amp;lt;code&amp;gt;SFP+ Port&amp;lt;/code&amp;gt; at 1 Gb 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;. Mismatched MTU values on either the Host or E320 may cause flow control errors. Your computer may need to be restarted for the MTU value to take effect.&lt;br /&gt;
&lt;br /&gt;
2. Insert the RJ45-to-SFP+ adapter ​into the​ &amp;lt;code&amp;gt;SFP+ Port&amp;lt;/code&amp;gt;​.&lt;br /&gt;
&lt;br /&gt;
3. Connect the SFP+ adapter on the device to an Ethernet port on the host computer using a standard Ethernet cable.&lt;br /&gt;
&lt;br /&gt;
The ​ Green LED​ above the ​&amp;lt;code&amp;gt;SFP+ Port&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 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;
5. Verify your MTU is set correctly for 1 Gb speeds on the E320. See the section [[E320_Getting_Started_Guide#Updating_the_Network_Configurations|Updating the Network Configurations]] for additional details.&lt;br /&gt;
&lt;br /&gt;
Proceed to the next section [[E320_Getting_Started_Guide#Verifying_Device_Operation|Verifying Device Operation]].&lt;br /&gt;
&lt;br /&gt;
===10 Gb Streaming via SFP+ Port===&lt;br /&gt;
Load the &amp;lt;code&amp;gt;XG&amp;lt;/code&amp;gt; FPGA image for 10 Gb streaming as detailed in the section [[E320_Getting_Started_Guide#Updating_the_FPGA_Image|Updating the FPGA Image]]. You will need to use a 10 GigE cable that can be plugged in directly to the SFP+ connector on the board. &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 the &amp;lt;code&amp;gt;SFP+ Port&amp;lt;/code&amp;gt; to operate at 10 Gb speeds. If the &amp;lt;code&amp;gt;1G&amp;lt;/code&amp;gt; image is loaded, the port will be unresponsive at 10 Gb speeds. Mismatched MTU values on either the Host or E320 may cause flow control errors.&lt;br /&gt;
&lt;br /&gt;
1. Configure your Host's 10 Gb Ethernet interface 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: 8000&lt;br /&gt;
&lt;br /&gt;
NOTE: When operating the &amp;lt;code&amp;gt;SFP+ Port&amp;lt;/code&amp;gt; at 10 Gb speeds, it is important to set a MTU of &amp;lt;code&amp;gt;8000&amp;lt;/code&amp;gt; and not a value of &amp;lt;code&amp;gt;automatic&amp;lt;/code&amp;gt;. Mismatched MTU values on either the Host or E320 may cause flow control errors. Your computer may need to be restarted for the MTU value to take effect.&lt;br /&gt;
&lt;br /&gt;
2. Connect the SFP+ port on the device to an Ethernet port on the host computer using a 10 Gb SFP+ copper or fiber cable.&lt;br /&gt;
&lt;br /&gt;
The ​ Green LED​ above the ​&amp;lt;code&amp;gt;SFP+ Port&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 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;
5. Verify your MTU is set correctly for 10 Gb speeds on the E320. See the section [[E320_Getting_Started_Guide#Updating_the_Network_Configurations|Updating the Network Configurations]] for additional details.&lt;br /&gt;
&lt;br /&gt;
Proceed to the next section [[E320_Getting_Started_Guide#Verifying_Device_Operation|Verifying Device Operation]].&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 include UHD utilities.&lt;br /&gt;
&lt;br /&gt;
===Subdevice Specification Mapping===&lt;br /&gt;
The USRP E320 contains 2 channels, each represented on the front panel as &amp;lt;code&amp;gt;RF A&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;RF B&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;
'''E320'''&lt;br /&gt;
* RF A = A:0&lt;br /&gt;
* RF B = A:1&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 E320 supports master clock rate from 200 kHz to 61.44 MHz and can be changed by adding &amp;lt;code&amp;gt;master_clock_rate=&amp;lt;rate&amp;gt;&amp;lt;/code&amp;gt; to the default UHD args. The default master clock rate is 16 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;
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 E320===&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 --args &amp;quot;addr=192.168.10.2&amp;quot;&lt;br /&gt;
[INFO] [UHD] linux; GNU C++ version 5.4.0 20160609; Boost_105800; UHD_3.13.1.0-1-gd3b7e90a&lt;br /&gt;
[INFO] [MPMD] Initializing 1 device(s) in parallel with args: mgmt_addr=192.168.10.2,type=e3xx,product=e320,serial=316E375,claimed=False,addr=192.168.10.2&lt;br /&gt;
[INFO] [MPM.PeriphManager] init() called with device args `product=e320,mgmt_addr=192.168.10.2'.&lt;br /&gt;
[INFO] [0/DmaFIFO_0] Initializing block control (NOC ID: 0xF1F0D00000000000)&lt;br /&gt;
[INFO] [0/DmaFIFO_0] BIST passed (Throughput: 1343 MB/s)&lt;br /&gt;
[INFO] [0/DmaFIFO_0] BIST passed (Throughput: 1335 MB/s)&lt;br /&gt;
[INFO] [0/Radio_0] Initializing block control (NOC ID: 0x12AD100000003320)&lt;br /&gt;
[INFO] [0/DDC_0] Initializing block control (NOC ID: 0xDDC0000000000000)&lt;br /&gt;
[INFO] [0/DUC_0] Initializing block control (NOC ID: 0xD0C0000000000002)&lt;br /&gt;
[INFO] [0/Radio_0] Performing CODEC loopback test... &lt;br /&gt;
[INFO] [0/Radio_0] CODEC loopback test passed&lt;br /&gt;
[INFO] [0/Radio_0] Performing CODEC loopback test... &lt;br /&gt;
[INFO] [0/Radio_0] CODEC loopback test passed&lt;br /&gt;
  _____________________________________________________&lt;br /&gt;
 /&lt;br /&gt;
|       Device: E300-Series Device&lt;br /&gt;
|     _____________________________________________________&lt;br /&gt;
|    /&lt;br /&gt;
|   |       Mboard: ni-e320-316E375&lt;br /&gt;
|   |   eeprom_version: 2&lt;br /&gt;
|   |   mpm_version: 3.13.1.0-gd3b7e90a&lt;br /&gt;
|   |   pid: 58144&lt;br /&gt;
|   |   product: e320&lt;br /&gt;
|   |   rev: 2&lt;br /&gt;
|   |   rpc_connection: remote&lt;br /&gt;
|   |   serial: 316E375&lt;br /&gt;
|   |   type: e3xx&lt;br /&gt;
|   |   MPM Version: 1.2&lt;br /&gt;
|   |   FPGA Version: 3.0&lt;br /&gt;
|   |   RFNoC capable: Yes&lt;br /&gt;
|   |   &lt;br /&gt;
|   |   Time sources:  internal, external, gpsdo&lt;br /&gt;
|   |   Clock sources: external, internal, gpsdo&lt;br /&gt;
|   |   Sensors: gps_locked, temp_main_power, ref_locked, temp_rf_channelA, temp_fpga, gps_sky, temp_rf_channelB, fan, temp_internal, gps_tpv, gps_time&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: Neon&lt;br /&gt;
|   |   |   |   Antennas: RX2, TX/RX&lt;br /&gt;
|   |   |   |   Sensors: lo_locked, ad9361_temperature, rssi, lo_lock&lt;br /&gt;
|   |   |   |   Freq range: 70.000 to 6000.000 MHz&lt;br /&gt;
|   |   |   |   Gain range PGA: 0.0 to 76.0 step 1.0 dB&lt;br /&gt;
|   |   |   |   Bandwidth range: 20000000.0 to 40000000.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: Neon&lt;br /&gt;
|   |   |   |   Antennas: RX2, TX/RX&lt;br /&gt;
|   |   |   |   Sensors: lo_locked, ad9361_temperature, rssi, lo_lock&lt;br /&gt;
|   |   |   |   Freq range: 70.000 to 6000.000 MHz&lt;br /&gt;
|   |   |   |   Gain range PGA: 0.0 to 76.0 step 1.0 dB&lt;br /&gt;
|   |   |   |   Bandwidth range: 20000000.0 to 40000000.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: AD9361 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: Neon&lt;br /&gt;
|   |   |   |   Antennas: TX/RX&lt;br /&gt;
|   |   |   |   Sensors: lo_locked, ad9361_temperature&lt;br /&gt;
|   |   |   |   Freq range: 47.000 to 6000.000 MHz&lt;br /&gt;
|   |   |   |   Gain range PGA: 0.0 to 89.8 step 0.2 dB&lt;br /&gt;
|   |   |   |   Bandwidth range: 20000000.0 to 40000000.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: Neon&lt;br /&gt;
|   |   |   |   Antennas: TX/RX&lt;br /&gt;
|   |   |   |   Sensors: lo_locked, ad9361_temperature&lt;br /&gt;
|   |   |   |   Freq range: 47.000 to 6000.000 MHz&lt;br /&gt;
|   |   |   |   Gain range PGA: 0.0 to 89.8 step 0.2 dB&lt;br /&gt;
|   |   |   |   Bandwidth range: 20000000.0 to 40000000.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: AD9361 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;
|   |   |   * DDC_0&lt;br /&gt;
|   |   |   * DUC_0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&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 E320 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 E320 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;RF A / RX2&amp;lt;/code&amp;gt;­ antenna port of the E320.&lt;br /&gt;
&lt;br /&gt;
2. From your host computer, run the command:&lt;br /&gt;
&lt;br /&gt;
    $ /usr/local/lib/uhd/examples/rx_ascii_art_dft \&lt;br /&gt;
    --args &amp;quot;addr=192.168.10.2&amp;quot; \&lt;br /&gt;
    --freq 98.5e6 \&lt;br /&gt;
    --rate 2e6 \&lt;br /&gt;
    --gain 40 \&lt;br /&gt;
    --ref-lvl=&amp;quot;-30&amp;quot; \&lt;br /&gt;
    --dyn-rng 90 \&lt;br /&gt;
    --ant &amp;quot;RX2&amp;quot; \&lt;br /&gt;
    --subdev &amp;quot;A:0&amp;quot;&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 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; 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;
$ ./rx_ascii_art_dft --args &amp;quot;addr=192.168.10.2&amp;quot; --freq 98.5e6 --rate 2e6 --gain 40 --ref-lvl=&amp;quot;-30&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: addr=192.168.10.2...&lt;br /&gt;
[INFO] [UHD] linux; GNU C++ version 5.4.0 20160609; Boost_105800; UHD_3.13.1.0-1-gd3b7e90a&lt;br /&gt;
[INFO] [MPMD] Initializing 1 device(s) in parallel with args: mgmt_addr=192.168.10.2,type=e3xx,product=e320,serial=316E375,claimed=False,addr=192.168.10.2&lt;br /&gt;
[INFO] [0/DmaFIFO_0] Initializing block control (NOC ID: 0xF1F0D00000000000)&lt;br /&gt;
[INFO] [0/DmaFIFO_0] BIST passed (Throughput: 1334 MB/s)&lt;br /&gt;
[INFO] [0/DmaFIFO_0] BIST passed (Throughput: 1325 MB/s)&lt;br /&gt;
[INFO] [0/Radio_0] Initializing block control (NOC ID: 0x12AD100000003320)&lt;br /&gt;
[INFO] [0/DDC_0] Initializing block control (NOC ID: 0xDDC0000000000000)&lt;br /&gt;
[INFO] [0/DUC_0] Initializing block control (NOC ID: 0xD0C0000000000002)&lt;br /&gt;
[INFO] [MPM.PeriphManager] init() called with device args `product=e320,mgmt_addr=192.168.10.2'.&lt;br /&gt;
[INFO] [0/Radio_0] Performing CODEC loopback test... &lt;br /&gt;
[INFO] [0/Radio_0] CODEC loopback test passed&lt;br /&gt;
[INFO] [0/Radio_0] Performing CODEC loopback test... &lt;br /&gt;
[INFO] [0/Radio_0] CODEC loopback test passed&lt;br /&gt;
Using Device: Single USRP:&lt;br /&gt;
  Device: E300-Series Device&lt;br /&gt;
  Mboard 0: ni-e320-316E375&lt;br /&gt;
  RX Channel: 0&lt;br /&gt;
    RX DSP: 0&lt;br /&gt;
    RX Dboard: A&lt;br /&gt;
    RX Subdev: Neon&lt;br /&gt;
  TX Channel: 0&lt;br /&gt;
    TX DSP: 0&lt;br /&gt;
    TX Dboard: A&lt;br /&gt;
    TX Subdev: Neon&lt;br /&gt;
  TX Channel: 1&lt;br /&gt;
    TX DSP: 1&lt;br /&gt;
    TX Dboard: A&lt;br /&gt;
    TX Subdev: Neon&lt;br /&gt;
&lt;br /&gt;
Setting RX Rate: 2.000000 Msps...&lt;br /&gt;
Actual RX Rate: 2.000000 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: 40.000000 dB...&lt;br /&gt;
Actual RX Gain: 40.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;1G&amp;lt;/code&amp;gt; FPGA image to be loaded.&lt;br /&gt;
&lt;br /&gt;
This example will test one full-duplex stream using &amp;quot;RFA/A:0&amp;quot;, at a rate of 2 MS/s, for 60 seconds:&lt;br /&gt;
&lt;br /&gt;
    /usr/local/lib/uhd/examples/benchmark_rate  \&lt;br /&gt;
    --args &amp;quot;addr=192.168.10.2&amp;quot; \&lt;br /&gt;
    --duration 60 \&lt;br /&gt;
    --channels &amp;quot;0&amp;quot; \&lt;br /&gt;
    --rx_rate 2e6 \&lt;br /&gt;
    --rx_subdev &amp;quot;A:0&amp;quot; \&lt;br /&gt;
    --tx_rate 2e6 \&lt;br /&gt;
    --tx_subdev &amp;quot;A:0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
This example will test two full-duplex streams at 2 MS/s, for 60 seconds:&lt;br /&gt;
&lt;br /&gt;
    /usr/local/lib/uhd/examples/benchmark_rate  \&lt;br /&gt;
    --args &amp;quot;addr=192.168.10.2&amp;quot; \&lt;br /&gt;
    --duration 60 \&lt;br /&gt;
    --channels &amp;quot;0,1&amp;quot; \&lt;br /&gt;
    --rx_rate 2e6 \&lt;br /&gt;
    --rx_subdev &amp;quot;A:0 A:1&amp;quot; \&lt;br /&gt;
    --tx_rate 2e6 \&lt;br /&gt;
    --tx_subdev &amp;quot;A:0 A:1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
This example will test two full-duplex streams at 12.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;addr=192.168.10.2,master_clock_rate=25e6&amp;quot; \&lt;br /&gt;
    --duration 60 \&lt;br /&gt;
    --channels &amp;quot;0,1&amp;quot; \&lt;br /&gt;
    --rx_rate 12.5e6 \&lt;br /&gt;
    --rx_subdev &amp;quot;A:0 A:1&amp;quot; \&lt;br /&gt;
    --tx_rate 12.5e6 \&lt;br /&gt;
    --tx_subdev &amp;quot;A:0 A:1&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 ====&lt;br /&gt;
NOTE: These examples require the &amp;lt;code&amp;gt;XG&amp;lt;/code&amp;gt; FPGA image to be loaded.&lt;br /&gt;
&lt;br /&gt;
This example will test one full-duplex stream using &amp;quot;RFA/A:0&amp;quot;, at a rate of 61.44 MS/s, for 60 seconds:&lt;br /&gt;
&lt;br /&gt;
    /usr/local/lib/uhd/examples/benchmark_rate  \&lt;br /&gt;
    --args &amp;quot;addr=192.168.10.2,master_clock_rate=61.44e6&amp;quot; \&lt;br /&gt;
    --duration 60 \&lt;br /&gt;
    --channels &amp;quot;0&amp;quot; \&lt;br /&gt;
    --rx_rate 61.44e6 \&lt;br /&gt;
    --rx_subdev &amp;quot;A:0&amp;quot; \&lt;br /&gt;
    --tx_rate 61.44e6 \&lt;br /&gt;
    --tx_subdev &amp;quot;A:0&amp;quot; &lt;br /&gt;
&lt;br /&gt;
This example will test two full-duplex stream, at a rate of 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;addr=192.168.10.2,master_clock_rate=61.44e6&amp;quot; \&lt;br /&gt;
    --duration 60 \&lt;br /&gt;
    --channels &amp;quot;0,1&amp;quot; \&lt;br /&gt;
    --rx_rate 30.72e6 \&lt;br /&gt;
    --rx_subdev &amp;quot;A:0 A:1&amp;quot; \&lt;br /&gt;
    --tx_rate 30.72e6 \&lt;br /&gt;
    --tx_subdev &amp;quot;A:0 A:1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==USRP E320 Device Specific Operations==&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;
=== Autoboot ===&lt;br /&gt;
&lt;br /&gt;
The USRP E320 can be configured to power on and boot automatically when power is applied. By default, autoboot is disabled on all USRPs that support it. To control autoboot on the USRP E320, first determine the current value for &amp;lt;code&amp;gt;MCU_FLAGS[0]&amp;lt;/code&amp;gt; by running &amp;lt;code&amp;gt;eeprom-dump&amp;lt;/code&amp;gt;; the meaning of the &amp;lt;code&amp;gt;MCU_FLAGS[0]&amp;lt;/code&amp;gt; [https://files.ettus.com/manual/page_usrp_e3xx.html#e320_eeprom_flags is found in the UHD manual]. The least significant bit when &amp;lt;code&amp;gt;MCU_FLAGS[0]&amp;lt;/code&amp;gt; is viewed as a binary value controls the autoboot.&lt;br /&gt;
&lt;br /&gt;
For example&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ni-e320-XXXXXXX:~# eeprom-dump&lt;br /&gt;
-- PID/REV: e320 0002&lt;br /&gt;
-- MCU_FLAGS[0]: 00000008&lt;br /&gt;
-- MCU_FLAGS[1]: 00000000&lt;br /&gt;
-- MCU_FLAGS[2]: 00000000&lt;br /&gt;
-- MCU_FLAGS[3]: 00000000&lt;br /&gt;
-- Serial: XXXXXXX&lt;br /&gt;
-- eth_addr0: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- eth_addr1: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- eth_addr2: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- DT-Compat/MCU-Compat: 0000 0002&lt;br /&gt;
-- CRC: cbd79a61 (matches)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
shows &amp;lt;code&amp;gt;-- MCU_FLAGS[0]: 00000008&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;0x08&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;0b00001000&amp;lt;/code&amp;gt; in binary) indicates that autoboot is disabled. If this value were &amp;lt;code&amp;gt;0x09&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;0b00001001&amp;lt;/code&amp;gt; in binary) it would indicate that autoboot is enabled because least significant bit is 1; same would be true if this value is &amp;lt;code&amp;gt;0x01&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;0b00000001&amp;lt;/code&amp;gt; in binary).&lt;br /&gt;
&lt;br /&gt;
To enable or disable autoboot, copy the existing value of &amp;lt;code&amp;gt;MCU_FLAGS[0]&amp;lt;/code&amp;gt; retrieved by &amp;lt;code&amp;gt;eeprom-dump&amp;lt;/code&amp;gt; into &amp;lt;code&amp;gt;&amp;lt;MCU_FLAGS[0]&amp;gt;&amp;lt;/code&amp;gt; below and run the command:&lt;br /&gt;
&lt;br /&gt;
* Disable autoboot on USRP E320 (sets least significant bit to 0), regardless of whether currently enabled or disabled:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ni-e320-XXXXXXX:~# eeprom-set-flags $((0x&amp;lt;MCU_FLAGS[0]&amp;gt; &amp;amp; ~0x1))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Thus, for the value noted above (autoboot is already disabled, so this command doesn't actually change anything):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ni-e320-XXXXXXX:~# eeprom-set-flags $((0x00000008 &amp;amp; ~0x1))&lt;br /&gt;
-- PID/REV: e320 0002&lt;br /&gt;
-- MCU_FLAGS[0]: 00000008&lt;br /&gt;
-- MCU_FLAGS[1]: 00000000&lt;br /&gt;
-- MCU_FLAGS[2]: 00000000&lt;br /&gt;
-- MCU_FLAGS[3]: 00000000&lt;br /&gt;
-- Serial: XXXXXXX&lt;br /&gt;
-- eth_addr0: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- eth_addr1: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- eth_addr2: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- DT-Compat/MCU-Compat: 0000 0002&lt;br /&gt;
-- CRC: cbd79a61 (matches)&lt;br /&gt;
-- Reading back &lt;br /&gt;
-- PID/REV: e320 0002&lt;br /&gt;
-- MCU_FLAGS[0]: 00000008&lt;br /&gt;
-- MCU_FLAGS[1]: 00000000&lt;br /&gt;
-- MCU_FLAGS[2]: 00000000&lt;br /&gt;
-- MCU_FLAGS[3]: 00000000&lt;br /&gt;
-- Serial: XXXXXXX&lt;br /&gt;
-- eth_addr0: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- eth_addr1: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- eth_addr2: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- DT-Compat/MCU-Compat: 0000 0002&lt;br /&gt;
-- CRC: 448fb572 (matches)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Enable autoboot on USRP E320 (sets least significant bit to 1), regardless of whether currently enabled or disabled. For example when changing from autoboot disabled to enabled:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ni-e320-XXXXXXX:~# eeprom-set-flags $((0x&amp;lt;MCU_FLAGS[0]&amp;gt; | 0x1))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Thus, for the value noted above:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ni-e320-XXXXXXX:~# eeprom-set-flags $((0x00000008 | 0x1))&lt;br /&gt;
-- PID/REV: e320 0002&lt;br /&gt;
-- MCU_FLAGS[0]: 00000008&lt;br /&gt;
-- MCU_FLAGS[1]: 00000000&lt;br /&gt;
-- MCU_FLAGS[2]: 00000000&lt;br /&gt;
-- MCU_FLAGS[3]: 00000000&lt;br /&gt;
-- Serial: XXXXXXX&lt;br /&gt;
-- eth_addr0: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- eth_addr1: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- eth_addr2: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- DT-Compat/MCU-Compat: 0000 0002&lt;br /&gt;
-- CRC: cbd79a61 (matches)&lt;br /&gt;
-- Reading back &lt;br /&gt;
-- PID/REV: e320 0002&lt;br /&gt;
-- MCU_FLAGS[0]: 00000009&lt;br /&gt;
-- MCU_FLAGS[1]: 00000000&lt;br /&gt;
-- MCU_FLAGS[2]: 00000000&lt;br /&gt;
-- MCU_FLAGS[3]: 00000000&lt;br /&gt;
-- Serial: XXXXXXX&lt;br /&gt;
-- eth_addr0: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- eth_addr1: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- eth_addr2: XX:XX:XX:XX:XX:XX&lt;br /&gt;
-- DT-Compat/MCU-Compat: 0000 0002&lt;br /&gt;
-- CRC: 448fb572 (matches)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If setting this flag ''does not'' allow autoboot control on the USRP E320, then the device boot firmware needs to be updated. This update is accomplished via the following instructions.&lt;br /&gt;
&lt;br /&gt;
On the USRP E320 via ssh or serial terminal, [https://files.ettus.com/binaries/misc/upgrade_mcu_neon_v1.1.7358-a190641-musl-glibc-rev3-6.tar.gz download the update MCU firmware] and extract it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ni-e320-XXXXXXX:~# curl https://files.ettus.com/binaries/misc/upgrade_mcu_neon_v1.1.7358-a190641-musl-glibc-rev3-6.tar.gz | tar zxf -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This will create a directory &amp;lt;code&amp;gt;upgrade_mcu_neon_v1.1.7358-a190641-musl-glibc-rev3-6&amp;lt;/code&amp;gt;. Go into this directory and run the firmware flash script:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ni-e320-XXXXXXX:~# cd upgrade_mcu_neon_v1.1.7358-a190641-musl-glibc-rev3-6&lt;br /&gt;
root@ni-e320-XXXXXXX:~/upgrade_mcu_neon_v1.1.7358-a190641-musl-glibc-rev3-6# ./flash-firmware.sh&lt;br /&gt;
This script updates the microcontroller firmware (RO part). The change is&lt;br /&gt;
persistent across power cycles. Incorrect updates can only fixed be a manual&lt;br /&gt;
process which requires opening the enclosure.&lt;br /&gt;
&lt;br /&gt;
Updating the microcontroller firmware (RO part) is only required if the Ettus&lt;br /&gt;
Research support told you to do so.&lt;br /&gt;
&lt;br /&gt;
Press &amp;quot;y&amp;quot; to continue&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
At the prompt, press the &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; key to continue. Pressing any other key aborts the procedure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Press &amp;quot;y&amp;quot; to continue n&lt;br /&gt;
&lt;br /&gt;
aborting&lt;br /&gt;
root@ni-e320-317F9BF:~/upgrade_mcu_neon_v1.1.7358-a190641-musl-glibc-rev3-6# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Pressing the &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; key:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Press &amp;quot;y&amp;quot; to continue y&lt;br /&gt;
&lt;br /&gt;
This script will flash ec-neon-rev3.RO.flat to the device&lt;br /&gt;
old RO version:    neon_vX.X.XXXX-XXXXXXX&lt;br /&gt;
new RO version:    neon_v1.1.7358-a190641&lt;br /&gt;
&lt;br /&gt;
Press &amp;quot;y&amp;quot; to continue&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
At the prompt, press the &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; key ''again'' to continue. Pressing any other key aborts the procedure as before.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Press &amp;quot;y&amp;quot; to continue y&lt;br /&gt;
&lt;br /&gt;
./ectool --interface=dev reboot_ec RW&lt;br /&gt;
./ectool --interface=dev flashread 0x0 65536 ec-neon-rev3.RO.flat.old&lt;br /&gt;
Reading 65536 bytes at offset 0...&lt;br /&gt;
done.&lt;br /&gt;
./ectool --interface=dev flasherase 0x0 65536&lt;br /&gt;
Erasing 65536 bytes at offset 0...&lt;br /&gt;
done.&lt;br /&gt;
./ectool --interface=dev flashwrite 0x0 ec-neon-rev3.RO.flat&lt;br /&gt;
Reading 49592 bytes from ec-neon-rev3.RO.flat...&lt;br /&gt;
Writing to offset 0...&lt;br /&gt;
Write size 112...&lt;br /&gt;
done.&lt;br /&gt;
&lt;br /&gt;
copying new firmware files&lt;br /&gt;
'ec-neon-rev3.bin' -&amp;gt; '/lib/firmware/ni/ec-neon-rev3.bin'&lt;br /&gt;
'ec-neon-rev3.RW.bin' -&amp;gt; '/lib/firmware/ni/ec-neon-rev3.RW.bin'&lt;br /&gt;
root@ni-e320-317F9BF:~/upgrade_mcu_neon_v1.1.7358-a190641-musl-glibc-rev3-6# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once the script is done, reboot the USRP (e.g., &amp;lt;code&amp;gt;shutdown -r now&amp;lt;/code&amp;gt;), and when it comes up the autoboot flag should now work as desired. If these instructions ''do not'' work, then email [mailto:support@ettus.com support@ettus.com] and ask for alternative instructions on how to update the USRP E320 RO and RW boot firmware such that this EEPROM flag setting is honored.&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-e320-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;
==Known Issues==&lt;br /&gt;
===Problematic NICs===&lt;br /&gt;
In some streaming modes, the Intel I219-LM NIC can produce flow control and sequence errors. It is recommended to use a USB3 to 1 Gb Ethernet Adapter for hosts which have an I219-LM NIC.&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:E320]]&lt;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=E310/E312&amp;diff=5865</id>
		<title>E310/E312</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=E310/E312&amp;diff=5865"/>
				<updated>2023-09-18T23:36:11Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: Remove old information and update content to be consistent with UHD 4.x releases&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The USRP E310 offers a portable stand-alone SDR platform designed for field deployment. The flexible 2x2 MIMO AD9361 transceiver from Analog Devices provides up to 56 MHz of instantaneous bandwidth and spans frequencies from 70 MHz – 6 GHz to cover multiple bands of interest.&lt;br /&gt;
&lt;br /&gt;
== Key Features==&lt;br /&gt;
===E310===&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
*Xilinx Zynq 7020 SoC: 7 Series FPGA with ARM Cortex A9 667 MHz dual-core processor&lt;br /&gt;
*Analog Devices AD9361 RFIC direct-conversion transceiver&lt;br /&gt;
*Frequency range: 70 MHz - 6 GHz&lt;br /&gt;
*Up to 56 MHz of instantaneous bandwidth&lt;br /&gt;
*2x2 MIMO transceiver&lt;br /&gt;
*Up to 10 MS/s sample data transfer rate to ARM processor&lt;br /&gt;
*RX, TX filter banks&lt;br /&gt;
*Integrated GPS receiver&lt;br /&gt;
*9-axis inertial measurement unit&lt;br /&gt;
*RF Network on Chip (RFNoC™) FPGA development framework support&lt;br /&gt;
|[[File:Product e310.png|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===E312===&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
*Battery Operated&lt;br /&gt;
*Xilinx Zynq 7020 SoC: 7 Series FPGA with ARM Cortex A9 866 MHz dual-core processor&lt;br /&gt;
*Analog Devices AD9361 RFIC direct-conversion transceiver&lt;br /&gt;
*Frequency range: 70 MHz - 6 GHz&lt;br /&gt;
*Up to 56 MHz of instantaneous bandwidth&lt;br /&gt;
*2x2 MIMO transceiver&lt;br /&gt;
*Up to 10 MS/s sample data transfer rate to ARM processor&lt;br /&gt;
*RX, TX filter banks&lt;br /&gt;
*Integrated GPS receiver&lt;br /&gt;
*9-axis inertial measurement unit&lt;br /&gt;
*RF Network on Chip (RFNoC™) FPGA development framework support&lt;br /&gt;
|[[File:Product e312.png|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Daughterboard Specifications==&lt;br /&gt;
===E310 MIMO XCVR board===&lt;br /&gt;
The USRP E310 MIMO XCVR daughterboard features an integrated MIMO capable RF frontend.&lt;br /&gt;
&lt;br /&gt;
===Tuning===&lt;br /&gt;
The RF frontend has individually tunable receive and transmit chains. Both transmit and receive can be used in a MIMO configuration. For the MIMO case, both receive frontends share the RX LO, and both transmit frontends share the TX LO. Each LO is tunable between 50 MHz and 6 GHz.&lt;br /&gt;
&lt;br /&gt;
===Gains===&lt;br /&gt;
All frontends have individual analog gain controls. The receive frontends have 76 dB of available gain; and the transmit frontends have 89.5 dB of available gain. Gain settings are application specific, but it is recommended that users consider using at least half of the available gain to get reasonable dynamic range.&lt;br /&gt;
&lt;br /&gt;
===LO lock status===&lt;br /&gt;
The frontends provide a lo-locked sensor that can be queried through the UHD API.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// assumes 'usrp' is a valid uhd::usrp::multi_usrp::sptr instance&lt;br /&gt;
// get status for rx frontend&lt;br /&gt;
usrp-&amp;gt;get_rx_sensor(&amp;quot;lo-locked&amp;quot;);&lt;br /&gt;
// get status for tx frontend&lt;br /&gt;
usrp-&amp;gt;get_tx_sensor(&amp;quot;lo-locked&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Filter and Antenna Switches===&lt;br /&gt;
The transmit and receive filter banks uses switches to select between the available filters. These paths are also dependent on the antenna switch settings. Incorrectly setting the switches generally results in attenuated input / output power. Receive filters are band pass (series high &amp;amp; low pass filters), transmit filters are low pass.&lt;br /&gt;
&lt;br /&gt;
Source code related to controlling the filter band and antenna switches resides in &amp;lt;code&amp;gt;e300_impl.c&amp;lt;/code&amp;gt;. Specifically, refer to methods &amp;lt;code&amp;gt;e300_impl::_update_bandsel&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;e300_impl::_update_atrs&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;e300_impl::_update_gpio&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;e300_impl::_update_enables&amp;lt;/code&amp;gt;. Generally, these methods set the switches depending on the state of transmit and receive streams.&lt;br /&gt;
&lt;br /&gt;
The following sections provide switch setting tables for antenna and filter selection for frontends A &amp;amp; B receive and transmit paths. For futher details refer to the schematics.&lt;br /&gt;
&lt;br /&gt;
===Side A Filter and Antenna Switches===&lt;br /&gt;
''Note: X = don't care, T = If full duplex, set bits according to transmit table, otherwise don't care. Filter range A – B will be selected if A &amp;lt;= freq &amp;lt; B.''&lt;br /&gt;
&lt;br /&gt;
'''Receive'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!RX Port &lt;br /&gt;
!RX Filter (MHz) &lt;br /&gt;
!VCTXRX2_V1,V2 &lt;br /&gt;
!VCRX2_V1,V2 &lt;br /&gt;
!RX2_BANDSEL[2:0] &lt;br /&gt;
!RX2B_BANDSEL[1:0] &lt;br /&gt;
!RX2C_BANDSEL[1:0]  &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | TRX-A &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | &amp;amp;lt; 450 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 101 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | XX &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 01 &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | TRX-A &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 450 &amp;amp;ndash; 700 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 011 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | XX &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 11 &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | TRX-A &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 700 &amp;amp;ndash; 1200 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 001 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | XX &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 10 &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | TRX-A &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 1200 &amp;amp;ndash; 1800 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 000 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | XX &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | TRX-A &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 1800 &amp;amp;ndash; 2350 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 010 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 11 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | XX &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | TRX-A &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 2350 &amp;amp;ndash; 2600 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 100 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | XX &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | TRX-A &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 2600 &amp;amp;ndash; 6000 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | XXX &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | XX &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | XX &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | RX2-A &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 70 &amp;amp;ndash; 450 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | TT &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 101 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | XX &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 01 &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | RX2-A &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 450 &amp;amp;ndash; 700 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | TT &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 011 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | XX &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 11 &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | RX2-A &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 700 &amp;amp;ndash; 1200 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | TT &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 001 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | XX &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 10 &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | RX2-A &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 1200 &amp;amp;ndash; 1800 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | TT &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 000 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | XX &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | RX2-A &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 1800 &amp;amp;ndash; 2350 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | TT &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 010 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 11 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | XX &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | RX2-A &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 2350 &amp;amp;ndash; 2600 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | TT &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 100 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | XX &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | RX2-A &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | &amp;amp;gt;= 2600 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | TT &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | XXX &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | XX &lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | XX &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Transmit'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! TX Port &lt;br /&gt;
! TX Filter (MHz) &lt;br /&gt;
! VCTXRX2_V1,V2 &lt;br /&gt;
! TX_ENABLE2A,2B &lt;br /&gt;
! TX_BANDSEL[2:0]  &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TRX-A &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | &amp;amp;lt; 117.7 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 111 &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TRX-A &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 117.7 &amp;amp;ndash; 178.2 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 110 &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TRX-A &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 178.2 &amp;amp;ndash; 284.3 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 101 &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TRX-A &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 284.3 &amp;amp;ndash; 453.7 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 100 &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TRX-A &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 453.7 &amp;amp;ndash; 723.8 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 011 &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TRX-A &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 723.8 &amp;amp;ndash; 1154.9 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 010 &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TRX-A &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 1154.9 &amp;amp;ndash; 1842.6 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 001 &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TRX-A &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 1842.6 &amp;amp;ndash; 2940.0 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 000 &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TRX-A &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | &amp;amp;gt;= 2940.0 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 11 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | XXX &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Note: Although the transmit filters are low pass, this table describes UHD's tuning range for selecting each filter path. The table also includes the required transmit enable state.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Side B Filter and Antenna Switches===&lt;br /&gt;
''Note: X = don't care, T = If full duplex, set bits according to transmit table, otherwise don't care. Filter range A – B will be selected if A &amp;lt;= freq &amp;lt; B.''&lt;br /&gt;
&lt;br /&gt;
'''Receive'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! RX Port &lt;br /&gt;
! RX Filter (MHz) &lt;br /&gt;
! VCTXRX1_V1,V2 &lt;br /&gt;
! VCRX1_V1,V2 &lt;br /&gt;
! RX1_BANDSEL[2:0] &lt;br /&gt;
! RX1B_BANDSEL[1:0] &lt;br /&gt;
! RX1C_BANDSEL[1:0]  &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TRX-B &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | &amp;amp;lt; 450 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 100 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | XX &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 10 &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TRX-B &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 450 &amp;amp;ndash; 700 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 010 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | XX &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 11 &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TRX-B &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 700 &amp;amp;ndash; 1200 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 000 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | XX &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 01 &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TRX-B &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 1200 &amp;amp;ndash; 1800 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 001 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | XX &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TRX-B &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 1800 &amp;amp;ndash; 2350 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 011 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 11 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | XX &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TRX-B &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2350 &amp;amp;ndash; 2600 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 101 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | XX &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TRX-B &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2600 &amp;amp;ndash; 6000 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | XXX &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | XX &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | XX &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | RX2-B &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 70 &amp;amp;ndash; 450 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TT &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 100 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | XX &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 10 &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | RX2-B &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 450 &amp;amp;ndash; 700 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TT &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 010 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | XX &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 11 &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | RX2-B &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 700 &amp;amp;ndash; 1200 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TT &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 000 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | XX &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 01 &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | RX2-B &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 1200 &amp;amp;ndash; 1800 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TT &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 001 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | XX &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | RX2-B &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 1800 &amp;amp;ndash; 2350 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TT &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 011 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 11 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | XX &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | RX2-B &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2350 &amp;amp;ndash; 2600 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TT &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 101 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | XX &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | RX2-B &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | &amp;amp;gt;= 2600 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TT &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | XXX &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | XX &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | XX &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Transmit'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! TX Port &lt;br /&gt;
! TX Filter (MHz) &lt;br /&gt;
! VCTXRX1_V1,V2 &lt;br /&gt;
! TX_ENABLE1A,1B &lt;br /&gt;
! TX1_BANDSEL[2:0]  &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TRX-B &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | &amp;amp;lt; 117.7 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 00 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 111 &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TRX-B &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 117.7 &amp;amp;ndash; 178.2 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 00 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 110 &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TRX-B &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 178.2 &amp;amp;ndash; 284.3 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 00 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 101 &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TRX-B &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 284.3 &amp;amp;ndash; 453.7 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 00 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 100 &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TRX-B &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 453.7 &amp;amp;ndash; 723.8 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 00 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 011 &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TRX-B &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 723.8 &amp;amp;ndash; 1154.9 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 00 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 010 &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TRX-B &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 1154.9 &amp;amp;ndash; 1842.6 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 00 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 001 &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TRX-B &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 1842.6 &amp;amp;ndash; 2940.0 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 00 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 01 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 000 &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | TRX-B &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | &amp;amp;gt;= 2940.0 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 11 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 10 &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | XXX &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Note: Although the transmit filters are low pass, the following table describes UHD's tuning range for selecting each filter path. The table also includes the required transmit enable states.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==RF Specifications==&lt;br /&gt;
===RF Performance===&lt;br /&gt;
* SSB/LO Suppression -35/50 dBc&lt;br /&gt;
* Phase Noise 3.5 GHz 1.0 deg RMS&lt;br /&gt;
* Phase Noise 6 GHz 1.5 deg RMS&lt;br /&gt;
* Power Output &amp;gt;10dBm&lt;br /&gt;
* IIP3 (@ typ NF) -20dBm&lt;br /&gt;
* Typical Noise Figure &amp;lt;8dB&lt;br /&gt;
&lt;br /&gt;
===Input/Output Impedance===&lt;br /&gt;
* All RF Ports are matched to 50 Ohm with -10dB or better return loss generally. Detailed test is pending.&lt;br /&gt;
&lt;br /&gt;
==Hardware Specifications==&lt;br /&gt;
* Ettus Research recommends to always use the latest stable version of UHD&lt;br /&gt;
&lt;br /&gt;
===E310===&lt;br /&gt;
* Current Hardware Revision: 1&lt;br /&gt;
* Minimum version of UHD required: 3.8.0&lt;br /&gt;
* Required version on the host computer must match what is running on the E310&lt;br /&gt;
&lt;br /&gt;
===E312===&lt;br /&gt;
* Current Hardware Revision: 1&lt;br /&gt;
* Minimum version of UHD required: 3.8.5&lt;br /&gt;
* Required version on the host computer must match what is running on the E312&lt;br /&gt;
&lt;br /&gt;
==Physical Specifications==&lt;br /&gt;
&lt;br /&gt;
===Dimensions===&lt;br /&gt;
* 133 x 68 x 26.4 mm&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* E310 0-40 °C&lt;br /&gt;
* E312 0-40 °C&lt;br /&gt;
&lt;br /&gt;
===Operating Humidity Range===&lt;br /&gt;
* 10% to 90% non-condensing&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
===E310===&lt;br /&gt;
[http://files.ettus.com/schematics/e310/e310.pdf E310 Schematics]&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/schematics/e310/e310_db.pdf E310 DB]&lt;br /&gt;
&lt;br /&gt;
[[Media: E310_System_Diagram.png|E310 Architecture]]&lt;br /&gt;
&lt;br /&gt;
==Key Component Datasheets==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%&amp;quot;&lt;br /&gt;
!Part Number&lt;br /&gt;
!Description&lt;br /&gt;
!Schematic ID (Page)&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Motherboard &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.ti.com.cn/cn/lit/ds/symlink/txs02612.pdf TXS02612RTWR]&lt;br /&gt;
|SDIO PORT EXPANDER&lt;br /&gt;
|U23 (2)&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.xilinx.com/support/documentation/data_sheets/ds187-XC7Z010-XC7Z020-Data-Sheet.pdf XC7Z020-1CLG484CES9919]&lt;br /&gt;
|FPGA&lt;br /&gt;
|U11 (2,3,4,8,11,13)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.xilinx.com/products/silicon-devices/soc/zynq-7000.html Xilinx Zynq Product Page ]&lt;br /&gt;
|FPGA&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/00001678A.pdf USB3340-EZK-TR]&lt;br /&gt;
|ULPI Transceiver&lt;br /&gt;
|U33 (5)&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.akm.com/akm/en/file/datasheet/AK4571VQ.pdf AK4571VQP]&lt;br /&gt;
|Audio CODEC&lt;br /&gt;
|U30 (6)&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.ftdichip.com/Support/Documents/DataSheets/ICs/DS_FT230X.pdf FT230XQ-R]&lt;br /&gt;
|UART Interface&lt;br /&gt;
|U32 (6)&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.marvell.com/transceivers/assets/Alaska_88E1512-001_product_brief.pdf 88E1512]&lt;br /&gt;
|Gigabit Ethernet Transceiver&lt;br /&gt;
|U13 (7)&lt;br /&gt;
|-&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/21210N.pdf 24LC024/SN]&lt;br /&gt;
|EEPROM&lt;br /&gt;
|U5 (9)&lt;br /&gt;
|-&lt;br /&gt;
|[http://datasheets.maximintegrated.com/en/ds/DS1339-DS1339U.pdf DS1339,SM]&lt;br /&gt;
|Real-Time Clock&lt;br /&gt;
|U6 (9)&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADT7408.pdf ADT7408]&lt;br /&gt;
|Temperature Sensor&lt;br /&gt;
|U8 (9)&lt;br /&gt;
|-&lt;br /&gt;
|[https://www.invensense.com/wp-content/uploads/2015/02/MPU-9150-Datasheet.pdf MPU-9150]&lt;br /&gt;
|Motion Processing Unit&lt;br /&gt;
|U3 (9)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.invensense.com/products/motion-tracking/9-axis/mpu-9150/ InvenSense MPU-9150 Product Page]&lt;br /&gt;
| Motion Processing Unit&lt;br /&gt;
|U3 (9)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://ae-bst.resource.bosch.com/media/_tech/media/datasheets/BST-BMP180-DS000-121.pdf BMP180]&lt;br /&gt;
|Digital pressure sensor&lt;br /&gt;
|U4 (9)&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/bq24192.pdf BQ24192]&lt;br /&gt;
|Adapter Charger&lt;br /&gt;
|U1 (10)&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps54478.pdf TPS54478]&lt;br /&gt;
|Step-Down Switcher&lt;br /&gt;
|U20 (10)&lt;br /&gt;
|-&lt;br /&gt;
|[https://datasheets.maximintegrated.com/en/ds/MAX6509-MAX6510.pdf MAX6510HAUT-T]&lt;br /&gt;
|Temperature Switches&lt;br /&gt;
|U35 (10)&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/images/doc8008.pdf ATTINY88-MU]&lt;br /&gt;
|Microcontroller&lt;br /&gt;
|U18 (10)&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps61253.pdf TPS61253YFF]&lt;br /&gt;
|Step-Up Converter&lt;br /&gt;
|U19 (10)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.u-blox.com/sites/default/files/products/documents/AMY-6_ProductSummary_%28GPS.G6-HW-10039%29.pdf AMY-6M]&lt;br /&gt;
|GPS Module&lt;br /&gt;
|U12 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Daughterboard &lt;br /&gt;
|-&lt;br /&gt;
!Part Number&lt;br /&gt;
!Description&lt;br /&gt;
!Schematic ID (Page)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/en/products/rf-microwave/integrated-transceivers-transmitters-receivers/wideband-transceivers-ic/ad9361.html#product-overview AD9361 Product Page]&lt;br /&gt;
|2 x 2 RF Agile Transceiver &lt;br /&gt;
| U8 (3)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/devicedoc/21203m.pdf 24AA256] &lt;br /&gt;
|EEPROM&lt;br /&gt;
|U15 (2)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/TC1-1-43A+.pdf TC-1-43A+] &lt;br /&gt;
|RF Transformer&lt;br /&gt;
|T6 (3); T5 (3); T4 (3)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/TC1-1-13M+.pdf TC1-1-13M+]&lt;br /&gt;
|RF Transformer&lt;br /&gt;
|T7 (3); T10 (3); T1 (3)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps62140.pdf TPS62140]&lt;br /&gt;
|Step-Down Converter&lt;br /&gt;
|U19 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADP1752_1753.pdf ADP1753ACPZ-R7]&lt;br /&gt;
|Linear Regulator&lt;br /&gt;
|U17 (4); U18 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.rfmd.com/store/downloads/dl/file/id/28671/sga4563z_data_sheet.pdf SGA-4563Z]&lt;br /&gt;
|MMIC AMPLIFIER&lt;br /&gt;
|U12 (5); U4 (5)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.skyworksinc.com/uploads/documents/SKY13418_485LF_201712D.pdf SKY13418-485LF]&lt;br /&gt;
|Antenna Switch &lt;br /&gt;
|U13 (5); U3 (5); U16 (5); U2 (5); U10 (6); U5 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.skyworksinc.com/uploads/documents/SKY13373_460LF_201264N.pdf SKY13373-460LF]&lt;br /&gt;
|SP3T Switch&lt;br /&gt;
|U11 (6); U9 (6); U6 (6); U7 (6); SW4 (7); SW1 (7)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.avagotech.com/docs/AV02-0966EN MGA-81563]&lt;br /&gt;
|Amplifier&lt;br /&gt;
|U14 (5); U1 (5)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-5850+.pdf LFCN-5850+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|FL32 (5); FL1 (5)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-2750.pdf LFCN-2750+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|FL37 (5); FL4 (5)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-2250.pdf LFCN-2250+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|FL23 (6); FL20 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-1700.pdf LFCN-1700+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|FL40 (5); FL2 (5)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-1575.pdf LFCN-1575+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|FL25 (6); FL17 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-1000.pdf LFCN-1000+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|FL33 (5); FL9 (5); FL27 (6); FL15 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-575.pdf LFCN-575+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|FL36 (5); FL5 (5)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-530.pdf LFCN-530+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|FL29 (6); FL13 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-400.pdf LFCN-400+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|FL38 (5); FL3 (5); FL30 (6); FL11 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-225.pdf LFCN-225]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|FL39 (5); FL6 (5)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-160+.pdf LFCN-160+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|FL34 (5); FL8 (5)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-80.pdf LFCN-80+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|FL35 (5); FL7 (5)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/HFCN-1600.pdf HFCN-1600+]&lt;br /&gt;
|High Pass Filter&lt;br /&gt;
|FL22 (6); FL19 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/HFCN-1100+.pdf HFCN-1100+]&lt;br /&gt;
|High Pass Filter&lt;br /&gt;
|FL24 (6); FL16 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/HFCN-650.pdf HFCN-650+]&lt;br /&gt;
|High Pass Filter&lt;br /&gt;
|FL26 (6); FL14 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/HFCN-440+.pdf HFCN-440+]&lt;br /&gt;
|High Pass Filter&lt;br /&gt;
|FL28 (6); FL12 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/BFCN-2435+.pdf BFCN-2435+]&lt;br /&gt;
|Bandpass Filter&lt;br /&gt;
|FL21 (6); FL18 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.fairchildsemi.com/datasheets/FD/FDG6301N.pdf FDG6301N]&lt;br /&gt;
|Dual N-Channel, Digital FET&lt;br /&gt;
|Q8 (7); Q5 (7)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.farnell.com/datasheets/461118.pdf HSMS-8202]&lt;br /&gt;
|Mixer Diodes&lt;br /&gt;
|CR1 (7); CR2 (7); CR3 (7); CR4 (7)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com.cn/cn/lit/ds/symlink/lp5900.pdf LP5900TL]&lt;br /&gt;
|Linear Regulator&lt;br /&gt;
|U25 (8)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADP150.pdf ADP150AUJZ-3.0]&lt;br /&gt;
|Linear Regulator&lt;br /&gt;
|U22 (8)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/AD5662.pdf AD5662RBJ]&lt;br /&gt;
|16-Bit nanoDAC&lt;br /&gt;
|U21 (8)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/sn74aup1t57.pdf SN74AUP1T57]&lt;br /&gt;
|Voltage Translator&lt;br /&gt;
|U27 (8); U28 (8); U29 (8)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Request a detailed whitepaper covering features and components from [mailto:info@ettus.com info@ettus.com]&lt;br /&gt;
&lt;br /&gt;
==Mechanical Information==&lt;br /&gt;
&lt;br /&gt;
===Weight===&lt;br /&gt;
* Partial Enclosure 225 g&lt;br /&gt;
* Full Enclosure 375 g&lt;br /&gt;
&lt;br /&gt;
===Drawings===&lt;br /&gt;
====E310====&lt;br /&gt;
* [[File:E310_Dimensional_Sketches.pdf]]&lt;br /&gt;
* [[File:cu e310 motherboard cca.pdf]]&lt;br /&gt;
* [[File:cu E310 daughtercard cca.pdf]]&lt;br /&gt;
* [[File:cu usrp-e310.pdf]]&lt;br /&gt;
====E312====&lt;br /&gt;
* [[File:cu e312 motherboard cca.pdf]]&lt;br /&gt;
* [[File:cu e312 daughtercard cca.pdf]]&lt;br /&gt;
* [[File:cu ettus-e312.pdf]]&lt;br /&gt;
&lt;br /&gt;
==FPGA==&lt;br /&gt;
* Utilization statistics are subject to change between UHD releases. This information is current as of UHD 3.9.4 and was taken directly from Xilinx Vivado 2014.4.&lt;br /&gt;
&lt;br /&gt;
===E310/E312===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1. Slice Logic&lt;br /&gt;
--------------&lt;br /&gt;
&lt;br /&gt;
+----------------------------+-------+-----------+-------+&lt;br /&gt;
|          Site Type         |  Used | Available | Util% |&lt;br /&gt;
+----------------------------+-------+-----------+-------+&lt;br /&gt;
| Slice LUTs                 | 36203 |     53200 | 68.05 |&lt;br /&gt;
|   LUT as Logic             | 28108 |     53200 | 52.83 |&lt;br /&gt;
|   LUT as Memory            |  8095 |     17400 | 46.52 |&lt;br /&gt;
|     LUT as Distributed RAM |   870 |           |       |&lt;br /&gt;
|     LUT as Shift Register  |  7225 |           |       |&lt;br /&gt;
| Slice Registers            | 36562 |    106400 | 34.36 |&lt;br /&gt;
|   Register as Flip Flop    | 36562 |    106400 | 34.36 |&lt;br /&gt;
|   Register as Latch        |     0 |    106400 |  0.00 |&lt;br /&gt;
| F7 Muxes                   |   376 |     26600 |  1.41 |&lt;br /&gt;
| F8 Muxes                   |   125 |     13300 |  0.93 |&lt;br /&gt;
+----------------------------+-------+-----------+-------+&lt;br /&gt;
&lt;br /&gt;
3. Memory&lt;br /&gt;
---------&lt;br /&gt;
&lt;br /&gt;
+-------------------+------+-----------+-------+&lt;br /&gt;
|     Site Type     | Used | Available | Util% |&lt;br /&gt;
+-------------------+------+-----------+-------+&lt;br /&gt;
| Block RAM Tile    |   97 |       140 | 69.28 |&lt;br /&gt;
|   RAMB36/FIFO*    |   90 |       140 | 64.28 |&lt;br /&gt;
|     RAMB36E1 only |   90 |           |       |&lt;br /&gt;
|   RAMB18          |   14 |       280 |  5.00 |&lt;br /&gt;
|     RAMB18E1 only |   14 |           |       |&lt;br /&gt;
+-------------------+------+-----------+-------+&lt;br /&gt;
* Note: Each Block RAM Tile only has one FIFO logic available and therefore can accommodate only one FIFO36E1 or one FIFO18E1. However, if a FIFO18E1 occupies a Block RAM Tile, that tile can still accommodate a RAMB18E1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. DSP&lt;br /&gt;
------&lt;br /&gt;
&lt;br /&gt;
+----------------+------+-----------+-------+&lt;br /&gt;
|    Site Type   | Used | Available | Util% |&lt;br /&gt;
+----------------+------+-----------+-------+&lt;br /&gt;
| DSPs           |  120 |       220 | 54.54 |&lt;br /&gt;
|   DSP48E1 only |  120 |           |       |&lt;br /&gt;
+----------------+------+-----------+-------+&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interfaces and Connectivity==&lt;br /&gt;
*10/100/1000 BASE-T Ethernet&lt;br /&gt;
*Stereo audio out, mono mic in&lt;br /&gt;
*Integrated GPS receiver&lt;br /&gt;
*Host USB support&lt;br /&gt;
*9-axis IMU&lt;br /&gt;
&lt;br /&gt;
===Front Panel===&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;width:50%&amp;quot; |&lt;br /&gt;
*'''RF A Group'''&lt;br /&gt;
**'''TX/RX LED:''' Indicates that data is streaming on the TX/RX channel on frontend side A&lt;br /&gt;
**'''RX2 LED:''' Indicates that data is streaming on the RX2 channel on frontend side A&lt;br /&gt;
*'''RF B Group'''&lt;br /&gt;
**'''TX/RX LED:''' Indicates that data is streaming on the TX/RX channel on frontend B&lt;br /&gt;
**'''RX2 LED:''' Indicates that data is streaming on the RX2 channel on frontend B&lt;br /&gt;
*'''PWR:''' Power switch with integrated status LED, for status description see below.&lt;br /&gt;
*'''SYNC:''' Input port for external PPS signal&lt;br /&gt;
*'''GPS:''' Connection for the GPS antenna&lt;br /&gt;
*'''AUDIO:''' Audio input / output&lt;br /&gt;
&lt;br /&gt;
The status LED in the power switch indicates the power and charge status. It's behavior is firmware version dependent.&lt;br /&gt;
&lt;br /&gt;
*'''Version 1''' (original E310)&lt;br /&gt;
**'''Off:''' Indicates device is off and not charging&lt;br /&gt;
**'''Solid Red:''' Indicates device is charging&lt;br /&gt;
**'''Solid Green:''' Indicates device is on&lt;br /&gt;
**'''Fast Blinking Red:''' Indicates an error code&lt;br /&gt;
***1 - Low voltage error&lt;br /&gt;
***2 - Regulator low voltage error&lt;br /&gt;
***3 - FPGA power error&lt;br /&gt;
***4 - DRAM power error&lt;br /&gt;
***5 - 1.8V rail power error&lt;br /&gt;
***6 - 3.3V rail power error&lt;br /&gt;
***7 - Daughterboard / TX power error&lt;br /&gt;
***9 - Temperature error&lt;br /&gt;
&lt;br /&gt;
*'''Version 2''' (E312 and upgraded E310)&lt;br /&gt;
**'''Off:''' Indicates device is off and not charging&lt;br /&gt;
**'''Slow Blinking Green:''' Indicates device is off and charging&lt;br /&gt;
**'''Fast Blinking Green:''' Indicates device is on and charging&lt;br /&gt;
**'''Solid Green:''' Indicates device is on (and not charging, if E312)&lt;br /&gt;
**'''Solid Orange:''' Indicates device is on and discharging&lt;br /&gt;
**'''Fast Blinking Orange:''' Indicates device is on, discharging, and charge is below 10% charge&lt;br /&gt;
**'''Fast Blinking Red:''' Indicates an error code&lt;br /&gt;
***1 - Low voltage error&lt;br /&gt;
***2 - Regulator low voltage error&lt;br /&gt;
***3 - FPGA power error&lt;br /&gt;
***4 - DRAM power error&lt;br /&gt;
***5 - 1.8V rail power error&lt;br /&gt;
***6 - 3.3V rail power error&lt;br /&gt;
***7 - Daughterboard / TX power error&lt;br /&gt;
***8 - Charger error&lt;br /&gt;
***9 - Charger temperature error&lt;br /&gt;
***10 - Battery low error&lt;br /&gt;
***11 - Fuel Gauge temperature error&lt;br /&gt;
***12 - Global (case) temperature error&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | [[File:e3x0 fp overlay.png]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Rear Panel===&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;width:50%&amp;quot; |&lt;br /&gt;
*'''PWR:''' Locking connector (Kycon KLDHCX-0202-A-LT) for the USRP-E Series power supply&lt;br /&gt;
*'''1G ETH:''' RJ45 port for Ethernet interfaces&lt;br /&gt;
*'''USB:''' USB 2.0 Port&lt;br /&gt;
*'''SERIAL:''' Micro USB connection for serial uart console&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | [[File:e3x0 rp overlay.png]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===GPIO===&lt;br /&gt;
{|&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width:60%&amp;quot; |&lt;br /&gt;
'''Pin Mapping'''&lt;br /&gt;
* Pin 1: +3.3V&lt;br /&gt;
* Pin 2: Reserved&lt;br /&gt;
* Pin 3: Data[5]&lt;br /&gt;
* Pin 4: Reserved&lt;br /&gt;
* Pin 5: Data[4]&lt;br /&gt;
* Pin 6: Data[0]&lt;br /&gt;
* Pin 7: Data[3]&lt;br /&gt;
* Pin 8: Data[1]&lt;br /&gt;
* Pin 9: 0V&lt;br /&gt;
* Pin 10: Data[2]&lt;br /&gt;
|[[File:e3x0 gpio conn.png]]&lt;br /&gt;
|}&lt;br /&gt;
* Please see the [http://files.ettus.com/manual/page_gpio_api.html E3x0/X3x0 GPIO API] for information on configuring and using the GPIO bus.&lt;br /&gt;
&lt;br /&gt;
===Audio===&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;width:60%&amp;quot; | &lt;br /&gt;
* The E3x0 2.5 mm Audio Jack TRRS pins are assigned as follows: Tip=Mic, Ring1=Right, Ring2=Left, Sleeve=GND.&lt;br /&gt;
* The Left/Right audio outputs are compatible with typical low-impedance headphones (16 to 32 Ohms). The Microphone pin provides approximately 2 mA bias at 2.2 V when not suspended. A variety of pin configurations can be found on commonly available headsets, so an adapter may be required.&lt;br /&gt;
&lt;br /&gt;
|[[File:TRRS.png]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==E312 Battery==&lt;br /&gt;
The USRP E312 is equipped with an integrated 3.7V, 3200mAh lithium­ion battery cell. After unboxing the USRP E312 , plug in the power adapter to an AC power source and fully charge the battery. This process with take approximately 2 hours. Do not leave the USRP E312 unit plugged in for more than 24 hours.&lt;br /&gt;
&lt;br /&gt;
The status LED in the power button indicates the power and charge status of the battery:&lt;br /&gt;
&lt;br /&gt;
Off: Indicates device is off and not charging.&lt;br /&gt;
*Slow Blinking Green: Indicates device is off and charging.&lt;br /&gt;
*Fast Blinking Green: Indicates device is on and charging.&lt;br /&gt;
*Solid Green: Indicates device is on and not charging (Battery is finished charging).&lt;br /&gt;
*Solid Orange: Indicates device is on and discharging.&lt;br /&gt;
*Fast Blinking Orange: Indicates device is on, discharging, and charge is below 10% charge.&lt;br /&gt;
*Fast Blinking Red: Indicates an error code:&lt;br /&gt;
&lt;br /&gt;
#Low Voltage Error&lt;br /&gt;
#Regulator Low Voltage Error&lt;br /&gt;
#FPGA Power Error&lt;br /&gt;
#DRAM Power Error&lt;br /&gt;
#1.8V Power Rail Error&lt;br /&gt;
#3.3V Power Rail Error&lt;br /&gt;
#Daughterboard / TX Power Error&lt;br /&gt;
#Charger Error&lt;br /&gt;
#Charger Temperature Error&lt;br /&gt;
#Battery Low Error&lt;br /&gt;
#Fuel Gauge Temperature Error&lt;br /&gt;
#Global (Enclosure) Temperature Error&lt;br /&gt;
&lt;br /&gt;
The battery life of the USRP E312 in idle mode is approximately 5 1/2 hours. The battery will enable the USRP E312 to operate for approximately 2 hours 20 minutes, when transmitting and receiving on both channels (2x2 MIMO), with maximum gain settings, at 5 GHz center frequency, and 1 MS/s sample rate. When the power button status LED is in the “Fast Blinking Orange” mode, plug the USRP E312 into an AC power source as soon as possible to recharge the battery.&lt;br /&gt;
&lt;br /&gt;
If the power button status LED indicates a “Low Voltage Error” (codes 1, 2, 3, 4, 5, 6, 7) or a “Battery Low Error” (code 10), plug the USRP E312 into an AC power source as soon as possible to recharge the battery.&lt;br /&gt;
&lt;br /&gt;
When the power button status LED indicates at “Temperature Error” or “Charger Error” (codes 8, 9, 11, or 12), power off the USRP E312 unit and allow it to cool down to room temperature. Then, plug in the USRP E312 to and AC power source and fully charge the battery.&lt;br /&gt;
&lt;br /&gt;
If error codes persist after cooling down and/or recharging the USRP E312, please contact [mailto:support@ettus.com support@ettus.com].&lt;br /&gt;
&lt;br /&gt;
You can purchase a replacement battery for the E312 at [https://www.ettus.com/product/details/E312-battery https://www.ettus.com/product/details/E312-battery].&lt;br /&gt;
&lt;br /&gt;
An Application Note covering the replacement of the E312 battery can be found at [[USRP E312 Battery Replacement Instructions]].&lt;br /&gt;
&lt;br /&gt;
==Certifications==&lt;br /&gt;
===RoHS===&lt;br /&gt;
As of December 1st, 2010 all Ettus Research products are RoHS compliant unless otherwise noted. More information can be found at [http://ettus.com/legal/rohs-information http://ettus.com/legal/rohs-information]&lt;br /&gt;
&lt;br /&gt;
==Certificate of Volatility==&lt;br /&gt;
===E310===&lt;br /&gt;
* [[Media:volatility USRP E310 r1.pdf]]&lt;br /&gt;
&lt;br /&gt;
===E312===&lt;br /&gt;
* [[Media:USRP E31x CoV.pdf]]&lt;br /&gt;
&lt;br /&gt;
==SD Card Images==&lt;br /&gt;
&lt;br /&gt;
The E31x SD card images can be obtained two ways:&lt;br /&gt;
&lt;br /&gt;
* Using uhd_images_downloader. See these instructions: https://files.ettus.com/manual/page_usrp_e3xx.html#update_sdcard&lt;br /&gt;
* Direct download from [https://files.ettus.com/binaries/cache/e3xx/ https://files.ettus.com/binaries/cache/e3xx/]&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Obsolete images, such as the alpha, beta, and Release 4 images, are located here: [https://files.ettus.com/e3xx_images/ https://files.ettus.com/e3xx_images/]. These release are no longer supported and provided here for archival purposes only.&lt;br /&gt;
&lt;br /&gt;
If choosing to directly download the SD card image, please note that they are sorted by UHD version with the format &amp;lt;code&amp;gt;meta-ettus-vUHD_VERSION&amp;lt;/code&amp;gt;. For example, the UHD 4.5 release is meta-ettus-v4.5.0.0. Each release contains SD card images and the SDK (OE cross-compiler build environment) for the USRP E31x. There is a manifest file that shows which packages, and which versions, are included in the OE build within each folder.&lt;br /&gt;
&lt;br /&gt;
We highly recommend customers use UHD 4.5 or later. It is fine if you are already successfully using an older version, but at some point it is recommended that you upgrade to a current version so that you benefit from the latest bug fixes, new features, stability improvements, and other enhancements.&lt;br /&gt;
&lt;br /&gt;
The UHD 4.5+ release images include UHD 4.5 (or later), GNU Radio 3.8, Python 3, and the corresponding FPGA image file.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' An 8 GB SD card is required for the Release 4 image.&lt;br /&gt;
&lt;br /&gt;
The SD card image contains both the FPGA image and the OS for the E31x. The FPGA image is located in the file system of the E31x in the &amp;lt;code&amp;gt;/usr/local/share/uhd/images&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
The E31x image comes in two speed grade varieties, sg1 and sg3. The majority of USRP E31x devices use the sg3 image, but older devices may use sg1. The version that you will need depends on the product number of your E31x, which is printed on the bottom of the device.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | E310 (15633'''X'''-01L)&lt;br /&gt;
|X= A, B, C, D&lt;br /&gt;
|e3xx_e310_sg1&lt;br /&gt;
|-&lt;br /&gt;
|X= E or later&lt;br /&gt;
|e3xx_e310_sg3&lt;br /&gt;
|-&lt;br /&gt;
|E312 (140605'''X'''-01L)&lt;br /&gt;
|X = All&lt;br /&gt;
|e3xx_e310_sg3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For the E310, the product number will be &amp;lt;code&amp;gt;156333'''X'''-01L&amp;lt;/code&amp;gt;, where X is a letter from A to Z. For devices where X is A, B, C, D, the image starting with &amp;lt;code&amp;gt;e3xx_e310_sg1&amp;lt;/code&amp;gt; should be used. For devices where X is E or later, the images under the &amp;lt;code&amp;gt;e3xx_e310_sg1&amp;lt;/code&amp;gt; folder should be used. You must use the appropriate image for your specific device. The incorrect image will not work, and will only boot as far as the U-Boot boot loader before stopping.&lt;br /&gt;
&lt;br /&gt;
For the E312, the product number will be &amp;lt;code&amp;gt;140605'''X'''-01L&amp;lt;/code&amp;gt;, where X is a letter from A to Z. The image starting with &amp;lt;code&amp;gt;e3xx_e310_sg3&amp;lt;/code&amp;gt; folder should be used for all E312 devices.&lt;br /&gt;
&lt;br /&gt;
You can burn the image to an SD card using the &amp;quot;&amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt;&amp;quot; tool. Instructions on how to use this tool are located at the links below:&lt;br /&gt;
&lt;br /&gt;
* https://files.ettus.com/manual/page_usrp_e3xx.html#e3xx_sdcard&lt;br /&gt;
&lt;br /&gt;
* https://kb.ettus.com/Writing_the_USRP_File_System_Disk_Image_to_a_SD_Card&lt;br /&gt;
&lt;br /&gt;
The SD image files have an *.zip extension. You can uncompress these files with any zip compatible tool, such as 7-Zip. Please see the links below for further information.&lt;br /&gt;
&lt;br /&gt;
'''7-Zip'''&lt;br /&gt;
* http://www.7-zip.org/&lt;br /&gt;
* https://en.wikipedia.org/wiki/7-Zip&lt;br /&gt;
&lt;br /&gt;
==Security Notes==&lt;br /&gt;
The OpenEmbedded project reported a security vulnerability for OE-Core (http://lists.openembedded.org/pipermail/openembedded-architecture/2017-June/000638.html). If you are an USRP E-Series user that is building binary ipkgs which you then distribute to your customers, you may be affected by this issue. No other workflows are impacted.&lt;br /&gt;
&lt;br /&gt;
The vulnerability is documented as CVE-2017-9731 (https://cve.mitre.org/cgi-bin/cvename.cgi?name=2017-9731). The specific issue is that information in the &amp;lt;code&amp;gt;SRC_URI&amp;lt;/code&amp;gt; for software repositories used by OE recipes is &amp;quot;leaked&amp;quot; by binary ipkgs. For example, if you are using the E-Series OE-generated SDK to build binary ipkgs, and the &amp;lt;code&amp;gt;URI&amp;lt;/code&amp;gt; you use for your source code repository contains sensitive information (e.g., &amp;lt;code&amp;gt;https://github.com/company-name/secret-project-name&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;local-server.internal.com?USER=admin&amp;amp;PASSWORD=password&amp;lt;/code&amp;gt;), then that information will be leaked in the &amp;lt;code&amp;gt;Source:&amp;lt;/code&amp;gt; field of the &amp;lt;code&amp;gt;ipkg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The OpenEmbedded team has merged a fix for this into OE-Core &amp;lt;code&amp;gt;master&amp;lt;/code&amp;gt;, and backported the change to previous versions of OpenEmbedded. Generally, including sensitive information in the &amp;lt;code&amp;gt;SRC_URIs&amp;lt;/code&amp;gt; is not a good idea, and we highly recommend users avoid doing this in their build process. Some recommendations provided on the OpenEmbedded discussion list:&lt;br /&gt;
&lt;br /&gt;
* Use non-confidential path names (i.e., don’t include confidential customer or project names in build paths).&lt;br /&gt;
* Change or manage the host name of your build system so that it is non-confidential, like &amp;lt;code&amp;gt;build-1&amp;lt;/code&amp;gt; instead of &amp;lt;code&amp;gt;secret-product.my-company.internal.com&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Use a &amp;quot;build user&amp;quot; who does not have network credentials to access sensitive machines during the build process.&lt;br /&gt;
&lt;br /&gt;
If you have any questions about this, or need help determining if this issue affects you, please let us know by contacting [mailto:support@ettus.com support@ettus.com].&lt;br /&gt;
&lt;br /&gt;
==Additional Resources==&lt;br /&gt;
* [http://www51.honeywell.com/aero/common/documents/myaerospacecatalog-documents/Defense_Brochures-documents/Magnetic__Literature_Application_notes-documents/AN203_Compass_Heading_Using_Magnetometers.pdf COMPASS HEADING USING MAGNETOMETERS]&lt;br /&gt;
&lt;br /&gt;
==Downloads==&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/e3xx_images/ FPGA Images]&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/e3xx_images/README FPGA Images Read Me] &lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/manual/md_fpga.html FPGA Resources]&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/binaries/uhd_stable/ UHD Stable Binaries]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/EttusResearch/uhd UHD Source Code on Github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=B200/B210/B200mini/B205mini/B206mini&amp;diff=5793</id>
		<title>B200/B210/B200mini/B205mini/B206mini</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=B200/B210/B200mini/B205mini/B206mini&amp;diff=5793"/>
				<updated>2023-03-22T01:21:09Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: Correct maximum input power&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The USRP Bus Series provides a fully integrated, single board, Universal Software Radio Peripheral platform with continuous frequency coverage from 70 MHz – 6 GHz. Designed for low-cost experimentation, it combines a fully integrated direct conversion transceiver providing up to 56MHz of real-time bandwidth, an open and reprogrammable Spartan6 FPGA, and fast and convenient bus-powered SuperSpeed USB 3.0 connectivity.&lt;br /&gt;
&lt;br /&gt;
== Key Features==&lt;br /&gt;
=== B200===&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Xilinx Spartan 6 XC6SLX75 FPGA&lt;br /&gt;
* Analog Devices AD9364 RFIC direct-conversion transceiver&lt;br /&gt;
* Frequency range: 70 MHz - 6 GHz&lt;br /&gt;
* Up to 56 MHz of instantaneous bandwidth&lt;br /&gt;
* Full duplex, SISO (1 Tx &amp;amp; 1 Rx)&lt;br /&gt;
* Fast and convenient bus-powered USB 3.0 connectivity&lt;br /&gt;
* Optional Board Mounted GPSDO&lt;br /&gt;
|[[File:Product b200.png|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== B210===&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Xilinx Spartan 6 XC6SLX150 FPGA&lt;br /&gt;
* Analog Devices AD9361 RFIC direct-conversion transceiver&lt;br /&gt;
* Frequency range: 70 MHz - 6 GHz&lt;br /&gt;
* Up to 56 MHz of instantaneous bandwidth (61.44MS/s quadrature)&lt;br /&gt;
* Full duplex, MIMO (2 Tx &amp;amp; 2 Rx)&lt;br /&gt;
* Fast and convenient bus-powered USB 3.0 connectivity&lt;br /&gt;
* Optional Board Mounted GPSDO &lt;br /&gt;
|[[File:Product b210.png|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== B200mini===&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Xilinx Spartan-6 XC6SLX75 FPGA&lt;br /&gt;
* Analog Devices AD9364 RFIC direct-conversion transceiver&lt;br /&gt;
* Frequency range: 70 MHz - 6 GHz&lt;br /&gt;
* Up to 56 MHz of instantaneous bandwidth&lt;br /&gt;
* Full duplex, SISO (1 Tx &amp;amp; 1 Rx)&lt;br /&gt;
* Fast and convenient bus-powered USB 3.0 connectivity&lt;br /&gt;
|[[File:Product b200 mini.png|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== B200mini-i===&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Industrial-grade Xilinx Spartan-6 XC6SLX75 FPGA&lt;br /&gt;
* Analog Devices AD9364 RFIC direct-conversion transceiver&lt;br /&gt;
* Frequency range: 70 MHz - 6 GHz&lt;br /&gt;
* Up to 56 MHz of instantaneous bandwidth&lt;br /&gt;
* Full duplex, SISO (1 Tx &amp;amp; 1 Rx)&lt;br /&gt;
* Fast and convenient bus-powered USB 3.0 connectivity&lt;br /&gt;
|[[File:Product b200 mini i.png|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== B205mini-i===&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Industrial-grade Xilinx Spartan-6 XC6SLX150 FPGA&lt;br /&gt;
* Analog Devices AD9364 RFIC direct-conversion transceiver&lt;br /&gt;
* Frequency range: 70 MHz - 6 GHz&lt;br /&gt;
* Up to 56 MHz of instantaneous bandwidth&lt;br /&gt;
* Full duplex, SISO (1 Tx &amp;amp; 1 Rx)&lt;br /&gt;
* Fast and convenient bus-powered USB 3.0 connectivity&lt;br /&gt;
|[[File:Product b200 mini i.png|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Frontend Specifications==&lt;br /&gt;
===Tuning===&lt;br /&gt;
&lt;br /&gt;
The RF frontend has individually tunable receive and transmit chains. On the B200 and B200 mini, there is one transmit and one receive RF frontend. On the B210, both transmit and receive can be used in a MIMO configuration. For the MIMO case on the B210 only, both receive frontends share the RX LO, and both transmit frontends share the TX LO. Each LO is independently tunable between 50 MHz and 6 GHz and can be used with 1 or 2 channels; all channels using the same LO must use the same sampling parameters, including the sample rate and RF center frequency.&lt;br /&gt;
&lt;br /&gt;
===Gains===&lt;br /&gt;
All frontends have individual analog gain controls. The receive frontends have 76 dB of available gain; and the transmit frontends have 89.8 dB of available gain. Gain settings are application specific, but it is recommended that users consider using at least half of the available gain to get reasonable dynamic range.&lt;br /&gt;
&lt;br /&gt;
===Bandwidths===&lt;br /&gt;
The analog frontend has a seamlessly adjustable bandwidth of 200 kHz to 56 MHz.&lt;br /&gt;
&lt;br /&gt;
Generally, when requesting any possible master clock rate, UHD will automatically configure the analog filters to avoid any aliasing (RX) or out-of-band emissions whilst letting through the cleanest possible signal.&lt;br /&gt;
&lt;br /&gt;
If you, however, happen to have a very strong interferer within half the master clock rate of your RX LO frequency, you might want to reduce this analog bandwidth. You can do so by calling uhd::usrp::multi_usrp::set_rx_bandwidth(bw).&lt;br /&gt;
&lt;br /&gt;
The property to control the analog RX bandwidth is bandwidth/value.&lt;br /&gt;
&lt;br /&gt;
UHD will not allow you to set bandwidths larger than your current master clock rate.&lt;br /&gt;
&lt;br /&gt;
==RF Specifications==&lt;br /&gt;
The USRP B200/B210/B200mini/B205mini are derived from the Analog devices AD936x integrated transceiver chip, the overall RF performance of the device is largely governed by the transceiver chip itself. &lt;br /&gt;
&lt;br /&gt;
===RF Performance===&lt;br /&gt;
* SSB/LO Suppression -35/50 dBc&lt;br /&gt;
* Phase Noise 3.5 GHz 1.0 deg RMS&lt;br /&gt;
* Phase Noise 6 GHz 1.5 deg RMS&lt;br /&gt;
* Power Output &amp;gt;10dBm&lt;br /&gt;
* IIP3 (@ typ NF) -20dBm&lt;br /&gt;
* Typical Noise Figure &amp;lt;8dB&lt;br /&gt;
* Maximum Input Power: -15 dBm&lt;br /&gt;
&lt;br /&gt;
===Input/Output Impedance===&lt;br /&gt;
All RF Ports are matched to 50 Ohm with -10dB or better return loss generally. Detailed test is pending.&lt;br /&gt;
&lt;br /&gt;
===Input Power Levels===&lt;br /&gt;
* The maximum input power for the B200/B210/B200mini/B205mini is 0 dBm.&lt;br /&gt;
&lt;br /&gt;
===RF Performance Data===&lt;br /&gt;
====B200mini / B205mini====&lt;br /&gt;
* [[Media:B200mini B205 RF Performance Data 20160119.pdf]]&lt;br /&gt;
&lt;br /&gt;
====B200 / B210====&lt;br /&gt;
* [[Media:B200 RF Performance.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Hardware Specifications==&lt;br /&gt;
* Ettus Research recommends to always use the latest stable version of UHD&lt;br /&gt;
&lt;br /&gt;
=== B200===&lt;br /&gt;
* Current Hardware Revision: 6&lt;br /&gt;
* Minimum version of UHD required: 3.8.4&lt;br /&gt;
* B200 Rev 5 (AD9364-based board) requires minimum UHD 3.8.4&lt;br /&gt;
&lt;br /&gt;
=== B210===&lt;br /&gt;
* Current Hardware Revision: 5&lt;br /&gt;
* Minimum version of UHD required: 3.6.0&lt;br /&gt;
&lt;br /&gt;
=== B200mini===&lt;br /&gt;
* Current Hardware Revision: 2&lt;br /&gt;
* Minimum version of UHD required: 3.9.0&lt;br /&gt;
&lt;br /&gt;
=== B200mini-i===&lt;br /&gt;
* Current Hardware Revision: 2&lt;br /&gt;
* Minimum version of UHD required: 3.9.0&lt;br /&gt;
&lt;br /&gt;
=== B205mini-i===&lt;br /&gt;
* Current Hardware Revision: 1&lt;br /&gt;
* Minimum version of UHD required: 3.9.2&lt;br /&gt;
&lt;br /&gt;
==Physical Specifications==&lt;br /&gt;
===Dimensions===&lt;br /&gt;
* B200mini/B205mini 5.0 x 8.4 cm&lt;br /&gt;
* B200/B210 9.7 x 15.5 x 1.5 cm&lt;br /&gt;
&lt;br /&gt;
===Weight===&lt;br /&gt;
* B200mini 24.0 g&lt;br /&gt;
* B200/B210 350 g&lt;br /&gt;
&lt;br /&gt;
===Drawings===&lt;br /&gt;
====B200mini====&lt;br /&gt;
* [[Media:B200mini_drawing.png| Board only]]&lt;br /&gt;
* [[Media:cu usrp-b200mini.pdf| B20xmini Enclosure]]&lt;br /&gt;
&lt;br /&gt;
====B200====&lt;br /&gt;
* [[Media:cu ettus b200 cca.pdf| Board only]]&lt;br /&gt;
&lt;br /&gt;
====B210====&lt;br /&gt;
* [[Media:cu ettus b210 cca.pdf| Board only]]&lt;br /&gt;
&lt;br /&gt;
====B200/B210 Enclosure====&lt;br /&gt;
* [[Media:cu ettus-b2xx-full-enclosure.pdf|Enclosure]]&lt;br /&gt;
&lt;br /&gt;
===CAD/STP Models===&lt;br /&gt;
====B200mini====&lt;br /&gt;
* [[Media:B200mini.stp.tar.gz| B200mini with Enclosure]]&lt;br /&gt;
* [[Media:B200mini enclosure-only.stp.tar.gz| Enclosure only]]&lt;br /&gt;
* [[Media:cu ettus b200mini cca.stp.tar.gz| Board only ]]&lt;br /&gt;
&lt;br /&gt;
====B20xmini-i====&lt;br /&gt;
* [[Media:b20xmini-i._thermal_insert.stp.tar.gz| B20xmini-i Thermal Insert]]&lt;br /&gt;
&lt;br /&gt;
====B200====&lt;br /&gt;
* [[Media:cu ettus b200 cca.stp.tar.gz| Board only]]&lt;br /&gt;
&lt;br /&gt;
====B210====&lt;br /&gt;
* [[Media:cu ettus b210 cca.stp.gz| Board only]]&lt;br /&gt;
&lt;br /&gt;
====B200/B210 Enclosure====&lt;br /&gt;
* [[Media:cu ettus-b200-b210-case.zip|Enclosure]]&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* B200 / B210: 25 °C&lt;br /&gt;
* B200mini - Board Only: 0 - 40 °C &lt;br /&gt;
* B200mini - With Enclosure: -20 - 60°C &lt;br /&gt;
* B200mini-i / B205mini-i - Board Only:   0 - 45 °C &lt;br /&gt;
* B200mini-i / B205mini-i - With I-Grade Enclosure: -40 - 75°C&lt;br /&gt;
&lt;br /&gt;
===Operating Humidity Range===&lt;br /&gt;
* 10% to 90% non-condensing&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
===B200mini/B200mini-i/B205mini-i===&lt;br /&gt;
[http://files.ettus.com/schematics/b200mini/b200mini.pdf B200mini/B200mini-i/B205mini-i Schematics]&lt;br /&gt;
&lt;br /&gt;
===B200/B210===&lt;br /&gt;
[http://files.ettus.com/schematics/b200/b210.pdf B200/B210 Schematics]&lt;br /&gt;
&lt;br /&gt;
==Key Component Datasheets==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%&amp;quot;&lt;br /&gt;
!Part Number&lt;br /&gt;
!Description&lt;br /&gt;
!Schematic ID (Page)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/TCM1-63AX+.pdf Mini-Circuits TCM1-63AX+]&lt;br /&gt;
|Transformer&lt;br /&gt;
|T1 (1,3); T2 (1,3)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.analog.com/en/products/rf-microwave/integrated-transceivers-transmitters-receivers/wideband-transceivers-ic/ad9364.html#product-overview Analog Devices AD9364]&lt;br /&gt;
|RF Transceiver&lt;br /&gt;
|U1 (2)&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.analog.com/en/products/rf-microwave/integrated-transceivers-transmitters-receivers/wideband-transceivers-ic/ad9361.html#product-overview Analog Devices AD9361]&lt;br /&gt;
|RF Transceiver&lt;br /&gt;
|U2 (2,8)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/en/design-center/landing-pages/001/ad9361-ad9364-integ-rf-agile-transceiver-design-res.html AD9361/AD9364 Product Page]&lt;br /&gt;
|RF Transceiver&lt;br /&gt;
| - &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.xilinx.com/products/silicon-devices/fpga/spartan-6.html Xilinx Spartan-6 Product Page]&lt;br /&gt;
|FPGA&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|U1 (2,3,4,6); PG1 (6); U18B, U18C (7); U18D (8); U18E, U18F (9); U18G, U18H (10)&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.xilinx.com/support/documentation/data_sheets/ds160.pdf XC6SLX75 / XC6SLX150]&lt;br /&gt;
|FPGA&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADF4001.pdf ADF4001]&lt;br /&gt;
|Frequency Synthesizer&lt;br /&gt;
|U101 (1)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.cypress.com/file/140296/download CYUSB3014]&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|FX3: SuperSpeed USB Controller&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|U3 (5,6); U13 (5)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.cypress.com/applications/ez-usb-fx3-superspeed-usb-30-peripheral-controller-collateral-guide EZ-USB FX3™ Product Page]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.skyworksinc.com/uploads/documents/SKY13317_373LF_200914K.pdf SKY13317]&lt;br /&gt;
|Antenna Switch&lt;br /&gt;
|U801, U810 (8)&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.anaren.com/sites/default/files/BD3150L50100A00%20Data%20sheet%20Rev%20C.pdf BD3150L50100A00]&lt;br /&gt;
|Balun&lt;br /&gt;
|U802, U808, U809, U815 (8)&lt;br /&gt;
|-&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/PGA-102+.pdf PGA−102+]&lt;br /&gt;
|Amplifier&lt;br /&gt;
|U804, U817 (8)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|[http://www.ctscorp.com/wp-content/uploads/2015/11/008-0371-0.pdf VCTCXO]&lt;br /&gt;
|VCTCXO (B200mini only)&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.ctscorp.com/wp-content/uploads/2015/11/008-0334-0.pdf 525L20DA40M0000]&lt;br /&gt;
|VCTCXO (B200/B210 only)&lt;br /&gt;
| X100 (1)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.jackson-labs.com/index.php/products/lc_xo Jackson Labs LC_XO] [http://www.jackson-labs.com/assets/uploads/main/LC_XO_specsheet.pdf Spec Sheet] [http://www.jackson-labs.com/assets/uploads/main/LC_XO_Manual.pdf Manual]&lt;br /&gt;
|Optional GPSDO (B200/B210 only)&lt;br /&gt;
|U100 (1)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Enclosures==&lt;br /&gt;
&lt;br /&gt;
* SMA connectors should be torqued to 4 inch-pounds&lt;br /&gt;
&lt;br /&gt;
===B200mini===&lt;br /&gt;
* [https://www.ettus.com/all-products/usrp-b200mini-enclosure/ B200mini C-Grade Enclosure]&lt;br /&gt;
* [https://www.ettus.com/all-products/usrp-b200mini-i-enclosure/ B200mini I-Grade Enclosure]&lt;br /&gt;
&lt;br /&gt;
===B205mini===&lt;br /&gt;
* [https://www.ettus.com/all-products/usrp-b205mini-i-enclosure/ B205mini I-Grade Enclosure]&lt;br /&gt;
&lt;br /&gt;
===B200/B210===&lt;br /&gt;
* [https://www.ettus.com/product/details/USRP-B200-Enclosure USRP B200/B210 Enclosure]&lt;br /&gt;
** Full Steel Enclosure&lt;br /&gt;
** Compatible with green USRP B200 and B210 devices (revision 6 or later)&lt;br /&gt;
** Front and rear K-Slots for anti-theft protection&lt;br /&gt;
&lt;br /&gt;
==FPGA==&lt;br /&gt;
* Utilization statistics are subject to change between UHD releases. This information is current as of UHD 3.9.4.&lt;br /&gt;
===B200===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Device utilization summary:&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
Selected Device : 6slx75fgg484-3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Slice Logic Utilization:&lt;br /&gt;
 Number of Slice Registers:           15781  out of  93296    16%&lt;br /&gt;
 Number of Slice LUTs:                19987  out of  46648    42%&lt;br /&gt;
    Number used as Logic:             15983  out of  46648    34%&lt;br /&gt;
    Number used as Memory:             4004  out of  11072    36%&lt;br /&gt;
       Number used as RAM:              972&lt;br /&gt;
       Number used as SRL:             3032&lt;br /&gt;
&lt;br /&gt;
Slice Logic Distribution:&lt;br /&gt;
 Number of LUT Flip Flop pairs used:  24062&lt;br /&gt;
   Number with an unused Flip Flop:    8281  out of  24062    34%&lt;br /&gt;
   Number with an unused LUT:          4075  out of  24062    16%&lt;br /&gt;
   Number of fully used LUT-FF pairs: 11706  out of  24062    48%&lt;br /&gt;
   Number of unique control sets:       434&lt;br /&gt;
&lt;br /&gt;
IO Utilization:&lt;br /&gt;
 Number of IOs:                         172&lt;br /&gt;
 Number of bonded IOBs:                 155  out of    280    55%&lt;br /&gt;
    IOB Flip Flops/Latches:             124&lt;br /&gt;
&lt;br /&gt;
Specific Feature Utilization:&lt;br /&gt;
 Number of Block RAM/FIFO:              144  out of    172    83%&lt;br /&gt;
    Number using Block RAM only:        144&lt;br /&gt;
 Number of BUFG/BUFGCTRLs:                4  out of     16    25%&lt;br /&gt;
 Number of DSP48A1s:                     76  out of    132    57%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===B210===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Device utilization summary:&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
Selected Device : 6slx150fgg484-3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Slice Logic Utilization:&lt;br /&gt;
 Number of Slice Registers:           29310  out of  184304   15%&lt;br /&gt;
 Number of Slice LUTs:                36486  out of  92152    39%&lt;br /&gt;
    Number used as Logic:             29279  out of  92152    31%&lt;br /&gt;
    Number used as Memory:             7207  out of  21680    33%&lt;br /&gt;
       Number used as RAM:             1752&lt;br /&gt;
       Number used as SRL:             5455&lt;br /&gt;
&lt;br /&gt;
Slice Logic Distribution:&lt;br /&gt;
 Number of LUT Flip Flop pairs used:  43635&lt;br /&gt;
   Number with an unused Flip Flop:   14325  out of  43635    32%&lt;br /&gt;
   Number with an unused LUT:          7149  out of  43635    16%&lt;br /&gt;
   Number of fully used LUT-FF pairs: 22161  out of  43635    50%&lt;br /&gt;
   Number of unique control sets:       723&lt;br /&gt;
&lt;br /&gt;
IO Utilization:&lt;br /&gt;
 Number of IOs:                         180&lt;br /&gt;
 Number of bonded IOBs:                 163  out of    338    48%&lt;br /&gt;
    IOB Flip Flops/Latches:             148&lt;br /&gt;
&lt;br /&gt;
Specific Feature Utilization:&lt;br /&gt;
 Number of Block RAM/FIFO:              186  out of    268    69%&lt;br /&gt;
    Number using Block RAM only:        186&lt;br /&gt;
 Number of BUFG/BUFGCTRLs:                4  out of     16    25%&lt;br /&gt;
 Number of DSP48A1s:                    152  out of    180    84%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===B200mini===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Device utilization summary:&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
Selected Device : 6slx75csg484-3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Slice Logic Utilization:&lt;br /&gt;
 Number of Slice Registers:           15949  out of  93296    17%&lt;br /&gt;
 Number of Slice LUTs:                19963  out of  46648    42%&lt;br /&gt;
    Number used as Logic:             16140  out of  46648    34%&lt;br /&gt;
    Number used as Memory:             3823  out of  11072    34%&lt;br /&gt;
       Number used as RAM:              972&lt;br /&gt;
       Number used as SRL:             2851&lt;br /&gt;
&lt;br /&gt;
Slice Logic Distribution:&lt;br /&gt;
 Number of LUT Flip Flop pairs used:  23859&lt;br /&gt;
   Number with an unused Flip Flop:    7910  out of  23859    33%&lt;br /&gt;
   Number with an unused LUT:          3896  out of  23859    16%&lt;br /&gt;
   Number of fully used LUT-FF pairs: 12053  out of  23859    50%&lt;br /&gt;
   Number of unique control sets:       429&lt;br /&gt;
&lt;br /&gt;
IO Utilization:&lt;br /&gt;
 Number of IOs:                         123&lt;br /&gt;
 Number of bonded IOBs:                 114  out of    328    34%&lt;br /&gt;
    IOB Flip Flops/Latches:             147&lt;br /&gt;
&lt;br /&gt;
Specific Feature Utilization:&lt;br /&gt;
 Number of Block RAM/FIFO:              110  out of    172    63%&lt;br /&gt;
    Number using Block RAM only:        110&lt;br /&gt;
 Number of BUFG/BUFGCTRLs:                6  out of     16    37%&lt;br /&gt;
 Number of DSP48A1s:                     76  out of    132    57%&lt;br /&gt;
 Number of PLL_ADVs:                      1  out of      6    16%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===B205mini===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Device utilization summary:&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
Selected Device : 6slx150csg484-3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Slice Logic Utilization:&lt;br /&gt;
 Number of Slice Registers:           15949  out of  184304     8%&lt;br /&gt;
 Number of Slice LUTs:                19963  out of  92152    21%&lt;br /&gt;
    Number used as Logic:             16140  out of  92152    17%&lt;br /&gt;
    Number used as Memory:             3823  out of  21680    17%&lt;br /&gt;
       Number used as RAM:              972&lt;br /&gt;
       Number used as SRL:             2851&lt;br /&gt;
&lt;br /&gt;
Slice Logic Distribution:&lt;br /&gt;
 Number of LUT Flip Flop pairs used:  23859&lt;br /&gt;
   Number with an unused Flip Flop:    7910  out of  23859    33%&lt;br /&gt;
   Number with an unused LUT:          3896  out of  23859    16%&lt;br /&gt;
   Number of fully used LUT-FF pairs: 12053  out of  23859    50%&lt;br /&gt;
   Number of unique control sets:       429&lt;br /&gt;
&lt;br /&gt;
IO Utilization:&lt;br /&gt;
 Number of IOs:                         123&lt;br /&gt;
 Number of bonded IOBs:                 114  out of    338    33%&lt;br /&gt;
    IOB Flip Flops/Latches:             147&lt;br /&gt;
&lt;br /&gt;
Specific Feature Utilization:&lt;br /&gt;
 Number of Block RAM/FIFO:              110  out of    268    41%&lt;br /&gt;
    Number using Block RAM only:        110&lt;br /&gt;
 Number of BUFG/BUFGCTRLs:                6  out of     16    37%&lt;br /&gt;
 Number of DSP48A1s:                     76  out of    180    42%&lt;br /&gt;
 Number of PLL_ADVs:                      1  out of      6    16%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interfaces and Connectivity==&lt;br /&gt;
B200/B210/B200mini - USB 3.0&lt;br /&gt;
&lt;br /&gt;
===GPIO===&lt;br /&gt;
====Power on state====&lt;br /&gt;
The hardware power on state and UHD initial state for the front-panel GPIOs is high-Z. For the B2xx, B2xxmini there are no external pull-ups/pull-downs for the GPIO pins, but the FPGAs do have them and they are configured as follows: B2xx: pull-up, B2xxmini: pull-up.&lt;br /&gt;
&lt;br /&gt;
====Output Current====&lt;br /&gt;
The GPIOs are configured as LVCMOS33 outputs with pull-ups on the B2xx. The strength for LVCMOS and LVTTL on Spartan 6 is 12 mA if not otherwise specified.&lt;br /&gt;
&lt;br /&gt;
===Timing Reference Input===&lt;br /&gt;
====B200mini/B200mini-i/B205mini-i====&lt;br /&gt;
* 1-PPS or 10 MHz input&lt;br /&gt;
&lt;br /&gt;
=====1-PPS=====&lt;br /&gt;
* Maximum: -5V / +5V&lt;br /&gt;
* Minimum: 0V / +2.5V&lt;br /&gt;
&lt;br /&gt;
=====10 MHz=====&lt;br /&gt;
* Maximum: 0V / +5V&lt;br /&gt;
* Minimum: 0V / +1.8V&lt;br /&gt;
'''OR'''&lt;br /&gt;
* +10dBm ~ +27dBm&lt;br /&gt;
&lt;br /&gt;
====B200/B210====&lt;br /&gt;
=====1-PPS=====&lt;br /&gt;
* Maximum: 5V&lt;br /&gt;
=====10 MHz=====&lt;br /&gt;
* Maximum: 15dBm (3.5Vpp into 50 ohms)&lt;br /&gt;
&lt;br /&gt;
==Certifications==&lt;br /&gt;
===RoHS===&lt;br /&gt;
As of December 1st, 2010 all Ettus Research products are RoHS compliant unless otherwise noted. More information can be found at [http://ettus.com/legal/rohs-information http://ettus.com/legal/rohs-information]&lt;br /&gt;
&lt;br /&gt;
===China RoHS=== &lt;br /&gt;
'''Management Methods for Controlling Pollution Caused by Electronic Information Products Regulation'''&lt;br /&gt;
&lt;br /&gt;
'''Chinese Customers''' &lt;br /&gt;
&lt;br /&gt;
National Instruments is in compliance with the Chinese policy on the Restriction of Hazardous Substances (RoHS) used in Electronic Information Products. For more information about the National Instruments China RoHS compliance, visit [http://www.ni.com/environment/rohs_china ni.com/environment/rohs_china].&lt;br /&gt;
&lt;br /&gt;
===Certifications for European Union===&lt;br /&gt;
In order to ensure compliance with EU certifications for radio equipment, a ferrite bead (included in kits with NI part number 785825-01 and 785826-01) should be affixed onto the GPIO cable, if in use. This is achieved by opening the snap-on ferrite bead and enclosing it around the GPIO cable(s).&lt;br /&gt;
&lt;br /&gt;
In addition to the part numbers listed above, these ferrite beads can be sourced through Fair-Rite using part number 0443164251.&lt;br /&gt;
&lt;br /&gt;
==Certificate of Volatility==&lt;br /&gt;
===B200/B210===&lt;br /&gt;
* [[Media:volatility USRP B200 B210 r1.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Downloads==&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/manual/md_fpga.html FPGA Resources]&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/binaries/uhd_stable/ UHD Stable Binaries]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/EttusResearch/uhd UHD Source Code on Github]&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
This is a list of frequently asked questions on the USRP [https://www.ettus.com/product/details/UB200-KIT B200]/[https://www.ettus.com/product/details/UB210-KIT B210]/[https://www.ettus.com/product/details/USRP-B200mini B200mini]. If you have questions that are not answered in this document, please contact us - [mailto:info@ettus.com info@ettus.com].&lt;br /&gt;
&lt;br /&gt;
'''Will the USRP [https://www.ettus.com/product/details/UB200-KIT B200]/[https://www.ettus.com/product/details/UB210-KIT B210] work with USB 2.0?'''&lt;br /&gt;
&lt;br /&gt;
Yes, both the USRP B200 and USRP B210 will fall back to the USB 2.0 standard if a USB 3.0 port is not available. There are several things to consider. First, the USB 2.0 data rates are slower. Depending on the USB controller, operating system, and other factors, you may achieve a sample rate up to 8 MS/s with USB 2.0. Also, you may not be able to bus-power the USRP B200/B210 in USB 2.0 mode.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''What samples rates should I expect with USB 3.0? USB 2.0?'''&lt;br /&gt;
&lt;br /&gt;
The performance and throughput of USB 3.0 can vary between host controllers. Ettus Research recommends using the Intel Series 7, 8, and 9 USB controllers. In Linux, the command &amp;lt;code&amp;gt;lspci&amp;lt;/code&amp;gt; will show the USB controller on the system.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''When can I power the USRP B200/B210/B200mini off USB?'''&lt;br /&gt;
&lt;br /&gt;
The experience will vary across various controllers. Generally speaking, bus-power is ideal for SISO operation. If you are using both channels of a USRP B210 we recommend an external power supply. We [https://www.ettus.com/all-products/powersupply/ sell an external power supply that works with a variety of USRPs].&lt;br /&gt;
&lt;br /&gt;
MIMO operation with the USRP B210 is not recommended when using the USRP B210 on bus-power. It is also not recommended to run the B210 on bus-power if a GPS-disciplined oscillator is installed.&lt;br /&gt;
&lt;br /&gt;
'''How much power does the USRP consume?'''&lt;br /&gt;
&lt;br /&gt;
The table below shows power consumption (Watts) of a USRP B210 run with a 6V power supply. Figures on a 5V supply (USB power), or with a USRP B200 will be moderately lower. The sample rates shown are aggregate sample rates on the USB 3.0 interface.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&lt;br /&gt;
!5 Msps&lt;br /&gt;
!15.36 Msps&lt;br /&gt;
!30.72 Msps&lt;br /&gt;
!56 Msps&lt;br /&gt;
!61.44 Msps&lt;br /&gt;
|-&lt;br /&gt;
|1 RX&lt;br /&gt;
|1.92&lt;br /&gt;
|2.112&lt;br /&gt;
|2.184&lt;br /&gt;
|2.508&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|2 RX&lt;br /&gt;
|2.148&lt;br /&gt;
|2.436&lt;br /&gt;
|2.508&lt;br /&gt;
|2.64&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|1 TX&lt;br /&gt;
|2.184&lt;br /&gt;
|2.34&lt;br /&gt;
|2.352&lt;br /&gt;
|2.22&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|2 TX&lt;br /&gt;
|2.76&lt;br /&gt;
|2.88&lt;br /&gt;
|2.904&lt;br /&gt;
|2.64&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Full Duplex (1x1)&lt;br /&gt;
|2.508&lt;br /&gt;
|2.736&lt;br /&gt;
|2.796&lt;br /&gt;
|3.168&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|2x2 MIMO&lt;br /&gt;
|3.252&lt;br /&gt;
|3.588&lt;br /&gt;
|3.672&lt;br /&gt;
|4.11&lt;br /&gt;
|4.092&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Can I build a multi-unit system with the USRP B200/B210?'''&lt;br /&gt;
&lt;br /&gt;
It is possible to synchronize multiple USRP B200/B210 devices using the 10 MHz/1 PPS inputs and an external distribution system like to the OctoClock-G. However, [http://www.ettus.com/kb/detail/usrp-b200-and-b210-usb-30-streaming-rate-benchmarks USB 3.0/2.0 performance] varies dramatically when multiple devices are streaming through the same controller. Generally, we recommend using the USRP N200/N210 if you need to build a high-channel count system.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Can I access the source code for the USRP B200/B210?'''&lt;br /&gt;
&lt;br /&gt;
Yes. The USRP B200/B210 is supported by the USRP Hardware DriverTM software. You can find the driver and FPGA source code for the USRP B200/B210, and all other USRP models, in the UHD git repository:&lt;br /&gt;
&lt;br /&gt;
http://files.ettus.com/manual/page_build_guide.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''What operating systems does the USRP B200/B210 work on?'''&lt;br /&gt;
&lt;br /&gt;
The USRP B200/B210 is supported on [http://files.ettus.com/manual/page_install.html Linux, OSX (MacOSX / macOS) and Windows].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Does the USRP B200/B210 work with GNU Radio?'''&lt;br /&gt;
&lt;br /&gt;
Yes. The USRP B200/B210 work with our GNU Radio plugin - gr-uhd.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Does the USRP B200/B210 work with MATLAB and Simulink?'''&lt;br /&gt;
&lt;br /&gt;
Yes. You need to install the [http://www.mathworks.com/hardware-support/usrp.html Communications System Toolbox Support Package for USRP Radio].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Does the USRP B200/B210 work with OpenBTS?'''&lt;br /&gt;
&lt;br /&gt;
Yes. This is a third-party application and you can find instructions here: [http://wush.net/trac/rangepublic/wiki/BuildInstallRun OpenBTS - Build, Install, Run.]&lt;br /&gt;
&lt;br /&gt;
For support, please sign up and contact the [https://lists.sourceforge.net/lists/listinfo/openbts-discuss OpenBTS mailing list].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''What tools do I need to program the FPGA?'''&lt;br /&gt;
&lt;br /&gt;
The USRP [https://www.ettus.com/product/details/UB200-KIT B200] and USRP [https://www.ettus.com/product/details/UB210-KIT B210] include a Spartan 6 XC6SLX75 and XC6S150, respectively. The USRP B200 can be programmed with the free version of Xilinx tools, while the larger FPGA on the USRP B210 requires a licensed seat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Can I use a GPSDO with the USRP B200/B210?'''&lt;br /&gt;
&lt;br /&gt;
Ettus Research offers a [https://www.ettus.com/product/details/GPSDO-MINI Board-Mounted GPS-Disciplined OCXO] and a [https://www.ettus.com/product/details/GPSDO-TCXO-MODULE Board-Mounted GPS-Disciplined TCXO], which are compatible with the USRP B200/B210. These provide a high-accuracy XO, which can be disciplined to the global GPS standard. Please note: When the GPSDO OCXO model is integrated on the USRP B200/B210, the device should be powered with an external supply instead of USB bus power. The TCXO version can be USB bus powered.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=B200/B210/B200mini/B205mini/B206mini_Getting_Started_Guides&amp;diff=5413</id>
		<title>B200/B210/B200mini/B205mini/B206mini Getting Started Guides</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=B200/B210/B200mini/B205mini/B206mini_Getting_Started_Guides&amp;diff=5413"/>
				<updated>2022-05-20T22:08:46Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: Correct wrong RX max input power&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Kit Contents==&lt;br /&gt;
* USRP B200 / B210 / B200mini / B205mini&lt;br /&gt;
* USB 3.0 Cable&lt;br /&gt;
* Universal power supply (B210 only)&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
||[[File:Product b200.png|250px|center]] &lt;br /&gt;
||[[File:Product b210.png|250px|center]] &lt;br /&gt;
||[[File:Product b200 mini.png|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Verify the Contents of Your Kit==&lt;br /&gt;
Make sure that your kit contains all the items listed above. If any items are missing, please contact your sales agent or Ettus Research Technical support immediately.&lt;br /&gt;
&lt;br /&gt;
==You Will Need==&lt;br /&gt;
* A host computer with an available USB 2.0 or 3.0 port&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 easily cause the device to become non-functional. Listed below are some examples of actions which can 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 boards.&lt;br /&gt;
*Always use caution with FPGA, firmware, or software modifications.&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. Release 3.8.4 or later of the USRP Hardware Driver, UHD, is required. It is recommended to use the latest stable version of UHD that is available. &lt;br /&gt;
&lt;br /&gt;
If you have a USB stick with the [[Live SDR Environment]] installed on it, then you may boot your host computer from that. The LiveUSB SDR Environment does not require anything to be installed on your host computer, and contains a Linux-based environment with the UHD software and the GNU Radio framework already installed. More information about the [[Live SDR Environment]] is available at the [[Live SDR Environment Getting Started Guides]] page.&lt;br /&gt;
&lt;br /&gt;
==Connect the USRP to the Host Computer==&lt;br /&gt;
The included USB 3.0 cable provides power and data connectivity for the USRP Bus Series. The host-side of the cable must be plugged into either a USB 2.0 or 3.0 port. Note that the USB 2.0 link provides less bandwidth than the USB 3.0 link. Also note that an external DC power supply must be connected if using a GPSDO (B200/B210 only).&lt;br /&gt;
&lt;br /&gt;
==Test and Verify the Operation of the USRP==&lt;br /&gt;
Once the software tools are installed on the host computer, or using the [[Live SDR Environment]], verify the correct operation of the USRP by running the utility programs on the host computer. More information is available at the [[Verifying the Operation of the USRP Using UHD and GNU Radio]] Application Note.&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;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=RFNoC_4_Migration_Guide&amp;diff=5284</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=5284"/>
				<updated>2022-02-16T19:32:39Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: Updates for UHD 4.1 and fixing typos&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.1===&lt;br /&gt;
  git clone --branch UHD-4.1 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 the 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, for example the DDC and DUC blocks are usually statically connected to the radio block&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 callback 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    = 0;&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 [https://github.com/EttusResearch/uhd/tree/master/host/lib/rfnoc 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 the 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 are 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 the 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>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:migration_example.zip&amp;diff=5283</id>
		<title>File:migration example.zip</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:migration_example.zip&amp;diff=5283"/>
				<updated>2022-02-16T19:32:12Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: JonathonPendlum uploaded a new version of File:migration example.zip&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Example designs for RFNoC 4 Migration Guide&lt;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Knowledge_Base&amp;diff=5282</id>
		<title>Knowledge Base</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Knowledge_Base&amp;diff=5282"/>
				<updated>2022-02-16T18:47:13Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: /*  Getting Started Guides */&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 Getting Started Guides|B200/B210/B200mini/B205mini]]&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 Getting Started Guide|X410]]&lt;br /&gt;
&lt;br /&gt;
'''Daughterboards'''&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]]&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;
&lt;br /&gt;
'''Daughterboards'''&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;
* [[Getting_Started_with_RFNoC_in_UHD_4.0|RFNoC (UHD 4.x)]]&lt;br /&gt;
* [[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;
* [[Open Architecture For Radar and EW Research]]&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;
'''Software'''&lt;br /&gt;
* [http://files.ettus.com/manual/ 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;
* [http://files.ettus.com/manual/page_usrp_b200.html  B200/B210/B200mini/B205mini]&lt;br /&gt;
* [http://files.ettus.com/manual/page_usrp_x3x0.html X300/X310]&lt;br /&gt;
* [http://files.ettus.com/manual/page_usrp2.html N200/N210]&lt;br /&gt;
* [http://files.ettus.com/manual/page_usrp_n3xx.html N300/N310/N320/N321]&lt;br /&gt;
* [http://files.ettus.com/manual/page_usrp_e3xx.html E310/E312/E313/E320]&lt;br /&gt;
&lt;br /&gt;
'''Daughterboards'''&lt;br /&gt;
* [http://files.ettus.com/manual/page_dboards.html#dboards_basictx BasicRX/LFRX]&lt;br /&gt;
* [http://files.ettus.com/manual/page_dboards.html#dboards_basicrx BasicTX/LFTX]&lt;br /&gt;
* [http://files.ettus.com/manual/page_dboards.html#dboards_cbx CBX]&lt;br /&gt;
* [http://files.ettus.com/manual/page_dboards.html#dboards_sbx SBX]&lt;br /&gt;
* [http://files.ettus.com/manual/page_dboards.html#dboards_wbx WBX]&lt;br /&gt;
* [http://files.ettus.com/manual/page_dboards.html#dboards_ubx UBX]&lt;br /&gt;
* [http://files.ettus.com/manual/page_dboards.html#dboards_twinrx TwinRX]&lt;br /&gt;
&lt;br /&gt;
'''Other'''&lt;br /&gt;
* [http://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;
* [[Suggested Reading|Suggested Reading]]&lt;br /&gt;
* [[Suggested Videos|Suggested Videos]]&lt;br /&gt;
* [[SDR Events]]&lt;br /&gt;
* [[CGRAN]]&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;
* [[Slack|Slack]]&lt;br /&gt;
* [[Internet Relay Chat (IRC)|Internet Relay Chat (IRC)]]&lt;br /&gt;
* [[StackExchange|StackExchange]]&lt;br /&gt;
* [[Ordering and Fulfillment Help | Ordering and Fulfillment Help]]&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;
&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>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Mailing_Lists&amp;diff=5090</id>
		<title>Mailing Lists</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Mailing_Lists&amp;diff=5090"/>
				<updated>2021-03-18T18:30:59Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: Updated usrp mailing list URLs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== usrp-users ==&lt;br /&gt;
Discussions involving the USRP hardware and the UHD software itself are best addressed through the '''usrp-users''' mailing list at [https://lists.ettus.com/list/usrp-users.lists.ettus.com https://lists.ettus.com/list/usrp-users.lists.ettus.com].&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
The list archives can be found at [https://lists.ettus.com/empathy/list/usrp-users.lists.ettus.com https://lists.ettus.com/empathy/list/usrp-users.lists.ettus.com].&lt;br /&gt;
&lt;br /&gt;
== discuss-gnuradio ==&lt;br /&gt;
&lt;br /&gt;
Discussions involving the use of [https://www.gnuradio.org GNU Radio] with USRP hardware and UHD software are best addressed through the '''discuss-gnuradio''' mailing list at [https://lists.gnu.org/mailman/listinfo/discuss-gnuradio https://lists.gnu.org/mailman/listinfo/discuss-gnuradio].&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
The list archives can be found at [http://lists.gnu.org/archive/html/discuss-gnuradio/ http://lists.gnu.org/archive/html/discuss-gnuradio/].&lt;br /&gt;
&lt;br /&gt;
== openbts-discuss ==&lt;br /&gt;
&lt;br /&gt;
Discussions involving the use of [http://www.openbts.org OpenBTS®] with USRP hardware and UHD software are best addressed through the '''openbts-discuss''' mailing list at [https://lists.sourceforge.net/lists/listinfo/openbts-discuss https://lists.sourceforge.net/lists/listinfo/openbts-discuss].&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
The list archives can be found at [https://sourceforge.net/p/openbts/mailman/openbts-discuss/ https://sourceforge.net/p/openbts/mailman/openbts-discuss/].&lt;br /&gt;
&lt;br /&gt;
== srslte-users ==&lt;br /&gt;
&lt;br /&gt;
Discussions involving the use of [https://github.com/srsLTE/srsLTE srsLTE], from [https://www.softwareradiosystems.com/ Software Radio Systems], with USRP hardware and UHD software are best addressed through the '''srslte-users''' mailing list at [https://www.softwareradiosystems.com/mailman/listinfo/srslte-users https://www.softwareradiosystems.com/mailman/listinfo/srslte-users].&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
The list archives can be found at [https://www.softwareradiosystems.com/pipermail/srslte-users/ https://www.softwareradiosystems.com/pipermail/srslte-users/].&lt;br /&gt;
&lt;br /&gt;
== Open Air Interface (OAI) Mailing Lists ==&lt;br /&gt;
&lt;br /&gt;
Discussions involving the use of [https://www.openairinterface.org/ OAI] with USRP hardware and UHD software are best addressed through the their mailing list. Several mailing lists exist for OAI depending upon the subject, for a list of OAI mailing lists see the following links: &lt;br /&gt;
*[https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/AskQuestions https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/AskQuestions]&lt;br /&gt;
* [https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/MailingList https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/MailingList].&lt;br /&gt;
&lt;br /&gt;
The list archives can be found at the following links:&lt;br /&gt;
* [http://lists.eurecom.fr/sympa/arc/openair5g-user http://lists.eurecom.fr/sympa/arc/openair5g-user]&lt;br /&gt;
* [http://lists.eurecom.fr/sympa/arc/openair5g-devel http://lists.eurecom.fr/sympa/arc/openair5g-devel]&lt;br /&gt;
* [http://lists.eurecom.fr/sympa/arc/openaircn-user http://lists.eurecom.fr/sympa/arc/openaircn-user]&lt;br /&gt;
* [http://lists.eurecom.fr/sympa/arc/openaircn-devel http://lists.eurecom.fr/sympa/arc/openaircn-devel]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Technical Support]]&lt;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Application_Notes&amp;diff=5067</id>
		<title>Application Notes</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Application_Notes&amp;diff=5067"/>
				<updated>2020-12-29T21:35:45Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|Application Notes&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
! style=&amp;quot;text-align:center;&amp;quot;| Number&lt;br /&gt;
! style=&amp;quot;text-align:center;&amp;quot;| Title&lt;br /&gt;
! style=&amp;quot;text-align:center;&amp;quot;| Abstract&lt;br /&gt;
! style=&amp;quot;text-align:center;&amp;quot;| Author&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-445&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Building and Installing the USRP Open-Source Toolchain (UHD and GNU Radio) on Linux]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This AN provides a comprehensive step-by-step guide for building, installing, and maintaining the open-source toolchain, specifically UHD and GNU Radio, for the USRP from source code on the Linux platform. Other alternate installation methods are also discussed.&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| Neel Pandeya&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-788&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Building and Installing the USRP Open-Source Toolchain (UHD and GNU Radio) on OS X]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This AN provides a comprehensive step-by-step guide for building, installing, and maintaining the open-source toolchain, specifically UHD and GNU Radio, for the USRP from source code on the Mac OS X platform.&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;|Michael Dickens&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-666&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Mean Time Between Failure (MTBF) of USRPs and Daughterboards]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This AN provides information about the MTBF for USRPs and daughterboards&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;|Michael Dickens&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-111&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[UHD Device Eraser and Certificates of Volatility]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This AN provides an overview of the UHD Device Eraser utility as well as links to the Certificates of Volatility for all Ettus products.&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;|Michael Dickens&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-611&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Building and Installing the USRP Open Source Toolchain (UHD and GNU Radio) on Windows]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This AN provides a comprehensive step-by-step guide for building, installing, and maintaining the open-source toolchain, specifically UHD and GNU Radio, for the USRP from source code on the Windows platform.&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;|Derek Kozel&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-936&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Verifying the Operation of the USRP Using UHD and GNU Radio]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This AN explains how to use UHD and GNU Radio, once installed, to verify the correct operation of the USRP. Several test procedures are explained in detail. Several tests make use of an optional spectrum analyzer and signal generator.&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;|Neel Pandeya&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-561&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Implementation of a Simple FM Receiver in GNU Radio]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This AN shows a quick and simple implementation of an FM receiver for the USRP using GNU Radio. The goal is to easily demonstrate a practical application, and to verify that the USRP is functioning properly.&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;|Neel Pandeya&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-188&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Interrogating Passive Wireless SAW Sensors with the USRP]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| Typical interrogator design for wireless SAW sensor systems require many discrete components and lengthy build times, making it difficult to rapidly adapt to sensor designs in a research environment. We have employed the USRP B200 as a SAW sensor interrogation system. Interrogation of wideband orthogonal frequency coded (OFC) SAW sensors imposes strict requirements on the timing and synchronization of the transceiver. The USRP FPGA has been modified to operate in a synchronous, pulsed mode of operation, allowing rapid data acquisition and the full 56MHz bandwidth to be utilized. Data from the USRP is passed to a custom matched filter correlator routine to extract sensor parameters. The system is capable of interrogating multiple sensors, simultaneously. Demonstration of the system is accomplished by wirelessly interrogating SAW sensors at 915MHz and extracting temperature.&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;|Trip Humphries&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-322&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Experiments with the UBX Daughterboard in the HF Band]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| We show the results of experiments with the UBX daughtercard on an USRP X310 platform for use in the HF frequency range, from 1.8MHz to 30MHz. While the UBX is nominally rated for use only down to 10 MHz, with careful flow-graph design, and pre-filtering, it provides quite-good performance across the HF bands.&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;|Marcus Leech&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-363&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Implementation of an ADS-B/Mode-S Receiver in GNU Radio]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This AN guides the reader through the implementation of an ADS-B receiver using the gr-air-modes Out-of-Tree (OOT) module for GNU Radio. An explanation of ADS-B is also provided, and several real-world, over-the-air examples and profiled.&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;|Nate Temple&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-177&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[About USRP Bandwidths and Sampling Rates]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This AN provides insight into the topics of USRP architecture, system bandwidth, host interface throughput, and available sampling rates.&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;|Neel Pandeya &amp;lt;br&amp;gt; Nate Temple&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-881&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Selecting a USRP Device]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This AN explores the USRP family at a high level, compares devices across several primary features, and walks the reader through the process of selecting a particular device for the their application.&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;|Neel Pandeya &amp;lt;br&amp;gt; Nate Temple&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-492&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Selecting a RF Daughterboard]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This AN explores the RF daughterboards used by the N-series and X-series USRP devices at a high level, compares devices across several primary features, and walks the reader through the process of selecting a particular device for the their application.&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;|Neel Pandeya &amp;lt;br&amp;gt; Nate Temple&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-204&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Getting Started with UHD and C++]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This AN explains how to write and build C++ programs that use the UHD API and introduces&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;|Neel Pandeya &amp;lt;br&amp;gt; Nate Temple&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-117&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[GPSDO Selection Guide]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This AN explains how to select and use a GPSDO with the USRP B-, N-, and X-series devices.&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;|Neel Pandeya &amp;lt;br&amp;gt; Nate Temple&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-503&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Converting an X310 into an NI-USRP Rio]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This Application Note explains how to use an Ettus Research-branded USRP with LabVIEW, and in effect, convert it into an NI-USRP RIO.&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;|Tim Fountain&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-638&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Running UHD and GNU Radio on NI-USRP RIO]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This AN explains the process to updating your USRP-Rio to run UHD and GNU Radio. &lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;|Neel Pandeya &amp;lt;br&amp;gt; Nate Temple&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-882&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Synchronization and MIMO Capability with USRP Devices]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| Discusses the requirements for Multiple-In-Multiple-Out (MIMO) and phased-array systems. Summarizes the MIMO capability of each USRP device and daughterboard, and shows how to build MIMO systems with the USRP product family.&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;|Neel Pandeya &amp;lt;br&amp;gt; Nate Temple&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-309&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[About the Motherboard and Daughtercard EEPROM on USRP Devices]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This AN discusses the EEPROM storage on various USRP devices and daughtercards. This guides explains how to update the EEPROM contents and recover from EEPROM corruption. The product codes, which are also stored in the EEPROM, for all USRP devices and daughtercards are also given for reference.&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;|Trip Humphries&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-325&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[N200/N210 Device Recovery]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This application note covers the details of recovering your N200/N210.&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;|Neel Pandeya &amp;lt;br&amp;gt; Nate Temple&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-504&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[USRP N Series Quick Start (Daughterboard Installation)]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This application note is a detailed step-by-step guide to install a daughterboard into the USRP N200/N210.&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;|Neel Pandeya &amp;lt;br&amp;gt; Nate Temple&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-904&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[USRP X Series Quick Start (Daughterboard Installation)]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This application note is a detailed step-by-step guide to install a daughterboard into the USRP X300/X310.&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;|Neel Pandeya &amp;lt;br&amp;gt; Nate Temple&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-311&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Software Development on the E310 and E312]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This application note covers the software development process on the USRP E310 and E312. &lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;|Martin Braun&amp;lt;br&amp;gt;Nicolas Cuervo&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-296&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Using Dual 10 Gigabit Ethernet on the USRP X300/X310]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This short guide is meant to help in quickly setting up an X-series USRP for use over two 10 Gigabit Ethernet links simultaneously. &lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;|Paul David&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-823&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Getting Started with RFNoC Development]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This application note gives a brief introduction into the steps required to start developing RFNoC blocks on your computer with UHD 3. &lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;|Martin Braun&amp;lt;br&amp;gt;Nicolas Cuervo&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-178&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Resolving Audio Codec Enumeration Issues On The E31x]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This application note covers Resolving Audio Codec Enumeration Issues On The E31x. &lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;|Logan Fagg&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-244&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Direction Finding with the USRP™ X-Series and TwinRX™]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This application note covers using the USRP™ TwinRX™ daughterboard in a direction find application using the MUSIC algorithm. &lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;|Srikanth Pagadarai&amp;lt;br&amp;gt;Travis Collins&amp;lt;br&amp;gt;Alexander M. Wyglinski&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-335&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Streaming processed data from the E31x with GNU Radio and ZMQ]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This application note will demonstrate using the USRP E310 to remotely stream processed data to a host machine.  &lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| Nate Temple&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-121&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Debugging FPGA images]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This application note covers the basics to get you through the process of probing the signals inside an FPGA. In order to accomplish that, we will review briefly the 'Xilinx ChipScope Analyzer' and will apply it to one of our core RFNoC blocks: the RFNoC Signal generator. &lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;|Nicolas Cuervo&amp;lt;br&amp;gt;Sugandha Gupta &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-732&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[USRP E312 Battery Replacement Instructions]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This application note covers replacing the battery cell inside the USRP E312.  &lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| Robin Coxe&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-305&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[X300/X310 Device Recovery]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This application note covers the details of recovering the USRP X300/X310 via JTAG.   &lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| Nate Temple&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-832&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Mapping Between ER-USRP and NI-USRP Product Numbers]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This application note covers the details of the mapping between Ettus Research USRP and National Instruments USRP product numbers.    &lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| Nate Temple&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-315&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Software Development on the E3xx USRP - Building RFNoC UHD / GNU Radio / gr-ettus from Source]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This application note is one of a multi-part series which will cover the software development process on the USRP E310, E312 and E313. It will cover building the rfnoc-devel branch of UHD, GNU Radio and gr-ettus from source for the host machine, and cross-compiling the rfnoc-devel branch of UHD, GNU Radio and gr-ettus for the E3xx USRP.   &lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| Nate Temple&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-142&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Transmitting DVB-S2 with GNU Radio and an USRP B210]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This application note will demonstrate using an USRP B210 and the GNU Radio DTV example flowgraph to transmit a DVB-S2 video stream to an off-the-shelf satellite receiver.    &lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| Nate Temple&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-158&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Using Ethernet-Based Synchronization on the USRP™ N3xx Devices]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This application note provides instructions for synchronizing multiple USRP N3xx devices using White Rabbit Ethernet-based synchronization.    &lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| Dan Baker&lt;br /&gt;
Wan Liu &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-642&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Using the RFNoC Replay Block]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This application note guides a user through basic use of the RFNoC Replay block and explains how to run the UHD Replay example. This example covers use on the X300/X310 and N310 products.  &lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| Wade Fife&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-630&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Writing the USRP File System Disk Image to a SD Card]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This application note will provide step-by-step instructions on writing a file system disk image to a SD card using Linux.   &lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| Nate Temple&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-524&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Building and Installing UHD and GNU Radio in an Offline Environment]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This application note will provide step-by-step instructions on building and installing UHD and GNU Radio in an offline environment. &lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| Nate Temple&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-525&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Building and Installing UHD and GNU Radio to a Custom Prefix]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This application note provides step-by-step instructions on building and installing UHD and GNU Radio to a local directory. &lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| Nate Temple&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-725&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[USRP N320/N321 LO Distribution]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This application note provides an overview of using the LO Distribution of the N320/N321 USRPs.&lt;br /&gt;
 &lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| Brian Avenell 	&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-452&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[5G NR EVM Measurements with the USRP N320/N321]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| Example EVM measurements are shown using the USRP N320/N321 receiver and the 5G New Radio (5G NR) modulation standard. The use of I/Q image calibration and spur-dodging are demonstrated as methods to improve EVM performance. &lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| Drew Fischer&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-620&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Troubleshooting X300/X310 Device Discovery Issues]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| Troubleshooting guide to intended to cover some of the most commonly recommended steps to enable USRP connectivity. &lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| Sam Reiter&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-088&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[USRP Host Performance Tuning Tips and Tricks]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This application note provides various tips and tricks for tuning your host computer for best performance when working with USRP devices. &lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| Nate Temple&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-355&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Modifying an X310 Chassis for External LO Sharing]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This document describes how to modify an X310 chassis to wire the LO out of the back plate. Doing this will allow the user to export and import an LO signal as desired when using a compatible daughterboard such as the TwinRX. &lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| Sam Reiter&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-500&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Getting Started with DPDK and UHD]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This application note walks through the process to get started with the Data Plane Development Kit (DPDK) driver within UHD. &lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| Nate Temple&lt;br /&gt;
Alex Williams&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-800&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Enabling Ethernet Connectivity on Octoclock and Octoclock-G]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This document supplements the UHD Manual's guide for updating the Octoclock bootloader to allow for Ethernet communications with the device. &lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| Sam Reiter&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-621&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Troubleshooting N310/N320 Device Discovery Issues]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| Troubleshooting guide to intended to cover some of the most commonly recommended steps to enable USRP connectivity. Serves as a supplement to the N3xx getting started guide. &lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| Sam Reiter&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-883&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Synchronizing USRP Events Using Timed Commands in UHD]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| Guide to cover common USRP synchronization scenarios and deep-dive into the use of timed commands within USRPs. &lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| Sam Reiter&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-400&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[Getting Started with RFNoC in UHD 4.0]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| This AN describes how use RFNoC in UHD 4.0, including building FPGA images for RFNoC, changing which blocks are included in the build, and creating your own RFNoC blocks.&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| Sugandha Gupta&amp;lt;br&amp;gt;Brent Stapleton&amp;lt;br&amp;gt;Wade Fife &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| AN-401&lt;br /&gt;
|style=&amp;quot;width: 30%;&amp;quot;| [[RFNoC 4 Migration Guide]]&lt;br /&gt;
|style=&amp;quot;width: 50%;&amp;quot;| Guide on how to migrate RFNoC blocks written for RFNoC 3 to RFNoC 4.&lt;br /&gt;
|style=&amp;quot;width: 10%; text-align: center;&amp;quot;| Jonathon Pendlum&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=RFNoC_4_Migration_Guide&amp;diff=5066</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=5066"/>
				<updated>2020-12-29T08:39:02Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: &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;
  git cmake g++ libboost-all-dev libgmp-dev swig \&lt;br /&gt;
  python3-numpy python3-mako python3-sphinx python3-lxml \&lt;br /&gt;
  doxygen libfftw3-dev libsdl1.2-dev libgsl-dev libqwt-qt5-dev \&lt;br /&gt;
  libqt5opengl5-dev python3-pyqt5 liblog4cpp5-dev libzmq3-dev \&lt;br /&gt;
  python3-yaml python3-click python3-click-plugins python3-zmq \&lt;br /&gt;
  python3-scipy python3-gi python3-gi-cairo gobject-introspection \&lt;br /&gt;
  gir1.2-gtk-3.0 build-essential libusb-1.0-0-dev python3-docutils \&lt;br /&gt;
  python3-setuptools python3-ruamel.yaml python-is-python3 \&lt;br /&gt;
  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 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>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:migration_example.zip&amp;diff=5065</id>
		<title>File:migration example.zip</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:migration_example.zip&amp;diff=5065"/>
				<updated>2020-12-29T08:19:59Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: Example designs for RFNoC 4 Migration Guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Example designs for RFNoC 4 Migration Guide&lt;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=RFNoC_4_Migration_Guide&amp;diff=5064</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=5064"/>
				<updated>2020-12-29T08:06:04Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: Created page with &amp;quot;=Abstract=  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 f...&amp;quot;&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;
  git cmake g++ libboost-all-dev libgmp-dev swig \&lt;br /&gt;
  python3-numpy python3-mako python3-sphinx python3-lxml \&lt;br /&gt;
  doxygen libfftw3-dev libsdl1.2-dev libgsl-dev libqwt-qt5-dev \&lt;br /&gt;
  libqt5opengl5-dev python3-pyqt5 liblog4cpp5-dev libzmq3-dev \&lt;br /&gt;
  python3-yaml python3-click python3-click-plugins python3-zmq \&lt;br /&gt;
  python3-scipy python3-gi python3-gi-cairo gobject-introspection \&lt;br /&gt;
  gir1.2-gtk-3.0 build-essential libusb-1.0-0-dev python3-docutils \&lt;br /&gt;
  python3-setuptools python3-ruamel.yaml python-is-python3 \&lt;br /&gt;
  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 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;
Attached to this article is a ZIP file called '''''migration_example.zip'''''. This archive contains equivalent RFNoC 3 and RFNoC 4 versions of a RFNoC Block implementing digital gain. The following sections begin with outlining what files were updating during this example migration.&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>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:rx_tx_streamer.png&amp;diff=5063</id>
		<title>File:rx tx streamer.png</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:rx_tx_streamer.png&amp;diff=5063"/>
				<updated>2020-12-29T07:59:55Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: Diagram for RFNoC 4 Migration Guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diagram for RFNoC 4 Migration Guide&lt;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:rfnoc4_workshop_slides_2020_part_2.pdf&amp;diff=5055</id>
		<title>File:rfnoc4 workshop slides 2020 part 2.pdf</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:rfnoc4_workshop_slides_2020_part_2.pdf&amp;diff=5055"/>
				<updated>2020-12-16T05:17:16Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: RFNoC4 slides presented at GRCon 2020. Part 2 of 2.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;RFNoC4 slides presented at GRCon 2020. Part 2 of 2.&lt;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:rfnoc4_workshop_slides_2020_part_1.pdf&amp;diff=5054</id>
		<title>File:rfnoc4 workshop slides 2020 part 1.pdf</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:rfnoc4_workshop_slides_2020_part_1.pdf&amp;diff=5054"/>
				<updated>2020-12-16T05:13:05Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: RFNoC4 slides presented at GRCon 2020. Part 1 of 2.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;RFNoC4 slides presented at GRCon 2020. Part 1 of 2.&lt;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:rfnoc3_workshop_slides_202008_part_2.pdf&amp;diff=5053</id>
		<title>File:rfnoc3 workshop slides 202008 part 2.pdf</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:rfnoc3_workshop_slides_202008_part_2.pdf&amp;diff=5053"/>
				<updated>2020-12-16T05:05:21Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: RFNoC3 slides presented at NEWSDR 2020. This is the final revision of these slides as RFNoC4 has been released. Part 2 of 2.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;RFNoC3 slides presented at NEWSDR 2020. This is the final revision of these slides as RFNoC4 has been released. Part 2 of 2.&lt;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:rfnoc3_workshop_slides_202008_part_1.pdf&amp;diff=5052</id>
		<title>File:rfnoc3 workshop slides 202008 part 1.pdf</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:rfnoc3_workshop_slides_202008_part_1.pdf&amp;diff=5052"/>
				<updated>2020-12-16T05:03:37Z</updated>
		
		<summary type="html">&lt;p&gt;JonathonPendlum: RFNoC3 slides presented at NEWSDR 2020. This is the final revision of these slides as RFNoC4 has been released. Part 1 of 2.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;RFNoC3 slides presented at NEWSDR 2020. This is the final revision of these slides as RFNoC4 has been released. Part 1 of 2.&lt;/div&gt;</summary>
		<author><name>JonathonPendlum</name></author>	</entry>

	</feed>