Hallo! Für ein Messprojekt suche ich ein FPGA-Board welches 4096 Messwerte eines 12Bit parallelen ADC mit 20MSPS einliest, intern zwischenspeichert, von einem Referenzsignal subtrahiert und dann langsam über USB an den PC schickt. Hat jemand einen Hardwarevorschlag für mich? Wen es ein fertiges Board geben würde wäre ich sehr glücklich. Noch besser wäre eine kontinuierliche Datenübertragung zum PC, aber 30MB/s kontinuierlich sind zu sehr an der Grenze von USB/Firewire :-(
Schau Dir einmal an, was Gnuradio und USRP machen. 30MB/s duerfte mit dem richtigne USB Chipsatz und gelegentlichen Aussetzern machbar sein.
Ein Spartan 3 schafft das locker mit internem Block-RAM-FIFO und einem Cypress FX2. Wenn du einen ordentlichen PC hast, solltest du im Schnitt die 30 MB/s hinbekommen.
USRP ist etwas überdimensioniert (700$) und leider in Verilog :-( Ich suche eher was in die Richtung Cypress GX2 + Spartan3 + irgendeinen 10-20MSPS Parallelen ADC
USRP auf Spartan angepasst ist Larry Doolittles xguff (http://recycle.lbl.gov/~ldoolitt/xguff.html). Ich habe gerade ein Board aufbebaut, bei dem ich das verwenden will. Einfache Kommunikation geht schon, zu mehr bin ich noch nicht gekommen.
Cypress und Spartan 3 gibts doch auff den Digilent Boards. dann müsstest du halt nnoch einen AD Wandler dazu bauen.Die 4096 Samples zwischenspeichern Variante dürfte sehr einfach sein. Das mit Streaming wird aber wie du schon erkannt hast wegen der USB Bandbreite und Eigenheiten schon schwierig.
Die Bandbreite bekommst du über FireWire beispielsweise gerade soch noch rüber. Mit dem uc1394 von Orsys bekommt man 40MB/s im asynchronen Streaming hin. Die Module sind top, kosten allerdings etwa 300€. Ansonsten per GigaBit Ethernet und UDP, ist allerdings viel aufwendiger. Mit dem FX2 wirst du wohl keine konstanten 30MByte/s hinbekommen, zumal du ja dann vorher noch aus 2 Samples 3 Bytes zusammenbauen musst. Die Ansteuerung des FX2 ist dafür recht simpel (vom kranken Timing bei 48MHz IFCLK mal abgesehn), das hab ich mit ein paar FlipFlops gebaut.
"...(vom kranken Timing bei 48MHz IFCLK mal abgesehn)..." Hi Christian, was meinst Du damit? Hast mich neugierig gemacht. Grüsse Michael
Schau dir mal im datenblatt das Timing an. Bei IFCLK 48MHz ausgegeben vom FX2. Wenn man sich dann die Worst-Case Werte der Flags und SLWR usw anschaut, merkt man, dass da einiges nicht zusammen passt. Ich hab ihn jetzt mit 40MHz externem Takt laufen, da gehts gerade so. Aber auch nur, weil der Spartan ja eh 3...5ns Pin-Verzögerung hat. Da kann ich das SLWR und SLRD mit der Lese-Flanke setzen, dann schaffe ich die Setup-Time. Naja, richtig optimal ist das nicht. das Packet-End ist auch so eine Geschichte, da muss ich mir nochmal Gedanken machen, wie das am besten zu bewerkstelligen ist. Im FPGA kann es vorkommen, dass mehrere Datensätze gesammelt werden und erst am Ende des letzten darf ja das Packet-End kommen, sonst wird die Übertragung ineffektiv. Aber da wird mir auch was einfallen.
Der hat halt keinen 8051 Kern drin, da musst du dich um Sachen wie Enumeration und alle Einstellungen kümmern. Das schöne am FX2 ist ja, dass die Firmware die komplette Einstellerei, Enumeration usw übernimmt. Das Framework regelt alles.
Den FX2 muss ich aber irgendwie programmieren und das gibt auch wieder eine neue Programmierumgebung und Programmierhardware etc. Bislang habe ich für den nur den Keil Compiler gefunden und als Student habe ich was freies halt lieber....
@Lukas: Nimm den sdcc. Der ist frei und läuft wunderbar für den FX2. @Christian: Also ich muss zugeben, so wahnsinnig viel habe ich noch nicht gemacht mit dem FX2. Vor allem noch keine Massentransfers. Meistens geht es nur um ein paar kB. Zudem nutze ich den internen IFCLK. Bisher habe ich noch keine Probleme bei 48MHz feststellen können. Aber wie gesagt, habe bisher noch keine MBs übertragen. Was PKTEND angeht, verstehe ich momentan das Problem nicht. Du sendest ein PKTEND, wenn der FPGA keine Daten mehr hat. Fertig ist. Oder habe ich da was übersehen? So mache ich es zumindest. Schöne Grüsse Michael
Naja, meistens gehts auch gut mit den Zeiten bei 48MHz. Manchmal fehlt aber was. Speziell aus dem FX2 raus: Data valid max. 10,5ns nach der Flanke. Super bei 10,41ns takt. Welche Flanke nehme ich zum Lesen? Mit dem Paketende ist unserer Anwendung bissl umständlicher, da bei speziellen Sachen mehrere Datenblöcke gesammelt werden zwischen denen ist ab und zu länger Pause, macht keinen Sinn, hier alles datailliert zu erklären.
Also, ich muss ja sagen, dass ich mich damit nur recht kurz beschäftigt habe, daher klingt es vielleicht naiv, aber was spricht denn dagegen, bei negativer Flanke die Daten zu samplen und gleichzeitig SLRD zu aktivieren? Bei PKTEND ist es eben hauptsächlich eine Überlegung, wann man das Paket abschicken möchte. Also warte ich lieber auf weitere Daten oder sende ich das Paket sofort ab? Das ist aber kein FX2 Problem, sondern eher eine generelle USB-Frage, oder? Wenn es einem nicht darum geht, die Daten möglichst effizient zu versenden, dann kann man ja PKTEND nach jedem Datenpaket aktivieren. Ansonsten kann man z.B. auch einen Timer parallel laufen lassen, der z.B. 500us nach den letzten Daten PKTEND aktiviert. Ist natürlich auch nur eine Notlösung. Schöne Grüsse Michael
Das Problem ist, dass die angeben, die Daten können von 0 bis 10,5ns brauchen. Und in der Wirklichkeit ist das leider so. Bei den anderen Zeiten genauso, der Chip schöpft die sehr gut aus, sieht man schön auf dem Logic-Analyzer, wenn man die Flanken "aufsummiert". Aber mit externem 40MHz Takt liegt man auf der sicheren Seite. Mit dem internen 48MHz haben wir alle erdenklichen Kombinationen probiert, ab und zu war mal ein Wort weg dann. Schließlich muss man ja die interne Logic auch entsprechend setzen, sprich das WriteEnable für meinen nächsten FIFO bedienen. Ansonsten ist es ein netter USB Chip. Übrigens ist ein 4k-begrenzter freier KEIL Compiler dabei, wenn man die Daten eh nur zu einem FPGA weiterreicht, reicht das dicke. Programmiert wird über den USB, also kein Programmiergerät notwendig. Die Firmwarebeispiele sind sehr simpel, können schnell angepasst werden. Slave FIFO ist das einfachste an dem Ding.
Danke für die Info, Christian. Hast Du noch ne Anhaltszahl, wie hoch der Verlust war? Also bei wie vielen Lese oder Schreibzugriffen ging mal einer fehl? Vielleicht schreib ich mir ein kleines Testprogramm, dass die Daten sendet und wieder empfängt und dann mal schaut, wieviele Fehler drin sind. Ansonsten bleibt mir dann nichts anderes übrig, als auf 30MHz internen Takt umzuschalten. Das wäre ja auch noch eine Option...
Das war sehr stochastisch, mal lief es eine Stunde, mal fehlte gleich etwas. Aber insgesamt relativ selten, nur für ein Industrie-Projekt halt nicht geeignet. Deswegen die 40MHz externer Takt bei uns. Bei 30MHz kommt man halt bestenfalls auf 30MB/s Übertragungsrate.
Ich habe gerade mal einen kleinen Test gemacht. Habe 1Gb in 512 Bytes Paketen übertragen und wieder empfangen. Dabei wurde jedes Byte vom FPGA einzeln empfangen und zurückgesendet. Insgesamt wurde also etwa 1 Mrd mal SLRD bzw. SLRW aktiviert. Das lief ohne Probleme. Vermutlich reicht es für Hobbyanwendungen aus. Finde ich trotzdem schade, dass die Fehlerrate anscheinend doch so hoch ist, dass es signifikant ist für Industrieanwendungen. Schöne Grüsse Michael
Oh, das ist nicht schlecht. Dann scheint dein Timing gut hinzuhauen. Bei uns hats wie gesagt öfters mal paar Bytes vergessen, mal schauen, wie das mit den 40MHz klappt. Die haben wir sowieso im FPGA drin, und mehr als 40MByte/s geht ja eh nicht per USB. Mit den 48Mhz komm ich ja nichtmal im ModelSim auf einen grünen Zweig, wenn ich die Worst-Case Werte aus dem Datenblatt des FX2 zur Simulation benutze. Und davon muss man schließlich ausgehen. Testen kann ich´s erst in ein paar Wochen wieder, die Hardware wird gerade erst gebaut. Aber bisher hat die Timing-Simulation immer die Wirklichkeit widergespiegelt. Mit 40Mhz und je einem Buffer mit "KEEP=TRUE" an SLWR und SLRD passt das alles perfekt.
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.