FMC Projekte: Software Definded Radio
Transceiver AD FMCOMMS4
Dieses Projekt beinhaltet die Verwendung eines Transceivermoduls zum Empfang und Senden von Kommunikationssignalen. Durch die Verbindung von Deltaboard und FMC Modul lässt sich ein SDR System aufbauen, welches nicht nur in der Lage ist, als Frontend für eine PC Applikation zu fungieren, sondern durch die Option der dynamischen Rekonfiguration des Nutzer-FPGAs ebenso eine Vor-/Nachverarbeitung des Signals zur Entlastung der softwareseitigen Algorithmen beinhalten kann.
Die Umsetzung dieses Projektes bieten wir in unserem Shop auch fertig montiert und konfiguriert als komplettes SDR System aus Deltaboard, Transceivermodul und Gehäuse an.




Komponente 1: das FMC Modul

Transceivermodul FMCOMMS4 von Analog Devices
Als Transceiver für dieses Projekt wird das AD-FMCOMMS4-EBZ Modul von Analog Devices mit folgenden Grundparametern genutzt:
- AD9364 Wideband Software Defined Radio Board
- 12 Bit IQ ADC/DAC
- Frequenzbereich: 70 - 6000 MHz
- Bandbreite: 250 kHz - 50 MHz
- konfigurierbare FIR Filter
- FMC Dateninterface: CMOS/LVDS
- Konfigurationsinterface: SPI
Dieses Modul ist bei diversen Distributoren für elektronische Komponenten erhältlich. Eine detaillierte Beschreibung findet man zudem unter AD-FMCOMMS4-EBZ (Analog Devices).
Das Modul wird zur Nutzung auf das Deltaboard aufgesetzt und im besten Fall mittels Abstandshaltern über die Befestigungslöcher fixiert.
Die folgenden beiden Dateien bilden das Grundsystem des SDR Transceivers:
- Dieses Teilsystem implementiert das Interface zum Parametrieren des FMC Moduls über die Zugriffsfunktionen der zugehörigen Softwarebibliothek sowie die Datenschnittstelle zwischen Nutzer-FPGA und AD9364 Transceiver.
- Xilinx ISE VHDL Projekt der FMC-Konnektor-FPGA Firmware zum Transceiver AD-FMCOMMS4-EBZ
- Die Datei enthält das gesamte Xilinx ISE VHDL Projekt zur FMC Konnektor FPGA Firmware als Beispiel zur Implementierung der Schnittstellen und Grundlage für individuelle Anpassungen.
- Dieses Teilsystem routet lediglich die Daten vom/zum FMC Modul. Eine Verarbeitung der Daten findet nicht statt.
Die Dateien können unter Nutzung der Funktionen der Basisbibliothek für das jeweiligen FPGA programmiert werden. Alternativ zu einer eigenen Programmiersoftware steht im allgemeinen Downloadbereich eine grafische Applikation zur Deltaboardkonfiguration zur Verfügung.
Komponente 3: die Softwarebibliothek (DLL) mit den spezifischen Zugriffsfunktionen
Zur Parametrierung des FMCOMMS4 Moduls steht folgende Bibliothek zur Verfügung:
- Windows C# Klassenbibliothek brDLL_FMCOMMS4
Zur Kommunikation mit dem Board ist zusätzlich die Basisbibliothek brBaseDLL sowie bei Verwendung der Cypress USB 3.0 Schnittstelle ebenso die herstellereigene Bibliothek CyUSB.dll notwendig. Diese müssen im selben Ordner wie die Bibliothek brDLL_FMCOMMS4 liegen. - Linux Bibliothek ... folgt ...
Die Funktionen der Bibliothek stehen zum einen für die objektorienterte Nutzung, zusätzlich aber auch zum einfachen statischen Aufruf zur Verfügung. Als Grundlage zur objektorientierten Kommunikation dient eine Instanz der Basisbibliothek brBaseDLL, welche beim Aufruf des Konstruktors übergeben wird. Über dieses Objekt sollte in einer Applikation auch die Dateninteraktion über die Deltaboard-Grundfunktionen erfolgen. (Beachte: Vor einem Aufruf der Parametrierfunktionen muss die Schnittstelle des brBase-Objektes geöffnet werden.)
Die folgende Tabelle zeigt eine Aufstellung der statischen und objektorientierten (oo) Funktionen der Bibliothek brDLL_FMCOMMS4:
Beschreibung | Art | Funktion | Parameter |
Konstruktor | public brFMCOMMS4(brBase brBaseIF) | brBaseIF = Objekt der brBaseDLL, über welche die Kommunikation abgewickelt werden soll | |
einen Registerwert aus dem FMCOMMS4 (AD9364) auslesen | statisch | public static Boolean read_register(String io_interface, int address, out byte value, Boolean info) | io_interface = Interface zur Datenübertragung (usb.., IP-Adresse, COM..) address = Registeradresse value = ausgelesener Registerwert (Ausgabeparameter) info = Statusinformationen ausgeben / nicht ausgeben |
oo | public Boolean read_register(int address, out byte value) | ||
einen Registerwert in das FMCOMMS4 (AD9364) schreiben | statisch | public static Boolean write_register(String io_interface, int address, byte value, Boolean info) | io_interface = Interface zur Datenübertragung (usb.., IP-Adresse, COM..) address = Registeradresse value = zu schreibender Registerwert info = Statusinformationen ausgeben / nicht |
oo | public Boolean write_register(int address, byte value) | ||
das FMCOMMS4 (AD9364) zurücksetzen | statisch | public static Boolean reset_module(String io_interface, Boolean info) | io_interface = Interface zur Datenübertragung (usb.., IP-Adresse, COM..) info = Statusinformationen ausgeben / nicht |
oo | public Boolean reset_module() | ||
Abtastwertepaket abrufen | statisch | public static Boolean readSamplePacket(String io_interface, String direction, UInt16 numberOfSamples, out byte[] samples, Boolean info) | io_interface = Interface zur Datenübertragung (usb.., IP-Adresse, COM..) direction = Datenrichtung der abgerufenen Signalproben(Rx, Tx) numberOfSamples = Anzahl der abzurufenden IQ-Abtastwerte samples = Array mit den abgerufenene Abtastwerten (ein IQ-Wert besteht aus 2 mal 16 Bit)(Ausgabeparameter) info = Statusinformationen ausgeben / nicht |
oo | public Boolean readSamplePacket(String direction, UInt16 numberOfSamples, out byte[] samples) | ||
Parametrieren des Transceivers | statisch | public static Boolean setRFParameter(String io_interface, double bandwidth, String rx_connector, double rx_frequency, UInt16 rx_gain, String tx_connector, double tx_frequency, UInt16 tx_gain, out double reached_bandwidth, out double reached_rx_frequency, out UInt16 reached_rx_gain, out double reached_tx_frequency, out UInt16 reached_tx_gain, Boolean info) | io_interface = Interface zur Datenübertragung (usb.., IP-Adresse, COM..) bandwidth = einzustellende Bandbreite/Abtastrate in Hertz rx_connector = Rx Signalkonnector (RxA, RxB) rx_frequency = einzustellende Rx Mittenfrequenz in Hertz rx_gain = einzustellende Rx Verstärkung in dB tx_connector = Tx Signalkonnector (TxA, TxB) tx_frequency = einzustellende Tx Mittenfrequenz in Hertz tx_gain = einzustellende Tx Verstärkung in dB reached_bandwidth = erreichte Bandbreite in Hertz (Ausgabewert) reached_rx_frequency = erreichte Rx Mittenfrequenz in Hertz (Ausgabewert) reached_rx_gain = erreichte Rx Verstärkung in dB (Ausgabewert) reached_tx_frequency = erreichte Tx Mittenfrequenz in Hertz (Ausgabewert) reached_tx_gain = erreichte Tx Verstärkung in dB (Ausgabewert) info = Statusinformationen ausgeben / nicht |
oo | public Boolean setRFParameter(double bandwidth, String rx_connector, double rx_frequency, UInt16 rx_gain, String tx_connector, double tx_frequency, UInt16 tx_gain, out double reached_bandwidth, out double reached_rx_frequency, out UInt16 reached_rx_gain, out double reached_tx_frequency, out UInt16 reached_tx_gain) |
Beispielapplikation

Beispielapplikation für ein SDR System aus Basis Deltaboard + AD-FMCOMMS4-EBZ Modul
Als Demonstration der Verwendung der Bibliotheksfunktionen steht folgende Beispielapplikation inkl. Visual Studio C# Projekt zur Verfügung. Nach der Herstellung einer Verbindung mit dem Deltaboard und Parametrierung des FMC Moduls ruft die Anwendung über einen Timer Abtastwertpakete für den Empfangs- sowie Sendepfad ab und stellt die entsprechende FFT in den Fenstern dar. Daneben besteht die Möglichkeit, das Empfangssignal aufzuzeichnen bzw. ein aufgezeichnetes Signal wieder auszusenden. Die Applikation soll als Grundlage für die individuelle Anpassung und Erweiterung dienen.