State Maschine ; Ausgangssignale in jedem State oder seperat per Concurrent Assignement

OP #4249815
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
#4249829
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.
Moderator (Firma: Titel) Persönliche Seite #4249939
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...
#4255290
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;
#4255952
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.
Gast #4255964
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).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren