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
variableA:std_logic_vector(33downto0);
2
variableB:std_logic_vector(16downto0);
3
4
...
5
6
B:=A(33downto17);
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
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).
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.
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.
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
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
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
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
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
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.
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.
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!
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.
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"