If(input1'event) then
a <= b;
elsif(input2'event) then
...
Mit dem 'event-Dingens wird ein flankengesteuertes FlipFlop generiert:
Dieses FlipFlop hat einen Clock-Eingang, und wenn der auf '1' schaltet
(Flanke) speichert es. D.H. Das FlipFlop übernimmt den Wert von b nach
a. Allerdings kann das FlipFlop nicht prüfen ob gerade input2 eine
Flanke hat und input1 nicht (was du ja mit elsif beschrieben hast). Das
wäre auch ungenau, weil theoretisch ist so eine Flanke ja unendlich kurz
und "gleichzeitig" ist da ein schwieriger Begriff, sozusagen. Außerdem
hättest du damit mehrere Takte, und das sollte man sowieso nur machen,
wenn es absolut nicht anders geht.
Sind input1/2 Daten-Eingänge? Die sollte man sowieso nicht auf Flanken
überprüfen, weil vorgeschaltete LUT-Logik durch unterschiedliche
Signallaufzeiten Spikes/Glitches erzeugen kann, die das FlipFlop
"auslösen", wenn es eigentlich gar nicht sein soll. Lieber synchron zu
einem Takt die Daten übernehmen.
> if modus=1 then
> if activein='0' and arbeitet='0' then
> arbeitet:='1';
> activeout<='1';
> end if;
> if arbeitet='1' then
> if(takt'event) then
> if(richtung='0') then
> count:=(count+1)MOD 8;
> else
> ..."
Das kann auch nicht funktionieren. Es gibt nur FlipFlops, die bei
steigender Flanke oder bei fallender Flanke schalten, aber keine
FlipFlops die bei beiden Flanken schalten, aber genau das hast du
geschrieben: takt'event bezieht sich auf beide Flanken. Schreib if
(takt'event and takt='1') für die steigende Flanke und if (takt'event
and takt='0') für die fallende. Das gilt auch für das erste
Code-Schnipsel.
Falls du überprüfen willst, ob sich ein signal von einer Flanke zur
nächsten des taktes verändert hat, verwende das:
1 | architecture ...
|
2 | signal temp : std_logic;
|
3 | begin
|
4 | process (clk,input,temp)
|
5 | begin
|
6 | if (clk'event and clk='1') then -- Steigende Takt-Flanke
|
7 | temp <= input; -- Alten Wert setzen
|
8 | if ((input xor temp) = '1') then -- Hat sich das input-Signal verändert?
|
9 | -- Hier irgendetwas ausführen
|
10 | end if;
|
11 | end if;
|
12 | end process;
|
13 | end architecture;
|
Übrigens: if- Schleife ist falsch, ein if-Block wird immer nur 0 oder
1 mal ausgeführt, und ist deshalb keine Schleife.