Forum: FPGA, VHDL & Co. String in Textfile abspeichern


von PD (Gast)


Lesenswert?

Hallo zusammen,
zur Zeit setze ich ein Cyclone II von Altera ein.
Ich versuche einen String in eine Text-Datei abzuspeichern. Bislang aber 
ohne Erfolg. Vielleicht könnt ihr mir sagen, wo der Fehler ist.

Ersteinmal habe ich ein File definiert:
file text_handle : Text;

  process(CLK)
   variable initial : boolean := true; -- not initialized yet
   variable status : file_open_status; -- status for fopen
    begin
     if rising_edge(CLK) then  --erzeugt 1s Clock
  if initial = true then
   file_open (status, text_handle, "C:\Log.txt");
   initial := false;
      end if;
     end if;
  end process;

...

   process(CLK, nReset, CLKs, send_enable)
   variable status : file_open_status;
   variable data_string : LINE;

   begin
      if nReset = '0' then
         state <= idle ;
      elsif rising_edge(CLK) then
  write (data_string, string'("Test String"));
         test_signal <= test_signal + 1;

         if Tx_ready = '1' and test_signal = "00" then
          case state is
           when idle    =>
            if send_enable = '1' and CLKs = '1' then
      if input_buffer = (x"53" or x"73") then
              state <= send_h;

          writeline (text_handle, data_string);
          file_close (text_handle);
          ...
    end process;


Könnt Ihr mir bitte sagen, wo der Fehler ist?

Danke!

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


Lesenswert?

Probier mal:
1
   file_open (status, text_handle, "C:\Log.txt", WRITE_MODE);
Denn der Defaultwert ist READ_MODE:
1
procedure FILE_OPEN(File_Status: out FILE_OPEN_STATUS;
2
                    file file_handle:FILE_TYPE;
3
                    File_Name: in STRING;
4
                    Open_Kind: in FILE_OPEN_KIND:=READ_MODE);

BTW:
1
 if rising_edge(CLK) then  --erzeugt 1s Clock
2
    file_open (status, text_handle, "C:\Log.txt");
3
  :
4
  :
5
6
 elsif rising_edge(CLK) then
7
    write (data_string, string'("Test String"));
8
    :
9
    writeline (text_handle, data_string);
10
    file_close (text_handle);
11
:
Bist du sicher, dass die Datei offen ist, wenn du sie brauchst? Wieso 
machst du die Datei nicht einfach am Anfang einmal auf und am Schluss 
einmal zu?

von PD (Gast)


Lesenswert?

Hallo Lothar,
ich gehe davon aus, dass die Datei offen ist.
Die Änderungen habe ich kurz reinprogrammiert. Es passiert trotzdem 
nichts.

Kann es sein, dass dem Data_String ein Wert zugewiesen werden muss?

von Joachim (Gast)


Lesenswert?

Hallo

Ist die Datei wirklich offen, oder gehst du nur davon aus?
Wird die Datei denn angelegt?

Gruß
Joachim

von PD (Gast)


Lesenswert?

Hallo,
die Textdatei habe ich vorher erstellt.

Wie überprüfe ich, ob die Datei offen ist?
Kann ich das über VHDL abfragen?

Gruß.

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


Lesenswert?

PD schrieb:
> Kann es sein, dass dem Data_String ein Wert zugewiesen werden muss?
Tust du doch:
   write (data_string, string'("Test String"));

Das hier geht auf jden Fall:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.numeric_std.ALL;
4
5
use std.textio.all;
6
use ieee.std_logic_textio.all;
7
8
entity TextIOSimpel is
9
end TextIOSimpel;
10
11
architecture Behavioral of TextIOSimpel is
12
file text_file : Text;
13
begin
14
   tbx : PROCESS
15
   variable txt: line;
16
   BEGIN
17
      write(txt,string'("Hallo Welt ;-)"));
18
      file_open (text_file, "IO.txt", WRITE_MODE);
19
      writeline (text_file, txt);
20
      file_close(text_file);
21
22
      file_open (text_file, "IO.txt");
23
      readline  (text_file, txt);
24
      file_close(text_file);
25
    
26
      writeline (OUTPUT, txt); -- Ausgabe auf Console
27
      wait;
28
   END PROCESS;
29
end Behavioral;

Die Ausgabe in der Console ist:
1
# Loading std.standard
2
# Loading ieee.std_logic_1164(body)
3
# Loading ieee.numeric_std(body)
4
# Loading std.textio(body)
5
# Loading ieee.std_logic_textio(body)
6
# Loading work.textiosimpel(behavioral)
7
# Hallo Welt ;-)

von PD (Gast)


Lesenswert?

Danke Lothar.
Werde ich sofort ausprobieren.

Gruß PD

von PD (Gast)


Lesenswert?

Ich habe nun folgenden VHDL-Code ausprobiert:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;

use std.textio.all;
--use ieee.std_logic_textio.all;

entity Save is
port(
--    CLK         : in std_logic;  --50MHz
      Start       : in std_logic;  -- Start-Taster
      LED_out    : out std_logic
  );
end Save;

architecture test of Save is
  signal done : std_logic := '0';  -- flag set when simulation finished
begin  -- test of file_io
  write_file:
    process (Start) is    -- write (when done goes to '1')
      file my_output : TEXT open WRITE_MODE is "Output.txt";
      variable my_line : LINE;
      variable my_output_line : LINE;
    begin
  file_open (my_output, "Output.txt", Write_MODE);
    if start='1' then
        write(my_line, string'("writing file"));
        writeline(output, my_line);
        write(my_output_line, string'("output from Save.vhdl"));
        writeline(my_output, my_output_line);
    LED_out <= '1';
     else
        LED_out <= '0';
      end if;
    end process write_file;
end architecture test;

-----------------------------

Funktioniert aber leider noch nicht!
Hat jemand noch eine Idee?

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


Lesenswert?

>Funktioniert aber leider noch nicht!
Was tust du eigentlich?
Dir ist schon klar, dass das nur in der Simulation geht?
Wie simulierst du das? Und mit welchem Simulator?

Ich bekomme diesen Fehler:
1
# ** Error: (vsim-3341) Cannot open file "Output.txt"; it is already open.
2
#    Time: 0 ps  Iteration: 0  Instance: /tb_textiowirr/uut
3
# writing file
Welchen bekommst du?
Und warum schreibst du die Fehler nicht gleich in deinen Post mit rein?
Ursache:
1
  file my_output : TEXT open WRITE_MODE is "Output.txt";
2
  file_open (my_output, "Output.txt", Write_MODE);
Du darfst einen Datei nicht 2 mal öffnen :-/

Machs so, das geht mal vorerst...
1
    process (Start) is    -- write (when done goes to '1')
2
      file my_output : TEXT open WRITE_MODE is "Output.txt";  ---- nur 1 mal aufmachen
3
      variable my_line : LINE;
4
      variable my_output_line : LINE;
5
    begin
6
    if start='1' then
7
        write(my_line, string'("writing file"));
8
        writeline(output, my_line);
9
      
10
        write(my_output_line, string'("output from Save.vhdl"));
11
        writeline(my_output, my_output_line);
12
        LED_out <= '1';
13
     else
14
        LED_out <= '0';
15
      end if;
16
    end process write_file;

> Hat jemand noch eine Idee?
Du solltest den synthetisierbaren Teil (das mit dem Takt) von der 
Testbench trennen, so blickt da keiner durch...

von PD (Gast)


Lesenswert?

Lothar Miller schrieb:
> Wie simulierst du das? Und mit welchem Simulator?

Ich simuliere das mit ModelSim!

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


Lesenswert?

> Ich simuliere das mit ModelSim!
Lass doch mal deine Testbench sehen...

von PD (Gast)


Lesenswert?

Hallo Lothar,
jetzt funktioniert es. Hatte nur noch eine kleine Einstellung im 
Modelsim falsch.

Trotzdem Danke.
Gruß PD

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.