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]
Schau mal ob du das ganze nicht auch in einen Prozess bekommst statt in drei bzw. vier. Gruß
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
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 ;)
Jup, danke. Dieses "else" muß am schluss verschwinden. Jetzt ist es so wie es sein soll. Warum nimmt man für die Farbbalken keine Einzelprozesse? Gruss
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.
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
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.
> 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?
:
Bearbeitet durch User
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
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ß
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.
Au man... Daran habe ich nicht gedacht. Ich dachte wenn man Zahlen eingibt das die als gesetztes Bit richtig umgesetzt werden. Danke. Gruss
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
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? Danke. Gruss
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.
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
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; ---------------------------
Ne...., ich möchte die LED auf den VGA bildlich darstellen (größer), so wie sie auf dem DE1 sind und dann die als Anzeige benutzen. Vielleicht kannst du meine Frage oben drüber beantworten? Danke. Gruss
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ß
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; -------------------------------------
Peter Bierbach schrieb: > Was habe ich in der Logik falsch gemacht? Micha schrieb: > - 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 ;) Gruß
So sieht das Bild aus wenn ich da die 3 verschiedenen Farben reinsetze (korrekt).. Gruss
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
Warum wird dann die Arbeit einfach nicht bei der zweiten if angesetzt , an der Stelle wo es losgehen soll? Gruss
Manche Logiken begreife ich noch nicht. Mit den Switch 0-9 vom DE1 kann ich jetzt rechteckige rote Quadrate(LED) auf dem VGA-Monitor auf 0 oder 1 setzen die ab links oben nach rechts gehen. Das nächste ist die VGA-LED zum Zählen benutzen bzw das zählen anzeigen. Danke. Gruss
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.
Ja.. Der Code für die VGA-Zeiten ist hier irgendwo aus dem Forum. Ich möchte die LED und weitere Signale auf den VGA darstellen. Die Switsch 0-9 rot und die Key 0-3 grün vom DE1 habe ich jetzt schon auf dem VGA. Gruss
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...
:
Bearbeitet durch Moderator
Jetzt kommt eine 7-Segmentanzeige auf dem VGA neben den Quadrat-LED. Gruss
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.
--------------------- 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
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
@ 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.
Hmm..., was ist das bitte ? Ein RAM selber erstellen auf dem DE1? Erklär mir da s bitte einmal? ------------------------ Den RAM kann man mit dem Megawizeard/Core Generator / Whatever erstellen --------------------------- Danke. Gruss
@ Peter Bierbach (funkheld) >Ein RAM selber erstellen auf dem DE1? Dein DE1 Board hat ein Altera FPGA. Also arbeitest du mit der Software Quartus. Dort gibt es ein Tool, eben diesen Megawizard, der dir einen RAM als VHDL-Komponente erzeugen kann.
Jup danke. Ist erstmal zu Hoch für mich. Verschiebe ich bis die anderen Sachen klappen. GRuss
:
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.