Ampelsteuerungsprogramm

Gast #5694522
Lesenswert?

Bei ft steht als Kommentar Fussgängertaster dahinter, und wenn dir die 
Bitkonkatenation
ftsr <= ftsr(2 to 0) & ft nichts sagt, solltest du nochmal VHDL 
Grundbedeutungen des Schieberegisters erlernen, und warum man Taster 
nicht direkt einlesen darf sondern entprellen und synchronisieen muss,

und tic sagt wie viele CLK passieren müssen bis der nächste Zustand 
kommt.
Gast #5694939
Lesenswert?

Wenn Ich den Taster nur einmal ganz kurz betätige kann in das 
Schieberegister "0111" geschrieben werden ?

Würde es auch funktionieren wenn Ich schreibe:

tic<= tic + 1;

tic zählt ja die positiven Signale der Clk, also ist der Teil bevor im 
Programm steht:

if ( tic = 0) then
....

ist nur dafür da um den Zähler zu definieren ?
Moderator (Firma: Titel) Persönliche Seite #5694983
Lesenswert?

Mo schrieb:
> Wenn Ich den Taster nur einmal ganz kurz betätige kann in das
> Schieberegister "0111" geschrieben werden ?
Ja, aber bei 50 MHz Taktfrequenz ändert sich das dann 20 ns später schon 
wieder. Und zudem wird die "0111" auch bei einem langen Tastendruck 
auftreten. Und zwar immer etwa 60ns nachdem die Taste gedrückt wurde...

Wie gesagt: leg da einfach mal in einer Testbench einen Takt an und 
schau, was passiert.
Gast #5697431
Lesenswert?

Brauche Ich für die Verwirklichung der Programms ein Schieberegister ?

In dem Skript des Ich zur Verfügung habe wird für ein Automat nur die 
FSM eingeführt.

Meine Clock läuft mir einer Frequenz von 1Hz müsste Ich dann auch die 
Konstante onesec auf 1Hz runter takten ?
Moderator (Firma: Titel) Persönliche Seite #5699243
Lesenswert?

Mo schrieb:
> Brauche Ich für die Verwirklichung der Programms ein Schieberegister ?
Für die Beschreibung (ich werde das Wort weiter verwenden, weil es ja 
VHDL und nicht VHPL heißt) brauchst du kein Schieberegister. Die 
Beschreibung der Entprellung mit Schieberegister ist halt einfach viel 
kürzer, verständlicher und übersichtlicher. Und man "programmiert" sie 
nicht wie wenn man einen µC "programmiert", sonder man denkt durch die 
andere Schreibweise auch ganz anders, was im Prinzip ja auch nicht 
schlecht ist.


Eine Entprellung/Flankenerkennung wie im 
Beitrag "Stoppuhr Normal/Addition/Split, Funktion abhängig von "Taktrate"" ist halt einfach 
unleserlich und lang:
1
--Button C entprellen
2
:
3
type ZUSTAENDE_ENTPRELLEN is (A,B,C);
4
:
5
:
6
signal ZUSTAND_BTNC_ENTP, FOLGEZUSTAND_BNTC_ENTP : ZUSTAENDE_ENTPRELLEN := A;
7
:
8
:
9
ZUSTANDSAKTUALISIERUNG_BTNC_ENTPRELLEN: PROCESS (takt, reset)
10
begin
11
    if reset = '0' then ZUSTAND_BTNC_ENTP <= A;
12
    elsif rising_edge(takt) then ZUSTAND_BTNC_ENTP <= FOLGEZUSTAND_BNTC_ENTP;
13
    end if;
14
end PROCESS ZUSTANDSAKTUALISIERUNG_BTNC_ENTPRELLEN;
15

16
FOLGEZUSTANDSBERECHNUNG_BTNC_ENTPRELLEN: PROCESS (BTNC, ZUSTAND_BTNC_ENTP)
17
begin
18
    case ZUSTAND_BTNC_ENTP is
19
        when A => 
20
            if BTNC = '0' then FOLGEZUSTAND_BNTC_ENTP <= A;
21
            else FOLGEZUSTAND_BNTC_ENTP <= B;
22
            end if;
23
            ButtonCEntprellt <= '0';
24
        when B =>
25
            FOLGEZUSTAND_BNTC_ENTP <= C;
26
            ButtonCEntprellt <= '1';
27
        when C =>
28
            if BTNC = '1' then FOLGEZUSTAND_BNTC_ENTP <= C;
29
            else FOLGEZUSTAND_BNTC_ENTP <= A;
30
            end if;
31
            ButtonCEntprellt <= '0';
32
    end case;
33
end PROCESS FOLGEZUSTANDSBERECHNUNG_BTNC_ENTPRELLEN;
Dieser Code hier macht z.B. ganz ohne Prozess (funktionell) genau das 
selbe wie oben:
1
:
2
:
3
    signal ButtonCsr : std_logic_vector 
4
:
5
    ButtonCsr <= ButtonCsr(1 downto 0) & BTNC when rising_edge(takt);   -- einsynchronisieren
6
    ButtonCEntprellt <= '1' when ButtonCsr(3 downto 2) = "01";          -- steigende Flanke
Zudem "entprellt" der vorige längliche Code gar nichts, sondern er ist 
eine simple, wenn auch umständliche Flankenerkennung. Ich bin mir nicht 
mal ganz schlüssig, ob die Beschreibung via FSM durch die 3 Zustände und 
eine Umsetzung in 2 Flipflops evtl. sogar Probleme in diese Richtung 
haben könnte:
http://www.lothar-miller.de/s9y/archives/64-State-Machine-mit-asynchronem-Eingang.html

> In dem Skript des Ich zur Verfügung habe wird für ein Automat nur die
> FSM eingeführt.
Schon ein simpler Zähler ist ein Automat, eine einfache FSM, weil er ja 
eine bekannte Schrittfolge mit endlich vielen Schritten in definierter 
Reihenfolge abarbeitet. Schon ein Flipflop, das (z.B. auch abhängig von 
irgendwelchen äusseren Signalen) vor sich hin toggelt, ist ein Automat.

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