Ich hatte einige Probleme mit der Entprellung auf einer Taste, also suchte ich bei Google nach einer Lösung für mein Entprellungsproblem.
Ich habe diesen Code gefunden:
Was den Trick zu tun scheint, aber ich habe Schwierigkeiten, den Code zu verstehen, und es funktioniert.
Könnte jemand erklären, wie dieser Code funktioniert und wie/wo ich ihn ändern kann, damit ich eine LED ein- und ausschalte.
Ich habe versucht, es hier ein wenig zu ändern
LIBRARY ieee;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;
ENTITY debounce IS
GENERIC(
counter_size : INTEGER := 19); --counter size (19 bits gives 10.5ms with 50MHz clock)
PORT(
clk : IN STD_LOGIC; --input clock
button : IN STD_LOGIC; --input signal to be debounced
result : OUT STD_LOGIC; --debounced signal
LED : out std_logic_vector(3 downto 0);
Segment: out std_logic_vector (7 downto 0);
AN: out std_logic
);
END debounce;
ARCHITECTURE logic OF debounce IS
SIGNAL flipflops : STD_LOGIC_VECTOR(1 DOWNTO 0); --input flip flops
SIGNAL counter_set : STD_LOGIC; --sync reset to zero
SIGNAL counter_out : STD_LOGIC_VECTOR(counter_size DOWNTO 0) := (OTHERS => '0'); --counter output
signal counter_10: integer range 0 to 9 := 0;
signal counter_10r: std_logic_vector(7 downto 0);
BEGIN
counter_set <= flipflops(0) xor flipflops(1); --determine when to start/reset counter
An <= '1';
PROCESS(clk)
BEGIN
IF(clk'EVENT and clk = '1') THEN
flipflops(0) <= button;
flipflops(1) <= flipflops(0);
If(counter_set = '1') THEN --reset counter because input is changing
counter_out <= (OTHERS => '0');
ELSIF(counter_out(counter_size) = '0') THEN --stable input time is not yet met
counter_out <= counter_out + 1;
ELSE --stable input time is met
result <= flipflops(1);
counter_10 <= counter_10 + 1;
case counter_10 is
when 0 => counter_10r <= "01000000";
when 1 => counter_10r <= "01111001";
when 2 => counter_10r <= "00100100";
when 3 => counter_10r <= "00110000";
when 4 => counter_10r <= "00011001";
when 5 => counter_10r <= "00010010";
when 6 => counter_10r <= "00000010";
when 7 => counter_10r <= "01111000";
when 8 => counter_10r <= "00000000";
when 9 => counter_10r <= "00010000";
when others => counter_10r <= "00000000";
end case;
LEd <= conv_std_logic_vector(counter_10,4);
segment <= counter_10r;
END IF;
END IF;
END PROCESS;
END logic;
Aber es scheint nicht zu funktionieren, die LED leuchtet ständig...
Da Sie keine spezifischen Schwierigkeiten identifiziert haben, hier ein kurzer Überblick. Wenn es Punkte gibt, die Sie immer noch nicht verstehen, stellen Sie in den Kommentaren unten weitere Fragen.
flipflops
wird verwendet, um einen Kantendetektor zu erstellen; counter_set
pulsiert jedes Mal hoch, wenn es einen Eingangsübergang gibt. (Beachten Sie, dass dies ein schlechtes Design ist – da button
es sich um eine asynchrone Eingabe handelt, sollte mindestens ein weiteres Flipflop vorhanden sein, um die Wahrscheinlichkeit einer Metastabilität zu verringern.)
Jedes Mal counter_set
, wenn es hoch pulsiert, counter_out
wird gelöscht; andernfalls zählt es hoch, bis das MSB gesetzt wird, zu welchem Zeitpunkt result
es auf den gleichen Zustand wie gesetzt wird button
.
Als Demo erhöht sich der Code counter_10
bei jedem entprellten Übergang (sowohl von niedrig nach hoch als auch von hoch nach niedrig), der dann für eine 7-Segment-Anzeige decodiert wird. Stattdessen könnten Sie Ihre LED umschalten. Wenn Sie möchten, dass die LED nur an einer Kante und nicht an der anderen umschaltet, machen Sie sie bedingt result
.
Ignacio Vazquez-Abrams
Carlton Banken