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
signalclk:std_logic:='0';
2
signalreset:std_logic;
3
4
signaldata_in:std_logic_vector(7downto0);
5
signalrd_enable:std_logic;
6
signalrd:std_logic;
7
-- Clock period definitions
8
constantclk_period:time:=10ns;
9
10
subtypeby_teischaracter;
11
typef_byteisfileofby_te;
12
13
BEGIN
14
--read a file
15
process
16
constantfile_name:string:="test.txt";
17
filein_file:f_byteopenread_modeisfile_name;
18
19
--variable in_line,out_line: line;
20
variablegood:boolean;
21
variablea:character;
22
23
begin
24
ifnotendfile(in_file)then
25
read(in_file,a);
26
data_in<=std_logic_vector(to_unsigned(character'pos(a),8));--very tricky the conversation
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
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
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.
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
filein_file:f_byte;
3
4
--variable in_line,out_line: line;
5
variablegood:boolean;
6
variablea:character;
7
8
begin
9
file_open(in_file,"test.txt",read_mode);
10
11
ifnotendfile(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
endif;
18
19
file_close(in_file);
20
21
waituntilrising_edge(CLK)andrd='1';
22
endprocess;
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... ;-)
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.
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
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.
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
procedurereadline(filef:text;l:inoutline);
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...