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?