12Bit ADC >= 20MSPS mit USB

OP #846416
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 :-(
Gast #846891
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.
#846926
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.
#846972
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.
Gast #847060
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
#847196
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.
Gast #847260
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
#847342
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.
Gast #847345
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...
Gast #847423
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
#847497
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren