mikrocontroller.net

Forum: FPGA, VHDL & Co. Taktflanken erkennen


Autor: Hans-Peter Lüdtke (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Axel Meineke (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hans-Peter Lüdtke (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du einen globalen Takt in deinem Design?

Autor: Hans-Peter Lüdtke (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Hans-Peter Lüdtke (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Jörn (Gast)
Datum:
Angehängte Dateien:

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

Autor: Hans-Peter Lüdtke (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falls noch Fragen sind, einfach stellen.

Autor: André Kronfeldt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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é

Autor: FPGA-User (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: André Kronfeldt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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é

Autor: André Kronfeldt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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é

Autor: FPGA-User (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: André Kronfeldt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.