Forum: FPGA, VHDL & Co. Verilog - Spielfeld


von Zaher (Gast)


Lesenswert?

Hallo,

ich bin Anfänger in Verilog. Ich habe einen folgendes Problem.
Ich habe eine VGA-Verbindung vom FPGA zum Monitor aufgebaut und eine 
LED, die ich per Taster ein- und ausschalten kann. Jetzt muss ich aber 
nicht nur eine LED ein- und ausschalten können, sondern ein "Spielfeld" 
in Form eines 7x6 großen Gitters programmieren. Kann jmd helfen? Das, 
was ich bisher hab:

module LED(input [24:0] VGA_Ctrl, input data, input [15:0] PixColor, 
output [15:0] VGA_Color);
    parameter PosX = 10, PosY = 10;
    wire [10:0] X;
    wire [9:0] Y;

    assign {Y,X} = VGA_Ctrl[21:1];
    wire AtPosition = ((X[10:3] == PosX) && (Y[9:3] == PosY));

    wire [15:0] BoxColor = (data == 1'b1) ? PixColor : 16'h0000;
    assign VGA_Color = (AtPosition == 1'b1) ? BoxColor : 16'd0;

endmodule

von Zaher (Gast)


Lesenswert?

Die LED soll ich auch nach links und rechts verschieben können...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Zaher schrieb:
> und eine LED, die ich per Taster ein- und ausschalten kann.
Du meinst ein Feld, das mit einer bestimmten anderen Farbe als der 
Hintergrund dargestellt wird? Denn eine LED ist üblicherweise ein 
elektronisches Halbleiterbauteil...

> sondern ein "Spielfeld" in Form eines 7x6 großen Gitters programmieren.
Eher so wie ein Schachbrett mit durchgefärbten Bereichen? Oder eher ein 
Gitternetz wie bei einem Oszilloskop?

> Das, was ich bisher hab:
Und damit steuerst du einen VGA-Monitor an?

von Raba Z. (zaher)


Lesenswert?

Zu deiner ersten Frage: Ja!

Zweite: Eher ein Gitternetz, sodass ich mit der "LED" wählen kann, 
welche Reihe ich wählen möchte.

Dritte: Nein, der Monitor wird anders abgesteuert. Hiermit pragrammiere 
ich die Psoition und die Größe der "LED".

von Raba Z. (zaher)


Angehängte Dateien:

Lesenswert?

Ich habe es nun geschafft ein "Gitter" mit 7x6 Feldern zu "zeichnen".. 
siehe im ANhang HLine für Horizontale Line und in der VGA -Datei die 
Zuordnung der HLine.
Das Gitter geht von Anfang bis zum Ende des Bildschirms, ich möchte 
dieses aber begrenzen. Hat jmd ne Idee, wie ich das machen kann, 
sodassdie Linie an einer anderen Position beginnt und nicht von 0.

von Raba Z. (zaher)


Lesenswert?

Außerdem würde ich gerne meine "LED" per Taster nach links und rechts 
verschieben können.

`timescale 1ns / 1ps

module LED(input [24:0] VGA_Ctrl, input [15:0] PixColor, output [15:0] 
VGA_Color);
    parameter PosX = 4, PosY = 4;
    wire [10:0] X;
    wire [9:0] Y;

    assign {Y,X} = VGA_Ctrl[21:1];
    wire AtPosition = ((X[10:6] == PosX) && (Y[9:6] == PosY));

   // wire [15:0] BoxColor = (data == 1'b1) ? PixColor : 16'h0000;
    assign VGA_Color = (AtPosition == 1'b1) ? PixColor : 16'd0;

endmodule
 Was muss ich dafür tun?

Danke im Vorraus

von Thomas K. (thok)


Lesenswert?

Raba Zaher schrieb:
> Das Gitter geht von Anfang bis zum Ende des Bildschirms, ich möchte
> dieses aber begrenzen. Hat jmd ne Idee, wie ich das machen kann,
> sodassdie Linie an einer anderen Position beginnt und nicht von 0.
Du musst nur in HLine für die X-Achse so ähnlich machen, wie du es schon 
für die Y-Achse gemacht hast. z.B. wenn du im Bereich von 100 bis 500 
Pixel deine horizontale Line haben willst, musst du X entsprechend 
auswerten (100 <= X <= 500) oder abhängig von der X-Position eine fixe 
Länge zeichnen.
Das gleiche nochmal für die Y-Achse in VertLinie.

> Außerdem würde ich gerne meine "LED" per Taster nach links und rechts
> verschieben können.
Wenn du jeweils für die Parameter von LED zwei Variablen verwendest, 
kannst du diese entsprechend der Tasterbetätigung hoch bzw. runter 
zählen.
Die anderen LEDs müssen dann relativ von dieser Position gezeichnet 
werden.
1
     LED       #(HPos,VPos)   LED_Inst1  ( VGA_Ctrl, 16'hF800, VGA_ColorFullLED1 );
2
     LED       #(HPos+1,VPos) LED_Inst2  ( VGA_Ctrl, 16'h001F, VGA_ColorFullLED2 );
3
...

Am besten du gibts bei HLine und VertLinie immer zwei Parameter mit 
(VPos und HPos), anstatt nur einen.

: Bearbeitet durch User
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.