Forum: FPGA, VHDL & Co. Vereinfachung einer Beschreibung


von Joe (Gast)


Lesenswert?

Hallihallo,

habe folgende VHDL-Beschreibung

1
process(clk)
2
begin
3
    wait until rising_edge(clk);
4
    
5
    case s is
6
        when a =>   if iEna='1' then
7
                        s <= b;
8
                    end if;
9
        
10
        when b =>   if iEna='0' then
11
                        s <= a;
12
                        
13
                    elsif if iTrig='1' then
14
                        myEna <= '1';
15
                        s <= c;
16
                    end if;
17
        
18
        when c =>   if iEna='0' then
19
                        s <= d;
20
                    end if;
21
        
22
        when d =>   if other_ena='0' then
23
                        s <= a;
24
                    end if;     
25
    end case;
26
end process;


Nun möchte ich das vereinfachen, erster Ansatz in etwa so:
1
process(clk)
2
begin
3
    if rising_edge(clk) then
4
        
5
        myEna <= (myEna or iTrig) and iEna and (other_ena);
6
    end if;
7
end process;

Das Problem: die Abfrage in Zustand d ist meiner Meinung nach noch nicht 
richtig beschrieben in der vereinfachten Version. Kann mir jemand sagen, 
wie man die "nicht generelle" Überprüfung von 'other_ena' abbilden 
könnte?

GRUSS, Joe

von Joe (Gast)


Lesenswert?

Kleine Korrektur: myEna muss natürlich noch zurückgesetzt werden
1
process(clk)
2
begin
3
    wait until rising_edge(clk);
4
    
5
    case s is
6
        when a =>   if iEna='1' then
7
                        s <= b;
8
                    end if;
9
        
10
        when b =>   if iEna='0' then
11
                        s <= a;
12
                        
13
                    elsif if iTrig='1' then
14
                        myEna <= '1';
15
                        s <= c;
16
                    end if;
17
        
18
        when c =>   if iEna='0' then
19
                        myEna <= '0';
20
                        s <= d;
21
                    end if;
22
        
23
        when d =>   if other_ena='0' then
24
                        s <= a;
25
                    end if;     
26
    end case;
27
end process;

von Lattice User (Gast)


Lesenswert?

Deine "Vereinfachung" verhält sich schon am Anfang anders als deine FSM.

Z.B. der Fall iTrig bereits '1' wenn iEna auf '1' geht wird anders 
behandelt,
bei der FSM dauert es dabei länger bis myEna auf '1' gesetzt wird.

Das ist also keine Vereinfachung sondern eine funktional andere 
Beschreibung.

von Joe (Gast)


Lesenswert?

Hi Lattice User,

da gebe ich dir Recht. Diesen Unterschied außen vor ... wie bekomme ich
die others_ena-Abfrage abgebildet?


JOE

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


Lesenswert?

Lattice User schrieb:
> Das ist also keine Vereinfachung sondern eine funktional andere
> Beschreibung.
Besonders auch deshalb, weil in der "großen" FSM das other_ena keinen 
Einfluss auf myEna hat...

Man kann die Beschreibung nicht auf 1 Zeile zusammenfassen, weil das 
Setzen und Zurücksetzen unabhängig voneinander sind..

Ich würde also das hier bieten:
1
process begin
2
    wait until rising_edge(clk);
3
    if    (s=b and iEna='1' and iTrig='1') then myEna <= '1';
4
    elsif (s=c and iEna='0')               then myEna <= '0';
5
end process;


BTW: ein Prozess mit Sesitivliste darf kein wait enthalten...

: Bearbeitet durch Moderator
von Joe (Gast)


Lesenswert?

>Besonders auch deshalb, weil in der "großen" FSM das other_ena keinen
>Einfluss auf myEna hat...

Naja, indirekt ja schon: myEna kann nicht wieder gesetzt werden, bevor 
others_ena nicht deaktiviert wurde.

>Ich würde also das hier bieten: ...

Hm, da werden ja die Zustände der FSM dekodiert, ich wollte die FSM ja 
eliminieren.


Gruss, Joe

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


Lesenswert?

Joe schrieb:
> Hm, da werden ja die Zustände der FSM dekodiert, ich wollte die FSM ja
> eliminieren.
Das ist für myEna nicht möglich, weil es von den Zuständen der FSM 
abhängt. Mehr kann man zu dem hier geposteten Code nicht sagen...

von Lattice User (Gast)


Lesenswert?

Joe schrieb:
>>Besonders auch deshalb, weil in der "großen" FSM das other_ena keinen
>>Einfluss auf myEna hat...
>
> Naja, indirekt ja schon: myEna kann nicht wieder gesetzt werden, bevor
> others_ena nicht deaktiviert wurde.
>

Und dafür brauchts du zwingend eine FSM, da dieser Zweig von der 
Vorgeschichte abhängt.


>>Ich würde also das hier bieten: ...
>
> Hm, da werden ja die Zustände der FSM dekodiert, ich wollte die FSM ja
> eliminieren.
>

Wenn dir der Timungunterschied nicht wichtig ist, geht es mit einer 
kleineren FSM, (2 states) aber ohne geht es nicht.

von Joe (Gast)


Lesenswert?

OK, danke für Eure Meinung Leute.

Gruss, Joe

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.