Hallo Leute,
arbeite zur Zeit als Einsteiger in Vhdl an einer vga-ansteuerung.
Hintergrund und einzelne unterschiedlich farbige Quadrate bzw. Rechtecke
hab ich schon ausgegeben.
Würde die jetzt einfach mal gerne von unten nach oben durch den
Bildbereich laufen lassen, allerdings verstehe ich nicht wie ich da
überhaupt ansetzen soll, vll. kann mir hier jemand den Tipp geben?
hier mein bisheriger Vhdl Code:
Als Tipp: verwende die numeric_std statt der std_logic_arith und der
std_logic_unsigned...
Hier ist die Sensitivliste falsch:
1
process(clk_50)
2
begin
3
if(clk_25'Eventandclk_25='1')then
Der Prozess ist eigentlich nur auf clk_25 sensitiv. Aber das jetzt noch
nicht ändern, denn so werden keine Takte erzeugt:
1
process(clk_50)
2
begin
3
if(clk_50'EVENTandclk_50='1')then
4
if(clk_25='0')then
5
clk_25<='1';
6
else
7
clk_25<='0';
8
endif;
9
endif;
10
endprocess;
Verwende diesen clk_25 als Clock-Enable und nimm nur den 50MHz Takt als
richtigen Takt. So etwa:
1
process(clk_50)
2
begin
3
if(clk_50'EVENTandclk_50='1')then
4
if(clk_25='0')then
5
clk_25<='1';
6
else
7
clk_25<='0';
8
endif;
9
endif;
10
endprocess;
11
12
process(clk_50)-- jetzt passt die Sensitivliste
13
begin
14
if(clk_50'Eventandclk_50='1')then-- im ganzen Design der selbe Takt!!
15
ifclk_25='1'then-- das ist ein Clock-Enable
16
...deinCode
Martin Braun schrieb:> Würde die jetzt einfach mal gerne von unten nach oben durch den> Bildbereich laufen lassen, allerdings verstehe ich nicht wie ich da> überhaupt ansetzen soll, vll. kann mir hier jemand den Tipp geben?
Du nimmst jetzt vier Register und definierst damit den Anfang und das
Ende eines Farbwechsels. Diese Register vergleichst du laufend mit dem
x- und dem y-Zähler und schaltest die Farbe passend um.
Und ab und zu änderst du die Werte dieser Register. Dadurch bewegt sich
das andersfarbige Viereck...
Erstmal danke für die Hilfe.
"Du nimmst jetzt vier Register und definierst damit den Anfang und das
Ende eines Farbwechsels."
Wie ist das zu verstehen, denke an diesen Punkt liegt mein Problem. vll.
bräcuhte ich da noch einen weiteren Denkanstoß bzw. Erklärung?
mfg sepp12
Mar B. schrieb:> Wie ist das zu verstehen, denke an diesen Punkt liegt mein Problem. vll.> bräcuhte ich da noch einen weiteren Denkanstoß bzw. Erklärung?
Mal angenommen, deine VGA Erzeugung läuft schon richtig, dann würde ich
für ein blaues Rechteck sowas vorschlagen:
Und dann machst du einen zweiten Prozess auf, in dem die Werte für
links, rechts , oben und unten z.B. jede Zehntelsekunde neu berechnet
werden. Wenn du z.B. auf rechts und links jeweils 1 addierst, solange
links < 640, und dann jeweils 1 subtrahierst, solange rechts > 0, dann
wandert das Rechteck immmer hin und her (du wirst herausfinden: du musst
dir die Richtung natürlich merken).
Selbes für oben und unten, und das Rechteck wandert ausdauernd diagonal
über den Bildschirm...
Danke hat mir sehr geholfen.
Probiere das heute gleich aus!
Was ich mich gestern noch gefragt habe ich hätte eigtl vor am schluss so
eine art videospiel daraus zu machen,in dem eine spielfigur objekten
ausweicht.
Wie kann man eigtl. Spielfiguren z.b. so eine art "super mario"
darstellen?
Muss ich mir die aus den einzelnen pixeln zusammensetzen oder is dies in
der art nicht möglich ?
mfg Sepp12
Mar B. schrieb:> Muss ich mir die aus den einzelnen pixeln zusammensetzen
Ja. Aber üblicherweise wird man Sprites, Buchstaben und Grafiken aus
einem Speicher (RAM oder ROM) holen.
Hier gbt es eine Einführung in FPGAs:
http://www.youtube.com/watch?v=X51Qxdyb2Wo
Ab ca. 26:00 gibt es eine Demo und anschließend die Erklärung dazu.
Duke
Jup, das sieht ja gut aus.
Ich habe mein Viereck (Rot ) auf einen Platz gesetzt.
Es funktioniert.
Wie sieht jetzt bitte der Prozess aus um es zu verschieben nach rechts
und nach lnks? Kommt in die Sensitiv-Liste ein clk mit
rechts-links-oben-unten, oder ohne clk?
Danke.
Gruss
peter schrieb:> Ich möchte das Viereck bitte mit 2 Tasten bewegen.
Du solltest also zuallererst diese Tasten einsynchronisieren.
Und dann eine Flankenerkennung drauf ansetzen.
Und dann bei erkannter Flanke die Grenzen ändern...
Hier mein Vorschlag zum Anpassen:
peter schrieb:> Wenn sw gedrückt dann hat er '0' ansonsten '1'.>> Ich habe jetzt diesen Process mit reingesetzt:>
1
>process(sw(0),rechts,links)
2
>begin
3
>if(sw(0)='0')then
4
>rechts<=rechts+1;
5
>links<=links+1;
6
>ifrechts>=640then
7
>rechts<=120;
8
>links<=100;
9
>endif;
10
>endif;
11
>endprocess;
12
>
>> Es ist nur ab zu ein roter Streifen zu sehen.>> Gruss
Da das ein combinatorischer Prozess ist, ist er viel zu schnell.
Ausserdem enthält er Latches, eine sehr schlechte Idee.
Pack das in den existierened Prozess (einmal pro Bild abfragen)
1
--- vertical counts from 0 to 524
2
ifvcounter=524then
3
vcounter<=0;
4
5
if(sw(0)='0')then
6
rechts<=rechts+1;
7
links<=links+1;
8
ifrechts>=640then
9
rechts<=120;
10
links<=100;
11
endif;
12
endif;
13
endif;
Davon abgesehen muss sw(0) noch entprellt und einsynchrinsiert werden,
damit es zuverlässig funktioniert.
peter schrieb:> mit 2 Tasten
Hast Du die entprellt?
http://www.lothar-miller.de/s9y/categories/5-Entprellungpeter schrieb:> process(sw(0),rechts,links)> begin> if (sw(0) ='0') then
Das ist kombinatorische Logik und dürfte ein bischen zu schnell gehen,
als das Du es mit dem Auge sehen kannst.
peter schrieb:> um es zu verschieben nach rechts> und nach lnks?
Du mußt Deine "links" und "rechts" Signale verändern. Aber nur so
schnell, das Du noch was sehen kannst.
Duke
Jup, danke. Jetzt funktioniert es.
Die Tasten sind von Haus aus schon Entprellt beim DE-1.
Habe clk-50 reingenommen.
Jetzt kann ich mit den beiden Druck-Tastern das Quadrat hin und her
schieben. Wenn es rechts anstösst(640) bleibt es stehen und wenn es
links anstösst bleibt es stehen(0).
Peter Bierbach schrieb:> Jup, danke. Jetzt funktioniert es.> Die Tasten sind von Haus aus schon Entprellt beim DE-1.>
Auch einsynchronisert auf deine clk50?
Wenn nicht wird manchmal beim Drücken der Tasten das Viereck wild
springen und sich u.U. auch in der Breite ändern. Da du nur alle 10
Milliseknden abfrägst wird das sehr sehr selten sein, ist aber genau die
Art von Fehlern die sich nachträglich nur extrem schwer auffinden
lassen.
1
process(clk50_in,sw,rechts,links)
Ein synchroner getakter Prozess darf nur die Clock, (und eventuell ein
asynchrones Reset) in der Sensitivitylist haben.
Jup danke für den Hinweis.
Hier habe ich jetzt alle 4 Drucktasten reingebracht.
Das Viereck bleibt an den Kanten stehen wenn es anstösst und dann muss
man mit den Tasten die Richtung ändern. Mit meiner Zählschleife vom
clk-50 (200000) läuft das Viereck flink und schlierenfrei über den
Screen(640x480.
Peter Bierbach schrieb:> Jup danke für den Hinweis.>> Hier habe ich jetzt alle 4 Drucktasten reingebracht.> Das Viereck bleibt an den Kanten stehen wenn es anstösst und dann muss> man mit den Tasten die Richtung ändern. Mit meiner Zählschleife vom> clk-50 (200000) läuft das Viereck flink und schlierenfrei über den> Screen(640x480.>
Ab und zu wird Tearing zu sehen sein, immer dann wenn sich die Position
ändert während das Viereck gerade ausgegeben wird.
Abhilfe: Position nur wärend des Vsyncs ändern.
Da das eventuell etwas langsam ist, Doublebuffering verwenden.
Im Tastenprozess: z.b links_neu statt links ändern,
Im Displayprozess bei vcounter = 524, links <= links_neu.
Jup danke.
Das wird wohl erst gehen wenn der Screen aus dem RAM bedient wird
(Doublebuffering)?
-----------------------
Ausserdem enthält er Latches, eine sehr schlechte Idee
-----------------------
Warum sind die Latches nicht gut im zusätzlichen Process(sensitivity)?
Danke.
Gruss
Peter Bierbach schrieb:> Jup danke.> Das wird wohl erst gehen wenn der Screen aus dem RAM bedient wird?>
Wieso, dein Bild ist im Prinzip durch die 4 Register
links,rechts,oben,unten bestimmt. Und diese 4 Register kannst du
Doublebuffern. Lies nochmal die 2 letzen Zeilen meines vorigen Postings.
Nochmal zur Erinnerung: *Einsynchronisieren*:
Beitrag "Re: pixel bewegen bei vga-ansteuerung"
Das Einsynchronisieren der Tastensignale hat nichts mit dem Prellen zu
tun, sondern damit, dass die Tastensignale asynchron zu deinem Takt
sind. Dies führt zu Timingverletzungen... deswegen wie Hr. Miller es auf
seiner Homepage hat machen.
So habe ich es geändert mit rechts_neu usw.
Mit sw kann ich jetzt auch die Farbe vom Viereck ändern.
Die Geschwindigkeit hat hier keine Einbußen.
Warum muss das bei vcounter=524 rein?
Danke.
Gruss
Hmmm. unter Doublebuffern verstehe ich das fertige Bild aus dem RAM auf
den SCreen abbilden.
Muss das jetzt so in jedem Process, wo die clk_25 als sensitive
gebraucht wird?
-------------------------
if(clk_50 'Event and clk_50 = '1') then -- im ganzen Design der selbe
Takt!!
if clk_25='1' then -- das ist ein Clock-Enable
--------------------------
Peter Bierbach schrieb:> Hmmm. unter Doublebuffern verstehe ich das fertige Bild aus dem RAM auf> den SCreen abbilden.
Man kann auch nur die Koordinaten des Teils des bildes, das sich
ändert puffern. Denn nur dieser Teil kann Probleme machen. Auch das
ist Double Buffering...
Peter Bierbach schrieb:> Warum gibt es bei "c" keine Fehlermeldung, obwohl "c" nicht in der> Empfindlichkeitsliste steht?>> Danke.>
Weil für einen getakten Prozess (wie chon mal angemerkt) ohne Reset nur
die
Clock da rein muss
Hallo nochmal,
hätte da noch ne frage, wenn ich jetzt zuällig ein objekt am monitor
ausgeben möchte ohne vorher festzulegen bei welcher x und y position es
sich befindet, könnte man das mit einem pseudo random noise generator
machen oder nicht?
falls es möglich ist, wie begrenzt man zum beispiel das objekt auf den
rechten oder linken bildschirmteil, wenn ich in mittig teilen würde.
mfg
sepp12
Mar B. schrieb:> hätte da noch ne frage, wenn ich jetzt zuällig ein objekt am monitor> ausgeben möchte ohne vorher festzulegen bei welcher x und y position es> sich befindet, könnte man das mit einem pseudo random noise generator> machen oder nicht?
Ja. Stichwort LFSR.
Ein LFSR mit 64Bit Breite wäre toll für die nachfolgende Strategie.
> falls es möglich ist, wie begrenzt man zum beispiel das objekt auf den> rechten oder linken bildschirmteil, wenn ich in mittig teilen würde.
Man begrenzt für die linke Bildschirmhälfte den Wertebereich auf 0..299
(bei einer Objektbreite von 20 Pixeln) und addiert für die rechte Hälfte
auf diesen Wert noch 320 drauf.
Weil aber eine modulo-300 Rechnung auf einem FPGA umständlich ist,
würde ich eine Zufallszahl mit 64 Bit Breite ermitteln, daraus dann
einzelne Bitmuster "ausschneiden": 1x 0..255 (8 Bit), 1x 0..31 (5 Bit),
1x 0..7 (3 Bit), 2x 0..3 (je 2 Bit) und dann alle zusammenaddieren:
fertig ist die Zufallszahl von 0..255+31+7+3+3 = 0..299
Hier sieht man schon, dass eine geschickte Auswahl der Obergrenze (bzw.
"Quadratbreite") die Anzahl der nötigen Berechnungen signifikant
reduzieren kann. Mit einer Breite von 18 wäre eine Zufallszahl von
0..301 nötig, die sich aus drei kleineren Werten zusammenaddieren lässt:
255+31+15