Forum: FPGA, VHDL & Co. Ampelsteuerungsprogramm


von Mo (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe die angehängte Datei in einem anderen Forenbeitrag gefunden, 
aber
was mit dem Signal ftsr und dem Signal tic passiert kann Ich nicht ganz 
nach vollziehen.

Danke schonmal im Vorraus

von MaWin (Gast)


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.

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


Lesenswert?

Mo schrieb:
> aber was mit dem Signal ftsr und dem Signal tic passiert kann Ich nicht
> ganz nach vollziehen.
Sieh dir mal das an:
http://www.lothar-miller.de/s9y/categories/5-Entprellung
Und auch, wie ein Schieberegister in VHDL aussieht.

von Mo (Gast)


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 ?

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


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.

: Bearbeitet durch Moderator
von Mo (Gast)


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 ?

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


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.

: Bearbeitet durch Moderator
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.