Hi, ich habe zu meinem Problem nirgendwo was gefunden und ich muss sagen ich bin ein VHDL-Anfänger. Wie aus der Überschrift hervorgeht, habe ich ein Problem mit der Eventabfrage. Kann mir einer beantworten, warum sowas nicht geht? If(input1'event) then ... elsif(input2'event) then ... Modelsim meckert beim Kompilieren nicht herum, aber mit Xilinx ISE geht das nicht und es meckert herum wegen irgendwas von wegen Synchronität... :( und dann habe ich noch ein zweites Problem: " .... 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 ..." hier erkennt er nicht mal mehr, was takt'event bedeuten soll. ist für ihn unknown... Hoffentlich kann mir hierfür einer eine Erklärung liefern. :) Wäre echt nett. Ich danke schon mal im Voraus für die Bemühungen. Beste Grüße, Oliver
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.
Danke für deine ausführliche und hilfreiche Antwort. Nun ist mir einiges klarer.
> Modelsim meckert beim Kompilieren nicht herum, aber mit Xilinx ISE geht > das nicht und es meckert herum wegen irgendwas von wegen Synchronität... VHDL ist eine Systembeschreibungs- und Verifikationssprache. Nur ein klitzekleiner Teil des VHDL-Sprachumfangs ist auf Hardware abbildbar. Eine simple Beschreibung wie
1 | ausgang <= eingang after 500 ns; |
ist z.B. schon nicht mehr synthetisierbar. Darüber hinaus ist schon eine einfache Integer-Division nicht synthetisierbar (solange der Nenner nicht zufällig fix und eine Zweier-Potenz ist). Du mußt dir klar darüber sein, dass es in einem FPGA nur Logik (LUTs) und Flipflops gibt. Ein Flipflop ist idR. nur auf eine der beiden möglichen Flanken sensitiv. Dort gibt es also nur entweder rising_edge() oder falling_edge(). Sieh dir mal die in der Literatur gängigen Beschreibungen für FPGA-Designs an. Du wirst keine finden, in der das Taktsignal /irgendwo in der Mitte/ eines Prozesses abgefragt wird. Schon einfachste Abweichungen von der üblichen Schreibweise sorgen für Diskussionen, wie ich in http://www.lothar-miller.de/s9y/categories/6-Clock-Enable festgehalten habe ;-) In Ausnahmefällen geht sowas, aber wie gesagt: es stehen im FPGA nur FFs und LUTs zur Verfügung. Darauf muß deine Beschreibung abgebildet werden können.
Daniel (root) schrieb: > Die if-Schleife ist kein VHDL Phänomen. Das weiss ich aus meiner > Tutorerfahrung ;-) Oh ja, alle Jahre wieder wenn ich meinen Erstis JAVA beibringen muss :)
Jaja bei der if-Schleife habe ich mal wieder nicht nachgedacht und einfach irgendwas geschrieben. for-schleifen sind es in java halt. kA warum ich dann if-schleife schreibe :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.