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.
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ß
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 ?
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)
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...'
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.
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...
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.
signal C... C <= A & B; case C is ... ??? Und was ist jetzt mit diesem Fall? Habe ich schon öfters gesehn (Beispiel Codes von Xilinxs)...
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.