www.mikrocontroller.net

Forum: FPGA, VHDL & Co. FSM mit taktflankengesteuerten Zustandsübergängen


Autor: MARK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo....

Ich müsste eine FSM mit taktflankengesteuerten Zustandsübergängen 
realisieren. Der Zustand soll nur bei der fallenden Flanke erkannt 
werden.

Der Code muss synthetisierbar auf einem Lattice MachXO sein.

Wenn ich die flanken mit
VAR='1' and VAR'event
 abfrage, dann minimiert der Syntetisierer (Synplify) das Signal weg...
Der Precision sagt, das nur ein Takt verwendet werden darf.

Hat dazu jemand einen Idee?

Vielen DANK
MARK

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ MARK (Gast)

>Ich müsste eine FSM mit taktflankengesteuerten Zustandsübergängen
>realisieren. Der Zustand soll nur bei der fallenden Flanke erkannt
>werden.

Ja und?

>Hat dazu jemand einen Idee?

Du solltest dich mal mit den Grundlagen von VHDL und digitalem Entwurf 
befassen.

Ne FSM ist einen Standardsache, die JEDER, der die Grundlagen HALBWEGS 
beherrscht problemlos hinschreiben kann. Etwa so.

process(clk)
begin
  if falling_edge(clk) then
    case state is
      when warten => if taste='1' then
                       state = Z1;
                     end if;

      when z1     => state = Z2;

      when z2     => if code="111" then
                       state <= warten;
                     else
                       state <= Z1;
                     end if;

      when others => state <= warten;
    end case;
  end if;
end process;

MFG
Falk

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit dieser Syntax kannst du nur bei einem Taktsignal arbeiten. Und davon 
gibt es pro Fliflop bzw. Slice nur genau eines. Möchtest du an einem 
anderen Signal eine Flanke erkennen, brauchst du nur das aktuelle Signal 
mit dem um einen (System-)Takt verzögerten Signal zu vergleichen:
if signal = '0' and last_signal = '1' then

Autor: MARK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DAnke der schnellen Antworten.

Die Lösung von Falk ist ja quasi ein Workaround. Kann ich die syntax
var='0' and var'last_value='1'
 nutzen?

Ich habe dabei das gleiche problem festgestellt!!

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, das ist praktisch nichts anderes als 'event. Du musst das Signal 
selbst mit einem Fliflop verzögern.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ MARK (Gast)

>Die Lösung von Falk ist ja quasi ein Workaround. Kann ich die syntax

Bitte? Das IST der richtige Weg.

Befasse  dich mal ernsthaft mit den Grundlagen und lass das Rumgedokere 
mit deinem Halbwissen!

>Ich habe dabei das gleiche problem festgestellt!!

Ja, du weisst nicht was tu tust.

MfG
Falk

Autor: Kest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk:

nun mal langsam, Falk. Du hättest Recht, wenn im ersten Posting was 
von der fallenden _Takt_flanke stünde. Da wurde aber nur von der 
fallenden Flanke was die Rede :-)

Also muss zunächst die fallende Flanke erkannt werden

if rising_edge(clk) then
  ff1 <= VAR;
end if;

falling <= not VAR and ff1;

und dann "falling"-Signal als enable Signal für die Statemaschine 
verwenden.


if falling_edge(clk) then
   if falling='1' then
    case state is
      when warten => if taste='1' then
                       state = Z1;
                     end if;

      when z1     => state = Z2;

      when z2     => if code="111" then
                       state <= warten;
                     else
                       state <= Z1;
                     end if;

      when others => state <= warten;
    end case;
   end if;
  end if;

Grüße,

Kest

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.