mikrocontroller.net

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


Autor: PD (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

BTW:
 if rising_edge(CLK) then  --erzeugt 1s Clock
    file_open (status, text_handle, "C:\Log.txt");
  :
  :

 elsif rising_edge(CLK) then
    write (data_string, string'("Test String"));
    :
    writeline (text_handle, data_string);
    file_close (text_handle);
:
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?

Autor: PD (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Joachim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

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

Gruß
Joachim

Autor: PD (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
die Textdatei habe ich vorher erstellt.

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

Gruß.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;

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

entity TextIOSimpel is
end TextIOSimpel;

architecture Behavioral of TextIOSimpel is
file text_file : Text;
begin
   tbx : PROCESS
   variable txt: line;
   BEGIN
      write(txt,string'("Hallo Welt ;-)"));
      file_open (text_file, "IO.txt", WRITE_MODE);
      writeline (text_file, txt);
      file_close(text_file);

      file_open (text_file, "IO.txt");
      readline  (text_file, txt);
      file_close(text_file);
    
      writeline (OUTPUT, txt); -- Ausgabe auf Console
      wait;
   END PROCESS;
end Behavioral;

Die Ausgabe in der Console ist:
# Loading std.standard
# Loading ieee.std_logic_1164(body)
# Loading ieee.numeric_std(body)
# Loading std.textio(body)
# Loading ieee.std_logic_textio(body)
# Loading work.textiosimpel(behavioral)
# Hallo Welt ;-) 

Autor: PD (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Lothar.
Werde ich sofort ausprobieren.

Gruß PD

Autor: PD (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Machs so, das geht mal vorerst...
    process (Start) is    -- write (when done goes to '1')
      file my_output : TEXT open WRITE_MODE is "Output.txt";  ---- nur 1 mal aufmachen
      variable my_line : LINE;
      variable my_output_line : LINE;
    begin
    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;

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

Autor: PD (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Wie simulierst du das? Und mit welchem Simulator?

Ich simuliere das mit ModelSim!

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich simuliere das mit ModelSim!
Lass doch mal deine Testbench sehen...

Autor: PD (Gast)
Datum:

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

Trotzdem Danke.
Gruß PD

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.