VHDL-FPGA-Entprellung

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:

http://eewiki.net/pages/viewpage.action?pageId=4980758#DebounceLogicCircuit(withVHDLexample)-TheoryofOperation

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

"Die LED"? Der Code ist für eine 7-Segment-Anzeige ausgelegt.
Sowohl Segment als auch LED .. kümmern sich nicht um den Segmentteil.

Antworten (1)

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.

flipflopswird verwendet, um einen Kantendetektor zu erstellen; counter_setpulsiert jedes Mal hoch, wenn es einen Eingangsübergang gibt. (Beachten Sie, dass dies ein schlechtes Design ist – da buttones 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_outwird gelöscht; andernfalls zählt es hoch, bis das MSB gesetzt wird, zu welchem ​​Zeitpunkt resultes auf den gleichen Zustand wie gesetzt wird button.

Als Demo erhöht sich der Code counter_10bei 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.

Die Idee mit diesem Code war, den LED-Zustand vom Ein- und Ausschalten zu ändern. Wenn ich sie das erste Mal drücke, sollte die LED aufleuchten. Wenn ich sie das nächste Mal drücke, sollte sie die LED ausschalten.