Forum: FPGA, VHDL & Co. [VHDL] Linie auf dem Monitor wandern lassen


von Markus A. (mad)


Angehängte Dateien:

Lesenswert?

Hallo ...

also ich habe über den VGA-Port einen Monitor angeschlossen und möchte
jetzt eine Linie zeichnen (was ich schon geschafft habe) und diese hoch
und runter wandern lassen (was ich nicht schaffe) ... schaut euch doch
mal bitte meinen bisherigen Quellcode an ...

wo liegt der Fehler? Was mache ich falsch?

Vielen Dank schon mal im Voraus ...

von Daniel R. (daniel_r)


Lesenswert?

Ohne den Code genauer angeschaut zu haben:
Mach es nicht so umständlich...(besonders das mit dem clk25...)
Um die Linie wandern zu lassen musst Du nur einen extra Zähler
inkrementieren, mit dem vert.Zähler vergleichen. Bei Gleichheit alls
Pixel in der Zeile nach Wunsch färben.

von Markus A. (mad)


Lesenswert?

grübel ... das ist umständlich? ihc werde mal versuchen, deine Aussage
auf mein Programm zu übertragen ... auch wenn ich noch nicht ganz gena
weiß wie ...

ich melde mich sicher nachher nochmal wieder .. ;-)

von Daniel R. (daniel_r)


Lesenswert?

process (clk50_in)
begin
  if clk50_in'event and clk50_in='1' then
    if (clk25 = '0') then
      clk25 <= '1';
    else
      clk25 <= '0';
    end if;
  end if;
end process;

Oh ja, das ist umständlich.

So gehts richtig:

process (clk50_in)
begin
if rising_edge(clk50_in) then
clk25 <= not clk25;
end if;
end process;

von T.M. (Gast)


Lesenswert?

Aber den abgeleiteten Clock clk25 sollte man nur als Clock-Enable
weiterbenutzen, nicht als neuen Takt für andere Schaltungsteile. Sonst
ist die Synchronität dahin. Also in etwa so:
1
IF rising_edge(clk_50_in) THEN
2
  IF clk25 = '1' THEN
3
    .....
4
    .....
5
  END IF;
6
END IF;


T.M.

von Markus A. (mad)


Lesenswert?

Vielen Dank für eure Antworten ... werde das für meine zukünftigen
Programme beherzigen ... gesehen hatte ich das so in einem
VHDL-Tutorium ... daher war ich davon ausgegangen, das ist gut so ...
naja so kann man sich irren ... jetzt weiß ich ja, wie es einfacher
geht ...

hoffe ich komme heute Nachmittag dazu, mein Programm mal umzubauen ...
melde mich dann wieder ...

von Jürgen Schuhmacher (Gast)


Lesenswert?

Obwohl Daniel ein wenig Recht hat, würde ich es dennoch so schreiben:

process (clk50_in)
begin
  if clk50_in'event and clk50_in='1' then
    if (clk25enable = '0') then
      clk25enable <= '1';
    else
      clk25enable <= '0';
    end if;
  end if;
end process;

... da die Schaltung so in jedem Falle definiert anläuft, während die
Negation von einer Initialisierung abhäng ist, die auch erstmal getan
werden muss. Im Übrigen gilt das Gesagte hinsichtlich enable!

von Markus A. (mad)


Lesenswert?

also ich mein Programm hinsichtlch enable geändert, wie ihr es mir
geraten habt ... ansonsten habe ich es so gelasen, wie es war und wie
auch Jürgen es geschrieben hat ...

nur  weiß ich gerade echt nich weiter, wie Daniel das mit neuen Zähler
meint ... stehe da irgendwie auf dem Schlauch ... also einen Zähler
kann ich schreiben ... das ist kein Prob ... aber womit vergleichen und
wie dann die Linie weitersetzen?

   if (vertical_unten < "0101111111") then
     vertical_unten <= vertical_unten+"0000000001";
    vertical_oben <= vertical_oben+"0000000001";
   end if;

ich dachte immer hiermit müsste das gehen ... bei jedem Tackt
vergleicht er ob vertical unten schon die angegebene Position hat, wenn
nicht setzt er die Position ein runter ...

wo ist der Denkfehler?

von Daniel R. (daniel_r)


Lesenswert?

Erst einmal musst Du wissen, mit was Du sie laufen lassen wilst. Mit dem
Druck auf einen Taster oder intern oder sonstwas...

Wenn Du das weißt zählst Du bei demjenigen Ereignis einfach einen
Zähler um eins hoch(er muss so breit sein wie dein Vertikalcounter).


Der Vertikalcounter wird pro Sekunde "Wiederholfrequenz" *
"vertikale Pixelanzahl" mal inkrementiert.

Deinen anderen Zähler inkrementierst Du nun(z.B. mit Tastendruck ja
viel langsamer).

Jetzt vergleichst Du bei jedem Takt beide Zähler miteinander. Sind sie
gleich, setzt Du rgb <= "111". Dann hast Du eine weiße Linie. Sind
sie ungleich setzt Du rgb <= irgendwas(je nach Wunsch der Farbe).

Wenn der Zähler jetzt inkrementiert wird wandert Deine Zeile um ein
Pixel nach unten.

Daniel

von Markus A. (mad)


Lesenswert?

vielen Dank ... also eigentlich wollte ich jetzt erstmal nur, dass die
Linie einfach von oben nach unten wandert ... ohne Ereignis also ...
wenn das geschafft ist, soll da ganze nattürlich per Tastendruck
realisiert werden ... aber hier habe ich auch noch keinen Plan und
leider auch noch keinen schönen Link gefunden, wo das mit der
Tastenabfrage erklärt ist ...

morgen versuche ich mal deine Beschreibung umzusetzen ... melde ich
dann wieder ...

von Markus A. (mad)


Lesenswert?

ES KLAPPT!!!! ... super die Linie wandert jetzt von oben nach unten und
fängt dann wieder oben an ... jetzt weiß ich auch, wo mein Fehler war
... super ... vielen Dank ...

jetzt brauch ich nur noch die Tastaturabfrage ... aber dafür mach ich
nen neuen Beitrag auf ...

von Daniel R. (daniel_r)


Lesenswert?

Dafür brauchst Du keinen neuen Beitrag...

In der entity einen Eingangsport definieren und dann abfragen, fertig.
Natürlich kanns sein, dass der Taster prellt. Dazu musst Du ihn
entprellen. Wenn Du willst helfe ich Dir weiter...


Daniel

von Markus A. (mad)


Lesenswert?

hm jetzt habe ich schon einen neuen Beitrag geschrieben gehebt  dachte
nur ist besser für die zukünftige Suche ...

also das mit dem Taster ist kein Problem ... wie du schon sagetst,
Eingangsport definiern und den abfragen ..

aber ich mein eine richtige Tastatur ... angschlossen über den PS2
Port

bin dir echt dankbar für deine Hilfe ...

von Markus A. (mad)


Lesenswert?

also mittlerweile bin ich so weit, dass ich die Linie mit Hilfe zweier
Taster ruf und runter steuern kann ... soweit so gut ... aber was
meinst du bitte mit "Taster prellt"? ...

von Daniel R. (daniel_r)


Lesenswert?

Beim Druck auf den Taster schließt dieser nicht sofort richtig sondern
"zappelt" ein paar mal. D.h. er kontaktiert eine gewisse Zeit lang
noch nicht richtig. Dies hat zur Folge, dass die der FPGA meint, der
Taster sei mehrmals gedrückt worden. Deswegen muss man entprellen.

von Markus A. (mad)


Lesenswert?

aha sehr interessant ... und wie entprelle in einen Taster?

von Daniel R. (daniel_r)


Lesenswert?

Solange warten, bis er konstant für eine bestimmte Zeitdauer auf einem
Level bleibt.

von Markus A. (mad)


Lesenswert?

super ... das war ja echt einfach ... hatte jetzt etwas komplzierteres
erwartet ... vielen herzlichen Dank ...

jetzt habe ich erstmal nur noch das Problem mit derm Umsetzung auf eine
normale Tastatur ...

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.