Taktflanken erkennen

Gast #203181
Lesenswert?

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
Gast #203183
Lesenswert?

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.
Gast #203186
Lesenswert?

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?
Gast #203187
Lesenswert?

Ä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;
Gast #203191
Lesenswert?

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é
Gast #203192
Lesenswert?

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
Gast #203193
Lesenswert?

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é
Gast #203194
Lesenswert?

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é
Gast #203195
Lesenswert?

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.
Gast #203196
Lesenswert?

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é

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren