<?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=JoseLoera</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=JoseLoera"/>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/Special:Contributions/JoseLoera"/>
		<updated>2026-06-14T03:25:31Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP_X_Series_Quick_Start_(Daughterboard_Installation)&amp;diff=4924</id>
		<title>USRP X Series Quick Start (Daughterboard Installation)</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=USRP_X_Series_Quick_Start_(Daughterboard_Installation)&amp;diff=4924"/>
				<updated>2020-04-28T19:51:49Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* Revision History */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Application Note Number==&lt;br /&gt;
'''AN-904'''&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;
|style=&amp;quot;text-align:center;&amp;quot;| 2020-Apr-27   &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 section &amp;quot;UBX Daughterboard Installation Video&amp;quot; and link. Link also provided [https://drive.google.com/file/d/1cMMxuV_KZVrc5r-NOwNLI9JoaGM8aUIu/view?usp=sharing here] as well&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This application note is a detailed step-by-step guide to install a daughterboard into the USRP X300/X310. &lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
This Quick Start is meant to show you how to put together your new X300/310. We will start at the point when you have yet to unpack the boxes and go all the way to being able to ping the device, performing a quick software probe to verify hardware components and finally running a simple FFT demo. This Quick Start does not cover the installation of software on the host computer. If you have not installed UHD/Gnuradio on your system, please reference 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. You may also use the [[Live SDR Environment]] to perform the verification steps for your USRP. Detailed information on the [[Live SDR Environment]] is available at the [[Live SDR Environment Getting Started Guides]] page.&lt;br /&gt;
&lt;br /&gt;
==Tools Required==&lt;br /&gt;
* Philips Screwdriver&lt;br /&gt;
* 5/16” wrench&lt;br /&gt;
&lt;br /&gt;
==Pre-installed Software==&lt;br /&gt;
* UHD Latest &lt;br /&gt;
* GNU Radio&lt;br /&gt;
&lt;br /&gt;
==Box Contents==&lt;br /&gt;
===USRP Box===&lt;br /&gt;
* 1 x USRP X300/X310&lt;br /&gt;
* 1 x SFP Adapter for 1 GigE&lt;br /&gt;
* 1 x Power Supply and US Cord&lt;br /&gt;
* 1 x USB 2.0 JTAG Debug Cable&lt;br /&gt;
* 1 x Gigabit Ethernet Cable&lt;br /&gt;
* 4 x SMA-Bulkhead Cables&lt;br /&gt;
* 16 x Daughterboard Screws&lt;br /&gt;
===Daughterboard Boxes===&lt;br /&gt;
* 2 x SBX Daughterboards&lt;br /&gt;
===Antenna Boxes===&lt;br /&gt;
* One or more Antennas&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 1.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 2.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
==Proper Care and Handling==&lt;br /&gt;
All Ettus Research products are individually tested before shipment. The USRP™ is guaranteed to be functional at the time it is received by the customer. Improper use or handling of the USRP™ can easily cause the device to become non-functional. Ettus Research recommends you perform the installation with no power to the USRP and using ESD equipment. Listed below are some examples of actions which can prevent damage to the unit:&lt;br /&gt;
&lt;br /&gt;
*Never allow metal objects to touch the circuit board while powered.&lt;br /&gt;
*Always properly terminate the transmit port with an antenna or 50Ω load.&lt;br /&gt;
*Always handle the board with proper anti-static methods.&lt;br /&gt;
*Never allow the board to directly or indirectly come into contact with any voltage spikes.&lt;br /&gt;
*Never allow any water, or condensing moisture, to come into contact with the boards.&lt;br /&gt;
*Always use caution with FPGA, firmware, or software modifications.&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Never apply more than -15 dBm of power into any RF input.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Always use at least 30dB attenuation if operating in loopback configuration&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Installation Process==&lt;br /&gt;
===Step 1===&lt;br /&gt;
Unscrew the 2 screws on the top of the USRP and remove cover. (Lift up about 15 degrees and wiggle back as there&lt;br /&gt;
is a flange on the front part of the cover)&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 3.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 4.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 5.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 2===&lt;br /&gt;
Line up the 8 screw holes on the Daughterboard with the USRP Motherboard standoffs (they only go one way).&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 6.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 7.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 3===&lt;br /&gt;
After you have aligned the Daughterboard correctly you can press the Daughterboard on to the connectors below them (you will feel them snap into place).&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 8.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 9.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 4===&lt;br /&gt;
Put 8 of the screws provided in the daughterboard&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 10.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 5===&lt;br /&gt;
Repeat steps 2- 4 for the second Daughterboard&lt;br /&gt;
&lt;br /&gt;
===Step 6===&lt;br /&gt;
It is recommended to connect the bulkhead cables one at a time to avoid confusion. The Daughterboards and front&lt;br /&gt;
panel of the X300/310 are clearly labeled as to which cable goes where.&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 11.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 12.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 13.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 14.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 15.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 16.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 7===&lt;br /&gt;
Repeat step 6 for the other bulkhead cables&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 17.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 18.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 8===&lt;br /&gt;
Install USRP cover with screws&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 19.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 9===&lt;br /&gt;
Connect the SFP 1 GigE adapter into USRP SFP port 0&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 20.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 21.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 10===&lt;br /&gt;
Connect the Gigabit Ethernet cable and power cord provided&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 22.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 11===&lt;br /&gt;
Attach any Antennas you may have purchased&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 23.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 12===&lt;br /&gt;
On the computer(host) you plan to use to connect to the USRP set the Ethernet adapter to have an IP address of 192.168.10.1 with a subnet mask of 255.255.255.0. Connect the other end of the Gigabit Ethernet cable to your computer.&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 24.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 13===&lt;br /&gt;
Power on the USRP (button on the front right of the USRP)&lt;br /&gt;
&lt;br /&gt;
===Step 14===&lt;br /&gt;
Ping the device from host computer: &lt;br /&gt;
&lt;br /&gt;
    $ ping 192.168.10.2&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 25.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 15===&lt;br /&gt;
Assuming you have properly installed the UHD driver you can now run this command in a terminal/command window:&lt;br /&gt;
&lt;br /&gt;
    $ uhd_usrp_probe&lt;br /&gt;
&lt;br /&gt;
This will tell you about the hardware inside of your USRP. The output will look like the following:&lt;br /&gt;
&lt;br /&gt;
    $ uhd_usrp_probe &lt;br /&gt;
    linux; GNU C++ version 4.8.4; Boost_105400; UHD_003.010.git-202-g9e0861e1&lt;br /&gt;
    &lt;br /&gt;
    -- X300 initialization sequence...&lt;br /&gt;
    -- Determining maximum frame size... 1472 bytes.&lt;br /&gt;
    -- Setup basic communication...&lt;br /&gt;
    -- Loading values from EEPROM...&lt;br /&gt;
    -- Setup RF frontend clocking...&lt;br /&gt;
    -- Radio 1x clock:200&lt;br /&gt;
    -- Detecting internal GPSDO.... No GPSDO found&lt;br /&gt;
    -- Initialize Radio0 control...&lt;br /&gt;
    -- Performing register loopback test... pass&lt;br /&gt;
    -- Initialize Radio1 control...&lt;br /&gt;
    -- Performing register loopback test... pass&lt;br /&gt;
      _____________________________________________________&lt;br /&gt;
     /&lt;br /&gt;
    |       Device: X-Series Device&lt;br /&gt;
    |     _____________________________________________________&lt;br /&gt;
    |    /&lt;br /&gt;
    |   |       Mboard: X300&lt;br /&gt;
    |   |   revision: 7&lt;br /&gt;
    |   |   revision_compat: 7&lt;br /&gt;
    |   |   product: 30518&lt;br /&gt;
    |   |   mac-addr0: ff:ff:ff:ff:ff:ff&lt;br /&gt;
    |   |   mac-addr1: ff:ff:ff:ff:ff:ff&lt;br /&gt;
    |   |   gateway: 255.255.255.255&lt;br /&gt;
    |   |   ip-addr0: 255.255.255.255&lt;br /&gt;
    |   |   subnet0: 255.255.255.255&lt;br /&gt;
    |   |   ip-addr1: 255.255.255.255&lt;br /&gt;
    |   |   subnet1: 255.255.255.255&lt;br /&gt;
    |   |   ip-addr2: 255.255.255.255&lt;br /&gt;
    |   |   subnet2: 255.255.255.255&lt;br /&gt;
    |   |   ip-addr3: 255.255.255.255&lt;br /&gt;
    |   |   subnet3: 255.255.255.255&lt;br /&gt;
    |   |   serial: FFFFFFF&lt;br /&gt;
    |   |   FW Version: 4.0&lt;br /&gt;
    |   |   FPGA Version: 20.0&lt;br /&gt;
    |   |   &lt;br /&gt;
    |   |   Time sources: internal, external, gpsdo&lt;br /&gt;
    |   |   Clock sources: internal, external, gpsdo&lt;br /&gt;
    |   |   Sensors: ref_locked&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       RX DSP: 0&lt;br /&gt;
    |   |   |   Freq range: -100.000 to 100.000 MHz&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       RX DSP: 1&lt;br /&gt;
    |   |   |   Freq range: -100.000 to 100.000 MHz&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       RX Dboard: A&lt;br /&gt;
    |   |   |   ID: SBX (0x0054)&lt;br /&gt;
    |   |   |   Serial: FFFFFF&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       RX Frontend: 0&lt;br /&gt;
    |   |   |   |   Name: SBXv3 RX&lt;br /&gt;
    |   |   |   |   Antennas: TX/RX, RX2, CAL&lt;br /&gt;
    |   |   |   |   Sensors: lo_locked&lt;br /&gt;
    |   |   |   |   Freq range: 400.000 to 4400.000 MHz&lt;br /&gt;
    |   |   |   |   Gain range PGA0: 0.0 to 31.5 step 0.5 dB&lt;br /&gt;
    |   |   |   |   Bandwidth range: 40000000.0 to 40000000.0 step 0.0 Hz&lt;br /&gt;
    |   |   |   |   Connection Type: IQ&lt;br /&gt;
    |   |   |   |   Uses LO offset: No&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       RX Codec: A&lt;br /&gt;
    |   |   |   |   Name: ads62p48&lt;br /&gt;
    |   |   |   |   Gain range digital: 0.0 to 6.0 step 0.5 dB&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       RX Dboard: B&lt;br /&gt;
    |   |   |   ID: SBX (0x0054)&lt;br /&gt;
    |   |   |   Serial: FFFFFF&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       RX Frontend: 0&lt;br /&gt;
    |   |   |   |   Name: SBXv3 RX&lt;br /&gt;
    |   |   |   |   Antennas: TX/RX, RX2, CAL&lt;br /&gt;
    |   |   |   |   Sensors: lo_locked&lt;br /&gt;
    |   |   |   |   Freq range: 400.000 to 4400.000 MHz&lt;br /&gt;
    |   |   |   |   Gain range PGA0: 0.0 to 31.5 step 0.5 dB&lt;br /&gt;
    |   |   |   |   Bandwidth range: 40000000.0 to 40000000.0 step 0.0 Hz&lt;br /&gt;
    |   |   |   |   Connection Type: IQ&lt;br /&gt;
    |   |   |   |   Uses LO offset: No&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       RX Codec: B&lt;br /&gt;
    |   |   |   |   Name: ads62p48&lt;br /&gt;
    |   |   |   |   Gain range digital: 0.0 to 6.0 step 0.5 dB&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       TX DSP: 0&lt;br /&gt;
    |   |   |   Freq range: -100.000 to 100.000 MHz&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       TX DSP: 1&lt;br /&gt;
    |   |   |   Freq range: -100.000 to 100.000 MHz&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       TX Dboard: A&lt;br /&gt;
    |   |   |   ID: SBX (0x0055)&lt;br /&gt;
    |   |   |   Serial: FFFFFF&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       TX Frontend: 0&lt;br /&gt;
    |   |   |   |   Name: SBXv3 TX&lt;br /&gt;
    |   |   |   |   Antennas: TX/RX, CAL&lt;br /&gt;
    |   |   |   |   Sensors: lo_locked&lt;br /&gt;
    |   |   |   |   Freq range: 400.000 to 4400.000 MHz&lt;br /&gt;
    |   |   |   |   Gain range PGA0: 0.0 to 31.5 step 0.5 dB&lt;br /&gt;
    |   |   |   |   Bandwidth range: 40000000.0 to 40000000.0 step 0.0 Hz&lt;br /&gt;
    |   |   |   |   Connection Type: QI&lt;br /&gt;
    |   |   |   |   Uses LO offset: No&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       TX Codec: A&lt;br /&gt;
    |   |   |   |   Name: ad9146&lt;br /&gt;
    |   |   |   |   Gain Elements: None&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       TX Dboard: B&lt;br /&gt;
    |   |   |   ID: SBX (0x0055)&lt;br /&gt;
    |   |   |   Serial: FFFFFF&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       TX Frontend: 0&lt;br /&gt;
    |   |   |   |   Name: SBXv3 TX&lt;br /&gt;
    |   |   |   |   Antennas: TX/RX, CAL&lt;br /&gt;
    |   |   |   |   Sensors: lo_locked&lt;br /&gt;
    |   |   |   |   Freq range: 400.000 to 4400.000 MHz&lt;br /&gt;
    |   |   |   |   Gain range PGA0: 0.0 to 31.5 step 0.5 dB&lt;br /&gt;
    |   |   |   |   Bandwidth range: 40000000.0 to 40000000.0 step 0.0 Hz&lt;br /&gt;
    |   |   |   |   Connection Type: QI&lt;br /&gt;
    |   |   |   |   Uses LO offset: No&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       TX Codec: B&lt;br /&gt;
    |   |   |   |   Name: ad9146&lt;br /&gt;
    |   |   |   |   Gain Elements: None&lt;br /&gt;
&lt;br /&gt;
==UBX daughterboard Installation Video==&lt;br /&gt;
The following link is a video of the steps to install the UBX daughterboard. The procedure is similar to what is outlined above. &lt;br /&gt;
&lt;br /&gt;
*[https://drive.google.com/file/d/1cMMxuV_KZVrc5r-NOwNLI9JoaGM8aUIu/view?usp=sharing Video: UBX Installation into a USRP X-series device.]&lt;br /&gt;
&lt;br /&gt;
==UHD FFT==&lt;br /&gt;
Try the UHD_FFT demo that comes with GNU Radio&lt;br /&gt;
&lt;br /&gt;
1. Connect one antenna to RX2 on the left Daughterboard (Daughterboard A)&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 26.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
2.From the terminal/command window: &lt;br /&gt;
&lt;br /&gt;
    $ uhd_fft --ant RX2&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 27.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 28.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
==Success==&lt;br /&gt;
Congratulations! You have successfully setup and verified your new USRP X300/X310. A more detailed verification guide is at the [[Verifying the Operation of the USRP Using UHD and GNU Radio]] application note. For additional step-by-step guides to using your USRP X300/X310, see the [[Application Notes]] section of the [https://kb.ettus.com Ettus Research Knowledge Base].&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP_X_Series_Quick_Start_(Daughterboard_Installation)&amp;diff=4923</id>
		<title>USRP X Series Quick Start (Daughterboard Installation)</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=USRP_X_Series_Quick_Start_(Daughterboard_Installation)&amp;diff=4923"/>
				<updated>2020-04-28T19:50:26Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* Additional Resources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Application Note Number==&lt;br /&gt;
'''AN-904'''&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;
|style=&amp;quot;text-align:center;&amp;quot;| 2020-Apr-27   &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 on installing UBX board in a USRP X Series device to the Additional Resources section. Link [https://drive.google.com/file/d/1cMMxuV_KZVrc5r-NOwNLI9JoaGM8aUIu/view?usp=sharing here] as well&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This application note is a detailed step-by-step guide to install a daughterboard into the USRP X300/X310. &lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
This Quick Start is meant to show you how to put together your new X300/310. We will start at the point when you have yet to unpack the boxes and go all the way to being able to ping the device, performing a quick software probe to verify hardware components and finally running a simple FFT demo. This Quick Start does not cover the installation of software on the host computer. If you have not installed UHD/Gnuradio on your system, please reference 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. You may also use the [[Live SDR Environment]] to perform the verification steps for your USRP. Detailed information on the [[Live SDR Environment]] is available at the [[Live SDR Environment Getting Started Guides]] page.&lt;br /&gt;
&lt;br /&gt;
==Tools Required==&lt;br /&gt;
* Philips Screwdriver&lt;br /&gt;
* 5/16” wrench&lt;br /&gt;
&lt;br /&gt;
==Pre-installed Software==&lt;br /&gt;
* UHD Latest &lt;br /&gt;
* GNU Radio&lt;br /&gt;
&lt;br /&gt;
==Box Contents==&lt;br /&gt;
===USRP Box===&lt;br /&gt;
* 1 x USRP X300/X310&lt;br /&gt;
* 1 x SFP Adapter for 1 GigE&lt;br /&gt;
* 1 x Power Supply and US Cord&lt;br /&gt;
* 1 x USB 2.0 JTAG Debug Cable&lt;br /&gt;
* 1 x Gigabit Ethernet Cable&lt;br /&gt;
* 4 x SMA-Bulkhead Cables&lt;br /&gt;
* 16 x Daughterboard Screws&lt;br /&gt;
===Daughterboard Boxes===&lt;br /&gt;
* 2 x SBX Daughterboards&lt;br /&gt;
===Antenna Boxes===&lt;br /&gt;
* One or more Antennas&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 1.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 2.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
==Proper Care and Handling==&lt;br /&gt;
All Ettus Research products are individually tested before shipment. The USRP™ is guaranteed to be functional at the time it is received by the customer. Improper use or handling of the USRP™ can easily cause the device to become non-functional. Ettus Research recommends you perform the installation with no power to the USRP and using ESD equipment. Listed below are some examples of actions which can prevent damage to the unit:&lt;br /&gt;
&lt;br /&gt;
*Never allow metal objects to touch the circuit board while powered.&lt;br /&gt;
*Always properly terminate the transmit port with an antenna or 50Ω load.&lt;br /&gt;
*Always handle the board with proper anti-static methods.&lt;br /&gt;
*Never allow the board to directly or indirectly come into contact with any voltage spikes.&lt;br /&gt;
*Never allow any water, or condensing moisture, to come into contact with the boards.&lt;br /&gt;
*Always use caution with FPGA, firmware, or software modifications.&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Never apply more than -15 dBm of power into any RF input.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Always use at least 30dB attenuation if operating in loopback configuration&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Installation Process==&lt;br /&gt;
===Step 1===&lt;br /&gt;
Unscrew the 2 screws on the top of the USRP and remove cover. (Lift up about 15 degrees and wiggle back as there&lt;br /&gt;
is a flange on the front part of the cover)&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 3.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 4.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 5.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 2===&lt;br /&gt;
Line up the 8 screw holes on the Daughterboard with the USRP Motherboard standoffs (they only go one way).&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 6.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 7.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 3===&lt;br /&gt;
After you have aligned the Daughterboard correctly you can press the Daughterboard on to the connectors below them (you will feel them snap into place).&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 8.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 9.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 4===&lt;br /&gt;
Put 8 of the screws provided in the daughterboard&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 10.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 5===&lt;br /&gt;
Repeat steps 2- 4 for the second Daughterboard&lt;br /&gt;
&lt;br /&gt;
===Step 6===&lt;br /&gt;
It is recommended to connect the bulkhead cables one at a time to avoid confusion. The Daughterboards and front&lt;br /&gt;
panel of the X300/310 are clearly labeled as to which cable goes where.&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 11.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 12.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 13.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 14.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 15.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 16.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 7===&lt;br /&gt;
Repeat step 6 for the other bulkhead cables&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 17.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 18.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 8===&lt;br /&gt;
Install USRP cover with screws&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 19.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 9===&lt;br /&gt;
Connect the SFP 1 GigE adapter into USRP SFP port 0&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 20.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 21.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 10===&lt;br /&gt;
Connect the Gigabit Ethernet cable and power cord provided&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 22.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 11===&lt;br /&gt;
Attach any Antennas you may have purchased&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 23.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 12===&lt;br /&gt;
On the computer(host) you plan to use to connect to the USRP set the Ethernet adapter to have an IP address of 192.168.10.1 with a subnet mask of 255.255.255.0. Connect the other end of the Gigabit Ethernet cable to your computer.&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 24.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 13===&lt;br /&gt;
Power on the USRP (button on the front right of the USRP)&lt;br /&gt;
&lt;br /&gt;
===Step 14===&lt;br /&gt;
Ping the device from host computer: &lt;br /&gt;
&lt;br /&gt;
    $ ping 192.168.10.2&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 25.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 15===&lt;br /&gt;
Assuming you have properly installed the UHD driver you can now run this command in a terminal/command window:&lt;br /&gt;
&lt;br /&gt;
    $ uhd_usrp_probe&lt;br /&gt;
&lt;br /&gt;
This will tell you about the hardware inside of your USRP. The output will look like the following:&lt;br /&gt;
&lt;br /&gt;
    $ uhd_usrp_probe &lt;br /&gt;
    linux; GNU C++ version 4.8.4; Boost_105400; UHD_003.010.git-202-g9e0861e1&lt;br /&gt;
    &lt;br /&gt;
    -- X300 initialization sequence...&lt;br /&gt;
    -- Determining maximum frame size... 1472 bytes.&lt;br /&gt;
    -- Setup basic communication...&lt;br /&gt;
    -- Loading values from EEPROM...&lt;br /&gt;
    -- Setup RF frontend clocking...&lt;br /&gt;
    -- Radio 1x clock:200&lt;br /&gt;
    -- Detecting internal GPSDO.... No GPSDO found&lt;br /&gt;
    -- Initialize Radio0 control...&lt;br /&gt;
    -- Performing register loopback test... pass&lt;br /&gt;
    -- Initialize Radio1 control...&lt;br /&gt;
    -- Performing register loopback test... pass&lt;br /&gt;
      _____________________________________________________&lt;br /&gt;
     /&lt;br /&gt;
    |       Device: X-Series Device&lt;br /&gt;
    |     _____________________________________________________&lt;br /&gt;
    |    /&lt;br /&gt;
    |   |       Mboard: X300&lt;br /&gt;
    |   |   revision: 7&lt;br /&gt;
    |   |   revision_compat: 7&lt;br /&gt;
    |   |   product: 30518&lt;br /&gt;
    |   |   mac-addr0: ff:ff:ff:ff:ff:ff&lt;br /&gt;
    |   |   mac-addr1: ff:ff:ff:ff:ff:ff&lt;br /&gt;
    |   |   gateway: 255.255.255.255&lt;br /&gt;
    |   |   ip-addr0: 255.255.255.255&lt;br /&gt;
    |   |   subnet0: 255.255.255.255&lt;br /&gt;
    |   |   ip-addr1: 255.255.255.255&lt;br /&gt;
    |   |   subnet1: 255.255.255.255&lt;br /&gt;
    |   |   ip-addr2: 255.255.255.255&lt;br /&gt;
    |   |   subnet2: 255.255.255.255&lt;br /&gt;
    |   |   ip-addr3: 255.255.255.255&lt;br /&gt;
    |   |   subnet3: 255.255.255.255&lt;br /&gt;
    |   |   serial: FFFFFFF&lt;br /&gt;
    |   |   FW Version: 4.0&lt;br /&gt;
    |   |   FPGA Version: 20.0&lt;br /&gt;
    |   |   &lt;br /&gt;
    |   |   Time sources: internal, external, gpsdo&lt;br /&gt;
    |   |   Clock sources: internal, external, gpsdo&lt;br /&gt;
    |   |   Sensors: ref_locked&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       RX DSP: 0&lt;br /&gt;
    |   |   |   Freq range: -100.000 to 100.000 MHz&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       RX DSP: 1&lt;br /&gt;
    |   |   |   Freq range: -100.000 to 100.000 MHz&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       RX Dboard: A&lt;br /&gt;
    |   |   |   ID: SBX (0x0054)&lt;br /&gt;
    |   |   |   Serial: FFFFFF&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       RX Frontend: 0&lt;br /&gt;
    |   |   |   |   Name: SBXv3 RX&lt;br /&gt;
    |   |   |   |   Antennas: TX/RX, RX2, CAL&lt;br /&gt;
    |   |   |   |   Sensors: lo_locked&lt;br /&gt;
    |   |   |   |   Freq range: 400.000 to 4400.000 MHz&lt;br /&gt;
    |   |   |   |   Gain range PGA0: 0.0 to 31.5 step 0.5 dB&lt;br /&gt;
    |   |   |   |   Bandwidth range: 40000000.0 to 40000000.0 step 0.0 Hz&lt;br /&gt;
    |   |   |   |   Connection Type: IQ&lt;br /&gt;
    |   |   |   |   Uses LO offset: No&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       RX Codec: A&lt;br /&gt;
    |   |   |   |   Name: ads62p48&lt;br /&gt;
    |   |   |   |   Gain range digital: 0.0 to 6.0 step 0.5 dB&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       RX Dboard: B&lt;br /&gt;
    |   |   |   ID: SBX (0x0054)&lt;br /&gt;
    |   |   |   Serial: FFFFFF&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       RX Frontend: 0&lt;br /&gt;
    |   |   |   |   Name: SBXv3 RX&lt;br /&gt;
    |   |   |   |   Antennas: TX/RX, RX2, CAL&lt;br /&gt;
    |   |   |   |   Sensors: lo_locked&lt;br /&gt;
    |   |   |   |   Freq range: 400.000 to 4400.000 MHz&lt;br /&gt;
    |   |   |   |   Gain range PGA0: 0.0 to 31.5 step 0.5 dB&lt;br /&gt;
    |   |   |   |   Bandwidth range: 40000000.0 to 40000000.0 step 0.0 Hz&lt;br /&gt;
    |   |   |   |   Connection Type: IQ&lt;br /&gt;
    |   |   |   |   Uses LO offset: No&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       RX Codec: B&lt;br /&gt;
    |   |   |   |   Name: ads62p48&lt;br /&gt;
    |   |   |   |   Gain range digital: 0.0 to 6.0 step 0.5 dB&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       TX DSP: 0&lt;br /&gt;
    |   |   |   Freq range: -100.000 to 100.000 MHz&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       TX DSP: 1&lt;br /&gt;
    |   |   |   Freq range: -100.000 to 100.000 MHz&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       TX Dboard: A&lt;br /&gt;
    |   |   |   ID: SBX (0x0055)&lt;br /&gt;
    |   |   |   Serial: FFFFFF&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       TX Frontend: 0&lt;br /&gt;
    |   |   |   |   Name: SBXv3 TX&lt;br /&gt;
    |   |   |   |   Antennas: TX/RX, CAL&lt;br /&gt;
    |   |   |   |   Sensors: lo_locked&lt;br /&gt;
    |   |   |   |   Freq range: 400.000 to 4400.000 MHz&lt;br /&gt;
    |   |   |   |   Gain range PGA0: 0.0 to 31.5 step 0.5 dB&lt;br /&gt;
    |   |   |   |   Bandwidth range: 40000000.0 to 40000000.0 step 0.0 Hz&lt;br /&gt;
    |   |   |   |   Connection Type: QI&lt;br /&gt;
    |   |   |   |   Uses LO offset: No&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       TX Codec: A&lt;br /&gt;
    |   |   |   |   Name: ad9146&lt;br /&gt;
    |   |   |   |   Gain Elements: None&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       TX Dboard: B&lt;br /&gt;
    |   |   |   ID: SBX (0x0055)&lt;br /&gt;
    |   |   |   Serial: FFFFFF&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       TX Frontend: 0&lt;br /&gt;
    |   |   |   |   Name: SBXv3 TX&lt;br /&gt;
    |   |   |   |   Antennas: TX/RX, CAL&lt;br /&gt;
    |   |   |   |   Sensors: lo_locked&lt;br /&gt;
    |   |   |   |   Freq range: 400.000 to 4400.000 MHz&lt;br /&gt;
    |   |   |   |   Gain range PGA0: 0.0 to 31.5 step 0.5 dB&lt;br /&gt;
    |   |   |   |   Bandwidth range: 40000000.0 to 40000000.0 step 0.0 Hz&lt;br /&gt;
    |   |   |   |   Connection Type: QI&lt;br /&gt;
    |   |   |   |   Uses LO offset: No&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       TX Codec: B&lt;br /&gt;
    |   |   |   |   Name: ad9146&lt;br /&gt;
    |   |   |   |   Gain Elements: None&lt;br /&gt;
&lt;br /&gt;
==UBX daughterboard Installation Video==&lt;br /&gt;
The following link is a video of the steps to install the UBX daughterboard. The procedure is similar to what is outlined above. &lt;br /&gt;
&lt;br /&gt;
*[https://drive.google.com/file/d/1cMMxuV_KZVrc5r-NOwNLI9JoaGM8aUIu/view?usp=sharing Video: UBX Installation into a USRP X-series device.]&lt;br /&gt;
&lt;br /&gt;
==UHD FFT==&lt;br /&gt;
Try the UHD_FFT demo that comes with GNU Radio&lt;br /&gt;
&lt;br /&gt;
1. Connect one antenna to RX2 on the left Daughterboard (Daughterboard A)&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 26.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
2.From the terminal/command window: &lt;br /&gt;
&lt;br /&gt;
    $ uhd_fft --ant RX2&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 27.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 28.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
==Success==&lt;br /&gt;
Congratulations! You have successfully setup and verified your new USRP X300/X310. A more detailed verification guide is at the [[Verifying the Operation of the USRP Using UHD and GNU Radio]] application note. For additional step-by-step guides to using your USRP X300/X310, see the [[Application Notes]] section of the [https://kb.ettus.com Ettus Research Knowledge Base].&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP_X_Series_Quick_Start_(Daughterboard_Installation)&amp;diff=4922</id>
		<title>USRP X Series Quick Start (Daughterboard Installation)</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=USRP_X_Series_Quick_Start_(Daughterboard_Installation)&amp;diff=4922"/>
				<updated>2020-04-28T19:50:12Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* UBX daughterboard Installation Video */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Application Note Number==&lt;br /&gt;
'''AN-904'''&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;
|style=&amp;quot;text-align:center;&amp;quot;| 2020-Apr-27   &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 on installing UBX board in a USRP X Series device to the Additional Resources section. Link [https://drive.google.com/file/d/1cMMxuV_KZVrc5r-NOwNLI9JoaGM8aUIu/view?usp=sharing here] as well&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This application note is a detailed step-by-step guide to install a daughterboard into the USRP X300/X310. &lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
This Quick Start is meant to show you how to put together your new X300/310. We will start at the point when you have yet to unpack the boxes and go all the way to being able to ping the device, performing a quick software probe to verify hardware components and finally running a simple FFT demo. This Quick Start does not cover the installation of software on the host computer. If you have not installed UHD/Gnuradio on your system, please reference 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. You may also use the [[Live SDR Environment]] to perform the verification steps for your USRP. Detailed information on the [[Live SDR Environment]] is available at the [[Live SDR Environment Getting Started Guides]] page.&lt;br /&gt;
&lt;br /&gt;
==Tools Required==&lt;br /&gt;
* Philips Screwdriver&lt;br /&gt;
* 5/16” wrench&lt;br /&gt;
&lt;br /&gt;
==Pre-installed Software==&lt;br /&gt;
* UHD Latest &lt;br /&gt;
* GNU Radio&lt;br /&gt;
&lt;br /&gt;
==Box Contents==&lt;br /&gt;
===USRP Box===&lt;br /&gt;
* 1 x USRP X300/X310&lt;br /&gt;
* 1 x SFP Adapter for 1 GigE&lt;br /&gt;
* 1 x Power Supply and US Cord&lt;br /&gt;
* 1 x USB 2.0 JTAG Debug Cable&lt;br /&gt;
* 1 x Gigabit Ethernet Cable&lt;br /&gt;
* 4 x SMA-Bulkhead Cables&lt;br /&gt;
* 16 x Daughterboard Screws&lt;br /&gt;
===Daughterboard Boxes===&lt;br /&gt;
* 2 x SBX Daughterboards&lt;br /&gt;
===Antenna Boxes===&lt;br /&gt;
* One or more Antennas&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 1.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 2.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
==Proper Care and Handling==&lt;br /&gt;
All Ettus Research products are individually tested before shipment. The USRP™ is guaranteed to be functional at the time it is received by the customer. Improper use or handling of the USRP™ can easily cause the device to become non-functional. Ettus Research recommends you perform the installation with no power to the USRP and using ESD equipment. Listed below are some examples of actions which can prevent damage to the unit:&lt;br /&gt;
&lt;br /&gt;
*Never allow metal objects to touch the circuit board while powered.&lt;br /&gt;
*Always properly terminate the transmit port with an antenna or 50Ω load.&lt;br /&gt;
*Always handle the board with proper anti-static methods.&lt;br /&gt;
*Never allow the board to directly or indirectly come into contact with any voltage spikes.&lt;br /&gt;
*Never allow any water, or condensing moisture, to come into contact with the boards.&lt;br /&gt;
*Always use caution with FPGA, firmware, or software modifications.&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Never apply more than -15 dBm of power into any RF input.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Always use at least 30dB attenuation if operating in loopback configuration&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Installation Process==&lt;br /&gt;
===Step 1===&lt;br /&gt;
Unscrew the 2 screws on the top of the USRP and remove cover. (Lift up about 15 degrees and wiggle back as there&lt;br /&gt;
is a flange on the front part of the cover)&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 3.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 4.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 5.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 2===&lt;br /&gt;
Line up the 8 screw holes on the Daughterboard with the USRP Motherboard standoffs (they only go one way).&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 6.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 7.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 3===&lt;br /&gt;
After you have aligned the Daughterboard correctly you can press the Daughterboard on to the connectors below them (you will feel them snap into place).&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 8.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 9.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 4===&lt;br /&gt;
Put 8 of the screws provided in the daughterboard&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 10.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 5===&lt;br /&gt;
Repeat steps 2- 4 for the second Daughterboard&lt;br /&gt;
&lt;br /&gt;
===Step 6===&lt;br /&gt;
It is recommended to connect the bulkhead cables one at a time to avoid confusion. The Daughterboards and front&lt;br /&gt;
panel of the X300/310 are clearly labeled as to which cable goes where.&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 11.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 12.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 13.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 14.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 15.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 16.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 7===&lt;br /&gt;
Repeat step 6 for the other bulkhead cables&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 17.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 18.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 8===&lt;br /&gt;
Install USRP cover with screws&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 19.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 9===&lt;br /&gt;
Connect the SFP 1 GigE adapter into USRP SFP port 0&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 20.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 21.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 10===&lt;br /&gt;
Connect the Gigabit Ethernet cable and power cord provided&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 22.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 11===&lt;br /&gt;
Attach any Antennas you may have purchased&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 23.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 12===&lt;br /&gt;
On the computer(host) you plan to use to connect to the USRP set the Ethernet adapter to have an IP address of 192.168.10.1 with a subnet mask of 255.255.255.0. Connect the other end of the Gigabit Ethernet cable to your computer.&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 24.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 13===&lt;br /&gt;
Power on the USRP (button on the front right of the USRP)&lt;br /&gt;
&lt;br /&gt;
===Step 14===&lt;br /&gt;
Ping the device from host computer: &lt;br /&gt;
&lt;br /&gt;
    $ ping 192.168.10.2&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 25.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 15===&lt;br /&gt;
Assuming you have properly installed the UHD driver you can now run this command in a terminal/command window:&lt;br /&gt;
&lt;br /&gt;
    $ uhd_usrp_probe&lt;br /&gt;
&lt;br /&gt;
This will tell you about the hardware inside of your USRP. The output will look like the following:&lt;br /&gt;
&lt;br /&gt;
    $ uhd_usrp_probe &lt;br /&gt;
    linux; GNU C++ version 4.8.4; Boost_105400; UHD_003.010.git-202-g9e0861e1&lt;br /&gt;
    &lt;br /&gt;
    -- X300 initialization sequence...&lt;br /&gt;
    -- Determining maximum frame size... 1472 bytes.&lt;br /&gt;
    -- Setup basic communication...&lt;br /&gt;
    -- Loading values from EEPROM...&lt;br /&gt;
    -- Setup RF frontend clocking...&lt;br /&gt;
    -- Radio 1x clock:200&lt;br /&gt;
    -- Detecting internal GPSDO.... No GPSDO found&lt;br /&gt;
    -- Initialize Radio0 control...&lt;br /&gt;
    -- Performing register loopback test... pass&lt;br /&gt;
    -- Initialize Radio1 control...&lt;br /&gt;
    -- Performing register loopback test... pass&lt;br /&gt;
      _____________________________________________________&lt;br /&gt;
     /&lt;br /&gt;
    |       Device: X-Series Device&lt;br /&gt;
    |     _____________________________________________________&lt;br /&gt;
    |    /&lt;br /&gt;
    |   |       Mboard: X300&lt;br /&gt;
    |   |   revision: 7&lt;br /&gt;
    |   |   revision_compat: 7&lt;br /&gt;
    |   |   product: 30518&lt;br /&gt;
    |   |   mac-addr0: ff:ff:ff:ff:ff:ff&lt;br /&gt;
    |   |   mac-addr1: ff:ff:ff:ff:ff:ff&lt;br /&gt;
    |   |   gateway: 255.255.255.255&lt;br /&gt;
    |   |   ip-addr0: 255.255.255.255&lt;br /&gt;
    |   |   subnet0: 255.255.255.255&lt;br /&gt;
    |   |   ip-addr1: 255.255.255.255&lt;br /&gt;
    |   |   subnet1: 255.255.255.255&lt;br /&gt;
    |   |   ip-addr2: 255.255.255.255&lt;br /&gt;
    |   |   subnet2: 255.255.255.255&lt;br /&gt;
    |   |   ip-addr3: 255.255.255.255&lt;br /&gt;
    |   |   subnet3: 255.255.255.255&lt;br /&gt;
    |   |   serial: FFFFFFF&lt;br /&gt;
    |   |   FW Version: 4.0&lt;br /&gt;
    |   |   FPGA Version: 20.0&lt;br /&gt;
    |   |   &lt;br /&gt;
    |   |   Time sources: internal, external, gpsdo&lt;br /&gt;
    |   |   Clock sources: internal, external, gpsdo&lt;br /&gt;
    |   |   Sensors: ref_locked&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       RX DSP: 0&lt;br /&gt;
    |   |   |   Freq range: -100.000 to 100.000 MHz&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       RX DSP: 1&lt;br /&gt;
    |   |   |   Freq range: -100.000 to 100.000 MHz&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       RX Dboard: A&lt;br /&gt;
    |   |   |   ID: SBX (0x0054)&lt;br /&gt;
    |   |   |   Serial: FFFFFF&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       RX Frontend: 0&lt;br /&gt;
    |   |   |   |   Name: SBXv3 RX&lt;br /&gt;
    |   |   |   |   Antennas: TX/RX, RX2, CAL&lt;br /&gt;
    |   |   |   |   Sensors: lo_locked&lt;br /&gt;
    |   |   |   |   Freq range: 400.000 to 4400.000 MHz&lt;br /&gt;
    |   |   |   |   Gain range PGA0: 0.0 to 31.5 step 0.5 dB&lt;br /&gt;
    |   |   |   |   Bandwidth range: 40000000.0 to 40000000.0 step 0.0 Hz&lt;br /&gt;
    |   |   |   |   Connection Type: IQ&lt;br /&gt;
    |   |   |   |   Uses LO offset: No&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       RX Codec: A&lt;br /&gt;
    |   |   |   |   Name: ads62p48&lt;br /&gt;
    |   |   |   |   Gain range digital: 0.0 to 6.0 step 0.5 dB&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       RX Dboard: B&lt;br /&gt;
    |   |   |   ID: SBX (0x0054)&lt;br /&gt;
    |   |   |   Serial: FFFFFF&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       RX Frontend: 0&lt;br /&gt;
    |   |   |   |   Name: SBXv3 RX&lt;br /&gt;
    |   |   |   |   Antennas: TX/RX, RX2, CAL&lt;br /&gt;
    |   |   |   |   Sensors: lo_locked&lt;br /&gt;
    |   |   |   |   Freq range: 400.000 to 4400.000 MHz&lt;br /&gt;
    |   |   |   |   Gain range PGA0: 0.0 to 31.5 step 0.5 dB&lt;br /&gt;
    |   |   |   |   Bandwidth range: 40000000.0 to 40000000.0 step 0.0 Hz&lt;br /&gt;
    |   |   |   |   Connection Type: IQ&lt;br /&gt;
    |   |   |   |   Uses LO offset: No&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       RX Codec: B&lt;br /&gt;
    |   |   |   |   Name: ads62p48&lt;br /&gt;
    |   |   |   |   Gain range digital: 0.0 to 6.0 step 0.5 dB&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       TX DSP: 0&lt;br /&gt;
    |   |   |   Freq range: -100.000 to 100.000 MHz&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       TX DSP: 1&lt;br /&gt;
    |   |   |   Freq range: -100.000 to 100.000 MHz&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       TX Dboard: A&lt;br /&gt;
    |   |   |   ID: SBX (0x0055)&lt;br /&gt;
    |   |   |   Serial: FFFFFF&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       TX Frontend: 0&lt;br /&gt;
    |   |   |   |   Name: SBXv3 TX&lt;br /&gt;
    |   |   |   |   Antennas: TX/RX, CAL&lt;br /&gt;
    |   |   |   |   Sensors: lo_locked&lt;br /&gt;
    |   |   |   |   Freq range: 400.000 to 4400.000 MHz&lt;br /&gt;
    |   |   |   |   Gain range PGA0: 0.0 to 31.5 step 0.5 dB&lt;br /&gt;
    |   |   |   |   Bandwidth range: 40000000.0 to 40000000.0 step 0.0 Hz&lt;br /&gt;
    |   |   |   |   Connection Type: QI&lt;br /&gt;
    |   |   |   |   Uses LO offset: No&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       TX Codec: A&lt;br /&gt;
    |   |   |   |   Name: ad9146&lt;br /&gt;
    |   |   |   |   Gain Elements: None&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       TX Dboard: B&lt;br /&gt;
    |   |   |   ID: SBX (0x0055)&lt;br /&gt;
    |   |   |   Serial: FFFFFF&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       TX Frontend: 0&lt;br /&gt;
    |   |   |   |   Name: SBXv3 TX&lt;br /&gt;
    |   |   |   |   Antennas: TX/RX, CAL&lt;br /&gt;
    |   |   |   |   Sensors: lo_locked&lt;br /&gt;
    |   |   |   |   Freq range: 400.000 to 4400.000 MHz&lt;br /&gt;
    |   |   |   |   Gain range PGA0: 0.0 to 31.5 step 0.5 dB&lt;br /&gt;
    |   |   |   |   Bandwidth range: 40000000.0 to 40000000.0 step 0.0 Hz&lt;br /&gt;
    |   |   |   |   Connection Type: QI&lt;br /&gt;
    |   |   |   |   Uses LO offset: No&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       TX Codec: B&lt;br /&gt;
    |   |   |   |   Name: ad9146&lt;br /&gt;
    |   |   |   |   Gain Elements: None&lt;br /&gt;
&lt;br /&gt;
==UBX daughterboard Installation Video==&lt;br /&gt;
The following link is a video of the steps to install the UBX daughterboard. The procedure is similar to what is outlined above. &lt;br /&gt;
&lt;br /&gt;
*[https://drive.google.com/file/d/1cMMxuV_KZVrc5r-NOwNLI9JoaGM8aUIu/view?usp=sharing Video: UBX Installation into a USRP X-series device.]&lt;br /&gt;
&lt;br /&gt;
==UHD FFT==&lt;br /&gt;
Try the UHD_FFT demo that comes with GNU Radio&lt;br /&gt;
&lt;br /&gt;
1. Connect one antenna to RX2 on the left Daughterboard (Daughterboard A)&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 26.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
2.From the terminal/command window: &lt;br /&gt;
&lt;br /&gt;
    $ uhd_fft --ant RX2&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 27.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 28.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
==Success==&lt;br /&gt;
Congratulations! You have successfully setup and verified your new USRP X300/X310. A more detailed verification guide is at the [[Verifying the Operation of the USRP Using UHD and GNU Radio]] application note. For additional step-by-step guides to using your USRP X300/X310, see the [[Application Notes]] section of the [https://kb.ettus.com Ettus Research Knowledge Base].&lt;br /&gt;
&lt;br /&gt;
==Additional Resources==&lt;br /&gt;
*[https://drive.google.com/file/d/1cMMxuV_KZVrc5r-NOwNLI9JoaGM8aUIu/view?usp=sharing Video link on installing UBX board in a USRP X Series device] &lt;br /&gt;
&lt;br /&gt;
[[Category:Application Notes]]&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP_X_Series_Quick_Start_(Daughterboard_Installation)&amp;diff=4921</id>
		<title>USRP X Series Quick Start (Daughterboard Installation)</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=USRP_X_Series_Quick_Start_(Daughterboard_Installation)&amp;diff=4921"/>
				<updated>2020-04-28T19:48:50Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* UHD FFT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Application Note Number==&lt;br /&gt;
'''AN-904'''&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;
|style=&amp;quot;text-align:center;&amp;quot;| 2020-Apr-27   &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 on installing UBX board in a USRP X Series device to the Additional Resources section. Link [https://drive.google.com/file/d/1cMMxuV_KZVrc5r-NOwNLI9JoaGM8aUIu/view?usp=sharing here] as well&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This application note is a detailed step-by-step guide to install a daughterboard into the USRP X300/X310. &lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
This Quick Start is meant to show you how to put together your new X300/310. We will start at the point when you have yet to unpack the boxes and go all the way to being able to ping the device, performing a quick software probe to verify hardware components and finally running a simple FFT demo. This Quick Start does not cover the installation of software on the host computer. If you have not installed UHD/Gnuradio on your system, please reference 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. You may also use the [[Live SDR Environment]] to perform the verification steps for your USRP. Detailed information on the [[Live SDR Environment]] is available at the [[Live SDR Environment Getting Started Guides]] page.&lt;br /&gt;
&lt;br /&gt;
==Tools Required==&lt;br /&gt;
* Philips Screwdriver&lt;br /&gt;
* 5/16” wrench&lt;br /&gt;
&lt;br /&gt;
==Pre-installed Software==&lt;br /&gt;
* UHD Latest &lt;br /&gt;
* GNU Radio&lt;br /&gt;
&lt;br /&gt;
==Box Contents==&lt;br /&gt;
===USRP Box===&lt;br /&gt;
* 1 x USRP X300/X310&lt;br /&gt;
* 1 x SFP Adapter for 1 GigE&lt;br /&gt;
* 1 x Power Supply and US Cord&lt;br /&gt;
* 1 x USB 2.0 JTAG Debug Cable&lt;br /&gt;
* 1 x Gigabit Ethernet Cable&lt;br /&gt;
* 4 x SMA-Bulkhead Cables&lt;br /&gt;
* 16 x Daughterboard Screws&lt;br /&gt;
===Daughterboard Boxes===&lt;br /&gt;
* 2 x SBX Daughterboards&lt;br /&gt;
===Antenna Boxes===&lt;br /&gt;
* One or more Antennas&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 1.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 2.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
==Proper Care and Handling==&lt;br /&gt;
All Ettus Research products are individually tested before shipment. The USRP™ is guaranteed to be functional at the time it is received by the customer. Improper use or handling of the USRP™ can easily cause the device to become non-functional. Ettus Research recommends you perform the installation with no power to the USRP and using ESD equipment. Listed below are some examples of actions which can prevent damage to the unit:&lt;br /&gt;
&lt;br /&gt;
*Never allow metal objects to touch the circuit board while powered.&lt;br /&gt;
*Always properly terminate the transmit port with an antenna or 50Ω load.&lt;br /&gt;
*Always handle the board with proper anti-static methods.&lt;br /&gt;
*Never allow the board to directly or indirectly come into contact with any voltage spikes.&lt;br /&gt;
*Never allow any water, or condensing moisture, to come into contact with the boards.&lt;br /&gt;
*Always use caution with FPGA, firmware, or software modifications.&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Never apply more than -15 dBm of power into any RF input.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Always use at least 30dB attenuation if operating in loopback configuration&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Installation Process==&lt;br /&gt;
===Step 1===&lt;br /&gt;
Unscrew the 2 screws on the top of the USRP and remove cover. (Lift up about 15 degrees and wiggle back as there&lt;br /&gt;
is a flange on the front part of the cover)&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 3.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 4.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 5.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 2===&lt;br /&gt;
Line up the 8 screw holes on the Daughterboard with the USRP Motherboard standoffs (they only go one way).&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 6.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 7.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 3===&lt;br /&gt;
After you have aligned the Daughterboard correctly you can press the Daughterboard on to the connectors below them (you will feel them snap into place).&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 8.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 9.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 4===&lt;br /&gt;
Put 8 of the screws provided in the daughterboard&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 10.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 5===&lt;br /&gt;
Repeat steps 2- 4 for the second Daughterboard&lt;br /&gt;
&lt;br /&gt;
===Step 6===&lt;br /&gt;
It is recommended to connect the bulkhead cables one at a time to avoid confusion. The Daughterboards and front&lt;br /&gt;
panel of the X300/310 are clearly labeled as to which cable goes where.&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 11.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 12.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 13.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 14.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 15.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 16.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 7===&lt;br /&gt;
Repeat step 6 for the other bulkhead cables&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 17.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 18.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 8===&lt;br /&gt;
Install USRP cover with screws&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 19.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 9===&lt;br /&gt;
Connect the SFP 1 GigE adapter into USRP SFP port 0&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 20.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 21.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 10===&lt;br /&gt;
Connect the Gigabit Ethernet cable and power cord provided&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 22.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 11===&lt;br /&gt;
Attach any Antennas you may have purchased&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 23.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 12===&lt;br /&gt;
On the computer(host) you plan to use to connect to the USRP set the Ethernet adapter to have an IP address of 192.168.10.1 with a subnet mask of 255.255.255.0. Connect the other end of the Gigabit Ethernet cable to your computer.&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 24.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 13===&lt;br /&gt;
Power on the USRP (button on the front right of the USRP)&lt;br /&gt;
&lt;br /&gt;
===Step 14===&lt;br /&gt;
Ping the device from host computer: &lt;br /&gt;
&lt;br /&gt;
    $ ping 192.168.10.2&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 25.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 15===&lt;br /&gt;
Assuming you have properly installed the UHD driver you can now run this command in a terminal/command window:&lt;br /&gt;
&lt;br /&gt;
    $ uhd_usrp_probe&lt;br /&gt;
&lt;br /&gt;
This will tell you about the hardware inside of your USRP. The output will look like the following:&lt;br /&gt;
&lt;br /&gt;
    $ uhd_usrp_probe &lt;br /&gt;
    linux; GNU C++ version 4.8.4; Boost_105400; UHD_003.010.git-202-g9e0861e1&lt;br /&gt;
    &lt;br /&gt;
    -- X300 initialization sequence...&lt;br /&gt;
    -- Determining maximum frame size... 1472 bytes.&lt;br /&gt;
    -- Setup basic communication...&lt;br /&gt;
    -- Loading values from EEPROM...&lt;br /&gt;
    -- Setup RF frontend clocking...&lt;br /&gt;
    -- Radio 1x clock:200&lt;br /&gt;
    -- Detecting internal GPSDO.... No GPSDO found&lt;br /&gt;
    -- Initialize Radio0 control...&lt;br /&gt;
    -- Performing register loopback test... pass&lt;br /&gt;
    -- Initialize Radio1 control...&lt;br /&gt;
    -- Performing register loopback test... pass&lt;br /&gt;
      _____________________________________________________&lt;br /&gt;
     /&lt;br /&gt;
    |       Device: X-Series Device&lt;br /&gt;
    |     _____________________________________________________&lt;br /&gt;
    |    /&lt;br /&gt;
    |   |       Mboard: X300&lt;br /&gt;
    |   |   revision: 7&lt;br /&gt;
    |   |   revision_compat: 7&lt;br /&gt;
    |   |   product: 30518&lt;br /&gt;
    |   |   mac-addr0: ff:ff:ff:ff:ff:ff&lt;br /&gt;
    |   |   mac-addr1: ff:ff:ff:ff:ff:ff&lt;br /&gt;
    |   |   gateway: 255.255.255.255&lt;br /&gt;
    |   |   ip-addr0: 255.255.255.255&lt;br /&gt;
    |   |   subnet0: 255.255.255.255&lt;br /&gt;
    |   |   ip-addr1: 255.255.255.255&lt;br /&gt;
    |   |   subnet1: 255.255.255.255&lt;br /&gt;
    |   |   ip-addr2: 255.255.255.255&lt;br /&gt;
    |   |   subnet2: 255.255.255.255&lt;br /&gt;
    |   |   ip-addr3: 255.255.255.255&lt;br /&gt;
    |   |   subnet3: 255.255.255.255&lt;br /&gt;
    |   |   serial: FFFFFFF&lt;br /&gt;
    |   |   FW Version: 4.0&lt;br /&gt;
    |   |   FPGA Version: 20.0&lt;br /&gt;
    |   |   &lt;br /&gt;
    |   |   Time sources: internal, external, gpsdo&lt;br /&gt;
    |   |   Clock sources: internal, external, gpsdo&lt;br /&gt;
    |   |   Sensors: ref_locked&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       RX DSP: 0&lt;br /&gt;
    |   |   |   Freq range: -100.000 to 100.000 MHz&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       RX DSP: 1&lt;br /&gt;
    |   |   |   Freq range: -100.000 to 100.000 MHz&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       RX Dboard: A&lt;br /&gt;
    |   |   |   ID: SBX (0x0054)&lt;br /&gt;
    |   |   |   Serial: FFFFFF&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       RX Frontend: 0&lt;br /&gt;
    |   |   |   |   Name: SBXv3 RX&lt;br /&gt;
    |   |   |   |   Antennas: TX/RX, RX2, CAL&lt;br /&gt;
    |   |   |   |   Sensors: lo_locked&lt;br /&gt;
    |   |   |   |   Freq range: 400.000 to 4400.000 MHz&lt;br /&gt;
    |   |   |   |   Gain range PGA0: 0.0 to 31.5 step 0.5 dB&lt;br /&gt;
    |   |   |   |   Bandwidth range: 40000000.0 to 40000000.0 step 0.0 Hz&lt;br /&gt;
    |   |   |   |   Connection Type: IQ&lt;br /&gt;
    |   |   |   |   Uses LO offset: No&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       RX Codec: A&lt;br /&gt;
    |   |   |   |   Name: ads62p48&lt;br /&gt;
    |   |   |   |   Gain range digital: 0.0 to 6.0 step 0.5 dB&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       RX Dboard: B&lt;br /&gt;
    |   |   |   ID: SBX (0x0054)&lt;br /&gt;
    |   |   |   Serial: FFFFFF&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       RX Frontend: 0&lt;br /&gt;
    |   |   |   |   Name: SBXv3 RX&lt;br /&gt;
    |   |   |   |   Antennas: TX/RX, RX2, CAL&lt;br /&gt;
    |   |   |   |   Sensors: lo_locked&lt;br /&gt;
    |   |   |   |   Freq range: 400.000 to 4400.000 MHz&lt;br /&gt;
    |   |   |   |   Gain range PGA0: 0.0 to 31.5 step 0.5 dB&lt;br /&gt;
    |   |   |   |   Bandwidth range: 40000000.0 to 40000000.0 step 0.0 Hz&lt;br /&gt;
    |   |   |   |   Connection Type: IQ&lt;br /&gt;
    |   |   |   |   Uses LO offset: No&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       RX Codec: B&lt;br /&gt;
    |   |   |   |   Name: ads62p48&lt;br /&gt;
    |   |   |   |   Gain range digital: 0.0 to 6.0 step 0.5 dB&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       TX DSP: 0&lt;br /&gt;
    |   |   |   Freq range: -100.000 to 100.000 MHz&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       TX DSP: 1&lt;br /&gt;
    |   |   |   Freq range: -100.000 to 100.000 MHz&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       TX Dboard: A&lt;br /&gt;
    |   |   |   ID: SBX (0x0055)&lt;br /&gt;
    |   |   |   Serial: FFFFFF&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       TX Frontend: 0&lt;br /&gt;
    |   |   |   |   Name: SBXv3 TX&lt;br /&gt;
    |   |   |   |   Antennas: TX/RX, CAL&lt;br /&gt;
    |   |   |   |   Sensors: lo_locked&lt;br /&gt;
    |   |   |   |   Freq range: 400.000 to 4400.000 MHz&lt;br /&gt;
    |   |   |   |   Gain range PGA0: 0.0 to 31.5 step 0.5 dB&lt;br /&gt;
    |   |   |   |   Bandwidth range: 40000000.0 to 40000000.0 step 0.0 Hz&lt;br /&gt;
    |   |   |   |   Connection Type: QI&lt;br /&gt;
    |   |   |   |   Uses LO offset: No&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       TX Codec: A&lt;br /&gt;
    |   |   |   |   Name: ad9146&lt;br /&gt;
    |   |   |   |   Gain Elements: None&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       TX Dboard: B&lt;br /&gt;
    |   |   |   ID: SBX (0x0055)&lt;br /&gt;
    |   |   |   Serial: FFFFFF&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       TX Frontend: 0&lt;br /&gt;
    |   |   |   |   Name: SBXv3 TX&lt;br /&gt;
    |   |   |   |   Antennas: TX/RX, CAL&lt;br /&gt;
    |   |   |   |   Sensors: lo_locked&lt;br /&gt;
    |   |   |   |   Freq range: 400.000 to 4400.000 MHz&lt;br /&gt;
    |   |   |   |   Gain range PGA0: 0.0 to 31.5 step 0.5 dB&lt;br /&gt;
    |   |   |   |   Bandwidth range: 40000000.0 to 40000000.0 step 0.0 Hz&lt;br /&gt;
    |   |   |   |   Connection Type: QI&lt;br /&gt;
    |   |   |   |   Uses LO offset: No&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       TX Codec: B&lt;br /&gt;
    |   |   |   |   Name: ad9146&lt;br /&gt;
    |   |   |   |   Gain Elements: None&lt;br /&gt;
&lt;br /&gt;
==UBX daughterboard Installation Video==&lt;br /&gt;
The following link is a video of the steps to install the UBX daughterboard. The procedure is similar to what is outlined above. &lt;br /&gt;
&lt;br /&gt;
UBX Installation into a USRP X-series device.&lt;br /&gt;
&lt;br /&gt;
==UHD FFT==&lt;br /&gt;
Try the UHD_FFT demo that comes with GNU Radio&lt;br /&gt;
&lt;br /&gt;
1. Connect one antenna to RX2 on the left Daughterboard (Daughterboard A)&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 26.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
2.From the terminal/command window: &lt;br /&gt;
&lt;br /&gt;
    $ uhd_fft --ant RX2&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 27.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 28.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
==Success==&lt;br /&gt;
Congratulations! You have successfully setup and verified your new USRP X300/X310. A more detailed verification guide is at the [[Verifying the Operation of the USRP Using UHD and GNU Radio]] application note. For additional step-by-step guides to using your USRP X300/X310, see the [[Application Notes]] section of the [https://kb.ettus.com Ettus Research Knowledge Base].&lt;br /&gt;
&lt;br /&gt;
==Additional Resources==&lt;br /&gt;
*[https://drive.google.com/file/d/1cMMxuV_KZVrc5r-NOwNLI9JoaGM8aUIu/view?usp=sharing Video link on installing UBX board in a USRP X Series device] &lt;br /&gt;
&lt;br /&gt;
[[Category:Application Notes]]&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP_X_Series_Quick_Start_(Daughterboard_Installation)&amp;diff=4920</id>
		<title>USRP X Series Quick Start (Daughterboard Installation)</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=USRP_X_Series_Quick_Start_(Daughterboard_Installation)&amp;diff=4920"/>
				<updated>2020-04-27T23:02:35Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* Success */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Application Note Number==&lt;br /&gt;
'''AN-904'''&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;
|style=&amp;quot;text-align:center;&amp;quot;| 2020-Apr-27   &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 on installing UBX board in a USRP X Series device to the Additional Resources section. Link [https://drive.google.com/file/d/1cMMxuV_KZVrc5r-NOwNLI9JoaGM8aUIu/view?usp=sharing here] as well&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This application note is a detailed step-by-step guide to install a daughterboard into the USRP X300/X310. &lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
This Quick Start is meant to show you how to put together your new X300/310. We will start at the point when you have yet to unpack the boxes and go all the way to being able to ping the device, performing a quick software probe to verify hardware components and finally running a simple FFT demo. This Quick Start does not cover the installation of software on the host computer. If you have not installed UHD/Gnuradio on your system, please reference 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. You may also use the [[Live SDR Environment]] to perform the verification steps for your USRP. Detailed information on the [[Live SDR Environment]] is available at the [[Live SDR Environment Getting Started Guides]] page.&lt;br /&gt;
&lt;br /&gt;
==Tools Required==&lt;br /&gt;
* Philips Screwdriver&lt;br /&gt;
* 5/16” wrench&lt;br /&gt;
&lt;br /&gt;
==Pre-installed Software==&lt;br /&gt;
* UHD Latest &lt;br /&gt;
* GNU Radio&lt;br /&gt;
&lt;br /&gt;
==Box Contents==&lt;br /&gt;
===USRP Box===&lt;br /&gt;
* 1 x USRP X300/X310&lt;br /&gt;
* 1 x SFP Adapter for 1 GigE&lt;br /&gt;
* 1 x Power Supply and US Cord&lt;br /&gt;
* 1 x USB 2.0 JTAG Debug Cable&lt;br /&gt;
* 1 x Gigabit Ethernet Cable&lt;br /&gt;
* 4 x SMA-Bulkhead Cables&lt;br /&gt;
* 16 x Daughterboard Screws&lt;br /&gt;
===Daughterboard Boxes===&lt;br /&gt;
* 2 x SBX Daughterboards&lt;br /&gt;
===Antenna Boxes===&lt;br /&gt;
* One or more Antennas&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 1.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 2.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
==Proper Care and Handling==&lt;br /&gt;
All Ettus Research products are individually tested before shipment. The USRP™ is guaranteed to be functional at the time it is received by the customer. Improper use or handling of the USRP™ can easily cause the device to become non-functional. Ettus Research recommends you perform the installation with no power to the USRP and using ESD equipment. Listed below are some examples of actions which can prevent damage to the unit:&lt;br /&gt;
&lt;br /&gt;
*Never allow metal objects to touch the circuit board while powered.&lt;br /&gt;
*Always properly terminate the transmit port with an antenna or 50Ω load.&lt;br /&gt;
*Always handle the board with proper anti-static methods.&lt;br /&gt;
*Never allow the board to directly or indirectly come into contact with any voltage spikes.&lt;br /&gt;
*Never allow any water, or condensing moisture, to come into contact with the boards.&lt;br /&gt;
*Always use caution with FPGA, firmware, or software modifications.&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Never apply more than -15 dBm of power into any RF input.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Always use at least 30dB attenuation if operating in loopback configuration&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Installation Process==&lt;br /&gt;
===Step 1===&lt;br /&gt;
Unscrew the 2 screws on the top of the USRP and remove cover. (Lift up about 15 degrees and wiggle back as there&lt;br /&gt;
is a flange on the front part of the cover)&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 3.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 4.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 5.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 2===&lt;br /&gt;
Line up the 8 screw holes on the Daughterboard with the USRP Motherboard standoffs (they only go one way).&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 6.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 7.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 3===&lt;br /&gt;
After you have aligned the Daughterboard correctly you can press the Daughterboard on to the connectors below them (you will feel them snap into place).&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 8.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 9.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 4===&lt;br /&gt;
Put 8 of the screws provided in the daughterboard&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 10.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 5===&lt;br /&gt;
Repeat steps 2- 4 for the second Daughterboard&lt;br /&gt;
&lt;br /&gt;
===Step 6===&lt;br /&gt;
It is recommended to connect the bulkhead cables one at a time to avoid confusion. The Daughterboards and front&lt;br /&gt;
panel of the X300/310 are clearly labeled as to which cable goes where.&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 11.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 12.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 13.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 14.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 15.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 16.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 7===&lt;br /&gt;
Repeat step 6 for the other bulkhead cables&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 17.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 18.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 8===&lt;br /&gt;
Install USRP cover with screws&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 19.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 9===&lt;br /&gt;
Connect the SFP 1 GigE adapter into USRP SFP port 0&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 20.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 21.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 10===&lt;br /&gt;
Connect the Gigabit Ethernet cable and power cord provided&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 22.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 11===&lt;br /&gt;
Attach any Antennas you may have purchased&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 23.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 12===&lt;br /&gt;
On the computer(host) you plan to use to connect to the USRP set the Ethernet adapter to have an IP address of 192.168.10.1 with a subnet mask of 255.255.255.0. Connect the other end of the Gigabit Ethernet cable to your computer.&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 24.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 13===&lt;br /&gt;
Power on the USRP (button on the front right of the USRP)&lt;br /&gt;
&lt;br /&gt;
===Step 14===&lt;br /&gt;
Ping the device from host computer: &lt;br /&gt;
&lt;br /&gt;
    $ ping 192.168.10.2&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 25.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 15===&lt;br /&gt;
Assuming you have properly installed the UHD driver you can now run this command in a terminal/command window:&lt;br /&gt;
&lt;br /&gt;
    $ uhd_usrp_probe&lt;br /&gt;
&lt;br /&gt;
This will tell you about the hardware inside of your USRP. The output will look like the following:&lt;br /&gt;
&lt;br /&gt;
    $ uhd_usrp_probe &lt;br /&gt;
    linux; GNU C++ version 4.8.4; Boost_105400; UHD_003.010.git-202-g9e0861e1&lt;br /&gt;
    &lt;br /&gt;
    -- X300 initialization sequence...&lt;br /&gt;
    -- Determining maximum frame size... 1472 bytes.&lt;br /&gt;
    -- Setup basic communication...&lt;br /&gt;
    -- Loading values from EEPROM...&lt;br /&gt;
    -- Setup RF frontend clocking...&lt;br /&gt;
    -- Radio 1x clock:200&lt;br /&gt;
    -- Detecting internal GPSDO.... No GPSDO found&lt;br /&gt;
    -- Initialize Radio0 control...&lt;br /&gt;
    -- Performing register loopback test... pass&lt;br /&gt;
    -- Initialize Radio1 control...&lt;br /&gt;
    -- Performing register loopback test... pass&lt;br /&gt;
      _____________________________________________________&lt;br /&gt;
     /&lt;br /&gt;
    |       Device: X-Series Device&lt;br /&gt;
    |     _____________________________________________________&lt;br /&gt;
    |    /&lt;br /&gt;
    |   |       Mboard: X300&lt;br /&gt;
    |   |   revision: 7&lt;br /&gt;
    |   |   revision_compat: 7&lt;br /&gt;
    |   |   product: 30518&lt;br /&gt;
    |   |   mac-addr0: ff:ff:ff:ff:ff:ff&lt;br /&gt;
    |   |   mac-addr1: ff:ff:ff:ff:ff:ff&lt;br /&gt;
    |   |   gateway: 255.255.255.255&lt;br /&gt;
    |   |   ip-addr0: 255.255.255.255&lt;br /&gt;
    |   |   subnet0: 255.255.255.255&lt;br /&gt;
    |   |   ip-addr1: 255.255.255.255&lt;br /&gt;
    |   |   subnet1: 255.255.255.255&lt;br /&gt;
    |   |   ip-addr2: 255.255.255.255&lt;br /&gt;
    |   |   subnet2: 255.255.255.255&lt;br /&gt;
    |   |   ip-addr3: 255.255.255.255&lt;br /&gt;
    |   |   subnet3: 255.255.255.255&lt;br /&gt;
    |   |   serial: FFFFFFF&lt;br /&gt;
    |   |   FW Version: 4.0&lt;br /&gt;
    |   |   FPGA Version: 20.0&lt;br /&gt;
    |   |   &lt;br /&gt;
    |   |   Time sources: internal, external, gpsdo&lt;br /&gt;
    |   |   Clock sources: internal, external, gpsdo&lt;br /&gt;
    |   |   Sensors: ref_locked&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       RX DSP: 0&lt;br /&gt;
    |   |   |   Freq range: -100.000 to 100.000 MHz&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       RX DSP: 1&lt;br /&gt;
    |   |   |   Freq range: -100.000 to 100.000 MHz&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       RX Dboard: A&lt;br /&gt;
    |   |   |   ID: SBX (0x0054)&lt;br /&gt;
    |   |   |   Serial: FFFFFF&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       RX Frontend: 0&lt;br /&gt;
    |   |   |   |   Name: SBXv3 RX&lt;br /&gt;
    |   |   |   |   Antennas: TX/RX, RX2, CAL&lt;br /&gt;
    |   |   |   |   Sensors: lo_locked&lt;br /&gt;
    |   |   |   |   Freq range: 400.000 to 4400.000 MHz&lt;br /&gt;
    |   |   |   |   Gain range PGA0: 0.0 to 31.5 step 0.5 dB&lt;br /&gt;
    |   |   |   |   Bandwidth range: 40000000.0 to 40000000.0 step 0.0 Hz&lt;br /&gt;
    |   |   |   |   Connection Type: IQ&lt;br /&gt;
    |   |   |   |   Uses LO offset: No&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       RX Codec: A&lt;br /&gt;
    |   |   |   |   Name: ads62p48&lt;br /&gt;
    |   |   |   |   Gain range digital: 0.0 to 6.0 step 0.5 dB&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       RX Dboard: B&lt;br /&gt;
    |   |   |   ID: SBX (0x0054)&lt;br /&gt;
    |   |   |   Serial: FFFFFF&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       RX Frontend: 0&lt;br /&gt;
    |   |   |   |   Name: SBXv3 RX&lt;br /&gt;
    |   |   |   |   Antennas: TX/RX, RX2, CAL&lt;br /&gt;
    |   |   |   |   Sensors: lo_locked&lt;br /&gt;
    |   |   |   |   Freq range: 400.000 to 4400.000 MHz&lt;br /&gt;
    |   |   |   |   Gain range PGA0: 0.0 to 31.5 step 0.5 dB&lt;br /&gt;
    |   |   |   |   Bandwidth range: 40000000.0 to 40000000.0 step 0.0 Hz&lt;br /&gt;
    |   |   |   |   Connection Type: IQ&lt;br /&gt;
    |   |   |   |   Uses LO offset: No&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       RX Codec: B&lt;br /&gt;
    |   |   |   |   Name: ads62p48&lt;br /&gt;
    |   |   |   |   Gain range digital: 0.0 to 6.0 step 0.5 dB&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       TX DSP: 0&lt;br /&gt;
    |   |   |   Freq range: -100.000 to 100.000 MHz&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       TX DSP: 1&lt;br /&gt;
    |   |   |   Freq range: -100.000 to 100.000 MHz&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       TX Dboard: A&lt;br /&gt;
    |   |   |   ID: SBX (0x0055)&lt;br /&gt;
    |   |   |   Serial: FFFFFF&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       TX Frontend: 0&lt;br /&gt;
    |   |   |   |   Name: SBXv3 TX&lt;br /&gt;
    |   |   |   |   Antennas: TX/RX, CAL&lt;br /&gt;
    |   |   |   |   Sensors: lo_locked&lt;br /&gt;
    |   |   |   |   Freq range: 400.000 to 4400.000 MHz&lt;br /&gt;
    |   |   |   |   Gain range PGA0: 0.0 to 31.5 step 0.5 dB&lt;br /&gt;
    |   |   |   |   Bandwidth range: 40000000.0 to 40000000.0 step 0.0 Hz&lt;br /&gt;
    |   |   |   |   Connection Type: QI&lt;br /&gt;
    |   |   |   |   Uses LO offset: No&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       TX Codec: A&lt;br /&gt;
    |   |   |   |   Name: ad9146&lt;br /&gt;
    |   |   |   |   Gain Elements: None&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       TX Dboard: B&lt;br /&gt;
    |   |   |   ID: SBX (0x0055)&lt;br /&gt;
    |   |   |   Serial: FFFFFF&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       TX Frontend: 0&lt;br /&gt;
    |   |   |   |   Name: SBXv3 TX&lt;br /&gt;
    |   |   |   |   Antennas: TX/RX, CAL&lt;br /&gt;
    |   |   |   |   Sensors: lo_locked&lt;br /&gt;
    |   |   |   |   Freq range: 400.000 to 4400.000 MHz&lt;br /&gt;
    |   |   |   |   Gain range PGA0: 0.0 to 31.5 step 0.5 dB&lt;br /&gt;
    |   |   |   |   Bandwidth range: 40000000.0 to 40000000.0 step 0.0 Hz&lt;br /&gt;
    |   |   |   |   Connection Type: QI&lt;br /&gt;
    |   |   |   |   Uses LO offset: No&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       TX Codec: B&lt;br /&gt;
    |   |   |   |   Name: ad9146&lt;br /&gt;
    |   |   |   |   Gain Elements: None&lt;br /&gt;
&lt;br /&gt;
==UHD FFT==&lt;br /&gt;
Try the UHD_FFT demo that comes with GNU Radio&lt;br /&gt;
&lt;br /&gt;
1. Connect one antenna to RX2 on the left Daughterboard (Daughterboard A)&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 26.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
2.From the terminal/command window: &lt;br /&gt;
&lt;br /&gt;
    $ uhd_fft --ant RX2&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 27.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 28.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
==Success==&lt;br /&gt;
Congratulations! You have successfully setup and verified your new USRP X300/X310. A more detailed verification guide is at the [[Verifying the Operation of the USRP Using UHD and GNU Radio]] application note. For additional step-by-step guides to using your USRP X300/X310, see the [[Application Notes]] section of the [https://kb.ettus.com Ettus Research Knowledge Base].&lt;br /&gt;
&lt;br /&gt;
==Additional Resources==&lt;br /&gt;
*[https://drive.google.com/file/d/1cMMxuV_KZVrc5r-NOwNLI9JoaGM8aUIu/view?usp=sharing Video link on installing UBX board in a USRP X Series device] &lt;br /&gt;
&lt;br /&gt;
[[Category:Application Notes]]&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP_X_Series_Quick_Start_(Daughterboard_Installation)&amp;diff=4919</id>
		<title>USRP X Series Quick Start (Daughterboard Installation)</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=USRP_X_Series_Quick_Start_(Daughterboard_Installation)&amp;diff=4919"/>
				<updated>2020-04-27T22:58:55Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* Revision History */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Application Note Number==&lt;br /&gt;
'''AN-904'''&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;
|style=&amp;quot;text-align:center;&amp;quot;| 2020-Apr-27   &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 on installing UBX board in a USRP X Series device to the Additional Resources section. Link [https://drive.google.com/file/d/1cMMxuV_KZVrc5r-NOwNLI9JoaGM8aUIu/view?usp=sharing here] as well&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This application note is a detailed step-by-step guide to install a daughterboard into the USRP X300/X310. &lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
This Quick Start is meant to show you how to put together your new X300/310. We will start at the point when you have yet to unpack the boxes and go all the way to being able to ping the device, performing a quick software probe to verify hardware components and finally running a simple FFT demo. This Quick Start does not cover the installation of software on the host computer. If you have not installed UHD/Gnuradio on your system, please reference 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. You may also use the [[Live SDR Environment]] to perform the verification steps for your USRP. Detailed information on the [[Live SDR Environment]] is available at the [[Live SDR Environment Getting Started Guides]] page.&lt;br /&gt;
&lt;br /&gt;
==Tools Required==&lt;br /&gt;
* Philips Screwdriver&lt;br /&gt;
* 5/16” wrench&lt;br /&gt;
&lt;br /&gt;
==Pre-installed Software==&lt;br /&gt;
* UHD Latest &lt;br /&gt;
* GNU Radio&lt;br /&gt;
&lt;br /&gt;
==Box Contents==&lt;br /&gt;
===USRP Box===&lt;br /&gt;
* 1 x USRP X300/X310&lt;br /&gt;
* 1 x SFP Adapter for 1 GigE&lt;br /&gt;
* 1 x Power Supply and US Cord&lt;br /&gt;
* 1 x USB 2.0 JTAG Debug Cable&lt;br /&gt;
* 1 x Gigabit Ethernet Cable&lt;br /&gt;
* 4 x SMA-Bulkhead Cables&lt;br /&gt;
* 16 x Daughterboard Screws&lt;br /&gt;
===Daughterboard Boxes===&lt;br /&gt;
* 2 x SBX Daughterboards&lt;br /&gt;
===Antenna Boxes===&lt;br /&gt;
* One or more Antennas&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 1.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 2.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
==Proper Care and Handling==&lt;br /&gt;
All Ettus Research products are individually tested before shipment. The USRP™ is guaranteed to be functional at the time it is received by the customer. Improper use or handling of the USRP™ can easily cause the device to become non-functional. Ettus Research recommends you perform the installation with no power to the USRP and using ESD equipment. Listed below are some examples of actions which can prevent damage to the unit:&lt;br /&gt;
&lt;br /&gt;
*Never allow metal objects to touch the circuit board while powered.&lt;br /&gt;
*Always properly terminate the transmit port with an antenna or 50Ω load.&lt;br /&gt;
*Always handle the board with proper anti-static methods.&lt;br /&gt;
*Never allow the board to directly or indirectly come into contact with any voltage spikes.&lt;br /&gt;
*Never allow any water, or condensing moisture, to come into contact with the boards.&lt;br /&gt;
*Always use caution with FPGA, firmware, or software modifications.&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Never apply more than -15 dBm of power into any RF input.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Always use at least 30dB attenuation if operating in loopback configuration&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Installation Process==&lt;br /&gt;
===Step 1===&lt;br /&gt;
Unscrew the 2 screws on the top of the USRP and remove cover. (Lift up about 15 degrees and wiggle back as there&lt;br /&gt;
is a flange on the front part of the cover)&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 3.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 4.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 5.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 2===&lt;br /&gt;
Line up the 8 screw holes on the Daughterboard with the USRP Motherboard standoffs (they only go one way).&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 6.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 7.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 3===&lt;br /&gt;
After you have aligned the Daughterboard correctly you can press the Daughterboard on to the connectors below them (you will feel them snap into place).&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 8.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 9.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 4===&lt;br /&gt;
Put 8 of the screws provided in the daughterboard&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 10.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 5===&lt;br /&gt;
Repeat steps 2- 4 for the second Daughterboard&lt;br /&gt;
&lt;br /&gt;
===Step 6===&lt;br /&gt;
It is recommended to connect the bulkhead cables one at a time to avoid confusion. The Daughterboards and front&lt;br /&gt;
panel of the X300/310 are clearly labeled as to which cable goes where.&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 11.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 12.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 13.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 14.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 15.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 16.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 7===&lt;br /&gt;
Repeat step 6 for the other bulkhead cables&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 17.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 18.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 8===&lt;br /&gt;
Install USRP cover with screws&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 19.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 9===&lt;br /&gt;
Connect the SFP 1 GigE adapter into USRP SFP port 0&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 20.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 21.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 10===&lt;br /&gt;
Connect the Gigabit Ethernet cable and power cord provided&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 22.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 11===&lt;br /&gt;
Attach any Antennas you may have purchased&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 23.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 12===&lt;br /&gt;
On the computer(host) you plan to use to connect to the USRP set the Ethernet adapter to have an IP address of 192.168.10.1 with a subnet mask of 255.255.255.0. Connect the other end of the Gigabit Ethernet cable to your computer.&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 24.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 13===&lt;br /&gt;
Power on the USRP (button on the front right of the USRP)&lt;br /&gt;
&lt;br /&gt;
===Step 14===&lt;br /&gt;
Ping the device from host computer: &lt;br /&gt;
&lt;br /&gt;
    $ ping 192.168.10.2&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 25.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
===Step 15===&lt;br /&gt;
Assuming you have properly installed the UHD driver you can now run this command in a terminal/command window:&lt;br /&gt;
&lt;br /&gt;
    $ uhd_usrp_probe&lt;br /&gt;
&lt;br /&gt;
This will tell you about the hardware inside of your USRP. The output will look like the following:&lt;br /&gt;
&lt;br /&gt;
    $ uhd_usrp_probe &lt;br /&gt;
    linux; GNU C++ version 4.8.4; Boost_105400; UHD_003.010.git-202-g9e0861e1&lt;br /&gt;
    &lt;br /&gt;
    -- X300 initialization sequence...&lt;br /&gt;
    -- Determining maximum frame size... 1472 bytes.&lt;br /&gt;
    -- Setup basic communication...&lt;br /&gt;
    -- Loading values from EEPROM...&lt;br /&gt;
    -- Setup RF frontend clocking...&lt;br /&gt;
    -- Radio 1x clock:200&lt;br /&gt;
    -- Detecting internal GPSDO.... No GPSDO found&lt;br /&gt;
    -- Initialize Radio0 control...&lt;br /&gt;
    -- Performing register loopback test... pass&lt;br /&gt;
    -- Initialize Radio1 control...&lt;br /&gt;
    -- Performing register loopback test... pass&lt;br /&gt;
      _____________________________________________________&lt;br /&gt;
     /&lt;br /&gt;
    |       Device: X-Series Device&lt;br /&gt;
    |     _____________________________________________________&lt;br /&gt;
    |    /&lt;br /&gt;
    |   |       Mboard: X300&lt;br /&gt;
    |   |   revision: 7&lt;br /&gt;
    |   |   revision_compat: 7&lt;br /&gt;
    |   |   product: 30518&lt;br /&gt;
    |   |   mac-addr0: ff:ff:ff:ff:ff:ff&lt;br /&gt;
    |   |   mac-addr1: ff:ff:ff:ff:ff:ff&lt;br /&gt;
    |   |   gateway: 255.255.255.255&lt;br /&gt;
    |   |   ip-addr0: 255.255.255.255&lt;br /&gt;
    |   |   subnet0: 255.255.255.255&lt;br /&gt;
    |   |   ip-addr1: 255.255.255.255&lt;br /&gt;
    |   |   subnet1: 255.255.255.255&lt;br /&gt;
    |   |   ip-addr2: 255.255.255.255&lt;br /&gt;
    |   |   subnet2: 255.255.255.255&lt;br /&gt;
    |   |   ip-addr3: 255.255.255.255&lt;br /&gt;
    |   |   subnet3: 255.255.255.255&lt;br /&gt;
    |   |   serial: FFFFFFF&lt;br /&gt;
    |   |   FW Version: 4.0&lt;br /&gt;
    |   |   FPGA Version: 20.0&lt;br /&gt;
    |   |   &lt;br /&gt;
    |   |   Time sources: internal, external, gpsdo&lt;br /&gt;
    |   |   Clock sources: internal, external, gpsdo&lt;br /&gt;
    |   |   Sensors: ref_locked&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       RX DSP: 0&lt;br /&gt;
    |   |   |   Freq range: -100.000 to 100.000 MHz&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       RX DSP: 1&lt;br /&gt;
    |   |   |   Freq range: -100.000 to 100.000 MHz&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       RX Dboard: A&lt;br /&gt;
    |   |   |   ID: SBX (0x0054)&lt;br /&gt;
    |   |   |   Serial: FFFFFF&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       RX Frontend: 0&lt;br /&gt;
    |   |   |   |   Name: SBXv3 RX&lt;br /&gt;
    |   |   |   |   Antennas: TX/RX, RX2, CAL&lt;br /&gt;
    |   |   |   |   Sensors: lo_locked&lt;br /&gt;
    |   |   |   |   Freq range: 400.000 to 4400.000 MHz&lt;br /&gt;
    |   |   |   |   Gain range PGA0: 0.0 to 31.5 step 0.5 dB&lt;br /&gt;
    |   |   |   |   Bandwidth range: 40000000.0 to 40000000.0 step 0.0 Hz&lt;br /&gt;
    |   |   |   |   Connection Type: IQ&lt;br /&gt;
    |   |   |   |   Uses LO offset: No&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       RX Codec: A&lt;br /&gt;
    |   |   |   |   Name: ads62p48&lt;br /&gt;
    |   |   |   |   Gain range digital: 0.0 to 6.0 step 0.5 dB&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       RX Dboard: B&lt;br /&gt;
    |   |   |   ID: SBX (0x0054)&lt;br /&gt;
    |   |   |   Serial: FFFFFF&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       RX Frontend: 0&lt;br /&gt;
    |   |   |   |   Name: SBXv3 RX&lt;br /&gt;
    |   |   |   |   Antennas: TX/RX, RX2, CAL&lt;br /&gt;
    |   |   |   |   Sensors: lo_locked&lt;br /&gt;
    |   |   |   |   Freq range: 400.000 to 4400.000 MHz&lt;br /&gt;
    |   |   |   |   Gain range PGA0: 0.0 to 31.5 step 0.5 dB&lt;br /&gt;
    |   |   |   |   Bandwidth range: 40000000.0 to 40000000.0 step 0.0 Hz&lt;br /&gt;
    |   |   |   |   Connection Type: IQ&lt;br /&gt;
    |   |   |   |   Uses LO offset: No&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       RX Codec: B&lt;br /&gt;
    |   |   |   |   Name: ads62p48&lt;br /&gt;
    |   |   |   |   Gain range digital: 0.0 to 6.0 step 0.5 dB&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       TX DSP: 0&lt;br /&gt;
    |   |   |   Freq range: -100.000 to 100.000 MHz&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       TX DSP: 1&lt;br /&gt;
    |   |   |   Freq range: -100.000 to 100.000 MHz&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       TX Dboard: A&lt;br /&gt;
    |   |   |   ID: SBX (0x0055)&lt;br /&gt;
    |   |   |   Serial: FFFFFF&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       TX Frontend: 0&lt;br /&gt;
    |   |   |   |   Name: SBXv3 TX&lt;br /&gt;
    |   |   |   |   Antennas: TX/RX, CAL&lt;br /&gt;
    |   |   |   |   Sensors: lo_locked&lt;br /&gt;
    |   |   |   |   Freq range: 400.000 to 4400.000 MHz&lt;br /&gt;
    |   |   |   |   Gain range PGA0: 0.0 to 31.5 step 0.5 dB&lt;br /&gt;
    |   |   |   |   Bandwidth range: 40000000.0 to 40000000.0 step 0.0 Hz&lt;br /&gt;
    |   |   |   |   Connection Type: QI&lt;br /&gt;
    |   |   |   |   Uses LO offset: No&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       TX Codec: A&lt;br /&gt;
    |   |   |   |   Name: ad9146&lt;br /&gt;
    |   |   |   |   Gain Elements: None&lt;br /&gt;
    |   |     _____________________________________________________&lt;br /&gt;
    |   |    /&lt;br /&gt;
    |   |   |       TX Dboard: B&lt;br /&gt;
    |   |   |   ID: SBX (0x0055)&lt;br /&gt;
    |   |   |   Serial: FFFFFF&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       TX Frontend: 0&lt;br /&gt;
    |   |   |   |   Name: SBXv3 TX&lt;br /&gt;
    |   |   |   |   Antennas: TX/RX, CAL&lt;br /&gt;
    |   |   |   |   Sensors: lo_locked&lt;br /&gt;
    |   |   |   |   Freq range: 400.000 to 4400.000 MHz&lt;br /&gt;
    |   |   |   |   Gain range PGA0: 0.0 to 31.5 step 0.5 dB&lt;br /&gt;
    |   |   |   |   Bandwidth range: 40000000.0 to 40000000.0 step 0.0 Hz&lt;br /&gt;
    |   |   |   |   Connection Type: QI&lt;br /&gt;
    |   |   |   |   Uses LO offset: No&lt;br /&gt;
    |   |   |     _____________________________________________________&lt;br /&gt;
    |   |   |    /&lt;br /&gt;
    |   |   |   |       TX Codec: B&lt;br /&gt;
    |   |   |   |   Name: ad9146&lt;br /&gt;
    |   |   |   |   Gain Elements: None&lt;br /&gt;
&lt;br /&gt;
==UHD FFT==&lt;br /&gt;
Try the UHD_FFT demo that comes with GNU Radio&lt;br /&gt;
&lt;br /&gt;
1. Connect one antenna to RX2 on the left Daughterboard (Daughterboard A)&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 26.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
2.From the terminal/command window: &lt;br /&gt;
&lt;br /&gt;
    $ uhd_fft --ant RX2&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 27.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xseries quickstart figure 28.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
==Success==&lt;br /&gt;
Congratulations! You have successfully setup and verified your new USRP X300/X310. A more detailed verification guide is at the [[Verifying the Operation of the USRP Using UHD and GNU Radio]] application note. For additional step-by-step guides to using your USRP X300/X310, see the [[Application Notes]] section of the [https://kb.ettus.com Ettus Research Knowledge Base].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Application Notes]]&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP-2974&amp;diff=4852</id>
		<title>USRP-2974</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=USRP-2974&amp;diff=4852"/>
				<updated>2020-02-25T03:26:41Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* System Block Diagrams */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The NI USRP-2974 is a high-performance, USRP software defined radio (SDR) stand-alone device for designing and deploying next generation wireless communications systems. The hardware architecture combines two extended-bandwidth daughterboard slots covering 10 MHz – 6 GHz with up to 160 MHz of baseband bandwidth, multiple high-speed interface options (PCIe, dual 10 GigE), an onboard Intel Core i7 processor, and a large user-programmable Kintex-7 FPGA in a convenient desktop or rack-mountable half-wide 2U form factor.&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 is the equivalent to a USRP X310 with two UBX-160 boards, a GPSDO and an onboard Intel i7 computer. The USRP-2974 comes with NI Linux RTOS pre-installed, but in order to use it with open-source tool-chain, a user will need to install Linux (preferably Fedora or Ubuntu) and then the USRP Hardware driver (UHD). After these have been installed, any other open-source tools can be installed, such as GNU Radio.&lt;br /&gt;
&lt;br /&gt;
== Key Features of the USRP-2974==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Intel Core i7 6822EQ 2GHz Quad CoreProcessor&lt;br /&gt;
* 16GB DDR4 Memory&lt;br /&gt;
* 512GB SSD&lt;br /&gt;
* USB-to-UART to the CPU&lt;br /&gt;
* Xilinx Kintex-7 XC7K410T FPGA&lt;br /&gt;
* 14 bit 200 MS/s ADC&lt;br /&gt;
* 16 bit 800 MS/s DAC&lt;br /&gt;
* Frequency range: 10 MHz - 6 GHz&lt;br /&gt;
* Up 160MHz&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; bandwidth per channel&lt;br /&gt;
* 2 Transmit ports&lt;br /&gt;
* 2 Receive ports&lt;br /&gt;
* GPSDO&lt;br /&gt;
* Multiple high-speed interfaces (Dual 10G, PCIe Express, 1G)&lt;br /&gt;
|[[File:USRP_2974_frt_dia.jpg|350px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Controller - Onboard computer ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|System on module (SoM) &lt;br /&gt;
|Congatec COM Express conga-TS170&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|CPU&lt;br /&gt;
|Intel Core i7 6822EQ (2 GHz Quad Core)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Memory &lt;br /&gt;
|SO-DIMM DDR4 16 GB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SFP+&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &lt;br /&gt;
|10G ETH connection to the SoM&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Cabled PCIe&lt;br /&gt;
|PCIe Gen 2 x4&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|MicroUSB&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|USB-to-UART to the SoM&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|RJ45&lt;br /&gt;
|1G ETH host connection&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; Can be bypassed to the FPGA.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; Device port for external host.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
==RF Specifications==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Transmitter&lt;br /&gt;
|-&lt;br /&gt;
|Number of channels&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Frequency range&lt;br /&gt;
|10MHz to 6GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency step&lt;br /&gt;
|&amp;lt;1kHz&lt;br /&gt;
|-&lt;br /&gt;
|Maximum output power&lt;br /&gt;
|5mW to 100mW (7dBm to 20dBm)&lt;br /&gt;
|-&lt;br /&gt;
|Gain range&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
|0dB to 31.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Gain step&lt;br /&gt;
|0.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum instantaneous real-time bandwidth&lt;br /&gt;
|160MHz&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Receiver&lt;br /&gt;
|-&lt;br /&gt;
|Number of channels&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Frequency range&lt;br /&gt;
|10MHz to 6GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency step&lt;br /&gt;
|&amp;lt;1kHz&lt;br /&gt;
|-&lt;br /&gt;
|Gain range&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|0dB to 37.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Gain step&lt;br /&gt;
|0.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum input power&lt;br /&gt;
|10dBm&lt;br /&gt;
|-&lt;br /&gt;
|Noise Figure&lt;br /&gt;
|5dB to 7dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum instantaneous real-time bandwidth&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&lt;br /&gt;
|160MHz&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; The output power resulting from the gain setting varies over the frequency band and among&lt;br /&gt;
devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;The received signal amplitude resulting from the gain setting varies over the frequency band and&lt;br /&gt;
among devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;The USRP-2974 receiver path has 84 MHz of bandwidth for center frequencies from 10 MHz to&lt;br /&gt;
500 MHz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' As mentioned earlier, the USRP-2974 incorporates 2 UBX-160 daughterboards. Therefore, for more information on RF performance, please see the [[UBX | UBX hardware resource]] page&lt;br /&gt;
&lt;br /&gt;
==Hardware Specifications==&lt;br /&gt;
===USRP Hardware Driver (UHD) version===&lt;br /&gt;
* Minimum version of UHD required: '''3.14.1.0'''&lt;br /&gt;
&lt;br /&gt;
===Clocking and Sampling Rates===&lt;br /&gt;
There are two master clock rates (MCR) supported on the USRP-2974 like on the X310: 200.0 MHz and 184.32 MHz.&lt;br /&gt;
&lt;br /&gt;
The sampling rate must be an integer decimation rate of the MCR. Ideally, this decimation factor should be an even number. An odd decimation factor will result in additional unwanted attenuation (roll-off from the CIC filter in the DUC and DDC blocks in the FPGA). The valid decimation rates are between 1 and 1024.&lt;br /&gt;
&lt;br /&gt;
For the MCR of 200.0 MHz, the achievable sampling rates using an even decimation factor are 200.0, 100.0, 50.0, 33.33, 25.0, 20.0, 16.67, 14.286 Msps, ... 195.31 Ksps.&lt;br /&gt;
&lt;br /&gt;
For the MCR of 184.32 MHz, the achievable sampling rates using an even decimation factor are 184.32, 92.16, 46.08, 30.72, 23.04, 18.432, 15.36, 13.166 Msps, ... 180.0 Ksps.&lt;br /&gt;
&lt;br /&gt;
If the desired sampling rate is not directly supported by the hardware, then it will be necessary to re-sample in software. This can be done in C++ using libraries such as Liquid DSP [https://github.com/jgaeddert/liquid-dsp], or can be done in GNU Radio, in which there are three blocks that perform sampling rate conversion.&lt;br /&gt;
&lt;br /&gt;
==Physical Specifications==&lt;br /&gt;
&lt;br /&gt;
===Dimensions===&lt;br /&gt;
(L × W × H) 29.08 cm × 21.84 cm × 7.98 cm (11.45 in. × 8.60 in. × 3.14 in. )&lt;br /&gt;
&lt;br /&gt;
===Weight===&lt;br /&gt;
3.34 kg (7.35 lb)&lt;br /&gt;
&lt;br /&gt;
==Power==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|Voltage range&lt;br /&gt;
|14.25 V to 15.75 V DC&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Current&lt;br /&gt;
|10 A, maximum&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Power&lt;br /&gt;
|150 W, maximum&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' Indoor use only&lt;br /&gt;
&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* 0 °C to 50 °C&lt;br /&gt;
&lt;br /&gt;
===Maximum altitude===&lt;br /&gt;
* 2,000 m (800 mbar) (at 25 °C ambient temperature)&lt;br /&gt;
&lt;br /&gt;
===Operating Humidity Range===&lt;br /&gt;
* 10% to 90% non-condensing&lt;br /&gt;
&lt;br /&gt;
===Pollution Degree===&lt;br /&gt;
* 2&lt;br /&gt;
&lt;br /&gt;
==System Diagram and Schematics==&lt;br /&gt;
&lt;br /&gt;
===System Block Diagrams===&lt;br /&gt;
[[file:2974_blk_dia_hiLevel_v01.png | 800px]]&lt;br /&gt;
&amp;lt;center&amp;gt;High Level Block Diagram of the USRP 2974&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:2974_blk_dia.png |800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.ni.com/documentation/en/usrp-software-defined-radio-stand-alone-device/latest/usrp-2974/block-diagram/ Detailed System Block Diagram]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schematics===&lt;br /&gt;
Because the USRP-2974 is a combination of an Intel i7 SOM and an X310 USRP, a user can reference the X310 Schematics.&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/schematics/x300/x3xx.pdf X310 Schematics]&lt;br /&gt;
&lt;br /&gt;
==Key Component Datasheets==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%&amp;quot;&lt;br /&gt;
!Part Number&lt;br /&gt;
!Description&lt;br /&gt;
!Schematic ID (Page)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.congatec.com/fileadmin/user_upload/Documents/Datasheets/conga-TS170.pdf conga-TS170]&lt;br /&gt;
|System on Module (SoM)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.xilinx.com/support/documentation/data_sheets/ds180_7Series_Overview.pdf XC7K410T]&lt;br /&gt;
|FPGA&lt;br /&gt;
|U23 (3,5,8,9,10,18)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/AD9146.PDF AD9146]&lt;br /&gt;
|Dual Channel, 16-Bit, 1230 MSPS DAC&lt;br /&gt;
|U12, U36 (7)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/slas635b/slas635b.pdf ADS62P48]&lt;br /&gt;
|Dual Channel, 14-Bit 210 MSPS ADC&lt;br /&gt;
|U11, U35 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.onsemi.com/pub/Collateral/FIN1002-D.pdf FIN1002]&lt;br /&gt;
|High Speed Differential Receiver&lt;br /&gt;
|U3, U5, U31, U32 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/20001203U.pdf 24LC256T]&lt;br /&gt;
|EEPROM&lt;br /&gt;
|U530 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/lmk04816.pdf LMK04816BISQ/NOPB_1/3]&lt;br /&gt;
|Jitter Cleaner With Dual Loop PLLs&lt;br /&gt;
|U531 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/sy89547l.pdf SY89547LMGTR]&lt;br /&gt;
|Multiplexer&lt;br /&gt;
|U506 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/sn74aup1t17.pdf SN74AUP1T17]&lt;br /&gt;
|Single Schmitt-Trigger Buffer Gate&lt;br /&gt;
|U6, U519 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps54620.pdf TPS54620RGYT]&lt;br /&gt;
|Synchronous Step Down SWIFT™ Converter&lt;br /&gt;
|U515 (21); U516 (26)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/1764fb.pdf LT1764EQ-3.3]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U27 (21); U516 (26)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps7a47.pdf TPS7A47]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U28, U532 (21)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/3603fc.pdf LTC3603EUF_TRPBF]&lt;br /&gt;
|Monolithic Synchronous Step-Down Regulator&lt;br /&gt;
|U517 (23); U500 (25); U514, U513 (27)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/product/TPS77625-EP?keyMatch=TPS77625&amp;amp;tisearch=Search-EN-Everything TPS77625]&lt;br /&gt;
|Low-Dropout Voltage Regulators&lt;br /&gt;
|U30 (23)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps79318-ep.pdf TPS79318_SM]&lt;br /&gt;
|Low-Dropout Voltage Regulators&lt;br /&gt;
|U510 (27)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Media:agile9598503.pdf|OSC-96MHZ-724821-01]]&lt;br /&gt;
|Voltage Controlled Crystal Oscillator&lt;br /&gt;
|U25 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==FPGA and Baseband==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|FPGA &lt;br /&gt;
|Kintex-7 XC7K410T&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|DRAM &lt;br /&gt;
|1 GB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Baseband analog-to-digital converter&lt;br /&gt;
(ADC) resolution&lt;br /&gt;
|14 bit&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Baseband digital-to-analog converter&lt;br /&gt;
(DAC) resolution&lt;br /&gt;
|16 bit&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|ADC spurious-free dynamic range (sFDR)&lt;br /&gt;
|88 dB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|DAC sFDR&lt;br /&gt;
|80 dB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Maximum I/Q sample rate&lt;br /&gt;
|200 MS/s&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SFP+&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &lt;br /&gt;
|High speed serial link to one of the FPGA&lt;br /&gt;
GTX transceivers&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;Can be bypassed to the SoM if using the 10 GbE as protocol.&lt;br /&gt;
&lt;br /&gt;
===FPGA User Modifications===&lt;br /&gt;
&lt;br /&gt;
The Verilog code for the FPGA in the NI USRP-2974 is open-source, and users are free to modify and customize it for their needs. However, certain modifications may result in either bricking the device, or even in physical damage to the unit. Specifically, changing the I/O interface of the FPGA in any way (do not remove any of the I/O for the PCIe interface, such as &amp;lt;code&amp;gt;x300_pcie_int&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;LvFpga_Chinch_Interface&amp;lt;/code&amp;gt;), or modifying the pin and timing constraint files, could result in physical damage to other components on the motherboard, external to the FPGA, and doing this will void the warranty. Also, even if the PCIe interface is not being used, you cannot remove or reassign these pins in the constraint file. The constraint files should not be modified. Please note that modifications to the FPGA are made at the risk of the user, and may not be covered by the warranty of the device.&lt;br /&gt;
&lt;br /&gt;
==Interfaces and Connectivity==&lt;br /&gt;
Follow the links below for additional information on configuring each interface for the USRP-2974.&lt;br /&gt;
&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_10gige Dual 10 Gigabit Ethernet] - 200 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_pcie PCIe Express (Desktop)] - 200 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_1gige 1 Gigabit Ethernet] - 25 MS/s Full Duplex @ 16-bit&lt;br /&gt;
&lt;br /&gt;
===Front Panel===&lt;br /&gt;
&lt;br /&gt;
[[File:USRP-2974 Front Panel.jpg|800px]]&lt;br /&gt;
[[File:2974_frt_wireframe.png|800px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Connector&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''Use'''&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RF 0&lt;br /&gt;
|TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|Input and output terminal for the RF signal. TX1 RX1 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input or output channel.&lt;br /&gt;
|-&lt;br /&gt;
|RX2&lt;br /&gt;
|Input terminal for the RF signal. RX2 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | AUX I/O&lt;br /&gt;
|General-purpose I/O (GPIO) port. AUX I/O is controlled by the FPGA.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RF 1&lt;br /&gt;
|TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|Input and output terminal for the RF signal. TX1 RX1 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input or output channel.&lt;br /&gt;
|-&lt;br /&gt;
|RX2&lt;br /&gt;
|Input terminal for the RF signal. RX2 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | DP&lt;br /&gt;
|DisplayPort connector to connect one monitor for your controller.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | USB2.0&lt;br /&gt;
|USB ports that support common USB peripheral devices such as flash drives, hard drives, keyboards, and mice.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | USB3.0&lt;br /&gt;
|USB ports that support common USB peripheral devices such as flash drives, hard drives, keyboards, and mice.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G ETH&lt;br /&gt;
|RJ45 port used for 1G ETH connectivity to other ethernet devices.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | μUSB&lt;br /&gt;
|USB port used for UART connectivity to the controller.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 0&lt;br /&gt;
|SFP+ port used for 10G ETH connectivity to other ethernet devices. Connects to the embedded Linux computer for communication with LabVIEW RT.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 1&lt;br /&gt;
|SFP+ port used for 1G/10G ETH connectivity to other ethernet devices. Connects to the FPGA. Not currently supported in LabVIEW Communications System Design Suite.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''LED'''&lt;br /&gt;
!'''Description'''&lt;br /&gt;
!'''Color'''&lt;br /&gt;
!'''State'''&lt;br /&gt;
!'''Indication'''&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;5&amp;quot; | RF 0&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates thetransmit status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not active.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is transmitting data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RX2&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the receive status of the device.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot;| REF&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates the status of the reference signal.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no reference signal, or the device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; |Green&lt;br /&gt;
|Blinking&lt;br /&gt;
|The device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| PPS&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the pulse per second (PPS).&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no PPS timing reference signal, or the device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Blinking&lt;br /&gt;
|The device is locked to the PPS timing reference signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| GPS&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates whether the GPSDO is locked.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no GPSDO or the GPSDO is not locked.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The GPSDO is locked.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;5&amp;quot; | RF 1&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates thetransmit status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not active.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is transmitting data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RX2&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the receive status of the device.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| Status&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device initialized successfully and is ready for use.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Blinking&lt;br /&gt;
|Hardware error. An internal power supply has failed. Check front-panel I/O connections for shorts. Remove any shorts and cycle power to the USRP-2974. Contact NI if the problem persists.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| PWR&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the power status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is powered off.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The devices is powered on.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot; | 10/100/1000&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot;| Indicates the speed of the Gigabit Ethernet link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|No link, or 10 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|100 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
|Amber&lt;br /&gt;
|Solid&lt;br /&gt;
|1,000 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot;| ACT/LINK	&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Indicates the Gigabit Ethernet link activity or status.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|No link has been established.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Green&lt;br /&gt;
|Solid&lt;br /&gt;
|A link has been negotiated.&lt;br /&gt;
|-&lt;br /&gt;
|Blinking&lt;br /&gt;
|Activity on the link.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; | 1G/10G ETH 0&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | ACT/LINK&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Indicates the status of the SFP+ port.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The link is down.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The link is up.&lt;br /&gt;
|-&lt;br /&gt;
|Blinking&lt;br /&gt;
|The link is active (transmitting and receiving).&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |10GbE&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Indicates the status of the 10G ETH link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The 10G ETH link is down.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The 10G ETH link is up.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 1 10GbE&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Indicates the status of the 10G ETH link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The 10G ETH link is down.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The 10G ETH link is up.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Rear Panel===&lt;br /&gt;
[[File:USRP-2974 Rear Panel.jpg|800px]]&lt;br /&gt;
[[File:2974_back_wireframe.png|800px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Connector&lt;br /&gt;
!Use&lt;br /&gt;
|-&lt;br /&gt;
|REF OUT&lt;br /&gt;
|Output terminal for an external reference signal for the LO on the device. REF OUT is an SMA (f) connector with an impedance of 50 Ω, and it is a single-ended reference output. The output signal at this connector is 10 MHz at 3.3 V.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|REF IN&lt;br /&gt;
|Input terminal for an external reference signal for the LO on the device. REF IN is an SMA (f) connector with an impedance of 50 Ω, and it is a single-ended reference input. REF IN accepts a 10 MHz signal with a minimum input power of 0 dBm (0.632 Vpk-pk) and a maximum input power of 15 dBm (3.56 Vpk-pk) for a square wave or sine wave.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PPS TRIG OUT	&lt;br /&gt;
|Output terminal for the PPS timing reference. PPS TRIG OUT is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input. The output signal is 0 V to 3.3 V TTL. You can also use this port as a triggered output (TRIG OUT) that you program with the PPS Trig Out I/O signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PPS TRIG IN	&lt;br /&gt;
|Input terminal for PPS timing reference. PPS TRIG IN is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel. PPS TRIG IN accepts 0 V to 3.3 V TTL and 0 V to 5 V TTL signals. You can also use this port as a triggered input (TRIG IN) that you control using NI-USRP software.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|GPS ANT	&lt;br /&gt;
|Input terminal for the GPS antenna signal. GPS ANT is an SMA (f) connector with a maximum input power of -15 dBm and an output of DC 5 V to power an active antenna. &amp;lt;p&amp;gt; '''Notice:''' Do not terminate the GPS ANT port if you do not use it.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PCIe x4	&lt;br /&gt;
|Port for a PCI Express Generation 2, x4 bus connection through an MXI Express four-lane cable. Can be used to connect an external USRP device or external chassis.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SYSTEM POWER IN	&lt;br /&gt;
|Input that accepts a 15 V ± 5%, 10 A external DC power connector.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Ref Clock - 10 MHz===&lt;br /&gt;
Using an external 10 MHz reference clock, a square wave will offer the best phase noise performance, but a sinusoid is acceptable. The power level of the reference clock cannot exceed +15 dBm.&lt;br /&gt;
&lt;br /&gt;
===PPS - Pulse Per Second===&lt;br /&gt;
Using a PPS signal for timestamp synchronization requires a square wave signal with the following a 5Vpp amplitude.&lt;br /&gt;
&lt;br /&gt;
To test the PPS input, you can use the following tool from the UHD examples:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;args&amp;gt;&amp;lt;/code&amp;gt; are device address arguments (optional if only one USRP device is on your machine)&lt;br /&gt;
&lt;br /&gt;
    cd &amp;lt;install-path&amp;gt;/lib/uhd/examples ./test_pps_input –args=&amp;lt;args&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Front Panel GPIO===&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;width:50%&amp;quot; |&lt;br /&gt;
The GPIO port is not meant to drive big loads. You should not try to source more than 5mA per pin.&lt;br /&gt;
&lt;br /&gt;
The +3.3V is for ESD clamping purposes only and not designed to deliver high currents.&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | [[File:x3x0 gpio conn.png]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Power on state====&lt;br /&gt;
The hardware power on state and UHD initial state for the front-panel GPIOs is high-Z. For the X3xx, there are no external pull-ups/pull-downs for the GPIO pins, but the FPGAs do have them and they are configured as follows: X3xx: pull-down.&lt;br /&gt;
&lt;br /&gt;
====Pin Mapping====&lt;br /&gt;
* Pin 1: +3.3V&lt;br /&gt;
* Pin 2: Data[0]&lt;br /&gt;
* Pin 3: Data[1]&lt;br /&gt;
* Pin 4: Data[2]&lt;br /&gt;
* Pin 5: Data[3]&lt;br /&gt;
* Pin 6: Data[4]&lt;br /&gt;
* Pin 7: Data[5]&lt;br /&gt;
* Pin 8: Data[6]&lt;br /&gt;
* Pin 9: Data[7]&lt;br /&gt;
* Pin 10: Data[8]&lt;br /&gt;
* Pin 11: Data[9]&lt;br /&gt;
* Pin 12: Data[10]&lt;br /&gt;
* Pin 13: Data[11]&lt;br /&gt;
* Pin 14: 0V&lt;br /&gt;
* Pin 15: 0V&lt;br /&gt;
&lt;br /&gt;
'''Note''': Please see the [http://files.ettus.com/manual/page_gpio_api.html E3x0/X3x0 GPIO API] for information on configuring and using the GPIO bus.&lt;br /&gt;
&lt;br /&gt;
==Certifications==&lt;br /&gt;
===RoHS===&lt;br /&gt;
As of December 1st, 2010 all NI/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;
[http://files.ettus.com/manual/md_fpga.html FPGA Resources]&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/binaries/uhd_stable/ UHD Stable Binaries]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/EttusResearch/uhd UHD Source Code on Github]&lt;br /&gt;
&lt;br /&gt;
==Choosing an Interface==&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 provides three interface options – 1 Gigabit Ethernet (1 GigE), 10 Gigabit Ethernet (10 GigE), and PCI-Express (PCIe). The PCIe interface is always available regardless of what FPGA image is loaded. Ettus ships two FPGA image variants, the HG or HGS image which has one 1 GigE interfaces and one 10 GigE interfaces, and the XG image which has two 10 GigE interfaces. Generally, Ettus Research recommends using 10 GigE to achieve the maximum throughput available from the USRP-2974.  PCIe is recommended for applications that require the lowest possible latency, which is a desirable characteristic for PHY/MAC research.  If your application does not require the full bandwidth of the USRP-2974, the 1 GigE interface serves as a cost-effective fall-back option.  Ettus Research provides a complete interface kit for each of these options, which is also shown in the following table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|Interface Performance Summary&lt;br /&gt;
|-&lt;br /&gt;
!Interface&lt;br /&gt;
!Throughput (MS/s @ 16-bit)&lt;br /&gt;
!Target&lt;br /&gt;
!Recommended Kit&lt;br /&gt;
|-&lt;br /&gt;
|1 Gigabit&lt;br /&gt;
|25 MS/s&lt;br /&gt;
|Desktop/Laptop&lt;br /&gt;
|[https://www.ettus.com/product/details/1GIGE-KIT SFP Adapter + GigE Cable]&lt;br /&gt;
|-&lt;br /&gt;
|10 Gigabit&lt;br /&gt;
|200 MS/s&lt;br /&gt;
|Desktop&lt;br /&gt;
|[https://www.ettus.com/product/details/10GIGE-KIT 10 GigE Interface Kit]&lt;br /&gt;
|-&lt;br /&gt;
|PCI-Express &lt;br /&gt;
(PCIe, 4 lane)&lt;br /&gt;
|200 MS/S&lt;br /&gt;
|Desktop&lt;br /&gt;
|[https://www.ettus.com/product/details/PCIE-KIT PCI-Express Desktop Kit]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===10 Gigabit Ethernet===&lt;br /&gt;
In order to utilize the dual 10 Gigabit Ethernet interfaces, ensure the XG image is installed ([http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_load_fpga_imgs_fpga_flavours see FPGA Image Flavors]). In addition to burning the prerequisite FPGA image, it may also be necessary to tune the network interface card (NIC) to eliminate drops (Ds) and reduce overflows (Os). This is done by increasing the number of RX descriptors ([http://files.ettus.com/manual/page_transport.html#transport_udp_linux see Linux specific notes]).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;benchmark_rate&amp;lt;/code&amp;gt; tool can be used to test this capability. Run the following commands to test the X-series USRP over both 10 Gigabit Ethernet interfaces with the maximum rate of 200 Msps per channel:&lt;br /&gt;
&lt;br /&gt;
    cd &amp;lt;install-path&amp;gt;/lib/uhd/examples&lt;br /&gt;
    ./benchmark_rate --args=&amp;quot;type=x300,addr=&amp;lt;Primary IP&amp;gt;,second_addr=&amp;lt;secondary IP&amp;gt;&amp;quot; --channels=&amp;quot;0,1&amp;quot; --rx_rate 200e6&lt;br /&gt;
&lt;br /&gt;
The second interface is specified by the extra argument '''second_addr'''.&lt;br /&gt;
&lt;br /&gt;
'''Recommended 10 Gigabit Ethernet Cards'''&lt;br /&gt;
* Intel X520-DA2&lt;br /&gt;
** [http://ark.intel.com/products/39776/Intel-Ethernet-Converged-Network-Adapter-X520-DA2 Intel® Ethernet Converged Network Adapter X520-DA2]&lt;br /&gt;
* Intel X520-DA1&lt;br /&gt;
** [http://ark.intel.com/products/68669/Intel-Ethernet-Converged-Network-Adapter-X520-DA1 Intel® Ethernet Converged Network Adapter X520-DA1 ]&lt;br /&gt;
* Intel X710-DA2&lt;br /&gt;
** [http://ark.intel.com/products/83964/Intel-Ethernet-Converged-Network-Adapter-X710-DA2 Intel® Ethernet Converged Network Adapter X710-DA2 ]&lt;br /&gt;
* Intel X710-DA4&lt;br /&gt;
** [http://ark.intel.com/products/83965/Intel-Ethernet-Converged-Network-Adapter-X710-DA4 Intel® Ethernet Converged Network Adapter X710-DA4 ]&lt;br /&gt;
* Mellanox MCX4121A-ACAT&lt;br /&gt;
** [https://store.mellanox.com/products/mellanox-mcx4121a-acat-connectx-4-lx-en-network-interface-card-25gbe-dual-port-sfp28-pcie3-0-x8-rohs-r6.html Mellanox MCX4121A-ACAT ]&lt;br /&gt;
&lt;br /&gt;
==GPS Disciplined, Oven-Controlled Oscillator (GPSDO)==&lt;br /&gt;
The USRP-2794 has a high-accuracy GPS-disciplined oscillator (GPSDO).  The GPSDO improves the accuracy of the internal frequency reference to 20 ppb, or 0.1 ppb if the GPS is synchronized to the GPS constellation.  When synchronized to the GPS constellation, all USRP™ devices will also be synchronized in time within 50 ns.&lt;br /&gt;
&lt;br /&gt;
* Support GPSDO NMEA Strings&lt;br /&gt;
* [http://www.jackson-labs.com/assets/uploads/main/LC_XO_specsheet.pdf JacksonLabs LC_XO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
!Internal TCXO&lt;br /&gt;
!GPS-Disciplined Clock&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Reference&lt;br /&gt;
|TCXO&lt;br /&gt;
|OCXO&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Accuracy&lt;br /&gt;
|± 2.5ppm&lt;br /&gt;
± 2,500 Hz @ 1 GHz&lt;br /&gt;
|± 25 ppb&lt;br /&gt;
± 25 Hz @ 1 GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Accuracy&lt;br /&gt;
|&lt;br /&gt;
|± 0.01ppb&lt;br /&gt;
|-&lt;br /&gt;
|(GPS-Disciplined)&lt;br /&gt;
|&lt;br /&gt;
|~ ± 0.01 Hz @ 1 GHz&lt;br /&gt;
|-&lt;br /&gt;
|GPS Time Sync Accuracy&lt;br /&gt;
|&lt;br /&gt;
|±50ns to UTC Time**&lt;br /&gt;
|-&lt;br /&gt;
|10 MHz Reference Phase Drift with GPS Sync&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;±20ns After 1 Hour**&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Sensors===&lt;br /&gt;
You can query the lock status with the &amp;lt;code&amp;gt;gps_locked&amp;lt;/code&amp;gt; sensor, as well as obtain raw NMEA sentences using the &amp;lt;code&amp;gt;gps_gprmc&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;gps_gpgga&amp;lt;/code&amp;gt; sensors. Location information can be parsed out of the &amp;lt;code&amp;gt;gps_gpgga&amp;lt;/code&amp;gt; sensor by using &amp;lt;code&amp;gt;gpsd&amp;lt;/code&amp;gt; or another NMEA parser.&lt;br /&gt;
&lt;br /&gt;
==Option: Using the GPIO Expansion Kit==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top; width:60%&amp;quot;|This General Purpose Input/output (GPIO) breakout kit provides access to general purpose digital I/O signals with simple terminal blocks, and a prototyping area where wires and components can be soldered.  Each GPIO pin is connected to an FPGA digital line allowing it to be configured as an input, or an output, using the various software frameworks that support the USRP™ GPIO. &lt;br /&gt;
&lt;br /&gt;
These GPIO signals can serve the following functions:&lt;br /&gt;
&lt;br /&gt;
* Control of external devices, such as power amplifiers and RF switches&lt;br /&gt;
* Provide output signals that can help with debugging&lt;br /&gt;
* Provide observables to be analyzed by oscilloscopes or other external equipment&lt;br /&gt;
* Accept input from external devices for local, software-based triggering&lt;br /&gt;
* Implement a protocol line such as SPI or I2C&lt;br /&gt;
||[[File:Product_x3x0_gpio.jpg|250px]]&lt;br /&gt;
|}&lt;br /&gt;
===GPIO Expansion Kit Contents===&lt;br /&gt;
&lt;br /&gt;
*1 GPIO Breakout Board&lt;br /&gt;
*1 DB-15, 1-meter cable&lt;br /&gt;
*GPIO Quick Reference&lt;br /&gt;
&lt;br /&gt;
===Circuit Protection===&lt;br /&gt;
The GPIO signals exposed with this breakout kit are routed directly to the USRP device's FPGA with limited protection circuitry.  However, the user must take precautionary measures to ensure input/output signals meet the specifications shown in this document.  Over voltage, excess current draw, and other conditions can damage the USRP device and void the warranty. Special care should be taken when the USRP is powered off.&lt;br /&gt;
&lt;br /&gt;
===Mounting the GPIO Breakout Board===&lt;br /&gt;
The GPIO breakout board can be mounted directly to the DB15 connector of a USRP ™ device, or mounted remotely with the cable provided in this kit.  The screws on the DB15 connector of the breakout board must be removed to mount the board directly.  For remote mounting, the breakout board is supplied with rubber standoffs to avoid scratching surfaces, and several through-holes for hard mounting with screws or other hardware (not provided).&lt;br /&gt;
&lt;br /&gt;
===Using GPIO with UHD, GNU Radio, and other Third-Party Frameworks===&lt;br /&gt;
When used with UHD, or other third party frameworks that leverage UHD, the GPIO expansion can be controlled with simple API calls.  For more information, on the C++ API, and examples of how to use the GPIO in frameworks such as GNU Radio, please see the [[Application Notes]] section of the [https://kb.ettus.com Ettus Research Knowledge Base].&lt;br /&gt;
&lt;br /&gt;
===GPIO Specifications (3.3V Bank, LVCMOS)===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Parameter&lt;br /&gt;
!Typical&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Configured as Input&lt;br /&gt;
|-&lt;br /&gt;
|Default Voltage Standard&lt;br /&gt;
|3.3V LVCMOS&lt;br /&gt;
|-&lt;br /&gt;
|Voltage High Threshold&lt;br /&gt;
|2.0V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Low Threshold&lt;br /&gt;
|0.8V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Input Limits (no damage) &lt;br /&gt;
| -0.3V/3.45V&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Configured as Output&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Standard&lt;br /&gt;
|3.3V LVCMOS&lt;br /&gt;
|-&lt;br /&gt;
|Voltage High Output&lt;br /&gt;
|2.8V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Low Output&lt;br /&gt;
|0.4V&lt;br /&gt;
|-&lt;br /&gt;
|Current Source Capability&lt;br /&gt;
|12 mA&lt;br /&gt;
|-&lt;br /&gt;
|Output Source Impedance&lt;br /&gt;
|&amp;gt;33 ohms typical&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Option: Antenna Kit for GPSDO==&lt;br /&gt;
The GPSDO Mini Kit will improve the accuracy of the USRP reference clock, even if it does not receive signals from the GPS Constellation.  However, to achieve the best accuracy possible, and to achieve global timing alignment across multiple USRPs, Ettus Research recommends the GPSDO Mini Antenna Kit.&lt;br /&gt;
&lt;br /&gt;
==Option: Cables for MIMO Expansion==&lt;br /&gt;
Multiple USRP-2974s can be synchronized for coherent operation by sharing a common 10 MHz and 1 PPS signal.  We recommend using a star-distribution topology with an OctoClock or OctoClock-G, as seen in Figure 4.  This requires matched length cables to be used for both 10 MHz and 1 PPS.&lt;br /&gt;
&lt;br /&gt;
For more information about MIMO operation, please see the MIMO and Synchronization Application Note.&lt;br /&gt;
[[File:8mimo.png|700px|center]]&lt;br /&gt;
&amp;lt;center&amp;gt;Figure 4 - Star-Distribution of 10 MHz/PPS Signals with OctoClock&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
&lt;br /&gt;
* '''What is the bandwidth of the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
The ADC rate on each analog RX channel is 200 MS/s quadrature, which provides a theoretical analog bandwidth of approximately 80% of the Nyquist bandwidth of +/- 100 MHz (+/- 80 MHz around the center frequency).  The resulting maximum theoretical analog bandwidth is 160 MHz.&lt;br /&gt;
&lt;br /&gt;
FPGA Processing Bandwidth: Up to 200 MS/s quadrature.&lt;br /&gt;
&lt;br /&gt;
Host Bandwidth:  Up to 200 MS/s quadrature, dependent on selected interface&lt;br /&gt;
&lt;br /&gt;
For more information about achieving the maximum bandwidth with a USRP-2974, please see the &amp;quot;USRP X300/X310 Configuration Guide&amp;quot; or the &amp;quot;USRP System Bandwidth&amp;quot; application note.&lt;br /&gt;
&lt;br /&gt;
* '''How can I program the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
Like all other USRP models, the USRP-2974 is compatible with the USRP Hardware Driver™ (UHD) architecture.  The UHD architecture is a common driver that allows users to develop and execute applications on the onboard or host computer.  UHD provides a direct C++ API to control and stream to/from the USRP-2974.  It also provides compatibility with a variety of third-party software frameworks including GNU Radio, LabVIEW, and MATLAB.  You may also customize the FPGA image provided with UHD to integrate your own signal processing. For more information about UHD, and supported software frameworks, please see:&lt;br /&gt;
&lt;br /&gt;
http://files.ettus.com/manual/&lt;br /&gt;
&lt;br /&gt;
* '''How do I update the FPGA images and firmware with the latest from UHD'''&lt;br /&gt;
&lt;br /&gt;
You can find more information about updating the FPGA image through PCIe, 1/10 GigE, and JTAG [https://kb.ettus.com/X300/X310_Device_Recovery here].&lt;br /&gt;
&lt;br /&gt;
* '''How can I modify the FPGA of the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
The source code (Verilog) for the USRP-2794 is available in the UHD repository. The build process leverages the existing CMAKE build system used to compile the host-side driver.  A Linux-based setup will provide the best results.&lt;br /&gt;
&lt;br /&gt;
Which FPGA toolchain required to build the FPGA images will depend upon your version of UHD. For more details please see the [https://kb.ettus.com/UHD UHD] Software Resource page.&lt;br /&gt;
&lt;br /&gt;
* '''How much free space is available in the USRP-2974 FPGA'''&lt;br /&gt;
&lt;br /&gt;
Please see the [[#Utilization statistics]] section of this resources page for more information.&lt;br /&gt;
&lt;br /&gt;
* '''What frequency range does the USRP-2974 cover'''&lt;br /&gt;
&lt;br /&gt;
10MHz to 6GHz.&lt;br /&gt;
&lt;br /&gt;
* '''What components do I need to purchase for a complete USRP-2974 system'''&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 is a complete stand alone SDR. Additional components might include RF filters, antennas, RF power amplifiers or other RF components needed for a specific application.&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:2974_blk_dia_hiLevel_v01.png&amp;diff=4851</id>
		<title>File:2974 blk dia hiLevel v01.png</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:2974_blk_dia_hiLevel_v01.png&amp;diff=4851"/>
				<updated>2020-02-25T03:24:16Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: USRP-2974 High Level Block Diagram&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;USRP-2974 High Level Block Diagram&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP-2974&amp;diff=4850</id>
		<title>USRP-2974</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=USRP-2974&amp;diff=4850"/>
				<updated>2020-02-25T03:22:56Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* System Block Diagram */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The NI USRP-2974 is a high-performance, USRP software defined radio (SDR) stand-alone device for designing and deploying next generation wireless communications systems. The hardware architecture combines two extended-bandwidth daughterboard slots covering 10 MHz – 6 GHz with up to 160 MHz of baseband bandwidth, multiple high-speed interface options (PCIe, dual 10 GigE), an onboard Intel Core i7 processor, and a large user-programmable Kintex-7 FPGA in a convenient desktop or rack-mountable half-wide 2U form factor.&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 is the equivalent to a USRP X310 with two UBX-160 boards, a GPSDO and an onboard Intel i7 computer. The USRP-2974 comes with NI Linux RTOS pre-installed, but in order to use it with open-source tool-chain, a user will need to install Linux (preferably Fedora or Ubuntu) and then the USRP Hardware driver (UHD). After these have been installed, any other open-source tools can be installed, such as GNU Radio.&lt;br /&gt;
&lt;br /&gt;
== Key Features of the USRP-2974==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Intel Core i7 6822EQ 2GHz Quad CoreProcessor&lt;br /&gt;
* 16GB DDR4 Memory&lt;br /&gt;
* 512GB SSD&lt;br /&gt;
* USB-to-UART to the CPU&lt;br /&gt;
* Xilinx Kintex-7 XC7K410T FPGA&lt;br /&gt;
* 14 bit 200 MS/s ADC&lt;br /&gt;
* 16 bit 800 MS/s DAC&lt;br /&gt;
* Frequency range: 10 MHz - 6 GHz&lt;br /&gt;
* Up 160MHz&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; bandwidth per channel&lt;br /&gt;
* 2 Transmit ports&lt;br /&gt;
* 2 Receive ports&lt;br /&gt;
* GPSDO&lt;br /&gt;
* Multiple high-speed interfaces (Dual 10G, PCIe Express, 1G)&lt;br /&gt;
|[[File:USRP_2974_frt_dia.jpg|350px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Controller - Onboard computer ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|System on module (SoM) &lt;br /&gt;
|Congatec COM Express conga-TS170&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|CPU&lt;br /&gt;
|Intel Core i7 6822EQ (2 GHz Quad Core)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Memory &lt;br /&gt;
|SO-DIMM DDR4 16 GB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SFP+&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &lt;br /&gt;
|10G ETH connection to the SoM&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Cabled PCIe&lt;br /&gt;
|PCIe Gen 2 x4&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|MicroUSB&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|USB-to-UART to the SoM&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|RJ45&lt;br /&gt;
|1G ETH host connection&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; Can be bypassed to the FPGA.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; Device port for external host.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
==RF Specifications==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Transmitter&lt;br /&gt;
|-&lt;br /&gt;
|Number of channels&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Frequency range&lt;br /&gt;
|10MHz to 6GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency step&lt;br /&gt;
|&amp;lt;1kHz&lt;br /&gt;
|-&lt;br /&gt;
|Maximum output power&lt;br /&gt;
|5mW to 100mW (7dBm to 20dBm)&lt;br /&gt;
|-&lt;br /&gt;
|Gain range&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
|0dB to 31.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Gain step&lt;br /&gt;
|0.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum instantaneous real-time bandwidth&lt;br /&gt;
|160MHz&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Receiver&lt;br /&gt;
|-&lt;br /&gt;
|Number of channels&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Frequency range&lt;br /&gt;
|10MHz to 6GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency step&lt;br /&gt;
|&amp;lt;1kHz&lt;br /&gt;
|-&lt;br /&gt;
|Gain range&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|0dB to 37.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Gain step&lt;br /&gt;
|0.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum input power&lt;br /&gt;
|10dBm&lt;br /&gt;
|-&lt;br /&gt;
|Noise Figure&lt;br /&gt;
|5dB to 7dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum instantaneous real-time bandwidth&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&lt;br /&gt;
|160MHz&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; The output power resulting from the gain setting varies over the frequency band and among&lt;br /&gt;
devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;The received signal amplitude resulting from the gain setting varies over the frequency band and&lt;br /&gt;
among devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;The USRP-2974 receiver path has 84 MHz of bandwidth for center frequencies from 10 MHz to&lt;br /&gt;
500 MHz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' As mentioned earlier, the USRP-2974 incorporates 2 UBX-160 daughterboards. Therefore, for more information on RF performance, please see the [[UBX | UBX hardware resource]] page&lt;br /&gt;
&lt;br /&gt;
==Hardware Specifications==&lt;br /&gt;
===USRP Hardware Driver (UHD) version===&lt;br /&gt;
* Minimum version of UHD required: '''3.14.1.0'''&lt;br /&gt;
&lt;br /&gt;
===Clocking and Sampling Rates===&lt;br /&gt;
There are two master clock rates (MCR) supported on the USRP-2974 like on the X310: 200.0 MHz and 184.32 MHz.&lt;br /&gt;
&lt;br /&gt;
The sampling rate must be an integer decimation rate of the MCR. Ideally, this decimation factor should be an even number. An odd decimation factor will result in additional unwanted attenuation (roll-off from the CIC filter in the DUC and DDC blocks in the FPGA). The valid decimation rates are between 1 and 1024.&lt;br /&gt;
&lt;br /&gt;
For the MCR of 200.0 MHz, the achievable sampling rates using an even decimation factor are 200.0, 100.0, 50.0, 33.33, 25.0, 20.0, 16.67, 14.286 Msps, ... 195.31 Ksps.&lt;br /&gt;
&lt;br /&gt;
For the MCR of 184.32 MHz, the achievable sampling rates using an even decimation factor are 184.32, 92.16, 46.08, 30.72, 23.04, 18.432, 15.36, 13.166 Msps, ... 180.0 Ksps.&lt;br /&gt;
&lt;br /&gt;
If the desired sampling rate is not directly supported by the hardware, then it will be necessary to re-sample in software. This can be done in C++ using libraries such as Liquid DSP [https://github.com/jgaeddert/liquid-dsp], or can be done in GNU Radio, in which there are three blocks that perform sampling rate conversion.&lt;br /&gt;
&lt;br /&gt;
==Physical Specifications==&lt;br /&gt;
&lt;br /&gt;
===Dimensions===&lt;br /&gt;
(L × W × H) 29.08 cm × 21.84 cm × 7.98 cm (11.45 in. × 8.60 in. × 3.14 in. )&lt;br /&gt;
&lt;br /&gt;
===Weight===&lt;br /&gt;
3.34 kg (7.35 lb)&lt;br /&gt;
&lt;br /&gt;
==Power==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|Voltage range&lt;br /&gt;
|14.25 V to 15.75 V DC&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Current&lt;br /&gt;
|10 A, maximum&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Power&lt;br /&gt;
|150 W, maximum&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' Indoor use only&lt;br /&gt;
&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* 0 °C to 50 °C&lt;br /&gt;
&lt;br /&gt;
===Maximum altitude===&lt;br /&gt;
* 2,000 m (800 mbar) (at 25 °C ambient temperature)&lt;br /&gt;
&lt;br /&gt;
===Operating Humidity Range===&lt;br /&gt;
* 10% to 90% non-condensing&lt;br /&gt;
&lt;br /&gt;
===Pollution Degree===&lt;br /&gt;
* 2&lt;br /&gt;
&lt;br /&gt;
==System Diagram and Schematics==&lt;br /&gt;
&lt;br /&gt;
===System Block Diagrams===&lt;br /&gt;
[[file:2974_blk_dia.png |800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.ni.com/documentation/en/usrp-software-defined-radio-stand-alone-device/latest/usrp-2974/block-diagram/ Detailed System Block Diagram]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schematics===&lt;br /&gt;
Because the USRP-2974 is a combination of an Intel i7 SOM and an X310 USRP, a user can reference the X310 Schematics.&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/schematics/x300/x3xx.pdf X310 Schematics]&lt;br /&gt;
&lt;br /&gt;
==Key Component Datasheets==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%&amp;quot;&lt;br /&gt;
!Part Number&lt;br /&gt;
!Description&lt;br /&gt;
!Schematic ID (Page)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.congatec.com/fileadmin/user_upload/Documents/Datasheets/conga-TS170.pdf conga-TS170]&lt;br /&gt;
|System on Module (SoM)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.xilinx.com/support/documentation/data_sheets/ds180_7Series_Overview.pdf XC7K410T]&lt;br /&gt;
|FPGA&lt;br /&gt;
|U23 (3,5,8,9,10,18)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/AD9146.PDF AD9146]&lt;br /&gt;
|Dual Channel, 16-Bit, 1230 MSPS DAC&lt;br /&gt;
|U12, U36 (7)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/slas635b/slas635b.pdf ADS62P48]&lt;br /&gt;
|Dual Channel, 14-Bit 210 MSPS ADC&lt;br /&gt;
|U11, U35 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.onsemi.com/pub/Collateral/FIN1002-D.pdf FIN1002]&lt;br /&gt;
|High Speed Differential Receiver&lt;br /&gt;
|U3, U5, U31, U32 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/20001203U.pdf 24LC256T]&lt;br /&gt;
|EEPROM&lt;br /&gt;
|U530 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/lmk04816.pdf LMK04816BISQ/NOPB_1/3]&lt;br /&gt;
|Jitter Cleaner With Dual Loop PLLs&lt;br /&gt;
|U531 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/sy89547l.pdf SY89547LMGTR]&lt;br /&gt;
|Multiplexer&lt;br /&gt;
|U506 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/sn74aup1t17.pdf SN74AUP1T17]&lt;br /&gt;
|Single Schmitt-Trigger Buffer Gate&lt;br /&gt;
|U6, U519 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps54620.pdf TPS54620RGYT]&lt;br /&gt;
|Synchronous Step Down SWIFT™ Converter&lt;br /&gt;
|U515 (21); U516 (26)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/1764fb.pdf LT1764EQ-3.3]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U27 (21); U516 (26)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps7a47.pdf TPS7A47]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U28, U532 (21)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/3603fc.pdf LTC3603EUF_TRPBF]&lt;br /&gt;
|Monolithic Synchronous Step-Down Regulator&lt;br /&gt;
|U517 (23); U500 (25); U514, U513 (27)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/product/TPS77625-EP?keyMatch=TPS77625&amp;amp;tisearch=Search-EN-Everything TPS77625]&lt;br /&gt;
|Low-Dropout Voltage Regulators&lt;br /&gt;
|U30 (23)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps79318-ep.pdf TPS79318_SM]&lt;br /&gt;
|Low-Dropout Voltage Regulators&lt;br /&gt;
|U510 (27)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Media:agile9598503.pdf|OSC-96MHZ-724821-01]]&lt;br /&gt;
|Voltage Controlled Crystal Oscillator&lt;br /&gt;
|U25 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==FPGA and Baseband==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|FPGA &lt;br /&gt;
|Kintex-7 XC7K410T&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|DRAM &lt;br /&gt;
|1 GB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Baseband analog-to-digital converter&lt;br /&gt;
(ADC) resolution&lt;br /&gt;
|14 bit&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Baseband digital-to-analog converter&lt;br /&gt;
(DAC) resolution&lt;br /&gt;
|16 bit&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|ADC spurious-free dynamic range (sFDR)&lt;br /&gt;
|88 dB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|DAC sFDR&lt;br /&gt;
|80 dB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Maximum I/Q sample rate&lt;br /&gt;
|200 MS/s&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SFP+&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &lt;br /&gt;
|High speed serial link to one of the FPGA&lt;br /&gt;
GTX transceivers&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;Can be bypassed to the SoM if using the 10 GbE as protocol.&lt;br /&gt;
&lt;br /&gt;
===FPGA User Modifications===&lt;br /&gt;
&lt;br /&gt;
The Verilog code for the FPGA in the NI USRP-2974 is open-source, and users are free to modify and customize it for their needs. However, certain modifications may result in either bricking the device, or even in physical damage to the unit. Specifically, changing the I/O interface of the FPGA in any way (do not remove any of the I/O for the PCIe interface, such as &amp;lt;code&amp;gt;x300_pcie_int&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;LvFpga_Chinch_Interface&amp;lt;/code&amp;gt;), or modifying the pin and timing constraint files, could result in physical damage to other components on the motherboard, external to the FPGA, and doing this will void the warranty. Also, even if the PCIe interface is not being used, you cannot remove or reassign these pins in the constraint file. The constraint files should not be modified. Please note that modifications to the FPGA are made at the risk of the user, and may not be covered by the warranty of the device.&lt;br /&gt;
&lt;br /&gt;
==Interfaces and Connectivity==&lt;br /&gt;
Follow the links below for additional information on configuring each interface for the USRP-2974.&lt;br /&gt;
&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_10gige Dual 10 Gigabit Ethernet] - 200 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_pcie PCIe Express (Desktop)] - 200 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_1gige 1 Gigabit Ethernet] - 25 MS/s Full Duplex @ 16-bit&lt;br /&gt;
&lt;br /&gt;
===Front Panel===&lt;br /&gt;
&lt;br /&gt;
[[File:USRP-2974 Front Panel.jpg|800px]]&lt;br /&gt;
[[File:2974_frt_wireframe.png|800px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Connector&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''Use'''&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RF 0&lt;br /&gt;
|TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|Input and output terminal for the RF signal. TX1 RX1 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input or output channel.&lt;br /&gt;
|-&lt;br /&gt;
|RX2&lt;br /&gt;
|Input terminal for the RF signal. RX2 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | AUX I/O&lt;br /&gt;
|General-purpose I/O (GPIO) port. AUX I/O is controlled by the FPGA.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RF 1&lt;br /&gt;
|TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|Input and output terminal for the RF signal. TX1 RX1 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input or output channel.&lt;br /&gt;
|-&lt;br /&gt;
|RX2&lt;br /&gt;
|Input terminal for the RF signal. RX2 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | DP&lt;br /&gt;
|DisplayPort connector to connect one monitor for your controller.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | USB2.0&lt;br /&gt;
|USB ports that support common USB peripheral devices such as flash drives, hard drives, keyboards, and mice.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | USB3.0&lt;br /&gt;
|USB ports that support common USB peripheral devices such as flash drives, hard drives, keyboards, and mice.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G ETH&lt;br /&gt;
|RJ45 port used for 1G ETH connectivity to other ethernet devices.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | μUSB&lt;br /&gt;
|USB port used for UART connectivity to the controller.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 0&lt;br /&gt;
|SFP+ port used for 10G ETH connectivity to other ethernet devices. Connects to the embedded Linux computer for communication with LabVIEW RT.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 1&lt;br /&gt;
|SFP+ port used for 1G/10G ETH connectivity to other ethernet devices. Connects to the FPGA. Not currently supported in LabVIEW Communications System Design Suite.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''LED'''&lt;br /&gt;
!'''Description'''&lt;br /&gt;
!'''Color'''&lt;br /&gt;
!'''State'''&lt;br /&gt;
!'''Indication'''&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;5&amp;quot; | RF 0&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates thetransmit status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not active.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is transmitting data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RX2&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the receive status of the device.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot;| REF&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates the status of the reference signal.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no reference signal, or the device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; |Green&lt;br /&gt;
|Blinking&lt;br /&gt;
|The device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| PPS&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the pulse per second (PPS).&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no PPS timing reference signal, or the device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Blinking&lt;br /&gt;
|The device is locked to the PPS timing reference signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| GPS&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates whether the GPSDO is locked.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no GPSDO or the GPSDO is not locked.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The GPSDO is locked.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;5&amp;quot; | RF 1&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates thetransmit status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not active.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is transmitting data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RX2&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the receive status of the device.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| Status&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device initialized successfully and is ready for use.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Blinking&lt;br /&gt;
|Hardware error. An internal power supply has failed. Check front-panel I/O connections for shorts. Remove any shorts and cycle power to the USRP-2974. Contact NI if the problem persists.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| PWR&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the power status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is powered off.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The devices is powered on.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot; | 10/100/1000&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot;| Indicates the speed of the Gigabit Ethernet link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|No link, or 10 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|100 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
|Amber&lt;br /&gt;
|Solid&lt;br /&gt;
|1,000 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot;| ACT/LINK	&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Indicates the Gigabit Ethernet link activity or status.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|No link has been established.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Green&lt;br /&gt;
|Solid&lt;br /&gt;
|A link has been negotiated.&lt;br /&gt;
|-&lt;br /&gt;
|Blinking&lt;br /&gt;
|Activity on the link.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; | 1G/10G ETH 0&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | ACT/LINK&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Indicates the status of the SFP+ port.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The link is down.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The link is up.&lt;br /&gt;
|-&lt;br /&gt;
|Blinking&lt;br /&gt;
|The link is active (transmitting and receiving).&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |10GbE&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Indicates the status of the 10G ETH link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The 10G ETH link is down.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The 10G ETH link is up.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 1 10GbE&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Indicates the status of the 10G ETH link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The 10G ETH link is down.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The 10G ETH link is up.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Rear Panel===&lt;br /&gt;
[[File:USRP-2974 Rear Panel.jpg|800px]]&lt;br /&gt;
[[File:2974_back_wireframe.png|800px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Connector&lt;br /&gt;
!Use&lt;br /&gt;
|-&lt;br /&gt;
|REF OUT&lt;br /&gt;
|Output terminal for an external reference signal for the LO on the device. REF OUT is an SMA (f) connector with an impedance of 50 Ω, and it is a single-ended reference output. The output signal at this connector is 10 MHz at 3.3 V.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|REF IN&lt;br /&gt;
|Input terminal for an external reference signal for the LO on the device. REF IN is an SMA (f) connector with an impedance of 50 Ω, and it is a single-ended reference input. REF IN accepts a 10 MHz signal with a minimum input power of 0 dBm (0.632 Vpk-pk) and a maximum input power of 15 dBm (3.56 Vpk-pk) for a square wave or sine wave.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PPS TRIG OUT	&lt;br /&gt;
|Output terminal for the PPS timing reference. PPS TRIG OUT is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input. The output signal is 0 V to 3.3 V TTL. You can also use this port as a triggered output (TRIG OUT) that you program with the PPS Trig Out I/O signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PPS TRIG IN	&lt;br /&gt;
|Input terminal for PPS timing reference. PPS TRIG IN is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel. PPS TRIG IN accepts 0 V to 3.3 V TTL and 0 V to 5 V TTL signals. You can also use this port as a triggered input (TRIG IN) that you control using NI-USRP software.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|GPS ANT	&lt;br /&gt;
|Input terminal for the GPS antenna signal. GPS ANT is an SMA (f) connector with a maximum input power of -15 dBm and an output of DC 5 V to power an active antenna. &amp;lt;p&amp;gt; '''Notice:''' Do not terminate the GPS ANT port if you do not use it.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PCIe x4	&lt;br /&gt;
|Port for a PCI Express Generation 2, x4 bus connection through an MXI Express four-lane cable. Can be used to connect an external USRP device or external chassis.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SYSTEM POWER IN	&lt;br /&gt;
|Input that accepts a 15 V ± 5%, 10 A external DC power connector.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Ref Clock - 10 MHz===&lt;br /&gt;
Using an external 10 MHz reference clock, a square wave will offer the best phase noise performance, but a sinusoid is acceptable. The power level of the reference clock cannot exceed +15 dBm.&lt;br /&gt;
&lt;br /&gt;
===PPS - Pulse Per Second===&lt;br /&gt;
Using a PPS signal for timestamp synchronization requires a square wave signal with the following a 5Vpp amplitude.&lt;br /&gt;
&lt;br /&gt;
To test the PPS input, you can use the following tool from the UHD examples:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;args&amp;gt;&amp;lt;/code&amp;gt; are device address arguments (optional if only one USRP device is on your machine)&lt;br /&gt;
&lt;br /&gt;
    cd &amp;lt;install-path&amp;gt;/lib/uhd/examples ./test_pps_input –args=&amp;lt;args&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Front Panel GPIO===&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;width:50%&amp;quot; |&lt;br /&gt;
The GPIO port is not meant to drive big loads. You should not try to source more than 5mA per pin.&lt;br /&gt;
&lt;br /&gt;
The +3.3V is for ESD clamping purposes only and not designed to deliver high currents.&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | [[File:x3x0 gpio conn.png]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Power on state====&lt;br /&gt;
The hardware power on state and UHD initial state for the front-panel GPIOs is high-Z. For the X3xx, there are no external pull-ups/pull-downs for the GPIO pins, but the FPGAs do have them and they are configured as follows: X3xx: pull-down.&lt;br /&gt;
&lt;br /&gt;
====Pin Mapping====&lt;br /&gt;
* Pin 1: +3.3V&lt;br /&gt;
* Pin 2: Data[0]&lt;br /&gt;
* Pin 3: Data[1]&lt;br /&gt;
* Pin 4: Data[2]&lt;br /&gt;
* Pin 5: Data[3]&lt;br /&gt;
* Pin 6: Data[4]&lt;br /&gt;
* Pin 7: Data[5]&lt;br /&gt;
* Pin 8: Data[6]&lt;br /&gt;
* Pin 9: Data[7]&lt;br /&gt;
* Pin 10: Data[8]&lt;br /&gt;
* Pin 11: Data[9]&lt;br /&gt;
* Pin 12: Data[10]&lt;br /&gt;
* Pin 13: Data[11]&lt;br /&gt;
* Pin 14: 0V&lt;br /&gt;
* Pin 15: 0V&lt;br /&gt;
&lt;br /&gt;
'''Note''': Please see the [http://files.ettus.com/manual/page_gpio_api.html E3x0/X3x0 GPIO API] for information on configuring and using the GPIO bus.&lt;br /&gt;
&lt;br /&gt;
==Certifications==&lt;br /&gt;
===RoHS===&lt;br /&gt;
As of December 1st, 2010 all NI/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;
[http://files.ettus.com/manual/md_fpga.html FPGA Resources]&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/binaries/uhd_stable/ UHD Stable Binaries]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/EttusResearch/uhd UHD Source Code on Github]&lt;br /&gt;
&lt;br /&gt;
==Choosing an Interface==&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 provides three interface options – 1 Gigabit Ethernet (1 GigE), 10 Gigabit Ethernet (10 GigE), and PCI-Express (PCIe). The PCIe interface is always available regardless of what FPGA image is loaded. Ettus ships two FPGA image variants, the HG or HGS image which has one 1 GigE interfaces and one 10 GigE interfaces, and the XG image which has two 10 GigE interfaces. Generally, Ettus Research recommends using 10 GigE to achieve the maximum throughput available from the USRP-2974.  PCIe is recommended for applications that require the lowest possible latency, which is a desirable characteristic for PHY/MAC research.  If your application does not require the full bandwidth of the USRP-2974, the 1 GigE interface serves as a cost-effective fall-back option.  Ettus Research provides a complete interface kit for each of these options, which is also shown in the following table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|Interface Performance Summary&lt;br /&gt;
|-&lt;br /&gt;
!Interface&lt;br /&gt;
!Throughput (MS/s @ 16-bit)&lt;br /&gt;
!Target&lt;br /&gt;
!Recommended Kit&lt;br /&gt;
|-&lt;br /&gt;
|1 Gigabit&lt;br /&gt;
|25 MS/s&lt;br /&gt;
|Desktop/Laptop&lt;br /&gt;
|[https://www.ettus.com/product/details/1GIGE-KIT SFP Adapter + GigE Cable]&lt;br /&gt;
|-&lt;br /&gt;
|10 Gigabit&lt;br /&gt;
|200 MS/s&lt;br /&gt;
|Desktop&lt;br /&gt;
|[https://www.ettus.com/product/details/10GIGE-KIT 10 GigE Interface Kit]&lt;br /&gt;
|-&lt;br /&gt;
|PCI-Express &lt;br /&gt;
(PCIe, 4 lane)&lt;br /&gt;
|200 MS/S&lt;br /&gt;
|Desktop&lt;br /&gt;
|[https://www.ettus.com/product/details/PCIE-KIT PCI-Express Desktop Kit]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===10 Gigabit Ethernet===&lt;br /&gt;
In order to utilize the dual 10 Gigabit Ethernet interfaces, ensure the XG image is installed ([http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_load_fpga_imgs_fpga_flavours see FPGA Image Flavors]). In addition to burning the prerequisite FPGA image, it may also be necessary to tune the network interface card (NIC) to eliminate drops (Ds) and reduce overflows (Os). This is done by increasing the number of RX descriptors ([http://files.ettus.com/manual/page_transport.html#transport_udp_linux see Linux specific notes]).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;benchmark_rate&amp;lt;/code&amp;gt; tool can be used to test this capability. Run the following commands to test the X-series USRP over both 10 Gigabit Ethernet interfaces with the maximum rate of 200 Msps per channel:&lt;br /&gt;
&lt;br /&gt;
    cd &amp;lt;install-path&amp;gt;/lib/uhd/examples&lt;br /&gt;
    ./benchmark_rate --args=&amp;quot;type=x300,addr=&amp;lt;Primary IP&amp;gt;,second_addr=&amp;lt;secondary IP&amp;gt;&amp;quot; --channels=&amp;quot;0,1&amp;quot; --rx_rate 200e6&lt;br /&gt;
&lt;br /&gt;
The second interface is specified by the extra argument '''second_addr'''.&lt;br /&gt;
&lt;br /&gt;
'''Recommended 10 Gigabit Ethernet Cards'''&lt;br /&gt;
* Intel X520-DA2&lt;br /&gt;
** [http://ark.intel.com/products/39776/Intel-Ethernet-Converged-Network-Adapter-X520-DA2 Intel® Ethernet Converged Network Adapter X520-DA2]&lt;br /&gt;
* Intel X520-DA1&lt;br /&gt;
** [http://ark.intel.com/products/68669/Intel-Ethernet-Converged-Network-Adapter-X520-DA1 Intel® Ethernet Converged Network Adapter X520-DA1 ]&lt;br /&gt;
* Intel X710-DA2&lt;br /&gt;
** [http://ark.intel.com/products/83964/Intel-Ethernet-Converged-Network-Adapter-X710-DA2 Intel® Ethernet Converged Network Adapter X710-DA2 ]&lt;br /&gt;
* Intel X710-DA4&lt;br /&gt;
** [http://ark.intel.com/products/83965/Intel-Ethernet-Converged-Network-Adapter-X710-DA4 Intel® Ethernet Converged Network Adapter X710-DA4 ]&lt;br /&gt;
* Mellanox MCX4121A-ACAT&lt;br /&gt;
** [https://store.mellanox.com/products/mellanox-mcx4121a-acat-connectx-4-lx-en-network-interface-card-25gbe-dual-port-sfp28-pcie3-0-x8-rohs-r6.html Mellanox MCX4121A-ACAT ]&lt;br /&gt;
&lt;br /&gt;
==GPS Disciplined, Oven-Controlled Oscillator (GPSDO)==&lt;br /&gt;
The USRP-2794 has a high-accuracy GPS-disciplined oscillator (GPSDO).  The GPSDO improves the accuracy of the internal frequency reference to 20 ppb, or 0.1 ppb if the GPS is synchronized to the GPS constellation.  When synchronized to the GPS constellation, all USRP™ devices will also be synchronized in time within 50 ns.&lt;br /&gt;
&lt;br /&gt;
* Support GPSDO NMEA Strings&lt;br /&gt;
* [http://www.jackson-labs.com/assets/uploads/main/LC_XO_specsheet.pdf JacksonLabs LC_XO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
!Internal TCXO&lt;br /&gt;
!GPS-Disciplined Clock&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Reference&lt;br /&gt;
|TCXO&lt;br /&gt;
|OCXO&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Accuracy&lt;br /&gt;
|± 2.5ppm&lt;br /&gt;
± 2,500 Hz @ 1 GHz&lt;br /&gt;
|± 25 ppb&lt;br /&gt;
± 25 Hz @ 1 GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Accuracy&lt;br /&gt;
|&lt;br /&gt;
|± 0.01ppb&lt;br /&gt;
|-&lt;br /&gt;
|(GPS-Disciplined)&lt;br /&gt;
|&lt;br /&gt;
|~ ± 0.01 Hz @ 1 GHz&lt;br /&gt;
|-&lt;br /&gt;
|GPS Time Sync Accuracy&lt;br /&gt;
|&lt;br /&gt;
|±50ns to UTC Time**&lt;br /&gt;
|-&lt;br /&gt;
|10 MHz Reference Phase Drift with GPS Sync&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;±20ns After 1 Hour**&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Sensors===&lt;br /&gt;
You can query the lock status with the &amp;lt;code&amp;gt;gps_locked&amp;lt;/code&amp;gt; sensor, as well as obtain raw NMEA sentences using the &amp;lt;code&amp;gt;gps_gprmc&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;gps_gpgga&amp;lt;/code&amp;gt; sensors. Location information can be parsed out of the &amp;lt;code&amp;gt;gps_gpgga&amp;lt;/code&amp;gt; sensor by using &amp;lt;code&amp;gt;gpsd&amp;lt;/code&amp;gt; or another NMEA parser.&lt;br /&gt;
&lt;br /&gt;
==Option: Using the GPIO Expansion Kit==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top; width:60%&amp;quot;|This General Purpose Input/output (GPIO) breakout kit provides access to general purpose digital I/O signals with simple terminal blocks, and a prototyping area where wires and components can be soldered.  Each GPIO pin is connected to an FPGA digital line allowing it to be configured as an input, or an output, using the various software frameworks that support the USRP™ GPIO. &lt;br /&gt;
&lt;br /&gt;
These GPIO signals can serve the following functions:&lt;br /&gt;
&lt;br /&gt;
* Control of external devices, such as power amplifiers and RF switches&lt;br /&gt;
* Provide output signals that can help with debugging&lt;br /&gt;
* Provide observables to be analyzed by oscilloscopes or other external equipment&lt;br /&gt;
* Accept input from external devices for local, software-based triggering&lt;br /&gt;
* Implement a protocol line such as SPI or I2C&lt;br /&gt;
||[[File:Product_x3x0_gpio.jpg|250px]]&lt;br /&gt;
|}&lt;br /&gt;
===GPIO Expansion Kit Contents===&lt;br /&gt;
&lt;br /&gt;
*1 GPIO Breakout Board&lt;br /&gt;
*1 DB-15, 1-meter cable&lt;br /&gt;
*GPIO Quick Reference&lt;br /&gt;
&lt;br /&gt;
===Circuit Protection===&lt;br /&gt;
The GPIO signals exposed with this breakout kit are routed directly to the USRP device's FPGA with limited protection circuitry.  However, the user must take precautionary measures to ensure input/output signals meet the specifications shown in this document.  Over voltage, excess current draw, and other conditions can damage the USRP device and void the warranty. Special care should be taken when the USRP is powered off.&lt;br /&gt;
&lt;br /&gt;
===Mounting the GPIO Breakout Board===&lt;br /&gt;
The GPIO breakout board can be mounted directly to the DB15 connector of a USRP ™ device, or mounted remotely with the cable provided in this kit.  The screws on the DB15 connector of the breakout board must be removed to mount the board directly.  For remote mounting, the breakout board is supplied with rubber standoffs to avoid scratching surfaces, and several through-holes for hard mounting with screws or other hardware (not provided).&lt;br /&gt;
&lt;br /&gt;
===Using GPIO with UHD, GNU Radio, and other Third-Party Frameworks===&lt;br /&gt;
When used with UHD, or other third party frameworks that leverage UHD, the GPIO expansion can be controlled with simple API calls.  For more information, on the C++ API, and examples of how to use the GPIO in frameworks such as GNU Radio, please see the [[Application Notes]] section of the [https://kb.ettus.com Ettus Research Knowledge Base].&lt;br /&gt;
&lt;br /&gt;
===GPIO Specifications (3.3V Bank, LVCMOS)===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Parameter&lt;br /&gt;
!Typical&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Configured as Input&lt;br /&gt;
|-&lt;br /&gt;
|Default Voltage Standard&lt;br /&gt;
|3.3V LVCMOS&lt;br /&gt;
|-&lt;br /&gt;
|Voltage High Threshold&lt;br /&gt;
|2.0V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Low Threshold&lt;br /&gt;
|0.8V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Input Limits (no damage) &lt;br /&gt;
| -0.3V/3.45V&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Configured as Output&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Standard&lt;br /&gt;
|3.3V LVCMOS&lt;br /&gt;
|-&lt;br /&gt;
|Voltage High Output&lt;br /&gt;
|2.8V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Low Output&lt;br /&gt;
|0.4V&lt;br /&gt;
|-&lt;br /&gt;
|Current Source Capability&lt;br /&gt;
|12 mA&lt;br /&gt;
|-&lt;br /&gt;
|Output Source Impedance&lt;br /&gt;
|&amp;gt;33 ohms typical&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Option: Antenna Kit for GPSDO==&lt;br /&gt;
The GPSDO Mini Kit will improve the accuracy of the USRP reference clock, even if it does not receive signals from the GPS Constellation.  However, to achieve the best accuracy possible, and to achieve global timing alignment across multiple USRPs, Ettus Research recommends the GPSDO Mini Antenna Kit.&lt;br /&gt;
&lt;br /&gt;
==Option: Cables for MIMO Expansion==&lt;br /&gt;
Multiple USRP-2974s can be synchronized for coherent operation by sharing a common 10 MHz and 1 PPS signal.  We recommend using a star-distribution topology with an OctoClock or OctoClock-G, as seen in Figure 4.  This requires matched length cables to be used for both 10 MHz and 1 PPS.&lt;br /&gt;
&lt;br /&gt;
For more information about MIMO operation, please see the MIMO and Synchronization Application Note.&lt;br /&gt;
[[File:8mimo.png|700px|center]]&lt;br /&gt;
&amp;lt;center&amp;gt;Figure 4 - Star-Distribution of 10 MHz/PPS Signals with OctoClock&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
&lt;br /&gt;
* '''What is the bandwidth of the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
The ADC rate on each analog RX channel is 200 MS/s quadrature, which provides a theoretical analog bandwidth of approximately 80% of the Nyquist bandwidth of +/- 100 MHz (+/- 80 MHz around the center frequency).  The resulting maximum theoretical analog bandwidth is 160 MHz.&lt;br /&gt;
&lt;br /&gt;
FPGA Processing Bandwidth: Up to 200 MS/s quadrature.&lt;br /&gt;
&lt;br /&gt;
Host Bandwidth:  Up to 200 MS/s quadrature, dependent on selected interface&lt;br /&gt;
&lt;br /&gt;
For more information about achieving the maximum bandwidth with a USRP-2974, please see the &amp;quot;USRP X300/X310 Configuration Guide&amp;quot; or the &amp;quot;USRP System Bandwidth&amp;quot; application note.&lt;br /&gt;
&lt;br /&gt;
* '''How can I program the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
Like all other USRP models, the USRP-2974 is compatible with the USRP Hardware Driver™ (UHD) architecture.  The UHD architecture is a common driver that allows users to develop and execute applications on the onboard or host computer.  UHD provides a direct C++ API to control and stream to/from the USRP-2974.  It also provides compatibility with a variety of third-party software frameworks including GNU Radio, LabVIEW, and MATLAB.  You may also customize the FPGA image provided with UHD to integrate your own signal processing. For more information about UHD, and supported software frameworks, please see:&lt;br /&gt;
&lt;br /&gt;
http://files.ettus.com/manual/&lt;br /&gt;
&lt;br /&gt;
* '''How do I update the FPGA images and firmware with the latest from UHD'''&lt;br /&gt;
&lt;br /&gt;
You can find more information about updating the FPGA image through PCIe, 1/10 GigE, and JTAG [https://kb.ettus.com/X300/X310_Device_Recovery here].&lt;br /&gt;
&lt;br /&gt;
* '''How can I modify the FPGA of the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
The source code (Verilog) for the USRP-2794 is available in the UHD repository. The build process leverages the existing CMAKE build system used to compile the host-side driver.  A Linux-based setup will provide the best results.&lt;br /&gt;
&lt;br /&gt;
Which FPGA toolchain required to build the FPGA images will depend upon your version of UHD. For more details please see the [https://kb.ettus.com/UHD UHD] Software Resource page.&lt;br /&gt;
&lt;br /&gt;
* '''How much free space is available in the USRP-2974 FPGA'''&lt;br /&gt;
&lt;br /&gt;
Please see the [[#Utilization statistics]] section of this resources page for more information.&lt;br /&gt;
&lt;br /&gt;
* '''What frequency range does the USRP-2974 cover'''&lt;br /&gt;
&lt;br /&gt;
10MHz to 6GHz.&lt;br /&gt;
&lt;br /&gt;
* '''What components do I need to purchase for a complete USRP-2974 system'''&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 is a complete stand alone SDR. Additional components might include RF filters, antennas, RF power amplifiers or other RF components needed for a specific application.&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP-2974&amp;diff=4165</id>
		<title>USRP-2974</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=USRP-2974&amp;diff=4165"/>
				<updated>2019-06-01T18:43:05Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* FAQ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The NI USRP-2974 is a high-performance, USRP software defined radio (SDR) stand-alone device for designing and deploying next generation wireless communications systems. The hardware architecture combines two extended-bandwidth daughterboard slots covering 10 MHz – 6 GHz with up to 160 MHz of baseband bandwidth, multiple high-speed interface options (PCIe, dual 10 GigE), an onboard Intel Core i7 processor, and a large user-programmable Kintex-7 FPGA in a convenient desktop or rack-mountable half-wide 2U form factor.&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 is the equivalent to a USRP X310 with two UBX-160 boards, a GPSDO and an onboard Intel i7 computer. The USRP-2974 comes with NI Linux RTOS pre-installed, but in order to use it with open-source tool-chain, a user will need to install Linux (preferably Fedora or Ubuntu) and then the USRP Hardware driver (UHD). After these have been installed, any other open-source tools can be installed, such as GNU Radio.&lt;br /&gt;
&lt;br /&gt;
== Key Features of the USRP-2974==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Intel Core i7 6822EQ 2GHz Quad CoreProcessor&lt;br /&gt;
* 16GB DDR4 Memory&lt;br /&gt;
* 512GB SSD&lt;br /&gt;
* USB-to-UART to the CPU&lt;br /&gt;
* Xilinx Kintex-7 XC7K410T FPGA&lt;br /&gt;
* 14 bit 200 MS/s ADC&lt;br /&gt;
* 16 bit 800 MS/s DAC&lt;br /&gt;
* Frequency range: 10 MHz - 6 GHz&lt;br /&gt;
* Up 160MHz&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; bandwidth per channel&lt;br /&gt;
* 2 Transmit ports&lt;br /&gt;
* 2 Receive ports&lt;br /&gt;
* GPSDO&lt;br /&gt;
* Multiple high-speed interfaces (Dual 10G, PCIe Express, 1G)&lt;br /&gt;
|[[File:USRP_2974_frt_dia.jpg|350px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Controller - Onboard computer ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|System on module (SoM) &lt;br /&gt;
|Congatec COM Express conga-TS170&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|CPU&lt;br /&gt;
|Intel Core i7 6822EQ (2 GHz Quad Core)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Memory &lt;br /&gt;
|SO-DIMM DDR4 16 GB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SFP+&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &lt;br /&gt;
|10G ETH connection to the SoM&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Cabled PCIe&lt;br /&gt;
|PCIe Gen 2 x4&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|MicroUSB&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|USB-to-UART to the SoM&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|RJ45&lt;br /&gt;
|1G ETH host connection&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; Can be bypassed to the FPGA.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; Device port for external host.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
==RF Specifications==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Transmitter&lt;br /&gt;
|-&lt;br /&gt;
|Number of channels&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Frequency range&lt;br /&gt;
|10MHz to 6GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency step&lt;br /&gt;
|&amp;lt;1kHz&lt;br /&gt;
|-&lt;br /&gt;
|Maximum output power&lt;br /&gt;
|5mW to 100mW (7dBm to 20dBm)&lt;br /&gt;
|-&lt;br /&gt;
|Gain range&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
|0dB to 31.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Gain step&lt;br /&gt;
|0.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum instantaneous real-time bandwidth&lt;br /&gt;
|160MHz&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Receiver&lt;br /&gt;
|-&lt;br /&gt;
|Number of channels&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Frequency range&lt;br /&gt;
|10MHz to 6GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency step&lt;br /&gt;
|&amp;lt;1kHz&lt;br /&gt;
|-&lt;br /&gt;
|Gain range&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|0dB to 37.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Gain step&lt;br /&gt;
|0.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum input power&lt;br /&gt;
|10dBm&lt;br /&gt;
|-&lt;br /&gt;
|Noise Figure&lt;br /&gt;
|5dB to 7dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum instantaneous real-time bandwidth&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&lt;br /&gt;
|160MHz&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; The output power resulting from the gain setting varies over the frequency band and among&lt;br /&gt;
devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;The received signal amplitude resulting from the gain setting varies over the frequency band and&lt;br /&gt;
among devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;The USRP-2974 receiver path has 84 MHz of bandwidth for center frequencies from 10 MHz to&lt;br /&gt;
500 MHz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' As mentioned earlier, the USRP-2974 incorporates 2 UBX-160 daughterboards. Therefore, for more information on RF performance, please see the [[UBX | UBX hardware resource]] page&lt;br /&gt;
&lt;br /&gt;
==Hardware Specifications==&lt;br /&gt;
===USRP Hardware Driver (UHD) version===&lt;br /&gt;
* Minimum version of UHD required: '''3.15.0'''&lt;br /&gt;
&lt;br /&gt;
===Clocking and Sampling Rates===&lt;br /&gt;
There are two master clock rates (MCR) supported on the USRP-2974 like on the X310: 200.0 MHz and 184.32 MHz.&lt;br /&gt;
&lt;br /&gt;
The sampling rate must be an integer decimation rate of the MCR. Ideally, this decimation factor should be an even number. An odd decimation factor will result in additional unwanted attenuation (roll-off from the CIC filter in the DUC and DDC blocks in the FPGA). The valid decimation rates are between 1 and 1024.&lt;br /&gt;
&lt;br /&gt;
For the MCR of 200.0 MHz, the achievable sampling rates using an even decimation factor are 200.0, 100.0, 50.0, 33.33, 25.0, 20.0, 16.67, 14.286 Msps, ... 195.31 Ksps.&lt;br /&gt;
&lt;br /&gt;
For the MCR of 184.32 MHz, the achievable sampling rates using an even decimation factor are 184.32, 92.16, 46.08, 30.72, 23.04, 18.432, 15.36, 13.166 Msps, ... 180.0 Ksps.&lt;br /&gt;
&lt;br /&gt;
If the desired sampling rate is not directly supported by the hardware, then it will be necessary to re-sample in software. This can be done in C++ using libraries such as Liquid DSP [https://github.com/jgaeddert/liquid-dsp], or can be done in GNU Radio, in which there are three blocks that perform sampling rate conversion.&lt;br /&gt;
&lt;br /&gt;
==Physical Specifications==&lt;br /&gt;
&lt;br /&gt;
===Dimensions===&lt;br /&gt;
(L × W × H) 29.08 cm × 21.84 cm × 7.98 cm (11.45 in. × 8.60 in. × 3.14 in. )&lt;br /&gt;
&lt;br /&gt;
===Weight===&lt;br /&gt;
3.34 kg (7.35 lb)&lt;br /&gt;
&lt;br /&gt;
==Power==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|Voltage range&lt;br /&gt;
|14.25 V to 15.75 V DC&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Current&lt;br /&gt;
|10 A, maximum&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Power&lt;br /&gt;
|150 W, maximum&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' Indoor use only&lt;br /&gt;
&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* 0 °C to 50 °C&lt;br /&gt;
&lt;br /&gt;
===Maximum altitude===&lt;br /&gt;
* 2,000 m (800 mbar) (at 25 °C ambient temperature)&lt;br /&gt;
&lt;br /&gt;
===Operating Humidity Range===&lt;br /&gt;
* 10% to 90% non-condensing&lt;br /&gt;
&lt;br /&gt;
===Pollution Degree===&lt;br /&gt;
* 2&lt;br /&gt;
&lt;br /&gt;
==System Diagram and Schematics==&lt;br /&gt;
&lt;br /&gt;
===System Block Diagram===&lt;br /&gt;
[[file:2974_blk_dia.png |800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.ni.com/documentation/en/usrp-software-defined-radio-stand-alone-device/latest/usrp-2974/block-diagram/ Detailed System Block Diagram]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schematics===&lt;br /&gt;
Because the USRP-2974 is a combination of an Intel i7 SOM and an X310 USRP, a user can reference the X310 Schematics.&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/schematics/x300/x3xx.pdf X310 Schematics]&lt;br /&gt;
&lt;br /&gt;
==Key Component Datasheets==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%&amp;quot;&lt;br /&gt;
!Part Number&lt;br /&gt;
!Description&lt;br /&gt;
!Schematic ID (Page)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.congatec.com/fileadmin/user_upload/Documents/Datasheets/conga-TS170.pdf conga-TS170]&lt;br /&gt;
|System on Module (SoM)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.xilinx.com/support/documentation/data_sheets/ds180_7Series_Overview.pdf XC7K410T]&lt;br /&gt;
|FPGA&lt;br /&gt;
|U23 (3,5,8,9,10,18)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/AD9146.PDF AD9146]&lt;br /&gt;
|Dual Channel, 16-Bit, 1230 MSPS DAC&lt;br /&gt;
|U12, U36 (7)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/slas635b/slas635b.pdf ADS62P48]&lt;br /&gt;
|Dual Channel, 14-Bit 210 MSPS ADC&lt;br /&gt;
|U11, U35 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.onsemi.com/pub/Collateral/FIN1002-D.pdf FIN1002]&lt;br /&gt;
|High Speed Differential Receiver&lt;br /&gt;
|U3, U5, U31, U32 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/20001203U.pdf 24LC256T]&lt;br /&gt;
|EEPROM&lt;br /&gt;
|U530 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/lmk04816.pdf LMK04816BISQ/NOPB_1/3]&lt;br /&gt;
|Jitter Cleaner With Dual Loop PLLs&lt;br /&gt;
|U531 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/sy89547l.pdf SY89547LMGTR]&lt;br /&gt;
|Multiplexer&lt;br /&gt;
|U506 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/sn74aup1t17.pdf SN74AUP1T17]&lt;br /&gt;
|Single Schmitt-Trigger Buffer Gate&lt;br /&gt;
|U6, U519 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps54620.pdf TPS54620RGYT]&lt;br /&gt;
|Synchronous Step Down SWIFT™ Converter&lt;br /&gt;
|U515 (21); U516 (26)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/1764fb.pdf LT1764EQ-3.3]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U27 (21); U516 (26)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps7a47.pdf TPS7A47]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U28, U532 (21)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/3603fc.pdf LTC3603EUF_TRPBF]&lt;br /&gt;
|Monolithic Synchronous Step-Down Regulator&lt;br /&gt;
|U517 (23); U500 (25); U514, U513 (27)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/product/TPS77625-EP?keyMatch=TPS77625&amp;amp;tisearch=Search-EN-Everything TPS77625]&lt;br /&gt;
|Low-Dropout Voltage Regulators&lt;br /&gt;
|U30 (23)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps79318-ep.pdf TPS79318_SM]&lt;br /&gt;
|Low-Dropout Voltage Regulators&lt;br /&gt;
|U510 (27)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Media:agile9598503.pdf|OSC-96MHZ-724821-01]]&lt;br /&gt;
|Voltage Controlled Crystal Oscillator&lt;br /&gt;
|U25 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==FPGA and Baseband==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|FPGA &lt;br /&gt;
|Kintex-7 XC7K410T&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|DRAM &lt;br /&gt;
|1 GB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Baseband analog-to-digital converter&lt;br /&gt;
(ADC) resolution&lt;br /&gt;
|14 bit&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Baseband digital-to-analog converter&lt;br /&gt;
(DAC) resolution&lt;br /&gt;
|16 bit&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|ADC spurious-free dynamic range (sFDR)&lt;br /&gt;
|88 dB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|DAC sFDR&lt;br /&gt;
|80 dB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Maximum I/Q sample rate&lt;br /&gt;
|200 MS/s&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SFP+&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &lt;br /&gt;
|High speed serial link to one of the FPGA&lt;br /&gt;
GTX transceivers&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;Can be bypassed to the SoM if using the 10 GbE as protocol.&lt;br /&gt;
&lt;br /&gt;
===FPGA User Modifications===&lt;br /&gt;
&lt;br /&gt;
The Verilog code for the FPGA in the NI USRP-2974 is open-source, and users are free to modify and customize it for their needs. However, certain modifications may result in either bricking the device, or even in physical damage to the unit. Specifically, changing the I/O interface of the FPGA in any way (do not remove any of the I/O for the PCIe interface, such as &amp;lt;code&amp;gt;x300_pcie_int&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;LvFpga_Chinch_Interface&amp;lt;/code&amp;gt;), or modifying the pin and timing constraint files, could result in physical damage to other components on the motherboard, external to the FPGA, and doing this will void the warranty. Also, even if the PCIe interface is not being used, you cannot remove or reassign these pins in the constraint file. The constraint files should not be modified. Please note that modifications to the FPGA are made at the risk of the user, and may not be covered by the warranty of the device.&lt;br /&gt;
&lt;br /&gt;
==Interfaces and Connectivity==&lt;br /&gt;
Follow the links below for additional information on configuring each interface for the USRP-2974.&lt;br /&gt;
&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_10gige Dual 10 Gigabit Ethernet] - 200 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_pcie PCIe Express (Desktop)] - 200 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_1gige 1 Gigabit Ethernet] - 25 MS/s Full Duplex @ 16-bit&lt;br /&gt;
&lt;br /&gt;
===Front Panel===&lt;br /&gt;
&lt;br /&gt;
[[File:USRP-2974 Front Panel.jpg|800px]]&lt;br /&gt;
[[File:2974_frt_wireframe.png|800px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Connector&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''Use'''&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RF 0&lt;br /&gt;
|TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|Input and output terminal for the RF signal. TX1 RX1 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input or output channel.&lt;br /&gt;
|-&lt;br /&gt;
|RX2&lt;br /&gt;
|Input terminal for the RF signal. RX2 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | AUX I/O&lt;br /&gt;
|General-purpose I/O (GPIO) port. AUX I/O is controlled by the FPGA.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RF 1&lt;br /&gt;
|TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|Input and output terminal for the RF signal. TX1 RX1 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input or output channel.&lt;br /&gt;
|-&lt;br /&gt;
|RX2&lt;br /&gt;
|Input terminal for the RF signal. RX2 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | DP&lt;br /&gt;
|DisplayPort connector to connect one monitor for your controller.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | USB2.0&lt;br /&gt;
|USB ports that support common USB peripheral devices such as flash drives, hard drives, keyboards, and mice.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | USB3.0&lt;br /&gt;
|USB ports that support common USB peripheral devices such as flash drives, hard drives, keyboards, and mice.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G ETH&lt;br /&gt;
|RJ45 port used for 1G ETH connectivity to other ethernet devices.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | μUSB&lt;br /&gt;
|USB port used for UART connectivity to the controller.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 0&lt;br /&gt;
|SFP+ port used for 10G ETH connectivity to other ethernet devices. Connects to the embedded Linux computer for communication with LabVIEW RT.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 1&lt;br /&gt;
|SFP+ port used for 1G/10G ETH connectivity to other ethernet devices. Connects to the FPGA. Not currently supported in LabVIEW Communications System Design Suite.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''LED'''&lt;br /&gt;
!'''Description'''&lt;br /&gt;
!'''Color'''&lt;br /&gt;
!'''State'''&lt;br /&gt;
!'''Indication'''&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;5&amp;quot; | RF 0&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates thetransmit status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not active.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is transmitting data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RX2&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the receive status of the device.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot;| REF&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates the status of the reference signal.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no reference signal, or the device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; |Green&lt;br /&gt;
|Blinking&lt;br /&gt;
|The device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| PPS&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the pulse per second (PPS).&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no PPS timing reference signal, or the device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Blinking&lt;br /&gt;
|The device is locked to the PPS timing reference signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| GPS&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates whether the GPSDO is locked.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no GPSDO or the GPSDO is not locked.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The GPSDO is locked.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;5&amp;quot; | RF 1&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates thetransmit status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not active.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is transmitting data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RX2&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the receive status of the device.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| Status&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device initialized successfully and is ready for use.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Blinking&lt;br /&gt;
|Hardware error. An internal power supply has failed. Check front-panel I/O connections for shorts. Remove any shorts and cycle power to the USRP-2974. Contact NI if the problem persists.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| PWR&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the power status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is powered off.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The devices is powered on.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot; | 10/100/1000&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot;| Indicates the speed of the Gigabit Ethernet link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|No link, or 10 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|100 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
|Amber&lt;br /&gt;
|Solid&lt;br /&gt;
|1,000 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot;| ACT/LINK	&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Indicates the Gigabit Ethernet link activity or status.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|No link has been established.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Green&lt;br /&gt;
|Solid&lt;br /&gt;
|A link has been negotiated.&lt;br /&gt;
|-&lt;br /&gt;
|Blinking&lt;br /&gt;
|Activity on the link.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; | 1G/10G ETH 0&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | ACT/LINK&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Indicates the status of the SFP+ port.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The link is down.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The link is up.&lt;br /&gt;
|-&lt;br /&gt;
|Blinking&lt;br /&gt;
|The link is active (transmitting and receiving).&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |10GbE&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Indicates the status of the 10G ETH link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The 10G ETH link is down.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The 10G ETH link is up.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 1 10GbE&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Indicates the status of the 10G ETH link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The 10G ETH link is down.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The 10G ETH link is up.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Rear Panel===&lt;br /&gt;
[[File:USRP-2974 Rear Panel.jpg|800px]]&lt;br /&gt;
[[File:2974_back_wireframe.png|800px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Connector&lt;br /&gt;
!Use&lt;br /&gt;
|-&lt;br /&gt;
|REF OUT&lt;br /&gt;
|Output terminal for an external reference signal for the LO on the device. REF OUT is an SMA (f) connector with an impedance of 50 Ω, and it is a single-ended reference output. The output signal at this connector is 10 MHz at 3.3 V.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|REF IN&lt;br /&gt;
|Input terminal for an external reference signal for the LO on the device. REF IN is an SMA (f) connector with an impedance of 50 Ω, and it is a single-ended reference input. REF IN accepts a 10 MHz signal with a minimum input power of 0 dBm (0.632 Vpk-pk) and a maximum input power of 15 dBm (3.56 Vpk-pk) for a square wave or sine wave.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PPS TRIG OUT	&lt;br /&gt;
|Output terminal for the PPS timing reference. PPS TRIG OUT is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input. The output signal is 0 V to 3.3 V TTL. You can also use this port as a triggered output (TRIG OUT) that you program with the PPS Trig Out I/O signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PPS TRIG IN	&lt;br /&gt;
|Input terminal for PPS timing reference. PPS TRIG IN is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel. PPS TRIG IN accepts 0 V to 3.3 V TTL and 0 V to 5 V TTL signals. You can also use this port as a triggered input (TRIG IN) that you control using NI-USRP software.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|GPS ANT	&lt;br /&gt;
|Input terminal for the GPS antenna signal. GPS ANT is an SMA (f) connector with a maximum input power of -15 dBm and an output of DC 5 V to power an active antenna. &amp;lt;p&amp;gt; '''Notice:''' Do not terminate the GPS ANT port if you do not use it.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PCIe x4	&lt;br /&gt;
|Port for a PCI Express Generation 2, x4 bus connection through an MXI Express four-lane cable. Can be used to connect an external USRP device or external chassis.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SYSTEM POWER IN	&lt;br /&gt;
|Input that accepts a 15 V ± 5%, 10 A external DC power connector.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Ref Clock - 10 MHz===&lt;br /&gt;
Using an external 10 MHz reference clock, a square wave will offer the best phase noise performance, but a sinusoid is acceptable. The power level of the reference clock cannot exceed +15 dBm.&lt;br /&gt;
&lt;br /&gt;
===PPS - Pulse Per Second===&lt;br /&gt;
Using a PPS signal for timestamp synchronization requires a square wave signal with the following a 5Vpp amplitude.&lt;br /&gt;
&lt;br /&gt;
To test the PPS input, you can use the following tool from the UHD examples:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;args&amp;gt;&amp;lt;/code&amp;gt; are device address arguments (optional if only one USRP device is on your machine)&lt;br /&gt;
&lt;br /&gt;
    cd &amp;lt;install-path&amp;gt;/lib/uhd/examples ./test_pps_input –args=&amp;lt;args&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Front Panel GPIO===&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;width:50%&amp;quot; |&lt;br /&gt;
The GPIO port is not meant to drive big loads. You should not try to source more than 5mA per pin.&lt;br /&gt;
&lt;br /&gt;
The +3.3V is for ESD clamping purposes only and not designed to deliver high currents.&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | [[File:x3x0 gpio conn.png]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Power on state====&lt;br /&gt;
The hardware power on state and UHD initial state for the front-panel GPIOs is high-Z. For the X3xx, there are no external pull-ups/pull-downs for the GPIO pins, but the FPGAs do have them and they are configured as follows: X3xx: pull-down.&lt;br /&gt;
&lt;br /&gt;
====Pin Mapping====&lt;br /&gt;
* Pin 1: +3.3V&lt;br /&gt;
* Pin 2: Data[0]&lt;br /&gt;
* Pin 3: Data[1]&lt;br /&gt;
* Pin 4: Data[2]&lt;br /&gt;
* Pin 5: Data[3]&lt;br /&gt;
* Pin 6: Data[4]&lt;br /&gt;
* Pin 7: Data[5]&lt;br /&gt;
* Pin 8: Data[6]&lt;br /&gt;
* Pin 9: Data[7]&lt;br /&gt;
* Pin 10: Data[8]&lt;br /&gt;
* Pin 11: Data[9]&lt;br /&gt;
* Pin 12: Data[10]&lt;br /&gt;
* Pin 13: Data[11]&lt;br /&gt;
* Pin 14: 0V&lt;br /&gt;
* Pin 15: 0V&lt;br /&gt;
&lt;br /&gt;
'''Note''': Please see the [http://files.ettus.com/manual/page_gpio_api.html E3x0/X3x0 GPIO API] for information on configuring and using the GPIO bus.&lt;br /&gt;
&lt;br /&gt;
==Certifications==&lt;br /&gt;
===RoHS===&lt;br /&gt;
As of December 1st, 2010 all NI/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;
[http://files.ettus.com/manual/md_fpga.html FPGA Resources]&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/binaries/uhd_stable/ UHD Stable Binaries]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/EttusResearch/uhd UHD Source Code on Github]&lt;br /&gt;
&lt;br /&gt;
==Choosing an Interface==&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 provides three interface options – 1 Gigabit Ethernet (1 GigE), 10 Gigabit Ethernet (10 GigE), and PCI-Express (PCIe). The PCIe interface is always available regardless of what FPGA image is loaded. Ettus ships two FPGA image variants, the HG or HGS image which has one 1 GigE interfaces and one 10 GigE interfaces, and the XG image which has two 10 GigE interfaces. Generally, Ettus Research recommends using 10 GigE to achieve the maximum throughput available from the USRP-2974.  PCIe is recommended for applications that require the lowest possible latency, which is a desirable characteristic for PHY/MAC research.  If your application does not require the full bandwidth of the USRP-2974, the 1 GigE interface serves as a cost-effective fall-back option.  Ettus Research provides a complete interface kit for each of these options, which is also shown in the following table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|Interface Performance Summary&lt;br /&gt;
|-&lt;br /&gt;
!Interface&lt;br /&gt;
!Throughput (MS/s @ 16-bit)&lt;br /&gt;
!Target&lt;br /&gt;
!Recommended Kit&lt;br /&gt;
|-&lt;br /&gt;
|1 Gigabit&lt;br /&gt;
|25 MS/s&lt;br /&gt;
|Desktop/Laptop&lt;br /&gt;
|[https://www.ettus.com/product/details/1GIGE-KIT SFP Adapter + GigE Cable]&lt;br /&gt;
|-&lt;br /&gt;
|10 Gigabit&lt;br /&gt;
|200 MS/s&lt;br /&gt;
|Desktop&lt;br /&gt;
|[https://www.ettus.com/product/details/10GIGE-KIT 10 GigE Interface Kit]&lt;br /&gt;
|-&lt;br /&gt;
|PCI-Express &lt;br /&gt;
(PCIe, 4 lane)&lt;br /&gt;
|200 MS/S&lt;br /&gt;
|Desktop&lt;br /&gt;
|[https://www.ettus.com/product/details/PCIE-KIT PCI-Express Desktop Kit]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===10 Gigabit Ethernet===&lt;br /&gt;
In order to utilize the dual 10 Gigabit Ethernet interfaces, ensure the XG image is installed ([http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_load_fpga_imgs_fpga_flavours see FPGA Image Flavors]). In addition to burning the prerequisite FPGA image, it may also be necessary to tune the network interface card (NIC) to eliminate drops (Ds) and reduce overflows (Os). This is done by increasing the number of RX descriptors ([http://files.ettus.com/manual/page_transport.html#transport_udp_linux see Linux specific notes]).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;benchmark_rate&amp;lt;/code&amp;gt; tool can be used to test this capability. Run the following commands to test the X-series USRP over both 10 Gigabit Ethernet interfaces with the maximum rate of 200 Msps per channel:&lt;br /&gt;
&lt;br /&gt;
    cd &amp;lt;install-path&amp;gt;/lib/uhd/examples&lt;br /&gt;
    ./benchmark_rate --args=&amp;quot;type=x300,addr=&amp;lt;Primary IP&amp;gt;,second_addr=&amp;lt;secondary IP&amp;gt;&amp;quot; --channels=&amp;quot;0,1&amp;quot; --rx_rate 200e6&lt;br /&gt;
&lt;br /&gt;
The second interface is specified by the extra argument '''second_addr'''.&lt;br /&gt;
&lt;br /&gt;
'''Recommended 10 Gigabit Ethernet Cards'''&lt;br /&gt;
* Intel X520-DA2&lt;br /&gt;
** [http://ark.intel.com/products/39776/Intel-Ethernet-Converged-Network-Adapter-X520-DA2 Intel® Ethernet Converged Network Adapter X520-DA2]&lt;br /&gt;
* Intel X520-DA1&lt;br /&gt;
** [http://ark.intel.com/products/68669/Intel-Ethernet-Converged-Network-Adapter-X520-DA1 Intel® Ethernet Converged Network Adapter X520-DA1 ]&lt;br /&gt;
* Intel X710-DA2&lt;br /&gt;
** [http://ark.intel.com/products/83964/Intel-Ethernet-Converged-Network-Adapter-X710-DA2 Intel® Ethernet Converged Network Adapter X710-DA2 ]&lt;br /&gt;
* Intel X710-DA4&lt;br /&gt;
** [http://ark.intel.com/products/83965/Intel-Ethernet-Converged-Network-Adapter-X710-DA4 Intel® Ethernet Converged Network Adapter X710-DA4 ]&lt;br /&gt;
* Mellanox MCX4121A-ACAT&lt;br /&gt;
** [https://store.mellanox.com/products/mellanox-mcx4121a-acat-connectx-4-lx-en-network-interface-card-25gbe-dual-port-sfp28-pcie3-0-x8-rohs-r6.html Mellanox MCX4121A-ACAT ]&lt;br /&gt;
&lt;br /&gt;
==GPS Disciplined, Oven-Controlled Oscillator (GPSDO)==&lt;br /&gt;
The USRP-2794 has a high-accuracy GPS-disciplined oscillator (GPSDO).  The GPSDO improves the accuracy of the internal frequency reference to 20 ppb, or 0.1 ppb if the GPS is synchronized to the GPS constellation.  When synchronized to the GPS constellation, all USRP™ devices will also be synchronized in time within 50 ns.&lt;br /&gt;
&lt;br /&gt;
* Support GPSDO NMEA Strings&lt;br /&gt;
* [http://www.jackson-labs.com/assets/uploads/main/LC_XO_specsheet.pdf JacksonLabs LC_XO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
!Internal TCXO&lt;br /&gt;
!GPS-Disciplined Clock&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Reference&lt;br /&gt;
|TCXO&lt;br /&gt;
|OCXO&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Accuracy&lt;br /&gt;
|± 2.5ppm&lt;br /&gt;
± 2,500 Hz @ 1 GHz&lt;br /&gt;
|± 20 ppb&lt;br /&gt;
± 20 Hz @ 1 GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Accuracy&lt;br /&gt;
|&lt;br /&gt;
|± 0.01ppb&lt;br /&gt;
|-&lt;br /&gt;
|(GPS-Disciplined)&lt;br /&gt;
|&lt;br /&gt;
|~ ± 0.01 Hz @ 1 GHz&lt;br /&gt;
|-&lt;br /&gt;
|GPS Time Sync Accuracy&lt;br /&gt;
|&lt;br /&gt;
|±50ns to UTC Time**&lt;br /&gt;
|-&lt;br /&gt;
|10 MHz Reference Phase Drift with GPS Sync&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;±20ns After 1 Hour**&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Sensors===&lt;br /&gt;
You can query the lock status with the &amp;lt;code&amp;gt;gps_locked&amp;lt;/code&amp;gt; sensor, as well as obtain raw NMEA sentences using the &amp;lt;code&amp;gt;gps_gprmc&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;gps_gpgga&amp;lt;/code&amp;gt; sensors. Location information can be parsed out of the &amp;lt;code&amp;gt;gps_gpgga&amp;lt;/code&amp;gt; sensor by using &amp;lt;code&amp;gt;gpsd&amp;lt;/code&amp;gt; or another NMEA parser.&lt;br /&gt;
&lt;br /&gt;
==Option: Using the GPIO Expansion Kit==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top; width:60%&amp;quot;|This General Purpose Input/output (GPIO) breakout kit provides access to general purpose digital I/O signals with simple terminal blocks, and a prototyping area where wires and components can be soldered.  Each GPIO pin is connected to an FPGA digital line allowing it to be configured as an input, or an output, using the various software frameworks that support the USRP™ GPIO. &lt;br /&gt;
&lt;br /&gt;
These GPIO signals can serve the following functions:&lt;br /&gt;
&lt;br /&gt;
* Control of external devices, such as power amplifiers and RF switches&lt;br /&gt;
* Provide output signals that can help with debugging&lt;br /&gt;
* Provide observables to be analyzed by oscilloscopes or other external equipment&lt;br /&gt;
* Accept input from external devices for local, software-based triggering&lt;br /&gt;
* Implement a protocol line such as SPI or I2C&lt;br /&gt;
||[[File:Product_x3x0_gpio.jpg|250px]]&lt;br /&gt;
|}&lt;br /&gt;
===GPIO Expansion Kit Contents===&lt;br /&gt;
&lt;br /&gt;
*1 GPIO Breakout Board&lt;br /&gt;
*1 DB-15, 1-meter cable&lt;br /&gt;
*GPIO Quick Reference&lt;br /&gt;
&lt;br /&gt;
===Circuit Protection===&lt;br /&gt;
The GPIO signals exposed with this breakout kit are routed directly to the USRP device's FPGA with limited protection circuitry.  However, the user must take precautionary measures to ensure input/output signals meet the specifications shown in this document.  Over voltage, excess current draw, and other conditions can damage the USRP device and void the warranty. Special care should be taken when the USRP is powered off.&lt;br /&gt;
&lt;br /&gt;
===Mounting the GPIO Breakout Board===&lt;br /&gt;
The GPIO breakout board can be mounted directly to the DB15 connector of a USRP ™ device, or mounted remotely with the cable provided in this kit.  The screws on the DB15 connector of the breakout board must be removed to mount the board directly.  For remote mounting, the breakout board is supplied with rubber standoffs to avoid scratching surfaces, and several through-holes for hard mounting with screws or other hardware (not provided).&lt;br /&gt;
&lt;br /&gt;
===Using GPIO with UHD, GNU Radio, and other Third-Party Frameworks===&lt;br /&gt;
When used with UHD, or other third party frameworks that leverage UHD, the GPIO expansion can be controlled with simple API calls.  For more information, on the C++ API, and examples of how to use the GPIO in frameworks such as GNU Radio, please see the [[Application Notes]] section of the [https://kb.ettus.com Ettus Research Knowledge Base].&lt;br /&gt;
&lt;br /&gt;
===GPIO Specifications (3.3V Bank, LVCMOS)===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Parameter&lt;br /&gt;
!Typical&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Configured as Input&lt;br /&gt;
|-&lt;br /&gt;
|Default Voltage Standard&lt;br /&gt;
|3.3V LVCMOS&lt;br /&gt;
|-&lt;br /&gt;
|Voltage High Threshold&lt;br /&gt;
|2.0V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Low Threshold&lt;br /&gt;
|0.8V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Input Limits (no damage) &lt;br /&gt;
| -0.3V/3.45V&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Configured as Output&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Standard&lt;br /&gt;
|3.3V LVCMOS&lt;br /&gt;
|-&lt;br /&gt;
|Voltage High Output&lt;br /&gt;
|2.8V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Low Output&lt;br /&gt;
|0.4V&lt;br /&gt;
|-&lt;br /&gt;
|Current Source Capability&lt;br /&gt;
|12 mA&lt;br /&gt;
|-&lt;br /&gt;
|Output Source Impedance&lt;br /&gt;
|&amp;gt;33 ohms typical&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Option: Antenna Kit for GPSDO==&lt;br /&gt;
The GPSDO Mini Kit will improve the accuracy of the USRP reference clock, even if it does not receive signals from the GPS Constellation.  However, to achieve the best accuracy possible, and to achieve global timing alignment across multiple USRPs, Ettus Research recommends the GPSDO Mini Antenna Kit.&lt;br /&gt;
&lt;br /&gt;
==Option: Cables for MIMO Expansion==&lt;br /&gt;
Multiple USRP-2974s can be synchronized for coherent operation by sharing a common 10 MHz and 1 PPS signal.  We recommend using a star-distribution topology with an OctoClock or OctoClock-G, as seen in Figure 4.  This requires matched length cables to be used for both 10 MHz and 1 PPS.&lt;br /&gt;
&lt;br /&gt;
For more information about MIMO operation, please see the MIMO and Synchronization Application Note.&lt;br /&gt;
[[File:8mimo.png|700px|center]]&lt;br /&gt;
&amp;lt;center&amp;gt;Figure 4 - Star-Distribution of 10 MHz/PPS Signals with OctoClock&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
&lt;br /&gt;
* '''What is the bandwidth of the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
The ADC rate on each analog RX channel is 200 MS/s quadrature, which provides a theoretical analog bandwidth of approximately 80% of the Nyquist bandwidth of +/- 100 MHz (+/- 80 MHz around the center frequency).  The resulting maximum theoretical analog bandwidth is 160 MHz.&lt;br /&gt;
&lt;br /&gt;
FPGA Processing Bandwidth: Up to 200 MS/s quadrature.&lt;br /&gt;
&lt;br /&gt;
Host Bandwidth:  Up to 200 MS/s quadrature, dependent on selected interface&lt;br /&gt;
&lt;br /&gt;
For more information about achieving the maximum bandwidth with a USRP-2974, please see the &amp;quot;USRP X300/X310 Configuration Guide&amp;quot; or the &amp;quot;USRP System Bandwidth&amp;quot; application note.&lt;br /&gt;
&lt;br /&gt;
* '''How can I program the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
Like all other USRP models, the USRP-2974 is compatible with the USRP Hardware Driver™ (UHD) architecture.  The UHD architecture is a common driver that allows users to develop and execute applications on the onboard or host computer.  UHD provides a direct C++ API to control and stream to/from the USRP-2974.  It also provides compatibility with a variety of third-party software frameworks including GNU Radio, LabVIEW, and MATLAB.  You may also customize the FPGA image provided with UHD to integrate your own signal processing. For more information about UHD, and supported software frameworks, please see:&lt;br /&gt;
&lt;br /&gt;
http://files.ettus.com/manual/&lt;br /&gt;
&lt;br /&gt;
* '''How do I update the FPGA images and firmware with the latest from UHD'''&lt;br /&gt;
&lt;br /&gt;
You can find more information about updating the FPGA image through PCIe, 1/10 GigE, and JTAG [https://kb.ettus.com/X300/X310_Device_Recovery here].&lt;br /&gt;
&lt;br /&gt;
* '''How can I modify the FPGA of the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
The source code (Verilog) for the USRP-2794 is available in the UHD repository. The build process leverages the existing CMAKE build system used to compile the host-side driver.  A Linux-based setup will provide the best results.&lt;br /&gt;
&lt;br /&gt;
Which FPGA toolchain required to build the FPGA images will depend upon your version of UHD. For more details please see the [https://kb.ettus.com/UHD UHD] Software Resource page.&lt;br /&gt;
&lt;br /&gt;
* '''How much free space is available in the USRP-2974 FPGA'''&lt;br /&gt;
&lt;br /&gt;
Please see the [[#Utilization statistics]] section of this resources page for more information.&lt;br /&gt;
&lt;br /&gt;
* '''What frequency range does the USRP-2974 cover'''&lt;br /&gt;
&lt;br /&gt;
10MHz to 6GHz.&lt;br /&gt;
&lt;br /&gt;
* '''What components do I need to purchase for a complete USRP-2974 system'''&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 is a complete stand alone SDR. Additional components might include RF filters, antennas, RF power amplifiers or other RF components needed for a specific application.&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP-2974&amp;diff=4164</id>
		<title>USRP-2974</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=USRP-2974&amp;diff=4164"/>
				<updated>2019-06-01T18:39:22Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* System Block Diagram */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The NI USRP-2974 is a high-performance, USRP software defined radio (SDR) stand-alone device for designing and deploying next generation wireless communications systems. The hardware architecture combines two extended-bandwidth daughterboard slots covering 10 MHz – 6 GHz with up to 160 MHz of baseband bandwidth, multiple high-speed interface options (PCIe, dual 10 GigE), an onboard Intel Core i7 processor, and a large user-programmable Kintex-7 FPGA in a convenient desktop or rack-mountable half-wide 2U form factor.&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 is the equivalent to a USRP X310 with two UBX-160 boards, a GPSDO and an onboard Intel i7 computer. The USRP-2974 comes with NI Linux RTOS pre-installed, but in order to use it with open-source tool-chain, a user will need to install Linux (preferably Fedora or Ubuntu) and then the USRP Hardware driver (UHD). After these have been installed, any other open-source tools can be installed, such as GNU Radio.&lt;br /&gt;
&lt;br /&gt;
== Key Features of the USRP-2974==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Intel Core i7 6822EQ 2GHz Quad CoreProcessor&lt;br /&gt;
* 16GB DDR4 Memory&lt;br /&gt;
* 512GB SSD&lt;br /&gt;
* USB-to-UART to the CPU&lt;br /&gt;
* Xilinx Kintex-7 XC7K410T FPGA&lt;br /&gt;
* 14 bit 200 MS/s ADC&lt;br /&gt;
* 16 bit 800 MS/s DAC&lt;br /&gt;
* Frequency range: 10 MHz - 6 GHz&lt;br /&gt;
* Up 160MHz&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; bandwidth per channel&lt;br /&gt;
* 2 Transmit ports&lt;br /&gt;
* 2 Receive ports&lt;br /&gt;
* GPSDO&lt;br /&gt;
* Multiple high-speed interfaces (Dual 10G, PCIe Express, 1G)&lt;br /&gt;
|[[File:USRP_2974_frt_dia.jpg|350px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Controller - Onboard computer ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|System on module (SoM) &lt;br /&gt;
|Congatec COM Express conga-TS170&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|CPU&lt;br /&gt;
|Intel Core i7 6822EQ (2 GHz Quad Core)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Memory &lt;br /&gt;
|SO-DIMM DDR4 16 GB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SFP+&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &lt;br /&gt;
|10G ETH connection to the SoM&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Cabled PCIe&lt;br /&gt;
|PCIe Gen 2 x4&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|MicroUSB&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|USB-to-UART to the SoM&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|RJ45&lt;br /&gt;
|1G ETH host connection&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; Can be bypassed to the FPGA.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; Device port for external host.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
==RF Specifications==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Transmitter&lt;br /&gt;
|-&lt;br /&gt;
|Number of channels&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Frequency range&lt;br /&gt;
|10MHz to 6GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency step&lt;br /&gt;
|&amp;lt;1kHz&lt;br /&gt;
|-&lt;br /&gt;
|Maximum output power&lt;br /&gt;
|5mW to 100mW (7dBm to 20dBm)&lt;br /&gt;
|-&lt;br /&gt;
|Gain range&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
|0dB to 31.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Gain step&lt;br /&gt;
|0.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum instantaneous real-time bandwidth&lt;br /&gt;
|160MHz&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Receiver&lt;br /&gt;
|-&lt;br /&gt;
|Number of channels&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Frequency range&lt;br /&gt;
|10MHz to 6GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency step&lt;br /&gt;
|&amp;lt;1kHz&lt;br /&gt;
|-&lt;br /&gt;
|Gain range&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|0dB to 37.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Gain step&lt;br /&gt;
|0.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum input power&lt;br /&gt;
|10dBm&lt;br /&gt;
|-&lt;br /&gt;
|Noise Figure&lt;br /&gt;
|5dB to 7dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum instantaneous real-time bandwidth&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&lt;br /&gt;
|160MHz&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; The output power resulting from the gain setting varies over the frequency band and among&lt;br /&gt;
devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;The received signal amplitude resulting from the gain setting varies over the frequency band and&lt;br /&gt;
among devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;The USRP-2974 receiver path has 84 MHz of bandwidth for center frequencies from 10 MHz to&lt;br /&gt;
500 MHz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' As mentioned earlier, the USRP-2974 incorporates 2 UBX-160 daughterboards. Therefore, for more information on RF performance, please see the [[UBX | UBX hardware resource]] page&lt;br /&gt;
&lt;br /&gt;
==Hardware Specifications==&lt;br /&gt;
===USRP Hardware Driver (UHD) version===&lt;br /&gt;
* Minimum version of UHD required: '''3.15.0'''&lt;br /&gt;
&lt;br /&gt;
===Clocking and Sampling Rates===&lt;br /&gt;
There are two master clock rates (MCR) supported on the USRP-2974 like on the X310: 200.0 MHz and 184.32 MHz.&lt;br /&gt;
&lt;br /&gt;
The sampling rate must be an integer decimation rate of the MCR. Ideally, this decimation factor should be an even number. An odd decimation factor will result in additional unwanted attenuation (roll-off from the CIC filter in the DUC and DDC blocks in the FPGA). The valid decimation rates are between 1 and 1024.&lt;br /&gt;
&lt;br /&gt;
For the MCR of 200.0 MHz, the achievable sampling rates using an even decimation factor are 200.0, 100.0, 50.0, 33.33, 25.0, 20.0, 16.67, 14.286 Msps, ... 195.31 Ksps.&lt;br /&gt;
&lt;br /&gt;
For the MCR of 184.32 MHz, the achievable sampling rates using an even decimation factor are 184.32, 92.16, 46.08, 30.72, 23.04, 18.432, 15.36, 13.166 Msps, ... 180.0 Ksps.&lt;br /&gt;
&lt;br /&gt;
If the desired sampling rate is not directly supported by the hardware, then it will be necessary to re-sample in software. This can be done in C++ using libraries such as Liquid DSP [https://github.com/jgaeddert/liquid-dsp], or can be done in GNU Radio, in which there are three blocks that perform sampling rate conversion.&lt;br /&gt;
&lt;br /&gt;
==Physical Specifications==&lt;br /&gt;
&lt;br /&gt;
===Dimensions===&lt;br /&gt;
(L × W × H) 29.08 cm × 21.84 cm × 7.98 cm (11.45 in. × 8.60 in. × 3.14 in. )&lt;br /&gt;
&lt;br /&gt;
===Weight===&lt;br /&gt;
3.34 kg (7.35 lb)&lt;br /&gt;
&lt;br /&gt;
==Power==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|Voltage range&lt;br /&gt;
|14.25 V to 15.75 V DC&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Current&lt;br /&gt;
|10 A, maximum&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Power&lt;br /&gt;
|150 W, maximum&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' Indoor use only&lt;br /&gt;
&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* 0 °C to 50 °C&lt;br /&gt;
&lt;br /&gt;
===Maximum altitude===&lt;br /&gt;
* 2,000 m (800 mbar) (at 25 °C ambient temperature)&lt;br /&gt;
&lt;br /&gt;
===Operating Humidity Range===&lt;br /&gt;
* 10% to 90% non-condensing&lt;br /&gt;
&lt;br /&gt;
===Pollution Degree===&lt;br /&gt;
* 2&lt;br /&gt;
&lt;br /&gt;
==System Diagram and Schematics==&lt;br /&gt;
&lt;br /&gt;
===System Block Diagram===&lt;br /&gt;
[[file:2974_blk_dia.png |800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.ni.com/documentation/en/usrp-software-defined-radio-stand-alone-device/latest/usrp-2974/block-diagram/ Detailed System Block Diagram]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schematics===&lt;br /&gt;
Because the USRP-2974 is a combination of an Intel i7 SOM and an X310 USRP, a user can reference the X310 Schematics.&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/schematics/x300/x3xx.pdf X310 Schematics]&lt;br /&gt;
&lt;br /&gt;
==Key Component Datasheets==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%&amp;quot;&lt;br /&gt;
!Part Number&lt;br /&gt;
!Description&lt;br /&gt;
!Schematic ID (Page)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.congatec.com/fileadmin/user_upload/Documents/Datasheets/conga-TS170.pdf conga-TS170]&lt;br /&gt;
|System on Module (SoM)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.xilinx.com/support/documentation/data_sheets/ds180_7Series_Overview.pdf XC7K410T]&lt;br /&gt;
|FPGA&lt;br /&gt;
|U23 (3,5,8,9,10,18)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/AD9146.PDF AD9146]&lt;br /&gt;
|Dual Channel, 16-Bit, 1230 MSPS DAC&lt;br /&gt;
|U12, U36 (7)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/slas635b/slas635b.pdf ADS62P48]&lt;br /&gt;
|Dual Channel, 14-Bit 210 MSPS ADC&lt;br /&gt;
|U11, U35 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.onsemi.com/pub/Collateral/FIN1002-D.pdf FIN1002]&lt;br /&gt;
|High Speed Differential Receiver&lt;br /&gt;
|U3, U5, U31, U32 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/20001203U.pdf 24LC256T]&lt;br /&gt;
|EEPROM&lt;br /&gt;
|U530 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/lmk04816.pdf LMK04816BISQ/NOPB_1/3]&lt;br /&gt;
|Jitter Cleaner With Dual Loop PLLs&lt;br /&gt;
|U531 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/sy89547l.pdf SY89547LMGTR]&lt;br /&gt;
|Multiplexer&lt;br /&gt;
|U506 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/sn74aup1t17.pdf SN74AUP1T17]&lt;br /&gt;
|Single Schmitt-Trigger Buffer Gate&lt;br /&gt;
|U6, U519 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps54620.pdf TPS54620RGYT]&lt;br /&gt;
|Synchronous Step Down SWIFT™ Converter&lt;br /&gt;
|U515 (21); U516 (26)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/1764fb.pdf LT1764EQ-3.3]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U27 (21); U516 (26)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps7a47.pdf TPS7A47]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U28, U532 (21)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/3603fc.pdf LTC3603EUF_TRPBF]&lt;br /&gt;
|Monolithic Synchronous Step-Down Regulator&lt;br /&gt;
|U517 (23); U500 (25); U514, U513 (27)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/product/TPS77625-EP?keyMatch=TPS77625&amp;amp;tisearch=Search-EN-Everything TPS77625]&lt;br /&gt;
|Low-Dropout Voltage Regulators&lt;br /&gt;
|U30 (23)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps79318-ep.pdf TPS79318_SM]&lt;br /&gt;
|Low-Dropout Voltage Regulators&lt;br /&gt;
|U510 (27)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Media:agile9598503.pdf|OSC-96MHZ-724821-01]]&lt;br /&gt;
|Voltage Controlled Crystal Oscillator&lt;br /&gt;
|U25 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==FPGA and Baseband==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|FPGA &lt;br /&gt;
|Kintex-7 XC7K410T&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|DRAM &lt;br /&gt;
|1 GB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Baseband analog-to-digital converter&lt;br /&gt;
(ADC) resolution&lt;br /&gt;
|14 bit&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Baseband digital-to-analog converter&lt;br /&gt;
(DAC) resolution&lt;br /&gt;
|16 bit&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|ADC spurious-free dynamic range (sFDR)&lt;br /&gt;
|88 dB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|DAC sFDR&lt;br /&gt;
|80 dB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Maximum I/Q sample rate&lt;br /&gt;
|200 MS/s&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SFP+&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &lt;br /&gt;
|High speed serial link to one of the FPGA&lt;br /&gt;
GTX transceivers&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;Can be bypassed to the SoM if using the 10 GbE as protocol.&lt;br /&gt;
&lt;br /&gt;
===FPGA User Modifications===&lt;br /&gt;
&lt;br /&gt;
The Verilog code for the FPGA in the NI USRP-2974 is open-source, and users are free to modify and customize it for their needs. However, certain modifications may result in either bricking the device, or even in physical damage to the unit. Specifically, changing the I/O interface of the FPGA in any way (do not remove any of the I/O for the PCIe interface, such as &amp;lt;code&amp;gt;x300_pcie_int&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;LvFpga_Chinch_Interface&amp;lt;/code&amp;gt;), or modifying the pin and timing constraint files, could result in physical damage to other components on the motherboard, external to the FPGA, and doing this will void the warranty. Also, even if the PCIe interface is not being used, you cannot remove or reassign these pins in the constraint file. The constraint files should not be modified. Please note that modifications to the FPGA are made at the risk of the user, and may not be covered by the warranty of the device.&lt;br /&gt;
&lt;br /&gt;
==Interfaces and Connectivity==&lt;br /&gt;
Follow the links below for additional information on configuring each interface for the USRP-2974.&lt;br /&gt;
&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_10gige Dual 10 Gigabit Ethernet] - 200 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_pcie PCIe Express (Desktop)] - 200 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_1gige 1 Gigabit Ethernet] - 25 MS/s Full Duplex @ 16-bit&lt;br /&gt;
&lt;br /&gt;
===Front Panel===&lt;br /&gt;
&lt;br /&gt;
[[File:USRP-2974 Front Panel.jpg|800px]]&lt;br /&gt;
[[File:2974_frt_wireframe.png|800px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Connector&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''Use'''&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RF 0&lt;br /&gt;
|TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|Input and output terminal for the RF signal. TX1 RX1 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input or output channel.&lt;br /&gt;
|-&lt;br /&gt;
|RX2&lt;br /&gt;
|Input terminal for the RF signal. RX2 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | AUX I/O&lt;br /&gt;
|General-purpose I/O (GPIO) port. AUX I/O is controlled by the FPGA.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RF 1&lt;br /&gt;
|TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|Input and output terminal for the RF signal. TX1 RX1 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input or output channel.&lt;br /&gt;
|-&lt;br /&gt;
|RX2&lt;br /&gt;
|Input terminal for the RF signal. RX2 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | DP&lt;br /&gt;
|DisplayPort connector to connect one monitor for your controller.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | USB2.0&lt;br /&gt;
|USB ports that support common USB peripheral devices such as flash drives, hard drives, keyboards, and mice.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | USB3.0&lt;br /&gt;
|USB ports that support common USB peripheral devices such as flash drives, hard drives, keyboards, and mice.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G ETH&lt;br /&gt;
|RJ45 port used for 1G ETH connectivity to other ethernet devices.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | μUSB&lt;br /&gt;
|USB port used for UART connectivity to the controller.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 0&lt;br /&gt;
|SFP+ port used for 10G ETH connectivity to other ethernet devices. Connects to the embedded Linux computer for communication with LabVIEW RT.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 1&lt;br /&gt;
|SFP+ port used for 1G/10G ETH connectivity to other ethernet devices. Connects to the FPGA. Not currently supported in LabVIEW Communications System Design Suite.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''LED'''&lt;br /&gt;
!'''Description'''&lt;br /&gt;
!'''Color'''&lt;br /&gt;
!'''State'''&lt;br /&gt;
!'''Indication'''&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;5&amp;quot; | RF 0&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates thetransmit status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not active.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is transmitting data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RX2&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the receive status of the device.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot;| REF&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates the status of the reference signal.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no reference signal, or the device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; |Green&lt;br /&gt;
|Blinking&lt;br /&gt;
|The device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| PPS&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the pulse per second (PPS).&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no PPS timing reference signal, or the device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Blinking&lt;br /&gt;
|The device is locked to the PPS timing reference signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| GPS&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates whether the GPSDO is locked.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no GPSDO or the GPSDO is not locked.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The GPSDO is locked.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;5&amp;quot; | RF 1&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates thetransmit status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not active.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is transmitting data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RX2&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the receive status of the device.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| Status&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device initialized successfully and is ready for use.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Blinking&lt;br /&gt;
|Hardware error. An internal power supply has failed. Check front-panel I/O connections for shorts. Remove any shorts and cycle power to the USRP-2974. Contact NI if the problem persists.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| PWR&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the power status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is powered off.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The devices is powered on.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot; | 10/100/1000&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot;| Indicates the speed of the Gigabit Ethernet link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|No link, or 10 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|100 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
|Amber&lt;br /&gt;
|Solid&lt;br /&gt;
|1,000 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot;| ACT/LINK	&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Indicates the Gigabit Ethernet link activity or status.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|No link has been established.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Green&lt;br /&gt;
|Solid&lt;br /&gt;
|A link has been negotiated.&lt;br /&gt;
|-&lt;br /&gt;
|Blinking&lt;br /&gt;
|Activity on the link.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; | 1G/10G ETH 0&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | ACT/LINK&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Indicates the status of the SFP+ port.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The link is down.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The link is up.&lt;br /&gt;
|-&lt;br /&gt;
|Blinking&lt;br /&gt;
|The link is active (transmitting and receiving).&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |10GbE&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Indicates the status of the 10G ETH link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The 10G ETH link is down.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The 10G ETH link is up.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 1 10GbE&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Indicates the status of the 10G ETH link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The 10G ETH link is down.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The 10G ETH link is up.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Rear Panel===&lt;br /&gt;
[[File:USRP-2974 Rear Panel.jpg|800px]]&lt;br /&gt;
[[File:2974_back_wireframe.png|800px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Connector&lt;br /&gt;
!Use&lt;br /&gt;
|-&lt;br /&gt;
|REF OUT&lt;br /&gt;
|Output terminal for an external reference signal for the LO on the device. REF OUT is an SMA (f) connector with an impedance of 50 Ω, and it is a single-ended reference output. The output signal at this connector is 10 MHz at 3.3 V.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|REF IN&lt;br /&gt;
|Input terminal for an external reference signal for the LO on the device. REF IN is an SMA (f) connector with an impedance of 50 Ω, and it is a single-ended reference input. REF IN accepts a 10 MHz signal with a minimum input power of 0 dBm (0.632 Vpk-pk) and a maximum input power of 15 dBm (3.56 Vpk-pk) for a square wave or sine wave.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PPS TRIG OUT	&lt;br /&gt;
|Output terminal for the PPS timing reference. PPS TRIG OUT is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input. The output signal is 0 V to 3.3 V TTL. You can also use this port as a triggered output (TRIG OUT) that you program with the PPS Trig Out I/O signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PPS TRIG IN	&lt;br /&gt;
|Input terminal for PPS timing reference. PPS TRIG IN is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel. PPS TRIG IN accepts 0 V to 3.3 V TTL and 0 V to 5 V TTL signals. You can also use this port as a triggered input (TRIG IN) that you control using NI-USRP software.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|GPS ANT	&lt;br /&gt;
|Input terminal for the GPS antenna signal. GPS ANT is an SMA (f) connector with a maximum input power of -15 dBm and an output of DC 5 V to power an active antenna. &amp;lt;p&amp;gt; '''Notice:''' Do not terminate the GPS ANT port if you do not use it.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PCIe x4	&lt;br /&gt;
|Port for a PCI Express Generation 2, x4 bus connection through an MXI Express four-lane cable. Can be used to connect an external USRP device or external chassis.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SYSTEM POWER IN	&lt;br /&gt;
|Input that accepts a 15 V ± 5%, 10 A external DC power connector.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Ref Clock - 10 MHz===&lt;br /&gt;
Using an external 10 MHz reference clock, a square wave will offer the best phase noise performance, but a sinusoid is acceptable. The power level of the reference clock cannot exceed +15 dBm.&lt;br /&gt;
&lt;br /&gt;
===PPS - Pulse Per Second===&lt;br /&gt;
Using a PPS signal for timestamp synchronization requires a square wave signal with the following a 5Vpp amplitude.&lt;br /&gt;
&lt;br /&gt;
To test the PPS input, you can use the following tool from the UHD examples:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;args&amp;gt;&amp;lt;/code&amp;gt; are device address arguments (optional if only one USRP device is on your machine)&lt;br /&gt;
&lt;br /&gt;
    cd &amp;lt;install-path&amp;gt;/lib/uhd/examples ./test_pps_input –args=&amp;lt;args&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Front Panel GPIO===&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;width:50%&amp;quot; |&lt;br /&gt;
The GPIO port is not meant to drive big loads. You should not try to source more than 5mA per pin.&lt;br /&gt;
&lt;br /&gt;
The +3.3V is for ESD clamping purposes only and not designed to deliver high currents.&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | [[File:x3x0 gpio conn.png]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Power on state====&lt;br /&gt;
The hardware power on state and UHD initial state for the front-panel GPIOs is high-Z. For the X3xx, there are no external pull-ups/pull-downs for the GPIO pins, but the FPGAs do have them and they are configured as follows: X3xx: pull-down.&lt;br /&gt;
&lt;br /&gt;
====Pin Mapping====&lt;br /&gt;
* Pin 1: +3.3V&lt;br /&gt;
* Pin 2: Data[0]&lt;br /&gt;
* Pin 3: Data[1]&lt;br /&gt;
* Pin 4: Data[2]&lt;br /&gt;
* Pin 5: Data[3]&lt;br /&gt;
* Pin 6: Data[4]&lt;br /&gt;
* Pin 7: Data[5]&lt;br /&gt;
* Pin 8: Data[6]&lt;br /&gt;
* Pin 9: Data[7]&lt;br /&gt;
* Pin 10: Data[8]&lt;br /&gt;
* Pin 11: Data[9]&lt;br /&gt;
* Pin 12: Data[10]&lt;br /&gt;
* Pin 13: Data[11]&lt;br /&gt;
* Pin 14: 0V&lt;br /&gt;
* Pin 15: 0V&lt;br /&gt;
&lt;br /&gt;
'''Note''': Please see the [http://files.ettus.com/manual/page_gpio_api.html E3x0/X3x0 GPIO API] for information on configuring and using the GPIO bus.&lt;br /&gt;
&lt;br /&gt;
==Certifications==&lt;br /&gt;
===RoHS===&lt;br /&gt;
As of December 1st, 2010 all NI/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;
[http://files.ettus.com/manual/md_fpga.html FPGA Resources]&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/binaries/uhd_stable/ UHD Stable Binaries]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/EttusResearch/uhd UHD Source Code on Github]&lt;br /&gt;
&lt;br /&gt;
==Choosing an Interface==&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 provides three interface options – 1 Gigabit Ethernet (1 GigE), 10 Gigabit Ethernet (10 GigE), and PCI-Express (PCIe). The PCIe interface is always available regardless of what FPGA image is loaded. Ettus ships two FPGA image variants, the HG or HGS image which has one 1 GigE interfaces and one 10 GigE interfaces, and the XG image which has two 10 GigE interfaces. Generally, Ettus Research recommends using 10 GigE to achieve the maximum throughput available from the USRP-2974.  PCIe is recommended for applications that require the lowest possible latency, which is a desirable characteristic for PHY/MAC research.  If your application does not require the full bandwidth of the USRP-2974, the 1 GigE interface serves as a cost-effective fall-back option.  Ettus Research provides a complete interface kit for each of these options, which is also shown in the following table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|Interface Performance Summary&lt;br /&gt;
|-&lt;br /&gt;
!Interface&lt;br /&gt;
!Throughput (MS/s @ 16-bit)&lt;br /&gt;
!Target&lt;br /&gt;
!Recommended Kit&lt;br /&gt;
|-&lt;br /&gt;
|1 Gigabit&lt;br /&gt;
|25 MS/s&lt;br /&gt;
|Desktop/Laptop&lt;br /&gt;
|[https://www.ettus.com/product/details/1GIGE-KIT SFP Adapter + GigE Cable]&lt;br /&gt;
|-&lt;br /&gt;
|10 Gigabit&lt;br /&gt;
|200 MS/s&lt;br /&gt;
|Desktop&lt;br /&gt;
|[https://www.ettus.com/product/details/10GIGE-KIT 10 GigE Interface Kit]&lt;br /&gt;
|-&lt;br /&gt;
|PCI-Express &lt;br /&gt;
(PCIe, 4 lane)&lt;br /&gt;
|200 MS/S&lt;br /&gt;
|Desktop&lt;br /&gt;
|[https://www.ettus.com/product/details/PCIE-KIT PCI-Express Desktop Kit]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===10 Gigabit Ethernet===&lt;br /&gt;
In order to utilize the dual 10 Gigabit Ethernet interfaces, ensure the XG image is installed ([http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_load_fpga_imgs_fpga_flavours see FPGA Image Flavors]). In addition to burning the prerequisite FPGA image, it may also be necessary to tune the network interface card (NIC) to eliminate drops (Ds) and reduce overflows (Os). This is done by increasing the number of RX descriptors ([http://files.ettus.com/manual/page_transport.html#transport_udp_linux see Linux specific notes]).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;benchmark_rate&amp;lt;/code&amp;gt; tool can be used to test this capability. Run the following commands to test the X-series USRP over both 10 Gigabit Ethernet interfaces with the maximum rate of 200 Msps per channel:&lt;br /&gt;
&lt;br /&gt;
    cd &amp;lt;install-path&amp;gt;/lib/uhd/examples&lt;br /&gt;
    ./benchmark_rate --args=&amp;quot;type=x300,addr=&amp;lt;Primary IP&amp;gt;,second_addr=&amp;lt;secondary IP&amp;gt;&amp;quot; --channels=&amp;quot;0,1&amp;quot; --rx_rate 200e6&lt;br /&gt;
&lt;br /&gt;
The second interface is specified by the extra argument '''second_addr'''.&lt;br /&gt;
&lt;br /&gt;
'''Recommended 10 Gigabit Ethernet Cards'''&lt;br /&gt;
* Intel X520-DA2&lt;br /&gt;
** [http://ark.intel.com/products/39776/Intel-Ethernet-Converged-Network-Adapter-X520-DA2 Intel® Ethernet Converged Network Adapter X520-DA2]&lt;br /&gt;
* Intel X520-DA1&lt;br /&gt;
** [http://ark.intel.com/products/68669/Intel-Ethernet-Converged-Network-Adapter-X520-DA1 Intel® Ethernet Converged Network Adapter X520-DA1 ]&lt;br /&gt;
* Intel X710-DA2&lt;br /&gt;
** [http://ark.intel.com/products/83964/Intel-Ethernet-Converged-Network-Adapter-X710-DA2 Intel® Ethernet Converged Network Adapter X710-DA2 ]&lt;br /&gt;
* Intel X710-DA4&lt;br /&gt;
** [http://ark.intel.com/products/83965/Intel-Ethernet-Converged-Network-Adapter-X710-DA4 Intel® Ethernet Converged Network Adapter X710-DA4 ]&lt;br /&gt;
* Mellanox MCX4121A-ACAT&lt;br /&gt;
** [https://store.mellanox.com/products/mellanox-mcx4121a-acat-connectx-4-lx-en-network-interface-card-25gbe-dual-port-sfp28-pcie3-0-x8-rohs-r6.html Mellanox MCX4121A-ACAT ]&lt;br /&gt;
&lt;br /&gt;
==GPS Disciplined, Oven-Controlled Oscillator (GPSDO)==&lt;br /&gt;
The USRP-2794 has a high-accuracy GPS-disciplined oscillator (GPSDO).  The GPSDO improves the accuracy of the internal frequency reference to 20 ppb, or 0.1 ppb if the GPS is synchronized to the GPS constellation.  When synchronized to the GPS constellation, all USRP™ devices will also be synchronized in time within 50 ns.&lt;br /&gt;
&lt;br /&gt;
* Support GPSDO NMEA Strings&lt;br /&gt;
* [http://www.jackson-labs.com/assets/uploads/main/LC_XO_specsheet.pdf JacksonLabs LC_XO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
!Internal TCXO&lt;br /&gt;
!GPS-Disciplined Clock&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Reference&lt;br /&gt;
|TCXO&lt;br /&gt;
|OCXO&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Accuracy&lt;br /&gt;
|± 2.5ppm&lt;br /&gt;
± 2,500 Hz @ 1 GHz&lt;br /&gt;
|± 20 ppb&lt;br /&gt;
± 20 Hz @ 1 GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Accuracy&lt;br /&gt;
|&lt;br /&gt;
|± 0.01ppb&lt;br /&gt;
|-&lt;br /&gt;
|(GPS-Disciplined)&lt;br /&gt;
|&lt;br /&gt;
|~ ± 0.01 Hz @ 1 GHz&lt;br /&gt;
|-&lt;br /&gt;
|GPS Time Sync Accuracy&lt;br /&gt;
|&lt;br /&gt;
|±50ns to UTC Time**&lt;br /&gt;
|-&lt;br /&gt;
|10 MHz Reference Phase Drift with GPS Sync&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;±20ns After 1 Hour**&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Sensors===&lt;br /&gt;
You can query the lock status with the &amp;lt;code&amp;gt;gps_locked&amp;lt;/code&amp;gt; sensor, as well as obtain raw NMEA sentences using the &amp;lt;code&amp;gt;gps_gprmc&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;gps_gpgga&amp;lt;/code&amp;gt; sensors. Location information can be parsed out of the &amp;lt;code&amp;gt;gps_gpgga&amp;lt;/code&amp;gt; sensor by using &amp;lt;code&amp;gt;gpsd&amp;lt;/code&amp;gt; or another NMEA parser.&lt;br /&gt;
&lt;br /&gt;
==Option: Using the GPIO Expansion Kit==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top; width:60%&amp;quot;|This General Purpose Input/output (GPIO) breakout kit provides access to general purpose digital I/O signals with simple terminal blocks, and a prototyping area where wires and components can be soldered.  Each GPIO pin is connected to an FPGA digital line allowing it to be configured as an input, or an output, using the various software frameworks that support the USRP™ GPIO. &lt;br /&gt;
&lt;br /&gt;
These GPIO signals can serve the following functions:&lt;br /&gt;
&lt;br /&gt;
* Control of external devices, such as power amplifiers and RF switches&lt;br /&gt;
* Provide output signals that can help with debugging&lt;br /&gt;
* Provide observables to be analyzed by oscilloscopes or other external equipment&lt;br /&gt;
* Accept input from external devices for local, software-based triggering&lt;br /&gt;
* Implement a protocol line such as SPI or I2C&lt;br /&gt;
||[[File:Product_x3x0_gpio.jpg|250px]]&lt;br /&gt;
|}&lt;br /&gt;
===GPIO Expansion Kit Contents===&lt;br /&gt;
&lt;br /&gt;
*1 GPIO Breakout Board&lt;br /&gt;
*1 DB-15, 1-meter cable&lt;br /&gt;
*GPIO Quick Reference&lt;br /&gt;
&lt;br /&gt;
===Circuit Protection===&lt;br /&gt;
The GPIO signals exposed with this breakout kit are routed directly to the USRP device's FPGA with limited protection circuitry.  However, the user must take precautionary measures to ensure input/output signals meet the specifications shown in this document.  Over voltage, excess current draw, and other conditions can damage the USRP device and void the warranty. Special care should be taken when the USRP is powered off.&lt;br /&gt;
&lt;br /&gt;
===Mounting the GPIO Breakout Board===&lt;br /&gt;
The GPIO breakout board can be mounted directly to the DB15 connector of a USRP ™ device, or mounted remotely with the cable provided in this kit.  The screws on the DB15 connector of the breakout board must be removed to mount the board directly.  For remote mounting, the breakout board is supplied with rubber standoffs to avoid scratching surfaces, and several through-holes for hard mounting with screws or other hardware (not provided).&lt;br /&gt;
&lt;br /&gt;
===Using GPIO with UHD, GNU Radio, and other Third-Party Frameworks===&lt;br /&gt;
When used with UHD, or other third party frameworks that leverage UHD, the GPIO expansion can be controlled with simple API calls.  For more information, on the C++ API, and examples of how to use the GPIO in frameworks such as GNU Radio, please see the [[Application Notes]] section of the [https://kb.ettus.com Ettus Research Knowledge Base].&lt;br /&gt;
&lt;br /&gt;
===GPIO Specifications (3.3V Bank, LVCMOS)===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Parameter&lt;br /&gt;
!Typical&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Configured as Input&lt;br /&gt;
|-&lt;br /&gt;
|Default Voltage Standard&lt;br /&gt;
|3.3V LVCMOS&lt;br /&gt;
|-&lt;br /&gt;
|Voltage High Threshold&lt;br /&gt;
|2.0V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Low Threshold&lt;br /&gt;
|0.8V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Input Limits (no damage) &lt;br /&gt;
| -0.3V/3.45V&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Configured as Output&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Standard&lt;br /&gt;
|3.3V LVCMOS&lt;br /&gt;
|-&lt;br /&gt;
|Voltage High Output&lt;br /&gt;
|2.8V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Low Output&lt;br /&gt;
|0.4V&lt;br /&gt;
|-&lt;br /&gt;
|Current Source Capability&lt;br /&gt;
|12 mA&lt;br /&gt;
|-&lt;br /&gt;
|Output Source Impedance&lt;br /&gt;
|&amp;gt;33 ohms typical&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Option: Antenna Kit for GPSDO==&lt;br /&gt;
The GPSDO Mini Kit will improve the accuracy of the USRP reference clock, even if it does not receive signals from the GPS Constellation.  However, to achieve the best accuracy possible, and to achieve global timing alignment across multiple USRPs, Ettus Research recommends the GPSDO Mini Antenna Kit.&lt;br /&gt;
&lt;br /&gt;
==Option: Cables for MIMO Expansion==&lt;br /&gt;
Multiple USRP-2974s can be synchronized for coherent operation by sharing a common 10 MHz and 1 PPS signal.  We recommend using a star-distribution topology with an OctoClock or OctoClock-G, as seen in Figure 4.  This requires matched length cables to be used for both 10 MHz and 1 PPS.&lt;br /&gt;
&lt;br /&gt;
For more information about MIMO operation, please see the MIMO and Synchronization Application Note.&lt;br /&gt;
[[File:8mimo.png|700px|center]]&lt;br /&gt;
&amp;lt;center&amp;gt;Figure 4 - Star-Distribution of 10 MHz/PPS Signals with OctoClock&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
&lt;br /&gt;
* '''What is the bandwidth of the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
The ADC rate on each analog RX channel is 200 MS/s quadrature, which provides a theoretical analog bandwidth of approximately 80% of the Nyquist bandwidth of +/- 100 MHz (+/- 80 MHz around the center frequency).  The resulting maximum theoretical analog bandwidth is 160 MHz.&lt;br /&gt;
&lt;br /&gt;
FPGA Processing Bandwidth: Up to 200 MS/s quadrature.&lt;br /&gt;
&lt;br /&gt;
Host Bandwidth:  Up to 200 MS/s quadrature, dependent on selected interface&lt;br /&gt;
&lt;br /&gt;
For more information about achieving the maximum bandwidth with a USRP-2974, please see the &amp;quot;USRP X300/X310 Configuration Guide&amp;quot; or the &amp;quot;USRP System Bandwidth&amp;quot; application note.&lt;br /&gt;
&lt;br /&gt;
* '''How can I program the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
Like all other USRP models, the USRP-2974 is compatible with the USRP Hardware Driver™ (UHD) architecture.  The UHD architecture is a common driver that allows users to develop and execute applications on the onboard or host computer.  UHD provides a direct C++ API to control and stream to/from the USRP-2974.  It also provides compatibility with a variety of third-party software frameworks including GNU Radio, LabVIEW, and MATLAB.  You may also customize the FPGA image provided with UHD to integrate your own signal processing. For more information about UHD, and supported software frameworks, please see:&lt;br /&gt;
&lt;br /&gt;
http://files.ettus.com/manual/&lt;br /&gt;
&lt;br /&gt;
* '''How do I update the FPGA images and firmware with the latest from UHD'''&lt;br /&gt;
&lt;br /&gt;
You can find more information about updating the FPGA image through PCIe, 1/10 GigE, and JTAG [https://kb.ettus.com/X300/X310_Device_Recovery here].&lt;br /&gt;
&lt;br /&gt;
* '''How can I modify the FPGA of the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
The source code (Verilog) for the USRP-2794 is available in the UHD repository. The build process leverages the existing CMAKE build system used to compile the host-side driver.  A Linux-based setup will provide the best results.&lt;br /&gt;
&lt;br /&gt;
Which FPGA toolchain required to build the FPGA images will depend upon your version of UHD. For more details please see the [https://kb.ettus.com/UHD UHD] Software Resource page.&lt;br /&gt;
&lt;br /&gt;
* '''How much free space is available in the USRP-2974 FPGA'''&lt;br /&gt;
&lt;br /&gt;
Please see the [[#Utilization statistics]] section of this resources page for more information.&lt;br /&gt;
&lt;br /&gt;
* '''What frequency range does the USRP-2974 cover'''&lt;br /&gt;
&lt;br /&gt;
10MHz to 6GHz.&lt;br /&gt;
&lt;br /&gt;
* '''What components do I need to purchase for a complete USRP-2974 system'''&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 is a complete stand alone SDR. Additional components might include RF filters, antennas, RF power amplifiers or other RF components needed of a specific application.&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP-2974&amp;diff=4163</id>
		<title>USRP-2974</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=USRP-2974&amp;diff=4163"/>
				<updated>2019-06-01T18:37:57Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* RF Specifications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The NI USRP-2974 is a high-performance, USRP software defined radio (SDR) stand-alone device for designing and deploying next generation wireless communications systems. The hardware architecture combines two extended-bandwidth daughterboard slots covering 10 MHz – 6 GHz with up to 160 MHz of baseband bandwidth, multiple high-speed interface options (PCIe, dual 10 GigE), an onboard Intel Core i7 processor, and a large user-programmable Kintex-7 FPGA in a convenient desktop or rack-mountable half-wide 2U form factor.&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 is the equivalent to a USRP X310 with two UBX-160 boards, a GPSDO and an onboard Intel i7 computer. The USRP-2974 comes with NI Linux RTOS pre-installed, but in order to use it with open-source tool-chain, a user will need to install Linux (preferably Fedora or Ubuntu) and then the USRP Hardware driver (UHD). After these have been installed, any other open-source tools can be installed, such as GNU Radio.&lt;br /&gt;
&lt;br /&gt;
== Key Features of the USRP-2974==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Intel Core i7 6822EQ 2GHz Quad CoreProcessor&lt;br /&gt;
* 16GB DDR4 Memory&lt;br /&gt;
* 512GB SSD&lt;br /&gt;
* USB-to-UART to the CPU&lt;br /&gt;
* Xilinx Kintex-7 XC7K410T FPGA&lt;br /&gt;
* 14 bit 200 MS/s ADC&lt;br /&gt;
* 16 bit 800 MS/s DAC&lt;br /&gt;
* Frequency range: 10 MHz - 6 GHz&lt;br /&gt;
* Up 160MHz&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; bandwidth per channel&lt;br /&gt;
* 2 Transmit ports&lt;br /&gt;
* 2 Receive ports&lt;br /&gt;
* GPSDO&lt;br /&gt;
* Multiple high-speed interfaces (Dual 10G, PCIe Express, 1G)&lt;br /&gt;
|[[File:USRP_2974_frt_dia.jpg|350px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Controller - Onboard computer ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|System on module (SoM) &lt;br /&gt;
|Congatec COM Express conga-TS170&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|CPU&lt;br /&gt;
|Intel Core i7 6822EQ (2 GHz Quad Core)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Memory &lt;br /&gt;
|SO-DIMM DDR4 16 GB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SFP+&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &lt;br /&gt;
|10G ETH connection to the SoM&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Cabled PCIe&lt;br /&gt;
|PCIe Gen 2 x4&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|MicroUSB&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|USB-to-UART to the SoM&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|RJ45&lt;br /&gt;
|1G ETH host connection&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; Can be bypassed to the FPGA.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; Device port for external host.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
==RF Specifications==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Transmitter&lt;br /&gt;
|-&lt;br /&gt;
|Number of channels&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Frequency range&lt;br /&gt;
|10MHz to 6GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency step&lt;br /&gt;
|&amp;lt;1kHz&lt;br /&gt;
|-&lt;br /&gt;
|Maximum output power&lt;br /&gt;
|5mW to 100mW (7dBm to 20dBm)&lt;br /&gt;
|-&lt;br /&gt;
|Gain range&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
|0dB to 31.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Gain step&lt;br /&gt;
|0.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum instantaneous real-time bandwidth&lt;br /&gt;
|160MHz&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Receiver&lt;br /&gt;
|-&lt;br /&gt;
|Number of channels&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Frequency range&lt;br /&gt;
|10MHz to 6GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency step&lt;br /&gt;
|&amp;lt;1kHz&lt;br /&gt;
|-&lt;br /&gt;
|Gain range&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|0dB to 37.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Gain step&lt;br /&gt;
|0.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum input power&lt;br /&gt;
|10dBm&lt;br /&gt;
|-&lt;br /&gt;
|Noise Figure&lt;br /&gt;
|5dB to 7dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum instantaneous real-time bandwidth&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&lt;br /&gt;
|160MHz&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; The output power resulting from the gain setting varies over the frequency band and among&lt;br /&gt;
devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;The received signal amplitude resulting from the gain setting varies over the frequency band and&lt;br /&gt;
among devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;The USRP-2974 receiver path has 84 MHz of bandwidth for center frequencies from 10 MHz to&lt;br /&gt;
500 MHz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' As mentioned earlier, the USRP-2974 incorporates 2 UBX-160 daughterboards. Therefore, for more information on RF performance, please see the [[UBX | UBX hardware resource]] page&lt;br /&gt;
&lt;br /&gt;
==Hardware Specifications==&lt;br /&gt;
===USRP Hardware Driver (UHD) version===&lt;br /&gt;
* Minimum version of UHD required: '''3.15.0'''&lt;br /&gt;
&lt;br /&gt;
===Clocking and Sampling Rates===&lt;br /&gt;
There are two master clock rates (MCR) supported on the USRP-2974 like on the X310: 200.0 MHz and 184.32 MHz.&lt;br /&gt;
&lt;br /&gt;
The sampling rate must be an integer decimation rate of the MCR. Ideally, this decimation factor should be an even number. An odd decimation factor will result in additional unwanted attenuation (roll-off from the CIC filter in the DUC and DDC blocks in the FPGA). The valid decimation rates are between 1 and 1024.&lt;br /&gt;
&lt;br /&gt;
For the MCR of 200.0 MHz, the achievable sampling rates using an even decimation factor are 200.0, 100.0, 50.0, 33.33, 25.0, 20.0, 16.67, 14.286 Msps, ... 195.31 Ksps.&lt;br /&gt;
&lt;br /&gt;
For the MCR of 184.32 MHz, the achievable sampling rates using an even decimation factor are 184.32, 92.16, 46.08, 30.72, 23.04, 18.432, 15.36, 13.166 Msps, ... 180.0 Ksps.&lt;br /&gt;
&lt;br /&gt;
If the desired sampling rate is not directly supported by the hardware, then it will be necessary to re-sample in software. This can be done in C++ using libraries such as Liquid DSP [https://github.com/jgaeddert/liquid-dsp], or can be done in GNU Radio, in which there are three blocks that perform sampling rate conversion.&lt;br /&gt;
&lt;br /&gt;
==Physical Specifications==&lt;br /&gt;
&lt;br /&gt;
===Dimensions===&lt;br /&gt;
(L × W × H) 29.08 cm × 21.84 cm × 7.98 cm (11.45 in. × 8.60 in. × 3.14 in. )&lt;br /&gt;
&lt;br /&gt;
===Weight===&lt;br /&gt;
3.34 kg (7.35 lb)&lt;br /&gt;
&lt;br /&gt;
==Power==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|Voltage range&lt;br /&gt;
|14.25 V to 15.75 V DC&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Current&lt;br /&gt;
|10 A, maximum&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Power&lt;br /&gt;
|150 W, maximum&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' Indoor use only&lt;br /&gt;
&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* 0 °C to 50 °C&lt;br /&gt;
&lt;br /&gt;
===Maximum altitude===&lt;br /&gt;
* 2,000 m (800 mbar) (at 25 °C ambient temperature)&lt;br /&gt;
&lt;br /&gt;
===Operating Humidity Range===&lt;br /&gt;
* 10% to 90% non-condensing&lt;br /&gt;
&lt;br /&gt;
===Pollution Degree===&lt;br /&gt;
* 2&lt;br /&gt;
&lt;br /&gt;
==System Diagram and Schematics==&lt;br /&gt;
&lt;br /&gt;
===System Block Diagram===&lt;br /&gt;
[[file:2974_blk_dia.png |800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.ni.com/documentation/en/usrp-software-defined-radio-stand-alone-device/latest/usrp-2974/block-diagram/ System Block Diagram]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schematics===&lt;br /&gt;
Because the USRP-2974 is a combination of an Intel i7 SOM and an X310 USRP, a user can reference the X310 Schematics.&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/schematics/x300/x3xx.pdf X310 Schematics]&lt;br /&gt;
&lt;br /&gt;
==Key Component Datasheets==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%&amp;quot;&lt;br /&gt;
!Part Number&lt;br /&gt;
!Description&lt;br /&gt;
!Schematic ID (Page)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.congatec.com/fileadmin/user_upload/Documents/Datasheets/conga-TS170.pdf conga-TS170]&lt;br /&gt;
|System on Module (SoM)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.xilinx.com/support/documentation/data_sheets/ds180_7Series_Overview.pdf XC7K410T]&lt;br /&gt;
|FPGA&lt;br /&gt;
|U23 (3,5,8,9,10,18)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/AD9146.PDF AD9146]&lt;br /&gt;
|Dual Channel, 16-Bit, 1230 MSPS DAC&lt;br /&gt;
|U12, U36 (7)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/slas635b/slas635b.pdf ADS62P48]&lt;br /&gt;
|Dual Channel, 14-Bit 210 MSPS ADC&lt;br /&gt;
|U11, U35 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.onsemi.com/pub/Collateral/FIN1002-D.pdf FIN1002]&lt;br /&gt;
|High Speed Differential Receiver&lt;br /&gt;
|U3, U5, U31, U32 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/20001203U.pdf 24LC256T]&lt;br /&gt;
|EEPROM&lt;br /&gt;
|U530 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/lmk04816.pdf LMK04816BISQ/NOPB_1/3]&lt;br /&gt;
|Jitter Cleaner With Dual Loop PLLs&lt;br /&gt;
|U531 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/sy89547l.pdf SY89547LMGTR]&lt;br /&gt;
|Multiplexer&lt;br /&gt;
|U506 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/sn74aup1t17.pdf SN74AUP1T17]&lt;br /&gt;
|Single Schmitt-Trigger Buffer Gate&lt;br /&gt;
|U6, U519 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps54620.pdf TPS54620RGYT]&lt;br /&gt;
|Synchronous Step Down SWIFT™ Converter&lt;br /&gt;
|U515 (21); U516 (26)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/1764fb.pdf LT1764EQ-3.3]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U27 (21); U516 (26)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps7a47.pdf TPS7A47]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U28, U532 (21)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/3603fc.pdf LTC3603EUF_TRPBF]&lt;br /&gt;
|Monolithic Synchronous Step-Down Regulator&lt;br /&gt;
|U517 (23); U500 (25); U514, U513 (27)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/product/TPS77625-EP?keyMatch=TPS77625&amp;amp;tisearch=Search-EN-Everything TPS77625]&lt;br /&gt;
|Low-Dropout Voltage Regulators&lt;br /&gt;
|U30 (23)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps79318-ep.pdf TPS79318_SM]&lt;br /&gt;
|Low-Dropout Voltage Regulators&lt;br /&gt;
|U510 (27)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Media:agile9598503.pdf|OSC-96MHZ-724821-01]]&lt;br /&gt;
|Voltage Controlled Crystal Oscillator&lt;br /&gt;
|U25 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==FPGA and Baseband==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|FPGA &lt;br /&gt;
|Kintex-7 XC7K410T&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|DRAM &lt;br /&gt;
|1 GB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Baseband analog-to-digital converter&lt;br /&gt;
(ADC) resolution&lt;br /&gt;
|14 bit&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Baseband digital-to-analog converter&lt;br /&gt;
(DAC) resolution&lt;br /&gt;
|16 bit&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|ADC spurious-free dynamic range (sFDR)&lt;br /&gt;
|88 dB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|DAC sFDR&lt;br /&gt;
|80 dB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Maximum I/Q sample rate&lt;br /&gt;
|200 MS/s&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SFP+&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &lt;br /&gt;
|High speed serial link to one of the FPGA&lt;br /&gt;
GTX transceivers&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;Can be bypassed to the SoM if using the 10 GbE as protocol.&lt;br /&gt;
&lt;br /&gt;
===FPGA User Modifications===&lt;br /&gt;
&lt;br /&gt;
The Verilog code for the FPGA in the NI USRP-2974 is open-source, and users are free to modify and customize it for their needs. However, certain modifications may result in either bricking the device, or even in physical damage to the unit. Specifically, changing the I/O interface of the FPGA in any way (do not remove any of the I/O for the PCIe interface, such as &amp;lt;code&amp;gt;x300_pcie_int&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;LvFpga_Chinch_Interface&amp;lt;/code&amp;gt;), or modifying the pin and timing constraint files, could result in physical damage to other components on the motherboard, external to the FPGA, and doing this will void the warranty. Also, even if the PCIe interface is not being used, you cannot remove or reassign these pins in the constraint file. The constraint files should not be modified. Please note that modifications to the FPGA are made at the risk of the user, and may not be covered by the warranty of the device.&lt;br /&gt;
&lt;br /&gt;
==Interfaces and Connectivity==&lt;br /&gt;
Follow the links below for additional information on configuring each interface for the USRP-2974.&lt;br /&gt;
&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_10gige Dual 10 Gigabit Ethernet] - 200 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_pcie PCIe Express (Desktop)] - 200 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_1gige 1 Gigabit Ethernet] - 25 MS/s Full Duplex @ 16-bit&lt;br /&gt;
&lt;br /&gt;
===Front Panel===&lt;br /&gt;
&lt;br /&gt;
[[File:USRP-2974 Front Panel.jpg|800px]]&lt;br /&gt;
[[File:2974_frt_wireframe.png|800px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Connector&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''Use'''&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RF 0&lt;br /&gt;
|TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|Input and output terminal for the RF signal. TX1 RX1 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input or output channel.&lt;br /&gt;
|-&lt;br /&gt;
|RX2&lt;br /&gt;
|Input terminal for the RF signal. RX2 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | AUX I/O&lt;br /&gt;
|General-purpose I/O (GPIO) port. AUX I/O is controlled by the FPGA.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RF 1&lt;br /&gt;
|TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|Input and output terminal for the RF signal. TX1 RX1 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input or output channel.&lt;br /&gt;
|-&lt;br /&gt;
|RX2&lt;br /&gt;
|Input terminal for the RF signal. RX2 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | DP&lt;br /&gt;
|DisplayPort connector to connect one monitor for your controller.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | USB2.0&lt;br /&gt;
|USB ports that support common USB peripheral devices such as flash drives, hard drives, keyboards, and mice.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | USB3.0&lt;br /&gt;
|USB ports that support common USB peripheral devices such as flash drives, hard drives, keyboards, and mice.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G ETH&lt;br /&gt;
|RJ45 port used for 1G ETH connectivity to other ethernet devices.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | μUSB&lt;br /&gt;
|USB port used for UART connectivity to the controller.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 0&lt;br /&gt;
|SFP+ port used for 10G ETH connectivity to other ethernet devices. Connects to the embedded Linux computer for communication with LabVIEW RT.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 1&lt;br /&gt;
|SFP+ port used for 1G/10G ETH connectivity to other ethernet devices. Connects to the FPGA. Not currently supported in LabVIEW Communications System Design Suite.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''LED'''&lt;br /&gt;
!'''Description'''&lt;br /&gt;
!'''Color'''&lt;br /&gt;
!'''State'''&lt;br /&gt;
!'''Indication'''&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;5&amp;quot; | RF 0&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates thetransmit status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not active.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is transmitting data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RX2&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the receive status of the device.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot;| REF&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates the status of the reference signal.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no reference signal, or the device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; |Green&lt;br /&gt;
|Blinking&lt;br /&gt;
|The device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| PPS&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the pulse per second (PPS).&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no PPS timing reference signal, or the device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Blinking&lt;br /&gt;
|The device is locked to the PPS timing reference signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| GPS&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates whether the GPSDO is locked.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no GPSDO or the GPSDO is not locked.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The GPSDO is locked.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;5&amp;quot; | RF 1&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates thetransmit status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not active.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is transmitting data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RX2&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the receive status of the device.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| Status&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device initialized successfully and is ready for use.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Blinking&lt;br /&gt;
|Hardware error. An internal power supply has failed. Check front-panel I/O connections for shorts. Remove any shorts and cycle power to the USRP-2974. Contact NI if the problem persists.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| PWR&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the power status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is powered off.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The devices is powered on.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot; | 10/100/1000&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot;| Indicates the speed of the Gigabit Ethernet link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|No link, or 10 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|100 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
|Amber&lt;br /&gt;
|Solid&lt;br /&gt;
|1,000 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot;| ACT/LINK	&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Indicates the Gigabit Ethernet link activity or status.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|No link has been established.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Green&lt;br /&gt;
|Solid&lt;br /&gt;
|A link has been negotiated.&lt;br /&gt;
|-&lt;br /&gt;
|Blinking&lt;br /&gt;
|Activity on the link.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; | 1G/10G ETH 0&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | ACT/LINK&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Indicates the status of the SFP+ port.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The link is down.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The link is up.&lt;br /&gt;
|-&lt;br /&gt;
|Blinking&lt;br /&gt;
|The link is active (transmitting and receiving).&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |10GbE&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Indicates the status of the 10G ETH link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The 10G ETH link is down.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The 10G ETH link is up.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 1 10GbE&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Indicates the status of the 10G ETH link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The 10G ETH link is down.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The 10G ETH link is up.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Rear Panel===&lt;br /&gt;
[[File:USRP-2974 Rear Panel.jpg|800px]]&lt;br /&gt;
[[File:2974_back_wireframe.png|800px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Connector&lt;br /&gt;
!Use&lt;br /&gt;
|-&lt;br /&gt;
|REF OUT&lt;br /&gt;
|Output terminal for an external reference signal for the LO on the device. REF OUT is an SMA (f) connector with an impedance of 50 Ω, and it is a single-ended reference output. The output signal at this connector is 10 MHz at 3.3 V.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|REF IN&lt;br /&gt;
|Input terminal for an external reference signal for the LO on the device. REF IN is an SMA (f) connector with an impedance of 50 Ω, and it is a single-ended reference input. REF IN accepts a 10 MHz signal with a minimum input power of 0 dBm (0.632 Vpk-pk) and a maximum input power of 15 dBm (3.56 Vpk-pk) for a square wave or sine wave.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PPS TRIG OUT	&lt;br /&gt;
|Output terminal for the PPS timing reference. PPS TRIG OUT is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input. The output signal is 0 V to 3.3 V TTL. You can also use this port as a triggered output (TRIG OUT) that you program with the PPS Trig Out I/O signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PPS TRIG IN	&lt;br /&gt;
|Input terminal for PPS timing reference. PPS TRIG IN is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel. PPS TRIG IN accepts 0 V to 3.3 V TTL and 0 V to 5 V TTL signals. You can also use this port as a triggered input (TRIG IN) that you control using NI-USRP software.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|GPS ANT	&lt;br /&gt;
|Input terminal for the GPS antenna signal. GPS ANT is an SMA (f) connector with a maximum input power of -15 dBm and an output of DC 5 V to power an active antenna. &amp;lt;p&amp;gt; '''Notice:''' Do not terminate the GPS ANT port if you do not use it.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PCIe x4	&lt;br /&gt;
|Port for a PCI Express Generation 2, x4 bus connection through an MXI Express four-lane cable. Can be used to connect an external USRP device or external chassis.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SYSTEM POWER IN	&lt;br /&gt;
|Input that accepts a 15 V ± 5%, 10 A external DC power connector.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Ref Clock - 10 MHz===&lt;br /&gt;
Using an external 10 MHz reference clock, a square wave will offer the best phase noise performance, but a sinusoid is acceptable. The power level of the reference clock cannot exceed +15 dBm.&lt;br /&gt;
&lt;br /&gt;
===PPS - Pulse Per Second===&lt;br /&gt;
Using a PPS signal for timestamp synchronization requires a square wave signal with the following a 5Vpp amplitude.&lt;br /&gt;
&lt;br /&gt;
To test the PPS input, you can use the following tool from the UHD examples:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;args&amp;gt;&amp;lt;/code&amp;gt; are device address arguments (optional if only one USRP device is on your machine)&lt;br /&gt;
&lt;br /&gt;
    cd &amp;lt;install-path&amp;gt;/lib/uhd/examples ./test_pps_input –args=&amp;lt;args&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Front Panel GPIO===&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;width:50%&amp;quot; |&lt;br /&gt;
The GPIO port is not meant to drive big loads. You should not try to source more than 5mA per pin.&lt;br /&gt;
&lt;br /&gt;
The +3.3V is for ESD clamping purposes only and not designed to deliver high currents.&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | [[File:x3x0 gpio conn.png]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Power on state====&lt;br /&gt;
The hardware power on state and UHD initial state for the front-panel GPIOs is high-Z. For the X3xx, there are no external pull-ups/pull-downs for the GPIO pins, but the FPGAs do have them and they are configured as follows: X3xx: pull-down.&lt;br /&gt;
&lt;br /&gt;
====Pin Mapping====&lt;br /&gt;
* Pin 1: +3.3V&lt;br /&gt;
* Pin 2: Data[0]&lt;br /&gt;
* Pin 3: Data[1]&lt;br /&gt;
* Pin 4: Data[2]&lt;br /&gt;
* Pin 5: Data[3]&lt;br /&gt;
* Pin 6: Data[4]&lt;br /&gt;
* Pin 7: Data[5]&lt;br /&gt;
* Pin 8: Data[6]&lt;br /&gt;
* Pin 9: Data[7]&lt;br /&gt;
* Pin 10: Data[8]&lt;br /&gt;
* Pin 11: Data[9]&lt;br /&gt;
* Pin 12: Data[10]&lt;br /&gt;
* Pin 13: Data[11]&lt;br /&gt;
* Pin 14: 0V&lt;br /&gt;
* Pin 15: 0V&lt;br /&gt;
&lt;br /&gt;
'''Note''': Please see the [http://files.ettus.com/manual/page_gpio_api.html E3x0/X3x0 GPIO API] for information on configuring and using the GPIO bus.&lt;br /&gt;
&lt;br /&gt;
==Certifications==&lt;br /&gt;
===RoHS===&lt;br /&gt;
As of December 1st, 2010 all NI/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;
[http://files.ettus.com/manual/md_fpga.html FPGA Resources]&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/binaries/uhd_stable/ UHD Stable Binaries]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/EttusResearch/uhd UHD Source Code on Github]&lt;br /&gt;
&lt;br /&gt;
==Choosing an Interface==&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 provides three interface options – 1 Gigabit Ethernet (1 GigE), 10 Gigabit Ethernet (10 GigE), and PCI-Express (PCIe). The PCIe interface is always available regardless of what FPGA image is loaded. Ettus ships two FPGA image variants, the HG or HGS image which has one 1 GigE interfaces and one 10 GigE interfaces, and the XG image which has two 10 GigE interfaces. Generally, Ettus Research recommends using 10 GigE to achieve the maximum throughput available from the USRP-2974.  PCIe is recommended for applications that require the lowest possible latency, which is a desirable characteristic for PHY/MAC research.  If your application does not require the full bandwidth of the USRP-2974, the 1 GigE interface serves as a cost-effective fall-back option.  Ettus Research provides a complete interface kit for each of these options, which is also shown in the following table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|Interface Performance Summary&lt;br /&gt;
|-&lt;br /&gt;
!Interface&lt;br /&gt;
!Throughput (MS/s @ 16-bit)&lt;br /&gt;
!Target&lt;br /&gt;
!Recommended Kit&lt;br /&gt;
|-&lt;br /&gt;
|1 Gigabit&lt;br /&gt;
|25 MS/s&lt;br /&gt;
|Desktop/Laptop&lt;br /&gt;
|[https://www.ettus.com/product/details/1GIGE-KIT SFP Adapter + GigE Cable]&lt;br /&gt;
|-&lt;br /&gt;
|10 Gigabit&lt;br /&gt;
|200 MS/s&lt;br /&gt;
|Desktop&lt;br /&gt;
|[https://www.ettus.com/product/details/10GIGE-KIT 10 GigE Interface Kit]&lt;br /&gt;
|-&lt;br /&gt;
|PCI-Express &lt;br /&gt;
(PCIe, 4 lane)&lt;br /&gt;
|200 MS/S&lt;br /&gt;
|Desktop&lt;br /&gt;
|[https://www.ettus.com/product/details/PCIE-KIT PCI-Express Desktop Kit]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===10 Gigabit Ethernet===&lt;br /&gt;
In order to utilize the dual 10 Gigabit Ethernet interfaces, ensure the XG image is installed ([http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_load_fpga_imgs_fpga_flavours see FPGA Image Flavors]). In addition to burning the prerequisite FPGA image, it may also be necessary to tune the network interface card (NIC) to eliminate drops (Ds) and reduce overflows (Os). This is done by increasing the number of RX descriptors ([http://files.ettus.com/manual/page_transport.html#transport_udp_linux see Linux specific notes]).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;benchmark_rate&amp;lt;/code&amp;gt; tool can be used to test this capability. Run the following commands to test the X-series USRP over both 10 Gigabit Ethernet interfaces with the maximum rate of 200 Msps per channel:&lt;br /&gt;
&lt;br /&gt;
    cd &amp;lt;install-path&amp;gt;/lib/uhd/examples&lt;br /&gt;
    ./benchmark_rate --args=&amp;quot;type=x300,addr=&amp;lt;Primary IP&amp;gt;,second_addr=&amp;lt;secondary IP&amp;gt;&amp;quot; --channels=&amp;quot;0,1&amp;quot; --rx_rate 200e6&lt;br /&gt;
&lt;br /&gt;
The second interface is specified by the extra argument '''second_addr'''.&lt;br /&gt;
&lt;br /&gt;
'''Recommended 10 Gigabit Ethernet Cards'''&lt;br /&gt;
* Intel X520-DA2&lt;br /&gt;
** [http://ark.intel.com/products/39776/Intel-Ethernet-Converged-Network-Adapter-X520-DA2 Intel® Ethernet Converged Network Adapter X520-DA2]&lt;br /&gt;
* Intel X520-DA1&lt;br /&gt;
** [http://ark.intel.com/products/68669/Intel-Ethernet-Converged-Network-Adapter-X520-DA1 Intel® Ethernet Converged Network Adapter X520-DA1 ]&lt;br /&gt;
* Intel X710-DA2&lt;br /&gt;
** [http://ark.intel.com/products/83964/Intel-Ethernet-Converged-Network-Adapter-X710-DA2 Intel® Ethernet Converged Network Adapter X710-DA2 ]&lt;br /&gt;
* Intel X710-DA4&lt;br /&gt;
** [http://ark.intel.com/products/83965/Intel-Ethernet-Converged-Network-Adapter-X710-DA4 Intel® Ethernet Converged Network Adapter X710-DA4 ]&lt;br /&gt;
* Mellanox MCX4121A-ACAT&lt;br /&gt;
** [https://store.mellanox.com/products/mellanox-mcx4121a-acat-connectx-4-lx-en-network-interface-card-25gbe-dual-port-sfp28-pcie3-0-x8-rohs-r6.html Mellanox MCX4121A-ACAT ]&lt;br /&gt;
&lt;br /&gt;
==GPS Disciplined, Oven-Controlled Oscillator (GPSDO)==&lt;br /&gt;
The USRP-2794 has a high-accuracy GPS-disciplined oscillator (GPSDO).  The GPSDO improves the accuracy of the internal frequency reference to 20 ppb, or 0.1 ppb if the GPS is synchronized to the GPS constellation.  When synchronized to the GPS constellation, all USRP™ devices will also be synchronized in time within 50 ns.&lt;br /&gt;
&lt;br /&gt;
* Support GPSDO NMEA Strings&lt;br /&gt;
* [http://www.jackson-labs.com/assets/uploads/main/LC_XO_specsheet.pdf JacksonLabs LC_XO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
!Internal TCXO&lt;br /&gt;
!GPS-Disciplined Clock&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Reference&lt;br /&gt;
|TCXO&lt;br /&gt;
|OCXO&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Accuracy&lt;br /&gt;
|± 2.5ppm&lt;br /&gt;
± 2,500 Hz @ 1 GHz&lt;br /&gt;
|± 20 ppb&lt;br /&gt;
± 20 Hz @ 1 GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Accuracy&lt;br /&gt;
|&lt;br /&gt;
|± 0.01ppb&lt;br /&gt;
|-&lt;br /&gt;
|(GPS-Disciplined)&lt;br /&gt;
|&lt;br /&gt;
|~ ± 0.01 Hz @ 1 GHz&lt;br /&gt;
|-&lt;br /&gt;
|GPS Time Sync Accuracy&lt;br /&gt;
|&lt;br /&gt;
|±50ns to UTC Time**&lt;br /&gt;
|-&lt;br /&gt;
|10 MHz Reference Phase Drift with GPS Sync&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;±20ns After 1 Hour**&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Sensors===&lt;br /&gt;
You can query the lock status with the &amp;lt;code&amp;gt;gps_locked&amp;lt;/code&amp;gt; sensor, as well as obtain raw NMEA sentences using the &amp;lt;code&amp;gt;gps_gprmc&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;gps_gpgga&amp;lt;/code&amp;gt; sensors. Location information can be parsed out of the &amp;lt;code&amp;gt;gps_gpgga&amp;lt;/code&amp;gt; sensor by using &amp;lt;code&amp;gt;gpsd&amp;lt;/code&amp;gt; or another NMEA parser.&lt;br /&gt;
&lt;br /&gt;
==Option: Using the GPIO Expansion Kit==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top; width:60%&amp;quot;|This General Purpose Input/output (GPIO) breakout kit provides access to general purpose digital I/O signals with simple terminal blocks, and a prototyping area where wires and components can be soldered.  Each GPIO pin is connected to an FPGA digital line allowing it to be configured as an input, or an output, using the various software frameworks that support the USRP™ GPIO. &lt;br /&gt;
&lt;br /&gt;
These GPIO signals can serve the following functions:&lt;br /&gt;
&lt;br /&gt;
* Control of external devices, such as power amplifiers and RF switches&lt;br /&gt;
* Provide output signals that can help with debugging&lt;br /&gt;
* Provide observables to be analyzed by oscilloscopes or other external equipment&lt;br /&gt;
* Accept input from external devices for local, software-based triggering&lt;br /&gt;
* Implement a protocol line such as SPI or I2C&lt;br /&gt;
||[[File:Product_x3x0_gpio.jpg|250px]]&lt;br /&gt;
|}&lt;br /&gt;
===GPIO Expansion Kit Contents===&lt;br /&gt;
&lt;br /&gt;
*1 GPIO Breakout Board&lt;br /&gt;
*1 DB-15, 1-meter cable&lt;br /&gt;
*GPIO Quick Reference&lt;br /&gt;
&lt;br /&gt;
===Circuit Protection===&lt;br /&gt;
The GPIO signals exposed with this breakout kit are routed directly to the USRP device's FPGA with limited protection circuitry.  However, the user must take precautionary measures to ensure input/output signals meet the specifications shown in this document.  Over voltage, excess current draw, and other conditions can damage the USRP device and void the warranty. Special care should be taken when the USRP is powered off.&lt;br /&gt;
&lt;br /&gt;
===Mounting the GPIO Breakout Board===&lt;br /&gt;
The GPIO breakout board can be mounted directly to the DB15 connector of a USRP ™ device, or mounted remotely with the cable provided in this kit.  The screws on the DB15 connector of the breakout board must be removed to mount the board directly.  For remote mounting, the breakout board is supplied with rubber standoffs to avoid scratching surfaces, and several through-holes for hard mounting with screws or other hardware (not provided).&lt;br /&gt;
&lt;br /&gt;
===Using GPIO with UHD, GNU Radio, and other Third-Party Frameworks===&lt;br /&gt;
When used with UHD, or other third party frameworks that leverage UHD, the GPIO expansion can be controlled with simple API calls.  For more information, on the C++ API, and examples of how to use the GPIO in frameworks such as GNU Radio, please see the [[Application Notes]] section of the [https://kb.ettus.com Ettus Research Knowledge Base].&lt;br /&gt;
&lt;br /&gt;
===GPIO Specifications (3.3V Bank, LVCMOS)===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Parameter&lt;br /&gt;
!Typical&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Configured as Input&lt;br /&gt;
|-&lt;br /&gt;
|Default Voltage Standard&lt;br /&gt;
|3.3V LVCMOS&lt;br /&gt;
|-&lt;br /&gt;
|Voltage High Threshold&lt;br /&gt;
|2.0V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Low Threshold&lt;br /&gt;
|0.8V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Input Limits (no damage) &lt;br /&gt;
| -0.3V/3.45V&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Configured as Output&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Standard&lt;br /&gt;
|3.3V LVCMOS&lt;br /&gt;
|-&lt;br /&gt;
|Voltage High Output&lt;br /&gt;
|2.8V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Low Output&lt;br /&gt;
|0.4V&lt;br /&gt;
|-&lt;br /&gt;
|Current Source Capability&lt;br /&gt;
|12 mA&lt;br /&gt;
|-&lt;br /&gt;
|Output Source Impedance&lt;br /&gt;
|&amp;gt;33 ohms typical&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Option: Antenna Kit for GPSDO==&lt;br /&gt;
The GPSDO Mini Kit will improve the accuracy of the USRP reference clock, even if it does not receive signals from the GPS Constellation.  However, to achieve the best accuracy possible, and to achieve global timing alignment across multiple USRPs, Ettus Research recommends the GPSDO Mini Antenna Kit.&lt;br /&gt;
&lt;br /&gt;
==Option: Cables for MIMO Expansion==&lt;br /&gt;
Multiple USRP-2974s can be synchronized for coherent operation by sharing a common 10 MHz and 1 PPS signal.  We recommend using a star-distribution topology with an OctoClock or OctoClock-G, as seen in Figure 4.  This requires matched length cables to be used for both 10 MHz and 1 PPS.&lt;br /&gt;
&lt;br /&gt;
For more information about MIMO operation, please see the MIMO and Synchronization Application Note.&lt;br /&gt;
[[File:8mimo.png|700px|center]]&lt;br /&gt;
&amp;lt;center&amp;gt;Figure 4 - Star-Distribution of 10 MHz/PPS Signals with OctoClock&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
&lt;br /&gt;
* '''What is the bandwidth of the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
The ADC rate on each analog RX channel is 200 MS/s quadrature, which provides a theoretical analog bandwidth of approximately 80% of the Nyquist bandwidth of +/- 100 MHz (+/- 80 MHz around the center frequency).  The resulting maximum theoretical analog bandwidth is 160 MHz.&lt;br /&gt;
&lt;br /&gt;
FPGA Processing Bandwidth: Up to 200 MS/s quadrature.&lt;br /&gt;
&lt;br /&gt;
Host Bandwidth:  Up to 200 MS/s quadrature, dependent on selected interface&lt;br /&gt;
&lt;br /&gt;
For more information about achieving the maximum bandwidth with a USRP-2974, please see the &amp;quot;USRP X300/X310 Configuration Guide&amp;quot; or the &amp;quot;USRP System Bandwidth&amp;quot; application note.&lt;br /&gt;
&lt;br /&gt;
* '''How can I program the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
Like all other USRP models, the USRP-2974 is compatible with the USRP Hardware Driver™ (UHD) architecture.  The UHD architecture is a common driver that allows users to develop and execute applications on the onboard or host computer.  UHD provides a direct C++ API to control and stream to/from the USRP-2974.  It also provides compatibility with a variety of third-party software frameworks including GNU Radio, LabVIEW, and MATLAB.  You may also customize the FPGA image provided with UHD to integrate your own signal processing. For more information about UHD, and supported software frameworks, please see:&lt;br /&gt;
&lt;br /&gt;
http://files.ettus.com/manual/&lt;br /&gt;
&lt;br /&gt;
* '''How do I update the FPGA images and firmware with the latest from UHD'''&lt;br /&gt;
&lt;br /&gt;
You can find more information about updating the FPGA image through PCIe, 1/10 GigE, and JTAG [https://kb.ettus.com/X300/X310_Device_Recovery here].&lt;br /&gt;
&lt;br /&gt;
* '''How can I modify the FPGA of the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
The source code (Verilog) for the USRP-2794 is available in the UHD repository. The build process leverages the existing CMAKE build system used to compile the host-side driver.  A Linux-based setup will provide the best results.&lt;br /&gt;
&lt;br /&gt;
Which FPGA toolchain required to build the FPGA images will depend upon your version of UHD. For more details please see the [https://kb.ettus.com/UHD UHD] Software Resource page.&lt;br /&gt;
&lt;br /&gt;
* '''How much free space is available in the USRP-2974 FPGA'''&lt;br /&gt;
&lt;br /&gt;
Please see the [[#Utilization statistics]] section of this resources page for more information.&lt;br /&gt;
&lt;br /&gt;
* '''What frequency range does the USRP-2974 cover'''&lt;br /&gt;
&lt;br /&gt;
10MHz to 6GHz.&lt;br /&gt;
&lt;br /&gt;
* '''What components do I need to purchase for a complete USRP-2974 system'''&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 is a complete stand alone SDR. Additional components might include RF filters, antennas, RF power amplifiers or other RF components needed of a specific application.&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP-2974_Getting_Started_Guide&amp;diff=4162</id>
		<title>USRP-2974 Getting Started Guide</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=USRP-2974_Getting_Started_Guide&amp;diff=4162"/>
				<updated>2019-06-01T15:16:29Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* Kit Contents */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Kit Contents==&lt;br /&gt;
* NI USRP-2974&lt;br /&gt;
* 30 dB SMA Attenuator&lt;br /&gt;
* SMA-male to SMA-male Cable&lt;br /&gt;
* Power Supply&lt;br /&gt;
* Getting Started Guide&lt;br /&gt;
{|&lt;br /&gt;
||[[File:USRP_2974_frt_dia.jpg|300px|center]]  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
==Verify the Contents of Your Kit==&lt;br /&gt;
Make sure that your kit contains all the items listed above. If any items are missing, please contact your sales agent.&lt;br /&gt;
&lt;br /&gt;
==Unpacking the Kit==&lt;br /&gt;
1. To prevent electrostatic discharge (ESD) from damaging the device, ground yourself using a grounding strap or by holding a grounded object, such as your computer chassis.&lt;br /&gt;
&lt;br /&gt;
2. Remove the device from the package and inspect the device for loose components or any&lt;br /&gt;
other sign of damage.&lt;br /&gt;
&lt;br /&gt;
3. Never touch the exposed pins of connectors.&lt;br /&gt;
&lt;br /&gt;
4. Unpack any other items and documentation from the kit.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' Do not install a device if it appears damaged in any way. Store the device in the antistatic package when the device is not in use.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Proper Care and Handling==&lt;br /&gt;
All NI products are individually tested before shipment. The USRP™ is guaranteed to be functional at the time it is received by the customer. Improper use or handling of the USRP™ can easily cause the device to become non-functional. Listed below are some examples of actions which can prevent damage to the unit:&lt;br /&gt;
&lt;br /&gt;
*Always properly terminate the transmit port with an antenna or 50Ω load.&lt;br /&gt;
*Always handle the USRP with proper anti-static methods.&lt;br /&gt;
*Never allow the USRP to directly or indirectly come into contact with any voltage spikes.&lt;br /&gt;
*Never allow any water, or condensing moisture, to come into contact with the USRP.&lt;br /&gt;
*Always use caution with FPGA, firmware, or software modifications.&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Never apply more than '''+10 dBm''' of power into RF ports RF0 and RF1.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Never apply more than '''+15 dBm''' of power into the REF IN input.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Never apply more than '''-15 dBm''' of power into the GPS ANT input.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Always use at least 30dB attenuation if operating in loopback configuration&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Install and Setup the Software Tools on the onboard computer (SoM-System on Module)==&lt;br /&gt;
In order to use your Universal Software Radio Peripheral (USRP™), you must have the software tools correctly installed and configured on the SoM. A step-by-step guide for doing this is available at the [https://kb.ettus.com/Building_and_Installing_the_USRP_Open-Source_Toolchain_(UHD_and_GNU_Radio)_on_Linux Building and Installing the USRP Open-Source Toolchain (UHD and GNU Radio) on the Linux] Application Note. '''Release 3.15.0''' or later of the USRP Hardware Driver, UHD, is needed.&lt;br /&gt;
&lt;br /&gt;
==Basic Connectivity==&lt;br /&gt;
This USRP-2974 host supports multiple, high-speed, low-latency interface options to the FPGA. To setup the device, follow these basic instructions:&lt;br /&gt;
* Configure the host ethernet adapter (enp1s0f0) to use an IP address of 192.168.40.1 and a subnet mask of 255.255.255.0 &lt;br /&gt;
* Configure the host ethernet adapter (enp1s0f1) to use an IP address of 192.168.30.1 and a subnet mask of 255.255.255.0 (loopback with SFP+ cable needed)&lt;br /&gt;
* To test communications, ping the USRP FPGA at address &amp;quot;192.168.40.2&amp;quot; or “192.168.30.2”&lt;br /&gt;
&lt;br /&gt;
For more details on network setup, including PCIe connectivity, please see the section [[USRP-2974#Interfaces_and_Connectivity|Interfaces and Connectivity]] of the NI USRP-2974 Hardware Resources page.&lt;br /&gt;
&lt;br /&gt;
==Test and Verify the Operation of the USRP==&lt;br /&gt;
Once the software tools are installed on the onboard computer, verify the correct operation of the USRP by running the utility programs on the onboard computer. More information is available at the [https://kb.ettus.com/Verifying_the_Operation_of_the_USRP_Using_UHD_and_GNU_Radio Verifying the Operation of the USRP Using UHD and GNU Radio] Application Note.&lt;br /&gt;
&lt;br /&gt;
==Enabling PXE Boot==&lt;br /&gt;
&lt;br /&gt;
===Legacy PXE Boot===&lt;br /&gt;
* When rebooting the USRP-2974 open BIOS with DEL and go to Boot tab&lt;br /&gt;
* Enable PXE Network Boot with Legacy option, restart the system&lt;br /&gt;
* Go into the BIOS’ Boot tab and set IBA CL Slot 00FE v0105 as first boot option, restart the system&lt;br /&gt;
&lt;br /&gt;
===UEFI PXE Boot===&lt;br /&gt;
* When rebooting the USRP-2974 open BIOS with DEL and go to Boot tab&lt;br /&gt;
* Enable PXE Network Boot with UEFI option, restart the system&lt;br /&gt;
* Go into the BIOS’ Boot tab and set IPv4 as first boot option, restart the system&lt;br /&gt;
&lt;br /&gt;
==NI USRP RIO PCIe Support==&lt;br /&gt;
&lt;br /&gt;
If you are connecting the USRP-2974 through the PCIe interface, then complete this section.&lt;br /&gt;
&lt;br /&gt;
If you are connecting the USRP-2974 through the 1G or 10G Ethernet connection then do '''NOT''' complete this section.&lt;br /&gt;
&lt;br /&gt;
# Installer and commands taken from [https://files.ettus.com/manual/page_ni_rio_kernel.html https://files.ettus.com/manual/page_ni_rio_kernel.html]&lt;br /&gt;
# Extract the installer and install as described (note the _ instead of – in the folder name)&lt;br /&gt;
# Enable or disable the PCIe link&lt;br /&gt;
##&amp;lt;code&amp;gt;$ sudo /usr/local/bin/niusrprio_pcie start&amp;lt;/code&amp;gt;&lt;br /&gt;
##&amp;lt;code&amp;gt;$ sudo /usr/local/bin/niusrprio_pcie stop &amp;lt;/code&amp;gt;&lt;br /&gt;
# Check the status&lt;br /&gt;
##&amp;lt;code&amp;gt;$ sudo /usr/local/bin/niusrprio_pcie status&amp;lt;/code&amp;gt;&lt;br /&gt;
# see the connection over PCIe with &lt;br /&gt;
##&amp;lt;code&amp;gt;$ uhd_find_devices&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Note on USRP-2974 Rev A Hardware==&lt;br /&gt;
To find out if you have a '''&amp;quot;Rev A&amp;quot;''' hardware version of the USRP-2974 check the last character of the part number on the USRP-2974. E.g. &amp;quot;146873'''A'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
To fully support Rev A with UHD software, install UHD as explained and run the following command:&lt;br /&gt;
&lt;br /&gt;
    $ /usr/local/lib/uhd/utils/usrp_burn_mb_eeprom --args=”addr=192.168.40.2” --value=”product=31131”&lt;br /&gt;
&lt;br /&gt;
After a reboot run: &lt;br /&gt;
&lt;br /&gt;
    $ uhd_find_devices&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Under the product category section you will see the following: &lt;br /&gt;
    “NI-2974”.&lt;br /&gt;
&lt;br /&gt;
==Technical Support and Community Knowledge Base==&lt;br /&gt;
&lt;br /&gt;
Technical support for USRP hardware is available through email only. If the product arrived in a non­functional state or you require technical assistance, please contact [mailto:support@ettus.com support@ettus.com]. Please allow 24 to 48 hours for response by email, depending on holidays and weekends, although we are often able to reply more quickly than that.&lt;br /&gt;
&lt;br /&gt;
We also recommend that you subscribe to the community mailing lists. The mailing lists have a responsive and knowledgeable community of hundreds of developers and technical users who are located around the world. When you join the community, you will be connected to this group of people who can help you learn about SDR and respond to your technical and specific questions. Often your question can be answered quickly on the mailing lists. Each mailing list also provides an archive of all past conversations and discussions going back many years. Your question or problem may have already been addressed before, and a relevant or helpful solution may already exist in the archive.&lt;br /&gt;
&lt;br /&gt;
Discussions involving the USRP hardware and the UHD software itself are best addressed through the '''u​srp­-users''' ​mailing list at [http://usrp-users.ettus.com http://usrp-users.ettus.com].&lt;br /&gt;
&lt;br /&gt;
Discussions involving the use of [http://gnuradio.org/ GNU Radio] with USRP hardware and UHD software are best addressed through the '''d​iscuss­-gnuradio'''​ mailing list at [https://lists.gnu.org/mailman/listinfo/discuss­gnuradio https://lists.gnu.org/mailman/listinfo/discuss­gnuradio]​.&lt;br /&gt;
&lt;br /&gt;
Discussions involving the use of [http://openbts.org/ OpenBTS®] with USRP hardware and UHD software are best addressed through the '''o​penbts­-discuss​''' mailing list at [https://lists.sourceforge.net/lists/listinfo/openbts­discuss​ https://lists.sourceforge.net/lists/listinfo/openbts­discuss​].​&lt;br /&gt;
&lt;br /&gt;
The support page on our website is located at [https://www.ettus.com/support https://www.ettus.com/support]​. The Knowledge Base is located at ​[https://kb.ettus.com https://kb.ettus.com]​.&lt;br /&gt;
&lt;br /&gt;
==Legal Considerations==&lt;br /&gt;
Every country has laws governing the transmission and reception of radio signals. Users are solely responsible for insuring they use their USRP system in compliance with all applicable laws and regulations. Before attempting to transmit and/or receive on any frequency, we recommend that you determine what licenses may be required and what restrictions may apply.&lt;br /&gt;
&lt;br /&gt;
*NOTE: This USRP product is a piece of test equipment.&lt;br /&gt;
&lt;br /&gt;
==Sales and Ordering Support==&lt;br /&gt;
&lt;br /&gt;
If you have any non­-technical questions related to your order, then please contact us by email at [mailto:orders@ettus.com orders@ettus.com]​. Please be sure to include your order number and the serial number of your USRP.&lt;br /&gt;
&lt;br /&gt;
==Terms and Conditions of Sale==&lt;br /&gt;
Terms and conditions of sale can be accessed online at the following link: http://www.ettus.com/legal/terms-and-conditions-of-sale&lt;br /&gt;
&lt;br /&gt;
==Additional Resources==&lt;br /&gt;
&lt;br /&gt;
* [[USRP-2974 | USRP-2974 Hardware Resource]]&lt;br /&gt;
* http://www.ni.com/pdf/manuals/377416c.pdf &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Getting Started Guides]]&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP-2974_Getting_Started_Guide&amp;diff=4161</id>
		<title>USRP-2974 Getting Started Guide</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=USRP-2974_Getting_Started_Guide&amp;diff=4161"/>
				<updated>2019-06-01T15:15:44Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* Kit Contents */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Kit Contents==&lt;br /&gt;
* NI USRP-2974&lt;br /&gt;
* 30 dB SMA Attenuator&lt;br /&gt;
* SMA-male to SMA-male Cable&lt;br /&gt;
* Power Supply&lt;br /&gt;
* Getting Started Guide&lt;br /&gt;
{|&lt;br /&gt;
||[[File:USRP_2974_frt_dia.jpg|250px|center]]  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
==Verify the Contents of Your Kit==&lt;br /&gt;
Make sure that your kit contains all the items listed above. If any items are missing, please contact your sales agent.&lt;br /&gt;
&lt;br /&gt;
==Unpacking the Kit==&lt;br /&gt;
1. To prevent electrostatic discharge (ESD) from damaging the device, ground yourself using a grounding strap or by holding a grounded object, such as your computer chassis.&lt;br /&gt;
&lt;br /&gt;
2. Remove the device from the package and inspect the device for loose components or any&lt;br /&gt;
other sign of damage.&lt;br /&gt;
&lt;br /&gt;
3. Never touch the exposed pins of connectors.&lt;br /&gt;
&lt;br /&gt;
4. Unpack any other items and documentation from the kit.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' Do not install a device if it appears damaged in any way. Store the device in the antistatic package when the device is not in use.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Proper Care and Handling==&lt;br /&gt;
All NI products are individually tested before shipment. The USRP™ is guaranteed to be functional at the time it is received by the customer. Improper use or handling of the USRP™ can easily cause the device to become non-functional. Listed below are some examples of actions which can prevent damage to the unit:&lt;br /&gt;
&lt;br /&gt;
*Always properly terminate the transmit port with an antenna or 50Ω load.&lt;br /&gt;
*Always handle the USRP with proper anti-static methods.&lt;br /&gt;
*Never allow the USRP to directly or indirectly come into contact with any voltage spikes.&lt;br /&gt;
*Never allow any water, or condensing moisture, to come into contact with the USRP.&lt;br /&gt;
*Always use caution with FPGA, firmware, or software modifications.&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Never apply more than '''+10 dBm''' of power into RF ports RF0 and RF1.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Never apply more than '''+15 dBm''' of power into the REF IN input.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Never apply more than '''-15 dBm''' of power into the GPS ANT input.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Always use at least 30dB attenuation if operating in loopback configuration&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Install and Setup the Software Tools on the onboard computer (SoM-System on Module)==&lt;br /&gt;
In order to use your Universal Software Radio Peripheral (USRP™), you must have the software tools correctly installed and configured on the SoM. A step-by-step guide for doing this is available at the [https://kb.ettus.com/Building_and_Installing_the_USRP_Open-Source_Toolchain_(UHD_and_GNU_Radio)_on_Linux Building and Installing the USRP Open-Source Toolchain (UHD and GNU Radio) on the Linux] Application Note. '''Release 3.15.0''' or later of the USRP Hardware Driver, UHD, is needed.&lt;br /&gt;
&lt;br /&gt;
==Basic Connectivity==&lt;br /&gt;
This USRP-2974 host supports multiple, high-speed, low-latency interface options to the FPGA. To setup the device, follow these basic instructions:&lt;br /&gt;
* Configure the host ethernet adapter (enp1s0f0) to use an IP address of 192.168.40.1 and a subnet mask of 255.255.255.0 &lt;br /&gt;
* Configure the host ethernet adapter (enp1s0f1) to use an IP address of 192.168.30.1 and a subnet mask of 255.255.255.0 (loopback with SFP+ cable needed)&lt;br /&gt;
* To test communications, ping the USRP FPGA at address &amp;quot;192.168.40.2&amp;quot; or “192.168.30.2”&lt;br /&gt;
&lt;br /&gt;
For more details on network setup, including PCIe connectivity, please see the section [[USRP-2974#Interfaces_and_Connectivity|Interfaces and Connectivity]] of the NI USRP-2974 Hardware Resources page.&lt;br /&gt;
&lt;br /&gt;
==Test and Verify the Operation of the USRP==&lt;br /&gt;
Once the software tools are installed on the onboard computer, verify the correct operation of the USRP by running the utility programs on the onboard computer. More information is available at the [https://kb.ettus.com/Verifying_the_Operation_of_the_USRP_Using_UHD_and_GNU_Radio Verifying the Operation of the USRP Using UHD and GNU Radio] Application Note.&lt;br /&gt;
&lt;br /&gt;
==Enabling PXE Boot==&lt;br /&gt;
&lt;br /&gt;
===Legacy PXE Boot===&lt;br /&gt;
* When rebooting the USRP-2974 open BIOS with DEL and go to Boot tab&lt;br /&gt;
* Enable PXE Network Boot with Legacy option, restart the system&lt;br /&gt;
* Go into the BIOS’ Boot tab and set IBA CL Slot 00FE v0105 as first boot option, restart the system&lt;br /&gt;
&lt;br /&gt;
===UEFI PXE Boot===&lt;br /&gt;
* When rebooting the USRP-2974 open BIOS with DEL and go to Boot tab&lt;br /&gt;
* Enable PXE Network Boot with UEFI option, restart the system&lt;br /&gt;
* Go into the BIOS’ Boot tab and set IPv4 as first boot option, restart the system&lt;br /&gt;
&lt;br /&gt;
==NI USRP RIO PCIe Support==&lt;br /&gt;
&lt;br /&gt;
If you are connecting the USRP-2974 through the PCIe interface, then complete this section.&lt;br /&gt;
&lt;br /&gt;
If you are connecting the USRP-2974 through the 1G or 10G Ethernet connection then do '''NOT''' complete this section.&lt;br /&gt;
&lt;br /&gt;
# Installer and commands taken from [https://files.ettus.com/manual/page_ni_rio_kernel.html https://files.ettus.com/manual/page_ni_rio_kernel.html]&lt;br /&gt;
# Extract the installer and install as described (note the _ instead of – in the folder name)&lt;br /&gt;
# Enable or disable the PCIe link&lt;br /&gt;
##&amp;lt;code&amp;gt;$ sudo /usr/local/bin/niusrprio_pcie start&amp;lt;/code&amp;gt;&lt;br /&gt;
##&amp;lt;code&amp;gt;$ sudo /usr/local/bin/niusrprio_pcie stop &amp;lt;/code&amp;gt;&lt;br /&gt;
# Check the status&lt;br /&gt;
##&amp;lt;code&amp;gt;$ sudo /usr/local/bin/niusrprio_pcie status&amp;lt;/code&amp;gt;&lt;br /&gt;
# see the connection over PCIe with &lt;br /&gt;
##&amp;lt;code&amp;gt;$ uhd_find_devices&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Note on USRP-2974 Rev A Hardware==&lt;br /&gt;
To find out if you have a '''&amp;quot;Rev A&amp;quot;''' hardware version of the USRP-2974 check the last character of the part number on the USRP-2974. E.g. &amp;quot;146873'''A'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
To fully support Rev A with UHD software, install UHD as explained and run the following command:&lt;br /&gt;
&lt;br /&gt;
    $ /usr/local/lib/uhd/utils/usrp_burn_mb_eeprom --args=”addr=192.168.40.2” --value=”product=31131”&lt;br /&gt;
&lt;br /&gt;
After a reboot run: &lt;br /&gt;
&lt;br /&gt;
    $ uhd_find_devices&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Under the product category section you will see the following: &lt;br /&gt;
    “NI-2974”.&lt;br /&gt;
&lt;br /&gt;
==Technical Support and Community Knowledge Base==&lt;br /&gt;
&lt;br /&gt;
Technical support for USRP hardware is available through email only. If the product arrived in a non­functional state or you require technical assistance, please contact [mailto:support@ettus.com support@ettus.com]. Please allow 24 to 48 hours for response by email, depending on holidays and weekends, although we are often able to reply more quickly than that.&lt;br /&gt;
&lt;br /&gt;
We also recommend that you subscribe to the community mailing lists. The mailing lists have a responsive and knowledgeable community of hundreds of developers and technical users who are located around the world. When you join the community, you will be connected to this group of people who can help you learn about SDR and respond to your technical and specific questions. Often your question can be answered quickly on the mailing lists. Each mailing list also provides an archive of all past conversations and discussions going back many years. Your question or problem may have already been addressed before, and a relevant or helpful solution may already exist in the archive.&lt;br /&gt;
&lt;br /&gt;
Discussions involving the USRP hardware and the UHD software itself are best addressed through the '''u​srp­-users''' ​mailing list at [http://usrp-users.ettus.com http://usrp-users.ettus.com].&lt;br /&gt;
&lt;br /&gt;
Discussions involving the use of [http://gnuradio.org/ GNU Radio] with USRP hardware and UHD software are best addressed through the '''d​iscuss­-gnuradio'''​ mailing list at [https://lists.gnu.org/mailman/listinfo/discuss­gnuradio https://lists.gnu.org/mailman/listinfo/discuss­gnuradio]​.&lt;br /&gt;
&lt;br /&gt;
Discussions involving the use of [http://openbts.org/ OpenBTS®] with USRP hardware and UHD software are best addressed through the '''o​penbts­-discuss​''' mailing list at [https://lists.sourceforge.net/lists/listinfo/openbts­discuss​ https://lists.sourceforge.net/lists/listinfo/openbts­discuss​].​&lt;br /&gt;
&lt;br /&gt;
The support page on our website is located at [https://www.ettus.com/support https://www.ettus.com/support]​. The Knowledge Base is located at ​[https://kb.ettus.com https://kb.ettus.com]​.&lt;br /&gt;
&lt;br /&gt;
==Legal Considerations==&lt;br /&gt;
Every country has laws governing the transmission and reception of radio signals. Users are solely responsible for insuring they use their USRP system in compliance with all applicable laws and regulations. Before attempting to transmit and/or receive on any frequency, we recommend that you determine what licenses may be required and what restrictions may apply.&lt;br /&gt;
&lt;br /&gt;
*NOTE: This USRP product is a piece of test equipment.&lt;br /&gt;
&lt;br /&gt;
==Sales and Ordering Support==&lt;br /&gt;
&lt;br /&gt;
If you have any non­-technical questions related to your order, then please contact us by email at [mailto:orders@ettus.com orders@ettus.com]​. Please be sure to include your order number and the serial number of your USRP.&lt;br /&gt;
&lt;br /&gt;
==Terms and Conditions of Sale==&lt;br /&gt;
Terms and conditions of sale can be accessed online at the following link: http://www.ettus.com/legal/terms-and-conditions-of-sale&lt;br /&gt;
&lt;br /&gt;
==Additional Resources==&lt;br /&gt;
&lt;br /&gt;
* [[USRP-2974 | USRP-2974 Hardware Resource]]&lt;br /&gt;
* http://www.ni.com/pdf/manuals/377416c.pdf &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Getting Started Guides]]&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP-2974&amp;diff=4160</id>
		<title>USRP-2974</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=USRP-2974&amp;diff=4160"/>
				<updated>2019-06-01T15:14:58Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* Controller - Onboard computer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The NI USRP-2974 is a high-performance, USRP software defined radio (SDR) stand-alone device for designing and deploying next generation wireless communications systems. The hardware architecture combines two extended-bandwidth daughterboard slots covering 10 MHz – 6 GHz with up to 160 MHz of baseband bandwidth, multiple high-speed interface options (PCIe, dual 10 GigE), an onboard Intel Core i7 processor, and a large user-programmable Kintex-7 FPGA in a convenient desktop or rack-mountable half-wide 2U form factor.&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 is the equivalent to a USRP X310 with two UBX-160 boards, a GPSDO and an onboard Intel i7 computer. The USRP-2974 comes with NI Linux RTOS pre-installed, but in order to use it with open-source tool-chain, a user will need to install Linux (preferably Fedora or Ubuntu) and then the USRP Hardware driver (UHD). After these have been installed, any other open-source tools can be installed, such as GNU Radio.&lt;br /&gt;
&lt;br /&gt;
== Key Features of the USRP-2974==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Intel Core i7 6822EQ 2GHz Quad CoreProcessor&lt;br /&gt;
* 16GB DDR4 Memory&lt;br /&gt;
* 512GB SSD&lt;br /&gt;
* USB-to-UART to the CPU&lt;br /&gt;
* Xilinx Kintex-7 XC7K410T FPGA&lt;br /&gt;
* 14 bit 200 MS/s ADC&lt;br /&gt;
* 16 bit 800 MS/s DAC&lt;br /&gt;
* Frequency range: 10 MHz - 6 GHz&lt;br /&gt;
* Up 160MHz&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; bandwidth per channel&lt;br /&gt;
* 2 Transmit ports&lt;br /&gt;
* 2 Receive ports&lt;br /&gt;
* GPSDO&lt;br /&gt;
* Multiple high-speed interfaces (Dual 10G, PCIe Express, 1G)&lt;br /&gt;
|[[File:USRP_2974_frt_dia.jpg|350px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Controller - Onboard computer ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|System on module (SoM) &lt;br /&gt;
|Congatec COM Express conga-TS170&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|CPU&lt;br /&gt;
|Intel Core i7 6822EQ (2 GHz Quad Core)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Memory &lt;br /&gt;
|SO-DIMM DDR4 16 GB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SFP+&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &lt;br /&gt;
|10G ETH connection to the SoM&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Cabled PCIe&lt;br /&gt;
|PCIe Gen 2 x4&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|MicroUSB&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|USB-to-UART to the SoM&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|RJ45&lt;br /&gt;
|1G ETH host connection&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; Can be bypassed to the FPGA.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; Device port for external host.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
==RF Specifications==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Transmitter&lt;br /&gt;
|-&lt;br /&gt;
|Number of channels&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Frequency range&lt;br /&gt;
|10MHz to 6GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency step&lt;br /&gt;
|&amp;lt;1kHz&lt;br /&gt;
|-&lt;br /&gt;
|Maximum output power&lt;br /&gt;
|5mW to 100mW (7dBm to 20dBm)&lt;br /&gt;
|-&lt;br /&gt;
|Gain range&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
|0dB to 31.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Gain step&lt;br /&gt;
|0.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum instantaneous real-time bandwidth&lt;br /&gt;
|160MHz&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Receiver&lt;br /&gt;
|-&lt;br /&gt;
|Number of channels&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Frequency range&lt;br /&gt;
|10MHz to 6GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency step&lt;br /&gt;
|&amp;lt;1kHz&lt;br /&gt;
|-&lt;br /&gt;
|Gain range&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|0dB to 37.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Gain step&lt;br /&gt;
|0.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum input power&lt;br /&gt;
|10dBm&lt;br /&gt;
|-&lt;br /&gt;
|Noise Figure&lt;br /&gt;
|5dB to 7dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum instantaneous real-time bandwidth&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&lt;br /&gt;
|160MHz&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; The output power resulting from the gain setting varies over the frequency band and among&lt;br /&gt;
devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;The received signal amplitude resulting from the gain setting varies over the frequency band and&lt;br /&gt;
among devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;The USRP-2974 receiver path has 84 MHz of bandwidth for center frequencies from 10 MHz to&lt;br /&gt;
500 MHz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' As mentioned earlier, the USRP-2974 incorporates 2 UBX-160 daughterboards. Therefore, for more information on RF performance, please see the [https://kb.ettus.com/UBX UBX hardware resource] page&lt;br /&gt;
&lt;br /&gt;
==Hardware Specifications==&lt;br /&gt;
===USRP Hardware Driver (UHD) version===&lt;br /&gt;
* Minimum version of UHD required: '''3.15.0'''&lt;br /&gt;
&lt;br /&gt;
===Clocking and Sampling Rates===&lt;br /&gt;
There are two master clock rates (MCR) supported on the USRP-2974 like on the X310: 200.0 MHz and 184.32 MHz.&lt;br /&gt;
&lt;br /&gt;
The sampling rate must be an integer decimation rate of the MCR. Ideally, this decimation factor should be an even number. An odd decimation factor will result in additional unwanted attenuation (roll-off from the CIC filter in the DUC and DDC blocks in the FPGA). The valid decimation rates are between 1 and 1024.&lt;br /&gt;
&lt;br /&gt;
For the MCR of 200.0 MHz, the achievable sampling rates using an even decimation factor are 200.0, 100.0, 50.0, 33.33, 25.0, 20.0, 16.67, 14.286 Msps, ... 195.31 Ksps.&lt;br /&gt;
&lt;br /&gt;
For the MCR of 184.32 MHz, the achievable sampling rates using an even decimation factor are 184.32, 92.16, 46.08, 30.72, 23.04, 18.432, 15.36, 13.166 Msps, ... 180.0 Ksps.&lt;br /&gt;
&lt;br /&gt;
If the desired sampling rate is not directly supported by the hardware, then it will be necessary to re-sample in software. This can be done in C++ using libraries such as Liquid DSP [https://github.com/jgaeddert/liquid-dsp], or can be done in GNU Radio, in which there are three blocks that perform sampling rate conversion.&lt;br /&gt;
&lt;br /&gt;
==Physical Specifications==&lt;br /&gt;
&lt;br /&gt;
===Dimensions===&lt;br /&gt;
(L × W × H) 29.08 cm × 21.84 cm × 7.98 cm (11.45 in. × 8.60 in. × 3.14 in. )&lt;br /&gt;
&lt;br /&gt;
===Weight===&lt;br /&gt;
3.34 kg (7.35 lb)&lt;br /&gt;
&lt;br /&gt;
==Power==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|Voltage range&lt;br /&gt;
|14.25 V to 15.75 V DC&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Current&lt;br /&gt;
|10 A, maximum&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Power&lt;br /&gt;
|150 W, maximum&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' Indoor use only&lt;br /&gt;
&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* 0 °C to 50 °C&lt;br /&gt;
&lt;br /&gt;
===Maximum altitude===&lt;br /&gt;
* 2,000 m (800 mbar) (at 25 °C ambient temperature)&lt;br /&gt;
&lt;br /&gt;
===Operating Humidity Range===&lt;br /&gt;
* 10% to 90% non-condensing&lt;br /&gt;
&lt;br /&gt;
===Pollution Degree===&lt;br /&gt;
* 2&lt;br /&gt;
&lt;br /&gt;
==System Diagram and Schematics==&lt;br /&gt;
&lt;br /&gt;
===System Block Diagram===&lt;br /&gt;
[[file:2974_blk_dia.png |800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.ni.com/documentation/en/usrp-software-defined-radio-stand-alone-device/latest/usrp-2974/block-diagram/ System Block Diagram]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schematics===&lt;br /&gt;
Because the USRP-2974 is a combination of an Intel i7 SOM and an X310 USRP, a user can reference the X310 Schematics.&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/schematics/x300/x3xx.pdf X310 Schematics]&lt;br /&gt;
&lt;br /&gt;
==Key Component Datasheets==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%&amp;quot;&lt;br /&gt;
!Part Number&lt;br /&gt;
!Description&lt;br /&gt;
!Schematic ID (Page)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.congatec.com/fileadmin/user_upload/Documents/Datasheets/conga-TS170.pdf conga-TS170]&lt;br /&gt;
|System on Module (SoM)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.xilinx.com/support/documentation/data_sheets/ds180_7Series_Overview.pdf XC7K410T]&lt;br /&gt;
|FPGA&lt;br /&gt;
|U23 (3,5,8,9,10,18)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/AD9146.PDF AD9146]&lt;br /&gt;
|Dual Channel, 16-Bit, 1230 MSPS DAC&lt;br /&gt;
|U12, U36 (7)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/slas635b/slas635b.pdf ADS62P48]&lt;br /&gt;
|Dual Channel, 14-Bit 210 MSPS ADC&lt;br /&gt;
|U11, U35 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.onsemi.com/pub/Collateral/FIN1002-D.pdf FIN1002]&lt;br /&gt;
|High Speed Differential Receiver&lt;br /&gt;
|U3, U5, U31, U32 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/20001203U.pdf 24LC256T]&lt;br /&gt;
|EEPROM&lt;br /&gt;
|U530 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/lmk04816.pdf LMK04816BISQ/NOPB_1/3]&lt;br /&gt;
|Jitter Cleaner With Dual Loop PLLs&lt;br /&gt;
|U531 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/sy89547l.pdf SY89547LMGTR]&lt;br /&gt;
|Multiplexer&lt;br /&gt;
|U506 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/sn74aup1t17.pdf SN74AUP1T17]&lt;br /&gt;
|Single Schmitt-Trigger Buffer Gate&lt;br /&gt;
|U6, U519 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps54620.pdf TPS54620RGYT]&lt;br /&gt;
|Synchronous Step Down SWIFT™ Converter&lt;br /&gt;
|U515 (21); U516 (26)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/1764fb.pdf LT1764EQ-3.3]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U27 (21); U516 (26)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps7a47.pdf TPS7A47]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U28, U532 (21)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/3603fc.pdf LTC3603EUF_TRPBF]&lt;br /&gt;
|Monolithic Synchronous Step-Down Regulator&lt;br /&gt;
|U517 (23); U500 (25); U514, U513 (27)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/product/TPS77625-EP?keyMatch=TPS77625&amp;amp;tisearch=Search-EN-Everything TPS77625]&lt;br /&gt;
|Low-Dropout Voltage Regulators&lt;br /&gt;
|U30 (23)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps79318-ep.pdf TPS79318_SM]&lt;br /&gt;
|Low-Dropout Voltage Regulators&lt;br /&gt;
|U510 (27)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Media:agile9598503.pdf|OSC-96MHZ-724821-01]]&lt;br /&gt;
|Voltage Controlled Crystal Oscillator&lt;br /&gt;
|U25 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==FPGA and Baseband==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|FPGA &lt;br /&gt;
|Kintex-7 XC7K410T&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|DRAM &lt;br /&gt;
|1 GB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Baseband analog-to-digital converter&lt;br /&gt;
(ADC) resolution&lt;br /&gt;
|14 bit&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Baseband digital-to-analog converter&lt;br /&gt;
(DAC) resolution&lt;br /&gt;
|16 bit&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|ADC spurious-free dynamic range (sFDR)&lt;br /&gt;
|88 dB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|DAC sFDR&lt;br /&gt;
|80 dB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Maximum I/Q sample rate&lt;br /&gt;
|200 MS/s&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SFP+&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &lt;br /&gt;
|High speed serial link to one of the FPGA&lt;br /&gt;
GTX transceivers&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;Can be bypassed to the SoM if using the 10 GbE as protocol.&lt;br /&gt;
&lt;br /&gt;
===FPGA User Modifications===&lt;br /&gt;
&lt;br /&gt;
The Verilog code for the FPGA in the NI USRP-2974 is open-source, and users are free to modify and customize it for their needs. However, certain modifications may result in either bricking the device, or even in physical damage to the unit. Specifically, changing the I/O interface of the FPGA in any way (do not remove any of the I/O for the PCIe interface, such as &amp;lt;code&amp;gt;x300_pcie_int&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;LvFpga_Chinch_Interface&amp;lt;/code&amp;gt;), or modifying the pin and timing constraint files, could result in physical damage to other components on the motherboard, external to the FPGA, and doing this will void the warranty. Also, even if the PCIe interface is not being used, you cannot remove or reassign these pins in the constraint file. The constraint files should not be modified. Please note that modifications to the FPGA are made at the risk of the user, and may not be covered by the warranty of the device.&lt;br /&gt;
&lt;br /&gt;
==Interfaces and Connectivity==&lt;br /&gt;
Follow the links below for additional information on configuring each interface for the USRP-2974.&lt;br /&gt;
&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_10gige Dual 10 Gigabit Ethernet] - 200 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_pcie PCIe Express (Desktop)] - 200 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_1gige 1 Gigabit Ethernet] - 25 MS/s Full Duplex @ 16-bit&lt;br /&gt;
&lt;br /&gt;
===Front Panel===&lt;br /&gt;
&lt;br /&gt;
[[File:USRP-2974 Front Panel.jpg|800px]]&lt;br /&gt;
[[File:2974_frt_wireframe.png|800px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Connector&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''Use'''&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RF 0&lt;br /&gt;
|TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|Input and output terminal for the RF signal. TX1 RX1 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input or output channel.&lt;br /&gt;
|-&lt;br /&gt;
|RX2&lt;br /&gt;
|Input terminal for the RF signal. RX2 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | AUX I/O&lt;br /&gt;
|General-purpose I/O (GPIO) port. AUX I/O is controlled by the FPGA.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RF 1&lt;br /&gt;
|TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|Input and output terminal for the RF signal. TX1 RX1 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input or output channel.&lt;br /&gt;
|-&lt;br /&gt;
|RX2&lt;br /&gt;
|Input terminal for the RF signal. RX2 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | DP&lt;br /&gt;
|DisplayPort connector to connect one monitor for your controller.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | USB2.0&lt;br /&gt;
|USB ports that support common USB peripheral devices such as flash drives, hard drives, keyboards, and mice.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | USB3.0&lt;br /&gt;
|USB ports that support common USB peripheral devices such as flash drives, hard drives, keyboards, and mice.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G ETH&lt;br /&gt;
|RJ45 port used for 1G ETH connectivity to other ethernet devices.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | μUSB&lt;br /&gt;
|USB port used for UART connectivity to the controller.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 0&lt;br /&gt;
|SFP+ port used for 10G ETH connectivity to other ethernet devices. Connects to the embedded Linux computer for communication with LabVIEW RT.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 1&lt;br /&gt;
|SFP+ port used for 1G/10G ETH connectivity to other ethernet devices. Connects to the FPGA. Not currently supported in LabVIEW Communications System Design Suite.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''LED'''&lt;br /&gt;
!'''Description'''&lt;br /&gt;
!'''Color'''&lt;br /&gt;
!'''State'''&lt;br /&gt;
!'''Indication'''&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;5&amp;quot; | RF 0&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates thetransmit status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not active.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is transmitting data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RX2&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the receive status of the device.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot;| REF&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates the status of the reference signal.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no reference signal, or the device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; |Green&lt;br /&gt;
|Blinking&lt;br /&gt;
|The device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| PPS&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the pulse per second (PPS).&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no PPS timing reference signal, or the device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Blinking&lt;br /&gt;
|The device is locked to the PPS timing reference signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| GPS&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates whether the GPSDO is locked.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no GPSDO or the GPSDO is not locked.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The GPSDO is locked.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;5&amp;quot; | RF 1&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates thetransmit status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not active.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is transmitting data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RX2&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the receive status of the device.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| Status&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device initialized successfully and is ready for use.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Blinking&lt;br /&gt;
|Hardware error. An internal power supply has failed. Check front-panel I/O connections for shorts. Remove any shorts and cycle power to the USRP-2974. Contact NI if the problem persists.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| PWR&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the power status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is powered off.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The devices is powered on.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot; | 10/100/1000&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot;| Indicates the speed of the Gigabit Ethernet link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|No link, or 10 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|100 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
|Amber&lt;br /&gt;
|Solid&lt;br /&gt;
|1,000 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot;| ACT/LINK	&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Indicates the Gigabit Ethernet link activity or status.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|No link has been established.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Green&lt;br /&gt;
|Solid&lt;br /&gt;
|A link has been negotiated.&lt;br /&gt;
|-&lt;br /&gt;
|Blinking&lt;br /&gt;
|Activity on the link.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; | 1G/10G ETH 0&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | ACT/LINK&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Indicates the status of the SFP+ port.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The link is down.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The link is up.&lt;br /&gt;
|-&lt;br /&gt;
|Blinking&lt;br /&gt;
|The link is active (transmitting and receiving).&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |10GbE&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Indicates the status of the 10G ETH link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The 10G ETH link is down.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The 10G ETH link is up.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 1 10GbE&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Indicates the status of the 10G ETH link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The 10G ETH link is down.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The 10G ETH link is up.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Rear Panel===&lt;br /&gt;
[[File:USRP-2974 Rear Panel.jpg|800px]]&lt;br /&gt;
[[File:2974_back_wireframe.png|800px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Connector&lt;br /&gt;
!Use&lt;br /&gt;
|-&lt;br /&gt;
|REF OUT&lt;br /&gt;
|Output terminal for an external reference signal for the LO on the device. REF OUT is an SMA (f) connector with an impedance of 50 Ω, and it is a single-ended reference output. The output signal at this connector is 10 MHz at 3.3 V.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|REF IN&lt;br /&gt;
|Input terminal for an external reference signal for the LO on the device. REF IN is an SMA (f) connector with an impedance of 50 Ω, and it is a single-ended reference input. REF IN accepts a 10 MHz signal with a minimum input power of 0 dBm (0.632 Vpk-pk) and a maximum input power of 15 dBm (3.56 Vpk-pk) for a square wave or sine wave.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PPS TRIG OUT	&lt;br /&gt;
|Output terminal for the PPS timing reference. PPS TRIG OUT is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input. The output signal is 0 V to 3.3 V TTL. You can also use this port as a triggered output (TRIG OUT) that you program with the PPS Trig Out I/O signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PPS TRIG IN	&lt;br /&gt;
|Input terminal for PPS timing reference. PPS TRIG IN is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel. PPS TRIG IN accepts 0 V to 3.3 V TTL and 0 V to 5 V TTL signals. You can also use this port as a triggered input (TRIG IN) that you control using NI-USRP software.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|GPS ANT	&lt;br /&gt;
|Input terminal for the GPS antenna signal. GPS ANT is an SMA (f) connector with a maximum input power of -15 dBm and an output of DC 5 V to power an active antenna. &amp;lt;p&amp;gt; '''Notice:''' Do not terminate the GPS ANT port if you do not use it.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PCIe x4	&lt;br /&gt;
|Port for a PCI Express Generation 2, x4 bus connection through an MXI Express four-lane cable. Can be used to connect an external USRP device or external chassis.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SYSTEM POWER IN	&lt;br /&gt;
|Input that accepts a 15 V ± 5%, 10 A external DC power connector.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Ref Clock - 10 MHz===&lt;br /&gt;
Using an external 10 MHz reference clock, a square wave will offer the best phase noise performance, but a sinusoid is acceptable. The power level of the reference clock cannot exceed +15 dBm.&lt;br /&gt;
&lt;br /&gt;
===PPS - Pulse Per Second===&lt;br /&gt;
Using a PPS signal for timestamp synchronization requires a square wave signal with the following a 5Vpp amplitude.&lt;br /&gt;
&lt;br /&gt;
To test the PPS input, you can use the following tool from the UHD examples:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;args&amp;gt;&amp;lt;/code&amp;gt; are device address arguments (optional if only one USRP device is on your machine)&lt;br /&gt;
&lt;br /&gt;
    cd &amp;lt;install-path&amp;gt;/lib/uhd/examples ./test_pps_input –args=&amp;lt;args&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Front Panel GPIO===&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;width:50%&amp;quot; |&lt;br /&gt;
The GPIO port is not meant to drive big loads. You should not try to source more than 5mA per pin.&lt;br /&gt;
&lt;br /&gt;
The +3.3V is for ESD clamping purposes only and not designed to deliver high currents.&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | [[File:x3x0 gpio conn.png]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Power on state====&lt;br /&gt;
The hardware power on state and UHD initial state for the front-panel GPIOs is high-Z. For the X3xx, there are no external pull-ups/pull-downs for the GPIO pins, but the FPGAs do have them and they are configured as follows: X3xx: pull-down.&lt;br /&gt;
&lt;br /&gt;
====Pin Mapping====&lt;br /&gt;
* Pin 1: +3.3V&lt;br /&gt;
* Pin 2: Data[0]&lt;br /&gt;
* Pin 3: Data[1]&lt;br /&gt;
* Pin 4: Data[2]&lt;br /&gt;
* Pin 5: Data[3]&lt;br /&gt;
* Pin 6: Data[4]&lt;br /&gt;
* Pin 7: Data[5]&lt;br /&gt;
* Pin 8: Data[6]&lt;br /&gt;
* Pin 9: Data[7]&lt;br /&gt;
* Pin 10: Data[8]&lt;br /&gt;
* Pin 11: Data[9]&lt;br /&gt;
* Pin 12: Data[10]&lt;br /&gt;
* Pin 13: Data[11]&lt;br /&gt;
* Pin 14: 0V&lt;br /&gt;
* Pin 15: 0V&lt;br /&gt;
&lt;br /&gt;
'''Note''': Please see the [http://files.ettus.com/manual/page_gpio_api.html E3x0/X3x0 GPIO API] for information on configuring and using the GPIO bus.&lt;br /&gt;
&lt;br /&gt;
==Certifications==&lt;br /&gt;
===RoHS===&lt;br /&gt;
As of December 1st, 2010 all NI/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;
[http://files.ettus.com/manual/md_fpga.html FPGA Resources]&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/binaries/uhd_stable/ UHD Stable Binaries]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/EttusResearch/uhd UHD Source Code on Github]&lt;br /&gt;
&lt;br /&gt;
==Choosing an Interface==&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 provides three interface options – 1 Gigabit Ethernet (1 GigE), 10 Gigabit Ethernet (10 GigE), and PCI-Express (PCIe). The PCIe interface is always available regardless of what FPGA image is loaded. Ettus ships two FPGA image variants, the HG or HGS image which has one 1 GigE interfaces and one 10 GigE interfaces, and the XG image which has two 10 GigE interfaces. Generally, Ettus Research recommends using 10 GigE to achieve the maximum throughput available from the USRP-2974.  PCIe is recommended for applications that require the lowest possible latency, which is a desirable characteristic for PHY/MAC research.  If your application does not require the full bandwidth of the USRP-2974, the 1 GigE interface serves as a cost-effective fall-back option.  Ettus Research provides a complete interface kit for each of these options, which is also shown in the following table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|Interface Performance Summary&lt;br /&gt;
|-&lt;br /&gt;
!Interface&lt;br /&gt;
!Throughput (MS/s @ 16-bit)&lt;br /&gt;
!Target&lt;br /&gt;
!Recommended Kit&lt;br /&gt;
|-&lt;br /&gt;
|1 Gigabit&lt;br /&gt;
|25 MS/s&lt;br /&gt;
|Desktop/Laptop&lt;br /&gt;
|[https://www.ettus.com/product/details/1GIGE-KIT SFP Adapter + GigE Cable]&lt;br /&gt;
|-&lt;br /&gt;
|10 Gigabit&lt;br /&gt;
|200 MS/s&lt;br /&gt;
|Desktop&lt;br /&gt;
|[https://www.ettus.com/product/details/10GIGE-KIT 10 GigE Interface Kit]&lt;br /&gt;
|-&lt;br /&gt;
|PCI-Express &lt;br /&gt;
(PCIe, 4 lane)&lt;br /&gt;
|200 MS/S&lt;br /&gt;
|Desktop&lt;br /&gt;
|[https://www.ettus.com/product/details/PCIE-KIT PCI-Express Desktop Kit]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===10 Gigabit Ethernet===&lt;br /&gt;
In order to utilize the dual 10 Gigabit Ethernet interfaces, ensure the XG image is installed ([http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_load_fpga_imgs_fpga_flavours see FPGA Image Flavors]). In addition to burning the prerequisite FPGA image, it may also be necessary to tune the network interface card (NIC) to eliminate drops (Ds) and reduce overflows (Os). This is done by increasing the number of RX descriptors ([http://files.ettus.com/manual/page_transport.html#transport_udp_linux see Linux specific notes]).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;benchmark_rate&amp;lt;/code&amp;gt; tool can be used to test this capability. Run the following commands to test the X-series USRP over both 10 Gigabit Ethernet interfaces with the maximum rate of 200 Msps per channel:&lt;br /&gt;
&lt;br /&gt;
    cd &amp;lt;install-path&amp;gt;/lib/uhd/examples&lt;br /&gt;
    ./benchmark_rate --args=&amp;quot;type=x300,addr=&amp;lt;Primary IP&amp;gt;,second_addr=&amp;lt;secondary IP&amp;gt;&amp;quot; --channels=&amp;quot;0,1&amp;quot; --rx_rate 200e6&lt;br /&gt;
&lt;br /&gt;
The second interface is specified by the extra argument '''second_addr'''.&lt;br /&gt;
&lt;br /&gt;
'''Recommended 10 Gigabit Ethernet Cards'''&lt;br /&gt;
* Intel X520-DA2&lt;br /&gt;
** [http://ark.intel.com/products/39776/Intel-Ethernet-Converged-Network-Adapter-X520-DA2 Intel® Ethernet Converged Network Adapter X520-DA2]&lt;br /&gt;
* Intel X520-DA1&lt;br /&gt;
** [http://ark.intel.com/products/68669/Intel-Ethernet-Converged-Network-Adapter-X520-DA1 Intel® Ethernet Converged Network Adapter X520-DA1 ]&lt;br /&gt;
* Intel X710-DA2&lt;br /&gt;
** [http://ark.intel.com/products/83964/Intel-Ethernet-Converged-Network-Adapter-X710-DA2 Intel® Ethernet Converged Network Adapter X710-DA2 ]&lt;br /&gt;
* Intel X710-DA4&lt;br /&gt;
** [http://ark.intel.com/products/83965/Intel-Ethernet-Converged-Network-Adapter-X710-DA4 Intel® Ethernet Converged Network Adapter X710-DA4 ]&lt;br /&gt;
* Mellanox MCX4121A-ACAT&lt;br /&gt;
** [https://store.mellanox.com/products/mellanox-mcx4121a-acat-connectx-4-lx-en-network-interface-card-25gbe-dual-port-sfp28-pcie3-0-x8-rohs-r6.html Mellanox MCX4121A-ACAT ]&lt;br /&gt;
&lt;br /&gt;
==GPS Disciplined, Oven-Controlled Oscillator (GPSDO)==&lt;br /&gt;
The USRP-2794 has a high-accuracy GPS-disciplined oscillator (GPSDO).  The GPSDO improves the accuracy of the internal frequency reference to 20 ppb, or 0.1 ppb if the GPS is synchronized to the GPS constellation.  When synchronized to the GPS constellation, all USRP™ devices will also be synchronized in time within 50 ns.&lt;br /&gt;
&lt;br /&gt;
* Support GPSDO NMEA Strings&lt;br /&gt;
* [http://www.jackson-labs.com/assets/uploads/main/LC_XO_specsheet.pdf JacksonLabs LC_XO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
!Internal TCXO&lt;br /&gt;
!GPS-Disciplined Clock&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Reference&lt;br /&gt;
|TCXO&lt;br /&gt;
|OCXO&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Accuracy&lt;br /&gt;
|± 2.5ppm&lt;br /&gt;
± 2,500 Hz @ 1 GHz&lt;br /&gt;
|± 20 ppb&lt;br /&gt;
± 20 Hz @ 1 GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Accuracy&lt;br /&gt;
|&lt;br /&gt;
|± 0.01ppb&lt;br /&gt;
|-&lt;br /&gt;
|(GPS-Disciplined)&lt;br /&gt;
|&lt;br /&gt;
|~ ± 0.01 Hz @ 1 GHz&lt;br /&gt;
|-&lt;br /&gt;
|GPS Time Sync Accuracy&lt;br /&gt;
|&lt;br /&gt;
|±50ns to UTC Time**&lt;br /&gt;
|-&lt;br /&gt;
|10 MHz Reference Phase Drift with GPS Sync&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;±20ns After 1 Hour**&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Sensors===&lt;br /&gt;
You can query the lock status with the &amp;lt;code&amp;gt;gps_locked&amp;lt;/code&amp;gt; sensor, as well as obtain raw NMEA sentences using the &amp;lt;code&amp;gt;gps_gprmc&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;gps_gpgga&amp;lt;/code&amp;gt; sensors. Location information can be parsed out of the &amp;lt;code&amp;gt;gps_gpgga&amp;lt;/code&amp;gt; sensor by using &amp;lt;code&amp;gt;gpsd&amp;lt;/code&amp;gt; or another NMEA parser.&lt;br /&gt;
&lt;br /&gt;
==Option: Using the GPIO Expansion Kit==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top; width:60%&amp;quot;|This General Purpose Input/output (GPIO) breakout kit provides access to general purpose digital I/O signals with simple terminal blocks, and a prototyping area where wires and components can be soldered.  Each GPIO pin is connected to an FPGA digital line allowing it to be configured as an input, or an output, using the various software frameworks that support the USRP™ GPIO. &lt;br /&gt;
&lt;br /&gt;
These GPIO signals can serve the following functions:&lt;br /&gt;
&lt;br /&gt;
* Control of external devices, such as power amplifiers and RF switches&lt;br /&gt;
* Provide output signals that can help with debugging&lt;br /&gt;
* Provide observables to be analyzed by oscilloscopes or other external equipment&lt;br /&gt;
* Accept input from external devices for local, software-based triggering&lt;br /&gt;
* Implement a protocol line such as SPI or I2C&lt;br /&gt;
||[[File:Product_x3x0_gpio.jpg|250px]]&lt;br /&gt;
|}&lt;br /&gt;
===GPIO Expansion Kit Contents===&lt;br /&gt;
&lt;br /&gt;
*1 GPIO Breakout Board&lt;br /&gt;
*1 DB-15, 1-meter cable&lt;br /&gt;
*GPIO Quick Reference&lt;br /&gt;
&lt;br /&gt;
===Circuit Protection===&lt;br /&gt;
The GPIO signals exposed with this breakout kit are routed directly to the USRP device's FPGA with limited protection circuitry.  However, the user must take precautionary measures to ensure input/output signals meet the specifications shown in this document.  Over voltage, excess current draw, and other conditions can damage the USRP device and void the warranty. Special care should be taken when the USRP is powered off.&lt;br /&gt;
&lt;br /&gt;
===Mounting the GPIO Breakout Board===&lt;br /&gt;
The GPIO breakout board can be mounted directly to the DB15 connector of a USRP ™ device, or mounted remotely with the cable provided in this kit.  The screws on the DB15 connector of the breakout board must be removed to mount the board directly.  For remote mounting, the breakout board is supplied with rubber standoffs to avoid scratching surfaces, and several through-holes for hard mounting with screws or other hardware (not provided).&lt;br /&gt;
&lt;br /&gt;
===Using GPIO with UHD, GNU Radio, and other Third-Party Frameworks===&lt;br /&gt;
When used with UHD, or other third party frameworks that leverage UHD, the GPIO expansion can be controlled with simple API calls.  For more information, on the C++ API, and examples of how to use the GPIO in frameworks such as GNU Radio, please see the [[Application Notes]] section of the [https://kb.ettus.com Ettus Research Knowledge Base].&lt;br /&gt;
&lt;br /&gt;
===GPIO Specifications (3.3V Bank, LVCMOS)===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Parameter&lt;br /&gt;
!Typical&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Configured as Input&lt;br /&gt;
|-&lt;br /&gt;
|Default Voltage Standard&lt;br /&gt;
|3.3V LVCMOS&lt;br /&gt;
|-&lt;br /&gt;
|Voltage High Threshold&lt;br /&gt;
|2.0V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Low Threshold&lt;br /&gt;
|0.8V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Input Limits (no damage) &lt;br /&gt;
| -0.3V/3.45V&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Configured as Output&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Standard&lt;br /&gt;
|3.3V LVCMOS&lt;br /&gt;
|-&lt;br /&gt;
|Voltage High Output&lt;br /&gt;
|2.8V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Low Output&lt;br /&gt;
|0.4V&lt;br /&gt;
|-&lt;br /&gt;
|Current Source Capability&lt;br /&gt;
|12 mA&lt;br /&gt;
|-&lt;br /&gt;
|Output Source Impedance&lt;br /&gt;
|&amp;gt;33 ohms typical&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Option: Antenna Kit for GPSDO==&lt;br /&gt;
The GPSDO Mini Kit will improve the accuracy of the USRP reference clock, even if it does not receive signals from the GPS Constellation.  However, to achieve the best accuracy possible, and to achieve global timing alignment across multiple USRPs, Ettus Research recommends the GPSDO Mini Antenna Kit.&lt;br /&gt;
&lt;br /&gt;
==Option: Cables for MIMO Expansion==&lt;br /&gt;
Multiple USRP-2974s can be synchronized for coherent operation by sharing a common 10 MHz and 1 PPS signal.  We recommend using a star-distribution topology with an OctoClock or OctoClock-G, as seen in Figure 4.  This requires matched length cables to be used for both 10 MHz and 1 PPS.&lt;br /&gt;
&lt;br /&gt;
For more information about MIMO operation, please see the MIMO and Synchronization Application Note.&lt;br /&gt;
[[File:8mimo.png|700px|center]]&lt;br /&gt;
&amp;lt;center&amp;gt;Figure 4 - Star-Distribution of 10 MHz/PPS Signals with OctoClock&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
&lt;br /&gt;
* '''What is the bandwidth of the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
The ADC rate on each analog RX channel is 200 MS/s quadrature, which provides a theoretical analog bandwidth of approximately 80% of the Nyquist bandwidth of +/- 100 MHz (+/- 80 MHz around the center frequency).  The resulting maximum theoretical analog bandwidth is 160 MHz.&lt;br /&gt;
&lt;br /&gt;
FPGA Processing Bandwidth: Up to 200 MS/s quadrature.&lt;br /&gt;
&lt;br /&gt;
Host Bandwidth:  Up to 200 MS/s quadrature, dependent on selected interface&lt;br /&gt;
&lt;br /&gt;
For more information about achieving the maximum bandwidth with a USRP-2974, please see the &amp;quot;USRP X300/X310 Configuration Guide&amp;quot; or the &amp;quot;USRP System Bandwidth&amp;quot; application note.&lt;br /&gt;
&lt;br /&gt;
* '''How can I program the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
Like all other USRP models, the USRP-2974 is compatible with the USRP Hardware Driver™ (UHD) architecture.  The UHD architecture is a common driver that allows users to develop and execute applications on the onboard or host computer.  UHD provides a direct C++ API to control and stream to/from the USRP-2974.  It also provides compatibility with a variety of third-party software frameworks including GNU Radio, LabVIEW, and MATLAB.  You may also customize the FPGA image provided with UHD to integrate your own signal processing. For more information about UHD, and supported software frameworks, please see:&lt;br /&gt;
&lt;br /&gt;
http://files.ettus.com/manual/&lt;br /&gt;
&lt;br /&gt;
* '''How do I update the FPGA images and firmware with the latest from UHD'''&lt;br /&gt;
&lt;br /&gt;
You can find more information about updating the FPGA image through PCIe, 1/10 GigE, and JTAG [https://kb.ettus.com/X300/X310_Device_Recovery here].&lt;br /&gt;
&lt;br /&gt;
* '''How can I modify the FPGA of the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
The source code (Verilog) for the USRP-2794 is available in the UHD repository. The build process leverages the existing CMAKE build system used to compile the host-side driver.  A Linux-based setup will provide the best results.&lt;br /&gt;
&lt;br /&gt;
Which FPGA toolchain required to build the FPGA images will depend upon your version of UHD. For more details please see the [https://kb.ettus.com/UHD UHD] Software Resource page.&lt;br /&gt;
&lt;br /&gt;
* '''How much free space is available in the USRP-2974 FPGA'''&lt;br /&gt;
&lt;br /&gt;
Please see the [[#Utilization statistics]] section of this resources page for more information.&lt;br /&gt;
&lt;br /&gt;
* '''What frequency range does the USRP-2974 cover'''&lt;br /&gt;
&lt;br /&gt;
10MHz to 6GHz.&lt;br /&gt;
&lt;br /&gt;
* '''What components do I need to purchase for a complete USRP-2974 system'''&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 is a complete stand alone SDR. Additional components might include RF filters, antennas, RF power amplifiers or other RF components needed of a specific application.&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP-2974&amp;diff=4159</id>
		<title>USRP-2974</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=USRP-2974&amp;diff=4159"/>
				<updated>2019-06-01T15:14:36Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* Controller - Onboard computer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The NI USRP-2974 is a high-performance, USRP software defined radio (SDR) stand-alone device for designing and deploying next generation wireless communications systems. The hardware architecture combines two extended-bandwidth daughterboard slots covering 10 MHz – 6 GHz with up to 160 MHz of baseband bandwidth, multiple high-speed interface options (PCIe, dual 10 GigE), an onboard Intel Core i7 processor, and a large user-programmable Kintex-7 FPGA in a convenient desktop or rack-mountable half-wide 2U form factor.&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 is the equivalent to a USRP X310 with two UBX-160 boards, a GPSDO and an onboard Intel i7 computer. The USRP-2974 comes with NI Linux RTOS pre-installed, but in order to use it with open-source tool-chain, a user will need to install Linux (preferably Fedora or Ubuntu) and then the USRP Hardware driver (UHD). After these have been installed, any other open-source tools can be installed, such as GNU Radio.&lt;br /&gt;
&lt;br /&gt;
== Key Features of the USRP-2974==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Intel Core i7 6822EQ 2GHz Quad CoreProcessor&lt;br /&gt;
* 16GB DDR4 Memory&lt;br /&gt;
* 512GB SSD&lt;br /&gt;
* USB-to-UART to the CPU&lt;br /&gt;
* Xilinx Kintex-7 XC7K410T FPGA&lt;br /&gt;
* 14 bit 200 MS/s ADC&lt;br /&gt;
* 16 bit 800 MS/s DAC&lt;br /&gt;
* Frequency range: 10 MHz - 6 GHz&lt;br /&gt;
* Up 160MHz&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; bandwidth per channel&lt;br /&gt;
* 2 Transmit ports&lt;br /&gt;
* 2 Receive ports&lt;br /&gt;
* GPSDO&lt;br /&gt;
* Multiple high-speed interfaces (Dual 10G, PCIe Express, 1G)&lt;br /&gt;
|[[File:USRP_2974_frt_dia.jpg|350px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Controller - Onboard computer ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|System on module (SoM) &lt;br /&gt;
|Congatec COM Express conga-TS170&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|CPU&lt;br /&gt;
|Intel Core i7 6822EQ (2 GHz Quad Core)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Memory &lt;br /&gt;
|SO-DIMM DDR4 16 GB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SFP+&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &lt;br /&gt;
|10G ETH connection to the SoM&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Cabled PCIe&lt;br /&gt;
|PCIe Gen 2 x4&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|MicroUSB&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|USB-to-UART to the SoM&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|RJ45&lt;br /&gt;
|1G ETH host connection&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; Can be bypassed to the FPGA.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; Device port for external host.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RF Specifications==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Transmitter&lt;br /&gt;
|-&lt;br /&gt;
|Number of channels&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Frequency range&lt;br /&gt;
|10MHz to 6GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency step&lt;br /&gt;
|&amp;lt;1kHz&lt;br /&gt;
|-&lt;br /&gt;
|Maximum output power&lt;br /&gt;
|5mW to 100mW (7dBm to 20dBm)&lt;br /&gt;
|-&lt;br /&gt;
|Gain range&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
|0dB to 31.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Gain step&lt;br /&gt;
|0.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum instantaneous real-time bandwidth&lt;br /&gt;
|160MHz&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Receiver&lt;br /&gt;
|-&lt;br /&gt;
|Number of channels&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Frequency range&lt;br /&gt;
|10MHz to 6GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency step&lt;br /&gt;
|&amp;lt;1kHz&lt;br /&gt;
|-&lt;br /&gt;
|Gain range&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|0dB to 37.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Gain step&lt;br /&gt;
|0.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum input power&lt;br /&gt;
|10dBm&lt;br /&gt;
|-&lt;br /&gt;
|Noise Figure&lt;br /&gt;
|5dB to 7dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum instantaneous real-time bandwidth&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&lt;br /&gt;
|160MHz&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; The output power resulting from the gain setting varies over the frequency band and among&lt;br /&gt;
devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;The received signal amplitude resulting from the gain setting varies over the frequency band and&lt;br /&gt;
among devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;The USRP-2974 receiver path has 84 MHz of bandwidth for center frequencies from 10 MHz to&lt;br /&gt;
500 MHz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' As mentioned earlier, the USRP-2974 incorporates 2 UBX-160 daughterboards. Therefore, for more information on RF performance, please see the [https://kb.ettus.com/UBX UBX hardware resource] page&lt;br /&gt;
&lt;br /&gt;
==Hardware Specifications==&lt;br /&gt;
===USRP Hardware Driver (UHD) version===&lt;br /&gt;
* Minimum version of UHD required: '''3.15.0'''&lt;br /&gt;
&lt;br /&gt;
===Clocking and Sampling Rates===&lt;br /&gt;
There are two master clock rates (MCR) supported on the USRP-2974 like on the X310: 200.0 MHz and 184.32 MHz.&lt;br /&gt;
&lt;br /&gt;
The sampling rate must be an integer decimation rate of the MCR. Ideally, this decimation factor should be an even number. An odd decimation factor will result in additional unwanted attenuation (roll-off from the CIC filter in the DUC and DDC blocks in the FPGA). The valid decimation rates are between 1 and 1024.&lt;br /&gt;
&lt;br /&gt;
For the MCR of 200.0 MHz, the achievable sampling rates using an even decimation factor are 200.0, 100.0, 50.0, 33.33, 25.0, 20.0, 16.67, 14.286 Msps, ... 195.31 Ksps.&lt;br /&gt;
&lt;br /&gt;
For the MCR of 184.32 MHz, the achievable sampling rates using an even decimation factor are 184.32, 92.16, 46.08, 30.72, 23.04, 18.432, 15.36, 13.166 Msps, ... 180.0 Ksps.&lt;br /&gt;
&lt;br /&gt;
If the desired sampling rate is not directly supported by the hardware, then it will be necessary to re-sample in software. This can be done in C++ using libraries such as Liquid DSP [https://github.com/jgaeddert/liquid-dsp], or can be done in GNU Radio, in which there are three blocks that perform sampling rate conversion.&lt;br /&gt;
&lt;br /&gt;
==Physical Specifications==&lt;br /&gt;
&lt;br /&gt;
===Dimensions===&lt;br /&gt;
(L × W × H) 29.08 cm × 21.84 cm × 7.98 cm (11.45 in. × 8.60 in. × 3.14 in. )&lt;br /&gt;
&lt;br /&gt;
===Weight===&lt;br /&gt;
3.34 kg (7.35 lb)&lt;br /&gt;
&lt;br /&gt;
==Power==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|Voltage range&lt;br /&gt;
|14.25 V to 15.75 V DC&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Current&lt;br /&gt;
|10 A, maximum&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Power&lt;br /&gt;
|150 W, maximum&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' Indoor use only&lt;br /&gt;
&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* 0 °C to 50 °C&lt;br /&gt;
&lt;br /&gt;
===Maximum altitude===&lt;br /&gt;
* 2,000 m (800 mbar) (at 25 °C ambient temperature)&lt;br /&gt;
&lt;br /&gt;
===Operating Humidity Range===&lt;br /&gt;
* 10% to 90% non-condensing&lt;br /&gt;
&lt;br /&gt;
===Pollution Degree===&lt;br /&gt;
* 2&lt;br /&gt;
&lt;br /&gt;
==System Diagram and Schematics==&lt;br /&gt;
&lt;br /&gt;
===System Block Diagram===&lt;br /&gt;
[[file:2974_blk_dia.png |800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.ni.com/documentation/en/usrp-software-defined-radio-stand-alone-device/latest/usrp-2974/block-diagram/ System Block Diagram]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schematics===&lt;br /&gt;
Because the USRP-2974 is a combination of an Intel i7 SOM and an X310 USRP, a user can reference the X310 Schematics.&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/schematics/x300/x3xx.pdf X310 Schematics]&lt;br /&gt;
&lt;br /&gt;
==Key Component Datasheets==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%&amp;quot;&lt;br /&gt;
!Part Number&lt;br /&gt;
!Description&lt;br /&gt;
!Schematic ID (Page)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.congatec.com/fileadmin/user_upload/Documents/Datasheets/conga-TS170.pdf conga-TS170]&lt;br /&gt;
|System on Module (SoM)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.xilinx.com/support/documentation/data_sheets/ds180_7Series_Overview.pdf XC7K410T]&lt;br /&gt;
|FPGA&lt;br /&gt;
|U23 (3,5,8,9,10,18)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/AD9146.PDF AD9146]&lt;br /&gt;
|Dual Channel, 16-Bit, 1230 MSPS DAC&lt;br /&gt;
|U12, U36 (7)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/slas635b/slas635b.pdf ADS62P48]&lt;br /&gt;
|Dual Channel, 14-Bit 210 MSPS ADC&lt;br /&gt;
|U11, U35 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.onsemi.com/pub/Collateral/FIN1002-D.pdf FIN1002]&lt;br /&gt;
|High Speed Differential Receiver&lt;br /&gt;
|U3, U5, U31, U32 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/20001203U.pdf 24LC256T]&lt;br /&gt;
|EEPROM&lt;br /&gt;
|U530 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/lmk04816.pdf LMK04816BISQ/NOPB_1/3]&lt;br /&gt;
|Jitter Cleaner With Dual Loop PLLs&lt;br /&gt;
|U531 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/sy89547l.pdf SY89547LMGTR]&lt;br /&gt;
|Multiplexer&lt;br /&gt;
|U506 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/sn74aup1t17.pdf SN74AUP1T17]&lt;br /&gt;
|Single Schmitt-Trigger Buffer Gate&lt;br /&gt;
|U6, U519 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps54620.pdf TPS54620RGYT]&lt;br /&gt;
|Synchronous Step Down SWIFT™ Converter&lt;br /&gt;
|U515 (21); U516 (26)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/1764fb.pdf LT1764EQ-3.3]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U27 (21); U516 (26)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps7a47.pdf TPS7A47]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U28, U532 (21)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/3603fc.pdf LTC3603EUF_TRPBF]&lt;br /&gt;
|Monolithic Synchronous Step-Down Regulator&lt;br /&gt;
|U517 (23); U500 (25); U514, U513 (27)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/product/TPS77625-EP?keyMatch=TPS77625&amp;amp;tisearch=Search-EN-Everything TPS77625]&lt;br /&gt;
|Low-Dropout Voltage Regulators&lt;br /&gt;
|U30 (23)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps79318-ep.pdf TPS79318_SM]&lt;br /&gt;
|Low-Dropout Voltage Regulators&lt;br /&gt;
|U510 (27)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Media:agile9598503.pdf|OSC-96MHZ-724821-01]]&lt;br /&gt;
|Voltage Controlled Crystal Oscillator&lt;br /&gt;
|U25 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==FPGA and Baseband==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|FPGA &lt;br /&gt;
|Kintex-7 XC7K410T&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|DRAM &lt;br /&gt;
|1 GB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Baseband analog-to-digital converter&lt;br /&gt;
(ADC) resolution&lt;br /&gt;
|14 bit&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Baseband digital-to-analog converter&lt;br /&gt;
(DAC) resolution&lt;br /&gt;
|16 bit&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|ADC spurious-free dynamic range (sFDR)&lt;br /&gt;
|88 dB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|DAC sFDR&lt;br /&gt;
|80 dB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Maximum I/Q sample rate&lt;br /&gt;
|200 MS/s&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SFP+&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &lt;br /&gt;
|High speed serial link to one of the FPGA&lt;br /&gt;
GTX transceivers&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;Can be bypassed to the SoM if using the 10 GbE as protocol.&lt;br /&gt;
&lt;br /&gt;
===FPGA User Modifications===&lt;br /&gt;
&lt;br /&gt;
The Verilog code for the FPGA in the NI USRP-2974 is open-source, and users are free to modify and customize it for their needs. However, certain modifications may result in either bricking the device, or even in physical damage to the unit. Specifically, changing the I/O interface of the FPGA in any way (do not remove any of the I/O for the PCIe interface, such as &amp;lt;code&amp;gt;x300_pcie_int&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;LvFpga_Chinch_Interface&amp;lt;/code&amp;gt;), or modifying the pin and timing constraint files, could result in physical damage to other components on the motherboard, external to the FPGA, and doing this will void the warranty. Also, even if the PCIe interface is not being used, you cannot remove or reassign these pins in the constraint file. The constraint files should not be modified. Please note that modifications to the FPGA are made at the risk of the user, and may not be covered by the warranty of the device.&lt;br /&gt;
&lt;br /&gt;
==Interfaces and Connectivity==&lt;br /&gt;
Follow the links below for additional information on configuring each interface for the USRP-2974.&lt;br /&gt;
&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_10gige Dual 10 Gigabit Ethernet] - 200 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_pcie PCIe Express (Desktop)] - 200 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_1gige 1 Gigabit Ethernet] - 25 MS/s Full Duplex @ 16-bit&lt;br /&gt;
&lt;br /&gt;
===Front Panel===&lt;br /&gt;
&lt;br /&gt;
[[File:USRP-2974 Front Panel.jpg|800px]]&lt;br /&gt;
[[File:2974_frt_wireframe.png|800px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Connector&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''Use'''&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RF 0&lt;br /&gt;
|TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|Input and output terminal for the RF signal. TX1 RX1 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input or output channel.&lt;br /&gt;
|-&lt;br /&gt;
|RX2&lt;br /&gt;
|Input terminal for the RF signal. RX2 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | AUX I/O&lt;br /&gt;
|General-purpose I/O (GPIO) port. AUX I/O is controlled by the FPGA.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RF 1&lt;br /&gt;
|TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|Input and output terminal for the RF signal. TX1 RX1 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input or output channel.&lt;br /&gt;
|-&lt;br /&gt;
|RX2&lt;br /&gt;
|Input terminal for the RF signal. RX2 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | DP&lt;br /&gt;
|DisplayPort connector to connect one monitor for your controller.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | USB2.0&lt;br /&gt;
|USB ports that support common USB peripheral devices such as flash drives, hard drives, keyboards, and mice.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | USB3.0&lt;br /&gt;
|USB ports that support common USB peripheral devices such as flash drives, hard drives, keyboards, and mice.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G ETH&lt;br /&gt;
|RJ45 port used for 1G ETH connectivity to other ethernet devices.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | μUSB&lt;br /&gt;
|USB port used for UART connectivity to the controller.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 0&lt;br /&gt;
|SFP+ port used for 10G ETH connectivity to other ethernet devices. Connects to the embedded Linux computer for communication with LabVIEW RT.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 1&lt;br /&gt;
|SFP+ port used for 1G/10G ETH connectivity to other ethernet devices. Connects to the FPGA. Not currently supported in LabVIEW Communications System Design Suite.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''LED'''&lt;br /&gt;
!'''Description'''&lt;br /&gt;
!'''Color'''&lt;br /&gt;
!'''State'''&lt;br /&gt;
!'''Indication'''&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;5&amp;quot; | RF 0&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates thetransmit status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not active.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is transmitting data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RX2&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the receive status of the device.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot;| REF&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates the status of the reference signal.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no reference signal, or the device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; |Green&lt;br /&gt;
|Blinking&lt;br /&gt;
|The device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| PPS&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the pulse per second (PPS).&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no PPS timing reference signal, or the device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Blinking&lt;br /&gt;
|The device is locked to the PPS timing reference signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| GPS&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates whether the GPSDO is locked.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no GPSDO or the GPSDO is not locked.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The GPSDO is locked.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;5&amp;quot; | RF 1&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates thetransmit status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not active.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is transmitting data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RX2&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the receive status of the device.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| Status&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device initialized successfully and is ready for use.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Blinking&lt;br /&gt;
|Hardware error. An internal power supply has failed. Check front-panel I/O connections for shorts. Remove any shorts and cycle power to the USRP-2974. Contact NI if the problem persists.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| PWR&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the power status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is powered off.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The devices is powered on.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot; | 10/100/1000&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot;| Indicates the speed of the Gigabit Ethernet link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|No link, or 10 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|100 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
|Amber&lt;br /&gt;
|Solid&lt;br /&gt;
|1,000 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot;| ACT/LINK	&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Indicates the Gigabit Ethernet link activity or status.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|No link has been established.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Green&lt;br /&gt;
|Solid&lt;br /&gt;
|A link has been negotiated.&lt;br /&gt;
|-&lt;br /&gt;
|Blinking&lt;br /&gt;
|Activity on the link.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; | 1G/10G ETH 0&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | ACT/LINK&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Indicates the status of the SFP+ port.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The link is down.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The link is up.&lt;br /&gt;
|-&lt;br /&gt;
|Blinking&lt;br /&gt;
|The link is active (transmitting and receiving).&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |10GbE&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Indicates the status of the 10G ETH link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The 10G ETH link is down.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The 10G ETH link is up.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 1 10GbE&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Indicates the status of the 10G ETH link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The 10G ETH link is down.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The 10G ETH link is up.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Rear Panel===&lt;br /&gt;
[[File:USRP-2974 Rear Panel.jpg|800px]]&lt;br /&gt;
[[File:2974_back_wireframe.png|800px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Connector&lt;br /&gt;
!Use&lt;br /&gt;
|-&lt;br /&gt;
|REF OUT&lt;br /&gt;
|Output terminal for an external reference signal for the LO on the device. REF OUT is an SMA (f) connector with an impedance of 50 Ω, and it is a single-ended reference output. The output signal at this connector is 10 MHz at 3.3 V.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|REF IN&lt;br /&gt;
|Input terminal for an external reference signal for the LO on the device. REF IN is an SMA (f) connector with an impedance of 50 Ω, and it is a single-ended reference input. REF IN accepts a 10 MHz signal with a minimum input power of 0 dBm (0.632 Vpk-pk) and a maximum input power of 15 dBm (3.56 Vpk-pk) for a square wave or sine wave.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PPS TRIG OUT	&lt;br /&gt;
|Output terminal for the PPS timing reference. PPS TRIG OUT is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input. The output signal is 0 V to 3.3 V TTL. You can also use this port as a triggered output (TRIG OUT) that you program with the PPS Trig Out I/O signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PPS TRIG IN	&lt;br /&gt;
|Input terminal for PPS timing reference. PPS TRIG IN is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel. PPS TRIG IN accepts 0 V to 3.3 V TTL and 0 V to 5 V TTL signals. You can also use this port as a triggered input (TRIG IN) that you control using NI-USRP software.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|GPS ANT	&lt;br /&gt;
|Input terminal for the GPS antenna signal. GPS ANT is an SMA (f) connector with a maximum input power of -15 dBm and an output of DC 5 V to power an active antenna. &amp;lt;p&amp;gt; '''Notice:''' Do not terminate the GPS ANT port if you do not use it.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PCIe x4	&lt;br /&gt;
|Port for a PCI Express Generation 2, x4 bus connection through an MXI Express four-lane cable. Can be used to connect an external USRP device or external chassis.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SYSTEM POWER IN	&lt;br /&gt;
|Input that accepts a 15 V ± 5%, 10 A external DC power connector.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Ref Clock - 10 MHz===&lt;br /&gt;
Using an external 10 MHz reference clock, a square wave will offer the best phase noise performance, but a sinusoid is acceptable. The power level of the reference clock cannot exceed +15 dBm.&lt;br /&gt;
&lt;br /&gt;
===PPS - Pulse Per Second===&lt;br /&gt;
Using a PPS signal for timestamp synchronization requires a square wave signal with the following a 5Vpp amplitude.&lt;br /&gt;
&lt;br /&gt;
To test the PPS input, you can use the following tool from the UHD examples:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;args&amp;gt;&amp;lt;/code&amp;gt; are device address arguments (optional if only one USRP device is on your machine)&lt;br /&gt;
&lt;br /&gt;
    cd &amp;lt;install-path&amp;gt;/lib/uhd/examples ./test_pps_input –args=&amp;lt;args&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Front Panel GPIO===&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;width:50%&amp;quot; |&lt;br /&gt;
The GPIO port is not meant to drive big loads. You should not try to source more than 5mA per pin.&lt;br /&gt;
&lt;br /&gt;
The +3.3V is for ESD clamping purposes only and not designed to deliver high currents.&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | [[File:x3x0 gpio conn.png]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Power on state====&lt;br /&gt;
The hardware power on state and UHD initial state for the front-panel GPIOs is high-Z. For the X3xx, there are no external pull-ups/pull-downs for the GPIO pins, but the FPGAs do have them and they are configured as follows: X3xx: pull-down.&lt;br /&gt;
&lt;br /&gt;
====Pin Mapping====&lt;br /&gt;
* Pin 1: +3.3V&lt;br /&gt;
* Pin 2: Data[0]&lt;br /&gt;
* Pin 3: Data[1]&lt;br /&gt;
* Pin 4: Data[2]&lt;br /&gt;
* Pin 5: Data[3]&lt;br /&gt;
* Pin 6: Data[4]&lt;br /&gt;
* Pin 7: Data[5]&lt;br /&gt;
* Pin 8: Data[6]&lt;br /&gt;
* Pin 9: Data[7]&lt;br /&gt;
* Pin 10: Data[8]&lt;br /&gt;
* Pin 11: Data[9]&lt;br /&gt;
* Pin 12: Data[10]&lt;br /&gt;
* Pin 13: Data[11]&lt;br /&gt;
* Pin 14: 0V&lt;br /&gt;
* Pin 15: 0V&lt;br /&gt;
&lt;br /&gt;
'''Note''': Please see the [http://files.ettus.com/manual/page_gpio_api.html E3x0/X3x0 GPIO API] for information on configuring and using the GPIO bus.&lt;br /&gt;
&lt;br /&gt;
==Certifications==&lt;br /&gt;
===RoHS===&lt;br /&gt;
As of December 1st, 2010 all NI/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;
[http://files.ettus.com/manual/md_fpga.html FPGA Resources]&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/binaries/uhd_stable/ UHD Stable Binaries]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/EttusResearch/uhd UHD Source Code on Github]&lt;br /&gt;
&lt;br /&gt;
==Choosing an Interface==&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 provides three interface options – 1 Gigabit Ethernet (1 GigE), 10 Gigabit Ethernet (10 GigE), and PCI-Express (PCIe). The PCIe interface is always available regardless of what FPGA image is loaded. Ettus ships two FPGA image variants, the HG or HGS image which has one 1 GigE interfaces and one 10 GigE interfaces, and the XG image which has two 10 GigE interfaces. Generally, Ettus Research recommends using 10 GigE to achieve the maximum throughput available from the USRP-2974.  PCIe is recommended for applications that require the lowest possible latency, which is a desirable characteristic for PHY/MAC research.  If your application does not require the full bandwidth of the USRP-2974, the 1 GigE interface serves as a cost-effective fall-back option.  Ettus Research provides a complete interface kit for each of these options, which is also shown in the following table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|Interface Performance Summary&lt;br /&gt;
|-&lt;br /&gt;
!Interface&lt;br /&gt;
!Throughput (MS/s @ 16-bit)&lt;br /&gt;
!Target&lt;br /&gt;
!Recommended Kit&lt;br /&gt;
|-&lt;br /&gt;
|1 Gigabit&lt;br /&gt;
|25 MS/s&lt;br /&gt;
|Desktop/Laptop&lt;br /&gt;
|[https://www.ettus.com/product/details/1GIGE-KIT SFP Adapter + GigE Cable]&lt;br /&gt;
|-&lt;br /&gt;
|10 Gigabit&lt;br /&gt;
|200 MS/s&lt;br /&gt;
|Desktop&lt;br /&gt;
|[https://www.ettus.com/product/details/10GIGE-KIT 10 GigE Interface Kit]&lt;br /&gt;
|-&lt;br /&gt;
|PCI-Express &lt;br /&gt;
(PCIe, 4 lane)&lt;br /&gt;
|200 MS/S&lt;br /&gt;
|Desktop&lt;br /&gt;
|[https://www.ettus.com/product/details/PCIE-KIT PCI-Express Desktop Kit]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===10 Gigabit Ethernet===&lt;br /&gt;
In order to utilize the dual 10 Gigabit Ethernet interfaces, ensure the XG image is installed ([http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_load_fpga_imgs_fpga_flavours see FPGA Image Flavors]). In addition to burning the prerequisite FPGA image, it may also be necessary to tune the network interface card (NIC) to eliminate drops (Ds) and reduce overflows (Os). This is done by increasing the number of RX descriptors ([http://files.ettus.com/manual/page_transport.html#transport_udp_linux see Linux specific notes]).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;benchmark_rate&amp;lt;/code&amp;gt; tool can be used to test this capability. Run the following commands to test the X-series USRP over both 10 Gigabit Ethernet interfaces with the maximum rate of 200 Msps per channel:&lt;br /&gt;
&lt;br /&gt;
    cd &amp;lt;install-path&amp;gt;/lib/uhd/examples&lt;br /&gt;
    ./benchmark_rate --args=&amp;quot;type=x300,addr=&amp;lt;Primary IP&amp;gt;,second_addr=&amp;lt;secondary IP&amp;gt;&amp;quot; --channels=&amp;quot;0,1&amp;quot; --rx_rate 200e6&lt;br /&gt;
&lt;br /&gt;
The second interface is specified by the extra argument '''second_addr'''.&lt;br /&gt;
&lt;br /&gt;
'''Recommended 10 Gigabit Ethernet Cards'''&lt;br /&gt;
* Intel X520-DA2&lt;br /&gt;
** [http://ark.intel.com/products/39776/Intel-Ethernet-Converged-Network-Adapter-X520-DA2 Intel® Ethernet Converged Network Adapter X520-DA2]&lt;br /&gt;
* Intel X520-DA1&lt;br /&gt;
** [http://ark.intel.com/products/68669/Intel-Ethernet-Converged-Network-Adapter-X520-DA1 Intel® Ethernet Converged Network Adapter X520-DA1 ]&lt;br /&gt;
* Intel X710-DA2&lt;br /&gt;
** [http://ark.intel.com/products/83964/Intel-Ethernet-Converged-Network-Adapter-X710-DA2 Intel® Ethernet Converged Network Adapter X710-DA2 ]&lt;br /&gt;
* Intel X710-DA4&lt;br /&gt;
** [http://ark.intel.com/products/83965/Intel-Ethernet-Converged-Network-Adapter-X710-DA4 Intel® Ethernet Converged Network Adapter X710-DA4 ]&lt;br /&gt;
* Mellanox MCX4121A-ACAT&lt;br /&gt;
** [https://store.mellanox.com/products/mellanox-mcx4121a-acat-connectx-4-lx-en-network-interface-card-25gbe-dual-port-sfp28-pcie3-0-x8-rohs-r6.html Mellanox MCX4121A-ACAT ]&lt;br /&gt;
&lt;br /&gt;
==GPS Disciplined, Oven-Controlled Oscillator (GPSDO)==&lt;br /&gt;
The USRP-2794 has a high-accuracy GPS-disciplined oscillator (GPSDO).  The GPSDO improves the accuracy of the internal frequency reference to 20 ppb, or 0.1 ppb if the GPS is synchronized to the GPS constellation.  When synchronized to the GPS constellation, all USRP™ devices will also be synchronized in time within 50 ns.&lt;br /&gt;
&lt;br /&gt;
* Support GPSDO NMEA Strings&lt;br /&gt;
* [http://www.jackson-labs.com/assets/uploads/main/LC_XO_specsheet.pdf JacksonLabs LC_XO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
!Internal TCXO&lt;br /&gt;
!GPS-Disciplined Clock&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Reference&lt;br /&gt;
|TCXO&lt;br /&gt;
|OCXO&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Accuracy&lt;br /&gt;
|± 2.5ppm&lt;br /&gt;
± 2,500 Hz @ 1 GHz&lt;br /&gt;
|± 20 ppb&lt;br /&gt;
± 20 Hz @ 1 GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Accuracy&lt;br /&gt;
|&lt;br /&gt;
|± 0.01ppb&lt;br /&gt;
|-&lt;br /&gt;
|(GPS-Disciplined)&lt;br /&gt;
|&lt;br /&gt;
|~ ± 0.01 Hz @ 1 GHz&lt;br /&gt;
|-&lt;br /&gt;
|GPS Time Sync Accuracy&lt;br /&gt;
|&lt;br /&gt;
|±50ns to UTC Time**&lt;br /&gt;
|-&lt;br /&gt;
|10 MHz Reference Phase Drift with GPS Sync&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;±20ns After 1 Hour**&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Sensors===&lt;br /&gt;
You can query the lock status with the &amp;lt;code&amp;gt;gps_locked&amp;lt;/code&amp;gt; sensor, as well as obtain raw NMEA sentences using the &amp;lt;code&amp;gt;gps_gprmc&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;gps_gpgga&amp;lt;/code&amp;gt; sensors. Location information can be parsed out of the &amp;lt;code&amp;gt;gps_gpgga&amp;lt;/code&amp;gt; sensor by using &amp;lt;code&amp;gt;gpsd&amp;lt;/code&amp;gt; or another NMEA parser.&lt;br /&gt;
&lt;br /&gt;
==Option: Using the GPIO Expansion Kit==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top; width:60%&amp;quot;|This General Purpose Input/output (GPIO) breakout kit provides access to general purpose digital I/O signals with simple terminal blocks, and a prototyping area where wires and components can be soldered.  Each GPIO pin is connected to an FPGA digital line allowing it to be configured as an input, or an output, using the various software frameworks that support the USRP™ GPIO. &lt;br /&gt;
&lt;br /&gt;
These GPIO signals can serve the following functions:&lt;br /&gt;
&lt;br /&gt;
* Control of external devices, such as power amplifiers and RF switches&lt;br /&gt;
* Provide output signals that can help with debugging&lt;br /&gt;
* Provide observables to be analyzed by oscilloscopes or other external equipment&lt;br /&gt;
* Accept input from external devices for local, software-based triggering&lt;br /&gt;
* Implement a protocol line such as SPI or I2C&lt;br /&gt;
||[[File:Product_x3x0_gpio.jpg|250px]]&lt;br /&gt;
|}&lt;br /&gt;
===GPIO Expansion Kit Contents===&lt;br /&gt;
&lt;br /&gt;
*1 GPIO Breakout Board&lt;br /&gt;
*1 DB-15, 1-meter cable&lt;br /&gt;
*GPIO Quick Reference&lt;br /&gt;
&lt;br /&gt;
===Circuit Protection===&lt;br /&gt;
The GPIO signals exposed with this breakout kit are routed directly to the USRP device's FPGA with limited protection circuitry.  However, the user must take precautionary measures to ensure input/output signals meet the specifications shown in this document.  Over voltage, excess current draw, and other conditions can damage the USRP device and void the warranty. Special care should be taken when the USRP is powered off.&lt;br /&gt;
&lt;br /&gt;
===Mounting the GPIO Breakout Board===&lt;br /&gt;
The GPIO breakout board can be mounted directly to the DB15 connector of a USRP ™ device, or mounted remotely with the cable provided in this kit.  The screws on the DB15 connector of the breakout board must be removed to mount the board directly.  For remote mounting, the breakout board is supplied with rubber standoffs to avoid scratching surfaces, and several through-holes for hard mounting with screws or other hardware (not provided).&lt;br /&gt;
&lt;br /&gt;
===Using GPIO with UHD, GNU Radio, and other Third-Party Frameworks===&lt;br /&gt;
When used with UHD, or other third party frameworks that leverage UHD, the GPIO expansion can be controlled with simple API calls.  For more information, on the C++ API, and examples of how to use the GPIO in frameworks such as GNU Radio, please see the [[Application Notes]] section of the [https://kb.ettus.com Ettus Research Knowledge Base].&lt;br /&gt;
&lt;br /&gt;
===GPIO Specifications (3.3V Bank, LVCMOS)===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Parameter&lt;br /&gt;
!Typical&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Configured as Input&lt;br /&gt;
|-&lt;br /&gt;
|Default Voltage Standard&lt;br /&gt;
|3.3V LVCMOS&lt;br /&gt;
|-&lt;br /&gt;
|Voltage High Threshold&lt;br /&gt;
|2.0V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Low Threshold&lt;br /&gt;
|0.8V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Input Limits (no damage) &lt;br /&gt;
| -0.3V/3.45V&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Configured as Output&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Standard&lt;br /&gt;
|3.3V LVCMOS&lt;br /&gt;
|-&lt;br /&gt;
|Voltage High Output&lt;br /&gt;
|2.8V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Low Output&lt;br /&gt;
|0.4V&lt;br /&gt;
|-&lt;br /&gt;
|Current Source Capability&lt;br /&gt;
|12 mA&lt;br /&gt;
|-&lt;br /&gt;
|Output Source Impedance&lt;br /&gt;
|&amp;gt;33 ohms typical&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Option: Antenna Kit for GPSDO==&lt;br /&gt;
The GPSDO Mini Kit will improve the accuracy of the USRP reference clock, even if it does not receive signals from the GPS Constellation.  However, to achieve the best accuracy possible, and to achieve global timing alignment across multiple USRPs, Ettus Research recommends the GPSDO Mini Antenna Kit.&lt;br /&gt;
&lt;br /&gt;
==Option: Cables for MIMO Expansion==&lt;br /&gt;
Multiple USRP-2974s can be synchronized for coherent operation by sharing a common 10 MHz and 1 PPS signal.  We recommend using a star-distribution topology with an OctoClock or OctoClock-G, as seen in Figure 4.  This requires matched length cables to be used for both 10 MHz and 1 PPS.&lt;br /&gt;
&lt;br /&gt;
For more information about MIMO operation, please see the MIMO and Synchronization Application Note.&lt;br /&gt;
[[File:8mimo.png|700px|center]]&lt;br /&gt;
&amp;lt;center&amp;gt;Figure 4 - Star-Distribution of 10 MHz/PPS Signals with OctoClock&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
&lt;br /&gt;
* '''What is the bandwidth of the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
The ADC rate on each analog RX channel is 200 MS/s quadrature, which provides a theoretical analog bandwidth of approximately 80% of the Nyquist bandwidth of +/- 100 MHz (+/- 80 MHz around the center frequency).  The resulting maximum theoretical analog bandwidth is 160 MHz.&lt;br /&gt;
&lt;br /&gt;
FPGA Processing Bandwidth: Up to 200 MS/s quadrature.&lt;br /&gt;
&lt;br /&gt;
Host Bandwidth:  Up to 200 MS/s quadrature, dependent on selected interface&lt;br /&gt;
&lt;br /&gt;
For more information about achieving the maximum bandwidth with a USRP-2974, please see the &amp;quot;USRP X300/X310 Configuration Guide&amp;quot; or the &amp;quot;USRP System Bandwidth&amp;quot; application note.&lt;br /&gt;
&lt;br /&gt;
* '''How can I program the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
Like all other USRP models, the USRP-2974 is compatible with the USRP Hardware Driver™ (UHD) architecture.  The UHD architecture is a common driver that allows users to develop and execute applications on the onboard or host computer.  UHD provides a direct C++ API to control and stream to/from the USRP-2974.  It also provides compatibility with a variety of third-party software frameworks including GNU Radio, LabVIEW, and MATLAB.  You may also customize the FPGA image provided with UHD to integrate your own signal processing. For more information about UHD, and supported software frameworks, please see:&lt;br /&gt;
&lt;br /&gt;
http://files.ettus.com/manual/&lt;br /&gt;
&lt;br /&gt;
* '''How do I update the FPGA images and firmware with the latest from UHD'''&lt;br /&gt;
&lt;br /&gt;
You can find more information about updating the FPGA image through PCIe, 1/10 GigE, and JTAG [https://kb.ettus.com/X300/X310_Device_Recovery here].&lt;br /&gt;
&lt;br /&gt;
* '''How can I modify the FPGA of the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
The source code (Verilog) for the USRP-2794 is available in the UHD repository. The build process leverages the existing CMAKE build system used to compile the host-side driver.  A Linux-based setup will provide the best results.&lt;br /&gt;
&lt;br /&gt;
Which FPGA toolchain required to build the FPGA images will depend upon your version of UHD. For more details please see the [https://kb.ettus.com/UHD UHD] Software Resource page.&lt;br /&gt;
&lt;br /&gt;
* '''How much free space is available in the USRP-2974 FPGA'''&lt;br /&gt;
&lt;br /&gt;
Please see the [[#Utilization statistics]] section of this resources page for more information.&lt;br /&gt;
&lt;br /&gt;
* '''What frequency range does the USRP-2974 cover'''&lt;br /&gt;
&lt;br /&gt;
10MHz to 6GHz.&lt;br /&gt;
&lt;br /&gt;
* '''What components do I need to purchase for a complete USRP-2974 system'''&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 is a complete stand alone SDR. Additional components might include RF filters, antennas, RF power amplifiers or other RF components needed of a specific application.&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP-2974&amp;diff=4158</id>
		<title>USRP-2974</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=USRP-2974&amp;diff=4158"/>
				<updated>2019-06-01T15:14:18Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* Controller - Onboard computer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The NI USRP-2974 is a high-performance, USRP software defined radio (SDR) stand-alone device for designing and deploying next generation wireless communications systems. The hardware architecture combines two extended-bandwidth daughterboard slots covering 10 MHz – 6 GHz with up to 160 MHz of baseband bandwidth, multiple high-speed interface options (PCIe, dual 10 GigE), an onboard Intel Core i7 processor, and a large user-programmable Kintex-7 FPGA in a convenient desktop or rack-mountable half-wide 2U form factor.&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 is the equivalent to a USRP X310 with two UBX-160 boards, a GPSDO and an onboard Intel i7 computer. The USRP-2974 comes with NI Linux RTOS pre-installed, but in order to use it with open-source tool-chain, a user will need to install Linux (preferably Fedora or Ubuntu) and then the USRP Hardware driver (UHD). After these have been installed, any other open-source tools can be installed, such as GNU Radio.&lt;br /&gt;
&lt;br /&gt;
== Key Features of the USRP-2974==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Intel Core i7 6822EQ 2GHz Quad CoreProcessor&lt;br /&gt;
* 16GB DDR4 Memory&lt;br /&gt;
* 512GB SSD&lt;br /&gt;
* USB-to-UART to the CPU&lt;br /&gt;
* Xilinx Kintex-7 XC7K410T FPGA&lt;br /&gt;
* 14 bit 200 MS/s ADC&lt;br /&gt;
* 16 bit 800 MS/s DAC&lt;br /&gt;
* Frequency range: 10 MHz - 6 GHz&lt;br /&gt;
* Up 160MHz&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; bandwidth per channel&lt;br /&gt;
* 2 Transmit ports&lt;br /&gt;
* 2 Receive ports&lt;br /&gt;
* GPSDO&lt;br /&gt;
* Multiple high-speed interfaces (Dual 10G, PCIe Express, 1G)&lt;br /&gt;
|[[File:USRP_2974_frt_dia.jpg|350px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Controller - Onboard computer ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|System on module (SoM) &lt;br /&gt;
|Congatec COM Express conga-TS170&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|CPU&lt;br /&gt;
|Intel Core i7 6822EQ (2 GHz Quad Core)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Memory &lt;br /&gt;
|SO-DIMM DDR4 16 GB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SFP+&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &lt;br /&gt;
|10G ETH connection to the SoM&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Cabled PCIe&lt;br /&gt;
|PCIe Gen 2 x4&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|MicroUSB&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|USB-to-UART to the SoM&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|RJ45&lt;br /&gt;
|1G ETH host connection&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; Can be bypassed to the FPGA.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; Device port for external host.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RF Specifications==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Transmitter&lt;br /&gt;
|-&lt;br /&gt;
|Number of channels&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Frequency range&lt;br /&gt;
|10MHz to 6GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency step&lt;br /&gt;
|&amp;lt;1kHz&lt;br /&gt;
|-&lt;br /&gt;
|Maximum output power&lt;br /&gt;
|5mW to 100mW (7dBm to 20dBm)&lt;br /&gt;
|-&lt;br /&gt;
|Gain range&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
|0dB to 31.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Gain step&lt;br /&gt;
|0.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum instantaneous real-time bandwidth&lt;br /&gt;
|160MHz&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Receiver&lt;br /&gt;
|-&lt;br /&gt;
|Number of channels&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Frequency range&lt;br /&gt;
|10MHz to 6GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency step&lt;br /&gt;
|&amp;lt;1kHz&lt;br /&gt;
|-&lt;br /&gt;
|Gain range&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|0dB to 37.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Gain step&lt;br /&gt;
|0.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum input power&lt;br /&gt;
|10dBm&lt;br /&gt;
|-&lt;br /&gt;
|Noise Figure&lt;br /&gt;
|5dB to 7dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum instantaneous real-time bandwidth&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&lt;br /&gt;
|160MHz&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; The output power resulting from the gain setting varies over the frequency band and among&lt;br /&gt;
devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;The received signal amplitude resulting from the gain setting varies over the frequency band and&lt;br /&gt;
among devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;The USRP-2974 receiver path has 84 MHz of bandwidth for center frequencies from 10 MHz to&lt;br /&gt;
500 MHz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' As mentioned earlier, the USRP-2974 incorporates 2 UBX-160 daughterboards. Therefore, for more information on RF performance, please see the [https://kb.ettus.com/UBX UBX hardware resource] page&lt;br /&gt;
&lt;br /&gt;
==Hardware Specifications==&lt;br /&gt;
===USRP Hardware Driver (UHD) version===&lt;br /&gt;
* Minimum version of UHD required: '''3.15.0'''&lt;br /&gt;
&lt;br /&gt;
===Clocking and Sampling Rates===&lt;br /&gt;
There are two master clock rates (MCR) supported on the USRP-2974 like on the X310: 200.0 MHz and 184.32 MHz.&lt;br /&gt;
&lt;br /&gt;
The sampling rate must be an integer decimation rate of the MCR. Ideally, this decimation factor should be an even number. An odd decimation factor will result in additional unwanted attenuation (roll-off from the CIC filter in the DUC and DDC blocks in the FPGA). The valid decimation rates are between 1 and 1024.&lt;br /&gt;
&lt;br /&gt;
For the MCR of 200.0 MHz, the achievable sampling rates using an even decimation factor are 200.0, 100.0, 50.0, 33.33, 25.0, 20.0, 16.67, 14.286 Msps, ... 195.31 Ksps.&lt;br /&gt;
&lt;br /&gt;
For the MCR of 184.32 MHz, the achievable sampling rates using an even decimation factor are 184.32, 92.16, 46.08, 30.72, 23.04, 18.432, 15.36, 13.166 Msps, ... 180.0 Ksps.&lt;br /&gt;
&lt;br /&gt;
If the desired sampling rate is not directly supported by the hardware, then it will be necessary to re-sample in software. This can be done in C++ using libraries such as Liquid DSP [https://github.com/jgaeddert/liquid-dsp], or can be done in GNU Radio, in which there are three blocks that perform sampling rate conversion.&lt;br /&gt;
&lt;br /&gt;
==Physical Specifications==&lt;br /&gt;
&lt;br /&gt;
===Dimensions===&lt;br /&gt;
(L × W × H) 29.08 cm × 21.84 cm × 7.98 cm (11.45 in. × 8.60 in. × 3.14 in. )&lt;br /&gt;
&lt;br /&gt;
===Weight===&lt;br /&gt;
3.34 kg (7.35 lb)&lt;br /&gt;
&lt;br /&gt;
==Power==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|Voltage range&lt;br /&gt;
|14.25 V to 15.75 V DC&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Current&lt;br /&gt;
|10 A, maximum&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Power&lt;br /&gt;
|150 W, maximum&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' Indoor use only&lt;br /&gt;
&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* 0 °C to 50 °C&lt;br /&gt;
&lt;br /&gt;
===Maximum altitude===&lt;br /&gt;
* 2,000 m (800 mbar) (at 25 °C ambient temperature)&lt;br /&gt;
&lt;br /&gt;
===Operating Humidity Range===&lt;br /&gt;
* 10% to 90% non-condensing&lt;br /&gt;
&lt;br /&gt;
===Pollution Degree===&lt;br /&gt;
* 2&lt;br /&gt;
&lt;br /&gt;
==System Diagram and Schematics==&lt;br /&gt;
&lt;br /&gt;
===System Block Diagram===&lt;br /&gt;
[[file:2974_blk_dia.png |800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.ni.com/documentation/en/usrp-software-defined-radio-stand-alone-device/latest/usrp-2974/block-diagram/ System Block Diagram]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schematics===&lt;br /&gt;
Because the USRP-2974 is a combination of an Intel i7 SOM and an X310 USRP, a user can reference the X310 Schematics.&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/schematics/x300/x3xx.pdf X310 Schematics]&lt;br /&gt;
&lt;br /&gt;
==Key Component Datasheets==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%&amp;quot;&lt;br /&gt;
!Part Number&lt;br /&gt;
!Description&lt;br /&gt;
!Schematic ID (Page)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.congatec.com/fileadmin/user_upload/Documents/Datasheets/conga-TS170.pdf conga-TS170]&lt;br /&gt;
|System on Module (SoM)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.xilinx.com/support/documentation/data_sheets/ds180_7Series_Overview.pdf XC7K410T]&lt;br /&gt;
|FPGA&lt;br /&gt;
|U23 (3,5,8,9,10,18)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/AD9146.PDF AD9146]&lt;br /&gt;
|Dual Channel, 16-Bit, 1230 MSPS DAC&lt;br /&gt;
|U12, U36 (7)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/slas635b/slas635b.pdf ADS62P48]&lt;br /&gt;
|Dual Channel, 14-Bit 210 MSPS ADC&lt;br /&gt;
|U11, U35 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.onsemi.com/pub/Collateral/FIN1002-D.pdf FIN1002]&lt;br /&gt;
|High Speed Differential Receiver&lt;br /&gt;
|U3, U5, U31, U32 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/20001203U.pdf 24LC256T]&lt;br /&gt;
|EEPROM&lt;br /&gt;
|U530 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/lmk04816.pdf LMK04816BISQ/NOPB_1/3]&lt;br /&gt;
|Jitter Cleaner With Dual Loop PLLs&lt;br /&gt;
|U531 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/sy89547l.pdf SY89547LMGTR]&lt;br /&gt;
|Multiplexer&lt;br /&gt;
|U506 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/sn74aup1t17.pdf SN74AUP1T17]&lt;br /&gt;
|Single Schmitt-Trigger Buffer Gate&lt;br /&gt;
|U6, U519 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps54620.pdf TPS54620RGYT]&lt;br /&gt;
|Synchronous Step Down SWIFT™ Converter&lt;br /&gt;
|U515 (21); U516 (26)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/1764fb.pdf LT1764EQ-3.3]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U27 (21); U516 (26)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps7a47.pdf TPS7A47]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U28, U532 (21)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/3603fc.pdf LTC3603EUF_TRPBF]&lt;br /&gt;
|Monolithic Synchronous Step-Down Regulator&lt;br /&gt;
|U517 (23); U500 (25); U514, U513 (27)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/product/TPS77625-EP?keyMatch=TPS77625&amp;amp;tisearch=Search-EN-Everything TPS77625]&lt;br /&gt;
|Low-Dropout Voltage Regulators&lt;br /&gt;
|U30 (23)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps79318-ep.pdf TPS79318_SM]&lt;br /&gt;
|Low-Dropout Voltage Regulators&lt;br /&gt;
|U510 (27)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Media:agile9598503.pdf|OSC-96MHZ-724821-01]]&lt;br /&gt;
|Voltage Controlled Crystal Oscillator&lt;br /&gt;
|U25 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==FPGA and Baseband==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|FPGA &lt;br /&gt;
|Kintex-7 XC7K410T&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|DRAM &lt;br /&gt;
|1 GB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Baseband analog-to-digital converter&lt;br /&gt;
(ADC) resolution&lt;br /&gt;
|14 bit&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Baseband digital-to-analog converter&lt;br /&gt;
(DAC) resolution&lt;br /&gt;
|16 bit&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|ADC spurious-free dynamic range (sFDR)&lt;br /&gt;
|88 dB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|DAC sFDR&lt;br /&gt;
|80 dB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Maximum I/Q sample rate&lt;br /&gt;
|200 MS/s&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SFP+&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &lt;br /&gt;
|High speed serial link to one of the FPGA&lt;br /&gt;
GTX transceivers&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;Can be bypassed to the SoM if using the 10 GbE as protocol.&lt;br /&gt;
&lt;br /&gt;
===FPGA User Modifications===&lt;br /&gt;
&lt;br /&gt;
The Verilog code for the FPGA in the NI USRP-2974 is open-source, and users are free to modify and customize it for their needs. However, certain modifications may result in either bricking the device, or even in physical damage to the unit. Specifically, changing the I/O interface of the FPGA in any way (do not remove any of the I/O for the PCIe interface, such as &amp;lt;code&amp;gt;x300_pcie_int&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;LvFpga_Chinch_Interface&amp;lt;/code&amp;gt;), or modifying the pin and timing constraint files, could result in physical damage to other components on the motherboard, external to the FPGA, and doing this will void the warranty. Also, even if the PCIe interface is not being used, you cannot remove or reassign these pins in the constraint file. The constraint files should not be modified. Please note that modifications to the FPGA are made at the risk of the user, and may not be covered by the warranty of the device.&lt;br /&gt;
&lt;br /&gt;
==Interfaces and Connectivity==&lt;br /&gt;
Follow the links below for additional information on configuring each interface for the USRP-2974.&lt;br /&gt;
&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_10gige Dual 10 Gigabit Ethernet] - 200 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_pcie PCIe Express (Desktop)] - 200 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_1gige 1 Gigabit Ethernet] - 25 MS/s Full Duplex @ 16-bit&lt;br /&gt;
&lt;br /&gt;
===Front Panel===&lt;br /&gt;
&lt;br /&gt;
[[File:USRP-2974 Front Panel.jpg|800px]]&lt;br /&gt;
[[File:2974_frt_wireframe.png|800px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Connector&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''Use'''&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RF 0&lt;br /&gt;
|TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|Input and output terminal for the RF signal. TX1 RX1 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input or output channel.&lt;br /&gt;
|-&lt;br /&gt;
|RX2&lt;br /&gt;
|Input terminal for the RF signal. RX2 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | AUX I/O&lt;br /&gt;
|General-purpose I/O (GPIO) port. AUX I/O is controlled by the FPGA.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RF 1&lt;br /&gt;
|TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|Input and output terminal for the RF signal. TX1 RX1 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input or output channel.&lt;br /&gt;
|-&lt;br /&gt;
|RX2&lt;br /&gt;
|Input terminal for the RF signal. RX2 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | DP&lt;br /&gt;
|DisplayPort connector to connect one monitor for your controller.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | USB2.0&lt;br /&gt;
|USB ports that support common USB peripheral devices such as flash drives, hard drives, keyboards, and mice.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | USB3.0&lt;br /&gt;
|USB ports that support common USB peripheral devices such as flash drives, hard drives, keyboards, and mice.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G ETH&lt;br /&gt;
|RJ45 port used for 1G ETH connectivity to other ethernet devices.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | μUSB&lt;br /&gt;
|USB port used for UART connectivity to the controller.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 0&lt;br /&gt;
|SFP+ port used for 10G ETH connectivity to other ethernet devices. Connects to the embedded Linux computer for communication with LabVIEW RT.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 1&lt;br /&gt;
|SFP+ port used for 1G/10G ETH connectivity to other ethernet devices. Connects to the FPGA. Not currently supported in LabVIEW Communications System Design Suite.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''LED'''&lt;br /&gt;
!'''Description'''&lt;br /&gt;
!'''Color'''&lt;br /&gt;
!'''State'''&lt;br /&gt;
!'''Indication'''&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;5&amp;quot; | RF 0&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates thetransmit status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not active.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is transmitting data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RX2&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the receive status of the device.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot;| REF&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates the status of the reference signal.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no reference signal, or the device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; |Green&lt;br /&gt;
|Blinking&lt;br /&gt;
|The device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| PPS&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the pulse per second (PPS).&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no PPS timing reference signal, or the device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Blinking&lt;br /&gt;
|The device is locked to the PPS timing reference signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| GPS&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates whether the GPSDO is locked.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no GPSDO or the GPSDO is not locked.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The GPSDO is locked.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;5&amp;quot; | RF 1&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates thetransmit status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not active.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is transmitting data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RX2&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the receive status of the device.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| Status&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device initialized successfully and is ready for use.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Blinking&lt;br /&gt;
|Hardware error. An internal power supply has failed. Check front-panel I/O connections for shorts. Remove any shorts and cycle power to the USRP-2974. Contact NI if the problem persists.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| PWR&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the power status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is powered off.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The devices is powered on.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot; | 10/100/1000&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot;| Indicates the speed of the Gigabit Ethernet link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|No link, or 10 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|100 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
|Amber&lt;br /&gt;
|Solid&lt;br /&gt;
|1,000 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot;| ACT/LINK	&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Indicates the Gigabit Ethernet link activity or status.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|No link has been established.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Green&lt;br /&gt;
|Solid&lt;br /&gt;
|A link has been negotiated.&lt;br /&gt;
|-&lt;br /&gt;
|Blinking&lt;br /&gt;
|Activity on the link.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; | 1G/10G ETH 0&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | ACT/LINK&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Indicates the status of the SFP+ port.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The link is down.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The link is up.&lt;br /&gt;
|-&lt;br /&gt;
|Blinking&lt;br /&gt;
|The link is active (transmitting and receiving).&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |10GbE&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Indicates the status of the 10G ETH link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The 10G ETH link is down.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The 10G ETH link is up.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 1 10GbE&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Indicates the status of the 10G ETH link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The 10G ETH link is down.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The 10G ETH link is up.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Rear Panel===&lt;br /&gt;
[[File:USRP-2974 Rear Panel.jpg|800px]]&lt;br /&gt;
[[File:2974_back_wireframe.png|800px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Connector&lt;br /&gt;
!Use&lt;br /&gt;
|-&lt;br /&gt;
|REF OUT&lt;br /&gt;
|Output terminal for an external reference signal for the LO on the device. REF OUT is an SMA (f) connector with an impedance of 50 Ω, and it is a single-ended reference output. The output signal at this connector is 10 MHz at 3.3 V.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|REF IN&lt;br /&gt;
|Input terminal for an external reference signal for the LO on the device. REF IN is an SMA (f) connector with an impedance of 50 Ω, and it is a single-ended reference input. REF IN accepts a 10 MHz signal with a minimum input power of 0 dBm (0.632 Vpk-pk) and a maximum input power of 15 dBm (3.56 Vpk-pk) for a square wave or sine wave.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PPS TRIG OUT	&lt;br /&gt;
|Output terminal for the PPS timing reference. PPS TRIG OUT is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input. The output signal is 0 V to 3.3 V TTL. You can also use this port as a triggered output (TRIG OUT) that you program with the PPS Trig Out I/O signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PPS TRIG IN	&lt;br /&gt;
|Input terminal for PPS timing reference. PPS TRIG IN is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel. PPS TRIG IN accepts 0 V to 3.3 V TTL and 0 V to 5 V TTL signals. You can also use this port as a triggered input (TRIG IN) that you control using NI-USRP software.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|GPS ANT	&lt;br /&gt;
|Input terminal for the GPS antenna signal. GPS ANT is an SMA (f) connector with a maximum input power of -15 dBm and an output of DC 5 V to power an active antenna. &amp;lt;p&amp;gt; '''Notice:''' Do not terminate the GPS ANT port if you do not use it.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PCIe x4	&lt;br /&gt;
|Port for a PCI Express Generation 2, x4 bus connection through an MXI Express four-lane cable. Can be used to connect an external USRP device or external chassis.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SYSTEM POWER IN	&lt;br /&gt;
|Input that accepts a 15 V ± 5%, 10 A external DC power connector.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Ref Clock - 10 MHz===&lt;br /&gt;
Using an external 10 MHz reference clock, a square wave will offer the best phase noise performance, but a sinusoid is acceptable. The power level of the reference clock cannot exceed +15 dBm.&lt;br /&gt;
&lt;br /&gt;
===PPS - Pulse Per Second===&lt;br /&gt;
Using a PPS signal for timestamp synchronization requires a square wave signal with the following a 5Vpp amplitude.&lt;br /&gt;
&lt;br /&gt;
To test the PPS input, you can use the following tool from the UHD examples:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;args&amp;gt;&amp;lt;/code&amp;gt; are device address arguments (optional if only one USRP device is on your machine)&lt;br /&gt;
&lt;br /&gt;
    cd &amp;lt;install-path&amp;gt;/lib/uhd/examples ./test_pps_input –args=&amp;lt;args&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Front Panel GPIO===&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;width:50%&amp;quot; |&lt;br /&gt;
The GPIO port is not meant to drive big loads. You should not try to source more than 5mA per pin.&lt;br /&gt;
&lt;br /&gt;
The +3.3V is for ESD clamping purposes only and not designed to deliver high currents.&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | [[File:x3x0 gpio conn.png]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Power on state====&lt;br /&gt;
The hardware power on state and UHD initial state for the front-panel GPIOs is high-Z. For the X3xx, there are no external pull-ups/pull-downs for the GPIO pins, but the FPGAs do have them and they are configured as follows: X3xx: pull-down.&lt;br /&gt;
&lt;br /&gt;
====Pin Mapping====&lt;br /&gt;
* Pin 1: +3.3V&lt;br /&gt;
* Pin 2: Data[0]&lt;br /&gt;
* Pin 3: Data[1]&lt;br /&gt;
* Pin 4: Data[2]&lt;br /&gt;
* Pin 5: Data[3]&lt;br /&gt;
* Pin 6: Data[4]&lt;br /&gt;
* Pin 7: Data[5]&lt;br /&gt;
* Pin 8: Data[6]&lt;br /&gt;
* Pin 9: Data[7]&lt;br /&gt;
* Pin 10: Data[8]&lt;br /&gt;
* Pin 11: Data[9]&lt;br /&gt;
* Pin 12: Data[10]&lt;br /&gt;
* Pin 13: Data[11]&lt;br /&gt;
* Pin 14: 0V&lt;br /&gt;
* Pin 15: 0V&lt;br /&gt;
&lt;br /&gt;
'''Note''': Please see the [http://files.ettus.com/manual/page_gpio_api.html E3x0/X3x0 GPIO API] for information on configuring and using the GPIO bus.&lt;br /&gt;
&lt;br /&gt;
==Certifications==&lt;br /&gt;
===RoHS===&lt;br /&gt;
As of December 1st, 2010 all NI/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;
[http://files.ettus.com/manual/md_fpga.html FPGA Resources]&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/binaries/uhd_stable/ UHD Stable Binaries]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/EttusResearch/uhd UHD Source Code on Github]&lt;br /&gt;
&lt;br /&gt;
==Choosing an Interface==&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 provides three interface options – 1 Gigabit Ethernet (1 GigE), 10 Gigabit Ethernet (10 GigE), and PCI-Express (PCIe). The PCIe interface is always available regardless of what FPGA image is loaded. Ettus ships two FPGA image variants, the HG or HGS image which has one 1 GigE interfaces and one 10 GigE interfaces, and the XG image which has two 10 GigE interfaces. Generally, Ettus Research recommends using 10 GigE to achieve the maximum throughput available from the USRP-2974.  PCIe is recommended for applications that require the lowest possible latency, which is a desirable characteristic for PHY/MAC research.  If your application does not require the full bandwidth of the USRP-2974, the 1 GigE interface serves as a cost-effective fall-back option.  Ettus Research provides a complete interface kit for each of these options, which is also shown in the following table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|Interface Performance Summary&lt;br /&gt;
|-&lt;br /&gt;
!Interface&lt;br /&gt;
!Throughput (MS/s @ 16-bit)&lt;br /&gt;
!Target&lt;br /&gt;
!Recommended Kit&lt;br /&gt;
|-&lt;br /&gt;
|1 Gigabit&lt;br /&gt;
|25 MS/s&lt;br /&gt;
|Desktop/Laptop&lt;br /&gt;
|[https://www.ettus.com/product/details/1GIGE-KIT SFP Adapter + GigE Cable]&lt;br /&gt;
|-&lt;br /&gt;
|10 Gigabit&lt;br /&gt;
|200 MS/s&lt;br /&gt;
|Desktop&lt;br /&gt;
|[https://www.ettus.com/product/details/10GIGE-KIT 10 GigE Interface Kit]&lt;br /&gt;
|-&lt;br /&gt;
|PCI-Express &lt;br /&gt;
(PCIe, 4 lane)&lt;br /&gt;
|200 MS/S&lt;br /&gt;
|Desktop&lt;br /&gt;
|[https://www.ettus.com/product/details/PCIE-KIT PCI-Express Desktop Kit]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===10 Gigabit Ethernet===&lt;br /&gt;
In order to utilize the dual 10 Gigabit Ethernet interfaces, ensure the XG image is installed ([http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_load_fpga_imgs_fpga_flavours see FPGA Image Flavors]). In addition to burning the prerequisite FPGA image, it may also be necessary to tune the network interface card (NIC) to eliminate drops (Ds) and reduce overflows (Os). This is done by increasing the number of RX descriptors ([http://files.ettus.com/manual/page_transport.html#transport_udp_linux see Linux specific notes]).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;benchmark_rate&amp;lt;/code&amp;gt; tool can be used to test this capability. Run the following commands to test the X-series USRP over both 10 Gigabit Ethernet interfaces with the maximum rate of 200 Msps per channel:&lt;br /&gt;
&lt;br /&gt;
    cd &amp;lt;install-path&amp;gt;/lib/uhd/examples&lt;br /&gt;
    ./benchmark_rate --args=&amp;quot;type=x300,addr=&amp;lt;Primary IP&amp;gt;,second_addr=&amp;lt;secondary IP&amp;gt;&amp;quot; --channels=&amp;quot;0,1&amp;quot; --rx_rate 200e6&lt;br /&gt;
&lt;br /&gt;
The second interface is specified by the extra argument '''second_addr'''.&lt;br /&gt;
&lt;br /&gt;
'''Recommended 10 Gigabit Ethernet Cards'''&lt;br /&gt;
* Intel X520-DA2&lt;br /&gt;
** [http://ark.intel.com/products/39776/Intel-Ethernet-Converged-Network-Adapter-X520-DA2 Intel® Ethernet Converged Network Adapter X520-DA2]&lt;br /&gt;
* Intel X520-DA1&lt;br /&gt;
** [http://ark.intel.com/products/68669/Intel-Ethernet-Converged-Network-Adapter-X520-DA1 Intel® Ethernet Converged Network Adapter X520-DA1 ]&lt;br /&gt;
* Intel X710-DA2&lt;br /&gt;
** [http://ark.intel.com/products/83964/Intel-Ethernet-Converged-Network-Adapter-X710-DA2 Intel® Ethernet Converged Network Adapter X710-DA2 ]&lt;br /&gt;
* Intel X710-DA4&lt;br /&gt;
** [http://ark.intel.com/products/83965/Intel-Ethernet-Converged-Network-Adapter-X710-DA4 Intel® Ethernet Converged Network Adapter X710-DA4 ]&lt;br /&gt;
* Mellanox MCX4121A-ACAT&lt;br /&gt;
** [https://store.mellanox.com/products/mellanox-mcx4121a-acat-connectx-4-lx-en-network-interface-card-25gbe-dual-port-sfp28-pcie3-0-x8-rohs-r6.html Mellanox MCX4121A-ACAT ]&lt;br /&gt;
&lt;br /&gt;
==GPS Disciplined, Oven-Controlled Oscillator (GPSDO)==&lt;br /&gt;
The USRP-2794 has a high-accuracy GPS-disciplined oscillator (GPSDO).  The GPSDO improves the accuracy of the internal frequency reference to 20 ppb, or 0.1 ppb if the GPS is synchronized to the GPS constellation.  When synchronized to the GPS constellation, all USRP™ devices will also be synchronized in time within 50 ns.&lt;br /&gt;
&lt;br /&gt;
* Support GPSDO NMEA Strings&lt;br /&gt;
* [http://www.jackson-labs.com/assets/uploads/main/LC_XO_specsheet.pdf JacksonLabs LC_XO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
!Internal TCXO&lt;br /&gt;
!GPS-Disciplined Clock&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Reference&lt;br /&gt;
|TCXO&lt;br /&gt;
|OCXO&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Accuracy&lt;br /&gt;
|± 2.5ppm&lt;br /&gt;
± 2,500 Hz @ 1 GHz&lt;br /&gt;
|± 20 ppb&lt;br /&gt;
± 20 Hz @ 1 GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Accuracy&lt;br /&gt;
|&lt;br /&gt;
|± 0.01ppb&lt;br /&gt;
|-&lt;br /&gt;
|(GPS-Disciplined)&lt;br /&gt;
|&lt;br /&gt;
|~ ± 0.01 Hz @ 1 GHz&lt;br /&gt;
|-&lt;br /&gt;
|GPS Time Sync Accuracy&lt;br /&gt;
|&lt;br /&gt;
|±50ns to UTC Time**&lt;br /&gt;
|-&lt;br /&gt;
|10 MHz Reference Phase Drift with GPS Sync&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;±20ns After 1 Hour**&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Sensors===&lt;br /&gt;
You can query the lock status with the &amp;lt;code&amp;gt;gps_locked&amp;lt;/code&amp;gt; sensor, as well as obtain raw NMEA sentences using the &amp;lt;code&amp;gt;gps_gprmc&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;gps_gpgga&amp;lt;/code&amp;gt; sensors. Location information can be parsed out of the &amp;lt;code&amp;gt;gps_gpgga&amp;lt;/code&amp;gt; sensor by using &amp;lt;code&amp;gt;gpsd&amp;lt;/code&amp;gt; or another NMEA parser.&lt;br /&gt;
&lt;br /&gt;
==Option: Using the GPIO Expansion Kit==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top; width:60%&amp;quot;|This General Purpose Input/output (GPIO) breakout kit provides access to general purpose digital I/O signals with simple terminal blocks, and a prototyping area where wires and components can be soldered.  Each GPIO pin is connected to an FPGA digital line allowing it to be configured as an input, or an output, using the various software frameworks that support the USRP™ GPIO. &lt;br /&gt;
&lt;br /&gt;
These GPIO signals can serve the following functions:&lt;br /&gt;
&lt;br /&gt;
* Control of external devices, such as power amplifiers and RF switches&lt;br /&gt;
* Provide output signals that can help with debugging&lt;br /&gt;
* Provide observables to be analyzed by oscilloscopes or other external equipment&lt;br /&gt;
* Accept input from external devices for local, software-based triggering&lt;br /&gt;
* Implement a protocol line such as SPI or I2C&lt;br /&gt;
||[[File:Product_x3x0_gpio.jpg|250px]]&lt;br /&gt;
|}&lt;br /&gt;
===GPIO Expansion Kit Contents===&lt;br /&gt;
&lt;br /&gt;
*1 GPIO Breakout Board&lt;br /&gt;
*1 DB-15, 1-meter cable&lt;br /&gt;
*GPIO Quick Reference&lt;br /&gt;
&lt;br /&gt;
===Circuit Protection===&lt;br /&gt;
The GPIO signals exposed with this breakout kit are routed directly to the USRP device's FPGA with limited protection circuitry.  However, the user must take precautionary measures to ensure input/output signals meet the specifications shown in this document.  Over voltage, excess current draw, and other conditions can damage the USRP device and void the warranty. Special care should be taken when the USRP is powered off.&lt;br /&gt;
&lt;br /&gt;
===Mounting the GPIO Breakout Board===&lt;br /&gt;
The GPIO breakout board can be mounted directly to the DB15 connector of a USRP ™ device, or mounted remotely with the cable provided in this kit.  The screws on the DB15 connector of the breakout board must be removed to mount the board directly.  For remote mounting, the breakout board is supplied with rubber standoffs to avoid scratching surfaces, and several through-holes for hard mounting with screws or other hardware (not provided).&lt;br /&gt;
&lt;br /&gt;
===Using GPIO with UHD, GNU Radio, and other Third-Party Frameworks===&lt;br /&gt;
When used with UHD, or other third party frameworks that leverage UHD, the GPIO expansion can be controlled with simple API calls.  For more information, on the C++ API, and examples of how to use the GPIO in frameworks such as GNU Radio, please see the [[Application Notes]] section of the [https://kb.ettus.com Ettus Research Knowledge Base].&lt;br /&gt;
&lt;br /&gt;
===GPIO Specifications (3.3V Bank, LVCMOS)===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Parameter&lt;br /&gt;
!Typical&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Configured as Input&lt;br /&gt;
|-&lt;br /&gt;
|Default Voltage Standard&lt;br /&gt;
|3.3V LVCMOS&lt;br /&gt;
|-&lt;br /&gt;
|Voltage High Threshold&lt;br /&gt;
|2.0V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Low Threshold&lt;br /&gt;
|0.8V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Input Limits (no damage) &lt;br /&gt;
| -0.3V/3.45V&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Configured as Output&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Standard&lt;br /&gt;
|3.3V LVCMOS&lt;br /&gt;
|-&lt;br /&gt;
|Voltage High Output&lt;br /&gt;
|2.8V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Low Output&lt;br /&gt;
|0.4V&lt;br /&gt;
|-&lt;br /&gt;
|Current Source Capability&lt;br /&gt;
|12 mA&lt;br /&gt;
|-&lt;br /&gt;
|Output Source Impedance&lt;br /&gt;
|&amp;gt;33 ohms typical&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Option: Antenna Kit for GPSDO==&lt;br /&gt;
The GPSDO Mini Kit will improve the accuracy of the USRP reference clock, even if it does not receive signals from the GPS Constellation.  However, to achieve the best accuracy possible, and to achieve global timing alignment across multiple USRPs, Ettus Research recommends the GPSDO Mini Antenna Kit.&lt;br /&gt;
&lt;br /&gt;
==Option: Cables for MIMO Expansion==&lt;br /&gt;
Multiple USRP-2974s can be synchronized for coherent operation by sharing a common 10 MHz and 1 PPS signal.  We recommend using a star-distribution topology with an OctoClock or OctoClock-G, as seen in Figure 4.  This requires matched length cables to be used for both 10 MHz and 1 PPS.&lt;br /&gt;
&lt;br /&gt;
For more information about MIMO operation, please see the MIMO and Synchronization Application Note.&lt;br /&gt;
[[File:8mimo.png|700px|center]]&lt;br /&gt;
&amp;lt;center&amp;gt;Figure 4 - Star-Distribution of 10 MHz/PPS Signals with OctoClock&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
&lt;br /&gt;
* '''What is the bandwidth of the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
The ADC rate on each analog RX channel is 200 MS/s quadrature, which provides a theoretical analog bandwidth of approximately 80% of the Nyquist bandwidth of +/- 100 MHz (+/- 80 MHz around the center frequency).  The resulting maximum theoretical analog bandwidth is 160 MHz.&lt;br /&gt;
&lt;br /&gt;
FPGA Processing Bandwidth: Up to 200 MS/s quadrature.&lt;br /&gt;
&lt;br /&gt;
Host Bandwidth:  Up to 200 MS/s quadrature, dependent on selected interface&lt;br /&gt;
&lt;br /&gt;
For more information about achieving the maximum bandwidth with a USRP-2974, please see the &amp;quot;USRP X300/X310 Configuration Guide&amp;quot; or the &amp;quot;USRP System Bandwidth&amp;quot; application note.&lt;br /&gt;
&lt;br /&gt;
* '''How can I program the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
Like all other USRP models, the USRP-2974 is compatible with the USRP Hardware Driver™ (UHD) architecture.  The UHD architecture is a common driver that allows users to develop and execute applications on the onboard or host computer.  UHD provides a direct C++ API to control and stream to/from the USRP-2974.  It also provides compatibility with a variety of third-party software frameworks including GNU Radio, LabVIEW, and MATLAB.  You may also customize the FPGA image provided with UHD to integrate your own signal processing. For more information about UHD, and supported software frameworks, please see:&lt;br /&gt;
&lt;br /&gt;
http://files.ettus.com/manual/&lt;br /&gt;
&lt;br /&gt;
* '''How do I update the FPGA images and firmware with the latest from UHD'''&lt;br /&gt;
&lt;br /&gt;
You can find more information about updating the FPGA image through PCIe, 1/10 GigE, and JTAG [https://kb.ettus.com/X300/X310_Device_Recovery here].&lt;br /&gt;
&lt;br /&gt;
* '''How can I modify the FPGA of the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
The source code (Verilog) for the USRP-2794 is available in the UHD repository. The build process leverages the existing CMAKE build system used to compile the host-side driver.  A Linux-based setup will provide the best results.&lt;br /&gt;
&lt;br /&gt;
Which FPGA toolchain required to build the FPGA images will depend upon your version of UHD. For more details please see the [https://kb.ettus.com/UHD UHD] Software Resource page.&lt;br /&gt;
&lt;br /&gt;
* '''How much free space is available in the USRP-2974 FPGA'''&lt;br /&gt;
&lt;br /&gt;
Please see the [[#Utilization statistics]] section of this resources page for more information.&lt;br /&gt;
&lt;br /&gt;
* '''What frequency range does the USRP-2974 cover'''&lt;br /&gt;
&lt;br /&gt;
10MHz to 6GHz.&lt;br /&gt;
&lt;br /&gt;
* '''What components do I need to purchase for a complete USRP-2974 system'''&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 is a complete stand alone SDR. Additional components might include RF filters, antennas, RF power amplifiers or other RF components needed of a specific application.&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP-2974_Getting_Started_Guide&amp;diff=4157</id>
		<title>USRP-2974 Getting Started Guide</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=USRP-2974_Getting_Started_Guide&amp;diff=4157"/>
				<updated>2019-06-01T15:11:18Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* Additional Resources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Kit Contents==&lt;br /&gt;
* NI USRP-2974&lt;br /&gt;
* 30 dB SMA Attenuator&lt;br /&gt;
* SMA-male to SMA-male Cable&lt;br /&gt;
* Power Supply&lt;br /&gt;
* Getting Started Guide&lt;br /&gt;
{|&lt;br /&gt;
||[[File:USRP_2974_frt_dia.jpg|250px|center]]  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Verify the Contents of Your Kit==&lt;br /&gt;
Make sure that your kit contains all the items listed above. If any items are missing, please contact your sales agent.&lt;br /&gt;
&lt;br /&gt;
==Unpacking the Kit==&lt;br /&gt;
1. To prevent electrostatic discharge (ESD) from damaging the device, ground yourself using a grounding strap or by holding a grounded object, such as your computer chassis.&lt;br /&gt;
&lt;br /&gt;
2. Remove the device from the package and inspect the device for loose components or any&lt;br /&gt;
other sign of damage.&lt;br /&gt;
&lt;br /&gt;
3. Never touch the exposed pins of connectors.&lt;br /&gt;
&lt;br /&gt;
4. Unpack any other items and documentation from the kit.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' Do not install a device if it appears damaged in any way. Store the device in the antistatic package when the device is not in use.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Proper Care and Handling==&lt;br /&gt;
All NI products are individually tested before shipment. The USRP™ is guaranteed to be functional at the time it is received by the customer. Improper use or handling of the USRP™ can easily cause the device to become non-functional. Listed below are some examples of actions which can prevent damage to the unit:&lt;br /&gt;
&lt;br /&gt;
*Always properly terminate the transmit port with an antenna or 50Ω load.&lt;br /&gt;
*Always handle the USRP with proper anti-static methods.&lt;br /&gt;
*Never allow the USRP to directly or indirectly come into contact with any voltage spikes.&lt;br /&gt;
*Never allow any water, or condensing moisture, to come into contact with the USRP.&lt;br /&gt;
*Always use caution with FPGA, firmware, or software modifications.&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Never apply more than '''+10 dBm''' of power into RF ports RF0 and RF1.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Never apply more than '''+15 dBm''' of power into the REF IN input.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Never apply more than '''-15 dBm''' of power into the GPS ANT input.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Always use at least 30dB attenuation if operating in loopback configuration&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Install and Setup the Software Tools on the onboard computer (SoM-System on Module)==&lt;br /&gt;
In order to use your Universal Software Radio Peripheral (USRP™), you must have the software tools correctly installed and configured on the SoM. A step-by-step guide for doing this is available at the [https://kb.ettus.com/Building_and_Installing_the_USRP_Open-Source_Toolchain_(UHD_and_GNU_Radio)_on_Linux Building and Installing the USRP Open-Source Toolchain (UHD and GNU Radio) on the Linux] Application Note. '''Release 3.15.0''' or later of the USRP Hardware Driver, UHD, is needed.&lt;br /&gt;
&lt;br /&gt;
==Basic Connectivity==&lt;br /&gt;
This USRP-2974 host supports multiple, high-speed, low-latency interface options to the FPGA. To setup the device, follow these basic instructions:&lt;br /&gt;
* Configure the host ethernet adapter (enp1s0f0) to use an IP address of 192.168.40.1 and a subnet mask of 255.255.255.0 &lt;br /&gt;
* Configure the host ethernet adapter (enp1s0f1) to use an IP address of 192.168.30.1 and a subnet mask of 255.255.255.0 (loopback with SFP+ cable needed)&lt;br /&gt;
* To test communications, ping the USRP FPGA at address &amp;quot;192.168.40.2&amp;quot; or “192.168.30.2”&lt;br /&gt;
&lt;br /&gt;
For more details on network setup, including PCIe connectivity, please see the section [[USRP-2974#Interfaces_and_Connectivity|Interfaces and Connectivity]] of the NI USRP-2974 Hardware Resources page.&lt;br /&gt;
&lt;br /&gt;
==Test and Verify the Operation of the USRP==&lt;br /&gt;
Once the software tools are installed on the onboard computer, verify the correct operation of the USRP by running the utility programs on the onboard computer. More information is available at the [https://kb.ettus.com/Verifying_the_Operation_of_the_USRP_Using_UHD_and_GNU_Radio Verifying the Operation of the USRP Using UHD and GNU Radio] Application Note.&lt;br /&gt;
&lt;br /&gt;
==Enabling PXE Boot==&lt;br /&gt;
&lt;br /&gt;
===Legacy PXE Boot===&lt;br /&gt;
* When rebooting the USRP-2974 open BIOS with DEL and go to Boot tab&lt;br /&gt;
* Enable PXE Network Boot with Legacy option, restart the system&lt;br /&gt;
* Go into the BIOS’ Boot tab and set IBA CL Slot 00FE v0105 as first boot option, restart the system&lt;br /&gt;
&lt;br /&gt;
===UEFI PXE Boot===&lt;br /&gt;
* When rebooting the USRP-2974 open BIOS with DEL and go to Boot tab&lt;br /&gt;
* Enable PXE Network Boot with UEFI option, restart the system&lt;br /&gt;
* Go into the BIOS’ Boot tab and set IPv4 as first boot option, restart the system&lt;br /&gt;
&lt;br /&gt;
==NI USRP RIO PCIe Support==&lt;br /&gt;
&lt;br /&gt;
If you are connecting the USRP-2974 through the PCIe interface, then complete this section.&lt;br /&gt;
&lt;br /&gt;
If you are connecting the USRP-2974 through the 1G or 10G Ethernet connection then do '''NOT''' complete this section.&lt;br /&gt;
&lt;br /&gt;
# Installer and commands taken from [https://files.ettus.com/manual/page_ni_rio_kernel.html https://files.ettus.com/manual/page_ni_rio_kernel.html]&lt;br /&gt;
# Extract the installer and install as described (note the _ instead of – in the folder name)&lt;br /&gt;
# Enable or disable the PCIe link&lt;br /&gt;
##&amp;lt;code&amp;gt;$ sudo /usr/local/bin/niusrprio_pcie start&amp;lt;/code&amp;gt;&lt;br /&gt;
##&amp;lt;code&amp;gt;$ sudo /usr/local/bin/niusrprio_pcie stop &amp;lt;/code&amp;gt;&lt;br /&gt;
# Check the status&lt;br /&gt;
##&amp;lt;code&amp;gt;$ sudo /usr/local/bin/niusrprio_pcie status&amp;lt;/code&amp;gt;&lt;br /&gt;
# see the connection over PCIe with &lt;br /&gt;
##&amp;lt;code&amp;gt;$ uhd_find_devices&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Note on USRP-2974 Rev A Hardware==&lt;br /&gt;
To find out if you have a '''&amp;quot;Rev A&amp;quot;''' hardware version of the USRP-2974 check the last character of the part number on the USRP-2974. E.g. &amp;quot;146873'''A'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
To fully support Rev A with UHD software, install UHD as explained and run the following command:&lt;br /&gt;
&lt;br /&gt;
    $ /usr/local/lib/uhd/utils/usrp_burn_mb_eeprom --args=”addr=192.168.40.2” --value=”product=31131”&lt;br /&gt;
&lt;br /&gt;
After a reboot run: &lt;br /&gt;
&lt;br /&gt;
    $ uhd_find_devices&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Under the product category section you will see the following: &lt;br /&gt;
    “NI-2974”.&lt;br /&gt;
&lt;br /&gt;
==Technical Support and Community Knowledge Base==&lt;br /&gt;
&lt;br /&gt;
Technical support for USRP hardware is available through email only. If the product arrived in a non­functional state or you require technical assistance, please contact [mailto:support@ettus.com support@ettus.com]. Please allow 24 to 48 hours for response by email, depending on holidays and weekends, although we are often able to reply more quickly than that.&lt;br /&gt;
&lt;br /&gt;
We also recommend that you subscribe to the community mailing lists. The mailing lists have a responsive and knowledgeable community of hundreds of developers and technical users who are located around the world. When you join the community, you will be connected to this group of people who can help you learn about SDR and respond to your technical and specific questions. Often your question can be answered quickly on the mailing lists. Each mailing list also provides an archive of all past conversations and discussions going back many years. Your question or problem may have already been addressed before, and a relevant or helpful solution may already exist in the archive.&lt;br /&gt;
&lt;br /&gt;
Discussions involving the USRP hardware and the UHD software itself are best addressed through the '''u​srp­-users''' ​mailing list at [http://usrp-users.ettus.com http://usrp-users.ettus.com].&lt;br /&gt;
&lt;br /&gt;
Discussions involving the use of [http://gnuradio.org/ GNU Radio] with USRP hardware and UHD software are best addressed through the '''d​iscuss­-gnuradio'''​ mailing list at [https://lists.gnu.org/mailman/listinfo/discuss­gnuradio https://lists.gnu.org/mailman/listinfo/discuss­gnuradio]​.&lt;br /&gt;
&lt;br /&gt;
Discussions involving the use of [http://openbts.org/ OpenBTS®] with USRP hardware and UHD software are best addressed through the '''o​penbts­-discuss​''' mailing list at [https://lists.sourceforge.net/lists/listinfo/openbts­discuss​ https://lists.sourceforge.net/lists/listinfo/openbts­discuss​].​&lt;br /&gt;
&lt;br /&gt;
The support page on our website is located at [https://www.ettus.com/support https://www.ettus.com/support]​. The Knowledge Base is located at ​[https://kb.ettus.com https://kb.ettus.com]​.&lt;br /&gt;
&lt;br /&gt;
==Legal Considerations==&lt;br /&gt;
Every country has laws governing the transmission and reception of radio signals. Users are solely responsible for insuring they use their USRP system in compliance with all applicable laws and regulations. Before attempting to transmit and/or receive on any frequency, we recommend that you determine what licenses may be required and what restrictions may apply.&lt;br /&gt;
&lt;br /&gt;
*NOTE: This USRP product is a piece of test equipment.&lt;br /&gt;
&lt;br /&gt;
==Sales and Ordering Support==&lt;br /&gt;
&lt;br /&gt;
If you have any non­-technical questions related to your order, then please contact us by email at [mailto:orders@ettus.com orders@ettus.com]​. Please be sure to include your order number and the serial number of your USRP.&lt;br /&gt;
&lt;br /&gt;
==Terms and Conditions of Sale==&lt;br /&gt;
Terms and conditions of sale can be accessed online at the following link: http://www.ettus.com/legal/terms-and-conditions-of-sale&lt;br /&gt;
&lt;br /&gt;
==Additional Resources==&lt;br /&gt;
&lt;br /&gt;
* [[USRP-2974 | USRP-2974 Hardware Resource]]&lt;br /&gt;
* http://www.ni.com/pdf/manuals/377416c.pdf &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Getting Started Guides]]&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP-2974_Getting_Started_Guide&amp;diff=4156</id>
		<title>USRP-2974 Getting Started Guide</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=USRP-2974_Getting_Started_Guide&amp;diff=4156"/>
				<updated>2019-06-01T15:10:32Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* Basic Connectivity */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Kit Contents==&lt;br /&gt;
* NI USRP-2974&lt;br /&gt;
* 30 dB SMA Attenuator&lt;br /&gt;
* SMA-male to SMA-male Cable&lt;br /&gt;
* Power Supply&lt;br /&gt;
* Getting Started Guide&lt;br /&gt;
{|&lt;br /&gt;
||[[File:USRP_2974_frt_dia.jpg|250px|center]]  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Verify the Contents of Your Kit==&lt;br /&gt;
Make sure that your kit contains all the items listed above. If any items are missing, please contact your sales agent.&lt;br /&gt;
&lt;br /&gt;
==Unpacking the Kit==&lt;br /&gt;
1. To prevent electrostatic discharge (ESD) from damaging the device, ground yourself using a grounding strap or by holding a grounded object, such as your computer chassis.&lt;br /&gt;
&lt;br /&gt;
2. Remove the device from the package and inspect the device for loose components or any&lt;br /&gt;
other sign of damage.&lt;br /&gt;
&lt;br /&gt;
3. Never touch the exposed pins of connectors.&lt;br /&gt;
&lt;br /&gt;
4. Unpack any other items and documentation from the kit.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' Do not install a device if it appears damaged in any way. Store the device in the antistatic package when the device is not in use.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Proper Care and Handling==&lt;br /&gt;
All NI products are individually tested before shipment. The USRP™ is guaranteed to be functional at the time it is received by the customer. Improper use or handling of the USRP™ can easily cause the device to become non-functional. Listed below are some examples of actions which can prevent damage to the unit:&lt;br /&gt;
&lt;br /&gt;
*Always properly terminate the transmit port with an antenna or 50Ω load.&lt;br /&gt;
*Always handle the USRP with proper anti-static methods.&lt;br /&gt;
*Never allow the USRP to directly or indirectly come into contact with any voltage spikes.&lt;br /&gt;
*Never allow any water, or condensing moisture, to come into contact with the USRP.&lt;br /&gt;
*Always use caution with FPGA, firmware, or software modifications.&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Never apply more than '''+10 dBm''' of power into RF ports RF0 and RF1.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Never apply more than '''+15 dBm''' of power into the REF IN input.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Never apply more than '''-15 dBm''' of power into the GPS ANT input.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Always use at least 30dB attenuation if operating in loopback configuration&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Install and Setup the Software Tools on the onboard computer (SoM-System on Module)==&lt;br /&gt;
In order to use your Universal Software Radio Peripheral (USRP™), you must have the software tools correctly installed and configured on the SoM. A step-by-step guide for doing this is available at the [https://kb.ettus.com/Building_and_Installing_the_USRP_Open-Source_Toolchain_(UHD_and_GNU_Radio)_on_Linux Building and Installing the USRP Open-Source Toolchain (UHD and GNU Radio) on the Linux] Application Note. '''Release 3.15.0''' or later of the USRP Hardware Driver, UHD, is needed.&lt;br /&gt;
&lt;br /&gt;
==Basic Connectivity==&lt;br /&gt;
This USRP-2974 host supports multiple, high-speed, low-latency interface options to the FPGA. To setup the device, follow these basic instructions:&lt;br /&gt;
* Configure the host ethernet adapter (enp1s0f0) to use an IP address of 192.168.40.1 and a subnet mask of 255.255.255.0 &lt;br /&gt;
* Configure the host ethernet adapter (enp1s0f1) to use an IP address of 192.168.30.1 and a subnet mask of 255.255.255.0 (loopback with SFP+ cable needed)&lt;br /&gt;
* To test communications, ping the USRP FPGA at address &amp;quot;192.168.40.2&amp;quot; or “192.168.30.2”&lt;br /&gt;
&lt;br /&gt;
For more details on network setup, including PCIe connectivity, please see the section [[USRP-2974#Interfaces_and_Connectivity|Interfaces and Connectivity]] of the NI USRP-2974 Hardware Resources page.&lt;br /&gt;
&lt;br /&gt;
==Test and Verify the Operation of the USRP==&lt;br /&gt;
Once the software tools are installed on the onboard computer, verify the correct operation of the USRP by running the utility programs on the onboard computer. More information is available at the [https://kb.ettus.com/Verifying_the_Operation_of_the_USRP_Using_UHD_and_GNU_Radio Verifying the Operation of the USRP Using UHD and GNU Radio] Application Note.&lt;br /&gt;
&lt;br /&gt;
==Enabling PXE Boot==&lt;br /&gt;
&lt;br /&gt;
===Legacy PXE Boot===&lt;br /&gt;
* When rebooting the USRP-2974 open BIOS with DEL and go to Boot tab&lt;br /&gt;
* Enable PXE Network Boot with Legacy option, restart the system&lt;br /&gt;
* Go into the BIOS’ Boot tab and set IBA CL Slot 00FE v0105 as first boot option, restart the system&lt;br /&gt;
&lt;br /&gt;
===UEFI PXE Boot===&lt;br /&gt;
* When rebooting the USRP-2974 open BIOS with DEL and go to Boot tab&lt;br /&gt;
* Enable PXE Network Boot with UEFI option, restart the system&lt;br /&gt;
* Go into the BIOS’ Boot tab and set IPv4 as first boot option, restart the system&lt;br /&gt;
&lt;br /&gt;
==NI USRP RIO PCIe Support==&lt;br /&gt;
&lt;br /&gt;
If you are connecting the USRP-2974 through the PCIe interface, then complete this section.&lt;br /&gt;
&lt;br /&gt;
If you are connecting the USRP-2974 through the 1G or 10G Ethernet connection then do '''NOT''' complete this section.&lt;br /&gt;
&lt;br /&gt;
# Installer and commands taken from [https://files.ettus.com/manual/page_ni_rio_kernel.html https://files.ettus.com/manual/page_ni_rio_kernel.html]&lt;br /&gt;
# Extract the installer and install as described (note the _ instead of – in the folder name)&lt;br /&gt;
# Enable or disable the PCIe link&lt;br /&gt;
##&amp;lt;code&amp;gt;$ sudo /usr/local/bin/niusrprio_pcie start&amp;lt;/code&amp;gt;&lt;br /&gt;
##&amp;lt;code&amp;gt;$ sudo /usr/local/bin/niusrprio_pcie stop &amp;lt;/code&amp;gt;&lt;br /&gt;
# Check the status&lt;br /&gt;
##&amp;lt;code&amp;gt;$ sudo /usr/local/bin/niusrprio_pcie status&amp;lt;/code&amp;gt;&lt;br /&gt;
# see the connection over PCIe with &lt;br /&gt;
##&amp;lt;code&amp;gt;$ uhd_find_devices&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Note on USRP-2974 Rev A Hardware==&lt;br /&gt;
To find out if you have a '''&amp;quot;Rev A&amp;quot;''' hardware version of the USRP-2974 check the last character of the part number on the USRP-2974. E.g. &amp;quot;146873'''A'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
To fully support Rev A with UHD software, install UHD as explained and run the following command:&lt;br /&gt;
&lt;br /&gt;
    $ /usr/local/lib/uhd/utils/usrp_burn_mb_eeprom --args=”addr=192.168.40.2” --value=”product=31131”&lt;br /&gt;
&lt;br /&gt;
After a reboot run: &lt;br /&gt;
&lt;br /&gt;
    $ uhd_find_devices&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Under the product category section you will see the following: &lt;br /&gt;
    “NI-2974”.&lt;br /&gt;
&lt;br /&gt;
==Technical Support and Community Knowledge Base==&lt;br /&gt;
&lt;br /&gt;
Technical support for USRP hardware is available through email only. If the product arrived in a non­functional state or you require technical assistance, please contact [mailto:support@ettus.com support@ettus.com]. Please allow 24 to 48 hours for response by email, depending on holidays and weekends, although we are often able to reply more quickly than that.&lt;br /&gt;
&lt;br /&gt;
We also recommend that you subscribe to the community mailing lists. The mailing lists have a responsive and knowledgeable community of hundreds of developers and technical users who are located around the world. When you join the community, you will be connected to this group of people who can help you learn about SDR and respond to your technical and specific questions. Often your question can be answered quickly on the mailing lists. Each mailing list also provides an archive of all past conversations and discussions going back many years. Your question or problem may have already been addressed before, and a relevant or helpful solution may already exist in the archive.&lt;br /&gt;
&lt;br /&gt;
Discussions involving the USRP hardware and the UHD software itself are best addressed through the '''u​srp­-users''' ​mailing list at [http://usrp-users.ettus.com http://usrp-users.ettus.com].&lt;br /&gt;
&lt;br /&gt;
Discussions involving the use of [http://gnuradio.org/ GNU Radio] with USRP hardware and UHD software are best addressed through the '''d​iscuss­-gnuradio'''​ mailing list at [https://lists.gnu.org/mailman/listinfo/discuss­gnuradio https://lists.gnu.org/mailman/listinfo/discuss­gnuradio]​.&lt;br /&gt;
&lt;br /&gt;
Discussions involving the use of [http://openbts.org/ OpenBTS®] with USRP hardware and UHD software are best addressed through the '''o​penbts­-discuss​''' mailing list at [https://lists.sourceforge.net/lists/listinfo/openbts­discuss​ https://lists.sourceforge.net/lists/listinfo/openbts­discuss​].​&lt;br /&gt;
&lt;br /&gt;
The support page on our website is located at [https://www.ettus.com/support https://www.ettus.com/support]​. The Knowledge Base is located at ​[https://kb.ettus.com https://kb.ettus.com]​.&lt;br /&gt;
&lt;br /&gt;
==Legal Considerations==&lt;br /&gt;
Every country has laws governing the transmission and reception of radio signals. Users are solely responsible for insuring they use their USRP system in compliance with all applicable laws and regulations. Before attempting to transmit and/or receive on any frequency, we recommend that you determine what licenses may be required and what restrictions may apply.&lt;br /&gt;
&lt;br /&gt;
*NOTE: This USRP product is a piece of test equipment.&lt;br /&gt;
&lt;br /&gt;
==Sales and Ordering Support==&lt;br /&gt;
&lt;br /&gt;
If you have any non­-technical questions related to your order, then please contact us by email at [mailto:orders@ettus.com orders@ettus.com]​. Please be sure to include your order number and the serial number of your USRP.&lt;br /&gt;
&lt;br /&gt;
==Terms and Conditions of Sale==&lt;br /&gt;
Terms and conditions of sale can be accessed online at the following link: http://www.ettus.com/legal/terms-and-conditions-of-sale&lt;br /&gt;
&lt;br /&gt;
==Additional Resources==&lt;br /&gt;
&lt;br /&gt;
* [[NI_USRP-2974_Hardware_Resource_00 | USRP-2974 Hardware Resource]]&lt;br /&gt;
* http://www.ni.com/pdf/manuals/377416c.pdf &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Getting Started Guides]]&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP-2974&amp;diff=4155</id>
		<title>USRP-2974</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=USRP-2974&amp;diff=4155"/>
				<updated>2019-06-01T15:08:56Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* Front Panel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The NI USRP-2974 is a high-performance, USRP software defined radio (SDR) stand-alone device for designing and deploying next generation wireless communications systems. The hardware architecture combines two extended-bandwidth daughterboard slots covering 10 MHz – 6 GHz with up to 160 MHz of baseband bandwidth, multiple high-speed interface options (PCIe, dual 10 GigE), an onboard Intel Core i7 processor, and a large user-programmable Kintex-7 FPGA in a convenient desktop or rack-mountable half-wide 2U form factor.&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 is the equivalent to a USRP X310 with two UBX-160 boards, a GPSDO and an onboard Intel i7 computer. The USRP-2974 comes with NI Linux RTOS pre-installed, but in order to use it with open-source tool-chain, a user will need to install Linux (preferably Fedora or Ubuntu) and then the USRP Hardware driver (UHD). After these have been installed, any other open-source tools can be installed, such as GNU Radio.&lt;br /&gt;
&lt;br /&gt;
== Key Features of the USRP-2974==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Intel Core i7 6822EQ 2GHz Quad CoreProcessor&lt;br /&gt;
* 16GB DDR4 Memory&lt;br /&gt;
* 512GB SSD&lt;br /&gt;
* USB-to-UART to the CPU&lt;br /&gt;
* Xilinx Kintex-7 XC7K410T FPGA&lt;br /&gt;
* 14 bit 200 MS/s ADC&lt;br /&gt;
* 16 bit 800 MS/s DAC&lt;br /&gt;
* Frequency range: 10 MHz - 6 GHz&lt;br /&gt;
* Up 160MHz&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; bandwidth per channel&lt;br /&gt;
* 2 Transmit ports&lt;br /&gt;
* 2 Receive ports&lt;br /&gt;
* GPSDO&lt;br /&gt;
* Multiple high-speed interfaces (Dual 10G, PCIe Express, 1G)&lt;br /&gt;
|[[File:USRP_2974_frt_dia.jpg|350px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Controller - Onboard computer ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|System on module (SoM) &lt;br /&gt;
|Congatec COM Express conga-TS170&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|CPU&lt;br /&gt;
|Intel Core i7 6822EQ (2 GHz Quad Core)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Memory &lt;br /&gt;
|SO-DIMM DDR4 16 GB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SFP+&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &lt;br /&gt;
|10G ETH connection to the SoM&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Cabled PCIe&lt;br /&gt;
|PCIe Gen 2 x4&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|MicroUSB&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|USB-to-UART to the SoM&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|RJ45&lt;br /&gt;
|1G ETH host connection&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; Can be bypassed to the FPGA.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; Device port for external host.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RF Specifications==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Transmitter&lt;br /&gt;
|-&lt;br /&gt;
|Number of channels&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Frequency range&lt;br /&gt;
|10MHz to 6GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency step&lt;br /&gt;
|&amp;lt;1kHz&lt;br /&gt;
|-&lt;br /&gt;
|Maximum output power&lt;br /&gt;
|5mW to 100mW (7dBm to 20dBm)&lt;br /&gt;
|-&lt;br /&gt;
|Gain range&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
|0dB to 31.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Gain step&lt;br /&gt;
|0.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum instantaneous real-time bandwidth&lt;br /&gt;
|160MHz&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Receiver&lt;br /&gt;
|-&lt;br /&gt;
|Number of channels&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Frequency range&lt;br /&gt;
|10MHz to 6GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency step&lt;br /&gt;
|&amp;lt;1kHz&lt;br /&gt;
|-&lt;br /&gt;
|Gain range&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|0dB to 37.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Gain step&lt;br /&gt;
|0.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum input power&lt;br /&gt;
|10dBm&lt;br /&gt;
|-&lt;br /&gt;
|Noise Figure&lt;br /&gt;
|5dB to 7dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum instantaneous real-time bandwidth&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&lt;br /&gt;
|160MHz&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; The output power resulting from the gain setting varies over the frequency band and among&lt;br /&gt;
devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;The received signal amplitude resulting from the gain setting varies over the frequency band and&lt;br /&gt;
among devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;The USRP-2974 receiver path has 84 MHz of bandwidth for center frequencies from 10 MHz to&lt;br /&gt;
500 MHz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' As mentioned earlier, the USRP-2974 incorporates 2 UBX-160 daughterboards. Therefore, for more information on RF performance, please see the [https://kb.ettus.com/UBX UBX hardware resource] page&lt;br /&gt;
&lt;br /&gt;
==Hardware Specifications==&lt;br /&gt;
===USRP Hardware Driver (UHD) version===&lt;br /&gt;
* Minimum version of UHD required: '''3.15.0'''&lt;br /&gt;
&lt;br /&gt;
===Clocking and Sampling Rates===&lt;br /&gt;
There are two master clock rates (MCR) supported on the USRP-2974 like on the X310: 200.0 MHz and 184.32 MHz.&lt;br /&gt;
&lt;br /&gt;
The sampling rate must be an integer decimation rate of the MCR. Ideally, this decimation factor should be an even number. An odd decimation factor will result in additional unwanted attenuation (roll-off from the CIC filter in the DUC and DDC blocks in the FPGA). The valid decimation rates are between 1 and 1024.&lt;br /&gt;
&lt;br /&gt;
For the MCR of 200.0 MHz, the achievable sampling rates using an even decimation factor are 200.0, 100.0, 50.0, 33.33, 25.0, 20.0, 16.67, 14.286 Msps, ... 195.31 Ksps.&lt;br /&gt;
&lt;br /&gt;
For the MCR of 184.32 MHz, the achievable sampling rates using an even decimation factor are 184.32, 92.16, 46.08, 30.72, 23.04, 18.432, 15.36, 13.166 Msps, ... 180.0 Ksps.&lt;br /&gt;
&lt;br /&gt;
If the desired sampling rate is not directly supported by the hardware, then it will be necessary to re-sample in software. This can be done in C++ using libraries such as Liquid DSP [https://github.com/jgaeddert/liquid-dsp], or can be done in GNU Radio, in which there are three blocks that perform sampling rate conversion.&lt;br /&gt;
&lt;br /&gt;
==Physical Specifications==&lt;br /&gt;
&lt;br /&gt;
===Dimensions===&lt;br /&gt;
(L × W × H) 29.08 cm × 21.84 cm × 7.98 cm (11.45 in. × 8.60 in. × 3.14 in. )&lt;br /&gt;
&lt;br /&gt;
===Weight===&lt;br /&gt;
3.34 kg (7.35 lb)&lt;br /&gt;
&lt;br /&gt;
==Power==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|Voltage range&lt;br /&gt;
|14.25 V to 15.75 V DC&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Current&lt;br /&gt;
|10 A, maximum&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Power&lt;br /&gt;
|150 W, maximum&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' Indoor use only&lt;br /&gt;
&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* 0 °C to 50 °C&lt;br /&gt;
&lt;br /&gt;
===Maximum altitude===&lt;br /&gt;
* 2,000 m (800 mbar) (at 25 °C ambient temperature)&lt;br /&gt;
&lt;br /&gt;
===Operating Humidity Range===&lt;br /&gt;
* 10% to 90% non-condensing&lt;br /&gt;
&lt;br /&gt;
===Pollution Degree===&lt;br /&gt;
* 2&lt;br /&gt;
&lt;br /&gt;
==System Diagram and Schematics==&lt;br /&gt;
&lt;br /&gt;
===System Block Diagram===&lt;br /&gt;
[[file:2974_blk_dia.png |800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.ni.com/documentation/en/usrp-software-defined-radio-stand-alone-device/latest/usrp-2974/block-diagram/ System Block Diagram]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schematics===&lt;br /&gt;
Because the USRP-2974 is a combination of an Intel i7 SOM and an X310 USRP, a user can reference the X310 Schematics.&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/schematics/x300/x3xx.pdf X310 Schematics]&lt;br /&gt;
&lt;br /&gt;
==Key Component Datasheets==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%&amp;quot;&lt;br /&gt;
!Part Number&lt;br /&gt;
!Description&lt;br /&gt;
!Schematic ID (Page)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.congatec.com/fileadmin/user_upload/Documents/Datasheets/conga-TS170.pdf conga-TS170]&lt;br /&gt;
|System on Module (SoM)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.xilinx.com/support/documentation/data_sheets/ds180_7Series_Overview.pdf XC7K410T]&lt;br /&gt;
|FPGA&lt;br /&gt;
|U23 (3,5,8,9,10,18)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/AD9146.PDF AD9146]&lt;br /&gt;
|Dual Channel, 16-Bit, 1230 MSPS DAC&lt;br /&gt;
|U12, U36 (7)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/slas635b/slas635b.pdf ADS62P48]&lt;br /&gt;
|Dual Channel, 14-Bit 210 MSPS ADC&lt;br /&gt;
|U11, U35 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.onsemi.com/pub/Collateral/FIN1002-D.pdf FIN1002]&lt;br /&gt;
|High Speed Differential Receiver&lt;br /&gt;
|U3, U5, U31, U32 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/20001203U.pdf 24LC256T]&lt;br /&gt;
|EEPROM&lt;br /&gt;
|U530 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/lmk04816.pdf LMK04816BISQ/NOPB_1/3]&lt;br /&gt;
|Jitter Cleaner With Dual Loop PLLs&lt;br /&gt;
|U531 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/sy89547l.pdf SY89547LMGTR]&lt;br /&gt;
|Multiplexer&lt;br /&gt;
|U506 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/sn74aup1t17.pdf SN74AUP1T17]&lt;br /&gt;
|Single Schmitt-Trigger Buffer Gate&lt;br /&gt;
|U6, U519 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps54620.pdf TPS54620RGYT]&lt;br /&gt;
|Synchronous Step Down SWIFT™ Converter&lt;br /&gt;
|U515 (21); U516 (26)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/1764fb.pdf LT1764EQ-3.3]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U27 (21); U516 (26)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps7a47.pdf TPS7A47]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U28, U532 (21)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/3603fc.pdf LTC3603EUF_TRPBF]&lt;br /&gt;
|Monolithic Synchronous Step-Down Regulator&lt;br /&gt;
|U517 (23); U500 (25); U514, U513 (27)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/product/TPS77625-EP?keyMatch=TPS77625&amp;amp;tisearch=Search-EN-Everything TPS77625]&lt;br /&gt;
|Low-Dropout Voltage Regulators&lt;br /&gt;
|U30 (23)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps79318-ep.pdf TPS79318_SM]&lt;br /&gt;
|Low-Dropout Voltage Regulators&lt;br /&gt;
|U510 (27)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Media:agile9598503.pdf|OSC-96MHZ-724821-01]]&lt;br /&gt;
|Voltage Controlled Crystal Oscillator&lt;br /&gt;
|U25 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==FPGA and Baseband==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|FPGA &lt;br /&gt;
|Kintex-7 XC7K410T&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|DRAM &lt;br /&gt;
|1 GB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Baseband analog-to-digital converter&lt;br /&gt;
(ADC) resolution&lt;br /&gt;
|14 bit&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Baseband digital-to-analog converter&lt;br /&gt;
(DAC) resolution&lt;br /&gt;
|16 bit&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|ADC spurious-free dynamic range (sFDR)&lt;br /&gt;
|88 dB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|DAC sFDR&lt;br /&gt;
|80 dB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Maximum I/Q sample rate&lt;br /&gt;
|200 MS/s&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SFP+&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &lt;br /&gt;
|High speed serial link to one of the FPGA&lt;br /&gt;
GTX transceivers&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;Can be bypassed to the SoM if using the 10 GbE as protocol.&lt;br /&gt;
&lt;br /&gt;
===FPGA User Modifications===&lt;br /&gt;
&lt;br /&gt;
The Verilog code for the FPGA in the NI USRP-2974 is open-source, and users are free to modify and customize it for their needs. However, certain modifications may result in either bricking the device, or even in physical damage to the unit. Specifically, changing the I/O interface of the FPGA in any way (do not remove any of the I/O for the PCIe interface, such as &amp;lt;code&amp;gt;x300_pcie_int&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;LvFpga_Chinch_Interface&amp;lt;/code&amp;gt;), or modifying the pin and timing constraint files, could result in physical damage to other components on the motherboard, external to the FPGA, and doing this will void the warranty. Also, even if the PCIe interface is not being used, you cannot remove or reassign these pins in the constraint file. The constraint files should not be modified. Please note that modifications to the FPGA are made at the risk of the user, and may not be covered by the warranty of the device.&lt;br /&gt;
&lt;br /&gt;
==Interfaces and Connectivity==&lt;br /&gt;
Follow the links below for additional information on configuring each interface for the USRP-2974.&lt;br /&gt;
&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_10gige Dual 10 Gigabit Ethernet] - 200 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_pcie PCIe Express (Desktop)] - 200 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_1gige 1 Gigabit Ethernet] - 25 MS/s Full Duplex @ 16-bit&lt;br /&gt;
&lt;br /&gt;
===Front Panel===&lt;br /&gt;
&lt;br /&gt;
[[File:USRP-2974 Front Panel.jpg|800px]]&lt;br /&gt;
[[File:2974_frt_wireframe.png|800px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Connector&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''Use'''&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RF 0&lt;br /&gt;
|TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|Input and output terminal for the RF signal. TX1 RX1 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input or output channel.&lt;br /&gt;
|-&lt;br /&gt;
|RX2&lt;br /&gt;
|Input terminal for the RF signal. RX2 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | AUX I/O&lt;br /&gt;
|General-purpose I/O (GPIO) port. AUX I/O is controlled by the FPGA.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RF 1&lt;br /&gt;
|TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|Input and output terminal for the RF signal. TX1 RX1 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input or output channel.&lt;br /&gt;
|-&lt;br /&gt;
|RX2&lt;br /&gt;
|Input terminal for the RF signal. RX2 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | DP&lt;br /&gt;
|DisplayPort connector to connect one monitor for your controller.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | USB2.0&lt;br /&gt;
|USB ports that support common USB peripheral devices such as flash drives, hard drives, keyboards, and mice.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | USB3.0&lt;br /&gt;
|USB ports that support common USB peripheral devices such as flash drives, hard drives, keyboards, and mice.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G ETH&lt;br /&gt;
|RJ45 port used for 1G ETH connectivity to other ethernet devices.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | μUSB&lt;br /&gt;
|USB port used for UART connectivity to the controller.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 0&lt;br /&gt;
|SFP+ port used for 10G ETH connectivity to other ethernet devices. Connects to the embedded Linux computer for communication with LabVIEW RT.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 1&lt;br /&gt;
|SFP+ port used for 1G/10G ETH connectivity to other ethernet devices. Connects to the FPGA. Not currently supported in LabVIEW Communications System Design Suite.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''LED'''&lt;br /&gt;
!'''Description'''&lt;br /&gt;
!'''Color'''&lt;br /&gt;
!'''State'''&lt;br /&gt;
!'''Indication'''&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;5&amp;quot; | RF 0&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates thetransmit status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not active.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is transmitting data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RX2&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the receive status of the device.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot;| REF&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates the status of the reference signal.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no reference signal, or the device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; |Green&lt;br /&gt;
|Blinking&lt;br /&gt;
|The device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| PPS&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the pulse per second (PPS).&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no PPS timing reference signal, or the device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Blinking&lt;br /&gt;
|The device is locked to the PPS timing reference signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| GPS&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates whether the GPSDO is locked.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no GPSDO or the GPSDO is not locked.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The GPSDO is locked.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;5&amp;quot; | RF 1&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates thetransmit status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not active.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is transmitting data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RX2&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the receive status of the device.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| Status&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device initialized successfully and is ready for use.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Blinking&lt;br /&gt;
|Hardware error. An internal power supply has failed. Check front-panel I/O connections for shorts. Remove any shorts and cycle power to the USRP-2974. Contact NI if the problem persists.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| PWR&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the power status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is powered off.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The devices is powered on.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot; | 10/100/1000&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot;| Indicates the speed of the Gigabit Ethernet link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|No link, or 10 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|100 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
|Amber&lt;br /&gt;
|Solid&lt;br /&gt;
|1,000 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot;| ACT/LINK	&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Indicates the Gigabit Ethernet link activity or status.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|No link has been established.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Green&lt;br /&gt;
|Solid&lt;br /&gt;
|A link has been negotiated.&lt;br /&gt;
|-&lt;br /&gt;
|Blinking&lt;br /&gt;
|Activity on the link.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; | 1G/10G ETH 0&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | ACT/LINK&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Indicates the status of the SFP+ port.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The link is down.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The link is up.&lt;br /&gt;
|-&lt;br /&gt;
|Blinking&lt;br /&gt;
|The link is active (transmitting and receiving).&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |10GbE&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Indicates the status of the 10G ETH link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The 10G ETH link is down.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The 10G ETH link is up.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 1 10GbE&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Indicates the status of the 10G ETH link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The 10G ETH link is down.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The 10G ETH link is up.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Rear Panel===&lt;br /&gt;
[[File:USRP-2974 Rear Panel.jpg|800px]]&lt;br /&gt;
[[File:2974_back_wireframe.png|800px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Connector&lt;br /&gt;
!Use&lt;br /&gt;
|-&lt;br /&gt;
|REF OUT&lt;br /&gt;
|Output terminal for an external reference signal for the LO on the device. REF OUT is an SMA (f) connector with an impedance of 50 Ω, and it is a single-ended reference output. The output signal at this connector is 10 MHz at 3.3 V.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|REF IN&lt;br /&gt;
|Input terminal for an external reference signal for the LO on the device. REF IN is an SMA (f) connector with an impedance of 50 Ω, and it is a single-ended reference input. REF IN accepts a 10 MHz signal with a minimum input power of 0 dBm (0.632 Vpk-pk) and a maximum input power of 15 dBm (3.56 Vpk-pk) for a square wave or sine wave.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PPS TRIG OUT	&lt;br /&gt;
|Output terminal for the PPS timing reference. PPS TRIG OUT is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input. The output signal is 0 V to 3.3 V TTL. You can also use this port as a triggered output (TRIG OUT) that you program with the PPS Trig Out I/O signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PPS TRIG IN	&lt;br /&gt;
|Input terminal for PPS timing reference. PPS TRIG IN is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel. PPS TRIG IN accepts 0 V to 3.3 V TTL and 0 V to 5 V TTL signals. You can also use this port as a triggered input (TRIG IN) that you control using NI-USRP software.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|GPS ANT	&lt;br /&gt;
|Input terminal for the GPS antenna signal. GPS ANT is an SMA (f) connector with a maximum input power of -15 dBm and an output of DC 5 V to power an active antenna. &amp;lt;p&amp;gt; '''Notice:''' Do not terminate the GPS ANT port if you do not use it.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PCIe x4	&lt;br /&gt;
|Port for a PCI Express Generation 2, x4 bus connection through an MXI Express four-lane cable. Can be used to connect an external USRP device or external chassis.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SYSTEM POWER IN	&lt;br /&gt;
|Input that accepts a 15 V ± 5%, 10 A external DC power connector.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Ref Clock - 10 MHz===&lt;br /&gt;
Using an external 10 MHz reference clock, a square wave will offer the best phase noise performance, but a sinusoid is acceptable. The power level of the reference clock cannot exceed +15 dBm.&lt;br /&gt;
&lt;br /&gt;
===PPS - Pulse Per Second===&lt;br /&gt;
Using a PPS signal for timestamp synchronization requires a square wave signal with the following a 5Vpp amplitude.&lt;br /&gt;
&lt;br /&gt;
To test the PPS input, you can use the following tool from the UHD examples:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;args&amp;gt;&amp;lt;/code&amp;gt; are device address arguments (optional if only one USRP device is on your machine)&lt;br /&gt;
&lt;br /&gt;
    cd &amp;lt;install-path&amp;gt;/lib/uhd/examples ./test_pps_input –args=&amp;lt;args&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Front Panel GPIO===&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;width:50%&amp;quot; |&lt;br /&gt;
The GPIO port is not meant to drive big loads. You should not try to source more than 5mA per pin.&lt;br /&gt;
&lt;br /&gt;
The +3.3V is for ESD clamping purposes only and not designed to deliver high currents.&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | [[File:x3x0 gpio conn.png]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Power on state====&lt;br /&gt;
The hardware power on state and UHD initial state for the front-panel GPIOs is high-Z. For the X3xx, there are no external pull-ups/pull-downs for the GPIO pins, but the FPGAs do have them and they are configured as follows: X3xx: pull-down.&lt;br /&gt;
&lt;br /&gt;
====Pin Mapping====&lt;br /&gt;
* Pin 1: +3.3V&lt;br /&gt;
* Pin 2: Data[0]&lt;br /&gt;
* Pin 3: Data[1]&lt;br /&gt;
* Pin 4: Data[2]&lt;br /&gt;
* Pin 5: Data[3]&lt;br /&gt;
* Pin 6: Data[4]&lt;br /&gt;
* Pin 7: Data[5]&lt;br /&gt;
* Pin 8: Data[6]&lt;br /&gt;
* Pin 9: Data[7]&lt;br /&gt;
* Pin 10: Data[8]&lt;br /&gt;
* Pin 11: Data[9]&lt;br /&gt;
* Pin 12: Data[10]&lt;br /&gt;
* Pin 13: Data[11]&lt;br /&gt;
* Pin 14: 0V&lt;br /&gt;
* Pin 15: 0V&lt;br /&gt;
&lt;br /&gt;
'''Note''': Please see the [http://files.ettus.com/manual/page_gpio_api.html E3x0/X3x0 GPIO API] for information on configuring and using the GPIO bus.&lt;br /&gt;
&lt;br /&gt;
==Certifications==&lt;br /&gt;
===RoHS===&lt;br /&gt;
As of December 1st, 2010 all NI/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;
[http://files.ettus.com/manual/md_fpga.html FPGA Resources]&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/binaries/uhd_stable/ UHD Stable Binaries]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/EttusResearch/uhd UHD Source Code on Github]&lt;br /&gt;
&lt;br /&gt;
==Choosing an Interface==&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 provides three interface options – 1 Gigabit Ethernet (1 GigE), 10 Gigabit Ethernet (10 GigE), and PCI-Express (PCIe). The PCIe interface is always available regardless of what FPGA image is loaded. Ettus ships two FPGA image variants, the HG or HGS image which has one 1 GigE interfaces and one 10 GigE interfaces, and the XG image which has two 10 GigE interfaces. Generally, Ettus Research recommends using 10 GigE to achieve the maximum throughput available from the USRP-2974.  PCIe is recommended for applications that require the lowest possible latency, which is a desirable characteristic for PHY/MAC research.  If your application does not require the full bandwidth of the USRP-2974, the 1 GigE interface serves as a cost-effective fall-back option.  Ettus Research provides a complete interface kit for each of these options, which is also shown in the following table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|Interface Performance Summary&lt;br /&gt;
|-&lt;br /&gt;
!Interface&lt;br /&gt;
!Throughput (MS/s @ 16-bit)&lt;br /&gt;
!Target&lt;br /&gt;
!Recommended Kit&lt;br /&gt;
|-&lt;br /&gt;
|1 Gigabit&lt;br /&gt;
|25 MS/s&lt;br /&gt;
|Desktop/Laptop&lt;br /&gt;
|[https://www.ettus.com/product/details/1GIGE-KIT SFP Adapter + GigE Cable]&lt;br /&gt;
|-&lt;br /&gt;
|10 Gigabit&lt;br /&gt;
|200 MS/s&lt;br /&gt;
|Desktop&lt;br /&gt;
|[https://www.ettus.com/product/details/10GIGE-KIT 10 GigE Interface Kit]&lt;br /&gt;
|-&lt;br /&gt;
|PCI-Express &lt;br /&gt;
(PCIe, 4 lane)&lt;br /&gt;
|200 MS/S&lt;br /&gt;
|Desktop&lt;br /&gt;
|[https://www.ettus.com/product/details/PCIE-KIT PCI-Express Desktop Kit]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===10 Gigabit Ethernet===&lt;br /&gt;
In order to utilize the dual 10 Gigabit Ethernet interfaces, ensure the XG image is installed ([http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_load_fpga_imgs_fpga_flavours see FPGA Image Flavors]). In addition to burning the prerequisite FPGA image, it may also be necessary to tune the network interface card (NIC) to eliminate drops (Ds) and reduce overflows (Os). This is done by increasing the number of RX descriptors ([http://files.ettus.com/manual/page_transport.html#transport_udp_linux see Linux specific notes]).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;benchmark_rate&amp;lt;/code&amp;gt; tool can be used to test this capability. Run the following commands to test the X-series USRP over both 10 Gigabit Ethernet interfaces with the maximum rate of 200 Msps per channel:&lt;br /&gt;
&lt;br /&gt;
    cd &amp;lt;install-path&amp;gt;/lib/uhd/examples&lt;br /&gt;
    ./benchmark_rate --args=&amp;quot;type=x300,addr=&amp;lt;Primary IP&amp;gt;,second_addr=&amp;lt;secondary IP&amp;gt;&amp;quot; --channels=&amp;quot;0,1&amp;quot; --rx_rate 200e6&lt;br /&gt;
&lt;br /&gt;
The second interface is specified by the extra argument '''second_addr'''.&lt;br /&gt;
&lt;br /&gt;
'''Recommended 10 Gigabit Ethernet Cards'''&lt;br /&gt;
* Intel X520-DA2&lt;br /&gt;
** [http://ark.intel.com/products/39776/Intel-Ethernet-Converged-Network-Adapter-X520-DA2 Intel® Ethernet Converged Network Adapter X520-DA2]&lt;br /&gt;
* Intel X520-DA1&lt;br /&gt;
** [http://ark.intel.com/products/68669/Intel-Ethernet-Converged-Network-Adapter-X520-DA1 Intel® Ethernet Converged Network Adapter X520-DA1 ]&lt;br /&gt;
* Intel X710-DA2&lt;br /&gt;
** [http://ark.intel.com/products/83964/Intel-Ethernet-Converged-Network-Adapter-X710-DA2 Intel® Ethernet Converged Network Adapter X710-DA2 ]&lt;br /&gt;
* Intel X710-DA4&lt;br /&gt;
** [http://ark.intel.com/products/83965/Intel-Ethernet-Converged-Network-Adapter-X710-DA4 Intel® Ethernet Converged Network Adapter X710-DA4 ]&lt;br /&gt;
* Mellanox MCX4121A-ACAT&lt;br /&gt;
** [https://store.mellanox.com/products/mellanox-mcx4121a-acat-connectx-4-lx-en-network-interface-card-25gbe-dual-port-sfp28-pcie3-0-x8-rohs-r6.html Mellanox MCX4121A-ACAT ]&lt;br /&gt;
&lt;br /&gt;
==GPS Disciplined, Oven-Controlled Oscillator (GPSDO)==&lt;br /&gt;
The USRP-2794 has a high-accuracy GPS-disciplined oscillator (GPSDO).  The GPSDO improves the accuracy of the internal frequency reference to 20 ppb, or 0.1 ppb if the GPS is synchronized to the GPS constellation.  When synchronized to the GPS constellation, all USRP™ devices will also be synchronized in time within 50 ns.&lt;br /&gt;
&lt;br /&gt;
* Support GPSDO NMEA Strings&lt;br /&gt;
* [http://www.jackson-labs.com/assets/uploads/main/LC_XO_specsheet.pdf JacksonLabs LC_XO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
!Internal TCXO&lt;br /&gt;
!GPS-Disciplined Clock&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Reference&lt;br /&gt;
|TCXO&lt;br /&gt;
|OCXO&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Accuracy&lt;br /&gt;
|± 2.5ppm&lt;br /&gt;
± 2,500 Hz @ 1 GHz&lt;br /&gt;
|± 20 ppb&lt;br /&gt;
± 20 Hz @ 1 GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Accuracy&lt;br /&gt;
|&lt;br /&gt;
|± 0.01ppb&lt;br /&gt;
|-&lt;br /&gt;
|(GPS-Disciplined)&lt;br /&gt;
|&lt;br /&gt;
|~ ± 0.01 Hz @ 1 GHz&lt;br /&gt;
|-&lt;br /&gt;
|GPS Time Sync Accuracy&lt;br /&gt;
|&lt;br /&gt;
|±50ns to UTC Time**&lt;br /&gt;
|-&lt;br /&gt;
|10 MHz Reference Phase Drift with GPS Sync&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;±20ns After 1 Hour**&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Sensors===&lt;br /&gt;
You can query the lock status with the &amp;lt;code&amp;gt;gps_locked&amp;lt;/code&amp;gt; sensor, as well as obtain raw NMEA sentences using the &amp;lt;code&amp;gt;gps_gprmc&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;gps_gpgga&amp;lt;/code&amp;gt; sensors. Location information can be parsed out of the &amp;lt;code&amp;gt;gps_gpgga&amp;lt;/code&amp;gt; sensor by using &amp;lt;code&amp;gt;gpsd&amp;lt;/code&amp;gt; or another NMEA parser.&lt;br /&gt;
&lt;br /&gt;
==Option: Using the GPIO Expansion Kit==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top; width:60%&amp;quot;|This General Purpose Input/output (GPIO) breakout kit provides access to general purpose digital I/O signals with simple terminal blocks, and a prototyping area where wires and components can be soldered.  Each GPIO pin is connected to an FPGA digital line allowing it to be configured as an input, or an output, using the various software frameworks that support the USRP™ GPIO. &lt;br /&gt;
&lt;br /&gt;
These GPIO signals can serve the following functions:&lt;br /&gt;
&lt;br /&gt;
* Control of external devices, such as power amplifiers and RF switches&lt;br /&gt;
* Provide output signals that can help with debugging&lt;br /&gt;
* Provide observables to be analyzed by oscilloscopes or other external equipment&lt;br /&gt;
* Accept input from external devices for local, software-based triggering&lt;br /&gt;
* Implement a protocol line such as SPI or I2C&lt;br /&gt;
||[[File:Product_x3x0_gpio.jpg|250px]]&lt;br /&gt;
|}&lt;br /&gt;
===GPIO Expansion Kit Contents===&lt;br /&gt;
&lt;br /&gt;
*1 GPIO Breakout Board&lt;br /&gt;
*1 DB-15, 1-meter cable&lt;br /&gt;
*GPIO Quick Reference&lt;br /&gt;
&lt;br /&gt;
===Circuit Protection===&lt;br /&gt;
The GPIO signals exposed with this breakout kit are routed directly to the USRP device's FPGA with limited protection circuitry.  However, the user must take precautionary measures to ensure input/output signals meet the specifications shown in this document.  Over voltage, excess current draw, and other conditions can damage the USRP device and void the warranty. Special care should be taken when the USRP is powered off.&lt;br /&gt;
&lt;br /&gt;
===Mounting the GPIO Breakout Board===&lt;br /&gt;
The GPIO breakout board can be mounted directly to the DB15 connector of a USRP ™ device, or mounted remotely with the cable provided in this kit.  The screws on the DB15 connector of the breakout board must be removed to mount the board directly.  For remote mounting, the breakout board is supplied with rubber standoffs to avoid scratching surfaces, and several through-holes for hard mounting with screws or other hardware (not provided).&lt;br /&gt;
&lt;br /&gt;
===Using GPIO with UHD, GNU Radio, and other Third-Party Frameworks===&lt;br /&gt;
When used with UHD, or other third party frameworks that leverage UHD, the GPIO expansion can be controlled with simple API calls.  For more information, on the C++ API, and examples of how to use the GPIO in frameworks such as GNU Radio, please see the [[Application Notes]] section of the [https://kb.ettus.com Ettus Research Knowledge Base].&lt;br /&gt;
&lt;br /&gt;
===GPIO Specifications (3.3V Bank, LVCMOS)===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Parameter&lt;br /&gt;
!Typical&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Configured as Input&lt;br /&gt;
|-&lt;br /&gt;
|Default Voltage Standard&lt;br /&gt;
|3.3V LVCMOS&lt;br /&gt;
|-&lt;br /&gt;
|Voltage High Threshold&lt;br /&gt;
|2.0V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Low Threshold&lt;br /&gt;
|0.8V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Input Limits (no damage) &lt;br /&gt;
| -0.3V/3.45V&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Configured as Output&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Standard&lt;br /&gt;
|3.3V LVCMOS&lt;br /&gt;
|-&lt;br /&gt;
|Voltage High Output&lt;br /&gt;
|2.8V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Low Output&lt;br /&gt;
|0.4V&lt;br /&gt;
|-&lt;br /&gt;
|Current Source Capability&lt;br /&gt;
|12 mA&lt;br /&gt;
|-&lt;br /&gt;
|Output Source Impedance&lt;br /&gt;
|&amp;gt;33 ohms typical&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Option: Antenna Kit for GPSDO==&lt;br /&gt;
The GPSDO Mini Kit will improve the accuracy of the USRP reference clock, even if it does not receive signals from the GPS Constellation.  However, to achieve the best accuracy possible, and to achieve global timing alignment across multiple USRPs, Ettus Research recommends the GPSDO Mini Antenna Kit.&lt;br /&gt;
&lt;br /&gt;
==Option: Cables for MIMO Expansion==&lt;br /&gt;
Multiple USRP-2974s can be synchronized for coherent operation by sharing a common 10 MHz and 1 PPS signal.  We recommend using a star-distribution topology with an OctoClock or OctoClock-G, as seen in Figure 4.  This requires matched length cables to be used for both 10 MHz and 1 PPS.&lt;br /&gt;
&lt;br /&gt;
For more information about MIMO operation, please see the MIMO and Synchronization Application Note.&lt;br /&gt;
[[File:8mimo.png|700px|center]]&lt;br /&gt;
&amp;lt;center&amp;gt;Figure 4 - Star-Distribution of 10 MHz/PPS Signals with OctoClock&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
&lt;br /&gt;
* '''What is the bandwidth of the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
The ADC rate on each analog RX channel is 200 MS/s quadrature, which provides a theoretical analog bandwidth of approximately 80% of the Nyquist bandwidth of +/- 100 MHz (+/- 80 MHz around the center frequency).  The resulting maximum theoretical analog bandwidth is 160 MHz.&lt;br /&gt;
&lt;br /&gt;
FPGA Processing Bandwidth: Up to 200 MS/s quadrature.&lt;br /&gt;
&lt;br /&gt;
Host Bandwidth:  Up to 200 MS/s quadrature, dependent on selected interface&lt;br /&gt;
&lt;br /&gt;
For more information about achieving the maximum bandwidth with a USRP-2974, please see the &amp;quot;USRP X300/X310 Configuration Guide&amp;quot; or the &amp;quot;USRP System Bandwidth&amp;quot; application note.&lt;br /&gt;
&lt;br /&gt;
* '''How can I program the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
Like all other USRP models, the USRP-2974 is compatible with the USRP Hardware Driver™ (UHD) architecture.  The UHD architecture is a common driver that allows users to develop and execute applications on the onboard or host computer.  UHD provides a direct C++ API to control and stream to/from the USRP-2974.  It also provides compatibility with a variety of third-party software frameworks including GNU Radio, LabVIEW, and MATLAB.  You may also customize the FPGA image provided with UHD to integrate your own signal processing. For more information about UHD, and supported software frameworks, please see:&lt;br /&gt;
&lt;br /&gt;
http://files.ettus.com/manual/&lt;br /&gt;
&lt;br /&gt;
* '''How do I update the FPGA images and firmware with the latest from UHD'''&lt;br /&gt;
&lt;br /&gt;
You can find more information about updating the FPGA image through PCIe, 1/10 GigE, and JTAG [https://kb.ettus.com/X300/X310_Device_Recovery here].&lt;br /&gt;
&lt;br /&gt;
* '''How can I modify the FPGA of the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
The source code (Verilog) for the USRP-2794 is available in the UHD repository. The build process leverages the existing CMAKE build system used to compile the host-side driver.  A Linux-based setup will provide the best results.&lt;br /&gt;
&lt;br /&gt;
Which FPGA toolchain required to build the FPGA images will depend upon your version of UHD. For more details please see the [https://kb.ettus.com/UHD UHD] Software Resource page.&lt;br /&gt;
&lt;br /&gt;
* '''How much free space is available in the USRP-2974 FPGA'''&lt;br /&gt;
&lt;br /&gt;
Please see the [[#Utilization statistics]] section of this resources page for more information.&lt;br /&gt;
&lt;br /&gt;
* '''What frequency range does the USRP-2974 cover'''&lt;br /&gt;
&lt;br /&gt;
10MHz to 6GHz.&lt;br /&gt;
&lt;br /&gt;
* '''What components do I need to purchase for a complete USRP-2974 system'''&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 is a complete stand alone SDR. Additional components might include RF filters, antennas, RF power amplifiers or other RF components needed of a specific application.&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP-2974&amp;diff=4154</id>
		<title>USRP-2974</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=USRP-2974&amp;diff=4154"/>
				<updated>2019-06-01T15:07:25Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* Front Panel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The NI USRP-2974 is a high-performance, USRP software defined radio (SDR) stand-alone device for designing and deploying next generation wireless communications systems. The hardware architecture combines two extended-bandwidth daughterboard slots covering 10 MHz – 6 GHz with up to 160 MHz of baseband bandwidth, multiple high-speed interface options (PCIe, dual 10 GigE), an onboard Intel Core i7 processor, and a large user-programmable Kintex-7 FPGA in a convenient desktop or rack-mountable half-wide 2U form factor.&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 is the equivalent to a USRP X310 with two UBX-160 boards, a GPSDO and an onboard Intel i7 computer. The USRP-2974 comes with NI Linux RTOS pre-installed, but in order to use it with open-source tool-chain, a user will need to install Linux (preferably Fedora or Ubuntu) and then the USRP Hardware driver (UHD). After these have been installed, any other open-source tools can be installed, such as GNU Radio.&lt;br /&gt;
&lt;br /&gt;
== Key Features of the USRP-2974==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Intel Core i7 6822EQ 2GHz Quad CoreProcessor&lt;br /&gt;
* 16GB DDR4 Memory&lt;br /&gt;
* 512GB SSD&lt;br /&gt;
* USB-to-UART to the CPU&lt;br /&gt;
* Xilinx Kintex-7 XC7K410T FPGA&lt;br /&gt;
* 14 bit 200 MS/s ADC&lt;br /&gt;
* 16 bit 800 MS/s DAC&lt;br /&gt;
* Frequency range: 10 MHz - 6 GHz&lt;br /&gt;
* Up 160MHz&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; bandwidth per channel&lt;br /&gt;
* 2 Transmit ports&lt;br /&gt;
* 2 Receive ports&lt;br /&gt;
* GPSDO&lt;br /&gt;
* Multiple high-speed interfaces (Dual 10G, PCIe Express, 1G)&lt;br /&gt;
|[[File:USRP_2974_frt_dia.jpg|350px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Controller - Onboard computer ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|System on module (SoM) &lt;br /&gt;
|Congatec COM Express conga-TS170&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|CPU&lt;br /&gt;
|Intel Core i7 6822EQ (2 GHz Quad Core)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Memory &lt;br /&gt;
|SO-DIMM DDR4 16 GB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SFP+&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &lt;br /&gt;
|10G ETH connection to the SoM&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Cabled PCIe&lt;br /&gt;
|PCIe Gen 2 x4&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|MicroUSB&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|USB-to-UART to the SoM&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|RJ45&lt;br /&gt;
|1G ETH host connection&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; Can be bypassed to the FPGA.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; Device port for external host.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RF Specifications==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Transmitter&lt;br /&gt;
|-&lt;br /&gt;
|Number of channels&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Frequency range&lt;br /&gt;
|10MHz to 6GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency step&lt;br /&gt;
|&amp;lt;1kHz&lt;br /&gt;
|-&lt;br /&gt;
|Maximum output power&lt;br /&gt;
|5mW to 100mW (7dBm to 20dBm)&lt;br /&gt;
|-&lt;br /&gt;
|Gain range&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
|0dB to 31.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Gain step&lt;br /&gt;
|0.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum instantaneous real-time bandwidth&lt;br /&gt;
|160MHz&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Receiver&lt;br /&gt;
|-&lt;br /&gt;
|Number of channels&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Frequency range&lt;br /&gt;
|10MHz to 6GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency step&lt;br /&gt;
|&amp;lt;1kHz&lt;br /&gt;
|-&lt;br /&gt;
|Gain range&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|0dB to 37.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Gain step&lt;br /&gt;
|0.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum input power&lt;br /&gt;
|10dBm&lt;br /&gt;
|-&lt;br /&gt;
|Noise Figure&lt;br /&gt;
|5dB to 7dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum instantaneous real-time bandwidth&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&lt;br /&gt;
|160MHz&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; The output power resulting from the gain setting varies over the frequency band and among&lt;br /&gt;
devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;The received signal amplitude resulting from the gain setting varies over the frequency band and&lt;br /&gt;
among devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;The USRP-2974 receiver path has 84 MHz of bandwidth for center frequencies from 10 MHz to&lt;br /&gt;
500 MHz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' As mentioned earlier, the USRP-2974 incorporates 2 UBX-160 daughterboards. Therefore, for more information on RF performance, please see the [https://kb.ettus.com/UBX UBX hardware resource] page&lt;br /&gt;
&lt;br /&gt;
==Hardware Specifications==&lt;br /&gt;
===USRP Hardware Driver (UHD) version===&lt;br /&gt;
* Minimum version of UHD required: '''3.15.0'''&lt;br /&gt;
&lt;br /&gt;
===Clocking and Sampling Rates===&lt;br /&gt;
There are two master clock rates (MCR) supported on the USRP-2974 like on the X310: 200.0 MHz and 184.32 MHz.&lt;br /&gt;
&lt;br /&gt;
The sampling rate must be an integer decimation rate of the MCR. Ideally, this decimation factor should be an even number. An odd decimation factor will result in additional unwanted attenuation (roll-off from the CIC filter in the DUC and DDC blocks in the FPGA). The valid decimation rates are between 1 and 1024.&lt;br /&gt;
&lt;br /&gt;
For the MCR of 200.0 MHz, the achievable sampling rates using an even decimation factor are 200.0, 100.0, 50.0, 33.33, 25.0, 20.0, 16.67, 14.286 Msps, ... 195.31 Ksps.&lt;br /&gt;
&lt;br /&gt;
For the MCR of 184.32 MHz, the achievable sampling rates using an even decimation factor are 184.32, 92.16, 46.08, 30.72, 23.04, 18.432, 15.36, 13.166 Msps, ... 180.0 Ksps.&lt;br /&gt;
&lt;br /&gt;
If the desired sampling rate is not directly supported by the hardware, then it will be necessary to re-sample in software. This can be done in C++ using libraries such as Liquid DSP [https://github.com/jgaeddert/liquid-dsp], or can be done in GNU Radio, in which there are three blocks that perform sampling rate conversion.&lt;br /&gt;
&lt;br /&gt;
==Physical Specifications==&lt;br /&gt;
&lt;br /&gt;
===Dimensions===&lt;br /&gt;
(L × W × H) 29.08 cm × 21.84 cm × 7.98 cm (11.45 in. × 8.60 in. × 3.14 in. )&lt;br /&gt;
&lt;br /&gt;
===Weight===&lt;br /&gt;
3.34 kg (7.35 lb)&lt;br /&gt;
&lt;br /&gt;
==Power==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|Voltage range&lt;br /&gt;
|14.25 V to 15.75 V DC&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Current&lt;br /&gt;
|10 A, maximum&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Power&lt;br /&gt;
|150 W, maximum&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' Indoor use only&lt;br /&gt;
&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* 0 °C to 50 °C&lt;br /&gt;
&lt;br /&gt;
===Maximum altitude===&lt;br /&gt;
* 2,000 m (800 mbar) (at 25 °C ambient temperature)&lt;br /&gt;
&lt;br /&gt;
===Operating Humidity Range===&lt;br /&gt;
* 10% to 90% non-condensing&lt;br /&gt;
&lt;br /&gt;
===Pollution Degree===&lt;br /&gt;
* 2&lt;br /&gt;
&lt;br /&gt;
==System Diagram and Schematics==&lt;br /&gt;
&lt;br /&gt;
===System Block Diagram===&lt;br /&gt;
[[file:2974_blk_dia.png |800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.ni.com/documentation/en/usrp-software-defined-radio-stand-alone-device/latest/usrp-2974/block-diagram/ System Block Diagram]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schematics===&lt;br /&gt;
Because the USRP-2974 is a combination of an Intel i7 SOM and an X310 USRP, a user can reference the X310 Schematics.&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/schematics/x300/x3xx.pdf X310 Schematics]&lt;br /&gt;
&lt;br /&gt;
==Key Component Datasheets==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%&amp;quot;&lt;br /&gt;
!Part Number&lt;br /&gt;
!Description&lt;br /&gt;
!Schematic ID (Page)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.congatec.com/fileadmin/user_upload/Documents/Datasheets/conga-TS170.pdf conga-TS170]&lt;br /&gt;
|System on Module (SoM)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.xilinx.com/support/documentation/data_sheets/ds180_7Series_Overview.pdf XC7K410T]&lt;br /&gt;
|FPGA&lt;br /&gt;
|U23 (3,5,8,9,10,18)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/AD9146.PDF AD9146]&lt;br /&gt;
|Dual Channel, 16-Bit, 1230 MSPS DAC&lt;br /&gt;
|U12, U36 (7)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/slas635b/slas635b.pdf ADS62P48]&lt;br /&gt;
|Dual Channel, 14-Bit 210 MSPS ADC&lt;br /&gt;
|U11, U35 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.onsemi.com/pub/Collateral/FIN1002-D.pdf FIN1002]&lt;br /&gt;
|High Speed Differential Receiver&lt;br /&gt;
|U3, U5, U31, U32 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/20001203U.pdf 24LC256T]&lt;br /&gt;
|EEPROM&lt;br /&gt;
|U530 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/lmk04816.pdf LMK04816BISQ/NOPB_1/3]&lt;br /&gt;
|Jitter Cleaner With Dual Loop PLLs&lt;br /&gt;
|U531 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/sy89547l.pdf SY89547LMGTR]&lt;br /&gt;
|Multiplexer&lt;br /&gt;
|U506 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/sn74aup1t17.pdf SN74AUP1T17]&lt;br /&gt;
|Single Schmitt-Trigger Buffer Gate&lt;br /&gt;
|U6, U519 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps54620.pdf TPS54620RGYT]&lt;br /&gt;
|Synchronous Step Down SWIFT™ Converter&lt;br /&gt;
|U515 (21); U516 (26)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/1764fb.pdf LT1764EQ-3.3]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U27 (21); U516 (26)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps7a47.pdf TPS7A47]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U28, U532 (21)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/3603fc.pdf LTC3603EUF_TRPBF]&lt;br /&gt;
|Monolithic Synchronous Step-Down Regulator&lt;br /&gt;
|U517 (23); U500 (25); U514, U513 (27)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/product/TPS77625-EP?keyMatch=TPS77625&amp;amp;tisearch=Search-EN-Everything TPS77625]&lt;br /&gt;
|Low-Dropout Voltage Regulators&lt;br /&gt;
|U30 (23)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps79318-ep.pdf TPS79318_SM]&lt;br /&gt;
|Low-Dropout Voltage Regulators&lt;br /&gt;
|U510 (27)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Media:agile9598503.pdf|OSC-96MHZ-724821-01]]&lt;br /&gt;
|Voltage Controlled Crystal Oscillator&lt;br /&gt;
|U25 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==FPGA and Baseband==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|FPGA &lt;br /&gt;
|Kintex-7 XC7K410T&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|DRAM &lt;br /&gt;
|1 GB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Baseband analog-to-digital converter&lt;br /&gt;
(ADC) resolution&lt;br /&gt;
|14 bit&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Baseband digital-to-analog converter&lt;br /&gt;
(DAC) resolution&lt;br /&gt;
|16 bit&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|ADC spurious-free dynamic range (sFDR)&lt;br /&gt;
|88 dB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|DAC sFDR&lt;br /&gt;
|80 dB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Maximum I/Q sample rate&lt;br /&gt;
|200 MS/s&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SFP+&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &lt;br /&gt;
|High speed serial link to one of the FPGA&lt;br /&gt;
GTX transceivers&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;Can be bypassed to the SoM if using the 10 GbE as protocol.&lt;br /&gt;
&lt;br /&gt;
===FPGA User Modifications===&lt;br /&gt;
&lt;br /&gt;
The Verilog code for the FPGA in the NI USRP-2974 is open-source, and users are free to modify and customize it for their needs. However, certain modifications may result in either bricking the device, or even in physical damage to the unit. Specifically, changing the I/O interface of the FPGA in any way (do not remove any of the I/O for the PCIe interface, such as &amp;lt;code&amp;gt;x300_pcie_int&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;LvFpga_Chinch_Interface&amp;lt;/code&amp;gt;), or modifying the pin and timing constraint files, could result in physical damage to other components on the motherboard, external to the FPGA, and doing this will void the warranty. Also, even if the PCIe interface is not being used, you cannot remove or reassign these pins in the constraint file. The constraint files should not be modified. Please note that modifications to the FPGA are made at the risk of the user, and may not be covered by the warranty of the device.&lt;br /&gt;
&lt;br /&gt;
==Interfaces and Connectivity==&lt;br /&gt;
Follow the links below for additional information on configuring each interface for the USRP-2974.&lt;br /&gt;
&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_10gige Dual 10 Gigabit Ethernet] - 200 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_pcie PCIe Express (Desktop)] - 200 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_1gige 1 Gigabit Ethernet] - 25 MS/s Full Duplex @ 16-bit&lt;br /&gt;
&lt;br /&gt;
===Front Panel===&lt;br /&gt;
&lt;br /&gt;
[[File:USRP-2974 Front Panel.jpg|800px]]&lt;br /&gt;
[[File:2974_frt_wireframe.png|800px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Connector&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''Use'''&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RF 0&lt;br /&gt;
|TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|Input and output terminal for the RF signal. TX1 RX1 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input or output channel.&lt;br /&gt;
|-&lt;br /&gt;
|RX2&lt;br /&gt;
|Input terminal for the RF signal. RX2 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | AUX I/O&lt;br /&gt;
|General-purpose I/O (GPIO) port. AUX I/O is controlled by the FPGA.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RF 1&lt;br /&gt;
|TX1&amp;lt;p&amp;gt;RX1&amp;lt;/p&amp;gt;&lt;br /&gt;
|Input and output terminal for the RF signal. TX1 RX1 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input or output channel.&lt;br /&gt;
|-&lt;br /&gt;
|RX2&lt;br /&gt;
|Input terminal for the RF signal. RX2 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | DP&lt;br /&gt;
|DisplayPort connector to connect one monitor for your controller.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | USB2.0&lt;br /&gt;
|USB ports that support common USB peripheral devices such as flash drives, hard drives, keyboards, and mice.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | USB3.0&lt;br /&gt;
|USB ports that support common USB peripheral devices such as flash drives, hard drives, keyboards, and mice.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G ETH&lt;br /&gt;
|RJ45 port used for 1G ETH connectivity to other ethernet devices.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | μUSB&lt;br /&gt;
|USB port used for UART connectivity to the controller.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 0&lt;br /&gt;
|SFP+ port used for 10G ETH connectivity to other ethernet devices. Connects to the embedded Linux computer for communication with LabVIEW RT.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 1&lt;br /&gt;
|SFP+ port used for 1G/10G ETH connectivity to other ethernet devices. Connects to the FPGA. Not currently supported in LabVIEW Communications System Design Suite.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''LED'''&lt;br /&gt;
!'''Description'''&lt;br /&gt;
!'''Color'''&lt;br /&gt;
!'''State'''&lt;br /&gt;
!'''Indication'''&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;5&amp;quot; | RF 0&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | TX1&amp;lt;p&amp;gt;RX1&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates thetransmit status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not active.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is transmitting data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RX2&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the receive status of the device.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot;| REF&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates the status of the reference signal.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no reference signal, or the device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; |Green&lt;br /&gt;
|Blinking&lt;br /&gt;
|The device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| PPS&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the pulse per second (PPS).&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no PPS timing reference signal, or the device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Blinking&lt;br /&gt;
|The device is locked to the PPS timing reference signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| GPS&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates whether the GPSDO is locked.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no GPSDO or the GPSDO is not locked.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The GPSDO is locked.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;5&amp;quot; | RF 1&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | TX1&amp;lt;p&amp;gt;RX1&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates thetransmit status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not active.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is transmitting data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RX2&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the receive status of the device.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| Status&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device initialized successfully and is ready for use.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Blinking&lt;br /&gt;
|Hardware error. An internal power supply has failed. Check front-panel I/O connections for shorts. Remove any shorts and cycle power to the USRP-2974. Contact NI if the problem persists.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| PWR&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the power status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is powered off.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The devices is powered on.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot; | 10/100/1000&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot;| Indicates the speed of the Gigabit Ethernet link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|No link, or 10 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|100 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
|Amber&lt;br /&gt;
|Solid&lt;br /&gt;
|1,000 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot;| ACT/LINK	&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Indicates the Gigabit Ethernet link activity or status.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|No link has been established.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Green&lt;br /&gt;
|Solid&lt;br /&gt;
|A link has been negotiated.&lt;br /&gt;
|-&lt;br /&gt;
|Blinking&lt;br /&gt;
|Activity on the link.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; | 1G/10G ETH 0&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | ACT/LINK&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Indicates the status of the SFP+ port.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The link is down.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The link is up.&lt;br /&gt;
|-&lt;br /&gt;
|Blinking&lt;br /&gt;
|The link is active (transmitting and receiving).&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |10GbE&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Indicates the status of the 10G ETH link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The 10G ETH link is down.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The 10G ETH link is up.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 1 10GbE&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Indicates the status of the 10G ETH link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The 10G ETH link is down.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The 10G ETH link is up.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Rear Panel===&lt;br /&gt;
[[File:USRP-2974 Rear Panel.jpg|800px]]&lt;br /&gt;
[[File:2974_back_wireframe.png|800px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Connector&lt;br /&gt;
!Use&lt;br /&gt;
|-&lt;br /&gt;
|REF OUT&lt;br /&gt;
|Output terminal for an external reference signal for the LO on the device. REF OUT is an SMA (f) connector with an impedance of 50 Ω, and it is a single-ended reference output. The output signal at this connector is 10 MHz at 3.3 V.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|REF IN&lt;br /&gt;
|Input terminal for an external reference signal for the LO on the device. REF IN is an SMA (f) connector with an impedance of 50 Ω, and it is a single-ended reference input. REF IN accepts a 10 MHz signal with a minimum input power of 0 dBm (0.632 Vpk-pk) and a maximum input power of 15 dBm (3.56 Vpk-pk) for a square wave or sine wave.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PPS TRIG OUT	&lt;br /&gt;
|Output terminal for the PPS timing reference. PPS TRIG OUT is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input. The output signal is 0 V to 3.3 V TTL. You can also use this port as a triggered output (TRIG OUT) that you program with the PPS Trig Out I/O signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PPS TRIG IN	&lt;br /&gt;
|Input terminal for PPS timing reference. PPS TRIG IN is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel. PPS TRIG IN accepts 0 V to 3.3 V TTL and 0 V to 5 V TTL signals. You can also use this port as a triggered input (TRIG IN) that you control using NI-USRP software.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|GPS ANT	&lt;br /&gt;
|Input terminal for the GPS antenna signal. GPS ANT is an SMA (f) connector with a maximum input power of -15 dBm and an output of DC 5 V to power an active antenna. &amp;lt;p&amp;gt; '''Notice:''' Do not terminate the GPS ANT port if you do not use it.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PCIe x4	&lt;br /&gt;
|Port for a PCI Express Generation 2, x4 bus connection through an MXI Express four-lane cable. Can be used to connect an external USRP device or external chassis.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SYSTEM POWER IN	&lt;br /&gt;
|Input that accepts a 15 V ± 5%, 10 A external DC power connector.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Ref Clock - 10 MHz===&lt;br /&gt;
Using an external 10 MHz reference clock, a square wave will offer the best phase noise performance, but a sinusoid is acceptable. The power level of the reference clock cannot exceed +15 dBm.&lt;br /&gt;
&lt;br /&gt;
===PPS - Pulse Per Second===&lt;br /&gt;
Using a PPS signal for timestamp synchronization requires a square wave signal with the following a 5Vpp amplitude.&lt;br /&gt;
&lt;br /&gt;
To test the PPS input, you can use the following tool from the UHD examples:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;args&amp;gt;&amp;lt;/code&amp;gt; are device address arguments (optional if only one USRP device is on your machine)&lt;br /&gt;
&lt;br /&gt;
    cd &amp;lt;install-path&amp;gt;/lib/uhd/examples ./test_pps_input –args=&amp;lt;args&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Front Panel GPIO===&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;width:50%&amp;quot; |&lt;br /&gt;
The GPIO port is not meant to drive big loads. You should not try to source more than 5mA per pin.&lt;br /&gt;
&lt;br /&gt;
The +3.3V is for ESD clamping purposes only and not designed to deliver high currents.&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | [[File:x3x0 gpio conn.png]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Power on state====&lt;br /&gt;
The hardware power on state and UHD initial state for the front-panel GPIOs is high-Z. For the X3xx, there are no external pull-ups/pull-downs for the GPIO pins, but the FPGAs do have them and they are configured as follows: X3xx: pull-down.&lt;br /&gt;
&lt;br /&gt;
====Pin Mapping====&lt;br /&gt;
* Pin 1: +3.3V&lt;br /&gt;
* Pin 2: Data[0]&lt;br /&gt;
* Pin 3: Data[1]&lt;br /&gt;
* Pin 4: Data[2]&lt;br /&gt;
* Pin 5: Data[3]&lt;br /&gt;
* Pin 6: Data[4]&lt;br /&gt;
* Pin 7: Data[5]&lt;br /&gt;
* Pin 8: Data[6]&lt;br /&gt;
* Pin 9: Data[7]&lt;br /&gt;
* Pin 10: Data[8]&lt;br /&gt;
* Pin 11: Data[9]&lt;br /&gt;
* Pin 12: Data[10]&lt;br /&gt;
* Pin 13: Data[11]&lt;br /&gt;
* Pin 14: 0V&lt;br /&gt;
* Pin 15: 0V&lt;br /&gt;
&lt;br /&gt;
'''Note''': Please see the [http://files.ettus.com/manual/page_gpio_api.html E3x0/X3x0 GPIO API] for information on configuring and using the GPIO bus.&lt;br /&gt;
&lt;br /&gt;
==Certifications==&lt;br /&gt;
===RoHS===&lt;br /&gt;
As of December 1st, 2010 all NI/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;
[http://files.ettus.com/manual/md_fpga.html FPGA Resources]&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/binaries/uhd_stable/ UHD Stable Binaries]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/EttusResearch/uhd UHD Source Code on Github]&lt;br /&gt;
&lt;br /&gt;
==Choosing an Interface==&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 provides three interface options – 1 Gigabit Ethernet (1 GigE), 10 Gigabit Ethernet (10 GigE), and PCI-Express (PCIe). The PCIe interface is always available regardless of what FPGA image is loaded. Ettus ships two FPGA image variants, the HG or HGS image which has one 1 GigE interfaces and one 10 GigE interfaces, and the XG image which has two 10 GigE interfaces. Generally, Ettus Research recommends using 10 GigE to achieve the maximum throughput available from the USRP-2974.  PCIe is recommended for applications that require the lowest possible latency, which is a desirable characteristic for PHY/MAC research.  If your application does not require the full bandwidth of the USRP-2974, the 1 GigE interface serves as a cost-effective fall-back option.  Ettus Research provides a complete interface kit for each of these options, which is also shown in the following table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|Interface Performance Summary&lt;br /&gt;
|-&lt;br /&gt;
!Interface&lt;br /&gt;
!Throughput (MS/s @ 16-bit)&lt;br /&gt;
!Target&lt;br /&gt;
!Recommended Kit&lt;br /&gt;
|-&lt;br /&gt;
|1 Gigabit&lt;br /&gt;
|25 MS/s&lt;br /&gt;
|Desktop/Laptop&lt;br /&gt;
|[https://www.ettus.com/product/details/1GIGE-KIT SFP Adapter + GigE Cable]&lt;br /&gt;
|-&lt;br /&gt;
|10 Gigabit&lt;br /&gt;
|200 MS/s&lt;br /&gt;
|Desktop&lt;br /&gt;
|[https://www.ettus.com/product/details/10GIGE-KIT 10 GigE Interface Kit]&lt;br /&gt;
|-&lt;br /&gt;
|PCI-Express &lt;br /&gt;
(PCIe, 4 lane)&lt;br /&gt;
|200 MS/S&lt;br /&gt;
|Desktop&lt;br /&gt;
|[https://www.ettus.com/product/details/PCIE-KIT PCI-Express Desktop Kit]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===10 Gigabit Ethernet===&lt;br /&gt;
In order to utilize the dual 10 Gigabit Ethernet interfaces, ensure the XG image is installed ([http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_load_fpga_imgs_fpga_flavours see FPGA Image Flavors]). In addition to burning the prerequisite FPGA image, it may also be necessary to tune the network interface card (NIC) to eliminate drops (Ds) and reduce overflows (Os). This is done by increasing the number of RX descriptors ([http://files.ettus.com/manual/page_transport.html#transport_udp_linux see Linux specific notes]).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;benchmark_rate&amp;lt;/code&amp;gt; tool can be used to test this capability. Run the following commands to test the X-series USRP over both 10 Gigabit Ethernet interfaces with the maximum rate of 200 Msps per channel:&lt;br /&gt;
&lt;br /&gt;
    cd &amp;lt;install-path&amp;gt;/lib/uhd/examples&lt;br /&gt;
    ./benchmark_rate --args=&amp;quot;type=x300,addr=&amp;lt;Primary IP&amp;gt;,second_addr=&amp;lt;secondary IP&amp;gt;&amp;quot; --channels=&amp;quot;0,1&amp;quot; --rx_rate 200e6&lt;br /&gt;
&lt;br /&gt;
The second interface is specified by the extra argument '''second_addr'''.&lt;br /&gt;
&lt;br /&gt;
'''Recommended 10 Gigabit Ethernet Cards'''&lt;br /&gt;
* Intel X520-DA2&lt;br /&gt;
** [http://ark.intel.com/products/39776/Intel-Ethernet-Converged-Network-Adapter-X520-DA2 Intel® Ethernet Converged Network Adapter X520-DA2]&lt;br /&gt;
* Intel X520-DA1&lt;br /&gt;
** [http://ark.intel.com/products/68669/Intel-Ethernet-Converged-Network-Adapter-X520-DA1 Intel® Ethernet Converged Network Adapter X520-DA1 ]&lt;br /&gt;
* Intel X710-DA2&lt;br /&gt;
** [http://ark.intel.com/products/83964/Intel-Ethernet-Converged-Network-Adapter-X710-DA2 Intel® Ethernet Converged Network Adapter X710-DA2 ]&lt;br /&gt;
* Intel X710-DA4&lt;br /&gt;
** [http://ark.intel.com/products/83965/Intel-Ethernet-Converged-Network-Adapter-X710-DA4 Intel® Ethernet Converged Network Adapter X710-DA4 ]&lt;br /&gt;
* Mellanox MCX4121A-ACAT&lt;br /&gt;
** [https://store.mellanox.com/products/mellanox-mcx4121a-acat-connectx-4-lx-en-network-interface-card-25gbe-dual-port-sfp28-pcie3-0-x8-rohs-r6.html Mellanox MCX4121A-ACAT ]&lt;br /&gt;
&lt;br /&gt;
==GPS Disciplined, Oven-Controlled Oscillator (GPSDO)==&lt;br /&gt;
The USRP-2794 has a high-accuracy GPS-disciplined oscillator (GPSDO).  The GPSDO improves the accuracy of the internal frequency reference to 20 ppb, or 0.1 ppb if the GPS is synchronized to the GPS constellation.  When synchronized to the GPS constellation, all USRP™ devices will also be synchronized in time within 50 ns.&lt;br /&gt;
&lt;br /&gt;
* Support GPSDO NMEA Strings&lt;br /&gt;
* [http://www.jackson-labs.com/assets/uploads/main/LC_XO_specsheet.pdf JacksonLabs LC_XO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
!Internal TCXO&lt;br /&gt;
!GPS-Disciplined Clock&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Reference&lt;br /&gt;
|TCXO&lt;br /&gt;
|OCXO&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Accuracy&lt;br /&gt;
|± 2.5ppm&lt;br /&gt;
± 2,500 Hz @ 1 GHz&lt;br /&gt;
|± 20 ppb&lt;br /&gt;
± 20 Hz @ 1 GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Accuracy&lt;br /&gt;
|&lt;br /&gt;
|± 0.01ppb&lt;br /&gt;
|-&lt;br /&gt;
|(GPS-Disciplined)&lt;br /&gt;
|&lt;br /&gt;
|~ ± 0.01 Hz @ 1 GHz&lt;br /&gt;
|-&lt;br /&gt;
|GPS Time Sync Accuracy&lt;br /&gt;
|&lt;br /&gt;
|±50ns to UTC Time**&lt;br /&gt;
|-&lt;br /&gt;
|10 MHz Reference Phase Drift with GPS Sync&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;±20ns After 1 Hour**&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Sensors===&lt;br /&gt;
You can query the lock status with the &amp;lt;code&amp;gt;gps_locked&amp;lt;/code&amp;gt; sensor, as well as obtain raw NMEA sentences using the &amp;lt;code&amp;gt;gps_gprmc&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;gps_gpgga&amp;lt;/code&amp;gt; sensors. Location information can be parsed out of the &amp;lt;code&amp;gt;gps_gpgga&amp;lt;/code&amp;gt; sensor by using &amp;lt;code&amp;gt;gpsd&amp;lt;/code&amp;gt; or another NMEA parser.&lt;br /&gt;
&lt;br /&gt;
==Option: Using the GPIO Expansion Kit==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top; width:60%&amp;quot;|This General Purpose Input/output (GPIO) breakout kit provides access to general purpose digital I/O signals with simple terminal blocks, and a prototyping area where wires and components can be soldered.  Each GPIO pin is connected to an FPGA digital line allowing it to be configured as an input, or an output, using the various software frameworks that support the USRP™ GPIO. &lt;br /&gt;
&lt;br /&gt;
These GPIO signals can serve the following functions:&lt;br /&gt;
&lt;br /&gt;
* Control of external devices, such as power amplifiers and RF switches&lt;br /&gt;
* Provide output signals that can help with debugging&lt;br /&gt;
* Provide observables to be analyzed by oscilloscopes or other external equipment&lt;br /&gt;
* Accept input from external devices for local, software-based triggering&lt;br /&gt;
* Implement a protocol line such as SPI or I2C&lt;br /&gt;
||[[File:Product_x3x0_gpio.jpg|250px]]&lt;br /&gt;
|}&lt;br /&gt;
===GPIO Expansion Kit Contents===&lt;br /&gt;
&lt;br /&gt;
*1 GPIO Breakout Board&lt;br /&gt;
*1 DB-15, 1-meter cable&lt;br /&gt;
*GPIO Quick Reference&lt;br /&gt;
&lt;br /&gt;
===Circuit Protection===&lt;br /&gt;
The GPIO signals exposed with this breakout kit are routed directly to the USRP device's FPGA with limited protection circuitry.  However, the user must take precautionary measures to ensure input/output signals meet the specifications shown in this document.  Over voltage, excess current draw, and other conditions can damage the USRP device and void the warranty. Special care should be taken when the USRP is powered off.&lt;br /&gt;
&lt;br /&gt;
===Mounting the GPIO Breakout Board===&lt;br /&gt;
The GPIO breakout board can be mounted directly to the DB15 connector of a USRP ™ device, or mounted remotely with the cable provided in this kit.  The screws on the DB15 connector of the breakout board must be removed to mount the board directly.  For remote mounting, the breakout board is supplied with rubber standoffs to avoid scratching surfaces, and several through-holes for hard mounting with screws or other hardware (not provided).&lt;br /&gt;
&lt;br /&gt;
===Using GPIO with UHD, GNU Radio, and other Third-Party Frameworks===&lt;br /&gt;
When used with UHD, or other third party frameworks that leverage UHD, the GPIO expansion can be controlled with simple API calls.  For more information, on the C++ API, and examples of how to use the GPIO in frameworks such as GNU Radio, please see the [[Application Notes]] section of the [https://kb.ettus.com Ettus Research Knowledge Base].&lt;br /&gt;
&lt;br /&gt;
===GPIO Specifications (3.3V Bank, LVCMOS)===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Parameter&lt;br /&gt;
!Typical&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Configured as Input&lt;br /&gt;
|-&lt;br /&gt;
|Default Voltage Standard&lt;br /&gt;
|3.3V LVCMOS&lt;br /&gt;
|-&lt;br /&gt;
|Voltage High Threshold&lt;br /&gt;
|2.0V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Low Threshold&lt;br /&gt;
|0.8V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Input Limits (no damage) &lt;br /&gt;
| -0.3V/3.45V&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Configured as Output&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Standard&lt;br /&gt;
|3.3V LVCMOS&lt;br /&gt;
|-&lt;br /&gt;
|Voltage High Output&lt;br /&gt;
|2.8V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Low Output&lt;br /&gt;
|0.4V&lt;br /&gt;
|-&lt;br /&gt;
|Current Source Capability&lt;br /&gt;
|12 mA&lt;br /&gt;
|-&lt;br /&gt;
|Output Source Impedance&lt;br /&gt;
|&amp;gt;33 ohms typical&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Option: Antenna Kit for GPSDO==&lt;br /&gt;
The GPSDO Mini Kit will improve the accuracy of the USRP reference clock, even if it does not receive signals from the GPS Constellation.  However, to achieve the best accuracy possible, and to achieve global timing alignment across multiple USRPs, Ettus Research recommends the GPSDO Mini Antenna Kit.&lt;br /&gt;
&lt;br /&gt;
==Option: Cables for MIMO Expansion==&lt;br /&gt;
Multiple USRP-2974s can be synchronized for coherent operation by sharing a common 10 MHz and 1 PPS signal.  We recommend using a star-distribution topology with an OctoClock or OctoClock-G, as seen in Figure 4.  This requires matched length cables to be used for both 10 MHz and 1 PPS.&lt;br /&gt;
&lt;br /&gt;
For more information about MIMO operation, please see the MIMO and Synchronization Application Note.&lt;br /&gt;
[[File:8mimo.png|700px|center]]&lt;br /&gt;
&amp;lt;center&amp;gt;Figure 4 - Star-Distribution of 10 MHz/PPS Signals with OctoClock&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
&lt;br /&gt;
* '''What is the bandwidth of the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
The ADC rate on each analog RX channel is 200 MS/s quadrature, which provides a theoretical analog bandwidth of approximately 80% of the Nyquist bandwidth of +/- 100 MHz (+/- 80 MHz around the center frequency).  The resulting maximum theoretical analog bandwidth is 160 MHz.&lt;br /&gt;
&lt;br /&gt;
FPGA Processing Bandwidth: Up to 200 MS/s quadrature.&lt;br /&gt;
&lt;br /&gt;
Host Bandwidth:  Up to 200 MS/s quadrature, dependent on selected interface&lt;br /&gt;
&lt;br /&gt;
For more information about achieving the maximum bandwidth with a USRP-2974, please see the &amp;quot;USRP X300/X310 Configuration Guide&amp;quot; or the &amp;quot;USRP System Bandwidth&amp;quot; application note.&lt;br /&gt;
&lt;br /&gt;
* '''How can I program the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
Like all other USRP models, the USRP-2974 is compatible with the USRP Hardware Driver™ (UHD) architecture.  The UHD architecture is a common driver that allows users to develop and execute applications on the onboard or host computer.  UHD provides a direct C++ API to control and stream to/from the USRP-2974.  It also provides compatibility with a variety of third-party software frameworks including GNU Radio, LabVIEW, and MATLAB.  You may also customize the FPGA image provided with UHD to integrate your own signal processing. For more information about UHD, and supported software frameworks, please see:&lt;br /&gt;
&lt;br /&gt;
http://files.ettus.com/manual/&lt;br /&gt;
&lt;br /&gt;
* '''How do I update the FPGA images and firmware with the latest from UHD'''&lt;br /&gt;
&lt;br /&gt;
You can find more information about updating the FPGA image through PCIe, 1/10 GigE, and JTAG [https://kb.ettus.com/X300/X310_Device_Recovery here].&lt;br /&gt;
&lt;br /&gt;
* '''How can I modify the FPGA of the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
The source code (Verilog) for the USRP-2794 is available in the UHD repository. The build process leverages the existing CMAKE build system used to compile the host-side driver.  A Linux-based setup will provide the best results.&lt;br /&gt;
&lt;br /&gt;
Which FPGA toolchain required to build the FPGA images will depend upon your version of UHD. For more details please see the [https://kb.ettus.com/UHD UHD] Software Resource page.&lt;br /&gt;
&lt;br /&gt;
* '''How much free space is available in the USRP-2974 FPGA'''&lt;br /&gt;
&lt;br /&gt;
Please see the [[#Utilization statistics]] section of this resources page for more information.&lt;br /&gt;
&lt;br /&gt;
* '''What frequency range does the USRP-2974 cover'''&lt;br /&gt;
&lt;br /&gt;
10MHz to 6GHz.&lt;br /&gt;
&lt;br /&gt;
* '''What components do I need to purchase for a complete USRP-2974 system'''&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 is a complete stand alone SDR. Additional components might include RF filters, antennas, RF power amplifiers or other RF components needed of a specific application.&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP-2974&amp;diff=4153</id>
		<title>USRP-2974</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=USRP-2974&amp;diff=4153"/>
				<updated>2019-06-01T15:04:10Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* Option: Using the GPIO Expansion Kit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The NI USRP-2974 is a high-performance, USRP software defined radio (SDR) stand-alone device for designing and deploying next generation wireless communications systems. The hardware architecture combines two extended-bandwidth daughterboard slots covering 10 MHz – 6 GHz with up to 160 MHz of baseband bandwidth, multiple high-speed interface options (PCIe, dual 10 GigE), an onboard Intel Core i7 processor, and a large user-programmable Kintex-7 FPGA in a convenient desktop or rack-mountable half-wide 2U form factor.&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 is the equivalent to a USRP X310 with two UBX-160 boards, a GPSDO and an onboard Intel i7 computer. The USRP-2974 comes with NI Linux RTOS pre-installed, but in order to use it with open-source tool-chain, a user will need to install Linux (preferably Fedora or Ubuntu) and then the USRP Hardware driver (UHD). After these have been installed, any other open-source tools can be installed, such as GNU Radio.&lt;br /&gt;
&lt;br /&gt;
== Key Features of the USRP-2974==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Intel Core i7 6822EQ 2GHz Quad CoreProcessor&lt;br /&gt;
* 16GB DDR4 Memory&lt;br /&gt;
* 512GB SSD&lt;br /&gt;
* USB-to-UART to the CPU&lt;br /&gt;
* Xilinx Kintex-7 XC7K410T FPGA&lt;br /&gt;
* 14 bit 200 MS/s ADC&lt;br /&gt;
* 16 bit 800 MS/s DAC&lt;br /&gt;
* Frequency range: 10 MHz - 6 GHz&lt;br /&gt;
* Up 160MHz&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; bandwidth per channel&lt;br /&gt;
* 2 Transmit ports&lt;br /&gt;
* 2 Receive ports&lt;br /&gt;
* GPSDO&lt;br /&gt;
* Multiple high-speed interfaces (Dual 10G, PCIe Express, 1G)&lt;br /&gt;
|[[File:USRP_2974_frt_dia.jpg|350px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Controller - Onboard computer ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|System on module (SoM) &lt;br /&gt;
|Congatec COM Express conga-TS170&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|CPU&lt;br /&gt;
|Intel Core i7 6822EQ (2 GHz Quad Core)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Memory &lt;br /&gt;
|SO-DIMM DDR4 16 GB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SFP+&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &lt;br /&gt;
|10G ETH connection to the SoM&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Cabled PCIe&lt;br /&gt;
|PCIe Gen 2 x4&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|MicroUSB&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|USB-to-UART to the SoM&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|RJ45&lt;br /&gt;
|1G ETH host connection&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; Can be bypassed to the FPGA.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; Device port for external host.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RF Specifications==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Transmitter&lt;br /&gt;
|-&lt;br /&gt;
|Number of channels&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Frequency range&lt;br /&gt;
|10MHz to 6GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency step&lt;br /&gt;
|&amp;lt;1kHz&lt;br /&gt;
|-&lt;br /&gt;
|Maximum output power&lt;br /&gt;
|5mW to 100mW (7dBm to 20dBm)&lt;br /&gt;
|-&lt;br /&gt;
|Gain range&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
|0dB to 31.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Gain step&lt;br /&gt;
|0.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum instantaneous real-time bandwidth&lt;br /&gt;
|160MHz&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Receiver&lt;br /&gt;
|-&lt;br /&gt;
|Number of channels&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Frequency range&lt;br /&gt;
|10MHz to 6GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency step&lt;br /&gt;
|&amp;lt;1kHz&lt;br /&gt;
|-&lt;br /&gt;
|Gain range&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|0dB to 37.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Gain step&lt;br /&gt;
|0.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum input power&lt;br /&gt;
|10dBm&lt;br /&gt;
|-&lt;br /&gt;
|Noise Figure&lt;br /&gt;
|5dB to 7dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum instantaneous real-time bandwidth&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&lt;br /&gt;
|160MHz&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; The output power resulting from the gain setting varies over the frequency band and among&lt;br /&gt;
devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;The received signal amplitude resulting from the gain setting varies over the frequency band and&lt;br /&gt;
among devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;The USRP-2974 receiver path has 84 MHz of bandwidth for center frequencies from 10 MHz to&lt;br /&gt;
500 MHz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' As mentioned earlier, the USRP-2974 incorporates 2 UBX-160 daughterboards. Therefore, for more information on RF performance, please see the [https://kb.ettus.com/UBX UBX hardware resource] page&lt;br /&gt;
&lt;br /&gt;
==Hardware Specifications==&lt;br /&gt;
===USRP Hardware Driver (UHD) version===&lt;br /&gt;
* Minimum version of UHD required: '''3.15.0'''&lt;br /&gt;
&lt;br /&gt;
===Clocking and Sampling Rates===&lt;br /&gt;
There are two master clock rates (MCR) supported on the USRP-2974 like on the X310: 200.0 MHz and 184.32 MHz.&lt;br /&gt;
&lt;br /&gt;
The sampling rate must be an integer decimation rate of the MCR. Ideally, this decimation factor should be an even number. An odd decimation factor will result in additional unwanted attenuation (roll-off from the CIC filter in the DUC and DDC blocks in the FPGA). The valid decimation rates are between 1 and 1024.&lt;br /&gt;
&lt;br /&gt;
For the MCR of 200.0 MHz, the achievable sampling rates using an even decimation factor are 200.0, 100.0, 50.0, 33.33, 25.0, 20.0, 16.67, 14.286 Msps, ... 195.31 Ksps.&lt;br /&gt;
&lt;br /&gt;
For the MCR of 184.32 MHz, the achievable sampling rates using an even decimation factor are 184.32, 92.16, 46.08, 30.72, 23.04, 18.432, 15.36, 13.166 Msps, ... 180.0 Ksps.&lt;br /&gt;
&lt;br /&gt;
If the desired sampling rate is not directly supported by the hardware, then it will be necessary to re-sample in software. This can be done in C++ using libraries such as Liquid DSP [https://github.com/jgaeddert/liquid-dsp], or can be done in GNU Radio, in which there are three blocks that perform sampling rate conversion.&lt;br /&gt;
&lt;br /&gt;
==Physical Specifications==&lt;br /&gt;
&lt;br /&gt;
===Dimensions===&lt;br /&gt;
(L × W × H) 29.08 cm × 21.84 cm × 7.98 cm (11.45 in. × 8.60 in. × 3.14 in. )&lt;br /&gt;
&lt;br /&gt;
===Weight===&lt;br /&gt;
3.34 kg (7.35 lb)&lt;br /&gt;
&lt;br /&gt;
==Power==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|Voltage range&lt;br /&gt;
|14.25 V to 15.75 V DC&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Current&lt;br /&gt;
|10 A, maximum&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Power&lt;br /&gt;
|150 W, maximum&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' Indoor use only&lt;br /&gt;
&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* 0 °C to 50 °C&lt;br /&gt;
&lt;br /&gt;
===Maximum altitude===&lt;br /&gt;
* 2,000 m (800 mbar) (at 25 °C ambient temperature)&lt;br /&gt;
&lt;br /&gt;
===Operating Humidity Range===&lt;br /&gt;
* 10% to 90% non-condensing&lt;br /&gt;
&lt;br /&gt;
===Pollution Degree===&lt;br /&gt;
* 2&lt;br /&gt;
&lt;br /&gt;
==System Diagram and Schematics==&lt;br /&gt;
&lt;br /&gt;
===System Block Diagram===&lt;br /&gt;
[[file:2974_blk_dia.png |800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.ni.com/documentation/en/usrp-software-defined-radio-stand-alone-device/latest/usrp-2974/block-diagram/ System Block Diagram]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schematics===&lt;br /&gt;
Because the USRP-2974 is a combination of an Intel i7 SOM and an X310 USRP, a user can reference the X310 Schematics.&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/schematics/x300/x3xx.pdf X310 Schematics]&lt;br /&gt;
&lt;br /&gt;
==Key Component Datasheets==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%&amp;quot;&lt;br /&gt;
!Part Number&lt;br /&gt;
!Description&lt;br /&gt;
!Schematic ID (Page)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.congatec.com/fileadmin/user_upload/Documents/Datasheets/conga-TS170.pdf conga-TS170]&lt;br /&gt;
|System on Module (SoM)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.xilinx.com/support/documentation/data_sheets/ds180_7Series_Overview.pdf XC7K410T]&lt;br /&gt;
|FPGA&lt;br /&gt;
|U23 (3,5,8,9,10,18)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/AD9146.PDF AD9146]&lt;br /&gt;
|Dual Channel, 16-Bit, 1230 MSPS DAC&lt;br /&gt;
|U12, U36 (7)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/slas635b/slas635b.pdf ADS62P48]&lt;br /&gt;
|Dual Channel, 14-Bit 210 MSPS ADC&lt;br /&gt;
|U11, U35 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.onsemi.com/pub/Collateral/FIN1002-D.pdf FIN1002]&lt;br /&gt;
|High Speed Differential Receiver&lt;br /&gt;
|U3, U5, U31, U32 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/20001203U.pdf 24LC256T]&lt;br /&gt;
|EEPROM&lt;br /&gt;
|U530 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/lmk04816.pdf LMK04816BISQ/NOPB_1/3]&lt;br /&gt;
|Jitter Cleaner With Dual Loop PLLs&lt;br /&gt;
|U531 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/sy89547l.pdf SY89547LMGTR]&lt;br /&gt;
|Multiplexer&lt;br /&gt;
|U506 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/sn74aup1t17.pdf SN74AUP1T17]&lt;br /&gt;
|Single Schmitt-Trigger Buffer Gate&lt;br /&gt;
|U6, U519 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps54620.pdf TPS54620RGYT]&lt;br /&gt;
|Synchronous Step Down SWIFT™ Converter&lt;br /&gt;
|U515 (21); U516 (26)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/1764fb.pdf LT1764EQ-3.3]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U27 (21); U516 (26)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps7a47.pdf TPS7A47]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U28, U532 (21)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/3603fc.pdf LTC3603EUF_TRPBF]&lt;br /&gt;
|Monolithic Synchronous Step-Down Regulator&lt;br /&gt;
|U517 (23); U500 (25); U514, U513 (27)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/product/TPS77625-EP?keyMatch=TPS77625&amp;amp;tisearch=Search-EN-Everything TPS77625]&lt;br /&gt;
|Low-Dropout Voltage Regulators&lt;br /&gt;
|U30 (23)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps79318-ep.pdf TPS79318_SM]&lt;br /&gt;
|Low-Dropout Voltage Regulators&lt;br /&gt;
|U510 (27)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Media:agile9598503.pdf|OSC-96MHZ-724821-01]]&lt;br /&gt;
|Voltage Controlled Crystal Oscillator&lt;br /&gt;
|U25 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==FPGA and Baseband==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|FPGA &lt;br /&gt;
|Kintex-7 XC7K410T&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|DRAM &lt;br /&gt;
|1 GB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Baseband analog-to-digital converter&lt;br /&gt;
(ADC) resolution&lt;br /&gt;
|14 bit&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Baseband digital-to-analog converter&lt;br /&gt;
(DAC) resolution&lt;br /&gt;
|16 bit&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|ADC spurious-free dynamic range (sFDR)&lt;br /&gt;
|88 dB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|DAC sFDR&lt;br /&gt;
|80 dB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Maximum I/Q sample rate&lt;br /&gt;
|200 MS/s&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SFP+&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &lt;br /&gt;
|High speed serial link to one of the FPGA&lt;br /&gt;
GTX transceivers&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;Can be bypassed to the SoM if using the 10 GbE as protocol.&lt;br /&gt;
&lt;br /&gt;
===FPGA User Modifications===&lt;br /&gt;
&lt;br /&gt;
The Verilog code for the FPGA in the NI USRP-2974 is open-source, and users are free to modify and customize it for their needs. However, certain modifications may result in either bricking the device, or even in physical damage to the unit. Specifically, changing the I/O interface of the FPGA in any way (do not remove any of the I/O for the PCIe interface, such as &amp;lt;code&amp;gt;x300_pcie_int&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;LvFpga_Chinch_Interface&amp;lt;/code&amp;gt;), or modifying the pin and timing constraint files, could result in physical damage to other components on the motherboard, external to the FPGA, and doing this will void the warranty. Also, even if the PCIe interface is not being used, you cannot remove or reassign these pins in the constraint file. The constraint files should not be modified. Please note that modifications to the FPGA are made at the risk of the user, and may not be covered by the warranty of the device.&lt;br /&gt;
&lt;br /&gt;
==Interfaces and Connectivity==&lt;br /&gt;
Follow the links below for additional information on configuring each interface for the USRP-2974.&lt;br /&gt;
&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_10gige Dual 10 Gigabit Ethernet] - 200 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_pcie PCIe Express (Desktop)] - 200 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_1gige 1 Gigabit Ethernet] - 25 MS/s Full Duplex @ 16-bit&lt;br /&gt;
&lt;br /&gt;
===Front Panel===&lt;br /&gt;
&lt;br /&gt;
[[File:USRP-2974 Front Panel.jpg|800px]]&lt;br /&gt;
[[File:2974_frt_wireframe.png|800px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Connector&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''Use'''&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RF 0&lt;br /&gt;
|TX1&amp;lt;p&amp;gt;RX1&lt;br /&gt;
|Input and output terminal for the RF signal. TX1 RX1 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input or output channel.&lt;br /&gt;
|-&lt;br /&gt;
|RX2&lt;br /&gt;
|Input terminal for the RF signal. RX2 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | AUX I/O&lt;br /&gt;
|General-purpose I/O (GPIO) port. AUX I/O is controlled by the FPGA.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RF 1&lt;br /&gt;
|TX1&amp;lt;p&amp;gt;RX1&lt;br /&gt;
|Input and output terminal for the RF signal. TX1 RX1 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input or output channel.&lt;br /&gt;
|-&lt;br /&gt;
|RX2&lt;br /&gt;
|Input terminal for the RF signal. RX2 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | DP&lt;br /&gt;
|DisplayPort connector to connect one monitor for your controller.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | USB2.0&lt;br /&gt;
|USB ports that support common USB peripheral devices such as flash drives, hard drives, keyboards, and mice.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | USB3.0&lt;br /&gt;
|USB ports that support common USB peripheral devices such as flash drives, hard drives, keyboards, and mice.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G ETH&lt;br /&gt;
|RJ45 port used for 1G ETH connectivity to other ethernet devices.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | μUSB&lt;br /&gt;
|USB port used for UART connectivity to the controller.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 0&lt;br /&gt;
|SFP+ port used for 10G ETH connectivity to other ethernet devices. Connects to the embedded Linux computer for communication with LabVIEW RT.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 1&lt;br /&gt;
|SFP+ port used for 1G/10G ETH connectivity to other ethernet devices. Connects to the FPGA. Not currently supported in LabVIEW Communications System Design Suite.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''LED'''&lt;br /&gt;
!'''Description'''&lt;br /&gt;
!'''Color'''&lt;br /&gt;
!'''State'''&lt;br /&gt;
!'''Indication'''&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;5&amp;quot; | RF 0&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | TX1&amp;lt;p&amp;gt;RX1&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates thetransmit status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not active.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is transmitting data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RX2&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the receive status of the device.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot;| REF&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates the status of the reference signal.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no reference signal, or the device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; |Green&lt;br /&gt;
|Blinking&lt;br /&gt;
|The device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| PPS&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the pulse per second (PPS).&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no PPS timing reference signal, or the device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Blinking&lt;br /&gt;
|The device is locked to the PPS timing reference signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| GPS&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates whether the GPSDO is locked.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no GPSDO or the GPSDO is not locked.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The GPSDO is locked.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;5&amp;quot; | RF 1&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | TX1&amp;lt;p&amp;gt;RX1&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates thetransmit status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not active.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is transmitting data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RX2&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the receive status of the device.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| Status&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device initialized successfully and is ready for use.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Blinking&lt;br /&gt;
|Hardware error. An internal power supply has failed. Check front-panel I/O connections for shorts. Remove any shorts and cycle power to the USRP-2974. Contact NI if the problem persists.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| PWR&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the power status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is powered off.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The devices is powered on.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot; | 10/100/1000&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot;| Indicates the speed of the Gigabit Ethernet link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|No link, or 10 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|100 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
|Amber&lt;br /&gt;
|Solid&lt;br /&gt;
|1,000 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot;| ACT/LINK	&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Indicates the Gigabit Ethernet link activity or status.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|No link has been established.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Green&lt;br /&gt;
|Solid&lt;br /&gt;
|A link has been negotiated.&lt;br /&gt;
|-&lt;br /&gt;
|Blinking&lt;br /&gt;
|Activity on the link.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; | 1G/10G ETH 0&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | ACT/LINK&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Indicates the status of the SFP+ port.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The link is down.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The link is up.&lt;br /&gt;
|-&lt;br /&gt;
|Blinking&lt;br /&gt;
|The link is active (transmitting and receiving).&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |10GbE&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Indicates the status of the 10G ETH link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The 10G ETH link is down.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The 10G ETH link is up.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 1 10GbE&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Indicates the status of the 10G ETH link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The 10G ETH link is down.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The 10G ETH link is up.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Rear Panel===&lt;br /&gt;
[[File:USRP-2974 Rear Panel.jpg|800px]]&lt;br /&gt;
[[File:2974_back_wireframe.png|800px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Connector&lt;br /&gt;
!Use&lt;br /&gt;
|-&lt;br /&gt;
|REF OUT&lt;br /&gt;
|Output terminal for an external reference signal for the LO on the device. REF OUT is an SMA (f) connector with an impedance of 50 Ω, and it is a single-ended reference output. The output signal at this connector is 10 MHz at 3.3 V.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|REF IN&lt;br /&gt;
|Input terminal for an external reference signal for the LO on the device. REF IN is an SMA (f) connector with an impedance of 50 Ω, and it is a single-ended reference input. REF IN accepts a 10 MHz signal with a minimum input power of 0 dBm (0.632 Vpk-pk) and a maximum input power of 15 dBm (3.56 Vpk-pk) for a square wave or sine wave.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PPS TRIG OUT	&lt;br /&gt;
|Output terminal for the PPS timing reference. PPS TRIG OUT is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input. The output signal is 0 V to 3.3 V TTL. You can also use this port as a triggered output (TRIG OUT) that you program with the PPS Trig Out I/O signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PPS TRIG IN	&lt;br /&gt;
|Input terminal for PPS timing reference. PPS TRIG IN is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel. PPS TRIG IN accepts 0 V to 3.3 V TTL and 0 V to 5 V TTL signals. You can also use this port as a triggered input (TRIG IN) that you control using NI-USRP software.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|GPS ANT	&lt;br /&gt;
|Input terminal for the GPS antenna signal. GPS ANT is an SMA (f) connector with a maximum input power of -15 dBm and an output of DC 5 V to power an active antenna. &amp;lt;p&amp;gt; '''Notice:''' Do not terminate the GPS ANT port if you do not use it.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PCIe x4	&lt;br /&gt;
|Port for a PCI Express Generation 2, x4 bus connection through an MXI Express four-lane cable. Can be used to connect an external USRP device or external chassis.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SYSTEM POWER IN	&lt;br /&gt;
|Input that accepts a 15 V ± 5%, 10 A external DC power connector.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Ref Clock - 10 MHz===&lt;br /&gt;
Using an external 10 MHz reference clock, a square wave will offer the best phase noise performance, but a sinusoid is acceptable. The power level of the reference clock cannot exceed +15 dBm.&lt;br /&gt;
&lt;br /&gt;
===PPS - Pulse Per Second===&lt;br /&gt;
Using a PPS signal for timestamp synchronization requires a square wave signal with the following a 5Vpp amplitude.&lt;br /&gt;
&lt;br /&gt;
To test the PPS input, you can use the following tool from the UHD examples:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;args&amp;gt;&amp;lt;/code&amp;gt; are device address arguments (optional if only one USRP device is on your machine)&lt;br /&gt;
&lt;br /&gt;
    cd &amp;lt;install-path&amp;gt;/lib/uhd/examples ./test_pps_input –args=&amp;lt;args&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Front Panel GPIO===&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;width:50%&amp;quot; |&lt;br /&gt;
The GPIO port is not meant to drive big loads. You should not try to source more than 5mA per pin.&lt;br /&gt;
&lt;br /&gt;
The +3.3V is for ESD clamping purposes only and not designed to deliver high currents.&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | [[File:x3x0 gpio conn.png]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Power on state====&lt;br /&gt;
The hardware power on state and UHD initial state for the front-panel GPIOs is high-Z. For the X3xx, there are no external pull-ups/pull-downs for the GPIO pins, but the FPGAs do have them and they are configured as follows: X3xx: pull-down.&lt;br /&gt;
&lt;br /&gt;
====Pin Mapping====&lt;br /&gt;
* Pin 1: +3.3V&lt;br /&gt;
* Pin 2: Data[0]&lt;br /&gt;
* Pin 3: Data[1]&lt;br /&gt;
* Pin 4: Data[2]&lt;br /&gt;
* Pin 5: Data[3]&lt;br /&gt;
* Pin 6: Data[4]&lt;br /&gt;
* Pin 7: Data[5]&lt;br /&gt;
* Pin 8: Data[6]&lt;br /&gt;
* Pin 9: Data[7]&lt;br /&gt;
* Pin 10: Data[8]&lt;br /&gt;
* Pin 11: Data[9]&lt;br /&gt;
* Pin 12: Data[10]&lt;br /&gt;
* Pin 13: Data[11]&lt;br /&gt;
* Pin 14: 0V&lt;br /&gt;
* Pin 15: 0V&lt;br /&gt;
&lt;br /&gt;
'''Note''': Please see the [http://files.ettus.com/manual/page_gpio_api.html E3x0/X3x0 GPIO API] for information on configuring and using the GPIO bus.&lt;br /&gt;
&lt;br /&gt;
==Certifications==&lt;br /&gt;
===RoHS===&lt;br /&gt;
As of December 1st, 2010 all NI/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;
[http://files.ettus.com/manual/md_fpga.html FPGA Resources]&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/binaries/uhd_stable/ UHD Stable Binaries]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/EttusResearch/uhd UHD Source Code on Github]&lt;br /&gt;
&lt;br /&gt;
==Choosing an Interface==&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 provides three interface options – 1 Gigabit Ethernet (1 GigE), 10 Gigabit Ethernet (10 GigE), and PCI-Express (PCIe). The PCIe interface is always available regardless of what FPGA image is loaded. Ettus ships two FPGA image variants, the HG or HGS image which has one 1 GigE interfaces and one 10 GigE interfaces, and the XG image which has two 10 GigE interfaces. Generally, Ettus Research recommends using 10 GigE to achieve the maximum throughput available from the USRP-2974.  PCIe is recommended for applications that require the lowest possible latency, which is a desirable characteristic for PHY/MAC research.  If your application does not require the full bandwidth of the USRP-2974, the 1 GigE interface serves as a cost-effective fall-back option.  Ettus Research provides a complete interface kit for each of these options, which is also shown in the following table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|Interface Performance Summary&lt;br /&gt;
|-&lt;br /&gt;
!Interface&lt;br /&gt;
!Throughput (MS/s @ 16-bit)&lt;br /&gt;
!Target&lt;br /&gt;
!Recommended Kit&lt;br /&gt;
|-&lt;br /&gt;
|1 Gigabit&lt;br /&gt;
|25 MS/s&lt;br /&gt;
|Desktop/Laptop&lt;br /&gt;
|[https://www.ettus.com/product/details/1GIGE-KIT SFP Adapter + GigE Cable]&lt;br /&gt;
|-&lt;br /&gt;
|10 Gigabit&lt;br /&gt;
|200 MS/s&lt;br /&gt;
|Desktop&lt;br /&gt;
|[https://www.ettus.com/product/details/10GIGE-KIT 10 GigE Interface Kit]&lt;br /&gt;
|-&lt;br /&gt;
|PCI-Express &lt;br /&gt;
(PCIe, 4 lane)&lt;br /&gt;
|200 MS/S&lt;br /&gt;
|Desktop&lt;br /&gt;
|[https://www.ettus.com/product/details/PCIE-KIT PCI-Express Desktop Kit]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===10 Gigabit Ethernet===&lt;br /&gt;
In order to utilize the dual 10 Gigabit Ethernet interfaces, ensure the XG image is installed ([http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_load_fpga_imgs_fpga_flavours see FPGA Image Flavors]). In addition to burning the prerequisite FPGA image, it may also be necessary to tune the network interface card (NIC) to eliminate drops (Ds) and reduce overflows (Os). This is done by increasing the number of RX descriptors ([http://files.ettus.com/manual/page_transport.html#transport_udp_linux see Linux specific notes]).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;benchmark_rate&amp;lt;/code&amp;gt; tool can be used to test this capability. Run the following commands to test the X-series USRP over both 10 Gigabit Ethernet interfaces with the maximum rate of 200 Msps per channel:&lt;br /&gt;
&lt;br /&gt;
    cd &amp;lt;install-path&amp;gt;/lib/uhd/examples&lt;br /&gt;
    ./benchmark_rate --args=&amp;quot;type=x300,addr=&amp;lt;Primary IP&amp;gt;,second_addr=&amp;lt;secondary IP&amp;gt;&amp;quot; --channels=&amp;quot;0,1&amp;quot; --rx_rate 200e6&lt;br /&gt;
&lt;br /&gt;
The second interface is specified by the extra argument '''second_addr'''.&lt;br /&gt;
&lt;br /&gt;
'''Recommended 10 Gigabit Ethernet Cards'''&lt;br /&gt;
* Intel X520-DA2&lt;br /&gt;
** [http://ark.intel.com/products/39776/Intel-Ethernet-Converged-Network-Adapter-X520-DA2 Intel® Ethernet Converged Network Adapter X520-DA2]&lt;br /&gt;
* Intel X520-DA1&lt;br /&gt;
** [http://ark.intel.com/products/68669/Intel-Ethernet-Converged-Network-Adapter-X520-DA1 Intel® Ethernet Converged Network Adapter X520-DA1 ]&lt;br /&gt;
* Intel X710-DA2&lt;br /&gt;
** [http://ark.intel.com/products/83964/Intel-Ethernet-Converged-Network-Adapter-X710-DA2 Intel® Ethernet Converged Network Adapter X710-DA2 ]&lt;br /&gt;
* Intel X710-DA4&lt;br /&gt;
** [http://ark.intel.com/products/83965/Intel-Ethernet-Converged-Network-Adapter-X710-DA4 Intel® Ethernet Converged Network Adapter X710-DA4 ]&lt;br /&gt;
* Mellanox MCX4121A-ACAT&lt;br /&gt;
** [https://store.mellanox.com/products/mellanox-mcx4121a-acat-connectx-4-lx-en-network-interface-card-25gbe-dual-port-sfp28-pcie3-0-x8-rohs-r6.html Mellanox MCX4121A-ACAT ]&lt;br /&gt;
&lt;br /&gt;
==GPS Disciplined, Oven-Controlled Oscillator (GPSDO)==&lt;br /&gt;
The USRP-2794 has a high-accuracy GPS-disciplined oscillator (GPSDO).  The GPSDO improves the accuracy of the internal frequency reference to 20 ppb, or 0.1 ppb if the GPS is synchronized to the GPS constellation.  When synchronized to the GPS constellation, all USRP™ devices will also be synchronized in time within 50 ns.&lt;br /&gt;
&lt;br /&gt;
* Support GPSDO NMEA Strings&lt;br /&gt;
* [http://www.jackson-labs.com/assets/uploads/main/LC_XO_specsheet.pdf JacksonLabs LC_XO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
!Internal TCXO&lt;br /&gt;
!GPS-Disciplined Clock&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Reference&lt;br /&gt;
|TCXO&lt;br /&gt;
|OCXO&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Accuracy&lt;br /&gt;
|± 2.5ppm&lt;br /&gt;
± 2,500 Hz @ 1 GHz&lt;br /&gt;
|± 20 ppb&lt;br /&gt;
± 20 Hz @ 1 GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Accuracy&lt;br /&gt;
|&lt;br /&gt;
|± 0.01ppb&lt;br /&gt;
|-&lt;br /&gt;
|(GPS-Disciplined)&lt;br /&gt;
|&lt;br /&gt;
|~ ± 0.01 Hz @ 1 GHz&lt;br /&gt;
|-&lt;br /&gt;
|GPS Time Sync Accuracy&lt;br /&gt;
|&lt;br /&gt;
|±50ns to UTC Time**&lt;br /&gt;
|-&lt;br /&gt;
|10 MHz Reference Phase Drift with GPS Sync&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;±20ns After 1 Hour**&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Sensors===&lt;br /&gt;
You can query the lock status with the &amp;lt;code&amp;gt;gps_locked&amp;lt;/code&amp;gt; sensor, as well as obtain raw NMEA sentences using the &amp;lt;code&amp;gt;gps_gprmc&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;gps_gpgga&amp;lt;/code&amp;gt; sensors. Location information can be parsed out of the &amp;lt;code&amp;gt;gps_gpgga&amp;lt;/code&amp;gt; sensor by using &amp;lt;code&amp;gt;gpsd&amp;lt;/code&amp;gt; or another NMEA parser.&lt;br /&gt;
&lt;br /&gt;
==Option: Using the GPIO Expansion Kit==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top; width:60%&amp;quot;|This General Purpose Input/output (GPIO) breakout kit provides access to general purpose digital I/O signals with simple terminal blocks, and a prototyping area where wires and components can be soldered.  Each GPIO pin is connected to an FPGA digital line allowing it to be configured as an input, or an output, using the various software frameworks that support the USRP™ GPIO. &lt;br /&gt;
&lt;br /&gt;
These GPIO signals can serve the following functions:&lt;br /&gt;
&lt;br /&gt;
* Control of external devices, such as power amplifiers and RF switches&lt;br /&gt;
* Provide output signals that can help with debugging&lt;br /&gt;
* Provide observables to be analyzed by oscilloscopes or other external equipment&lt;br /&gt;
* Accept input from external devices for local, software-based triggering&lt;br /&gt;
* Implement a protocol line such as SPI or I2C&lt;br /&gt;
||[[File:Product_x3x0_gpio.jpg|250px]]&lt;br /&gt;
|}&lt;br /&gt;
===GPIO Expansion Kit Contents===&lt;br /&gt;
&lt;br /&gt;
*1 GPIO Breakout Board&lt;br /&gt;
*1 DB-15, 1-meter cable&lt;br /&gt;
*GPIO Quick Reference&lt;br /&gt;
&lt;br /&gt;
===Circuit Protection===&lt;br /&gt;
The GPIO signals exposed with this breakout kit are routed directly to the USRP device's FPGA with limited protection circuitry.  However, the user must take precautionary measures to ensure input/output signals meet the specifications shown in this document.  Over voltage, excess current draw, and other conditions can damage the USRP device and void the warranty. Special care should be taken when the USRP is powered off.&lt;br /&gt;
&lt;br /&gt;
===Mounting the GPIO Breakout Board===&lt;br /&gt;
The GPIO breakout board can be mounted directly to the DB15 connector of a USRP ™ device, or mounted remotely with the cable provided in this kit.  The screws on the DB15 connector of the breakout board must be removed to mount the board directly.  For remote mounting, the breakout board is supplied with rubber standoffs to avoid scratching surfaces, and several through-holes for hard mounting with screws or other hardware (not provided).&lt;br /&gt;
&lt;br /&gt;
===Using GPIO with UHD, GNU Radio, and other Third-Party Frameworks===&lt;br /&gt;
When used with UHD, or other third party frameworks that leverage UHD, the GPIO expansion can be controlled with simple API calls.  For more information, on the C++ API, and examples of how to use the GPIO in frameworks such as GNU Radio, please see the [[Application Notes]] section of the [https://kb.ettus.com Ettus Research Knowledge Base].&lt;br /&gt;
&lt;br /&gt;
===GPIO Specifications (3.3V Bank, LVCMOS)===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Parameter&lt;br /&gt;
!Typical&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Configured as Input&lt;br /&gt;
|-&lt;br /&gt;
|Default Voltage Standard&lt;br /&gt;
|3.3V LVCMOS&lt;br /&gt;
|-&lt;br /&gt;
|Voltage High Threshold&lt;br /&gt;
|2.0V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Low Threshold&lt;br /&gt;
|0.8V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Input Limits (no damage) &lt;br /&gt;
| -0.3V/3.45V&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Configured as Output&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Standard&lt;br /&gt;
|3.3V LVCMOS&lt;br /&gt;
|-&lt;br /&gt;
|Voltage High Output&lt;br /&gt;
|2.8V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Low Output&lt;br /&gt;
|0.4V&lt;br /&gt;
|-&lt;br /&gt;
|Current Source Capability&lt;br /&gt;
|12 mA&lt;br /&gt;
|-&lt;br /&gt;
|Output Source Impedance&lt;br /&gt;
|&amp;gt;33 ohms typical&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Option: Antenna Kit for GPSDO==&lt;br /&gt;
The GPSDO Mini Kit will improve the accuracy of the USRP reference clock, even if it does not receive signals from the GPS Constellation.  However, to achieve the best accuracy possible, and to achieve global timing alignment across multiple USRPs, Ettus Research recommends the GPSDO Mini Antenna Kit.&lt;br /&gt;
&lt;br /&gt;
==Option: Cables for MIMO Expansion==&lt;br /&gt;
Multiple USRP-2974s can be synchronized for coherent operation by sharing a common 10 MHz and 1 PPS signal.  We recommend using a star-distribution topology with an OctoClock or OctoClock-G, as seen in Figure 4.  This requires matched length cables to be used for both 10 MHz and 1 PPS.&lt;br /&gt;
&lt;br /&gt;
For more information about MIMO operation, please see the MIMO and Synchronization Application Note.&lt;br /&gt;
[[File:8mimo.png|700px|center]]&lt;br /&gt;
&amp;lt;center&amp;gt;Figure 4 - Star-Distribution of 10 MHz/PPS Signals with OctoClock&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
&lt;br /&gt;
* '''What is the bandwidth of the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
The ADC rate on each analog RX channel is 200 MS/s quadrature, which provides a theoretical analog bandwidth of approximately 80% of the Nyquist bandwidth of +/- 100 MHz (+/- 80 MHz around the center frequency).  The resulting maximum theoretical analog bandwidth is 160 MHz.&lt;br /&gt;
&lt;br /&gt;
FPGA Processing Bandwidth: Up to 200 MS/s quadrature.&lt;br /&gt;
&lt;br /&gt;
Host Bandwidth:  Up to 200 MS/s quadrature, dependent on selected interface&lt;br /&gt;
&lt;br /&gt;
For more information about achieving the maximum bandwidth with a USRP-2974, please see the &amp;quot;USRP X300/X310 Configuration Guide&amp;quot; or the &amp;quot;USRP System Bandwidth&amp;quot; application note.&lt;br /&gt;
&lt;br /&gt;
* '''How can I program the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
Like all other USRP models, the USRP-2974 is compatible with the USRP Hardware Driver™ (UHD) architecture.  The UHD architecture is a common driver that allows users to develop and execute applications on the onboard or host computer.  UHD provides a direct C++ API to control and stream to/from the USRP-2974.  It also provides compatibility with a variety of third-party software frameworks including GNU Radio, LabVIEW, and MATLAB.  You may also customize the FPGA image provided with UHD to integrate your own signal processing. For more information about UHD, and supported software frameworks, please see:&lt;br /&gt;
&lt;br /&gt;
http://files.ettus.com/manual/&lt;br /&gt;
&lt;br /&gt;
* '''How do I update the FPGA images and firmware with the latest from UHD'''&lt;br /&gt;
&lt;br /&gt;
You can find more information about updating the FPGA image through PCIe, 1/10 GigE, and JTAG [https://kb.ettus.com/X300/X310_Device_Recovery here].&lt;br /&gt;
&lt;br /&gt;
* '''How can I modify the FPGA of the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
The source code (Verilog) for the USRP-2794 is available in the UHD repository. The build process leverages the existing CMAKE build system used to compile the host-side driver.  A Linux-based setup will provide the best results.&lt;br /&gt;
&lt;br /&gt;
Which FPGA toolchain required to build the FPGA images will depend upon your version of UHD. For more details please see the [https://kb.ettus.com/UHD UHD] Software Resource page.&lt;br /&gt;
&lt;br /&gt;
* '''How much free space is available in the USRP-2974 FPGA'''&lt;br /&gt;
&lt;br /&gt;
Please see the [[#Utilization statistics]] section of this resources page for more information.&lt;br /&gt;
&lt;br /&gt;
* '''What frequency range does the USRP-2974 cover'''&lt;br /&gt;
&lt;br /&gt;
10MHz to 6GHz.&lt;br /&gt;
&lt;br /&gt;
* '''What components do I need to purchase for a complete USRP-2974 system'''&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 is a complete stand alone SDR. Additional components might include RF filters, antennas, RF power amplifiers or other RF components needed of a specific application.&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP-2974&amp;diff=4152</id>
		<title>USRP-2974</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=USRP-2974&amp;diff=4152"/>
				<updated>2019-06-01T15:02:45Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* Controller - Onboard computer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The NI USRP-2974 is a high-performance, USRP software defined radio (SDR) stand-alone device for designing and deploying next generation wireless communications systems. The hardware architecture combines two extended-bandwidth daughterboard slots covering 10 MHz – 6 GHz with up to 160 MHz of baseband bandwidth, multiple high-speed interface options (PCIe, dual 10 GigE), an onboard Intel Core i7 processor, and a large user-programmable Kintex-7 FPGA in a convenient desktop or rack-mountable half-wide 2U form factor.&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 is the equivalent to a USRP X310 with two UBX-160 boards, a GPSDO and an onboard Intel i7 computer. The USRP-2974 comes with NI Linux RTOS pre-installed, but in order to use it with open-source tool-chain, a user will need to install Linux (preferably Fedora or Ubuntu) and then the USRP Hardware driver (UHD). After these have been installed, any other open-source tools can be installed, such as GNU Radio.&lt;br /&gt;
&lt;br /&gt;
== Key Features of the USRP-2974==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Intel Core i7 6822EQ 2GHz Quad CoreProcessor&lt;br /&gt;
* 16GB DDR4 Memory&lt;br /&gt;
* 512GB SSD&lt;br /&gt;
* USB-to-UART to the CPU&lt;br /&gt;
* Xilinx Kintex-7 XC7K410T FPGA&lt;br /&gt;
* 14 bit 200 MS/s ADC&lt;br /&gt;
* 16 bit 800 MS/s DAC&lt;br /&gt;
* Frequency range: 10 MHz - 6 GHz&lt;br /&gt;
* Up 160MHz&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; bandwidth per channel&lt;br /&gt;
* 2 Transmit ports&lt;br /&gt;
* 2 Receive ports&lt;br /&gt;
* GPSDO&lt;br /&gt;
* Multiple high-speed interfaces (Dual 10G, PCIe Express, 1G)&lt;br /&gt;
|[[File:USRP_2974_frt_dia.jpg|350px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Controller - Onboard computer ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|System on module (SoM) &lt;br /&gt;
|Congatec COM Express conga-TS170&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|CPU&lt;br /&gt;
|Intel Core i7 6822EQ (2 GHz Quad Core)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Memory &lt;br /&gt;
|SO-DIMM DDR4 16 GB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SFP+&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &lt;br /&gt;
|10G ETH connection to the SoM&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Cabled PCIe&lt;br /&gt;
|PCIe Gen 2 x4&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|MicroUSB&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|USB-to-UART to the SoM&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|RJ45&lt;br /&gt;
|1G ETH host connection&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; Can be bypassed to the FPGA.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; Device port for external host.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RF Specifications==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Transmitter&lt;br /&gt;
|-&lt;br /&gt;
|Number of channels&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Frequency range&lt;br /&gt;
|10MHz to 6GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency step&lt;br /&gt;
|&amp;lt;1kHz&lt;br /&gt;
|-&lt;br /&gt;
|Maximum output power&lt;br /&gt;
|5mW to 100mW (7dBm to 20dBm)&lt;br /&gt;
|-&lt;br /&gt;
|Gain range&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
|0dB to 31.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Gain step&lt;br /&gt;
|0.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum instantaneous real-time bandwidth&lt;br /&gt;
|160MHz&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Receiver&lt;br /&gt;
|-&lt;br /&gt;
|Number of channels&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Frequency range&lt;br /&gt;
|10MHz to 6GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency step&lt;br /&gt;
|&amp;lt;1kHz&lt;br /&gt;
|-&lt;br /&gt;
|Gain range&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|0dB to 37.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Gain step&lt;br /&gt;
|0.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum input power&lt;br /&gt;
|10dBm&lt;br /&gt;
|-&lt;br /&gt;
|Noise Figure&lt;br /&gt;
|5dB to 7dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum instantaneous real-time bandwidth&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&lt;br /&gt;
|160MHz&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; The output power resulting from the gain setting varies over the frequency band and among&lt;br /&gt;
devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;The received signal amplitude resulting from the gain setting varies over the frequency band and&lt;br /&gt;
among devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;The USRP-2974 receiver path has 84 MHz of bandwidth for center frequencies from 10 MHz to&lt;br /&gt;
500 MHz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' As mentioned earlier, the USRP-2974 incorporates 2 UBX-160 daughterboards. Therefore, for more information on RF performance, please see the [https://kb.ettus.com/UBX UBX hardware resource] page&lt;br /&gt;
&lt;br /&gt;
==Hardware Specifications==&lt;br /&gt;
===USRP Hardware Driver (UHD) version===&lt;br /&gt;
* Minimum version of UHD required: '''3.15.0'''&lt;br /&gt;
&lt;br /&gt;
===Clocking and Sampling Rates===&lt;br /&gt;
There are two master clock rates (MCR) supported on the USRP-2974 like on the X310: 200.0 MHz and 184.32 MHz.&lt;br /&gt;
&lt;br /&gt;
The sampling rate must be an integer decimation rate of the MCR. Ideally, this decimation factor should be an even number. An odd decimation factor will result in additional unwanted attenuation (roll-off from the CIC filter in the DUC and DDC blocks in the FPGA). The valid decimation rates are between 1 and 1024.&lt;br /&gt;
&lt;br /&gt;
For the MCR of 200.0 MHz, the achievable sampling rates using an even decimation factor are 200.0, 100.0, 50.0, 33.33, 25.0, 20.0, 16.67, 14.286 Msps, ... 195.31 Ksps.&lt;br /&gt;
&lt;br /&gt;
For the MCR of 184.32 MHz, the achievable sampling rates using an even decimation factor are 184.32, 92.16, 46.08, 30.72, 23.04, 18.432, 15.36, 13.166 Msps, ... 180.0 Ksps.&lt;br /&gt;
&lt;br /&gt;
If the desired sampling rate is not directly supported by the hardware, then it will be necessary to re-sample in software. This can be done in C++ using libraries such as Liquid DSP [https://github.com/jgaeddert/liquid-dsp], or can be done in GNU Radio, in which there are three blocks that perform sampling rate conversion.&lt;br /&gt;
&lt;br /&gt;
==Physical Specifications==&lt;br /&gt;
&lt;br /&gt;
===Dimensions===&lt;br /&gt;
(L × W × H) 29.08 cm × 21.84 cm × 7.98 cm (11.45 in. × 8.60 in. × 3.14 in. )&lt;br /&gt;
&lt;br /&gt;
===Weight===&lt;br /&gt;
3.34 kg (7.35 lb)&lt;br /&gt;
&lt;br /&gt;
==Power==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|Voltage range&lt;br /&gt;
|14.25 V to 15.75 V DC&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Current&lt;br /&gt;
|10 A, maximum&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Power&lt;br /&gt;
|150 W, maximum&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' Indoor use only&lt;br /&gt;
&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* 0 °C to 50 °C&lt;br /&gt;
&lt;br /&gt;
===Maximum altitude===&lt;br /&gt;
* 2,000 m (800 mbar) (at 25 °C ambient temperature)&lt;br /&gt;
&lt;br /&gt;
===Operating Humidity Range===&lt;br /&gt;
* 10% to 90% non-condensing&lt;br /&gt;
&lt;br /&gt;
===Pollution Degree===&lt;br /&gt;
* 2&lt;br /&gt;
&lt;br /&gt;
==System Diagram and Schematics==&lt;br /&gt;
&lt;br /&gt;
===System Block Diagram===&lt;br /&gt;
[[file:2974_blk_dia.png |800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.ni.com/documentation/en/usrp-software-defined-radio-stand-alone-device/latest/usrp-2974/block-diagram/ System Block Diagram]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schematics===&lt;br /&gt;
Because the USRP-2974 is a combination of an Intel i7 SOM and an X310 USRP, a user can reference the X310 Schematics.&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/schematics/x300/x3xx.pdf X310 Schematics]&lt;br /&gt;
&lt;br /&gt;
==Key Component Datasheets==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%&amp;quot;&lt;br /&gt;
!Part Number&lt;br /&gt;
!Description&lt;br /&gt;
!Schematic ID (Page)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.congatec.com/fileadmin/user_upload/Documents/Datasheets/conga-TS170.pdf conga-TS170]&lt;br /&gt;
|System on Module (SoM)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.xilinx.com/support/documentation/data_sheets/ds180_7Series_Overview.pdf XC7K410T]&lt;br /&gt;
|FPGA&lt;br /&gt;
|U23 (3,5,8,9,10,18)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/AD9146.PDF AD9146]&lt;br /&gt;
|Dual Channel, 16-Bit, 1230 MSPS DAC&lt;br /&gt;
|U12, U36 (7)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/slas635b/slas635b.pdf ADS62P48]&lt;br /&gt;
|Dual Channel, 14-Bit 210 MSPS ADC&lt;br /&gt;
|U11, U35 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.onsemi.com/pub/Collateral/FIN1002-D.pdf FIN1002]&lt;br /&gt;
|High Speed Differential Receiver&lt;br /&gt;
|U3, U5, U31, U32 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/20001203U.pdf 24LC256T]&lt;br /&gt;
|EEPROM&lt;br /&gt;
|U530 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/lmk04816.pdf LMK04816BISQ/NOPB_1/3]&lt;br /&gt;
|Jitter Cleaner With Dual Loop PLLs&lt;br /&gt;
|U531 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/sy89547l.pdf SY89547LMGTR]&lt;br /&gt;
|Multiplexer&lt;br /&gt;
|U506 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/sn74aup1t17.pdf SN74AUP1T17]&lt;br /&gt;
|Single Schmitt-Trigger Buffer Gate&lt;br /&gt;
|U6, U519 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps54620.pdf TPS54620RGYT]&lt;br /&gt;
|Synchronous Step Down SWIFT™ Converter&lt;br /&gt;
|U515 (21); U516 (26)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/1764fb.pdf LT1764EQ-3.3]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U27 (21); U516 (26)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps7a47.pdf TPS7A47]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U28, U532 (21)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/3603fc.pdf LTC3603EUF_TRPBF]&lt;br /&gt;
|Monolithic Synchronous Step-Down Regulator&lt;br /&gt;
|U517 (23); U500 (25); U514, U513 (27)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/product/TPS77625-EP?keyMatch=TPS77625&amp;amp;tisearch=Search-EN-Everything TPS77625]&lt;br /&gt;
|Low-Dropout Voltage Regulators&lt;br /&gt;
|U30 (23)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps79318-ep.pdf TPS79318_SM]&lt;br /&gt;
|Low-Dropout Voltage Regulators&lt;br /&gt;
|U510 (27)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Media:agile9598503.pdf|OSC-96MHZ-724821-01]]&lt;br /&gt;
|Voltage Controlled Crystal Oscillator&lt;br /&gt;
|U25 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==FPGA and Baseband==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|FPGA &lt;br /&gt;
|Kintex-7 XC7K410T&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|DRAM &lt;br /&gt;
|1 GB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Baseband analog-to-digital converter&lt;br /&gt;
(ADC) resolution&lt;br /&gt;
|14 bit&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Baseband digital-to-analog converter&lt;br /&gt;
(DAC) resolution&lt;br /&gt;
|16 bit&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|ADC spurious-free dynamic range (sFDR)&lt;br /&gt;
|88 dB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|DAC sFDR&lt;br /&gt;
|80 dB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Maximum I/Q sample rate&lt;br /&gt;
|200 MS/s&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SFP+&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &lt;br /&gt;
|High speed serial link to one of the FPGA&lt;br /&gt;
GTX transceivers&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;Can be bypassed to the SoM if using the 10 GbE as protocol.&lt;br /&gt;
&lt;br /&gt;
===FPGA User Modifications===&lt;br /&gt;
&lt;br /&gt;
The Verilog code for the FPGA in the NI USRP-2974 is open-source, and users are free to modify and customize it for their needs. However, certain modifications may result in either bricking the device, or even in physical damage to the unit. Specifically, changing the I/O interface of the FPGA in any way (do not remove any of the I/O for the PCIe interface, such as &amp;lt;code&amp;gt;x300_pcie_int&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;LvFpga_Chinch_Interface&amp;lt;/code&amp;gt;), or modifying the pin and timing constraint files, could result in physical damage to other components on the motherboard, external to the FPGA, and doing this will void the warranty. Also, even if the PCIe interface is not being used, you cannot remove or reassign these pins in the constraint file. The constraint files should not be modified. Please note that modifications to the FPGA are made at the risk of the user, and may not be covered by the warranty of the device.&lt;br /&gt;
&lt;br /&gt;
==Interfaces and Connectivity==&lt;br /&gt;
Follow the links below for additional information on configuring each interface for the USRP-2974.&lt;br /&gt;
&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_10gige Dual 10 Gigabit Ethernet] - 200 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_pcie PCIe Express (Desktop)] - 200 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_1gige 1 Gigabit Ethernet] - 25 MS/s Full Duplex @ 16-bit&lt;br /&gt;
&lt;br /&gt;
===Front Panel===&lt;br /&gt;
&lt;br /&gt;
[[File:USRP-2974 Front Panel.jpg|800px]]&lt;br /&gt;
[[File:2974_frt_wireframe.png|800px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Connector&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''Use'''&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RF 0&lt;br /&gt;
|TX1&amp;lt;p&amp;gt;RX1&lt;br /&gt;
|Input and output terminal for the RF signal. TX1 RX1 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input or output channel.&lt;br /&gt;
|-&lt;br /&gt;
|RX2&lt;br /&gt;
|Input terminal for the RF signal. RX2 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | AUX I/O&lt;br /&gt;
|General-purpose I/O (GPIO) port. AUX I/O is controlled by the FPGA.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RF 1&lt;br /&gt;
|TX1&amp;lt;p&amp;gt;RX1&lt;br /&gt;
|Input and output terminal for the RF signal. TX1 RX1 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input or output channel.&lt;br /&gt;
|-&lt;br /&gt;
|RX2&lt;br /&gt;
|Input terminal for the RF signal. RX2 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | DP&lt;br /&gt;
|DisplayPort connector to connect one monitor for your controller.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | USB2.0&lt;br /&gt;
|USB ports that support common USB peripheral devices such as flash drives, hard drives, keyboards, and mice.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | USB3.0&lt;br /&gt;
|USB ports that support common USB peripheral devices such as flash drives, hard drives, keyboards, and mice.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G ETH&lt;br /&gt;
|RJ45 port used for 1G ETH connectivity to other ethernet devices.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | μUSB&lt;br /&gt;
|USB port used for UART connectivity to the controller.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 0&lt;br /&gt;
|SFP+ port used for 10G ETH connectivity to other ethernet devices. Connects to the embedded Linux computer for communication with LabVIEW RT.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 1&lt;br /&gt;
|SFP+ port used for 1G/10G ETH connectivity to other ethernet devices. Connects to the FPGA. Not currently supported in LabVIEW Communications System Design Suite.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''LED'''&lt;br /&gt;
!'''Description'''&lt;br /&gt;
!'''Color'''&lt;br /&gt;
!'''State'''&lt;br /&gt;
!'''Indication'''&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;5&amp;quot; | RF 0&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | TX1&amp;lt;p&amp;gt;RX1&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates thetransmit status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not active.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is transmitting data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RX2&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the receive status of the device.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot;| REF&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates the status of the reference signal.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no reference signal, or the device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; |Green&lt;br /&gt;
|Blinking&lt;br /&gt;
|The device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| PPS&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the pulse per second (PPS).&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no PPS timing reference signal, or the device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Blinking&lt;br /&gt;
|The device is locked to the PPS timing reference signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| GPS&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates whether the GPSDO is locked.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no GPSDO or the GPSDO is not locked.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The GPSDO is locked.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;5&amp;quot; | RF 1&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | TX1&amp;lt;p&amp;gt;RX1&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates thetransmit status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not active.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is transmitting data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RX2&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the receive status of the device.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| Status&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device initialized successfully and is ready for use.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Blinking&lt;br /&gt;
|Hardware error. An internal power supply has failed. Check front-panel I/O connections for shorts. Remove any shorts and cycle power to the USRP-2974. Contact NI if the problem persists.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| PWR&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the power status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is powered off.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The devices is powered on.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot; | 10/100/1000&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot;| Indicates the speed of the Gigabit Ethernet link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|No link, or 10 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|100 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
|Amber&lt;br /&gt;
|Solid&lt;br /&gt;
|1,000 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot;| ACT/LINK	&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Indicates the Gigabit Ethernet link activity or status.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|No link has been established.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Green&lt;br /&gt;
|Solid&lt;br /&gt;
|A link has been negotiated.&lt;br /&gt;
|-&lt;br /&gt;
|Blinking&lt;br /&gt;
|Activity on the link.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; | 1G/10G ETH 0&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | ACT/LINK&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Indicates the status of the SFP+ port.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The link is down.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The link is up.&lt;br /&gt;
|-&lt;br /&gt;
|Blinking&lt;br /&gt;
|The link is active (transmitting and receiving).&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |10GbE&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Indicates the status of the 10G ETH link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The 10G ETH link is down.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The 10G ETH link is up.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 1 10GbE&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Indicates the status of the 10G ETH link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The 10G ETH link is down.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The 10G ETH link is up.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Rear Panel===&lt;br /&gt;
[[File:USRP-2974 Rear Panel.jpg|800px]]&lt;br /&gt;
[[File:2974_back_wireframe.png|800px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Connector&lt;br /&gt;
!Use&lt;br /&gt;
|-&lt;br /&gt;
|REF OUT&lt;br /&gt;
|Output terminal for an external reference signal for the LO on the device. REF OUT is an SMA (f) connector with an impedance of 50 Ω, and it is a single-ended reference output. The output signal at this connector is 10 MHz at 3.3 V.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|REF IN&lt;br /&gt;
|Input terminal for an external reference signal for the LO on the device. REF IN is an SMA (f) connector with an impedance of 50 Ω, and it is a single-ended reference input. REF IN accepts a 10 MHz signal with a minimum input power of 0 dBm (0.632 Vpk-pk) and a maximum input power of 15 dBm (3.56 Vpk-pk) for a square wave or sine wave.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PPS TRIG OUT	&lt;br /&gt;
|Output terminal for the PPS timing reference. PPS TRIG OUT is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input. The output signal is 0 V to 3.3 V TTL. You can also use this port as a triggered output (TRIG OUT) that you program with the PPS Trig Out I/O signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PPS TRIG IN	&lt;br /&gt;
|Input terminal for PPS timing reference. PPS TRIG IN is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel. PPS TRIG IN accepts 0 V to 3.3 V TTL and 0 V to 5 V TTL signals. You can also use this port as a triggered input (TRIG IN) that you control using NI-USRP software.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|GPS ANT	&lt;br /&gt;
|Input terminal for the GPS antenna signal. GPS ANT is an SMA (f) connector with a maximum input power of -15 dBm and an output of DC 5 V to power an active antenna. &amp;lt;p&amp;gt; '''Notice:''' Do not terminate the GPS ANT port if you do not use it.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PCIe x4	&lt;br /&gt;
|Port for a PCI Express Generation 2, x4 bus connection through an MXI Express four-lane cable. Can be used to connect an external USRP device or external chassis.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SYSTEM POWER IN	&lt;br /&gt;
|Input that accepts a 15 V ± 5%, 10 A external DC power connector.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Ref Clock - 10 MHz===&lt;br /&gt;
Using an external 10 MHz reference clock, a square wave will offer the best phase noise performance, but a sinusoid is acceptable. The power level of the reference clock cannot exceed +15 dBm.&lt;br /&gt;
&lt;br /&gt;
===PPS - Pulse Per Second===&lt;br /&gt;
Using a PPS signal for timestamp synchronization requires a square wave signal with the following a 5Vpp amplitude.&lt;br /&gt;
&lt;br /&gt;
To test the PPS input, you can use the following tool from the UHD examples:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;args&amp;gt;&amp;lt;/code&amp;gt; are device address arguments (optional if only one USRP device is on your machine)&lt;br /&gt;
&lt;br /&gt;
    cd &amp;lt;install-path&amp;gt;/lib/uhd/examples ./test_pps_input –args=&amp;lt;args&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Front Panel GPIO===&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;width:50%&amp;quot; |&lt;br /&gt;
The GPIO port is not meant to drive big loads. You should not try to source more than 5mA per pin.&lt;br /&gt;
&lt;br /&gt;
The +3.3V is for ESD clamping purposes only and not designed to deliver high currents.&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | [[File:x3x0 gpio conn.png]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Power on state====&lt;br /&gt;
The hardware power on state and UHD initial state for the front-panel GPIOs is high-Z. For the X3xx, there are no external pull-ups/pull-downs for the GPIO pins, but the FPGAs do have them and they are configured as follows: X3xx: pull-down.&lt;br /&gt;
&lt;br /&gt;
====Pin Mapping====&lt;br /&gt;
* Pin 1: +3.3V&lt;br /&gt;
* Pin 2: Data[0]&lt;br /&gt;
* Pin 3: Data[1]&lt;br /&gt;
* Pin 4: Data[2]&lt;br /&gt;
* Pin 5: Data[3]&lt;br /&gt;
* Pin 6: Data[4]&lt;br /&gt;
* Pin 7: Data[5]&lt;br /&gt;
* Pin 8: Data[6]&lt;br /&gt;
* Pin 9: Data[7]&lt;br /&gt;
* Pin 10: Data[8]&lt;br /&gt;
* Pin 11: Data[9]&lt;br /&gt;
* Pin 12: Data[10]&lt;br /&gt;
* Pin 13: Data[11]&lt;br /&gt;
* Pin 14: 0V&lt;br /&gt;
* Pin 15: 0V&lt;br /&gt;
&lt;br /&gt;
'''Note''': Please see the [http://files.ettus.com/manual/page_gpio_api.html E3x0/X3x0 GPIO API] for information on configuring and using the GPIO bus.&lt;br /&gt;
&lt;br /&gt;
==Certifications==&lt;br /&gt;
===RoHS===&lt;br /&gt;
As of December 1st, 2010 all NI/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;
[http://files.ettus.com/manual/md_fpga.html FPGA Resources]&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/binaries/uhd_stable/ UHD Stable Binaries]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/EttusResearch/uhd UHD Source Code on Github]&lt;br /&gt;
&lt;br /&gt;
==Choosing an Interface==&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 provides three interface options – 1 Gigabit Ethernet (1 GigE), 10 Gigabit Ethernet (10 GigE), and PCI-Express (PCIe). The PCIe interface is always available regardless of what FPGA image is loaded. Ettus ships two FPGA image variants, the HG or HGS image which has one 1 GigE interfaces and one 10 GigE interfaces, and the XG image which has two 10 GigE interfaces. Generally, Ettus Research recommends using 10 GigE to achieve the maximum throughput available from the USRP-2974.  PCIe is recommended for applications that require the lowest possible latency, which is a desirable characteristic for PHY/MAC research.  If your application does not require the full bandwidth of the USRP-2974, the 1 GigE interface serves as a cost-effective fall-back option.  Ettus Research provides a complete interface kit for each of these options, which is also shown in the following table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|Interface Performance Summary&lt;br /&gt;
|-&lt;br /&gt;
!Interface&lt;br /&gt;
!Throughput (MS/s @ 16-bit)&lt;br /&gt;
!Target&lt;br /&gt;
!Recommended Kit&lt;br /&gt;
|-&lt;br /&gt;
|1 Gigabit&lt;br /&gt;
|25 MS/s&lt;br /&gt;
|Desktop/Laptop&lt;br /&gt;
|[https://www.ettus.com/product/details/1GIGE-KIT SFP Adapter + GigE Cable]&lt;br /&gt;
|-&lt;br /&gt;
|10 Gigabit&lt;br /&gt;
|200 MS/s&lt;br /&gt;
|Desktop&lt;br /&gt;
|[https://www.ettus.com/product/details/10GIGE-KIT 10 GigE Interface Kit]&lt;br /&gt;
|-&lt;br /&gt;
|PCI-Express &lt;br /&gt;
(PCIe, 4 lane)&lt;br /&gt;
|200 MS/S&lt;br /&gt;
|Desktop&lt;br /&gt;
|[https://www.ettus.com/product/details/PCIE-KIT PCI-Express Desktop Kit]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===10 Gigabit Ethernet===&lt;br /&gt;
In order to utilize the dual 10 Gigabit Ethernet interfaces, ensure the XG image is installed ([http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_load_fpga_imgs_fpga_flavours see FPGA Image Flavors]). In addition to burning the prerequisite FPGA image, it may also be necessary to tune the network interface card (NIC) to eliminate drops (Ds) and reduce overflows (Os). This is done by increasing the number of RX descriptors ([http://files.ettus.com/manual/page_transport.html#transport_udp_linux see Linux specific notes]).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;benchmark_rate&amp;lt;/code&amp;gt; tool can be used to test this capability. Run the following commands to test the X-series USRP over both 10 Gigabit Ethernet interfaces with the maximum rate of 200 Msps per channel:&lt;br /&gt;
&lt;br /&gt;
    cd &amp;lt;install-path&amp;gt;/lib/uhd/examples&lt;br /&gt;
    ./benchmark_rate --args=&amp;quot;type=x300,addr=&amp;lt;Primary IP&amp;gt;,second_addr=&amp;lt;secondary IP&amp;gt;&amp;quot; --channels=&amp;quot;0,1&amp;quot; --rx_rate 200e6&lt;br /&gt;
&lt;br /&gt;
The second interface is specified by the extra argument '''second_addr'''.&lt;br /&gt;
&lt;br /&gt;
'''Recommended 10 Gigabit Ethernet Cards'''&lt;br /&gt;
* Intel X520-DA2&lt;br /&gt;
** [http://ark.intel.com/products/39776/Intel-Ethernet-Converged-Network-Adapter-X520-DA2 Intel® Ethernet Converged Network Adapter X520-DA2]&lt;br /&gt;
* Intel X520-DA1&lt;br /&gt;
** [http://ark.intel.com/products/68669/Intel-Ethernet-Converged-Network-Adapter-X520-DA1 Intel® Ethernet Converged Network Adapter X520-DA1 ]&lt;br /&gt;
* Intel X710-DA2&lt;br /&gt;
** [http://ark.intel.com/products/83964/Intel-Ethernet-Converged-Network-Adapter-X710-DA2 Intel® Ethernet Converged Network Adapter X710-DA2 ]&lt;br /&gt;
* Intel X710-DA4&lt;br /&gt;
** [http://ark.intel.com/products/83965/Intel-Ethernet-Converged-Network-Adapter-X710-DA4 Intel® Ethernet Converged Network Adapter X710-DA4 ]&lt;br /&gt;
* Mellanox MCX4121A-ACAT&lt;br /&gt;
** [https://store.mellanox.com/products/mellanox-mcx4121a-acat-connectx-4-lx-en-network-interface-card-25gbe-dual-port-sfp28-pcie3-0-x8-rohs-r6.html Mellanox MCX4121A-ACAT ]&lt;br /&gt;
&lt;br /&gt;
==GPS Disciplined, Oven-Controlled Oscillator (GPSDO)==&lt;br /&gt;
The USRP-2794 has a high-accuracy GPS-disciplined oscillator (GPSDO).  The GPSDO improves the accuracy of the internal frequency reference to 20 ppb, or 0.1 ppb if the GPS is synchronized to the GPS constellation.  When synchronized to the GPS constellation, all USRP™ devices will also be synchronized in time within 50 ns.&lt;br /&gt;
&lt;br /&gt;
* Support GPSDO NMEA Strings&lt;br /&gt;
* [http://www.jackson-labs.com/assets/uploads/main/LC_XO_specsheet.pdf JacksonLabs LC_XO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
!Internal TCXO&lt;br /&gt;
!GPS-Disciplined Clock&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Reference&lt;br /&gt;
|TCXO&lt;br /&gt;
|OCXO&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Accuracy&lt;br /&gt;
|± 2.5ppm&lt;br /&gt;
± 2,500 Hz @ 1 GHz&lt;br /&gt;
|± 20 ppb&lt;br /&gt;
± 20 Hz @ 1 GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Accuracy&lt;br /&gt;
|&lt;br /&gt;
|± 0.01ppb&lt;br /&gt;
|-&lt;br /&gt;
|(GPS-Disciplined)&lt;br /&gt;
|&lt;br /&gt;
|~ ± 0.01 Hz @ 1 GHz&lt;br /&gt;
|-&lt;br /&gt;
|GPS Time Sync Accuracy&lt;br /&gt;
|&lt;br /&gt;
|±50ns to UTC Time**&lt;br /&gt;
|-&lt;br /&gt;
|10 MHz Reference Phase Drift with GPS Sync&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;±20ns After 1 Hour**&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Sensors===&lt;br /&gt;
You can query the lock status with the &amp;lt;code&amp;gt;gps_locked&amp;lt;/code&amp;gt; sensor, as well as obtain raw NMEA sentences using the &amp;lt;code&amp;gt;gps_gprmc&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;gps_gpgga&amp;lt;/code&amp;gt; sensors. Location information can be parsed out of the &amp;lt;code&amp;gt;gps_gpgga&amp;lt;/code&amp;gt; sensor by using &amp;lt;code&amp;gt;gpsd&amp;lt;/code&amp;gt; or another NMEA parser.&lt;br /&gt;
&lt;br /&gt;
==Option: Using the GPIO Expansion Kit==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top; width:60%&amp;quot;|This General Purpose Input/output (GPIO) breakout kit provides access to general purpose digital I/O signals with simple terminal blocks, and a prototyping area where wires and components can be soldered.  Each GPIO pin is connected to an FPGA digital line allowing it to be configured as an input, or an output, using the various software frameworks that support the USRP™ GPIO. &lt;br /&gt;
&lt;br /&gt;
These GPIO signals can serve the following functions:&lt;br /&gt;
&lt;br /&gt;
* Control of external devices, such as power amplifiers and RF switches&lt;br /&gt;
* Provide output signals that can help with debugging&lt;br /&gt;
* Provide observables to be analyzed by oscilloscopes or other external equipment&lt;br /&gt;
* Accept input from external devices for local, software-based triggering&lt;br /&gt;
* Implement a protocol line such as SPI or I2C&lt;br /&gt;
||[[File:Gpio_expan.jpg|250px]]&lt;br /&gt;
|}&lt;br /&gt;
===GPIO Expansion Kit Contents===&lt;br /&gt;
&lt;br /&gt;
*1 GPIO Breakout Board&lt;br /&gt;
*1 DB-15, 1-meter cable&lt;br /&gt;
*GPIO Quick Reference&lt;br /&gt;
&lt;br /&gt;
===Circuit Protection===&lt;br /&gt;
The GPIO signals exposed with this breakout kit are routed directly to the USRP device's FPGA with limited protection circuitry.  However, the user must take precautionary measures to ensure input/output signals meet the specifications shown in this document.  Over voltage, excess current draw, and other conditions can damage the USRP device and void the warranty. Special care should be taken when the USRP is powered off.&lt;br /&gt;
&lt;br /&gt;
===Mounting the GPIO Breakout Board===&lt;br /&gt;
The GPIO breakout board can be mounted directly to the DB15 connector of a USRP ™ device, or mounted remotely with the cable provided in this kit.  The screws on the DB15 connector of the breakout board must be removed to mount the board directly.  For remote mounting, the breakout board is supplied with rubber standoffs to avoid scratching surfaces, and several through-holes for hard mounting with screws or other hardware (not provided).&lt;br /&gt;
&lt;br /&gt;
===Using GPIO with UHD, GNU Radio, and other Third-Party Frameworks===&lt;br /&gt;
When used with UHD, or other third party frameworks that leverage UHD, the GPIO expansion can be controlled with simple API calls.  For more information, on the C++ API, and examples of how to use the GPIO in frameworks such as GNU Radio, please see the [[Application Notes]] section of the [https://kb.ettus.com Ettus Research Knowledge Base].&lt;br /&gt;
&lt;br /&gt;
===GPIO Specifications (3.3V Bank, LVCMOS)===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Parameter&lt;br /&gt;
!Typical&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Configured as Input&lt;br /&gt;
|-&lt;br /&gt;
|Default Voltage Standard&lt;br /&gt;
|3.3V LVCMOS&lt;br /&gt;
|-&lt;br /&gt;
|Voltage High Threshold&lt;br /&gt;
|2.0V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Low Threshold&lt;br /&gt;
|0.8V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Input Limits (no damage) &lt;br /&gt;
| -0.3V/3.45V&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Configured as Output&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Standard&lt;br /&gt;
|3.3V LVCMOS&lt;br /&gt;
|-&lt;br /&gt;
|Voltage High Output&lt;br /&gt;
|2.8V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Low Output&lt;br /&gt;
|0.4V&lt;br /&gt;
|-&lt;br /&gt;
|Current Source Capability&lt;br /&gt;
|12 mA&lt;br /&gt;
|-&lt;br /&gt;
|Output Source Impedance&lt;br /&gt;
|&amp;gt;33 ohms typical&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Option: Antenna Kit for GPSDO==&lt;br /&gt;
The GPSDO Mini Kit will improve the accuracy of the USRP reference clock, even if it does not receive signals from the GPS Constellation.  However, to achieve the best accuracy possible, and to achieve global timing alignment across multiple USRPs, Ettus Research recommends the GPSDO Mini Antenna Kit.&lt;br /&gt;
&lt;br /&gt;
==Option: Cables for MIMO Expansion==&lt;br /&gt;
Multiple USRP-2974s can be synchronized for coherent operation by sharing a common 10 MHz and 1 PPS signal.  We recommend using a star-distribution topology with an OctoClock or OctoClock-G, as seen in Figure 4.  This requires matched length cables to be used for both 10 MHz and 1 PPS.&lt;br /&gt;
&lt;br /&gt;
For more information about MIMO operation, please see the MIMO and Synchronization Application Note.&lt;br /&gt;
[[File:8mimo.png|700px|center]]&lt;br /&gt;
&amp;lt;center&amp;gt;Figure 4 - Star-Distribution of 10 MHz/PPS Signals with OctoClock&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
&lt;br /&gt;
* '''What is the bandwidth of the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
The ADC rate on each analog RX channel is 200 MS/s quadrature, which provides a theoretical analog bandwidth of approximately 80% of the Nyquist bandwidth of +/- 100 MHz (+/- 80 MHz around the center frequency).  The resulting maximum theoretical analog bandwidth is 160 MHz.&lt;br /&gt;
&lt;br /&gt;
FPGA Processing Bandwidth: Up to 200 MS/s quadrature.&lt;br /&gt;
&lt;br /&gt;
Host Bandwidth:  Up to 200 MS/s quadrature, dependent on selected interface&lt;br /&gt;
&lt;br /&gt;
For more information about achieving the maximum bandwidth with a USRP-2974, please see the &amp;quot;USRP X300/X310 Configuration Guide&amp;quot; or the &amp;quot;USRP System Bandwidth&amp;quot; application note.&lt;br /&gt;
&lt;br /&gt;
* '''How can I program the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
Like all other USRP models, the USRP-2974 is compatible with the USRP Hardware Driver™ (UHD) architecture.  The UHD architecture is a common driver that allows users to develop and execute applications on the onboard or host computer.  UHD provides a direct C++ API to control and stream to/from the USRP-2974.  It also provides compatibility with a variety of third-party software frameworks including GNU Radio, LabVIEW, and MATLAB.  You may also customize the FPGA image provided with UHD to integrate your own signal processing. For more information about UHD, and supported software frameworks, please see:&lt;br /&gt;
&lt;br /&gt;
http://files.ettus.com/manual/&lt;br /&gt;
&lt;br /&gt;
* '''How do I update the FPGA images and firmware with the latest from UHD'''&lt;br /&gt;
&lt;br /&gt;
You can find more information about updating the FPGA image through PCIe, 1/10 GigE, and JTAG [https://kb.ettus.com/X300/X310_Device_Recovery here].&lt;br /&gt;
&lt;br /&gt;
* '''How can I modify the FPGA of the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
The source code (Verilog) for the USRP-2794 is available in the UHD repository. The build process leverages the existing CMAKE build system used to compile the host-side driver.  A Linux-based setup will provide the best results.&lt;br /&gt;
&lt;br /&gt;
Which FPGA toolchain required to build the FPGA images will depend upon your version of UHD. For more details please see the [https://kb.ettus.com/UHD UHD] Software Resource page.&lt;br /&gt;
&lt;br /&gt;
* '''How much free space is available in the USRP-2974 FPGA'''&lt;br /&gt;
&lt;br /&gt;
Please see the [[#Utilization statistics]] section of this resources page for more information.&lt;br /&gt;
&lt;br /&gt;
* '''What frequency range does the USRP-2974 cover'''&lt;br /&gt;
&lt;br /&gt;
10MHz to 6GHz.&lt;br /&gt;
&lt;br /&gt;
* '''What components do I need to purchase for a complete USRP-2974 system'''&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 is a complete stand alone SDR. Additional components might include RF filters, antennas, RF power amplifiers or other RF components needed of a specific application.&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP-2974&amp;diff=4151</id>
		<title>USRP-2974</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=USRP-2974&amp;diff=4151"/>
				<updated>2019-06-01T15:02:12Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: Created page with &amp;quot;== Device Overview == The NI USRP-2974 is a high-performance, USRP software defined radio (SDR) stand-alone device for designing and deploying next generation wireless communi...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Device Overview ==&lt;br /&gt;
The NI USRP-2974 is a high-performance, USRP software defined radio (SDR) stand-alone device for designing and deploying next generation wireless communications systems. The hardware architecture combines two extended-bandwidth daughterboard slots covering 10 MHz – 6 GHz with up to 160 MHz of baseband bandwidth, multiple high-speed interface options (PCIe, dual 10 GigE), an onboard Intel Core i7 processor, and a large user-programmable Kintex-7 FPGA in a convenient desktop or rack-mountable half-wide 2U form factor.&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 is the equivalent to a USRP X310 with two UBX-160 boards, a GPSDO and an onboard Intel i7 computer. The USRP-2974 comes with NI Linux RTOS pre-installed, but in order to use it with open-source tool-chain, a user will need to install Linux (preferably Fedora or Ubuntu) and then the USRP Hardware driver (UHD). After these have been installed, any other open-source tools can be installed, such as GNU Radio.&lt;br /&gt;
&lt;br /&gt;
== Key Features of the USRP-2974==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|&lt;br /&gt;
* Intel Core i7 6822EQ 2GHz Quad CoreProcessor&lt;br /&gt;
* 16GB DDR4 Memory&lt;br /&gt;
* 512GB SSD&lt;br /&gt;
* USB-to-UART to the CPU&lt;br /&gt;
* Xilinx Kintex-7 XC7K410T FPGA&lt;br /&gt;
* 14 bit 200 MS/s ADC&lt;br /&gt;
* 16 bit 800 MS/s DAC&lt;br /&gt;
* Frequency range: 10 MHz - 6 GHz&lt;br /&gt;
* Up 160MHz&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; bandwidth per channel&lt;br /&gt;
* 2 Transmit ports&lt;br /&gt;
* 2 Receive ports&lt;br /&gt;
* GPSDO&lt;br /&gt;
* Multiple high-speed interfaces (Dual 10G, PCIe Express, 1G)&lt;br /&gt;
|[[File:USRP_2974_frt_dia.jpg|350px|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Controller - Onboard computer ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|System on module (SoM) &lt;br /&gt;
|Congatec COM Express conga-TS170&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|CPU&lt;br /&gt;
|Intel Core i7 6822EQ (2 GHz Quad Core)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Memory &lt;br /&gt;
|SO-DIMM DDR4 16 GB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SFP+&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &lt;br /&gt;
|10G ETH connection to the SoM&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Cabled PCIe&lt;br /&gt;
|PCIe Gen 2 x4&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|MicroUSB&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|USB-to-UART to the SoM&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|RJ45&lt;br /&gt;
|1G ETH host connection&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; Can be bypassed to the FPGA.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; Device port for external host.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
==RF Specifications==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Transmitter&lt;br /&gt;
|-&lt;br /&gt;
|Number of channels&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Frequency range&lt;br /&gt;
|10MHz to 6GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency step&lt;br /&gt;
|&amp;lt;1kHz&lt;br /&gt;
|-&lt;br /&gt;
|Maximum output power&lt;br /&gt;
|5mW to 100mW (7dBm to 20dBm)&lt;br /&gt;
|-&lt;br /&gt;
|Gain range&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
|0dB to 31.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Gain step&lt;br /&gt;
|0.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum instantaneous real-time bandwidth&lt;br /&gt;
|160MHz&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Receiver&lt;br /&gt;
|-&lt;br /&gt;
|Number of channels&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Frequency range&lt;br /&gt;
|10MHz to 6GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency step&lt;br /&gt;
|&amp;lt;1kHz&lt;br /&gt;
|-&lt;br /&gt;
|Gain range&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|0dB to 37.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Gain step&lt;br /&gt;
|0.5dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum input power&lt;br /&gt;
|10dBm&lt;br /&gt;
|-&lt;br /&gt;
|Noise Figure&lt;br /&gt;
|5dB to 7dB&lt;br /&gt;
|-&lt;br /&gt;
|Maximum instantaneous real-time bandwidth&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&lt;br /&gt;
|160MHz&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; The output power resulting from the gain setting varies over the frequency band and among&lt;br /&gt;
devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;The received signal amplitude resulting from the gain setting varies over the frequency band and&lt;br /&gt;
among devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;The USRP-2974 receiver path has 84 MHz of bandwidth for center frequencies from 10 MHz to&lt;br /&gt;
500 MHz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' As mentioned earlier, the USRP-2974 incorporates 2 UBX-160 daughterboards. Therefore, for more information on RF performance, please see the [https://kb.ettus.com/UBX UBX hardware resource] page&lt;br /&gt;
&lt;br /&gt;
==Hardware Specifications==&lt;br /&gt;
===USRP Hardware Driver (UHD) version===&lt;br /&gt;
* Minimum version of UHD required: '''3.15.0'''&lt;br /&gt;
&lt;br /&gt;
===Clocking and Sampling Rates===&lt;br /&gt;
There are two master clock rates (MCR) supported on the USRP-2974 like on the X310: 200.0 MHz and 184.32 MHz.&lt;br /&gt;
&lt;br /&gt;
The sampling rate must be an integer decimation rate of the MCR. Ideally, this decimation factor should be an even number. An odd decimation factor will result in additional unwanted attenuation (roll-off from the CIC filter in the DUC and DDC blocks in the FPGA). The valid decimation rates are between 1 and 1024.&lt;br /&gt;
&lt;br /&gt;
For the MCR of 200.0 MHz, the achievable sampling rates using an even decimation factor are 200.0, 100.0, 50.0, 33.33, 25.0, 20.0, 16.67, 14.286 Msps, ... 195.31 Ksps.&lt;br /&gt;
&lt;br /&gt;
For the MCR of 184.32 MHz, the achievable sampling rates using an even decimation factor are 184.32, 92.16, 46.08, 30.72, 23.04, 18.432, 15.36, 13.166 Msps, ... 180.0 Ksps.&lt;br /&gt;
&lt;br /&gt;
If the desired sampling rate is not directly supported by the hardware, then it will be necessary to re-sample in software. This can be done in C++ using libraries such as Liquid DSP [https://github.com/jgaeddert/liquid-dsp], or can be done in GNU Radio, in which there are three blocks that perform sampling rate conversion.&lt;br /&gt;
&lt;br /&gt;
==Physical Specifications==&lt;br /&gt;
&lt;br /&gt;
===Dimensions===&lt;br /&gt;
(L × W × H) 29.08 cm × 21.84 cm × 7.98 cm (11.45 in. × 8.60 in. × 3.14 in. )&lt;br /&gt;
&lt;br /&gt;
===Weight===&lt;br /&gt;
3.34 kg (7.35 lb)&lt;br /&gt;
&lt;br /&gt;
==Power==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|Voltage range&lt;br /&gt;
|14.25 V to 15.75 V DC&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Current&lt;br /&gt;
|10 A, maximum&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Power&lt;br /&gt;
|150 W, maximum&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Environmental Specifications==&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' Indoor use only&lt;br /&gt;
&lt;br /&gt;
===Operating Temperature Range===&lt;br /&gt;
* 0 °C to 50 °C&lt;br /&gt;
&lt;br /&gt;
===Maximum altitude===&lt;br /&gt;
* 2,000 m (800 mbar) (at 25 °C ambient temperature)&lt;br /&gt;
&lt;br /&gt;
===Operating Humidity Range===&lt;br /&gt;
* 10% to 90% non-condensing&lt;br /&gt;
&lt;br /&gt;
===Pollution Degree===&lt;br /&gt;
* 2&lt;br /&gt;
&lt;br /&gt;
==System Diagram and Schematics==&lt;br /&gt;
&lt;br /&gt;
===System Block Diagram===&lt;br /&gt;
[[file:2974_blk_dia.png |800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.ni.com/documentation/en/usrp-software-defined-radio-stand-alone-device/latest/usrp-2974/block-diagram/ System Block Diagram]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schematics===&lt;br /&gt;
Because the USRP-2974 is a combination of an Intel i7 SOM and an X310 USRP, a user can reference the X310 Schematics.&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/schematics/x300/x3xx.pdf X310 Schematics]&lt;br /&gt;
&lt;br /&gt;
==Key Component Datasheets==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:80%&amp;quot;&lt;br /&gt;
!Part Number&lt;br /&gt;
!Description&lt;br /&gt;
!Schematic ID (Page)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.congatec.com/fileadmin/user_upload/Documents/Datasheets/conga-TS170.pdf conga-TS170]&lt;br /&gt;
|System on Module (SoM)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.xilinx.com/support/documentation/data_sheets/ds180_7Series_Overview.pdf XC7K410T]&lt;br /&gt;
|FPGA&lt;br /&gt;
|U23 (3,5,8,9,10,18)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.analog.com/media/en/technical-documentation/data-sheets/AD9146.PDF AD9146]&lt;br /&gt;
|Dual Channel, 16-Bit, 1230 MSPS DAC&lt;br /&gt;
|U12, U36 (7)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/slas635b/slas635b.pdf ADS62P48]&lt;br /&gt;
|Dual Channel, 14-Bit 210 MSPS ADC&lt;br /&gt;
|U11, U35 (6)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[https://www.onsemi.com/pub/Collateral/FIN1002-D.pdf FIN1002]&lt;br /&gt;
|High Speed Differential Receiver&lt;br /&gt;
|U3, U5, U31, U32 (4)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/20001203U.pdf 24LC256T]&lt;br /&gt;
|EEPROM&lt;br /&gt;
|U530 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/lmk04816.pdf LMK04816BISQ/NOPB_1/3]&lt;br /&gt;
|Jitter Cleaner With Dual Loop PLLs&lt;br /&gt;
|U531 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://ww1.microchip.com/downloads/en/DeviceDoc/sy89547l.pdf SY89547LMGTR]&lt;br /&gt;
|Multiplexer&lt;br /&gt;
|U506 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/sn74aup1t17.pdf SN74AUP1T17]&lt;br /&gt;
|Single Schmitt-Trigger Buffer Gate&lt;br /&gt;
|U6, U519 (12)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps54620.pdf TPS54620RGYT]&lt;br /&gt;
|Synchronous Step Down SWIFT™ Converter&lt;br /&gt;
|U515 (21); U516 (26)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/1764fb.pdf LT1764EQ-3.3]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U27 (21); U516 (26)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps7a47.pdf TPS7A47]&lt;br /&gt;
|Voltage Regulator&lt;br /&gt;
|U28, U532 (21)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://cds.linear.com/docs/en/datasheet/3603fc.pdf LTC3603EUF_TRPBF]&lt;br /&gt;
|Monolithic Synchronous Step-Down Regulator&lt;br /&gt;
|U517 (23); U500 (25); U514, U513 (27)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/product/TPS77625-EP?keyMatch=TPS77625&amp;amp;tisearch=Search-EN-Everything TPS77625]&lt;br /&gt;
|Low-Dropout Voltage Regulators&lt;br /&gt;
|U30 (23)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.ti.com/lit/ds/symlink/tps79318-ep.pdf TPS79318_SM]&lt;br /&gt;
|Low-Dropout Voltage Regulators&lt;br /&gt;
|U510 (27)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Media:agile9598503.pdf|OSC-96MHZ-724821-01]]&lt;br /&gt;
|Voltage Controlled Crystal Oscillator&lt;br /&gt;
|U25 (11)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==FPGA and Baseband==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|FPGA &lt;br /&gt;
|Kintex-7 XC7K410T&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|DRAM &lt;br /&gt;
|1 GB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Baseband analog-to-digital converter&lt;br /&gt;
(ADC) resolution&lt;br /&gt;
|14 bit&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Baseband digital-to-analog converter&lt;br /&gt;
(DAC) resolution&lt;br /&gt;
|16 bit&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|ADC spurious-free dynamic range (sFDR)&lt;br /&gt;
|88 dB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|DAC sFDR&lt;br /&gt;
|80 dB&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Maximum I/Q sample rate&lt;br /&gt;
|200 MS/s&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SFP+&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &lt;br /&gt;
|High speed serial link to one of the FPGA&lt;br /&gt;
GTX transceivers&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;Can be bypassed to the SoM if using the 10 GbE as protocol.&lt;br /&gt;
&lt;br /&gt;
===FPGA User Modifications===&lt;br /&gt;
&lt;br /&gt;
The Verilog code for the FPGA in the NI USRP-2974 is open-source, and users are free to modify and customize it for their needs. However, certain modifications may result in either bricking the device, or even in physical damage to the unit. Specifically, changing the I/O interface of the FPGA in any way (do not remove any of the I/O for the PCIe interface, such as &amp;lt;code&amp;gt;x300_pcie_int&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;LvFpga_Chinch_Interface&amp;lt;/code&amp;gt;), or modifying the pin and timing constraint files, could result in physical damage to other components on the motherboard, external to the FPGA, and doing this will void the warranty. Also, even if the PCIe interface is not being used, you cannot remove or reassign these pins in the constraint file. The constraint files should not be modified. Please note that modifications to the FPGA are made at the risk of the user, and may not be covered by the warranty of the device.&lt;br /&gt;
&lt;br /&gt;
==Interfaces and Connectivity==&lt;br /&gt;
Follow the links below for additional information on configuring each interface for the USRP-2974.&lt;br /&gt;
&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_10gige Dual 10 Gigabit Ethernet] - 200 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_pcie PCIe Express (Desktop)] - 200 MS/s Full Duplex @ 16-bit&lt;br /&gt;
*[http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_hw_1gige 1 Gigabit Ethernet] - 25 MS/s Full Duplex @ 16-bit&lt;br /&gt;
&lt;br /&gt;
===Front Panel===&lt;br /&gt;
&lt;br /&gt;
[[File:USRP-2974 Front Panel.jpg|800px]]&lt;br /&gt;
[[File:2974_frt_wireframe.png|800px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Connector&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''Use'''&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RF 0&lt;br /&gt;
|TX1&amp;lt;p&amp;gt;RX1&lt;br /&gt;
|Input and output terminal for the RF signal. TX1 RX1 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input or output channel.&lt;br /&gt;
|-&lt;br /&gt;
|RX2&lt;br /&gt;
|Input terminal for the RF signal. RX2 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | AUX I/O&lt;br /&gt;
|General-purpose I/O (GPIO) port. AUX I/O is controlled by the FPGA.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RF 1&lt;br /&gt;
|TX1&amp;lt;p&amp;gt;RX1&lt;br /&gt;
|Input and output terminal for the RF signal. TX1 RX1 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input or output channel.&lt;br /&gt;
|-&lt;br /&gt;
|RX2&lt;br /&gt;
|Input terminal for the RF signal. RX2 is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | DP&lt;br /&gt;
|DisplayPort connector to connect one monitor for your controller.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | USB2.0&lt;br /&gt;
|USB ports that support common USB peripheral devices such as flash drives, hard drives, keyboards, and mice.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | USB3.0&lt;br /&gt;
|USB ports that support common USB peripheral devices such as flash drives, hard drives, keyboards, and mice.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G ETH&lt;br /&gt;
|RJ45 port used for 1G ETH connectivity to other ethernet devices.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | μUSB&lt;br /&gt;
|USB port used for UART connectivity to the controller.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 0&lt;br /&gt;
|SFP+ port used for 10G ETH connectivity to other ethernet devices. Connects to the embedded Linux computer for communication with LabVIEW RT.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 1&lt;br /&gt;
|SFP+ port used for 1G/10G ETH connectivity to other ethernet devices. Connects to the FPGA. Not currently supported in LabVIEW Communications System Design Suite.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''LED'''&lt;br /&gt;
!'''Description'''&lt;br /&gt;
!'''Color'''&lt;br /&gt;
!'''State'''&lt;br /&gt;
!'''Indication'''&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;5&amp;quot; | RF 0&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | TX1&amp;lt;p&amp;gt;RX1&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates thetransmit status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not active.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is transmitting data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RX2&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the receive status of the device.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot;| REF&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates the status of the reference signal.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no reference signal, or the device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; |Green&lt;br /&gt;
|Blinking&lt;br /&gt;
|The device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| PPS&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the pulse per second (PPS).&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no PPS timing reference signal, or the device is not locked to the reference signal.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Blinking&lt;br /&gt;
|The device is locked to the PPS timing reference signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| GPS&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates whether the GPSDO is locked.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|There is no GPSDO or the GPSDO is not locked.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The GPSDO is locked.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;5&amp;quot; | RF 1&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | TX1&amp;lt;p&amp;gt;RX1&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; | Indicates thetransmit status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not active.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is transmitting data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | RX2&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the receive status of the device.&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is not receiving data.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The device is receiving data.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| Status&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device initialized successfully and is ready for use.&lt;br /&gt;
|-&lt;br /&gt;
|Red&lt;br /&gt;
|Blinking&lt;br /&gt;
|Hardware error. An internal power supply has failed. Check front-panel I/O connections for shorts. Remove any shorts and cycle power to the USRP-2974. Contact NI if the problem persists.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;| PWR&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; | Indicates the power status of the device&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The device is powered off.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The devices is powered on.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot; | 10/100/1000&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot;| Indicates the speed of the Gigabit Ethernet link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|No link, or 10 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|100 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
|Amber&lt;br /&gt;
|Solid&lt;br /&gt;
|1,000 Mbps link.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;2&amp;quot;| ACT/LINK	&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Indicates the Gigabit Ethernet link activity or status.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|No link has been established.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Green&lt;br /&gt;
|Solid&lt;br /&gt;
|A link has been negotiated.&lt;br /&gt;
|-&lt;br /&gt;
|Blinking&lt;br /&gt;
|Activity on the link.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; | 1G/10G ETH 0&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | ACT/LINK&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Indicates the status of the SFP+ port.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The link is down.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The link is up.&lt;br /&gt;
|-&lt;br /&gt;
|Blinking&lt;br /&gt;
|The link is active (transmitting and receiving).&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |10GbE&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Indicates the status of the 10G ETH link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The 10G ETH link is down.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The 10G ETH link is up.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot; | 1G/10G ETH 1 10GbE&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Indicates the status of the 10G ETH link.	&lt;br /&gt;
|OFF&lt;br /&gt;
| —&lt;br /&gt;
|The 10G ETH link is down.&lt;br /&gt;
|-&lt;br /&gt;
|Green&lt;br /&gt;
|Solid&lt;br /&gt;
|The 10G ETH link is up.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Rear Panel===&lt;br /&gt;
[[File:USRP-2974 Rear Panel.jpg|800px]]&lt;br /&gt;
[[File:2974_back_wireframe.png|800px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Connector&lt;br /&gt;
!Use&lt;br /&gt;
|-&lt;br /&gt;
|REF OUT&lt;br /&gt;
|Output terminal for an external reference signal for the LO on the device. REF OUT is an SMA (f) connector with an impedance of 50 Ω, and it is a single-ended reference output. The output signal at this connector is 10 MHz at 3.3 V.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|REF IN&lt;br /&gt;
|Input terminal for an external reference signal for the LO on the device. REF IN is an SMA (f) connector with an impedance of 50 Ω, and it is a single-ended reference input. REF IN accepts a 10 MHz signal with a minimum input power of 0 dBm (0.632 Vpk-pk) and a maximum input power of 15 dBm (3.56 Vpk-pk) for a square wave or sine wave.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PPS TRIG OUT	&lt;br /&gt;
|Output terminal for the PPS timing reference. PPS TRIG OUT is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input. The output signal is 0 V to 3.3 V TTL. You can also use this port as a triggered output (TRIG OUT) that you program with the PPS Trig Out I/O signal.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PPS TRIG IN	&lt;br /&gt;
|Input terminal for PPS timing reference. PPS TRIG IN is an SMA (f) connector with an impedance of 50 Ω and is a single-ended input channel. PPS TRIG IN accepts 0 V to 3.3 V TTL and 0 V to 5 V TTL signals. You can also use this port as a triggered input (TRIG IN) that you control using NI-USRP software.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|GPS ANT	&lt;br /&gt;
|Input terminal for the GPS antenna signal. GPS ANT is an SMA (f) connector with a maximum input power of -15 dBm and an output of DC 5 V to power an active antenna. &amp;lt;p&amp;gt; '''Notice:''' Do not terminate the GPS ANT port if you do not use it.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|PCIe x4	&lt;br /&gt;
|Port for a PCI Express Generation 2, x4 bus connection through an MXI Express four-lane cable. Can be used to connect an external USRP device or external chassis.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|SYSTEM POWER IN	&lt;br /&gt;
|Input that accepts a 15 V ± 5%, 10 A external DC power connector.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Ref Clock - 10 MHz===&lt;br /&gt;
Using an external 10 MHz reference clock, a square wave will offer the best phase noise performance, but a sinusoid is acceptable. The power level of the reference clock cannot exceed +15 dBm.&lt;br /&gt;
&lt;br /&gt;
===PPS - Pulse Per Second===&lt;br /&gt;
Using a PPS signal for timestamp synchronization requires a square wave signal with the following a 5Vpp amplitude.&lt;br /&gt;
&lt;br /&gt;
To test the PPS input, you can use the following tool from the UHD examples:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;args&amp;gt;&amp;lt;/code&amp;gt; are device address arguments (optional if only one USRP device is on your machine)&lt;br /&gt;
&lt;br /&gt;
    cd &amp;lt;install-path&amp;gt;/lib/uhd/examples ./test_pps_input –args=&amp;lt;args&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Front Panel GPIO===&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;width:50%&amp;quot; |&lt;br /&gt;
The GPIO port is not meant to drive big loads. You should not try to source more than 5mA per pin.&lt;br /&gt;
&lt;br /&gt;
The +3.3V is for ESD clamping purposes only and not designed to deliver high currents.&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | [[File:x3x0 gpio conn.png]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Power on state====&lt;br /&gt;
The hardware power on state and UHD initial state for the front-panel GPIOs is high-Z. For the X3xx, there are no external pull-ups/pull-downs for the GPIO pins, but the FPGAs do have them and they are configured as follows: X3xx: pull-down.&lt;br /&gt;
&lt;br /&gt;
====Pin Mapping====&lt;br /&gt;
* Pin 1: +3.3V&lt;br /&gt;
* Pin 2: Data[0]&lt;br /&gt;
* Pin 3: Data[1]&lt;br /&gt;
* Pin 4: Data[2]&lt;br /&gt;
* Pin 5: Data[3]&lt;br /&gt;
* Pin 6: Data[4]&lt;br /&gt;
* Pin 7: Data[5]&lt;br /&gt;
* Pin 8: Data[6]&lt;br /&gt;
* Pin 9: Data[7]&lt;br /&gt;
* Pin 10: Data[8]&lt;br /&gt;
* Pin 11: Data[9]&lt;br /&gt;
* Pin 12: Data[10]&lt;br /&gt;
* Pin 13: Data[11]&lt;br /&gt;
* Pin 14: 0V&lt;br /&gt;
* Pin 15: 0V&lt;br /&gt;
&lt;br /&gt;
'''Note''': Please see the [http://files.ettus.com/manual/page_gpio_api.html E3x0/X3x0 GPIO API] for information on configuring and using the GPIO bus.&lt;br /&gt;
&lt;br /&gt;
==Certifications==&lt;br /&gt;
===RoHS===&lt;br /&gt;
As of December 1st, 2010 all NI/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;
[http://files.ettus.com/manual/md_fpga.html FPGA Resources]&lt;br /&gt;
&lt;br /&gt;
[http://files.ettus.com/binaries/uhd_stable/ UHD Stable Binaries]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/EttusResearch/uhd UHD Source Code on Github]&lt;br /&gt;
&lt;br /&gt;
==Choosing an Interface==&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 provides three interface options – 1 Gigabit Ethernet (1 GigE), 10 Gigabit Ethernet (10 GigE), and PCI-Express (PCIe). The PCIe interface is always available regardless of what FPGA image is loaded. Ettus ships two FPGA image variants, the HG or HGS image which has one 1 GigE interfaces and one 10 GigE interfaces, and the XG image which has two 10 GigE interfaces. Generally, Ettus Research recommends using 10 GigE to achieve the maximum throughput available from the USRP-2974.  PCIe is recommended for applications that require the lowest possible latency, which is a desirable characteristic for PHY/MAC research.  If your application does not require the full bandwidth of the USRP-2974, the 1 GigE interface serves as a cost-effective fall-back option.  Ettus Research provides a complete interface kit for each of these options, which is also shown in the following table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|Interface Performance Summary&lt;br /&gt;
|-&lt;br /&gt;
!Interface&lt;br /&gt;
!Throughput (MS/s @ 16-bit)&lt;br /&gt;
!Target&lt;br /&gt;
!Recommended Kit&lt;br /&gt;
|-&lt;br /&gt;
|1 Gigabit&lt;br /&gt;
|25 MS/s&lt;br /&gt;
|Desktop/Laptop&lt;br /&gt;
|[https://www.ettus.com/product/details/1GIGE-KIT SFP Adapter + GigE Cable]&lt;br /&gt;
|-&lt;br /&gt;
|10 Gigabit&lt;br /&gt;
|200 MS/s&lt;br /&gt;
|Desktop&lt;br /&gt;
|[https://www.ettus.com/product/details/10GIGE-KIT 10 GigE Interface Kit]&lt;br /&gt;
|-&lt;br /&gt;
|PCI-Express &lt;br /&gt;
(PCIe, 4 lane)&lt;br /&gt;
|200 MS/S&lt;br /&gt;
|Desktop&lt;br /&gt;
|[https://www.ettus.com/product/details/PCIE-KIT PCI-Express Desktop Kit]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===10 Gigabit Ethernet===&lt;br /&gt;
In order to utilize the dual 10 Gigabit Ethernet interfaces, ensure the XG image is installed ([http://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_load_fpga_imgs_fpga_flavours see FPGA Image Flavors]). In addition to burning the prerequisite FPGA image, it may also be necessary to tune the network interface card (NIC) to eliminate drops (Ds) and reduce overflows (Os). This is done by increasing the number of RX descriptors ([http://files.ettus.com/manual/page_transport.html#transport_udp_linux see Linux specific notes]).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;benchmark_rate&amp;lt;/code&amp;gt; tool can be used to test this capability. Run the following commands to test the X-series USRP over both 10 Gigabit Ethernet interfaces with the maximum rate of 200 Msps per channel:&lt;br /&gt;
&lt;br /&gt;
    cd &amp;lt;install-path&amp;gt;/lib/uhd/examples&lt;br /&gt;
    ./benchmark_rate --args=&amp;quot;type=x300,addr=&amp;lt;Primary IP&amp;gt;,second_addr=&amp;lt;secondary IP&amp;gt;&amp;quot; --channels=&amp;quot;0,1&amp;quot; --rx_rate 200e6&lt;br /&gt;
&lt;br /&gt;
The second interface is specified by the extra argument '''second_addr'''.&lt;br /&gt;
&lt;br /&gt;
'''Recommended 10 Gigabit Ethernet Cards'''&lt;br /&gt;
* Intel X520-DA2&lt;br /&gt;
** [http://ark.intel.com/products/39776/Intel-Ethernet-Converged-Network-Adapter-X520-DA2 Intel® Ethernet Converged Network Adapter X520-DA2]&lt;br /&gt;
* Intel X520-DA1&lt;br /&gt;
** [http://ark.intel.com/products/68669/Intel-Ethernet-Converged-Network-Adapter-X520-DA1 Intel® Ethernet Converged Network Adapter X520-DA1 ]&lt;br /&gt;
* Intel X710-DA2&lt;br /&gt;
** [http://ark.intel.com/products/83964/Intel-Ethernet-Converged-Network-Adapter-X710-DA2 Intel® Ethernet Converged Network Adapter X710-DA2 ]&lt;br /&gt;
* Intel X710-DA4&lt;br /&gt;
** [http://ark.intel.com/products/83965/Intel-Ethernet-Converged-Network-Adapter-X710-DA4 Intel® Ethernet Converged Network Adapter X710-DA4 ]&lt;br /&gt;
* Mellanox MCX4121A-ACAT&lt;br /&gt;
** [https://store.mellanox.com/products/mellanox-mcx4121a-acat-connectx-4-lx-en-network-interface-card-25gbe-dual-port-sfp28-pcie3-0-x8-rohs-r6.html Mellanox MCX4121A-ACAT ]&lt;br /&gt;
&lt;br /&gt;
==GPS Disciplined, Oven-Controlled Oscillator (GPSDO)==&lt;br /&gt;
The USRP-2794 has a high-accuracy GPS-disciplined oscillator (GPSDO).  The GPSDO improves the accuracy of the internal frequency reference to 20 ppb, or 0.1 ppb if the GPS is synchronized to the GPS constellation.  When synchronized to the GPS constellation, all USRP™ devices will also be synchronized in time within 50 ns.&lt;br /&gt;
&lt;br /&gt;
* Support GPSDO NMEA Strings&lt;br /&gt;
* [http://www.jackson-labs.com/assets/uploads/main/LC_XO_specsheet.pdf JacksonLabs LC_XO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
!Internal TCXO&lt;br /&gt;
!GPS-Disciplined Clock&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Reference&lt;br /&gt;
|TCXO&lt;br /&gt;
|OCXO&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Accuracy&lt;br /&gt;
|± 2.5ppm&lt;br /&gt;
± 2,500 Hz @ 1 GHz&lt;br /&gt;
|± 20 ppb&lt;br /&gt;
± 20 Hz @ 1 GHz&lt;br /&gt;
|-&lt;br /&gt;
|Frequency Accuracy&lt;br /&gt;
|&lt;br /&gt;
|± 0.01ppb&lt;br /&gt;
|-&lt;br /&gt;
|(GPS-Disciplined)&lt;br /&gt;
|&lt;br /&gt;
|~ ± 0.01 Hz @ 1 GHz&lt;br /&gt;
|-&lt;br /&gt;
|GPS Time Sync Accuracy&lt;br /&gt;
|&lt;br /&gt;
|±50ns to UTC Time**&lt;br /&gt;
|-&lt;br /&gt;
|10 MHz Reference Phase Drift with GPS Sync&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;±20ns After 1 Hour**&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Sensors===&lt;br /&gt;
You can query the lock status with the &amp;lt;code&amp;gt;gps_locked&amp;lt;/code&amp;gt; sensor, as well as obtain raw NMEA sentences using the &amp;lt;code&amp;gt;gps_gprmc&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;gps_gpgga&amp;lt;/code&amp;gt; sensors. Location information can be parsed out of the &amp;lt;code&amp;gt;gps_gpgga&amp;lt;/code&amp;gt; sensor by using &amp;lt;code&amp;gt;gpsd&amp;lt;/code&amp;gt; or another NMEA parser.&lt;br /&gt;
&lt;br /&gt;
==Option: Using the GPIO Expansion Kit==&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align:top; width:60%&amp;quot;|This General Purpose Input/output (GPIO) breakout kit provides access to general purpose digital I/O signals with simple terminal blocks, and a prototyping area where wires and components can be soldered.  Each GPIO pin is connected to an FPGA digital line allowing it to be configured as an input, or an output, using the various software frameworks that support the USRP™ GPIO. &lt;br /&gt;
&lt;br /&gt;
These GPIO signals can serve the following functions:&lt;br /&gt;
&lt;br /&gt;
* Control of external devices, such as power amplifiers and RF switches&lt;br /&gt;
* Provide output signals that can help with debugging&lt;br /&gt;
* Provide observables to be analyzed by oscilloscopes or other external equipment&lt;br /&gt;
* Accept input from external devices for local, software-based triggering&lt;br /&gt;
* Implement a protocol line such as SPI or I2C&lt;br /&gt;
||[[File:Gpio_expan.jpg|250px]]&lt;br /&gt;
|}&lt;br /&gt;
===GPIO Expansion Kit Contents===&lt;br /&gt;
&lt;br /&gt;
*1 GPIO Breakout Board&lt;br /&gt;
*1 DB-15, 1-meter cable&lt;br /&gt;
*GPIO Quick Reference&lt;br /&gt;
&lt;br /&gt;
===Circuit Protection===&lt;br /&gt;
The GPIO signals exposed with this breakout kit are routed directly to the USRP device's FPGA with limited protection circuitry.  However, the user must take precautionary measures to ensure input/output signals meet the specifications shown in this document.  Over voltage, excess current draw, and other conditions can damage the USRP device and void the warranty. Special care should be taken when the USRP is powered off.&lt;br /&gt;
&lt;br /&gt;
===Mounting the GPIO Breakout Board===&lt;br /&gt;
The GPIO breakout board can be mounted directly to the DB15 connector of a USRP ™ device, or mounted remotely with the cable provided in this kit.  The screws on the DB15 connector of the breakout board must be removed to mount the board directly.  For remote mounting, the breakout board is supplied with rubber standoffs to avoid scratching surfaces, and several through-holes for hard mounting with screws or other hardware (not provided).&lt;br /&gt;
&lt;br /&gt;
===Using GPIO with UHD, GNU Radio, and other Third-Party Frameworks===&lt;br /&gt;
When used with UHD, or other third party frameworks that leverage UHD, the GPIO expansion can be controlled with simple API calls.  For more information, on the C++ API, and examples of how to use the GPIO in frameworks such as GNU Radio, please see the [[Application Notes]] section of the [https://kb.ettus.com Ettus Research Knowledge Base].&lt;br /&gt;
&lt;br /&gt;
===GPIO Specifications (3.3V Bank, LVCMOS)===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Parameter&lt;br /&gt;
!Typical&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Configured as Input&lt;br /&gt;
|-&lt;br /&gt;
|Default Voltage Standard&lt;br /&gt;
|3.3V LVCMOS&lt;br /&gt;
|-&lt;br /&gt;
|Voltage High Threshold&lt;br /&gt;
|2.0V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Low Threshold&lt;br /&gt;
|0.8V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Input Limits (no damage) &lt;br /&gt;
| -0.3V/3.45V&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Configured as Output&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Standard&lt;br /&gt;
|3.3V LVCMOS&lt;br /&gt;
|-&lt;br /&gt;
|Voltage High Output&lt;br /&gt;
|2.8V&lt;br /&gt;
|-&lt;br /&gt;
|Voltage Low Output&lt;br /&gt;
|0.4V&lt;br /&gt;
|-&lt;br /&gt;
|Current Source Capability&lt;br /&gt;
|12 mA&lt;br /&gt;
|-&lt;br /&gt;
|Output Source Impedance&lt;br /&gt;
|&amp;gt;33 ohms typical&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Option: Antenna Kit for GPSDO==&lt;br /&gt;
The GPSDO Mini Kit will improve the accuracy of the USRP reference clock, even if it does not receive signals from the GPS Constellation.  However, to achieve the best accuracy possible, and to achieve global timing alignment across multiple USRPs, Ettus Research recommends the GPSDO Mini Antenna Kit.&lt;br /&gt;
&lt;br /&gt;
==Option: Cables for MIMO Expansion==&lt;br /&gt;
Multiple USRP-2974s can be synchronized for coherent operation by sharing a common 10 MHz and 1 PPS signal.  We recommend using a star-distribution topology with an OctoClock or OctoClock-G, as seen in Figure 4.  This requires matched length cables to be used for both 10 MHz and 1 PPS.&lt;br /&gt;
&lt;br /&gt;
For more information about MIMO operation, please see the MIMO and Synchronization Application Note.&lt;br /&gt;
[[File:8mimo.png|700px|center]]&lt;br /&gt;
&amp;lt;center&amp;gt;Figure 4 - Star-Distribution of 10 MHz/PPS Signals with OctoClock&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
&lt;br /&gt;
* '''What is the bandwidth of the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
The ADC rate on each analog RX channel is 200 MS/s quadrature, which provides a theoretical analog bandwidth of approximately 80% of the Nyquist bandwidth of +/- 100 MHz (+/- 80 MHz around the center frequency).  The resulting maximum theoretical analog bandwidth is 160 MHz.&lt;br /&gt;
&lt;br /&gt;
FPGA Processing Bandwidth: Up to 200 MS/s quadrature.&lt;br /&gt;
&lt;br /&gt;
Host Bandwidth:  Up to 200 MS/s quadrature, dependent on selected interface&lt;br /&gt;
&lt;br /&gt;
For more information about achieving the maximum bandwidth with a USRP-2974, please see the &amp;quot;USRP X300/X310 Configuration Guide&amp;quot; or the &amp;quot;USRP System Bandwidth&amp;quot; application note.&lt;br /&gt;
&lt;br /&gt;
* '''How can I program the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
Like all other USRP models, the USRP-2974 is compatible with the USRP Hardware Driver™ (UHD) architecture.  The UHD architecture is a common driver that allows users to develop and execute applications on the onboard or host computer.  UHD provides a direct C++ API to control and stream to/from the USRP-2974.  It also provides compatibility with a variety of third-party software frameworks including GNU Radio, LabVIEW, and MATLAB.  You may also customize the FPGA image provided with UHD to integrate your own signal processing. For more information about UHD, and supported software frameworks, please see:&lt;br /&gt;
&lt;br /&gt;
http://files.ettus.com/manual/&lt;br /&gt;
&lt;br /&gt;
* '''How do I update the FPGA images and firmware with the latest from UHD'''&lt;br /&gt;
&lt;br /&gt;
You can find more information about updating the FPGA image through PCIe, 1/10 GigE, and JTAG [https://kb.ettus.com/X300/X310_Device_Recovery here].&lt;br /&gt;
&lt;br /&gt;
* '''How can I modify the FPGA of the USRP-2974'''&lt;br /&gt;
&lt;br /&gt;
The source code (Verilog) for the USRP-2794 is available in the UHD repository. The build process leverages the existing CMAKE build system used to compile the host-side driver.  A Linux-based setup will provide the best results.&lt;br /&gt;
&lt;br /&gt;
Which FPGA toolchain required to build the FPGA images will depend upon your version of UHD. For more details please see the [https://kb.ettus.com/UHD UHD] Software Resource page.&lt;br /&gt;
&lt;br /&gt;
* '''How much free space is available in the USRP-2974 FPGA'''&lt;br /&gt;
&lt;br /&gt;
Please see the [[#Utilization statistics]] section of this resources page for more information.&lt;br /&gt;
&lt;br /&gt;
* '''What frequency range does the USRP-2974 cover'''&lt;br /&gt;
&lt;br /&gt;
10MHz to 6GHz.&lt;br /&gt;
&lt;br /&gt;
* '''What components do I need to purchase for a complete USRP-2974 system'''&lt;br /&gt;
&lt;br /&gt;
The USRP-2974 is a complete stand alone SDR. Additional components might include RF filters, antennas, RF power amplifiers or other RF components needed of a specific application.&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Resources]]&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:2974_back_wireframe.png&amp;diff=4150</id>
		<title>File:2974 back wireframe.png</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:2974_back_wireframe.png&amp;diff=4150"/>
				<updated>2019-06-01T14:56:07Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:USRP-2974_Rear_Panel.jpg&amp;diff=4149</id>
		<title>File:USRP-2974 Rear Panel.jpg</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:USRP-2974_Rear_Panel.jpg&amp;diff=4149"/>
				<updated>2019-06-01T14:55:53Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:2974_frt_wireframe.png&amp;diff=4148</id>
		<title>File:2974 frt wireframe.png</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:2974_frt_wireframe.png&amp;diff=4148"/>
				<updated>2019-06-01T14:54:03Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: JoseLoera uploaded a new version of File:2974 frt wireframe.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:2974_frt_wireframe.png&amp;diff=4147</id>
		<title>File:2974 frt wireframe.png</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:2974_frt_wireframe.png&amp;diff=4147"/>
				<updated>2019-06-01T14:52:17Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:USRP-2974_Front_Panel.jpg&amp;diff=4146</id>
		<title>File:USRP-2974 Front Panel.jpg</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:USRP-2974_Front_Panel.jpg&amp;diff=4146"/>
				<updated>2019-06-01T14:48:31Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:2974_blk_dia.png&amp;diff=4145</id>
		<title>File:2974 blk dia.png</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:2974_blk_dia.png&amp;diff=4145"/>
				<updated>2019-06-01T14:45:48Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Knowledge_Base&amp;diff=4144</id>
		<title>Knowledge Base</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Knowledge_Base&amp;diff=4144"/>
				<updated>2019-06-01T14:44:08Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /*  Hardware Resources */ Adding USRP-2974&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Ettus Research Knowledge Base (KB). The KB is continuously being updated and expanded. If you have any suggestions, or do not find what you are looking for, then please [http://www.ettus.com/contact Contact Us].&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
== [[Getting Started Guides|&amp;lt;i class=&amp;quot;fa fa-road&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Getting Started Guides]] ==&lt;br /&gt;
&lt;br /&gt;
'''Motherboards'''&lt;br /&gt;
* [[B200/B210/B200mini/B205mini Getting Started Guides|B200/B210/B200mini/B205mini]]&lt;br /&gt;
* [[Ettus USRP E300 Embedded Family Getting Started Guides|E310/E312/E313]]&lt;br /&gt;
* [[E320 Getting Started Guide|E320]]&lt;br /&gt;
* [[N200/N210 Getting Started Guides|N200/N210]]&lt;br /&gt;
* [[USRP N300/N310/N320/N321 Getting Started Guide|N300/N310/N320/N321]]&lt;br /&gt;
* [[X300/X310 Getting Started Guides|X300/X310]]&lt;br /&gt;
* [[USRP-2974 Getting Started Guide|USRP-2974]]&lt;br /&gt;
&lt;br /&gt;
'''Daughterboards'''&lt;br /&gt;
* [[BasicTX/BasicRX Getting Started Guides|BasicTX/BasicRX]]&lt;br /&gt;
* [[CBX Getting Started Guides|CBX]]&lt;br /&gt;
* [[LFTX/LFRX Getting Started Guides|LFTX/LFRX]]&lt;br /&gt;
* [[SBX Getting Started Guides|SBX]]&lt;br /&gt;
* [[TwinRX Getting Started Guides|TwinRX]]&lt;br /&gt;
* [[UBX Getting Started Guides|UBX]]&lt;br /&gt;
* [[WBX Getting Started Guides|WBX]]&lt;br /&gt;
&lt;br /&gt;
'''Other'''&lt;br /&gt;
* [[Getting_Started_with_RFNoC_Development|RFNoC Development]]&lt;br /&gt;
* [[Live SDR Environment Getting Started Guides|Live SDR Environment]]&lt;br /&gt;
* [[OctoClock CDA-2990 Getting Started Guides|OctoClock CDA-2990]]&lt;br /&gt;
* [[Using Ethernet-Based Synchronization on the USRP™ N3xx Devices|White Rabbit]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Hardware Resources|&amp;lt;i class=&amp;quot;fa fa-cogs&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Hardware Resources]] ==&lt;br /&gt;
'''Motherboards'''&lt;br /&gt;
* [[B200/B210/B200mini/B205mini]]&lt;br /&gt;
* [[Ettus USRP E300 Embedded Family Hardware Resources|E310/E312/E313]]&lt;br /&gt;
* [[E320|E320]]&lt;br /&gt;
* [[N200/N210]]&lt;br /&gt;
* [[N300/N310]]&lt;br /&gt;
* [[N320/N321]]&lt;br /&gt;
* [[X300/X310]]&lt;br /&gt;
* [[USRP-2974]]&lt;br /&gt;
&lt;br /&gt;
'''Daughterboards'''&lt;br /&gt;
* [[BasicTX/BasicRX]]&lt;br /&gt;
* [[CBX]]&lt;br /&gt;
* [[LFTX/LFRX]]&lt;br /&gt;
* [[SBX]]&lt;br /&gt;
* [[TwinRX]]&lt;br /&gt;
* [[UBX]]&lt;br /&gt;
* [[WBX]]&lt;br /&gt;
&lt;br /&gt;
'''Other'''&lt;br /&gt;
* [[OctoClock CDA-2990]]&lt;br /&gt;
* [[GPSDO]]&lt;br /&gt;
* [[Antennas]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Software Resources|&amp;lt;i class=&amp;quot;fa fa-desktop&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Software Resources]] ==&lt;br /&gt;
'''Ettus Products'''&lt;br /&gt;
* [[UHD]]&lt;br /&gt;
* [[UHD Python API]]&lt;br /&gt;
* [[RFNoC]]&lt;br /&gt;
* [[Live SDR Environment]]&lt;br /&gt;
&lt;br /&gt;
'''Third Party'''&lt;br /&gt;
* [[GNU Radio]]&lt;br /&gt;
* [[LabVIEW]]&lt;br /&gt;
* [[Matlab/Simulink]]&lt;br /&gt;
* [[OpenBTS]]&lt;br /&gt;
* [[Eurecom OpenAirInterface (OAI)]]&lt;br /&gt;
* [[srsLTE/srsUE]]&lt;br /&gt;
* [[Gqrx]]&lt;br /&gt;
* [[Fosphor]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[UHD and USRP User Manual|&amp;lt;i class=&amp;quot;fa fa-flag&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; UHD and USRP User Manual]] ==&lt;br /&gt;
'''Software'''&lt;br /&gt;
* [http://files.ettus.com/manual/ UHD Manual]&lt;br /&gt;
&lt;br /&gt;
'''Motherboards'''&lt;br /&gt;
* [http://files.ettus.com/manual/page_usrp_b200.html  B200/B210/B200mini/B205mini]&lt;br /&gt;
* [http://files.ettus.com/manual/page_usrp_x3x0.html X300/X310]&lt;br /&gt;
* [http://files.ettus.com/manual/page_usrp2.html N200/N210]&lt;br /&gt;
* [http://files.ettus.com/manual/page_usrp_e3x0.html E310/E312]&lt;br /&gt;
&lt;br /&gt;
'''Daughterboards'''&lt;br /&gt;
* [http://files.ettus.com/manual/page_dboards.html#dboards_basictx BasicRX/LFRX]&lt;br /&gt;
* [http://files.ettus.com/manual/page_dboards.html#dboards_basicrx BasicTX/LFTX]&lt;br /&gt;
* [http://files.ettus.com/manual/page_dboards.html#dboards_cbx CBX]&lt;br /&gt;
* [http://files.ettus.com/manual/page_dboards.html#dboards_sbx SBX]&lt;br /&gt;
* [http://files.ettus.com/manual/page_dboards.html#dboards_wbx WBX]&lt;br /&gt;
* [http://files.ettus.com/manual/page_dboards.html#dboards_ubx UBX]&lt;br /&gt;
&lt;br /&gt;
'''Other'''&lt;br /&gt;
* [http://files.ettus.com/manual/page_octoclock.html OctoClock]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Application Notes|&amp;lt;i class=&amp;quot;fa fa-file-text-o&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Application Notes]] ==&lt;br /&gt;
Application Notes (AN) and technical articles written by engineers, for engineers. These articles offer experienced analysis, design ideas, reference designs, and tutorials—to make you productive and successful using USRP devices.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Additional Resources|&amp;lt;i class=&amp;quot;fa fa-book&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Additional Resources]] ==&lt;br /&gt;
* [[Suggested Reading|Suggested Reading]]&lt;br /&gt;
* [[Suggested Videos|Suggested Videos]]&lt;br /&gt;
* [[SDR Events]]&lt;br /&gt;
* [[CGRAN]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Technical Support|&amp;lt;i class=&amp;quot;fa fa-life-ring&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Technical Support]] ==&lt;br /&gt;
* [[Email|Email]]&lt;br /&gt;
* [[Mailing Lists|Mailing Lists]]&lt;br /&gt;
* [[Internet Relay Chat (IRC)|Internet Relay Chat (IRC)]]&lt;br /&gt;
* [[StackExchange|StackExchange]]&lt;br /&gt;
* [[Ordering and Fulfillment Help | Ordering and Fulfillment Help]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Faq|&amp;lt;i class=&amp;quot;fa fa-info-circle&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; FAQ]] ==&lt;br /&gt;
* [[Technical FAQ|Technical]]&lt;br /&gt;
* [[Licensing FAQ|Licensing]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Legacy Products| &amp;lt;i class=&amp;quot;fa fa-hourglass-end&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Legacy Products]] ==&lt;br /&gt;
'''Motherboards'''&lt;br /&gt;
* [[USRP1|USRP1]]&lt;br /&gt;
* [[USRP2|USRP2]]&lt;br /&gt;
* [[E100/E110|E100/E110]]&lt;br /&gt;
* [[B100]]&lt;br /&gt;
&lt;br /&gt;
'''Daughterboards'''&lt;br /&gt;
* [[DBSRX2]]&lt;br /&gt;
* [[TVRX2]]&lt;br /&gt;
* [[XCVR2450]]&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=USRP-2974_Getting_Started_Guide&amp;diff=4143</id>
		<title>USRP-2974 Getting Started Guide</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=USRP-2974_Getting_Started_Guide&amp;diff=4143"/>
				<updated>2019-06-01T14:42:16Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: Created page with &amp;quot;==Kit Contents== * NI USRP-2974 * 30 dB SMA Attenuator * SMA-male to SMA-male Cable * Power Supply * Getting Started Guide {| ||center   |...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Kit Contents==&lt;br /&gt;
* NI USRP-2974&lt;br /&gt;
* 30 dB SMA Attenuator&lt;br /&gt;
* SMA-male to SMA-male Cable&lt;br /&gt;
* Power Supply&lt;br /&gt;
* Getting Started Guide&lt;br /&gt;
{|&lt;br /&gt;
||[[File:USRP_2974_frt_dia.jpg|250px|center]]  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Verify the Contents of Your Kit==&lt;br /&gt;
Make sure that your kit contains all the items listed above. If any items are missing, please contact your sales agent.&lt;br /&gt;
&lt;br /&gt;
==Unpacking the Kit==&lt;br /&gt;
1. To prevent electrostatic discharge (ESD) from damaging the device, ground yourself using a grounding strap or by holding a grounded object, such as your computer chassis.&lt;br /&gt;
&lt;br /&gt;
2. Remove the device from the package and inspect the device for loose components or any&lt;br /&gt;
other sign of damage.&lt;br /&gt;
&lt;br /&gt;
3. Never touch the exposed pins of connectors.&lt;br /&gt;
&lt;br /&gt;
4. Unpack any other items and documentation from the kit.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' Do not install a device if it appears damaged in any way. Store the device in the antistatic package when the device is not in use.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Proper Care and Handling==&lt;br /&gt;
All NI products are individually tested before shipment. The USRP™ is guaranteed to be functional at the time it is received by the customer. Improper use or handling of the USRP™ can easily cause the device to become non-functional. Listed below are some examples of actions which can prevent damage to the unit:&lt;br /&gt;
&lt;br /&gt;
*Always properly terminate the transmit port with an antenna or 50Ω load.&lt;br /&gt;
*Always handle the USRP with proper anti-static methods.&lt;br /&gt;
*Never allow the USRP to directly or indirectly come into contact with any voltage spikes.&lt;br /&gt;
*Never allow any water, or condensing moisture, to come into contact with the USRP.&lt;br /&gt;
*Always use caution with FPGA, firmware, or software modifications.&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Never apply more than '''+10 dBm''' of power into RF ports RF0 and RF1.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Never apply more than '''+15 dBm''' of power into the REF IN input.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Never apply more than '''-15 dBm''' of power into the GPS ANT input.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |[[File:Caution.png|24px|center]]&lt;br /&gt;
|style=&amp;quot;padding-left:10px; padding-right:10px; padding-bottom:10px;&amp;quot; |Always use at least 30dB attenuation if operating in loopback configuration&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Install and Setup the Software Tools on the onboard computer (SoM-System on Module)==&lt;br /&gt;
In order to use your Universal Software Radio Peripheral (USRP™), you must have the software tools correctly installed and configured on the SoM. A step-by-step guide for doing this is available at the [https://kb.ettus.com/Building_and_Installing_the_USRP_Open-Source_Toolchain_(UHD_and_GNU_Radio)_on_Linux Building and Installing the USRP Open-Source Toolchain (UHD and GNU Radio) on the Linux] Application Note. '''Release 3.15.0''' or later of the USRP Hardware Driver, UHD, is needed.&lt;br /&gt;
&lt;br /&gt;
==Basic Connectivity==&lt;br /&gt;
This USRP-2974 host supports multiple, high-speed, low-latency interface options to the FPGA. To setup the device, follow these basic instructions:&lt;br /&gt;
* Configure the host ethernet adapter (enp1s0f0) to use an IP address of 192.168.40.1 and a subnet mask of 255.255.255.0 &lt;br /&gt;
* Configure the host ethernet adapter (enp1s0f1) to use an IP address of 192.168.30.1 and a subnet mask of 255.255.255.0 (loopback with SFP+ cable needed)&lt;br /&gt;
* To test communications, ping the USRP FPGA at address &amp;quot;192.168.40.2&amp;quot; or “192.168.30.2”&lt;br /&gt;
&lt;br /&gt;
For more details on network setup, including PCIe connectivity, please see the section [[NI_USRP-2974_Hardware_Resource_0#Interfaces_and_Connectivity|Interfaces and Connectivity]] of the NI USRP-2974 Hardware Resources page.&lt;br /&gt;
&lt;br /&gt;
==Test and Verify the Operation of the USRP==&lt;br /&gt;
Once the software tools are installed on the onboard computer, verify the correct operation of the USRP by running the utility programs on the onboard computer. More information is available at the [https://kb.ettus.com/Verifying_the_Operation_of_the_USRP_Using_UHD_and_GNU_Radio Verifying the Operation of the USRP Using UHD and GNU Radio] Application Note.&lt;br /&gt;
&lt;br /&gt;
==Enabling PXE Boot==&lt;br /&gt;
&lt;br /&gt;
===Legacy PXE Boot===&lt;br /&gt;
* When rebooting the USRP-2974 open BIOS with DEL and go to Boot tab&lt;br /&gt;
* Enable PXE Network Boot with Legacy option, restart the system&lt;br /&gt;
* Go into the BIOS’ Boot tab and set IBA CL Slot 00FE v0105 as first boot option, restart the system&lt;br /&gt;
&lt;br /&gt;
===UEFI PXE Boot===&lt;br /&gt;
* When rebooting the USRP-2974 open BIOS with DEL and go to Boot tab&lt;br /&gt;
* Enable PXE Network Boot with UEFI option, restart the system&lt;br /&gt;
* Go into the BIOS’ Boot tab and set IPv4 as first boot option, restart the system&lt;br /&gt;
&lt;br /&gt;
==NI USRP RIO PCIe Support==&lt;br /&gt;
&lt;br /&gt;
If you are connecting the USRP-2974 through the PCIe interface, then complete this section.&lt;br /&gt;
&lt;br /&gt;
If you are connecting the USRP-2974 through the 1G or 10G Ethernet connection then do '''NOT''' complete this section.&lt;br /&gt;
&lt;br /&gt;
# Installer and commands taken from [https://files.ettus.com/manual/page_ni_rio_kernel.html https://files.ettus.com/manual/page_ni_rio_kernel.html]&lt;br /&gt;
# Extract the installer and install as described (note the _ instead of – in the folder name)&lt;br /&gt;
# Enable or disable the PCIe link&lt;br /&gt;
##&amp;lt;code&amp;gt;$ sudo /usr/local/bin/niusrprio_pcie start&amp;lt;/code&amp;gt;&lt;br /&gt;
##&amp;lt;code&amp;gt;$ sudo /usr/local/bin/niusrprio_pcie stop &amp;lt;/code&amp;gt;&lt;br /&gt;
# Check the status&lt;br /&gt;
##&amp;lt;code&amp;gt;$ sudo /usr/local/bin/niusrprio_pcie status&amp;lt;/code&amp;gt;&lt;br /&gt;
# see the connection over PCIe with &lt;br /&gt;
##&amp;lt;code&amp;gt;$ uhd_find_devices&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Note on USRP-2974 Rev A Hardware==&lt;br /&gt;
To find out if you have a '''&amp;quot;Rev A&amp;quot;''' hardware version of the USRP-2974 check the last character of the part number on the USRP-2974. E.g. &amp;quot;146873'''A'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
To fully support Rev A with UHD software, install UHD as explained and run the following command:&lt;br /&gt;
&lt;br /&gt;
    $ /usr/local/lib/uhd/utils/usrp_burn_mb_eeprom --args=”addr=192.168.40.2” --value=”product=31131”&lt;br /&gt;
&lt;br /&gt;
After a reboot run: &lt;br /&gt;
&lt;br /&gt;
    $ uhd_find_devices&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Under the product category section you will see the following: &lt;br /&gt;
    “NI-2974”.&lt;br /&gt;
&lt;br /&gt;
==Technical Support and Community Knowledge Base==&lt;br /&gt;
&lt;br /&gt;
Technical support for USRP hardware is available through email only. If the product arrived in a non­functional state or you require technical assistance, please contact [mailto:support@ettus.com support@ettus.com]. Please allow 24 to 48 hours for response by email, depending on holidays and weekends, although we are often able to reply more quickly than that.&lt;br /&gt;
&lt;br /&gt;
We also recommend that you subscribe to the community mailing lists. The mailing lists have a responsive and knowledgeable community of hundreds of developers and technical users who are located around the world. When you join the community, you will be connected to this group of people who can help you learn about SDR and respond to your technical and specific questions. Often your question can be answered quickly on the mailing lists. Each mailing list also provides an archive of all past conversations and discussions going back many years. Your question or problem may have already been addressed before, and a relevant or helpful solution may already exist in the archive.&lt;br /&gt;
&lt;br /&gt;
Discussions involving the USRP hardware and the UHD software itself are best addressed through the '''u​srp­-users''' ​mailing list at [http://usrp-users.ettus.com http://usrp-users.ettus.com].&lt;br /&gt;
&lt;br /&gt;
Discussions involving the use of [http://gnuradio.org/ GNU Radio] with USRP hardware and UHD software are best addressed through the '''d​iscuss­-gnuradio'''​ mailing list at [https://lists.gnu.org/mailman/listinfo/discuss­gnuradio https://lists.gnu.org/mailman/listinfo/discuss­gnuradio]​.&lt;br /&gt;
&lt;br /&gt;
Discussions involving the use of [http://openbts.org/ OpenBTS®] with USRP hardware and UHD software are best addressed through the '''o​penbts­-discuss​''' mailing list at [https://lists.sourceforge.net/lists/listinfo/openbts­discuss​ https://lists.sourceforge.net/lists/listinfo/openbts­discuss​].​&lt;br /&gt;
&lt;br /&gt;
The support page on our website is located at [https://www.ettus.com/support https://www.ettus.com/support]​. The Knowledge Base is located at ​[https://kb.ettus.com https://kb.ettus.com]​.&lt;br /&gt;
&lt;br /&gt;
==Legal Considerations==&lt;br /&gt;
Every country has laws governing the transmission and reception of radio signals. Users are solely responsible for insuring they use their USRP system in compliance with all applicable laws and regulations. Before attempting to transmit and/or receive on any frequency, we recommend that you determine what licenses may be required and what restrictions may apply.&lt;br /&gt;
&lt;br /&gt;
*NOTE: This USRP product is a piece of test equipment.&lt;br /&gt;
&lt;br /&gt;
==Sales and Ordering Support==&lt;br /&gt;
&lt;br /&gt;
If you have any non­-technical questions related to your order, then please contact us by email at [mailto:orders@ettus.com orders@ettus.com]​. Please be sure to include your order number and the serial number of your USRP.&lt;br /&gt;
&lt;br /&gt;
==Terms and Conditions of Sale==&lt;br /&gt;
Terms and conditions of sale can be accessed online at the following link: http://www.ettus.com/legal/terms-and-conditions-of-sale&lt;br /&gt;
&lt;br /&gt;
==Additional Resources==&lt;br /&gt;
&lt;br /&gt;
* [[NI_USRP-2974_Hardware_Resource_00 | USRP-2974 Hardware Resource]]&lt;br /&gt;
* http://www.ni.com/pdf/manuals/377416c.pdf &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Getting Started Guides]]&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:USRP_2974_frt_dia.jpg&amp;diff=4142</id>
		<title>File:USRP 2974 frt dia.jpg</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:USRP_2974_frt_dia.jpg&amp;diff=4142"/>
				<updated>2019-06-01T14:41:37Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Knowledge_Base&amp;diff=4141</id>
		<title>Knowledge Base</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=Knowledge_Base&amp;diff=4141"/>
				<updated>2019-06-01T14:37:48Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /*  Getting Started Guides */  added USRP-2974 link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Ettus Research Knowledge Base (KB). The KB is continuously being updated and expanded. If you have any suggestions, or do not find what you are looking for, then please [http://www.ettus.com/contact Contact Us].&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
== [[Getting Started Guides|&amp;lt;i class=&amp;quot;fa fa-road&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Getting Started Guides]] ==&lt;br /&gt;
&lt;br /&gt;
'''Motherboards'''&lt;br /&gt;
* [[B200/B210/B200mini/B205mini Getting Started Guides|B200/B210/B200mini/B205mini]]&lt;br /&gt;
* [[Ettus USRP E300 Embedded Family Getting Started Guides|E310/E312/E313]]&lt;br /&gt;
* [[E320 Getting Started Guide|E320]]&lt;br /&gt;
* [[N200/N210 Getting Started Guides|N200/N210]]&lt;br /&gt;
* [[USRP N300/N310/N320/N321 Getting Started Guide|N300/N310/N320/N321]]&lt;br /&gt;
* [[X300/X310 Getting Started Guides|X300/X310]]&lt;br /&gt;
* [[USRP-2974 Getting Started Guide|USRP-2974]]&lt;br /&gt;
&lt;br /&gt;
'''Daughterboards'''&lt;br /&gt;
* [[BasicTX/BasicRX Getting Started Guides|BasicTX/BasicRX]]&lt;br /&gt;
* [[CBX Getting Started Guides|CBX]]&lt;br /&gt;
* [[LFTX/LFRX Getting Started Guides|LFTX/LFRX]]&lt;br /&gt;
* [[SBX Getting Started Guides|SBX]]&lt;br /&gt;
* [[TwinRX Getting Started Guides|TwinRX]]&lt;br /&gt;
* [[UBX Getting Started Guides|UBX]]&lt;br /&gt;
* [[WBX Getting Started Guides|WBX]]&lt;br /&gt;
&lt;br /&gt;
'''Other'''&lt;br /&gt;
* [[Getting_Started_with_RFNoC_Development|RFNoC Development]]&lt;br /&gt;
* [[Live SDR Environment Getting Started Guides|Live SDR Environment]]&lt;br /&gt;
* [[OctoClock CDA-2990 Getting Started Guides|OctoClock CDA-2990]]&lt;br /&gt;
* [[Using Ethernet-Based Synchronization on the USRP™ N3xx Devices|White Rabbit]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Hardware Resources|&amp;lt;i class=&amp;quot;fa fa-cogs&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Hardware Resources]] ==&lt;br /&gt;
'''Motherboards'''&lt;br /&gt;
* [[B200/B210/B200mini/B205mini]]&lt;br /&gt;
* [[Ettus USRP E300 Embedded Family Hardware Resources|E310/E312/E313]]&lt;br /&gt;
* [[E320|E320]]&lt;br /&gt;
* [[N200/N210]]&lt;br /&gt;
* [[N300/N310]]&lt;br /&gt;
* [[N320/N321]]&lt;br /&gt;
* [[X300/X310]]&lt;br /&gt;
&lt;br /&gt;
'''Daughterboards'''&lt;br /&gt;
* [[BasicTX/BasicRX]]&lt;br /&gt;
* [[CBX]]&lt;br /&gt;
* [[LFTX/LFRX]]&lt;br /&gt;
* [[SBX]]&lt;br /&gt;
* [[TwinRX]]&lt;br /&gt;
* [[UBX]]&lt;br /&gt;
* [[WBX]]&lt;br /&gt;
&lt;br /&gt;
'''Other'''&lt;br /&gt;
* [[OctoClock CDA-2990]]&lt;br /&gt;
* [[GPSDO]]&lt;br /&gt;
* [[Antennas]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Software Resources|&amp;lt;i class=&amp;quot;fa fa-desktop&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Software Resources]] ==&lt;br /&gt;
'''Ettus Products'''&lt;br /&gt;
* [[UHD]]&lt;br /&gt;
* [[UHD Python API]]&lt;br /&gt;
* [[RFNoC]]&lt;br /&gt;
* [[Live SDR Environment]]&lt;br /&gt;
&lt;br /&gt;
'''Third Party'''&lt;br /&gt;
* [[GNU Radio]]&lt;br /&gt;
* [[LabVIEW]]&lt;br /&gt;
* [[Matlab/Simulink]]&lt;br /&gt;
* [[OpenBTS]]&lt;br /&gt;
* [[Eurecom OpenAirInterface (OAI)]]&lt;br /&gt;
* [[srsLTE/srsUE]]&lt;br /&gt;
* [[Gqrx]]&lt;br /&gt;
* [[Fosphor]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[UHD and USRP User Manual|&amp;lt;i class=&amp;quot;fa fa-flag&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; UHD and USRP User Manual]] ==&lt;br /&gt;
'''Software'''&lt;br /&gt;
* [http://files.ettus.com/manual/ UHD Manual]&lt;br /&gt;
&lt;br /&gt;
'''Motherboards'''&lt;br /&gt;
* [http://files.ettus.com/manual/page_usrp_b200.html  B200/B210/B200mini/B205mini]&lt;br /&gt;
* [http://files.ettus.com/manual/page_usrp_x3x0.html X300/X310]&lt;br /&gt;
* [http://files.ettus.com/manual/page_usrp2.html N200/N210]&lt;br /&gt;
* [http://files.ettus.com/manual/page_usrp_e3x0.html E310/E312]&lt;br /&gt;
&lt;br /&gt;
'''Daughterboards'''&lt;br /&gt;
* [http://files.ettus.com/manual/page_dboards.html#dboards_basictx BasicRX/LFRX]&lt;br /&gt;
* [http://files.ettus.com/manual/page_dboards.html#dboards_basicrx BasicTX/LFTX]&lt;br /&gt;
* [http://files.ettus.com/manual/page_dboards.html#dboards_cbx CBX]&lt;br /&gt;
* [http://files.ettus.com/manual/page_dboards.html#dboards_sbx SBX]&lt;br /&gt;
* [http://files.ettus.com/manual/page_dboards.html#dboards_wbx WBX]&lt;br /&gt;
* [http://files.ettus.com/manual/page_dboards.html#dboards_ubx UBX]&lt;br /&gt;
&lt;br /&gt;
'''Other'''&lt;br /&gt;
* [http://files.ettus.com/manual/page_octoclock.html OctoClock]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Application Notes|&amp;lt;i class=&amp;quot;fa fa-file-text-o&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Application Notes]] ==&lt;br /&gt;
Application Notes (AN) and technical articles written by engineers, for engineers. These articles offer experienced analysis, design ideas, reference designs, and tutorials—to make you productive and successful using USRP devices.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Additional Resources|&amp;lt;i class=&amp;quot;fa fa-book&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Additional Resources]] ==&lt;br /&gt;
* [[Suggested Reading|Suggested Reading]]&lt;br /&gt;
* [[Suggested Videos|Suggested Videos]]&lt;br /&gt;
* [[SDR Events]]&lt;br /&gt;
* [[CGRAN]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Technical Support|&amp;lt;i class=&amp;quot;fa fa-life-ring&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Technical Support]] ==&lt;br /&gt;
* [[Email|Email]]&lt;br /&gt;
* [[Mailing Lists|Mailing Lists]]&lt;br /&gt;
* [[Internet Relay Chat (IRC)|Internet Relay Chat (IRC)]]&lt;br /&gt;
* [[StackExchange|StackExchange]]&lt;br /&gt;
* [[Ordering and Fulfillment Help | Ordering and Fulfillment Help]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Faq|&amp;lt;i class=&amp;quot;fa fa-info-circle&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; FAQ]] ==&lt;br /&gt;
* [[Technical FAQ|Technical]]&lt;br /&gt;
* [[Licensing FAQ|Licensing]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-1-3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Legacy Products| &amp;lt;i class=&amp;quot;fa fa-hourglass-end&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Legacy Products]] ==&lt;br /&gt;
'''Motherboards'''&lt;br /&gt;
* [[USRP1|USRP1]]&lt;br /&gt;
* [[USRP2|USRP2]]&lt;br /&gt;
* [[E100/E110|E100/E110]]&lt;br /&gt;
* [[B100]]&lt;br /&gt;
&lt;br /&gt;
'''Daughterboards'''&lt;br /&gt;
* [[DBSRX2]]&lt;br /&gt;
* [[TVRX2]]&lt;br /&gt;
* [[XCVR2450]]&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=X300/X310_Device_Recovery&amp;diff=4038</id>
		<title>X300/X310 Device Recovery</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=X300/X310_Device_Recovery&amp;diff=4038"/>
				<updated>2019-02-25T18:15:45Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* Starting Xilinx Vivado Lab Edition */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Application Note Number==&lt;br /&gt;
'''AN-305'''&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;| 2017-05-02  &lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Nate Temple&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;| Initial creation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This application note covers the details of recovering the USRP X300/X310 via JTAG.&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
This application note covers the process of recovering the USRP X300/X310 by flashing the FPGA image via the JTAG interface.&lt;br /&gt;
&lt;br /&gt;
Note: Linux only. &lt;br /&gt;
&lt;br /&gt;
==Manual==&lt;br /&gt;
For reference, the user manual page for the X300/X310 is at the link below.&lt;br /&gt;
&lt;br /&gt;
http://files.ettus.com/manual/page_usrp_x3x0.html&lt;br /&gt;
&lt;br /&gt;
==Required Tools==&lt;br /&gt;
* Computer with USB2/3 and 1 GbE or 10GbE Interface &lt;br /&gt;
* Ubuntu 14.x or 16.x Installation&lt;br /&gt;
* UHD Installation&lt;br /&gt;
* USB2 Cable&lt;br /&gt;
* SFP+ / RJ45 Adapter &lt;br /&gt;
* Ethernet Cable&lt;br /&gt;
&lt;br /&gt;
==Prerequisites==&lt;br /&gt;
This application note assumes you have a Ubuntu 14.x or 16.x Linux installation. You should also have a working UHD installation. If you do not have UHD installed, please reference the [[Building and Installing the USRP Open-Source Toolchain (UHD and GNU Radio) on Linux]] Application Note.&lt;br /&gt;
&lt;br /&gt;
You will need to have the matching FPGA images downloaded before proceeding for your UHD installation. If you do not have the FPGA images downloaded, run the command:&lt;br /&gt;
&lt;br /&gt;
    sudo uhd_images_downloader&lt;br /&gt;
&lt;br /&gt;
Verify you have the FPGA images downloaded by running the command:&lt;br /&gt;
&lt;br /&gt;
    ls -alh /usr/local/share/uhd/images/usrp_x3*&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_19.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
==Installing Xilinx Vivado Lab 2015.4==&lt;br /&gt;
You will need to download and install Xilinx Vivado Lab Edition 2015.4 in order to flash the USRP X300/X310 via JTAG. Xilinx Vivado Lab Edition 2015.4 can be downloaded at the following link:&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Xilinx Vivado 2015.4 must be used. If you already have Xilinx Vivado Design or System Edition (2015.4) installed, they will work in place of the Lab Edition. If Design or System Edition is used, the paths may differ from  described within this application note, however the process is the same.&lt;br /&gt;
&lt;br /&gt;
https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/vivado-design-tools/archive.html&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_1.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After the download is complete, verify the MD5 sum of the file:&lt;br /&gt;
&lt;br /&gt;
    cd ~/Downloads&lt;br /&gt;
    md5sum Xilinx_Vivado_Lab_Lin_2015.4_1118_2.tar.gz&lt;br /&gt;
&lt;br /&gt;
'''Note:''' The filename and MD5 hash may differ from the screen capture shown. Verify the MD5 sum against the hash listed on the Xilinx download page.&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_2.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
Next, decompress the downloaded tarball:&lt;br /&gt;
&lt;br /&gt;
    tar -zxvf Xilinx_Vivado_Lab_Lin_2015.4_1118_2.tar.gz&lt;br /&gt;
&lt;br /&gt;
Next, go into the new directory and run the &amp;lt;code&amp;gt;xsetup&amp;lt;/code&amp;gt; installer (It requires &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; permissions to install):&lt;br /&gt;
&lt;br /&gt;
    cd Xilinx_Vivado_Lab_Lin_2015.4_1118_2&lt;br /&gt;
    sudo ./xsetup&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_3.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_4.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This will launch the Xilinx Vivado Lab installer. &lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_5.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You will be prompted that a newer version is available, ignore this popup and click &amp;lt;code&amp;gt;Continue&amp;lt;/code&amp;gt; to install Xilinx Vivado Lab 2015.4. &lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_7.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The installer will then be at a Welcome screen, click &amp;lt;code&amp;gt;Next&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_8.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You will then be prompted to accept the various License Agreements, click &amp;lt;code&amp;gt;Next&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_9.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You will then be prompted to select the install options. It is suggested to leave the default values, click &amp;lt;code&amp;gt;Next&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_10.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You will then be prompted with the installation locations. It is suggested to leave the default values, click &amp;lt;code&amp;gt;Next&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_11.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You will then be prompted to create the directory &amp;lt;code&amp;gt;/opt/Xilinx&amp;lt;/code&amp;gt;. Click &amp;lt;code&amp;gt;Yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_12.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finally, you will be at the Installation Summary prompt. Click &amp;lt;code&amp;gt;Install&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_13.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The installation process should only take a minute or two.&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_14.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You will then be prompted that the installation was successful. Click &amp;lt;code&amp;gt;Ok&amp;lt;/code&amp;gt;, and the installer will close.&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_15.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
==Installing the Digilent Cable Driver==&lt;br /&gt;
In order to use the JTAG interface built into the USRP X300/X310 front panel, you will need to install the Digilent Cable Driver. It is included with the Xilinx Vivado Lab Edition package.&lt;br /&gt;
&lt;br /&gt;
Navigate to the folder &amp;lt;code&amp;gt;/opt/Xilinx/Vivado_Lab/2015.4/data/xicom/cable_drivers/lin64/install_script/install_drivers&amp;lt;/code&amp;gt;, and run the installer script.&lt;br /&gt;
&lt;br /&gt;
    cd /opt/Xilinx/Vivado_Lab/2015.4/data/xicom/cable_drivers/lin64/install_script/install_drivers&lt;br /&gt;
    sudo ./install_digilent.sh&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_16.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next, reload the UDEV rules&lt;br /&gt;
&lt;br /&gt;
    sudo udevadm control --reload&lt;br /&gt;
&lt;br /&gt;
==Configuring Network Interface==&lt;br /&gt;
You will need to set your ethernet interface that will be connected to the USRP X300/X310 to a static IP address of &amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt; along with setting a MTU of &amp;lt;code&amp;gt;1500&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_36.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_33.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Connect the X300/X310==&lt;br /&gt;
Connect the USRP X300/X310 with the USB2 cable via the JTAG port on the front face plate. You can also attach the SFP+/RJ45 adapter to Port 0 and connect your computer via ethernet.&lt;br /&gt;
&lt;br /&gt;
Power on the USRP X300/X310.&lt;br /&gt;
&lt;br /&gt;
==Starting Xilinx Vivado Lab Edition==&lt;br /&gt;
Start by navigating back to your home directory:&lt;br /&gt;
&lt;br /&gt;
    cd ~/&lt;br /&gt;
&lt;br /&gt;
Next, start Xilinx Vivado Lab&lt;br /&gt;
&lt;br /&gt;
    /opt/Xilinx/Vivado_Lab/2015.4/bin/vivado_lab&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_18.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_20.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Open the Hardware Manager&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_21.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_22.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next, within the menu the of the Hardware Manager select &amp;lt;code&amp;gt;Tools&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Auto Connect&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_23.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The details of the FPGA should populate the window on the left side of the Hardware Manager.&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_24.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Right click on the FPGA listed, and select &amp;lt;code&amp;gt;Program Device&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_25.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This will popup a new window. Click on the file selection button and navigate to the location of the UHD FPGA images, and select the correct FPGA image for your device. (&amp;lt;code&amp;gt;/usr/local/share/uhd/images&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Select the correct FPGA image that matches your USRP (either &amp;lt;code&amp;gt;_x300&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;_x310&amp;lt;/code&amp;gt;) with the &amp;lt;code&amp;gt;.bit&amp;lt;/code&amp;gt; file extension. It is recommended to select the &amp;lt;code&amp;gt;_HG&amp;lt;/code&amp;gt; FPGA image, which will initialize Port 0 as 1 GbE and Port 1 as 10 GbE. Advanced users operating with dual 10 GbE may select the &amp;lt;code&amp;gt;_XG&amp;lt;/code&amp;gt; image, however you will need to adjust the instructions listed within this document to match the dual 10GbE configuration (IP Addresses, MTU settings, etc).   &lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_26.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_27.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_28.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_29.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next, click &amp;lt;code&amp;gt;Program&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_30.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A progress bar will popup as the FPGA is programmed. &lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_31.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Once the programming is completed, close Vivado Lab.&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_32.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Return to a terminal and attempt to ping the USRP X300/X310.&lt;br /&gt;
&lt;br /&gt;
    ping 192.168.10.2&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_34.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
Stop the ping with &amp;lt;code&amp;gt;CTRL-C&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
At this point, if you're able to ping the USRP X300/X310, attempt to run the UHD utility &amp;lt;code&amp;gt;uhd_usrp_probe&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    uhd_usrp_probe&lt;br /&gt;
&lt;br /&gt;
Example output from &amp;lt;code&amp;gt;uhd_usrp_probe&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
user@host:~$ uhd_usrp_probe &lt;br /&gt;
linux; GNU C++ version 5.4.0 20160609; Boost_105800; UHD_003.010.001.HEAD-0-gc705922a&lt;br /&gt;
&lt;br /&gt;
-- X300 initialization sequence...&lt;br /&gt;
-- Determining maximum frame size... 1472 bytes.&lt;br /&gt;
-- Setup basic communication...&lt;br /&gt;
-- Loading values from EEPROM...&lt;br /&gt;
-- Setup RF frontend clocking...&lt;br /&gt;
-- Radio 1x clock:200&lt;br /&gt;
-- [DMA FIFO] Running BIST for FIFO 0... pass (Throughput: 1304.3MB/s)&lt;br /&gt;
-- [DMA FIFO] Running BIST for FIFO 1... pass (Throughput: 1300.5MB/s)&lt;br /&gt;
-- [RFNoC Radio] Performing register loopback test... pass&lt;br /&gt;
-- [RFNoC Radio] Performing register loopback test... pass&lt;br /&gt;
-- [RFNoC Radio] Performing register loopback test... pass&lt;br /&gt;
-- [RFNoC Radio] Performing register loopback test... pass&lt;br /&gt;
-- Performing timer loopback test... pass&lt;br /&gt;
-- Performing timer loopback test... pass&lt;br /&gt;
  _____________________________________________________&lt;br /&gt;
 /&lt;br /&gt;
|       Device: X-Series Device&lt;br /&gt;
|     _____________________________________________________&lt;br /&gt;
|    /&lt;br /&gt;
|   |       Mboard: X310&lt;br /&gt;
|   |   revision: 8&lt;br /&gt;
|   |   revision_compat: 7&lt;br /&gt;
|   |   product: 30818&lt;br /&gt;
|   |   mac-addr0: 00:00:00:00:00:00&lt;br /&gt;
|   |   mac-addr1: 00:00:00:00:00:00&lt;br /&gt;
|   |   gateway: 192.168.10.1&lt;br /&gt;
|   |   ip-addr0: 192.168.10.2&lt;br /&gt;
|   |   subnet0: 255.255.255.0&lt;br /&gt;
|   |   ip-addr1: 192.168.20.2&lt;br /&gt;
|   |   subnet1: 255.255.255.0&lt;br /&gt;
|   |   ip-addr2: 192.168.30.2&lt;br /&gt;
|   |   subnet2: 255.255.255.0&lt;br /&gt;
|   |   ip-addr3: 192.168.40.2&lt;br /&gt;
|   |   subnet3: 255.255.255.0&lt;br /&gt;
|   |   serial: xxxxxxxx&lt;br /&gt;
|   |   FW Version: 5.1&lt;br /&gt;
|   |   FPGA Version: 33.0&lt;br /&gt;
|   |   RFNoC capable: Yes&lt;br /&gt;
|   |   &lt;br /&gt;
|   |   Time sources:  internal, external, gpsdo&lt;br /&gt;
|   |   Clock sources: internal, external, gpsdo&lt;br /&gt;
|   |   Sensors: ref_locked&lt;br /&gt;
|   |     _____________________________________________________&lt;br /&gt;
|   |    /&lt;br /&gt;
|   |   |       RX Dboard: A&lt;br /&gt;
|   |   |   ID: UBX-160 v1 (0x007a)&lt;br /&gt;
|   |   |   Serial: xxxxxxxx&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       RX Frontend: 0&lt;br /&gt;
|   |   |   |   Name: UBX RX&lt;br /&gt;
|   |   |   |   Antennas: TX/RX, RX2, CAL&lt;br /&gt;
|   |   |   |   Sensors: lo_locked&lt;br /&gt;
|   |   |   |   Freq range: 10.000 to 6000.000 MHz&lt;br /&gt;
|   |   |   |   Gain range PGA0: 0.0 to 31.5 step 0.5 dB&lt;br /&gt;
|   |   |   |   Bandwidth range: 160000000.0 to 160000000.0 step 0.0 Hz&lt;br /&gt;
|   |   |   |   Connection Type: IQ&lt;br /&gt;
|   |   |   |   Uses LO offset: No&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       RX Codec: A&lt;br /&gt;
|   |   |   |   Name: ads62p48&lt;br /&gt;
|   |   |   |   Gain range digital: 0.0 to 6.0 step 0.5 dB&lt;br /&gt;
|   |     _____________________________________________________&lt;br /&gt;
|   |    /&lt;br /&gt;
|   |   |       RX Dboard: B&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       RX Frontend: 0&lt;br /&gt;
|   |   |   |   Name: Unknown (0xffff) - 0&lt;br /&gt;
|   |   |   |   Antennas: &lt;br /&gt;
|   |   |   |   Sensors: &lt;br /&gt;
|   |   |   |   Freq range: 0.000 to 0.000 MHz&lt;br /&gt;
|   |   |   |   Gain Elements: None&lt;br /&gt;
|   |   |   |   Bandwidth range: 0.0 to 0.0 step 0.0 Hz&lt;br /&gt;
|   |   |   |   Connection Type: IQ&lt;br /&gt;
|   |   |   |   Uses LO offset: No&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       RX Codec: B&lt;br /&gt;
|   |   |   |   Name: ads62p48&lt;br /&gt;
|   |   |   |   Gain range digital: 0.0 to 6.0 step 0.5 dB&lt;br /&gt;
|   |     _____________________________________________________&lt;br /&gt;
|   |    /&lt;br /&gt;
|   |   |       TX Dboard: A&lt;br /&gt;
|   |   |   ID: UBX-160 v1 (0x0079)&lt;br /&gt;
|   |   |   Serial: xxxxxxxx&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       TX Frontend: 0&lt;br /&gt;
|   |   |   |   Name: UBX TX&lt;br /&gt;
|   |   |   |   Antennas: TX/RX, CAL&lt;br /&gt;
|   |   |   |   Sensors: lo_locked&lt;br /&gt;
|   |   |   |   Freq range: 10.000 to 6000.000 MHz&lt;br /&gt;
|   |   |   |   Gain range PGA0: 0.0 to 31.5 step 0.5 dB&lt;br /&gt;
|   |   |   |   Bandwidth range: 160000000.0 to 160000000.0 step 0.0 Hz&lt;br /&gt;
|   |   |   |   Connection Type: QI&lt;br /&gt;
|   |   |   |   Uses LO offset: No&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       TX Codec: A&lt;br /&gt;
|   |   |   |   Name: ad9146&lt;br /&gt;
|   |   |   |   Gain Elements: None&lt;br /&gt;
|   |     _____________________________________________________&lt;br /&gt;
|   |    /&lt;br /&gt;
|   |   |       TX Dboard: B&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       TX Frontend: 0&lt;br /&gt;
|   |   |   |   Name: Unknown (0xffff) - 0&lt;br /&gt;
|   |   |   |   Antennas: &lt;br /&gt;
|   |   |   |   Sensors: &lt;br /&gt;
|   |   |   |   Freq range: 0.000 to 0.000 MHz&lt;br /&gt;
|   |   |   |   Gain Elements: None&lt;br /&gt;
|   |   |   |   Bandwidth range: 0.0 to 0.0 step 0.0 Hz&lt;br /&gt;
|   |   |   |   Connection Type: IQ&lt;br /&gt;
|   |   |   |   Uses LO offset: No&lt;br /&gt;
|   |   |     _____________________________________________________&lt;br /&gt;
|   |   |    /&lt;br /&gt;
|   |   |   |       TX Codec: B&lt;br /&gt;
|   |   |   |   Name: ad9146&lt;br /&gt;
|   |   |   |   Gain Elements: None&lt;br /&gt;
|   |     _____________________________________________________&lt;br /&gt;
|   |    /&lt;br /&gt;
|   |   |       RFNoC blocks on this device:&lt;br /&gt;
|   |   |   &lt;br /&gt;
|   |   |   * DmaFIFO_0&lt;br /&gt;
|   |   |   * Radio_0&lt;br /&gt;
|   |   |   * Radio_1&lt;br /&gt;
|   |   |   * DDC_0&lt;br /&gt;
|   |   |   * DDC_1&lt;br /&gt;
|   |   |   * DUC_0&lt;br /&gt;
|   |   |   * DUC_1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If running &amp;lt;code&amp;gt;uhd_usrp_probe&amp;lt;/code&amp;gt; is successful, proceed with flashing the FPGA image with the UHD utility &amp;lt;code&amp;gt;uhd_image_loader&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Flashing the FPGA image via JTAG only does not write the FPGA image to EEPROM, you must run the &amp;lt;code&amp;gt;uhd_image_loader&amp;lt;/code&amp;gt; to write the FPGA image to the internal EEPROM.&lt;br /&gt;
&lt;br /&gt;
    uhd_image_loader --args &amp;quot;type=x300,addr=192.168.10.2,fpga=HG&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_37.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;code&amp;gt;uhd_image_loader&amp;lt;/code&amp;gt; has completed the flashing process, it will recommend to power cycle the USRP X300/X310. &lt;br /&gt;
&lt;br /&gt;
[[File:x300_recovery_38.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Power off the USRP X300/X310, remove the JTAG USB cable, and then power on the USRP X300/X310.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The USRP X300/X310 is now recovered. You should be able to &amp;lt;code&amp;gt;ping&amp;lt;/code&amp;gt;, run &amp;lt;code&amp;gt;uhd_usrp_probe&amp;lt;/code&amp;gt; and any other UHD utility/application as normal. &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>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Getting_Started_with_RFNoC_Development&amp;diff=3596</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=3596"/>
				<updated>2017-09-08T03:44:45Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* Revision History */&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 . 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;
    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 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 &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>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Getting_Started_with_RFNoC_Development&amp;diff=3595</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=3595"/>
				<updated>2017-09-08T03:41:24Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* RFNoC additional resources */&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;
==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 . 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;
    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 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 &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>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Getting_Started_with_RFNoC_Development&amp;diff=3594</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=3594"/>
				<updated>2017-08-26T20:28:17Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* Links and Additional Resources */&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;
==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 . 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;
    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 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 &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;
* [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>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Getting_Started_with_RFNoC_Development&amp;diff=3593</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=3593"/>
				<updated>2017-08-26T17:24:09Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* Revision History */&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;
==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 . 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;
    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 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 &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://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>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Getting_Started_with_RFNoC_Development&amp;diff=3592</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=3592"/>
				<updated>2017-08-26T17:16:00Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* Using a graphical interface */&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;
==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 . 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;
    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 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 &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://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>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Getting_Started_with_RFNoC_Development&amp;diff=3591</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=3591"/>
				<updated>2017-08-26T17:13:38Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* Using a graphical interface */&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;
==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 . 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;
    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 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 &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. 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;
'''12. 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;
'''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://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>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:rfnoc_gsg_an_11.png&amp;diff=3590</id>
		<title>File:rfnoc gsg an 11.png</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:rfnoc_gsg_an_11.png&amp;diff=3590"/>
				<updated>2017-08-26T17:09:27Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: JoseLoera uploaded a new version of File:rfnoc gsg an 11.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Getting_Started_with_RFNoC_Development&amp;diff=3589</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=3589"/>
				<updated>2017-08-26T17:08:01Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* Using a graphical interface */&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;
==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 . 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;
    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 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 &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. 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;
'''12. 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;
'''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 and 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://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>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=File:rfnoc_gsg_an_13.png&amp;diff=3588</id>
		<title>File:rfnoc gsg an 13.png</title>
		<link rel="alternate" type="text/html" href="https://kb.ettus.com/index.php?title=File:rfnoc_gsg_an_13.png&amp;diff=3588"/>
				<updated>2017-08-26T16:14:04Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: JoseLoera uploaded a new version of File:rfnoc gsg an 13.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Getting_Started_with_RFNoC_Development&amp;diff=3587</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=3587"/>
				<updated>2017-08-26T15:54:23Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* Abstract */&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;
==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 . 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;
    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 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 &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 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>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Getting_Started_with_RFNoC_Development&amp;diff=3531</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=3531"/>
				<updated>2017-06-09T19:58:12Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* 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;
==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. [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 . 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;
    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 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 &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 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>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Getting_Started_with_RFNoC_Development&amp;diff=3530</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=3530"/>
				<updated>2017-06-09T19:57:10Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* Build custom image with pre-built RFNoC blocks */&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;
==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. [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 . 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;
    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 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>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Getting_Started_with_RFNoC_Development&amp;diff=3529</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=3529"/>
				<updated>2017-06-09T19:55:15Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* Adding custom blocks to OOT Module */&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;
==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. [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 “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;
    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 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>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Getting_Started_with_RFNoC_Development&amp;diff=3528</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=3528"/>
				<updated>2017-06-09T19:52:21Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* Creating and running HDL testbenches */&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;
==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. [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 “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 ('''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 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>JoseLoera</name></author>	</entry>

	<entry>
		<id>https://kb.ettus.com/index.php?title=Getting_Started_with_RFNoC_Development&amp;diff=3527</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=3527"/>
				<updated>2017-06-09T18:16:33Z</updated>
		
		<summary type="html">&lt;p&gt;JoseLoera: /* GNU Radio Companion Bindings */&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;
==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. [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 “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 ('''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 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>JoseLoera</name></author>	</entry>

	</feed>