Hallo, ich möchte den Ausgabewert einer FIFO zu bestimmten Zeitpunkten (bevor er gelesen wird) in eine Textdatei schreiben. Der Code sieht folgendermaßen aus: monitoring : process (clk) file OUT_DAT : text open write_mode is "output.txt"; variable LO: line; begin if(clk'event and clk = '1') then if(fifo_empty = '0') then fifo_read <= '1'; --write output to file file_open(OUT_DAT, "output.txt", write_mode); write (LO,fifo_out); writeline (OUT_DAT, LO); file_close(OUT_DAT); else fifo_read <= '0'; end if; end if; end process; output.txt wird zwar erstellt, aber nichts reingeschrieben. file_open und file_close habe ich nur mit reingenommen, weil es nicht funktioniert. Geändert hat sich allerdings nichts :-( Hat jemand einen heißen Tipp?
rein gefühlsmässig muss da noch ein wait rein, bis die Datan geschrieben sind und beim Hauptprozess einer, damit sichergestellt wird, dass gespeichert wird, bevor die Simu "weiterarbeitet".
Nach
1 | fifo_read <= '1'; |
stehen die Daten vom FIFO natürlich erst im nächsten Takt zur Verfügung. Also etwa so:
1 | if(clk'event and clk = '1') then |
2 | if(fifo_empty = '0') then |
3 | fifo_read <= '1'; |
4 | else
|
5 | fifo_read <= '0'; |
6 | end if; |
7 | if(fifo_read = '1') then |
8 | --write output to file
|
9 | --file_open(OUT_DAT, "output.txt", write_mode);
|
10 | write (LO,fifo_out); |
11 | writeline (OUT_DAT, LO); |
12 | --file_close(OUT_DAT);
|
13 | end if; |
14 | end if |
Lattice User schrieb: > stehen die Daten vom FIFO natürlich erst im nächsten Takt zur Verfügung. Eventuell braucht es auch 2 Takte oder mehr, hängt von der FIFO Konfiguration ab.
Danke für die schnellen Antworten :-) @Expert Wie genau würde das aussehen? Ich habe noch einen Hauptprozess in dem die Stimuli stehen, da gibts auch am Ende ein wait (nach den vielen "wait for x ns" um die verschiedenen Stimuli zu triggern). Aber wie kann ich in diesen "Dummy"-Prozess der nur dafür da ist, damit die Fifo geleert wird (wäre im richtigen Design ein externer Pin), ein wait einbauen (sorry, habe noch nicht viel mit TBs gemacht)? Genauso weiß ich nicht, wie ich im Hauptprozess der die File-Objekte nicht kennt (oder doch?), das Ganze abfragen soll. @Lattice User Das Problem ist nicht, dass die falschen Daten geschrieben werden, sondern dass gar nichts in die Datei geschrieben wird. Von der Logik her möchte ich es genau so: den aktuellen Wert lesen (bzw. schreiben), bevor durch das Read mit der entsprechenden Verzögerung neue Daten am Ausgang der Fifo anliegen.
:
Bearbeitet durch User
Ich bin jetzt nicht der VHDL Experte aber da kommt mir extrem merkwürdig vor.
1 | file OUT_DAT : text open write_mode is "output.txt"; |
write_mode sind normalerweise Dinge wie Anhängen oder Überschreiben.
Richard Bruchthal schrieb: > output.txt wird zwar erstellt, aber nichts reingeschrieben. Kommst du tatsächlich an die Stelle mit writeline()? Immer einen Blick wert: http://www.stefanvhdl.com/vhdl/html/file_write.html
Expert schrieb: > rein gefühlsmässig muss da noch ein wait rein, bis die Datan > geschrieben > sind und beim Hauptprozess einer, damit sichergestellt wird, dass > gespeichert wird, bevor die Simu "weiterarbeitet". Auch wenn da Expert steht, ist das kompletter Quatsch (mit oder ohne Soße).
Hallo nochmal, wie es so ist, sind die Sachen an denen man lange hängt, entweder wirklich tricky oder einfach nur blöde. Ich konnte es zwar noch nicht verifizieren, aber ich glaube mein Problem gehört zur zweiten Kategorie (die Idee ist mir ganz klassisch im Halbschlaf gekommen). Ich habe zunächst das Dateizeugs eingebaut und als es nicht ging, erstmal so weitergemacht. Später mich dann nochmal rangesetzt und nach längerem rumprobieren den Thread eröffnet. Jetzt glaube ich aber, dass bei meinem letzten Testcase, also der vor dem erneuten ransetzen, die entsprechende Fifo gar nicht gefüllt wird. Somit hätte Lothar also recht. Danke und sorry an alle :-/
Klaus Falser schrieb: > Expert schrieb: >> rein gefühlsmässig muss da noch ein wait rein, bis die Datan >> geschrieben >> sind und beim Hauptprozess einer, damit sichergestellt wird, dass >> gespeichert wird, bevor die Simu "weiterarbeitet". > > Auch wenn da Expert steht, ist das kompletter Quatsch (mit oder ohne > Soße). Der Typ trollt doch schon seit Wochen hier im Forum rum... Ich finds irgendwie lustig! Der kramt auch schon die ganze Zeit uralte Threads aus. Ich glaube sein Vorgehen durchschaut zu haben. Der googlet nach 1-2 Begriffen bzgl. des Themas und klatscht dann einfach Schlagwörter oder Kernsätze (zumindest, was er für wichtige Wörter und Sätze hält) so zusammen, das sie scheinbar nen Sinn ergeben!! Aber warum er hier weitermacht, versteh ich nicht. Du bist glaube ich der erste... ne sry mit dem TO, der zweite der jemals Bezug auf seinen Quatsch genommen hat. Ich glaub vor knapp nen Jahr war er schonmal da. Da hat er gleich mehrere "Experten" "miteinander" diskutieren lassen... das war irgendwie originell! Tja wenn man sonst nix zu tun hat in der Kaffeepause
Vielleicht ist das der gleich wie der "Weltbeste FPGA pongo" der hat auch immer mit gut getarntem Halbwissen um sich geworfen...
Ich habe einen schönen Prozess als Ausgangsvorlage für dich aus einer Testbench ausgeschnitten. Dieser Process schreibt die Datenpakete in ein Logfile. Das ist sicher genau was du suchst, bzw. einfach an dein FiFo Problem adaptierbar. Bei deinem Code, wird das File mit jeder Taktflanke erneut geöffnet.
1 | use std.textio.all; |
2 | |
3 | ....
|
4 | |
5 | process(PHY_TX_CLK) |
6 | file log : text open write_mode is "ether_tx.txt"; |
7 | variable trace_line : line; |
8 | variable PHY_TX_EN_D1 : std_logic :='0'; |
9 | variable counter : natural := 0; |
10 | |
11 | begin
|
12 | if rising_edge (PHY_TX_CLK) then |
13 | if PHY_TX_EN_D1='0' and PHY_TX_EN='1' then |
14 | write (log, string'(" new Frame ")); |
15 | counter:=0; |
16 | end if; |
17 | |
18 | if PHY_TX_EN = '1' then |
19 | |
20 | write (trace_line, hstr(PHY_TXD)); |
21 | end if; |
22 | |
23 | counter:=counter+1; |
24 | if counter=8 then |
25 | counter:=0; |
26 | writeline(log, trace_line); |
27 | end if; |
28 | |
29 | if PHY_TX_EN_D1='1' and PHY_TX_EN='0' then |
30 | writeline(log, trace_line); |
31 | end if; |
32 | |
33 | |
34 | PHY_TX_EN_D1:=PHY_TX_EN; |
35 | end if; |
36 | |
37 | |
38 | end process; |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.