Forum: FPGA, VHDL & Co. Digilent Nexys USB Transfer


von SchultzC (Gast)


Lesenswert?

Hallo Forum!

Ich bin z.Zt. damit beschäftigt Daten von einem Digilent Nexys FPGA 
Board (mit einem Spartan3) über USB zu streamen. Digilent bietet dazu 
ein Interface samt zugehöriger API an, welches ähnlich einer Epp 
Schnittstelle aufgebaut ist.

Hat bereits irgendwer Erfahrungen damit gesammelt? Die ersten Tests 
waren ernüchternd. Obwohl Digilent den Durchsatz mit bis zu 38MByte/sec 
angibt, ist es mir auf Anhieb nicht einmal möglich einen 16kHz 16Bit 
Audio Stream (gepuffert in einem Ringbuffer mit 2 kB Speicher) 
auszulesen. Nach ca. 183 Samples erkenne ich einen Bufferüberlauf.

Dabei hat es keinen erkennbaren Unterschied gemacht ob ich das 
Datenregister mit der Funktion DpcGetRegRepeat() oder DpcGetReg() (und 
die wiederholung manuell in meinem C Programm durchführe) auslese.

Hat denn schoneinmal jemand die von Digilent postulierten hohen 
Datenraten erreicht (was ein Hinweis auf ein Fehler in meinem Host 
Programm wäre), oder greift Digilent damit einfach viel zu hoch (und 
eine weitere Optimierung meines in C geschriebenenen Hosts auf dem 
Rechner wäre unnütz)?

Grüße
Christoph

von FPGA-Fragender (Gast)


Lesenswert?

Hallo Christoph,

ich habe vor mir evtl. ein Spartan3 Starter Board oder ein nexys zu 
kaufen deshalb habe ich mich zumindest in der Theorie und Dokumentation 
mit beiden schon beschäftigt.

Wie gesagt nur Theorie ( = 3/4 Wissen )

Es gibt wohl 2 grundverschiedene Welten, die Du auseinander halten 
musst.

1. Die Adept Suite Software von Digilent
========================================

Die SW arbeitet mit dem USB Cypress Controller über die GPIO ( das 
General Purpose IO Interface ) zusammen. Dieses wiederum wird über einen 
8051 Microcontroller gesteuert, welcher in dem cypress Baustein 
integriert ist.

Über die Systemsoftware des 8051 werden dann z.B. die JTAG 
Schnittstellen Signale bedient um z.B. das Plattform Flasch oder den 
FPGA direkt zu laden.

Desweiteren kann auch in den FPGA ein kleines Modul geladen werden, 
welches wiederum eine Datenkommunikation mit dem PC ähnlich einer 
parallelen Schnittstelle darstellt.  Hierüber kann man z.B. auch 
Dateninhalte in das RAM laden oder lesen usw.

Allerdings alles in Software und ziehmlich langsam.


1. Direkte Anbindung des FIFO an den FPGA
========================================

Hier sieht die Sache ganz anders aus.
Wie gesagt ich weiß es nicht ganz genau, aber ungefähr so:

Der der Cypress USB Baustein wird mit dem Treiber von Cypress unter 
Windows betrieben. Dieser sagen wir mal Universaltreiber übernimmt für 
dich alle wichtigen Funktionen, um ein USB Gerät als Device unter 
Windows anzumelden usw. Der Treiber übernimmt für dich auch die Aufgabe 
die jeweils beim erkennen des USB Bausteins die neueste Firmware vom PC 
auf den Cypress Chip zu übertragen. Mit dieser Cypress Firmware 
arbeitest Du dann also später zusammen.

Danach mußt Du ein eigenes Programm z.b. in C schreiben mit welchem du 
auf die API des Cypress Treiber unter windows zugreifst.

Du definierst deine Buffer, endpoint, die Art der Datenübertragung usw.

Auf der FPGA Seite mußt Du dann eine kinderleichte State machine in VHDL 
programmieren, welche jeweils den FIFO Puffer des Cypress Bausteins mit 
Daten bis zum Anschlag füllt. ( z.B. 512 Byte ) Die Firmware übernimmt 
für dich dann automatisch die Übertragung der Daten auf den PC.

Wobei bei USB natürlich nur dann Daten übertragen werden, wenn der 
Master Daten zum lesen anfordert. Also ein quasi Polling verfahren.

In dieser Variante arbeitest Du nicht mit der GPIO zusammen sondern 
direkt mit dem FIFO Datenbus zugehörigen Steuersignalen.

Bestimmt meldet sich noch jemand, der das viel besser weiß als ich....

Gruß vom FPGA-Fragenden



von Robert S. (roberts)


Lesenswert?

Hallo, für ein künftiges Projekt benötige ich u.a eine schnelle 
Datenverbindung (30..35MByte/s) zum PC. Habe eben deshalb vor, mir auch 
ein FPGA Demoboard zuzulegen. Momentan weiß ich nicht welches dazu am 
besten geeignet wäre. Ich wäre dankbar für Infos und Hinweise die zu 
beachten sind, damit eine "Direkte Anbindung des FIFO an den FPGA" 
gelingt.
Gruß Robert

von Rick Dangerus (Gast)


Lesenswert?

Die Frage ist, wieviel Geld und Zeit Du dafür übrig hast.
Es gibt FPGA-Boards in Form einer PCI-Karte, damit sollten Deine 
Datenraten machbar sein.

Rick

von FPGA-Fragender (Gast)


Lesenswert?

Hallo Robert Schiebel,

bin gerade an einem Projekt mit gleicher Problemstellung.

Folgendes ist zu beachten:

- Brauchst Du die Datenrate als Streaming oder Burst ?

Streaming:
Es werden z.B. 1 GByte übertragen und die Datenrate muss kontinuierlich 
laufen. Falls der Host PC nicht schnell genug ist oder die Transferrate 
absinkt werden ( evtl. nicht heilbare ) Fehler erzeugt. Beispiel: 
Bildverarbeitung

Burst:
1 GByte soll möglichst schnell in den PC übertragen werden. Ähnlich wie 
bei einer Festplatte. Sinkt die Datenrate kurzzeitig ab dauert der 
Transfer zwar etwas länger ( einige ms ) aber es enstehen keine Fehler.

Sreaming mit sehr hohen Datenraten ist unter WIN enorm schwer, aufgrund 
des nicht garantierten Antworzeitverhaltens deines Treibers bzw. Host 
Software. ( Betriebssystem bedingt )

Für die Überbrückung der verzögerten Antwort vom Host benötigst Du je 
nach Geschwindigkeit einen großen Pufferspeicher. Ich meine jetzt 
wirklich groß. Du mußt in der Lage sein mindestens 100ms Verzögerung 
auszugleichen. Bei 30 MByte / sec kommen hier locker ca. 3 MByte 
zusammen. Je nachdem was noch auf dem PC sonst noch nebenher laufen soll 
kann man den Puffer erhöhen oder verkleinern.

Hört sich zwar verrückt an, ist aber leider Praxis. Oder Du benötigst 
ein Echtzeit Betriebssystem.


PCI Bus kontra USB

Beides ist mit einem FPGA gut zu beherrschen. Das eigentliche Problem 
entsteht auf der Software Seite.

Du benötigst einen Kernel Mode Treiber unter Win, der die Hardware nahe 
Kommunikation abwickelt. Falls Du tatsächlich unter WIN arbeiten willst 
solltest Du in JEDEM FALL prüfen, ob Du für Dein Board einen 
funktionierenden und gut dokumentierten Treiber bekommst.

Anders sieht die Sache aus, wenn Du selbst in der WIN Kernel Treiber 
Entwicklung sattelfest bist.

Aus diesem Grund werden sehr gern die USB 2.0 Bausteine von Cypress oder 
ähnliche verwendet, weil man gute Treiberunterstützung hat ( auch für 
Linux ) und für die Schnittstelle nicht so viele Pins wie PCI benötigt.

Denk dran. Bei PCI brauchst du jede Menge frei IO Pins ( schätze auf die 
Schnelle mind. 40 ).

Gruß vom FPGA-Fragenden

von NachtEule (Gast)


Lesenswert?

Hallo Christoph!

Leider kann ich Dir auch keine fertige Lösung anbieten,
möchte aber meine Erfahrung mit Digilent Boards mitteilen.
Ein Nexys Board habe ich zwar erst kürzlich bekommen, aber
mit eienm Spartan3 Starter Board und USB2.0 Modul habe ich
eine Datenrate von fast 6 MB/s erreicht. Genau gesagt konnte
ich eine Durchschnittsrate von 5,7 MB/s für mehrere Stunden
halten.
Dazu zwei wichtige Ergänzungen:
1) Ich benutzte das gesamte SRAM auf dem Board (1 MB) als Buffer.
2) Der Flaschenhals war die Epp-ähnliche DPIM-Schnittstelle
zwischen dem Spartan Board und USB2.0 Modul.
Ich bin der Meinung, dass es nicht ganz hoffnungslos ist, mit Nexys
eine noch höhere Datenrate zu erreichen.

Gruss
Josef

von Jan (Gast)


Lesenswert?

Konntet ihr Erfolge verzeichnen hinsichtlich des Datentransfers?

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.