Forum: FPGA, VHDL & Co. Probleme mit TextIO - line


von Jürgen P. (Gast)


Lesenswert?

Hallo zusammen,

ich habe leider gerade ein Problem in meiner Testbench, dort kann ich 
nicht wie gewünscht eine Text Line in eine andere kopieren.

Hintergrund: ich möchte gerne eine Text Datei parsen, daraus dann meine 
Befehle und Daten gewinnen und anschließend verarbeiten.

Die Textdatei ist wie folgt aufgebaut:
1
d 01 02 03
2
e 04 05 06 07 08 
3
p
4
d 09 0A 0B 0C
5
e 0C 0B 0A 
6
p
7
...

Hier ist ein Codebeispiel, wie ich die Daten verwenden will:
1
process
2
  variable vCommand : character;
3
  variable vLine    : line;
4
  variable vLine_D  : line;
5
  variable vLine_E  : line;
6
  variable vData_D  : std_logic_vector(7 downto 0);
7
  variable vData_E  : std_logic_vector(7 downto 0);
8
  variable vStatus_D: boolean;
9
  variable vStatus_E: boolean;
10
11
begin
12
  while vCommand != 'p' loop
13
    readline(File, vLine);
14
    read(vLine, vCommand);
15
    case vCommand is
16
     when 'd' =>    -- load data into line D
17
       vLine_D := vLine;
18
     when 'e' =>    -- load data into line E
19
       vLine_E := vLine;
20
     when 'p' =>    -- process data
21
       NULL;
22
    end case;
23
  end loop;
24
25
  read(vLine_D, vData_D, vStatus_D);
26
  read(vLine_E, vData_E, vStatus_E);
27
28
  while (vStatus_D = TRUE) or (vStatus_E = TRUE) loop
29
    -- process data...
30
    
31
    -- read next data
32
    read(vLine_D, vData_D, vStatus_D);
33
    read(vLine_E, vData_E, vStatus_E);
34
  end loop
35
36
end process;

Zunächst wird aus einer Datei die Zeile ausgelesen, dann das erste 
Zeichen als Kommando geparst. Je nach Kommando soll der Rest der Zeile 
dann in einen eigenen Speicher gelegt werden, um dann später verarbeitet 
zu werden.

Ich vermute, dass die Zuweisung "vLine_D := vLine" nicht funktioniert. 
Zumindest liefert mir das anschließende
read(vLine_D, vData_D, vStatus_D); immer den Status FALSE zurück...

Nach einiger Zeit kommt dann sogar noch folgender Fehler
# ** Fatal: (SIGSEGV) Bad handle or reference.
#    Time: 95720 ns  Iteration: 1  Process: <process>/line__72 File: 
<file>
# Fatal error in Process line__72 at <file> line 128

Die Line 128 bezieht sich auf das Read Command, allerdings erst wenn die 
Datei vollständig geparst wurde.

Habt ihr eine Idee, was hier der Fehler ist? Leider bin ich auch bei 
meinen Google Suchen nicht weitergekommen.

Vele Grüße,
Jürgen

von Jürgen P. (Gast)


Lesenswert?

Hallo zusammen,

nun bin ich doch fündig geworden.

unter http://paws.kettering.edu/~mcdonald/class/ce422/qhdl/8_TxtIO.pdf 
findet sich auf Seite 8-4:
1
-- Bad VHDL (because L1 and L2 both point to the same buffer):
2
READLINE (infile, L1); -- Read and allocate buffer
3
L2 := L1; -- Copy pointers
4
WRITELINE (outfile, L1);-- Deallocate buffer
5
6
-- Good VHDL (because L1 and L2 point to different buffers):
7
READLINE (infile, L1); -- Read and allocate buffer
8
L2 := new string'(L1.all);-- Copy contents
9
WRITELINE (outfile, L1);-- Deallocate buffer

bei den Lines handelt es sich also lediglich um Pointer, mit all den 
entsprechenden Vor- und Nachteilen...

Viele Grüße
Jürgen

von Duke Scarring (Gast)


Lesenswert?

Jürgen P. schrieb:
> bei den Lines handelt es sich also lediglich um Pointer, mit all den
> entsprechenden Vor- und Nachteilen...
Jepp. Stringverarbeitung macht im VHDL nicht wirklich Spaß. Leider.
Ich würde nur das nötigste im VHDL implementieren und die Steuerdateien 
von einer Hochsprache erzeugen lassen.

Duke

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Ich habe mal ein Hexfile in VHDL geladen.
Vielleicht hilft es dir weiter.
1
process (wr_en,clk)
2
--constant file_name: string:="test3.jpg";
3
constant file_name: string:="test.jpg";
4
file in_file: f_byte open read_mode is file_name;
5
 
6
--variable in_line,out_line: line;
7
variable good:boolean;
8
variable a:character;
9
 
10
begin 
11
--read(in_file,a);
12
--data_in<=a;
13
--wait until wr_en='1';
14
--wait for 6 ns;
15
--wr<='1';
16
 
17
--when not endfile(in_file) loop
18
if  wr_en='0' then 
19
  --wr<='0';
20
  elsif clk'event and clk='1' then
21
    if not endfile (in_file) then
22
      read(in_file,a);
23
    end if;
24
    data_in<=to_unsigned(character'pos(a),8);--very tricky the conversation
25
  --  wr<='1';
26
 
27
end if;
28
end process;

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

*.jpg
Darin ist doch nichts Hexadezimales.

Und letztlich wird hier auch nur der Binärwert eines Bytes zugewiesen...

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Lothar Miller schrieb:

> Und letztlich wird hier auch nur der Binärwert eines Bytes zugewiesen...


Ja Lothar du hast wieder Recht. Ich hatte mich falsch ausgedrückt.






Eine hilfreichte Unterstützung ist immer:


http://www.stefanvhdl.com/vhdl/vhdl/txt_util.vhd

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.