Forum: FPGA, VHDL & Co. Ampelsteuerung


von Franklin D. (Firma: hochschule) (franklino)


Lesenswert?

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

von Kabelbaum (Gast)


Lesenswert?

Das Skript der zugehörigen LVA kann das sicherlich...

von Fabian H. (Firma: Technische Universität Berlin) (brein)


Lesenswert?

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

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


Lesenswert?

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...

von Schlumpf (Gast)


Lesenswert?

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...

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


Lesenswert?

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
Noch kein Account? Hier anmelden.