Forum: FPGA, VHDL & Co. (Nochmal) Variablen: Habe ich es richtig verstanden?


von Dussel (Gast)


Lesenswert?

Moin,

um mein Verständnis zu verbessern, beschäftige ich mich nochmal mit den 
Problemen von Variablen.

Sollte ich in den Beispielen Fehler gemacht haben, könnt ihr mich gerne 
darauf hinweisen, aber um die Syntax geht es mir eigentlich nicht.

Nehmen wir die Entity als Grundgerüst:
1
entity Test is
2
    port(
3
        signal A : in typ;   -- typ ist irgendein gültiger
4
                             -- und synthetisierbarer VHDL-Datentyp
5
        signal B : in typ;
6
        signal C : in typ;
7
        signal D : in typ;
8
        signal E : out typ
9
    );
10
end Test;

Könnt ihr bitte meine Vermutungen bestätigen oder widerlegen?

Das folgende Beispiel sollte gar keine Probleme machen, oder?
1
process(A,B,C,D)
2
    variable X : typ;
3
begin
4
    X:=A and B;    -- Oder zum Beispiel eine Rechenoperation
5
    X:=X or C
6
    E<=X and D;
7
end process;

Das sollte auch problemlos gehen, oder? Die Variable wird nicht in jedem 
Durchlauf geschrieben, aber wenn sie benutzt wird, wird ihr vorher ein 
Wert zugewiesen.
1
process(A,B,C,D)
2
    variable X : typ;
3
begin
4
    if A='1' then
5
        X:=B and C;
6
        E<=X or D;
7
    else
8
        E<=(others=>'0');
9
    end if;
10
end process;

Das gibt ein Problem, weil E den alten Wert von X zugewiesen bekommt und 
danach erst X neu berechnet wird. Da X nicht in der Sensitivity List 
steht, wird der Prozess im Simulator nicht (sofort) wieder aufgerufen 
und E bekommt nicht den neuen Wert von X.
(Ähnliches Problem wie 
Beitrag "Re: Beschreibung einer State Machine" )
1
process(A,B,C,D)
2
    variable X : typ;
3
begin
4
    E<=X;
5
    X:=A and B;
6
end process;

Was für Probleme gibt es noch mit Variablen? Gibt es andere Probleme als 
dass Simulation und Realität nicht übereinstimmen? Kann es zu total 
unerwartetem Verhalten des Chips kommen?

von Dussel (Gast)


Lesenswert?

Mir ist gerade noch eingefallen, dass das letzte vielleicht ein 
schlechtes Beispiel ist.
Wie arbeitet der Simulator? Rechnet er der Reihe nach und weist dem 
Signal erst am Ende des Prozesses den neuen Wert zu oder setzt er die 
Zuweisungen ans Ende der Berechnung?

von I.d.A Treter (Gast)


Lesenswert?

Klopf doch deine VHDL-problemchen mal selbst in einen Simulator und 
schau dir im Schritt-Betrieb an was passiert.

Versteh-ing by doing - capice?!

von Weltbester FPGA-Pongo (Gast)


Lesenswert?

du solltest mal weiter vorne anfangen und dich fragen wozu du die 
variable verwenden wills und warum es kein signal sein soll

dann solltest du rausbekommen ob es funktiniert und wenn nicht, wo der 
denkfehler ist

so gibt es nämlich 100000 möglichkeiten vriablen einzusetzen und keiner 
weiß ob deine schlussfolgerungen stimmen, da du sie uns ja nicht veraten 
hast

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


Lesenswert?

Dussel schrieb:
> Das gibt ein Problem, weil E den alten Wert von X zugewiesen bekommt und
Nein, genau das ist der Unterschied zwischen Signalen und Variablen: 
Variablen übernehmen den zugewiesenen Wert sofort.

> danach erst X neu berechnet wird.
Weil die Variable in einem sequentiellen (der von oben nach unten 
abgearbeiteten) Prozess verwendet ist, wird in der nachfolgenden Zeile 
natürlich der "neue" Wert von X verwendet.

Ein Problem bekommst du nur, wenn die Variable gelesen wird, vor sie 
einen Wert zugewiesen bekommt. Denn dann muss sie ja einen Wert 
speichern.

von Dussel (Gast)


Lesenswert?

Lothar M. schrieb:
> Dussel schrieb:
>> Das gibt ein Problem, weil E den alten Wert von X zugewiesen bekommt und
> Nein, genau das ist der Unterschied zwischen Signalen und Variablen:
> Variablen übernehmen den zugewiesenen Wert sofort.
Klar.

Lothar M. schrieb:
>> danach erst X neu berechnet wird.
> Weil die Variable in einem sequentiellen (der von oben nach unten
> abgearbeiteten) Prozess verwendet ist, wird in der nachfolgenden Zeile
> natürlich der "neue" Wert von X verwendet.
>
> Ein Problem bekommst du nur, wenn die Variable gelesen wird, vor sie
> einen Wert zugewiesen bekommt. Denn dann muss sie ja einen Wert
> speichern.
Das ist doch genau der Fall. Erst wird E der Wert von X zugewiesen und 
dann erst X neu berechnet. Oder wird die Zuweisung ans Ende des Prozess 
gelegt und damit der neue Wert von X zugewiesen?
(Die Texte beziehen sich auf das Beispiel unter dem Text. Da hat das 
Forum Leerzeilen entfernt.)

von Dussel (Gast)


Lesenswert?

Anders gefragt, stimmt die Aussage: Variablen, die vor ihrer Verwendung 
einen Wert zugewiesen bekommen, sind immer sicher, speichernde Variablen 
sollten nicht verwendet werden.

Gibt es für die Synthese sinnvolle Anwendungsgebiete von speichernden 
Variablen?

Speichernd bedeutet natürlich über einen Prozessdurchlauf hinaus.

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


Lesenswert?

Dussel schrieb:
> Anders gefragt, stimmt die Aussage:...
Ja.

> Gibt es für die Synthese sinnvolle Anwendungsgebiete von speichernden
> Variablen?
Du könntest damit z.B. "lokale" Zähler und FSM bauen. Ich nehme trotzdem 
Signale...

von Dussel (Gast)


Lesenswert?

Ok, danke.

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.