Forum: FPGA, VHDL & Co. Anbindung eigener Logik an AMBA-Bus in SoC


von pantagruel (Gast)


Lesenswert?

Hallo zusammen,

ich arbeite derzeit an einem Projekt, bei dem ich selbst beschriebene 
Logik in einem System-on-Chip(wahrscheinlich ein Zynq-7000) 
implementieren will. Dabei soll durch Software, die auf einem 
ARM-Prozessor läuft auf die Logik zugegriffen werden. Ich würde dafür 
gerne ein registerartiges Interface zur Steuerung und Konfiguration 
benutzen. Grundsätzlich scheinen ARMs AHB und APB Busse dies zu können.

Nun meine Frage: Hat jemand von euch damit schonmal etwas gemacht? Muss 
ich das Busprotokoll selbst implementieren oder gibt es da vorgefertigte 
Komponenten? Gibt es zu AHB und APB Dokumente die genauer erklären wie 
man sie im eigenen Design benutzt?

Ich suche bereits mehrere Tage nach einer Lösung, kann allerdings nicht 
wirklich etwas dazu finden.


Viele Grüße und einen tollen Start in die Woche,

pantagruel

von VHDL hotline (Gast)


Lesenswert?

Das Busprotokoll im Slave musst du selbst implementieren (außer du 
findest einen CORE, der dir das auf dein proprietäres IF übersetzt). Wie 
aufwändig das ist, hängt davon ab, was dein Slave unterstützen muss, 
also was dein Master erwartet (bzw. ob du deinen Master konfigurieren 
kannst nur bestimmte Features auf dem IF zu nutzen.)

Im einfachsten Fall konfigurierst du dein AHB-IF als AHB-Lite ohne 
Burst-Support und mit fester Datenbreite. Dann bleiben vom AHB-IF für 
deinen Slave als Kontrollsignale nur noch ein enable (HSEL, HTRANS), ein 
write enable (HWRITE) und eine Flusskontrolle (HREADY, HREADYOUT). Wie 
das ganze angesteuert wird, findest du z.B. hier

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ihi0033a/index.html

(oder auch ohne Registrierung über google "AHB specification").

von Klakx (Gast)


Lesenswert?

wenn du den Zynq nutzt, dann kannst du doch Vivado nutzen. Für den 
simpelsten Einstieg kannst du AXI (Zynq sollte doch AXI Bus haben? egal, 
da gibt's was) GPIO Modul verwenden.
Im weiteren Schritt könnten Register über den EPC-Controller angesteuert 
werden.

Das schwankt alles abhängig von deinen Anforderungen. Schau einfach 
erstmal die Bus-IP-Cores für den Zynq an.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Beim ARM Kern des ZYNQ kommt ein AXI Bus zum FPGA Teil raus.
Hier hatte ich dazu schonmal was geschrieben und ein Tutorial verlinkt:
Beitrag "Re: Zynq VGA - Blockram füllen"

von pantagruel (Gast)


Lesenswert?

Okay, alles klar. Vielen Dank für eure Hilfe.
Werde mich da mal reinlesen :)

Habe noch nie etwas mit Vivado gemacht, dachte nur an den Zynq weil er 
mir für meine spätere Anwendung als geeignet erscheint.

Wie würdet ihr beispielweise einen UART mit APB Interface 
implementieren?

Wenn ich mehrere Register hab, muss ich dann ein RAM oder ähnliches 
nehmen und es mit einem Descriptor füllen?

Ich weis einfach nicht wie man so etwas geschickt implementiert.

Viele Grüße,

pantagruel

von Klakx (Gast)


Lesenswert?

pantagruel schrieb:
> Wie würdet ihr beispielweise einen UART mit APB Interface
> implementieren?

Ich würde ein Blockdesign erstellen. Zynq reinsetzen. Zweitens, 
IP-Katalog öffnen und ein AXI Uart-lite (da beide AXI-Anschlüsse 
besitzen) auswählen und reinsetzen. Nun noch verbinden und fertig.
In dieser Richtung gibt es Tutorials.

pantagruel schrieb:
> Wenn ich mehrere Register hab, muss ich dann ein RAM oder ähnliches
> nehmen und es mit einem Descriptor füllen?

Willst du Daten einfach von deinem Prozessor ablegen oder willst du 
Register ansteuern?
Ersteres -> einfach im Blockdesign ein BRAM anhängen
Letzteres -> billigste Variante ist AXI-GPIO

von Strubi (Gast)


Lesenswert?

Moin,

die Register als BRAM zu implementieren ist Overhead, mach einfach einen 
einfachen Register-Decoder. Gibt genügend Beispiele, z.B. im 
gen/-Verzeichnis des MaSoCist 
(Beitrag "SoC release ('MaSoCist')"), die Registermaps der 
einzelnen Cores kannst du dann mit dem Tool deiner Wahl (in dem Fall 
wohl Vivado) wrappen. Der Zynq ist halt der totale Overkill für den 
Anfang, aber wenn du wahnsinns Lust hast, die ARM-Cores standalone (bare 
metal) zu programmieren, kannst du mit u-boot experimentieren.
Typischerweise lohnt sich eine Wishbone-Bus-Bridge, dann kann man auch 
die OpenCore-Geschichten (die leider sehr gemischter Qualität sind) 
anbinden.

Grüsse,
- Strubi

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.