Probleme mit TextIO - line

Gast #3130473
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
Gast #3130545
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
(Firma: www.dossmatik.de) #3132172
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;

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