Hallo zusammen,
ich arbeite gerade, im Rahmen einer Projektarbeit, an der Universität an der Programmierung für einen Impulsgenerator. Nach langer Sucherei habe ich mittlerweile den FPGA "myRIO-1900 Student" vor mir liegen und kann endlich mit der Programmierung loslegen.
Thema:
Als Thema soll ich einen 12-kanäligen Impulsgenerator programmieren, der sich über eine visualierte Benutzeroberfläche (PC), bedienen lässt. U.a. soll ich hier Schaltfrequenz, Totzeiten, Phasenverschiebungen usw. einstellen können.
Mit LabVIEW FPGA will ich das nun umsetzen, allerdings habe ich hier noch ein paar Probleme, die ich gerade nicht gelöst bekomme:
Fragen:
1. Ich möchte im Frontpanel Schaltfrequenz, Totzeiten, Phasenverschiebungen usw. einstellen können. Da ich mit Änderung einiger Parameter, andere Parameter "einschränken" muss (z.B.: bei Schaltfrequenz von 100kHz [=1ms] kann die Totzeit nicht >= 1ms sein! --> einfachstes Beispiel, um die Einschränkung einiger Parameter zu erläutern), möchte ich gerne eine Eingabe vornehmen (Control) und von LabVIEW ausgeben lassen, welche Parameter letzenendes wirklich verwendet oder ggf. auf-/abgerundet werden (Indictator).
Da ich mit LabVIEW FPGA nur sehr schlecht rechnen kann (einfache Multiplikation & Division schränkt die Rechenleistung stark ein und lässt sich nicht wie mit LabVIEW "einfach mal so" durchführen.), möchte ich die Eingaben & Berechnungen außerhalb des FPGAs bearbeiten und nur die "Endsignale" an den FPGA übertragen. Das komplette Frontpanel soll also außerhalb des FPGAs ablaufen und nur die Signalerzeugung soll über dem FPGA passieren.
Wie kann ich Berechnungen außerhalb des FPGAs durchführen und die Endsignale an den FPGA übertragen? Im Anhang habe ich ein Bild angehängt, bei dem ich einen VI unter "myRIO" hinzugefügt habe (VI: untitled4.vi). In dem Bereich kann ich problemlos Berechnungen durchführen. Scheinbar liegt dieser VI außerhalb des FPGA Chips?! Wie kann ich die Berechnungen von dort aus auf den VI auf dem FPGA übertragen (VI: DelayPatternGenerator_Main.vi). Ich hatte mal was von Übertragungen mittels DMA usw. gelesen. Ich finde aber aktuell kein geeignetes Whitepaper, was mir da den Lichtblick bringt.
2. Ich bekomme die Kompilierung nicht hin. Was bei LabVIEW einfach funktioniert, soll mit LabVIEW FPGA nur über einen Cloud Service machbar sein (siehe Anhang)?
Willkommen im LabVIEWforum,
leider zur Einleitung mir einem kleinen Tadel:
Dir ist schon bekannt, dass Windows inzwischen ein Screenshot-Progamm On-Board hat? Damit hätten deine Uploads erstens eine wesentlich kleinere Dateigröße und wären deutlich besser lesbar...
Jetzt zu deinen Fragen:
Ist dir klar, was alles so an einem myRIO drinnen steckt? Das ist nicht nur ein FPGA mit IOs, darüber liegt ARM Dual Core Prozessor mit einem speziellen Linux-RealTime Betriebssystem. Dein Untitled VI läuft bei interaktiver Ausführung auf diesem System und nicht auf dem FPGA, deshalb muss es auch nicht erst umständlich und langwierig übersetzt werden.
Von diesem System kannst du (IMHO) am einfachsten und stabilsten Daten mit dem FPGA-Programm austauschen.
Zum Einstieg solltest du
vielleicht diesen Link anschauen.
Zum FPGA-Kompilieren kann ich nur sagen: Wenn das FPGA-Modul inkl. Xilinx Compiler korrekt installiert ist, dann kann du auch lokal übersetzen. Da ich nicht weiß, was du alles installiert hast bzw. an Installationsmaterial hattest, kann ich dir leider nicht sagen, was du falsch gemacht hast.
Gruß, Jens
(25.03.2017 17:09 )jg schrieb: [ -> ]Willkommen im LabVIEWforum,
leider zur Einleitung mir einem kleinen Tadel:
Dir ist schon bekannt, dass Windows inzwischen ein Screenshot-Progamm On-Board hat? Damit hätten deine Uploads erstens eine wesentlich kleinere Dateigröße und wären deutlich besser lesbar...
Tut mir Leid. Ich bin normal ein großer Fan vom Snipping Tool, aber ich hatte die Bilder mit dem Handy gemacht, da ich die mit einem Kommilitonen über einen Messenger "geteilt" habe. Am Wochenende habe ich gerade leider keinen Zugriff auf den Labor PC und den myRIO und musste mir daher so behilflich sein. Sorry dafür!
Zitat:Dein Untitled VI läuft bei interaktiver Ausführung auf diesem System und nicht auf dem FPGA, deshalb muss es auch nicht erst umständlich und langwierig übersetzt werden.
Von diesem System kannst du (IMHO) am einfachsten und stabilsten Daten mit dem FPGA-Programm austauschen.
Super, das habe ich mir doch soweit schon gedacht. Was ich bisher aber noch nicht rausgefunden habe ist, wie ich die Daten von dem einen VI (untitled4.vi) auf den VI auf dem FPGA (Main VI) übertragen bekomme?! Also: Wie bekomme ich das "Ausgangssignal" im VI untitled4.vi als "Eingangssignal" für einen anderen VI (auf dem FPGA) umgesetzt?
Zitat:Zum FPGA-Kompilieren kann ich nur sagen: Wenn das FPGA-Modul inkl. Xilinx Compiler korrekt installiert ist, dann kann du auch lokal übersetzen. Da ich nicht weiß, was du alles installiert hast bzw. an Installationsmaterial hattest, kann ich dir leider nicht sagen, was du falsch gemacht hast.
Ich habe "Use the locale Compile Server" angewählt. Daraufhin kam die Fehlermeldung (siehe Anhang). Als Software habe ich LabVIEW 2016, LabVIEW Realtime und LabVIEW FPGA installiert. Auch den Xilinx Compiler hatte ich mir (nachträglich) installiert. Ich bekomme trotzdem diese Fehlermeldung ausgespuckt.
Ist deiner Meinung nach der Ansatz sinnvoll, dass ich alle Berechnungen, Ausgaben usw. für das Frontpanel auf dem ARM Prozessor auslagere und lediglich die Signalgenerierung über den FPGA realisiere?! Das war jetzt meine Idee, wie ich das umsetzen wollen würde.
LG
Hallo puh,
Zitat:Ich habe "Use the locale Compile Server" angewählt. … Ich bekomme trotzdem diese Fehlermeldung ausgespuckt.
Dann wird es wohl einen Fehler bei der Installation gegeben haben. Oder du hast nicht die korrekte Version am korrekten Ort installiert…
Nimm doch die CompileCloud!
Zitat:wie ich die Daten von dem einen VI (untitled4.vi) auf den VI auf dem FPGA (Main VI) übertragen bekomme?
LabVIEW kommt mit jeder Menge Beispielen, u.a. auch Beispiel-Projekten, wo genau das erklärt wird: Daten zwischen PC <-> RT <-> FPGA zu transferieren. Einfach mal angucken!
(Im einfachsten Fall ein FP-Element des FPGA im RT-Host lesen/schreiben…)
Zitat:Ist deiner Meinung nach der Ansatz sinnvoll, dass ich alle Berechnungen, Ausgaben usw. für das Frontpanel auf dem ARM Prozessor auslagere und lediglich die Signalgenerierung über den FPGA realisiere?!
Das hängt alles von deinen Rahmenbedingungen ab!
Eine aufwendige Berechnung würde ich eher auf dem RT machen. Einen PWM im kHz-Takt generiere ich dann doch lieber direkt auf dem FPGA…
Die Kompilierung habe ich jetzt hinbekommen. Danke erstmal für die Hilfe.
Zitat:wie ich die Daten von dem einen VI (untitled4.vi) auf den VI auf dem FPGA (Main VI) übertragen bekomme?
LabVIEW kommt mit jeder Menge Beispielen, u.a. auch Beispiel-Projekten, wo genau das erklärt wird: Daten zwischen PC <-> RT <-> FPGA zu transferieren. Einfach mal angucken!
(Im einfachsten Fall ein FP-Element des FPGA im RT-Host lesen/schreiben…)[/quote]
Ich habe mir jetzt diverse White-Paper angesehen und bin zuletzt
hier auf einige interessante Beispiele gestoßen. Insbesondere den VI "Windturbine" (hier:
ftp://ftp.ni.com/evaluation/crio/compact...tion_1.zip ) habe ich mir angeschaut; bin aber bisher noch nicht auf eine Lösung meines Problems gekommen.
Ich möchte über den VI auf dem RT eine einfache boolesche Variable auf einen VI, der auf dem FPGA hinterlegt ist, übertragen. Gibt es dafür nicht ein paar einfachere Beispiele, als das oben beschriebene in denen eine einfache Datenübertragung von RT -> FPGA beschrieben wird? Bisher habe ich leider nur Examples finden können, die ziemlich überworfen mit Code Zeilen waren.
LG
Hallo puh,
Zitat:LabVIEW kommt mit jeder Menge Beispiele
Datei-Menü -> "Neu…"
Dort dann die Beispiel-Projekte durchsuchen und passendes auswählen!
Zitat:Bisher habe ich leider nur Examples finden können, die ziemlich überworfen mit Code Zeilen waren.
Codezeilen? In LabVIEW?
Das Problem mit der Datenübertragung habe ich mittlerweile gelöst.
[
attachment=57668]
Nun ist mir aber ein anderes Problem aufgefallen, dass ich bisher (meiner Meinung nach) "unschön" gelöst habe.
Ich lasse ein Dreiecksignal über ein Case-Befehl hoch (bei false) und runterlaufen (bei true). Der Counter für das Dreiecksignal läuft über den 40MHz Takt hoch und runter. Nun möchte ich bis zu 12 Ausgänge (=6 Halbbrücken Zweige) implementieren, die entsprechend phasenverschoben werden können müssen. Da bei dem Case-Befehl das Dreiecksignal entweder hoch oder runterläuft, kann ich den Durchlauf derzeit nicht "stoppen", ohne das Programm zu beenden.
Um eine Phasenverschiebung zu realisieren, möchte ich daher gerne einen vorgelagerten Counter implementieren, der entsprechend so lange hochzählt, bis ein bestimmter Wert erreicht ist und dem "Dreieck-Counter" somit ein "TRUE" gibt.
Als Beispiel:
Kanal 1 soll mit 0° laufen und das Dreiecksignal kann sofort hochzählen. Kanal 2 soll 180° phasenverschoben dazu sein. Dafür soll nach der Eingabe des Wertes "180°" einmalig ein Counter hochzählen, der dafür sorgt, dass das Dreiecksignal von Ausgang 2 nicht sofort hochzählt.
Gelöst habe ich es derzeit so, dass ich ein Case-Befehl in einem Case-Befehl geschrieben habe. Wenn der äußere Case-Befehl "True" ist, wird solange gewartet bis der entsprechende "Tick" für die Phasenverschiebung erreicht ist. Erst dann soll das Dreiecksignal starten. Der äußere Case-Befehl wird nur aufgerufen, wenn ein Wert != 0 eingegeben wurde oder der Wert geändert wurde.
Gibt es dafür vielleicht eine "schönere" Lösung?
Wie wäre es mit einem Upload des FPGA-VI, anstatt das lang, breit und umständlich zu erklären?
Gruß, Jens
Hallo puh,
Zitat:Um eine Phasenverschiebung zu realisieren, möchte ich daher gerne einen vorgelagerten Counter implementieren, der entsprechend so lange hochzählt, bis ein bestimmter Wert erreicht ist und dem "Dreieck-Counter" somit ein "TRUE" gibt.
Wenn alle Ausgänge den gleichen Takt verwenden, reicht ein Counter aus: Für die Phasenverschiebung dann einfach einen festen Wert auf den Counter dazuaddieren…
Beispiel: Counter steht aktuell bei 10 und zählt bis max. 120 hoch. Du willst auf einem zweiten Kanal eine Phasenverschiebung von 60° haben: du musst also 60°/360°*120=20 zum Counter hinzuaddieren. Ergebnis: Kanal1 bekommt den Ausgabewert, der zum Counter=10 passt und Kanal2 den Wert, der zu Counter=30 gehört…
Heute Nachmittag hatte ich mir ähnliches schon überlegt. Leider merke ich, dass ich mich in meiner Studienzeit wenig mit der Programmierung beschäftigt habe und dadurch auch bei manchmal scheinbar einfachen Dingen, etwas kompliziert denke.
Dein Tipp hat mir auf jeden Fall weitergeholfen. Vielen Dank dafür!