Hallo, ich habe folgendes Problem. Ich möchte in Abhängigkeit von einer steigenden oder fallenenden Taktflanke an einem Eingangspin ein Ausgangsbit setzen oder löschen. Ich weiß allerdings immer nur auf EINE Flanke zu reagieren mit EINGANG='1' and EINGANG'event oder EINGANG='0' and EINGANG'event Beim Versuch über if/elseif bekomme ich den "bad synchronous"-Fehler und wenn ich zwei verschiedenen Prozessen kann ich nicht auf ein Ausgangspin zugreifen. Hat jemand eine Idee wie ich dieses Problem lösen kann? Vielen Dank im vorraus, H-P
Steht das ganze denn in einem Process() ??? Ansonsten stell doch eben deinen Code in den anhang, dann schau ich mir das mal schnell an.
entity test is Port( SWITCHA : in bit; SWITCHB : in bit; DIRECTION: out bit); end test; architecture Behavioral of test is begin ROTATION: process (SWITCHA,SWITCHB) begin if (SWITCHB='1' and SWITCHB'event) then DIRECTION<='0'; elsif (SWITCHB='0' and SWITCHB'event) then DIRECTION<='1'; end if; end process ROTATION; Das ist jetzt eine probierte Lösung, welche natürlich so nicht funktioniert.
Nein, ich habe keinen globalen Takt. Brauche ich für diese Anwendung einen? Ich habe gerade erst angefangen mit VHDL und von daher auch noch recht unsicher im Umgang mit dem Ganzen.
Nein, brauchst du nicht unbedingt. Mit einem Takt läßt sich die Flankenerkennung mit zwei D-FF sehr einfach machen. Wenn ich deinen Code richtig versteht, müßte DIRECTION<=not SWITCHB genau das gleiche machen, oder?
Äh, ja, das ist richtig aber der Code oben sollte nur der Anschauung dienen. Nach der Abfrage der Flanke kommt eigentlich noch etwas Code hinzu (Abfrage eines weiteren Pins SwitchA). DIRECTION ist dann im Weiteren auch noch abhängig von SwitchA. Ich hatte diesen Teil nur aus Gründen der Übersichtlichkeit weggelassen. Wie könnte ich denn einen Takt implementieren um über die zwei FlipFlops die Taktflanke von SwitchB "abzufragen"? In diesem Fall müsste der Takt ja auch in seiner Frequenz gewissermassen abhängig von dem zu erwartendem Signal an SwitchB sein, richtig? Hier die eigentliche Schleife: if (SWITCHB='1' and SWITCHB'event) then if SWITCHA='0' then DIRECTION<='1'; else DIRECTION<='0'; end if; elsif (SWITCHB='0' and SWITCHB'event) then if SWITCHA='0' then DIRECTION<='0'; else DIRECTION<='1'; end if; end if;
Ich hab das Ganze mal als synchrone Schaltung gemacht. Code und Schaltplan sind angehängt
Oh wow, das wird mir wirklich weiterhelfen, denke ich. Vielen Dank für die Mühe und Arbeit die Du Dir gemacht hast. Gruß, H-P
Hm. Wenn mal mal nur die Flanken betrachtet und nicht den Zustand der Switches nach der Flanke ist D doch antivalent (A XOR B): B A D 0 0 0 0 1 1 1 0 1 1 1 0 Reicht dann nicht: if (SWITCHB'event) then DIRECTION<= SWITCHA XOR SWITCHB end if; ??? Grüße, André
der simulator frisst sowas vielleicht noch, aber stell dir mal vor, du bist ein vhdl-synthesetool ;-) welche schaltung machst du da draus ? ein FF, dass mit beiden Flanken schaltet ? problematisch ! die lapidare fehlermeldung wird so ähnlich sein: Error: VHDL Case Statement or If Statement error at switch_simple.vhd(21): can't synthesize condition that contains an isolated 'EVENT predefined attribute
Dann halt: if (SWITCHB='1' and SWITCHB'event) then DIRECTION<= SWITCHA XOR SWITCHB; end if; elsif (SWITCHB='0' and SWITCHB'event) then DIRECTION<= SWITCHA XOR SWITCHB end if; Ist das Teil echt so doof? Ich meine: Ein wenig Kreativität kann man doch von einem Synthesetool doch erwarten - im Sinne der besseren Codelesbarkeit. Grüße, André
Wobei (letzterer Code optimiert): if (SWITCHB='1' and SWITCHB'event) then DIRECTION<= NOT SWITCHA; end if; elsif (SWITCHB='0' and SWITCHB'event) then DIRECTION<= SWITCHA; end if; Grüße, André
wie gesagt, versuch mal für deinen vhdl-code eine schaltung zu malen, dann merkst du, dass das nix wird. die synthesetools haben in den letzten jahren viel dazugelernt, aber alles geht auch nicht. wenn du mir ein synthesetool nennen kannst, das aus deinem code eine hardware generiert, dann bin ich echt platt und glaube wieder an wunder. Das design von Jörn ist aus meiner sicht eher erfolgversprechend.
Naja. Vielleicht verfolge ich auch nur den falschen Ansatz. Ziel war eigentlich den von Hans-Peter Lüdtke vorgegebenen Code zu optimieren. Hab leider übersehen, daß der Kern (die if-else-Abfrage) bei ihm schon nicht funktioniert. Dann brauch ich da garnicht ansetzen. Also vergeßt meine 3 vorherigen Posts. Liegt wohl auch ein wenig daran, daß ich heute Spätdienst habe. Wieso sitzt ihr eigentlich am Computer? wir haben 32 Grad. Husch, husch nach draußen. Grüße, André
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.