mikrocontroller.net

Forum: FPGA, VHDL & Co. Bilder in den SDRAM in VHDL schreiben


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Yann B. (Firma: Berlin) (yann)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte ein Bild (28x28 in BMP-Format) in den SDRAM schreiben und vom 
SDRAM zum VGA-Monitor ausgeben. Dazu habe ich das Bild in HEX-Daten 
konvertiert und in eine Textdatei kopiert. Als Test möchte ich zuerst 
512 Bytes lesen und in SDRAM schreiben. Ich möchte also die Daten von 
der Textdatei lesen und in den SDRAM schreiben aber das funktioniert 
nicht (die Daten werden in den SDRAM nicht gechrieben). Ich habe es mit 
dem ILA von Quartus geprüft.

1. Frage: Wo machte ich  denn der Fehler?

2. Frage: Wie kann ich mein Bild in RGB Werten so konvertieren, dass 
diese zur VGA-Ausgabe bereits sind?

Ich nutze das DE2-115 Board von Intel und Quartus.

Im Anhang ist der entsprechende Code-Ausschnitt  zu sehen.

Ich freue mich auf eure Hilfe.

: Verschoben durch Moderator
Autor: Yann B. (Firma: Berlin) (yann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitte Hilfe!!!

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Yann B. schrieb:
> Ich möchte also die Daten von der Textdatei lesen und in den SDRAM
> schreiben aber das funktioniert nicht (die Daten werden in den SDRAM
> nicht gechrieben).
Hast du mal die wichtigsten Signale am SDRAM mit einem Logicanalyzer 
gemessen (Steuersignale, sowie jeweils eine Adress- und eine 
Datenleitung, die sich ändern)?
Wenn nein: tu das.
Wenn ja: entsprechen die Timings dem, was das RAM laut Datenblatt 
erwartet?

Und wo ich mir jetzt mal den Code so ansehe:
>    file_open(fin, filename, read_mode);
Ich meine fast sicher behaupten zu können, dass das zur Laufzeit auf dem 
FPGA nicht funktioniert UND dir dein Synthesizer diesen Code einfach 
wegoptimiert UND dir auch entsprechende Meldungen ausgibt.

> 1. Frage: Wo machte ich denn der Fehler?
Denk einfach mal nach: wo liegt diese Datei und wie soll denn dein FPGA 
Zugriff auf diese Datei haben?

> 2. Frage: Wie kann ich mein Bild in RGB Werten so konvertieren, dass
> diese zur VGA-Ausgabe bereits sind?
Das kommt darauf an, wie das Bild in dieser Datei liegt. Und dann musst 
du das Bild noch dauerhaft in einen Speicher auf dem FPGA-System 
bekommen. Ein RAM ist da ungeeignet. Welche dauerhaften Speicher hast 
du da ausser dem Config Flash?

: Bearbeitet durch Moderator
Autor: Gustl B. (-gb-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Board hat SRAM und SDRAM. Für SDRAM solltest du noch CAS und RAS 
beachten. Der Code sieht DEUTLICH zu einfach aus.

Autor: FPGA zum Spass (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Code taugt für das gewünschte gar nichts, tut mir leid.

Wenns einfach gehen soll:

Lade die Daten als Init-Werte in ein Blockram.

Läuft deine VGA Ausgabe überhaupt schon mit statischen 
Farben/Farbverlauf?

Autor: Markus F. (mfro)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar M. schrieb:
> Ich meine fast sicher behaupten zu können,

ich bin da sogar ganz sicher (um nicht zu sagen: felsenfest überzeugt).

Alleine der Typ LINE
TYPE LINE IS ACCESS STRING;

geht (als Pointer) nicht durch die Synthese (wie auch).

Yann B. schrieb:
> 2. Frage: Wie kann ich mein Bild in RGB Werten so konvertieren, dass
> diese zur VGA-Ausgabe bereits sind?

Du kannst dir (z.B. mit Hilfe eines .tcl-Scriptes) VHDL (Quell-) Code 
erzeugen, der das Bild als ROM synthetisiert.

Autor: PittyJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe vor Jahren auch mal SDRam an dem gleichen Board gemacht.

Falls ich micht richtig erinnere:
Ich habe eine ganze Woche gebraucht, um den Implementation für den 
reinen Zugriff zu schreiben. Im Prinzip muss man sich das Datenblatt für 
die Chips besorgen, und 1 zu 1 die gesamte State-Machine 
nachprogrammieren.

Man kann natürlich ein von Altera bereitgestelltes Beispiel-Design 
(IP-Core) nehmen. Nur da lernt man nichts.

Als Beispiel für eine Statemachine:
https://www.anandtech.com/show/3851/everything-you-always-wanted-to-know-about-sdram-memory-but-were-afraid-to-ask/3

Das Datenblatt zu dem SDRam habe ich nicht mehr zur Hand

Autor: Yann B. (Firma: Berlin) (yann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar M. schrieb:
> Yann B. schrieb:
>> Ich möchte also die Daten von der Textdatei lesen und in den SDRAM
>> schreiben aber das funktioniert nicht (die Daten werden in den SDRAM
>> nicht gechrieben).
> Hast du mal die wichtigsten Signale am SDRAM mit einem Logicanalyzer
> gemessen (Steuersignale, sowie jeweils eine Adress- und eine
> Datenleitung, die sich ändern)?
Gemessen habe ich bisher nicht aber paar davon habe ich mir schon mit 
dem ELA (Embedded Logikanalyser) angeschaut.
> Wenn nein: tu das.
Ich weiss nicht wie ich diese Timing-Signale mit dem ELA messen kann 
aber ich versuche.
> Wenn ja: entsprechen die Timings dem, was das RAM laut Datenblatt
> erwartet?
>
> Und wo ich mir jetzt mal den Code so ansehe:
>>    file_open(fin, filename, read_mode);
> Ich meine fast sicher behaupten zu können, dass das zur Laufzeit auf dem
> FPGA nicht funktioniert UND dir dein Synthesizer diesen Code einfach
> wegoptimiert UND dir auch entsprechende Meldungen ausgibt.
Warum?
>> 1. Frage: Wo machte ich denn der Fehler?
> Denk einfach mal nach: wo liegt diese Datei und wie soll denn dein FPGA
> Zugriff auf diese Datei haben?
Die Datei lag im meinem Projektordner. Ich habe sogar nachher noch den 
ganzen Pfad angegeben aber passierte nichts.
>> 2. Frage: Wie kann ich mein Bild in RGB Werten so konvertieren, dass
>> diese zur VGA-Ausgabe bereits sind?
> Das kommt darauf an, wie das Bild in dieser Datei liegt. Und dann musst
> du das Bild noch dauerhaft in einen Speicher auf dem FPGA-System
> bekommen. Ein RAM ist da ungeeignet.
Ich möchte die Bilder auf dem Board nicht dauerhaft speichern. Diese 
würde ich in den SDRAM laden und vom SDRAM nutzten. Der ist aber der 
einzige auf dem Board, der genug Speicher hat glaube ich.
Welche dauerhaften Speicher hast
> du da ausser dem Config Flash?
Glaube keine mehr! 
https://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=163&No=502&PartNo=2#section

Autor: Yann B. (Firma: Berlin) (yann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gustl B. schrieb:
> Das Board hat SRAM und SDRAM. Für SDRAM solltest du noch CAS und RAS
> beachten. Der Code sieht DEUTLICH zu einfach aus.

Ich möchte gern den SDRAM. Was die Einfachheit des Codes angeht, ist mir 
klar, weil ich mich noch nie mit dem SDRAM befasst hatte.Deswegen fange 
ich einfach an.

Autor: Yann B. (Firma: Berlin) (yann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
FPGA zum Spass schrieb im Beitrag #5872195:
> Der Code taugt für das gewünschte gar nichts, tut mir leid.
Warum?
> Wenns einfach gehen soll:
>
> Lade die Daten als Init-Werte in ein Blockram.
Das habe ich schon gemacht(aber nicht mit VGA) und das hast geklappt. 
Aber jetzt wollte ich mit dem SDRAM und VGA versuchen.
> Läuft deine VGA Ausgabe überhaupt schon mit statischen
> Farben/Farbverlauf?
Ja

Autor: Yann B. (Firma: Berlin) (yann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus F. schrieb:
> Lothar M. schrieb:
>> Ich meine fast sicher behaupten zu können,
>
> ich bin da sogar ganz sicher (um nicht zu sagen: felsenfest überzeugt).
>
> Alleine der Typ LINE
>
>
> TYPE LINE IS ACCESS STRING;
> 
>
> geht (als Pointer) nicht durch die Synthese (wie auch).
Okay.
> Yann B. schrieb:
>> 2. Frage: Wie kann ich mein Bild in RGB Werten so konvertieren, dass
>> diese zur VGA-Ausgabe bereits sind?
>
> Du kannst dir (z.B. mit Hilfe eines .tcl-Scriptes) VHDL (Quell-) Code
> erzeugen, der das Bild als ROM synthetisiert.

Und wie geht es? Oder kannst du bitte noch konkreter sein?

: Bearbeitet durch User
Autor: Yann B. (Firma: Berlin) (yann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PittyJ schrieb:
> Ich habe vor Jahren auch mal SDRam an dem gleichen Board gemacht.
>
> Falls ich micht richtig erinnere:
> Ich habe eine ganze Woche gebraucht, um den Implementation für den
> reinen Zugriff zu schreiben. Im Prinzip muss man sich das Datenblatt für
> die Chips besorgen, und 1 zu 1 die gesamte State-Machine
> nachprogrammieren.
>
> Man kann natürlich ein von Altera bereitgestelltes Beispiel-Design
> (IP-Core) nehmen. Nur da lernt man nichts.
Und wie findest du diesen IP Core ?
> Als Beispiel für eine Statemachine:
> 
https://www.anandtech.com/show/3851/everything-you-always-wanted-to-know-about-sdram-memory-but-were-afraid-to-ask/3
>
> Das Datenblatt zu dem SDRam habe ich nicht mehr zur Hand
Hier ist der Link dazu: http://www.issi.com/WW/pdf/42S16320B-86400B.pdf

Autor: PittyJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Yann B. schrieb:
>> Man kann natürlich ein von Altera bereitgestelltes Beispiel-Design
>> (IP-Core) nehmen. Nur da lernt man nichts.
> Und wie findest du diesen IP Core ?

Es ist schon ein paar Jahre her. Damals war Altera noch selbständig. 
Core konnte man dort aus einem Store herunterladen und/oder kaufen. Für 
z.B: einen Ethernet IP-Core habe wir ca 900 Euro bezahlt.
Wie das aktuell aussieht, weiss ich nicht.


>> Als Beispiel für eine Statemachine:
>>
> 
https://www.anandtech.com/show/3851/everything-you-always-wanted-to-know-about-sdram-memory-but-were-afraid-to-ask/3
>>
>> Das Datenblatt zu dem SDRam habe ich nicht mehr zur Hand
> Hier ist der Link dazu: http://www.issi.com/WW/pdf/42S16320B-86400B.pdf

Das ist ja super. Auf Seite 14 ist die State-Machine des Rams. Und die 
musst du 1:1 im FPGA abbilden. Dazu dann die einzelnen States auch 
weiter aufspalten, wie z.B. auf Seite 22 für den Auto-Refresh.

Insgesamt war ich bei SDRam mit ca 1000 Zeilen dabei.
SRam ging übrigens in nur 100 Zeilen.

Autor: Markus F. (mfro)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die ganze Diskussion über den SDRAM-Controller wird dir nicht viel 
helfen. Du hast da ein Henne-Ei Problem.

Der SDRAM-Controller kann ja erst funktionieren, wenn die Config im FPGA 
geladen und aktiviert ist. Erst danach kannst Du mit Hilfe des 
Controllers ins SDRAM schreiben. Wenn Dein Bild nicht mit der Config 
mitgekommen ist, wirst Du nichts zu schreiben haben.

Das Bild muß also bereits mit der Config mitkommen oder irgendwie 
nachgeladen werden. Paßt das Bild nicht als ROM in die Config, nutzt dir 
der SDRAM-Controller nichts.

Dein verbliebenes RAM wirst Du (auch wenn Du's schaffst, das Bild ins 
SDRAM "auszulagern") wahrscheinlich als FIFO für deinen VGA-Controller 
brauchen. SDRAM hat eine relativ hohe Latenz und dein VGA-Controller 
kann nicht darauf warten, bis Du deine Bilddaten dort "rausgelutscht" 
hast, Du mußt sie also (bzw. zumindest einen Teil davon) in einem FIFO 
vorhalten.

Yann B. schrieb:
>> Yann B. schrieb:
>>> 2. Frage: Wie kann ich mein Bild in RGB Werten so konvertieren, dass
>>> diese zur VGA-Ausgabe bereits sind?
>>
>> Du kannst dir (z.B. mit Hilfe eines .tcl-Scriptes) VHDL (Quell-) Code
>> erzeugen, der das Bild als ROM synthetisiert.
>
> Und wie geht es? Oder kannst du bitte noch konkreter sein?

So z.B.:
package require cmdline

post_message "embed_bmp.tcl"

set binfile picture.bmp
set fp [open $binfile r]
fconfigure $fp -translation binary
set bindata [read $fp]
close $fp

set filename bmp_binary.vhd

set date [clock format [clock seconds] -format { %a, %Y-%m-%d, %H:%M }]
set file [open $filename w]
set script [info script]

puts $file "library ieee;"
puts $file "use ieee.std_logic_1164.all;"
puts $file ""
puts $file "    -- VHDL representation of $binfile"
puts $file "    -- generated by $script on $date"
puts $file "    -- bmp picture as preloaded RAM contents"
puts $file ""
puts $file "package bmp_binary is"
puts $file "    subtype ubyte is std_logic_vector(7 downto 0);"
puts $file "    type ubyte_array is array (natural range <>) of ubyte;"
puts $file ""
puts $file "    constant bmp_binary     : ubyte_array :="
puts $file "    ("
puts -nonewline $file "        "
set len [string length $bindata]
for {set i 0} {$i < $len} {incr i} {
    set char [string index $bindata $i]
    binary scan $char H2 byte
    puts -nonewline $file "x\""
    puts -nonewline $file $byte
    puts -nonewline $file "\""
    if { ! ([expr $i + 1] == $len) } {
        puts -nonewline $file ", "
    }
    if { [expr ($i + 1) % 8] == 0 } {
        puts $file ""
        puts -nonewline $file "        "
    }
}
puts $file ""
puts $file "    );"
puts $file "end package bmp_binary;"
close $file

Das .tcl-Script kannst Du entweder einmal "von Hand" ausführen oder in 
Quartus über die "PRE_FLOW_SCRIPT_FILE"-Variable in deinen Workflow 
einbauen:

project.qsf:
set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:embed_bmp.tcl"

Es wird dann bei jedem Syntheselauf ausgeführt und baut dir aus deinem 
.bmp Bild ein VHDL-File (das Du in deinem Projekt einbauen musst) mit 
einem konstanten Array aus Binärwerten, die Du als ROM ansprechen 
kannst.

Autor: Yann B. (Firma: Berlin) (yann)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Markus F. schrieb:

> Der SDRAM-Controller kann ja erst funktionieren, wenn die Config im FPGA
> geladen und aktiviert ist. Erst danach kannst Du mit Hilfe des
> Controllers ins SDRAM schreiben. Wenn Dein Bild nicht mit der Config
> mitgekommen ist, wirst Du nichts zu schreiben haben.

Was meinst du genau mit der Config? Meinst du das Laden des Bildes in 
den ROM? Der SDRAM IP Core hatte ich schon in Platform Designer 
konfiguriert und genau nach dem folgenden UG: 
ftp://ftp.intel.com/Pub/fpgaup/pub/Intel_Material/14.0/Tutorials/VHDL/DE 
2-115/Using_the_SDRAM.pdf.

> Dein verbliebenes RAM wirst Du (auch wenn Du's schaffst, das Bild ins
> SDRAM "auszulagern") wahrscheinlich als FIFO für deinen VGA-Controller
> brauchen. SDRAM hat eine relativ hohe Latenz und dein VGA-Controller
> kann nicht darauf warten, bis Du deine Bilddaten dort "rausgelutscht"
> hast, Du mußt sie also (bzw. zumindest einen Teil davon) in einem FIFO
> vorhalten.

Ja, ich habe einen FIFO dafür gebaut.


> Das .tcl-Script kannst Du entweder einmal "von Hand" ausführen oder in
> Quartus über die "PRE_FLOW_SCRIPT_FILE"-Variable in deinen Workflow
> einbauen:
>
> project.qsf:
>
> set_global_assignment -name PRE_FLOW_SCRIPT_FILE 
> "quartus_sh:embed_bmp.tcl"
> 
>
> Es wird dann bei jedem Syntheselauf ausgeführt und baut dir aus deinem
> .bmp Bild ein VHDL-File (das Du in deinem Projekt einbauen musst) mit
> einem konstanten Array aus Binärwerten, die Du als ROM ansprechen
> kannst.

Vielen Dank für diesen Code-Auschnitt. Aber das Synthetisieren des 
Bildes als ROM, ist es nicht genau das gleiche, wenn man das Bild als 
.mif Datei initialisiert? (Siehe s_rom.vhd).
Musst ich eine neue Datei im Projekt erstellen und diese als .tcl 
speichern? Soll diese dann zum Projekt für das Kompilieren hinzugefügt 
werden?

Autor: Yann B. (Firma: Berlin) (yann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also, ich habe den SDRAM temporär auf Seite gelassen und ich möchte 
jetzt das Bild vom ROM lesen und auf dem VGA-Monitor zeigen. Der 
beigefügte s_rom.vhd Datei lässt sich synthetisieren und simulieren aber 
bei Programmieren kriege nichts. Meine Vermutung ist die Größe des ROMs: 
784x24

Ich habe mit ELA festgestellt, dass R, G und B immer den Wert Null 
haben, also es werden keine Daten vom ROM gelesen, obwohl dieser mit der 
Datei am Anfang initialisiert wird.

Kann einer vielleicht weiter helfen?

Autor: -gb- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich sehe da nirgends die Bilddaten. Readline kannst du auf Hardware 
vergessen. Wo soll das FPGA denn das Bild lesen? Das Bild sollte man 
schon vorher fest ins ROM legen. Oder du schiebst das Bild danach über 
eine Schnittstelle ins FPGA aber dann musst du auch dafür die nötige 
Hardware beschreiben. Ist nicht schwer mit UART, wird dann aber kein ROM 
sondern ein RAM.

Autor: Yann B. (Firma: Berlin) (yann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
-gb- schrieb:
> Ich sehe da nirgends die Bilddaten.
Die Daten liegen in diese Datei "28_28_lena_bmp.mif"
>Readline kannst du auf Hardware vergessen.
Ok aber warum läuft die Synthese troztdem?
> Wo soll das FPGA denn das Bild lesen?
Soviel ich weiß, gibt es 2 Arten, den ROM oder RAM zu itialisieren. 
Entweder manuell über eine Funktion z.B zum Lesen der Datei, die als 
.mif (für VHDL) sein musst. Oder in Platform Designer über das 
Megawizard

Autor: Gustl B. (-gb-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann guck mal in der Simulation ins RAM oder ROM ob da was drinnen 
steht. Oder guck mal was für Bauteile die Synthese verwendet.

Autor: Yann B. (Firma: Berlin) (yann)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Anhang die simulation des Gesamtsystems mit modelsim. Die Daten liegen 
im ROM und werden mit 25MHz gelesen.

Autor: Gustl B. (-gb-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wunderbar! Schick, dass die Synthese sowas kann. Ja, also wieso RGB auf 
0 bleiben weiß ich auch nicht. Wo ist denn der Code dazu?

Autor: Yann B. (Firma: Berlin) (yann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann jmd bitte hier weiter helfen?

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann stell doch bitte Code und Testbench nochmal hier ein.
Wenn Deine Simulation tatsächlich geht, und keine wilden Konstrukte drin 
sind, die nicht durch die Synthese gehen, sollte es funktionieren.

Mit Signaltap könntest Du auch im FPGA prüfen, ob dein Adresszähler 
wackelt und was aus Deinem ROM rauskommt.

Duke

Autor: Markus F. (mfro)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Yann B. schrieb:
> Vielen Dank für diesen Code-Auschnitt. Aber das Synthetisieren des
> Bildes als ROM, ist es nicht genau das gleiche, wenn man das Bild als
> .mif Datei initialisiert? (Siehe s_rom.vhd).

Fast.
Die .mif-Initialisierung funktioniert (zumindest) beim MAX10 nicht.
Meine schon.

> Musst ich eine neue Datei im Projekt erstellen und diese als .tcl
> speichern? Soll diese dann zum Projekt für das Kompilieren hinzugefügt
> werden?

Steht doch alles da? Die .tcl gehört nicht zum Projekt, kann aber per 
PRE_FLOW_SCRIPT_FILE in den Ablauf integriert werden. Du kannst die 
Datei auch zum Projekt hinzufügen (schadet nichts), ausgeführt wird sie 
aber nur, wenn Du das .qsf händisch änderst. Meines Wissens gibt es 
keine Möglichkeit PRE_FLOW_SCRIPT_FILE von Quartus aus zu setzen.

Autor: Jürgen S. (engineer) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Yann B. schrieb:
> Kann jmd bitte hier weiter helfen?

Schau dir doch erst einmal an, wie man mit VGA arbeitet.
https://www.mikrocontroller.net/articles/Projekt_VGA_Core_in_VHDL

Dann suche dir ein Format aus!

Dann überlege dir eine Schaltung, die die Takte erzeugt.

Dann formuliere ihre Struktur und Funktion in VHDL.

Und dann frage ich, ob es dazu nötig ist, ein *.BMP-Format in ein RAM zu 
übertragen.

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.

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