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

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.


Komponente 2: die Firmwaredatei (bit-Datei)

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

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.

Beispielapplikation zum AD-FMCOMMS4-EBZ FMC Transceiver