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


von Daniel S. (uc4life)


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:
1
     while not (endfile(IN_DATA)) loop
2
           readline(IN_DATA,LINE);
3
           read (LINE, SATZ); 
4
           stimuli <= SATZ;
5
           wait for 100 us;
6
     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.
1
     while not (endfile(IN_DATA)) loop
2
           readline(IN_DATA,LINE);
3
--     if LINE .... " wenn die Zeile mit einer Raute anfängt soll der folgende Wert dem Signal "neuerWert zugewiesen werden"
4
--         read ( LINE, SATZZWEI);
5
--         neuerWert <= SATZZWEI;
6
       else            
7
           read (LINE, SATZ); 
8
           stimuli <= SATZ;
9
           wait for 100 us;
10
       endif;
11
     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

von Rick Dangerus (Gast)


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:
1
-- untested
2
     variable marker: char;
3
...
4
...
5
     while not (endfile(IN_DATA)) loop
6
7
           readline(IN_DATA,LINE);
8
           read(LINE, marker);
9
    
10
           case marker is
11
             when 'S' =>
12
               read (LINE, SATZ);
13
               stimuli <= SATZ;
14
             when '#' =>
15
               -- process comment
16
             when others =>
17
               null;
18
           end case; 
19
20
           wait for 100 us;
21
     end loop;

Rick

von Matthias G. (mgottke)


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.

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.