Forum: FPGA, VHDL & Co. Einlesen Zeile i, Spalte j mittels Read_File() (VHDL)


von Einsteiger (Gast)


Lesenswert?

Guten Tag.

Ich möchte einen Datensatz aus einer Textdatei einlesen. Dazu habe ich 
mich am folgendem Beispiel orientiert: 
http://www.stefanvhdl.com/vhdl/html/file_read.html. Funktioniert gut. 
Nun meine Frage: Ich habe eine Textdatei, welche n Zeilen und m Spalten 
enthält. Wie lese ich den Wert der i-ten Zeile und j-ten Spalte ein? Das 
Beispiel lässt (so sehe ich das) nur das Einlesen einer ganzen Zeile zu. 
Danke euch.

von Duke Scarring (Gast)


Lesenswert?

Einsteiger schrieb:
> Wie lese ich den Wert der i-ten Zeile und j-ten Spalte ein? Das
> Beispiel lässt (so sehe ich das) nur das Einlesen einer ganzen Zeile zu.
File-IO und Zeichenkettenverarbeitung ist ja (leider) nicht so die große 
Stärke von VHDL.
Ich würde die Zeile(i) am Stück einlesen und dort das Zeichen an der 
gwünschten Position(j) suchen.

Duke

von Einsteiger (Gast)


Lesenswert?

Danke dir Duke. Mein File sieht z.B. wie folgt aus:

01011    01000
00010    00011

Die Spalten werden durch ein Tab (ht) getrennt. Wie sehe dein Vorschlag 
umgesetzt aus (für das Element 2te Zeile 2te Spalte)?  Ich meine den 
Teil des "Zeichen(s) an der gwünschten Position(j) suchen."

von Sigi (Gast)


Lesenswert?

FileIO liest eine ganze Zeile in einen String,
von dem kann dann elementeweise in Integer etc.
umgewandelt werden, wie z.B.:

process
  ...
  file     textfile : text;
  variable numbers  : line;
  variable number1  : integer;
  variable number2  : integer;
  ...
begin
  ...
  readline(textfile,numbers);
  ...
  read(numbers,number1);
  read(numbers,number2);
  ...
end process;

"number1" und "number2" enthalten dann die
entspr. Werte. "read" konsumiert sozusagen
die Werte, d.h. kürzt den String "numbers"
bei jedem Zugriff.

von Einsteiger (Gast)


Lesenswert?

Danke Sigi. Eine Spalte funktioniert. Mehrere nicht. Das Format sieht 
wie folgt aus:

string_spalte_1 Leerzeichen string_spalte_2

Habe es wie folgt versucht:
1
begin
2
3
receive_data: process
4
5
variable l  : line;
6
variable s_1: string(1 to word_width);
7
variable s_2: string(word_width+2 to 2*word_width+2); 
8
   
9
begin                                       
10
11
   EOG <= '0';
12
   wait until RST='1';
13
   wait until RST='0';
14
15
   while not endfile(stimulus) loop
16
17
     readline(stimulus, l);
18
    read(l, s_1);
19
    read(l, s_2);
20
    
21
     Y_1 <= to_std_logic_vector(s_1);
22
     Y_2 <= to_std_logic_vector(s_2);
23
    
24
     wait until CLK = '1';
25
26
   end loop;
27
   
28
   print("I@FILE_READ: reached end of "& stim_file);
29
   EOG <= '1';
30
   wait;
31
 end process receive_data;

----------------------------------------------------------------
Mod: bitte in Zukunft die VHDL-Tokens verwenden:
1
[vhdl]
2
  VHDL Code
3
[/vhdl]

: Bearbeitet durch Moderator
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.