Ich stehe vor einem lästigen Problem welches ich gerne eliminieren würde: Ich habe ein SoC (Zynq) welches ich als Reglerplattform benutzen will. Beim Programmieren und Einstellen von Reglern habe ich des öfteren das Problem, dass ich gewissen physikalische Grössen mit einem Scope messen kann, der Zusammenhang mit diversen FPGA/CPU-internen Grössen (Messwerte und davon abhängige) aber interessant wäre und diese Grössen im Normalfall nicht zugänglich sind. Ich suche also eine Möglichkeit, diese Grössen im Betrieb mitzuloggen und nachträglich an einen PC zu schicken, damit ich sie mit den Daten vom Scope vergleichen kann, habe dabei aber nicht so wirklich einen Plan wie ich dabei am effizientesten vorgehen soll. Ich dachte dabei daran, die Daten vorher in einem Array mitzuschreiben (fixe Samplingfrequenz durch Timer-Interrupt) und das Array dann per UART an den PC zu schicken um die Daten zu plotten. Die Fragen die sich mir jetzt stellen: - Wie implementiert man das Loggen der Daten am einfachsten? Die simpelste Methode wäre in meinen Augen, einfach für jede Variable ein Array mit entsprechender Länge vorzusehen und die Daten nacheinander dort reinzuschreiben. Bei 20 kHz Samplingfrequenz kommen pro Sekunde dann 80000 Byte zusammen (für eine float Variable). Ich bin mir sicher, dass dies funktionieren würde, allerdings erscheint mir die Methode etwas brutal. Ausserdem muss ich damit de facto jede Variable doppelt anlegen (-> unübersichtlich und fehleranfällig?) und ich weiss nicht, wie sehr die Laufzeit der Regler-ISR sich freut wenn bei jedem Aufruf grössere Arrays beteiligt sind. Ist diese Holzhammer Methode akzeptabel oder gibts hier was besseres (programmiert wird in C)? - Gewisse Dinge laufen im FPGA mit Samplingfrequenz > 10 MHz. Als Lösung sehe ich hier, den Datastream in ein FIFO zu schreiben und die Daten per DMA ins RAM zu kopieren. Hier stellt sich für mich die Frage, wie ich die Daten in meinem C-Programm verwerten kann bzw. wie das Programm mit dem betreffenden Speicherbereich umgehen soll. Soll ich diesen per malloc() vorher reservieren, die DMA-Unit schreibt die Daten rein und das Programm liest sie anschliessend aus? - Wie kann ich die Daten am effizientesten zum PC übertragen? Ich habe nur eine UART Schnittstelle und über diese bis jetzt nur ein Terminal welches mit Putty kommuniziert laufen lassen. Wie ich Bytes über UART rausschicken kann ist mir bekannt, allerdings benötige ich am PC ein Programm das die Daten in eine Datei schreibt. Hier gibt es bestimmt fertige Lösungen, nur was bietet sich für sowas an?
Genau das mache ich mit einem kleinen Zustandsautomaten. Zuerst wird gewartet bis über UART ein Byte empfangen wurde. Das Byte sagt aus welcher Quelle und wie viele Daten aufgenommen werden sollen. Dann werden die Werte in einen Speicher geschrieben. Ist die Anzahl der angeforderten Werte aufgenommen wird der Speicherinhalt über UART ausgegeben. Zur Datenrate: Einen BlockRAM kann man mit mehreren 100 MByte/s beschreiben. Da braucht man kein DMA oder so. Und externes RAM braucht man auch nur wenn es große Datenmengen sind. Und dann ist das Auslesen über UART eher suboptimal. Ich verwende ich FPGA dazu keine CPU und nur etwas wenig HDL. Wenn du einen Taktdomänenübergang hast dann ist ein FIFO sinnvoll,sonst brauchst du den eigentlich nicht. Aber du kannst auch einen FIFO nehmen. Vor der Datenaufnahme resetten, dann reinschreiben bis der voll ist und dann auslesen bis er wieder leer ist.
Überlege Dir, was Du so in etwa willst. Wenn Du 100.000 Messwerte übertragen willst, ist das kein Problem. Mit ASCII in eine Textdatei, da brauchst Du nichtmal ein Programm. Malloc eher nur einmal zum Programmstart, besser static. Ob du Daten 2 oder 3 Mal hälst spielt keine Rolle. Bring es zum laufen, sammle Erfahrung und dann optimiere wenn Du das brauchst.
Allenfalls einen Mehrkanal DAC zB einen LTC1665, 8 kanal 8 bit, montieren und die interessierenden Werte darueber rausgeben, zum mit dem Oszilloskop zuschauen. Wenn man sich so einen steckbar macht muss er auch nicht im endgueltigen Produkt dabei sein, und trotzdem die Moeglichkeit bieten.
Beitrag #6395607 wurde von einem Moderator gelöscht.
Ernsthaft? Er hat doch die Werte schon schön digital im FPGA. Einen UART hat er ebenfalls. Da braucht es nur ein paar Zeilen VHDL und am PC z. B. ein kleines Pythonscript und schon kann er das wie ein Oszilloskop verwenden. Im Anhang das VHDL aber ohne die UART und ADC Komponenten. Der nimmt 16 Bit Werte und schickt die dann zum PC. Das erste Byte sind die MSBs, das zeite Byte die LSBs. Es schickt auf Anfrage, also man sendet ein Byte zum FPGA, davon ist das obere Nibble die Anzahl der aufzunehmenden Samples von 2**8 bis 2**15. Das untere Nibble wählt den ADC/Quelle aus.
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.