Gast
#1231458
Hallo, ich habe ein für mich aktuell nicht zu lösendes Problem. Obwohl vermulich Trivial. Es soll nach einem Tastendruck eine bestimmte Aktion ausgeführt werden, solange, bis eine weitere Taste gedrückt wird. Diese Aktion ist dann wiederrum vom Systemclock abhängig. Egal, welche Methode ich bisher versucht habe, es klappte nicht so, wie es sollte. Zum Test habe ich ein einfaches Beispiel genommen: wenn am FPGA die Taste (TAST_W) gedrückt wird, soll er anfangen und hochzählen, die LEDs (8Stück) sollen entsprechend leuchten. Wenn eine Reset-Taste (TAST_C) gedrückt wird, sollen die LEDs auf 00000000 rückgesetzt werden und aufgehört werden zu zählen. Zählen und Leuchten klappt ;) . Aber dass der FPGA nach dem Tastendruck, also auch, nachdem ich die Taste dann wieder loslasse weitermacht, bis ich z.B. eine andere Taste drücke, das klappt nicht. --------------------------------------- library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Logic is Port (CLK : in bit; TAST_C, TAST_W: in std_logic; -- Taster LED : out std_logic_vector(7 downto 0)); -- LED end Logic; architecture Tasten of Logic is signal sigled : std_logic_vector (7 downto 0):= "00000000"; signal delay_ctr : std_logic_vector(25 downto 0) := "00000000000000000000000000"; signal clk_div : std_logic; signal clk_flank : std_logic; delay: process (clk, TAST_C) -- nur damit ich das Zaehlen auch sehe begin if (TAST_C = '1') then -- c-Taste = reset delay_ctr<="00000000000000000000000000"; elsif (clk'event) and (clk='1') then delay_ctr<=delay_ctr+"00000000000000000000000001"; if delay_ctr="11111111111111111111111111" then delay_ctr<="00000000000000000000000000"; clk_div <= '1'; else clk_div <= '0'; end if; end if; end process delay; ---------------------------------------------------------------------- --ab hier poste ich jetzt mal drei versuchte Varianten, wobei das nicht alle sind --Variante 1: P_LED: process (clk_div, TAST_C, TAST_W) begin if (TAST_C = '1') then sigled <= "00000000"; elsif (TAST_W = '1') then if (clk_div'event) and (clk_div='1') then sigled <= sigled + 1; end if; end if; end process P_LED; -- => solange Taste gedrückt wird, wird gezählt ---------------------------------------------------------------------- -- Variante 2 flanke: process (clk_div, TAST_W) begin if (clk_div'event) and (clk_div='1') then if (TAST_W ='1') then clk_flank <= '1'; else clk_flank <= '0'; end if; end if; end process flanke; P_LED: process (clk_flank, TAST_C, TAST_W) begin if (TAST_C = '1') then sigled <= "00000000"; elsif (clk_flank'event) and (clk_flank='1') then sigled <= sigled + 1; end if; end process P_LED; -- => für jedes +1 muss Taste gedrückt werden ---------------------------------------------------------------------- -- Variante 3 P_LED: process (clk_div, TAST_C, TAST_W) begin wait until rising_edge(TAST_W); if (clk_div'event) and (clk_div='1') then sigled <= sigled + 1; end if; end process P_LED; -- => geht nicht: "statement WAIT not allowed in a process with a sensitivity list" -- (auch wenn ich die Zeile mit clk_div'event... weglasse) ---------------------------------------------------------------------- Wo bitte ist mein Denkfehler? Wie muss es richtig lauten? Danke und Grüße Arna