Hallo! Ich habe mir das Digilent Spartan3E Board zugelegt und um damit klein anzufangen braucht man ja zumindest funktionierende Taster. Die müssen also entprellt werden- das war meine erste große Aufgabe, die ich mir vorgenommen habe um einzusteigen. Weit bin ich da erst nicht gekommen, also habe ich mir ein VHDL- Buch gekauft und habe hier ein wenig in den Artikeln gestöbert. Danach habe ich mich dann mal an die Aufgabe herangetastet. Dabei benutze ich schon die Aufsplittung in mehrere vhd Dateien und resultierend auch Komponenten. Was dabei herauskam liegt im Anhang- es wäre sehr schön, wenn das mal ein paar erfahrene VHDLer kritisieren könnten. Kurz gesagt tastet der "Entpreller" die Taste ab. War der vorherige Zustand "Taste nicht gedrückt", dann wartet er auf ein high- Signal auf der Leitung und inkrementiert einen Zähler bei jedem abgetasteten high- Signal. Prellt die Taste, dann wird zwischendurch bestimmt mal ein low abgetastet (wenn die Abtastfrequenz "stimmt")- dann wird der Zähler zurückgesetzt und das Spiel beginnt von vorne. Wenn der Zähler "überläuft", dann wurde oft genug der gleiche Zustand abgetastet, man kann davon ausgehen, dass der Pegel am Taster stabil bleibt, der Zustand geht über zu "Taste gedrückt". Um das Ganze zu testen habe ich in der top.vhd noch einen vier bit Zähler implementiert, an dem die LEDs vom Board hängen. Der Zähler wird inkrementiert, wenn die obere Taste gedrückt wird. Die untere Taste wird als Reset benutzt. Ja, das war es erstmal :) Also für Kritik offen- der_caveman ;)
Habe mir den Code nur kurz angesehen, aber das sieht mir reichlich kompliziert aus. Schau dir mal an wie die Entprellung auf einem Mikrocontroller gemacht wird: http://www.mikrocontroller.net/articles/Entprellung#Komfortroutine_.28C_f.C3.BCr_AVR.29 Genauso kannst du es in VHDL umsetzen. Dem Timer-Interrupt entspricht ein Zähler der ein Clock-Enable-Signal erzeugt. Vorteil: du kannst mehrere Tasten gleichzeitig auswerten ohne dass du dazu mehrere Zähler brauchst.
@ Heiko Lechner (der_caveman) >Dabei benutze ich schon die Aufsplittung in mehrere vhd Dateien und >resultierend auch Komponenten. Prinzipiell richtig, aber . . . >Was dabei herauskam liegt im Anhang- es wäre sehr schön, wenn das mal >ein paar erfahrene VHDLer kritisieren könnten. Willst du das wirklich? ;-) >Kurz gesagt tastet der "Entpreller" die Taste ab. War der vorherige Schon mal OK. >"überläuft", dann wurde oft genug der gleiche Zustand abgetastet, man >kann davon ausgehen, dass der Pegel am Taster stabil bleibt, der Zustand >geht über zu "Taste gedrückt". Guter Ansatz. Aber sehr akademisch umgesetzt. MFG Falk P.S. So gehts etwas kompakter
1 | signal key_old, key_smp: std_logic; |
2 | signal cnt: std_logic_vector(7 downto 0); |
3 | constant max_cnt : integer:=200; |
4 | |
5 | process(clk) |
6 | begin
|
7 | if rising_edge(clk) then |
8 | key_smp <= key; -- abtasten |
9 | if key_smp /= key_old |
10 | cnt <= cnt-1; |
11 | else
|
12 | cnt <= conv_std_logic_vector(max_cnt, 8); |
13 | end if; |
14 | if cnt=0 then |
15 | key_old <= key_smp; |
16 | end if; |
17 | end if; |
18 | end process; |
Falk Brunner wrote: >>Was dabei herauskam liegt im Anhang- es wäre sehr schön, wenn das mal >>ein paar erfahrene VHDLer kritisieren könnten. > > Willst du das wirklich? ;-) Klar- wie soll ich sonst was lernen? Ich will hier natürlich keinem irgendetwas aufzwingen. > Guter Ansatz. Aber sehr akademisch umgesetzt. Das kommt davon, wenn man nur Bücher ließt... ;) > P.S. So gehts etwas kompakter > > >
1 | > signal key_old, key_smp: std_logic; |
2 | > signal cnt: std_logic_vector(7 downto 0); |
3 | > constant max_cnt : integer:=200; |
4 | >
|
5 | > process(clk) |
6 | > begin |
7 | > if rising_edge(clk) then |
8 | > key_smp <= key; -- abtasten |
9 | > if key_smp /= key_old |
10 | > cnt <= cnt-1; |
11 | > else |
12 | > cnt <= conv_std_logic_vector(max_cnt, 8); |
13 | > end if; |
14 | > if cnt=0 then |
15 | > key_old <= key_smp; |
16 | > end if; |
17 | > end if; |
18 | > end process; |
19 | >
|
... da verliert man irgendwie den Sinn zur Einfachheit... Den C- Code muss ich mir mal angucken wenn ich etwas Ruhe habe- auf den ersten Blick ist mir da nichts ersichtlich :D Danke erstmal an euch beide!
Den Link zum C-Code gibts in der Antwort von Andreas Schwarz
Mal ne Frage, im Referenzdesign das Xilinx für das Board mitliefert, wird ein Picoblaze genutzt um ein paar Leds blinken zu lassen, Tasten zu benutzen usw. Aber die werden da nicht entprellt oder? Find es zumindest weder im Assembler noch im VHDL-Code.
Ich habe mir nur "Reference design - Rotary encoder and simple LEDs on Spartan-3E Starter Kit (Revision C)" angeschaut, da finde ich auch keine Entprellung für den Drehgeber- Taster, aber in der Dokumentation dazu steht, dass das doch ne prima Lernaufgabe wäre ;)
Hallo, habe mir gerade die Dateien angeschaut. Bitte keine Tabulatoren im Quellcode an den Stellen, wo sie überflüssig sind. Wir sind keine Chinesen, also ich bin zumindest keiner, um von oben nach unten zu lesen, ich meine so was:
1 | signal X : std_logic; |
2 | signal Y : bit; |
3 | signal Z : std_logic_vector(3 downto 0); |
4 | |
5 | signal A : bit; |
Wer kann so was lesen? Warum nicht einfach so:
1 | signal X: std_logic; |
2 | signal Y: bit; |
3 | signal Z: std_logic_vector(3 downto 0); |
Ich weiss nicht, wie es die anderen sehen, ich lese gerne von links nach rechts, und das da oben ist nicht auszuhalten. Ich behaupte, den Code kann man auch nicht mehr debuggen. Ich habe dann einfach aufgehört, den Code weiterzulesen. Gruß, Alex
@ Heiko Lechner (der_caveman) >Spartan-3E Starter Kit (Revision C)" angeschaut, da finde ich auch keine >Entprellung für den Drehgeber- Taster, aber in der Dokumentation dazu >steht, dass das doch ne prima Lernaufgabe wäre ;) Bei richtiger Auswertung eines Drehgebers ist die Entprellung inclusive. MFG Falk
Aber nicht bei dessen Drucktaster (rotary pushbutton).
Die Beiträge zeigen, dass hier keiner wirlich Ahnung von FPGAS / CPLDs hat :) umständlicher gehts ja nicht mehr... baut einfach ein Register dazwischen (am besten auch Registerstufen von 2-3) Registern. Oben genannte Lösungen mögen auch funktionieren, verbraten aber unnötig Logik! siehe auch http://www.unmuth.de/pdf/CPLD_tut_logik.pdf
"Einfach ein Register dazwischen", und wo ist da die Entprellung? Wie schon gesagt, man kann es wie beim Mikrocontroller machen, Code ist oben verlinkt.
Und was machst du wenn a) du einfache Taster, keine Umschalter und keine zwei Ports je Taster verwenden willst? oder b) deine Taster nicht so "ideal" prellen wie in diesem Tutorial gezeigt, sondern Kontakt zwei schon anfaengt mit prellen, bevor Kontakt eins endgueltig aus ist?
conv_std_logic_vector solltet ihr euch von Anfang an abgewöhnen, auch Du Falk! Stattdessen library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; signal ls_example_vec : std_logic_vector(3 downto 0); signal ls_example_int : integer range 0 to 15; begin ls_example_vec <= std_logic_vector(to_unsigned(ls_example_int,4)); gruss Fpga4u
@ Christian B: du hast auch keine Ahnung, die Tastenentprellung macht man normalerweise hardwaremäßig.
wer hat hier kein ahnung? vhdl ist eine hardwarebeschreibungssprache... was kommt da wohl nach der synthese raus?
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.