AXI4-Registerbänke nie wieder von Hand programmieren

| Autor / Redakteur: Guy Eschemann * / Sebastian Gerstl

Beispiele zur Funktionsweise von airhdl

Anhand eines kleinen Beispiels möchte ich nun demonstrieren, wie leicht sich mit airhdl eine Registerbank mit einem Kontroll- und einem Statusregister zum Anschliessen an ein Xilinx Zynq-System erstellen und integrieren lässt. Als Zielsystem dient das Base Zynq Design, welches Xilinx Vivado als Beispielprojekt zur Verfügung stellt.

Als erstes werden wir in airhdl eine neue Register Map erstellen und ihr einen Namen und eine Basisadresse geben. Die Basisadresse sollte so gewählt werden, dass sie im Zynq-System nicht mit anderen Komponenten kollidiert. Das lässt sich im Vivado Adress-Editor leicht überprüfen.

Anschließend wird die Register Map mit Registern gefüllt. Die Eingabe erfolgt ebenfalls im Web-Browser, in einem übersichtlichen Dialogfenster. Jedes Register bekommt einen Namen, ein Adressoffset innerhalb der Registerbank, eine optionale Beschreibung (für Dokumentationszwecke) und einen Zugriffsmodus (Access Mode). Airhdl unterstützt für Register folgende Zugriffsmodi:

  • read-write Register können vom AXI4 Bus aus (z.B. von der CPU) geschrieben und gelesen werden
  • read-only Register erhalten ihren Wert von der User Logik und können vom AXI4 Bus aus nur gelesen werden
  • write-only Register können vom AXI4 Bus aus nur geschrieben werden. Der Verzicht auf die Lesemöglichkeit spart etwas Logik und entspannt das Timing im internen Lesepfad
  • interrupt Register können von der Logik aus gesetzt und vom AXI4 Bus aus gelesen und im write-one-to-clear Verfahren zurückgesetzt werden

Bild 3 zeigt die Übersicht der Register Map, nachdem ein „control“ und ein „status“ Register erstellt wurden.

Anschließend müssen wir die Register noch mit Leben—also mit Feldern—befüllen. Der Einfachheit halber haben in airhdl alle Felder innerhalb eines Registers den gleichen Zugriffsmodus. Alle Felder eines read-write Registers sind also automatisch read-write Felder.

Jedes Registerfeld verfügt über einen Namen, eine optionale Beschreibung, ein Bit Offset und eine Bit Width welche das Feld innerhalb des 32-Bit Registers positionieren, und einen Reset-Wert. Natürlich sind Änderungen wie das Umbenennen oder Verschieben eines Feldes in airhdl jederzeit möglich.

In unserem Beispiel bekommt das „control” Register ein 4-Bit Feld namens „led” und das „status” Register ein 2-Bit Feld namens „button”.

Bild 5 zeigt die Übersicht des „control“ Registers nach Erstellen„led” Registerfeldes sieht das „control” Feldes.

Nachdem auch im “status” Register ein „button“ Feld erstellt wurde können generierte Dateien heruntergeladen werden. Airhdl stellt folgende Dateien zur Verfügung:

  • C-Header mit allen Registerdefinitionen in Form von Konstanten
  • SystemVerilog Modul
  • VHDL Komponente und Testbench
  • HTML Registerdokumentation
  • Registerdefinitionen im XML (IP-XACT) und JSON Format

Relevant für unser Zynq-System sind lediglich der C-Header (welcher in der Software eingebunden wird) und die VHDL-Komponente, die dem Vivado-Projekt hinzugefügt wird. Nachdem das VHDL-Package und die VHDL-Komponente im Vivado-Projekt importiert wurden kann die Registerbank im Block Diagramm über die “Add Module…” Funktion instanziiert werden (siehe auch Bilder 7 und 8).

Die Vivado-Wizards erledigen können das Anschließen der Registerkomponente an die AXI-Infrastruktur auf Wunsch vollautomatisch erledigen (Bild 9).

Inhalt des Artikels:

Kommentar zu diesem Artikel abgeben

Schreiben Sie uns hier Ihre Meinung ...
(nicht registrierter User)

Zur Wahrung unserer Interessen speichern wir zusätzlich zu den o.g. Informationen die IP-Adresse. Dies dient ausschließlich dem Zweck, dass Sie als Urheber des Kommentars identifiziert werden können. Rechtliche Grundlage ist die Wahrung berechtigter Interessen gem. Art 6 Abs 1 lit. f) DSGVO.
Kommentar abschicken
copyright

Dieser Beitrag ist urheberrechtlich geschützt. Sie wollen ihn für Ihre Zwecke verwenden? Infos finden Sie unter www.mycontentfactory.de (ID: 45017592 / FPGA)