Forum: FPGA, VHDL & Co. Debounce-Entity und Architecture in Zusammenhang mit Sate-Machine nutzen


von Ulrich R. (Gast)


Lesenswert?

Hallo,

ich bin noch ein Neuling im VHDL programmieren.
Ich besitze ein ARTY A7 mit ARTIX-7 35T.

Ich versuch mir aus Code-Beispielen gerade ein kleines Programm zu 
schreiben, das beim ersten Mal Schalter schieben eine LED einschaltet 
und nach 3 mal Schiebeschalter betätigen diese LED wieder ausschaltet.

Ich wollte zum Spaß den Debounce-Code von Lothar Miller nutzen um den 
Schiebeschalter zu entprellen.

Mir ist klar, dass es sicher deutlich einfacher geht, aber ich würde 
gerne mal prototypenhaft eine andere Entity und Architecture in der 
Haupt-Architecture nutzen.


Die LED leuchtet zwar, aber deutlich schwächer als sonst, daher kommen 
sich da wohl ein paar Signale in die Quere.


Ich gebe zu, dass ich offenbar die Nutzung von Components nicht so ganz 
überrissen habe, wie müsste ich denn den Code umschreiben, um die 
Debounce-Entity und Architecture quasi als Modul nutzen zu können?


Beste Grüße
Ulrich

Anbei mein Code
1
----------------------------------------------------------------------------------
2
3
4
library IEEE;
5
use IEEE.STD_LOGIC_1164.ALL;
6
use IEEE.numeric_std.ALL;
7
8
entity Debounce is
9
    Port ( clk    : in  STD_LOGIC;
10
           keyin  : in  STD_LOGIC;
11
           keyout : out  STD_LOGIC);
12
end Debounce;
13
14
architecture Behavioral_Debounce of Debounce is
15
signal keydeb : std_logic := '0';
16
signal debcnt : integer range 0 to 1000 := 0;
17
begin
18
   process begin
19
      wait until rising_edge(clk);
20
      -- XOR
21
      if (keyin=keydeb) then debcnt <= 0;
22
      else                   debcnt <= debcnt+1;
23
      end if;
24
      -- Latch
25
      if (debcnt=1000) then keydeb <= keyin; 
26
      end if;
27
   end process;
28
   keyout <= keydeb;
29
30
end Behavioral_Debounce;
31
32
33
34
35
----------------------------------------------------------------------------------
36
37
library IEEE;
38
use IEEE.STD_LOGIC_1164.ALL;
39
use IEEE.std_logic_unsigned.all;
40
41
42
entity ArtyA7Controller is
43
    Port ( 
44
           SW       : in  STD_LOGIC_VECTOR (3 downto 0);
45
           CLK       : in  STD_LOGIC;
46
           LED       : out STD_LOGIC_VECTOR (3 downto 0)
47
        );
48
end ArtyA7Controller;
49
50
51
52
architecture Behav of ArtyA7Controller is
53
54
    type state_t is ( Tasteneingabe, Pulszaehler); 
55
    signal Zustandsmaschine : state_t := Tasteneingabe; 
56
    --signal DebounceIn    : STD_LOGIC := '0';
57
    signal DebounceOut    : STD_LOGIC := '0';
58
    
59
    signal Zaehler         : integer RANGE 0 to 1000000000; 
60
    
61
62
    component Debounce
63
    Port ( clk    : in  STD_LOGIC;
64
           keyin  : in  STD_LOGIC := '0';
65
           keyout : out  STD_LOGIC := '0');
66
    end component;
67
68
begin
69
70
debounce1: Debounce 
71
Port Map (
72
    clk => clk,
73
    keyin => SW(0),
74
    keyout => DebounceOut
75
);
76
77
78
79
Prozess1:  process(CLK) begin
80
if rising_edge (CLK) then
81
82
    case Zustandsmaschine is
83
84
    when Tasteneingabe =>
85
        
86
        if DebounceOut = '1' then
87
            LED(0) <= '1';
88
            Zustandsmaschine <= Pulszaehler;
89
        else
90
            Zustandsmaschine <= Tasteneingabe;
91
        end if;
92
       
93
    when Pulszaehler =>
94
        
95
        Zaehler <= Zaehler +1;
96
        if Zaehler > 2 then
97
            LED(0) <= '0';
98
            Zustandsmaschine <= Tasteneingabe;
99
       else
100
            Zustandsmaschine <= Tasteneingabe;
101
       end if;
102
       
103
       when others =>
104
            LED(3) <= '1';
105
         
106
       
107
    end case;
108
end if;
109
end process;
110
111
end architecture;

von Duke Scarring (Gast)


Lesenswert?

Welche Frequenz hat den Dein Takt?

Ulrich R. schrieb:
> use IEEE.std_logic_unsigned.all;
Bitte verwende nur die ieee.numeric_std.all, auch wenn diverse Bücher 
und Codebeispiele was anderes suggerieren. Außer Du weisst genau, was Du 
tust.

Möglicherweise hast Du auch noch einen logischen Fehler in Debounce.
Hast Du mal eine Testbench dazu, damit man das in der Simulation 
nachvollziehen kann?

Duke

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ulrich R. schrieb:
> Die LED leuchtet zwar, aber deutlich schwächer als sonst
Und zwar nur, wenn du die Taste drückst? Das wäre ganz einfach 
erklärbar, man sieht es in einer Simulation sicher schnell, wie der bei 
gedrückter Taste ständig zwischen den Zuständen hin- und herspringt.

Noch ein Wort zum überflüssigen "when others", das dir der Synthesizer 
sicher als "nicht erreichbar" vor den Latz knallt:
http://www.lothar-miller.de/s9y/categories/25-when-others

Duke Scarring schrieb:
> Bitte verwende nur die ieee.numeric_std.all, auch wenn diverse Bücher
> und Codebeispiele was anderes suggerieren.
Immerhin meidet Peter Ashenden in seinen Büchern die alten Synopsys Libs 
wie der Teufel das Weihwasser.

: 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
Noch kein Account? Hier anmelden.