Forum: FPGA, VHDL & Co. [vhdl] Kürze schreibweise für eine State machine


von K. S. (vhdl-kasi)


Lesenswert?

Hallo alle zusammen,

ich möchte eine state machine erstellen, die 16 states hat. Jeder dieser 
states sieht ungefähr wie im unten aufgeführten Ausschnitt aus, nur das 
die if/elsif/else Anweisungen routieren. Das ganze funktioniert auch 
wunderbar, aber ich wollte mal nachfragen ob Ihr für solche Konstrukte 
ne kürzere Schreibweise kennt? Vielleicht irgendwas mit "for loop".

Zur Funktion: Die state machine soll nur einen Multiplexer steuern 
(mux_controll), aber dabei nur die Eingänge des Multiplexer ansteuern, 
die noch aktiv sind (working(x) = 1), ohne dabei einen Takt zu 
verlieren.

Ausschnit aus dem Quellcode:
[/vhdl]
        case state is
           when q1 => mux_control <= x"0";
                      if (working(1)='1') then
                        state <= q1;
                      elsif (working(2)='1') then
                        state <= q2;
                      elsif (working(3)='1') then
                        state <= q3;
                   ....usw...
                      elsif (working(15)='1') then
                        state <= q15;
                      elsif (working(0)='1') then
                        state <= q0;
                      elsif (working = 0) then
                        state <= q_finish;
                      else
                        state <= q_fault;
                      end if;
        end case;

von alex (Gast)


Lesenswert?

Hallo,

ich kenne keine kürzere Schreibweise und meiner Meinung nach, ist es 
besser, die Beschreibung so zu lassen, wie Du sie hast. Eine kürzere und 
dadurch kryptische Schreibweise würde den Code nicht wartbar bzw. nicht 
"debugbar" machen. In eins-zwei Wochen weisst Du dann auch selbst nicht 
mehr, was Du da im kreativen Moment zusammengeschrieben hast... Es 
sollte kein "write-only-Code" werden.

Mfg,
Alex

von K. S. (vhdl-kasi)


Lesenswert?

Hallo Alex,

ich denke ich werde es aus den von die Genannten gründen so lassen. 
danke für die schnelle Antwort. ;)

Grüße Kasi

von Gast (Gast)


Lesenswert?

Warum nimmst du nicht das working selbst als state? Scheint doch immer 
genau ein Bit 1 zu sein.

von K. S. (vhdl-kasi)


Lesenswert?

Hi Gast,

ich glaub, ich verstehe deinen Vorschlag nicht richtig. Das working ist 
ein 16 Bit breiter Vektor, in dem einfach nur gespeichert ist welcher 
eingang des Multiplexers überhaupt noch aktiv ist. Inaktive Eingänge 
muss der Multiplexer nämlich nicht mehr durchschalten.

von Christian K. (morpheus421)


Lesenswert?

ich glaube gast meint, dass du statt "state" abzufragen, auch einfach 
working abfragen kannst. Würde dir deine if then else if Abfrage 
sparen...

also irgendwie so halt
1
case working is
2
 when "0000000000000001" => foo_out <= "0001";  
3
 when "0000000000000010" => foo_out <= "0010";  
4
 when "0000000000000100" => foo_out <= "0011";  
5
 when "0000000000001000" => foo_out <= "0100";  
6
 when "0000000000010000" => foo_out <= "0101";  
7
 when "0000000000100000" => foo_out <= "0110";  
8
 when "0000000001000000" => foo_out <= "0111";  
9
 when "0000000010000000" => foo_out <= "1000";  
10
 when "0000000100000000" => foo_out <= "1001";  
11
 when "0000001000000000" => foo_out <= "1010";  
12
 when "0000010000000000" => foo_out <= "1011";  
13
 when "0000100000000000" => foo_out <= "1100";  
14
 when "0001000000000000" => foo_out <= "1101";  
15
 when "0010000000000000" => foo_out <= "1110";  
16
 when "0100000000000000" => foo_out <= "1111";  
17
 when "1000000000000000" => foo_out <= "0001";  
18
 when "0000000000000000" => foo_out <= "0000";
19
 when others => foo_out <= "0000";
20
end case;

dann machst halt satt foo_out zu setzen deine Anweisungen, was in q0 bis 
q15 passieren soll. Deine Fehler fängst du im others state ab...

Müßte funktionieren... nicht?

Gruß

von K. S. (vhdl-kasi)


Lesenswert?

nee, das funktionier leider so nicht, weil working durch aus mehr als 
eine 1 hat und sogar muss. Ich möchte nur zur "nächsten 1" in working 
springen. Das was ihr meint wäre ja eine "One-hot"-Codierung für state.

Grüße

von Gast (Gast)


Lesenswert?

Folgender Ansatz:
Mach einen state, in dem du working links shiftest (einmal pro 
Aufenthalt in diesem state) und dabei einen Zaehler mit laufen laesst. 
Steht als MSB des geshifteten working eine 1, dann gehst du in einen 
state der das macht was du willst (der Zaehler verweist auf den state, 
den du brauchst). Steht eine 0, bleibst du im Ausgangsstate und shiftest 
wieder. Wenn einmal durch, Zaehler wieder 0 setzen und neu anfangen.

von K. S. (vhdl-kasi)


Lesenswert?

stimmt, das wäre sinnig ;-)

danke für den Tipp und eure Mühe mit mir.

Damit wäre das Thema geschlossen.

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.