Forum: FPGA, VHDL & Co. Schachbrettmuster mit VHDL


von Roland Müller (Gast)


Lesenswert?

an alle VHDL-Experten:

ich bin auf der Suche nach einem VHDL-Algorithmus, mit dem ich ein
Schachbrettmuster auf einem Display ausgeben kann.

Im Prinzip soll das so aussehen, dass ich einen x-Position-Zähler und
einen y-Position-Zähler habe mit deren Hilfe ich das Schachbrettmuster
erzeugen möchte.

Kann mir jmd. dabei helfen.

Achso es geht wirklich nur um den Schachbrett-Algorithmus mittel der
x/y-Zähler, das Timing für das Display ist OK.

Grüße aus der Pfalz

 Roland Müller

von Roland Müller (Gast)


Lesenswert?

Achso, es ist ja nicht so, dass ich es nicht probiert hätte. Nein, ich
bin fast verzweifelt. Es klingt irgendwie einfach, aber ich bekomme es
einfach nicht hin.

meine Probleme waren u.a., dass das Xilinx ISE Divisionen durch eine
ungerade Zahl nicht zulässt (OK, digital usw. kann ich ja vielleicht
noch verstehen) und das nur ein bestimmte Anzahl an loops zugelassen
werden, ohne zu meckern. Ich weiss auch nicht....HILFE !!!!!

Ich hoffe Ihr habt ein paar brauchbare Ansätze oder sogar besser noch
ein paar gute Lösungsvorschläge....

Also dann.

von Christian (Gast)


Lesenswert?

Hallo

ich konnte auch nichts im ISE finden. Evtl musst du einen
Multiplizierer instantiieren und ihn nutzen. Einen Dividierer habe ich
nicht kostenlos gefunden. Falls du einen Spartan3 nutzt:
http://www.xilinx.com/bvdocs/appnotes/xapp467.pdf

Es würde sicher helfen, wenn du dein Projekt anhängst...

Grüße
Christian

von Jürgen Schuhmacher (Gast)


Lesenswert?

Dein Problem scheint die Skalierung zu sein, oder ?
Wie wäre es mit einer guten alten binären Division?
Steht in jedem Digitalbuch beschrieben.

Ich würde auf eine Ganzahl dividieren und von dort aus Zähler
hochlaufen lassen. Das ergibt zwar einen Bruch am Rand, bringt jedoch
äuquidistante Linien. X und Y sind dann Vielfach des Zählers. Für die
Darstellung einfach das LSB von X und Y über EXOR verknüpfen.

von Roland (Gast)


Lesenswert?

Hallo Jungs, schom mal Danke für Eure Beiträge, aber hängt euch bitte
nicht zu sehr an meinem Divisionproblem auf (war nur so eien Idee von
mir)

Hat einer von Euch ein konkretes Beispiel für eine solche Realisierung
?

Danke

Roland

von Thomas Pototschnig (Gast)


Lesenswert?

Wenn du schon einen horizontal und einen vertikal Zähler hast, und der
ist ja normalerweise Binär, dann nimm doch einfach z.B. Bit7 direkt für
die Farbe her ... 128 Punkte weiß, 128 Punkte schwarz und so weiter ...
In der Vertikelen kannst du auch Bit7 verwenden und die Farbe vom
horizontalen Schachbrettmuster dann XORen - so müsstest du ein schönes
Schachbrettmuster kriegen.

Mfg
Thomas Pototschnig

von Roland (Gast)


Lesenswert?

@ Thomas....

ich habe diesen Ansatz mit dem XOR schon einmal gehört. Allerdings steh
ich etwas auf dem Schlauch und versteh das nicht ganz.
OK, wie das erste Quadrat zu stande kommt versteh ich schon noch. Aber
bei den nächsten ist mir der Algorithmus nicht ganz klar, wenn ich
lediglich Bit7 xor verknüpfe...

Vielleicht kann mir einer kurz auf die Sprünge helfen...Danke

von Thomas Pototschnig (Gast)


Lesenswert?

also ... ich nenne jetzt einfach mal den horizontalctr hctr und den
vertikalctr vctr. Die Ausgangsfarbe nenne ich col. Dann müsste das hier
reichen:

col <= hctr(7) XOR vctr(7);

Das ist alles.
und zwar nehm einfach mal an, du bist in Zeile 0, und somit vctr(7) =
'0'. Dann kriegst du mit hctr(7) ein Signal das alle 128 Pixel von 0
nach 1 wechselt und umgekehrt. Soweit noch klar?
Jetzt kommst du in Zeile 128 und vctr(7) wird gesetzt. Das Bit wird
dann mit hctr(7) XOR verknüpft. Das hier ist die Wahrheitstabelle:
a --- b = q
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0

wenn du genau schaust, fällt dir bestimmt gleich auf, dass bei der
Zeile 3 und 4 das Ergebnis des XOR genau andersrum ist wie in Zeile 1
und 2, sobald a gesetzt ist. Das ist der Trick dabei.
Dadurch ergibt sich dann ab Zeile 128-255 das invertierte Muster von
Zeile 0-127.

Ich hoffe das war verständlich.

Mfg
Thomas Pototschnig

von Roland (Gast)


Lesenswert?

OK, das habe ich verstanden. Danke.

Allerdings habe ich jetzt noch folgendes Problem. Meine beiden Zähler
sind vom Typ integer. Wenn ich jetzt die Operation
col <= hctr(7) XOR vctr(7) durchführen will, meckert ISE "Wrong index
type". Noch eine Idee ????

von Thomas Pototschnig (Gast)


Lesenswert?

Da gibt's ein Haufen Umwandlungsfunktionen ...

Aber mit denen hab ich auch immer so meine Probleme ... die Frage
sollte jemand beantworten, der genau weiß wie es geht :-)

Mfg
Thomas Pototschnig

von FPGA-User (Gast)


Lesenswert?

constant HOR_WIDTH : positive := 8; -- Counter Bitbreite
constant VER_WIDTH : positive := 8; -- Counter Bitbreite

signal hctr : integer range 0 to 2**HOR_WIDTH-1;
signal vctr : integer range 0 to 2**VER_WIDTH-1;

...

col <= conv_std_logic_vector(hctr, HOR_WIDTH)(7) xor
       conv_std_logic_vector(vctr, VER_WIDTH)(7);

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.