Thaddäus schrieb:
> OK, das ganze ist also doch ein Problem. ISE Meckert über das hier
1 |
|
2 | process(set, reset)
|
3 | begin
|
4 | if(rising_edge(reset))then
|
5 | out_int <= '0' after 5 ns;
|
6 | end if;
|
7 | if(rising_edge(set))then
|
8 | out_int <= '1' after 5 ns;
|
9 | end if;
|
10 | end process;
|
Nachdem deine VHDL-Beschreibung ja letzlich in reale Hardware umgesetzt
werden soll, kannst du nur Bauelemente verwenden, die es auf FPGAs/CPLDs
gibt. Ein solches Bauteil wie du es beschreibst (mit 2 Takteingängen)
ist dort nicht vorhanden. Du mußt deine Denkweise mehr in Richtung
Hardware überarbeiten...
> Damit soll eine art Lauflicht (Details spielen hier keine Rolle)
> einen Schritt weiter laufen, aber eben nur EINEN Schritt pro
> Tastendruck, und nicht 100, nur weil der Taster 100 Takte
> lang gedrückt ist. Ich brauch quasi die Funktionalität eines
> SET/RESET-FlipFlops, welches aber nur auf Flanken reagiert.
Du brauchst eine Flankenerkennung.
> Kann mir jemand einen Anstoss geben?
Flankenerkennung:
http://www.lothar-miller.de/s9y/categories/18-Flankenerkennung
Lauflicht:
http://www.lothar-miller.de/s9y/archives/61-Lauflicht.html
Ergibt zusammen:
1 | library IEEE;
|
2 | use IEEE.STD_LOGIC_1164.ALL;
|
3 | use IEEE.NUMERIC_STD.ALL;
|
4 |
|
5 | entity Lauflicht is
|
6 | Port ( clk : in STD_LOGIC;
|
7 | button : in std_logic;
|
8 | leds : out STD_LOGIC_VECTOR (7 downto 0));
|
9 | end Lauflicht;
|
10 |
|
11 | architecture Behavioral of Lauflicht is
|
12 | signal buttonsr : std_logic_vector (2 downto 0) := "000";
|
13 | signal rise : std_logic;
|
14 | signal sr : std_logic_vector (7 downto 0) := "10000000";
|
15 |
|
16 | begin
|
17 | process begin -- Einsynchronisieren und Flankenerkennung
|
18 | wait until rising_edge(clk);
|
19 | buttonsr <= buttonsr(1 downto 0) & button;
|
20 | end process;
|
21 | rise <= '1' when buttonsr(2)='0' and buttonsr(1)='1' else '0';
|
22 |
|
23 | process begin -- das Lauflicht
|
24 | wait until rising_edge(clk);
|
25 | if (rise='1') then -- steigende Flanke
|
26 | if (sr="00000001") then
|
27 | sr <= "10000000";
|
28 | else
|
29 | sr <= '0' & sr(7 downto 1);
|
30 | end if;
|
31 | end if;
|
32 | end process;
|
33 |
|
34 | leds <= sr;
|
35 |
|
36 | end Behavioral;
|
Ein paar Tipps für Anfänger:
Es gibt nur 1 Takt im Design.
Es wird nur 1 Flanke dieses Takts abgefragt (rising oder falling).
Es gibt keinen (und schon gar keinen asynchronen) Reset.
Es wird jedes asynchrone Signal mit 2 FFs einsynchronisiert.
Ausnahmen von den genannten Regeln sind nur mit fundierter Begründung
möglich.