Hallo Jungs, ich bin neu hier - weil ich keinen Plan von CPLD Programmierung hab, aber es nun brauche :-( Folgendes: Ich will mit einem Coolrunner2 eine Ampelschaltung machen. Schritte bis jetzt: - Takt mit vielen FF heruntergesetzt auf 1s - Zähler mit Logikschaltung - RS FF's zum setzten der Ampeln auf rot/grün! Problem: Bis zum Takt klappt alles, dann gibts probleme - ich glaub, mein Counter funktioniert nicht wirklich, welchen würdet ihr da nehmen? Wie beschalten? Bitte um Hilfe, bin etwas ausgeschmissen... Danke euch Vielleich hat auch jemand schematics dazu! Wäre super Ich kann auch einen Screenshot meines Schematic Plans einstellen wenns hilft?!
Tobias Reinhard schrieb: > mein Counter funktioniert nicht wirklich, welchen würdet ihr da nehmen? Ich würde einen aus der VHDL-Kiste nehmen. Welchen hast du? > Vielleich hat auch jemand schematics dazu! Ach so. Vergiss das Gelumpe. Nur als Denkanstoß der Beitrag "kruder Fehler bei FPGA-Programmierung (ISE WEBpack-Schematic)" Wenn du schon was Neues lernst, dann so, dass du später auch was anfangen kannst damit: Beitrag "Re: Ampelsteuerung"
Bei mir siehts momentan so aus: Siehe Anhang Meint ihr ich solls lieber ohne Schematics machen und in VHDL programmieren?
Komm ich mit dem oben gezeigten Schematicdokument nicht hin? Hab hald Schematics gewählt, da ich mir da wenigstens was drunter vorstellen kann... Mit VHDL hab ich nämlich keine Erfahrung, das ist mein Problem... Keiner unserer Prof's hat bis jetzt Erfahrungen mit VHDL gesammelt, deswegen ist das nun denkbar schwierig... ISE Webpack macht mir auch schwierigkeiten ohne Ende - vllt. bin ich aber auch einfach zu blöd dafür... In VHDL wäre das wahrscheinlich ein ziemlich kurzes Programm oder?
Tobias Reinhard schrieb: > In VHDL wäre das wahrscheinlich ein ziemlich kurzes Programm oder? Ja. Tobias Reinhard schrieb: > Keiner unserer Prof's hat bis jetzt Erfahrungen mit VHDL gesammelt, > deswegen ist das nun denkbar schwierig... Dann such dir einen der damit Erfahrung hat in einem anderen Departement, Fachbereich, Standort etc. Das Buzz-Word "interdisziplinäre Zusammenarbeit" kann da Wunder wirken ;-)
1 | library IEEE; |
2 | use IEEE.STD_LOGIC_1164.ALL; |
3 | use IEEE.NUMERIC_STD.ALL; |
4 | |
5 | entity ampel is |
6 | Port ( clk : in STD_LOGIC; |
7 | red : out STD_LOGIC; |
8 | green : out STD_LOGIC; |
9 | yellow : out STD_LOGIC); |
10 | end ampel; |
11 | |
12 | architecture Behavioral of ampel is |
13 | |
14 | signal prescaler : unsigned(16 downto 0); |
15 | signal cnt : unsigned(3 downto 0); |
16 | signal dec_out : unsigned(2 downto 0); |
17 | signal slow_clk : std_logic; |
18 | |
19 | begin
|
20 | |
21 | -- prescaler
|
22 | |
23 | process(clk) |
24 | begin
|
25 | if rising_edge(clk) then |
26 | prescaler <= prescaler +1; |
27 | end if; |
28 | end process; |
29 | |
30 | slow_clk <= prescaler(16); |
31 | |
32 | -- state counter
|
33 | |
34 | process(slow_clk) |
35 | begin
|
36 | if rising_edge(slow_clk) then |
37 | cnt <= cnt +1; |
38 | end if; |
39 | end process; |
40 | |
41 | -- output decoder
|
42 | |
43 | process(cnt) |
44 | variable a: integer range 0 to 15; |
45 | begin
|
46 | a := to_integer(cnt); |
47 | case a is |
48 | -- red
|
49 | -- |yellow
|
50 | -- ||green
|
51 | -- |||
|
52 | when 0 => dec_out <= "100"; |
53 | when 1 => dec_out <= "100"; |
54 | when 2 => dec_out <= "100"; |
55 | when 3 => dec_out <= "100"; |
56 | when 4 => dec_out <= "100"; |
57 | when 5 => dec_out <= "100"; |
58 | when 6 => dec_out <= "110"; |
59 | when 7 => dec_out <= "110"; |
60 | when 8 => dec_out <= "001"; |
61 | when 9 => dec_out <= "001"; |
62 | when 10 => dec_out <= "001"; |
63 | when 11 => dec_out <= "001"; |
64 | when 12 => dec_out <= "001"; |
65 | when 13 => dec_out <= "001"; |
66 | when 14 => dec_out <= "001"; |
67 | when 15 => dec_out <= "001"; |
68 | when others => dec_out <= "010"; |
69 | end case; |
70 | end process; |
71 | |
72 | red <= dec_out(2); |
73 | yellow <= dec_out(1); |
74 | green <= dec_out(0); |
75 | |
76 | end Behavioral; |
und mit nur einem Takt für alle Flipflops: http://www.mikrocontroller.net/articles/Taktung_FPGA/CPLD#Einleitung
1 | ....
|
2 | signal prescaler : unsigned(16 downto 0); |
3 | signal incscaler : unsigned(17 downto 0); |
4 | signal cnt : unsigned(3 downto 0) := "0000"; |
5 | signal dec_out : unsigned(2 downto 0); |
6 | signal slow_clk : std_logic; |
7 | |
8 | begin
|
9 | |
10 | -- prescaler
|
11 | |
12 | incscaler <= '0' & prescaler +1; |
13 | |
14 | process(clk) |
15 | begin
|
16 | if rising_edge(clk) then |
17 | prescaler <= incscaler(16 downto 0); |
18 | end if; |
19 | end process; |
20 | |
21 | slow_clk <= incscaler(17); |
22 | |
23 | -- state counter
|
24 | |
25 | process(clk) --(slow_clk) |
26 | begin
|
27 | if rising_edge(clk) then --(slow_clk) then |
28 | if (slow_clk = '1') then |
29 | cnt <= cnt +1; |
30 | end if; |
31 | end if; |
32 | end process; |
33 | |
34 | -- output decoder
|
35 | ...
|
Danke für eure Hilfe... Meine Taktfrequenz ist 8MHz, die müsst ich auch noch irgendwie bremsen auf 1 Hz oder so Macht man das am besten mit einem clock enable?
> -- prescaler > > process(clk) > begin > if rising_edge(clk) then > prescaler <= prescaler +1; > end if; > end process; > > slow_clk <= prescaler(16); > > -- state counter > > process(slow_clk) > begin > if rising_edge(slow_clk) then > cnt <= cnt +1; > end if; > end process; > > -- output decoder mal ne Frage an die Profis ... ich habe mal gehört so was ist unsauber, da man keinen rising_edge-"Befehl" auf ein anderes Signal als clk donnern sollte, da die clockplanes sonst nicht sauber sind. ist es nicht besser zu schreiben.. process(slow_clk,clk) begin if rising_edge(clk) then if slow_clk == '1' then... usw. Ich habe auch noch nicht verstanden was diese Prozesse mit Sensitivliste sollen. Klar funktioniert das und ist im Standard definiert aber mit wait until, ist es meiner Meinung nach wesendlich sauberer, da nichts vergessen werden kann (Sensitivliste) und dann nur im Simulator funktioniert. Bitte mal statemants abdrücken :-D @TO slow_clk ist ein clock enable.
Ich nehme nur rising_edge auf clock und nichts anderes. Ein rising_edge auf slow_clock läuft ja nicht unbedingt parallel, sondern kann zeitliche Abweichungen haben. D.h. dieser Process arbeitet 'asynchron'. Spätestens beim Austausch von Signalen könnte es zu Problemen kommen. So habe ich es jedenfalls verstanden, und arbeite mit dieser Einschränkung ganz gut.
fpga anfänger schrieb: > mal ne Frage an die Profis ... ich habe mal gehört so was ist unsauber, > da man keinen rising_edge-"Befehl" auf ein anderes Signal als clk > donnern sollte, da die clockplanes sonst nicht sauber sind. slow_clk IST ein Taktsignal (wie richtig geschrieben wurde, muss man beachten, dass slow_clk asynchron zu clk ist), von daher ist das schon sauber. Die Frage ist, ob man wirklich zwei Takte haben muss für diese simple Aufgabe. Deine Kritik kann angebracht sein. Wenn für das ganze Design genau einmal dieser Clock-Prescaler vorhanden ist und alles andere dann mit slow_clk arbeitet, ist das aus meiner Sicht sauber (könnte ja z. B. auch umgekehrt sein, Eingangstakt mit einer PLL zuerst mal schneller machen). In diesem Fall würde ich aber die Namen anders wählen, damit der intern verwendete Takt "clk" heisst. Wenn aber das Design normalerweise mit clk als Takt läuft und irgendwo lokal dieser slow_clk generiert wird, dann ist das unsauber und sollte wie von dir vorgeschlagen synchron mit einem Clock Enable realisiert werden (beim synchronen Prozess gehört das Clock Enable Signal NICHT in die Sensitiviti Liste)
fpga anfänger schrieb: > mal ne Frage an die Profis ... ich habe mal gehört so was ist unsauber, > da man keinen rising_edge-"Befehl" auf ein anderes Signal als clk > donnern sollte, da die clockplanes sonst nicht sauber sind. Na gut, man muss da ein wenig differenzieren. Du hast ein altes CPLD, da gibt es gar keine Taktnetze und Clockmanager. Also treffen da einige der Fausformeln für FPGAs nicht zu. Nur: wenn man sich schon am Anfang so einen murksigen Beschreibungsstil angewöhnt, dann denkt man später beim Umstieg auf ein FPGA nicht mehr drüber nach... > ist es nicht besser zu schreiben.. > process(slow_clk,clk) > begin if rising_edge(clk) then > if slow_clk == '1' then... usw. Doch, aber es reicht hier, wenn clk in der Sensitivliste steht. Einfach mal kurz drüber nachdenken... > Ich habe auch noch nicht verstanden was diese Prozesse mit Sensitivliste > sollen. Klar funktioniert das und ist im Standard definiert aber mit > wait until, ist es meiner Meinung nach wesendlich sauberer, da nichts > vergessen werden kann (Sensitivliste) und dann nur im Simulator > funktioniert. Meine ich auch... ;-) Aber man muss schon zugeben, dass manche Logik/Kombinatorik mit einem Prozess einfach schöner lesbar ist. > slow_clk ist ein clock enable. Tobias Reinhard schrieb: > In VHDL wäre das wahrscheinlich ein ziemlich kurzes Programm oder? Nein. Es wäre in VHDL kein Programm sondern eine Beschreibung! Denn es heißt nicht umsonst VHDL und nicht VHPL! Christoph Z. schrieb: > slow_clk IST ein Taktsignal (wie richtig geschrieben wurde, muss man > beachten, dass slow_clk asynchron zu clk ist), von daher ist das schon > sauber. Aber WIE dieser Takt gewonnen wurde ist auf einem FPGA insdiskutabel und schlampig.
:
Bearbeitet durch Moderator
@ ralfi (Gast) >Meine Taktfrequenz ist 8MHz, die müsst ich auch noch irgendwie bremsen >auf 1 Hz oder so Dann musst du den Prescaler anpassen. Das ist eine Aufgabe för den Schööööler. >Macht man das am besten mit einem clock enable? Das wurde schon mehrfach gesagt, du must schon mal lesen und nachdenken. Das Forum ist kein Hörbuch. Beitrag "Re: Ampelschaltung mit Coolrunner2"
Lothar Miller schrieb: > Meine ich auch... ;-) > Aber man muss schon zugeben, dass manche Logik/Kombinatorik mit einem > Prozess einfach schöner lesbar ist. Okay ich korrigiere meine Aussage ... Bei getakteten Prozessen verwende ich keine Sensitivlisten. Das nur das clk in der Sensitivliste stehen muss, habe ich verstanden ... Danke
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.