Forum: FPGA, VHDL & Co. 4 Buttons entprellen


von Christian F (Gast)


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!

von Christian F (Gast)


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.

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


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

von Christian F (Gast)


Lesenswert?

danke dir! Ich glaube es ist eine gute Idee für mich erst mal noch 
kleine Brötchen zu backen und zu gucken ob das für den Gesamtüberblick 
hilfreich ist...

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.