www.mikrocontroller.net

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


Autor: Rainer Zufall (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Kest (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rainer Zufall (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Kest (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rainer Zufall (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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" ?

Autor: Rainer Zufall (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich finde nirgends ein Beispiel
Wo hast du denn gesucht ? Im Garten ?

Google is your friend: reading files VHDL

Grüsse,
Stefan

Autor: Rainer Zufall (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
      i := 0;
    while not endfile(pgmfile) loop
      if i = 0 then
        readline(pgmfile, zeile);
        read(zeile, indicator);         
      elsif i = 1 then
        readline(pgmfile, zeile);
        read(zeile, picw);
        read(zeile, pixh);
      elsif i = 2 then
        readline(pgmfile, zeile);
        read(zeile, pixd);        
      else              
      readline(pgmfile, zeile);      
      read(zeile, test1);
      read(zeile, test2);
      read(zeile, test3);
      read(zeile, test4);
      read(zeile, test5);
      read(zeile, test6);
      read(zeile, test7);
      read(zeile, test8);
      end if;
      i := i + 1;      
    end loop;

Autor: 123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so oder so änlich
read(L, column, readGood);
      assert readGood report "Could not read column size" severity failure;
      read(L, row, readGood);
      assert readGood report "Could not read row size" severity failure;

      readline(read_file, L);
      --max gray value


      report "Read Image";

      for Z in 0 to row-1 loop
         --report "Column" & integer'image(Z-1); 
         
         for S in 0 to column-1 loop
                   
            read(L, tmp3, readGood);
            assert readGood report "Could not read row size" severity error;
            
            image(Z)(S) := std_logic_vector(to_unsigned(tmp3, 16));
           
           
         end loop;
         if(Z /= row-1) then                 -- read not new line at last line
            readline(read_file, L);
         end if;
      end loop;

      assert endfile(read_file) report "read not all contend";

Autor: Rainer Zufall (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo 123 -

Danke, hört sich gut an!

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

Grüße,
Rainer

Autor: Rainer Zufall (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
  type    mem_array is array(0 to 8000) of unsigned(15 downto 0);
  ..
  variable image : mem_array; 
  variable tmp3: integer;

  ..

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

Autor: Volker Racho (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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



   procedure rwstimuli(FileNameIn    :  in string;
                       signal RESETN :  in std_logic;
                       signal CLK    :  in std_logic;
                       signal DVLIN  : inout std_logic;
                       signal DATAIN : inout std_logic_vector(15 downto 0)
                       ) is                                                          

    file pgmfile : text open read_mode is FileNameIn;

    variable readGood   : boolean := true;
    variable indicator  : character;
    variable column     : natural;
    variable row        : natural;
    variable pixd       : natural;
    variable tmp3       : natural;
    variable Z, S       : natural;
    variable L          : line;
    variable image      : mem_array;
    variable next_pixel : std_logic_vector(15 downto 0);
   
  begin

      readline(pgmfile, L);
      read(L, indicator, readGood);
        assert readGood report "Could not read File Indicator" severity failure;      
      
      readline(pgmfile, L);
      read(L, column, readGood);
      assert readGood report "Could not read column size" severity failure;
      read(L, row, readGood);
      assert readGood report "Could not read row size" severity failure;
      
      readline(pgmfile, L);
      read(L, indicator, readGood);
        assert readGood report "Could not read grey maximum value" severity failure;        

      readline(pgmfile, L);

      report "Read Image";

      for Z in 0 to row-1 loop  
        IF (NOT ENDFILE(pgmfile)) THEN      
        report "Row" & integer'image(Z+1);

        for S in 0 to column-1 loop
          if (not endfile(pgmfile)) then 
          --report "Column" & integer'image(S+1);

          read(L, tmp3, readGood);
          
          if readGood = false then
            readline(pgmfile, L);
                      read(L, tmp3, readGood);
          end if;

          image(Z)(S) := conv_std_logic_vector(tmp3, 16);                              
        else
          exit;
        end if;
        end loop;        
        if readGood = false then
          if(Z /= row-1) then
            if (not endfile(pgmfile)) then
            readline(pgmfile, L);
            else 
              exit;
            end if;
          end if;
        end if;
      else
        exit;
      end if;      
      end loop;

      assert endfile(pgmfile) report "read not all contend";

    if RESETN = '0' then      
      DATAIN <= (others => '0');
      DVLIN  <= '0';
    end if;
    for Z in 0 to row-1 loop
      report "..stimulate DATAIN";
         for S in 0 to column-1 loop
         if CLK = '1' and CLK'event then    
           next_pixel := image(Z)(S);
           DATAIN <= next_pixel;
           DVLIN <= not DVLIN;
        end if;
        end loop;       
   end loop;    
    
    report "Okay";    
  end rwstimuli;

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.