Forum: FPGA, VHDL & Co. keine Variablen - case anweisung


von synthese (Gast)


Lesenswert?

Hallo,

ich bin VHDL-Anfänger und habe eine Frage. Wie ich in einem anderen 
Thread gelesen habe sollte man mit Variablen sparsam umgehen. Auf der 
anderen Seite finden Signal Zuweisungen immer erst am Ende eines 
Prozesses statt. Was ist wenn ich mit Case Signale überprüfen möchte?

case A & B is --- verboten

variable C...
C := A & B;
case C is .... sollte funktionieren

signal C...
C <= A & B;
case C is ... ???

Wird das erst bei nächsten CLK zyklus ausgeführt. Irgendwie ist das 
nicht ganz durchschaubar.

von Daniel__m (Gast)


Lesenswert?

Hi,

Variante c geht, sofern die Zuweisung von c kombinatorisch außerhalb des 
Case-Prozesses erfolgt.

Die Variante b ist in diesem Fall völlig erlaubt und auch die 
bevorzugtere Lösung.

Gruß

von synthese (Gast)


Lesenswert?

Daniel__m schrieb:
> Variante c geht, sofern die Zuweisung von c kombinatorisch außerhalb des
> Case-Prozesses erfolgt.

Die Frage ist ab dann die aktuellen Werte berücksichtig werden, oder die 
vorherigen (letzte clk flanke). Es heist ja immer Zuweisung findet erst 
am Ende des Prozesses statt! Warum geht es dann trotzdem ?

von Daniel__m (Gast)


Lesenswert?

Deswegen: außerhalb vom Prozess.

Vereinfacht kann man sagen, alle Prozess laufen quasi echt parallel ab 
und werden sofort wieder durchlaufen, sofern sie nicht durch einen Takt 
synchronisiert sind. Die kombinatorische Zuweisung hat keinen Takt, 
daher wirkt sie sofort (abgesehen von geringen Durchlaufenzeiten, welche 
hier nicht existiert, da der &-Operator nicht einmal echte Kombinatorik 
ist)

von berndl (Gast)


Lesenswert?

ich vermute, du vermischst hier einiges bzgl. VHDL...

- Es gibt 2 Arten der Beschreibung:
-- Concurrent
-- Sequential

Sequential wird ueblicherweise fuer einen getakteten Teil verwendet 
(also mit clk in der Sensitivity Liste sowie ein rising_edge(clk). Es 
kann aber auch fuer 'fliegende' Logik verwendet werden (also alle 
Eingangsgroessen in der Sensitivity Liste), das kannst du aber auch 
recht einfach als concurrent statement schreiben (z.B. mit dem select 
statement anstatt case wie im Prozess).

Variablen kann man nur in einem sequential Prozess verwenden, es ist 
grob vereinfacht sowas wie eine lokale Variable in einer 
Programmiersprache. Im allgemeinen ist eine Variable im Prozess entweder 
ein 'fliegendes' Logiksignal oder auch ein 'lokales' FlipFlop 
(allerdings nicht der Q-Ausgang sondern der D-Eingang). Wie Lothar hier 
zurecht immer schreibt, als Anfaenger wirst du fuer deine 
Problemstellung keine Variable brauchen. Und als Fortgeschrittener 
koenntest du deine Variable ganz einfach durch ein concurrent Statement 
ersetzen.

Und bzgl. concurrent vs sequential: Der Unterschied zwischen den beiden 
Beschreibungsformen ist salopp gesagt, dass bei concurrent es genau 
eine Zuweisung im Code gibt, bei sequential wird einem Signal/Variable 
mehrmals ein Wert zugewiesen, da gewinnt dann halt die letzte...

Also, gut gemeinter Rat: Vergiss erstmal Variablen. Das kannst du mit 
concurrent statements einfacher machen (ich verwende Variablen nur, um 
z.B. in einem process eine 'Zwischenberechnung' zu machen die ich danach 
an mehreren Stellen weiter verwende). Und ausserdem hat das ganze 
garnienix mit lokalen und globalen Variablen einer Programmiersprache zu 
tun, wir beschreiben hier schliesslich 'lose auf dem Chip rumliegende 
Hardware...'

von Daniel__m (Gast)


Lesenswert?

berndl schrieb:
> ich vermute, du vermischst hier einiges bzgl. VHDL...
>
> - Es gibt 2 Arten der Beschreibung:
> -- Concurrent
> -- Sequential
>

Ja, die waren gemeint. Wenn es schon Fachbegriffe dafür gibt, sollte man 
sie auch nutzen.

Mit "kombinatorisch zuweisen", meinte ich ein concurrent-Statement.

von berndl (Gast)


Lesenswert?

synthese schrieb:
> case A & B is --- verboten
>
> variable C...
> C := A & B;
> case C is .... sollte funktionieren
>
> signal C...
> C <= A & B;
> case C is ... ???

ebend. Und dann kannst du das 2. Beispiel auch als stinknormales 
concurrent statement irgendwo im Code als C <= A & B hinschreiben. Das 
funktioniert ganz genauso wie wenn du im process eine Variable 
deklarierst und dann C := A & B hinschreibst. Bei der dritten Variante 
oben (C <= A & B) in einem nicht getakteten process wirds schon 
interessanter. Da beschreibst du naemlich ein FlipFlop oder Latch oder 
eben kontextbezogen ein Logiksignal. Viel Spass beim debuggen :o)

Bei VHDL oder Verilog gilt meiner Meinung nach: Kepp it simple! Also 
fuer den Fall oben ein concurrent statement und jeder der den Code sieht 
weiss was gemeint ist...

von Klaus (Gast)


Lesenswert?

berndl schrieb:
> Bei VHDL oder Verilog gilt meiner Meinung nach: Kepp it simple! Also
> fuer den Fall oben ein concurrent statement und jeder der den Code sieht
> weiss was gemeint ist...

Oooooder man nimmt in diesem Falle einfach die Variable (Variablen sind 
nicht per se böse!) und sieht im Code direkt was C ist, bzw. wo es her 
kommt. Wenn man es nebenläufig außerhalb des Processes schreibt, muss 
man unnötig suchen und und her scrollen, nur um zu sehen, das C 
eigentlich A & B ist.

Variablen haben zwar ein paar Stolperfallen, wie hier schon oft 
diskutiert, aber deswegen gleich blind Variablen grundsätzlich 
abzulehnen ist doch etwas übers Ziel hinausgeschossen ;-) In diesem Fall 
ist es ein perfekter Einsatz einer Variablen.

von synthese (Gast)


Lesenswert?

signal C...
C <= A & B;
case C is ... ???


Und was ist jetzt mit diesem Fall?
Habe ich schon öfters gesehn (Beispiel Codes von Xilinxs)...

von Daniel__m (Gast)


Lesenswert?

Da fehlt ziemlich viel vhdl drum herum.

Aber Ich nehme mal an, dass im Xilinx-Fall der Process nicht getaktet 
ist. Somit würde es auch funktionieren.

Aber hier muss ich Klaus recht geben: der aktuelle Fall ist ein 
Paradebeispiel für die Verwendung von Variablen. Die Deklaration, die 
Zuweisung und die Verwendung ist sehr lokal und fördert die 
Verständlichkeit des Quelltextes.

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


Lesenswert?

Interessant wäre hier, in was für einem Prozess diese dritte 
case-Abfrage (über C als Signal) steht: ist das ein kombinatorischer 
oder ein getakteter Prozess? Im ersteren Fall müsste dann einfach das 
Signal C in die Sensitivliste, im zweiten Fall wäre das Signal C dann 
sowieso ein Speicherelement mit der resultierenden Latency.
Kurz: für eine zuverlässige Aussage zum Verhalten der Beschreibung fehlt 
noch ein wenig Drumherum...

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.