Forum: FPGA, VHDL & Co. Signale mit 32Mbit/s extern speichern


von Burkhard K. (buks)


Lesenswert?

Ich erfasse Ultraschallsignale im Feld (nachts+draussen) auf einem 
Nexys4 DDR Board. Die Signale laufen mit 32 MBit/s (2 Kanäle á 16 bit, 1 
MSp/s) ins Board. Um ein passendes Kompressionsverfahren +Denoising zu 
finden/testen, brauch ich mehrere Samples nach dem ADC auf einem 
externen Speichermedium. Der interne Zwischenspeicher (64 MiB DDR2 RAM) 
reicht für 16 Sekunden.

Ausgabemöglichkeiten auf dem Board:
  * UART to USB (PIC24)
  * SDHC Card Interface
  * RMII 100 Mbit/s (SMSC 10/100 Ethernet PHY LAN8720A)
  * 4x4 freie IOBs (verteilt auf 4 Pmods)

(kein USB-OTG).

UART to USB wäre konzeptionell einfach - aber welche Übertragungsraten 
sind damit möglich? Für den vorhandenen Ethernet PHY fehlt mir bisher 
ein Core +Einarbeitungsaufwand. Dito für das SDHC-Interface.

Was ginge noch, um das Signal vom Board (im Feld) mit mögichst wenig 
Aufwand auszulesen und ausserhalb vom FPGA zu speichern!

N.B. 1: Sobald ich ein passendes Kompressionsverfahren gefunden habe, 
brauche ich die "High-Speed"-Ausgabe nicht mehr.
N.B. 2: Das ist ein Hobbyprojekt.

von goo (Gast)


Lesenswert?

Versuche die SDHCKarte im SPIModus. Da sparst du dir das lesen des 
SDHC-Standart und den will keiner freiwillig lesen ;) ansonsten 
opencores.org

von FPGA zum Spass (Gast)


Lesenswert?

SD-Karte kannst du bei der Datenrate im SPI Modus vergessen, das geht 
nur im 4 Pin Modus. Dann aber möglich.

USB wäre möglich, aber nicht das was du drauf hast. Das kommt sicher nur 
auf <1Mbit.

Ethernet, keine Ahnung, habe ich noch nie in Betrieb genommen.

Zusätzliche IOs: du kannst ein FPGA Board mit 480Mbit FTDI mit deinem 
Board verbinden, dann klappt es problemlos.
Wird aber ein ganz schöner Aufbau....


Zur Anwendung:
Ultraschall kann vieles sein. Kannst du wirklich mit nur 1 Mhz samplen?

Wenn du nur Kompression testen möchtest, dann würde ich einfach mal 
etwas aufnehmen, Pause machen und per RS232 rausschleichen, dann wieder 
aufnehmen, usw.

Du verpasst zwar was zwischendurch, ist aber für den Kompressionstest 
völlig egal, weil du auch so genug Beispielmaterial zum Testen bekommst.

von -gb- (Gast)


Lesenswert?

Der FTDI UART kann 12 MBaud.

von Burkhard K. (buks)


Lesenswert?

FPGA zum Spass schrieb im Beitrag #5890405:
> Zur Anwendung:
> Ultraschall kann vieles sein. Kannst du wirklich mit nur 1 Mhz samplen?

Diverse Tierlaute inclusive Fledermäuse. Das meiste spielt sich 
unterhalb von 100 kHz ab, eventuell noch 2. Harmonische. Oberhalb von 
200kHz fällt der Verstärker dann ab.

-gb- schrieb:
> Der FTDI UART kann 12 MBaud.

Danke für den Hinweis, steht ja auch so im FTDI-Datenblatt. Leider fehlt 
im Nexys4 Schaltplan genau diese eine Seite ("intentionally left 
blank").

Wie kann ich die 12 MBaud auf der Gegenseite entgegen nehmen?. Mit der 
neuesten VCP Treiber Version ist der höchste einstellbare Wert im 
Windows7 Gerätemanger lediglich 921600 Baud.

von egonotto (Gast)


Lesenswert?

Hallo,

vielleicht könntest Du ein billiges Board mit einen CYPRESS FX2 
versuchen. Die werden als Saleae Clones verkauft.

MfG
egonotto

von Niklas Gürtler (Gast)


Lesenswert?

SD-karte ist möglich, sofern man den SD bus und nicht SPI nutzt. Da 
gehen bis 10 MiB/s (80 MBit/s). Man braucht aber viel Pufferspeicher, 
für ca 2 Sekunden ist sinnvoll. Das Schreiben muss man in einer cleveren 
Folge machen.
Vorteil: Billig und hardwaretechnisch simpel, man kann die Karten 
einfach herausnehmen und am PC auslesen, aufzeichnen geht autonom ohne 
PC.
Nachteil: Softwaretechnisch nicht ganz einfach.

von Gustl B. (-gb-)


Lesenswert?

Burkhard K. schrieb:
> Wie kann ich die 12 MBaud auf der Gegenseite entgegen nehmen?

Pyserial für Python kann das. Sonst müsste das auch mit dem D2XX gehen.

von c-hater (Gast)


Lesenswert?

Burkhard K. schrieb:

> Wie kann ich die 12 MBaud auf der Gegenseite entgegen nehmen?. Mit der
> neuesten VCP Treiber Version ist der höchste einstellbare Wert im
> Windows7 Gerätemanger lediglich 921600 Baud.

Das besagt nicht viel, der dortige Dialog bietet nur eine Auswahl von 
Standard-Datenraten an, so weit diese vom Treiber unterstützt werden. 
Der Treiber kann aber darüber hinaus viele weitere Datenraten 
unterstützen.

Sprich: entweder findest du eine vollständige Doku zum Treiber oder du 
musst es schlicht ausprobieren, wie weit er mitspielt. Der entsprechende 
Parameter des API ist ein schlichtes DWORD, also keine Enumeration oder 
sowas und wird vom API einfach zum Treiber durchgereicht. Wenn der 
Treiber meint, das könnte er, wird SetCommState true zurückliefern, 
ansonsten halt nicht. Ein Programm, um die Obergrenze auszuklingeln ist 
schnell geschrieben und wenn es halbwegs clever geschrieben ist (binäre 
Suche), dann ist es auch schnell durchgelaufen.

von Martin S. (strubi)


Lesenswert?

Burkhard K. schrieb:
> UART to USB wäre konzeptionell einfach - aber welche Übertragungsraten
> sind damit möglich? Für den vorhandenen Ethernet PHY fehlt mir bisher
> ein Core +Einarbeitungsaufwand. Dito für das SDHC-Interface.

Mit Bulk-Übertragung von Streams ist schon etwas Knarzerei 
vorprogrammiert (insbesondere unter Windows USB), aber du kannst ja 
puffern.
Ansonsten gäbs hier noch einen recht anständig programmierten (und gut 
getesteten) Core:

https://github.com/pkerling/ethernet_mac

Musst ja nicht nen ganzen RTP-Stack anwerfen, p2p geht auch ein roher 
Ethernet-Stream. Die Datenrate ist gut zu schaffen, und mit DPCM und 
Huffman-Coder holst du (lossless) ev. nochmal Kompression 1:4 raus, 
hängt halt stark vom Aussehen deiner Daten ab (und nem cleveren 
Prädiktor).

Ansonsten hätte ich auch eher einen FX2 genommen als mich mit dem FTDI 
rumzuärgern. Unter Windows hickste damals der Treiber andauernd rum, 
wegen irgendwelchem Threading-Murks in der libD2XX, kann sein, dass es 
jetzt besser läuft. Software-Aufwand war grösser, als HW-Tausch...

von Duke Scarring (Gast)


Lesenswert?

Burkhard K. schrieb:
> Für den vorhandenen Ethernet PHY fehlt mir bisher
> ein Core +Einarbeitungsaufwand.

https://www.fpga4fun.com/10BASE-T.html

Das ist zwar in Verilog und recht hemdsärmelig, aber o.k. um in die 
Thematik reinzukommen. 100Base-T läuft dann mit 25 MHz (oder 50 MHz) und 
für Gigabit braucht man einen Takt mit 125 MHz.

Duke

von Ingo S. (logikneuling)


Lesenswert?

Ueber den PIC UART, aber auch ueber die FTDI UART Loesungen mittels VCP 
sind meiner Erfahrung nach solche Datenraten nicht kontinuierlich 
realisierbar.

Fuer unidirektionales Empfangen der Daten am handelsueblichen Windows 
Laptop sind aber 8MByte/sec (64Mbit/sec, also mehr als Du brauchst) 
kontinuierlich moeglich mittels FT232H im asynchronen FT245 Mode (gibts 
als simple Module zu kaufen), D2XX Treiber, und Minimalprogramm in C, 
ohne weitere besonderen Anforderungen.

Benoetigt, je nach Leistungsfaehigkeit der Gegenstelle, ein paar kB FIFO 
Speicher im FPGA (um zur Not 1, 2, 3 oder auch ein paar mehr der 1ms 
Intervalle fuer USB Transfer zu buffern) und 10 GPIO (8-bit Data Out, 
1xWrite-Enable Out, 1xFlowControl In). Die Kommunikation zwischen FIFO 
des FPGA und FIFO des FT232H ist lediglich eine simple state-Machine, 
die in ein paar Minuten zusammengehackt ist!

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Ich hatte irgendwann auch mal zufällig das gefunden, weiß aber nicht 
inwiefern das geeignet ist:
http://xillybus.com/

von Burkhard K. (buks)


Lesenswert?

Danke für Eure Tips und Hinweise.

Ingo S. schrieb:
> Fuer unidirektionales Empfangen der Daten am handelsueblichen Windows
> Laptop sind aber 8MByte/sec (64Mbit/sec, also mehr als Du brauchst)
> kontinuierlich moeglich mittels FT232H im asynchronen FT245 Mode (gibts
> als simple Module zu kaufen),
Ein FT2232HQ ist auf dem Nexys4-Board, leider legt Digilentic dessen 
Konfiguration nicht offen (die entsprechende Seite im Schaltplan ist 
"intentionally left blank" - eigentlich eine ziemliche Frechheit).

Hab mich erstmal für die USB-UART Bridge mit 12MBaud (VCP) entschieden. 
Damit erreiche nur ca. ein Viertel der angepeilten Datenrate, ist aber 
für den Anfang o.k., da ich nicht kontinuierlich streamen muss. Ein 
kurzes Python-Skript nimmt die Daten mit serial.Serial() (auf dem 
Laptop) entgegen.

Jetzt muss ich mich nur noch nach einem geeigneten schwarzen Kästchen 
aka Einplatinenrechner umschauen, der die Daten anstelle des Laptops 
entgegennimmt und automatisch auf USB-Stick oder SDHC-Karte schreibt. 
Sobald ich den am Start habe, werde ich mir die Lösung per Ethernet 
anschauen.

von Gustl B. (-gb-)


Lesenswert?

Burkhard K. schrieb:
> Ein FT2232HQ ist auf dem Nexys4-Board, leider legt Digilentic dessen
> Konfiguration nicht offen (die entsprechende Seite im Schaltplan ist
> "intentionally left blank" - eigentlich eine ziemliche Frechheit).

Ja das ist tatsächlich doof, aber es hätte auch nicht viel geholfen. Der 
FT2232HQ ist leider nur über UART und JTAG mit dem FPGA verbunden. Mehr 
als 12 MBd UART ist also nicht drinnen. Wenn du mehr brauchst verwende 
andere Hardware. Das ist wirklich gut machbar mit den fertigen FT2232H 
Modulen von FTDI und einem FPGA Board mit vielen freien IOs. Wenn du 
VHDL für den snchronen FT245 haben willst melde dich, habe ich aber auch 
irgendwo hier im Forum hochgeladen. Damit schafft man knapp 40 MByte/s.

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.