Forum: FPGA, VHDL & Co. VHDL - FSM mit for schleife


von nfet (Gast)


Lesenswert?

Hallo ihr fleißigen Helfer.

Ich habe ein Problem, dass man in VHDL wahrscheinlich mit einer for 
Schleife lösen kann. Ich weiß leider nicht wie. Der Code würde am besten 
irgendwie so aussehen:
1
case( v.state ) is
2
3
    for j in 0 to 7 loop
4
5
        when j =>
6
7
            if j = 7 then
8
                read_in(0, v);
9
            else 
10
                read_in(j+1, v);
11
            end if;
12
13
            for i in 0 to 7 loop
14
                next when i = j+1;
15
                calculate(i, v);
16
            end loop;
17
18
            if j = 8 then
19
                v.state := 0;
20
            else 
21
                v.state := j+1;
22
            end if;
23
        
24
    end loop;
25
26
    when others => null; 
27
28
end case ;

Man könnte das ganze einfach von Hand entrollen, dann sollte (verkürzt) 
sowas bei rauskommen:
1
case( v.state ) is
2
    when 0 =>
3
        read_in(1, v);
4
5
        calculate(0,v);
6
        calculate(2,v);
7
        
8
        v.state := 1;
9
        
10
    when 1 =>
11
        read_in(2, v);
12
13
        calculate(0,v);
14
        calculate(1,v);
15
        
16
        v.state := 2;
17
18
    when 2 =>
19
        read_in(0, v);
20
21
        calculate(1,v);
22
        calculate(2,v);
23
        
24
        v.state := 0;
25
26
    when others => null; 
27
28
end case ;

Wäre toll, wenn mir jemand helfen könnte.
(calculate() und read_in() sind paar kombinatorische Dinge)

von nfet (Gast)


Lesenswert?

Oh ich habe das
1
exit
 statement gefunden :D
jetzt siehts so aus:
1
statesloop: for j in 0 to 7 loop
2
    if v.state = j then
3
        if j = 7 then
4
            read_in(0, v);
5
        else 
6
            read_in(j+1, v);
7
        end if;
8
        for i in 0 to 7 loop
9
            next when i = j+1;
10
            calculate(i, v);
11
        end loop;
12
        if j = 7 then
13
            v.state := 0;
14
        else 
15
            v.state := j+1;
16
        end if;
17
        exit statesloop;
18
    end if;
19
end loop statesloop;

Damit scheint es in der Simulation zumindest zu funktionieren, am Montag 
mal sehen, was die Synthese draus macht.

von Schlumpf (Gast)


Lesenswert?

Du machst sonst Software oder? :)

von nfet (Gast)


Lesenswert?

Ne, hab eigentlich schon ein bisschen VHDL Erfahrung.
Nun habe ich aber ein Problem, was ich ziemlich generisch gestalten 
will.

Und da dachte ich mir, bevor ich mir einen Wolf schreibe nutze ich doch 
mal die Möglichkeiten von VHDL.

Ich hoffe die Synthese weiß meine Sprachkentnisse zu schätzen :D

von Lattice User (Gast)


Lesenswert?

nfet schrieb:

>
> Ich hoffe die Synthese weiß meine Sprachkentnisse zu schätzen :D

Wird sie nicht tun.
Die for loop baut parallele Hardware und keine FSM

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


Lesenswert?

nfet schrieb:
> v.state
Gaisler?

von nfet (Gast)


Lesenswert?

Ja, das ganze soll ja auch parallele Hardware sein, es ist die 
Parallelisierung der non-restoring Division.
Und ja, das ganze ist Gaisler style.

Das Problem dabei ist, dass da auch states in der FSM dazukommen, wenn 
man einen längeren Quotienten hat. Ich werde die Synthese also Montag 
einfach mal testen müssen.

von Schlumpf (Gast)


Lesenswert?

nfet schrieb:
> Ne, hab eigentlich schon ein bisschen VHDL Erfahrung.

Na wenn du das sagst ;-)

nfet schrieb:
> Ich hoffe die Synthese weiß meine Sprachkentnisse zu schätzen :D

Wenn es dir vollkommen egal ist, dass deine "Statemachine", wenn man das 
so nennen mag, ganz ohne Register auskommt.

nfet schrieb:
> Das Problem dabei ist, dass da auch states in der FSM dazukommen,

Ich sehe bisher gar keinen einzigen State.

Versuche mir gerade vorszustellen, was die arme Syntehse daraus basteln 
könnte. Aber in meinem innteren Auge sehe ich viel Kombinatorik, 
rückgekopplete Kombinatorik mit asynchronen Latches und lauter solche 
Schweinereien.
Aber da du ja sagst, dass du VHDL-Erfahrung hast, dann weisst du ja 
auch, was du tust. :-)

von Da D. (dieter)


Lesenswert?

Schlumpf schrieb:
> Aber in meinem innteren Auge sehe ich viel Kombinatorik,
> rückgekopplete Kombinatorik mit asynchronen Latches und lauter solche
> Schweinereien.

Das er lauter sequenzielle Statements benutzt, gehe ich mal davon aus, 
dass der Code innerhalb eines getakteten Prozesses steht.

Aber ein potentieller Gewinner for nen "Obfuscated VHDL Contest" ist er 
trotzdem... ;-)

von Schlumpf (Gast)


Lesenswert?

Da Dieter schrieb:
> Das er lauter sequenzielle Statements benutzt, gehe ich mal davon aus,
> dass der Code innerhalb eines getakteten Prozesses steht.

Könnte natürlich sein.

Da Dieter schrieb:
> Aber ein potentieller Gewinner for nen "Obfuscated VHDL Contest" ist er
> trotzdem... ;-)

Na wenn er selber dabei blickt, was er tut, ist es ja gut. Aber der arme 
Tropf, der irgendwann mal in seinem Code was verstehen soll, tut mir 
jetzt schon leid ;-)

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


Lesenswert?

nfet schrieb:
> Ne, hab eigentlich schon ein bisschen VHDL Erfahrung.
Und dann das:
nfet schrieb:
> ich habe das exit statement gefunden :D
Dazu exzessive Verwendung von Variablen und Funktionen.

Ich denke, du solltest tatsächlich mal deinem Synthesizer aufs Register 
schauen, und kontrollieren, was da rauskommt.

BTW: wenn du mit Altera arbeitest, dann schreib doch einfach a/b und der 
Synthesizer klatscht dir einen kombinatorischen Divider vor den Latz...

: Bearbeitet durch Moderator
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.