Wir schreiben den FPGA-Loader in LabVIEW. Teil 1



Die meisten "normalen" Programmierer haben, gelinde gesagt, eine zweideutige Einstellung zur LabVIEW- Technologie. Hier kann man lange und ohne Erfolg streiten. Die Situation wird durch die Tatsache verschärft, dass es im Netzwerk viele Beispiele für LabVIEW-Programme gibt, die sich jedoch alle an Anfänger richten und sich auf "Oh, sehen Sie, wie einfach es ist, verbinden Sie die Drehung mit dem Indikator, drehen Sie den Knopf, ändern Sie die Nummer" oder bestenfalls auf die Grafik im Zyklus beschränken Es wird eine Zufallszahl oder ein Sinus angezeigt. All dies wird von einer wütenden Oberfläche in Form von riesigen Kippschaltern, Drehknöpfen und Messuhren begleitet. Persönlich ärgert mich dieser Ansatz der bewussten Vereinfachung. In einer kurzen Artikelserie werde ich versuchen, den Leser in den Prozess der Entwicklung von Anwendungssoftware bei LabVIEW einzuführen. Um dem Themenbereich nicht viel Zeit zu widmen, verwenden wir den detaillierten Algorithmus zum Hochladen der Konfigurationsdatei auf das FPGA über FTDI im MPSSE-Modus ( Herunterladen der Konfiguration auf das FPGA über USB oder Zerlegen von FTDI MPSSE ). In diesem Artikel werde ich zeigen, wie der gleiche FPGA-Loader implementiert wird, jedoch in der LabVIEW-Sprache.


Wie oben erwähnt, sind der FPGA-Ladealgorithmus im SP-Modus (Serial Passive) und das Prinzip des FTDI-Betriebs im vorherigen Artikel ausführlich beschrieben. Ich werde mich nicht wiederholen. Wir glauben, dass der Algorithmus getestet und als passend erkannt wird. Und ja, nehmen wir an, der Leser ist zumindest oberflächlich mit dem LabVIEW-Konzept vertraut und kennt sich mit klassischer Programmierung bestens aus.


Obwohl das Erstellen eines Bootloaders nicht viel Zeit in Anspruch nimmt, konnte die Beschreibung des Prozesses nicht in das Volumen eines Artikels passen, sodass es eine kleine Serie geben wird. Da die Phase der Experimente bereits abgeschlossen ist und ich von der Funktionsfähigkeit des Algorithmus überzeugt bin, werde ich mir erlauben, mit der Entwicklung über die Benutzeroberfläche zu beginnen. Im ersten Artikel werden wir die Loader-Benutzeroberfläche erstellen und die Programmstruktur implementieren. In der zweiten - über die FTDI-Treiber-DLL implementieren wir das Laden der * .rbf-Datei in das FPGA.


Für die Produktivität der Konversation ist es nicht überflüssig, sich an die in LabVIEW verwendete Terminologie zu erinnern. In LabVIEW wird das Anwendungsprogramm als virtuelles Instrument, auch als VI bezeichnet, auch als virtuelles Instrument oder kurz VI bezeichnet. Der VP hat zwei „Seiten“: das Frontpanel, auf dem sich die Bedienelemente und Anzeigen befinden, und das Blockdiagramm (Blockdiagramm), auf dem diese Elemente miteinander verbunden sind und die Funktionen und Datenverarbeitungsabläufe implementiert sind. In der Regel hat ein VP eine hierarchische Struktur. Alle VPs in einem VP der obersten Ebene werden normalerweise als Subgerät oder SubVI bezeichnet.


Benutzeroberfläche


Unsere Anwendung sollte die Konfigurationsdatei in das FPGA laden. Gleichzeitig meinen wir, dass mehrere FTDIs gleichzeitig an einen Computer angeschlossen werden können und einige von ihnen möglicherweise zum Konfigurieren von FPGAs verwendet werden können. Ich schlage vor, eine Geräteauswahl aus der Dropdown-Liste zu treffen und eine Datei über eine Schaltfläche mit einer Pfadausgabe auszuwählen. Um den Download zu starten, fügen Sie die Schaltfläche "Programm" hinzu. Eine virtuelle LED zeigt den Status des Vorgangs an. Starten Sie LabVIEW.


Fügen Sie die erforderlichen Elemente zur Frontplatte (Frontplatte) hinzu. Ich werde den "Silber" -Stil für den VP verwenden. Die folgende Abbildung zeigt das Ergebnis aller Elemente in ihrem ursprünglichen Zustand. Bei Bedarf sind sie in der Palette recht leicht zu finden.




Wir bearbeiten Elemente: Wir übertragen, dehnen, wir fügen Inschriften hinzu - wir bringen sie in die gewünschte Form. Hier ist in der Tat die Hand des Designers erforderlich, aber wie ich könnte:




Und das Blockdiagramm:




Ich ziehe deine Aufmerksamkeit auf mich. Jedes Element verfügt über zwei Eigenschaften, die den Namen bestimmen - Beschriftung und Beschriftung.




Die erste Eigenschaft legt den Namen des Elements fest. Unter diesem Namen wird es im Blockdiagramm angezeigt. Die Beschriftung kann im Gegensatz zur Beschriftung während der Ausführung des VIs nicht geändert werden. In Verbindung mit dieser Funktion empfehle ich, dass Sie die Beschriftung in Ihren VIs auf der Vorderseite ausblenden und Beschriftung anzeigen. Überlegen Sie sich für Label einen aussagekräftigen Namen als Variable in einer klassischen Programmiersprache, vorzugsweise in einem lateinischen Layout. Für Caption führen wir einen menschenorientierten Namen ein. Dieser kann sehr lang sein, Leerzeichen enthalten und bei Bedarf auf Russisch. Mit LabVIEW können Sie die Anzeigeschriftart für die Beschriftung anpassen. Ich muss sagen, dass uns niemand zwingt, uns mit der Bildunterschrift anzulegen: Jede Inschrift kann an jedem freien Ort direkt auf FP angebracht werden.


Wir implementieren die VP-Operation nach dem klassischen Schema: While-Schleifen- und Ereignishandler. Fügen Sie dem Blockdiagramm eine While Schleife (Programmierung -> Strukturen -> While-Schleife) und eine Event-Handler-Struktur (Programmierung -> Strukturen -> Ereignisstruktur) hinzu.


Kurze Hilfe zur Ereignisstruktur

Die Struktur wartet auf das Eintreten des Ereignisses, dann wird der entsprechende Handler ausgeführt. Die Struktur von Ereignissen hat ein oder mehrere Unterdiagramme - Ereignishandler, die sogenannten Fälle, von denen einer ausgeführt wird, wenn ein Ereignis auftritt. Mit dem Terminal in der oberen linken Ecke können Sie die Anzahl der Millisekunden angeben, in denen die Struktur ein Ereignis erwartet. Wenn während dieser Zeit kein Ereignis aufgetreten ist, wird das Unterdiagramm „Timeout“ ausgeführt. Der Standardwert ist minus 1, was bedeutet, dass das Zeitlimit nie abläuft.




  1. Die Ereignisauswahlbezeichnung gibt an, welche Ereignisse den aktuellen Fall auslösen. Um andere Handler anzuzeigen, können Sie auf den Abwärtspfeil neben dem Ereignisnamen klicken.
  2. Das timeout Terminal legt die Anzahl der Millisekunden fest, die auf ein Ereignis gewartet werden sollen. Wenn der Wert nicht -1 ist, muss das Timeout-Subdiagramm implementiert werden.
  3. Ein Terminal zur Eingabe dynamischer Ereignisse. Dieses Terminal wird standardmäßig nicht angezeigt. Um es anzuzeigen, wählen Sie im Kontextmenü "Dynamische Ereignisterminals anzeigen".
  4. Ereignisdatenknoten. Wenn ein Ereignis eintritt, generiert LabVIEW Daten, die diesem Ereignis zugeordnet sind. Dieser Knoten stellt diese Daten dem Handler zur Verfügung. Mit der Maus können Sie die Größe des Knotens vertikal ändern und die erforderlichen Elemente auswählen. Einige Daten wie Type und Time sind allen Ereignissen gemeinsam, andere wie Char und VKey hängen von der Art des konfigurierten Ereignisses ab.
  5. Der Ereignisfilterknoten definiert Ereignisdaten, die Sie ändern können, bevor die Benutzeroberfläche diese Daten verarbeitet. Dieser Knoten wird nur in den Handlern angezeigt, in denen Filterung verfügbar ist. Sie können Elemente vom Ereignisdatenknoten zum Ereignisfilterknoten verbinden und ändern. Sie können diese Ereignisse auch ändern, indem Sie die neuen Werte mit den Knotenterminals verbinden. Kann ich die Reaktion der Schnittstelle auf das Ereignis vollständig abbrechen, wenn ich true an das Discard? Terminal Discard? . Wenn Sie den Wert nicht mit dem Filterelement verbinden, bleibt dieses Datenelement unverändert.
  6. Wie die Case unterstützt die Ereignisstruktur Tunnel. Wenn Sie in einem Fall einen Tunnel hinzufügen, wird dieser automatisch für jeden Handler erstellt. Standardmäßig müssen jedoch die Ausgabetunnel der Ereignisstruktur nicht in jedem Handler verbunden werden. Alle nicht verbundenen Tunnel verwenden den Standardwert für den Tunneldatentyp. Dies kann möglicherweise zu schwer zu erkennenden Fehlern führen. Sie können den Modus zurückgeben, in dem der Tunnel in allen Handlern verkabelt werden soll. Wählen Sie dazu im Kontextmenü "Standard verwenden, wenn nicht verdrahtet".

Zunächst kümmern wir uns darum, wie der Zyklus endet und das Programm beendet. Am einfachsten ist es, eine Stopp-Schaltfläche hinzuzufügen, die den Zyklus stoppt. Meiner Meinung nach ist es jedoch üblich, das Programm mit einem roten Kreuz in der oberen Ecke des Fensters zu beenden.
Fügen Sie der Event Structure den entsprechenden Handler hinzu. Wählen Sie im Kontextmenü "Ereignisfall hinzufügen". Wählen Sie als Quelle des Ereignisses "Dieses VI" aus. Das Ereignis zeigt "Panel schließen?" An.


Ereignisse bearbeiten


Klickbares Bild


Bitte beachten Sie, dass bei Auswahl von "Panel schließen" (ohne Frage) dieses Ereignis ohne Filter ist und nicht rückgängig gemacht werden kann. Und wenn Sie eine Frage haben und dann auf das Kreuz klicken, können wir die Kontrolle übernehmen und das Programm unabhängig korrekt vervollständigen. Im "Panel schließen?" Durch den Tunnel verbinden wir die Boolesche Konstante true mit dem Terminal, um die while zu stoppen. Eingabe "Verwerfen?" dienen auch true .


Jetzt gibt es keine offensichtliche Nuance: Wenn das aktuelle VI nicht in der LabVIEW-Umgebung, sondern in Form einer kompilierten Anwendung gestartet wird, wird durch Klicken auf das Kreuz das Fenster nicht geschlossen, sondern die Anwendung gestoppt, die wir nicht benötigen. Um dieses Problem zu lösen, prüfen wir nach Abschluss des Hauptzyklus, ob wir uns in der Entwicklungsumgebung oder im Programmiermodus befinden. Wenn wir uns noch im Programmiermodus befinden, beenden wir die Anwendung. Verwenden Sie den Eigenschaftsknoten (Programmierung -> Anwendungssteuerung -> Eigenschaftsknoten), um zu verstehen, wo das aktuelle VI ausgeführt wird. Dieser Knoten bietet Zugriff auf die Eigenschaften eines Objekts unter Bezugnahme auf dieses Objekt. In diesem Fall sollten wir einen Link zur gesamten Anwendung erhalten. Wählen Sie die VI Server Reference aus derselben Palette aus. Nachdem die Konstante auf das Blockdiagramm gesetzt wurde, müssen Sie ihren Typ in This Application ändern (linke Maustaste). Wir verbinden die resultierende Verknüpfung mit dem Eigenschaftsknoten. Wählen Sie die Application:Kind Property Eigenschaft Application:Kind Property - Gibt den Typ des LabVIEW-Systems zurück, in dem das aktuelle VI ausgeführt wird. Wir verbinden die Ausgabe der Eigenschaft mit der Fallstruktur, fügen den Fall "Laufzeitsystem" hinzu, in dem wir die Anwendung Quit LabVIEW ( Quit LabVIEW ). Damit dieser Block nach dem Zyklus und nicht vorher ausgeführt werden kann, verbinden wir den Eingangsanschlussfehler mit dem Zyklus durch den Tunnel.



Klickbares Bild


Wenn Sie das Programm starten, können Sie es stoppen, indem Sie auf das Kreuz des Fensters klicken. Das gestartete Programm sieht folgendermaßen aus:




Meiner Meinung nach viel überflüssig. Gehen Sie zu den VI-Eigenschaften (Menü Datei -> VI-Eigenschaften), wählen Sie die Kategorie "Fensterdarstellung" und legen Sie Benutzerdefiniert fest.


Schalten Sie die Anzeige des Menüs aus (es bleibt im Bearbeitungsmodus), deaktivieren Sie die Bildlaufleiste und blenden Sie die Symbolleiste aus, wenn die Anwendung ausgeführt wird (Symbolleiste beim Ausführen anzeigen). Wir verbieten die Größenänderung des Fensters, wir erlauben das Minimieren und Minimieren des Fensters. Das ist besser:




Natürlich lohnt es sich, die Beschriftung "National Instruments. LabVIEW Evaluation Software" zu entfernen, aber ich möchte noch keine Lizenz für einen Heimcomputer kaufen. Wir werden die Beschriftung in Kauf nehmen und die 45-tägige Testphase verwalten.


Natürlich können Sie die Hintergrundfarbe und jedes Element anpassen, Schriftarten auswählen, aber ich bin kein Designer, aber irgendetwas sagt mir, dass ich es nur noch schlimmer machen werde.


Instrumentenliste


Der VP sollte dem Benutzer eine Liste der an den Computer angeschlossenen Geräte anbieten, die für die FPGA-Firmware geeignet sind, damit der Benutzer das gewünschte auswählen kann. In der FTD2XX-Bibliothek sind die Funktionen FT_CreateDeviceInfoList und FT_GetDeviceInfoDetail für diesen Zweck vorgesehen. Wie in einem früheren Artikel erläutert, können Treiberbibliotheken zur Verwendung der FTD2XX-API verwendet werden. LabVIEW verfügt über einen praktischen Mechanismus für die Interaktion mit dynamischen Bibliotheken - den Knoten "Funktionsknoten der Anrufbibliothek" finden Sie in der Palette "Konnektivität -> Bibliotheken und ausführbare Dateien". Der Funktionsaufrufknoten sollte konfiguriert sein: Geben Sie zunächst den Pfad zur DLL an (Registerkarte "Funktion"). FT_CreateDeviceInfoList durchsucht das System die Bibliothek und fordert Sie auf, den Funktionsnamen in der Liste "Funktionsname" auszuwählen. FT_CreateDeviceInfoList Sie FT_CreateDeviceInfoList und rufen Sie die Konvention auf stdcall (WINAPI) . Zweitens müssen Sie auf der Registerkarte "Parameter" eine Liste von Funktionsparametern eingeben, wobei das erste Element der Liste der Rückgabewert ist. Hier wäre es schön, die Dokumentation für die API oder die Header-Datei zu beachten. Beim Einstellen von Parametern im Bereich "Funktionsprototyp" wird der Prototyp der importierten Funktion angezeigt. Wenn die Signatur aus der Dokumentation mit dem konfigurierten Prototyp übereinstimmt, klicken Sie auf OK.


Angenommen, das Scannen sollte einmal pro Sekunde durchgeführt werden. Wir platzieren den Aufrufknoten in der Struktur des Ereignishandlers auf der Registerkarte "Timeout" und setzen die Wartezeit auf 1000 ms. Wir fügen Indikatoren zu den Knotenpins hinzu. Wenn alles korrekt ausgeführt wurde, sollte beim Starten des VIs die Anzahl der mit FTDI verbundenen Geräte angezeigt werden:


Frontplatte und Blockschaltbild


Klickbares Bild



Erstellen Sie auf ähnliche Weise einen Knoten für die Funktion FT_GetDeviceInfoDetail . Der Prototyp der Funktion ist:


 FTD2XX_API FT_STATUS WINAPI FT_GetDeviceInfoDetail( DWORD dwIndex, LPDWORD lpdwFlags, LPDWORD lpdwType, LPDWORD lpdwID, LPDWORD lpdwLocId, LPVOID lpSerialNumber, LPVOID lpDescription, FT_HAN 

Bei der Beschreibung der Parameter ist zu beachten, dass lpdwFlags , lpdwType , lpdwID , lpdwLocId als Zeiger auf uint32 . Die Parameter lpSerialNumber und lpDescription sind die Essenz von Byte-Strings ( char Arrays mit einem Null-Terminator). Parameter dieser Art im Aufrufknoten können auf verschiedene Arten formatiert werden. Sie können sie in ein Array von 8-Bit-Wörtern eingeben. Ich halte es jedoch für am bequemsten, sofort anzuzeigen, dass es sich um eine Zeichenfolge handelt, und die erwartete Größe festzulegen. In diesem Fall ist die Ausgabe sofort eine gültige „Labyrinth“ -Linie und es sind keine zusätzlichen Transformationen erforderlich.



Bibliotheksfunktion aufrufen


Diese Funktion gibt Informationen über die dwIndex Seriennummer zurück. Wenn mehrere FTDIs an den Computer angeschlossen sind, muss die Funktion in einer Schleife aufgerufen werden, um die Informationen für jeden Konverter zu lesen. Die Anzahl der Iterationen der Schleife wird uns von der vorherigen Funktion FT_CreateDeviceInfoList .


Frontplatte und Blockschaltbild


Klickbares Bild



Es gibt eine unangenehme Eigenschaft: Alle Ports des Anrufknotens müssen mindestens einseitig verbunden sein. Daher wird in der Schleife ein Tunnel für die Ausgangsanschlüsse erstellt, die wir nicht verwenden werden.


Types Typ-Array enthält FTDI-Chip-Typen. Wir benötigen sie, um die Auswahl auf diejenigen zu beschränken, die MPSSE unterstützen und möglicherweise für die FPGA-Programmierung verwendet werden können. Das Arbeiten mit "magischen Zahlen" ist jedoch unpraktisch - ich schlage vor, FTDI-Typen in Form von enum anzuordnen. Darüber hinaus befindet sich eine solche enum bereits in der Header-Datei ftd2xx.h. In LabVIEW können Sie zwei Steuerelemente verwenden, um eine Aufzählung zu erstellen: den Textring und die Aufzählung selbst. Beide enthalten Listen von Zeichenfolgen mit numerischen Werten, zwischen denen Sie wechseln können. Der Hauptunterschied besteht darin, dass "Aufzählung" erfordert, dass die numerischen Werte ganzzahlige fortlaufende Zahlen sind, während der "Textring" mehr Freiheit bietet - Sie können beliebige Werte angeben.


Aufzählung. Schöpfung

Wir geben die Werte manuell ein, es ist schade, dass es keine Funktion zum Importieren von enum aus C gibt



Auf der Vorderseite sieht diese Anzeige so aus



Auswählen eines Wertes durch Klicken mit der linken Maustaste


Um alle zukünftigen Instanzen der erstellten Liste zu verknüpfen und zu synchronisieren, ist es zweckmäßig, "Make Type Def" zu verwenden. (Auswahl über das Item-Kontextmenü). Als Ergebnis wird ein benutzerdefinierter Datentyp erstellt. Der neue Typ wird in einer separaten Datei mit der Erweiterung * .ctl abgelegt. Durch Bearbeiten dieser Datei werden alle Instanzen dieses Elements geändert. Ich denke, es lohnt sich nicht zu erklären, wie bequem dies sein kann. Der Zugriff auf die Definitionsdatei kann über das Kontextmenü der Instanz erfolgen, indem Sie "Open Type Def" auswählen. Im selben Menü sollten Sie die Elemente "Auto-Update from Type Def" beachten. und "Vom Typ Def trennen".


Wir ändern den FTDI Type Indikator in ein Array von Indikatoren vom FTDI Type Als Ergebnis wird beim FTDI Type des FTDI Type der Typ des angeschlossenen Konverters angezeigt:



Drei Geräte gefunden


Es ist leicht zu bemerken, dass die Funktionalität des resultierenden Codes im Fall "Timeout" vollständig ist, daher kann er in eine separate SubVI verschoben werden. Wählen Sie die Elemente aus, die auf das Subgerät übertragen werden sollen, und wählen Sie im Hauptmenü Bearbeiten die Option "SubVI erstellen".


Blockdiagramm mit erstelltem Unterinstrument

Alle Indikatoren blieben erhalten, und anstelle der Anrufknoten wurde ein neues VI mit einem Standardsymbol gebildet.

Klickbares Bild


Durch Doppelklicken auf das neue SubVI wird das Bearbeitungsfenster geöffnet. Zunächst speichern wir es und geben einen aussagekräftigen Namen, zum Beispiel "FT_GetDeviceInfo". Richten Sie E / A-Terminals ein. Verwenden Sie dazu den Connector-Bereich:



Das Bedienfeld besteht aus einer Reihe von Anschlüssen, die den Bedienelementen und Anzeigen VI entsprechen.


Wenn Sie auf dem Anschlussfeld ein Terminal auswählen, wird das entsprechende Element auf dem Bedienfeld hervorgehoben. Wenn Sie ein leeres Terminal auswählen und dann auf ein Element auf der Vorderseite klicken, wird das Element an das Terminal angehängt, sollte jedoch zuvor keinem anderen Terminal zugewiesen werden. Im Kontextmenü können Sie die Klemmen einzeln oder für alle gleichzeitig von den Elementen trennen, Sie können das Muster des Panels als Ganzes ändern.


Mir gefällt nicht, wie die Terminals beim Erstellen des aktuellen SubVI zugewiesen wurden, daher wähle ich "Alle Terminals trennen" und markiere es manuell. Ich empfehle, die Eingangsanschlüsse links und den Ausgang rechts zu platzieren. Der optionale Eingang kann oben und der optionale Ausgang unten platziert werden. Dies gewährleistet eine gute Lesbarkeit des Codes und eine gute visuelle Reihenfolge im Blockdiagramm.


Um Fehler zu kontrollieren, erstellen Sie zwei zusätzliche Elemente: Error in und Error out . Das Thema der Fehlerkontrolle von LabVIEW ist sehr umfangreich und geht über den Rahmen dieses Artikels hinaus. Daher beschränken wir uns auf ein Minimum an Erklärungen und halten uns an das "Do as I" -Prinzip. Wir erstellen also zwei Terminals für Fehler - Eingabe und Ausgabe.


Es ist bequem, sie über das Kontextmenü zu erstellen

Klicken Sie mit der rechten Maustaste auf das Fehlerterminal eines beliebigen Knotens:



In LabVIEW ist es üblich, den Eingangsanschluss des Fehlers unten links im Anschlussfeld und den Ausgangsanschluss unten rechts zu platzieren.


Es ist bequemer, die Ausgabe in einer Struktur zu kombinieren. Für die Ausgabe werden zwei Arrays erstellt: Das erste Array enthält alle gefundenen FTDI-Geräte, das zweite Array enthält nur diejenigen, die MPSSE können und theoretisch zur Konfiguration von FPGAs verwendet werden können.


Der letzte Schliff beim Erstellen eines Subinstruments ist das Konfigurieren des Symbols. Durch Doppelklicken auf das Symbol in der oberen rechten Ecke des Fensters wird der Editor gestartet. Wir versuchen, ein aussagekräftiges Bild zu erstellen, mit dem wir den Zweck des Geräts im Blockdiagramm eindeutig interpretieren können.


FT_GetDeviceInfo.vi

Frontplatte



Blockdiagramm


Und so sieht der Fall „Timeout“ aus, nachdem die Dinge in Ordnung gebracht wurden:

Klickbares Bild


Bis zu diesem Zeitpunkt war die Dropdown-Liste mit dem Namen "Gerät auswählen" leer, jetzt haben wir die Daten, um sie zu füllen. Wir erstellen einen Eigenschaftsknoten für die Liste mit der Eigenschaft "Strings []" (Kontextmenü -> Erstellen -> Eigenschaftsknoten -> Strings []). Jede Eigenschaft ist beschreibbar und lesbar. Der aktuelle Modus wird im Kontextmenü des Eigenschaftsknotens ausgewählt. Beim Erstellen eines Knotens werden die Eigenschaften standardmäßig zum Lesen konfiguriert. Zum Schreiben ändern: "Zum Schreiben ändern".


Wählen Sie aus dem Array von Strukturen das Array mit der Beschreibung aus und geben Sie es an Strings[] . Sie können ein Array mithilfe der For Loop auswählen.


Nachdem Sie das VI gestartet haben und die linke Taste am Element "Gerät auswählen" gedrückt haben, können Sie das Gerät für die Konfiguration angeben. In diesem Fall wird die Liste der Geräte zweimal pro Sekunde aktualisiert. Natürlich wäre es möglich, die Eigenschaft nur zu aktualisieren, wenn die Liste aktualisiert wurde, aber bisher führt dies zu einer unnötigen Unordnung des Blockdiagramms.


Was ist passiert?

Frontplatte



Klickbares Bild


Früher habe ich vergessen, eine so interessante Funktion zu erwähnen: Die For-Schleife muss die Anzahl der Iterationen nicht explizit angeben. Es reicht aus, einen Eingabetunnel des Arrays zu erstellen, und die Schleife wird für jedes Element ausgeführt. Dieses Verhalten ähnelt der foreach in C ++ 11. Sie müssen jedoch vorsichtig sein, wenn mehr als ein Array am Schleifeneingang ankommt.


Fügen Sie in der Ereignisstruktur einen Handler zum Drücken der Schaltfläche "Programm" hinzu. Wir haben zwar kein VI, das für das Laden der Datei in das FPGA verantwortlich ist, aber wir werden ein Subgerät "stub" machen. Angenommen, es wird der Pfad zur Konfigurationsdatei und zum FTDI-Deskriptor als Eingabe verwendet und gemäß den Ergebnissen der Operation wird der Firmware-Status zurückgegeben: erfolgreich oder nicht. Und um es interessanter zu machen, die Programmoberfläche zu testen, werden wir diesen Status zufällig machen.


Stub FT_MPSSE_SP_FPGA.vi

Frontplatte



Blockdiagramm


Wir werden den FTDI-Deskriptor über die Eigenschaft list (Kontextmenü -> Erstellen -> Eigenschaftsknoten -> Ringtext -> Text) an die Stub-Eingabe übergeben. Um den Dateipfad zum Element "Dateipfad" zu übertragen, erstellen Sie eine lokale Variable (Kontextmenü -> Erstellen -> Lokal Variable) und setzen Sie es auf read (Change To Read). Und verbinden Sie den Statusausgang direkt mit der Status . Die Schaltfläche Programm wird in die Ereignisbehandlungsroutine gezogen. Es wird empfohlen, Elemente, für die das Ereignis konfiguriert ist, in Handlern zu platzieren. Wenn Sie jetzt auf dieses Element im Bedienfeld doppelklicken, wird nicht nur das entsprechende Element im Blockdiagramm angezeigt, sondern auch der diesem Element zugeordnete Ereignishandler.


Durch Drücken der Taste "Programm" wird die Anzeige entweder grün (Erfolg) oder dunkelgrün (nicht Erfolg). Nicht zu klar. Ändern Sie in den Indikatoreigenschaften die Farbe "Aus" in Rot. So ist es besser. Wenn die Anzeige grün ist, können wir sagen, dass das FPGA auf dem ausgewählten Gerät durch eine Datei konfiguriert wird, deren Pfad im Fenster angezeigt wird:



Frontplatte


Diese Aussage wird jedoch falsch, wenn wir die Datei geändert oder ein anderes Gerät ausgewählt haben. Gleichzeitig können wir den Indikator nicht rot färben, da kein Programmierfehler aufgetreten ist. Im Falle einer Datei- oder Geräteänderung ist es zweckmäßig zu betonen, dass der Indikatorwert nicht relevant ist - verdunkeln Sie ihn. Hierzu können Sie die Indikator-Eigenschaft Disabled verwenden. Diese Eigenschaft kann drei Werte annehmen. Enabled - Bei normaler Anzeige kann der Benutzer das Objekt steuern. Disabled - Das Objekt wird wie gewohnt auf der Vorderseite angezeigt, der Benutzer kann das Objekt jedoch nicht steuern. Disabled and Grayed Out - Das Objekt wird auf der Vorderseite dunkel angezeigt, und der Benutzer kann das Objekt nicht steuern.


Wir erstellen Ereignishandler für die Devices list und den File Path , verdunkeln in ihnen die Statusanzeige und weisen im Handler der Eigenschaft Enabled Schaltfläche "Programm" zu.


Was ist passiert?


"Programm" -Handler: Wertänderung.



Gerätelisten-Handler: Wertänderung



So sieht die abgedunkelte Anzeige aus


Machen wir die Suche nach der Konfigurationsdatei für den Benutzer bequem - wir konfigurieren das Dateiansichtsfenster. Gehen Sie zu den Eigenschaften des File Path Elements, geben Sie auf der Registerkarte "Optionen durchsuchen" die Eingabeaufforderung "Musterbezeichnung" ein, geben Sie den Dateitypfilter (Muster) und den Namen für die Schaltfläche (Schaltflächentext) an.


Dateiauswahlfenster

Es werden nur rbf-Dateien angezeigt



Das Erstellen einer Benutzeroberfläche kann als abgeschlossen betrachtet werden.



Bootloader ausführen


Was hast du heute getroffen?


In diesem Artikel habe ich als Beispiel für die Erstellung einer funktional vollständigen Anwendung mit einer minimalistischen Oberfläche versucht, verschiedene Ansätze für die Arbeit in LabVIEW aufzuzeigen.


Infolgedessen haben wir folgende Punkte angesprochen:


  • Festlegen der Eigenschaften der virtuellen Appliance. .
  • : .
  • .
  • .
  • dll.
  • .

API FTD2XX MPSSE. .


Verwandte Materialien


  1. USB FTDI MPSSE
  2. labview_mpsse . .
  3. .
  4. Software Application Development D2XX Programmer's Guide . API D2XX.

Source: https://habr.com/ru/post/de427529/


All Articles