Signalverarbeitung Digitale Filter mit Matlab und FPGA-in-the-Loop entwickeln

Von Pablo Trujillo

Digitale Filter in FPGAs verwenden oftmals Festkomma-Arithmetik. Die Auswirkungen der Quantisierung müssen während der Entwicklung überprüft werden, vorzugsweise mit Hardware-in-the-Loop. Matlab und ein Eclypse Z7 FPGA-Board mit Datenwandlermodulen vereinfachen den Entwurf.

Firma zum Thema

Das Eclypse Z7 Zynq 7000 SoC FPGA-Board von Digilent kann als FPGA-in-the-Loop in die Matlab- und Simulink-Umgebungen eingebunden werden.
Das Eclypse Z7 Zynq 7000 SoC FPGA-Board von Digilent kann als FPGA-in-the-Loop in die Matlab- und Simulink-Umgebungen eingebunden werden.
(Bild: Digilent)

Sobald Entwickler den Begriff „Software für Ingenieure“ hören, denken sie meistens sofort an Matlab. Es gibt nur wenige Bereiche im Ingenieurwesen, für die Matlab kein Paket bereitstellt. Digitale Signalverarbeitung und FPGA-Design sind Kernelemente dieser Software. Die Signal Processing Toolbox bietet Entwicklern alle Funktionen, die sie zum Erstellen von Filtern oder anderen Signalverarbeitungssystemen benötigen.

Mit dem Fixed-Point Designer können sie ihre Daten quantisieren, Festkomma- und Fließkomma-Algorithmen in ihrem Verarbeitungssystem implementieren und deren Auswirkungen auf das digitale System überprüfen. Und Pakete wie HDL Coder , HDL Verifier und FPGA Data Capture ermöglichen es ihnen, ihren Entwurf auf einem realen FPGA als Hardware-in-the-Loop zu testen und das resultierende System dann vollständig auf ihr FPGA-Board zu übertragen. Dieses Vorgehen vereinfacht das Entwickeln eines Signalverarbeitungssystems erheblich.

Bildergalerie
Bildergalerie mit 8 Bildern

Bandpassfilter für Kommunikationssystem

Nehmen wir an, wir wollen ein Bandpassfilter für ein Kommunikationssystem entwerfen, um einen bestimmten Kanal aus einer Übertragung zu extrahieren, die Frequenzmultiplexing (Frequency Division Multiplexing / FDM) verwendet. Diese Technik wird seit langer Zeit eingesetzt, um beispielsweise verschiedene Radiosender über dasselbe Medium, die Luft, zu verbreiten. Ein weiteres Anwendungsgebiet ist die Power Line Communication (PLC), bei der wir Strom mit Netzfrequenzen von 50 oder 60 Hertz und Daten mit Frequenzen von mehreren hundert Kilohertz übertragen können.

Nachdem wir das Filter entworfen haben, wollen wir es mit echter Hardware überprüfen. So ein Hardwaresystem könnte beispielsweise aus einem Eclypse Z7 Zynq-7000 SoC (System-on-Chip) FPGA-Board von Digilent mit jeweils einem aufgesteckten Zmod Scope 1410 2-Kanal 14-Bit Oszilloskop-Modul und einem Zmod AWG 1411 2-Kanal 14-Bit Arbitrary-Waveform-Generator-Modul – beide von Digilent – bestehen. Mithilfe des Analog-Digital-Wandlers (ADC) des Zmod Scope 1410 können wir das Leitungssignal digitalisieren und sowohl das abgetastete als auch das gefilterte Signal über den Digital-Analog-Wandler (DAC) des Zmod AWG ausgeben, während das Filter selbst auf dem Zynq-7000 läuft.

Das Filter entwerfen und quantisieren

Bild 2 zeigt das Frequenzspektrum unserer Übertragungsleitung. Jeder Kanal besitzt eine Bandbreite von 20 kHz, und die Kanäle haben einen Abstand von jeweils 100 kHz. Wir interessieren uns für Kanal 1, und wir müssen unser Bandpassfilter so gestalten, dass wir Störungen durch die anderen Kanäle vermeiden. Zu diesem Zweck müssen wir eine Dämpfung von mindestens -60 dB im Bereich der Bandbreite der benachbarten Kanäle sicherstellen. Um das zu erreichen, sollte unser Filter einen Durchlassbereich zwischen 990 kHz und 1010 kHz, einen unteren Sperrbereich von 0 Hz bis 910 kHz und einen oberen Sperrbereich ab 1090 kHz aufweisen.

Das Filter-Designer-Tool von Matlab ermöglicht es uns, all diese Parameter einzustellen. Für unser Beispiel verwenden wir ein IIR-Butterworth-Filter (Infinite Impulse Response), da dieser Typ es uns erlaubt, ein Filter niedriger Ordnung mit hoher Dämpfung zu entwerfen. Gleichzeitig weist es einen relativ flachen Durchlassbereich auf. Die Abtastfrequenz wählen wir so, dass sie sowohl den Hardwareanforderungen unserer Datenwandler – 105 MSamples/s für den AD9648-105 ADC von Analog Devices auf dem Zmod Scope und 100 MSamples/s für den AD9717 DAC auf dem Zmod AWG, ebenfalls von Analog Devices – als auch dem Nyquist-Abtasttheorem entspricht. Für unser Beispiel sind 10 MSamples/s ausreichend.

Da die Datenwandler mit einer 14-Bit Festkomma-Arithmetik arbeiten, müssen wir die Datenworte des Filters über das Filter-Quantization-Panel des Filter-Designer-Tools quantisieren. Sie müssen den Wortlängen der Wandler entsprechen und es sollten keine Verluste bei der Genauigkeit während der Verarbeitung auftreten. Sobald wir alle Parameter in den Filter Designer eingegeben und das Filter generiert haben, zeigt uns der Filter Designer die DFT (Diskrete Fourier-Transformation) der Filterantwort an und wir können den Filter in ein Simulink-Modell exportieren. Hier können wir einen ersten Test durchführen und überprüfen, ob das quantisierte Modell die vorgegebenen Kriterien erfüllt. Als Simulationseingangssignal erzeugen wir in Matlab ein Summensignal aus den drei gewünschten Frequenzen.

Die Hardware in die Simulation einbinden

Verhält sich das Filter zu unserer Zufriedenheit, können wir mithilfe des HDL-(Hardware-Description-Language-)Coders den HDL-Code generieren, um das Filter auf dem Eclypse Z7 FPGA-Board zu testen. Dazu haben wir einige Änderungen am Simulink-Modell vorgenommen, sodass wir den HDL-Code für das gesamte System erzeugen können.

Im Fenster HDL-Block-Properties können wir die Pipeline-Register und die Architektur in Bezug auf die verwendeten Multiplizierer konfigurieren. Hier müssen wir uns für eines von drei verschiedenen Modellen entscheiden: vollständig parallel, vollständig seriell oder teilweise seriell.

Bei der vollständig parallelen Architektur kann die Ausgangsdatenfrequenz gleich der Taktfrequenz sein, und jede Multiplikation des Filters benutzt ein DSP-Slice des FPGAs. Bei der vollständig seriellen Implementierung wird hingegen nur ein DSP-Slice benötigt, aber die Ausgangsfrequenz wird auf (Taktfrequenz) / (Anzahl der Multiplikationen) reduziert, was die Berechnung verlangsamt. Die teilweise serielle Architektur schließlich liegt leistungsmäßig in der Mitte, wobei die Anzahl der Slices wählbar ist. Dabei nimmt aber die Zahl der verwendeten Logikelemente zu. Da wir genügend DSP-Slices auf dem Zynq-7000 SoC des Eclypse Z7 Boards haben, ist die vollständig parallele Architektur eine gute Wahl. Als letzten Schritt wählen wir noch die Ziel-HDL-Sprache, das eingesetzte FPGA, den Reset und die gewünschten Berichte auf der Seite HDL Coder Properties. Sind alle Konfigurationen eingegeben, können wir den HDL-Code für unser Subsystem generieren.

Jetzt können wir das Filter mit dem FPGA als Hardware-in-the-Loop simulieren. Der Filteralgorithmus wird hier direkt auf dem FPGA, und nicht wie vorher, als Software auf dem Hostcomputer ausgeführt. Hier kommt das Matlab-Tool FIL (FPGA-in-the-Loop) ins Spiel, das Bestandteil des HDL Verifiers ist. Damit können wir nach der Erstellung einer Board-Definition die FPGA-Karte einbinden.

Nun können wir das Projekt erzeugen und Vivado, das HDL-Synthese- und Analysewerkzeug von Xilinx, startet im Matlab-Befehlsfenster und synthetisiert und implementiert unser FIL Demo-Design. Sobald Vivado die Synthese abgeschlossen hat, öffnet sich ein Simulink-Modell, das den hinzugefügten FIL-Block anzeigt. Jetzt können wir das Eclypse-Z7-Board physikalisch anschließen und das FIL-Modell auf das FPGA laden. Um die Ausgabe zu überprüfen, verwenden wir ein Fenster mit einem Spektrumanalysator. Nach dem Simulationslauf zeigt dieses wie erwartet nur das 1-MHz-Signal an.

Die vollständige Applikation erstellen

Nachdem wir unser Filter mit dem FPGA-in-the-Loop verifiziert haben, können wir die endgültige Anwendung erstellen. Diese soll nicht nur das Filter, sondern auch die Zmod ADC- und DAC-Karten verwenden. Dazu erstellen wir wiederum ein Vivado-Projekt, in das wir alle notwendigen Blöcke, wie den Zynq-7000, die Treiber für die Datenwandler und den Taktgenerator, einfügen.

Auf dem Zynq-7000 SoC benutzen wir nur die programmierbare Logik (PL) und nicht das Processing System (PS). Als Taktquelle eignet sich der 125 MHz-Takt des Ethernet PHY des Eclypse Z7 Boards, der mit der PL verbunden ist. Eine zusätzliche Takterzeugung für die Abtastrate von 10 MHz und den Systemtakt von 100 MHz ist ebenfalls nötig.

Für den ADC-Treiber verwenden wir den AXI (Advanced eXtensible Interface)-Stream Interface IP-Block. Beim Hinzufügen des Filters müssen wir auf die Größe der Datenworte achten, da der Ausgang der AXI-Stream-IP 32 Bit breit ist und die Daten beider ADC-Kanäle enthält. Das Datenwort, das dem Wandlerkanal 1 entspricht, befindet sich in den unteren 14 Bits des Wortes und muss extrahiert werden.

Ähnliches gilt für den DAC-Treiber, bei dem die oberen Bits des Filterausgangs mithilfe eines Slice-Blocks verworfen werden müssen. Unser Beispielprojekt verwendet beide DAC-Kanäle: Der Filterausgang ist mit Kanal 1 verbunden, und das Originalsignal, wie es vom ADC abgetastet wird, mit Kanal 2.

Ist der Blockentwurf vollständig, können wir ihn validieren, den HDL-Wrapper erstellen und den Bitstrom generieren. Sobald das Design synthetisiert und implementiert ist, überprüfen wir unsere Entwicklung zusammen mit einem Signalgenerator und einem Oszilloskop. Mit einer 1-MHz-Sinuswelle können wir der Durchlassbereich und mit einem 910-kHz-Signal der Sperrbereich des Filters testen.

Die Daten live auf dem FPGA erfassen

Eine weitere Testmöglichkeit ist die Verwendung eines Logikanalysators, entweder eines externen Geräts oder des Integrated Logic Analyzer (ILA) von Xilinx, mit dem die Eingangs- und Ausgangsdaten innerhalb des FPGAs überwacht und nach Matlab exportiert werden können. Eine dritte Option ist die Anwendung der FPGA-Data-Capture-Funktion von Matlab. Diese generiert automatisch einen IP-Block, der Daten live im FPGA erfasst und diese über JTAG an Matlab oder Simulink sendet. FPGA Data Capture ist Teil des HDL Verifier Support Packages für Karten mit Xilinx FPGAs.

Im Fenster für die Generierung von FPGA Data-Capture-Komponenten fügen wir die Eingangs- und Ausgangsports des Filters hinzu sowie die Puffergröße und legen die maximale Sequenztiefe fest. Anschließend generiert das Tool den HDL-IP-Core sowie ein Skript zum Starten der Datenerfassung aus dem Matlab-Workspace und ein Simulink-Modell zur Datenerfassung aus Simulink. Unser letzter Schritt besteht darin, dass wir alle Dateien zum Projekt und das Datenerfassungsmodul zum Blockdesign hinzuzufügen. Dann können wir den Bitstrom für das FPGA generieren.

Letzter Schritt: Das Testen des Systems

Um das System zu testen, müssen wir den Hardware-Server von Vivado schließen, um den JTAG-Port freizugeben. Außerdem sind einige Anpassungen am Simulink-Datenerfassungsmodell erforderlich, etwa das Entfernen des Oszilloskops und dessen Ersatz durch einen Spektrumanalysator sowie die Konfiguration der Datentypen und -formate.

Jetzt erzeugen wir mit unserem externen Signalgenerator ein Signal, das aus weißem Rauschen besteht. Im Fenster des Spektrumanalysators sehen wir, dass der Filter wie erwartet im Frequenzbereich von 990 kHz bis 1010 kHz das Signal durchlässt und außerhalb dämpft. Allerdings gibt es einen kleinen Haken: Die Aktualisierungsrate des Analysators beträgt 1 Hz statt der 10 MHz des realen Entwurfs.

Dieses Projekt zeigt, wie es möglich ist, auf einfache Weise ein digitales Filter zu entwerfen, es Schritt für Schritt zu überprüfen und schließlich mit einem Eclypse Z7 Zynq-7000 SoC FPGA-Board als Hardware-in-the-Loop zu verifizieren, indem man die verschiedenen Pakete von Matlab und Vivado verwendet.

* ... ist FPGA-Entwickler für Leistungselektronikgeräte und Spezialist für DSP- und Leistungselektronik-Steuerungsdesign bei Digilent.

Artikelfiles und Artikellinks

(ID:47890998)