Forum: FPGA, VHDL & Co. State Maschine ; Ausgangssignale in jedem State oder seperat per Concurrent Assignement


von Reto B. (schnuber)


Lesenswert?

Hallo
Wenn ich mich recht erinnere habe ich gelernt, dass die Ausgangssignale 
einer State Maschine in jedem State definiert werden müssen.
Aber was hindert mich denn daran, ein Signal nicht explizit in jedem 
State, sondern einfach per concurrent Statement ausserhalb der State 
Maschine zu definieren, also so:
1
o_pwrready <= '1' when pr_state = pwrready else '0';

Gruss

: Bearbeitet durch User
von S. N. (higgns)


Lesenswert?

Daran hindert dich erstmal nichts. Insbesondere wenn das Signal synchron 
ist.
Bei asynchronen Signalen kann man, wenn man auf nummer Sicher gehen 
möchte den State als "one-hot" kodieren. Dadurch werden Glitches 
aufgrund verschiedener delays zwischen den Stateregistern und den LUTs 
welche die Funktion darstellen vermieden.

von Reto B. (schnuber)


Lesenswert?

Wenn du von synchronem Signal sprichst, meinst du das "pr_state" ?

von S. N. (higgns)


Lesenswert?

Ich spreche davon, dass zwischen dem setzen des States (Taktflanke am 
Register) und dem "lesen" des Signals o_pwrready eine minimale Zeit 
garantiert werden kann (z.B. beim "lesen" von o_pwrready mit dem selben 
Takt).

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ben N. schrieb:
> Ich spreche davon, dass zwischen dem setzen des States (Taktflanke am
> Register) und dem "lesen" des Signals o_pwrready eine minimale Zeit
> garantiert werden kann
Spielst du da auf Latency an?

Reto B. schrieb:
> Aber was hindert mich denn daran, ein Signal nicht explizit in jedem
> State, sondern einfach per concurrent Statement ausserhalb der State
> Maschine zu definieren, also so:
Es ändert im konkreten Fall hier höchstwahrscheinlich überhaupt nichts. 
Da kommt das Selbe raus, wie wenn du den Ausgang direkt bei der 
Statezuweisung setzen würdest...

von Klaus F. (kfalser)


Lesenswert?

Reto B. schrieb:
> Aber was hindert mich denn daran, ein Signal nicht explizit in jedem
> State, sondern einfach per concurrent Statement ausserhalb der State
> Maschine zu definieren, also so:
> o_pwrready <= '1' when pr_state = pwrready else '0';

Was Dich daran hindert ist, dass ein Signal nur von einem einzigen 
Prozess getrieben werden kann, und das concurrent statement eine 
getrennter Prozozess ist.
Du kannst die Signale aber am Anfang deiner FSM zuweisen.
1
process(clk) 
2
begin
3
    if rising_edge(clk) then
4
        o_pwrready <= '0'; -- default, wird bei Bedarf weiter unten überschrieben 
5
        case pr_state is 
6
            when pwrready => 
7
                o_pwrready <= '1';
8
            when .... => 
9
            when .... => 
10
        end case;
11
    end if;
12
end process;

: Bearbeitet durch User
von P. K. (pek)


Lesenswert?

Klaus F. schrieb:
> Was Dich daran hindert ist, dass ein Signal nur von einem einzigen
> Prozess getrieben werden kann, und das concurrent statement eine
> getrennter Prozozess ist.

Solange das "o_pwrready" nur im "concurrent statement" (und nicht auch 
noch innerhalb des Statemachine-Prozesses) zugewiesen wird, gibt es da 
überhaupt kein Problem.

Letztlich stellt sich höchstens noch die Frage der Übersichtlichkeit 
wenn die FSM dereinst etwas grösser wird.

von Sigi (Gast)


Lesenswert?

Klaus F. schrieb:
> Du kannst die Signale aber am Anfang deiner FSM zuweisen.
> ...
Die Default-Zuweisung wird ja in kombinatorischen
Prozessen verwendet, um Latches zu verhindern.
Bei deinem getakteten Prozess brauch es nur evtl.
problembedingt/vereinfachend eine Defaultzuweisung,
ein Register wird aber auf jeden Fall erzeugt, und
damit ist eine Latenz von einem Taktzyklus verbunden.
Das kann z.B. bei der Ansteuerung von FIFOs Probleme
machen (in guten Vorlesungen bzw. Seminaren werden
solche Probleme behandelt).

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.