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