Forum: FPGA, VHDL & Co. 12Bit ADC >= 20MSPS mit USB


von Luky S. (luky)


Lesenswert?

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 :-(

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

Schau Dir einmal an, was Gnuradio und USRP machen. 30MB/s duerfte mit 
dem richtigne  USB Chipsatz und gelegentlichen Aussetzern machbar sein.

von Christian R. (supachris)


Lesenswert?

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.

von Luky S. (luky)


Lesenswert?

USRP ist etwas überdimensioniert (700$) und leider in Verilog :-(
Ich suche eher was in die Richtung Cypress GX2 + Spartan3 + irgendeinen 
10-20MSPS Parallelen ADC

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

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.

von Luky S. (luky)


Lesenswert?

Das Teil sieht sehr gut aus, Danke!

von Matthias (Gast)


Lesenswert?

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.

von Christian R. (supachris)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

"...(vom kranken Timing bei 48MHz
IFCLK mal abgesehn)..."


Hi Christian,

was meinst Du damit? Hast mich neugierig gemacht.

Grüsse

Michael

von Christian R. (supachris)


Lesenswert?

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.

von Luky S. (luky)


Lesenswert?

Wie siehts eigentlich mit dem Cypress SX2 USB-Chip aus?

von Christian R. (supachris)


Lesenswert?

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.

von Luky S. (luky)


Lesenswert?

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....

von Michael (Gast)


Lesenswert?

@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

von Christian R. (supachris)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

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

von Christian R. (supachris)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

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...

von Christian R. (supachris)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

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

von Christian R. (supachris)


Lesenswert?

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