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
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
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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.