mikrocontroller.net

Forum: FPGA, VHDL & Co. Textanalyse mit VHDL?!


Autor: Daniel S. (uc4life)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich muss aus einer Textdatei Werte auslesen, die ich anschließend in 
einem VHDL Projekt Signalen zuweise. Soweit kein Problem.

Jetzt sollen aber in unregelmäßigen Abständen in der Textdatei andere 
Signalzuweisungen stehen. Diese würde ich gerne mit irgendeinem Zeichen 
(im folgenden Beispiel eine #) am Anfang einer Zeile kenntlich machen. 
Gibt es in VHDL die Möglichkeit, ähnlich wie bei "Regular Expression" zb 
unter Perl, eine Zeile zu analysieren?

Die Textdatei sieht etwa wie folgt aus:
0 1 0 1 1 1
1 0 1 1 0 0
0 1 1 0 1 1
# 20
0 1 1 1 0 0
# 10
0 1 1 0 1 0
Und hier ein Ausschnitt aus meinem bestehenden Programm:
     while not (endfile(IN_DATA)) loop
           readline(IN_DATA,LINE);
           read (LINE, SATZ); 
           stimuli <= SATZ;
           wait for 100 us;
     end loop;
das Signal stimuli ist ein Vektor...

Meine Idee war, dass ich gucke, ob am Anfang einer Zeile eine # steht 
und dieses in einer IF-Schleife abfrage. Also sollte es nachher etwa so 
aussehen.
     while not (endfile(IN_DATA)) loop
           readline(IN_DATA,LINE);
--     if LINE .... " wenn die Zeile mit einer Raute anfängt soll der folgende Wert dem Signal "neuerWert zugewiesen werden"
--         read ( LINE, SATZZWEI);
--         neuerWert <= SATZZWEI;
       else            
           read (LINE, SATZ); 
           stimuli <= SATZ;
           wait for 100 us;
       endif;
     end loop;
Ist sowas überhaupt in VHDL möglich?? Oder hat jemand eine 
andere/bessere Idee?
Vielen Dank für die Mühe im Vorraus

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, sowas geht. Mach doch Deine Textdatei ungefähr so:
S 0 1 0 1 1 1
S 1 0 1 1 0 0
S 0 1 1 0 1 1
# 20
S 0 1 1 1 0 0
# 10
S 0 1 1 0 1 0

Damit wird das Auswerten etwas einfacher:
-- untested
     variable marker: char;
...
...
     while not (endfile(IN_DATA)) loop

           readline(IN_DATA,LINE);
           read(LINE, marker);
    
           case marker is
             when 'S' =>
               read (LINE, SATZ);
               stimuli <= SATZ;
             when '#' =>
               -- process comment
             when others =>
               null;
           end case; 

           wait for 100 us;
     end loop;


Rick

Autor: Matthias G. (mgottke)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mir dazu sogar mal eine Art Befehlsinterpreter geschrieben. 
Dazu habe ich mir folgende Restriktionen auferlegt: Jede Zeile muss mit 
einem Befehl beginnen. Im obigen Beispiel wäre das "#" oder "S". Es 
können aber Leerzeilen und Kommentare enthalten sein. Kommentare 
beginnend mit "--". Weiterhin können auch Makros geschrieben werden. 
Diese beginnen mit "macro" und dem Makronamen und Enden mit "endmacro". 
Mit "call" und Makroname können die dann aufgerufen werden.

Damit lässt sich wunderbare Testpattern schreiben. Vor allem wenn sich 
innerhalb der Testpattern ganze Passagen wiederholen, kann man dann 
problemlos diese mit den Makros aufrufen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.