Hallo zusammen,
da ich bisher keinerlei Erfahrung mit FPGAs habe, möchte ich hier im
Forum die Experten ansprechen, ob mein Vorhaben so realierbar ist.
Es geht darum, eine Platine zu entwerfen, die insgesamt 256 analoge
Eingänge mit je ca. 2MHz abtastet. Ich habe bereits diverse
Mikrocontrollerplatinen und analoge Schaltungen entworfen. Allerdings
bisher noch keinen FPGA.
Ich würde mich sehr freuen, wenn Ihr mir ein paar Kommentare geben
könntet, ob die Realisierung so überhaupt möglich ist und evtl. sogar
Verbesserungsvorchläge einbringt. Oder auch "nur" die richtigen Fragen
stellt, die ich vorher noch untersuchen/beachten muss.
Wie im Bild zu sehen möchte ich die 256 Kanäle auf je 16 multiplexer
aufteilen. Jeder kanal soll mit 2MHz abgetastet werden. Die 16
"Multiplex-Leitungen" gehen auf einen 16Kanal ADC, der je maximal 65MSPs
Tastrate unterstützt. Dieser gibt über 16LVDS Leitungen die Datenströme
an einen FPGA weiter, der wiederum die Daten in einen Speicher ablegt.
Die Verarbeitung der Daten soll in "Aufnahmepausen" stattfinden.
Ich würde das Ganze etwas Modularer aufbauen, da es mir mit den
Datenraten etwas Grenzwärtig erscheint und wohl auch nicht mehr gross
Ausbaufähig wäre in der Zukunft.
danke, darüber habe ich auch bereits nachgedacht. Vor allem, weil es,
wie mir gerade aufgefallen ist, im Bild etwas zweideutig ist. Die
maximale Datenrate der 16LVDS Leitungen ist JE 455Mbps (laut Datenblatt
des ADC). Jedoch werde ich ungefähr an die Hälfte der Datenraten ran
kommen.
Die 65MSPs am Eingang des ADCs ist die maximal mögliche Abtastrate je
Kanal des ADC laut Datenblatt. ich "brauche" hier ungefähr die Hälfte um
auf 2 MHz an den Eingängen der Multiplexer zu kommen.
Wenn Du Dir käufliche Systeme mit solchen Eckdaten ansiehst wie Du es
realisieren möchtest, dann nehmen die meist einzelne Module mit 8/16/32
Analogkanälen, welche jeweils einen eigenen ADC haben und manchmal sogar
einen eigenen Prozessor für die Vorverarbeitung. Ein Hauptrechner
sammelt dann die Daten aller Module und kann diese zwischenspeichern und
weitergeben z.B. an eine Datenbank oder in ein lokales Speichermedium
schreiben.
Die Schwierigkeit in solchen Systemen ist dann natürlich immer, das
ganze zu synchronisieren.
Aber der Vorteil ist, dass sich die Kanalzahl später gut erweitern
lassen kann, ohne alles nochmals neu zu entwickeln.
Beispiele:
https://www.adwin.de/de/produkte/proII.htmlhttp://www.ni.com/de-ch/shop/pxi.html
Moin,
läuft auf jeden Fall auf ein Divide-Et-Impera-Prinzip raus. 16 Kanäle
kannst du gut mit einem FPGA abdecken. Frage ist immer, was passiert mit
den Daten, und was soll an Output weitergeschickt werden.
Wenn's nicht extrem synchron gebündelt laufen muss, tut's ansich ne
Standardlösung mit Datenversand per UDP/RTP (Echtzeitprotokoll), da
hätte ich eine Referenzimplementierung, einiges findest du auch beim
CERN (https://www.ohwr.org/).
Knifflig wird's dann, wenn es sich um fortlaufende Streams handelt, bei
denen Clock-Drifts ausgeglichen werden müssen. Da kannst du entweder
Resampling-Techniken anwenden oder musst einen regelbaren Clock-Chip auf
deine Platine packen.
Da du aber von Aufnahmepausen sprichst, suggeriert das eine paketweise
Verarbeitung, sowas geht gut mit dem Standard RTP - wenn dir die 90 kHz
Zeitauflösung (nach Standard) reichen. Dann musst du nur noch die Frage
nach dem Speicher (Datenpuffer) klären.
bd schrieb:> Es geht darum, eine Platine zu entwerfen, die insgesamt 256 analoge> Eingänge mit je ca. 2MHz abtastet.
Mit welcher Auflösung?
> Die Verarbeitung der Daten soll in "Aufnahmepausen" stattfinden.
Wie lange soll aufgenommen werden, wie lange sind die Pausen und wer
verarbeitet die Daten?
Also mit dem MUX hast du das Problem, dass du die Eingänge nicht
zeitgleich erfasst. Die werden also nacheinander an den ADC
durchgeschaltet.
Viele größere FPGAs haben deutlich mehr als 256 IOs. Und es gibt auch
viele ADCs mit 2 MSps oder mehr die nur einen FPGA IO benötigen
(annähernd wenn man viele solche ADCs verbaut).
Wenn es vom Platz her geht kann man also tatsächlich 256 ADCs verwenden
die gleichzeitig alle Eingänge abtasten. Es gibt auch Bausteine die
mehrere ADCs besitzen. Ich verwende den LTC2325, der macht 5 MSps und 16
Bit mit 4 ADCs. Das Interface ist SPI, also ein IO je ADC und zusätzlich
noch Chipselect und Clock aber die kann man ja unter allen ADCs
verbinden. Man bleibt jedenfalls deutlich unter 2 IOs/ADC. Die SPI Clock
ist 105 MHz, 100 MHz geht aber auch. Das geht ohne LVDS noch schön.
Danke schonmal für die vielen hilfreichen Anregungen und Tipps. Das muss
ich mir jetzt erstmal im Detail anschauen.
Zu den vorgeschlagenen Links kann ich noch nichts sagen, weil ich sie
mir noch im Detail anschauen muss. Vielen Dank auch dafür schonmal!
Wie genau die Daten weiter verarbeitet werden, dass steht noch nicht
fest und hängt ja auch damit zusammen, welches Konzept es werden wird.
Im modularen Fall wird es ein weiterer FPGA werden, der die Daten von
den bisherigen zusammen fasst. Denn die Daten aus den einzelnen Kanälen
müssen miteinander kombiniert werden. Wichtig wäre für mich noch die
Frage: Wenn ich es modular aufbaue, mit z.B. jeweils 16 Kanäle + ADC +
FPGA: Könntet Ihr mir einen FPGA empfehlen, der die reine Datenaufnahme
ohne Probleme bewältigen kann, aber nicht leistungsstärker (teurer) als
nötig? Denn von diesen müssten ja um beim o.g. Beispiel zu bleiben 16
Stück eingesetzt werden. Dann bräuchte quasi nur der "Master", bei dem
alle Daten zusammen kommen, genügend Leistung.
@Lothar M: Die Aufnahmezeiten liegen bei unter 0,5ms. Die Pausen werden
zwischen 2 bis 10ms liegen. Die Auflösung wird zwischen 12-16bit liegen.
bd schrieb:> Denn die Daten aus den einzelnen Kanälen> müssen miteinander kombiniert werden.
Wenn das so ist, wieso dann nicht alle ADCs an ein FPGA anschließen?
bd schrieb:> Die Aufnahmezeiten liegen bei unter 0,5ms. Die Pausen werden> zwischen 2 bis 10ms liegen. Die Auflösung wird zwischen 12-16bit liegen.
Also 256*2MSps*16Bit ist ein GByte/s. Das bekommt man schlecht vom FPGA
irgendwo weg vor allem zu welcher Gegenstelle? 0,5 im Vergleich zu 2 ist
ein Viertel, sind immernoch 256MBytes/s. Aber das kann man schon
wegschicken.
Die Frage ist aber wieviel Datenreduktion findet im FPGA statt. Also
wieviele Daten kommen am Ende aus dem FPGA raus wenn darin die Daten der
ganzen ADCs irgendwie kombiniert und ausgewertet wurden?
Als Beispiel gibt es die Anwendung der Peakerkennung für
Radioaktivitätsmessung. Da sitzt ein schneller ADC und erzeugt eine
Menge Daten, aber hinten aus dem ADC fallen nurnoch die Peakwerte mit
Zeitstempeln, also wenige kBytes/s raus. Vielleicht ist das bei Dir ja
ähnlich.
Wir haben sowas ähnliches (Ultraschall System) mit 128 voll parallelen
Kanälen. Jeweils 8 Kanäle gehen auf einen Artix und die wiederum gehen
dann mit jeweils einer MGT Lane auf einen weiteten Artix. Im
Aufnahmefall kommen so 128*125MS/s*16Bit Daten zusammen die in die Block
Rams geschaufelt werden. Beim Auslesen geht es dann mit 500MB/s etwas
gemächlicher zu. Am Ende ist USB 3.0 der Flaschenhals mit etwas über
300MB/s. Natürlich ist bei dem Sytem die Aufnahmezeit viel kleiner als
die Transferzeit, aber die 16 FPGAs an den ADCs müssen die Daten ja auch
erst mal wegstecken. Mit den Artix kein Problem.
16x 455 Mbps LVDS ist nicht wirklich viel. Bei Altera können das Cyclone
5, Cyclone 10 und manche der Max 10. Die aktuellen Low-End FPGA von
Xilinx können das mit Sicherheit auch.
Interessanter ist der Speicher. 0.5 ms bei 2 MSps sind 1000 Samples, 256
16 Bit 1000 = 4 Mb. Da wird es bei den meisten mit internen Speicher
schon eng. Alternative wäre externes SRAM aber bei 1 GB/s muss das sehr
schnell oder breit sein.
Es gibt auch ADCs mit einem SPI-Interface. Der Vorteil ist du benötigst
nur 4 Leitungen pro ADC. Der ADC hat einen MUX integriert so das du
zwischen 8 Eingängen umschalten kannst. Wenn Du dann 8 ADCs nimmst dann
benötigst Du "nur" 4x8 = 32 Leitungen zum FPGA und kannst dann schon 8 x
8 = 64 Signale gigitalisieren. Jetzt kann man überlegen ob man aus
Kostengründen noch mal die Anzahl an ADCs erhöht oder ob man einen MUX
davor schaltet. Auf jedefall hat der FPGA bei dieser Aufgabe fast nichts
zu tun. Problematisch wird es dann wenn du die Daten vom FPGA in den PC
übertragen möchtest, denn der FPGA hat nicht sonderlich viel internen
Speicher.
Das Konzept ist ziemlicher Murkx. Die Kanalmultiplexer werden die Daten
so dermassen versauen, dass man es kaum kalibrieren kann. Da geht
maximal die halbe Rate durch. Das muss mit einzelnen ADCs gemacht
werden, was aufgrund der geringen Rate von 2MHz auch leicht geht.
Wie oben geschrieben kommt man mit SPI ADCs grob auf 1 IO je ADC wenn
man Clock/CS zusammenhängt. Es gibt mit dem LTC2325LTC2324 auch ICs mit
mehreren ADC die gleichzeitig abtasten und eine SPI Schnittstelle haben.