Hallo Leute, ich bin ein Anfänger in VHDL und ich will einen Automaten zur Ansteuerung einer Fahrzeugampel und einer Fußgängerampel. Die LED's für die beiden Ampeln befinden sich auf dem Demoboard auf der rechten Seite. Im Ruhezustand leuchten die Fahrzeugampel grün und die Fußgängerampel rot. Will ein Fußgänger die Fahrbahn überqueren, so betätigt er die Anforderungstaste S11 (roter Taster). Danach erfolgen folgende Schritte: Fahrzeug-Ampel Fußgänger-Ampel Dauer [s] Phase grün rot unbegrenzt Ruhe gelb rot 2 Nach Anf. für Überq. rot rot 2 rot grün 5 Überquerung rot rot 2 Nach Überquerung rot + gelb rot 2 grün rot unbegrenzt Ruhe kann jemand mir dafür helfen. Danke im Voran
Hi, Du musst schon sagen, wobei Du Hilfe brauchst. Werde mal ausführlicher wo es klemmt. Kannst Du mir erstmal sagen, was für ein Demoboard das ist? Nur weil es mich interessiert. Und willst Du, das nach dem Tastendruck sofort die KFZ-Ampel auf Gelb springt? Kann man vll. machen, wenn es sich wirklich nur um eine Fußgängerampel handelt. Aber nicht bei einer Kreuzung. Gruß Fabian
Franklin Delano schrieb: > auf dem Demoboard Was ist denn da drauf? > Danach erfolgen folgende Schritte: Du musst also nur einen Automaten machen, der im Ruhezustand auf einen Tastendruck wartet, und dann die erforderlichen Schritte nacheinander abarbeitet. Der Einfachheit halber würde ich an deiner Stelle einen Zähler erzeugen, der auf 1 Sekunde zählen kann. Den da im Ruhezustand zurücksetzen und auf den (einsynchronisierten und gespeicherten) Fussgängertastendruck warten. Und danach im Sekundentakt eine Farbtabelle abarbeiten... Etwas komplizierter wird es dann, wenn die Zeiten flexibler einstellbar gemacht werden sollen, dann empfiehlt es sich einen Zähler für den Maximalwert zu definieren und den jeweils mit der Wartezeit zu laden... Fabian Hoemcke schrieb: > Und willst Du, das nach dem Tastendruck sofort die KFZ-Ampel auf Gelb > springt? Und ich würde nach dem letzten Schritt erst mal den Autos für ein paar definierte Sekunden Grün geben...
Lothar Miller schrieb: > Etwas komplizierter wird es dann, wenn die Zeiten flexibler einstellbar > gemacht werden sollen, dann empfiehlt es sich einen Zähler für den > Maximalwert zu definieren und den jeweils mit der Wartezeit zu laden... Ich würde es gleich so machen, wie Lothar hier schreibt. Neben der FSM gibt es einen Counter, der beim Sprung in den nächsten State mit einem definierten Wert geladen wird. Im Folgestate wird dann einfach so lange gewartet, bis der Counter abgelaufen ist. Dann erfolgt mit dem Sprung in den nächsten State wieder das Laden mit der Dauer für den darauffolgenden State.. usw...
Ich hätte da mal was zum drüber Nachdenken:
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 | art : out STD_LOGIC; -- Auto rot |
8 | age : out STD_LOGIC; -- Auto gelb |
9 | agn : out STD_LOGIC; -- Auto grün |
10 | frt : out STD_LOGIC; -- Fussgänger rot |
11 | fgn : out STD_LOGIC; -- Fussgänger grün |
12 | ft : in STD_LOGIC); -- Fussgängertaster |
13 | end Ampel; |
14 | |
15 | architecture Behavioral of Ampel is |
16 | -- constant onesec: integer := 50000000; -- 50MHz
|
17 | constant onesec: integer := 5000; -- Takt 5kHz |
18 | signal ftsr : std_logic_vector (3 downto 0); -- ft eintakten und Flanke erkennen |
19 | signal tic : integer range 0 to 5*onesec := 0; -- Zähler bis max. 5 sec |
20 | signal schritt : integer range 0 to 6 := 0; |
21 | begin
|
22 | |
23 | process begin |
24 | wait until rising_edge(CLK); |
25 | if (tic/=0) then |
26 | tic <= tic - 1; |
27 | end if; |
28 | ftsr <= ftsr(2 downto 0) & ft; -- Einsynchronisieren (hilft gegen amoklaufende FSM) |
29 | if (schritt=0 and ftsr="0111") then -- Flanke erkennen (hilft gegen Dauerbetätigung und defekte Taster) |
30 | schritt <= 1; -- Flanke erkannt: los gehts |
31 | tic <= 2*onesec; |
32 | end if; |
33 | |
34 | if (tic=0) then -- Zeit abgelaufen (na gut, ein Takt zu lang, aber bei 50M macht das nicht so viel aus): nächster Schritt |
35 | art <= '0'; -- Defaultwerte (sparen Tipparbeit): Ampel aus |
36 | age <= '0'; |
37 | agn <= '0'; |
38 | frt <= '0'; |
39 | fgn <= '0'; |
40 | case schritt is |
41 | when 0 => agn <= '1'; |
42 | frt <= '1'; |
43 | |
44 | when 1 => age <= '1'; |
45 | frt <= '1'; |
46 | tic <= 2*onesec; |
47 | schritt <= 2; |
48 | |
49 | when 2 => art <= '1'; |
50 | frt <= '1'; |
51 | tic <= 2*onesec; |
52 | schritt <= 3; |
53 | |
54 | when 3 => art <= '1'; |
55 | fgn <= '1'; |
56 | tic <= 5*onesec; |
57 | schritt <= 4; |
58 | |
59 | when 4 => art <= '1'; |
60 | frt <= '1'; |
61 | tic <= 2*onesec; |
62 | schritt <= 5; |
63 | |
64 | when 5 => art <= '1'; |
65 | age <= '1'; |
66 | frt <= '1'; |
67 | tic <= 2*onesec; |
68 | schritt <= 6; |
69 | |
70 | when 6 => agn <= '1'; |
71 | frt <= '1'; |
72 | tic <= 5*onesec; |
73 | schritt <= 0; |
74 | |
75 | end case; |
76 | end if; |
77 | end process; |
78 | |
79 | end Behavioral; |
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.