Forum: FPGA, VHDL & Co. VHDL file seek


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


Lesenswert?

Ich habe eine Testbench die ein File öffnet und Daten aus dem File 
entnimmt. Das Läuft so weit. Jetzt will ich ein RESET integrieren und 
hier müsste das File wieder von Anfang an beginnen.
VHDL hat leider kein seek so weit ich weiss.
Hat jemand eine Idee wie so was gehen kann?

Ich poste meine aktuelle Lösung hier. Bin gespannt, ob es eine Lösung 
gibt.
1
signal clk          : std_logic := '0';
2
signal reset        : std_logic;
3
4
signal data_in       : std_logic_vector(7 downto 0);
5
signal rd_enable    : std_logic;
6
signal rd           : std_logic;
7
   -- Clock period definitions
8
   constant clk_period : time := 10 ns;
9
 
10
subtype by_te is character;
11
type f_byte is file of by_te;
12
13
BEGIN
14
--read a file
15
process 
16
constant file_name: string:="test.txt";
17
file in_file: f_byte open read_mode is file_name;
18
19
--variable in_line,out_line: line;
20
variable good:boolean;
21
variable a:character;
22
23
begin 
24
  if not endfile (in_file) then
25
    read(in_file,a);
26
    data_in<=std_logic_vector(to_unsigned(character'pos(a),8));--very tricky the conversation
27
    rd_enable<='1';
28
  else
29
    rd_enable<='0';
30
  end if;
31
  
32
  wait until rising_edge(CLK) and rd='1';  
33
end process;

von Valko Z. (hydravliska)


Lesenswert?

Hi

kannst du nicht das File "einfach" schliessen und wieder aufmachen?


Gruss

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


Lesenswert?

René D. schrieb:
> very tricky the conversation
Eine "schwierige Unterhaltung"?
Wenn dort statt "conversation" das Wort "conversion" steht, dann kommt 
auch ein Engländer damit klar...  ;-)

> Jetzt will ich ein RESET integrieren und hier müsste das File wieder von
> Anfang an beginnen.
Probiers mal mit file_close und file_open:
http://stackoverflow.com/questions/19184087/how-to-read-from-a-specific-line-from-a-text-file-in-vhdl
http://stackoverflow.com/questions/32267035/is-there-anyway-to-read-through-a-file-multiple-times-in-vhdl-using-std-textio

Eine mögliche Alternative:
dank des heutzutage in großen Mengen installierten Arbeitsspeichers lese 
ich einfach die komplette Datei in ein passendes Array und arbeite 
damit. Dann kann ich mit einem simplen Index auf das gewünschte Element 
zugreifen.

von Martin S. (strubi)


Lesenswert?

Moin,

so Kram kannst du mit GHDL über die VHPI-Schnittstelle erledigen. Ist 
dann halt nicht mehr portabel zwischen Simulatoren...
Die knifflige Frage ist, ob der Reset intern durch die HDL oder extern 
als "Global Reset" ausgelöst wird. Ich würde dazu tendieren, sowas 
extern zu machen und fürs primitive I/O Pipes zu benutzen. Mit named 
pipes kannst du ev. ohne VHPI auskommen, aber das ist dann wieder 
Posix-spezifisch.

Grüsse,

- Strubi

von Patrick Lehmann (Gast)


Lesenswert?

Hmmm,

also GHDL hat keine VHPI Schnittstelle; es ist eine VPI Schnittstelle 
(Verilog).

Wie schon angedeutet, sollte deine TB die Daten komplett einlesen und in 
ein passendes Array (konvertierte Daten) ablegen. Von diesem kannst du 
dann mehrfach lesen.


Viele Grüße
    Patrick Lehmann

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


Lesenswert?

VHPI ist eine Lösung für später.
Bin auf eine reine VHDL Lösung aus.

Jetzt ist die wie ich das mit dem öffnen und schließen richtig 
umschreibe.
Da ich das File  vor meiner begin Anweisung öffne.

von Duke Scarring (Gast)


Lesenswert?

René D. schrieb:
> Da ich das File  vor meiner begin Anweisung öffne.
Dann ändere das.

Hier wird die Datei erneut gelesen, wenn sie "alle" ist:
1
    read_stimulus : process
2
        file     stimuli      : text;
3
        variable status       : file_open_status;
4
        variable l            : line;
5
        variable value        : integer;
6
7
    begin
8
9
        file_open( status, stimuli, filename);
10
11
        if status = open_ok then
12
            while not endfile( stimuli) loop
13
                readline( stimuli, l);
14
                read( l, value);
15
                -- do something with value...
16
                wait until rising_edge( clk);
17
            end loop;
18
            file_close( stimuli);
19
        else
20
            report "could not read stimuli file (" & filename & ")!"
21
                severity warning;
22
            wait;
23
        end if;
24
25
    end process read_stimulus;

Duke

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


Lesenswert?

René D. schrieb:
> Jetzt ist die wie ich das mit dem öffnen und schließen richtig
> umschreibe.
> Da ich das File  vor meiner begin Anweisung öffne.
Ja, dann tu doch genau das nicht. Also eher etwa sowas:
1
process 
2
file in_file : f_byte;
3
4
--variable in_line,out_line: line;
5
variable good:boolean;
6
variable a:character;
7
8
begin
9
  file_open(in_file, "test.txt", read_mode);
10
11
  if not endfile (in_file) then
12
    read(in_file,a);
13
    data_in<=std_logic_vector(to_unsigned(character'pos(a),8));--very tricky the conversation
14
    rd_enable<='1';
15
  else
16
    rd_enable<='0';
17
  end if;
18
  
19
  file_close(in_file);
20
   
21
  wait until rising_edge(CLK) and rd='1';  
22
end process;

EDIT: Ich war auch kurz versucht, dem File den Typ text zu geben, habe 
aber dann die Handstände mit dem character gesehen und die Finger 
weggelassen... ;-)

: Bearbeitet durch Moderator
von Martin S. (strubi)


Lesenswert?

Patrick Lehmann schrieb:
> Hmmm,
>
> also GHDL hat keine VHPI Schnittstelle; es ist eine VPI Schnittstelle
> (Verilog).
>

Naja, sagen wir, es ist eine nicht ganz standardkonforme 
VHPI-Schnittstelle. Aber sie ist da :-)
Das VPI-Interface ist ja ein anderes Paar Stiefel.

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


Lesenswert?

Lothar M. schrieb:
> René D. schrieb:
>> Jetzt ist die wie ich das mit dem öffnen und schließen richtig
>> umschreibe.
>> Da ich das File  vor meiner begin Anweisung öffne.
> Ja, dann tu doch genau das nicht. Also eher etwa sowas:

wenn es so einfach wäre.

Ich musste die Zeile
1
use STD.textio.all;
einfügen

1
subtype by_te is character;
2
type f_byte is file of by_te;
3
4
BEGIN
5
  process
6
    constant file_name: string:="test.txt";
7
8
        variable l            : line;
9
        variable a            : character;
10
        file     stimuli      : f_byte;
11
        variable status       : file_open_status;
12
    begin
13
14
        file_open( status, stimuli, file_name);
15
16
        if reset='0'  then
17
            while not endfile( stimuli) loop
18
                readline( stimuli, l);
19
                read( l, a);
20
                  data_in<=std_logic_vector(to_unsigned(character'pos(a),8));--very tricky conversion
21
                wait until (rising_edge( clk) and rd='1') or (reset='1');
22
            end loop;
23
            file_close( stimuli);
24
        end if;
25
26
    end process ;

ghdl -a  --work=work --workdir=work Loopback.vhd
ghdl -a  --work=work --workdir=work tb_file.vhd
tb_file.vhd:83:27: can't associate 'stimuli' with file interface "f"
tb_file.vhd:83:27: (type of 'stimuli' is f_byte)
../../src/std/textio.v93:51:28: (type of file interface "f" is text)
ghdl: compilation error

Komme damit nicht durch.

: Bearbeitet durch User
von Duke Scarring (Gast)


Lesenswert?

René D. schrieb:
> Komme damit nicht durch.

Und was passiert, wenn Du den file type änderst?!:
1
    file     stimuli      : character;
2
    -- oder
3
    file     stimuli      : text;

Duke

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


Lesenswert?

René D. schrieb:
> tb_file.vhd:83:27: can't associate 'stimuli' with file interface "f"
Um diese Fehlermeldung zu verstehen, musst du den Prototypen von 
readline() anschauen:
1
procedure readline (file f: text; l: inout line);
Und jetzt wird klar, was mit dem Interface "f" gemeint ist: der Prototyp 
sagt, das zu erwartende file habe den Datentyp text. Du übergibst 
aber ein file vom Datentyp f_byte...

: 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.