Farbe weiß kann ich nicht unterbringen im VGA640x480 beim FPGA

OP #3626117
Lesenswert?

Hallo, guten Tag.
Ich habe ein Bild 640x480 mit den senkrechten Farbbalken rot/grün/blau.
In der letzten Reihe möchte ich weiß unterbringen:
---if (hcounter> 479 and hcounter < 640) then---

Bekomme das nicht hin.
Es kommt der Fehler das ich die Vectoren schon verwende.

Danke.
Gruss

[vhdl]
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.ALL;

entity vga_timing is
port(
  clk50_in  : in std_logic;
  hs_out    : out std_logic;
  vs_out    : out std_logic;

  red_out   : OUT STD_LOGIC_VECTOR(3 downto 0);
  green_out : OUT STD_LOGIC_VECTOR(3 downto 0);
  blue_out  : OUT STD_LOGIC_VECTOR(3 downto 0)
  );
end vga_timing;

architecture behavioral of vga_timing is

signal clk25    : std_logic:='0';
signal hcounter : unsigned (9 downto 0):=to_unsigned(0,10);
signal vcounter : unsigned (9 downto 0):=to_unsigned(0,10);

begin

-- generate a 25Mhz clock
process (clk50_in)
begin
  if clk50_in'event and clk50_in='1' then
    clk25 <= not clk25;
  end if;
end process;

process (clk25)
begin
  if clk25'event and clk25 = '1' then
    if vcounter<480 then
      if (hcounter > 0 and hcounter < 160) then
        red_out<="1000";
      else
        red_out<="0000";
      end if;
    end if;
  end if;
end process;

process (clk25)
begin
  if clk25'event and clk25 = '1' then
    if vcounter<480 then
      if (hcounter> 159 and hcounter < 320) then
        green_out<="1000";
      else
        green_out<="0000";
      end if;
    end if;
  end if;
end process;

process (clk25)
begin
  if clk25'event and clk25 = '1' then
    if vcounter<480 then
      if (hcounter> 319 and hcounter < 480) then
        blue_out<="1000";
      else
        blue_out<="0000";
      end if;
    end if;
  end if;
end process;

process (clk25)
begin
  if clk25'event and clk25 = '1' then
    if hcounter >= (639+16) and hcounter <= (639+16+96) then
      hs_out <= '0';
    else
      hs_out <= '1';
    end if;

    if vcounter >= (479+10) and vcounter <= (479+10+2) then
      vs_out <= '0';
     else
      vs_out <= '1';
    end if;

--- horizontal counts from 0 to 799
    hcounter <= hcounter+1;

    if hcounter = 799 then
      vcounter <= vcounter+1;
      hcounter <= to_unsigned(0,10);
    end if;

--- vertical counts from 0 to 524
    if vcounter = 524 then
      vcounter <= to_unsigned(0,10);
    end if;
  end if;
end process;

end behavioral;
[vhdl]
OP #3626265
Lesenswert?

Ich habe jetzt alles in einem Prozeß:

[VHDL]
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.ALL;

entity vga_timing is
port(
  clk50_in  : in std_logic;
  hs_out    : out std_logic;
  vs_out    : out std_logic;

  red_out   : OUT STD_LOGIC_VECTOR(3 downto 0);
  green_out : OUT STD_LOGIC_VECTOR(3 downto 0);
  blue_out  : OUT STD_LOGIC_VECTOR(3 downto 0)
  );
end vga_timing;

architecture behavioral of vga_timing is

signal clk25    : std_logic:='0';
signal hcounter : unsigned (9 downto 0):=to_unsigned(0,10);
signal vcounter : unsigned (9 downto 0):=to_unsigned(0,10);

begin

-- generate a 25Mhz clock
process (clk50_in)
begin
  if clk50_in'event and clk50_in='1' then
    clk25 <= not clk25;
  end if;
end process;

process (clk25)
begin
  if clk25'event and clk25 = '1' then
    if vcounter<480 then
      if (hcounter > 0 and hcounter < 160) then
        red_out<="1000";
      else
        red_out<="0000";
      end if;

      if (hcounter> 159 and hcounter < 320) then
        green_out<="1000";
      else
        green_out<="0000";
      end if;

     if (hcounter> 319 and hcounter < 480) then
        blue_out<="1000";
      else
        blue_out<="0000";
      end if;

     if (hcounter> 479 and hcounter < 640) then
        red_out<="1000";
  green_out<="1000";
        blue_out<="1000";
      else
        red_out<="0000";
        green_out<="0000";
        blue_out<="0000";
      end if;
    end if;
  end if;
end process;

process (clk25)
begin
  if clk25'event and clk25 = '1' then
    if hcounter >= (639+16) and hcounter <= (639+16+96) then
      hs_out <= '0';
    else
      hs_out <= '1';
    end if;

    if vcounter >= (479+10) and vcounter <= (479+10+2) then
      vs_out <= '0';
     else
      vs_out <= '1';
    end if;

--- horizontal counts from 0 to 799
    hcounter <= hcounter+1;

    if hcounter = 799 then
      vcounter <= vcounter+1;
      hcounter <= to_unsigned(0,10);
    end if;

--- vertical counts from 0 to 524
    if vcounter = 524 then
      vcounter <= to_unsigned(0,10);
    end if;
  end if;
end process;

end behavioral;
[VHDL]

Es wird aber nur der letzte Balken Weiß angezeigt. Warum?

Wenn ich den letzten Balken (weiß) rausnehme, sind die Balken 
rot/grün/blau/schwarz da.

Danke.
Gruss
Gast #3626300
Lesenswert?

Peter Bierbach schrieb:
> if (hcounter> 479 and hcounter < 640) then
>         red_out<="1000";
>   green_out<="1000";
>         blue_out<="1000";
>       else
>         red_out<="0000";
>         green_out<="0000";
>         blue_out<="0000";
>       end if;

- Wie werden if-Bedingungen abgearbeitet?
- Was passiert bei deinem else?

Wenn du beide Fragen beantworten kannst, bist du der Lösung auf die 
Schliche gekommen ;)
Gast #3626504
Lesenswert?

Peter Bierbach schrieb:
> Es kommt der Fehler das ich die Vectoren schon verwende

Peter Bierbach schrieb:
> Warum nimmt man für die Farbbalken keine Einzelprozesse?

Das hat nichts mit den Farbbalken zu tun, sondern damit das du in 
verschiedenen Prozessen mit dem gleichen Vektor arbeitest. Du kannst 
deinen Vektor zwar in verschiedenen Prozessen auslesen, aber nur in 
einem auf ihn schreiben.
OP #3626739
Lesenswert?

Hallo, guten Tag.
Ich möchte die Farbbalken jetzt mit einem "switch 0-3" einzeln schalten:
sw   : in  std_logic_vector(3 downto 0);

Und damit die Farben verändern:
---------------------------------
process(sw)
begin
  case sw is
    when "0001" => ?
    when "0010" => ?
    when "0100" => ?
    when "1000" => ?
 end case;
end process;
---------------------------------

Wie sehen jetzt bitte die Variablen aus für red/green/blue/white für die 
obige Schleife? Wie müssen die Varibalen umgewandelt werden, damit die 
hier bitte erkannt werden:
if (hcounter > 0 and hcounter < 160) then
  red_out<="1000";
  ......

Danke.
Gruss
Gast #3626763
Lesenswert?

Peter Bierbach schrieb:
> Wie sehen jetzt bitte die Variablen aus für red/green/blue/white für die
> obige Schleife?

Bitte beachten das ein case keine Schleife ist.
Bei Hardwarebeschreibungssprachen solltest du weiterhin einen default 
Fall mit einbeziehen, da sonst unerwartete Zustände eintreten können.
Was passiert z.B. wenn du an deinem Switch die Werte 0 und 2 high setzt? 
Das wäre der Fall 0101 und der wird mit keiner deiner Bedingungen 
abgefangen.
In VHDL sähe das so aus:
http://de.wikibooks.org/wiki/VHDL#case

Peter Bierbach schrieb:
> Wie müssen die Varibalen umgewandelt werden, damit die
> hier bitte erkannt werden:

Wenn ich es richtig verstehe möchtest du das die einzelnen Balken 
entweder ihre Farbe haben wenn der entsprechende Schalter high ist, bzw. 
schwarz sind, wenn er low ist richtig?
Wenn das so ist, dann nehme deinen Code von oben und füge einfach in das 
if eine weitere Bedingung ein.
1
      if ((hcounter> 159 and hcounter < 320) and (Switch(1) == 1)) then
2
        green_out<="1000";
3
      else
4
        green_out<="0000";
5
      end if;

PS: Wenn du VHDL postest, dann benutze bitte die 
Formatierungsmöglichkeiten des Forums:
http://www.mikrocontroller.net/articles/Formatierung_im_Forum

Das macht alles deutlich übersichtlicher.
#3627022
Lesenswert?

> PS: Wenn du VHDL postest, dann benutze bitte die
> Formatierungsmöglichkeiten des Forums:
> http://www.mikrocontroller.net/articles/Formatierung_im_Forum
>
> Das macht alles deutlich übersichtlicher.

Hehe, daran war diesmal Lothar "schuld". :)
Beitrag "Re: Beim Projekt erstellen mit Quartus2 alle LED ausschalten"

Wie du siehst, hat er ja brav am Anfang und am Ende
eingefuegt.

 An Peter:

Am Anfang muss
 und am ende muss
 stehn.
Der Schraegstrich ist wichtig.

PS: wie escaped man denn normal die klammern?
Gast #3627403
Lesenswert?

Hallo, guten Tag.
Es kommt diese Fehlermeldung:
Error (10500): VHDL syntax error at vga_timing.vhd(39) near text "=";
expecting "(", or an identifier, or  unary operator

Die 4 Schalter habe ich so angelegt:  "switch : in std_logic_vector(3 
downto 0)"
Und so ist der Aufruf:
Zeile 39 : if ((hcounter> 159 and hcounter < 320) and (Switch(0) == 1)) 
then

Wo bitte ist der Fehler?

Danke.
Gruss
Gast #3627420
Lesenswert?

W. M. schrieb:
> Wie du siehst, hat er ja brav am Anfang und am Endeeingefuegt.

Stimmt, überlesen ;)

peter schrieb:
> if ((hcounter> 159 and hcounter < 320) and (Switch(0) == 1))

Sorry, ich nutze eigentlich Verilog, deswegen das ==.
Versuche es mal mit
1
if ((hcounter> 159 and hcounter < 320) and (Switch(0) = 1))

Sowas kannst du aber auch gut hier nachlesen:
http://de.wikibooks.org/wiki/VHDL#if

Gruß
#3627433
Lesenswert?

Micha schrieb:
> Versuche es mal mit
1
if ((hcounter> 159 and hcounter < 320) and Switch(0) 
2
> = 1))

wohl eher mit
1
if (hcounter> 159 and hcounter < 320 and Switch(0) = '1')

Aber Peter,
bitte, bitte, bitte:
Das sind nun wirklich allereinfachste Grundlagen von VHDL wie man den 
Vergleichsoperator schreibt und wie man std_logic Werte schreibt.
Dazu braucht es kein Buch, da genügen schon die Tutorials im Internet.
Gast #3627490
Lesenswert?

jup danke.
Die 4 Farbbalken lassen sich jetzt durch die 4 Schiebeschalter ein-und 
ausschalten.

Ich werde jetzt versuchen ab oben links 10 rote kleine Kästchen und 8 
grüne kleine Kästchen in eine Reihe sichtbar zu machen, die dann die 
LED's auf dem DE1 ersetzen sollen.

Vielleicht als Anfänger ein bißchen zu groß..., aber mal schauen.

Gruss
Gast #3627521
Lesenswert?

Peter Bierbach schrieb:
> Warum soll man die 4 Farbbalken in einem Prozeß machen?
>
> Was ist der nachteil wenn ich wegen der Übersichtlichkeit für mich für
> jeden Balken ein Prozeß mache?
>

Du kannst einen Prozess wie in der Vorlage für jede Farbe haben, aber 
dann musst du Balken bei denen man mehr als eine Farbe setzen muss (z.B. 
weiss, gelb etc) auf alle Prozesse verteilen.
Gast #3627576
Lesenswert?

Peter Bierbach schrieb:
> Warum soll man die 4 Farbbalken in einem Prozeß machen?
Es wurde ja schon gesagt, daß ein Signal nur aus einem Prozess heraus 
geschrieben werden kann. Stell Dir den Prozess wie einen kleinen Chip 
vor: die Signale die gelesen werden, sind die Eingänge und die Signale, 
die geschrieben werden, sind die Ausgänge.

Und, wie Du vielleicht bereits gelernt hast: Man verbindet Ausgänge nie 
direkt miteinander!
Entweder verwendet man dafür Tristatesignale (High-Z), die gibt es aber 
innerhalb vom FPGA nicht (mehr), oder es gibt eine weitere Einheit: 
den Multiplexer.

Wenn Du alles in einen Prozess schreibst, wird der Multiplexer einfach 
mit in den Prozess eingebettet.

Wenn Du es übersichtlich haben willst, verwende Leerzeilen, ordentliche 
Einrückung und aussagekräftige Kommentare.

Duke
OP #3627694
Lesenswert?

Ja danke.
1 Signal - 1 Prozeß.

Ich habe jetzt 3 4-Eckige Leuchdioden r/g/b ab oben links gemäß den 
unteren Angaben. Funktioniert auch, weil es 3 verschiedene Farben 
sind(Pins).

Wie kann ich es jetzt schalten das ich für die 3 nur die Farbe rot 
nehme?
Es sollen mal 10 rote LeD werden.

Danke.
Gruss

-------------------------
      if (hcounter >=  20 and hcounter < 35) then
        red_out<="1000";
      else
        red_out<="0000";
      end if;

      if (hcounter >=  40 and hcounter < 55) then
        green_out<="1000";
      else
        green_out<="0000";
      end if;

      if (hcounter >=  60 and hcounter < 75) then
        blue_out<="1000";
      else
        blue_out<="0000";
      end if;
---------------------------
Gast #3627930
Lesenswert?

Peter Bierbach schrieb:
> Wie kann ich es jetzt schalten das ich für die 3 nur die Farbe rot
> nehme?
green_out<="1000";
und
blue_out<="1000";
einfach durch
red_out<="1000";
ersetzen. Solange das im selben Prozess passiert ist das ja kein 
Problem.

Wenn du später willst das jedes einzelne Feld rot, grün oder blau ist, 
kommen in deine if-Bedingungen einfach weitere Bedingungen welche den 
Zustand abfragen und die entsprechende Farbe high setzen.

Aber:
Du solltest echt mal schauen ob du sowas nicht auch selbst hin bekommst. 
Das sind einfach nur verschachtelte Bedingungen, nicht anders als beim 
Mikrocontroller auch (okay schon ein bisschen anders, aber das spielt 
noch keine Rolle). Es gibt wirklich eine menge Seiten zu VHDL welche 
einem den Einstieg relativ leicht machen:
http://www.lothar-miller.de/
http://www.fpga4fun.com
und sogar ein Tutorial für beide Sprachen:
http://www.fpga4fun.com/HDL%20tutorials.html
Dann kann ich dir noch das hier empfehlen:
http://www.altera.com/education/training/curriculum/fpga/trn-fpga.html
Du musst ja nicht alles durcharbeiten, aber zumindest die wichtigsten 
und grundlegendsten Dinge.

Gruß
OP #3628201
Lesenswert?

Habe mal ein Bild reingebracht.

Oben ist der schmale blaue Querbalken (korrekt)!
Dann sollen nebeneinander die 3 roten Quadrate kommen , es erscheint nur 
das letzte Quadrat ?
Dann soll darunter alles in blau kommen (korrekt)!

Was habe ich in der Logik falsch gemacht?

Danke.
Gruss

----------------------------
process (clk25)
begin
  if clk25'event and clk25 = '1' then

    if (vcounter >=0 and vcounter < 20)then
      if (hcounter >=  0 and hcounter < 640) then
        blue_out<="1000";
      else
        blue_out<="0000";
      end if;
    end if;

    if (vcounter >=20 and vcounter < 40)then
      if (hcounter >=  20 and hcounter < 35) then
        red_out<="1000";
      else
        red_out<="0000";
      end if;

      if (hcounter >=  40 and hcounter < 55) then
        red_out<="1000";
      else
        red_out<="0000";
      end if;

      if (hcounter >=  60 and hcounter < 75) then
        red_out<="1000";
      else
        red_out<="0000";
      end if;
    end if;

    if (vcounter >=40 and vcounter < 480)then
      if (hcounter >=  0 and hcounter < 640) then
        blue_out<="1000";
      else
        blue_out<="0000";
      end if;
    end if;
  end if;
end process;
-------------------------------------
Angehängte Dateien:
OP #3628242
Lesenswert?

Damit geht es :
-------------------------
process (clk25)
begin
  if clk25'event and clk25 = '1' then
    if (vcounter >=20 and vcounter < 40)then

      if (hcounter >=  20 and hcounter < 35) then
        red_out<="1000";
      end if;

      if (hcounter >=  35 and hcounter < 40) then
        red_out<="0000";
      end if;

      if (hcounter >=  40 and hcounter < 55) then
        red_out<="1000";
      end if;

      if (hcounter >=  55 and hcounter < 60) then
        red_out<="0000";
      end if;

      if (hcounter >=  60 and hcounter < 75) then
        red_out<="1000";
      end if;

      if (hcounter >=  75 and hcounter < 640) then
        red_out<="0000";
      end if;

    end if;
  end if;
end process;
--------------------------------

Gruss
(Firma: www.dossmatik.de) #3628436
Lesenswert?

Es sieht doch schon mal nach etwas Grafik aus.
Bin gespannt wie es weiter geht.
Der Code kommt mir auch bekannt vor.

Die VGA Ausgabe ist gut geeignet, um VHDL zu lernen. Man muss die 
Gültigkeit von mehreren Signalen im Auge behalten.
Da kann man sich gut austoben.

Linien zeichnen oder Bälle fliegen lassen.
Ein Gitter auf dem Bildschirm.
Alles gute Übungen.
Moderator (Firma: Titel) Persönliche Seite #3628513
Lesenswert?

W. M. schrieb:
>> PS: Wenn du VHDL postest, dann benutze bitte die
>> Formatierungsmöglichkeiten des Forums:
>> http://www.mikrocontroller.net/articles/Formatierung_im_Forum
>> Das macht alles deutlich übersichtlicher.
>
> Hehe, daran war diesmal Lothar "schuld". :)
> Beitrag "Re: Beim Projekt erstellen mit Quartus2 alle LED ausschalten"
>
> Wie du siehst, hat er ja brav am Anfang und am Ende
> eingefuegt.
Schlags kaputt...
Wird sofort korrigiert.

> PS: wie escaped man denn normal die klammern?
Ich nehme die [ pre ] Tags dafür. Dann liest sich das so:
1
[vhdl]
2
  Der VHDL Code
3
[/vhdl]

Peter Bierbach schrieb:
> Manche Logiken begreife ich noch nicht.
Mach dir keine Sorgen. Ich habe für die wichtigsten ein paar Jahre 
gebraucht. Und ein paar der weniger wichtigen überraschen mich noch 
heute...
#3628710
Lesenswert?

Für ein paar einfache Balken/Streifen reichen ein paar If then Abfragen 
der Zeilen- und Spaltenzähler, sobald aber ein paar Muster mit Quadraten 
etc. gefragt sind, sollte man besser auf einen RAM/ROM gehen, das ist 
DEUTLICH einfacher und flexibler. Und last but not least kommt man am 
Ende zu einem echten Bildspeicher im externen RAM, wo man ein beliebiges 
Bild reinschreibt und auf dem VGA darstellen kann.
OP #3628800
Lesenswert?

---------------------
Und last but not least kommt man am
Ende zu einem echten Bildspeicher im externen RAM, wo man ein beliebiges
Bild reinschreibt und auf dem VGA darstellen kann.
---------------------

Das hört sich ja gut und für mich kompliziert an.
Dieses SRAM lesen/schreiben am DE1 kann ich noch nicht.

Gibt es dafür bitte ein schulmäßiges Beispiel?
Ich vermisse einfache kurze Beispiele in allen Richtungen.
Viele sind so kompliziert geschrieben.

Ich vermute die meisten FPGA'ler sind Hochschulbesucher.

Danke.
Gruss
Gast #3628816
Lesenswert?

Peter Bierbach schrieb:
> Gibt es dafür bitte ein schulmäßiges Beispiel?
> Ich vermisse einfache kurze Beispiele in allen Richtungen.
> Viele sind so kompliziert geschrieben.

Hey,
kurze Beispiele gibts leider nur für die simpleren Aufgaben. z.B. LEDs 
oder 7-Segment ansteuern. Ein Beispiel um einen Klang zu erzeugen dürfte 
auch recht einfach zu finden sein.
Alles was sich ausserhalb des FPGAs befindet ist definitiv nicht mehr 
mit einer Seite Code zu beschreiben.
Was mir viel spaß gemacht hat, ist mal den NIOS II
zu implementieren und damit was rum zu spielen. Der bietet dann auch die 
Möglichkeit die mitgelieferten Cores mittels Avalon anzusteuern.

Für NIOSII gibt es ein Youtube Tutorial:
https://www.youtube.com/watch?v=DBkza5-SlqQ (erster Teil)
https://www.youtube.com/watch?v=t-nPunZ49nY (zweiter Teil)

http://www.altera.com/devices/processor/nios2/ni2-index.html
http://www.altera.com/literature/manual/mnl_avalon_spec.pdf
#3628826
Lesenswert?

@ Peter Bierbach (funkheld)

>Gibt es dafür bitte ein schulmäßiges Beispiel?

Wahrscheinlich schon, ich hab aber keine Links dazu.

Fang doch mit dem einfachen Beispiel und deinem internen RAM/ROM an, das 
ist nicht schwer. Adresse und Takt anlegen, schon fallen hinten die 
Daten raus. Den RAM kann man mit dem Megawizeard/Core Generator / 
Whatever erstellen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren