mikrocontroller.net

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


Autor: Heiko Lechner (der_caveman)
Datum:
Angehängte Dateien:

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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

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

Autor: Falk Brunner (falk)
Datum:

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

signal key_old, key_smp: std_logic;
signal cnt: std_logic_vector(7 downto 0);
constant max_cnt : integer:=200;

process(clk)
begin
  if rising_edge(clk) then
    key_smp <= key;       -- abtasten
    if key_smp /= key_old
      cnt <= cnt-1;       
    else
      cnt <= conv_std_logic_vector(max_cnt, 8);
    end if;
    if cnt=0 then
      key_old <= key_smp;
    end if;
  end if;
end process;

Autor: Heiko Lechner (der_caveman)
Datum:

Bewertung
0 lesenswert
nicht 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
>
>
>
> signal key_old, key_smp: std_logic;
> signal cnt: std_logic_vector(7 downto 0);
> constant max_cnt : integer:=200;
> 
> process(clk)
> begin
>   if rising_edge(clk) then
>     key_smp <= key;       -- abtasten
>     if key_smp /= key_old
>       cnt <= cnt-1;
>     else
>       cnt <= conv_std_logic_vector(max_cnt, 8);
>     end if;
>     if cnt=0 then
>       key_old <= key_smp;
>     end if;
>   end if;
> end process;
> 

... 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!

Autor: Heiko Lechner (der_caveman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den Link zum C-Code gibts in der Antwort von Andreas Schwarz

Autor: Gast (Gast)
Datum:

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

Autor: Heiko Lechner (der_caveman)
Datum:

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

Autor: alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
signal        X        :   std_logic;
signal        Y        :   bit;
signal        Z        :   std_logic_vector(3 downto 0);

signal           A                          :              bit;

Wer kann so was lesen?
Warum nicht einfach so:
signal X: std_logic;
signal Y: bit;
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

Autor: Falk Brunner (falk)
Datum:

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

Autor: Heiko Lechner (der_caveman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber nicht bei dessen Drucktaster (rotary pushbutton).

Autor: Christian B (Gast)
Datum:

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

Autor: Andreas (Gast)
Datum:

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

Autor: Jan M. (mueschel)
Datum:

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

Autor: Fpga4u (Gast)
Datum:

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

Autor: Mathi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Fpga4u:

Ein wahres Wort ;-)

Autor: Gast (Gast)
Datum:

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

Autor: Gast2 (Gast)
Datum:

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

Autor: gast3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich sag nur 1 1/2 Jahre

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.
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.

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