Forum: FPGA, VHDL & Co. Denkfehler beim Einsatz von Variablen?


von Frank (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe in meiner Simulation ein Problem mit einer Variable und kann 
mir einfach nicht erklären, wo mein Denkfehler ist.

Beide Variablen stehen in der folgenden Beziehung:
1
variable  A  :  std_logic_vector(33 downto 0);
2
variable  B  :  std_logic_vector(16 downto 0);
3
4
... 
5
6
B := A(33 downto 17);

Das Simulationsergebnis ist im Bild dargestellt.

Variablen sind doch anders als Signale, die über FlipFlops umgesetzt 
werden und daher erst einen Takt später „aktualisiert“ werden, rein 
kombinatorische Logik und werden daher lediglich mit einem Delay, was 
der Gatterlaufzeit entspricht, umgesetzt.

Nun frage ich mich aber, wieso das hier in diesem Fall nicht passiert. 
Sollte B denn nicht schon zum rot markierten Zeitpunkt den Wert x“00000“ 
annehmen?

Dabei sollte es ja egal sein, wie genau A gebildet wird. Fakt ist, dass 
es in diesem Takt diesen Wert annimmt und dementsprechend sollte sich 
dann nach meinem Weltbild auch B im Modelsim verhalten.

Kann sich jemand das Simulationsergebnis erklären bzw. welche 
Bedingungen könnten evtl. dazu führen, dass das Ergebnis doch so korrekt 
ist?

Vielen Dank!
Frank

von P. K. (pek)


Lesenswert?

Frank schrieb:
> Nun frage ich mich aber, wieso das hier in diesem Fall nicht passiert.
> Sollte B denn nicht schon zum rot markierten Zeitpunkt den Wert x“00000“
> annehmen?

Ist mit deiner zitierten Code-Sequenz nicht zu bestimmen, da fehlt 
zuviel. Wenn der Prozess die Stelle nicht durchläuft (e.g. 
unvollständige Sensitivityliste oder waits), wird auch nichts 
zugewiesen.

> Variablen sind doch anders als Signale, die über FlipFlops umgesetzt
> werden und daher erst einen Takt später „aktualisiert“ werden.

Da bringst Du zwei orthogonale Dinge durcheinander, auch Signale können 
rein kombinatorische Logik beschreiben, ein FF ist nicht zwingend.

Im Simulator wird aber das Signal erst am Ende des Prozesses resp. bei 
einem wait zugewiesen, während die Variable gleich den neuen Wert erhält 
(vorausgesetzt der Prozess wurde getriggert, siehe oben).

von Stachele (Gast)


Lesenswert?

Zeig doch mal den Code, in dem diese Variablen verwendet werden.

von Frank (Gast)


Lesenswert?

Peter K. schrieb:
> Ist mit deiner zitierten Code-Sequenz nicht zu bestimmen, da fehlt
> zuviel. Wenn der Prozess die Stelle nicht durchläuft (e.g.
> unvollständige Sensitivityliste oder waits), wird auch nichts
> zugewiesen.
Die Zuweisung erfolgt ja, nur für mein Dafürfinden einen Takt zu spät.

A wird in diesem Prozess mit Hilfe von zahlreichen anderen Signalen und 
Variablen gebildet. Aber entscheidend ist doch, dass zu diesem Zeitpunkt 
A diesen Wert hat, unabhängig wie die Vorgeschichte ist, oder?

Ich weiss halt nicht was passieren muss bzw. passiert ist, um die 
Zuweisung der Veriablen um einen Takt zu verzögern?

Vielen Dank!
Frank

PS: Der umgebende Code erscheint mir etwas zu umfangreich, um ihn hier 
zu posten.

von P. K. (pek)


Lesenswert?

Frank schrieb:
> PS: Der umgebende Code erscheint mir etwas zu umfangreich, um ihn hier
> zu posten.

Dann definier' halt B als Signal und weise es ausserhalb des Prozesses 
(i.e. concurrent) zu, dann wird's todsicher gehen.

Löst aber die Tatsache nicht, dass Dein Prozess offensichtlich anders 
funktioniert, als Du erwartest.

von Frank (Gast)


Lesenswert?

Peter K. schrieb:
> Dann definier' halt B als Signal und weise es ausserhalb des Prozesses
> (i.e. concurrent) zu, dann wird's todsicher gehen.
Das wäre nicht wirklich praktikabel, weil ich A dann auch als signal 
definieren müsste, was aber sehr weitreichende Änderungen im Prozess 
nach sich ziehen dürfte. Mein Code erfüllt sonst seine Funktion, nur 
diese kleine Ungenauigkeit erzeugt mir in unregelmäßigen Abständen 
Fehler... ich möchte ungern alles nochmal von vorne aufrollen und 
testen.

Peter K. schrieb:
> Löst aber die Tatsache nicht, dass Dein Prozess offensichtlich anders
> funktioniert, als Du erwartest.
Ja leider... genau deswegen habe ich hier gepostet.
Der Prozess umfasst fast 400 Zeilen, die man auch nicht kürzen, splitten 
oder vereinfachen kann, weil zwingend notwendige Berechnungen 
durchgeführt werden.

Vielen Dank!
Frank

von nocode (Gast)


Lesenswert?

Frank schrieb:
> PS: Der umgebende Code erscheint mir etwas zu umfangreich, um ihn hier
> zu posten.

Dann kann dir auch keiner helfen....

Dann mach doch wenigsten ein Minimalbeispiel, damit du
siehst wie sich Variablen verhalten.

nocode

von Frank (Gast)


Lesenswert?

nocode schrieb:
> Dann mach doch wenigsten ein Minimalbeispiel, damit du
>
> siehst wie sich Variablen verhalten.
Ich schaue mal, wie ich es so einkürzen kann, dass es überschaubar ist 
und dennoch der Fehler nachvollziehbar sein könnte.

Vielen Dank!
Frank

von Tim (Gast)


Lesenswert?

Hallo Tim,
Ich könnte mir vorstellen, dass du die Variable A unterhalb der Variable 
B zuweist.
im Sinn von
variable  A  :  std_logic_vector(33 downto 0);
variable  B  :  std_logic_vector(16 downto 0);

...
process
...

B := A(33 downto 17);
...
A := irgendetwas;
...
end process;
..

Ist das möglich?
Gruss Tim

von Tim (Gast)


Lesenswert?

Hallo Frank meinte ich, sorry;)

von Frank (Gast)


Lesenswert?

Hallo Tim,

ja das ist korrekt.
Muss ich bei Variablen also darauf achten, dass ich wie bei der 
Softwareprogrammierung die korrekte Reihenfolge einhalte?

Das ist mir neu...

Vielen Dank!
Frank

von Tim (Gast)


Lesenswert?

Nach meinem VHDL Verständnis schon. Variablen werden immer sofort 
upgedated. Zumindest für die Zuweisung von Variablen kann man sich das 
ganze Sequentiell vorstellen. Natürlich wird dann diese "Sequenzialität" 
beim synthetisieren entsprechend in HW umgesetzt. Ich gehe davon aus, 
dass wenn du B nach dem A zuweist, du keine Probleme mehr haben 
solltest.

von Selbi (Gast)


Lesenswert?

Frank schrieb:
> Variablen sind doch anders als Signale, die über FlipFlops umgesetzt
> werden und daher erst einen Takt später „aktualisiert“ werden, rein
> kombinatorische Logik und werden daher lediglich mit einem Delay, was
> der Gatterlaufzeit entspricht, umgesetzt.

Nein! Variablen sind Hilfskonstrukte, die keinen realen Objektbezug 
haben und nur während der Simulation und der Synthese in der 
Compile-software existieren. Um daraus Kombinatorik, also Schaltungscode 
zu erzeugen. müssen sie in ein Signal überführt werden.

Mit Variablen kannst Du

a) komplizierte Umformungen in verschiedene Zeilen aufteilen und somit 
dafür sorgen, dass ein Ausgangssignal innerhalb einer Signalzuweisung 
mit Eingängen oder anderen Signale verknüpft wird. Ob das dann später im 
selben Takt passiert, hängt wie bei Signalen davon ab, ob Du es im 
getakteten Prozess machts.

b) komplizierte Simulationen erzeugen, da man mit Variablen mehr machen 
kann, als mit Signalen und dies auch noch einfacher

c) die Synthese steuern, in dem man komplexe Konstrukte aufzieht, 
bedingte Compilationen durchführt und während der Synthesezeit 
Berechnungen anstellt, die abhänig von Einstellungen zu anderen 
Formulierungen führen

Für das, was Du da machen willst, brauchst Du keine Variablen.

von Frank (Gast)


Lesenswert?

Exakt... das Problem ist nun weg und A und B ändern sich so wie von mir 
erwartet - nämlich gleichzeitig!

Ich konnte lange auf Variablen verzichten. Aber seit geraumer Zeit komme 
ich nicht mehr drumherum - gerade wenn man mehrere Operationen in einem 
Takt umsetzen möchte. Da ist mir diese Sequenzialität nie aufgefallen, 
weil ich es scheinbar zufällig richtig gemacht habe.

Wieder was gelernt!
DANKE!

von T.M. (Gast)


Lesenswert?

Frank schrieb:
> Ich konnte lange auf Variablen verzichten. Aber seit geraumer Zeit komme
> ich nicht mehr drumherum - gerade wenn man mehrere Operationen in einem
> Takt umsetzen möchte.

Ansich gibt es selbst bei komplexen Designs keinen Grund, Variablen zu 
benutzen. Wenn ich mehrere Operationen in einem Takt machen möchte, 
nutze ich nebenläufige Anweisungen, deren Ergebnis dann halt in einem 
getaktetem Prozess einsynchronisiert wird. Manchmal nutze ich Variablen, 
wenn ich zB. schnell einen Counter bauen will, der ein Enable Bit setzt, 
und ich für den Counterwert extra Signal definieren will.

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


Lesenswert?

Frank schrieb:
> ja das ist korrekt.
> Muss ich bei Variablen also darauf achten, dass ich wie bei der
> Softwareprogrammierung die korrekte Reihenfolge einhalte?
Eigentlich hätte die Variable A in die Sensitviliste gehört, weil eine 
Änderung der Variablen A eine Neuberechnung des Prozesses und damit eine 
Zuweisung an die Variable B nötig macht. Blöderweise kann man aber keine 
Variablen in eine Sensitivliste eintragen. Aber halb so schlimm: das 
passiert anderen auch...
Beitrag "Re: Variable vs Signal"

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.