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 ...
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.
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 .. ;-)
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;
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.
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 ...
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!
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?
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
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 ...
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 ...
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
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 ...
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"? ...
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.
aha sehr interessant ... und wie entprelle in einen Taster?
Solange warten, bis er konstant für eine bestimmte Zeitdauer auf einem Level bleibt.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.