Logo
OpenCPI Release: v2.4.9

OpenCPI System Support Packages (OSPs)

  • LibreSDR OSP
    • OpenCPI LibreSDR Getting Started Guide
      • Document Revision History
      • How to Use This Document
      • Overview
      • Installation Prerequisites
      • Installation Steps for Platforms
        • Required Downloads for Installing the Platform
        • Details for Installing the RCC Platform
        • Details for Installing the HDL Platform
      • Setting up the LibreSDR After its Platforms are Installed
        • Details for Establishing a Serial Console Connection
        • Details for Configuring the Runtime Environment on the Embedded System
  • PlutoSDR OSP
    • OpenCPI Analog Devices PlutoSDR Getting Started Guide
      • Document Revision History
      • How to Use This Document
      • Overview
      • Installation Summary
      • Enabling PlutoSDR Modes of Operation
        • Enabling PlutoSDR-as-Device Mode
        • Enabling PlutoSDR-as-Host Mode
      • Updating the PlutoSDR Firmware
      • Issues Regarding Storage
      • Setting up the PlutoSDR After its Platforms are Installed
        • Details for Establishing a Serial Console Connection for the PlutoSDR
        • Details for Configuring the Runtime Environment for the PlutoSDR
  • Xilinx OSP
    • Getting Started Guides
      • OpenCPI Xilinx ZC706 Getting Started Guide
        • Document Revision History
        • How to Use This Document
        • Overview
        • Installation Prerequisites
        • Installation Steps for Platforms
        • Setting up the ZC706 After its Platforms are Installed
      • OpenCPI Xilinx ZCU102 Getting Started Guide
        • Document Revision History
        • How to Use This Document
        • Overview
        • Installation Prerequisites
        • Installation Summary
        • Setting up the ZCU102 Hardware
        • Enabling OpenCPI Development for the ZCU102
      • OpenCPI Xilinx ZCU111 Getting Started Guide
        • Document Revision History
        • How to Use This Document
        • Overview
        • Installation Prerequisites
        • Installation Summary
        • Setting up the ZCU111 Hardware
        • Enabling OpenCPI Development for the ZCU111

Component Projects

  • OpenCPI Haifuraiya
    • Applications
      • DVB-S2 Downlink ACI (downlink_aci)
        • Description
        • Hardware Portability
        • Execution
        • Verification
        • Troubleshooting
        • Worker Properties
      • DVB-S2 Downlink + Spectrum Monitor ACI (haifuraiya_aci)
        • Description
        • Hardware Portability
        • Prebuilt SD Card Images
        • Execution
        • Verification
        • Troubleshooting
        • Worker Properties
        • Receiving the Signal
      • DVB-S2 Downlink + OPV 64-Channel Receiver ACI (haifuraiya_opv)
        • Description
        • Execution
        • Verification
      • Log Power FFT (log_power_fft_app)
        • Description
        • Hardware Portability
        • Execution
        • Verification
        • Troubleshooting
      • Log-Power FFT UDP Viewer (log_power_fft_udp_app)
        • Description
        • Hardware Portability
        • Execution
        • Verification
        • Troubleshooting
      • Log Power FFT Web Sockets (log_power_fft_ws)
        • Description
        • Hardware Portability
        • Execution
        • Verification
        • Troubleshooting
    • Components Component Library
      • Windower (windower_xs_4k)
        • Design
        • Interface
        • Implementations
        • Example Application
        • Dependencies
        • Limitations
        • Testing
      • Windower Proxy (windower_xs_proxy)
        • Design
        • Interface
        • Implementations
        • Example Application
        • Dependencies
        • Limitations
        • Testing
      • DVB-S2 Encoder (dvbs2_encoder)
        • Function
        • Interface
        • Implementations
        • Example Application
        • Dependencies
        • Limitations
        • Testing
      • Xilinx Fast Fourier Transform (xilinx_fft)
        • Function
        • Implementations
        • Example Application
        • Dependencies
        • Limitations
        • Testing
  • OpenCPI Opulent-Voice
    • Opulent Voice Component Library
      • Chan Select (chan_select)
        • Design
        • Interface
        • Implementations
        • Dependencies
        • Limitations
        • Testing
      • 16-Channel Folded Carrier Recovery (cr_x16)
        • Design
        • Interface
        • Implementations
        • Dependencies
        • Limitations
        • Testing
      • Decimate-by-N (decimate3)
        • Design
        • Interface
        • Implementations
        • Dependencies
        • Limitations
        • Testing
      • Differential Soft Decision, 16-Channel Folded (dsd_x16)
        • Design
        • Interface
        • Implementations
        • Dependencies
        • Limitations
        • Testing
      • Frame Merge 4 (frame_merge4)
        • Design
        • Interface
        • Implementations
        • Dependencies
        • Limitations
        • Testing
      • Framer 16 (framer16)
        • Design
        • Interface
        • Implementations
        • Dependencies
        • Limitations
        • Testing
      • Frame Synchronizer, 16-Channel Folded (fs_x16)
        • Design
        • Interface
        • Implementations
        • Dependencies
        • Limitations
        • Testing
      • MSK Decode x16 Back-End (msk_decode_x16)
        • Design
        • Interface
        • Implementations
        • Dependencies
        • Limitations
        • Testing
      • MSK Demod x16 (msk_demod_x16)
        • Design
        • Interface
        • Implementations
        • Dependencies
        • Limitations
        • Testing
      • Tag Select (tag_select)
        • Design
        • Interface
        • Implementations
        • Dependencies
        • Limitations
        • Testing
      • 16-Channel Folded Symbol Timing Recovery (ted_x16)
        • Design
        • Interface
        • Implementations
        • Dependencies
        • Limitations
        • Testing
      • Burst Detect x16 (bd_x16)
        • Function
        • Interface
        • Implementations
        • Dependencies
        • Limitations
        • Testing
      • Polyphase Channelizer (channelizer)
        • Function
        • Interface
        • Implementations
        • Dependencies
        • Limitations
        • Testing
      • MSK Demodulator (msk_demod)
        • Function
        • Interface
        • Implementations
        • Dependencies
        • Limitations
        • Testing
      • MSK Modulator (msk_mod)
        • Function
        • Interface
        • Implementations
        • Dependencies
        • Limitations
        • Testing
    • Primitives
      • Dsp Primitive Library
    • Applications
      • Transmit
      • Receive
      • Simulation / bring-up
        • SKELETON NAME (msk_ber)
OpenCPI assets
  • OpenCPI Haifuraiya
  • Applications
  • DVB-S2 Downlink ACI (downlink_aci)

DVB-S2 Downlink ACI (downlink_aci)

Transmit IP network traffic over a DVB-S2 RF link using FPGA-based encoding.

Description

downlink_aci bridges a Linux TUN virtual network interface to a DVB-S2 RF transmitter. IP packets arriving on the TUN interface are encapsulated using Generic Stream Encapsulation (GSE, ETSI TS 102 606), packed into DVB-S2 Baseband (BB) frames, and streamed to the on-board FPGA DVB-S2 encoder via the OpenCPI Application Control Interface (ACI).

The application uses a two-thread architecture:

  • TUN reader thread — reads IP packets from the TUN device, fragments them into GSE packets sized to fit the BB frame data field, and pushes complete BB frames onto a bounded queue.

  • Main thread — blocks on getOutputBuffer until the FPGA encoder has a free DMA buffer, then dequeues and sends the next BB frame. If the queue is empty (no IP traffic), a pre-built GSE null-packet padding frame is sent instead to keep the encoder fed.

The FPGA application (downlink_aci.xml) connects:

  1. The external bbframe_input port to the dvbs2_encoder worker input.

  2. The dvbs2_encoder output to the Digital Radio Controller (DRC) TX port.

Default DVB-S2 parameters (compile-time constants in downlink_aci.cc):

Parameter

Value

Frame type

Long frame (FECFRAME = 64 800 bits)

Constellation

QPSK

Code rate

9/10

Pilots

Disabled

MATYPE1

0x72 (GSE mode, roll-off 0.20)

BB frame size

7153 bytes (derived from DVB-S2 ETSI EN 302 307 tables)

DRC TX configuration (downlink_aci.xml):

Parameter

Value

Center frequency

400.0 MHz

Bandwidth

20 MHz

Sample rate

4.0 MSPS

Gain

−50 dB (manual)

Hardware Portability

This application is designed to run on the following platforms:

Hardware

RCC Platform

HDL Platform

ADALM-PLUTOSDR

adi_plutosdr0_39

plutosdr

LibreSDR

xilinx24_1_aarch32

libresdr

Xilinx ZC706

xilinx24_1_aarch32

zc706

Xilinx ZCU102

xilinx24_1_aarch64

zcu102

Execution

Prerequisites

  1. Build the project for the PlutoSDR RCC and HDL platforms.

  2. Deploy the bitstream and application artifacts to the target hardware.

  3. Ensure the OpenCPI runtime is available on the target.

  4. The application opens /dev/net/tun and requires either root privileges or CAP_NET_ADMIN on the target system.

Command(s)

Run the application on the target hardware:

./downlink_aci

The application prints the name of the TUN interface it allocates (e.g. tun0) and the commands needed to bring it up:

sudo ip link set tun0 up
sudo ip addr add 10.0.0.1/24 dev tun0

After running those commands, any IP traffic routed to the 10.0.0.1/24 subnet will be encapsulated and transmitted over the DVB-S2 RF link.

Verification

  • The application prints Running: FPGA encoder backpressure active via getOutputBuffer once the encoder is started.

  • Sending a ping from the host to 10.0.0.2 will produce GSE encapsulation debug output on stdout showing the fragment structure and CRC-32 of each GSE packet.

  • A spectrum analyzer or DVB-S2 receiver tuned to 400 MHz should detect the QPSK signal.

Troubleshooting

  • Cannot open /dev/net/tun — the process lacks CAP_NET_ADMIN; run as root or grant the capability.

  • Cannot ioctl TUNSETIFF — the tun kernel module is not loaded; run modprobe tun.

  • app failed: … — an OpenCPI runtime error occurred (bitstream not loaded, DRC initialization failure, etc.). Check that the correct bitstream is programmed and that the DRC worker is available for the target platform.

  • BB queue full, dropping oldest frame — the FPGA encoder cannot consume frames as fast as IP traffic arrives. Reduce traffic rate or verify that the encoder bitstream is running at the expected sample rate.

Worker Properties

The dvbs2_encoder worker (instance enc) exposes a regs array property used at startup to configure the QPSK constellation mapper:

Register offset

Value written

Description

0x110 + 0

(+I, +Q)

QPSK symbol (+1, +1)

0x110 + 4

(+I, −Q)

QPSK symbol (+1, −1)

0x110 + 8

(−I, +Q)

QPSK symbol (−1, +1)

0x110 + 12

(−I, −Q)

QPSK symbol (−1, −1)

Each 32-bit register packs the I sample in the upper 16 bits and the Q sample in the lower 16 bits. The magnitude used is 32 000 (out of a signed 16-bit range of ±32 767).

Previous Next

Last updated on 24 June 2026.