Forum: FPGA, VHDL & Co. EDK File in ISE einbinden


von Sven M. (marckhoff)


Lesenswert?

Hallo,

ich schreibe gerade meine Diplomarbeit, stehe jetzt aber vor einem 
Problem!

Ich wollte mit dem Trenz Industrie Board (Spartan 3e) ein Signal 
abtasten, aufbereiten und per USB an einen PC senden.

Ich habe nun ein VHDL Code generiert, der mein Signal abtastet. 
Weiterhin hab ich ein EDK Projekt erstellt, der Daten vom RAM über USB 
an den Rechner schiebt.

Ich habe jetzt das EDK File in das ISE Projekt mit hinein geladen.

Jetzt zu meinem Problem. Wie kann ich aus meinen VHDL Code auf das EDK 
Projekt zugreifen und Daten übertragen?

Danke

von Jannulis T. (tembridis)


Lesenswert?

Du hast per EDK ein Microblaze mit entsprechender Peripheri in ein ISE 
Projekt eingebunden und möchtest das ganze nun mit deinem VHDL Modul 
kommunizieren lassen?

Wenn ich das so richtig verstanden habe, dann gibt es für Dich mind. 
zwei Möglichkeiten, eine Verbindung zwischen deinem VHDL Modul und dem 
Prozessorkern zu ermöglichen.

1) Du gehts noch einmal einen Schritt zurück ins XPS. Dort erzeugst Du 
aus Deinem VHDL Modul einen IP Core mit PLB oder OPB Slave-Anbindung. 
Diesen IP Core fügst Du dann in dein System ein ung legst per UCF fest, 
über welche Pins dein Modul nach draussen verbunden ist. Die ISE 
brauchst Du in diesem Fall garnicht.

2) Du bindest im XPS eine kleine Brücke ein (oder missbrauchst den 
EPC-Controller, wobei ich nicht beurteilen kann, ob das eine so gute 
Idee ist), mit hilfe derer Du ein vereinfachtes Interface nach draussen 
leitest. In der ISE instanziierst Du dann dein MB System, sowie dein 
VHDL Modul und verbindest die beiden über die Brücke miteinander.

Ich denke für Dich dürfte die erste Möglichkeit der einfachste und 
schnellste Weg sein, Dein System zu realisieren.

von Sven M. (marckhoff)


Lesenswert?

Erstmal danke für die schnelle Antwort,

versuche mich gerade mit der ersten Lösung. Muss ich, wenn ich eine neue 
Peripherie erstelle will, alle PLB Daten manuell zuweisen. Dies würde 
heißen, dass ich in dem VHDL Projekt alle PLB Slave Signale einbinden 
müßte?
Oder gibt es ein File, die den Import der Peripherie erleichtert?

Danke

von Jannulis T. (tembridis)


Lesenswert?

Guten Morgen,

im Menü "Hardware->Create or Import Peripheral" findest du einen Wizard, 
der dir beim Erstellen des IP-Grundgerüst hilft. Dabei kannst du 
auswählen, ob du beispielsweise einen reinen Slave-IP bauen möchtest. 
Der Wizard generiert dir dann zwei Dateien, eine mit dem Namen 
"user_logig.vhd". In diese Datei baust du deine eigene Logik ein und 
ziehst ggf. noch Signale über die entity Deklaration der beiden Dateien 
nach draussen.

von Sven M. (marckhoff)


Lesenswert?

Danke nochmals,

das hat geklappt.Aber wie deklariere ich meinen Einsprung aus meiner 
c-File. Oder läuft der FPGA Core eigenständig?

von Jannulis T. (tembridis)


Lesenswert?

Deine Frage musst du mir etwas näher erläutern, ich verstehe nicht ganz 
was du meinst (vielleicht langsam Zeit das Labor zu verlassen?).

von Papa S. (printf)


Lesenswert?

Hi, es gibt auch die möglichkeit, die Daten von einem Verilog/Vhdl-Modul 
über ein oder mehrere GPIO's in den MicroBlaze zu bringen (jeder Kanal 
hat dann 32bit Parallel-Zugriff). Nachteil: man braucht noch ein Bit zum 
'ein-Clocken', quasi ein Frame-Signal. Vorteil: geht ganz flott und man 
nimmt das Standard-Header-File vom GPIO-Modul, und nutzt da nur die 
Basiszugriffe (nicht bei jedem Zugriff Status-Check). Ich habe genau 
dasselbe Problem mit einem Spartan3e vor kurzem gehabt und wollte auch 
die Daten über USB übertragen. Aber auf FPGA-Seite gibt eine keinen 
vernünftigen USB-Core für Full-Speed und wenn, dann nur in 
'Zusammenarbeit' mit einem Cypress-Baustein. Auf PC-Seite ist die 
Programmierung sehr aufwändig. Es geht zwar z.B. mit einem Baustein von 
FTDI aber davon rate ich ab, weil sich der Baustein unter Laborbedingung 
ständig 'aufhängt'.
Eine wesentlich bessere möglichkeit ist es, TCP/IP zu nutzen, allerdings 
als Protokoll UDP (also keine 'überwachte' Verbindung, sondern 
'schicken' der Daten ohne Kontrolle, ob das Packet auch angekommen ist). 
Vorteil: 10Mbit (also 8Mbit netto) funktionieren ohne zusätzliche 
Hardware, das ganze geht mit ca. 20 Zeilen Verilog/VHDL (notfalls geht 
es sogar ohne Übertrager). Auf der PC-Seite nutzt man den "winsocket", 
eine einfache Datenverbindung, die auf dem PC nur Daten empfangen muss 
sind mit socket.c ca. 20 Zeilen. Wenn das FPGA-Board einen 
"MII"-Baustein besitzt, geht das ganze auch genauso mit 100Mbit (bei 
mindestens 25Mhz System-Clock).
Vielleicht helfen die Informationen
- Papa Schlumpf

von Sven Marckhoff (Gast)


Lesenswert?

Zu meiner jetzigen Situaltion:

Ich habe eine Peripherie erzeugt (mit FIFO zugriff). In der User Logic 
habe ich mein Code eingefügt, zur Zeit ein Test LED blinken. In der UCF 
mein Port für Clock und LED eingebunden.
In XPS an den PLB Bus gelegt, Speicherbereich festgelegt. Aber bei den 
Ports auf "NC".
Das XPS Programm gestarte und gewartet, ob die LED blinkt. Leider nicht.
Muss ich in dem XPS C File noch die Adresse aufrufen, oder ein Interrupt 
setzen???

Jetzt ist Zeit das Labor zu verlassen...

Danke

von Jannulis T. (tembridis)


Lesenswert?

Also ich wiederhole mal, um zu sehen ob ich dich richtig verstanden 
haben. Du hast einen eigenen IP erzeugt und deinen Code dort eingefügt. 
Du hast den IP eingebunden, am PLB angeschlossen und einen Adressbereich 
erzeugen lassen. Was du nicht gemacht hast, die Ports deines IP nach 
draussen geführt und auf obersters Ebene in ISE mit Pads aus dem UCF 
verbunden. Ist das richtig so? Wen dem so ist, so verwundert es nicht, 
dass nichts passiert.

Also nochmal:

1) IP Gerüst per Wizard generieren
2) Code einfügen in user_logic.vhd
3) Eigenen Code mit PLB Signalen verbinden
4) Alle anderen Ports über die beiden Enities nach draussen führen
5) Im XPS den IP einfügen
6) Mit PLB verbinden und Adressbereich generieren lassen
7) Alle anderen Ports als Externe Signale hinzufügen (in der Drop-Down 
"Make External" anwählen
8) Den Microblaze im ISE einbinden ("Add Source")
9) Instanziierungstemplate erzeugen und im Toplevel einbinden
10) Ports über die Toplevel Entity nach draussen ziehen
11) Im UCF diese Ports auf Pads des FPGA legen

Fertig. Wenn du einen dieser Schritte nicht einhälst, passiert nichts. 
Hoffe das hilft dir.

von Papa S. (printf)


Lesenswert?

Hallo Sven,
es würde mich doch interessieren: Hast Du die Standard-USB-IP vom EDK 
verwendet ? Welchen USB-SW-Treiber verwendest Du PC-seitig ? Welche 
Datenraten erreichst Du ? Ich würde mich gerne belehren lassen, dass es 
mit USB auch gut funktioniert. Danke. PapaSchlumpf.

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.