Erster Versuch in VHDL (Taster entprellen)- so in Ordnung?

#774407
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 ;)
Angehängte Dateien:
Admin Persönliche Seite #774429
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.
#774554
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;
#774688
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!
Gast #775072
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
Gast #842040
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren