Forum: FPGA, VHDL & Co. Taktflanken erkennen


von Hans-Peter Lüdtke (Gast)


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

von Axel Meineke (Gast)


Lesenswert?

Steht das ganze denn in einem Process() ???

Ansonsten stell doch eben deinen Code in den anhang, dann schau ich mir
das mal schnell an.

von Hans-Peter Lüdtke (Gast)


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.

von Jörn (Gast)


Lesenswert?

Hast du einen globalen Takt in deinem Design?

von Hans-Peter Lüdtke (Gast)


Lesenswert?

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.

von Jörn (Gast)


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?

von Hans-Peter Lüdtke (Gast)


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;

von Jörn (Gast)


Angehängte Dateien:

Lesenswert?

Ich hab das Ganze mal als synchrone Schaltung gemacht. Code und
Schaltplan sind angehängt

von Hans-Peter Lüdtke (Gast)


Lesenswert?

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

von Jörn (Gast)


Lesenswert?

Falls noch Fragen sind, einfach stellen.

von André Kronfeldt (Gast)


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é

von FPGA-User (Gast)


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

von André Kronfeldt (Gast)


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é

von André Kronfeldt (Gast)


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é

von FPGA-User (Gast)


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.

von André Kronfeldt (Gast)


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é

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
Noch kein Account? Hier anmelden.