www.mikrocontroller.net

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


Autor: Markus A. (mad)
Datum:
Angehängte Dateien:

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

Autor: Daniel R. (daniel_r)
Datum:

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

Autor: Markus A. (mad)
Datum:

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

Autor: Daniel R. (daniel_r)
Datum:

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

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
IF rising_edge(clk_50_in) THEN
  IF clk25 = '1' THEN
    .....
    .....
  END IF;
END IF;


T.M.

Autor: Markus A. (mad)
Datum:

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

Autor: Jürgen Schuhmacher (Gast)
Datum:

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

Autor: Markus A. (mad)
Datum:

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

Autor: Daniel R. (daniel_r)
Datum:

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

Autor: Markus A. (mad)
Datum:

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

Autor: Markus A. (mad)
Datum:

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

Autor: Daniel R. (daniel_r)
Datum:

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

Autor: Markus A. (mad)
Datum:

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

Autor: Markus A. (mad)
Datum:

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

Autor: Daniel R. (daniel_r)
Datum:

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

Autor: Markus A. (mad)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aha sehr interessant ... und wie entprelle in einen Taster?

Autor: Daniel R. (daniel_r)
Datum:

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

Autor: Markus A. (mad)
Datum:

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

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.