Einsatz des XADC

Zynq FPGA

In diesem Artikel zeige ich euch wie ihr den XADC des Zynq verwenden könnt.
Mit Hilfe des XADCs seid ihr in der Lage analoge Spannungen zu messen. Auf diese Weise könnt ihr analoge Eingangssignale erfassen. Des weiteren bietet der XADC die Möglichkeit die Chiptemperatur zu erfassen und ggf. einen Alarm auszulösen.

-> Der XADC und das Processing System:

Der XADC benötigt ein Processing System um betrieben zu werden. Daher muss als erstes ein Block Design erstellt werden.
Dieses Block Design besteht aus einem ZYNQ7 Processing System und dem XADC Wizzard.
Als erstes muss das Processing System konfiguriert werden. Die Konfiguration könnt ihr nach dieser Anleitung durchführen.
Im nächsten Schritt verwendet ihr die Verbindungsautomatik um die Verbindung zwischen den einzelnen Komponenten herzustellen:

XADC(1)
Im nächsten Schritt wird der XADC konfiguriert. Für den Anfang soll die Temperatur und ein einzelner Analogkanal ausgelesen werden können.
Zuerst werden die benötigten Pins nach außen geführt:

XADC(2)
Danach wird durch einen Doppelklick auf den XADC Wizzard das Konfigurationsmenü geöffnet.
Im Konfigurationsmenü öffnet ihr den Reiter Channel Sequenzer und wählt folgende Kanäle aus:

  • Vaux14p / Vaux14n
  • Temperature
  • VRefn
  • VRefp

Wenn ihr fertig seid, schließt ihr das Menü, speichert das Block Design und generiert den Bitstream.
Nach dem Generieren exportiert ihr über File / Export den Bitstream und öffnet über Launch SDK das SDK:

XADC(3)
Jetzt könnt ihr mit der Erstellung der Software beginnen.

-> Die Software für den XADC:

Für die Software erstellt ihr ein neues Projekt mit allen notwendigen Dateien.
Eine Anleitung wie ihr das macht findet ihr hier.
Damit die Software den ADC nutzen kann, muss erst mal die entsprechende Headerdatei eingefügt werden:

Zunächst muss eine Konfiguration des ADC geladen und gespeichert werden:

Diese Konfiguration ist für jeden XADC unterschiedlich und der entsprechende XADC wird über den Parameter XPAR_PS7_XADC_0_DEVICE_ID angesprochen.
Nachdem die Konfiguration geladen und der ADC damit ausgewählt ist, kann dieser initialisiert werden:

Der ADC ist nun durch den Pointer XADC markiert. Jeder weitere Befehlsaufruf benötigt eine Angabe, welcher ADC gemeint ist. Dies wird nun durch den Pointer XADC erledigt.
Im nächsten Schritt führt der ADC einen Selbsttest aus:

Dieser Selbsttest löst einen Reset am XADC aus, sodass dieser über keine ungültigen Konfigurationswerte etc. verfügt.
Der ADC ist jetzt bereit und kann Samples aufnehmen. Als erstes speichere ich mir die Temperatur:

Der erste Übergabeparameter der Funktion XAdcPs_GetAdcData() gibt an welcher XADC angesprochen werden soll und der zweite Parameter den Kanal.
Xilinx bietet direkt eine fertige Funktion an um die gesampelte Temperatur in einen Wert umzuwandeln.
Dies erspart ein wenig Arbeit und funktioniert auch einwandfrei:

Mit dem zweiten Befehl lasse ich mir die Temperatur anschließend ausgeben.
Auf diese Weise wird beim Programmstart einmalig die Temperatur erfasst.
Im eigentlichen Hauptprogramm mache ich das selbe für den Kanal 14:

Wenn ihr das Programm nun ausführt erhaltet ihr die folgende Terminalausgabe:

XADC(4)
Nun ist das FPGA bereit analoge Spannungen zu messen und über das Processing System zu verarbeiten!

-> Verwenden der Alarme:

Da der ADC nun wie gewünscht arbeitet, wollen wir mal schauen wie wir die Alarmfunktionen des XADC nutzen können. Dazu wollen wir mal schauen wie wir uns den Temperaturalarm nutzbar machen können.
Dazu muss als erstes das Block Design angepasst werden…
Zum einen muss der Anschluss user_temp_alarm_out des XADC Wizzards nach außen geführt werden:

XADC(5)
Danach müssen noch die Temperaturgrenzen eingestellt werden. Dazu wird der XADC Wizzard geöffnet und über den Reiter Alarms können die Alarme konfiguriert werden. Wir wollen den User Temperature Alarm verwenden. Da die voreingestellten Grenzen etwas zu hoch sind verringern wir sie etwas:

XADC(6)
Jetzt wird das Block Design wieder gespeichert und die Schaltung wird Synthetisiert. Nach der Synthese muss der Alarm noch einem I/O zugewiesen werden:

XADC(7)
Jetzt kann der Bitstream generiert werden. Nach der Generierung kann der Bitstream in das FPGA übertragen werden.
Da der Alarm lediglich aus Hardware besteht, muss der Code nicht geändert werden. Jetzt wird die LED jedes mal eingeschaltet, wenn die Temperatur des Chips 50°C erreicht hat und sie wird wieder deaktiviert, wenn der Chip auf 45°C abkühlt.

 

Dokumentation:

 

-> Zurück zum FPGA + VHDL Tutorial

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload CAPTCHA.