mikrocontroller.net

Forum: FPGA, VHDL & Co. Ampelsteuerungsprogramm


Autor: Mo (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Mo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
--Button C entprellen
:
type ZUSTAENDE_ENTPRELLEN is (A,B,C);
:
:
signal ZUSTAND_BTNC_ENTP, FOLGEZUSTAND_BNTC_ENTP : ZUSTAENDE_ENTPRELLEN := A;
:
:
ZUSTANDSAKTUALISIERUNG_BTNC_ENTPRELLEN: PROCESS (takt, reset)
begin
    if reset = '0' then ZUSTAND_BTNC_ENTP <= A;
    elsif rising_edge(takt) then ZUSTAND_BTNC_ENTP <= FOLGEZUSTAND_BNTC_ENTP;
    end if;
end PROCESS ZUSTANDSAKTUALISIERUNG_BTNC_ENTPRELLEN;

FOLGEZUSTANDSBERECHNUNG_BTNC_ENTPRELLEN: PROCESS (BTNC, ZUSTAND_BTNC_ENTP)
begin
    case ZUSTAND_BTNC_ENTP is
        when A => 
            if BTNC = '0' then FOLGEZUSTAND_BNTC_ENTP <= A;
            else FOLGEZUSTAND_BNTC_ENTP <= B;
            end if;
            ButtonCEntprellt <= '0';
        when B =>
            FOLGEZUSTAND_BNTC_ENTP <= C;
            ButtonCEntprellt <= '1';
        when C =>
            if BTNC = '1' then FOLGEZUSTAND_BNTC_ENTP <= C;
            else FOLGEZUSTAND_BNTC_ENTP <= A;
            end if;
            ButtonCEntprellt <= '0';
    end case;
end PROCESS FOLGEZUSTANDSBERECHNUNG_BTNC_ENTPRELLEN;
Dieser Code hier macht z.B. ganz ohne Prozess (funktionell) genau das 
selbe wie oben:
:
:
    signal ButtonCsr : std_logic_vector 
:
    ButtonCsr <= ButtonCsr(1 downto 0) & BTNC when rising_edge(takt);   -- einsynchronisieren
    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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.