Forum: FPGA, VHDL & Co. Erster Versuch in VHDL (Taster entprellen)- so in Ordnung?


von Heiko L. (der_caveman)


Angehängte Dateien:

Lesenswert?

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 ;)

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@ 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;

von Heiko L. (der_caveman)


Lesenswert?

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!

von Heiko L. (der_caveman)


Lesenswert?

Den Link zum C-Code gibts in der Antwort von Andreas Schwarz

von Gast (Gast)


Lesenswert?

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.

von Heiko L. (der_caveman)


Lesenswert?

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 ;)

von alex (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@ 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

von Heiko L. (der_caveman)


Lesenswert?

Aber nicht bei dessen Drucktaster (rotary pushbutton).

von Christian B (Gast)


Lesenswert?

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

von Andreas (Gast)


Lesenswert?

"Einfach ein Register dazwischen", und wo ist da die Entprellung? Wie 
schon gesagt, man kann es wie beim Mikrocontroller machen, Code ist oben 
verlinkt.

von Jan M. (mueschel)


Lesenswert?

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?

von Fpga4u (Gast)


Lesenswert?

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

von Mathi (Gast)


Lesenswert?

@Fpga4u:

Ein wahres Wort ;-)

von Gast (Gast)


Lesenswert?

@  Christian B: du hast auch keine Ahnung, die Tastenentprellung macht 
man normalerweise hardwaremäßig.

von Gast2 (Gast)


Lesenswert?

wer hat hier kein ahnung? vhdl ist eine hardwarebeschreibungssprache... 
was kommt da wohl nach der synthese raus?

von gast3 (Gast)


Lesenswert?

ich sag nur 1 1/2 Jahre

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.