4 Buttons entprellen

Gast #4231815
Lesenswert?

Hallo zusammen,

ich arbeite mich noch einmal neu, kleinschrittig in programmierbare 
Logik ein. Und schon habe ich etwas gefunden was ich nicht hinbekomme. 
Vielleicht könnt ihr mir helfen?

Ich möchte für die 4 pushbuttons des Nexys2 für spätere Projekte eine 
Komponente machen.
1
entity nexys2_btn is
2
   Generic(g_fclk : integer := 50000000;
3
        g_buttons : integer := 4);
4
    Port ( isl_clk : in  STD_LOGIC;
5
           islv_btn : in  STD_LOGIC_VECTOR (g_buttons-1 downto 0);
6
           osl_btn : out  STD_LOGIC_VECTOR (g_buttons-1 downto 0));
7
end nexys2_btn;
8

9
architecture Behavioral of nexys2_btn is
10
  signal slv_btn1 : std_logic_vector(g_buttons-1 downto 0) := (others=>'0');
11
  signal slv_btn2 : std_logic_vector(g_buttons-1 downto 0) := (others=>'0');
12
  signal slv_btn3 : std_logic_vector(g_buttons-1 downto 0) := (others=>'0');
13
  signal i_clkdiv : integer range 0 to g_fclk/20-1 := 0;
14
begin
15

16
shift_in : process begin
17
  wait until rising_edge(isl_clk);
18
  if( i_clkdiv < g_fclk/20-1) then
19
    i_clkdiv <= i_clkdiv + 1;
20
  else
21
    i_clkdiv <= 0;
22
    slv_btn3 <= slv_btn2;
23
    slv_btn2 <= slv_btn1;
24
    slv_btn1 <= islv_btn;
25
  end if;
26
end process shift_in;
27

28
osl_btn <= slv_btn1 and slv_btn2 and not slv_btn3; --funktioniert das für den ganzen Vektor? Und wie nur einen schnellen clock lang?
29

30

31
end Behavioral;

Ich habe die Hardware erst mal in den Schrank gelegt und versuche mich 
nur mit ise. In folgender Testbench wird aber gar nichts in die 3 
Vektoren slv_btn1...slv_btn3 geschrieben. Ich habe die weiße Fahne in 
der Hand und änge fest.
Testbench bekommt folgende Muster. Der Rest ist der Auto-Code von Ise, 
also eigentlich nur component und Takterzeugung.
1
   -- Stimulus process
2
   stim_proc: process
3
   begin    
4
      -- hold reset state for 100 ns.
5
      wait for 100 ns;  
6

7
islv_btn <= "1000";
8
wait for 1 ms;
9
islv_btn <= "0001";
10
wait for 1 ms;
11
islv_btn <= "0010";
12
wait for 1 ms;
13
islv_btn <= "0001";
14
wait for 1 ms;
15
islv_btn <= "0011";
16
wait for 1 ms;
17
islv_btn <= "1111";
18
wait for 1 ms;
19
islv_btn <= "1101";
20
wait for 1 ms;
21
islv_btn <= "1111";
22
wait for 1 ms;
23
islv_btn <= "1111";
24
wait for 1 ms;
25
islv_btn <= "1111";
26
wait for 1 ms;
27

28
      wait;
29
   end process;


Was mache ich nicht richtig? Und als zweite Frage: wie könnte ich es 
erreichen, dass beim erreichen der Entprellbedingung "110" also der 
Flanke nur einen schnellen Takt lang das bit im osl_btn gesetzt wäre?

Vielen Dank!
Gast #4231828
Lesenswert?

Jetzt wo ich gepostet habe, habe ich den Fehler bemerkt. Ich entprelle 
mit 1/20 s, da kann ja im 1 ms Bereich auch nichts zu sehen sein. :-)

Aber die zweite Frage steht dennoch im Raum: wenn ich einen schnellen 
clock lang nur den Ausgang am entprellten bit gesetzt haben möchte, wie 
könnte ich das am besten einbauen? Die Flanken wwerden ja so einen 
geteilten Takt lang detektiert.
Moderator (Firma: Titel) Persönliche Seite #4232028
Lesenswert?

Probiers mal so:
1
shift_in : process begin
2
  wait until rising_edge(isl_clk);
3
  if( i_clkdiv < g_fclk/20-1) then
4
    i_clkdiv <= i_clkdiv + 1;
5
    osl_btn <= (others=>'0');
6
  else
7
    i_clkdiv <= 0;
8
    slv_btn3 <= slv_btn2;
9
    slv_btn2 <= slv_btn1;
10
    slv_btn1 <= islv_btn;
11
    osl_btn <= slv_btn1 and slv_btn2 and not slv_btn3;
12
  end if;
13
end process shift_in;
Da kommt der Taster zwar ein wenig später, aber das wird schon keiner 
merken... ;-)

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