Wie viele States sollte ein FSM haben?

Gast #5787067
Lesenswert?

Hallo.
Ich stehe vor dem Thema, dass ich ein Frame/Paket mit mehreren Werten 
z.B. per SPI verschicken möchte. Werde 15-20 verschiedene "Werte" in den 
Frame eintragen. Jeder Wert besteht aus einem Header und 2-3 Words.
Würde die ganzen Werte in einen FiFo eintragen und danach per SPI 
verschicken.

Man könnte das Zusammenstellen des Frames ja per FSM lösen. Bei der 
Anzahl an verschiedenen Messwerten würde da aber einige States 
zusammenkommen.

Jetzt frage ich mich, wie viele States denn eine FSM haben sollte?
Gast #5787137
Lesenswert?

Pepe schrieb:
> Jetzt frage ich mich, wie viele States denn eine FSM haben sollte?

Da gibt es so keine Regel. Im Grunde ist ein Counter ja auch eine FSM.

Wenn ich n Werte von einem FIFO auslesen müsste, würde ich nicht n 
States dafür schreiben, sondern in einem State sowas wie:
1
case state is
2
    when ... => 
3
       fifo_entries <= 5;
4
       state <= READ_FIFO;
5

6
    when READ_FIFO =>
7
       if fifo_ptr < fifo_entries then
8
           frame(some_range_calculation) <= fifo(fifo_ptr);
9
           fifo_ptr <= fifo_ptr + 1;
10
       else
11
           fifo_ptr <= 0;
12
           state <= next_state;
13
       end if;
14

15
    when ... => ...
Gast #5787152
Lesenswert?

@Matyas
Das Auslesen in den Fifo ist nicht mein Thema. Das ist ohne FSM 
realisiert.

Sondern ich habe verschiedene Werte, die zwischen 2-3 Words lang sind 
und aus unterschiedlichen "Quellen" stammen. Und diese Werte möchte ich 
in einen gesamten Frame zusammensetzen und in einen FiFo eintragen.
Und für das Mergen des Frames hätte ich gerne eine FSM eingesetzt.
Gast #5787168
Lesenswert?

Pepe schrieb:
> Und diese Werte möchte ich
> in einen gesamten Frame zusammensetzen und in einen FiFo eintragen.
> Und für das Mergen des Frames hätte ich gerne eine FSM eingesetzt.

Was meinst Du damit?

Wenn die werte von Asynchron irgendwo unabhängig reinkommen, dann 
braucht es keine FSM.

Wenn die Werte nacheinander in einen Frame geschrieben werden, dann 
braucht es keine FSM.

Wenn die Werte nacheinander in einer festen Folge reinkommen, und nach 
jedem reinkommen was anderes gemacht werden muss, dann vielleicht, aber 
dazu fehlt mir jede Info zu Deinem Problem.
Gast #5787182
Lesenswert?

Grundsätzlich werte ich in Echtzeit das Bild einer Zeilenkamera aus.
D.h. es läuft eine Kantenerkennung gleich im FPGA und ich gebe die 
Koordinaten der Kanten für einige Messbereiche aus. Zusätzlich werden 
noch Positionen von Encodern in den Frame eingetragen.
Der Frame mit den Ergebnissen soll synchron zur Kamera ausgegeben 
werden.

Leider kann es vorkommen, dass "Kante#1" auch mal NACH "Kante#2" kommt, 
weil sich die Polarität der Helligkeiten im Bild ändern kann (SW <> WS).
Gast #5787242
Lesenswert?

Pepe schrieb:
> Sondern ich habe verschiedene Werte, die zwischen 2-3 Words lang sind
> und aus unterschiedlichen "Quellen" stammen.

Und wie sehen diese Quellen aus?

Ich versuche häufig mir einen Datentyp/LUT zu bauen, der mir die 
Beschreibung vereinfacht.

Wenn jede Quelle die Werte in einen Datentyp* schreibt, könnte man da 
auch einfach drüber iterieren.

* zB:
1
type t_quelle_entry is record
2
    byte_buffer(range) : t_byte;
3
    used_entries       : natural in range xy;
4
end record;
5

6
type t_quellen is array(range_nr_quellen) of t_quelle_entry;
7

8
signal quellen : t_quellen;
9
...
10

11
case state is
12
    when READ_FRAME_FROM_SOURCES => 
13
       if quell_ptr < NR_QUELLEN then
14
           if byte_ptr < quellen(quell_ptr).used_entries then
15
               frame(some_range_calculation) <= quellen(quell_ptr).byte_buffer(byte_ptr);
16
               byte_ptr <= byte_ptr + 1;
17
               total_nr_of_bytes <= total_nr_of_bytes + 1;
18
           else
19
               byte_ptr <= 0;
20
               quell_ptr <= quell_ptr + 1;
21
           end if;
22
       else
23
           quell_ptr <= 0;
24
           state <= WRITE_FIFO;
25
       end if;
26

27
    when WRITE_FIFO =>
28
       if quell_ptr < total_nr_of_bytes then
29
           fifo(quell_ptr) <= frame(quell_ptr);
30
           quell_ptr <= quell_ptr + 1;
31
       else
32
           quell_ptr <= 0;
33
           total_nr_of_bytes <= 0;
34
           state <= next_state;
35
       end if;
36

37
    when ... => ...

Edit: Vll zu spät, war Mittagspause...
Gast #5787720
Lesenswert?

-gb- schrieb:
> Sollten es immer 2^n States sein? Das wird
> ja intern als binäre Zahl gebaut, wenn man jetzt 7 Zustände hat bleibt
> ein Wert unbelegt aus 2^3.

Quartus verwendet normalerweise one-hot Kodierung, d.h. pro State ein 
Flipflop (bzw -1, alle FF=0 ist ein weiterer State). Hat vermutlich 
Vorteile für die Überführungs- und Ausgabenetze.

K.A. wie Xilinx das handhabt.
Gast #5788626
Lesenswert?

Matyas schrieb:
> -gb- schrieb:
>> Kann es passieren, dass die Statemachine in
>> diesen Zustand spring obwohl er nirgends verwendet wird?
>
> Ja, beispielsweise bei einem SEU.

Per Synthesizer Pragma kann man erzwingen, dass für nicht verwendete 
aber mögliche Zustände eine Resetlogik generiert wird. Wird z. B. von 
den mir bekannten Safety Normen jeweils so verlangt.

Das erhöht den Ressourcenverbrauch etwas und verlangsamt die FSM, darum 
wird das per default nicht gemacht.
#5789062
Lesenswert?

Pepe schrieb:
> Und was passiert, wenn ich bei einer 4-LUT mehr States einbaue?
Nicht viel, sofern fsm-style "BRAM" eingestellt ist. :-)

Christophz schrieb:
> Per Synthesizer Pragma kann man erzwingen, dass für nicht verwendete
> aber mögliche Zustände eine Resetlogik generiert wird.
Bei Xilinx nennt sich das "-safe_implementation = yes".

-gb- schrieb:
> Aber mal eine ernste Frage: Sollten es immer 2^n States sein?

Nö - wieso denn?

Blechbieger schrieb:
> K.A. wie Xilinx das handhabt.

Da hast Du die Qual der Wahl. Mit im Angebot: Auto, One-Hot, Gray, 
Johnson, Compact, Sequential, Speed, User - und witzigerweise "None" 
(noch nicht ausprobiert).
Gast #5789475
Lesenswert?

Burkhard K. schrieb:
>> Aber mal eine ernste Frage: Sollten es immer 2^n States sein?
>
> Nö - wieso denn?

Komplettes ausdecodieren aller möglichen Zustände damit die FSM nicht 
festhängt.

Kann man auch anders erreichen ('when others').
Aber man sollte sich schon mal drüber nachdenken wie die Zustände der 
FSM realisiert werden und wie sich die FSM verhält wenn mal eine 
FSM-Zustand eintritt (beispielsweise durch unbeabsichtigtes 
"Übertakten") der so nicht vorgesehen war.
(Firma: Schweigstill IT) Persönliche Seite #5790044
Lesenswert?

NichtWichtig schrieb:
> Wie wäre es mit einem Bitfield?
> Wenn es 15-20 Objekte sind langt eine 32 bit Wert, jedes Objekt bekommt
> 1 bit und es lassen sich wunderbar und einfach Prüfungen durchführen.

Es geht hier um programmierbare Logik bzw. deren Beschreibungssprachen. 
Da ist man nicht auf 8/16/32/64 Bit breite Datentypen eingeschränkt. 
Ganz im Gegenteil nöhlt der Synthesizer herum, wenn Bits nicht verwendet 
werden und dampft dann ein Konfigurationsregister auf die tatsächlich 
benötigten z.B. 27 Bit ein. Und eine One-Hot-FSM mit 17 Zuständen wird 
dann intern durch 17 Bit repräsentiert. Bei der anschließenden 
Implementierung des synthetisierten Designs muss das ganze natürlich 
wieder auf die tatsächlichen Hardwareressoucen abgebildet werden, d.h 
Register, LUTs usw., so dass es hierbei natürlich wieder zu Verschnitt 
kommen kann. Insgesamt erfolgt die ganze Optimierung aber deutlich 
rigoroser als beim Kompilieren und Linken von Software.
Beitrag #5790076 wurde von einem Moderator gelöscht.
Beitrag #5790096 wurde von einem Moderator gelöscht.
Beitrag #5790190 wurde von einem Moderator gelöscht.
Beitrag #5790213 wurde von einem Moderator gelöscht.
Beitrag #5790227 wurde von einem Moderator gelöscht.
Gast #5793453
Lesenswert?

C. A. Rotwang schrieb:
> Burkhard K. schrieb:
>>> Aber mal eine ernste Frage: Sollten es immer 2^n States sein?
>>
>> Nö - wieso denn?
>
> Komplettes ausdecodieren aller möglichen Zustände damit die FSM nicht
> festhängt.

Geht theoretisch ist aber schwierig zu erreichen, wenn der Synthesizer 
freie Hand hat bei der Wahl der FSM codierung.

Tönt auch eher nach Verilog Stil, wo es keinen Enumerationstyp gibt und 
FSM dann mit Bitvektoren beschrieben werden, die dann der Synthesizer 
wieder komplett anders implementiert.

> Kann man auch anders erreichen ('when others').

Synthesizer ignorieren den 'when others' Pfad (kann ich definitiv 
bestätigen für Synplify). Ist auch so dokumentiert bzw. wird als Warnung 
ausgegeben.

Um das gewünschte Ziel zu erreichen, stehen die schon weiter oben 
erwähnten Pragmas zur Verfügung.
Gast #5812051
Lesenswert?

Christophz schrieb:
> Synthesizer ignorieren den 'when others' Pfad (kann ich definitiv
> bestätigen für Synplify). Ist auch so dokumentiert bzw. wird als Warnung
> ausgegeben.
>
> Um das gewünschte Ziel zu erreichen, stehen die schon weiter oben
> erwähnten Pragmas zur Verfügung.

Ja stimmt, wenn der 'when others state' als nicht erreichbar erkannt 
wird und keine Attribute für die Synthese gesetzt sind.

Ich habe auch schon gesehen, dass der 'when others state' im Reset 
gesetzt wird, um die Erreichbarkeit der Synthese zu zeigen.

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