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

	<entry>
		<id>https://kb.ettus.com/index.php?title=Running_UHD_and_GNU_Radio_on_NI_USRP-RIO&amp;diff=3745</id>
		<title>Running UHD and GNU Radio on NI USRP-RIO</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Running_UHD_and_GNU_Radio_on_NI_USRP-RIO&amp;diff=3745"/>
				<updated>2018-04-17T15:08:02Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: /* Flashing FPGA Image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Application Note Number==&lt;br /&gt;
'''AN-638'''&lt;br /&gt;
&lt;br /&gt;
==Revision History==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Author&lt;br /&gt;
!Details&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2016-05-01   &lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Neel Pandeya&amp;lt;br&amp;gt; Nate Temple &lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Initial creation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This AN explains the process to updating your USRP-Rio to run UHD and GNU Radio.&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
This application note will cover the details of converting your NI-USRP RIO into an equivalent X300/X310 USRP. Once it is converted into a X300/X310, you will be able to use the UHD API, GNU Radio and RFNoC as you would a Ettus Research USRP.&lt;br /&gt;
&lt;br /&gt;
==Warning==&lt;br /&gt;
Opening the chassis and changing the daughterboards will void your NI warranty. NI will not be able to provide support for UHD, GNU Radio, or RFNoC. Support questions should be directed to the [[Mailing Lists|usrp-users]] and [[Mailing Lists|discuss-gnuradio]] mailing lists or to [mailto:support@ettus.com support@ettus.com].&lt;br /&gt;
&lt;br /&gt;
==Prerequisites==&lt;br /&gt;
This guide assumes that your USRP-Rio already has a valid IP address, and that you can ping the device. &lt;br /&gt;
&lt;br /&gt;
==Installing UHD==&lt;br /&gt;
You will need to install UHD 3.9.4 on to your host system. For more information on installing UHD, please see 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;
==Downloading FPGA Images==&lt;br /&gt;
After UHD is installed, run the following command to download the corresponding FPGA images.&lt;br /&gt;
&lt;br /&gt;
    sudo uhd_images_downloader&lt;br /&gt;
&lt;br /&gt;
==Flashing FPGA Image==&lt;br /&gt;
Once the FPGA images are downloaded, you are ready to flash the FPGA image with the following command. Note, you will need to update the IP address of the USRP-Rio and the path to the FPGA image in the following command. Ensure power to the USRP-Rio and host computer is not interrupted during the flashing process. You will need to update the IP Address and FPGA Path in the following command.&lt;br /&gt;
&lt;br /&gt;
If you are loading it via Ethernet:&lt;br /&gt;
    Automatic FPGA path, detect image type:&lt;br /&gt;
    uhd_image_loader --args=&amp;quot;type=x300,addr=&amp;lt;IP address&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
If you are using PCI Express, then:&lt;br /&gt;
    Automatic FPGA path, detect image type:&lt;br /&gt;
    uhd_image_loader --args=&amp;quot;type=x300,resource=&amp;lt;NI-RIO resource&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Further information regarding the way to load FPGA images into the X3X0 device can be found in our [https://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_flash manual page]&lt;br /&gt;
&lt;br /&gt;
Once the FPGA burner utility is completed, power cycle the USRP-Rio.&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
After you power cycle the USRP-Rio, test it with the following command.&lt;br /&gt;
&lt;br /&gt;
    uhd_usrp_probe&lt;br /&gt;
&lt;br /&gt;
==Installing GNU Radio==&lt;br /&gt;
For details instructions on installing GNU Radio, please reference the GNU Radio section of 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]] and [[Building and Installing the USRP Open-Source Toolchain (UHD and GNU Radio) on OS X|OS X]] Application Notes.&lt;br /&gt;
&lt;br /&gt;
==Testing GNU Radio==&lt;br /&gt;
Once GNU Radio is installed, you can test the operation of the USRP-Rio with the following utility.&lt;br /&gt;
&lt;br /&gt;
    uhd_fft&lt;br /&gt;
&lt;br /&gt;
For a more detailed and through testing procedure, please see the [[Verifying the Operation of the USRP Using UHD and GNU Radio]] Application Note. &lt;br /&gt;
&lt;br /&gt;
==RFNoC==&lt;br /&gt;
For detailed instructions on setting up RFNoC, please see the [[RFNoC Getting Started Guides]] page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Application Notes]]&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Building_and_Installing_the_USRP_Open-Source_Toolchain_(UHD_and_GNU_Radio)_on_Linux&amp;diff=3738</id>
		<title>Building and Installing the USRP Open-Source Toolchain (UHD and GNU Radio) on Linux</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Building_and_Installing_the_USRP_Open-Source_Toolchain_(UHD_and_GNU_Radio)_on_Linux&amp;diff=3738"/>
				<updated>2018-04-13T16:07:29Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: /* Building and installing GNU Radio from source code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Application Note Number==&lt;br /&gt;
'''AN-445'''&lt;br /&gt;
&lt;br /&gt;
==Revision History==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Author&lt;br /&gt;
!Details&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2016-05-01   &lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Neel Pandeya &lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Initial creation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This Application Note provides a comprehensive guide for building, installing, and maintaining the open-source toolchain for the USRP (UHD and GNU Radio) from source code on the Linux platform. The Ubuntu and Fedora distributions are specifically discussed. Several other alternate installation methods are also discussed.&lt;br /&gt;
&lt;br /&gt;
http://files.ettus.com/manual/page_build_guide.html#build_instructions_unix&lt;br /&gt;
&lt;br /&gt;
==UHD on Linux==&lt;br /&gt;
&lt;br /&gt;
UHD is fully supported on Linux, using the GCC compiler, and should work on most major Linux distributions.&lt;br /&gt;
&lt;br /&gt;
==Devices==&lt;br /&gt;
This document applies only to the USRP X300, X310, B200, B210, B200mini, N200, N210 devices. The E310 and E312 devices are embedded devices, and are fundamentally different from the other non-embedded USRP devices, and are not addressed by this document.&lt;br /&gt;
&lt;br /&gt;
==Using a Virtual Machine (VM)==&lt;br /&gt;
UHD may be installed and run within a Virtual Machine (VM), such as VMware and VirtualBox. There are some special issues to address when running UHD within a VM, and these are discussed in a separate Application Note. If you are using VirtualBox, we recommend using version 5.x.&lt;br /&gt;
&lt;br /&gt;
==Install Linux==&lt;br /&gt;
&lt;br /&gt;
If you already have a recent version of Linux installed, then you may be able to skip this section. If you are starting from scratch, or simply want to start with a fresh new installation of Linux, then please follow the instructions and recommendations in this section.&lt;br /&gt;
&lt;br /&gt;
We suggest that you use either Ubuntu 14.04, Ubuntu 16.04, Ubuntu 17.04, Fedora 21, Fedora 22, Fedora 23, Fedora 24, Fedora 25 and that you use a 64-bit architecture, not a 32-bit architecture. There are several re-spins of Ubuntu, such as Xubuntu, Lubuntu, Kubuntu, Linux Mint, all of which should also work. For the purposes of this document, these re-spins can be considered equivalent. Other recent versions of Ubuntu such as 14.10, 15.04, 15.10 should also work. Both Ubuntu and Fedora are known to work well with UHD and GNU Radio.&lt;br /&gt;
&lt;br /&gt;
Download and install Ubuntu, Xubuntu, Linux Mint, or Fedora from the links below. Download the appropriate ISO image, and write it to a USB flash drive. Be sure to verify that the ISO file was not corrupted during the download process by checking the MD5 and/or SHA1 hash.&lt;br /&gt;
&lt;br /&gt;
* [http://www.ubuntu.com/download/desktop Ubuntu download page]&lt;br /&gt;
* [http://www.xubuntu.org/getxubuntu/ Xubuntu download page]&lt;br /&gt;
* [https://www.linuxmint.com/download.php Linux Mint download page]&lt;br /&gt;
* [https://getfedora.org/en/workstation/download/ Fedora download page]&lt;br /&gt;
&lt;br /&gt;
You can learn more about Ubuntu, Xubuntu, Linux Mint, and Fedora at the links below.&lt;br /&gt;
&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Ubuntu_%28operating_system%29 Wikipedia article on Ubuntu]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Xubuntu Wikipedia article on Xubuntu]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Linux_Mint Wikipedia article on Linux Mint]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Fedora_%28operating_system%29 Wikipedia article on Fedora]&lt;br /&gt;
&lt;br /&gt;
There are many tools for writing an ISO image to a USB flash drive. In Linux, you can use the &amp;quot;dd&amp;quot; utility, or the UNetbootin utility. On Ubuntu systems, there is also the Startup Disk Creator utility as well.&lt;br /&gt;
&lt;br /&gt;
* [http://unetbootin.sourceforge.net/ UNetbootin homepage]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/UNetbootin Wikipedia article on UNetbootin]&lt;br /&gt;
&lt;br /&gt;
* [https://launchpad.net/usb-creator Startup Disk Creator homepage]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Startup_Disk_Creator Wikipedia article on Startup Disk Creator]&lt;br /&gt;
* [http://www.ubuntu.com/download/desktop/create-a-usb-stick-on-ubuntu Article about Startup Disk Creator]&lt;br /&gt;
&lt;br /&gt;
Be sure to use a USB flash drive with at least 8 GB capacity, and use a USB 3.0 flash drive, not a USB 2.0 flash drive. If you use a slower USB 2.0 flash drive, then the install process will take significantly longer.&lt;br /&gt;
&lt;br /&gt;
==Update and Install dependencies==&lt;br /&gt;
&lt;br /&gt;
Before building UHD and GNU Radio, you need to make sure that all the dependencies are first installed.&lt;br /&gt;
&lt;br /&gt;
However, before installing any dependencies, you should first make sure that all the packages that are already installed on your system are up-to-date. You can do this from a GUI, or from the command-line, as shown below.&lt;br /&gt;
&lt;br /&gt;
On Ubuntu systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get update&lt;br /&gt;
&lt;br /&gt;
On Fedora 21 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo yum update&lt;br /&gt;
&lt;br /&gt;
On Fedora 22, 23, 24 and 25 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo dnf update&lt;br /&gt;
&lt;br /&gt;
Once the system has been updated, then install the required dependencies for UHD and GNU Radio.&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 17.04 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-1.13-0v5 libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libqwt6abi1 libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev libncurses5-dbg libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-dev libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk3.0 git-core libqt4-dev python-numpy ccache python-opengl libgsl-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwt5-qt4-dev libqwtplot3d-qt4-dev pyqt4-dev-tools python-qwt5-qt4 cmake git-core wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq3-dev libzmq5 python-requests python-sphinx libcomedi-dev python-zmq&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 16.04 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-1.13-0v5 libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libqwt6abi1 libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev libncurses5-dbg libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-dev libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk3.0 git-core libqt4-dev python-numpy ccache python-opengl libgsl-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwt5-qt4-dev libqwtplot3d-qt4-dev pyqt4-dev-tools python-qwt5-qt4 cmake git-core wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq-dev libzmq1 python-requests python-sphinx libcomedi-dev python-zmq&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 15.04 and 15.10 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libqwt6 libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev  libncurses5-dbg libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-1.13-0v5 libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk2.8 git-core libqt4-dev python-numpy ccache python-opengl libgsl0-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwt5-qt4-dev libqwtplot3d-qt4-dev pyqt4-dev-tools python-qwt5-qt4 cmake git-core wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq-dev libzmq1 python-requests python-sphinx libcomedi-dev python-zmq&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 14.04 and 14.10 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-1.13-0 libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev libncurses5-dbg   libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-dev libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk2.8 git-core libqt4-dev python-numpy ccache python-opengl libgsl0-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwt5-qt4-dev libqwtplot3d-qt4-dev pyqt4-dev-tools python-qwt5-qt4 cmake git-core wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq1 libzmq-dev python-requests python-sphinx libcomedi-dev&lt;br /&gt;
&lt;br /&gt;
On Fedora 21 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo yum -y groupinstall &amp;quot;Engineering and Scientific&amp;quot; &amp;quot;Development Tools&amp;quot; &amp;quot;Software Development Tools&amp;quot; &amp;quot;C Development Tools and Libraries&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    sudo yum -y install fftw-devel cppunit-devel wxPython-devel boost-devel alsa-lib-devel numpy gsl-devel python-devel pygsl python-cheetah python-mako python-lxml PyOpenGL qt-devel qt qt4 qt4-devel PyQt4-devel qwt-devel qwtplot3d-qt4-devel libusbx-devel cmake git wget python-docutils cppzmq-devel PyQwt PyQwt-devel qwt-devel gtk2-engines xmlrpc-c-&amp;quot;*&amp;quot; tkinter orc orc-devel python-sphinx SDL-devel swig  zeromq2-devel python-zmq comedilib comedilib-devel thrift-devel python-thrift scipy zeromq zeromq-devel&lt;br /&gt;
			  &lt;br /&gt;
On Fedora 22, 23, 24 and 25 systems, run:&lt;br /&gt;
&lt;br /&gt;
    sudo dnf -y groupinstall &amp;quot;Engineering and Scientific&amp;quot; &amp;quot;Development Tools&amp;quot; &amp;quot;C Development Tools and Libraries&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
    sudo dnf -y install fftw-devel cppunit-devel wxPython-devel boost-devel alsa-lib-devel numpy gsl-devel python-devel pygsl python-cheetah python-mako python-lxml PyOpenGL qt-devel PyQt4-devel qwt-devel qwtplot3d-qt4-devel libusbx-devel cmake python-docutils PyQwt PyQwt-devel gtk2-engines xmlrpc-c-&amp;quot;*&amp;quot; tkinter orc-devel python-sphinx SDL-devel swig perl-ZMQ-LibZMQ2 perl-ZMQ-LibZMQ2 zeromq zeromq-devel python-requests gcc-c++ doxygen zeromq-ada-devel cppzmq-devel perl-ZeroMQ amavisd-new-zeromq amavisd-new-snmp-zeromq php-zmq python-zmq czmq uwsgi-logger-zeromq comedilib comedilib-devel pygtk2 ncurses-&amp;quot;*&amp;quot; thrift-devel python-thrift scipy&lt;br /&gt;
&lt;br /&gt;
After installing the dependencies, you should reboot the system.&lt;br /&gt;
&lt;br /&gt;
If the installation of the dependencies completes without any errors, then you can proceed to build and install UHD and GNU Radio.&lt;br /&gt;
&lt;br /&gt;
==Building and installing UHD from source code==&lt;br /&gt;
&lt;br /&gt;
UHD is open-source, and is hosted on GitHub. You can browse the code online at the link below, which points to version 3.10.1.0, which is the the latest release at the time of this writing.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/EttusResearch/uhd/tree/release_003_010_001_000 UHD repository on GitHub]&lt;br /&gt;
&lt;br /&gt;
There are several good reasons to build GNU Radio from source code, especially for doing development and prototyping. It it enables an easy way to customize the location of the installation, and to install multiple UHD versions in parallel, and switch between them. It also provides much more flexibility in upgrading and downgrading versions, and allows the user to modify the code and create customized versions, which could possibly include a patch or other bug-fix.&lt;br /&gt;
&lt;br /&gt;
To build UHD from source code, clone the GitHub repository, check out a branch or tagged release of the repository, and build and install. Please follow the steps below. Make sure that no USRP device is connected to the system at this point.&lt;br /&gt;
&lt;br /&gt;
First, make a folder to hold the repository.&lt;br /&gt;
&lt;br /&gt;
    cd $HOME&lt;br /&gt;
    mkdir workarea-uhd&lt;br /&gt;
    cd workarea-uhd&lt;br /&gt;
&lt;br /&gt;
Next, clone the repository and change into the cloned directory.&lt;br /&gt;
&lt;br /&gt;
    git clone https://github.com/EttusResearch/uhd&lt;br /&gt;
    cd uhd&lt;br /&gt;
&lt;br /&gt;
Next, checkout the desired UHD version. You can get a full listing of tagged releases by running the command:&lt;br /&gt;
&lt;br /&gt;
    git tag -l&lt;br /&gt;
&lt;br /&gt;
''Example truncated output of &amp;lt;code&amp;gt;git tag -l&amp;lt;/code&amp;gt;:''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git tag -l&lt;br /&gt;
...&lt;br /&gt;
release_003_009_004&lt;br /&gt;
release_003_009_005&lt;br /&gt;
release_003_010_000_000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note''': As of UHD Version 3.10.0.0, the versioning scheme has changed to be a quadruplet format. Each element and version will follow the format of: '''Major.API.ABI.Patch'''. Additional details on this versioning change can be found [https://files.ettus.com/manual/page_semver.html here]. &lt;br /&gt;
&lt;br /&gt;
After identifying the version and corresponding release tag you need, check it out:&lt;br /&gt;
&lt;br /&gt;
    # Example: For UHD 3.9.5:&lt;br /&gt;
    git checkout release_003_009_005&lt;br /&gt;
&lt;br /&gt;
    # Example: For UHD 3.10.1.0: &lt;br /&gt;
    git checkout release_003_010_001_000&lt;br /&gt;
&lt;br /&gt;
Next, create a build folder within the repository.&lt;br /&gt;
&lt;br /&gt;
    cd host&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
&lt;br /&gt;
Next, invoke CMake to create the Makefiles.&lt;br /&gt;
&lt;br /&gt;
    cmake ../&lt;br /&gt;
&lt;br /&gt;
Next, run Make to build UHD.&lt;br /&gt;
&lt;br /&gt;
    make&lt;br /&gt;
&lt;br /&gt;
Next, you can optionally run some basic tests to verify that the build process completed properly.&lt;br /&gt;
&lt;br /&gt;
    make test&lt;br /&gt;
&lt;br /&gt;
Next, install UHD, using the default install prefix, which will install UHD under the /usr/local/lib folder. You need to run this as root due to the permissions on that folder.&lt;br /&gt;
&lt;br /&gt;
    sudo make install&lt;br /&gt;
&lt;br /&gt;
Next, update the system's shared library cache.&lt;br /&gt;
&lt;br /&gt;
    sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Finally, make sure that the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable is defined and includes the folder under which UHD was installed. Most commonly, you can add the line below to the end of your &amp;lt;code&amp;gt;$HOME/.bashrc&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&lt;br /&gt;
    export LD_LIBRARY_PATH=/usr/local/lib&lt;br /&gt;
&lt;br /&gt;
On Fedora 22/23/24/25 you will need to set the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/usr/local/lib64&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    export LD_LIBRARY_PATH=/usr/local/lib64&lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable is already defined with other folders in your &amp;lt;code&amp;gt;$HOME/.bashrc&amp;lt;/code&amp;gt; file, then add the line below to the end of your &amp;lt;code&amp;gt;$HOME/.bashrc&amp;lt;/code&amp;gt; file to preserve the current settings.&lt;br /&gt;
 &lt;br /&gt;
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib&lt;br /&gt;
&lt;br /&gt;
For Fedora 21/22/23/24/25&lt;br /&gt;
&lt;br /&gt;
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64&lt;br /&gt;
&lt;br /&gt;
For this change to take effect, you will need to close the current terminal window, and open a new terminal.&lt;br /&gt;
&lt;br /&gt;
At this point, UHD should be installed and ready to use. You can quickly test this, with no USRP device attached, by running &amp;lt;code&amp;gt;uhd_find_devices&amp;lt;/code&amp;gt;. You should see something similar to the following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
linux; GNU C++ version 4.8.4; Boost_105400; UHD_003.010.000.HEAD-0-g6e1ac3fc&lt;br /&gt;
&lt;br /&gt;
No UHD Devices Found&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Building and installing GNU Radio from source code==&lt;br /&gt;
&lt;br /&gt;
As with UHD, GNU Radio is open-source and is hosted on GitHub. You can browse the code online at the link below, which points to version 3.7.10.1, which is the the latest release at the time of this writing.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/gnuradio/gnuradio/tree/v3.7.10.1 GNU Radio repository on GitHub]&lt;br /&gt;
&lt;br /&gt;
As with UHD, there are several good reasons to build GNU Radio from source code, especially for doing development and prototyping. It it enables an easy way to customize the location of the installation, and to install multiple GNU Radio versions in parallel, and switch between them. It also provides much more flexibility in upgrading and downgrading versions, and allows the user to modify the code and create customized versions, which could possibly include a patch or other bug-fix.&lt;br /&gt;
&lt;br /&gt;
Similar to the process for UHD, to build GNU Radio from source code, clone the GitHub repository, check out a branch or tagged release of the repository, and build and install. Please follow the steps below. Make sure that no USRP device is connected to the system at this point.&lt;br /&gt;
&lt;br /&gt;
First, make a folder to hold the repository.&lt;br /&gt;
&lt;br /&gt;
    cd $HOME&lt;br /&gt;
    mkdir workarea-gnuradio&lt;br /&gt;
    cd workarea-gnuradio&lt;br /&gt;
&lt;br /&gt;
Next, clone the repository.&lt;br /&gt;
&lt;br /&gt;
    git clone --recursive https://github.com/gnuradio/gnuradio&lt;br /&gt;
&lt;br /&gt;
Next, go into the repository and check out the desired GNU Radio version.&lt;br /&gt;
&lt;br /&gt;
    cd gnuradio&lt;br /&gt;
    git checkout v3.7.10.1&lt;br /&gt;
    git submodule update --init --recursive&lt;br /&gt;
&lt;br /&gt;
Next, create a build folder within the repository.&lt;br /&gt;
&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
&lt;br /&gt;
Next, invoke CMake to create the Makefiles.&lt;br /&gt;
&lt;br /&gt;
    cmake ../&lt;br /&gt;
&lt;br /&gt;
Next, run Make to build GNU Radio.&lt;br /&gt;
&lt;br /&gt;
    make&lt;br /&gt;
&lt;br /&gt;
Next, you can optionally run some basic tests to verify that the build process completed properly.&lt;br /&gt;
&lt;br /&gt;
    make test&lt;br /&gt;
&lt;br /&gt;
Next, install GNU Radio, using the default install prefix, which will install GNU Radio under the /usr/local/lib folder. You need to run this as root due to the permissions on that folder.&lt;br /&gt;
&lt;br /&gt;
    sudo make install&lt;br /&gt;
&lt;br /&gt;
Finally, update the system's shared library cache.&lt;br /&gt;
&lt;br /&gt;
    sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
At this point, GNU Radio should be installed and ready to use. You can quickly test this, with no USRP device attached, by running the following quick tests.&lt;br /&gt;
&lt;br /&gt;
    gnuradio-config-info --version&lt;br /&gt;
    gnuradio-config-info --prefix&lt;br /&gt;
    gnuradio-config-info --enabled-components&lt;br /&gt;
&lt;br /&gt;
There is a simple flowgraph that you can run that does not require any USRP hardware. It's called the dialtone test, and it produces a PSTN dial tone on the computer's speakers. Running it verifies that all the libraries can be found, and that the GNU Radio run-time is working.&lt;br /&gt;
&lt;br /&gt;
    python $HOME/workarea-gnuradio/gnuradio/gr-audio/examples/python/dial_tone.py&lt;br /&gt;
&lt;br /&gt;
You can try launching the GNU Radio Companion (GRC) tool, a visual tool for building and running GNU Radio flowgraphs.&lt;br /&gt;
&lt;br /&gt;
    gnuradio-companion&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;gnuradio-companion&amp;quot; does not start and complains about the &amp;lt;code&amp;gt;PYTHONPATH&amp;lt;/code&amp;gt; environment variable, then you may have to set this in your &amp;lt;code&amp;gt;$HOME/.bashrc&amp;lt;/code&amp;gt; file, as shown below.&lt;br /&gt;
&lt;br /&gt;
    export PYTHONPATH=/usr/local/lib/python2.7/dist-packages&lt;br /&gt;
&lt;br /&gt;
On Fedora 21/22/23/24, the &amp;lt;code&amp;gt;PYTHONPATH&amp;lt;/code&amp;gt; environment variable will need to be set to:&lt;br /&gt;
&lt;br /&gt;
    export PYTHONPATH=/usr/lib/python2.7/site-packages:/usr/local/lib64/python2.7/site-packages/&lt;br /&gt;
&lt;br /&gt;
==Configuring USB==&lt;br /&gt;
&lt;br /&gt;
On Linux, udev handles USB plug and unplug events. The following commands install a udev rule so that non-root users may access the device. This step is only necessary for devices that use USB to connect to the host computer, such as the B200, B210, and B200mini. This setting should take effect immediately and does not require a reboot or logout/login. Be sure that no USRP device is connected via USB when running these commands.&lt;br /&gt;
&lt;br /&gt;
    cd $HOME/workarea-uhd/uhd/host/utils&lt;br /&gt;
    sudo cp uhd-usrp.rules /etc/udev/rules.d/&lt;br /&gt;
    sudo udevadm control --reload-rules&lt;br /&gt;
    sudo udevadm trigger&lt;br /&gt;
&lt;br /&gt;
==Configuring Ethernet==&lt;br /&gt;
&lt;br /&gt;
For USRP devices that use Ethernet to connect to the host computer, such as the N200, N210, X300, X310, set a static IP address for your system of 192.168.10.1, with a netmask of 255.255.255.0. The default IP address of the USRP is 192.168.10.2, with a netmask of 255.255.255.0. You should probably set the IP address using the graphical Network Manager. If you set the IP address from the command line with &amp;lt;code&amp;gt;ifconfig&amp;lt;/code&amp;gt;, Network Manager will probably overwrite these settings.&lt;br /&gt;
&lt;br /&gt;
==Connect the USRP==&lt;br /&gt;
&lt;br /&gt;
The installation of UHD and GNU Radio should now be complete. At this point, connect the USRP to the host computer.&lt;br /&gt;
&lt;br /&gt;
If the interface is Ethernet, then open a terminal window, and try to ping the USRP with &amp;quot;ping 192.168.10.2&amp;quot;. The USRP should respond to the ping requests.&lt;br /&gt;
&lt;br /&gt;
If the interface is USB, then open a terminal window, and run &amp;quot;&amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt;&amp;quot;. You should see the USRP listed on the USB bus with a VID of &amp;lt;code&amp;gt;2500&amp;lt;/code&amp;gt; and PID of &amp;lt;code&amp;gt;0020&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0021&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0022&amp;lt;/code&amp;gt;, for B200, B210, B200mini, respectively.&lt;br /&gt;
&lt;br /&gt;
Also try running &amp;quot;&amp;lt;code&amp;gt;uhd_find_devices&amp;lt;/code&amp;gt;&amp;quot; and &amp;quot;&amp;lt;code&amp;gt;uhd_usrp_probe&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Thread priority scheduling==&lt;br /&gt;
&lt;br /&gt;
When UHD spawns a new thread, it may try to boost the thread's scheduling priority. If setting the new priority fails, the UHD software prints a warning to the console, as shown below. This warning is harmless; it simply means that the thread will retain a normal or default scheduling priority.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UHD Warning:&lt;br /&gt;
    Unable to set the thread priority. Performance may be negatively affected.&lt;br /&gt;
    Please see the general application notes in the manual for instructions.&lt;br /&gt;
    EnvironmentError: OSError: error in pthread_setschedparam&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To address this issue, non-privileged (non-root) users need to be given special permission to change the scheduling priority. To enable this, add the line below to the file &amp;lt;code&amp;gt;/etc/security/limits.conf&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    @GROUP    - rtprio    99&lt;br /&gt;
&lt;br /&gt;
Replace &amp;lt;code&amp;gt;GROUP&amp;lt;/code&amp;gt; with a group in which your user is a member. You may need to log out and log back into the account for the settings to take effect. In most Linux distributions, a list of groups and group members can be found in the &amp;lt;code&amp;gt;/etc/group&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
There is further documentation about this in the User Manual at the link below.&lt;br /&gt;
&lt;br /&gt;
* [http://files.ettus.com/manual/page_general.html#general_threading_prio Threading Notes section of the User Manual]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Application Notes]]&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Debugging_FPGA_images&amp;diff=3651</id>
		<title>Debugging FPGA images</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Debugging_FPGA_images&amp;diff=3651"/>
				<updated>2017-12-29T17:40:21Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Application Note Number =&lt;br /&gt;
'''AN-121'''&lt;br /&gt;
&lt;br /&gt;
= Revision History =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Author&lt;br /&gt;
!Details&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2016-11-28&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Nicolas Cuervo &amp;lt;br&amp;gt; Sugandha Gupta&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Initial creation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Abstract =&lt;br /&gt;
This application note 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. The contents of this AN could suit most of your needs while setting your debug bitstream for a RFNoC design. However, keep in mind that the topics described here are strictly related to Xilinx framework. For further information please refer to Xilinx documentation [1][2]. &lt;br /&gt;
&lt;br /&gt;
= Overview = &lt;br /&gt;
When you are developing your own application, you might come to the point on which you would like to build an FPGA image for your USRP. You might want to modify part of the cores, add some custom functionality, or even add your custom RFNoC block! For that you might follow tutorials such as the [[Getting_Started_with_RFNoC_Development#Building the FPGA image|Building the FPGA image]] section of one our &amp;quot;getting started&amp;quot; guides. &lt;br /&gt;
&lt;br /&gt;
But how about debugging your HDL code? This comes really handy when you want to follow closely the behavior of your signals within your hardware design. This Application Note will follow the basic steps needed to create a &amp;quot;chipscope image&amp;quot;, which allow you to use the Vivado GUI visual tools to debug your design. &lt;br /&gt;
&lt;br /&gt;
Before we start, this App note assumes that you have been working already with some FPGA code and you want to debug it. Being this the case, we assume that you have UHD installed, the FPGA repository cloned, the right version of Xilinx Vivado installed (by the moment this is being written we use Vivado 2015.4) and its environment initialized. If not, we assume you are familiar on how to do the previously noted procedures. &lt;br /&gt;
&lt;br /&gt;
For illustration purposes, here we are going to check the status of some of the output signals of one of the RFNoC blocks we currently provide. However, the same procedure can be used to check the status of any signal within your hardware code, being input, output, or intermediate signal, and being the code a core description, a module for your library or your custom RFNoC block.&lt;br /&gt;
&lt;br /&gt;
''' Note: ''' Keep in mind that this procedure intends to probe the signals in a fully designed block, which has been also built into a FPGA .bit file and is running in a supported device. This is *not* intended to be a way to test directly your designed code, as building an FPGA image may take several minutes (even hours). For small functionality checks, we strongly recommend you to write a testbench for your code, which will allow you to have more iterations without the need of building and synthesizing your hardware description. You can follow the [https://files.ettus.com/manual/md_usrp3_sim_writing_testbenches.html - Writing Testbenches] section of our reference manual to have insights on how to write your own testbench. In addition, there is plenty of online resources (such as [8]) that provide enough information to get you started with your simulation.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites = &lt;br /&gt;
&lt;br /&gt;
* '''Vivado (version 2015.4): ''' As stated in the overview, you'll be working directly with HDL code that you need to build and synthesize. Depending on your target device, you may even need a non-free license (which is the case for the X3XX devices). In the case of Ettus' embedded devices, you can proceed with your design using the Vivado Webpack.&lt;br /&gt;
&lt;br /&gt;
* '''UHD, GNURadio and gr-ettus: ''' At the end of the debugging process we will be running the application on a physical device, and for that we need the core code downloaded and installed. UHD will serve as our device driver, GNURadio the frame on which our app will run, and gr-ettus is needed for our ''signal generator'' block. If you need guidance on this, please refer to the [https://kb.ettus.com/Getting_Started_with_RFNoC_Development#Creating_a_development_environment Creating a development environment] section of our ''Getting started guide''. If you are debugging your own RFNoC OOT module, this will have to be installed as well. &lt;br /&gt;
&lt;br /&gt;
* '''RFNoC supported device: ''' The whole point of chipscoping is having the ability of probing signals from a hardware design at runtime. Hence, a device where the application is going to run is needed. In this tutorial we will be using an X310 device.&lt;br /&gt;
&lt;br /&gt;
= Choosing your signals =&lt;br /&gt;
At this point we assume that you have a verilog code that has been properly tested by the means of simulation/testbench, but that you want to inspect into its functionality deeper by probing its signals while it is running on a device. This could be helpful for many reasons, such as getting a deeper understanding on the state of your signal during a given transaction, which could give you an insight on how it is working (or even, can give you a lead on why it isn't!)&lt;br /&gt;
&lt;br /&gt;
For this AN, we will use out block '''RFNoC: Signal Generator''' as our Unit Under Test (UUT). However, all procedures to be done can be easily transfered to your own design. In addition, as most of our block and FPGA code is written in Verilog, we will use it also in this document. So let's get started.&lt;br /&gt;
&lt;br /&gt;
The Signal generator's code can be found under &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}/usrp3/lib/rfnoc/&amp;lt;/syntaxhighlight&amp;gt;. In some of our latest code releases (such as 3.10.0.0), this code is found under &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}/usrp3_rfnoc/lib/rfnoc/&amp;lt;/syntaxhighlight&amp;gt;. In this directory you can find the RFNoC related code that is used in the RFNoC framework. Consequently, all the HDL for the NoC blocks the we provide is located here. Now, open the file &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;noc_block_siggen.v&amp;lt;/syntaxhighlight&amp;gt; in your IDE or text editor of preference and give it a quick look. &lt;br /&gt;
&lt;br /&gt;
As you can see, the code is not too extensive and is the comments divide it properly based on functionality. If your design is RFNoCModtool-generated, you'll get a similar preliminary structure in the verilog files for your block. For information on how to use RFNoCModtool please refer to [https://kb.ettus.com/index.php?title=Getting_Started_with_RFNoC_Development RFNoC Development - Getting Started Guide]. Normally for rather simple designs you won't have to deal with the RFNoC Shell or the AXI Wrapper configuration. However, for illustration purposes, we are going to take some of the signals from this part of the code and probe them in our debugging process. A total of 11 signals will be selected, each from a different internal stage. &lt;br /&gt;
&lt;br /&gt;
Lets take a look at how this boundaries look like in the FPGA Internals. Each full RFNoC design can include several different blocks, which are also called &amp;quot;computation engines&amp;quot;. The picture on the right [3] portraits the computation engine internals in a quite self explanatory fashion, although a slightly more detailed explanation about each of the internals from a Computation Engine can be found at the  [https://kb.ettus.com/RFNoC_Getting_Started_Guides RFNoC Software Page]:&lt;br /&gt;
&lt;br /&gt;
[[File:CE_internals.png|Anatomy of a computation engine.|600px|right|Anatomy of a computation engine|link=https://kb.ettus.com/images/8/83/CE_internals.png]]&lt;br /&gt;
&lt;br /&gt;
'''From NoC Shell: '''At the top of the figure you can see the AXI Crossbar, were all the computation engines are wired up together. This is not part of our UUT in particular. However, the connection between the crossbar and our UUT - NoC Shell can be tested within our code. From here we are taking the set_data/addr/stb, which are readback registers and provide information from this interface.&lt;br /&gt;
* set_data&lt;br /&gt;
* set_addr&lt;br /&gt;
* set_stb&lt;br /&gt;
&lt;br /&gt;
'''From the AXI Wrapper: '''our next stage from where we are taking signals is the AXI Wrapper. This can be understood as a translating stage in which the data that goes from and to the user's design is correctly encapsulated into a CHDR packet [5]. By probing this signals we expect to find out that the data that is being transported is correct, and that the transaction also takes places at the right moment.&lt;br /&gt;
* s_axis_data_tdata&lt;br /&gt;
* s_axis_data_tuser&lt;br /&gt;
* s_axis_data_tlast&lt;br /&gt;
* s_axis_data_tvalid&lt;br /&gt;
* s_axis_data_tready&lt;br /&gt;
&lt;br /&gt;
'''From the signal generator design: ''' Last but not least, we are probing signals from the UUT IP, which means that we are checking directly the value that certain lines inside the FPGA have the correct value at a certain time. In this case, we'll be checking if the wave type is according with the one selected from the host, that the gain value is propagated correctly and, clearly, if the block is generating signals when it is enable and when it isn't.&lt;br /&gt;
* gain&lt;br /&gt;
* wave_type&lt;br /&gt;
* enable&lt;br /&gt;
&lt;br /&gt;
= Setting up the code for ChipScoping =&lt;br /&gt;
&lt;br /&gt;
To let know Vivado that we want to probe signals, we have to go directly into the code and mark this signals for debugging. This can be done by using reserved words that describe the synthesizing attributes for a given signal. There is a variety of different attributes that you can give to any signal of your design [2], but here we are going to discuss the ones that serve most of the debugging needs:&lt;br /&gt;
&lt;br /&gt;
* '''KEEP: ''' This attribute prevents the signal to be optimized or absorbed into logic blocks, which would mean that the signal, even though it would be operational after synthesis, may not be accessible for probing. An example of the syntax for this attribute is as follows:&lt;br /&gt;
  VERILOG:&lt;br /&gt;
    (* keep = &amp;quot;true&amp;quot; *) wire signal_name;&lt;br /&gt;
    assign signal_name = in1 &amp;amp; in2;&lt;br /&gt;
&lt;br /&gt;
  VHDL:&lt;br /&gt;
    signal signal_name : std_logic;&lt;br /&gt;
    attribute keep : string;&lt;br /&gt;
    attribute keep of signal_name : signal is &amp;quot;true&amp;quot;;&lt;br /&gt;
    signal_name &amp;lt;= in1 and in2;&lt;br /&gt;
&lt;br /&gt;
* '''KEEP_HIERARCHY: ''' As well as KEEP, this attribute prevents the optimization. However, this attribute can be applied to a module or instance. By using this attribute, the synthesis tools keep the boundary on this signal static. Example:&lt;br /&gt;
  VERILOG&lt;br /&gt;
    On Module:&lt;br /&gt;
    (* keep_hierarchy = &amp;quot;yes&amp;quot; *) module example (in1, in2, out1, out2);&lt;br /&gt;
    On Instance:&lt;br /&gt;
    (* keep_hierarchy = &amp;quot;yes&amp;quot; *) example e0 (.in1(in1), .in2(in2), .out1(out1));&lt;br /&gt;
&lt;br /&gt;
  VHDL&lt;br /&gt;
    On Module:&lt;br /&gt;
    attribute keep_hierarchy : string;&lt;br /&gt;
    attribute keep_hierarchy of example : architecture is &amp;quot;yes&amp;quot;;&lt;br /&gt;
    On Instance:&lt;br /&gt;
    attribute keep_hierarchy : string;&lt;br /&gt;
    attribute keep_hierarchy of e0 : label is &amp;quot;yes&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
* '''DONT_TOUCH: ''' this attribute works just as KEEP and KEEP_HIERARCHY, with the difference that this one is forward-annotated to place and route to prevent logic optimization. In case where other attributes get into conflict with DONT_TOUCH, DONT_TOUCH takes precedence and will be applied. It also can take values yes/no and true/false. Example:&lt;br /&gt;
&lt;br /&gt;
  VERILOG WIRE&lt;br /&gt;
    (* dont_touch = &amp;quot;yes&amp;quot; *) wire signal1;&lt;br /&gt;
    assign signal1 = in1 &amp;amp; in2;&lt;br /&gt;
&lt;br /&gt;
  VERILOG MODULE&lt;br /&gt;
    (* DONT_TOUCH = &amp;quot;yes&amp;quot; *)&lt;br /&gt;
    module example (clk, in1, in2, out1);&lt;br /&gt;
&lt;br /&gt;
  VHDL EXAMPLE&lt;br /&gt;
    signal sig1 : std_logic;&lt;br /&gt;
    attribute dont_touch : string;&lt;br /&gt;
    attribute dont_touch of sig1 : signal is &amp;quot;true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* '''MARK_DEBUG: ''' This is arguably the most important attribute for our current use case, because it is the one that tells Vivado which nets are going to be debugged. This also prevents optimization over the signal, and in addition prepares it to be probed during operation. Virtually this attribute could be applied to any net within the design, but there are some nets with specific properties could have protection against visibility, and can not be probed. The values for MARK_DEBUG are TRUE/FALSE. Example:&lt;br /&gt;
  VERILOG&lt;br /&gt;
    (* MARK_DEBUG = &amp;quot;TRUE&amp;quot; *) wire debug_wire;&lt;br /&gt;
  VHDL&lt;br /&gt;
    attribute MARK_DEBUG : string;&lt;br /&gt;
    attribute MARK_DEBUG of signal_name : signal is &amp;quot;TRUE&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For other attributes and options, please refer to Xilinx's documentation [1][2]. We are going to use the given almost in every case, if not always. Now, the syntax is rather simple and so is the applications to the attributes to the code. The resulting file should look as the picture on the right. When you have modified the code, you are ready to build your debug bitstream.&lt;br /&gt;
&lt;br /&gt;
[[File:chipscope_diff_siggen.png|thumb|Adding attributes to signals to probe.|900px|center|Adding attributes to signals to probe.|link=https://kb.ettus.com/images/a/a7/chipscope_diff_siggen.png]]&lt;br /&gt;
&lt;br /&gt;
= Building the debug bitstream =&lt;br /&gt;
== Save the project and finish Synthesis ==&lt;br /&gt;
For this test in particular you are going to need to have a DDC (Digital down converter) in addition to the UUT for visualization purposes on a host. To add this blocks into the bitstream, go to  &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}/[usrp3|usrp3_rfnoc/tools/scripts/&amp;lt;/syntaxhighlight&amp;gt; and inside that directory run the following command:&lt;br /&gt;
&lt;br /&gt;
    $ ./uhd_image_builder.py siggen ddc -g&lt;br /&gt;
&lt;br /&gt;
This will set up your Vivado environment and start the build of an FPGA image with the signal generator and the DDC blocks. The option '-g' is telling the script that at some point during the build process the Vivado User Interface should be opened, as it is where we are going to set up our debug image. For  &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;uhd_image_builder.py&amp;lt;/syntaxhighlight&amp;gt; usage and options please refer to  the [[Getting_Started_with_RFNoC_Development#Wiring_up_computation_engines_and_building_the_FPGA image|Wiring up computation engines and building the FPGA image]] section of our getting started guide, or simply run  &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;uhd_image_builder.py --help in your terminal&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note: ''' ''The FPGA image building process may take over an hour.''&lt;br /&gt;
&lt;br /&gt;
The Vivado GUI is going to come up at some point of the synthesis. Right after the Vivado GUI has opened, you can go ahead and cancel the process that is running, which is usually the last part of the synthesis  (when it shows 90% done is a safe moment to cancel. See &amp;quot;Saving the project&amp;quot; figure). This is because we first have to set up the parameters for debugging and the synthesis has to be re-run. After canceling, save the project and give it a name of your choice; we are giving here the name ''AN_chipscope'', but you can name the project whatever you like. Right after saving the project, click on 'Run Synthesis', which can be found on the left panel under '''Project Manager-&amp;gt;Synthesis-&amp;gt;Run Synthesis'''.&lt;br /&gt;
&lt;br /&gt;
[[File:cs1.png|thumb|200px|left|Saving the Vivado Project|link=https://kb.ettus.com/images/7/74/cs1.png]]&lt;br /&gt;
&lt;br /&gt;
'''Note: ''' Most of the time Vivado will auto-detect your highest hierarchy module, but it may happen that it just slips to it and then it will ask you which it. If this happens, you can select the verilog file according to the target device that you are chipscoping as the top module (e.g. x300.v or e300.v)&lt;br /&gt;
&lt;br /&gt;
Now wait until the synthesis is finished. This won't take long, and after it finishes a window will prompted saying that the synthesis is done, and asking if you want to run the implementation. Click on cancel, as we need to setup the debugging parameters first.&lt;br /&gt;
&lt;br /&gt;
== Setup debug ==&lt;br /&gt;
&lt;br /&gt;
Go to '''Project Manager -&amp;gt; Synthesis -&amp;gt; Open Synthesized Design -&amp;gt; Set Up debug''', and the wizard will start. Click on next until you see a window listing the nets to debug. Here, two scenarios are expected. See the figure below:&lt;br /&gt;
&lt;br /&gt;
[[File:cs_2.png|center|1200px|Clock Domain|link=https://kb.ettus.com/images/5/52/cs_2.png]]&lt;br /&gt;
&lt;br /&gt;
Sometimes Vivado will pick up the clock domain automatically (which is the case depicted on the right side), but there are occasions where the nets to debug aren't clearly defined under a clock domain and this cases require a little bit more of work, depending on your knowledge of your design. In this case, we know that the nets are under the same clock domain as the other signals, but in case of doubt, you'll have to go and find it out through the code. The case on the left can be solved easily by clicking on 'more info', which is just at the end of the red warning. Right after clickling, further, clearly, information will appear. In the prompted dialog, let us click on 'Assign All Clock Domains'&lt;br /&gt;
&lt;br /&gt;
[[File:cs_3.png|center|Assigning all clock domains|link=https://kb.ettus.com/images/e/e4/cs_3.png]]&lt;br /&gt;
&lt;br /&gt;
A window will appear where you can choose the common clock domain on which you want to have the signals. Here, in our case, we select &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;radio_clk_gen/inst/CLK_OUT1&amp;lt;/syntaxhighlight&amp;gt;, and that would be sufficient to continue. Accept and click next.&lt;br /&gt;
&lt;br /&gt;
Right after, we have to choose the ''Integrated Logic Analizer - ILA'' Core Options [6][7]. Here we will only focus on &amp;quot;Sample of data depth&amp;quot; and &amp;quot;Input pipe stages&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:cs_4.png|550px|center|ILA core options|link=https://kb.ettus.com/images/2/29/cs_4.png]]&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Sample of data depth&amp;quot; is the maximum number of data sample words that the ILA core can store at run time for each of the probe lines. The input pipe stages is the number of flops or registers that are added to each probe line. This basically determines how big the debug setup will be, and the amount of data that is going to be analyzed per run. Here we select 4096 for the data depth and 1 input pipe line. For further information about the ILA and its configuration, please refer to the ILA documentation [6][7]. With this, the set up is done, and you can proceed to click &amp;quot;next&amp;quot; and then &amp;quot;finish&amp;quot; to complete the wizard operation.&lt;br /&gt;
&lt;br /&gt;
[[File:cs_5.png|center|ILA core options|link=https://kb.ettus.com/images/a/a3/cs_5.png]]&lt;br /&gt;
&lt;br /&gt;
After the setup is finished, go to the left panel and click '''Project Manager-&amp;gt;Program and Debug-&amp;gt;Generate Bitstream'''. This will ask you if you want to run the implementation first, to what we answer 'Yes'. This will prepare the bitstream with which we are going to program our device and debug our design.&lt;br /&gt;
&lt;br /&gt;
= Running the debug bitstream in the target device =&lt;br /&gt;
After the bitstream generation is completed successfully, it is time for us to move on and put our design into the device. On the left pannel, right below we generated our bitstream, is the &amp;quot;Hardware Manager&amp;quot;. At this point, we have our X310 connected via JTAG for programming purposes, and via Ethernet (1G in this specific use case) for later usage. Now, click on 'Open Target'. If you have only one device connected, the option &amp;quot;auto-connect&amp;quot; should work just fine. Otherwise, select your device by clicking on &amp;quot;Open new target&amp;quot; and following the options in order to find the device you want. After doing so, two options should appear at the top of your Vivado window:&lt;br /&gt;
&lt;br /&gt;
[[File:cs_6.png|center|Hardware options|link=https://kb.ettus.com/images/9/9e/cs_6.png]]&lt;br /&gt;
&lt;br /&gt;
As a first step, click on &amp;quot;Program device&amp;quot;. Usually, again, Vivado picks up the bitstream that you just generated. However, if you have been running multiple bitstream builds and/or have multiple Vivado projects, it is possible that you would have to look for the right bitstream. It should be under the project that you have been working during the generation of your debug bitstream. &lt;br /&gt;
&lt;br /&gt;
After programing, you have to run an initialization routine on your device. A way to do this is to run a usrp probe, which will also tell us several interesting information. In a terminal, run:&lt;br /&gt;
&lt;br /&gt;
    $ uhd_usrp_probe&lt;br /&gt;
&lt;br /&gt;
This will tell you information about the device. In our case, the last portion of the output should look like this:&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;
    |   |   |   * SigGen_0&lt;br /&gt;
    |   |   |   * DUC_0&lt;br /&gt;
    |   |   |   * DDC_0&lt;br /&gt;
&lt;br /&gt;
which tells us that the blocks '''Signal Generator, DUC and DDC''' were correctly added into the device. Keep in mind that the DmA FIFO and two instances of the radio are added by default into an X310 device. Now, go back to the Vivado GUI and click on &amp;quot;Refresh device&amp;quot; right on the top of the Vivado Window. After that, your debugging signals should appear and you are ready to start chipscoping.&lt;br /&gt;
&lt;br /&gt;
== Selecting Triggers ==&lt;br /&gt;
While probing your design, you probably want to know the state of a given signal right at the moment at which it or other signal changed. In some cases you can have a short simulation and you can ''eye-ball'' your signals and see if the results are as expected. However, sometimes signals change very fast or have a really short duration, making a qualitative procedure a little bit more complicated. For that case, you can set up '''triggers''', which means that the chipscope tool will start capturing when a desired signal changes. We are going to use this feature here and is recommended to do so to have more control over the signal capturing.&lt;br /&gt;
&lt;br /&gt;
[[File:cs_7.png|center|Trigger Setup|link=https://kb.ettus.com/images/e/e1/cs_7.png]]&lt;br /&gt;
&lt;br /&gt;
Here we are going to choose two signals as triggers, which are '''s_axis_data_tvalid''' and '''s_axis_data_tready'''. The names are almost self explanatory: they state when the device has valid data and when it is ready (see [4] for further information). After choosing this signals, now we have to put our device to work. Even, you can click on &amp;quot;run trigger for this ILA core&amp;quot;, which will let the device on idle state waiting for the trigger. &lt;br /&gt;
&lt;br /&gt;
[[File:cs_9.png|center|Trigger Setup. You can also see the black panel where all the debug lines are listed.|link=https://kb.ettus.com/images/7/74/cs_9.png]]&lt;br /&gt;
&lt;br /&gt;
== Debugging at run time ==&lt;br /&gt;
This is what we came for. The block is to be put in a normal use case where it will run and, simultaneously, we will probe signals from it. For the '''RFNoC: Signal Generator''', we are going to use GNURadio to set up the application. Actually, we are going to use the siggen example that is shipped within ''gr-ettus''. We open to &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}{path_to_gr-ettus}/examples/rfnoc/rfnoc_siggen.grc&amp;lt;/syntaxhighlight&amp;gt;, where a simple setup is ready to show the siggen working.&lt;br /&gt;
&lt;br /&gt;
[[File:cs_8.png|center|GNURadio example for the RFNoC: Signal Generator block|link=https://kb.ettus.com/images/d/d1/cs_8.png]]&lt;br /&gt;
&lt;br /&gt;
You can see that there is a number of options which can be modified. As we choose to check how signal such as &amp;quot;Wave type&amp;quot; and &amp;quot;gain&amp;quot;, we are going to focus on this for now. They can be modified on runtime, but every time that they are set to a different value the trigger has to be run again on the Vivado chipscope. Following are some of the expected results:&lt;br /&gt;
&lt;br /&gt;
'''Signal type: Constant || Gain: 1: ''' In this case the signal &amp;quot;wave type&amp;quot; is set to 0, as it being the first option available in the block. The Gain is set to 7FFF, which is the maximum hexadecimal value that the register is able to receive in this case and which means the maximum absolute gain.&lt;br /&gt;
[[File:cs_10.png|center|Signal type: Constant || Gain: 1|link=https://kb.ettus.com/images/7/72/cs_10.png]]&lt;br /&gt;
&lt;br /&gt;
'''Signal type: Sinusoid || Gain: 1: ''' Now the wave type is set to 1, being the next option available. The gain is unchanged to show how it holds the same value in the readback register.&lt;br /&gt;
[[File:cs_12.png|center|Signal type: Sinusoid || Gain: 1|link=https://kb.ettus.com/images/5/56/cs_12.png]]&lt;br /&gt;
&lt;br /&gt;
'''Signal type: Noise || Gain: 0.5: ''' Wave type and gain are both changed, showing results somewhat expected: wave type is set to 2, being sequentially the next option available, and the gain is set to half of the maximum value, which is shown to be true also in its hexadecimal representation read from the readback register.&lt;br /&gt;
[[File:cs_14.png|center|Signal type: Noise || Gain: 0.5|link=https://kb.ettus.com/images/9/9a/cs_14.png]]&lt;br /&gt;
&lt;br /&gt;
If you have come successfully until this point, then you can play around with the signals and checking the result in the debugging panel or, even better, apply this technique to debug your own RFNoC design!&lt;br /&gt;
&lt;br /&gt;
= External references =&lt;br /&gt;
[1] [https://www.xilinx.com/support/documentation/sw_manuals/xilinx2015_4/ug936-vivado-tutorial-programming-debugging.pdf Vivado Tutorial: Programming and debugging]&lt;br /&gt;
&lt;br /&gt;
[2] [https://www.xilinx.com/support/documentation/sw_manuals/xilinx2015_4/ug901-vivado-synthesis.pdf Vivado Synthesis]&lt;br /&gt;
&lt;br /&gt;
[3] [https://www.ettus.com/content/files/RFNoC_Wireless_at_VT_FPGA.pdf RFNoC Deep Dive: FPGA]&lt;br /&gt;
&lt;br /&gt;
[4] [https://www.xilinx.com/support/documentation/ip_documentation/ug761_axi_reference_guide.pdf Xilinx - AXI reference guide]&lt;br /&gt;
&lt;br /&gt;
[5] [https://files.ettus.com/manual/page_rtp.html Radio Transport Protocols]&lt;br /&gt;
&lt;br /&gt;
[6] [https://www.xilinx.com/support/documentation/ip_documentation/chipscope_ila/v1_04_a/chipscope_ila.pdf LogiCORE IP ChipScope Pro Integrated Logic Analyzer]&lt;br /&gt;
&lt;br /&gt;
[7] [https://www.xilinx.com/support/documentation/ip_documentation/ila/v3_0/pg172-ila.pdf LogiCORE IP Integrated Logic Analyzer v3.0]&lt;br /&gt;
&lt;br /&gt;
[8] [https://www.xilinx.com/support/documentation/application_notes/xapp199.pdf Xilinx AN - Writing efficient Testbenches]&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=UBX&amp;diff=3650</id>
		<title>UBX</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=UBX&amp;diff=3650"/>
				<updated>2017-12-29T17:36:47Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: /* UBX-160 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The UBX daughterboard is a full-duplex wideband transceiver that covers frequencies from 10 MHz to 6 GHz. Coherent and phase-aligned operation across multiple UBX daughterboards on USRP X Series motherboards enables users to explore MIMO and direction finding applications. The UBX daughterboard works interchangeably with other USRP daughterboards and is supported by the USRP Hardware Driver™ (UHD) software API for seamless integration into existing applications.&lt;br /&gt;
&lt;br /&gt;
The UBX is capable of phase coherent operation, and therefore is suitable for MIMO and Phased Array applications, on the X Series. Additionally this capability is only available on the X Series devices.&lt;br /&gt;
&lt;br /&gt;
== Key Features==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Frequency Range: 10 MHz - 6 GHz&lt;br /&gt;
* Versions: 40MHz / 160MHz&lt;br /&gt;
*RF shielding&lt;br /&gt;
*Full duplex operation with independent TX and RX frequencies&lt;br /&gt;
*Synthesizer synchronization for applications requiring coherent or &amp;lt;br&amp;gt;phase-aligned operation, supported on USRP X Series motherboards only&lt;br /&gt;
|[[File:Product ubx 40.png|250px|center]] &lt;br /&gt;
|[[File:Product ubx 160.png|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Daughterboard Specifications==&lt;br /&gt;
===Features===&lt;br /&gt;
* 2 quadrature frontends (1 transmit, 1 receive)&lt;br /&gt;
** Defaults to direct conversion&lt;br /&gt;
** Can be used in low IF mode through lo_offset with uhd::tune_request_t&lt;br /&gt;
* Independent receive and transmit LO's and synthesizers&lt;br /&gt;
** Allows for full-duplex operation on different transmit and receive frequencies&lt;br /&gt;
** Can be set to use Integer-N tuning for better spur performance with uhd::tune_request_t&lt;br /&gt;
&lt;br /&gt;
===Antennas===&lt;br /&gt;
Transmit: '''TX/RX'''&lt;br /&gt;
&lt;br /&gt;
Receive: '''TX/RX''' or '''RX2'''&lt;br /&gt;
* '''Frontend 0:''' Complex baseband signal for selected antenna&lt;br /&gt;
* '''Note:''' The user may set the receive antenna to be TX/RX or RX2. However, when using a UBX board in full-duplex mode, the receive antenna will always be set to RX2, regardless of the settings.&lt;br /&gt;
&lt;br /&gt;
===Gains===&lt;br /&gt;
* Transmit Gains: '''PGA0''', Range: 0-31.5dB&lt;br /&gt;
* Receive Gains: '''PGA0''', Range: 0-31.5dB&lt;br /&gt;
&lt;br /&gt;
===Bandwidths===&lt;br /&gt;
* UBX: 40 MHz, RX &amp;amp; TX&lt;br /&gt;
* UBX-160: 160 MHz, RX &amp;amp; TX&lt;br /&gt;
&lt;br /&gt;
===Sensors===&lt;br /&gt;
* '''lo_locked:''' boolean for LO lock state&lt;br /&gt;
&lt;br /&gt;
===LEDs===&lt;br /&gt;
* '''LOCK''': Synthesizer Lock Detect&lt;br /&gt;
* '''TX/RX TXD''': Transmitting on TX/RX antenna port&lt;br /&gt;
* '''TX/RX RXD''': Receiving on TX/RX antenna port&lt;br /&gt;
* '''RX2 RXD''': Receiving on RX2 antenna port&lt;br /&gt;
&lt;br /&gt;
==RF Specifications==&lt;br /&gt;
===Freq Range===&lt;br /&gt;
* 10MHz - 6GHz&lt;br /&gt;
&lt;br /&gt;
===Noise Figure===&lt;br /&gt;
* 10 MHz - 500 MHz: 3 - 4 dB&lt;br /&gt;
* 500 MHz - 1.5 GHz: 2 - 3 dB&lt;br /&gt;
* 1.5GHz - 6GHz: 4 - 10 dB&lt;br /&gt;
&lt;br /&gt;
===RX IIP3 (Max)=== &lt;br /&gt;
* 10 MHz - 6 GHz: 8 - 9 dBm&lt;br /&gt;
&lt;br /&gt;
===RX IQ Imbalance===&lt;br /&gt;
* 10 MHz - 6 GHz: &amp;lt; -30dBc&lt;br /&gt;
&lt;br /&gt;
===TX Power (Max)===&lt;br /&gt;
* 10 MHz - 3 GHz: 20 dBm&lt;br /&gt;
* 3 - 6 GHz: 8 - 20 dBm &lt;br /&gt;
&lt;br /&gt;
===TX OIP3===&lt;br /&gt;
* 10 - 500 MHz: 41 dBm&lt;br /&gt;
* 0.5 - 3 GHz: 36 dBm&lt;br /&gt;
* 3 - 6 GHz: 26 dBm - 36 dBm&lt;br /&gt;
&lt;br /&gt;
===TX IQ Imbalance===&lt;br /&gt;
* 10 MHz - 6 GHz: &amp;lt; -30 dBc&lt;br /&gt;
&lt;br /&gt;
Note: The UBX 160 transmitter path has 160 MHz of bandwidth throughout the full frequency range of the device; the receiver path has 84 MHz of bandwidth for center frequencies from 10 MHz to 500 MHz.&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 UBX is -15 dBm.&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;
===UBX-40===&lt;br /&gt;
* Current Hardware Revision: 2&lt;br /&gt;
* Minimum version of UHD required for UBX rev-1: 3.8.2&lt;br /&gt;
* Minimum version of UHD required for UBX rev-2: 3.9.5&lt;br /&gt;
&lt;br /&gt;
===UBX-160===&lt;br /&gt;
* Current Hardware Revision: 2&lt;br /&gt;
* Minimum version of UHD required for UBX rev-1: 3.8.2&lt;br /&gt;
* Minimum version of UHD required for UBX rev-2: 3.9.5&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* 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;
==USRP Compatibility==&lt;br /&gt;
===UBX-40===&lt;br /&gt;
* N or X Series&lt;br /&gt;
&lt;br /&gt;
===UBX-160===&lt;br /&gt;
* X Series only&lt;br /&gt;
&lt;br /&gt;
==Phase Synchronization==&lt;br /&gt;
The UBX daughterboard is capable of phase-synchronous operation, and is recommended for phase-coherent applications. The SBX and TwinRX daughterboards are also recommended for phase-coherent applications.&lt;br /&gt;
&lt;br /&gt;
If you are operating the UBX at frequencies below 1 GHz and need phase synchronization, then it is necessary to select a 20 MHz daughterboard clock rate, instead of using the default 50 MHz rate. Note that this is only required for phase synchronization below 1 GHz. The UBX can still operate below 1 GHz without setting this lower daughterboard clock rate, but it will operate without any phase synchronization capability.&lt;br /&gt;
&lt;br /&gt;
If you're using a UHD program, then you can specify the lower daughterboard clock rate on the command line of the program, with &amp;lt;code&amp;gt;--args=&amp;quot;dboard_clock_rate=20e6&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you're using the UHD API from a C++ program, then you can include &amp;lt;code&amp;gt;&amp;quot;dboard_clock_rate=20e6&amp;quot;&amp;lt;/code&amp;gt; in the device arguments parameter when first invoking &amp;lt;code&amp;gt;multi_usrp::make()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you're using GNU Radio, then you can add &amp;lt;code&amp;gt;&amp;quot;dboard_clock_rate=20e6&amp;quot;&amp;lt;/code&amp;gt; to the &amp;lt;code&amp;gt;&amp;quot;Device Arguments&amp;quot;&amp;lt;/code&amp;gt; field of the properties for the UHD Sink and UHD Source blocks.&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
===UBX===&lt;br /&gt;
[http://files.ettus.com/schematics/ubx/ubx.pdf UBX 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://datasheets.maximintegrated.com/en/ds/MAX2871.pdf MAX2871]&lt;br /&gt;
|Fractional/Integer-N Synthesizer/VCO&lt;br /&gt;
|U3 (3); U9 (5); U19 (7); U23 (9)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/evaluation-documentation/ADL5375.pdf ADL5375-05]&lt;br /&gt;
|Quadrature Modulator&lt;br /&gt;
|U22 (8)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.minicircuits.com/pdfs/LFCN-2250.pdf LFCN-2250+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|F1 (3); F24 (7); F34, F35 (10)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/5510fa.pdf LTC5510]&lt;br /&gt;
|Active Mixer&lt;br /&gt;
|U15 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-490.pdf LFCN-490+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|F12 (5); F15 (6); F26 (7); F31 (9); F33, F36 (10)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://media.digikey.com/pdf/Data%20Sheets/Analog%20Devices%20PDFs/HMC624LP4E.pdf HMC624LP4E]&lt;br /&gt;
|ATTENUATOR&lt;br /&gt;
|U16 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.rfmd.com/store/downloads/dl/file/id/29224/nbb_400_data_sheet.pdf NBB-400]&lt;br /&gt;
|Amplifier&lt;br /&gt;
|U13 (6); U30 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/PHA-1+.pdf PHA-1+]&lt;br /&gt;
|Amplifier&lt;br /&gt;
|U31 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADA4927-1_ADA4927-2.pdf ADA4927-2]&lt;br /&gt;
|Differential ADC Driver&lt;br /&gt;
|U6 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADL5380.pdf ADL5380]&lt;br /&gt;
|Quadrature Demodulator&lt;br /&gt;
|U8 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.avagotech.com/docs/AV02-1237EN MGA-62563]&lt;br /&gt;
|Low Noise Amplifier&lt;br /&gt;
|U36 (11)&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;
|F41 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.avagotech.com/docs/AV02-2919EN VMMK-3603]&lt;br /&gt;
|Low Noise Amplifier&lt;br /&gt;
|U34 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-2600.pdf LFCN-2600+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|F14, F17 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.triquint.com/products/d/doc-a-00000518 855916]&lt;br /&gt;
|SAW Filter&lt;br /&gt;
|F16 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/5510fa.pdf LTC5510]&lt;br /&gt;
|Active Mixer&lt;br /&gt;
|U15 (6); U28 (10)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-2600.pdf LFCN-2600+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|F14, F17 (10)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.minicircuits.com/pdfs/TCM1-63AX+.pdf TCM1-63AX+]&lt;br /&gt;
|RF Transformer&lt;br /&gt;
|T1 (3); T2, T3 (4); T7 (8)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADA4927-1_ADA4927-2.pdf ADA4927-2]&lt;br /&gt;
|Differential ADC Driver&lt;br /&gt;
|U6 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/AD8591_8592_8594.pdf AD8591]&lt;br /&gt;
|Operational Amplifiers&lt;br /&gt;
|U7 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADL5380.pdf ADL5380]&lt;br /&gt;
|Quadrature Demodulator&lt;br /&gt;
|U8 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.diodes.com/_files/datasheets/ZXTC2062E6.pdf ZXTC2062E6]&lt;br /&gt;
|TRANSISTORS&lt;br /&gt;
|Q1 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/hmc624a.pdf HMC624ALP4E]&lt;br /&gt;
|ATTENUATOR&lt;br /&gt;
|U16 (6); U29 (10)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-800.pdf LFCN-800+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|F2 (3); F25 (7)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADP7104.pdf ADP7104-3.3]&lt;br /&gt;
|CMOS LDO&lt;br /&gt;
|U4, U5 (3); U10, U11 (5); U20, U21 (7); U24, U25 (9); U48 (13)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/evaluation-documentation/ADL5375.pdf ADL5375-05] &lt;br /&gt;
|Quadrature Modulator&lt;br /&gt;
|U22 (8)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/5510fa.pdf LTC5510]&lt;br /&gt;
|Active Mixer&lt;br /&gt;
|U28 (10)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/21210G.pdf 24LC024]&lt;br /&gt;
|EEPROM&lt;br /&gt;
|U38, U39 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADP7104.pdf ADP7104-5.0]&lt;br /&gt;
|CMOS LDO&lt;br /&gt;
|U41, U42, U43, U44, U45, U46, U47 (13)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.diodes.com/_files/datasheets/ZXTC2062E6.pdf ZXTC2062E6]&lt;br /&gt;
|TRANSISTORS&lt;br /&gt;
|Q2, Q3, Q4, Q5 (13)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Mechanical Information==&lt;br /&gt;
===Drawings===&lt;br /&gt;
* [[Media:cu ettus UBX cca.pdf| PDF Format]]&lt;br /&gt;
&lt;br /&gt;
==RF Connectors==&lt;br /&gt;
* The UBX daughterboard features female SMA connectors for both the TX/RX and RX2 connectors.&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;
===UBX-40/UBX-160===&lt;br /&gt;
* [[Media:volatility UBX CBX WBX SBX r1 1.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Important Notes==&lt;br /&gt;
*A larger 24W (6V, 4A) power supply is required when using a UBX-40 daughterboard and integrated GPS Disciplined Oscillator accessory together in a USRP2, USRP N200, or USRP N210 device.&lt;br /&gt;
*The UBX-160 transmitter path has 160 MHz of bandwidth throughout the full frequency range of the device; the receiver path has 84 MHz of bandwidth for center frequencies from 10 MHz to 500 MHz.&lt;br /&gt;
&lt;br /&gt;
==RF Performance Data==&lt;br /&gt;
* [http://files.ettus.com/performance_data/ubx/UBX-without-UHD-corrections.pdf UBX without UHD Corrections]&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;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=UBX&amp;diff=3649</id>
		<title>UBX</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=UBX&amp;diff=3649"/>
				<updated>2017-12-29T17:36:15Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: /* UBX-40 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The UBX daughterboard is a full-duplex wideband transceiver that covers frequencies from 10 MHz to 6 GHz. Coherent and phase-aligned operation across multiple UBX daughterboards on USRP X Series motherboards enables users to explore MIMO and direction finding applications. The UBX daughterboard works interchangeably with other USRP daughterboards and is supported by the USRP Hardware Driver™ (UHD) software API for seamless integration into existing applications.&lt;br /&gt;
&lt;br /&gt;
The UBX is capable of phase coherent operation, and therefore is suitable for MIMO and Phased Array applications, on the X Series. Additionally this capability is only available on the X Series devices.&lt;br /&gt;
&lt;br /&gt;
== Key Features==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Frequency Range: 10 MHz - 6 GHz&lt;br /&gt;
* Versions: 40MHz / 160MHz&lt;br /&gt;
*RF shielding&lt;br /&gt;
*Full duplex operation with independent TX and RX frequencies&lt;br /&gt;
*Synthesizer synchronization for applications requiring coherent or &amp;lt;br&amp;gt;phase-aligned operation, supported on USRP X Series motherboards only&lt;br /&gt;
|[[File:Product ubx 40.png|250px|center]] &lt;br /&gt;
|[[File:Product ubx 160.png|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Daughterboard Specifications==&lt;br /&gt;
===Features===&lt;br /&gt;
* 2 quadrature frontends (1 transmit, 1 receive)&lt;br /&gt;
** Defaults to direct conversion&lt;br /&gt;
** Can be used in low IF mode through lo_offset with uhd::tune_request_t&lt;br /&gt;
* Independent receive and transmit LO's and synthesizers&lt;br /&gt;
** Allows for full-duplex operation on different transmit and receive frequencies&lt;br /&gt;
** Can be set to use Integer-N tuning for better spur performance with uhd::tune_request_t&lt;br /&gt;
&lt;br /&gt;
===Antennas===&lt;br /&gt;
Transmit: '''TX/RX'''&lt;br /&gt;
&lt;br /&gt;
Receive: '''TX/RX''' or '''RX2'''&lt;br /&gt;
* '''Frontend 0:''' Complex baseband signal for selected antenna&lt;br /&gt;
* '''Note:''' The user may set the receive antenna to be TX/RX or RX2. However, when using a UBX board in full-duplex mode, the receive antenna will always be set to RX2, regardless of the settings.&lt;br /&gt;
&lt;br /&gt;
===Gains===&lt;br /&gt;
* Transmit Gains: '''PGA0''', Range: 0-31.5dB&lt;br /&gt;
* Receive Gains: '''PGA0''', Range: 0-31.5dB&lt;br /&gt;
&lt;br /&gt;
===Bandwidths===&lt;br /&gt;
* UBX: 40 MHz, RX &amp;amp; TX&lt;br /&gt;
* UBX-160: 160 MHz, RX &amp;amp; TX&lt;br /&gt;
&lt;br /&gt;
===Sensors===&lt;br /&gt;
* '''lo_locked:''' boolean for LO lock state&lt;br /&gt;
&lt;br /&gt;
===LEDs===&lt;br /&gt;
* '''LOCK''': Synthesizer Lock Detect&lt;br /&gt;
* '''TX/RX TXD''': Transmitting on TX/RX antenna port&lt;br /&gt;
* '''TX/RX RXD''': Receiving on TX/RX antenna port&lt;br /&gt;
* '''RX2 RXD''': Receiving on RX2 antenna port&lt;br /&gt;
&lt;br /&gt;
==RF Specifications==&lt;br /&gt;
===Freq Range===&lt;br /&gt;
* 10MHz - 6GHz&lt;br /&gt;
&lt;br /&gt;
===Noise Figure===&lt;br /&gt;
* 10 MHz - 500 MHz: 3 - 4 dB&lt;br /&gt;
* 500 MHz - 1.5 GHz: 2 - 3 dB&lt;br /&gt;
* 1.5GHz - 6GHz: 4 - 10 dB&lt;br /&gt;
&lt;br /&gt;
===RX IIP3 (Max)=== &lt;br /&gt;
* 10 MHz - 6 GHz: 8 - 9 dBm&lt;br /&gt;
&lt;br /&gt;
===RX IQ Imbalance===&lt;br /&gt;
* 10 MHz - 6 GHz: &amp;lt; -30dBc&lt;br /&gt;
&lt;br /&gt;
===TX Power (Max)===&lt;br /&gt;
* 10 MHz - 3 GHz: 20 dBm&lt;br /&gt;
* 3 - 6 GHz: 8 - 20 dBm &lt;br /&gt;
&lt;br /&gt;
===TX OIP3===&lt;br /&gt;
* 10 - 500 MHz: 41 dBm&lt;br /&gt;
* 0.5 - 3 GHz: 36 dBm&lt;br /&gt;
* 3 - 6 GHz: 26 dBm - 36 dBm&lt;br /&gt;
&lt;br /&gt;
===TX IQ Imbalance===&lt;br /&gt;
* 10 MHz - 6 GHz: &amp;lt; -30 dBc&lt;br /&gt;
&lt;br /&gt;
Note: The UBX 160 transmitter path has 160 MHz of bandwidth throughout the full frequency range of the device; the receiver path has 84 MHz of bandwidth for center frequencies from 10 MHz to 500 MHz.&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 UBX is -15 dBm.&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;
===UBX-40===&lt;br /&gt;
* Current Hardware Revision: 2&lt;br /&gt;
* Minimum version of UHD required for UBX rev-1: 3.8.2&lt;br /&gt;
* Minimum version of UHD required for UBX rev-2: 3.9.5&lt;br /&gt;
&lt;br /&gt;
===UBX-160===&lt;br /&gt;
* Current Hardware Revision: 1&lt;br /&gt;
* Minimum version of UHD required: 3.8.2&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* 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;
==USRP Compatibility==&lt;br /&gt;
===UBX-40===&lt;br /&gt;
* N or X Series&lt;br /&gt;
&lt;br /&gt;
===UBX-160===&lt;br /&gt;
* X Series only&lt;br /&gt;
&lt;br /&gt;
==Phase Synchronization==&lt;br /&gt;
The UBX daughterboard is capable of phase-synchronous operation, and is recommended for phase-coherent applications. The SBX and TwinRX daughterboards are also recommended for phase-coherent applications.&lt;br /&gt;
&lt;br /&gt;
If you are operating the UBX at frequencies below 1 GHz and need phase synchronization, then it is necessary to select a 20 MHz daughterboard clock rate, instead of using the default 50 MHz rate. Note that this is only required for phase synchronization below 1 GHz. The UBX can still operate below 1 GHz without setting this lower daughterboard clock rate, but it will operate without any phase synchronization capability.&lt;br /&gt;
&lt;br /&gt;
If you're using a UHD program, then you can specify the lower daughterboard clock rate on the command line of the program, with &amp;lt;code&amp;gt;--args=&amp;quot;dboard_clock_rate=20e6&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you're using the UHD API from a C++ program, then you can include &amp;lt;code&amp;gt;&amp;quot;dboard_clock_rate=20e6&amp;quot;&amp;lt;/code&amp;gt; in the device arguments parameter when first invoking &amp;lt;code&amp;gt;multi_usrp::make()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you're using GNU Radio, then you can add &amp;lt;code&amp;gt;&amp;quot;dboard_clock_rate=20e6&amp;quot;&amp;lt;/code&amp;gt; to the &amp;lt;code&amp;gt;&amp;quot;Device Arguments&amp;quot;&amp;lt;/code&amp;gt; field of the properties for the UHD Sink and UHD Source blocks.&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
===UBX===&lt;br /&gt;
[http://files.ettus.com/schematics/ubx/ubx.pdf UBX 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://datasheets.maximintegrated.com/en/ds/MAX2871.pdf MAX2871]&lt;br /&gt;
|Fractional/Integer-N Synthesizer/VCO&lt;br /&gt;
|U3 (3); U9 (5); U19 (7); U23 (9)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/evaluation-documentation/ADL5375.pdf ADL5375-05]&lt;br /&gt;
|Quadrature Modulator&lt;br /&gt;
|U22 (8)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.minicircuits.com/pdfs/LFCN-2250.pdf LFCN-2250+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|F1 (3); F24 (7); F34, F35 (10)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/5510fa.pdf LTC5510]&lt;br /&gt;
|Active Mixer&lt;br /&gt;
|U15 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-490.pdf LFCN-490+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|F12 (5); F15 (6); F26 (7); F31 (9); F33, F36 (10)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://media.digikey.com/pdf/Data%20Sheets/Analog%20Devices%20PDFs/HMC624LP4E.pdf HMC624LP4E]&lt;br /&gt;
|ATTENUATOR&lt;br /&gt;
|U16 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.rfmd.com/store/downloads/dl/file/id/29224/nbb_400_data_sheet.pdf NBB-400]&lt;br /&gt;
|Amplifier&lt;br /&gt;
|U13 (6); U30 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/PHA-1+.pdf PHA-1+]&lt;br /&gt;
|Amplifier&lt;br /&gt;
|U31 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADA4927-1_ADA4927-2.pdf ADA4927-2]&lt;br /&gt;
|Differential ADC Driver&lt;br /&gt;
|U6 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADL5380.pdf ADL5380]&lt;br /&gt;
|Quadrature Demodulator&lt;br /&gt;
|U8 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.avagotech.com/docs/AV02-1237EN MGA-62563]&lt;br /&gt;
|Low Noise Amplifier&lt;br /&gt;
|U36 (11)&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;
|F41 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.avagotech.com/docs/AV02-2919EN VMMK-3603]&lt;br /&gt;
|Low Noise Amplifier&lt;br /&gt;
|U34 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-2600.pdf LFCN-2600+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|F14, F17 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.triquint.com/products/d/doc-a-00000518 855916]&lt;br /&gt;
|SAW Filter&lt;br /&gt;
|F16 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/5510fa.pdf LTC5510]&lt;br /&gt;
|Active Mixer&lt;br /&gt;
|U15 (6); U28 (10)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-2600.pdf LFCN-2600+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|F14, F17 (10)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.minicircuits.com/pdfs/TCM1-63AX+.pdf TCM1-63AX+]&lt;br /&gt;
|RF Transformer&lt;br /&gt;
|T1 (3); T2, T3 (4); T7 (8)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADA4927-1_ADA4927-2.pdf ADA4927-2]&lt;br /&gt;
|Differential ADC Driver&lt;br /&gt;
|U6 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/AD8591_8592_8594.pdf AD8591]&lt;br /&gt;
|Operational Amplifiers&lt;br /&gt;
|U7 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADL5380.pdf ADL5380]&lt;br /&gt;
|Quadrature Demodulator&lt;br /&gt;
|U8 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.diodes.com/_files/datasheets/ZXTC2062E6.pdf ZXTC2062E6]&lt;br /&gt;
|TRANSISTORS&lt;br /&gt;
|Q1 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/hmc624a.pdf HMC624ALP4E]&lt;br /&gt;
|ATTENUATOR&lt;br /&gt;
|U16 (6); U29 (10)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-800.pdf LFCN-800+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|F2 (3); F25 (7)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADP7104.pdf ADP7104-3.3]&lt;br /&gt;
|CMOS LDO&lt;br /&gt;
|U4, U5 (3); U10, U11 (5); U20, U21 (7); U24, U25 (9); U48 (13)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/evaluation-documentation/ADL5375.pdf ADL5375-05] &lt;br /&gt;
|Quadrature Modulator&lt;br /&gt;
|U22 (8)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/5510fa.pdf LTC5510]&lt;br /&gt;
|Active Mixer&lt;br /&gt;
|U28 (10)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/21210G.pdf 24LC024]&lt;br /&gt;
|EEPROM&lt;br /&gt;
|U38, U39 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADP7104.pdf ADP7104-5.0]&lt;br /&gt;
|CMOS LDO&lt;br /&gt;
|U41, U42, U43, U44, U45, U46, U47 (13)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.diodes.com/_files/datasheets/ZXTC2062E6.pdf ZXTC2062E6]&lt;br /&gt;
|TRANSISTORS&lt;br /&gt;
|Q2, Q3, Q4, Q5 (13)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Mechanical Information==&lt;br /&gt;
===Drawings===&lt;br /&gt;
* [[Media:cu ettus UBX cca.pdf| PDF Format]]&lt;br /&gt;
&lt;br /&gt;
==RF Connectors==&lt;br /&gt;
* The UBX daughterboard features female SMA connectors for both the TX/RX and RX2 connectors.&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;
===UBX-40/UBX-160===&lt;br /&gt;
* [[Media:volatility UBX CBX WBX SBX r1 1.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Important Notes==&lt;br /&gt;
*A larger 24W (6V, 4A) power supply is required when using a UBX-40 daughterboard and integrated GPS Disciplined Oscillator accessory together in a USRP2, USRP N200, or USRP N210 device.&lt;br /&gt;
*The UBX-160 transmitter path has 160 MHz of bandwidth throughout the full frequency range of the device; the receiver path has 84 MHz of bandwidth for center frequencies from 10 MHz to 500 MHz.&lt;br /&gt;
&lt;br /&gt;
==RF Performance Data==&lt;br /&gt;
* [http://files.ettus.com/performance_data/ubx/UBX-without-UHD-corrections.pdf UBX without UHD Corrections]&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;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Ettus_USRP_E300_Embedded_Family_Hardware_Resources&amp;diff=3648</id>
		<title>Ettus USRP E300 Embedded Family Hardware Resources</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Ettus_USRP_E300_Embedded_Family_Hardware_Resources&amp;diff=3648"/>
				<updated>2017-12-29T17:28:00Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: /* FPGA */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The USRP E31x 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 (SG1) or 866 MHz (SG3) 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;
|[[File:Product e312.png|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===E313===&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Rugged and weatherproof for outdoor deployment&lt;br /&gt;
* Fully assembled IP67-rated enclosure with USRP E310 inside&lt;br /&gt;
* Extensive environmental testing&lt;br /&gt;
* Power over Ethernet (PoE) with surge and lightning protection&lt;br /&gt;
* Xilinx Zynq 7020 SoC: 7 Series FPGA with ARM Cortex A9 866 MHz dual-core processor&lt;br /&gt;
|[[File:E313.png|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Daughterboard Specifications==&lt;br /&gt;
===E31x MIMO XCVR board===&lt;br /&gt;
The USRP E31x 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.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;
===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 Power Levels===&lt;br /&gt;
* The maximum input power for the E310/E312/E313 is 0 dBm.&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;
===E313===&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 E313&lt;br /&gt;
&lt;br /&gt;
==Physical Specifications==&lt;br /&gt;
&lt;br /&gt;
===Dimensions===&lt;br /&gt;
====E310====&lt;br /&gt;
* 133 x 68 x 26.4 mm&lt;br /&gt;
&lt;br /&gt;
====E312====&lt;br /&gt;
* 133 x 68.2 x 31.8 mm&lt;br /&gt;
&lt;br /&gt;
====E313====&lt;br /&gt;
* 186 x 280 x 106 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;
* E313 -40-71 °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;
|[https://www.ctscorp.com/wp-content/uploads/2015/11/008-0334-0.pdf 525L20DA40M0000]&lt;br /&gt;
|VCTCXO &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;
====E310====&lt;br /&gt;
* 375 g&lt;br /&gt;
&lt;br /&gt;
====E312====&lt;br /&gt;
* 446 g&lt;br /&gt;
&lt;br /&gt;
====E313====&lt;br /&gt;
* 1.8 kg&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;
&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;
====E313====&lt;br /&gt;
* [[File:USRP E313 Dimension Pole Mount.pdf]]&lt;br /&gt;
* [[File:USRP E313 Dimension Surface Mount.pdf]]&lt;br /&gt;
* [[File:USRP_E313_Mounting_Accessory_Assembly_Guide.pdf]]&lt;br /&gt;
* [[Media:USRP E313 USB conduit interface.png]]&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. However, keep in mind that Vivado 2015.4 is recommended for FPGA design involving this device. &lt;br /&gt;
&lt;br /&gt;
===E310/E312/E313===&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;
&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 E3xx, there are no external pull-ups/pull-downs for the GPIO pins, but the FPGAs do have them and they are configured as follows: E3xx: pull-down.&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;
==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;
===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;
* [http://files.ettus.com/e3xx_images/ http://files.ettus.com/e3xx_images/]&lt;br /&gt;
&lt;br /&gt;
This folder linked above 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;
The &amp;quot;&amp;lt;code&amp;gt;alpha&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;beta&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;e3xx-release-001&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;e310-release-002&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;e3xx-release-3&amp;lt;/code&amp;gt;&amp;quot; folders contain older versions which are currently obsolete. We do not suggest that customers use these files. These versions are no longer supported. They are provided here for archival purposes only.&lt;br /&gt;
&lt;br /&gt;
The current version is Release 4, which located in the &amp;quot;&amp;lt;code&amp;gt;e3xx-release-4&amp;lt;/code&amp;gt;&amp;quot; folder. We recommend the customers use this version. It is fine if you are already successfully using an older version, but at some point it is recommended that you upgrade to this 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 Release 4 image includes UHD 3.9.2 and GNU Radio 3.7.9, and also includes 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 images are 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; folder.&lt;br /&gt;
&lt;br /&gt;
There are two SD card image files for each version of the image, which include the text &amp;quot;&amp;lt;code&amp;gt;-dev&amp;lt;/code&amp;gt;&amp;quot; and &amp;quot;&amp;lt;code&amp;gt;-demo&amp;lt;/code&amp;gt;&amp;quot; in the filename. The &amp;quot;&amp;lt;code&amp;gt;-dev&amp;lt;/code&amp;gt;&amp;quot; flavor lacks some graphical packages, such as X Windows and QT, which the &amp;quot;&amp;lt;code&amp;gt;-demo&amp;lt;/code&amp;gt;&amp;quot; flavor includes. The two flavors are otherwise functionally equivalent, although the &amp;quot;&amp;lt;code&amp;gt;-demo&amp;lt;/code&amp;gt;&amp;quot; flavor takes some additional space on the SD card and some additional memory to run.&lt;br /&gt;
&lt;br /&gt;
The Release 4 image comes in two varieties. The variety 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;
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, the images under the &amp;quot;&amp;lt;code&amp;gt;ettus-e3xx-sg1&amp;lt;/code&amp;gt;&amp;quot; folder should be used. For devices where X is E or later, the images under the &amp;quot;&amp;lt;code&amp;gt;ettus-e3xx-sg3&amp;lt;/code&amp;gt;&amp;quot; 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;140605X-01L&amp;lt;/code&amp;gt;, where X is a letter from A to Z. The images under the &amp;quot;&amp;lt;code&amp;gt;ettus-e3xx-sg3&amp;lt;/code&amp;gt;&amp;quot; folder should be used for all E312 devices.&lt;br /&gt;
&lt;br /&gt;
You can burn the image to an SD card using either the &amp;quot;&amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt;&amp;quot; or the &amp;quot;&amp;lt;code&amp;gt;bmaptool&amp;lt;/code&amp;gt;&amp;quot; tool. Instructions on how to use these tools are at the links below.&lt;br /&gt;
&lt;br /&gt;
* http://files.ettus.com/manual/page_usrp_e3x0.html#e3x0_upgrade_sd_card&lt;br /&gt;
&lt;br /&gt;
* https://gnuradio.org/redmine/projects/gnuradio/wiki/Copy_an_image_file_to_the_SD_card&lt;br /&gt;
&lt;br /&gt;
The SD image files have an *.xz extension, as they are compressed using the LZMA/LZMA2 compression algorithms. You can uncompress these files with tools such as 7-Zip and the XZ Utils. 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;
'''XZ Utils'''&lt;br /&gt;
* http://tukaani.org/xz/&lt;br /&gt;
* https://en.wikipedia.org/wiki/XZ_Utils&lt;br /&gt;
&lt;br /&gt;
The folder structure is listed below.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
|-- alpha&lt;br /&gt;
|   |-- dizzy-test&lt;br /&gt;
|   |   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.manifest&lt;br /&gt;
|   |   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.sh&lt;br /&gt;
|   |   |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
|   |   `-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
|   |-- fido-rfnoc-test&lt;br /&gt;
|   |   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.manifest&lt;br /&gt;
|   |   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.sh&lt;br /&gt;
|   |   |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
|   |   |-- sdimage-gnuradio-demo.direct.xz.md5&lt;br /&gt;
|   |   |-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
|   |   `-- sdimage-gnuradio-dev.direct.xz.md5&lt;br /&gt;
|   |-- fido-test&lt;br /&gt;
|   |   |-- ettus-e3xx-sg1&lt;br /&gt;
|   |   |   |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
|   |   |   |-- sdimage-gnuradio-demo.direct.xz.md5&lt;br /&gt;
|   |   |   |-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
|   |   |   `-- sdimage-gnuradio-dev.direct.xz.md5&lt;br /&gt;
|   |   |-- ettus-e3xx-sg3&lt;br /&gt;
|   |   |   |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
|   |   |   |-- sdimage-gnuradio-demo.direct.xz.md5&lt;br /&gt;
|   |   |   |-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
|   |   |   `-- sdimage-gnuradio-dev.direct.xz.md5&lt;br /&gt;
|   |   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.manifest&lt;br /&gt;
|   |   `-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.sh&lt;br /&gt;
|   `-- fosphor-testing&lt;br /&gt;
|       |-- fosphor.direct.xz&lt;br /&gt;
|       |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.host.manifest&lt;br /&gt;
|       |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.sh&lt;br /&gt;
|       |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.target.manifest&lt;br /&gt;
|       |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
|       |-- sdimage-gnuradio-demo.direct.xz.md5&lt;br /&gt;
|       |-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
|       `-- sdimage-gnuradio-dev.direct.xz.md5&lt;br /&gt;
|-- beta&lt;br /&gt;
|   |-- dizzy-test&lt;br /&gt;
|   |   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.manifest&lt;br /&gt;
|   |   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.sh&lt;br /&gt;
|   |   |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
|   |   `-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
|   `-- dizzy-test-wifi&lt;br /&gt;
|       `-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
|-- e310-release-002&lt;br /&gt;
|   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.manifest&lt;br /&gt;
|   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.sh&lt;br /&gt;
|   |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
|   |-- sdimage-gnuradio-demo.direct.xz.md5sum&lt;br /&gt;
|   |-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
|   `-- sdimage-gnuradio-dev.direct.xz.md5sum&lt;br /&gt;
|-- e3xx-release-001&lt;br /&gt;
|   |-- e300-gnuradio-dev-image-release1.bz&lt;br /&gt;
|   `-- nodistro-eglibc-x86_64-gnuradio-dev-image-armv7ahf-vfp-neon-toolchain-nodistro.0.sh&lt;br /&gt;
|-- e3xx-release-3&lt;br /&gt;
|   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.manifest&lt;br /&gt;
|   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.sh&lt;br /&gt;
|   |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
|   `-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
`-- e3xx-release-4&lt;br /&gt;
    |-- ettus-e3xx-sg1&lt;br /&gt;
    |   |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
    |   |-- sdimage-gnuradio-demo.direct.xz.md5&lt;br /&gt;
    |   |-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
    |   `-- sdimage-gnuradio-dev.direct.xz.md5&lt;br /&gt;
    |-- ettus-e3xx-sg3&lt;br /&gt;
    |   |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
    |   |-- sdimage-gnuradio-demo.direct.xz.md5&lt;br /&gt;
    |   |-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
    |   `-- sdimage-gnuradio-dev.direct.xz.md5&lt;br /&gt;
    |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.manifest&lt;br /&gt;
    `-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==WiFi Network Connectivity==&lt;br /&gt;
Below are instructions on setting up a USB WiFi adapter with the E3xx. We have tested the &amp;quot;Edimax EW-7811Un&amp;quot;, however many USB based WiFi adapters should be supported.&lt;br /&gt;
&lt;br /&gt;
First verify the USB WiFI adapter is found by running &amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example output from &amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt; for the &amp;quot;Edimax EW-7811Un&amp;quot; WiFi adapter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Bus 001 Device 003: ID 7392:7811 Edimax Technology Co., Ltd EW-7811Un 802.11n Wireless Adapter [Realtek RTL8188CUS]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the USB adapter is found, proceed with installation and configuration procedure:&lt;br /&gt;
&lt;br /&gt;
1. Run the command below. Enter the passphrase and hit &amp;lt;code&amp;gt;&amp;lt;Enter&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    wpa_passphrase &amp;lt;SSID&amp;gt; &amp;gt;&amp;gt; /etc/wpa_supplicant.conf`&lt;br /&gt;
&lt;br /&gt;
2. In the file &amp;lt;code&amp;gt;/etc/wpa_supplicant.conf&amp;lt;/code&amp;gt;, edit the entry created above to look like the text below (just add what is missing).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
network={&lt;br /&gt;
       ssid=&amp;quot;YOUR_SSID&amp;quot;&lt;br /&gt;
       psk=HASH_VALUE&lt;br /&gt;
       key_mgmt=WPA-PSK&lt;br /&gt;
       proto=RSN WPA&lt;br /&gt;
       pairwise=CCMP TKIP&lt;br /&gt;
       group=CCMP TKIP&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Run the command:&lt;br /&gt;
    wpa_supplicant -B -D nl80211 -i wlan0 -c /etc/wpa_supplicant.conf&lt;br /&gt;
&lt;br /&gt;
4. Run the command:&lt;br /&gt;
    udhcpc -i wlan0&lt;br /&gt;
&lt;br /&gt;
===Compiling Wireless Drivers===&lt;br /&gt;
At this time, Ettus Research does not support compiling drivers on the E3xx device. In the Release-4 image there is the drivers for several wifi adapters built-in. Most wireless adapters labeled for the Raspberry-Pi should work with the included drivers.&lt;br /&gt;
&lt;br /&gt;
==Additional Resources==&lt;br /&gt;
===Application Notes===&lt;br /&gt;
* [[Software Development on the E310 and E312]]&lt;br /&gt;
* [[Resolving Audio Codec Enumeration Issues On The E31x]]&lt;br /&gt;
===Third-party 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 (Honeywell Application Note)]&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;
==USRP Embedded Series FAQ==&lt;br /&gt;
&lt;br /&gt;
===General USRP E31x Questions===&lt;br /&gt;
'''Q:  What data rate is supported for continuous sample streaming to a desktop or laptop host-PC?'''&lt;br /&gt;
A:  Unlike host-based SDRs such as the USRP B, N, and X Series devices, the USRP E Series devices are not intended for continuous streaming of high bandwidth data to a desktop or laptop host-PC. The SDR application runs on an embedded CPU with limited processing capability. Users should leverage the FPGA using tools such as RFNoC to offload compute intensive algorithms that process high bandwidth samples.&lt;br /&gt;
&lt;br /&gt;
'''Q:  What data rate is supported between FPGA to the ARM processor?'''&lt;br /&gt;
A: Due to the limited performance of the embedded processor, the maximum data rate from the FPGA to ARM cores is approximately 10 MS/s, and will vary with the processing load on the CPU. The AD9631 RFIC is capable of capturing 56 MHz of bandwidth. Processing signals at full bandwidth requires implementing algorithms on the FPGA.&lt;br /&gt;
&lt;br /&gt;
'''Q:  What is the purpose of the 1 GbE port?'''&lt;br /&gt;
A: The E Series can run a DHCP client on the 1 GigE interface to enable connection to a larger network for remote access by another computer. Power over Ethernet is also supported on the E313.&lt;br /&gt;
&lt;br /&gt;
===USRP E313 Questions===&lt;br /&gt;
'''Q: Which environmental tests were performed?'''&lt;br /&gt;
A: The USRP E313 is tested against multiple environmental standards to ensure operation in outdoor conditions. These test include ingress protection, temperature, humidity, mechanical shock, random vibration, and altitude. Detailed specifications are provided in the [link data sheet]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Q: How do I protect external devices connected to the host USB port?'''  &lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
A: A circular conduit interface is provided in the kit. This component has large and small threaded ends. The small end connects to the USB port on the USRP E313. The user will need to connect their own waterproof structure to the large end to protect the USB device. Since requirements for external devices vary greatly, the conduit interface serves as a flexible starting point for users to build their own solution. See the [[Media:USRP E313 Dimension Pole Mount.pdf]] of the conduit interface for details. &lt;br /&gt;
|[[File:USRP E313 USB conduit interface.png|250px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Q: How do I protect unused ports?'''&lt;br /&gt;
A: All ports come with protective end caps that should be left in place on unused ports.&lt;br /&gt;
&lt;br /&gt;
'''Q: Why is a DC power supply not included?'''&lt;br /&gt;
A: The RJ45 port supports Power over Ethernet and is intended as the primary power supply option. However, users can still use a DC power supply. Since requirements for supplying DC power in outdoor scenarios can vary greatly, a waterproof sleeve for the DC port is provided as a starting point for users to design their own solution. A waterproof sleeve for the RJ45 port is also provided.&lt;br /&gt;
&lt;br /&gt;
'''Q: Do the RF inputs have lightning protection?'''&lt;br /&gt;
A: The DC and PoE power inputs have surge and lightning protection, but the N-type RX/TX inputs and SMA GPS input do not. Users should design antenna lightning protection based on their application requirements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Resources]]&lt;br /&gt;
[[Category:E310]]&lt;br /&gt;
[[Category:E312]]&lt;br /&gt;
[[Category:E313]]&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Getting_Started_with_RFNoC_Development&amp;diff=3629</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=3629"/>
				<updated>2017-10-03T20:42:19Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: /* Image building using the command line */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Application Note Number==&lt;br /&gt;
'''AN-823'''&lt;br /&gt;
&lt;br /&gt;
==Revision History==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Author&lt;br /&gt;
!Details&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2016-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;
&lt;br /&gt;
==Abstract==&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 the USRP X300/X310 and USRP E310/E312 hardware.  '''However''', this document only covers using RFNoC for the USRP X300/X310.  Using RFNoC with the E310/E312 will be covered in another document.&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). As dual-licensed software, RFNoC is available under the open-source GNU Public License version 3 (GPLv3), as well as an alternative, less-restrictive license offered only by Ettus Research. 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 the USRP E310/E312 and the USRP X300/X310.&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 2015.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;
* X3xx series or E3xx series device or any future USRP&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;
* [http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com 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>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Debugging_FPGA_images&amp;diff=3553</id>
		<title>Debugging FPGA images</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Debugging_FPGA_images&amp;diff=3553"/>
				<updated>2017-07-11T20:44:38Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: /* Save the project and finish Synthesis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Application Note Number =&lt;br /&gt;
'''AN-121'''&lt;br /&gt;
&lt;br /&gt;
= Revision History =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Author&lt;br /&gt;
!Details&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2016-11-28&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Nicolas Cuervo &amp;lt;br&amp;gt; Sugandha Gupta&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Initial creation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Abstract =&lt;br /&gt;
This application note 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. The contents of this AN could suit most of your needs while setting your debug bitstream for a RFNoC design. However, keep in mind that the topics described here are strictly related to Xilinx framework. For further information please refer to Xilinx documentation [1][2]. &lt;br /&gt;
&lt;br /&gt;
= Overview = &lt;br /&gt;
When you are developing your own application, you might come to the point on which you would like to build an FPGA image for your USRP. You might want to modify part of the cores, add some custom functionality, or even add your custom RFNoC block! For that you might follow tutorials such as the [[Getting_Started_with_RFNoC_Development#Building the FPGA image|Building the FPGA image]] section of one our &amp;quot;getting started&amp;quot; guides. &lt;br /&gt;
&lt;br /&gt;
But how about debugging your HDL code? This comes really handy when you want to follow closely the behavior of your signals within your hardware design. This Application Note will follow the basic steps needed to create a &amp;quot;chipscope image&amp;quot;, which allow you to use the Vivado GUI visual tools to debug your design. &lt;br /&gt;
&lt;br /&gt;
Before we start, this App note assumes that you have been working already with some fpga code and you want to debug it. Being this the case, we assume that you have UHD installed, the FPGA repository cloned, the right version of Xilinx Vivado installed (by the moment this is being written we use Vivado 2015.4) and its environment initialized. If not, we assume you are familiar on how to do the previously noted procedures. &lt;br /&gt;
&lt;br /&gt;
For illustration purposes, here we are going to check the status of some of the output signals of one of the RFNoC blocks we currently provide. However, the same procedure can be used to check the status of any signal within your hardware code, being input, output, or intermediate signal, and being the code a core description, a module for your library or your custom RFNoC block.&lt;br /&gt;
&lt;br /&gt;
''' Note: ''' Keep in mind that this procedure intends to probe the signals in a fully designed block, which has been also built into a FPGA .bit file and is running in a supported device. This is *not* intended to be a way to test directly your designed code, as building an FPGA image may take several minutes (even hours). For small functionality checks, we strongly recommend you to write a testbench for your code, which will allow you to have more iterations without the need of building and synthesizing your hardware description. You can follow the [https://files.ettus.com/manual/md_usrp3_sim_writing_testbenches.html - Writing Testbenches] section of our reference manual to have insights on how to write your own testbench. In addition, there is plenty of online resources (such as [8]) that provide enough information to get you started with your simulation.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites = &lt;br /&gt;
&lt;br /&gt;
* '''Vivado (version 2015.4): ''' As stated in the overview, you'll be working directly with HDL code that you need to build and synthesize. Depending on your target device, you may even need a non-free license (which is the case for the X3XX devices). In the case of Ettus' embedded devices, you can proceed with your design using the Vivado Webpack.&lt;br /&gt;
&lt;br /&gt;
* '''UHD, GNURadio and gr-ettus: ''' At the end of the debugging process we will be running the application on a physical device, and for that we need the core code downloaded and installed. UHD will serve as our device driver, GNURadio the frame on which our app will run, and gr-ettus is needed for our ''signal generator'' block. If you need guidance on this, please refer to the [https://kb.ettus.com/Getting_Started_with_RFNoC_Development#Creating_a_development_environment Creating a development environment] section of our ''Getting started guide''. If you are debugging your own RFNoC OOT module, this will have to be installed as well. &lt;br /&gt;
&lt;br /&gt;
* '''RFNoC supported device: ''' The whole point of chipscoping is having the ability of probing signals from a hardware design at runtime. Hence, a device where the application is going to run is needed. In this tutorial we will be using an X310 device.&lt;br /&gt;
&lt;br /&gt;
= Choosing your signals =&lt;br /&gt;
At this point we assume that you have a verilog code that has been properly tested by the means of simulation/testbench, but that you want to inspect into its functionality deeper by probing its signals while it is running on a device. This could be helpful for many reasons, such as getting a deeper understanding on the state of your signal during a given transaction, which could give you an insight on how it is working (or even, can give you a lead on why it isn't!)&lt;br /&gt;
&lt;br /&gt;
For this AN, we will use out block '''RFNoC: Signal Generator''' as our Unit Under Test (UUT). However, all procedures to be done can be easily transfered to your own design. In addition, as most of our block and FPGA code is written in Verilog, we will use it also in this document. So let's get started.&lt;br /&gt;
&lt;br /&gt;
The Signal generator's code can be found under &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}/usrp3/lib/rfnoc/&amp;lt;/syntaxhighlight&amp;gt;. In some of our latest code releases (such as 3.10.0.0), this code is found under &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}/usrp3_rfnoc/lib/rfnoc/&amp;lt;/syntaxhighlight&amp;gt;. In this directory you can find the RFNoC related code that is used in the RFNoC framework. Consequently, all the HDL for the NoC blocks the we provide is located here. Now, open the file &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;noc_block_siggen.v&amp;lt;/syntaxhighlight&amp;gt; in your IDE or text editor of preference and give it a quick look. &lt;br /&gt;
&lt;br /&gt;
As you can see, the code is not too extensive and is the comments divide it properly based on functionality. If your design is RFNoCModtool-generated, you'll get a similar preliminary structure in the verilog files for your block. For information on how to use RFNoCModtool please refer to [https://kb.ettus.com/index.php?title=Getting_Started_with_RFNoC_Development RFNoC Development - Getting Started Guide]. Normally for rather simple designs you won't have to deal with the RFNoC Shell or the AXI Wrapper configuration. However, for illustration purposes, we are going to take some of the signals from this part of the code and probe them in our debugging process. A total of 11 signals will be selected, each from a different internal stage. &lt;br /&gt;
&lt;br /&gt;
Lets take a look at how this boundaries look like in the FPGA Internals. Each full RFNoC design can include several different blocks, which are also called &amp;quot;computation engines&amp;quot;. The picture on the right [3] portraits the computation engine internals in a quite self explanatory fashion, although a slightly more detailed explanation about each of the internals from a Computation Engine can be found at the  [https://kb.ettus.com/RFNoC_Getting_Started_Guides RFNoC Software Page]:&lt;br /&gt;
&lt;br /&gt;
[[File:CE_internals.png|Anatomy of a computation engine.|600px|right|Anatomy of a computation engine|link=https://kb.ettus.com/images/8/83/CE_internals.png]]&lt;br /&gt;
&lt;br /&gt;
'''From NoC Shell: '''At the top of the figure you can see the AXI Crossbar, were all the computation engines are wired up together. This is not part of our UUT in particular. However, the connection between the crossbar and our UUT - NoC Shell can be tested within our code. From here we are taking the set_data/addr/stb, which are readback registers and provide information from this interface.&lt;br /&gt;
* set_data&lt;br /&gt;
* set_addr&lt;br /&gt;
* set_stb&lt;br /&gt;
&lt;br /&gt;
'''From the AXI Wrapper: '''our next stage from where we are taking signals is the AXI Wrapper. This can be understood as a translating stage in which the data that goes from and to the user's design is correctly encapsulated into a CHDR packet [5]. By probing this signals we expect to find out that the data that is being transported is correct, and that the transaction also takes places at the right moment.&lt;br /&gt;
* s_axis_data_tdata&lt;br /&gt;
* s_axis_data_tuser&lt;br /&gt;
* s_axis_data_tlast&lt;br /&gt;
* s_axis_data_tvalid&lt;br /&gt;
* s_axis_data_tready&lt;br /&gt;
&lt;br /&gt;
'''From the signal generator design: ''' Last but not least, we are probing signals from the UUT IP, which means that we are checking directly the value that certain lines inside the FPGA have the correct value at a certain time. In this case, we'll be checking if the wave type is according with the one selected from the host, that the gain value is propagated correctly and, clearly, if the block is generating signals when it is enable and when it isn't.&lt;br /&gt;
* gain&lt;br /&gt;
* wave_type&lt;br /&gt;
* enable&lt;br /&gt;
&lt;br /&gt;
= Setting up the code for ChipScoping =&lt;br /&gt;
&lt;br /&gt;
To let know Vivado that we want to probe signals, we have to go directly into the code and mark this signals for debugging. This can be done by using reserved words that describe the synthesizing attributes for a given signal. There is a variety of different attributes that you can give to any signal of your design [2], but here we are going to discuss the ones that serve most of the debugging needs:&lt;br /&gt;
&lt;br /&gt;
* '''KEEP: ''' This attribute prevents the signal to be optimized or absorbed into logic blocks, which would mean that the signal, even though it would be operational after synthesis, may not be accessible for probing. An example of the syntax for this attribute is as follows:&lt;br /&gt;
  VERILOG:&lt;br /&gt;
    (* keep = &amp;quot;true&amp;quot; *) wire signal_name;&lt;br /&gt;
    assign signal_name = in1 &amp;amp; in2;&lt;br /&gt;
&lt;br /&gt;
  VHDL:&lt;br /&gt;
    signal signal_name : std_logic;&lt;br /&gt;
    attribute keep : string;&lt;br /&gt;
    attribute keep of signal_name : signal is &amp;quot;true&amp;quot;;&lt;br /&gt;
    signal_name &amp;lt;= in1 and in2;&lt;br /&gt;
&lt;br /&gt;
* '''KEEP_HIERARCHY: ''' As well as KEEP, this attribute prevents the optimization. However, this attribute can be applied to a module or instance. By using this attribute, the synthesis tools keep the boundary on this signal static. Example:&lt;br /&gt;
  VERILOG&lt;br /&gt;
    On Module:&lt;br /&gt;
    (* keep_hierarchy = &amp;quot;yes&amp;quot; *) module example (in1, in2, out1, out2);&lt;br /&gt;
    On Instance:&lt;br /&gt;
    (* keep_hierarchy = &amp;quot;yes&amp;quot; *) example e0 (.in1(in1), .in2(in2), .out1(out1));&lt;br /&gt;
&lt;br /&gt;
  VHDL&lt;br /&gt;
    On Module:&lt;br /&gt;
    attribute keep_hierarchy : string;&lt;br /&gt;
    attribute keep_hierarchy of example : architecture is &amp;quot;yes&amp;quot;;&lt;br /&gt;
    On Instance:&lt;br /&gt;
    attribute keep_hierarchy : string;&lt;br /&gt;
    attribute keep_hierarchy of e0 : label is &amp;quot;yes&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
* '''DONT_TOUCH: ''' this attribute works just as KEEP and KEEP_HIERARCHY, with the difference that this one is forward-annotated to place and route to prevent logic optimization. In case where other attributes get into conflict with DONT_TOUCH, DONT_TOUCH takes precedence and will be applied. It also can take values yes/no and true/false. Example:&lt;br /&gt;
&lt;br /&gt;
  VERILOG WIRE&lt;br /&gt;
    (* dont_touch = &amp;quot;yes&amp;quot; *) wire signal1;&lt;br /&gt;
    assign signal1 = in1 &amp;amp; in2;&lt;br /&gt;
&lt;br /&gt;
  VERILOG MODULE&lt;br /&gt;
    (* DONT_TOUCH = &amp;quot;yes&amp;quot; *)&lt;br /&gt;
    module example (clk, in1, in2, out1);&lt;br /&gt;
&lt;br /&gt;
  VHDL EXAMPLE&lt;br /&gt;
    signal sig1 : std_logic;&lt;br /&gt;
    attribute dont_touch : string;&lt;br /&gt;
    attribute dont_touch of sig1 : signal is &amp;quot;true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* '''MARK_DEBUG: ''' This is arguably the most important attribute for our current use case, because it is the one that tells Vivado which nets are going to be debugged. This also prevents optimization over the signal, and in addition prepares it to be probed during operation. Virtually this attribute could be applied to any net within the design, but there are some nets with specific properties could have protection against visibility, and can not be probed. The values for MARK_DEBUG are TRUE/FALSE. Example:&lt;br /&gt;
  VERILOG&lt;br /&gt;
    (* MARK_DEBUG = &amp;quot;TRUE&amp;quot; *) wire debug_wire;&lt;br /&gt;
  VHDL&lt;br /&gt;
    attribute MARK_DEBUG : string;&lt;br /&gt;
    attribute MARK_DEBUG of signal_name : signal is &amp;quot;TRUE&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For other attributes and options, please refer to Xilinx's documentation [1][2]. We are going to use the given almost in every case, if not always. Now, the syntax is rather simple and so is the applications to the attributes to the code. The resulting file should look as the picture on the right. When you have modified the code, you are ready to build your debug bitstream.&lt;br /&gt;
&lt;br /&gt;
[[File:chipscope_diff_siggen.png|thumb|Adding attributes to signals to probe.|900px|center|Adding attributes to signals to probe.|link=https://kb.ettus.com/images/a/a7/chipscope_diff_siggen.png]]&lt;br /&gt;
&lt;br /&gt;
= Building the debug bitstream =&lt;br /&gt;
== Save the project and finish Synthesis ==&lt;br /&gt;
For this test in particular you are going to need to have a DDC (Digital down converter) in addition to the UUT for visualization purposes on a host. To add this blocks into the bitstream, go to  &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}/[usrp3|usrp3_rfnoc/tools/scripts/&amp;lt;/syntaxhighlight&amp;gt; and inside that directory run the following command:&lt;br /&gt;
&lt;br /&gt;
    $ ./uhd_image_builder.py siggen ddc -g&lt;br /&gt;
&lt;br /&gt;
This will set up your Vivado environment and start the build of an FPGA image with the signal generator and the DDC blocks. The option '-g' is telling the script that at some point during the build process the Vivado User Interface should be opened, as it is where we are going to set up our debug image. For  &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;uhd_image_builder.py&amp;lt;/syntaxhighlight&amp;gt; usage and options please refer to  the [[Getting_Started_with_RFNoC_Development#Wiring_up_computation_engines_and_building_the_FPGA image|Wiring up computation engines and building the FPGA image]] section of our getting started guide, or simply run  &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;uhd_image_builder.py --help in your terminal&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note: ''' ''The FPGA image building process may take over an hour.''&lt;br /&gt;
&lt;br /&gt;
The Vivado GUI is going to come up at some point of the synthesis. Right after the Vivado GUI has opened, you can go ahead and cancel the process that is running, which is usually the last part of the synthesis  (when it shows 90% done is a safe moment to cancel. See &amp;quot;Saving the project&amp;quot; figure). This is because we first have to set up the parameters for debugging and the synthesis has to be re-run. After canceling, save the project and give it a name of your choice; we are giving here the name ''AN_chipscope'', but you can name the project whatever you like. Right after saving the project, click on 'Run Synthesis', which can be found on the left panel under '''Project Manager-&amp;gt;Synthesis-&amp;gt;Run Synthesis'''.&lt;br /&gt;
&lt;br /&gt;
[[File:cs1.png|thumb|200px|left|Saving the Vivado Project|link=https://kb.ettus.com/images/7/74/cs1.png]]&lt;br /&gt;
&lt;br /&gt;
'''Note: ''' Most of the time Vivado will auto-detect your highest hierarchy module, but it may happen that it just slips to it and then it will ask you which it. If this happens, you can select the verilog file according to the target device that you are chipscoping as the top module (e.g. x300.v or e300.v)&lt;br /&gt;
&lt;br /&gt;
Now wait until the synthesis is finished. This won't take long, and after it finishes a window will prompted saying that the synthesis is done, and asking if you want to run the implementation. Click on cancel, as we need to setup the debugging parameters first.&lt;br /&gt;
&lt;br /&gt;
== Setup debug ==&lt;br /&gt;
&lt;br /&gt;
Go to '''Project Manager -&amp;gt; Synthesis -&amp;gt; Open Synthesized Design -&amp;gt; Set Up debug''', and the wizard will start. Click on next until you see a window listing the nets to debug. Here, two scenarios are expected. See the figure below:&lt;br /&gt;
&lt;br /&gt;
[[File:cs_2.png|center|1200px|Clock Domain|link=https://kb.ettus.com/images/5/52/cs_2.png]]&lt;br /&gt;
&lt;br /&gt;
Sometimes Vivado will pick up the clock domain automatically (which is the case depicted on the right side), but there are occasions where the nets to debug aren't clearly defined under a clock domain and this cases require a little bit more of work, depending on your knowledge of your design. In this case, we know that the nets are under the same clock domain as the other signals, but in case of doubt, you'll have to go and find it out through the code. The case on the left can be solved easily by clicking on 'more info', which is just at the end of the red warning. Right after clickling, further, clearly, information will appear. In the prompted dialog, let us click on 'Assign All Clock Domains'&lt;br /&gt;
&lt;br /&gt;
[[File:cs_3.png|center|Assigning all clock domains|link=https://kb.ettus.com/images/e/e4/cs_3.png]]&lt;br /&gt;
&lt;br /&gt;
A window will appear where you can choose the common clock domain on which you want to have the signals. Here, in our case, we select &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;radio_clk_gen/inst/CLK_OUT1&amp;lt;/syntaxhighlight&amp;gt;, and that would be sufficient to continue. Accept and click next.&lt;br /&gt;
&lt;br /&gt;
Right after, we have to choose the ''Integrated Logic Analizer - ILA'' Core Options [6][7]. Here we will only focus on &amp;quot;Sample of data depth&amp;quot; and &amp;quot;Input pipe stages&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:cs_4.png|550px|center|ILA core options|link=https://kb.ettus.com/images/2/29/cs_4.png]]&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Sample of data depth&amp;quot; is the maximum number of data sample words that the ILA core can store at run time for each of the probe lines. The input pipe stages is the number of flops or registers that are added to each probe line. This basically determines how big the debug setup will be, and the amount of data that is going to be analyzed per run. Here we select 4096 for the data depth and 1 input pipe line. For further information about the ILA and its configuration, please refer to the ILA documentation [6][7]. With this, the set up is done, and you can proceed to click &amp;quot;next&amp;quot; and then &amp;quot;finish&amp;quot; to complete the wizard operation.&lt;br /&gt;
&lt;br /&gt;
[[File:cs_5.png|center|ILA core options|link=https://kb.ettus.com/images/a/a3/cs_5.png]]&lt;br /&gt;
&lt;br /&gt;
After the setup is finished, go to the left panel and click '''Project Manager-&amp;gt;Program and Debug-&amp;gt;Generate Bitstream'''. This will ask you if you want to run the implementation first, to what we answer 'Yes'. This will prepare the bitstream with which we are going to program our device and debug our design.&lt;br /&gt;
&lt;br /&gt;
= Running the debug bitstream in the target device =&lt;br /&gt;
After the bitstream generation is completed successfully, it is time for us to move on and put our design into the device. On the left pannel, right below we generated our bitstream, is the &amp;quot;Hardware Manager&amp;quot;. At this point, we have our X310 connected via JTAG for programming purposes, and via Ethernet (1G in this specific use case) for later usage. Now, click on 'Open Target'. If you have only one device connected, the option &amp;quot;auto-connect&amp;quot; should work just fine. Otherwise, select your device by clicking on &amp;quot;Open new target&amp;quot; and following the options in order to find the device you want. After doing so, two options should appear at the top of your Vivado window:&lt;br /&gt;
&lt;br /&gt;
[[File:cs_6.png|center|Hardware options|link=https://kb.ettus.com/images/9/9e/cs_6.png]]&lt;br /&gt;
&lt;br /&gt;
As a first step, click on &amp;quot;Program device&amp;quot;. Usually, again, Vivado picks up the bitstream that you just generated. However, if you have been running multiple bitstream builds and/or have multiple Vivado projects, it is possible that you would have to look for the right bitstream. It should be under the project that you have been working during the generation of your debug bitstream. &lt;br /&gt;
&lt;br /&gt;
After programing, you have to run an initialization routine on your device. A way to do this is to run a usrp probe, which will also tell us several interesting information. In a terminal, run:&lt;br /&gt;
&lt;br /&gt;
    $ uhd_usrp_probe&lt;br /&gt;
&lt;br /&gt;
This will tell you information about the device. In our case, the last portion of the output should look like this:&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;
    |   |   |   * SigGen_0&lt;br /&gt;
    |   |   |   * DUC_0&lt;br /&gt;
    |   |   |   * DDC_0&lt;br /&gt;
&lt;br /&gt;
which tells us that the blocks '''Signal Generator, DUC and DDC''' were correctly added into the device. Keep in mind that the DmA FIFO and two instances of the radio are added by default into an X310 device. Now, go back to the Vivado GUI and click on &amp;quot;Refresh device&amp;quot; right on the top of the Vivado Window. After that, your debugging signals should appear and you are ready to start chipscoping.&lt;br /&gt;
&lt;br /&gt;
== Selecting Triggers ==&lt;br /&gt;
While probing your design, you probably want to know the state of a given signal right at the moment at which it or other signal changed. In some cases you can have a short simulation and you can ''eye-ball'' your signals and see if the results are as expected. However, sometimes signals change very fast or have a really short duration, making a qualitative procedure a little bit more complicated. For that case, you can set up '''triggers''', which means that the chipscope tool will start capturing when a desired signal changes. We are going to use this feature here and is recommended to do so to have more control over the signal capturing.&lt;br /&gt;
&lt;br /&gt;
[[File:cs_7.png|center|Trigger Setup|link=https://kb.ettus.com/images/e/e1/cs_7.png]]&lt;br /&gt;
&lt;br /&gt;
Here we are going to choose two signals as triggers, which are '''s_axis_data_tvalid''' and '''s_axis_data_tready'''. The names are almost self explanatory: they state when the device has valid data and when it is ready (see [4] for further information). After choosing this signals, now we have to put our device to work. Even, you can click on &amp;quot;run trigger for this ILA core&amp;quot;, which will let the device on idle state waiting for the trigger. &lt;br /&gt;
&lt;br /&gt;
[[File:cs_9.png|center|Trigger Setup. You can also see the black panel where all the debug lines are listed.|link=https://kb.ettus.com/images/7/74/cs_9.png]]&lt;br /&gt;
&lt;br /&gt;
== Debugging at run time ==&lt;br /&gt;
This is what we came for. The block is to be put in a normal use case where it will run and, simultaneously, we will probe signals from it. For the '''RFNoC: Signal Generator''', we are going to use GNURadio to set up the application. Actually, we are going to use the siggen example that is shipped within ''gr-ettus''. We open to &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}{path_to_gr-ettus}/examples/rfnoc/rfnoc_siggen.grc&amp;lt;/syntaxhighlight&amp;gt;, where a simple setup is ready to show the siggen working.&lt;br /&gt;
&lt;br /&gt;
[[File:cs_8.png|center|GNURadio example for the RFNoC: Signal Generator block|link=https://kb.ettus.com/images/d/d1/cs_8.png]]&lt;br /&gt;
&lt;br /&gt;
You can see that there is a number of options which can be modified. As we choose to check how signal such as &amp;quot;Wave type&amp;quot; and &amp;quot;gain&amp;quot;, we are going to focus on this for now. They can be modified on runtime, but every time that they are set to a different value the trigger has to be run again on the Vivado chipscope. Following are some of the expected results:&lt;br /&gt;
&lt;br /&gt;
'''Signal type: Constant || Gain: 1: ''' In this case the signal &amp;quot;wave type&amp;quot; is set to 0, as it being the first option available in the block. The Gain is set to 7FFF, which is the maximum hexadecimal value that the register is able to receive in this case and which means the maximum absolute gain.&lt;br /&gt;
[[File:cs_10.png|center|Signal type: Constant || Gain: 1|link=https://kb.ettus.com/images/7/72/cs_10.png]]&lt;br /&gt;
&lt;br /&gt;
'''Signal type: Sinusoid || Gain: 1: ''' Now the wave type is set to 1, being the next option available. The gain is unchanged to show how it holds the same value in the readback register.&lt;br /&gt;
[[File:cs_12.png|center|Signal type: Sinusoid || Gain: 1|link=https://kb.ettus.com/images/5/56/cs_12.png]]&lt;br /&gt;
&lt;br /&gt;
'''Signal type: Noise || Gain: 0.5: ''' Wave type and gain are both changed, showing results somewhat expected: wave type is set to 2, being sequentially the next option available, and the gain is set to half of the maximum value, which is shown to be true also in its hexadecimal representation read from the readback register.&lt;br /&gt;
[[File:cs_14.png|center|Signal type: Noise || Gain: 0.5|link=https://kb.ettus.com/images/9/9a/cs_14.png]]&lt;br /&gt;
&lt;br /&gt;
If you have come successfully until this point, then you can play around with the signals and checking the result in the debugging panel or, even better, apply this technique to debug your own RFNoC design!&lt;br /&gt;
&lt;br /&gt;
= External references =&lt;br /&gt;
[1] [https://www.xilinx.com/support/documentation/sw_manuals/xilinx2015_4/ug936-vivado-tutorial-programming-debugging.pdf Vivado Tutorial: Programming and debugging]&lt;br /&gt;
&lt;br /&gt;
[2] [https://www.xilinx.com/support/documentation/sw_manuals/xilinx2015_4/ug901-vivado-synthesis.pdf Vivado Synthesis]&lt;br /&gt;
&lt;br /&gt;
[3] [https://www.ettus.com/content/files/RFNoC_Wireless_at_VT_FPGA.pdf RFNoC Deep Dive: FPGA]&lt;br /&gt;
&lt;br /&gt;
[4] [https://www.xilinx.com/support/documentation/ip_documentation/ug761_axi_reference_guide.pdf Xilinx - AXI reference guide]&lt;br /&gt;
&lt;br /&gt;
[5] [https://files.ettus.com/manual/page_rtp.html Radio Transport Protocols]&lt;br /&gt;
&lt;br /&gt;
[6] [https://www.xilinx.com/support/documentation/ip_documentation/chipscope_ila/v1_04_a/chipscope_ila.pdf LogiCORE IP ChipScope Pro Integrated Logic Analyzer]&lt;br /&gt;
&lt;br /&gt;
[7] [https://www.xilinx.com/support/documentation/ip_documentation/ila/v3_0/pg172-ila.pdf LogiCORE IP Integrated Logic Analyzer v3.0]&lt;br /&gt;
&lt;br /&gt;
[8] [https://www.xilinx.com/support/documentation/application_notes/xapp199.pdf Xilinx AN - Writing efficient Testbenches]&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Synchronization_and_MIMO_Capability_with_USRP_Devices&amp;diff=3524</id>
		<title>Synchronization and MIMO Capability with USRP Devices</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Synchronization_and_MIMO_Capability_with_USRP_Devices&amp;diff=3524"/>
				<updated>2017-06-01T13:38:19Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: /* Additional Resources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Application Note Number==&lt;br /&gt;
'''AN-882'''&lt;br /&gt;
&lt;br /&gt;
==Revision History==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Author&lt;br /&gt;
!Details&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2016-05-01   &lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Neel Pandeya&amp;lt;br&amp;gt; Nate Temple&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Initial creation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This AN provides insight into the topics of USRP architecture, system bandwidth, host interface throughput, and available sampling rates.&lt;br /&gt;
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;
&lt;br /&gt;
==Overview==&lt;br /&gt;
Some applications require synchronization across multiple USRPTM (Universal Software Radio Peripheral) devices. Ettus ResearchTM provides several convenient solutions for synchronization. For example, two USRP N210s can be synchronized using a MIMO cable. It is also possible to synchronize more than two units using the Ettus Research OctoClock. Optional GPS-disciplined oscillators provide the capability to synchronize devices to the GPS standard over a large geographic area. This document will introduce and explain the synchronization features of the USRPTM product family and how to meet the requirements of multi-channel applications.&lt;br /&gt;
&lt;br /&gt;
==MIMO System Requirements – Time and Frequency Synchronization==&lt;br /&gt;
For a transceiver to be considered MIMO-capable, each channel in the system must meet two basic requirements:&lt;br /&gt;
&lt;br /&gt;
#The sample clocks must be synchronized and aligned.&lt;br /&gt;
#DSP operations must be performed on samples aligned in time – from the same sample clock edge.&lt;br /&gt;
&lt;br /&gt;
The Ettus Research USRP N200/N210 is recommended for MIMO applications. Two USRP N200/N210s can be synchronized with the USRP MIMO cable. It is also possible to build larger MIMO systems (up to 16x16) by distributing an external reference.&lt;br /&gt;
&lt;br /&gt;
==Beamforming and Direction Finding Requirements==&lt;br /&gt;
Some applications, such as beamforming and direction finding, place additional requirements on the system. In addition to sample time and sample clock alignment, the system must maintain a known phase relationship between each RF input or output. Due to phase ambiguities caused by phased- locked loops which are used for up and down-conversion, some calibration may be required to determine this phase relationship.&lt;br /&gt;
&lt;br /&gt;
It is possible to calibrate a multi-channel system by producing a tone that is distributed to the inputs of each USRP device with match-length RF cables. An illustration of a system that uses this methodology is shown in Figure 1. User-developed software running on the host PC is used to measure the phase and amplitude differences of each channel and apply a correction.&lt;br /&gt;
&lt;br /&gt;
[[File:Mimo figure 1.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
==Other Variables That Effect Phase Alignment==&lt;br /&gt;
As mentioned, other components aside from local oscillators contribute to phase error. Filters, mixers, amplifiers and other components produce phase offsets that vary with time, temperature, mechanical conditions, etc. These types of errors can generally be calibrated out with intermittent, low-rate routines that detect the channel-to-channel phase with a calibration tone. These errors will not change with each PLL retune but may change with time and temperature variation. Thus, applications that require RF phase alignment may require periodic calibration.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==USRP B100 and E100 – Not Recommended for MIMO==&lt;br /&gt;
Like the USRP N200/N210, the USRP B100 and E100/110 can be synchronized with an external reference and PPS source. However, this does not imply the USRP B100 and E100/E110 are MIMO capable. The flexible frequency clocking architecture used in these devices produces phase ambiguity in ADC/DAC sample clocks. Therefore, sample edges will not be aligned.&lt;br /&gt;
&lt;br /&gt;
Despite the sample edge misalignment, it is still possible to produce samples with relatively accurate time stamps. This is useful for time-difference-of-arrival or similar algorithms.&lt;br /&gt;
&lt;br /&gt;
One exception to these statements is when you make use of a daughterboard containing more than one channel in a single slot. For example, LFRX/TX, BasicRX/TX, and TVRX2 can all be used to achieve MIMO capability with a USRP B100 or E100/110.&lt;br /&gt;
&lt;br /&gt;
==Synchronization with GPS Disciplined Oscillator==&lt;br /&gt;
It is possible to provide time-synchronization over a wider geographic area with a GPS disciplined oscillator (GPSDO). A GPSDO derives 10 MHz/PPS signals from the GPS system. The GPSDO is accurate to approximately +/-50 ns across the globe. Ettus Research provides an optional GPSDO module with the USRP N200/N210. There is also an upgraded version of the OctoClock, which includes an internal GPSDO.&lt;br /&gt;
&lt;br /&gt;
[[File:Mimo figure 2.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
==MIMO Capability of Ettus Research USRP Devices==&lt;br /&gt;
Table 1 provides an overview of the synchronization and MIMO capabilities of the USRP product line.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
!USRP Model&lt;br /&gt;
!BW Capability (MSPS w/ 16-bit)&lt;br /&gt;
!MIMO Capable&lt;br /&gt;
!Ext Ref. Input&lt;br /&gt;
!1 PPS Input&lt;br /&gt;
!Internal GPS Disiplined Oscillator (Optional)&lt;br /&gt;
!Plug and Play MIMO&lt;br /&gt;
|-&lt;br /&gt;
|N200&lt;br /&gt;
|25&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|-&lt;br /&gt;
|N210&lt;br /&gt;
|25&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|X300&lt;br /&gt;
|200&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|X310&lt;br /&gt;
|200&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|B200&lt;br /&gt;
|61.44&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|B210&lt;br /&gt;
|61.44&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|B200mini&lt;br /&gt;
|61.44&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|B205mini&lt;br /&gt;
|61.44&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|E310&lt;br /&gt;
|61.44&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|E312&lt;br /&gt;
|61.44&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot; |X&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;Table 1- USRP Synchronization Capabilities&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RF daughterboard selection also impacts the synchronization experience. Most daughterboards use a fractional-N synthesizer to generate the local-oscillator signals. Generally, these fractional- N synthesizers introduce a random phase offset after each retune. If phase alignment between all RF channels is required, this random phase offset will need to be measured and compensated for in software. The SBX PLL includes a resync feature that resets to a fixed phase after each retune. Thus, it may not need to be calibrated after each retune, but may require periodic calibration. This makes the SBX daughterboard the most ideal option for phased-array applications that fall within its frequency range. Also, the BasicRX/TX and LFRX/TX boards do not contain local oscillators that introduce phase errors.&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;
!MIMO Capable&lt;br /&gt;
!Phase Sync Feature?&lt;br /&gt;
|-&lt;br /&gt;
|CBX&lt;br /&gt;
|Yes&lt;br /&gt;
|No&lt;br /&gt;
|-&lt;br /&gt;
|SBX&lt;br /&gt;
|Yes&lt;br /&gt;
|Yes&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|UBX&lt;br /&gt;
|Yes&lt;br /&gt;
|Yes *&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|WBX&lt;br /&gt;
|Yes&lt;br /&gt;
|Yes, +/- 180 deg&lt;br /&gt;
|-&lt;br /&gt;
|XCVR2450&lt;br /&gt;
|Yes&lt;br /&gt;
|No&lt;br /&gt;
|-&lt;br /&gt;
|DBSRX2&lt;br /&gt;
|Yes&lt;br /&gt;
|No&lt;br /&gt;
|-&lt;br /&gt;
|TVRX2&lt;br /&gt;
|Yes&lt;br /&gt;
|No&lt;br /&gt;
|-&lt;br /&gt;
|BasicRX/BasicTX&lt;br /&gt;
|Yes&lt;br /&gt;
|No&lt;br /&gt;
|-&lt;br /&gt;
|LFRX/LFTX&lt;br /&gt;
|Yes&lt;br /&gt;
|No&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;center&amp;gt;Table 2 - Synchronization Capability vs. Daughterboard and USRP&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;''* UBX Phase Sync only supported on X300/X310''&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==USRP N200/N210 – Plug and Play 2x2 MIMO System==&lt;br /&gt;
The easiest method to implement a high-performance 2x2 MIMO system is to utilize two N200/N210s synchronized with an Ettus Research MIMO cable. In this configuration, a single Gigabit Ethernet(GigE) interface can be used to communicate with both USRP devices. The USRP connected to the GigE acts as a switch and routes data to/from both USRP devices. It will also handle time synchronization of the data so the sample alignment process is transparent to the user. The total sample rate for USRP devices connected to a single GigE port on the host computer cannot exceed 25 MS/s in 16-bit mode, or 50 MS/s in 8-bit mode.&lt;br /&gt;
&lt;br /&gt;
==Application Example – Visual Phase Alignment with N210 2X2 MIMO System==&lt;br /&gt;
The UHD API allows you to select synchronization settings for each USRP device. These settings are also exposed through GNU Radio blocks. This allows for a quick, illustrative example of how to use the N200/N210 to build a MIMO system. GNU Radio Companion (GRC) is used for this basic illustration.&lt;br /&gt;
&lt;br /&gt;
Figure 3 shows a flowgraph that receives two streams from two unsynchronized USRP devices. A 400.01 MHz tone is injected into both USRP devices, which are tuned to 400.00 MHz. The flow graph separates the real component of each complex baseband signal and plots them together on a WX GUI Scope. When the two USRP devices are synchronized, the scope sill show two, 10 kHz tones with constant relative phase. In this test case, the USRP devices are unsynchronized. Notice in Figure 4 that there are obvious phase and frequency differences between the two signals. This is a result of variations in the two unsynchronized reference clocks. Heat is applied to one of the USRP device’s internal reference crystals to amplify the frequency variation between the two units.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Mimo figure 3.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Mimo figure 4.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next, plug-and-play 2X2 system is illustrated in Figure 5. Notice the relative simplicity of the system. A MIMO system is created by connecting two N200/N210s with a MIMO cable, which shares Ethernet connectivity and common 10 MHz/PPS signals. Like the unsynchronized setup that produce the scope view in Figure 4, a signal generator drives the receiver inputs of both inputs. A block diagram of the synchronized system is shown in Figure 5. The flowgraph is shown in Figure 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Mimo figure 5.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Mimo figure 6.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A single UHD block is used in the GRC flowgraph. The block parameters are configured to set up a 2x2 MIMO system. The settings of interest are:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Device addr: addr0=192.168.10.2,addr1=192.168.10.3 Sync = don't sync&lt;br /&gt;
    Num Mboards = 2&lt;br /&gt;
    Mb0 Clk Src = Default&lt;br /&gt;
    Mb0 Time Src = Default&lt;br /&gt;
    ...&lt;br /&gt;
    Mb1 Clk Src = MIMO Cable Mb1 Time Src = MIMO Cable&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These settings configure the first USRP device, Mb0, which corresponds to the first entry in the address string, to use its default reference for clocking and timing. The second USRP(Mb1) is configured to accept its frequency and timing reference from the MIMO cable. The signals are provided by Mb0. All other standard settings such as center frequency and gain assignments apply as well.&lt;br /&gt;
&lt;br /&gt;
Like the first flowgraph shown, the real part of each USRP stream is displayed on a scope. A phase correction block is included to compensate for the random, but constant, phase offset discussed earlier in this paper. Figure 7 includes a screenshot of the resultant display both before phase adjustment. Note the phase is constant and the tones are the same frequency.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Mimo figure 7.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Figure 8 shows the signals with phase correction applied. In this plot, it is clear the MIMO connection has enabled the frequency and time references to be synchronized. The random phase offset is corrected with a complex phase shift in the flowgraph. In real applications, this phase correction would be implicitly generated with algorithms such as maximum-ratio combining (MRC), or periodic calibration.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Mimo figure 8.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
This is a simple illustration of the MIMO capability provided by the USRP N200/N210. In most applications the phase compensation is implemented with some automated process. However, calibrating the devices with this type of manual correction is certainly an option.&lt;br /&gt;
&lt;br /&gt;
All principles illustrated in this example are applicable to operations in the transmit direction.&lt;br /&gt;
&lt;br /&gt;
==Synchronization with 10 MHz and 1 PPS Signals==&lt;br /&gt;
While the USRP N200 and N210 provide plug-and-play MIMO capability with the Ettus Research MIMO cable, it is also possible to synchronize multiple devices using external 10 MHz and 1 PPS distribution. This is useful if the developer would like to use a high-accuracy external reference such as a Rubidium source. It is also helpful if the developer must build a MIMO system with more than two channels.&lt;br /&gt;
&lt;br /&gt;
If common PPS and 10 MHz signals are distributed to USRP N-Series devices, it is theoretically possible to build arbitrarily large MIMO systems. In practice, developers have built systems with up to 16 synchronized USRP devices.&lt;br /&gt;
&lt;br /&gt;
The Ettus Research OctoClock and OctoClock-G make it easy to distribute 10 MHz and 1 PPS signals for multi-channel operation. The OctoClock serves as an 8-way PPS and 10 MHz reference splitter. The user must provide a single 10 MHz and 1 PPS signal. The upgraded OctoClock-G includes a high-accuracy, internal GPS-disciplined oscillator and does not require external signals to be supplied. Figure 9 illustrates the use of an OctoClock-G to create an 8x8 MIMO system.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Mimo figure 9.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
All timing signals from the OctoClock should be connected to the USRP devices with matched length cable of the same type and connectorization. This ensures that there is low skew between all of the channels.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Synchronization Signals – Input Levels==&lt;br /&gt;
To achieve optimum performance and prevent damage to the USRP devices, the designer must assure that the input levels fall with specified limits. Guidance for input voltage levels and power levels for the 1 PPS and 10 MHz inputs are 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;
!USRP Model&lt;br /&gt;
!1 PPS Specification&lt;br /&gt;
!External Ref. Specification*&lt;br /&gt;
|-&lt;br /&gt;
|N200&lt;br /&gt;
|3.3-5V&lt;br /&gt;
|0 to 18 dBm&lt;br /&gt;
|-&lt;br /&gt;
|N210&lt;br /&gt;
|3.3-5V&lt;br /&gt;
|0 to 18 dBm&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
*50 ohm Terminated&lt;br /&gt;
&lt;br /&gt;
==Additional Resources==&lt;br /&gt;
UHD API For Synchronization https://files.ettus.com/manual/page_sync.html&lt;br /&gt;
&lt;br /&gt;
OctoClock-G Product Page https://www.ettus.com/product/details/OctoClock-G&lt;br /&gt;
&lt;br /&gt;
GPSDO Module for USRP N200/N210 https://www.ettus.com/product/details/GPSDO-KIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=TwinRX&amp;diff=3522</id>
		<title>TwinRX</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=TwinRX&amp;diff=3522"/>
				<updated>2017-05-12T11:34:20Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: /* RF Specifications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The TwinRX daughterboard for the USRP X Series SDR platform is a two-channel superheterodyne receiver designed for high performance spectrum monitoring and direction finding applications. The receiver is tunable from 10 MHz - 6 GHz and has 80 MHz of instantaneous bandwidth per channel, providing the versatility necessary to analyze a variety of signals in multiple bands of interest. Each channel has an independent RF signal chain with preampilifiers, preselectors, and two mixer stages for superior selectivity. Users can tune the two channels independently to simultaneously monitor uplink and downlink communication with a combined bandwidth of 160 MHz. The ability to share the LO between channels across multiple daughterboards enables the phase-aligned operation required to implement scalable multi-channel phased-arrays. The receiver is capable of fast frequency hopping to detect frequency agile emitters. Configurable RF attenuation and preamplication allow users to optimize dynamic range in favor of noise figure for faint signals, or IP3 for stronger signals. UHD automatically configures the RF signal path for optimized performance in the pre-defined use cases, and provides the flexibility to adjust settings manually. Support for RFNoC on the X Series motherboard enables deterministic FPGA-accelerated computations for real-time spectrum analysis. &lt;br /&gt;
&lt;br /&gt;
[[File:TwinRX BlockDiagram.png|1000px|center]]&lt;br /&gt;
&lt;br /&gt;
== Key Features==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Two-Channel Superheterodyne Receiver&lt;br /&gt;
* Frequency Range: 10 MHz - 6 GHz&lt;br /&gt;
* Bandwidth: 80 MHz per channel ( 160 MHz total )&lt;br /&gt;
* RF shielding&lt;br /&gt;
* Independent RF signal channels with optional LO sharing&lt;br /&gt;
|[[File:TwinRX large.png|250px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Daughterboard Specifications==&lt;br /&gt;
===Features===&lt;br /&gt;
* 2 superheterodyne frontends (2 receive)&lt;br /&gt;
* 80 MHz per channel&lt;br /&gt;
* Independent tuning&lt;br /&gt;
* LO Sharing Capability&lt;br /&gt;
* Coherent and phase-aligned operation&lt;br /&gt;
* Preselection Filters&lt;br /&gt;
* RF Shielding&lt;br /&gt;
&lt;br /&gt;
===Antennas===&lt;br /&gt;
Receive: '''RX1''' or '''RX2'''&lt;br /&gt;
&lt;br /&gt;
===Gains===&lt;br /&gt;
* Receive Gains Range: 0-95dB&lt;br /&gt;
&lt;br /&gt;
===Bandwidths===&lt;br /&gt;
* TwinRX: 80 MHz per channel ( 160 MHz total )&lt;br /&gt;
&lt;br /&gt;
===Sensors===&lt;br /&gt;
* '''lo_locked:''' boolean for LO lock state&lt;br /&gt;
&lt;br /&gt;
===Ports===&lt;br /&gt;
The TwinRX has six MMCX RF connectors on it.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Connector&lt;br /&gt;
!Description&lt;br /&gt;
!Damage Threshold/Max Output&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| J1&lt;br /&gt;
| LO2 Export&lt;br /&gt;
| 0 dBm output&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| J2&lt;br /&gt;
| LO2 Input&lt;br /&gt;
| +20dBm input&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| J3&lt;br /&gt;
| LO1 Export&lt;br /&gt;
| +5 dBm output&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| J4&lt;br /&gt;
| LO1 Input&lt;br /&gt;
| +10dBm input&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| J5&lt;br /&gt;
| Antenna 1 connector (RX1)&lt;br /&gt;
| +10 dBm input&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| J6&lt;br /&gt;
| Antenna 2 connector (RX2)&lt;br /&gt;
| +10 dBm input&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Preselector Filters===&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Band&lt;br /&gt;
!Range&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|LB1&lt;br /&gt;
|10 - 500 MHz&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|LB2 	&lt;br /&gt;
|500 - 800 MHz&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|LB3 	&lt;br /&gt;
|800 - 1.2 GHz&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|LB4 	&lt;br /&gt;
|1.2 - 1.8 GHz&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|HB1 	&lt;br /&gt;
|1.8 - 3.0 GHz&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|HB2 	&lt;br /&gt;
|3.0 - 4.1 GHz&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|HB3 	&lt;br /&gt;
|4.1 - 5.1 GHz&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|HB4 	&lt;br /&gt;
|5.1 - 6.0 GHz&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|[[File:TwinRX Normalized Preselector Response.png|650px|center]]&lt;br /&gt;
|}&lt;br /&gt;
* Each preselector filter has a ±40 MHz band overlap.&lt;br /&gt;
&lt;br /&gt;
==RF Specifications==&lt;br /&gt;
'''Freq Range'''&lt;br /&gt;
* 10MHz - 6GHz&lt;br /&gt;
&lt;br /&gt;
'''Noise Figure'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:60%&amp;quot;&lt;br /&gt;
!Frequency&lt;br /&gt;
!Preamp Enabled&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| 10 MHz - 3 GHz&lt;br /&gt;
| &amp;lt; 5&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| 3 GHz - 5 GHz&lt;br /&gt;
| &amp;lt; 4 &lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
| 5 GHz - 6 GHz&lt;br /&gt;
| &amp;lt; 8&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''RX Third Order Intercept (dBm)''' &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:60%&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!Frequency&lt;br /&gt;
!Full Scale = -45 dBm&lt;br /&gt;
!Full Scale = -30 dBm&lt;br /&gt;
!Full Scale = -20 dBm&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| 10 MHz - 1.8 GHz &lt;br /&gt;
| -8&lt;br /&gt;
| -2 &lt;br /&gt;
| 16&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| 1.8 GHz - 3 GHz&lt;br /&gt;
| -10&lt;br /&gt;
| -1&lt;br /&gt;
| 14&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| 3 GHz - 6 GHz&lt;br /&gt;
| -13&lt;br /&gt;
| -1&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Phase Noise (dBc/Hz)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:60%&amp;quot;&lt;br /&gt;
!Frequency Offset&lt;br /&gt;
! 0.9 GHz&lt;br /&gt;
! 2.4 GHz&lt;br /&gt;
! 5.8 GHz&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| 10 kHz&lt;br /&gt;
| -88&lt;br /&gt;
| -86&lt;br /&gt;
| -82&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| 100 kHz&lt;br /&gt;
| -105&lt;br /&gt;
| -107&lt;br /&gt;
| -103&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| 1 MHz&lt;br /&gt;
| -124&lt;br /&gt;
| -127&lt;br /&gt;
| -127&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&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. Minimum UHD version is 3.10.0.0&lt;br /&gt;
&lt;br /&gt;
===TwinRX===&lt;br /&gt;
* Current Hardware Revision: 2&lt;br /&gt;
* Minimum version of UHD required: 3.10.0.0&lt;br /&gt;
* Minimum version of GNU Radio required: 3.7.10&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* 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;
==USRP Compatibility==&lt;br /&gt;
* X Series only&lt;br /&gt;
&lt;br /&gt;
==Phase Synchronization==&lt;br /&gt;
The TwinRX daughterboard is capable of phase-synchronous operation, and is recommended for phase-coherent applications. Please note that the TwinRX is receive-only. The SBX and UBX daughterboards are also recommended for phase-coherent applications, and are capable of both transmit and receive operations.&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
The TwinRX daughterboard is composed of two PCBs, the Intermediate Frequency (IF) board and the RF board. There are two functionally identical revisions of TwinRX at the moment. Please check the back of your TwinRX to see which you have. The schematics for TwinRX revision B should answer most possible questions. If you have any further questions please email [mailto:support@ettus.com support@ettus.com].&lt;br /&gt;
&lt;br /&gt;
TwinRX Revision A  - (159685A-01)&lt;br /&gt;
* IF Board Revision B - (158671B-01L)&lt;br /&gt;
* RF Board Revision C - (156263C-01L)&lt;br /&gt;
&lt;br /&gt;
TwinRX Revision B  - (159685B-01)&lt;br /&gt;
* IF Board Revision C - (158671C-01L)&lt;br /&gt;
* RF Board Revision D - (156263D-01L)&lt;br /&gt;
&lt;br /&gt;
[[File:TwinRX IF Board Rev C.pdf]]&lt;br /&gt;
&lt;br /&gt;
[[File:TwinRX RF Board Rev D.pdf]]&lt;br /&gt;
&lt;br /&gt;
==RF Connectors==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
The antenna ports are MMCX connectors with 50 ohm input impedance. By default Antenna 1 (RX1) is routed to Channel 1 and Antenna 2 (RX2) to Channel 2. This routing can be changed to swap the antennas or to share a single antenna to both channels. The damage threshold for the antenna inputs is 10 dBm. In practice the available gain makes much lower input powers recommended for achieving the best dynamic range and noise figure.&lt;br /&gt;
|[[File:TwinRX 80 Inputs.jpg|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Local Oscillator Connectors==&lt;br /&gt;
Note: LO sharing cables are not required for a single TwinRX setup. LO sharing cables are only required with two TwinRX daughterboards in a single USRP X300/X310.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Connector&lt;br /&gt;
! Description&lt;br /&gt;
! Min&lt;br /&gt;
! Nominal&lt;br /&gt;
! Damage&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| J1&lt;br /&gt;
| LO2 Export&lt;br /&gt;
| 0 dBm&lt;br /&gt;
| 3 dBm&lt;br /&gt;
| NA (Output)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| J2&lt;br /&gt;
| LO2 Input&lt;br /&gt;
| 0 dBm&lt;br /&gt;
| 2 dBm&lt;br /&gt;
| 20dBm&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| J3&lt;br /&gt;
| LO1 Export&lt;br /&gt;
| -12 dBm&lt;br /&gt;
| 5 dBm&lt;br /&gt;
| NA (Output)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| J4&lt;br /&gt;
| LO1 Input&lt;br /&gt;
| -10 dBm&lt;br /&gt;
| -5 dBm&lt;br /&gt;
| 10dBm&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Antenna 1 connector&lt;br /&gt;
| RX 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 10 dBm&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| Antenna 2 connector&lt;br /&gt;
| RX 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 10 dBm&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;padding-left: 30px&amp;quot; | [[File:TwinRX 80 LOs.jpg|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===LO Sharing with Neighbour TwinRXs===&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!TwinRX (A Slot) &lt;br /&gt;
!TwinRX (B Slot)&lt;br /&gt;
|-&lt;br /&gt;
|J1 LO2 Export &lt;br /&gt;
|J2 LO2 Input&lt;br /&gt;
|-&lt;br /&gt;
|J2 LO2 Input &lt;br /&gt;
|J1 LO2 Export&lt;br /&gt;
|-&lt;br /&gt;
|J3 LO1 Export &lt;br /&gt;
|J4 LO1 Input&lt;br /&gt;
|-&lt;br /&gt;
|J4 LO1 Input &lt;br /&gt;
|J3 LO1 Export&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Software API==&lt;br /&gt;
&lt;br /&gt;
===New Multi USRP Functions===&lt;br /&gt;
The advanced functionalities of the TwinRX will be exposed through new functions implemented in [http://files.ettus.com/manual/classuhd_1_1usrp_1_1multi__usrp.html Multi-USRP]. &lt;br /&gt;
&lt;br /&gt;
===Antenna Mapping===&lt;br /&gt;
The two channels of the TwinRX can be independently configured to use either of the two antenna ports, '''RX1''' and '''RX2''' using the standard antenna selection function in &amp;lt;code&amp;gt;multi_usrp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    virtual void set_rx_antenna(const std::string &amp;amp;ant, size_t chan = 0) = 0;&lt;br /&gt;
&lt;br /&gt;
Select the RX antenna on the frontend.&lt;br /&gt;
* '''ant''' the antenna name&lt;br /&gt;
* '''chan''' the channel index 0 to N-1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Local Oscillator Control and Routing===&lt;br /&gt;
The TwinRX has two channels, '''CH1''' and '''CH2''' and each channel has two local oscillators, '''LO1''' and '''LO2'''. The local oscillators for a channel can be sourced from that channel's '''internal''' synthesizers, the '''companion''' channel's synthesizers, or '''external''' inputs. The value &amp;lt;code&amp;gt;multi_usrp::ALL_LOS&amp;lt;/code&amp;gt; can be used to specify that the command be run on both synthesizers for a channel. The defaults are to operate on &lt;br /&gt;
&lt;br /&gt;
    virtual std::vector&amp;lt;std::string&amp;gt; get_rx_lo_names(size_t chan = 0) = 0;&lt;br /&gt;
&lt;br /&gt;
Get a list of possible LO stage names&lt;br /&gt;
* '''chan''' the channel index 0 to N-1&lt;br /&gt;
* Returns a vector of strings for possible LO names&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    virtual void set_rx_lo_source(const std::string &amp;amp;src, const std::string &amp;amp;name = ALL_LOS, size_t chan = 0) = 0;&lt;br /&gt;
&lt;br /&gt;
Set the LO source for the usrp device. For USRPs that support selectable LOs, this function allows switching between them. Supported options for source: internal, external, companion.&lt;br /&gt;
* '''src''' a string representing the LO source&lt;br /&gt;
* '''name''' the name of the LO stage to update&lt;br /&gt;
* '''chan''' the channel index 0 to N-1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    virtual const std::string get_rx_lo_source(const std::string &amp;amp;name = ALL_LOS, size_t chan = 0) = 0;&lt;br /&gt;
&lt;br /&gt;
Get the currently set LO source.&lt;br /&gt;
* '''name''' the name of the LO stage to query&lt;br /&gt;
* '''chan''' the channel index 0 to N-1&lt;br /&gt;
* Returns the configured LO source&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    virtual std::vector&amp;lt;std::string&amp;gt; get_rx_lo_sources(const std::string &amp;amp;name = ALL_LOS, size_t chan = 0) = 0;&lt;br /&gt;
&lt;br /&gt;
Get a list of possible LO sources.&lt;br /&gt;
* '''name''' the name of the LO stage to query&lt;br /&gt;
* '''chan''' the channel index 0 to N-1&lt;br /&gt;
* Returns a vector of strings for possible settings&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    virtual double set_rx_lo_freq(double freq, const std::string &amp;amp;name, size_t chan = 0) = 0;&lt;br /&gt;
&lt;br /&gt;
Set the RX LO frequency.&lt;br /&gt;
* '''freq''' the frequency to set the LO to&lt;br /&gt;
* '''name''' the name of the LO stage to update&lt;br /&gt;
* '''chan''' the channel index 0 to N-1&lt;br /&gt;
* Returns a coerced LO frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    virtual double get_rx_lo_freq(const std::string &amp;amp;name, size_t chan = 0) = 0;&lt;br /&gt;
&lt;br /&gt;
Get the current RX LO frequency.&lt;br /&gt;
* '''name''' the name of the LO stage to query&lt;br /&gt;
* '''chan''' the channel index 0 to N-1&lt;br /&gt;
* Returns the configured LO frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    virtual freq_range_t get_rx_lo_freq_range(const std::string &amp;amp;name, size_t chan = 0) = 0;&lt;br /&gt;
&lt;br /&gt;
Get the LO frequency range of the RX LO.&lt;br /&gt;
* '''name''' the name of the LO stage to query&lt;br /&gt;
* '''chan''' the channel index 0 to N-1&lt;br /&gt;
* Returns a frequency range object&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exporting Local Oscillators===&lt;br /&gt;
&lt;br /&gt;
    virtual void set_rx_lo_export_enabled(bool enabled, const std::string &amp;amp;name = ALL_LOS, size_t chan = 0) = 0;&lt;br /&gt;
&lt;br /&gt;
Set whether the LO used by the usrp device is exported For USRPs that support exportable LOs, this function configures if the LO used by chan is exported or not.&lt;br /&gt;
* '''enabled''' if true then export the LO&lt;br /&gt;
* '''name''' the name of the LO stage to update&lt;br /&gt;
* '''chan''' the channel index 0 to N-1 for the source channel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    virtual bool get_rx_lo_export_enabled(const std::string &amp;amp;name = ALL_LOS, size_t chan = 0) = 0;&lt;br /&gt;
&lt;br /&gt;
Returns true if the currently selected LO is being exported.&lt;br /&gt;
* '''name''' the name of the LO stage to query&lt;br /&gt;
* '''chan''' the channel index 0 to N-1&lt;br /&gt;
&lt;br /&gt;
==Drawings==&lt;br /&gt;
* [[File:cu usrp twinrx cca.pdf]]&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;
==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;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=CBX&amp;diff=3521</id>
		<title>CBX</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=CBX&amp;diff=3521"/>
				<updated>2017-05-12T11:33:55Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: /* RF Specifications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The CBX is a full-duplex, wideband transceiver that covers a frequency band from 1.2 GHz to 6 GHz with a instantaneous bandwidth of 40 MHz or 120 MHz. The CBX can serve a wide variety of application areas, including WiFi research, cellular base stations, cognitive radio research, and RADAR.&lt;br /&gt;
&lt;br /&gt;
The CBX does not provided phase coherent operation, and therefore is not recommended for MIMO and Phased Array applications.&lt;br /&gt;
&lt;br /&gt;
== Key Features==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Frequency Range: 1.2GHz - 6GHz&lt;br /&gt;
* Versions: 40MHz / 120MHz&lt;br /&gt;
|[[File:Product cbx 40.jpg|250px|center]]&lt;br /&gt;
|[[File:Product cbx 120.jpg|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Daughterboard Specifications==&lt;br /&gt;
===Features===&lt;br /&gt;
* 2 quadrature frontends (1 transmit, 1 receive)&lt;br /&gt;
** Defaults to direct conversion&lt;br /&gt;
** Can be used in low IF mode through lo_offset with uhd::tune_request_t&lt;br /&gt;
* Independent receive and transmit LO's and synthesizers&lt;br /&gt;
** Allows for full-duplex operation on different transmit and receive frequencies&lt;br /&gt;
** Can be set to use Integer-N tuning for better spur performance with uhd::tune_request_t&lt;br /&gt;
&lt;br /&gt;
===Antennas===&lt;br /&gt;
Transmit: '''TX/RX'''&lt;br /&gt;
&lt;br /&gt;
Receive: '''TX/RX''' or '''RX2'''&lt;br /&gt;
* '''Frontend 0:''' Complex baseband signal for selected antenna&lt;br /&gt;
* '''Note:''' The user may set the receive antenna to be TX/RX or RX2. However, when using a CBX board in full-duplex mode, the receive antenna will always be set to RX2, regardless of the settings.&lt;br /&gt;
&lt;br /&gt;
===Gains===&lt;br /&gt;
* Transmit Gains: '''PGA0''', Range: 0-31.5dB&lt;br /&gt;
* Receive Gains: '''PGA0''', Range: 0-31.5dB&lt;br /&gt;
&lt;br /&gt;
===Bandwidths===&lt;br /&gt;
* CBX: 40 MHz, RX &amp;amp; TX&lt;br /&gt;
* CBX-120: 120 MHz, RX &amp;amp; TX&lt;br /&gt;
&lt;br /&gt;
===Sensors===&lt;br /&gt;
* '''lo_locked:''' boolean for LO lock state&lt;br /&gt;
&lt;br /&gt;
===LEDs===&lt;br /&gt;
* All LEDs flash when daughterboard control is initialized&lt;br /&gt;
* '''TX LD''': Transmit Synthesizer Lock Detect&lt;br /&gt;
* '''TX/RX''': Receiver on TX/RX antenna port (No TX)&lt;br /&gt;
* '''RX LD''': Receive Synthesizer Lock Detect&lt;br /&gt;
* '''RX1/RX2''': Receiver on RX2 antenna port&lt;br /&gt;
&lt;br /&gt;
==RF Specifications==&lt;br /&gt;
'''Freq Range'''&lt;br /&gt;
* 1.2GHz - 6GHz&lt;br /&gt;
&lt;br /&gt;
'''Noise Figure'''&lt;br /&gt;
* 5 - 7.5 dB @ (1.2GHz ~ 5GHz)&lt;br /&gt;
* 7.5dB  - 10 dB (5GHz ~ 6GHz)&lt;br /&gt;
&lt;br /&gt;
'''RX IIP3 (Max)''' &lt;br /&gt;
* 8 - 10 dBm&lt;br /&gt;
&lt;br /&gt;
'''RX IQ Imbalance'''&lt;br /&gt;
* -20 dBc&lt;br /&gt;
&lt;br /&gt;
'''TX Power (Max)'''&lt;br /&gt;
* 22 dBm @ (1.2GHz ~ 3GHz) &lt;br /&gt;
* 12 ~ 22 dBm @ (3GHz ~ 6GHz)&lt;br /&gt;
&lt;br /&gt;
'''TX OIP3'''&lt;br /&gt;
* 30 - 32 dBm @ (1.2GHz ~ 5GHz) &lt;br /&gt;
* 26 ~ 30 dBm @ (5GHz ~ 6GHz)&lt;br /&gt;
&lt;br /&gt;
'''TX IQ Imbalance'''&lt;br /&gt;
* -20 dBc&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;
===CBX===&lt;br /&gt;
* Current Hardware Revision: 1&lt;br /&gt;
* Minimum version of UHD required: 3.8.0&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* 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;
==USRP Compatibility==&lt;br /&gt;
===CBX-40===&lt;br /&gt;
* N or X Series&lt;br /&gt;
&lt;br /&gt;
===CBX-120===&lt;br /&gt;
* X Series only&lt;br /&gt;
&lt;br /&gt;
==Phase Synchronization==&lt;br /&gt;
The CBX daughterboard is not capable of phase-synchronous operation. The SBX, UBX, TwinRX daughterboards are recommended for phase-coherent applications.&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
===CBX===&lt;br /&gt;
[http://files.ettus.com/schematics/cbx/CBX.pdf CBX 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;
|[http://www.avagotech.com/docs/AV02-2919EN VMMK-3603]&lt;br /&gt;
|Low Noise Amplifier&lt;br /&gt;
|U1, U5 (1)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.skyworksinc.com/uploads/documents/AS225_313LF_200148E.pdf AS225-313LF]&lt;br /&gt;
|SPDT Switch&lt;br /&gt;
|U3, U6 (1)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://media.digikey.com/pdf/Data%20Sheets/Analog%20Devices%20PDFs/HMC624LP4E.pdf HMC624LP4E]&lt;br /&gt;
|ATTENUATOR&lt;br /&gt;
|U7, U2 (1)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.avagotech.com/docs/AV02-1985EN MGA82563]&lt;br /&gt;
|Amplifier&lt;br /&gt;
|U4 (1)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/GVA-84+.pdf GVA-84+]&lt;br /&gt;
|Amplifier&lt;br /&gt;
|U9 (1)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/PHA-1+.pdf PHA-1+]&lt;br /&gt;
|Amplifier&lt;br /&gt;
|U8 (1)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADL5380.pdf ADL5380ACPZ]&lt;br /&gt;
|Quadrature Demodulator&lt;br /&gt;
|U11 (2)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADA4927-1_ADA4927-2.pdf ADA4927-2YCPZ]&lt;br /&gt;
|Differential ADC Driver&lt;br /&gt;
|U10 (2)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/AD8591_8592_8594.pdf AD8591ARTZ-REEL]&lt;br /&gt;
|Amplifiers&lt;br /&gt;
|U31 (2)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.fairchildsemi.com/datasheets/NC/NC7WZ04.pdf NC7WZ04P6X]&lt;br /&gt;
|Dual Inverter&lt;br /&gt;
|U26 (3); U15, U16 (4); U21 (5); U27 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://datasheets.maximintegrated.com/en/ds/MAX2870.pdf MAX2870ETJ+]&lt;br /&gt;
|Fractional/Integer-N Synthesizer&lt;br /&gt;
|U23 (3); U24 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.skyworksinc.com/uploads/documents/200027E.pdf SKY13267-321]&lt;br /&gt;
|Diversity Switch&lt;br /&gt;
|U12 (3); U25 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-2000.pdf LFCN-2000+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|FL13 (3); FL12 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/lp3878-adj.pdf LP3878MR-ADJ]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U13, U14 (4); U19, U20 (5)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/21210G.pdf 24LC024]&lt;br /&gt;
|EEPROM&lt;br /&gt;
|U17 (4); U22 (5)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/evaluation-documentation/ADL5375.pdf ADL5375-05]&lt;br /&gt;
|Quadrature Modulator&lt;br /&gt;
|U18 (5)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Drawings==&lt;br /&gt;
* [[File:cu ettus-cca-cbx.pdf]]&lt;br /&gt;
&lt;br /&gt;
==RF Connectors==&lt;br /&gt;
* The CBX daughterboard features female SMA connectors for both the TX/RX and RX2 connectors.&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;
===CBX-40/CBX-120===&lt;br /&gt;
* [[Media:volatility UBX CBX WBX SBX r1 1.pdf]]&lt;br /&gt;
&lt;br /&gt;
==RF Performance Data==&lt;br /&gt;
* [http://files.ettus.com/performance_data/cbx/CBX-without-UHD-corrections.pdf CBX without UHD Corrections]&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;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=E310/E312&amp;diff=3520</id>
		<title>E310/E312</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=E310/E312&amp;diff=3520"/>
				<updated>2017-05-12T11:33:35Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: /* RF Specifications */&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;
* [http://files.ettus.com/e3xx_images/ http://files.ettus.com/e3xx_images/]&lt;br /&gt;
&lt;br /&gt;
This folder linked above contains SD card images and the SDK (OE cross-compiler build environment) for the USRP E310 and E312. 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;
The &amp;quot;&amp;lt;code&amp;gt;alpha&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;beta&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;e3xx-release-001&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;e310-release-002&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;e3xx-release-3&amp;lt;/code&amp;gt;&amp;quot; folders contain older versions which are currently obsolete. We do not suggest that customers use these files. These versions are no longer supported. They are provided here for archival purposes only.&lt;br /&gt;
&lt;br /&gt;
The current version is Release 4, which located in the &amp;quot;&amp;lt;code&amp;gt;e3xx-release-4&amp;lt;/code&amp;gt;&amp;quot; folder. We recommend the customers use this version. It is fine if you are already successfully using an older version, but at some point it is recommended that you upgrade to this 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 Release 4 image includes UHD 3.9.2 and GNU Radio 3.7.9, and also includes 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 E310/E312. The FPGA images are located in the file system of the E310/E312 in the &amp;lt;code&amp;gt;/usr/local/share/uhd/images&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
&lt;br /&gt;
There are two SD card image files for each version of the image, which include the text &amp;quot;&amp;lt;code&amp;gt;-dev&amp;lt;/code&amp;gt;&amp;quot; and &amp;quot;&amp;lt;code&amp;gt;-demo&amp;lt;/code&amp;gt;&amp;quot; in the filename. The &amp;quot;&amp;lt;code&amp;gt;-dev&amp;lt;/code&amp;gt;&amp;quot; flavor lacks some graphical packages, such as X Windows and QT, which the &amp;quot;&amp;lt;code&amp;gt;-demo&amp;lt;/code&amp;gt;&amp;quot; flavor includes. The two flavors are otherwise functionally equivalent, although the &amp;quot;&amp;lt;code&amp;gt;-demo&amp;lt;/code&amp;gt;&amp;quot; flavor takes some additional space on the SD card and some additional memory to run.&lt;br /&gt;
&lt;br /&gt;
The Release 4 image comes in two varieties. The variety that you will need depends on the product number of your E310 or E312, which is printed on the bottom of the device.&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, the images under the &amp;quot;&amp;lt;code&amp;gt;ettus-e3xx-sg1&amp;lt;/code&amp;gt;&amp;quot; folder should be used. For devices where X is E or later, the images under the &amp;quot;&amp;lt;code&amp;gt;ettus-e3xx-sg3&amp;lt;/code&amp;gt;&amp;quot; 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;140605X-01L&amp;lt;/code&amp;gt;, where X is a letter from A to Z. The images under the &amp;quot;&amp;lt;code&amp;gt;ettus-e3xx-sg3&amp;lt;/code&amp;gt;&amp;quot; folder should be used for all E312 devices.&lt;br /&gt;
&lt;br /&gt;
You can burn the image to an SD card using either the &amp;quot;&amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt;&amp;quot; or the &amp;quot;&amp;lt;code&amp;gt;bmaptool&amp;lt;/code&amp;gt;&amp;quot; tool. Instructions on how to use these tools are at the links below.&lt;br /&gt;
&lt;br /&gt;
* http://files.ettus.com/manual/page_usrp_e3x0.html#e3x0_upgrade_sd_card&lt;br /&gt;
&lt;br /&gt;
* https://gnuradio.org/redmine/projects/gnuradio/wiki/Copy_an_image_file_to_the_SD_card&lt;br /&gt;
&lt;br /&gt;
The SD image files have an *.xz extension, as they are compressed using the LZMA/LZMA2 compression algorithms. You can uncompress these files with tools such as 7-Zip and the XZ Utils. 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;
'''XZ Utils'''&lt;br /&gt;
* http://tukaani.org/xz/&lt;br /&gt;
* https://en.wikipedia.org/wiki/XZ_Utils&lt;br /&gt;
&lt;br /&gt;
The folder structure is listed below.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
|-- alpha&lt;br /&gt;
|   |-- dizzy-test&lt;br /&gt;
|   |   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.manifest&lt;br /&gt;
|   |   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.sh&lt;br /&gt;
|   |   |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
|   |   `-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
|   |-- fido-rfnoc-test&lt;br /&gt;
|   |   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.manifest&lt;br /&gt;
|   |   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.sh&lt;br /&gt;
|   |   |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
|   |   |-- sdimage-gnuradio-demo.direct.xz.md5&lt;br /&gt;
|   |   |-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
|   |   `-- sdimage-gnuradio-dev.direct.xz.md5&lt;br /&gt;
|   |-- fido-test&lt;br /&gt;
|   |   |-- ettus-e3xx-sg1&lt;br /&gt;
|   |   |   |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
|   |   |   |-- sdimage-gnuradio-demo.direct.xz.md5&lt;br /&gt;
|   |   |   |-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
|   |   |   `-- sdimage-gnuradio-dev.direct.xz.md5&lt;br /&gt;
|   |   |-- ettus-e3xx-sg3&lt;br /&gt;
|   |   |   |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
|   |   |   |-- sdimage-gnuradio-demo.direct.xz.md5&lt;br /&gt;
|   |   |   |-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
|   |   |   `-- sdimage-gnuradio-dev.direct.xz.md5&lt;br /&gt;
|   |   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.manifest&lt;br /&gt;
|   |   `-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.sh&lt;br /&gt;
|   `-- fosphor-testing&lt;br /&gt;
|       |-- fosphor.direct.xz&lt;br /&gt;
|       |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.host.manifest&lt;br /&gt;
|       |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.sh&lt;br /&gt;
|       |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.target.manifest&lt;br /&gt;
|       |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
|       |-- sdimage-gnuradio-demo.direct.xz.md5&lt;br /&gt;
|       |-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
|       `-- sdimage-gnuradio-dev.direct.xz.md5&lt;br /&gt;
|-- beta&lt;br /&gt;
|   |-- dizzy-test&lt;br /&gt;
|   |   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.manifest&lt;br /&gt;
|   |   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.sh&lt;br /&gt;
|   |   |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
|   |   `-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
|   `-- dizzy-test-wifi&lt;br /&gt;
|       `-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
|-- e310-release-002&lt;br /&gt;
|   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.manifest&lt;br /&gt;
|   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.sh&lt;br /&gt;
|   |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
|   |-- sdimage-gnuradio-demo.direct.xz.md5sum&lt;br /&gt;
|   |-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
|   `-- sdimage-gnuradio-dev.direct.xz.md5sum&lt;br /&gt;
|-- e3xx-release-001&lt;br /&gt;
|   |-- e300-gnuradio-dev-image-release1.bz&lt;br /&gt;
|   `-- nodistro-eglibc-x86_64-gnuradio-dev-image-armv7ahf-vfp-neon-toolchain-nodistro.0.sh&lt;br /&gt;
|-- e3xx-release-3&lt;br /&gt;
|   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.manifest&lt;br /&gt;
|   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.sh&lt;br /&gt;
|   |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
|   `-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
`-- e3xx-release-4&lt;br /&gt;
    |-- ettus-e3xx-sg1&lt;br /&gt;
    |   |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
    |   |-- sdimage-gnuradio-demo.direct.xz.md5&lt;br /&gt;
    |   |-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
    |   `-- sdimage-gnuradio-dev.direct.xz.md5&lt;br /&gt;
    |-- ettus-e3xx-sg3&lt;br /&gt;
    |   |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
    |   |-- sdimage-gnuradio-demo.direct.xz.md5&lt;br /&gt;
    |   |-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
    |   `-- sdimage-gnuradio-dev.direct.xz.md5&lt;br /&gt;
    |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.manifest&lt;br /&gt;
    `-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=E310/E312&amp;diff=3519</id>
		<title>E310/E312</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=E310/E312&amp;diff=3519"/>
				<updated>2017-05-12T11:33:17Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: /* RF Specifications */&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;
&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;
* [http://files.ettus.com/e3xx_images/ http://files.ettus.com/e3xx_images/]&lt;br /&gt;
&lt;br /&gt;
This folder linked above contains SD card images and the SDK (OE cross-compiler build environment) for the USRP E310 and E312. 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;
The &amp;quot;&amp;lt;code&amp;gt;alpha&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;beta&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;e3xx-release-001&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;e310-release-002&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;e3xx-release-3&amp;lt;/code&amp;gt;&amp;quot; folders contain older versions which are currently obsolete. We do not suggest that customers use these files. These versions are no longer supported. They are provided here for archival purposes only.&lt;br /&gt;
&lt;br /&gt;
The current version is Release 4, which located in the &amp;quot;&amp;lt;code&amp;gt;e3xx-release-4&amp;lt;/code&amp;gt;&amp;quot; folder. We recommend the customers use this version. It is fine if you are already successfully using an older version, but at some point it is recommended that you upgrade to this 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 Release 4 image includes UHD 3.9.2 and GNU Radio 3.7.9, and also includes 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 E310/E312. The FPGA images are located in the file system of the E310/E312 in the &amp;lt;code&amp;gt;/usr/local/share/uhd/images&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
&lt;br /&gt;
There are two SD card image files for each version of the image, which include the text &amp;quot;&amp;lt;code&amp;gt;-dev&amp;lt;/code&amp;gt;&amp;quot; and &amp;quot;&amp;lt;code&amp;gt;-demo&amp;lt;/code&amp;gt;&amp;quot; in the filename. The &amp;quot;&amp;lt;code&amp;gt;-dev&amp;lt;/code&amp;gt;&amp;quot; flavor lacks some graphical packages, such as X Windows and QT, which the &amp;quot;&amp;lt;code&amp;gt;-demo&amp;lt;/code&amp;gt;&amp;quot; flavor includes. The two flavors are otherwise functionally equivalent, although the &amp;quot;&amp;lt;code&amp;gt;-demo&amp;lt;/code&amp;gt;&amp;quot; flavor takes some additional space on the SD card and some additional memory to run.&lt;br /&gt;
&lt;br /&gt;
The Release 4 image comes in two varieties. The variety that you will need depends on the product number of your E310 or E312, which is printed on the bottom of the device.&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, the images under the &amp;quot;&amp;lt;code&amp;gt;ettus-e3xx-sg1&amp;lt;/code&amp;gt;&amp;quot; folder should be used. For devices where X is E or later, the images under the &amp;quot;&amp;lt;code&amp;gt;ettus-e3xx-sg3&amp;lt;/code&amp;gt;&amp;quot; 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;140605X-01L&amp;lt;/code&amp;gt;, where X is a letter from A to Z. The images under the &amp;quot;&amp;lt;code&amp;gt;ettus-e3xx-sg3&amp;lt;/code&amp;gt;&amp;quot; folder should be used for all E312 devices.&lt;br /&gt;
&lt;br /&gt;
You can burn the image to an SD card using either the &amp;quot;&amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt;&amp;quot; or the &amp;quot;&amp;lt;code&amp;gt;bmaptool&amp;lt;/code&amp;gt;&amp;quot; tool. Instructions on how to use these tools are at the links below.&lt;br /&gt;
&lt;br /&gt;
* http://files.ettus.com/manual/page_usrp_e3x0.html#e3x0_upgrade_sd_card&lt;br /&gt;
&lt;br /&gt;
* https://gnuradio.org/redmine/projects/gnuradio/wiki/Copy_an_image_file_to_the_SD_card&lt;br /&gt;
&lt;br /&gt;
The SD image files have an *.xz extension, as they are compressed using the LZMA/LZMA2 compression algorithms. You can uncompress these files with tools such as 7-Zip and the XZ Utils. 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;
'''XZ Utils'''&lt;br /&gt;
* http://tukaani.org/xz/&lt;br /&gt;
* https://en.wikipedia.org/wiki/XZ_Utils&lt;br /&gt;
&lt;br /&gt;
The folder structure is listed below.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
|-- alpha&lt;br /&gt;
|   |-- dizzy-test&lt;br /&gt;
|   |   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.manifest&lt;br /&gt;
|   |   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.sh&lt;br /&gt;
|   |   |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
|   |   `-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
|   |-- fido-rfnoc-test&lt;br /&gt;
|   |   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.manifest&lt;br /&gt;
|   |   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.sh&lt;br /&gt;
|   |   |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
|   |   |-- sdimage-gnuradio-demo.direct.xz.md5&lt;br /&gt;
|   |   |-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
|   |   `-- sdimage-gnuradio-dev.direct.xz.md5&lt;br /&gt;
|   |-- fido-test&lt;br /&gt;
|   |   |-- ettus-e3xx-sg1&lt;br /&gt;
|   |   |   |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
|   |   |   |-- sdimage-gnuradio-demo.direct.xz.md5&lt;br /&gt;
|   |   |   |-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
|   |   |   `-- sdimage-gnuradio-dev.direct.xz.md5&lt;br /&gt;
|   |   |-- ettus-e3xx-sg3&lt;br /&gt;
|   |   |   |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
|   |   |   |-- sdimage-gnuradio-demo.direct.xz.md5&lt;br /&gt;
|   |   |   |-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
|   |   |   `-- sdimage-gnuradio-dev.direct.xz.md5&lt;br /&gt;
|   |   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.manifest&lt;br /&gt;
|   |   `-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.sh&lt;br /&gt;
|   `-- fosphor-testing&lt;br /&gt;
|       |-- fosphor.direct.xz&lt;br /&gt;
|       |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.host.manifest&lt;br /&gt;
|       |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.sh&lt;br /&gt;
|       |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.target.manifest&lt;br /&gt;
|       |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
|       |-- sdimage-gnuradio-demo.direct.xz.md5&lt;br /&gt;
|       |-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
|       `-- sdimage-gnuradio-dev.direct.xz.md5&lt;br /&gt;
|-- beta&lt;br /&gt;
|   |-- dizzy-test&lt;br /&gt;
|   |   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.manifest&lt;br /&gt;
|   |   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.sh&lt;br /&gt;
|   |   |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
|   |   `-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
|   `-- dizzy-test-wifi&lt;br /&gt;
|       `-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
|-- e310-release-002&lt;br /&gt;
|   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.manifest&lt;br /&gt;
|   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.sh&lt;br /&gt;
|   |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
|   |-- sdimage-gnuradio-demo.direct.xz.md5sum&lt;br /&gt;
|   |-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
|   `-- sdimage-gnuradio-dev.direct.xz.md5sum&lt;br /&gt;
|-- e3xx-release-001&lt;br /&gt;
|   |-- e300-gnuradio-dev-image-release1.bz&lt;br /&gt;
|   `-- nodistro-eglibc-x86_64-gnuradio-dev-image-armv7ahf-vfp-neon-toolchain-nodistro.0.sh&lt;br /&gt;
|-- e3xx-release-3&lt;br /&gt;
|   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.manifest&lt;br /&gt;
|   |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.sh&lt;br /&gt;
|   |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
|   `-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
`-- e3xx-release-4&lt;br /&gt;
    |-- ettus-e3xx-sg1&lt;br /&gt;
    |   |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
    |   |-- sdimage-gnuradio-demo.direct.xz.md5&lt;br /&gt;
    |   |-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
    |   `-- sdimage-gnuradio-dev.direct.xz.md5&lt;br /&gt;
    |-- ettus-e3xx-sg3&lt;br /&gt;
    |   |-- sdimage-gnuradio-demo.direct.xz&lt;br /&gt;
    |   |-- sdimage-gnuradio-demo.direct.xz.md5&lt;br /&gt;
    |   |-- sdimage-gnuradio-dev.direct.xz&lt;br /&gt;
    |   `-- sdimage-gnuradio-dev.direct.xz.md5&lt;br /&gt;
    |-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.manifest&lt;br /&gt;
    `-- oecore-x86_64-armv7ahf-vfp-neon-toolchain-nodistro.0.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=LFTX/LFRX&amp;diff=3518</id>
		<title>LFTX/LFRX</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=LFTX/LFRX&amp;diff=3518"/>
				<updated>2017-05-12T11:32:53Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: /* Daughterboard Specifications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The LFTX daughterboard utilizes two high-speed operational amplifiers to allow transmission from 0-30 MHz. The LFTX is ideal for applications in the HF band, or for applications using an external front end to up-convert and amplify the intermediate signal. The outputs of the LFTX can be processed independently, or as a single I/Q pair. Example applications include HF communications, radios with external front ends and direct signal generation below 30 MHz.&lt;br /&gt;
&lt;br /&gt;
== Key Features==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* DC-30Mhz coverage&lt;br /&gt;
|[[File:Product basic lfrx.jpg|250px|center]]&lt;br /&gt;
|[[File:Product basic lftx.jpg|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Daughterboard Specifications==&lt;br /&gt;
===Frontends===&lt;br /&gt;
''' LFRX'''&lt;br /&gt;
&lt;br /&gt;
The LFRX has 4 frontends:&lt;br /&gt;
&lt;br /&gt;
* '''Frontend A''': real signal on antenna RXA&lt;br /&gt;
* '''Frontend B''': real signal on antenna RXB&lt;br /&gt;
* '''Frontend AB''': quadrature frontend using both antennas (IQ)&lt;br /&gt;
* '''Frontend BA''': quadrature frontend using both antennas (QI)&lt;br /&gt;
&lt;br /&gt;
'''LFTX'''&lt;br /&gt;
&lt;br /&gt;
The LFTX has 4 frontends:&lt;br /&gt;
&lt;br /&gt;
* '''Frontend A''': real signal on antenna TXA&lt;br /&gt;
* '''Frontend B''': real signal on antenna TXB&lt;br /&gt;
* '''Frontend AB''': quadrature frontend using both antennas (IQ)&lt;br /&gt;
* '''Frontend BA''': quadrature frontend using both antennas (QI)&lt;br /&gt;
&lt;br /&gt;
===Gains===&lt;br /&gt;
'''LFRX'''&lt;br /&gt;
* The LFRX has no tunable elements or programmable gains. Through the magic of aliasing, you can down-convert signals greater than the Nyquist rate of the ADC.&lt;br /&gt;
&lt;br /&gt;
'''LFTX'''&lt;br /&gt;
* The LFTX has no tunable elements or programmable gains. Through the magic of aliasing, you can up-convert signals greater than the Nyquist rate of the DAC.&lt;br /&gt;
&lt;br /&gt;
===Bandwidths===&lt;br /&gt;
'''LFRX'''&lt;br /&gt;
* '''For Real-Mode (A or B frontend)''': 33 MHz&lt;br /&gt;
* '''For Complex (AB or BA frontend)''': 66 MHz&lt;br /&gt;
&lt;br /&gt;
'''LFTX'''&lt;br /&gt;
* '''For Real-Mode (A or B frontend)''': 33 MHz&lt;br /&gt;
* '''For Complex (AB or BA frontend)''': 66 MHz&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;
===LFRX===&lt;br /&gt;
* Current Hardware Revision: 1&lt;br /&gt;
* Minimum version of UHD required: 3.8.0&lt;br /&gt;
&lt;br /&gt;
===LFTX===&lt;br /&gt;
* Current Hardware Revision: 1&lt;br /&gt;
* Minimum version of UHD required: 3.8.0&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* 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;
==USRP Compatibility==&lt;br /&gt;
===LFRX===&lt;br /&gt;
* N or X Series&lt;br /&gt;
&lt;br /&gt;
===LFTX===&lt;br /&gt;
* N or X Series&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
===LFRX===&lt;br /&gt;
[http://files.ettus.com/schematics/lfrx/lfrx.pdf LFRX Schematics]&lt;br /&gt;
&lt;br /&gt;
===LFTX===&lt;br /&gt;
[http://files.ettus.com/schematics/lftx/lftx.pdf LFTX 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;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/AD8138.pdf AD813x]&lt;br /&gt;
|Differential ADC Driver&lt;br /&gt;
|U2, U3 (1)&lt;br /&gt;
|-&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/3462af.pdf LT3462]&lt;br /&gt;
|DC/DC Converter&lt;br /&gt;
|U3 (1)&lt;br /&gt;
|-&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/21210N.pdf 24LC025B]&lt;br /&gt;
|EEPROM&lt;br /&gt;
|U1 (1)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==RF Connectors==&lt;br /&gt;
* The LFTX / LFRX daughterboard features female SMA connectors for both the TX and RX connectors.&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;
==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;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=SBX&amp;diff=3517</id>
		<title>SBX</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=SBX&amp;diff=3517"/>
				<updated>2017-05-12T11:32:28Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: /* RF Specifications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The SBX is a wide bandwidth transceiver that provides up to 100 mW of output power, and a typical noise figure of 5 dB. The local oscillators for the receive and transmit chains operate independently, which allows dual-band operation. The SBX is MIMO capable, and provides 40 MHz or 120 MHz of bandwidth. The SBX is ideal for applications requiring access to a variety of bands in the 400 MHz-4400 MHz range. Example application areas include WiFi, WiMax, S-band transceivers and 2.4 GHz ISM band transceivers.&lt;br /&gt;
&lt;br /&gt;
The SBX is capable of phase coherent operation, and therefore is suitable for MIMO and Phased Array applications.&lt;br /&gt;
&lt;br /&gt;
==Key Features==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Frequency Range: 400MHz - 4.4GHz&lt;br /&gt;
* Versions: 40MHz / 120MHz&lt;br /&gt;
* Power Output: 100mW&lt;br /&gt;
|[[File:Product sbx 40.jpg|250px|center]] &lt;br /&gt;
|[[File:Product sbx 120.jpg|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Daughterboard Specifications==&lt;br /&gt;
===Features===&lt;br /&gt;
* 2 quadrature frontends (1 transmit, 1 receive)&lt;br /&gt;
** Defaults to direct conversion&lt;br /&gt;
** Can be used in low IF mode through lo_offset with uhd::tune_request_t&lt;br /&gt;
* Independent receive and transmit LO's and synthesizers&lt;br /&gt;
** Allows for full-duplex operation on different transmit and receive frequencies&lt;br /&gt;
** Can be set to use Integer-N tuning for better spur performance with uhd::tune_request_t&lt;br /&gt;
&lt;br /&gt;
===Antennas===&lt;br /&gt;
Transmit: '''TX/RX'''&lt;br /&gt;
&lt;br /&gt;
Receive: '''TX/RX''' or '''RX2'''&lt;br /&gt;
* '''Frontend 0:''' Complex baseband signal for selected antenna&lt;br /&gt;
* '''Note:''' The user may set the receive antenna to be TX/RX or RX2. However, when using an SBX board in full-duplex mode, the receive antenna will always be set to RX2, regardless of the settings.&lt;br /&gt;
&lt;br /&gt;
===Gains===&lt;br /&gt;
* Transmit Gains: '''PGA0''', Range: 0-31.5dB&lt;br /&gt;
* Receive Gains: '''PGA0''', Range: 0-31.5dB&lt;br /&gt;
&lt;br /&gt;
===Bandwidths===&lt;br /&gt;
* SBX: 40 MHz, RX &amp;amp; TX&lt;br /&gt;
* SBX-120: 120 MHz, RX &amp;amp; TX&lt;br /&gt;
&lt;br /&gt;
===Sensors===&lt;br /&gt;
* '''lo_locked:''' boolean for LO lock state&lt;br /&gt;
&lt;br /&gt;
===LEDs===&lt;br /&gt;
* All LEDs flash when daughterboard control is initialized&lt;br /&gt;
* '''TX LD''': Transmit Synthesizer Lock Detect&lt;br /&gt;
* '''TX/RX''': Receiver on TX/RX antenna port (No TX)&lt;br /&gt;
* '''RX LD''': Receive Synthesizer Lock Detect&lt;br /&gt;
* '''RX1/RX2''': Receiver on RX2 antenna port&lt;br /&gt;
&lt;br /&gt;
==RF Specifications==&lt;br /&gt;
'''Freq Range'''&lt;br /&gt;
* 400MHz - 4.4GHz&lt;br /&gt;
&lt;br /&gt;
'''Noise Figure'''&lt;br /&gt;
* 4 - 5 dB @ (400MHz ~ 1.5GHz) &lt;br /&gt;
* 5 - 7 dB @ (1.5GHz ~ 3GHz) &lt;br /&gt;
* 7 - 12dB @ (3GHz ~ 4.4GHz)&lt;br /&gt;
&lt;br /&gt;
'''RX IIP3 (Max)''' &lt;br /&gt;
* 16 ~ 22 dBm&lt;br /&gt;
&lt;br /&gt;
'''RX IQ Imbalance'''&lt;br /&gt;
* -20 dBc @ (400MHz ~ 600MHz) &lt;br /&gt;
* -30dBc @ (600MHz ~ 4.4GHz)&lt;br /&gt;
&lt;br /&gt;
'''TX Power (Max)'''&lt;br /&gt;
* 20 dBm @ (400MHz ~ 3.5GHz)&lt;br /&gt;
* 18 - 20dBm @ (3.5GHz ~ 4.4GHz)&lt;br /&gt;
&lt;br /&gt;
'''TX OIP3'''&lt;br /&gt;
* 26 - 30dBm @ (400MHz ~ 1.5GHz) &lt;br /&gt;
* 30 dBm @ (1.5GHz ~ 4.4GHz)&lt;br /&gt;
&lt;br /&gt;
'''TX IQ Imbalance'''&lt;br /&gt;
* -20 dBc @ (400MHz ~ 600MHz) &lt;br /&gt;
* -30dBc @ (600MHz ~ 4.4GHz)&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;
===SBX===&lt;br /&gt;
* Current Hardware Revision: 5.1&lt;br /&gt;
* Minimum version of UHD required: 3.8.0&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* 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;
==USRP Compatibility==&lt;br /&gt;
===SBX-40===&lt;br /&gt;
* N or X Series&lt;br /&gt;
&lt;br /&gt;
===SBX-120===&lt;br /&gt;
* X Series only&lt;br /&gt;
&lt;br /&gt;
==Phase Synchronization==&lt;br /&gt;
The SBX daughterboard is capable of phase-synchronous operation, and is recommended for phase-coherent applications. The UBX and TwinRX daughterboards are also recommended for phase-coherent applications.&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
===SBX===&lt;br /&gt;
[http://files.ettus.com/schematics/sbx/SBX.pdf SBX 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.avagotech.com/docs/AV02-1985EN MGA82563]&lt;br /&gt;
|Amplifier&lt;br /&gt;
|U1, U5, U4 (1)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.skyworksinc.com/uploads/documents/AS225_313LF_200148E.pdf AS225-313LF]&lt;br /&gt;
|SPDT Switch&lt;br /&gt;
|U3, U6 (1)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://media.digikey.com/pdf/Data%20Sheets/Analog%20Devices%20PDFs/HMC624LP4E.pdf HMC624LP4E]&lt;br /&gt;
|ATTENUATOR&lt;br /&gt;
|U2, U7 (1)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.minicircuits.com/pdfs/LFCN-5850+.pdf LFCN-5850+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|FL1 (1)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/PHA-1+.pdf PHA-1+]&lt;br /&gt;
|Amplifier&lt;br /&gt;
|U8 (1)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/GVA-84+.pdf GVA-84+]&lt;br /&gt;
|Amplifier&lt;br /&gt;
|U9 (1)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADL5380.pdf ADL5380ACPZ]&lt;br /&gt;
|Quadrature Demodulator&lt;br /&gt;
|U11 (2)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADA4927-1_ADA4927-2.pdf ADA4927-2YCPZ]&lt;br /&gt;
|Differential ADC Driver&lt;br /&gt;
|U10 (2)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/AD8591_8592_8594.pdf AD8591ARTZ-REEL]&lt;br /&gt;
|Amplifiers&lt;br /&gt;
|U31 (2)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADF4350.pdf ADF4350BCPZ]&lt;br /&gt;
|Synthesizer with Integrated VCO&lt;br /&gt;
|U23 (3); U24 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.skyworksinc.com/uploads/documents/200027E.pdf SKY13267]&lt;br /&gt;
|Diversity Switch&lt;br /&gt;
|U12 (3); U25 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-1200.pdf LFCN-1200+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|FL13 (3); FL12 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.minicircuits.com/pdfs/TC1-1-43A+.pdf TC1-1-43A+]&lt;br /&gt;
|RF Transformer&lt;br /&gt;
|T3 (2); T2, T5 (3); T4, T6 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/lp3878-adj.pdf LP3878MR-ADJ]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U13, U14 (4); U19, U20 (5)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.fairchildsemi.com/datasheets/NC/NC7WZ04.pdf NC7WZ04P6X]&lt;br /&gt;
|Dual Inverter&lt;br /&gt;
|U15, U16 (4); U21 (5); U27 (6); U26 (3)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/21210G.pdf 24LC024]&lt;br /&gt;
|EEPROM&lt;br /&gt;
|U17 (4); U22 (5)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/evaluation-documentation/ADL5375.pdf ADL5375]&lt;br /&gt;
|Quadrature Modulator&lt;br /&gt;
|U18 (5)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Drawings==&lt;br /&gt;
* [[File:cu ettus-cca-sbx.pdf]]&lt;br /&gt;
&lt;br /&gt;
==RF Connectors==&lt;br /&gt;
* The SBX daughterboard features female SMA connectors for both the TX/RX and RX2 connectors.&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;
===SBX-40/SBX-120===&lt;br /&gt;
* [[Media:volatility UBX CBX WBX SBX r1 1.pdf]]&lt;br /&gt;
&lt;br /&gt;
==RF Performance Data==&lt;br /&gt;
* [http://files.ettus.com/performance_data/sbx/SBX-without-UHD-corrections.pdf SBX without UHD Corrections]&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;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=SBX&amp;diff=3516</id>
		<title>SBX</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=SBX&amp;diff=3516"/>
				<updated>2017-05-12T11:32:15Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: /* RF Specifications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The SBX is a wide bandwidth transceiver that provides up to 100 mW of output power, and a typical noise figure of 5 dB. The local oscillators for the receive and transmit chains operate independently, which allows dual-band operation. The SBX is MIMO capable, and provides 40 MHz or 120 MHz of bandwidth. The SBX is ideal for applications requiring access to a variety of bands in the 400 MHz-4400 MHz range. Example application areas include WiFi, WiMax, S-band transceivers and 2.4 GHz ISM band transceivers.&lt;br /&gt;
&lt;br /&gt;
The SBX is capable of phase coherent operation, and therefore is suitable for MIMO and Phased Array applications.&lt;br /&gt;
&lt;br /&gt;
==Key Features==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Frequency Range: 400MHz - 4.4GHz&lt;br /&gt;
* Versions: 40MHz / 120MHz&lt;br /&gt;
* Power Output: 100mW&lt;br /&gt;
|[[File:Product sbx 40.jpg|250px|center]] &lt;br /&gt;
|[[File:Product sbx 120.jpg|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Daughterboard Specifications==&lt;br /&gt;
===Features===&lt;br /&gt;
* 2 quadrature frontends (1 transmit, 1 receive)&lt;br /&gt;
** Defaults to direct conversion&lt;br /&gt;
** Can be used in low IF mode through lo_offset with uhd::tune_request_t&lt;br /&gt;
* Independent receive and transmit LO's and synthesizers&lt;br /&gt;
** Allows for full-duplex operation on different transmit and receive frequencies&lt;br /&gt;
** Can be set to use Integer-N tuning for better spur performance with uhd::tune_request_t&lt;br /&gt;
&lt;br /&gt;
===Antennas===&lt;br /&gt;
Transmit: '''TX/RX'''&lt;br /&gt;
&lt;br /&gt;
Receive: '''TX/RX''' or '''RX2'''&lt;br /&gt;
* '''Frontend 0:''' Complex baseband signal for selected antenna&lt;br /&gt;
* '''Note:''' The user may set the receive antenna to be TX/RX or RX2. However, when using an SBX board in full-duplex mode, the receive antenna will always be set to RX2, regardless of the settings.&lt;br /&gt;
&lt;br /&gt;
===Gains===&lt;br /&gt;
* Transmit Gains: '''PGA0''', Range: 0-31.5dB&lt;br /&gt;
* Receive Gains: '''PGA0''', Range: 0-31.5dB&lt;br /&gt;
&lt;br /&gt;
===Bandwidths===&lt;br /&gt;
* SBX: 40 MHz, RX &amp;amp; TX&lt;br /&gt;
* SBX-120: 120 MHz, RX &amp;amp; TX&lt;br /&gt;
&lt;br /&gt;
===Sensors===&lt;br /&gt;
* '''lo_locked:''' boolean for LO lock state&lt;br /&gt;
&lt;br /&gt;
===LEDs===&lt;br /&gt;
* All LEDs flash when daughterboard control is initialized&lt;br /&gt;
* '''TX LD''': Transmit Synthesizer Lock Detect&lt;br /&gt;
* '''TX/RX''': Receiver on TX/RX antenna port (No TX)&lt;br /&gt;
* '''RX LD''': Receive Synthesizer Lock Detect&lt;br /&gt;
* '''RX1/RX2''': Receiver on RX2 antenna port&lt;br /&gt;
&lt;br /&gt;
==RF Specifications==&lt;br /&gt;
'''Freq Range'''&lt;br /&gt;
* 400MHz - 4.4GHz&lt;br /&gt;
&lt;br /&gt;
'''Noise Figure'''&lt;br /&gt;
* 4 - 5 dB @ (400MHz ~ 1.5GHz) &lt;br /&gt;
* 5 - 7 dB @ (1.5GHz ~ 3GHz) &lt;br /&gt;
* 7 - 12dB @ (3GHz ~ 4.4GHz)&lt;br /&gt;
&lt;br /&gt;
'''RX IIP3 (Max)''' &lt;br /&gt;
* 16 ~ 22 dBm&lt;br /&gt;
&lt;br /&gt;
'''RX IQ Imbalance'''&lt;br /&gt;
* -20 dBc @ (400MHz ~ 600MHz) &lt;br /&gt;
* -30dBc @ (600MHz ~ 4.4GHz)&lt;br /&gt;
&lt;br /&gt;
'''TX Power (Max)'''&lt;br /&gt;
* 20 dBm @ (400MHz ~ 3.5GHz)&lt;br /&gt;
* 18 - 20dBm @ (3.5GHz ~ 4.4GHz)&lt;br /&gt;
&lt;br /&gt;
'''TX OIP3'''&lt;br /&gt;
* 26 - 30dBm @ (400MHz ~ 1.5GHz) &lt;br /&gt;
* 30 dBm @ (1.5GHz ~ 4.4GHz)&lt;br /&gt;
&lt;br /&gt;
'''TX IQ Imbalance'''&lt;br /&gt;
* -20 dBc @ (400MHz ~ 600MHz) &lt;br /&gt;
* -30dBc @ (600MHz ~ 4.4GHz)&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;
===SBX===&lt;br /&gt;
* Current Hardware Revision: 5.1&lt;br /&gt;
* Minimum version of UHD required: 3.8.0&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* 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;
==USRP Compatibility==&lt;br /&gt;
===SBX-40===&lt;br /&gt;
* N or X Series&lt;br /&gt;
&lt;br /&gt;
===SBX-120===&lt;br /&gt;
* X Series only&lt;br /&gt;
&lt;br /&gt;
==Phase Synchronization==&lt;br /&gt;
The SBX daughterboard is capable of phase-synchronous operation, and is recommended for phase-coherent applications. The UBX and TwinRX daughterboards are also recommended for phase-coherent applications.&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
===SBX===&lt;br /&gt;
[http://files.ettus.com/schematics/sbx/SBX.pdf SBX 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.avagotech.com/docs/AV02-1985EN MGA82563]&lt;br /&gt;
|Amplifier&lt;br /&gt;
|U1, U5, U4 (1)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.skyworksinc.com/uploads/documents/AS225_313LF_200148E.pdf AS225-313LF]&lt;br /&gt;
|SPDT Switch&lt;br /&gt;
|U3, U6 (1)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://media.digikey.com/pdf/Data%20Sheets/Analog%20Devices%20PDFs/HMC624LP4E.pdf HMC624LP4E]&lt;br /&gt;
|ATTENUATOR&lt;br /&gt;
|U2, U7 (1)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.minicircuits.com/pdfs/LFCN-5850+.pdf LFCN-5850+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|FL1 (1)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/PHA-1+.pdf PHA-1+]&lt;br /&gt;
|Amplifier&lt;br /&gt;
|U8 (1)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/GVA-84+.pdf GVA-84+]&lt;br /&gt;
|Amplifier&lt;br /&gt;
|U9 (1)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADL5380.pdf ADL5380ACPZ]&lt;br /&gt;
|Quadrature Demodulator&lt;br /&gt;
|U11 (2)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADA4927-1_ADA4927-2.pdf ADA4927-2YCPZ]&lt;br /&gt;
|Differential ADC Driver&lt;br /&gt;
|U10 (2)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/AD8591_8592_8594.pdf AD8591ARTZ-REEL]&lt;br /&gt;
|Amplifiers&lt;br /&gt;
|U31 (2)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADF4350.pdf ADF4350BCPZ]&lt;br /&gt;
|Synthesizer with Integrated VCO&lt;br /&gt;
|U23 (3); U24 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.skyworksinc.com/uploads/documents/200027E.pdf SKY13267]&lt;br /&gt;
|Diversity Switch&lt;br /&gt;
|U12 (3); U25 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-1200.pdf LFCN-1200+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|FL13 (3); FL12 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.minicircuits.com/pdfs/TC1-1-43A+.pdf TC1-1-43A+]&lt;br /&gt;
|RF Transformer&lt;br /&gt;
|T3 (2); T2, T5 (3); T4, T6 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/lp3878-adj.pdf LP3878MR-ADJ]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U13, U14 (4); U19, U20 (5)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.fairchildsemi.com/datasheets/NC/NC7WZ04.pdf NC7WZ04P6X]&lt;br /&gt;
|Dual Inverter&lt;br /&gt;
|U15, U16 (4); U21 (5); U27 (6); U26 (3)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/21210G.pdf 24LC024]&lt;br /&gt;
|EEPROM&lt;br /&gt;
|U17 (4); U22 (5)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/evaluation-documentation/ADL5375.pdf ADL5375]&lt;br /&gt;
|Quadrature Modulator&lt;br /&gt;
|U18 (5)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Drawings==&lt;br /&gt;
* [[File:cu ettus-cca-sbx.pdf]]&lt;br /&gt;
&lt;br /&gt;
==RF Connectors==&lt;br /&gt;
* The SBX daughterboard features female SMA connectors for both the TX/RX and RX2 connectors.&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;
===SBX-40/SBX-120===&lt;br /&gt;
* [[Media:volatility UBX CBX WBX SBX r1 1.pdf]]&lt;br /&gt;
&lt;br /&gt;
==RF Performance Data==&lt;br /&gt;
* [http://files.ettus.com/performance_data/sbx/SBX-without-UHD-corrections.pdf SBX without UHD Corrections]&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;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=BasicTX/BasicRX&amp;diff=3515</id>
		<title>BasicTX/BasicRX</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=BasicTX/BasicRX&amp;diff=3515"/>
				<updated>2017-05-12T11:31:47Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: /* Daughterboard Specifications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The BasicRX/BasicTX daughterboards are low-cost daughterboards that provides direct access to the ADC inputs.  The boards can accept real-mode signals from 1 to 250 MHz. The BasicRX/BasicTX is ideal for applications using an external front end providing relatively clean signals within operable bandwidth. Wideband transformers couple each RF input to a single channel of the USRP device's ADC.  The signals sampled by the ADC are manipulated in the FPGA, and can be processed as two real-mode signals, or a single I-Q pair.&lt;br /&gt;
&lt;br /&gt;
== Key Features==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* 1-250 MHz coverage&lt;br /&gt;
* Real or Complex sampling&lt;br /&gt;
|[[File:Product basic rx.jpg|250px|center]] &lt;br /&gt;
|[[File:Product basic tx.jpg|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Daughterboard Specifications==&lt;br /&gt;
===Frontends===&lt;br /&gt;
''' BasicRX'''&lt;br /&gt;
&lt;br /&gt;
The BasicRX has 4 frontends:&lt;br /&gt;
&lt;br /&gt;
* '''Frontend A''': real signal on antenna RXA&lt;br /&gt;
* '''Frontend B''': real signal on antenna RXB&lt;br /&gt;
* '''Frontend AB''': quadrature frontend using both antennas (IQ)&lt;br /&gt;
* '''Frontend BA''': quadrature frontend using both antennas (QI)&lt;br /&gt;
&lt;br /&gt;
'''BasicTX'''&lt;br /&gt;
&lt;br /&gt;
The BasicTX has 4 frontends:&lt;br /&gt;
&lt;br /&gt;
* '''Frontend A''': real signal on antenna TXA&lt;br /&gt;
* '''Frontend B''': real signal on antenna TXB&lt;br /&gt;
* '''Frontend AB''': quadrature frontend using both antennas (IQ)&lt;br /&gt;
* '''Frontend BA''': quadrature frontend using both antennas (QI)&lt;br /&gt;
&lt;br /&gt;
===Gains===&lt;br /&gt;
'''BasicRX'''&lt;br /&gt;
* The BasicRX has no tunable elements or programmable gains. Through the magic of aliasing, you can down-convert signals greater than the Nyquist rate of the ADC.&lt;br /&gt;
&lt;br /&gt;
'''BasicTX'''&lt;br /&gt;
* The BasicTX has no tunable elements or programmable gains. Through the magic of aliasing, you can up-convert signals greater than the Nyquist rate of the DAC.&lt;br /&gt;
&lt;br /&gt;
===Bandwidths===&lt;br /&gt;
'''BasicRX'''&lt;br /&gt;
* '''For Real-Mode (A or B frontend)''': 250 MHz&lt;br /&gt;
* '''For Complex (AB or BA frontend)''': 500 MHz&lt;br /&gt;
&lt;br /&gt;
'''BasicTX'''&lt;br /&gt;
* '''For Real-Mode (A or B frontend)''': 250 MHz&lt;br /&gt;
* '''For Complex (AB or BA frontend)''': 500 MHz&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;
===BasicRX===&lt;br /&gt;
* Current Hardware Revision: 1&lt;br /&gt;
* Minimum version of UHD required: 3.8.0&lt;br /&gt;
&lt;br /&gt;
===BasicTX===&lt;br /&gt;
* Current Hardware Revision: 1&lt;br /&gt;
* Minimum version of UHD required: 3.8.0&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* 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;
==USRP Compatibility==&lt;br /&gt;
===BasicRX===&lt;br /&gt;
* N or X Series&lt;br /&gt;
&lt;br /&gt;
===BasicTX===&lt;br /&gt;
* N or X Series&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
===Basic RX===&lt;br /&gt;
[http://files.ettus.com/schematics/basic_dbs/BasicRX.pdf Basic RX Schematics]&lt;br /&gt;
&lt;br /&gt;
===Basic TX===&lt;br /&gt;
[http://files.ettus.com/schematics/basic_dbs/BasicTX.pdf Basic TX 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://ww1.microchip.com/downloads/en/DeviceDoc/21210N.pdf 24LC025B]&lt;br /&gt;
|EEPROM&lt;br /&gt;
|U1 (1); U52 (1)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/ADT1-1WT.pdf ADT1−1WT]&lt;br /&gt;
|RF Transformer&lt;br /&gt;
|T1 (1); T2 (1); T50 (1); T51 (1)&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Mechanical Information==&lt;br /&gt;
===Drawings===&lt;br /&gt;
* BasicRX - [[File:cu ettus-cca-basic-rx.pdf]]&lt;br /&gt;
&lt;br /&gt;
==RF Connectors==&lt;br /&gt;
* The BasicTX/RX daughterboard features female SMA connectors for both the RX and TX connectors.&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;
==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;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=WBX&amp;diff=3514</id>
		<title>WBX</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=WBX&amp;diff=3514"/>
				<updated>2017-05-12T11:31:17Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: /* RF Specifications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The WBX is a wide bandwidth transceiver that provides up to 100 mW of output power and a noise figure of 5 dB. The LO's for the receive and transmit chains operate independently.&lt;br /&gt;
&lt;br /&gt;
The WBX provides phase coherent operation, although with a 180-degree ambiguity, which must be calibrated out in the application. For phase-coherent applications, Ettus Research recommends the SBX with the N200/N210 or the SBX or UBX with the X300/X310.&lt;br /&gt;
&lt;br /&gt;
== Key Features==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Frequency Range: 50MHz - 2.2GHz&lt;br /&gt;
* Versions: 40MHz / 120MHz&lt;br /&gt;
* Power Output: 100mW&lt;br /&gt;
* Noise Figure: 5dB&lt;br /&gt;
|[[File:Product wbx 40.jpg|250px|center]] &lt;br /&gt;
|[[File:Product wbx 120.jpg|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
==Daughterboard Specifications==&lt;br /&gt;
===Features===&lt;br /&gt;
* 2 quadrature frontends (1 transmit, 1 receive)&lt;br /&gt;
** Defaults to direct conversion&lt;br /&gt;
** Can be used in low IF mode through lo_offset with uhd::tune_request_t&lt;br /&gt;
* Independent receive and transmit LO's and synthesizers&lt;br /&gt;
** Allows for full-duplex operation on different transmit and receive frequencies&lt;br /&gt;
** Can be set to use Integer-N tuning for better spur performance with uhd::tune_request_t&lt;br /&gt;
&lt;br /&gt;
===Antennas===&lt;br /&gt;
Transmit: '''TX/RX'''&lt;br /&gt;
&lt;br /&gt;
Receive: '''TX/RX''' or '''RX2'''&lt;br /&gt;
* '''Frontend 0:''' Complex baseband signal for selected antenna&lt;br /&gt;
* '''Note:''' The user may set the receive antenna to be TX/RX or RX2. However, when using a WBX board in full-duplex mode, the receive antenna will always be set to RX2, regardless of the settings.&lt;br /&gt;
&lt;br /&gt;
===Gains===&lt;br /&gt;
* Transmit Gains: '''PGA0''', Range: 0-25dB&lt;br /&gt;
* Receive Gains: '''PGA0''', Range: 0-31.5dB&lt;br /&gt;
&lt;br /&gt;
===Bandwidths===&lt;br /&gt;
* WBX: 40 MHz, RX &amp;amp; TX&lt;br /&gt;
* WBX-120: 120 MHz, RX &amp;amp; TX&lt;br /&gt;
&lt;br /&gt;
===Sensors===&lt;br /&gt;
* '''lo_locked:''' boolean for LO lock state&lt;br /&gt;
&lt;br /&gt;
==RF Specifications==&lt;br /&gt;
'''Freq Range'''&lt;br /&gt;
* 50MHz - 2.2GHz&lt;br /&gt;
&lt;br /&gt;
'''Noise Figure'''&lt;br /&gt;
* 2 - 4 dB @ (50MHz ~ 1.2GHz) &lt;br /&gt;
* 4 - 8 dB @ (1.2GHz ~ 2.2GHz)&lt;br /&gt;
&lt;br /&gt;
'''RX IIP3 (Max)''' &lt;br /&gt;
* 10 - 18 dBm&lt;br /&gt;
&lt;br /&gt;
'''RX IQ Imbalance'''&lt;br /&gt;
* -30 dBc&lt;br /&gt;
&lt;br /&gt;
'''TX Power (Max)'''&lt;br /&gt;
* 18 - 20 dBm @ (50MHz ~ 1.4 GHz) &lt;br /&gt;
* 12 - 18dBm @ (1.4GHz ~ 2.2 GHz)&lt;br /&gt;
&lt;br /&gt;
'''TX OIP3'''&lt;br /&gt;
* 30 - 32 dBm @ (50MHz ~ 800MHz) &lt;br /&gt;
* 25 - 30 dBm @ (800MHz ~ 2.2GHz)&lt;br /&gt;
&lt;br /&gt;
'''TX IQ Imbalance'''&lt;br /&gt;
* -30 dBc @ (50MHz ~ 1.9GHz) &lt;br /&gt;
*- 24 dBc @ (1.9GHz ~ 2.2GHz)&lt;br /&gt;
&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;
===WBX-40===&lt;br /&gt;
* Current Hardware Revision: 1&lt;br /&gt;
* Minimum version of UHD required: 3.8.0&lt;br /&gt;
&lt;br /&gt;
===WBX-120===&lt;br /&gt;
* Current Hardware Revision: 1&lt;br /&gt;
* Minimum version of UHD required: 3.8.0&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* 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;
==USRP Compatibility==&lt;br /&gt;
===WBX-40===&lt;br /&gt;
* N or X Series&lt;br /&gt;
&lt;br /&gt;
===WBX-120===&lt;br /&gt;
* X Series only&lt;br /&gt;
&lt;br /&gt;
==Phase Synchronization==&lt;br /&gt;
The WBX daughterboard is capable of phase-synchronous operation, but with a with a 180-degree ambiguity, which must be calibrated out in the user application. The SBX, UBX, TwinRX daughterboards are recommended for phase-coherent applications.&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
===WBX===&lt;br /&gt;
[http://files.ettus.com/schematics/wbx/WBX.pdf WBX Schematics]&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/schematics/wbx/wbx_fe.pdf WBX FE 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.analog.com/media/en/technical-documentation/data-sheets/ADA4937-1_4937-2.pdf ADA4937]&lt;br /&gt;
|Ultralow Distortion Differential ADC Driver&lt;br /&gt;
|U304 (2)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADP3336.pdf ADP3336]&lt;br /&gt;
|High Accuracy Ultralow IQ, 500 mA anyCAP® Adjustable Low Dropout Regulator&lt;br /&gt;
|U306, U308 (2); U503, U505 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/evaluation-documentation/ADL5387.pdf ADL5387]&lt;br /&gt;
|50 MHz to 2 GHz Quadrature Demodulator&lt;br /&gt;
|U307 (2)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADL5385.pdf ADL5385]&lt;br /&gt;
|50 MHz to 2200 MHz Quadrature Modulator&lt;br /&gt;
|U501 (4,5)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADF4350.pdf ADF4350] / [http://www.analog.com/media/en/technical-documentation/data-sheets/ADF4351.pdf ADF4351]&lt;br /&gt;
|Wideband Synthesizer with Integrated VCO&lt;br /&gt;
|U201 (3); U401 (5)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://media.digikey.com/pdf/Data%20Sheets/Analog%20Devices%20PDFs/HMC472LP4.pdf HMC472LP4]&lt;br /&gt;
|Attenuator &lt;br /&gt;
|U302 (2); U504 (4,5)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.avagotech.com/docs/AV02-1985EN MGA82563]&lt;br /&gt;
|Amplifier&lt;br /&gt;
|U313 (2)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/21210G.pdf 24LC024]&lt;br /&gt;
|EEPROM&lt;br /&gt;
|U202 (3); U403 (5)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/GVA-84+.pdf GVA−84+]&lt;br /&gt;
|Amplifier&lt;br /&gt;
|U502 (4)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Mechanical Information==&lt;br /&gt;
===Drawings===&lt;br /&gt;
* [[Media:cu ettus-wbx-cca.pdf]]&lt;br /&gt;
&lt;br /&gt;
==RF Connectors==&lt;br /&gt;
* The WBX daughterboard features female MCX connectors for both the TX/RX and RX2 connectors.&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;
===WBX-40/WBX-120===&lt;br /&gt;
* [[Media:volatility UBX CBX WBX SBX r1 1.pdf]]&lt;br /&gt;
&lt;br /&gt;
==RF Performance Data==&lt;br /&gt;
* [http://files.ettus.com/performance_data/wbx/WBX-without-UHD-corrections.pdf WBX without UHD Corrections]&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;
&lt;br /&gt;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=UBX&amp;diff=3513</id>
		<title>UBX</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=UBX&amp;diff=3513"/>
				<updated>2017-05-12T11:29:58Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: /* RF Specifications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The UBX daughterboard is a full-duplex wideband transceiver that covers frequencies from 10 MHz to 6 GHz. Coherent and phase-aligned operation across multiple UBX daughterboards on USRP X Series motherboards enables users to explore MIMO and direction finding applications. The UBX daughterboard works interchangeably with other USRP daughterboards and is supported by the USRP Hardware Driver™ (UHD) software API for seamless integration into existing applications.&lt;br /&gt;
&lt;br /&gt;
The UBX is capable of phase coherent operation, and therefore is suitable for MIMO and Phased Array applications, on the X Series. Additionally this capability is only available on the X Series devices.&lt;br /&gt;
&lt;br /&gt;
== Key Features==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Frequency Range: 10 MHz - 6 GHz&lt;br /&gt;
* Versions: 40MHz / 160MHz&lt;br /&gt;
*RF shielding&lt;br /&gt;
*Full duplex operation with independent TX and RX frequencies&lt;br /&gt;
*Synthesizer synchronization for applications requiring coherent or &amp;lt;br&amp;gt;phase-aligned operation, supported on USRP X Series motherboards only&lt;br /&gt;
|[[File:Product ubx 40.png|250px|center]] &lt;br /&gt;
|[[File:Product ubx 160.png|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Daughterboard Specifications==&lt;br /&gt;
===Features===&lt;br /&gt;
* 2 quadrature frontends (1 transmit, 1 receive)&lt;br /&gt;
** Defaults to direct conversion&lt;br /&gt;
** Can be used in low IF mode through lo_offset with uhd::tune_request_t&lt;br /&gt;
* Independent receive and transmit LO's and synthesizers&lt;br /&gt;
** Allows for full-duplex operation on different transmit and receive frequencies&lt;br /&gt;
** Can be set to use Integer-N tuning for better spur performance with uhd::tune_request_t&lt;br /&gt;
&lt;br /&gt;
===Antennas===&lt;br /&gt;
Transmit: '''TX/RX'''&lt;br /&gt;
&lt;br /&gt;
Receive: '''TX/RX''' or '''RX2'''&lt;br /&gt;
* '''Frontend 0:''' Complex baseband signal for selected antenna&lt;br /&gt;
* '''Note:''' The user may set the receive antenna to be TX/RX or RX2. However, when using a UBX board in full-duplex mode, the receive antenna will always be set to RX2, regardless of the settings.&lt;br /&gt;
&lt;br /&gt;
===Gains===&lt;br /&gt;
* Transmit Gains: '''PGA0''', Range: 0-31.5dB&lt;br /&gt;
* Receive Gains: '''PGA0''', Range: 0-31.5dB&lt;br /&gt;
&lt;br /&gt;
===Bandwidths===&lt;br /&gt;
* UBX: 40 MHz, RX &amp;amp; TX&lt;br /&gt;
* UBX-160: 160 MHz, RX &amp;amp; TX&lt;br /&gt;
&lt;br /&gt;
===Sensors===&lt;br /&gt;
* '''lo_locked:''' boolean for LO lock state&lt;br /&gt;
&lt;br /&gt;
===LEDs===&lt;br /&gt;
* '''LOCK''': Synthesizer Lock Detect&lt;br /&gt;
* '''TX/RX TXD''': Transmitting on TX/RX antenna port&lt;br /&gt;
* '''TX/RX RXD''': Receiving on TX/RX antenna port&lt;br /&gt;
* '''RX2 RXD''': Receiving on RX2 antenna port&lt;br /&gt;
&lt;br /&gt;
==RF Specifications==&lt;br /&gt;
'''Freq Range'''&lt;br /&gt;
* 10MHz - 6GHz&lt;br /&gt;
&lt;br /&gt;
'''Noise Figure'''&lt;br /&gt;
* 10 MHz - 500 MHz: 3 - 4 dB&lt;br /&gt;
* 500 MHz - 1.5 GHz: 2 - 3 dB&lt;br /&gt;
* 1.5GHz - 6GHz: 4 - 10 dB&lt;br /&gt;
&lt;br /&gt;
'''RX IIP3 (Max)''' &lt;br /&gt;
* 10 MHz - 6 GHz: 8 - 9 dBm&lt;br /&gt;
&lt;br /&gt;
'''RX IQ Imbalance'''&lt;br /&gt;
* 10 MHz - 6 GHz: &amp;lt; -30dBc&lt;br /&gt;
&lt;br /&gt;
'''TX Power (Max)'''&lt;br /&gt;
* 10 MHz - 3 GHz: 20 dBm&lt;br /&gt;
* 3 - 6 GHz: 8 - 20 dBm &lt;br /&gt;
&lt;br /&gt;
'''TX OIP3'''&lt;br /&gt;
* 10 - 500 MHz: 41 dBm&lt;br /&gt;
* 0.5 - 3 GHz: 36 dBm&lt;br /&gt;
* 3 - 6 GHz: 26 dBm - 36 dBm&lt;br /&gt;
&lt;br /&gt;
'''TX IQ Imbalance'''&lt;br /&gt;
* 10 MHz - 6 GHz: &amp;lt; -30 dBc&lt;br /&gt;
&lt;br /&gt;
Note: The UBX 160 transmitter path has 160 MHz of bandwidth throughout the full frequency range of the device; the receiver path has 84 MHz of bandwidth for center frequencies from 10 MHz to 500 MHz.&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;
===UBX-40===&lt;br /&gt;
* Current Hardware Revision: 1&lt;br /&gt;
* Minimum version of UHD required: 3.8.2&lt;br /&gt;
&lt;br /&gt;
===UBX-160===&lt;br /&gt;
* Current Hardware Revision: 1&lt;br /&gt;
* Minimum version of UHD required: 3.8.2&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* 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;
==USRP Compatibility==&lt;br /&gt;
===UBX-40===&lt;br /&gt;
* N or X Series&lt;br /&gt;
&lt;br /&gt;
===UBX-160===&lt;br /&gt;
* X Series only&lt;br /&gt;
&lt;br /&gt;
==Phase Synchronization==&lt;br /&gt;
The UBX daughterboard is capable of phase-synchronous operation, and is recommended for phase-coherent applications. The SBX and TwinRX daughterboards are also recommended for phase-coherent applications.&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
===UBX===&lt;br /&gt;
[http://files.ettus.com/schematics/ubx/ubx.pdf UBX 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://datasheets.maximintegrated.com/en/ds/MAX2871.pdf MAX2871]&lt;br /&gt;
|Fractional/Integer-N Synthesizer/VCO&lt;br /&gt;
|U3 (3); U9 (5); U19 (7); U23 (9)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/evaluation-documentation/ADL5375.pdf ADL5375-05]&lt;br /&gt;
|Quadrature Modulator&lt;br /&gt;
|U22 (8)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.minicircuits.com/pdfs/LFCN-2250.pdf LFCN-2250+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|F1 (3); F24 (7); F34, F35 (10)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/5510fa.pdf LTC5510]&lt;br /&gt;
|Active Mixer&lt;br /&gt;
|U15 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-490.pdf LFCN-490+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|F12 (5); F15 (6); F26 (7); F31 (9); F33, F36 (10)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://media.digikey.com/pdf/Data%20Sheets/Analog%20Devices%20PDFs/HMC624LP4E.pdf HMC624LP4E]&lt;br /&gt;
|ATTENUATOR&lt;br /&gt;
|U16 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.rfmd.com/store/downloads/dl/file/id/29224/nbb_400_data_sheet.pdf NBB-400]&lt;br /&gt;
|Amplifier&lt;br /&gt;
|U13 (6); U30 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/PHA-1+.pdf PHA-1+]&lt;br /&gt;
|Amplifier&lt;br /&gt;
|U31 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADA4927-1_ADA4927-2.pdf ADA4927-2]&lt;br /&gt;
|Differential ADC Driver&lt;br /&gt;
|U6 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADL5380.pdf ADL5380]&lt;br /&gt;
|Quadrature Demodulator&lt;br /&gt;
|U8 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.avagotech.com/docs/AV02-1237EN MGA-62563]&lt;br /&gt;
|Low Noise Amplifier&lt;br /&gt;
|U36 (11)&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;
|F41 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.avagotech.com/docs/AV02-2919EN VMMK-3603]&lt;br /&gt;
|Low Noise Amplifier&lt;br /&gt;
|U34 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-2600.pdf LFCN-2600+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|F14, F17 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.triquint.com/products/d/doc-a-00000518 855916]&lt;br /&gt;
|SAW Filter&lt;br /&gt;
|F16 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/5510fa.pdf LTC5510]&lt;br /&gt;
|Active Mixer&lt;br /&gt;
|U15 (6); U28 (10)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-2600.pdf LFCN-2600+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|F14, F17 (10)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.minicircuits.com/pdfs/TCM1-63AX+.pdf TCM1-63AX+]&lt;br /&gt;
|RF Transformer&lt;br /&gt;
|T1 (3); T2, T3 (4); T7 (8)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADA4927-1_ADA4927-2.pdf ADA4927-2]&lt;br /&gt;
|Differential ADC Driver&lt;br /&gt;
|U6 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/AD8591_8592_8594.pdf AD8591]&lt;br /&gt;
|Operational Amplifiers&lt;br /&gt;
|U7 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADL5380.pdf ADL5380]&lt;br /&gt;
|Quadrature Demodulator&lt;br /&gt;
|U8 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.diodes.com/_files/datasheets/ZXTC2062E6.pdf ZXTC2062E6]&lt;br /&gt;
|TRANSISTORS&lt;br /&gt;
|Q1 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/hmc624a.pdf HMC624ALP4E]&lt;br /&gt;
|ATTENUATOR&lt;br /&gt;
|U16 (6); U29 (10)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-800.pdf LFCN-800+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|F2 (3); F25 (7)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADP7104.pdf ADP7104-3.3]&lt;br /&gt;
|CMOS LDO&lt;br /&gt;
|U4, U5 (3); U10, U11 (5); U20, U21 (7); U24, U25 (9); U48 (13)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/evaluation-documentation/ADL5375.pdf ADL5375-05] &lt;br /&gt;
|Quadrature Modulator&lt;br /&gt;
|U22 (8)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/5510fa.pdf LTC5510]&lt;br /&gt;
|Active Mixer&lt;br /&gt;
|U28 (10)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/21210G.pdf 24LC024]&lt;br /&gt;
|EEPROM&lt;br /&gt;
|U38, U39 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADP7104.pdf ADP7104-5.0]&lt;br /&gt;
|CMOS LDO&lt;br /&gt;
|U41, U42, U43, U44, U45, U46, U47 (13)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.diodes.com/_files/datasheets/ZXTC2062E6.pdf ZXTC2062E6]&lt;br /&gt;
|TRANSISTORS&lt;br /&gt;
|Q2, Q3, Q4, Q5 (13)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Mechanical Information==&lt;br /&gt;
===Drawings===&lt;br /&gt;
* [[Media:cu ettus UBX cca.pdf| PDF Format]]&lt;br /&gt;
&lt;br /&gt;
==RF Connectors==&lt;br /&gt;
* The UBX daughterboard features female SMA connectors for both the TX/RX and RX2 connectors.&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;
===UBX-40/UBX-160===&lt;br /&gt;
* [[Media:volatility UBX CBX WBX SBX r1 1.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Important Notes==&lt;br /&gt;
*A larger 24W (6V, 4A) power supply is required when using a UBX-40 daughterboard and integrated GPS Disciplined Oscillator accessory together in a USRP2, USRP N200, or USRP N210 device.&lt;br /&gt;
*The UBX-160 transmitter path has 160 MHz of bandwidth throughout the full frequency range of the device; the receiver path has 84 MHz of bandwidth for center frequencies from 10 MHz to 500 MHz.&lt;br /&gt;
&lt;br /&gt;
==RF Performance Data==&lt;br /&gt;
* [http://files.ettus.com/performance_data/ubx/UBX-without-UHD-corrections.pdf UBX without UHD Corrections]&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;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=UBX&amp;diff=3512</id>
		<title>UBX</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=UBX&amp;diff=3512"/>
				<updated>2017-05-12T11:29:33Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: /* RF Specifications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The UBX daughterboard is a full-duplex wideband transceiver that covers frequencies from 10 MHz to 6 GHz. Coherent and phase-aligned operation across multiple UBX daughterboards on USRP X Series motherboards enables users to explore MIMO and direction finding applications. The UBX daughterboard works interchangeably with other USRP daughterboards and is supported by the USRP Hardware Driver™ (UHD) software API for seamless integration into existing applications.&lt;br /&gt;
&lt;br /&gt;
The UBX is capable of phase coherent operation, and therefore is suitable for MIMO and Phased Array applications, on the X Series. Additionally this capability is only available on the X Series devices.&lt;br /&gt;
&lt;br /&gt;
== Key Features==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Frequency Range: 10 MHz - 6 GHz&lt;br /&gt;
* Versions: 40MHz / 160MHz&lt;br /&gt;
*RF shielding&lt;br /&gt;
*Full duplex operation with independent TX and RX frequencies&lt;br /&gt;
*Synthesizer synchronization for applications requiring coherent or &amp;lt;br&amp;gt;phase-aligned operation, supported on USRP X Series motherboards only&lt;br /&gt;
|[[File:Product ubx 40.png|250px|center]] &lt;br /&gt;
|[[File:Product ubx 160.png|250px|center]] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Daughterboard Specifications==&lt;br /&gt;
===Features===&lt;br /&gt;
* 2 quadrature frontends (1 transmit, 1 receive)&lt;br /&gt;
** Defaults to direct conversion&lt;br /&gt;
** Can be used in low IF mode through lo_offset with uhd::tune_request_t&lt;br /&gt;
* Independent receive and transmit LO's and synthesizers&lt;br /&gt;
** Allows for full-duplex operation on different transmit and receive frequencies&lt;br /&gt;
** Can be set to use Integer-N tuning for better spur performance with uhd::tune_request_t&lt;br /&gt;
&lt;br /&gt;
===Antennas===&lt;br /&gt;
Transmit: '''TX/RX'''&lt;br /&gt;
&lt;br /&gt;
Receive: '''TX/RX''' or '''RX2'''&lt;br /&gt;
* '''Frontend 0:''' Complex baseband signal for selected antenna&lt;br /&gt;
* '''Note:''' The user may set the receive antenna to be TX/RX or RX2. However, when using a UBX board in full-duplex mode, the receive antenna will always be set to RX2, regardless of the settings.&lt;br /&gt;
&lt;br /&gt;
===Gains===&lt;br /&gt;
* Transmit Gains: '''PGA0''', Range: 0-31.5dB&lt;br /&gt;
* Receive Gains: '''PGA0''', Range: 0-31.5dB&lt;br /&gt;
&lt;br /&gt;
===Bandwidths===&lt;br /&gt;
* UBX: 40 MHz, RX &amp;amp; TX&lt;br /&gt;
* UBX-160: 160 MHz, RX &amp;amp; TX&lt;br /&gt;
&lt;br /&gt;
===Sensors===&lt;br /&gt;
* '''lo_locked:''' boolean for LO lock state&lt;br /&gt;
&lt;br /&gt;
===LEDs===&lt;br /&gt;
* '''LOCK''': Synthesizer Lock Detect&lt;br /&gt;
* '''TX/RX TXD''': Transmitting on TX/RX antenna port&lt;br /&gt;
* '''TX/RX RXD''': Receiving on TX/RX antenna port&lt;br /&gt;
* '''RX2 RXD''': Receiving on RX2 antenna port&lt;br /&gt;
&lt;br /&gt;
==RF Specifications==&lt;br /&gt;
'''Freq Range'''&lt;br /&gt;
* 10MHz - 6GHz&lt;br /&gt;
&lt;br /&gt;
'''Noise Figure'''&lt;br /&gt;
* 10 MHz - 500 MHz: 3 - 4 dB&lt;br /&gt;
* 500 MHz - 1.5 GHz: 2 - 3 dB&lt;br /&gt;
* 1.5GHz - 6GHz: 4 - 10 dB&lt;br /&gt;
&lt;br /&gt;
'''RX IIP3 (Max)''' &lt;br /&gt;
* 10 MHz - 6 GHz: 8 - 9 dBm&lt;br /&gt;
&lt;br /&gt;
'''RX IQ Imbalance'''&lt;br /&gt;
* 10 MHz - 6 GHz: &amp;lt; -30dBc&lt;br /&gt;
&lt;br /&gt;
'''TX Power (Max)'''&lt;br /&gt;
* 10 MHz - 3 GHz: 20 dBm&lt;br /&gt;
* 3 - 6 GHz: 8 - 20 dBm &lt;br /&gt;
&lt;br /&gt;
'''TX OIP3'''&lt;br /&gt;
* 10 - 500 MHz: 41 dBm&lt;br /&gt;
* 0.5 - 3 GHz: 36 dBm&lt;br /&gt;
* 3 - 6 GHz: 26 dBm - 36 dBm&lt;br /&gt;
&lt;br /&gt;
'''TX IQ Imbalance'''&lt;br /&gt;
* 10 MHz - 6 GHz: &amp;lt; -30 dBc&lt;br /&gt;
&lt;br /&gt;
Note: The UBX 160 transmitter path has 160 MHz of bandwidth throughout the full frequency range of the device; the receiver path has 84 MHz of bandwidth for center frequencies from 10 MHz to 500 MHz.&lt;br /&gt;
&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;
===UBX-40===&lt;br /&gt;
* Current Hardware Revision: 1&lt;br /&gt;
* Minimum version of UHD required: 3.8.2&lt;br /&gt;
&lt;br /&gt;
===UBX-160===&lt;br /&gt;
* Current Hardware Revision: 1&lt;br /&gt;
* Minimum version of UHD required: 3.8.2&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* 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;
==USRP Compatibility==&lt;br /&gt;
===UBX-40===&lt;br /&gt;
* N or X Series&lt;br /&gt;
&lt;br /&gt;
===UBX-160===&lt;br /&gt;
* X Series only&lt;br /&gt;
&lt;br /&gt;
==Phase Synchronization==&lt;br /&gt;
The UBX daughterboard is capable of phase-synchronous operation, and is recommended for phase-coherent applications. The SBX and TwinRX daughterboards are also recommended for phase-coherent applications.&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
===UBX===&lt;br /&gt;
[http://files.ettus.com/schematics/ubx/ubx.pdf UBX 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://datasheets.maximintegrated.com/en/ds/MAX2871.pdf MAX2871]&lt;br /&gt;
|Fractional/Integer-N Synthesizer/VCO&lt;br /&gt;
|U3 (3); U9 (5); U19 (7); U23 (9)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/evaluation-documentation/ADL5375.pdf ADL5375-05]&lt;br /&gt;
|Quadrature Modulator&lt;br /&gt;
|U22 (8)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.minicircuits.com/pdfs/LFCN-2250.pdf LFCN-2250+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|F1 (3); F24 (7); F34, F35 (10)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/5510fa.pdf LTC5510]&lt;br /&gt;
|Active Mixer&lt;br /&gt;
|U15 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-490.pdf LFCN-490+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|F12 (5); F15 (6); F26 (7); F31 (9); F33, F36 (10)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://media.digikey.com/pdf/Data%20Sheets/Analog%20Devices%20PDFs/HMC624LP4E.pdf HMC624LP4E]&lt;br /&gt;
|ATTENUATOR&lt;br /&gt;
|U16 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.rfmd.com/store/downloads/dl/file/id/29224/nbb_400_data_sheet.pdf NBB-400]&lt;br /&gt;
|Amplifier&lt;br /&gt;
|U13 (6); U30 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/PHA-1+.pdf PHA-1+]&lt;br /&gt;
|Amplifier&lt;br /&gt;
|U31 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADA4927-1_ADA4927-2.pdf ADA4927-2]&lt;br /&gt;
|Differential ADC Driver&lt;br /&gt;
|U6 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADL5380.pdf ADL5380]&lt;br /&gt;
|Quadrature Demodulator&lt;br /&gt;
|U8 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.avagotech.com/docs/AV02-1237EN MGA-62563]&lt;br /&gt;
|Low Noise Amplifier&lt;br /&gt;
|U36 (11)&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;
|F41 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.avagotech.com/docs/AV02-2919EN VMMK-3603]&lt;br /&gt;
|Low Noise Amplifier&lt;br /&gt;
|U34 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-2600.pdf LFCN-2600+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|F14, F17 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.triquint.com/products/d/doc-a-00000518 855916]&lt;br /&gt;
|SAW Filter&lt;br /&gt;
|F16 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/5510fa.pdf LTC5510]&lt;br /&gt;
|Active Mixer&lt;br /&gt;
|U15 (6); U28 (10)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-2600.pdf LFCN-2600+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|F14, F17 (10)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.minicircuits.com/pdfs/TCM1-63AX+.pdf TCM1-63AX+]&lt;br /&gt;
|RF Transformer&lt;br /&gt;
|T1 (3); T2, T3 (4); T7 (8)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADA4927-1_ADA4927-2.pdf ADA4927-2]&lt;br /&gt;
|Differential ADC Driver&lt;br /&gt;
|U6 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/AD8591_8592_8594.pdf AD8591]&lt;br /&gt;
|Operational Amplifiers&lt;br /&gt;
|U7 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADL5380.pdf ADL5380]&lt;br /&gt;
|Quadrature Demodulator&lt;br /&gt;
|U8 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.diodes.com/_files/datasheets/ZXTC2062E6.pdf ZXTC2062E6]&lt;br /&gt;
|TRANSISTORS&lt;br /&gt;
|Q1 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/hmc624a.pdf HMC624ALP4E]&lt;br /&gt;
|ATTENUATOR&lt;br /&gt;
|U16 (6); U29 (10)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.minicircuits.com/pdfs/LFCN-800.pdf LFCN-800+]&lt;br /&gt;
|Low Pass Filter&lt;br /&gt;
|F2 (3); F25 (7)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADP7104.pdf ADP7104-3.3]&lt;br /&gt;
|CMOS LDO&lt;br /&gt;
|U4, U5 (3); U10, U11 (5); U20, U21 (7); U24, U25 (9); U48 (13)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/evaluation-documentation/ADL5375.pdf ADL5375-05] &lt;br /&gt;
|Quadrature Modulator&lt;br /&gt;
|U22 (8)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/5510fa.pdf LTC5510]&lt;br /&gt;
|Active Mixer&lt;br /&gt;
|U28 (10)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/21210G.pdf 24LC024]&lt;br /&gt;
|EEPROM&lt;br /&gt;
|U38, U39 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/ADP7104.pdf ADP7104-5.0]&lt;br /&gt;
|CMOS LDO&lt;br /&gt;
|U41, U42, U43, U44, U45, U46, U47 (13)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.diodes.com/_files/datasheets/ZXTC2062E6.pdf ZXTC2062E6]&lt;br /&gt;
|TRANSISTORS&lt;br /&gt;
|Q2, Q3, Q4, Q5 (13)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Mechanical Information==&lt;br /&gt;
===Drawings===&lt;br /&gt;
* [[Media:cu ettus UBX cca.pdf| PDF Format]]&lt;br /&gt;
&lt;br /&gt;
==RF Connectors==&lt;br /&gt;
* The UBX daughterboard features female SMA connectors for both the TX/RX and RX2 connectors.&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;
===UBX-40/UBX-160===&lt;br /&gt;
* [[Media:volatility UBX CBX WBX SBX r1 1.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Important Notes==&lt;br /&gt;
*A larger 24W (6V, 4A) power supply is required when using a UBX-40 daughterboard and integrated GPS Disciplined Oscillator accessory together in a USRP2, USRP N200, or USRP N210 device.&lt;br /&gt;
*The UBX-160 transmitter path has 160 MHz of bandwidth throughout the full frequency range of the device; the receiver path has 84 MHz of bandwidth for center frequencies from 10 MHz to 500 MHz.&lt;br /&gt;
&lt;br /&gt;
==RF Performance Data==&lt;br /&gt;
* [http://files.ettus.com/performance_data/ubx/UBX-without-UHD-corrections.pdf UBX without UHD Corrections]&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;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=OctoClock_CDA-2990&amp;diff=3511</id>
		<title>OctoClock CDA-2990</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=OctoClock_CDA-2990&amp;diff=3511"/>
				<updated>2017-05-12T11:29:08Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The OctoClock CDA-2990 is an affordable solution for high-accuracy time and frequency reference distribution.  The OctoClock accepts 10 MHz and PPS signals from an external source, and distributed each signal 8 ways.  This is a useful accessory for users that would like to build multi-channel systems that are synchronized  to a common timing source.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' The OctoClock CDA-2990 is functionally identical to the previous generation OctoClock, which contained an Ettus Research logo.&lt;br /&gt;
&lt;br /&gt;
== Key Features==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
*8-Way Time and Frequency Distribution (1 PPS and 10 MHz)&lt;br /&gt;
*Convenient Solution for Multi-Channel Synchronization&lt;br /&gt;
*Use with MIMO Capable N-Series Devices for Coherent System&lt;br /&gt;
*External 10 MHz/1 PPS Source Required&lt;br /&gt;
*19&amp;quot; Rackmount – 1U&lt;br /&gt;
|[[File:Product octoclock.jpg|450px|center]] &lt;br /&gt;
|[[File:octoclock2.png|450px|center]] &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Signal Levels==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
; 10 MHz output : 1.25 Vpp at 50 ohms, 3.3Vpp at 1M ohms&lt;br /&gt;
; 1 PPS output: 20% duty cycle square wave with amplitude 5 V&lt;br /&gt;
&lt;br /&gt;
; 10 MHz input : 0-20 dBm&lt;br /&gt;
; 1 PPS input: 2.5-5 V&lt;br /&gt;
|[[File:octoclock1.png|450px|center]] &lt;br /&gt;
|[[File:octoclock3.png|450px|center]] &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Physical Specifications==&lt;br /&gt;
===Dimension (1U Rackmount)===&lt;br /&gt;
4 x 17.187x 1.75 inches&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* 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;
&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;
==Schematics==&lt;br /&gt;
===OctoClock===&lt;br /&gt;
[http://files.ettus.com/schematics/octoclock/octoclock.pdf OctoClock 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;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/39662e.pdf ENC28J60−DIG]&lt;br /&gt;
|Ethernet Controller&lt;br /&gt;
|U103 (1)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.atmel.com/images/doc2467.pdf ATmega128]&lt;br /&gt;
|Microcontroller&lt;br /&gt;
|U102 (1)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.mymectronic.com/datasheet/13059_4168782_m9107.pdf M9107]&lt;br /&gt;
|SMT OCXO-Based GPSDO&lt;br /&gt;
|U206 (2)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com.cn/cn/lit/ds/symlink/sn74aup1t57.pdf SN74AUP1T57]&lt;br /&gt;
|VOLTAGE-LEVEL TRANSLATOR&lt;br /&gt;
|U204, U203 (2)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/cdce18005.pdf CDCE18005−PWR]&lt;br /&gt;
|Output Clock Programmable Buffer&lt;br /&gt;
|U205 (2)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.nxp.com/documents/data_sheet/74HC_HCT4020.pdf 74HC4020]&lt;br /&gt;
|Binary Ripple Counter&lt;br /&gt;
|U207 (2)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/lmz12001.pdf LMZ12001]&lt;br /&gt;
|Power Module&lt;br /&gt;
|U101 (1)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Mechanical Info==&lt;br /&gt;
===Weight===&lt;br /&gt;
2.6 lbs&lt;br /&gt;
&lt;br /&gt;
===Drawings===&lt;br /&gt;
* [[File:cu ettus octoclock cca.pdf]]&lt;br /&gt;
* [[File:cu ettus-octoclock.pdf]]&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;
===OctoClock===&lt;br /&gt;
* [[Media:OctoClock CoV.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Firmware==&lt;br /&gt;
The OctoClock's firmware is divided into two image files: octoclock_bootloader.hex and octoclock_r4_fw.hex. All image files can be found [http://files.ettus.com/binaries/images/ here], in version-specific ZIP files. Download the version corresponding to the version of UHD that you're running. You must use at least version 3.9.2.&lt;br /&gt;
&lt;br /&gt;
* Full instructions on updating the OctoClock's firmware is located here: http://files.ettus.com/manual/page_octoclock.html#upgrading_device&lt;br /&gt;
* Source of the firmware for the OctoClock is located at: https://github.com/EttusResearch/uhd/tree/master/firmware/octoclock&lt;br /&gt;
&lt;br /&gt;
==Downloads==&lt;br /&gt;
[https://www.ettus.com/content/files/OctoClock_Spec_Sheet.pdf OctoClock Spec Sheet]&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;
==FAQ==&lt;br /&gt;
*'''What is the OctoClock'''&lt;br /&gt;
&lt;br /&gt;
The OctoClock is a USRP-compatible accessory that allows you to easily synchronize up to 8 USRP radios. Multiple OctoClock devices can be combined for synchronization of larger numbers of USRP radios.&lt;br /&gt;
&lt;br /&gt;
*'''When would I used the OctoClock'''&lt;br /&gt;
&lt;br /&gt;
The OctoClock is useful for synchronizing multiple USRP devices for high channel count systems.&lt;br /&gt;
&lt;br /&gt;
The following applications can benefit from OctoClock clock distribution:&lt;br /&gt;
&lt;br /&gt;
*Direction Finding&lt;br /&gt;
*Beamforming&lt;br /&gt;
*Adaptive Beamforming&lt;br /&gt;
*Multiple-In-Multiple-Out (MIMO) Prototyping&lt;br /&gt;
*Geolocation Systems that Use Time-Difference-of-Arrival (TDOA)&lt;br /&gt;
*Multi-Channel, Multi-Static, and Passive RADAR&lt;br /&gt;
*Multi-Band GPS Record and Playback&lt;br /&gt;
*Multi-Band Cellular Monitoring&lt;br /&gt;
&lt;br /&gt;
Essentially, anything that requires from synchronization or the distribution of timing information would benefit from the use of the OctoClock.&lt;br /&gt;
&lt;br /&gt;
*'''Are there example applications that could benefit from the OctoClock'''&lt;br /&gt;
&lt;br /&gt;
32-Channel Phased-Array Receiver Built with QR210 - OctoClock a Component in the System&lt;br /&gt;
&lt;br /&gt;
Afford 8x8 MIMO Testbed&lt;br /&gt;
&lt;br /&gt;
Share your applications with us and we will add them to the list.&lt;br /&gt;
&lt;br /&gt;
*'''How does the OctoClock work'''&lt;br /&gt;
&lt;br /&gt;
The OctoClock accepts 10 MHz and PPS signals from an external source. Active circuits are used to amplify and split the signals 8-ways. Matched-length traces minimize phase differences between all 10 MHz and 1 PPS outputs&lt;br /&gt;
&lt;br /&gt;
The OctoClock-G includes an internal GPSDO (GPS Disciplined Oscillator) which provides an internal source for 10 MHz and PPS from an OCXO high precision oscillator.  Add a GPS antenna  (optional) with a clear view of the sky for GPS Disciplining of the OCXO that futher enhances frequency accuracy of the OCXO and global time synchronization.&lt;br /&gt;
&lt;br /&gt;
*'''Where can I find user manuals for the OctoClock and USRP'''&lt;br /&gt;
&lt;br /&gt;
Here is helpful document. Sync. and MIMO w/ the USRP&lt;br /&gt;
&lt;br /&gt;
Also, here is some documentation on how to use UHD™ to interact with multi-USRP systems.&lt;br /&gt;
&lt;br /&gt;
*'''What USRP model do you recommend for MIMO systems'''&lt;br /&gt;
&lt;br /&gt;
The USRP N200 or N210 and USRP X300 or X310 are recommended for building high channel count and MIMO systems. These models provide external PPS and 10 MHz reference inputs.  The USRP N200 and N210 support the USRP MIMO cable.&lt;br /&gt;
&lt;br /&gt;
The USRP B100, B200, B210, E100, E110, and E310 can be synchronized with 10 MHz/PPS but are not phase coherent MIMO capable devices. The USRP1 cannot be synchronized with 10 MHz/PPS.&lt;br /&gt;
&lt;br /&gt;
*'''How does the automatic switchover functionality work'''&lt;br /&gt;
&lt;br /&gt;
When using the OctoClock-G, the Internal/External switch on the front panel allows the user to choose between the  internal GPSDO and external source 10 MHz/PPS source.  If the selected sournce is not availble, the device will automatically switch over to the backup frequency source.  When switchover is active the corresponding LED indicator will illuminate.&lt;br /&gt;
&lt;br /&gt;
If neither source is present, the internal, external and status LEDs will not be illuminated and the user will not received valid 10 MHz/PPS outputs.&lt;br /&gt;
&lt;br /&gt;
*'''What do the LED indications mean'''&lt;br /&gt;
&lt;br /&gt;
The following list describes the behavior when each of the 6  LED status indicators is illuminated:&lt;br /&gt;
&lt;br /&gt;
*Internal - internal GPSDO is selected and present.&lt;br /&gt;
*External - external source is selected and present&lt;br /&gt;
*Status - Either the internal GPSDO or external source is selected. If neither source is present this LED will turn off (no signals are output).&lt;br /&gt;
*PPS - selected PPS pulse high.&lt;br /&gt;
*GPS Locked - GPS is receiving signals and has valid time/position lock.&lt;br /&gt;
*Power - Power is applied - smoke is still inside.&lt;br /&gt;
&lt;br /&gt;
*'''What are the input and output specifications'''&lt;br /&gt;
&lt;br /&gt;
*10 MHz Input – 0-10 dBm&lt;br /&gt;
*10 MHz Outputs - ~1.4 Vpp Square Wave, Impedance 50 ohm nominal&lt;br /&gt;
*1 PPS Input - Logic-level pulse, 2.5V - 5V&lt;br /&gt;
*1 PPS Outputs - Logic-level pulse, 2.5V - 5V&lt;br /&gt;
&lt;br /&gt;
*'''What is the function of the Ethernet port'''&lt;br /&gt;
&lt;br /&gt;
Currently, the Ethernet port is non-functional. In the future the Ethernet port may be used to provide a method for reading GPS time and NMEA sentences.&lt;br /&gt;
&lt;br /&gt;
*'''What is the input voltage rating'''&lt;br /&gt;
&lt;br /&gt;
The OctoClock can be powered at any voltage between 6 and 15Vdc.&lt;br /&gt;
&lt;br /&gt;
*'''Are the design files open source'''&lt;br /&gt;
&lt;br /&gt;
As with all of our products, the driver code is free &amp;amp; open source, and can be found in our UHD repository. The schematics are also available.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=B200/B210/B200mini/B205mini/B206mini&amp;diff=3510</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=3510"/>
				<updated>2017-05-12T11:27:53Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: /* RF Specifications */&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;
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, 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.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: 0 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;
===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;
==Environmental Specifications==&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* B200mini / B200 / B210 0-40 °C&lt;br /&gt;
* B200mini-i / B205mini-i 0-45 °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;
|[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;
|[http://www.ctscorp.com/wp-content/uploads/2015/11/008-0371-0.pdf B200mini VXTCXO]&lt;br /&gt;
|VXTCXO (B200mini only)&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.mymectronic.com/datasheet/13059_4168782_m9107.pdf M9107]&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;
==Mechanical Information==&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;
* [[{{ns:media}}:B200mini_drawing.png]]&lt;br /&gt;
&lt;br /&gt;
====B200====&lt;br /&gt;
* [[Media:cu ettus b200 cca.pdf| PDF Format]]&lt;br /&gt;
&lt;br /&gt;
====B210====&lt;br /&gt;
* [[Media:cu ettus b210 cca.pdf| PDF Format]]&lt;br /&gt;
&lt;br /&gt;
==Enclosures==&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 and was taken directly from Xilinx Vivado 2014.4.&lt;br /&gt;
&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.5V 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;
==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 the USB bus?'''&lt;br /&gt;
&lt;br /&gt;
The experience may 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 provide a power supply with the USRP B210.&lt;br /&gt;
&lt;br /&gt;
MIMO operation with the USRP B210 is not recommended when using the USRP B210 on bus-power.&lt;br /&gt;
&lt;br /&gt;
You should not attempt to run the device on bus-power if a GPS-disciplined oscillator is installed.&lt;br /&gt;
&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, MAC 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>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Getting_Started_with_RFNoC_Development&amp;diff=3381</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=3381"/>
				<updated>2017-02-22T11:57:13Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: /* Image building using the command line */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Application Note Number==&lt;br /&gt;
'''AN-823'''&lt;br /&gt;
&lt;br /&gt;
==Revision History==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Author&lt;br /&gt;
!Details&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2016-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;
==Abstract==&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.&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). As dual-licensed software, RFNoC is available under the open-source GNU Public License version 3 (GPLv3), as well as an alternative, less-restrictive license offered only by Ettus Research. 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 the USRP E310/E312 and the USRP X300/X310.&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 2015.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;
* X3xx series or E3xx series device or any future USRP&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. [http://gnuradio.org/redmine/projects/pybombs/wiki 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 “type=x300,addr={IP_ADDRESS}” --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 . 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 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;
    Add Python QA code? [Y/n] N&lt;br /&gt;
    Add C++ QA code? [y/N] N&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;
* '''Add Python QA code:''' Not used.&lt;br /&gt;
&lt;br /&gt;
* '''Add C++ QA code:''' Not used.&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 sections.&lt;br /&gt;
&lt;br /&gt;
For the setting register that will hold the constant value as well as the read back register:&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;
&lt;br /&gt;
And for the processing section:&lt;br /&gt;
&lt;br /&gt;
    assign m_axis_data_tready = s_axis_data_tready;&lt;br /&gt;
    assign s_axis_data_tvalid = m_axis_data_tvalid;&lt;br /&gt;
    assign s_axis_data_tlast = m_axis_data_tlast;&lt;br /&gt;
    &lt;br /&gt;
    '''wire [15:0] i = m_axis_data_tdata[31:16];'''&lt;br /&gt;
    '''wire [15:0] q = m_axis_data_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;
    '''assign s_axis_data_tdata = {i_mult_gain[15:0], q_mult_gain[15:0]};'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''NOTE:'''  Because the multiplication process can occur in the same clock cycle there is no need for handshaking with the AXI &amp;lt;code&amp;gt;tready, tvalid  and tlast&amp;lt;/code&amp;gt; signals and therefore they are simply passed through the &amp;lt;code&amp;gt;gain&amp;lt;/code&amp;gt; RFNoC block.&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. &amp;lt;code&amp;gt;noc_block_{USER_BLOCK_NAME}_tb&amp;lt;/code&amp;gt; ) 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 structure of the testbench created by the RFNoC Modtool.&lt;br /&gt;
&lt;br /&gt;
[[File:rfnoc gsg an 9.png|center|800px|]]&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;
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;
    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;
    `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;
    &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;
    &lt;br /&gt;
    &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;
Create a &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; directory, verify directory location is &amp;lt;code&amp;gt;rfnoc-tutorial&amp;lt;/code&amp;gt; and run:&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 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/rfnoc/fpga-src/ -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 “type=x300,addr={IP_ADDRESS}” --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 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 Discussion on number of blocks in an FPGA image for more information. &lt;br /&gt;
&lt;br /&gt;
'''4. Add button (&amp;gt;&amp;gt;):''' Manually add the blocks from the central panel into your design.&lt;br /&gt;
&lt;br /&gt;
'''5. Remove button (&amp;lt;&amp;lt;):''' Remove blocks from the current design (far-left panel)&lt;br /&gt;
&lt;br /&gt;
'''6. 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;
'''7. 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;
'''8. Clean IP:''' Cleans the IP before a new build (recompiles all IP).&lt;br /&gt;
&lt;br /&gt;
'''9. 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;
'''10. 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;
'''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. Generate .bit file:''' Start the build by clicking this button. &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://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;
* [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>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Getting_Started_with_RFNoC_Development&amp;diff=3380</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=3380"/>
				<updated>2017-02-22T11:54:57Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: /* Image building using the command line */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Application Note Number==&lt;br /&gt;
'''AN-823'''&lt;br /&gt;
&lt;br /&gt;
==Revision History==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Author&lt;br /&gt;
!Details&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2016-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;
==Abstract==&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.&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). As dual-licensed software, RFNoC is available under the open-source GNU Public License version 3 (GPLv3), as well as an alternative, less-restrictive license offered only by Ettus Research. 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 the USRP E310/E312 and the USRP X300/X310.&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 2015.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;
* X3xx series or E3xx series device or any future USRP&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. [http://gnuradio.org/redmine/projects/pybombs/wiki 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 “type=x300,addr={IP_ADDRESS}” --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 . 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 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;
    Add Python QA code? [Y/n] N&lt;br /&gt;
    Add C++ QA code? [y/N] N&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;
* '''Add Python QA code:''' Not used.&lt;br /&gt;
&lt;br /&gt;
* '''Add C++ QA code:''' Not used.&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 sections.&lt;br /&gt;
&lt;br /&gt;
For the setting register that will hold the constant value as well as the read back register:&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;
&lt;br /&gt;
And for the processing section:&lt;br /&gt;
&lt;br /&gt;
    assign m_axis_data_tready = s_axis_data_tready;&lt;br /&gt;
    assign s_axis_data_tvalid = m_axis_data_tvalid;&lt;br /&gt;
    assign s_axis_data_tlast = m_axis_data_tlast;&lt;br /&gt;
    &lt;br /&gt;
    '''wire [15:0] i = m_axis_data_tdata[31:16];'''&lt;br /&gt;
    '''wire [15:0] q = m_axis_data_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;
    '''assign s_axis_data_tdata = {i_mult_gain[15:0], q_mult_gain[15:0]};'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''NOTE:'''  Because the multiplication process can occur in the same clock cycle there is no need for handshaking with the AXI &amp;lt;code&amp;gt;tready, tvalid  and tlast&amp;lt;/code&amp;gt; signals and therefore they are simply passed through the &amp;lt;code&amp;gt;gain&amp;lt;/code&amp;gt; RFNoC block.&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. &amp;lt;code&amp;gt;noc_block_{USER_BLOCK_NAME}_tb&amp;lt;/code&amp;gt; ) 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 structure of the testbench created by the RFNoC Modtool.&lt;br /&gt;
&lt;br /&gt;
[[File:rfnoc gsg an 9.png|center|800px|]]&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;
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;
    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;
    `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;
    &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;
    &lt;br /&gt;
    &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;
Create a &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; directory, verify directory location is &amp;lt;code&amp;gt;rfnoc-tutorial&amp;lt;/code&amp;gt; and run:&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 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;) '''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/rfnoc/fpga-src/ -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 “type=x300,addr={IP_ADDRESS}” --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 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 Discussion on number of blocks in an FPGA image for more information. &lt;br /&gt;
&lt;br /&gt;
'''4. Add button (&amp;gt;&amp;gt;):''' Manually add the blocks from the central panel into your design.&lt;br /&gt;
&lt;br /&gt;
'''5. Remove button (&amp;lt;&amp;lt;):''' Remove blocks from the current design (far-left panel)&lt;br /&gt;
&lt;br /&gt;
'''6. 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;
'''7. 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;
'''8. Clean IP:''' Cleans the IP before a new build (recompiles all IP).&lt;br /&gt;
&lt;br /&gt;
'''9. 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;
'''10. 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;
'''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. Generate .bit file:''' Start the build by clicking this button. &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://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;
* [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>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Debugging_FPGA_images&amp;diff=3169</id>
		<title>Debugging FPGA images</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Debugging_FPGA_images&amp;diff=3169"/>
				<updated>2016-12-16T11:18:45Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Application Note Number =&lt;br /&gt;
'''AN-121'''&lt;br /&gt;
&lt;br /&gt;
= Revision History =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Author&lt;br /&gt;
!Details&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2016-11-28&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Nicolas Cuervo &amp;lt;br&amp;gt; Sugandha Gupta&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Initial creation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Abstract =&lt;br /&gt;
This application note 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. The contents of this AN could suit most of your needs while setting your debug bitstream for a RFNoC design. However, keep in mind that the topics described here are strictly related to Xilinx framework. For further information please refer to Xilinx documentation [1][2]. &lt;br /&gt;
&lt;br /&gt;
= Overview = &lt;br /&gt;
When you are developing your own application, you might come to the point on which you would like to build an FPGA image for your USRP. You might want to modify part of the cores, add some custom functionality, or even add your custom RFNoC block! For that you might follow tutorials such as the [[Getting_Started_with_RFNoC_Development#Building the FPGA image|Building the FPGA image]] section of one our &amp;quot;getting started&amp;quot; guides. &lt;br /&gt;
&lt;br /&gt;
But how about debugging your HDL code? This comes really handy when you want to follow closely the behavior of your signals within your hardware design. This Application Note will follow the basic steps needed to create a &amp;quot;chipscope image&amp;quot;, which allow you to use the Vivado GUI visual tools to debug your design. &lt;br /&gt;
&lt;br /&gt;
Before we start, this App note assumes that you have been working already with some fpga code and you want to debug it. Being this the case, we assume that you have UHD installed, the FPGA repository cloned, the right version of Xilinx Vivado installed (by the moment this is being written we use Vivado 2015.4) and its environment initialized. If not, we assume you are familiar on how to do the previously noted procedures. &lt;br /&gt;
&lt;br /&gt;
For illustration purposes, here we are going to check the status of some of the output signals of one of the RFNoC blocks we currently provide. However, the same procedure can be used to check the status of any signal within your hardware code, being input, output, or intermediate signal, and being the code a core description, a module for your library or your custom RFNoC block.&lt;br /&gt;
&lt;br /&gt;
''' Note: ''' Keep in mind that this procedure intends to probe the signals in a fully designed block, which has been also built into a FPGA .bit file and is running in a supported device. This is *not* intended to be a way to test directly your designed code, as building an FPGA image may take several minutes (even hours). For small functionality checks, we strongly recommend you to write a testbench for your code, which will allow you to have more iterations without the need of building and synthesizing your hardware description. You can follow the [https://files.ettus.com/manual/md_usrp3_sim_writing_testbenches.html - Writing Testbenches] section of our reference manual to have insights on how to write your own testbench. In addition, there is plenty of online resources (such as [8]) that provide enough information to get you started with your simulation.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites = &lt;br /&gt;
&lt;br /&gt;
* '''Vivado (version 2015.4): ''' As stated in the overview, you'll be working directly with HDL code that you need to build and synthesize. Depending on your target device, you may even need a non-free license (which is the case for the X3XX devices). In the case of Ettus' embedded devices, you can proceed with your design using the Vivado Webpack.&lt;br /&gt;
&lt;br /&gt;
* '''UHD, GNURadio and gr-ettus: ''' At the end of the debugging process we will be running the application on a physical device, and for that we need the core code downloaded and installed. UHD will serve as our device driver, GNURadio the frame on which our app will run, and gr-ettus is needed for our ''signal generator'' block. If you need guidance on this, please refer to the [https://kb.ettus.com/Getting_Started_with_RFNoC_Development#Creating_a_development_environment Creating a development environment] section of our ''Getting started guide''. If you are debugging your own RFNoC OOT module, this will have to be installed as well. &lt;br /&gt;
&lt;br /&gt;
* '''RFNoC supported device: ''' The whole point of chipscoping is having the ability of probing signals from a hardware design at runtime. Hence, a device where the application is going to run is needed. In this tutorial we will be using an X310 device.&lt;br /&gt;
&lt;br /&gt;
= Choosing your signals =&lt;br /&gt;
At this point we assume that you have a verilog code that has been properly tested by the means of simulation/testbench, but that you want to inspect into its functionality deeper by probing its signals while it is running on a device. This could be helpful for many reasons, such as getting a deeper understanding on the state of your signal during a given transaction, which could give you an insight on how it is working (or even, can give you a lead on why it isn't!)&lt;br /&gt;
&lt;br /&gt;
For this AN, we will use out block '''RFNoC: Signal Generator''' as our Unit Under Test (UUT). However, all procedures to be done can be easily transfered to your own design. In addition, as most of our block and FPGA code is written in Verilog, we will use it also in this document. So let's get started.&lt;br /&gt;
&lt;br /&gt;
The Signal generator's code can be found under &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}/usrp3/lib/rfnoc/&amp;lt;/syntaxhighlight&amp;gt;. In some of our latest code releases (such as 3.10.0.0), this code is found under &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}/usrp3_rfnoc/lib/rfnoc/&amp;lt;/syntaxhighlight&amp;gt;. In this directory you can find the RFNoC related code that is used in the RFNoC framework. Consequently, all the HDL for the NoC blocks the we provide is located here. Now, open the file &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;noc_block_siggen.v&amp;lt;/syntaxhighlight&amp;gt; in your IDE or text editor of preference and give it a quick look. &lt;br /&gt;
&lt;br /&gt;
As you can see, the code is not too extensive and is the comments divide it properly based on functionality. If your design is RFNoCModtool-generated, you'll get a similar preliminary structure in the verilog files for your block. For information on how to use RFNoCModtool please refer to [https://kb.ettus.com/index.php?title=Getting_Started_with_RFNoC_Development RFNoC Development - Getting Started Guide]. Normally for rather simple designs you won't have to deal with the RFNoC Shell or the AXI Wrapper configuration. However, for illustration purposes, we are going to take some of the signals from this part of the code and probe them in our debugging process. A total of 11 signals will be selected, each from a different internal stage. &lt;br /&gt;
&lt;br /&gt;
Lets take a look at how this boundaries look like in the FPGA Internals. Each full RFNoC design can include several different blocks, which are also called &amp;quot;computation engines&amp;quot;. The picture on the right [3] portraits the computation engine internals in a quite self explanatory fashion, although a slightly more detailed explanation about each of the internals from a Computation Engine can be found at the  [https://kb.ettus.com/RFNoC_Getting_Started_Guides RFNoC Software Page]:&lt;br /&gt;
&lt;br /&gt;
[[File:CE_internals.png|Anatomy of a computation engine.|600px|right|Anatomy of a computation engine|link=https://kb.ettus.com/images/8/83/CE_internals.png]]&lt;br /&gt;
&lt;br /&gt;
'''From NoC Shell: '''At the top of the figure you can see the AXI Crossbar, were all the computation engines are wired up together. This is not part of our UUT in particular. However, the connection between the crossbar and our UUT - NoC Shell can be tested within our code. From here we are taking the set_data/addr/stb, which are readback registers and provide information from this interface.&lt;br /&gt;
* set_data&lt;br /&gt;
* set_addr&lt;br /&gt;
* set_stb&lt;br /&gt;
&lt;br /&gt;
'''From the AXI Wrapper: '''our next stage from where we are taking signals is the AXI Wrapper. This can be understood as a translating stage in which the data that goes from and to the user's design is correctly encapsulated into a CHDR packet [5]. By probing this signals we expect to find out that the data that is being transported is correct, and that the transaction also takes places at the right moment.&lt;br /&gt;
* s_axis_data_tdata&lt;br /&gt;
* s_axis_data_tuser&lt;br /&gt;
* s_axis_data_tlast&lt;br /&gt;
* s_axis_data_tvalid&lt;br /&gt;
* s_axis_data_tready&lt;br /&gt;
&lt;br /&gt;
'''From the signal generator design: ''' Last but not least, we are probing signals from the UUT IP, which means that we are checking directly the value that certain lines inside the FPGA have the correct value at a certain time. In this case, we'll be checking if the wave type is according with the one selected from the host, that the gain value is propagated correctly and, clearly, if the block is generating signals when it is enable and when it isn't.&lt;br /&gt;
* gain&lt;br /&gt;
* wave_type&lt;br /&gt;
* enable&lt;br /&gt;
&lt;br /&gt;
= Setting up the code for ChipScoping =&lt;br /&gt;
&lt;br /&gt;
To let know Vivado that we want to probe signals, we have to go directly into the code and mark this signals for debugging. This can be done by using reserved words that describe the synthesizing attributes for a given signal. There is a variety of different attributes that you can give to any signal of your design [2], but here we are going to discuss the ones that serve most of the debugging needs:&lt;br /&gt;
&lt;br /&gt;
* '''KEEP: ''' This attribute prevents the signal to be optimized or absorbed into logic blocks, which would mean that the signal, even though it would be operational after synthesis, may not be accessible for probing. An example of the syntax for this attribute is as follows:&lt;br /&gt;
  VERILOG:&lt;br /&gt;
    (* keep = &amp;quot;true&amp;quot; *) wire signal_name;&lt;br /&gt;
    assign signal_name = in1 &amp;amp; in2;&lt;br /&gt;
&lt;br /&gt;
  VHDL:&lt;br /&gt;
    signal signal_name : std_logic;&lt;br /&gt;
    attribute keep : string;&lt;br /&gt;
    attribute keep of signal_name : signal is &amp;quot;true&amp;quot;;&lt;br /&gt;
    signal_name &amp;lt;= in1 and in2;&lt;br /&gt;
&lt;br /&gt;
* '''KEEP_HIERARCHY: ''' As well as KEEP, this attribute prevents the optimization. However, this attribute can be applied to a module or instance. By using this attribute, the synthesis tools keep the boundary on this signal static. Example:&lt;br /&gt;
  VERILOG&lt;br /&gt;
    On Module:&lt;br /&gt;
    (* keep_hierarchy = &amp;quot;yes&amp;quot; *) module example (in1, in2, out1, out2);&lt;br /&gt;
    On Instance:&lt;br /&gt;
    (* keep_hierarchy = &amp;quot;yes&amp;quot; *) example e0 (.in1(in1), .in2(in2), .out1(out1));&lt;br /&gt;
&lt;br /&gt;
  VHDL&lt;br /&gt;
    On Module:&lt;br /&gt;
    attribute keep_hierarchy : string;&lt;br /&gt;
    attribute keep_hierarchy of example : architecture is &amp;quot;yes&amp;quot;;&lt;br /&gt;
    On Instance:&lt;br /&gt;
    attribute keep_hierarchy : string;&lt;br /&gt;
    attribute keep_hierarchy of e0 : label is &amp;quot;yes&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
* '''DONT_TOUCH: ''' this attribute works just as KEEP and KEEP_HIERARCHY, with the difference that this one is forward-annotated to place and route to prevent logic optimization. In case where other attributes get into conflict with DONT_TOUCH, DONT_TOUCH takes precedence and will be applied. It also can take values yes/no and true/false. Example:&lt;br /&gt;
&lt;br /&gt;
  VERILOG WIRE&lt;br /&gt;
    (* dont_touch = &amp;quot;yes&amp;quot; *) wire signal1;&lt;br /&gt;
    assign signal1 = in1 &amp;amp; in2;&lt;br /&gt;
&lt;br /&gt;
  VERILOG MODULE&lt;br /&gt;
    (* DONT_TOUCH = &amp;quot;yes&amp;quot; *)&lt;br /&gt;
    module example (clk, in1, in2, out1);&lt;br /&gt;
&lt;br /&gt;
  VHDL EXAMPLE&lt;br /&gt;
    signal sig1 : std_logic;&lt;br /&gt;
    attribute dont_touch : string;&lt;br /&gt;
    attribute dont_touch of sig1 : signal is &amp;quot;true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* '''MARK_DEBUG: ''' This is arguably the most important attribute for our current use case, because it is the one that tells Vivado which nets are going to be debugged. This also prevents optimization over the signal, and in addition prepares it to be probed during operation. Virtually this attribute could be applied to any net within the design, but there are some nets with specific properties could have protection against visibility, and can not be probed. The values for MARK_DEBUG are TRUE/FALSE. Example:&lt;br /&gt;
  VERILOG&lt;br /&gt;
    (* MARK_DEBUG = &amp;quot;TRUE&amp;quot; *) wire debug_wire;&lt;br /&gt;
  VHDL&lt;br /&gt;
    attribute MARK_DEBUG : string;&lt;br /&gt;
    attribute MARK_DEBUG of signal_name : signal is &amp;quot;TRUE&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For other attributes and options, please refer to Xilinx's documentation [1][2]. We are going to use the given almost in every case, if not always. Now, the syntax is rather simple and so is the applications to the attributes to the code. The resulting file should look as the picture on the right. When you have modified the code, you are ready to build your debug bitstream.&lt;br /&gt;
&lt;br /&gt;
[[File:chipscope_diff_siggen.png|thumb|Adding attributes to signals to probe.|900px|center|Adding attributes to signals to probe.|link=https://kb.ettus.com/images/a/a7/chipscope_diff_siggen.png]]&lt;br /&gt;
&lt;br /&gt;
= Building the debug bitstream =&lt;br /&gt;
== Save the project and finish Synthesis ==&lt;br /&gt;
For this test in particular you are going to need to have a DDC (Digital down converter) in addition to the UUT for visualization purposes on a host. To add this blocks into the bitstream, go to  &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}/[usrp3|usrp3_rfnoc/tools/scripts/&amp;lt;/syntaxhighlight&amp;gt; and inside that directory run the following command:&lt;br /&gt;
&lt;br /&gt;
    $ ./make.py siggen ddc -g&lt;br /&gt;
&lt;br /&gt;
This will set up your Vivado environment and start the build of an FPGA image with the signal generator and the DDC blocks. The option '-g' is telling the script that at some point during the build process the Vivado User Interface should be opened, as it is where we are going to set up our debug image. For  &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;make.py&amp;lt;/syntaxhighlight&amp;gt; usage and options please refer to  the [[Getting_Started_with_RFNoC_Development#Wiring_up_computation_engines_and_building_the_FPGA image|Wiring up computation engines and building the FPGA image]] section of our getting started guide, or simply run  &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;make.py --help in your terminal&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note: ''' ''The FPGA image building process may take over an hour.''&lt;br /&gt;
&lt;br /&gt;
The Vivado GUI is going to come up at some point of the synthesis. Right after the Vivado GUI has opened, you can go ahead and cancel the process that is running, which is usually the last part of the synthesis  (when it shows 90% done is a safe moment to cancel. See &amp;quot;Saving the project&amp;quot; figure). This is because we first have to set up the parameters for debugging and the synthesis has to be re-run. After canceling, save the project and give it a name of your choice; we are giving here the name ''AN_chipscope'', but you can name the project whatever you like. Right after saving the project, click on 'Run Synthesis', which can be found on the left panel under '''Project Manager-&amp;gt;Synthesis-&amp;gt;Run Synthesis'''.&lt;br /&gt;
&lt;br /&gt;
[[File:cs1.png|thumb|200px|left|Saving the Vivado Project|link=https://kb.ettus.com/images/7/74/cs1.png]]&lt;br /&gt;
&lt;br /&gt;
'''Note: ''' Most of the time Vivado will auto-detect your highest hierarchy module, but it may happen that it just slips to it and then it will ask you which it. If this happens, you can select the verilog file according to the target device that you are chipscoping as the top module (e.g. x300.v or e300.v)&lt;br /&gt;
&lt;br /&gt;
Now wait until the synthesis is finished. This won't take long, and after it finishes a window will prompted saying that the synthesis is done, and asking if you want to run the implementation. Click on cancel, as we need to setup the debugging parameters first. &lt;br /&gt;
&lt;br /&gt;
== Setup debug ==&lt;br /&gt;
&lt;br /&gt;
Go to '''Project Manager -&amp;gt; Synthesis -&amp;gt; Open Synthesized Design -&amp;gt; Set Up debug''', and the wizard will start. Click on next until you see a window listing the nets to debug. Here, two scenarios are expected. See the figure below:&lt;br /&gt;
&lt;br /&gt;
[[File:cs_2.png|center|1200px|Clock Domain|link=https://kb.ettus.com/images/5/52/cs_2.png]]&lt;br /&gt;
&lt;br /&gt;
Sometimes Vivado will pick up the clock domain automatically (which is the case depicted on the right side), but there are occasions where the nets to debug aren't clearly defined under a clock domain and this cases require a little bit more of work, depending on your knowledge of your design. In this case, we know that the nets are under the same clock domain as the other signals, but in case of doubt, you'll have to go and find it out through the code. The case on the left can be solved easily by clicking on 'more info', which is just at the end of the red warning. Right after clickling, further, clearly, information will appear. In the prompted dialog, let us click on 'Assign All Clock Domains'&lt;br /&gt;
&lt;br /&gt;
[[File:cs_3.png|center|Assigning all clock domains|link=https://kb.ettus.com/images/e/e4/cs_3.png]]&lt;br /&gt;
&lt;br /&gt;
A window will appear where you can choose the common clock domain on which you want to have the signals. Here, in our case, we select &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;radio_clk_gen/inst/CLK_OUT1&amp;lt;/syntaxhighlight&amp;gt;, and that would be sufficient to continue. Accept and click next.&lt;br /&gt;
&lt;br /&gt;
Right after, we have to choose the ''Integrated Logic Analizer - ILA'' Core Options [6][7]. Here we will only focus on &amp;quot;Sample of data depth&amp;quot; and &amp;quot;Input pipe stages&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:cs_4.png|550px|center|ILA core options|link=https://kb.ettus.com/images/2/29/cs_4.png]]&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Sample of data depth&amp;quot; is the maximum number of data sample words that the ILA core can store at run time for each of the probe lines. The input pipe stages is the number of flops or registers that are added to each probe line. This basically determines how big the debug setup will be, and the amount of data that is going to be analyzed per run. Here we select 4096 for the data depth and 1 input pipe line. For further information about the ILA and its configuration, please refer to the ILA documentation [6][7]. With this, the set up is done, and you can proceed to click &amp;quot;next&amp;quot; and then &amp;quot;finish&amp;quot; to complete the wizard operation.&lt;br /&gt;
&lt;br /&gt;
[[File:cs_5.png|center|ILA core options|link=https://kb.ettus.com/images/a/a3/cs_5.png]]&lt;br /&gt;
&lt;br /&gt;
After the setup is finished, go to the left panel and click '''Project Manager-&amp;gt;Program and Debug-&amp;gt;Generate Bitstream'''. This will ask you if you want to run the implementation first, to what we answer 'Yes'. This will prepare the bitstream with which we are going to program our device and debug our design.&lt;br /&gt;
&lt;br /&gt;
= Running the debug bitstream in the target device =&lt;br /&gt;
After the bitstream generation is completed successfully, it is time for us to move on and put our design into the device. On the left pannel, right below we generated our bitstream, is the &amp;quot;Hardware Manager&amp;quot;. At this point, we have our X310 connected via JTAG for programming purposes, and via Ethernet (1G in this specific use case) for later usage. Now, click on 'Open Target'. If you have only one device connected, the option &amp;quot;auto-connect&amp;quot; should work just fine. Otherwise, select your device by clicking on &amp;quot;Open new target&amp;quot; and following the options in order to find the device you want. After doing so, two options should appear at the top of your Vivado window:&lt;br /&gt;
&lt;br /&gt;
[[File:cs_6.png|center|Hardware options|link=https://kb.ettus.com/images/9/9e/cs_6.png]]&lt;br /&gt;
&lt;br /&gt;
As a first step, click on &amp;quot;Program device&amp;quot;. Usually, again, Vivado picks up the bitstream that you just generated. However, if you have been running multiple bitstream builds and/or have multiple Vivado projects, it is possible that you would have to look for the right bitstream. It should be under the project that you have been working during the generation of your debug bitstream. &lt;br /&gt;
&lt;br /&gt;
After programing, you have to run an initialization routine on your device. A way to do this is to run a usrp probe, which will also tell us several interesting information. In a terminal, run:&lt;br /&gt;
&lt;br /&gt;
    $ uhd_usrp_probe&lt;br /&gt;
&lt;br /&gt;
This will tell you information about the device. In our case, the last portion of the output should look like this:&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;
    |   |   |   * SigGen_0&lt;br /&gt;
    |   |   |   * DUC_0&lt;br /&gt;
    |   |   |   * DDC_0&lt;br /&gt;
&lt;br /&gt;
which tells us that the blocks '''Signal Generator, DUC and DDC''' were correctly added into the device. Keep in mind that the DmA FIFO and two instances of the radio are added by default into an X310 device. Now, go back to the Vivado GUI and click on &amp;quot;Refresh device&amp;quot; right on the top of the Vivado Window. After that, your debugging signals should appear and you are ready to start chipscoping.&lt;br /&gt;
&lt;br /&gt;
== Selecting Triggers ==&lt;br /&gt;
While probing your design, you probably want to know the state of a given signal right at the moment at which it or other signal changed. In some cases you can have a short simulation and you can ''eye-ball'' your signals and see if the results are as expected. However, sometimes signals change very fast or have a really short duration, making a qualitative procedure a little bit more complicated. For that case, you can set up '''triggers''', which means that the chipscope tool will start capturing when a desired signal changes. We are going to use this feature here and is recommended to do so to have more control over the signal capturing.&lt;br /&gt;
&lt;br /&gt;
[[File:cs_7.png|center|Trigger Setup|link=https://kb.ettus.com/images/e/e1/cs_7.png]]&lt;br /&gt;
&lt;br /&gt;
Here we are going to choose two signals as triggers, which are '''s_axis_data_tvalid''' and '''s_axis_data_tready'''. The names are almost self explanatory: they state when the device has valid data and when it is ready (see [4] for further information). After choosing this signals, now we have to put our device to work. Even, you can click on &amp;quot;run trigger for this ILA core&amp;quot;, which will let the device on idle state waiting for the trigger. &lt;br /&gt;
&lt;br /&gt;
[[File:cs_9.png|center|Trigger Setup. You can also see the black panel where all the debug lines are listed.|link=https://kb.ettus.com/images/7/74/cs_9.png]]&lt;br /&gt;
&lt;br /&gt;
== Debugging at run time ==&lt;br /&gt;
This is what we came for. The block is to be put in a normal use case where it will run and, simultaneously, we will probe signals from it. For the '''RFNoC: Signal Generator''', we are going to use GNURadio to set up the application. Actually, we are going to use the siggen example that is shipped within ''gr-ettus''. We open to &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}{path_to_gr-ettus}/examples/rfnoc/rfnoc_siggen.grc&amp;lt;/syntaxhighlight&amp;gt;, where a simple setup is ready to show the siggen working.&lt;br /&gt;
&lt;br /&gt;
[[File:cs_8.png|center|GNURadio example for the RFNoC: Signal Generator block|link=https://kb.ettus.com/images/d/d1/cs_8.png]]&lt;br /&gt;
&lt;br /&gt;
You can see that there is a number of options which can be modified. As we choose to check how signal such as &amp;quot;Wave type&amp;quot; and &amp;quot;gain&amp;quot;, we are going to focus on this for now. They can be modified on runtime, but every time that they are set to a different value the trigger has to be run again on the Vivado chipscope. Following are some of the expected results:&lt;br /&gt;
&lt;br /&gt;
'''Signal type: Constant || Gain: 1: ''' In this case the signal &amp;quot;wave type&amp;quot; is set to 0, as it being the first option available in the block. The Gain is set to 7FFF, which is the maximum hexadecimal value that the register is able to receive in this case and which means the maximum absolute gain.&lt;br /&gt;
[[File:cs_10.png|center|Signal type: Constant || Gain: 1|link=https://kb.ettus.com/images/7/72/cs_10.png]]&lt;br /&gt;
&lt;br /&gt;
'''Signal type: Sinusoid || Gain: 1: ''' Now the wave type is set to 1, being the next option available. The gain is unchanged to show how it holds the same value in the readback register.&lt;br /&gt;
[[File:cs_12.png|center|Signal type: Sinusoid || Gain: 1|link=https://kb.ettus.com/images/5/56/cs_12.png]]&lt;br /&gt;
&lt;br /&gt;
'''Signal type: Noise || Gain: 0.5: ''' Wave type and gain are both changed, showing results somewhat expected: wave type is set to 2, being sequentially the next option available, and the gain is set to half of the maximum value, which is shown to be true also in its hexadecimal representation read from the readback register.&lt;br /&gt;
[[File:cs_14.png|center|Signal type: Noise || Gain: 0.5|link=https://kb.ettus.com/images/9/9a/cs_14.png]]&lt;br /&gt;
&lt;br /&gt;
If you have come successfully until this point, then you can play around with the signals and checking the result in the debugging panel or, even better, apply this technique to debug your own RFNoC design!&lt;br /&gt;
&lt;br /&gt;
= External references =&lt;br /&gt;
[1] [https://www.xilinx.com/support/documentation/sw_manuals/xilinx2015_4/ug936-vivado-tutorial-programming-debugging.pdf Vivado Tutorial: Programming and debugging]&lt;br /&gt;
&lt;br /&gt;
[2] [https://www.xilinx.com/support/documentation/sw_manuals/xilinx2015_4/ug901-vivado-synthesis.pdf Vivado Synthesis]&lt;br /&gt;
&lt;br /&gt;
[3] [https://www.ettus.com/content/files/RFNoC_Wireless_at_VT_FPGA.pdf RFNoC Deep Dive: FPGA]&lt;br /&gt;
&lt;br /&gt;
[4] [https://www.xilinx.com/support/documentation/ip_documentation/ug761_axi_reference_guide.pdf Xilinx - AXI reference guide]&lt;br /&gt;
&lt;br /&gt;
[5] [https://files.ettus.com/manual/page_rtp.html Radio Transport Protocols]&lt;br /&gt;
&lt;br /&gt;
[6] [https://www.xilinx.com/support/documentation/ip_documentation/chipscope_ila/v1_04_a/chipscope_ila.pdf LogiCORE IP ChipScope Pro Integrated Logic Analyzer]&lt;br /&gt;
&lt;br /&gt;
[7] [https://www.xilinx.com/support/documentation/ip_documentation/ila/v3_0/pg172-ila.pdf LogiCORE IP Integrated Logic Analyzer v3.0]&lt;br /&gt;
&lt;br /&gt;
[8] [https://www.xilinx.com/support/documentation/application_notes/xapp199.pdf Xilinx AN - Writing efficient Testbenches]&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:cs_14.png&amp;diff=3168</id>
		<title>File:cs 14.png</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:cs_14.png&amp;diff=3168"/>
				<updated>2016-12-16T11:11:03Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: NicolasCuervo uploaded a new version of File:cs 14.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:cs_12.png&amp;diff=3167</id>
		<title>File:cs 12.png</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:cs_12.png&amp;diff=3167"/>
				<updated>2016-12-16T11:10:21Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: NicolasCuervo uploaded a new version of File:cs 12.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:cs_10.png&amp;diff=3166</id>
		<title>File:cs 10.png</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:cs_10.png&amp;diff=3166"/>
				<updated>2016-12-16T11:09:29Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: NicolasCuervo uploaded a new version of File:cs 10.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:cs_14.png&amp;diff=3165</id>
		<title>File:cs 14.png</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:cs_14.png&amp;diff=3165"/>
				<updated>2016-12-16T10:58:32Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:cs_13.png&amp;diff=3164</id>
		<title>File:cs 13.png</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:cs_13.png&amp;diff=3164"/>
				<updated>2016-12-16T10:50:37Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:cs_12.png&amp;diff=3163</id>
		<title>File:cs 12.png</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:cs_12.png&amp;diff=3163"/>
				<updated>2016-12-16T10:50:11Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:cxs_11.png&amp;diff=3162</id>
		<title>File:cxs 11.png</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:cxs_11.png&amp;diff=3162"/>
				<updated>2016-12-16T10:48:14Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:cs_10.png&amp;diff=3161</id>
		<title>File:cs 10.png</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:cs_10.png&amp;diff=3161"/>
				<updated>2016-12-16T10:47:48Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:cs_9.png&amp;diff=3160</id>
		<title>File:cs 9.png</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:cs_9.png&amp;diff=3160"/>
				<updated>2016-12-16T10:40:15Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:cs_8.png&amp;diff=3159</id>
		<title>File:cs 8.png</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:cs_8.png&amp;diff=3159"/>
				<updated>2016-12-16T10:35:50Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:cs_7.png&amp;diff=3158</id>
		<title>File:cs 7.png</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:cs_7.png&amp;diff=3158"/>
				<updated>2016-12-16T10:17:52Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Debugging_FPGA_images&amp;diff=3132</id>
		<title>Debugging FPGA images</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Debugging_FPGA_images&amp;diff=3132"/>
				<updated>2016-12-03T15:16:20Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Application Note Number =&lt;br /&gt;
'''AN-XXX'''&lt;br /&gt;
&lt;br /&gt;
= Revision History =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Author&lt;br /&gt;
!Details&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2016-11-28&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Nicolas Cuervo &amp;lt;br&amp;gt; Sugandha Gupta&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Initial creation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UNDER CONSTRUCTION: THE CONTENTS OF THIS PAGE HAVE TO GO THROUGH REVIEW AND EDITION. AT THIS MOMENT, PLEASE DO NOT USE THIS PAGE AS A REFERENCE! =&lt;br /&gt;
&lt;br /&gt;
= Abstract =&lt;br /&gt;
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. The contents of this AN could suit most of your needs while setting your debug bitstream for a RFNoC design. However, keep in mind that the topics described here are strictly related to Xilinx framework. For further information please refer to Xilinx documentation [1][2]. &lt;br /&gt;
&lt;br /&gt;
= Overview = &lt;br /&gt;
When you are developing your own application, you might come to the point on which you would like to build an FPGA image for your USRP. You might want to modify part of the cores, add some custom functionality, or even add your custom RFNoC block! For that you might follow tutorials such as the [[Getting_Started_with_RFNoC_Development#Building the FPGA image|Building the FPGA image]] section of one our &amp;quot;getting started&amp;quot; guides. &lt;br /&gt;
&lt;br /&gt;
But how about debugging your HDL code? This comes really handy when you want to follow closely the behavior of your signals within your hardware design. This Application Note will follow the basic steps needed to create a &amp;quot;chipscope image&amp;quot;, which allow you to use the Vivado GUI visual tools to debug your design. &lt;br /&gt;
&lt;br /&gt;
Before we start, this App note assumes that you have been working already with some fpga code and you want to debug it. Being this the case, we assume that you have UHD installed, the FPGA repository cloned, the right version of Xilinx Vivado installed (by the moment this is being written we use Vivado 2015.4) and its environment initialized. If not, we assume you are familiar on how to do the previously noted procedures. &lt;br /&gt;
&lt;br /&gt;
For illustration purposes, here we are going to check the status of some of the output signals of one of the RFNoC blocks we currently provide. However, the same procedure can be used to check the status of any signal within your hardware code, being input, output, or intermediate signal, and being the code a core description, a module for your library or your custom RFNoC block.&lt;br /&gt;
&lt;br /&gt;
''' Note: ''' Keep in mind that this procedure intends to probe the signals in a fully designed block, which has been also built into a FPGA .bit file and is running in a supported device. This is *not* intended to be a way to test directly your designed code, as building an FPGA image may take several minutes (even hours). For small functionality checks, we strongly recommend you to write a testbench for your code, which will allow you to have more iterations without the need of building and synthesizing your hardware description. You can follow the [https://files.ettus.com/manual/md_usrp3_sim_writing_testbenches.html - Writing Testbenches] section of our reference manual to have insights on how to write your own testbench. In addition, there is plenty of online resources (such as [8]) that provide enough information to get you started with your simulation.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites = &lt;br /&gt;
&lt;br /&gt;
* '''Vivado (version 2015.4): ''' As stated in the overview, you'll be working directly with HDL code that you need to build and synthesize. Depending on your target device, you may even need a non-free license (which is the case for the X3XX devices). In the case of Ettus' embedded devices, you can proceed with your design using the Vivado Webpack.&lt;br /&gt;
&lt;br /&gt;
* '''UHD, GNURadio and gr-ettus: ''' At the end of the debugging process we will be running the application on a physical device, and for that we need the core code downloaded and installed. UHD will serve as our device driver, GNURadio the frame on which our app will run, and gr-ettus is needed for our ''signal generator'' block. If you need guidance on this, please refer to the [https://kb.ettus.com/Getting_Started_with_RFNoC_Development#Creating_a_development_environment Creating a development environment] section of our ''Getting started guide''. If you are debugging your own RFNoC OOT module, this will have to be installed as well. &lt;br /&gt;
&lt;br /&gt;
* '''RFNoC supported device: ''' The whole point of chipscoping is having the ability of probing signals from a hardware design at runtime. Hence, a device where the application is going to run is needed. In this tutorial we will be using an X310 device.&lt;br /&gt;
&lt;br /&gt;
= Choosing your signals =&lt;br /&gt;
At this point we assume that you have a verilog code that has been properly tested by the means of simulation/testbench, but that you want to inspect into its functionality deeper by probing its signals while it is running on a device. This could be helpful for many reasons, such as getting a deeper understanding on the state of your signal during a given transaction, which could give you an insight on how it is working (or even, can give you a lead on why it isn't!)&lt;br /&gt;
&lt;br /&gt;
For this AN, we will use out block '''RFNoC: Signal Generator''' as our Unit Under Test (UUT). However, all procedures to be done can be easily transfered to your own design. In addition, as most of our block and FPGA code is written in Verilog, we will use it also in this document. So let's get started.&lt;br /&gt;
&lt;br /&gt;
The Signal generator's code can be found under &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}/usrp3/lib/rfnoc/&amp;lt;/syntaxhighlight&amp;gt;. In some of our latest code releases (such as 3.10.0.0), this code is found under &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}/usrp3_rfnoc/lib/rfnoc/&amp;lt;/syntaxhighlight&amp;gt;. In this directory you can find the RFNoC related code that is used in the RFNoC framework. Consequently, all the HDL for the NoC blocks the we provide is located here. Now, open the file &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;noc_block_siggen.v&amp;lt;/syntaxhighlight&amp;gt; in your IDE or text editor of preference and give it a quick look. &lt;br /&gt;
&lt;br /&gt;
As you can see, the code is not too extensive and is the comments divide it properly based on functionality. If your design is RFNoCModtool-generated, you'll get a similar preliminary structure in the verilog files for your block. For information on how to use RFNoCModtool please refer to [https://kb.ettus.com/index.php?title=Getting_Started_with_RFNoC_Development RFNoC Development - Getting Started Guide]. Normally for rather simple designs you won't have to deal with the RFNoC Shell or the AXI Wrapper configuration. However, for illustration purposes, we are going to take some of the signals from this part of the code and probe them in our debugging process. A total of 11 signals will be selected, each from a different internal stage. &lt;br /&gt;
&lt;br /&gt;
Lets take a look at how this boundaries look like in the FPGA Internals. Each full RFNoC design can include several different blocks, which are also called &amp;quot;computation engines&amp;quot;. The picture on the right [3] portraits the computation engine internals in a quite self explanatory fashion, although a slightly more detailed explanation about each of the internals from a Computation Engine can be found at the  [https://kb.ettus.com/RFNoC_Getting_Started_Guides RFNoC Software Page]:&lt;br /&gt;
&lt;br /&gt;
[[File:CE_internals.png|Anatomy of a computation engine.|600px|right|Anatomy of a computation engine|link=https://kb.ettus.com/images/8/83/CE_internals.png]]&lt;br /&gt;
&lt;br /&gt;
'''From NoC Shell: '''At the top of the figure you can see the AXI Crossbar, were all the computation engines are wired up together. This is not part of our UUT in particular. However, the connection between the crossbar and our UUT - NoC Shell can be tested within our code. From here we are taking the set_data/addr/stb, which are readback registers and provide information from this interface.&lt;br /&gt;
* set_data&lt;br /&gt;
* set_addr&lt;br /&gt;
* set_stb&lt;br /&gt;
&lt;br /&gt;
'''From the AXI Wrapper: '''our next stage from where we are taking signals is the AXI Wrapper. This can be understood as a translating stage in which the data that goes from and to the user's design is correctly encapsulated into a CHDR packet [5]. By probing this signals we expect to find out that the data that is being transported is correct, and that the transaction also takes places at the right moment.&lt;br /&gt;
* s_axis_data_tdata&lt;br /&gt;
* s_axis_data_tuser&lt;br /&gt;
* s_axis_data_tlast&lt;br /&gt;
* s_axis_data_tvalid&lt;br /&gt;
* s_axis_data_tready&lt;br /&gt;
&lt;br /&gt;
'''From the signal generator design: ''' Last but not least, we are probing signals from the UUT IP, which means that we are checking directly the value that certain lines inside the FPGA have the correct value at a certain time. In this case, we'll be checking if the wave type is according with the one selected from the host, that the gain value is propagated correctly and, clearly, if the block is generating signals when it is enable and when it isn't.&lt;br /&gt;
* gain&lt;br /&gt;
* wave_type&lt;br /&gt;
* enable&lt;br /&gt;
&lt;br /&gt;
= Setting up the code for ChipScoping =&lt;br /&gt;
&lt;br /&gt;
To let know Vivado that we want to probe signals, we have to go directly into the code and mark this signals for debugging. This can be done by using reserved words that describe the synthesizing attributes for a given signal. There is a variety of different attributes that you can give to any signal of your design [2], but here we are going to discuss the ones that serve most of the debugging needs:&lt;br /&gt;
&lt;br /&gt;
* '''KEEP: ''' This attribute prevents the signal to be optimized or absorbed into logic blocks, which would mean that the signal, even though it would be operational after synthesis, may not be accessible for probing. An example of the syntax for this attribute is as follows:&lt;br /&gt;
  VERILOG:&lt;br /&gt;
    (* keep = &amp;quot;true&amp;quot; *) wire signal_name;&lt;br /&gt;
    assign signal_name = in1 &amp;amp; in2;&lt;br /&gt;
&lt;br /&gt;
  VHDL:&lt;br /&gt;
    signal signal_name : std_logic;&lt;br /&gt;
    attribute keep : string;&lt;br /&gt;
    attribute keep of signal_name : signal is &amp;quot;true&amp;quot;;&lt;br /&gt;
    signal_name &amp;lt;= in1 and in2;&lt;br /&gt;
&lt;br /&gt;
* '''KEEP_HIERARCHY: ''' As well as KEEP, this attribute prevents the optimization. However, this attribute can be applied to a module or instance. By using this attribute, the synthesis tools keep the boundary on this signal static. Example:&lt;br /&gt;
  VERILOG&lt;br /&gt;
    On Module:&lt;br /&gt;
    (* keep_hierarchy = &amp;quot;yes&amp;quot; *) module example (in1, in2, out1, out2);&lt;br /&gt;
    On Instance:&lt;br /&gt;
    (* keep_hierarchy = &amp;quot;yes&amp;quot; *) example e0 (.in1(in1), .in2(in2), .out1(out1));&lt;br /&gt;
&lt;br /&gt;
  VHDL&lt;br /&gt;
    On Module:&lt;br /&gt;
    attribute keep_hierarchy : string;&lt;br /&gt;
    attribute keep_hierarchy of example : architecture is &amp;quot;yes&amp;quot;;&lt;br /&gt;
    On Instance:&lt;br /&gt;
    attribute keep_hierarchy : string;&lt;br /&gt;
    attribute keep_hierarchy of e0 : label is &amp;quot;yes&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
* '''DONT_TOUCH: ''' this attribute works just as KEEP and KEEP_HIERARCHY, with the difference that this one is forward-annotated to place and route to prevent logic optimization. In case where other attributes get into conflict with DONT_TOUCH, DONT_TOUCH takes precedence and will be applied. It also can take values yes/no and true/false. Example:&lt;br /&gt;
&lt;br /&gt;
  VERILOG WIRE&lt;br /&gt;
    (* dont_touch = &amp;quot;yes&amp;quot; *) wire signal1;&lt;br /&gt;
    assign signal1 = in1 &amp;amp; in2;&lt;br /&gt;
&lt;br /&gt;
  VERILOG MODULE&lt;br /&gt;
    (* DONT_TOUCH = &amp;quot;yes&amp;quot; *)&lt;br /&gt;
    module example (clk, in1, in2, out1);&lt;br /&gt;
&lt;br /&gt;
  VHDL EXAMPLE&lt;br /&gt;
    signal sig1 : std_logic;&lt;br /&gt;
    attribute dont_touch : string;&lt;br /&gt;
    attribute dont_touch of sig1 : signal is &amp;quot;true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* '''MARK_DEBUG: ''' This is arguably the most important attribute for our current use case, because it is the one that tells Vivado which nets are going to be debugged. This also prevents optimization over the signal, and in addition prepares it to be probed during operation. Virtually this attribute could be applied to any net within the design, but there are some nets with specific properties could have protection against visibility, and can not be probed. The values for MARK_DEBUG are TRUE/FALSE. Example:&lt;br /&gt;
  VERILOG&lt;br /&gt;
    (* MARK_DEBUG = &amp;quot;TRUE&amp;quot; *) wire debug_wire;&lt;br /&gt;
  VHDL&lt;br /&gt;
    attribute MARK_DEBUG : string;&lt;br /&gt;
    attribute MARK_DEBUG of signal_name : signal is &amp;quot;TRUE&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For other attributes and options, please refer to Xilinx's documentation [1][2]. We are going to use the given almost in every case, if not always. Now, the syntax is rather simple and so is the applications to the attributes to the code. The resulting file should look as the picture on the right. When you have modified the code, you are ready to build your debug bitstream.&lt;br /&gt;
&lt;br /&gt;
[[File:chipscope_diff_siggen.png|thumb|Adding attributes to signals to probe.|900px|center|Adding attributes to signals to probe.|link=https://kb.ettus.com/images/a/a7/chipscope_diff_siggen.png]]&lt;br /&gt;
&lt;br /&gt;
= Building the debug bitstream =&lt;br /&gt;
== Save the project and finish Synthesis ==&lt;br /&gt;
For this test in particular you are going to need to have a DDC (Digital down converter) in addition to the UUT for visualization purposes on a host. To add this blocks into the bitstream, go to  &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}/[usrp3|usrp3_rfnoc/tools/scripts/&amp;lt;/syntaxhighlight&amp;gt; and inside that directory run the following command:&lt;br /&gt;
&lt;br /&gt;
    $ ./make.py siggen ddc -g&lt;br /&gt;
&lt;br /&gt;
This will set up your Vivado environment and start the build of an FPGA image with the signal generator and the DDC blocks. The option '-g' is telling the script that at some point during the build process the Vivado User Interface should be opened, as it is where we are going to set up our debug image. For  &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;make.py&amp;lt;/syntaxhighlight&amp;gt; usage and options please refer to  the [[Getting_Started_with_RFNoC_Development#Wiring_up_computation_engines_and_building_the_FPGA image|Wiring up computation engines and building the FPGA image]] section of our getting started guide, or simply run  &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;make.py --help in your terminal&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note: ''' ''The FPGA image building process may take over an hour.''&lt;br /&gt;
&lt;br /&gt;
The Vivado GUI is going to come up at some point of the synthesis. Right after the Vivado GUI has opened, you can go ahead and cancel the process that is running, which is usually the last part of the synthesis  (when it shows 90% done is a safe moment to cancel. See &amp;quot;Saving the project&amp;quot; figure). This is because we first have to set up the parameters for debugging and the synthesis has to be re-run. After canceling, save the project and give it a name of your choice; we are giving here the name ''AN_chipscope'', but you can name the project whatever you like. Right after saving the project, click on 'Run Synthesis', which can be found on the left panel under '''Project Manager-&amp;gt;Synthesis-&amp;gt;Run Synthesis'''.&lt;br /&gt;
&lt;br /&gt;
[[File:cs1.png|thumb|200px|left|Saving the Vivado Project|link=https://kb.ettus.com/images/7/74/cs1.png]]&lt;br /&gt;
&lt;br /&gt;
'''Note: ''' Most of the time Vivado will auto-detect your highest hierarchy module, but it may happen that it just slips to it and then it will ask you which it. If this happens, you can select the verilog file according to the target device that you are chipscoping as the top module (e.g. x300.v or e300.v)&lt;br /&gt;
&lt;br /&gt;
Now wait until the synthesis is finished. This won't take long, and after it finishes a window will prompted saying that the synthesis is done, and asking if you want to run the implementation. Click on cancel, as we need to setup the debugging parameters first. &lt;br /&gt;
&lt;br /&gt;
== Setup debug ==&lt;br /&gt;
&lt;br /&gt;
Go to '''Project Manager -&amp;gt; Synthesis -&amp;gt; Open Synthesized Design -&amp;gt; Set Up debug''', and the wizard will start. Click on next until you see a window listing the nets to debug. Here, two scenarios are expected. See the figure below:&lt;br /&gt;
&lt;br /&gt;
[[File:cs_2.png|center|1200px|Clock Domain|link=https://kb.ettus.com/images/5/52/cs_2.png]]&lt;br /&gt;
&lt;br /&gt;
Sometimes Vivado will pick up the clock domain automatically (which is the case depicted on the right side), but there are occasions where the nets to debug aren't clearly defined under a clock domain and this cases require a little bit more of work, depending on your knowledge of your design. In this case, we know that the nets are under the same clock domain as the other signals, but in case of doubt, you'll have to go and find it out through the code. The case on the left can be solved easily by clicking on 'more info', which is just at the end of the red warning. Right after clickling, further, clearly, information will appear. In the prompted dialog, let us click on 'Assign All Clock Domains'&lt;br /&gt;
&lt;br /&gt;
[[File:cs_3.png|center|Assigning all clock domains|link=https://kb.ettus.com/images/e/e4/cs_3.png]]&lt;br /&gt;
&lt;br /&gt;
A window will appear where you can choose the common clock domain on which you want to have the signals. Here, in our case, we select &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;radio_clk_gen/inst/CLK_OUT1&amp;lt;/syntaxhighlight&amp;gt;, and that would be sufficient to continue. Accept and click next.&lt;br /&gt;
&lt;br /&gt;
Right after, we have to choose the ''Integrated Logic Analizer - ILA'' Core Options [6][7]. Here we will only focus on &amp;quot;Sample of data depth&amp;quot; and &amp;quot;Input pipe stages&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:cs_4.png|550px|center|ILA core options|link=https://kb.ettus.com/images/2/29/cs_4.png]]&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Sample of data depth&amp;quot; is the maximum number of data sample words that the ILA core can store at run time for each of the probe lines. The input pipe stages is the number of flops or registers that are added to each probe line. This basically determines how big the debug setup will be, and the amount of data that is going to be analyzed per run. Here we select 4096 for the data depth and 1 input pipe line. For further information about the ILA and its configuration, please refer to the ILA documentation [6][7]. With this, the set up is done, and you can proceed to click &amp;quot;next&amp;quot; and then &amp;quot;finish&amp;quot; to complete the wizard operation.&lt;br /&gt;
&lt;br /&gt;
[[File:cs_5.png|center|ILA core options|link=https://kb.ettus.com/images/a/a3/cs_5.png]]&lt;br /&gt;
&lt;br /&gt;
After the setup is finished, go to the left panel and click '''Project Manager-&amp;gt;Program and Debug-&amp;gt;Generate Bitstream'''. This will ask you if you want to run the implementation first, to what we answer 'Yes'. This will prepare the bitstream with which we are going to program our device and debug our design.&lt;br /&gt;
&lt;br /&gt;
= Running the debug bitstream in the target device =&lt;br /&gt;
After the bitstream generation is completed successfully, it is time for us to move on and put our design into the device. On the left pannel, right below we generated our bitstream, is the &amp;quot;Hardware Manager&amp;quot;. At this point, we have our X310 connected via JTAG for programming purposes, and via Ethernet (1G in this specific use case) for later usage. Now, click on 'Open Target'. If you have only one device connected, the option &amp;quot;auto-connect&amp;quot; should work just fine. Otherwise, select your device by clicking on &amp;quot;Open new target&amp;quot; and following the options in order to find the device you want. After doing so, two options should appear at the top of your Vivado window:&lt;br /&gt;
&lt;br /&gt;
[[File:cs_6.png|center|Hardware options|link=https://kb.ettus.com/images/9/9e/cs_6.png]]&lt;br /&gt;
&lt;br /&gt;
As a first step, click on &amp;quot;Program device&amp;quot;. Usually, again, Vivado picks up the bitstream that you just generated. However, if you have been running multiple bitstream builds and/or have multiple Vivado projects, it is possible that you would have to look for the right bitstream. It should be under the project that you have been working during the generation of your debug bitstream. &lt;br /&gt;
&lt;br /&gt;
After programing, you have to run an initialization routine on your device. A way to do this is to run a usrp probe, which will also tell us several interesting information. In a terminal, run:&lt;br /&gt;
&lt;br /&gt;
    $ uhd_usrp_probe&lt;br /&gt;
&lt;br /&gt;
This will tell you information about the device. In our case, the last portion of the output should look like this:&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;
    |   |   |   * SigGen_0&lt;br /&gt;
    |   |   |   * DUC_0&lt;br /&gt;
    |   |   |   * DDC_0&lt;br /&gt;
&lt;br /&gt;
which tells us that the blocks '''Signal Generator, DUC and DDC''' were correctly added into the device. Keep in mind that the DmA FIFO and two instances of the radio are added by default into an X310 device. Now, go back to the Vivado GUI and click on &amp;quot;Refres&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  #WIP&lt;br /&gt;
&lt;br /&gt;
= External references =&lt;br /&gt;
[1] [https://www.xilinx.com/support/documentation/sw_manuals/xilinx2015_4/ug936-vivado-tutorial-programming-debugging.pdf Vivado Tutorial: Programming and debugging]&lt;br /&gt;
&lt;br /&gt;
[2] [https://www.xilinx.com/support/documentation/sw_manuals/xilinx2015_4/ug901-vivado-synthesis.pdf Vivado Synthesis]&lt;br /&gt;
&lt;br /&gt;
[3] [https://www.ettus.com/content/files/RFNoC_Wireless_at_VT_FPGA.pdf RFNoC Deep Dive: FPGA]&lt;br /&gt;
&lt;br /&gt;
[4] [https://www.xilinx.com/support/documentation/ip_documentation/ug761_axi_reference_guide.pdf Xilinx - AXI reference guide]&lt;br /&gt;
&lt;br /&gt;
[5] [https://files.ettus.com/manual/page_rtp.html Radio Transport Protocols]&lt;br /&gt;
&lt;br /&gt;
[6] [https://www.xilinx.com/support/documentation/ip_documentation/chipscope_ila/v1_04_a/chipscope_ila.pdf LogiCORE IP ChipScope Pro Integrated Logic Analyzer]&lt;br /&gt;
&lt;br /&gt;
[7] [https://www.xilinx.com/support/documentation/ip_documentation/ila/v3_0/pg172-ila.pdf LogiCORE IP Integrated Logic Analyzer v3.0]&lt;br /&gt;
&lt;br /&gt;
[8] [https://www.xilinx.com/support/documentation/application_notes/xapp199.pdf Xilinx AN - Writing efficient Testbenches]&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:cs_6.png&amp;diff=3130</id>
		<title>File:cs 6.png</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:cs_6.png&amp;diff=3130"/>
				<updated>2016-12-02T13:24:25Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Debugging_FPGA_images&amp;diff=3129</id>
		<title>Debugging FPGA images</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Debugging_FPGA_images&amp;diff=3129"/>
				<updated>2016-12-02T09:28:24Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: /* External references */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Application Note Number =&lt;br /&gt;
'''AN-XXX'''&lt;br /&gt;
&lt;br /&gt;
= Revision History =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Author&lt;br /&gt;
!Details&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2016-11-28&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Nicolas Cuervo&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Initial creation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UNDER CONSTRUCTION: THE CONTENTS OF THIS PAGE HAVE TO GO THROUGH REVIEW AND EDITION. AT THIS MOMENT, PLEASE DO NOT USE THIS PAGE AS A REFERENCE! =&lt;br /&gt;
&lt;br /&gt;
= Abstract =&lt;br /&gt;
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. The contents of this AN could suit most of your needs while setting your debug bitstream for a RFNoC design. However, keep in mind that the topics described here are strictly related to Xilinx framework. For further information please refer to Xilinx documentation [1][2]. &lt;br /&gt;
&lt;br /&gt;
= Overview = &lt;br /&gt;
When you are developing your own application, you might come to the point on which you would like to build an FPGA image for your USRP. You might want to modify part of the cores, add some custom functionality, or even add your custom RFNoC block! For that you might follow tutorials such as the [[Getting_Started_with_RFNoC_Development#Building the FPGA image|Building the FPGA image]] section of one our &amp;quot;getting started&amp;quot; guides. &lt;br /&gt;
&lt;br /&gt;
But how about debugging your HDL code? This comes really handy when you want to follow closely the behavior of your signals within your hardware design. This Application Note will follow the basic steps needed to create a &amp;quot;chipscope image&amp;quot;, which allow you to use the Vivado GUI visual tools to debug your design. &lt;br /&gt;
&lt;br /&gt;
Before we start, this App note assumes that you have been working already with some fpga code and you want to debug it. Being this the case, we assume that you have UHD installed, the FPGA repository cloned, the right version of Xilinx Vivado installed (by the moment this is being written we use Vivado 2015.4) and its environment initialized. If not, we assume you are familiar on how to do the previously noted procedures. &lt;br /&gt;
&lt;br /&gt;
For illustration purposes, here we are going to check the status of some of the output signals of one of the RFNoC blocks we currently provide. However, the same procedure can be used to check the status of any signal within your hardware code, being input, output, or intermediate signal, and being the code a core description, a module for your library or your custom RFNoC block.&lt;br /&gt;
&lt;br /&gt;
''' Note: ''' Keep in mind that this procedure intends to probe the signals in a fully designed block, which has been also built into a FPGA .bit file and is running in a supported device. This is *not* intended to be a way to test directly your designed code, as building an FPGA image may take several minutes (even hours). For small functionality checks, we strongly recommend you to write a testbench for your code, which will allow you to have more iterations without the need of building and synthesizing your hardware description. You can follow the [https://files.ettus.com/manual/md_usrp3_sim_writing_testbenches.html - Writing Testbenches] section of our reference manual to have insights on how to write your own testbench. In addition, there is plenty of online resources (such as [8]) that provide enough information to get you started with your simulation.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites = &lt;br /&gt;
&lt;br /&gt;
* '''Vivado (version 2015.4): ''' As stated in the overview, you'll be working directly with HDL code that you need to build and synthesize. Depending on your target device, you may even need a non-free license (which is the case for the X3XX devices). In the case of Ettus' embedded devices, you can proceed with your design using the Vivado Webpack.&lt;br /&gt;
&lt;br /&gt;
= Choosing your signals =&lt;br /&gt;
At this point we assume that you have a verilog code that has been properly tested by the means of simulation/testbench, but that you want to inspect into its functionality deeper by probing its signals while it is running on a device. This could be helpful for many reasons, such as getting a deeper understanding on the state of your signal during a given transaction, which could give you an insight on how it is working (or even, can give you a lead on why it isn't!)&lt;br /&gt;
&lt;br /&gt;
For this AN, we will use out block '''RFNoC: Signal Generator''' as our Unit Under Test (UUT). However, all procedures to be done can be easily transfered to your own design. In addition, as most of our block and FPGA code is written in Verilog, we will use it also in this document. So let's get started.&lt;br /&gt;
&lt;br /&gt;
The Signal generator's code can be found under &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}/usrp3/lib/rfnoc/&amp;lt;/syntaxhighlight&amp;gt;. In some of our latest code releases (such as 3.10.0.0), this code is found under &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}/usrp3_rfnoc/lib/rfnoc/&amp;lt;/syntaxhighlight&amp;gt;. In this directory you can find the RFNoC related code that is used in the RFNoC framework. Consequently, all the HDL for the NoC blocks the we provide is located here. Now, open the file &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;noc_block_siggen.v&amp;lt;/syntaxhighlight&amp;gt; in your IDE or text editor of preference and give it a quick look. &lt;br /&gt;
&lt;br /&gt;
As you can see, the code is not too extensive and is the comments divide it properly based on functionality. If your design is RFNoCModtool-generated, you'll get a similar preliminary structure in the verilog files for your block. For information on how to use RFNoCModtool please refer to [https://kb.ettus.com/index.php?title=Getting_Started_with_RFNoC_Development RFNoC Development - Getting Started Guide]. Normally for rather simple designs you won't have to deal with the RFNoC Shell or the AXI Wrapper configuration. However, for illustration purposes, we are going to take some of the signals from this part of the code and probe them in our debugging process. A total of 11 signals will be selected, each from a different internal stage. &lt;br /&gt;
&lt;br /&gt;
Lets take a look at how this boundaries look like in the FPGA Internals. Each full RFNoC design can include several different blocks, which are also called &amp;quot;computation engines&amp;quot;. The picture on the right [3] portraits the computation engine internals in a quite self explanatory fashion, although a slightly more detailed explanation about each of the internals from a Computation Engine can be found at the  [https://kb.ettus.com/RFNoC_Getting_Started_Guides RFNoC Software Page]:&lt;br /&gt;
&lt;br /&gt;
[[File:CE_internals.png|Anatomy of a computation engine.|600px|right|Anatomy of a computation engine|link=https://kb.ettus.com/images/8/83/CE_internals.png]]&lt;br /&gt;
&lt;br /&gt;
'''From NoC Shell: '''At the top of the figure you can see the AXI Crossbar, were all the computation engines are wired up together. This is not part of our UUT in particular. However, the connection between the crossbar and our UUT - NoC Shell can be tested within our code. From here we are taking the set_data/addr/stb, which are readback registers and provide information from this interface.&lt;br /&gt;
* set_data&lt;br /&gt;
* set_addr&lt;br /&gt;
* set_stb&lt;br /&gt;
&lt;br /&gt;
'''From the AXI Wrapper: '''our next stage from where we are taking signals is the AXI Wrapper. This can be understood as a translating stage in which the data that goes from and to the user's design is correctly encapsulated into a CHDR packet [5]. By probing this signals we expect to find out that the data that is being transported is correct, and that the transaction also takes places at the right moment.&lt;br /&gt;
* s_axis_data_tdata&lt;br /&gt;
* s_axis_data_tuser&lt;br /&gt;
* s_axis_data_tlast&lt;br /&gt;
* s_axis_data_tvalid&lt;br /&gt;
* s_axis_data_tready&lt;br /&gt;
&lt;br /&gt;
'''From the signal generator design: ''' Last but not least, we are probing signals from the UUT IP, which means that we are checking directly the value that certain lines inside the FPGA have the correct value at a certain time. In this case, we'll be checking if the wave type is according with the one selected from the host, that the gain value is propagated correctly and, clearly, if the block is generating signals when it is enable and when it isn't.&lt;br /&gt;
* gain&lt;br /&gt;
* wave_type&lt;br /&gt;
* enable&lt;br /&gt;
&lt;br /&gt;
= Setting up the code for ChipScoping =&lt;br /&gt;
&lt;br /&gt;
To let know Vivado that we want to probe signals, we have to go directly into the code and mark this signals for debugging. This can be done by using reserved words that describe the synthesizing attributes for a given signal. There is a variety of different attributes that you can give to any signal of your design [2], but here we are going to discuss the ones that serve most of the debugging needs:&lt;br /&gt;
&lt;br /&gt;
* '''KEEP: ''' This attribute prevents the signal to be optimized or absorbed into logic blocks, which would mean that the signal, even though it would be operational after synthesis, may not be accessible for probing. An example of the syntax for this attribute is as follows:&lt;br /&gt;
  VERILOG:&lt;br /&gt;
    (* keep = &amp;quot;true&amp;quot; *) wire signal_name;&lt;br /&gt;
    assign signal_name = in1 &amp;amp; in2;&lt;br /&gt;
&lt;br /&gt;
  VHDL:&lt;br /&gt;
    signal signal_name : std_logic;&lt;br /&gt;
    attribute keep : string;&lt;br /&gt;
    attribute keep of signal_name : signal is &amp;quot;true&amp;quot;;&lt;br /&gt;
    signal_name &amp;lt;= in1 and in2;&lt;br /&gt;
&lt;br /&gt;
* '''KEEP_HIERARCHY: ''' As well as KEEP, this attribute prevents the optimization. However, this attribute can be applied to a module or instance. By using this attribute, the synthesis tools keep the boundary on this signal static. Example:&lt;br /&gt;
  VERILOG&lt;br /&gt;
    On Module:&lt;br /&gt;
    (* keep_hierarchy = &amp;quot;yes&amp;quot; *) module example (in1, in2, out1, out2);&lt;br /&gt;
    On Instance:&lt;br /&gt;
    (* keep_hierarchy = &amp;quot;yes&amp;quot; *) example e0 (.in1(in1), .in2(in2), .out1(out1));&lt;br /&gt;
&lt;br /&gt;
  VHDL&lt;br /&gt;
    On Module:&lt;br /&gt;
    attribute keep_hierarchy : string;&lt;br /&gt;
    attribute keep_hierarchy of example : architecture is &amp;quot;yes&amp;quot;;&lt;br /&gt;
    On Instance:&lt;br /&gt;
    attribute keep_hierarchy : string;&lt;br /&gt;
    attribute keep_hierarchy of e0 : label is &amp;quot;yes&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
* '''DONT_TOUCH: ''' this attribute works just as KEEP and KEEP_HIERARCHY, with the difference that this one is forward-annotated to place and route to prevent logic optimization. In case where other attributes get into conflict with DONT_TOUCH, DONT_TOUCH takes precedence and will be applied. It also can take values yes/no and true/false. Example:&lt;br /&gt;
&lt;br /&gt;
  VERILOG WIRE&lt;br /&gt;
    (* dont_touch = &amp;quot;yes&amp;quot; *) wire signal1;&lt;br /&gt;
    assign signal1 = in1 &amp;amp; in2;&lt;br /&gt;
&lt;br /&gt;
  VERILOG MODULE&lt;br /&gt;
    (* DONT_TOUCH = &amp;quot;yes&amp;quot; *)&lt;br /&gt;
    module example (clk, in1, in2, out1);&lt;br /&gt;
&lt;br /&gt;
  VHDL EXAMPLE&lt;br /&gt;
    signal sig1 : std_logic;&lt;br /&gt;
    attribute dont_touch : string;&lt;br /&gt;
    attribute dont_touch of sig1 : signal is &amp;quot;true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* '''MARK_DEBUG: ''' This is arguably the most important attribute for our current use case, because it is the one that tells Vivado which nets are going to be debugged. This also prevents optimization over the signal, and in addition prepares it to be probed during operation. Virtually this attribute could be applied to any net within the design, but there are some nets with specific properties could have protection against visibility, and can not be probed. The values for MARK_DEBUG are TRUE/FALSE. Example:&lt;br /&gt;
  VERILOG&lt;br /&gt;
    (* MARK_DEBUG = &amp;quot;TRUE&amp;quot; *) wire debug_wire;&lt;br /&gt;
  VHDL&lt;br /&gt;
    attribute MARK_DEBUG : string;&lt;br /&gt;
    attribute MARK_DEBUG of signal_name : signal is &amp;quot;TRUE&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For other attributes and options, please refer to Xilinx's documentation [1][2]. We are going to use the given almost in every case, if not always. Now, the syntax is rather simple and so is the applications to the attributes to the code. The resulting file should look as the picture on the right. When you have modified the code, you are ready to build your debug bitstream.&lt;br /&gt;
&lt;br /&gt;
[[File:chipscope_diff_siggen.png|thumb|Adding attributes to signals to probe.|900px|center|Adding attributes to signals to probe.|link=https://kb.ettus.com/images/a/a7/chipscope_diff_siggen.png]]&lt;br /&gt;
&lt;br /&gt;
= Building the debug bitstream =&lt;br /&gt;
== Save the project and finish Synthesis ==&lt;br /&gt;
For this test in particular you are going to need to have a DDC (Digital down converter) in addition to the UUT for visualization purposes on a host. To add this blocks into the bitstream, go to  &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}/[usrp3|usrp3_rfnoc/tools/scripts/&amp;lt;/syntaxhighlight&amp;gt; and inside that directory run the following command:&lt;br /&gt;
&lt;br /&gt;
    $ ./make.py siggen ddc -g&lt;br /&gt;
&lt;br /&gt;
This will set up your Vivado environment and start the build of an FPGA image with the signal generator and the DDC blocks. The option '-g' is telling the script that at some point during the build process the Vivado User Interface should be opened, as it is where we are going to set up our debug image. For  &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;make.py&amp;lt;/syntaxhighlight&amp;gt; usage and options please refer to  the [[Getting_Started_with_RFNoC_Development#Wiring_up_computation_engines_and_building_the_FPGA image|Wiring up computation engines and building the FPGA image]] section of our getting started guide, or simply run  &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;make.py --help in your terminal&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note: ''' ''The FPGA image building process may take over an hour.''&lt;br /&gt;
&lt;br /&gt;
The Vivado GUI is going to come up at some point of the synthesis. Right after the Vivado GUI has opened, you can go ahead and cancel the process that is running, which is usually the last part of the synthesis  (when it shows 90% done is a safe moment to cancel. See &amp;quot;Saving the project&amp;quot; figure). This is because we first have to set up the parameters for debugging and the synthesis has to be re-run. After canceling, save the project and give it a name of your choice; we are giving here the name ''AN_chipscope'', but you can name the project whatever you like. Right after saving the project, click on 'Run Synthesis', which can be found on the left panel under '''Project Manager-&amp;gt;Synthesis-&amp;gt;Run Synthesis'''.&lt;br /&gt;
&lt;br /&gt;
[[File:cs1.png|thumb|200px|left|Saving the Vivado Project|link=https://kb.ettus.com/images/7/74/cs1.png]]&lt;br /&gt;
&lt;br /&gt;
'''Note: ''' Most of the time Vivado will auto-detect your highest hierarchy module, but it may happen that it just slips to it and then it will ask you which it. If this happens, you can select the verilog file according to the target device that you are chipscoping as the top module (e.g. x300.v or e300.v)&lt;br /&gt;
&lt;br /&gt;
Now wait until the synthesis is finished. This won't take long, and after it finishes a window will prompted saying that the synthesis is done, and asking if you want to run the implementation. Click on cancel, as we need to setup the debugging parameters first. &lt;br /&gt;
&lt;br /&gt;
== Setup debug ==&lt;br /&gt;
&lt;br /&gt;
Go to '''Project Manager -&amp;gt; Synthesis -&amp;gt; Open Synthesized Design -&amp;gt; Set Up debug''', and the wizard will start. Click on next until you see a window listing the nets to debug. Here, two scenarios are expected. See the figure below:&lt;br /&gt;
&lt;br /&gt;
[[File:cs_2.png|center|1200px|Clock Domain|link=https://kb.ettus.com/images/5/52/cs_2.png]]&lt;br /&gt;
&lt;br /&gt;
Sometimes Vivado will pick up the clock domain automatically (which is the case depicted on the right side), but there are occasions where the nets to debug aren't clearly defined under a clock domain and this cases require a little bit more of work, depending on your knowledge of your design. In this case, we know that the nets are under the same clock domain as the other signals, but in case of doubt, you'll have to go and find it out through the code. The case on the left can be solved easily by clicking on 'more info', which is just at the end of the red warning. Right after clickling, further, clearly, information will appear. In the prompted dialog, let us click on 'Assign All Clock Domains'&lt;br /&gt;
&lt;br /&gt;
[[File:cs_3.png|center|Assigning all clock domains|link=https://kb.ettus.com/images/e/e4/cs_3.png]]&lt;br /&gt;
&lt;br /&gt;
A window will appear where you can choose the common clock domain on which you want to have the signals. Here, in our case, we select &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;radio_clk_gen/inst/CLK_OUT1&amp;lt;/syntaxhighlight&amp;gt;, and that would be sufficient to continue. Accept and click next.&lt;br /&gt;
&lt;br /&gt;
Right after, we have to choose the ''Integrated Logic Analizer - ILA'' Core Options [6][7]. Here we will only focus on &amp;quot;Sample of data depth&amp;quot; and &amp;quot;Input pipe stages&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:cs_4.png|550px|center|ILA core options|link=https://kb.ettus.com/images/2/29/cs_4.png]]&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Sample of data depth&amp;quot; is the maximum number of data sample words that the ILA core can store at run time for each of the probe lines. The input pipe stages is the number of flops or registers that are added to each probe line. This basically determines how big the debug setup will be, and the amount of data that is going to be analyzed per run. Here we select 4096 for the data depth and 1 input pipe line. For further information about the ILA and its configuration, please refer to the ILA documentation [6][7]. With this, the set up is done, and you can proceed to click &amp;quot;next&amp;quot; and then &amp;quot;finish&amp;quot; to complete the wizard operation.&lt;br /&gt;
&lt;br /&gt;
[[File:cs_5.png|center|ILA core options|link=https://kb.ettus.com/images/a/a3/cs_5.png]]&lt;br /&gt;
&lt;br /&gt;
After the setup is finished, go to the left panel and click '''Project Manager-&amp;gt;Program and Debug-&amp;gt;Generate Bitstream'''. This will ask you if you want to run the implementation first, to what we answer 'Yes'. This will prepare the bitstream with which we are going to program our device and debug our design.&lt;br /&gt;
&lt;br /&gt;
= Running the debug bitstream in the target device =&lt;br /&gt;
&lt;br /&gt;
  #TODO&lt;br /&gt;
&lt;br /&gt;
= External references =&lt;br /&gt;
[1] [https://www.xilinx.com/support/documentation/sw_manuals/xilinx2015_4/ug936-vivado-tutorial-programming-debugging.pdf Vivado Tutorial: Programming and debugging]&lt;br /&gt;
&lt;br /&gt;
[2] [https://www.xilinx.com/support/documentation/sw_manuals/xilinx2015_4/ug901-vivado-synthesis.pdf Vivado Synthesis]&lt;br /&gt;
&lt;br /&gt;
[3] [https://www.ettus.com/content/files/RFNoC_Wireless_at_VT_FPGA.pdf RFNoC Deep Dive: FPGA]&lt;br /&gt;
&lt;br /&gt;
[4] [https://www.xilinx.com/support/documentation/ip_documentation/ug761_axi_reference_guide.pdf Xilinx - AXI reference guide]&lt;br /&gt;
&lt;br /&gt;
[5] [https://files.ettus.com/manual/page_rtp.html Radio Transport Protocols]&lt;br /&gt;
&lt;br /&gt;
[6] [https://www.xilinx.com/support/documentation/ip_documentation/chipscope_ila/v1_04_a/chipscope_ila.pdf LogiCORE IP ChipScope Pro Integrated Logic Analyzer]&lt;br /&gt;
&lt;br /&gt;
[7] [https://www.xilinx.com/support/documentation/ip_documentation/ila/v3_0/pg172-ila.pdf LogiCORE IP Integrated Logic Analyzer v3.0]&lt;br /&gt;
&lt;br /&gt;
[8] [https://www.xilinx.com/support/documentation/application_notes/xapp199.pdf Xilinx AN - Writing efficient Testbenches]&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Debugging_FPGA_images&amp;diff=3128</id>
		<title>Debugging FPGA images</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Debugging_FPGA_images&amp;diff=3128"/>
				<updated>2016-12-02T09:27:27Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Application Note Number =&lt;br /&gt;
'''AN-XXX'''&lt;br /&gt;
&lt;br /&gt;
= Revision History =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Author&lt;br /&gt;
!Details&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2016-11-28&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Nicolas Cuervo&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Initial creation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UNDER CONSTRUCTION: THE CONTENTS OF THIS PAGE HAVE TO GO THROUGH REVIEW AND EDITION. AT THIS MOMENT, PLEASE DO NOT USE THIS PAGE AS A REFERENCE! =&lt;br /&gt;
&lt;br /&gt;
= Abstract =&lt;br /&gt;
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. The contents of this AN could suit most of your needs while setting your debug bitstream for a RFNoC design. However, keep in mind that the topics described here are strictly related to Xilinx framework. For further information please refer to Xilinx documentation [1][2]. &lt;br /&gt;
&lt;br /&gt;
= Overview = &lt;br /&gt;
When you are developing your own application, you might come to the point on which you would like to build an FPGA image for your USRP. You might want to modify part of the cores, add some custom functionality, or even add your custom RFNoC block! For that you might follow tutorials such as the [[Getting_Started_with_RFNoC_Development#Building the FPGA image|Building the FPGA image]] section of one our &amp;quot;getting started&amp;quot; guides. &lt;br /&gt;
&lt;br /&gt;
But how about debugging your HDL code? This comes really handy when you want to follow closely the behavior of your signals within your hardware design. This Application Note will follow the basic steps needed to create a &amp;quot;chipscope image&amp;quot;, which allow you to use the Vivado GUI visual tools to debug your design. &lt;br /&gt;
&lt;br /&gt;
Before we start, this App note assumes that you have been working already with some fpga code and you want to debug it. Being this the case, we assume that you have UHD installed, the FPGA repository cloned, the right version of Xilinx Vivado installed (by the moment this is being written we use Vivado 2015.4) and its environment initialized. If not, we assume you are familiar on how to do the previously noted procedures. &lt;br /&gt;
&lt;br /&gt;
For illustration purposes, here we are going to check the status of some of the output signals of one of the RFNoC blocks we currently provide. However, the same procedure can be used to check the status of any signal within your hardware code, being input, output, or intermediate signal, and being the code a core description, a module for your library or your custom RFNoC block.&lt;br /&gt;
&lt;br /&gt;
''' Note: ''' Keep in mind that this procedure intends to probe the signals in a fully designed block, which has been also built into a FPGA .bit file and is running in a supported device. This is *not* intended to be a way to test directly your designed code, as building an FPGA image may take several minutes (even hours). For small functionality checks, we strongly recommend you to write a testbench for your code, which will allow you to have more iterations without the need of building and synthesizing your hardware description. You can follow the [https://files.ettus.com/manual/md_usrp3_sim_writing_testbenches.html - Writing Testbenches] section of our reference manual to have insights on how to write your own testbench. In addition, there is plenty of online resources (such as [8]) that provide enough information to get you started with your simulation.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites = &lt;br /&gt;
&lt;br /&gt;
* '''Vivado (version 2015.4): ''' As stated in the overview, you'll be working directly with HDL code that you need to build and synthesize. Depending on your target device, you may even need a non-free license (which is the case for the X3XX devices). In the case of Ettus' embedded devices, you can proceed with your design using the Vivado Webpack.&lt;br /&gt;
&lt;br /&gt;
= Choosing your signals =&lt;br /&gt;
At this point we assume that you have a verilog code that has been properly tested by the means of simulation/testbench, but that you want to inspect into its functionality deeper by probing its signals while it is running on a device. This could be helpful for many reasons, such as getting a deeper understanding on the state of your signal during a given transaction, which could give you an insight on how it is working (or even, can give you a lead on why it isn't!)&lt;br /&gt;
&lt;br /&gt;
For this AN, we will use out block '''RFNoC: Signal Generator''' as our Unit Under Test (UUT). However, all procedures to be done can be easily transfered to your own design. In addition, as most of our block and FPGA code is written in Verilog, we will use it also in this document. So let's get started.&lt;br /&gt;
&lt;br /&gt;
The Signal generator's code can be found under &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}/usrp3/lib/rfnoc/&amp;lt;/syntaxhighlight&amp;gt;. In some of our latest code releases (such as 3.10.0.0), this code is found under &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}/usrp3_rfnoc/lib/rfnoc/&amp;lt;/syntaxhighlight&amp;gt;. In this directory you can find the RFNoC related code that is used in the RFNoC framework. Consequently, all the HDL for the NoC blocks the we provide is located here. Now, open the file &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;noc_block_siggen.v&amp;lt;/syntaxhighlight&amp;gt; in your IDE or text editor of preference and give it a quick look. &lt;br /&gt;
&lt;br /&gt;
As you can see, the code is not too extensive and is the comments divide it properly based on functionality. If your design is RFNoCModtool-generated, you'll get a similar preliminary structure in the verilog files for your block. For information on how to use RFNoCModtool please refer to [https://kb.ettus.com/index.php?title=Getting_Started_with_RFNoC_Development RFNoC Development - Getting Started Guide]. Normally for rather simple designs you won't have to deal with the RFNoC Shell or the AXI Wrapper configuration. However, for illustration purposes, we are going to take some of the signals from this part of the code and probe them in our debugging process. A total of 11 signals will be selected, each from a different internal stage. &lt;br /&gt;
&lt;br /&gt;
Lets take a look at how this boundaries look like in the FPGA Internals. Each full RFNoC design can include several different blocks, which are also called &amp;quot;computation engines&amp;quot;. The picture on the right [3] portraits the computation engine internals in a quite self explanatory fashion, although a slightly more detailed explanation about each of the internals from a Computation Engine can be found at the  [https://kb.ettus.com/RFNoC_Getting_Started_Guides RFNoC Software Page]:&lt;br /&gt;
&lt;br /&gt;
[[File:CE_internals.png|Anatomy of a computation engine.|600px|right|Anatomy of a computation engine|link=https://kb.ettus.com/images/8/83/CE_internals.png]]&lt;br /&gt;
&lt;br /&gt;
'''From NoC Shell: '''At the top of the figure you can see the AXI Crossbar, were all the computation engines are wired up together. This is not part of our UUT in particular. However, the connection between the crossbar and our UUT - NoC Shell can be tested within our code. From here we are taking the set_data/addr/stb, which are readback registers and provide information from this interface.&lt;br /&gt;
* set_data&lt;br /&gt;
* set_addr&lt;br /&gt;
* set_stb&lt;br /&gt;
&lt;br /&gt;
'''From the AXI Wrapper: '''our next stage from where we are taking signals is the AXI Wrapper. This can be understood as a translating stage in which the data that goes from and to the user's design is correctly encapsulated into a CHDR packet [5]. By probing this signals we expect to find out that the data that is being transported is correct, and that the transaction also takes places at the right moment.&lt;br /&gt;
* s_axis_data_tdata&lt;br /&gt;
* s_axis_data_tuser&lt;br /&gt;
* s_axis_data_tlast&lt;br /&gt;
* s_axis_data_tvalid&lt;br /&gt;
* s_axis_data_tready&lt;br /&gt;
&lt;br /&gt;
'''From the signal generator design: ''' Last but not least, we are probing signals from the UUT IP, which means that we are checking directly the value that certain lines inside the FPGA have the correct value at a certain time. In this case, we'll be checking if the wave type is according with the one selected from the host, that the gain value is propagated correctly and, clearly, if the block is generating signals when it is enable and when it isn't.&lt;br /&gt;
* gain&lt;br /&gt;
* wave_type&lt;br /&gt;
* enable&lt;br /&gt;
&lt;br /&gt;
= Setting up the code for ChipScoping =&lt;br /&gt;
&lt;br /&gt;
To let know Vivado that we want to probe signals, we have to go directly into the code and mark this signals for debugging. This can be done by using reserved words that describe the synthesizing attributes for a given signal. There is a variety of different attributes that you can give to any signal of your design [2], but here we are going to discuss the ones that serve most of the debugging needs:&lt;br /&gt;
&lt;br /&gt;
* '''KEEP: ''' This attribute prevents the signal to be optimized or absorbed into logic blocks, which would mean that the signal, even though it would be operational after synthesis, may not be accessible for probing. An example of the syntax for this attribute is as follows:&lt;br /&gt;
  VERILOG:&lt;br /&gt;
    (* keep = &amp;quot;true&amp;quot; *) wire signal_name;&lt;br /&gt;
    assign signal_name = in1 &amp;amp; in2;&lt;br /&gt;
&lt;br /&gt;
  VHDL:&lt;br /&gt;
    signal signal_name : std_logic;&lt;br /&gt;
    attribute keep : string;&lt;br /&gt;
    attribute keep of signal_name : signal is &amp;quot;true&amp;quot;;&lt;br /&gt;
    signal_name &amp;lt;= in1 and in2;&lt;br /&gt;
&lt;br /&gt;
* '''KEEP_HIERARCHY: ''' As well as KEEP, this attribute prevents the optimization. However, this attribute can be applied to a module or instance. By using this attribute, the synthesis tools keep the boundary on this signal static. Example:&lt;br /&gt;
  VERILOG&lt;br /&gt;
    On Module:&lt;br /&gt;
    (* keep_hierarchy = &amp;quot;yes&amp;quot; *) module example (in1, in2, out1, out2);&lt;br /&gt;
    On Instance:&lt;br /&gt;
    (* keep_hierarchy = &amp;quot;yes&amp;quot; *) example e0 (.in1(in1), .in2(in2), .out1(out1));&lt;br /&gt;
&lt;br /&gt;
  VHDL&lt;br /&gt;
    On Module:&lt;br /&gt;
    attribute keep_hierarchy : string;&lt;br /&gt;
    attribute keep_hierarchy of example : architecture is &amp;quot;yes&amp;quot;;&lt;br /&gt;
    On Instance:&lt;br /&gt;
    attribute keep_hierarchy : string;&lt;br /&gt;
    attribute keep_hierarchy of e0 : label is &amp;quot;yes&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
* '''DONT_TOUCH: ''' this attribute works just as KEEP and KEEP_HIERARCHY, with the difference that this one is forward-annotated to place and route to prevent logic optimization. In case where other attributes get into conflict with DONT_TOUCH, DONT_TOUCH takes precedence and will be applied. It also can take values yes/no and true/false. Example:&lt;br /&gt;
&lt;br /&gt;
  VERILOG WIRE&lt;br /&gt;
    (* dont_touch = &amp;quot;yes&amp;quot; *) wire signal1;&lt;br /&gt;
    assign signal1 = in1 &amp;amp; in2;&lt;br /&gt;
&lt;br /&gt;
  VERILOG MODULE&lt;br /&gt;
    (* DONT_TOUCH = &amp;quot;yes&amp;quot; *)&lt;br /&gt;
    module example (clk, in1, in2, out1);&lt;br /&gt;
&lt;br /&gt;
  VHDL EXAMPLE&lt;br /&gt;
    signal sig1 : std_logic;&lt;br /&gt;
    attribute dont_touch : string;&lt;br /&gt;
    attribute dont_touch of sig1 : signal is &amp;quot;true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* '''MARK_DEBUG: ''' This is arguably the most important attribute for our current use case, because it is the one that tells Vivado which nets are going to be debugged. This also prevents optimization over the signal, and in addition prepares it to be probed during operation. Virtually this attribute could be applied to any net within the design, but there are some nets with specific properties could have protection against visibility, and can not be probed. The values for MARK_DEBUG are TRUE/FALSE. Example:&lt;br /&gt;
  VERILOG&lt;br /&gt;
    (* MARK_DEBUG = &amp;quot;TRUE&amp;quot; *) wire debug_wire;&lt;br /&gt;
  VHDL&lt;br /&gt;
    attribute MARK_DEBUG : string;&lt;br /&gt;
    attribute MARK_DEBUG of signal_name : signal is &amp;quot;TRUE&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For other attributes and options, please refer to Xilinx's documentation [1][2]. We are going to use the given almost in every case, if not always. Now, the syntax is rather simple and so is the applications to the attributes to the code. The resulting file should look as the picture on the right. When you have modified the code, you are ready to build your debug bitstream.&lt;br /&gt;
&lt;br /&gt;
[[File:chipscope_diff_siggen.png|thumb|Adding attributes to signals to probe.|900px|center|Adding attributes to signals to probe.|link=https://kb.ettus.com/images/a/a7/chipscope_diff_siggen.png]]&lt;br /&gt;
&lt;br /&gt;
= Building the debug bitstream =&lt;br /&gt;
== Save the project and finish Synthesis ==&lt;br /&gt;
For this test in particular you are going to need to have a DDC (Digital down converter) in addition to the UUT for visualization purposes on a host. To add this blocks into the bitstream, go to  &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}/[usrp3|usrp3_rfnoc/tools/scripts/&amp;lt;/syntaxhighlight&amp;gt; and inside that directory run the following command:&lt;br /&gt;
&lt;br /&gt;
    $ ./make.py siggen ddc -g&lt;br /&gt;
&lt;br /&gt;
This will set up your Vivado environment and start the build of an FPGA image with the signal generator and the DDC blocks. The option '-g' is telling the script that at some point during the build process the Vivado User Interface should be opened, as it is where we are going to set up our debug image. For  &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;make.py&amp;lt;/syntaxhighlight&amp;gt; usage and options please refer to  the [[Getting_Started_with_RFNoC_Development#Wiring_up_computation_engines_and_building_the_FPGA image|Wiring up computation engines and building the FPGA image]] section of our getting started guide, or simply run  &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;make.py --help in your terminal&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note: ''' ''The FPGA image building process may take over an hour.''&lt;br /&gt;
&lt;br /&gt;
The Vivado GUI is going to come up at some point of the synthesis. Right after the Vivado GUI has opened, you can go ahead and cancel the process that is running, which is usually the last part of the synthesis  (when it shows 90% done is a safe moment to cancel. See &amp;quot;Saving the project&amp;quot; figure). This is because we first have to set up the parameters for debugging and the synthesis has to be re-run. After canceling, save the project and give it a name of your choice; we are giving here the name ''AN_chipscope'', but you can name the project whatever you like. Right after saving the project, click on 'Run Synthesis', which can be found on the left panel under '''Project Manager-&amp;gt;Synthesis-&amp;gt;Run Synthesis'''.&lt;br /&gt;
&lt;br /&gt;
[[File:cs1.png|thumb|200px|left|Saving the Vivado Project|link=https://kb.ettus.com/images/7/74/cs1.png]]&lt;br /&gt;
&lt;br /&gt;
'''Note: ''' Most of the time Vivado will auto-detect your highest hierarchy module, but it may happen that it just slips to it and then it will ask you which it. If this happens, you can select the verilog file according to the target device that you are chipscoping as the top module (e.g. x300.v or e300.v)&lt;br /&gt;
&lt;br /&gt;
Now wait until the synthesis is finished. This won't take long, and after it finishes a window will prompted saying that the synthesis is done, and asking if you want to run the implementation. Click on cancel, as we need to setup the debugging parameters first. &lt;br /&gt;
&lt;br /&gt;
== Setup debug ==&lt;br /&gt;
&lt;br /&gt;
Go to '''Project Manager -&amp;gt; Synthesis -&amp;gt; Open Synthesized Design -&amp;gt; Set Up debug''', and the wizard will start. Click on next until you see a window listing the nets to debug. Here, two scenarios are expected. See the figure below:&lt;br /&gt;
&lt;br /&gt;
[[File:cs_2.png|center|1200px|Clock Domain|link=https://kb.ettus.com/images/5/52/cs_2.png]]&lt;br /&gt;
&lt;br /&gt;
Sometimes Vivado will pick up the clock domain automatically (which is the case depicted on the right side), but there are occasions where the nets to debug aren't clearly defined under a clock domain and this cases require a little bit more of work, depending on your knowledge of your design. In this case, we know that the nets are under the same clock domain as the other signals, but in case of doubt, you'll have to go and find it out through the code. The case on the left can be solved easily by clicking on 'more info', which is just at the end of the red warning. Right after clickling, further, clearly, information will appear. In the prompted dialog, let us click on 'Assign All Clock Domains'&lt;br /&gt;
&lt;br /&gt;
[[File:cs_3.png|center|Assigning all clock domains|link=https://kb.ettus.com/images/e/e4/cs_3.png]]&lt;br /&gt;
&lt;br /&gt;
A window will appear where you can choose the common clock domain on which you want to have the signals. Here, in our case, we select &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;radio_clk_gen/inst/CLK_OUT1&amp;lt;/syntaxhighlight&amp;gt;, and that would be sufficient to continue. Accept and click next.&lt;br /&gt;
&lt;br /&gt;
Right after, we have to choose the ''Integrated Logic Analizer - ILA'' Core Options [6][7]. Here we will only focus on &amp;quot;Sample of data depth&amp;quot; and &amp;quot;Input pipe stages&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:cs_4.png|550px|center|ILA core options|link=https://kb.ettus.com/images/2/29/cs_4.png]]&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Sample of data depth&amp;quot; is the maximum number of data sample words that the ILA core can store at run time for each of the probe lines. The input pipe stages is the number of flops or registers that are added to each probe line. This basically determines how big the debug setup will be, and the amount of data that is going to be analyzed per run. Here we select 4096 for the data depth and 1 input pipe line. For further information about the ILA and its configuration, please refer to the ILA documentation [6][7]. With this, the set up is done, and you can proceed to click &amp;quot;next&amp;quot; and then &amp;quot;finish&amp;quot; to complete the wizard operation.&lt;br /&gt;
&lt;br /&gt;
[[File:cs_5.png|center|ILA core options|link=https://kb.ettus.com/images/a/a3/cs_5.png]]&lt;br /&gt;
&lt;br /&gt;
After the setup is finished, go to the left panel and click '''Project Manager-&amp;gt;Program and Debug-&amp;gt;Generate Bitstream'''. This will ask you if you want to run the implementation first, to what we answer 'Yes'. This will prepare the bitstream with which we are going to program our device and debug our design.&lt;br /&gt;
&lt;br /&gt;
= Running the debug bitstream in the target device =&lt;br /&gt;
&lt;br /&gt;
  #TODO&lt;br /&gt;
&lt;br /&gt;
= External references =&lt;br /&gt;
[1] [https://www.xilinx.com/support/documentation/sw_manuals/xilinx2015_4/ug936-vivado-tutorial-programming-debugging.pdf Vivado Tutorial: Programming and debugging]&lt;br /&gt;
&lt;br /&gt;
[2] [https://www.xilinx.com/support/documentation/sw_manuals/xilinx2015_4/ug901-vivado-synthesis.pdf Vivado Synthesis]&lt;br /&gt;
&lt;br /&gt;
[3] [https://www.ettus.com/content/files/RFNoC_Wireless_at_VT_FPGA.pdf RFNoC Deep Dive: FPGA]&lt;br /&gt;
&lt;br /&gt;
[4] [https://www.xilinx.com/support/documentation/ip_documentation/ug761_axi_reference_guide.pdf Xilinx - AXI reference guide]&lt;br /&gt;
&lt;br /&gt;
[5] [https://files.ettus.com/manual/page_rtp.html Radio Transport Protocols]&lt;br /&gt;
&lt;br /&gt;
[6] [https://www.xilinx.com/support/documentation/ip_documentation/chipscope_ila/v1_04_a/chipscope_ila.pdf LogiCORE IP ChipScope Pro Integrated Logic Analyzer]&lt;br /&gt;
&lt;br /&gt;
[7] [https://www.xilinx.com/support/documentation/ip_documentation/ila/v3_0/pg172-ila.pdf LogiCORE IP Integrated Logic Analyzer v3.0]&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Debugging_FPGA_images&amp;diff=3127</id>
		<title>Debugging FPGA images</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Debugging_FPGA_images&amp;diff=3127"/>
				<updated>2016-12-02T09:23:47Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Application Note Number =&lt;br /&gt;
'''AN-XXX'''&lt;br /&gt;
&lt;br /&gt;
= Revision History =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Author&lt;br /&gt;
!Details&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2016-11-28&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Nicolas Cuervo&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Initial creation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UNDER CONSTRUCTION: THE CONTENTS OF THIS PAGE HAVE TO GO THROUGH REVIEW AND EDITION. AT THIS MOMENT, PLEASE DO NOT USE THIS PAGE AS A REFERENCE! =&lt;br /&gt;
&lt;br /&gt;
= Abstract =&lt;br /&gt;
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. The contents of this AN could suit most of your needs while setting your debug bitstream for a RFNoC design. However, keep in mind that the topics described here are strictly related to Xilinx framework. For further information please refer to Xilinx documentation [1][2]. &lt;br /&gt;
&lt;br /&gt;
= Overview = &lt;br /&gt;
When you are developing your own application, you might come to the point on which you would like to build an FPGA image for your USRP. You might want to modify part of the cores, add some custom functionality, or even add your custom RFNoC block! For that you might follow tutorials such as the [[Getting_Started_with_RFNoC_Development#Building the FPGA image|Building the FPGA image]] section of one our &amp;quot;getting started&amp;quot; guides. &lt;br /&gt;
&lt;br /&gt;
But how about debugging your HDL code? This comes really handy when you want to follow closely the behavior of your signals within your hardware design. This Application Note will follow the basic steps needed to create a &amp;quot;chipscope image&amp;quot;, which allow you to use the Vivado GUI visual tools to debug your design. &lt;br /&gt;
&lt;br /&gt;
Before we start, this App note assumes that you have been working already with some fpga code and you want to debug it. Being this the case, we assume that you have UHD installed, the FPGA repository cloned, the right version of Xilinx Vivado installed (by the moment this is being written we use Vivado 2015.4) and its environment initialized. If not, we assume you are familiar on how to do the previously noted procedures. &lt;br /&gt;
&lt;br /&gt;
For illustration purposes, here we are going to check the status of some of the output signals of one of the RFNoC blocks we currently provide. However, the same procedure can be used to check the status of any signal within your hardware code, being input, output, or intermediate signal, and being the code a core description, a module for your library or your custom RFNoC block.&lt;br /&gt;
&lt;br /&gt;
''' Note: ''' Keep in mind that this procedure intends to probe the signals in a fully designed block, which has been also built into a FPGA .bit file and is running in a supported device. This is *not* intended to be a way to test directly your designed code, as building an FPGA image may take several minutes (even hours). For small functionality checks, we strongly recommend you to write a testbench for your code, which will allow you to have more iterations without the need of building and synthesizing your hardware description. You can follow the [https://files.ettus.com/manual/md_usrp3_sim_writing_testbenches.html - Writing Testbenches] section of our reference manual to have insights on how to write your own testbench.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites = &lt;br /&gt;
&lt;br /&gt;
* '''Vivado (version 2015.4): ''' As stated in the overview, you'll be working directly with HDL code that you need to build and synthesize. Depending on your target device, you may even need a non-free license (which is the case for the X3XX devices). In the case of Ettus' embedded devices, you can proceed with your design using the Vivado Webpack.&lt;br /&gt;
&lt;br /&gt;
= Choosing your signals =&lt;br /&gt;
At this point we assume that you have a verilog code that has been properly tested by the means of simulation/testbench, but that you want to inspect into its functionality deeper by probing its signals while it is running on a device. This could be helpful for many reasons, such as getting a deeper understanding on the state of your signal during a given transaction, which could give you an insight on how it is working (or even, can give you a lead on why it isn't!)&lt;br /&gt;
&lt;br /&gt;
For this AN, we will use out block '''RFNoC: Signal Generator''' as our Unit Under Test (UUT). However, all procedures to be done can be easily transfered to your own design. In addition, as most of our block and FPGA code is written in Verilog, we will use it also in this document. So let's get started.&lt;br /&gt;
&lt;br /&gt;
The Signal generator's code can be found under &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}/usrp3/lib/rfnoc/&amp;lt;/syntaxhighlight&amp;gt;. In some of our latest code releases (such as 3.10.0.0), this code is found under &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}/usrp3_rfnoc/lib/rfnoc/&amp;lt;/syntaxhighlight&amp;gt;. In this directory you can find the RFNoC related code that is used in the RFNoC framework. Consequently, all the HDL for the NoC blocks the we provide is located here. Now, open the file &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;noc_block_siggen.v&amp;lt;/syntaxhighlight&amp;gt; in your IDE or text editor of preference and give it a quick look. &lt;br /&gt;
&lt;br /&gt;
As you can see, the code is not too extensive and is the comments divide it properly based on functionality. If your design is RFNoCModtool-generated, you'll get a similar preliminary structure in the verilog files for your block. For information on how to use RFNoCModtool please refer to [https://kb.ettus.com/index.php?title=Getting_Started_with_RFNoC_Development RFNoC Development - Getting Started Guide]. Normally for rather simple designs you won't have to deal with the RFNoC Shell or the AXI Wrapper configuration. However, for illustration purposes, we are going to take some of the signals from this part of the code and probe them in our debugging process. A total of 11 signals will be selected, each from a different internal stage. &lt;br /&gt;
&lt;br /&gt;
Lets take a look at how this boundaries look like in the FPGA Internals. Each full RFNoC design can include several different blocks, which are also called &amp;quot;computation engines&amp;quot;. The picture on the right [3] portraits the computation engine internals in a quite self explanatory fashion, although a slightly more detailed explanation about each of the internals from a Computation Engine can be found at the  [https://kb.ettus.com/RFNoC_Getting_Started_Guides RFNoC Software Page]:&lt;br /&gt;
&lt;br /&gt;
[[File:CE_internals.png|Anatomy of a computation engine.|600px|right|Anatomy of a computation engine|link=https://kb.ettus.com/images/8/83/CE_internals.png]]&lt;br /&gt;
&lt;br /&gt;
'''From NoC Shell: '''At the top of the figure you can see the AXI Crossbar, were all the computation engines are wired up together. This is not part of our UUT in particular. However, the connection between the crossbar and our UUT - NoC Shell can be tested within our code. From here we are taking the set_data/addr/stb, which are readback registers and provide information from this interface.&lt;br /&gt;
* set_data&lt;br /&gt;
* set_addr&lt;br /&gt;
* set_stb&lt;br /&gt;
&lt;br /&gt;
'''From the AXI Wrapper: '''our next stage from where we are taking signals is the AXI Wrapper. This can be understood as a translating stage in which the data that goes from and to the user's design is correctly encapsulated into a CHDR packet [5]. By probing this signals we expect to find out that the data that is being transported is correct, and that the transaction also takes places at the right moment.&lt;br /&gt;
* s_axis_data_tdata&lt;br /&gt;
* s_axis_data_tuser&lt;br /&gt;
* s_axis_data_tlast&lt;br /&gt;
* s_axis_data_tvalid&lt;br /&gt;
* s_axis_data_tready&lt;br /&gt;
&lt;br /&gt;
'''From the signal generator design: ''' Last but not least, we are probing signals from the UUT IP, which means that we are checking directly the value that certain lines inside the FPGA have the correct value at a certain time. In this case, we'll be checking if the wave type is according with the one selected from the host, that the gain value is propagated correctly and, clearly, if the block is generating signals when it is enable and when it isn't.&lt;br /&gt;
* gain&lt;br /&gt;
* wave_type&lt;br /&gt;
* enable&lt;br /&gt;
&lt;br /&gt;
= Setting up the code for ChipScoping =&lt;br /&gt;
&lt;br /&gt;
To let know Vivado that we want to probe signals, we have to go directly into the code and mark this signals for debugging. This can be done by using reserved words that describe the synthesizing attributes for a given signal. There is a variety of different attributes that you can give to any signal of your design [2], but here we are going to discuss the ones that serve most of the debugging needs:&lt;br /&gt;
&lt;br /&gt;
* '''KEEP: ''' This attribute prevents the signal to be optimized or absorbed into logic blocks, which would mean that the signal, even though it would be operational after synthesis, may not be accessible for probing. An example of the syntax for this attribute is as follows:&lt;br /&gt;
  VERILOG:&lt;br /&gt;
    (* keep = &amp;quot;true&amp;quot; *) wire signal_name;&lt;br /&gt;
    assign signal_name = in1 &amp;amp; in2;&lt;br /&gt;
&lt;br /&gt;
  VHDL:&lt;br /&gt;
    signal signal_name : std_logic;&lt;br /&gt;
    attribute keep : string;&lt;br /&gt;
    attribute keep of signal_name : signal is &amp;quot;true&amp;quot;;&lt;br /&gt;
    signal_name &amp;lt;= in1 and in2;&lt;br /&gt;
&lt;br /&gt;
* '''KEEP_HIERARCHY: ''' As well as KEEP, this attribute prevents the optimization. However, this attribute can be applied to a module or instance. By using this attribute, the synthesis tools keep the boundary on this signal static. Example:&lt;br /&gt;
  VERILOG&lt;br /&gt;
    On Module:&lt;br /&gt;
    (* keep_hierarchy = &amp;quot;yes&amp;quot; *) module example (in1, in2, out1, out2);&lt;br /&gt;
    On Instance:&lt;br /&gt;
    (* keep_hierarchy = &amp;quot;yes&amp;quot; *) example e0 (.in1(in1), .in2(in2), .out1(out1));&lt;br /&gt;
&lt;br /&gt;
  VHDL&lt;br /&gt;
    On Module:&lt;br /&gt;
    attribute keep_hierarchy : string;&lt;br /&gt;
    attribute keep_hierarchy of example : architecture is &amp;quot;yes&amp;quot;;&lt;br /&gt;
    On Instance:&lt;br /&gt;
    attribute keep_hierarchy : string;&lt;br /&gt;
    attribute keep_hierarchy of e0 : label is &amp;quot;yes&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
* '''DONT_TOUCH: ''' this attribute works just as KEEP and KEEP_HIERARCHY, with the difference that this one is forward-annotated to place and route to prevent logic optimization. In case where other attributes get into conflict with DONT_TOUCH, DONT_TOUCH takes precedence and will be applied. It also can take values yes/no and true/false. Example:&lt;br /&gt;
&lt;br /&gt;
  VERILOG WIRE&lt;br /&gt;
    (* dont_touch = &amp;quot;yes&amp;quot; *) wire signal1;&lt;br /&gt;
    assign signal1 = in1 &amp;amp; in2;&lt;br /&gt;
&lt;br /&gt;
  VERILOG MODULE&lt;br /&gt;
    (* DONT_TOUCH = &amp;quot;yes&amp;quot; *)&lt;br /&gt;
    module example (clk, in1, in2, out1);&lt;br /&gt;
&lt;br /&gt;
  VHDL EXAMPLE&lt;br /&gt;
    signal sig1 : std_logic;&lt;br /&gt;
    attribute dont_touch : string;&lt;br /&gt;
    attribute dont_touch of sig1 : signal is &amp;quot;true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* '''MARK_DEBUG: ''' This is arguably the most important attribute for our current use case, because it is the one that tells Vivado which nets are going to be debugged. This also prevents optimization over the signal, and in addition prepares it to be probed during operation. Virtually this attribute could be applied to any net within the design, but there are some nets with specific properties could have protection against visibility, and can not be probed. The values for MARK_DEBUG are TRUE/FALSE. Example:&lt;br /&gt;
  VERILOG&lt;br /&gt;
    (* MARK_DEBUG = &amp;quot;TRUE&amp;quot; *) wire debug_wire;&lt;br /&gt;
  VHDL&lt;br /&gt;
    attribute MARK_DEBUG : string;&lt;br /&gt;
    attribute MARK_DEBUG of signal_name : signal is &amp;quot;TRUE&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For other attributes and options, please refer to Xilinx's documentation [1][2]. We are going to use the given almost in every case, if not always. Now, the syntax is rather simple and so is the applications to the attributes to the code. The resulting file should look as the picture on the right. When you have modified the code, you are ready to build your debug bitstream.&lt;br /&gt;
&lt;br /&gt;
[[File:chipscope_diff_siggen.png|thumb|Adding attributes to signals to probe.|900px|center|Adding attributes to signals to probe.|link=https://kb.ettus.com/images/a/a7/chipscope_diff_siggen.png]]&lt;br /&gt;
&lt;br /&gt;
= Building the debug bitstream =&lt;br /&gt;
== Save the project and finish Synthesis ==&lt;br /&gt;
For this test in particular you are going to need to have a DDC (Digital down converter) in addition to the UUT for visualization purposes on a host. To add this blocks into the bitstream, go to  &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}/[usrp3|usrp3_rfnoc/tools/scripts/&amp;lt;/syntaxhighlight&amp;gt; and inside that directory run the following command:&lt;br /&gt;
&lt;br /&gt;
    $ ./make.py siggen ddc -g&lt;br /&gt;
&lt;br /&gt;
This will set up your Vivado environment and start the build of an FPGA image with the signal generator and the DDC blocks. The option '-g' is telling the script that at some point during the build process the Vivado User Interface should be opened, as it is where we are going to set up our debug image. For  &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;make.py&amp;lt;/syntaxhighlight&amp;gt; usage and options please refer to  the [[Getting_Started_with_RFNoC_Development#Wiring_up_computation_engines_and_building_the_FPGA image|Wiring up computation engines and building the FPGA image]] section of our getting started guide, or simply run  &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;make.py --help in your terminal&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note: ''' ''The FPGA image building process may take over an hour.''&lt;br /&gt;
&lt;br /&gt;
The Vivado GUI is going to come up at some point of the synthesis. Right after the Vivado GUI has opened, you can go ahead and cancel the process that is running, which is usually the last part of the synthesis  (when it shows 90% done is a safe moment to cancel. See &amp;quot;Saving the project&amp;quot; figure). This is because we first have to set up the parameters for debugging and the synthesis has to be re-run. After canceling, save the project and give it a name of your choice; we are giving here the name ''AN_chipscope'', but you can name the project whatever you like. Right after saving the project, click on 'Run Synthesis', which can be found on the left panel under '''Project Manager-&amp;gt;Synthesis-&amp;gt;Run Synthesis'''.&lt;br /&gt;
&lt;br /&gt;
[[File:cs1.png|thumb|200px|left|Saving the Vivado Project|link=https://kb.ettus.com/images/7/74/cs1.png]]&lt;br /&gt;
&lt;br /&gt;
'''Note: ''' Most of the time Vivado will auto-detect your highest hierarchy module, but it may happen that it just slips to it and then it will ask you which it. If this happens, you can select the verilog file according to the target device that you are chipscoping as the top module (e.g. x300.v or e300.v)&lt;br /&gt;
&lt;br /&gt;
Now wait until the synthesis is finished. This won't take long, and after it finishes a window will prompted saying that the synthesis is done, and asking if you want to run the implementation. Click on cancel, as we need to setup the debugging parameters first. &lt;br /&gt;
&lt;br /&gt;
== Setup debug ==&lt;br /&gt;
&lt;br /&gt;
Go to '''Project Manager -&amp;gt; Synthesis -&amp;gt; Open Synthesized Design -&amp;gt; Set Up debug''', and the wizard will start. Click on next until you see a window listing the nets to debug. Here, two scenarios are expected. See the figure below:&lt;br /&gt;
&lt;br /&gt;
[[File:cs_2.png|center|1200px|Clock Domain|link=https://kb.ettus.com/images/5/52/cs_2.png]]&lt;br /&gt;
&lt;br /&gt;
Sometimes Vivado will pick up the clock domain automatically (which is the case depicted on the right side), but there are occasions where the nets to debug aren't clearly defined under a clock domain and this cases require a little bit more of work, depending on your knowledge of your design. In this case, we know that the nets are under the same clock domain as the other signals, but in case of doubt, you'll have to go and find it out through the code. The case on the left can be solved easily by clicking on 'more info', which is just at the end of the red warning. Right after clickling, further, clearly, information will appear. In the prompted dialog, let us click on 'Assign All Clock Domains'&lt;br /&gt;
&lt;br /&gt;
[[File:cs_3.png|center|Assigning all clock domains|link=https://kb.ettus.com/images/e/e4/cs_3.png]]&lt;br /&gt;
&lt;br /&gt;
A window will appear where you can choose the common clock domain on which you want to have the signals. Here, in our case, we select &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;radio_clk_gen/inst/CLK_OUT1&amp;lt;/syntaxhighlight&amp;gt;, and that would be sufficient to continue. Accept and click next.&lt;br /&gt;
&lt;br /&gt;
Right after, we have to choose the ''Integrated Logic Analizer - ILA'' Core Options [6][7]. Here we will only focus on &amp;quot;Sample of data depth&amp;quot; and &amp;quot;Input pipe stages&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:cs_4.png|550px|center|ILA core options|link=https://kb.ettus.com/images/2/29/cs_4.png]]&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Sample of data depth&amp;quot; is the maximum number of data sample words that the ILA core can store at run time for each of the probe lines. The input pipe stages is the number of flops or registers that are added to each probe line. This basically determines how big the debug setup will be, and the amount of data that is going to be analyzed per run. Here we select 4096 for the data depth and 1 input pipe line. For further information about the ILA and its configuration, please refer to the ILA documentation [6][7]. With this, the set up is done, and you can proceed to click &amp;quot;next&amp;quot; and then &amp;quot;finish&amp;quot; to complete the wizard operation.&lt;br /&gt;
&lt;br /&gt;
[[File:cs_5.png|center|ILA core options|link=https://kb.ettus.com/images/a/a3/cs_5.png]]&lt;br /&gt;
&lt;br /&gt;
After the setup is finished, go to the left panel and click '''Project Manager-&amp;gt;Program and Debug-&amp;gt;Generate Bitstream'''. This will ask you if you want to run the implementation first, to what we answer 'Yes'. This will prepare the bitstream with which we are going to program our device and debug our design.&lt;br /&gt;
&lt;br /&gt;
= Running the debug bitstream in the target device =&lt;br /&gt;
&lt;br /&gt;
  #TODO&lt;br /&gt;
&lt;br /&gt;
= External references =&lt;br /&gt;
[1] [https://www.xilinx.com/support/documentation/sw_manuals/xilinx2015_4/ug936-vivado-tutorial-programming-debugging.pdf Vivado Tutorial: Programming and debugging]&lt;br /&gt;
&lt;br /&gt;
[2] [https://www.xilinx.com/support/documentation/sw_manuals/xilinx2015_4/ug901-vivado-synthesis.pdf Vivado Synthesis]&lt;br /&gt;
&lt;br /&gt;
[3] [https://www.ettus.com/content/files/RFNoC_Wireless_at_VT_FPGA.pdf RFNoC Deep Dive: FPGA]&lt;br /&gt;
&lt;br /&gt;
[4] [https://www.xilinx.com/support/documentation/ip_documentation/ug761_axi_reference_guide.pdf Xilinx - AXI reference guide]&lt;br /&gt;
&lt;br /&gt;
[5] [https://files.ettus.com/manual/page_rtp.html Radio Transport Protocols]&lt;br /&gt;
&lt;br /&gt;
[6] [https://www.xilinx.com/support/documentation/ip_documentation/chipscope_ila/v1_04_a/chipscope_ila.pdf LogiCORE IP ChipScope Pro Integrated Logic Analyzer]&lt;br /&gt;
&lt;br /&gt;
[7] [https://www.xilinx.com/support/documentation/ip_documentation/ila/v3_0/pg172-ila.pdf LogiCORE IP Integrated Logic Analyzer v3.0]&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Debugging_FPGA_images&amp;diff=3124</id>
		<title>Debugging FPGA images</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Debugging_FPGA_images&amp;diff=3124"/>
				<updated>2016-11-30T19:57:24Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: /* Revision History */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Application Note Number =&lt;br /&gt;
'''AN-XXX'''&lt;br /&gt;
&lt;br /&gt;
= Revision History =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Author&lt;br /&gt;
!Details&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2016-11-28&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Nicolas Cuervo&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Initial creation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UNDER CONSTRUCTION: THE CONTENTS OF THIS PAGE HAVE TO GO THROUGH REVIEW AND EDITION. AT THIS MOMENT, PLEASE DO NOT USE THIS PAGE AS A REFERENCE! =&lt;br /&gt;
&lt;br /&gt;
= Abstract =&lt;br /&gt;
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. The contents of this AN could suit most of your needs while setting your debug bitstream for a RFNoC design. However, keep in mind that the topics described here are strictly related to Xilinx framework. For further information please refer to Xilinx documentation [1][2]. &lt;br /&gt;
&lt;br /&gt;
= Overview = &lt;br /&gt;
When you are developing your own application, you might come to the point on which you would like to build an FPGA image for your USRP. You might want to modify part of the cores, add some custom functionality, or even add your custom RFNoC block! For that you might follow tutorials such as the [[Getting_Started_with_RFNoC_Development#Building the FPGA image|Building the FPGA image]] section of one our &amp;quot;getting started&amp;quot; guides. &lt;br /&gt;
&lt;br /&gt;
But how about debugging your HDL code? This comes really handy when you want to follow closely the behavior of your signals within your hardware design. This Application Note will follow the basic steps needed to create a &amp;quot;chipscope image&amp;quot;, which allow you to use the Vivado GUI visual tools to debug your design. &lt;br /&gt;
&lt;br /&gt;
Before we start, this App note assumes that you have been working already with some fpga code and you want to debug it. Being this the case, we assume that you have UHD installed, the FPGA repository cloned, the right version of Xilinx Vivado installed (by the moment this is being written we use Vivado 2015.4) and its environment initialized. If not, we assume you are familiar on how to do the previously noted procedures. &lt;br /&gt;
&lt;br /&gt;
For illustration purposes, here we are going to check the status of some of the output signals of one of the RFNoC blocks we currently provide. However, the same procedure can be used to check the status of any signal within your hardware code, being input, output, or intermediate signal, and being the code a core description, a module for your library or your custom RFNoC block.&lt;br /&gt;
&lt;br /&gt;
''' Note: ''' Keep in mind that this procedure intends to probe the signals in a fully designed block, which has been also built into a FPGA .bit file and is running in a supported device. This is *not* intended to be a way to test directly your designed code, as building an FPGA image may take several minutes (even hours). For small functionality checks, we strongly recommend you to write a testbench for your code, which will allow you to have more iterations without the need of building and synthesizing your hardware description. You can follow the [https://kb.ettus.com/index.php?title=Writing_Testbenches_for_RFNoC - Writing Testbenches for RFNoC] application note to have insights on how to write your own testbench.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites = &lt;br /&gt;
&lt;br /&gt;
* '''Vivado (version 2015.4): ''' As stated in the overview, you'll be working directly with HDL code that you need to build and synthesize. Depending on your target device, you may even need a non-free license (which is the case for the X3XX devices). In the case of Ettus' embedded devices, you can proceed with your design using the Vivado Webpack.&lt;br /&gt;
&lt;br /&gt;
= Choosing your signals =&lt;br /&gt;
At this point we assume that you have a verilog code that has been properly tested by the means of simulation/testbench, but that you want to inspect into its functionality deeper by probing its signals while it is running on a device. This could be helpful for many reasons, such as getting a deeper understanding on the state of your signal during a given transaction, which could give you an insight on how it is working (or even, can give you a lead on why it isn't!)&lt;br /&gt;
&lt;br /&gt;
For this AN, we will use out block '''RFNoC: Signal Generator''' as our Unit Under Test (UUT). However, all procedures to be done can be easily transfered to your own design. In addition, as most of our block and FPGA code is written in Verilog, we will use it also in this document. So let's get started.&lt;br /&gt;
&lt;br /&gt;
The Signal generator's code can be found under &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}/usrp3/lib/rfnoc/&amp;lt;/syntaxhighlight&amp;gt;. In some of our latest code releases (such as 3.10.0.0), this code is found under &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}/usrp3_rfnoc/lib/rfnoc/&amp;lt;/syntaxhighlight&amp;gt;. In this directory you can find the RFNoC related code that is used in the RFNoC framework. Consequently, all the HDL for the NoC blocks the we provide is located here. Now, open the file &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;noc_block_siggen.v&amp;lt;/syntaxhighlight&amp;gt; in your IDE or text editor of preference and give it a quick look. &lt;br /&gt;
&lt;br /&gt;
As you can see, the code is not too extensive and is the comments divide it properly based on functionality. If your design is RFNoCModtool-generated, you'll get a similar preliminary structure in the verilog files for your block. For information on how to use RFNoCModtool please refer to [https://kb.ettus.com/index.php?title=Getting_Started_with_RFNoC_Development RFNoC Development - Getting Started Guide]. Normally for rather simple designs you won't have to deal with the RFNoC Shell or the AXI Wrapper configuration. However, for illustration purposes, we are going to take some of the signals from this part of the code and probe them in our debugging process. A total of 11 signals will be selected, each from a different internal stage. &lt;br /&gt;
&lt;br /&gt;
Lets take a look at how this boundaries look like in the FPGA Internals. Each full RFNoC design can include several different blocks, which are also called &amp;quot;computation engines&amp;quot;. The picture on the right [3] portraits the computation engine internals in a quite self explanatory fashion, although a slightly more detailed explanation about each of the internals from a Computation Engine can be found at the  [https://kb.ettus.com/RFNoC_Getting_Started_Guides RFNoC Software Page]:&lt;br /&gt;
&lt;br /&gt;
[[File:CE_internals.png|Anatomy of a computation engine.|600px|right|Anatomy of a computation engine|link=https://kb.ettus.com/images/8/83/CE_internals.png]]&lt;br /&gt;
&lt;br /&gt;
'''From NoC Shell: '''At the top of the figure you can see the AXI Crossbar, were all the computation engines are wired up together. This is not part of our UUT in particular. However, the connection between the crossbar and our UUT - NoC Shell can be tested within our code. From here we are taking the set_data/addr/stb, which are readback registers and provide information from this interface.&lt;br /&gt;
* set_data&lt;br /&gt;
* set_addr&lt;br /&gt;
* set_stb&lt;br /&gt;
&lt;br /&gt;
'''From the AXI Wrapper: '''our next stage from where we are taking signals is the AXI Wrapper. This can be understood as a translating stage in which the data that goes from and to the user's design is correctly encapsulated into a CHDR packet [5]. By probing this signals we expect to find out that the data that is being transported is correct, and that the transaction also takes places at the right moment.&lt;br /&gt;
* s_axis_data_tdata&lt;br /&gt;
* s_axis_data_tuser&lt;br /&gt;
* s_axis_data_tlast&lt;br /&gt;
* s_axis_data_tvalid&lt;br /&gt;
* s_axis_data_tready&lt;br /&gt;
&lt;br /&gt;
'''From the signal generator design: ''' Last but not least, we are probing signals from the UUT IP, which means that we are checking directly the value that certain lines inside the FPGA have the correct value at a certain time. In this case, we'll be checking if the wave type is according with the one selected from the host, that the gain value is propagated correctly and, clearly, if the block is generating signals when it is enable and when it isn't.&lt;br /&gt;
* gain&lt;br /&gt;
* wave_type&lt;br /&gt;
* enable&lt;br /&gt;
&lt;br /&gt;
= Setting up the code for ChipScoping =&lt;br /&gt;
&lt;br /&gt;
To let know Vivado that we want to probe signals, we have to go directly into the code and mark this signals for debugging. This can be done by using reserved words that describe the synthesizing attributes for a given signal. There is a variety of different attributes that you can give to any signal of your design [2], but here we are going to discuss the ones that serve most of the debugging needs:&lt;br /&gt;
&lt;br /&gt;
* '''KEEP: ''' This attribute prevents the signal to be optimized or absorbed into logic blocks, which would mean that the signal, even though it would be operational after synthesis, may not be accessible for probing. An example of the syntax for this attribute is as follows:&lt;br /&gt;
  VERILOG:&lt;br /&gt;
    (* keep = &amp;quot;true&amp;quot; *) wire signal_name;&lt;br /&gt;
    assign signal_name = in1 &amp;amp; in2;&lt;br /&gt;
&lt;br /&gt;
  VHDL:&lt;br /&gt;
    signal signal_name : std_logic;&lt;br /&gt;
    attribute keep : string;&lt;br /&gt;
    attribute keep of signal_name : signal is &amp;quot;true&amp;quot;;&lt;br /&gt;
    signal_name &amp;lt;= in1 and in2;&lt;br /&gt;
&lt;br /&gt;
* '''KEEP_HIERARCHY: ''' As well as KEEP, this attribute prevents the optimization. However, this attribute can be applied to a module or instance. By using this attribute, the synthesis tools keep the boundary on this signal static. Example:&lt;br /&gt;
  VERILOG&lt;br /&gt;
    On Module:&lt;br /&gt;
    (* keep_hierarchy = &amp;quot;yes&amp;quot; *) module example (in1, in2, out1, out2);&lt;br /&gt;
    On Instance:&lt;br /&gt;
    (* keep_hierarchy = &amp;quot;yes&amp;quot; *) example e0 (.in1(in1), .in2(in2), .out1(out1));&lt;br /&gt;
&lt;br /&gt;
  VHDL&lt;br /&gt;
    On Module:&lt;br /&gt;
    attribute keep_hierarchy : string;&lt;br /&gt;
    attribute keep_hierarchy of example : architecture is &amp;quot;yes&amp;quot;;&lt;br /&gt;
    On Instance:&lt;br /&gt;
    attribute keep_hierarchy : string;&lt;br /&gt;
    attribute keep_hierarchy of e0 : label is &amp;quot;yes&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
* '''DONT_TOUCH: ''' this attribute works just as KEEP and KEEP_HIERARCHY, with the difference that this one is forward-annotated to place and route to prevent logic optimization. In case where other attributes get into conflict with DONT_TOUCH, DONT_TOUCH takes precedence and will be applied. It also can take values yes/no and true/false. Example:&lt;br /&gt;
&lt;br /&gt;
  VERILOG WIRE&lt;br /&gt;
    (* dont_touch = &amp;quot;yes&amp;quot; *) wire signal1;&lt;br /&gt;
    assign signal1 = in1 &amp;amp; in2;&lt;br /&gt;
&lt;br /&gt;
  VERILOG MODULE&lt;br /&gt;
    (* DONT_TOUCH = &amp;quot;yes&amp;quot; *)&lt;br /&gt;
    module example (clk, in1, in2, out1);&lt;br /&gt;
&lt;br /&gt;
  VHDL EXAMPLE&lt;br /&gt;
    signal sig1 : std_logic;&lt;br /&gt;
    attribute dont_touch : string;&lt;br /&gt;
    attribute dont_touch of sig1 : signal is &amp;quot;true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* '''MARK_DEBUG: ''' This is arguably the most important attribute for our current use case, because it is the one that tells Vivado which nets are going to be debugged. This also prevents optimization over the signal, and in addition prepares it to be probed during operation. Virtually this attribute could be applied to any net within the design, but there are some nets with specific properties could have protection against visibility, and can not be probed. The values for MARK_DEBUG are TRUE/FALSE. Example:&lt;br /&gt;
  VERILOG&lt;br /&gt;
    (* MARK_DEBUG = &amp;quot;TRUE&amp;quot; *) wire debug_wire;&lt;br /&gt;
  VHDL&lt;br /&gt;
    attribute MARK_DEBUG : string;&lt;br /&gt;
    attribute MARK_DEBUG of signal_name : signal is &amp;quot;TRUE&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For other attributes and options, please refer to Xilinx's documentation [1][2]. We are going to use the given almost in every case, if not always. Now, the syntax is rather simple and so is the applications to the attributes to the code. The resulting file should look as the picture on the right. When you have modified the code, you are ready to build your debug bitstream.&lt;br /&gt;
&lt;br /&gt;
[[File:chipscope_diff_siggen.png|thumb|Adding attributes to signals to probe.|900px|center|Adding attributes to signals to probe.|link=https://kb.ettus.com/images/a/a7/chipscope_diff_siggen.png]]&lt;br /&gt;
&lt;br /&gt;
= Building the debug bitstream =&lt;br /&gt;
== Save the project and finish Synthesis ==&lt;br /&gt;
For this test in particular you are going to need to have a DDC (Digital down converter) in addition to the UUT for visualization purposes on a host. To add this blocks into the bitstream, go to  &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}/[usrp3|usrp3_rfnoc/tools/scripts/&amp;lt;/syntaxhighlight&amp;gt; and inside that directory run the following command:&lt;br /&gt;
&lt;br /&gt;
    $ ./make.py siggen ddc -g&lt;br /&gt;
&lt;br /&gt;
This will set up your Vivado environment and start the build of an FPGA image with the signal generator and the DDC blocks. The option '-g' is telling the script that at some point during the build process the Vivado User Interface should be opened, as it is where we are going to set up our debug image. For  &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;make.py&amp;lt;/syntaxhighlight&amp;gt; usage and options please refer to  the [[Getting_Started_with_RFNoC_Development#Wiring_up_computation_engines_and_building_the_FPGA image|Wiring up computation engines and building the FPGA image]] section of our getting started guide, or simply run  &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;make.py --help in your terminal&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note: ''' ''The FPGA image building process may take over an hour.''&lt;br /&gt;
&lt;br /&gt;
The Vivado GUI is going to come up at some point of the synthesis. Right after the Vivado GUI has opened, you can go ahead and cancel the process that is running, which is usually the last part of the synthesis  (when it shows 90% done is a safe moment to cancel. See &amp;quot;Saving the project&amp;quot; figure). This is because we first have to set up the parameters for debugging and the synthesis has to be re-run. After canceling, save the project and give it a name of your choice; we are giving here the name ''AN_chipscope'', but you can name the project whatever you like. Right after saving the project, click on 'Run Synthesis', which can be found on the left panel under '''Project Manager-&amp;gt;Synthesis-&amp;gt;Run Synthesis'''.&lt;br /&gt;
&lt;br /&gt;
[[File:cs1.png|thumb|200px|left|Saving the Vivado Project|link=https://kb.ettus.com/images/7/74/cs1.png]]&lt;br /&gt;
&lt;br /&gt;
'''Note: ''' Most of the time Vivado will auto-detect your highest hierarchy module, but it may happen that it just slips to it and then it will ask you which it. If this happens, you can select the verilog file according to the target device that you are chipscoping as the top module (e.g. x300.v or e300.v)&lt;br /&gt;
&lt;br /&gt;
Now wait until the synthesis is finished. This won't take long, and after it finishes a window will prompted saying that the synthesis is done, and asking if you want to run the implementation. Click on cancel, as we need to setup the debugging parameters first. &lt;br /&gt;
&lt;br /&gt;
== Setup debug ==&lt;br /&gt;
&lt;br /&gt;
Go to '''Project Manager -&amp;gt; Synthesis -&amp;gt; Open Synthesized Design -&amp;gt; Set Up debug''', and the wizard will start. Click on next until you see a window listing the nets to debug. Here, two scenarios are expected. See the figure below:&lt;br /&gt;
&lt;br /&gt;
[[File:cs_2.png|center|1200px|Clock Domain|link=https://kb.ettus.com/images/5/52/cs_2.png]]&lt;br /&gt;
&lt;br /&gt;
Sometimes Vivado will pick up the clock domain automatically (which is the case depicted on the right side), but there are occasions where the nets to debug aren't clearly defined under a clock domain and this cases require a little bit more of work, depending on your knowledge of your design. In this case, we know that the nets are under the same clock domain as the other signals, but in case of doubt, you'll have to go and find it out through the code. The case on the left can be solved easily by clicking on 'more info', which is just at the end of the red warning. Right after clickling, further, clearly, information will appear. In the prompted dialog, let us click on 'Assign All Clock Domains'&lt;br /&gt;
&lt;br /&gt;
[[File:cs_3.png|center|Assigning all clock domains|link=https://kb.ettus.com/images/e/e4/cs_3.png]]&lt;br /&gt;
&lt;br /&gt;
A window will appear where you can choose the common clock domain on which you want to have the signals. Here, in our case, we select &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;radio_clk_gen/inst/CLK_OUT1&amp;lt;/syntaxhighlight&amp;gt;, and that would be sufficient to continue. Accept and click next.&lt;br /&gt;
&lt;br /&gt;
Right after, we have to choose the ''Integrated Logic Analizer - ILA'' Core Options [6][7]. Here we will only focus on &amp;quot;Sample of data depth&amp;quot; and &amp;quot;Input pipe stages&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:cs_4.png|550px|center|ILA core options|link=https://kb.ettus.com/images/2/29/cs_4.png]]&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Sample of data depth&amp;quot; is the maximum number of data sample words that the ILA core can store at run time for each of the probe lines. The input pipe stages is the number of flops or registers that are added to each probe line. This basically determines how big the debug setup will be, and the amount of data that is going to be analyzed per run. Here we select 4096 for the data depth and 1 input pipe line. For further information about the ILA and its configuration, please refer to the ILA documentation [6][7]. With this, the set up is done, and you can proceed to click &amp;quot;next&amp;quot; and then &amp;quot;finish&amp;quot; to complete the wizard operation.&lt;br /&gt;
&lt;br /&gt;
[[File:cs_5.png|center|ILA core options|link=https://kb.ettus.com/images/a/a3/cs_5.png]]&lt;br /&gt;
&lt;br /&gt;
After the setup is finished, go to the left panel and click '''Project Manager-&amp;gt;Program and Debug-&amp;gt;Generate Bitstream'''. This will ask you if you want to run the implementation first, to what we answer 'Yes'. This will prepare the bitstream with which we are going to program our device and debug our design.&lt;br /&gt;
&lt;br /&gt;
= Running the debug bitstream in the target device =&lt;br /&gt;
&lt;br /&gt;
  #TODO&lt;br /&gt;
&lt;br /&gt;
= External references =&lt;br /&gt;
[1] [https://www.xilinx.com/support/documentation/sw_manuals/xilinx2015_4/ug936-vivado-tutorial-programming-debugging.pdf Vivado Tutorial: Programming and debugging]&lt;br /&gt;
&lt;br /&gt;
[2] [https://www.xilinx.com/support/documentation/sw_manuals/xilinx2015_4/ug901-vivado-synthesis.pdf Vivado Synthesis]&lt;br /&gt;
&lt;br /&gt;
[3] [https://www.ettus.com/content/files/RFNoC_Wireless_at_VT_FPGA.pdf RFNoC Deep Dive: FPGA]&lt;br /&gt;
&lt;br /&gt;
[4] [https://www.xilinx.com/support/documentation/ip_documentation/ug761_axi_reference_guide.pdf Xilinx - AXI reference guide]&lt;br /&gt;
&lt;br /&gt;
[5] [https://files.ettus.com/manual/page_rtp.html Radio Transport Protocols]&lt;br /&gt;
&lt;br /&gt;
[6] [https://www.xilinx.com/support/documentation/ip_documentation/chipscope_ila/v1_04_a/chipscope_ila.pdf LogiCORE IP ChipScope Pro Integrated Logic Analyzer]&lt;br /&gt;
&lt;br /&gt;
[7] [https://www.xilinx.com/support/documentation/ip_documentation/ila/v3_0/pg172-ila.pdf LogiCORE IP Integrated Logic Analyzer v3.0]&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Debugging_FPGA_images&amp;diff=3123</id>
		<title>Debugging FPGA images</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Debugging_FPGA_images&amp;diff=3123"/>
				<updated>2016-11-30T19:56:21Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Application Note Number =&lt;br /&gt;
'''AN-XXX'''&lt;br /&gt;
&lt;br /&gt;
= Revision History =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Author&lt;br /&gt;
!Details&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| 2016-11-28&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Nicolas Cuervo&amp;lt;br&amp;gt; Sugandha Gupta&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Initial creation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UNDER CONSTRUCTION: THE CONTENTS OF THIS PAGE HAVE TO GO THROUGH REVIEW AND EDITION. AT THIS MOMENT, PLEASE DO NOT USE THIS PAGE AS A REFERENCE! =&lt;br /&gt;
&lt;br /&gt;
= Abstract =&lt;br /&gt;
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. The contents of this AN could suit most of your needs while setting your debug bitstream for a RFNoC design. However, keep in mind that the topics described here are strictly related to Xilinx framework. For further information please refer to Xilinx documentation [1][2]. &lt;br /&gt;
&lt;br /&gt;
= Overview = &lt;br /&gt;
When you are developing your own application, you might come to the point on which you would like to build an FPGA image for your USRP. You might want to modify part of the cores, add some custom functionality, or even add your custom RFNoC block! For that you might follow tutorials such as the [[Getting_Started_with_RFNoC_Development#Building the FPGA image|Building the FPGA image]] section of one our &amp;quot;getting started&amp;quot; guides. &lt;br /&gt;
&lt;br /&gt;
But how about debugging your HDL code? This comes really handy when you want to follow closely the behavior of your signals within your hardware design. This Application Note will follow the basic steps needed to create a &amp;quot;chipscope image&amp;quot;, which allow you to use the Vivado GUI visual tools to debug your design. &lt;br /&gt;
&lt;br /&gt;
Before we start, this App note assumes that you have been working already with some fpga code and you want to debug it. Being this the case, we assume that you have UHD installed, the FPGA repository cloned, the right version of Xilinx Vivado installed (by the moment this is being written we use Vivado 2015.4) and its environment initialized. If not, we assume you are familiar on how to do the previously noted procedures. &lt;br /&gt;
&lt;br /&gt;
For illustration purposes, here we are going to check the status of some of the output signals of one of the RFNoC blocks we currently provide. However, the same procedure can be used to check the status of any signal within your hardware code, being input, output, or intermediate signal, and being the code a core description, a module for your library or your custom RFNoC block.&lt;br /&gt;
&lt;br /&gt;
''' Note: ''' Keep in mind that this procedure intends to probe the signals in a fully designed block, which has been also built into a FPGA .bit file and is running in a supported device. This is *not* intended to be a way to test directly your designed code, as building an FPGA image may take several minutes (even hours). For small functionality checks, we strongly recommend you to write a testbench for your code, which will allow you to have more iterations without the need of building and synthesizing your hardware description. You can follow the [https://kb.ettus.com/index.php?title=Writing_Testbenches_for_RFNoC - Writing Testbenches for RFNoC] application note to have insights on how to write your own testbench.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites = &lt;br /&gt;
&lt;br /&gt;
* '''Vivado (version 2015.4): ''' As stated in the overview, you'll be working directly with HDL code that you need to build and synthesize. Depending on your target device, you may even need a non-free license (which is the case for the X3XX devices). In the case of Ettus' embedded devices, you can proceed with your design using the Vivado Webpack.&lt;br /&gt;
&lt;br /&gt;
= Choosing your signals =&lt;br /&gt;
At this point we assume that you have a verilog code that has been properly tested by the means of simulation/testbench, but that you want to inspect into its functionality deeper by probing its signals while it is running on a device. This could be helpful for many reasons, such as getting a deeper understanding on the state of your signal during a given transaction, which could give you an insight on how it is working (or even, can give you a lead on why it isn't!)&lt;br /&gt;
&lt;br /&gt;
For this AN, we will use out block '''RFNoC: Signal Generator''' as our Unit Under Test (UUT). However, all procedures to be done can be easily transfered to your own design. In addition, as most of our block and FPGA code is written in Verilog, we will use it also in this document. So let's get started.&lt;br /&gt;
&lt;br /&gt;
The Signal generator's code can be found under &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}/usrp3/lib/rfnoc/&amp;lt;/syntaxhighlight&amp;gt;. In some of our latest code releases (such as 3.10.0.0), this code is found under &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}/usrp3_rfnoc/lib/rfnoc/&amp;lt;/syntaxhighlight&amp;gt;. In this directory you can find the RFNoC related code that is used in the RFNoC framework. Consequently, all the HDL for the NoC blocks the we provide is located here. Now, open the file &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;noc_block_siggen.v&amp;lt;/syntaxhighlight&amp;gt; in your IDE or text editor of preference and give it a quick look. &lt;br /&gt;
&lt;br /&gt;
As you can see, the code is not too extensive and is the comments divide it properly based on functionality. If your design is RFNoCModtool-generated, you'll get a similar preliminary structure in the verilog files for your block. For information on how to use RFNoCModtool please refer to [https://kb.ettus.com/index.php?title=Getting_Started_with_RFNoC_Development RFNoC Development - Getting Started Guide]. Normally for rather simple designs you won't have to deal with the RFNoC Shell or the AXI Wrapper configuration. However, for illustration purposes, we are going to take some of the signals from this part of the code and probe them in our debugging process. A total of 11 signals will be selected, each from a different internal stage. &lt;br /&gt;
&lt;br /&gt;
Lets take a look at how this boundaries look like in the FPGA Internals. Each full RFNoC design can include several different blocks, which are also called &amp;quot;computation engines&amp;quot;. The picture on the right [3] portraits the computation engine internals in a quite self explanatory fashion, although a slightly more detailed explanation about each of the internals from a Computation Engine can be found at the  [https://kb.ettus.com/RFNoC_Getting_Started_Guides RFNoC Software Page]:&lt;br /&gt;
&lt;br /&gt;
[[File:CE_internals.png|Anatomy of a computation engine.|600px|right|Anatomy of a computation engine|link=https://kb.ettus.com/images/8/83/CE_internals.png]]&lt;br /&gt;
&lt;br /&gt;
'''From NoC Shell: '''At the top of the figure you can see the AXI Crossbar, were all the computation engines are wired up together. This is not part of our UUT in particular. However, the connection between the crossbar and our UUT - NoC Shell can be tested within our code. From here we are taking the set_data/addr/stb, which are readback registers and provide information from this interface.&lt;br /&gt;
* set_data&lt;br /&gt;
* set_addr&lt;br /&gt;
* set_stb&lt;br /&gt;
&lt;br /&gt;
'''From the AXI Wrapper: '''our next stage from where we are taking signals is the AXI Wrapper. This can be understood as a translating stage in which the data that goes from and to the user's design is correctly encapsulated into a CHDR packet [5]. By probing this signals we expect to find out that the data that is being transported is correct, and that the transaction also takes places at the right moment.&lt;br /&gt;
* s_axis_data_tdata&lt;br /&gt;
* s_axis_data_tuser&lt;br /&gt;
* s_axis_data_tlast&lt;br /&gt;
* s_axis_data_tvalid&lt;br /&gt;
* s_axis_data_tready&lt;br /&gt;
&lt;br /&gt;
'''From the signal generator design: ''' Last but not least, we are probing signals from the UUT IP, which means that we are checking directly the value that certain lines inside the FPGA have the correct value at a certain time. In this case, we'll be checking if the wave type is according with the one selected from the host, that the gain value is propagated correctly and, clearly, if the block is generating signals when it is enable and when it isn't.&lt;br /&gt;
* gain&lt;br /&gt;
* wave_type&lt;br /&gt;
* enable&lt;br /&gt;
&lt;br /&gt;
= Setting up the code for ChipScoping =&lt;br /&gt;
&lt;br /&gt;
To let know Vivado that we want to probe signals, we have to go directly into the code and mark this signals for debugging. This can be done by using reserved words that describe the synthesizing attributes for a given signal. There is a variety of different attributes that you can give to any signal of your design [2], but here we are going to discuss the ones that serve most of the debugging needs:&lt;br /&gt;
&lt;br /&gt;
* '''KEEP: ''' This attribute prevents the signal to be optimized or absorbed into logic blocks, which would mean that the signal, even though it would be operational after synthesis, may not be accessible for probing. An example of the syntax for this attribute is as follows:&lt;br /&gt;
  VERILOG:&lt;br /&gt;
    (* keep = &amp;quot;true&amp;quot; *) wire signal_name;&lt;br /&gt;
    assign signal_name = in1 &amp;amp; in2;&lt;br /&gt;
&lt;br /&gt;
  VHDL:&lt;br /&gt;
    signal signal_name : std_logic;&lt;br /&gt;
    attribute keep : string;&lt;br /&gt;
    attribute keep of signal_name : signal is &amp;quot;true&amp;quot;;&lt;br /&gt;
    signal_name &amp;lt;= in1 and in2;&lt;br /&gt;
&lt;br /&gt;
* '''KEEP_HIERARCHY: ''' As well as KEEP, this attribute prevents the optimization. However, this attribute can be applied to a module or instance. By using this attribute, the synthesis tools keep the boundary on this signal static. Example:&lt;br /&gt;
  VERILOG&lt;br /&gt;
    On Module:&lt;br /&gt;
    (* keep_hierarchy = &amp;quot;yes&amp;quot; *) module example (in1, in2, out1, out2);&lt;br /&gt;
    On Instance:&lt;br /&gt;
    (* keep_hierarchy = &amp;quot;yes&amp;quot; *) example e0 (.in1(in1), .in2(in2), .out1(out1));&lt;br /&gt;
&lt;br /&gt;
  VHDL&lt;br /&gt;
    On Module:&lt;br /&gt;
    attribute keep_hierarchy : string;&lt;br /&gt;
    attribute keep_hierarchy of example : architecture is &amp;quot;yes&amp;quot;;&lt;br /&gt;
    On Instance:&lt;br /&gt;
    attribute keep_hierarchy : string;&lt;br /&gt;
    attribute keep_hierarchy of e0 : label is &amp;quot;yes&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
* '''DONT_TOUCH: ''' this attribute works just as KEEP and KEEP_HIERARCHY, with the difference that this one is forward-annotated to place and route to prevent logic optimization. In case where other attributes get into conflict with DONT_TOUCH, DONT_TOUCH takes precedence and will be applied. It also can take values yes/no and true/false. Example:&lt;br /&gt;
&lt;br /&gt;
  VERILOG WIRE&lt;br /&gt;
    (* dont_touch = &amp;quot;yes&amp;quot; *) wire signal1;&lt;br /&gt;
    assign signal1 = in1 &amp;amp; in2;&lt;br /&gt;
&lt;br /&gt;
  VERILOG MODULE&lt;br /&gt;
    (* DONT_TOUCH = &amp;quot;yes&amp;quot; *)&lt;br /&gt;
    module example (clk, in1, in2, out1);&lt;br /&gt;
&lt;br /&gt;
  VHDL EXAMPLE&lt;br /&gt;
    signal sig1 : std_logic;&lt;br /&gt;
    attribute dont_touch : string;&lt;br /&gt;
    attribute dont_touch of sig1 : signal is &amp;quot;true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* '''MARK_DEBUG: ''' This is arguably the most important attribute for our current use case, because it is the one that tells Vivado which nets are going to be debugged. This also prevents optimization over the signal, and in addition prepares it to be probed during operation. Virtually this attribute could be applied to any net within the design, but there are some nets with specific properties could have protection against visibility, and can not be probed. The values for MARK_DEBUG are TRUE/FALSE. Example:&lt;br /&gt;
  VERILOG&lt;br /&gt;
    (* MARK_DEBUG = &amp;quot;TRUE&amp;quot; *) wire debug_wire;&lt;br /&gt;
  VHDL&lt;br /&gt;
    attribute MARK_DEBUG : string;&lt;br /&gt;
    attribute MARK_DEBUG of signal_name : signal is &amp;quot;TRUE&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For other attributes and options, please refer to Xilinx's documentation [1][2]. We are going to use the given almost in every case, if not always. Now, the syntax is rather simple and so is the applications to the attributes to the code. The resulting file should look as the picture on the right. When you have modified the code, you are ready to build your debug bitstream.&lt;br /&gt;
&lt;br /&gt;
[[File:chipscope_diff_siggen.png|thumb|Adding attributes to signals to probe.|900px|center|Adding attributes to signals to probe.|link=https://kb.ettus.com/images/a/a7/chipscope_diff_siggen.png]]&lt;br /&gt;
&lt;br /&gt;
= Building the debug bitstream =&lt;br /&gt;
== Save the project and finish Synthesis ==&lt;br /&gt;
For this test in particular you are going to need to have a DDC (Digital down converter) in addition to the UUT for visualization purposes on a host. To add this blocks into the bitstream, go to  &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;{fpga-repository}/[usrp3|usrp3_rfnoc/tools/scripts/&amp;lt;/syntaxhighlight&amp;gt; and inside that directory run the following command:&lt;br /&gt;
&lt;br /&gt;
    $ ./make.py siggen ddc -g&lt;br /&gt;
&lt;br /&gt;
This will set up your Vivado environment and start the build of an FPGA image with the signal generator and the DDC blocks. The option '-g' is telling the script that at some point during the build process the Vivado User Interface should be opened, as it is where we are going to set up our debug image. For  &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;make.py&amp;lt;/syntaxhighlight&amp;gt; usage and options please refer to  the [[Getting_Started_with_RFNoC_Development#Wiring_up_computation_engines_and_building_the_FPGA image|Wiring up computation engines and building the FPGA image]] section of our getting started guide, or simply run  &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;make.py --help in your terminal&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note: ''' ''The FPGA image building process may take over an hour.''&lt;br /&gt;
&lt;br /&gt;
The Vivado GUI is going to come up at some point of the synthesis. Right after the Vivado GUI has opened, you can go ahead and cancel the process that is running, which is usually the last part of the synthesis  (when it shows 90% done is a safe moment to cancel. See &amp;quot;Saving the project&amp;quot; figure). This is because we first have to set up the parameters for debugging and the synthesis has to be re-run. After canceling, save the project and give it a name of your choice; we are giving here the name ''AN_chipscope'', but you can name the project whatever you like. Right after saving the project, click on 'Run Synthesis', which can be found on the left panel under '''Project Manager-&amp;gt;Synthesis-&amp;gt;Run Synthesis'''.&lt;br /&gt;
&lt;br /&gt;
[[File:cs1.png|thumb|200px|left|Saving the Vivado Project|link=https://kb.ettus.com/images/7/74/cs1.png]]&lt;br /&gt;
&lt;br /&gt;
'''Note: ''' Most of the time Vivado will auto-detect your highest hierarchy module, but it may happen that it just slips to it and then it will ask you which it. If this happens, you can select the verilog file according to the target device that you are chipscoping as the top module (e.g. x300.v or e300.v)&lt;br /&gt;
&lt;br /&gt;
Now wait until the synthesis is finished. This won't take long, and after it finishes a window will prompted saying that the synthesis is done, and asking if you want to run the implementation. Click on cancel, as we need to setup the debugging parameters first. &lt;br /&gt;
&lt;br /&gt;
== Setup debug ==&lt;br /&gt;
&lt;br /&gt;
Go to '''Project Manager -&amp;gt; Synthesis -&amp;gt; Open Synthesized Design -&amp;gt; Set Up debug''', and the wizard will start. Click on next until you see a window listing the nets to debug. Here, two scenarios are expected. See the figure below:&lt;br /&gt;
&lt;br /&gt;
[[File:cs_2.png|center|1200px|Clock Domain|link=https://kb.ettus.com/images/5/52/cs_2.png]]&lt;br /&gt;
&lt;br /&gt;
Sometimes Vivado will pick up the clock domain automatically (which is the case depicted on the right side), but there are occasions where the nets to debug aren't clearly defined under a clock domain and this cases require a little bit more of work, depending on your knowledge of your design. In this case, we know that the nets are under the same clock domain as the other signals, but in case of doubt, you'll have to go and find it out through the code. The case on the left can be solved easily by clicking on 'more info', which is just at the end of the red warning. Right after clickling, further, clearly, information will appear. In the prompted dialog, let us click on 'Assign All Clock Domains'&lt;br /&gt;
&lt;br /&gt;
[[File:cs_3.png|center|Assigning all clock domains|link=https://kb.ettus.com/images/e/e4/cs_3.png]]&lt;br /&gt;
&lt;br /&gt;
A window will appear where you can choose the common clock domain on which you want to have the signals. Here, in our case, we select &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;none&amp;quot;&amp;gt;radio_clk_gen/inst/CLK_OUT1&amp;lt;/syntaxhighlight&amp;gt;, and that would be sufficient to continue. Accept and click next.&lt;br /&gt;
&lt;br /&gt;
Right after, we have to choose the ''Integrated Logic Analizer - ILA'' Core Options [6][7]. Here we will only focus on &amp;quot;Sample of data depth&amp;quot; and &amp;quot;Input pipe stages&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:cs_4.png|550px|center|ILA core options|link=https://kb.ettus.com/images/2/29/cs_4.png]]&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Sample of data depth&amp;quot; is the maximum number of data sample words that the ILA core can store at run time for each of the probe lines. The input pipe stages is the number of flops or registers that are added to each probe line. This basically determines how big the debug setup will be, and the amount of data that is going to be analyzed per run. Here we select 4096 for the data depth and 1 input pipe line. For further information about the ILA and its configuration, please refer to the ILA documentation [6][7]. With this, the set up is done, and you can proceed to click &amp;quot;next&amp;quot; and then &amp;quot;finish&amp;quot; to complete the wizard operation.&lt;br /&gt;
&lt;br /&gt;
[[File:cs_5.png|center|ILA core options|link=https://kb.ettus.com/images/a/a3/cs_5.png]]&lt;br /&gt;
&lt;br /&gt;
After the setup is finished, go to the left panel and click '''Project Manager-&amp;gt;Program and Debug-&amp;gt;Generate Bitstream'''. This will ask you if you want to run the implementation first, to what we answer 'Yes'. This will prepare the bitstream with which we are going to program our device and debug our design.&lt;br /&gt;
&lt;br /&gt;
= Running the debug bitstream in the target device =&lt;br /&gt;
&lt;br /&gt;
  #TODO&lt;br /&gt;
&lt;br /&gt;
= External references =&lt;br /&gt;
[1] [https://www.xilinx.com/support/documentation/sw_manuals/xilinx2015_4/ug936-vivado-tutorial-programming-debugging.pdf Vivado Tutorial: Programming and debugging]&lt;br /&gt;
&lt;br /&gt;
[2] [https://www.xilinx.com/support/documentation/sw_manuals/xilinx2015_4/ug901-vivado-synthesis.pdf Vivado Synthesis]&lt;br /&gt;
&lt;br /&gt;
[3] [https://www.ettus.com/content/files/RFNoC_Wireless_at_VT_FPGA.pdf RFNoC Deep Dive: FPGA]&lt;br /&gt;
&lt;br /&gt;
[4] [https://www.xilinx.com/support/documentation/ip_documentation/ug761_axi_reference_guide.pdf Xilinx - AXI reference guide]&lt;br /&gt;
&lt;br /&gt;
[5] [https://files.ettus.com/manual/page_rtp.html Radio Transport Protocols]&lt;br /&gt;
&lt;br /&gt;
[6] [https://www.xilinx.com/support/documentation/ip_documentation/chipscope_ila/v1_04_a/chipscope_ila.pdf LogiCORE IP ChipScope Pro Integrated Logic Analyzer]&lt;br /&gt;
&lt;br /&gt;
[7] [https://www.xilinx.com/support/documentation/ip_documentation/ila/v3_0/pg172-ila.pdf LogiCORE IP Integrated Logic Analyzer v3.0]&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:cs_5.png&amp;diff=3122</id>
		<title>File:cs 5.png</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:cs_5.png&amp;diff=3122"/>
				<updated>2016-11-30T19:13:33Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:cs_4.png&amp;diff=3121</id>
		<title>File:cs 4.png</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:cs_4.png&amp;diff=3121"/>
				<updated>2016-11-30T19:02:02Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:cs_3.png&amp;diff=3120</id>
		<title>File:cs 3.png</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:cs_3.png&amp;diff=3120"/>
				<updated>2016-11-30T18:47:10Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: NicolasCuervo uploaded a new version of File:cs 3.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:cs_3.png&amp;diff=3119</id>
		<title>File:cs 3.png</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:cs_3.png&amp;diff=3119"/>
				<updated>2016-11-30T18:45:08Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:cs_2.png&amp;diff=3118</id>
		<title>File:cs 2.png</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:cs_2.png&amp;diff=3118"/>
				<updated>2016-11-30T18:35:55Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:cs1.png&amp;diff=3117</id>
		<title>File:cs1.png</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:cs1.png&amp;diff=3117"/>
				<updated>2016-11-30T18:15:53Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:chipscope_diff_siggen.png&amp;diff=3116</id>
		<title>File:chipscope diff siggen.png</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:chipscope_diff_siggen.png&amp;diff=3116"/>
				<updated>2016-11-30T10:26:50Z</updated>
		
		<summary type="html">&lt;p&gt;NicolasCuervo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>NicolasCuervo</name></author>	</entry>

	</feed>