Textanalyse mit VHDL?!

#1710378
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
Gast #1713183
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
#1713251
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren