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