Hi,
in der Codesammlung habe ich eine Testbench für BMP-Dateien hochgeladen.
Schaut da mal rein!
Beitrag "VHDL-BMP Read/Write"
Habe selber oft für verschiedene Sachen verwendet (auch wenn alles nicht
ausgereift ist, reicht aber meistens). Die Idee am Anfang war,
verschiedene Image- und Videoformate lesen und beschreiben zu können.
Vielleicht mache ich das noch (wenn ich nur Zeit hätte ;-))
Grüße,
Kest
"Ohne dich persönlich anzugreifen: Wozu sollte der "Scheiß" gut sein?"
Weißt du überhaupt was VHDL ist? Ich denke nicht...
"was mich mehr interessieren wuerde, wieso hast du das gerade in VHDL
geschrieben?"
Wie sollte man es sonst in ModelSim laufen lassen!?
Arrggh. Hier treiben sich ja schon manchmal Vögel herum, das glaubt man
garnicht. Schon mal was von Verifikation oder Testbench gehört? Einige
Monate früher hätte ich das richtig gut brauchen können, so kommt es
erstmal ins Archiv. Ich habe mir damals mit text I/O und Matlab
geholfen.
@noname (Gast):
der "Scheiß" ist manchmal nützlich, wenn man verschiedene Codecs mit
ModelSIM simuliert, DVI in, DVI out, VGA, Video-Filter und so weiter und
so fort... Man kann natürlich Vollversion von ModelSIM kaufen oder
Codeveloper, sodaß man Cosimulation mit C/C++ oder anderen Sachen macht.
Wie sagt man so schön: ein Bild sagt mehr als viele Wave-Ansichten in
ModelSIM ;-)
@Michael Niegl (bigmike47):
Die Frage verstehe ich nicht ganz. Das ganze sollte mit ModelSIM
funktionieren, weil ich viele FPGA-Designs mache.
@all: mal angenommen, ich habe einen JPEG-Codec in VHDL geschrieben, wie
simuliert man sowas? Klar, einzelne Entitys ist auch so möglich, aber
wenn man das ganze Bild man anschauen möchte, dafür sollte meine
Testbench da sein.
Grüße,
Kest
@ Kest
Super danke!! das ist für mich ein etwas verspätetes Weihnachtsgeschenk
;)
Endlich kann ich mal den Fehler in meiner Hough-Transformation effektiv
suchen..
ich dachte du willst das rein fuer normale bildbearbeitungsoperationen
am pc haben, u dann haette mich das schon sehr gewundert, warum man
sowas ausgerechnet per vhdl u modelsim macht
u wenn ich mich recht entsinne, steht im op nirgends, dass es unbedingt
in modelsim laufen muss
@Michael Niegl (bigmike47):
Sorry, dass ich mich missverständlich ausgedrückt habe. Ich dachte aus
dem Betreff geht es hervor (und aus dem FPGA, VHDL & Co.-Forum, dass ich
hier gepostet habe)
Grüße,
Kest
Danke!
bei meinen Tests mit meinem PAL-Encoder hatte ich damals immer extra
Bilder nach .RAW konvertiert. Das war aber auch ziemlich lästig und
mittlerweile weiß ich das nicht mal mehr, mit welchem Programm ich das
gemacht hab ...
Das nächste mal werd ich dann deinen VHDL-Code verwenden :-)
Mfg
Thomas Pototschnig
Hallo Kest,
das BMP-Package ist sehr gut, konnte es schon für meine Simulationen
verwenden. Einziger Haken daran: Sobald ich Auflösungen verwende,
deren Horizontale Pixelanzahl nicht durch 8 teilbar ist (z.B. 1366 x
768),
erhalte ich falsche Daten. Dies hängt wahrscheinlich mit der Art und
Weise zusammen, wie Du das Memory-Array ausliest.
Gibt es eine "schnelle" Modifikation, um solche Auflösungen ebenfalls zu
behandeln ?
Gruß
Bist Du Dir sicher, dass das mit der Auflösung zu tun hat?
Hast Du die Konstanten cMAX_X, xMAX_Y geändert (die sind maximal 1300),
setze sie mal hoch.
Grüße,
Kest
Hallo,
ja habe die Konstanten beide auf 2000 gesetzt.
Bin mir eigentlich sicher. Habe eine kleine Auflösung testweise
ausprobiert: 1366 x 14 (Fehler)
Eine zweite Auflösung (1368 x 14) führt zu keinem Fehler. (1368 lässt
sich durch 8 teilen).
Gruß
(cBytesPerPixel=3)
Ich mache folgendes:
Initial rufe ich die Prozedur "ReadFile" auf, so dass das Array
mit den Bilddaten des bmp-Files gefüllt ist.
Danach lese ich pro Takt ein Pixel aus (mit Prozedur "GetPixel", ich
habe in der Prozedur die Bytes vertauscht),
und speichere die ausgelesenen 3 Bytes in ein ppm-File.
Parallel dazu lese ich die gleiche Datei als ppm ein (hierzu habe ich
einen eigenen Prozess geschrieben) und vergleiche mit jedem Takt
die "ppm-Daten" mit den "bmp-Daten". Bei 1368 x 14 sind die Daten
identisch, bei 1366 x 14 unterscheiden sich diese.
Das so abgespeicherte ppm-Bild sieht bei 1366x14 entsprechend verzerrt
aus.
Gruß
Bist Du sicher, dass ppm richtig implementiert ist? Eigentlich ist BMP
straight forward, also keine Magie. Deshalb kann ich mir nicht
vorstellen, dass in der testbench was passiert. Probier mal nur mit BMP
Dateien (Ein Bild auslesen, das andere neu schreiben). Dies sollte mit
jeder Breite funktionieren. Ansonsten schick Deinen COde, vielleicht ist
da der Wurm drin.
Grüße,
Kest
Hallo Kest,
ich habe noch folgendes ausprobiert:
Simuliert man das Beispiel-Testbench-File "sim_tb_bmpread" für
"lena.bmp"
mit 1368x768, so ist "lena_copy.bmp" ok.
Wenn man hingegen "lena.bmp" auf 1366x768 verkleinert, so lässt sich
"lena_copy.bmp" nicht öffnen.
Auch wenn ich für meine eigene Simulation die Prozedur "WriteFile"
nicht verwende, so könnte deine Beispiel-Simulation einen Hinweis
auf mein Problem liefern.
Grüße,
Fpga4u
Hallo,
habe gerade mit Lena_1368x768 und 1366x768 ausprobiert, in beiden Fällen
funktioniert bei mir alles so, wie gehabt. Die Bilder sind identisch
(mit Originalen)
Die Sache ist, dass sich die Bilder in ihren Formaten gar nicht
unterscheiden dürfen/sollen! Der Header der BMP-Datei wird einfach in
die neue Datei übertragen und gut ist.
Ich fürchte, Du musst bei Dir noch weiter graben, woran das liegt. Mit
ModelSIM 6.0 XE läuft bei mir alles problemlos (nach dem ich die
maximale Auflösung auf 1500 gesetzt habe).
Auf jeden Fall, melde Dich bitte, wenn Du die Lösung oder auch die
Quelle des Problems gefunden hast.
Grüße,
Kest
Hallo,
habe meine Simulation mit folgendem Simulatoren durchgeführt:
Modelsim Lattice OEM Version 6.2g
ModelsimDesigner PLUS 6.3a
Diese sind auf einem ziemlich aktuellen Stand.
Wie ich auf der Xilinx-Seite sehen konnte, ist der Xilinx-Simulator
mittlerweile bei Version 6.3
Vielleicht kannst Du den mal installieren und schauen, ob du das
fehlerhafte Verhalten nachvollziehen kannst.
Grüße,
Fpga4u
Nee, sorry, was neues installieren kommt zunächst nicht in Frage, da ich
mit der Version viele Projekte mache und mir nicht unbedingt alles
zerschiesen möchte.
Ich glaube auch nicht, dass das an der Version liegt. Eher ein
"Gedanken" Problem bzw allte Bibliotheken im Verzeichnis oder so. Lösche
alles, erstell das Projekt neu und siehe weiter.
Ich ändere die Größe von BMPs mit Irfanview, vielleicht kommt da was
dazwischen?
Kest
Ich bin neugierig geworden und habe es gerade auch mal versucht. Ich
habe Modelsim LE 6.2i verwendet um Dein Beispiel sim_tb_bmpread.vhd zu
simulieren und habe das Gleiche wie fpga4u feststellen können.
Die Datei ist 2kB kleiner und lässt sich nicht mehr mit der
Windows-Bildvorschau öffnen.
Mit Gimp, Irfanview und paint lässt es sich öffnen und man kann erkennen
das oben rechts ein Teil der ersten Zeile schwarz ist.
Ich kann da nur vermuten:
ich verwende durchgehend
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
dies ist nicht unbedigt ratsam. Vielleicht sind die Bibliotheken anders
oder es gibt einen Konflikt. Vielleicht liefert dann auch
conv_std_logic_vector
was anderes zurück. Oder, oder, oder... Leider habe ich jetzt keine Zeit
da weiter zu graben, aber solltet ihr den Fehler finden, wäre es schön,
wenn ihr es auch publik mach!
Grüße,
Kest
Kein Problem, ist ja legitim.
Habe ein paare weitere Auflösungen ausprobiert. Für JEGLICHE
Auflösungen,
deren Zeilen-Pixelanzahl nicht durch 8 teilbar ist, wird
"lena_copy.bmp" falsch. Zoomt man in die obere rechte Ecke des Bildes,
so
sieht man einen schwaren Streifen. Wenn man in IrfanView einen
Hintergrund
einstellt, der nicht schwarz ist, dann sieht man diesen Streifen
auf Anhieb.
Gruß,
Fpga4u
Eine wirklich sehr nützliche sache, die mir sehr geholfen hat.
Einen kleinen Bug hab ich jedoch noch entdeckt:
getpixel (x,y,colordata);
setpixel (x,y,colordata);
kopiert nicht exakt einen Pixel, da x und y variablen sind, colordata
aber ein signal, somit wird der aktuelle Pixel mit der farbe des letzten
durchlaufs beschrieben. Deshalb ist in dem Beispiel das Bild um ein
Pixel nach rechts verschoben. Umgehen kann man das, indem man x und y in
ein signal wandelt.
signal x2,y2 : integer;
.
.
.
getpixel (x,y,colordata);
x2 <= x ; y2 <= y;
setpixel (x2,y2,colordata);