Hallo zusammen - ich habe folgendes Problem: ich sollte Dateien des Formates pgm in meine Test-Bench einlesen. Dabei sieht das Format folgendes vor: P2 3024 8000 65535 42475 37951 33138 29601 30202 29312 27748 25894 19164 17195 15368 15411 16074 16438 16752 16892 16850 16851 17046 17064 16672 16394 16321 16192 P2 gibt an das es sich um ein portable greymap handelt 3924 gibt die bildbreite an 8000 gibt die bildhöhe an 65535 gibt die pixeltiefe an: 16 bit die folgenden zahlen sind die bilddaten, die die graustufe in dezimalzahl angeben Das einlesen eines files kapier ich ja noch. Aber: wie kann ich in vhdl die ersten 3 zeilen einlesen, auswerten, und anschliessend die bilddaten einlesen? gibt es ne möglichkeit die zeilen zu zählen die man gelesen hat?
Schau mal hier rein: Beitrag "VHDL BMP-Testbench" Da sind zwar ein Paar Fehler drin, aber das Prinzip sollte klar sein. Grüße, Kest
Hallo Kest - Danke erst mal. Dennoch stehe ich mächtig auf dem Schlauch. Ich weiss praktisch nicht wo und mit was ich anfangen soll. Irgendwelche Ratschläge?
Du liest einfach die erste Zeile, wertest sie aus. Dann liest Du die anderen und wertest sie auch sofort aus. Dann weist Du ja, wie lange Du lesen musst -- also entweder mit einem Zähler oder solange Du nicht am Ende der Datei angekommen bist. Als erstes würde ich eine Funktion schreiben, um eine Zeile in 5er Grupper zu unterteilen und dise dann nach Hex/Dec oder wie auch immer zu wandeln. Und dann ist es nur Fleißarbeit ;-) Grüße, Kest
Hallo Kest - genau das ist mein Problem: ich habe bereits eine Funktion, die pattern im Format 00000000000011000000000000111111 einliest.. Wie kann ich Leerzeichen zwischen den Dezimalzahlen "filtern" ?
Ich finde nirgends ein Beispiel, Tutorial, etc. wie man ein solches File: P2 3024 8000 65535 42475 37951 33138 29601 30202 29312 27748 25894 19164 17195 15368 15411 16074 16438 16752 16892 16850 16851 0 17064 0 16394 16321 16192 Zeile für Zeile einliest, geschweige denn die 8 5-stelligen Dezimalzahlen ausliest. Wäre über Hilfestellung sehr dankbar. Grüße, Rainer
>Ich finde nirgends ein Beispiel Wo hast du denn gesucht ? Im Garten ? Google is your friend: reading files VHDL Grüsse, Stefan
Hallo - hier mein erster Ansatz.. Allerdings: wenn es mal mehr als 8 5-stellige Dezimalzahlen sind.. könnte man das "test1 - test8" mit einer Schleife machen? Wie setzt man da dann die Schleifenindikatoren?
1 | i := 0; |
2 | while not endfile(pgmfile) loop |
3 | if i = 0 then |
4 | readline(pgmfile, zeile); |
5 | read(zeile, indicator); |
6 | elsif i = 1 then |
7 | readline(pgmfile, zeile); |
8 | read(zeile, picw); |
9 | read(zeile, pixh); |
10 | elsif i = 2 then |
11 | readline(pgmfile, zeile); |
12 | read(zeile, pixd); |
13 | else
|
14 | readline(pgmfile, zeile); |
15 | read(zeile, test1); |
16 | read(zeile, test2); |
17 | read(zeile, test3); |
18 | read(zeile, test4); |
19 | read(zeile, test5); |
20 | read(zeile, test6); |
21 | read(zeile, test7); |
22 | read(zeile, test8); |
23 | end if; |
24 | i := i + 1; |
25 | end loop; |
so oder so änlich
1 | read(L, column, readGood); |
2 | assert readGood report "Could not read column size" severity failure; |
3 | read(L, row, readGood); |
4 | assert readGood report "Could not read row size" severity failure; |
5 | |
6 | readline(read_file, L); |
7 | --max gray value
|
8 | |
9 | |
10 | report "Read Image"; |
11 | |
12 | for Z in 0 to row-1 loop |
13 | --report "Column" & integer'image(Z-1);
|
14 | |
15 | for S in 0 to column-1 loop |
16 | |
17 | read(L, tmp3, readGood); |
18 | assert readGood report "Could not read row size" severity error; |
19 | |
20 | image(Z)(S) := std_logic_vector(to_unsigned(tmp3, 16)); |
21 | |
22 | |
23 | end loop; |
24 | if(Z /= row-1) then -- read not new line at last line |
25 | readline(read_file, L); |
26 | end if; |
27 | end loop; |
28 | |
29 | assert endfile(read_file) report "read not all contend"; |
Hallo 123 - Danke, hört sich gut an! Wie sind denn L, column, row, readGood, tmp3 etc. deklariert? Grüße, Rainer
Hallo 123 - vor allem macht mich das image fertig: ich habe keine numeric zur Verfügung. So habe ich das image wie folgt deklariert:
1 | type mem_array is array(0 to 8000) of unsigned(15 downto 0); |
2 | ..
|
3 | variable image : mem_array; |
4 | variable tmp3: integer; |
5 | |
6 | ..
|
7 | |
8 | image(Z)(S) := conv_std_logic_vector(tmp3,16); |
Bekomme dann immer die Fehlermeldung: Target type ieee.std_logic_1164.std_ulogic in variable assignment is different from expression type ieee.std_logic_1164.std_logic_vector. Ich komme mit den casts etc. einfach nicht klar!!
Hallo zusammen - folgende Prozedur funktioniert bis zur Ausgabe der Daten am Ende.. Da wird KEIN einziger Wert von DVLIN oder DATAIN übernommen.. Kann mir da Jemand weiterhelfen? Grüße, Rainer
1 | procedure rwstimuli(FileNameIn : in string; |
2 | signal RESETN : in std_logic; |
3 | signal CLK : in std_logic; |
4 | signal DVLIN : inout std_logic; |
5 | signal DATAIN : inout std_logic_vector(15 downto 0) |
6 | ) is |
7 | |
8 | file pgmfile : text open read_mode is FileNameIn; |
9 | |
10 | variable readGood : boolean := true; |
11 | variable indicator : character; |
12 | variable column : natural; |
13 | variable row : natural; |
14 | variable pixd : natural; |
15 | variable tmp3 : natural; |
16 | variable Z, S : natural; |
17 | variable L : line; |
18 | variable image : mem_array; |
19 | variable next_pixel : std_logic_vector(15 downto 0); |
20 | |
21 | begin
|
22 | |
23 | readline(pgmfile, L); |
24 | read(L, indicator, readGood); |
25 | assert readGood report "Could not read File Indicator" severity failure; |
26 | |
27 | readline(pgmfile, L); |
28 | read(L, column, readGood); |
29 | assert readGood report "Could not read column size" severity failure; |
30 | read(L, row, readGood); |
31 | assert readGood report "Could not read row size" severity failure; |
32 | |
33 | readline(pgmfile, L); |
34 | read(L, indicator, readGood); |
35 | assert readGood report "Could not read grey maximum value" severity failure; |
36 | |
37 | readline(pgmfile, L); |
38 | |
39 | report "Read Image"; |
40 | |
41 | for Z in 0 to row-1 loop |
42 | IF (NOT ENDFILE(pgmfile)) THEN |
43 | report "Row" & integer'image(Z+1); |
44 | |
45 | for S in 0 to column-1 loop |
46 | if (not endfile(pgmfile)) then |
47 | --report "Column" & integer'image(S+1);
|
48 | |
49 | read(L, tmp3, readGood); |
50 | |
51 | if readGood = false then |
52 | readline(pgmfile, L); |
53 | read(L, tmp3, readGood); |
54 | end if; |
55 | |
56 | image(Z)(S) := conv_std_logic_vector(tmp3, 16); |
57 | else
|
58 | exit; |
59 | end if; |
60 | end loop; |
61 | if readGood = false then |
62 | if(Z /= row-1) then |
63 | if (not endfile(pgmfile)) then |
64 | readline(pgmfile, L); |
65 | else
|
66 | exit; |
67 | end if; |
68 | end if; |
69 | end if; |
70 | else
|
71 | exit; |
72 | end if; |
73 | end loop; |
74 | |
75 | assert endfile(pgmfile) report "read not all contend"; |
76 | |
77 | if RESETN = '0' then |
78 | DATAIN <= (others => '0'); |
79 | DVLIN <= '0'; |
80 | end if; |
81 | for Z in 0 to row-1 loop |
82 | report "..stimulate DATAIN"; |
83 | for S in 0 to column-1 loop |
84 | if CLK = '1' and CLK'event then |
85 | next_pixel := image(Z)(S); |
86 | DATAIN <= next_pixel; |
87 | DVLIN <= not DVLIN; |
88 | end if; |
89 | end loop; |
90 | end loop; |
91 | |
92 | report "Okay"; |
93 | end rwstimuli; |
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.