FSM mit taktflankengesteuerten Zustandsübergängen

Gast #620897
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
1
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
#620906
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
#620908
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
#620933
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
Gast #621007
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

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.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.