Field Guide · technology

Also known as: UHD, USRP Hardware Driver

UHD (the USRP Hardware Driver) is the free, open-source driver and host-side API that connects a computer to Ettus Research’s USRP family of software-defined radios.1 It is the single supported way to move IQ samples between a host program and a USRP, whether that USRP is a $300 bus-powered B200 or a rack-mounted X310 on 10-gigabit Ethernet. Applications link against UHD’s library, and UHD hides the differences between USRP models behind one consistent set of calls.

host app(GNU Radio…) UHD lib USRP FPGA(DDC/DUC) RF front end(ADC/DAC) USB / Ethernet transport UHD: one API from host code down to the radio
UHD sits between a host application and the USRP hardware, carrying sample streams and control over USB or Ethernet while presenting one uniform API across all USRP models.

How it works

At the center of UHD is the multi_usrp object, a handle that represents one or more USRP devices as a single logical radio. A program constructs it from a device-address string (type=b200, addr=192.168.10.2, and so on), then issues uniform calls: set the center frequency, set the sample rate, choose a gain, pick an antenna port, and open a streamer to pull IQ buffers. The same code drives a USB-3 B-series board and an Ethernet-attached X-series chassis; UHD selects the right transport and negotiates the sample format underneath.

A USRP splits work between host and hardware. On the device, an FPGA runs a digital down-converter and interpolator so it can resample and frequency-shift on-board, delivering exactly the rate the host asked for; the host then does the protocol-specific DSP. UHD manages that division:

  • Streaming and flow control — it moves fixed-size sample packets across USB or Ethernet, handling back-pressure, sequence numbers, and overflow (“O”) / underflow (“U”) reporting so the host learns when it fell behind.
  • Timed commands and timestamps — every sample burst carries a timestamp from the device clock, and commands can be scheduled for a future time, which is what makes coherent multi-channel and MIMO capture possible.
  • Clock and time synchronization — UHD disciplines the USRP to an internal, GPSDO, or external 10 MHz / PPS reference so several radios share one time base.
  • Calibration and daughterboards — it loads per-board gain, DC-offset, and IQ-imbalance corrections and abstracts the interchangeable RF daughterboards that set a USRP’s frequency coverage.

Higher-end USRPs also expose RFNoC (RF Network-on-Chip), a framework for loading custom DSP blocks into the FPGA; UHD carries the control and data streams to and from those blocks, so heavy processing can run on the device rather than the host.

Relevance to SDR

UHD is the foundation of the USRP ecosystem and, by extension, a large amount of research and production SDR. GNU Radio talks to USRPs through its gr-uhd blocks; gr-osmosdr and SoapySDR both offer UHD back ends so a USRP looks like any other source; and countless standalone tools — spectrum monitors, cellular test beds, radio-astronomy receivers, and passive-radar rigs — link UHD directly. Because UHD exposes device timestamps and a shared clock, it is the usual choice whenever an experiment needs phase-coherent multichannel capture, which cheaper single-chip dongles cannot provide. It runs on Linux, Windows, and macOS and ships both C++ and Python bindings.

GopherTrunk does not link UHD. GopherTrunk is a pure-Go decoder whose front-end support targets inexpensive receive-only radios (RTL-SDR, Airspy, and network sources), so it has no dependency on the USRP toolchain and ships as a single static binary. A USRP is overkill for receiving one trunking control channel, but UHD matters to the broader context GopherTrunk lives in: it is the reference example of a well-designed host driver — uniform API, explicit overflow signaling, device timestamps, and a clean split of DSP between hardware and host — the same concerns GopherTrunk handles in Go for its own supported radios.

Sources

  1. UHD manual — Ettus Research, documenting the multi_usrp API, streaming and flow control, timed commands and timestamps, clock synchronization, and RFNoC. 

See also