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


von MARK (Gast)


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

von Falk B. (falk)


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

von Jan M. (mueschel)


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

von MARK (Gast)


Lesenswert?

DAnke der schnellen Antworten.

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

Ich habe dabei das gleiche problem festgestellt!!

von Jan M. (mueschel)


Lesenswert?

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

von Falk B. (falk)


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

von Kest (Gast)


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

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.