[vhdl] Kürze schreibweise für eine State machine

#802559
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;
Gast #803286
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
#804411
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.
#804471
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ß
Gast #807099
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.

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