Forum: FPGA, VHDL & Co. einlesen einer pgm Datei


von Rainer Zufall (Gast)


Lesenswert?

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?

von Kest (Gast)


Lesenswert?

Schau mal hier rein:

Beitrag "VHDL BMP-Testbench"

Da sind zwar ein Paar Fehler drin, aber das Prinzip sollte klar sein.

Grüße,
Kest

von Rainer Zufall (Gast)


Lesenswert?

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?

von Kest (Gast)


Lesenswert?

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

von Rainer Zufall (Gast)


Lesenswert?

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" ?

von Rainer Zufall (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

>Ich finde nirgends ein Beispiel
Wo hast du denn gesucht ? Im Garten ?

Google is your friend: reading files VHDL

Grüsse,
Stefan

von Rainer Zufall (Gast)


Lesenswert?

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;

von 123 (Gast)


Lesenswert?

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";

von Rainer Zufall (Gast)


Lesenswert?

Hallo 123 -

Danke, hört sich gut an!

Wie sind denn L, column, row, readGood, tmp3 etc. deklariert?

Grüße,
Rainer

von Rainer Zufall (Gast)


Lesenswert?

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!!

von Volker Racho (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.