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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.