Hallo, ich habe 2 Fragen zum grundlegenden Verständnis von VHDL. 1) Warum macht es einen Unterschied, wenn man innerhalb eines Prozesses einen Ausgang mit einer Prozessvariablen beschreibt, oder man statt einer Prozessvariablen ein entsprechendes Signal innerhalb eines Prozesses beschreibt und dieses dem Ausgang zuweist ? 2) Warum liegt hier nach Ablauf des Prozesses in Wirklichkeit am SIG keine '0' ? signal SIG; test:process(X) begin SIG <= '1'; if SIG = '1' then SIG <= '0'; endif; end process; Danke für die Hilfe.
Hi, zu 2.) alle Signal die innerhalb eines Prozesses gelesen werden, müssen in die sensitivitylist! So sollte es klappen: signal SIG; test:process(X, SIG) begin SIG <= '1'; if SIG = '1' then SIG <= '0'; endif; end process; Beste Grüße!
1. Prozessvariablen sind temporär und fast überflüssig! Mach alles mit richtigen Signals. 2. Synthetisierbare VHDL ist kein Software: Du beschreibst eine digitale Schaltung. Alles, in diesem Fall, SIG <= '1'; und if SIG = '1' then SIG <= '0'; endif; sind parallel und machen keinen Sinn. Das macht Sinn: test:process(clk, rst) begin if rst = '0' then SIG <= '1'; elsif rising_edge(clk) then SIG <= not(SIG); endif; end process; Ohne das Taktsignal weißt Hardware von Zeitphänomen nichts und die Initialisierung ist nur mit einem Reset Signal möglich (viele FPGA haben jedoch ein implizites Resetverfahren beim hochfahren)
Rufio00 schrieb: > zu 2.) > alle Signal die innerhalb eines Prozesses gelesen werden, müssen in die > sensitivitylist! Aha, okay. Ich dachte die 'sensitivity list' ist nur dazu da, den Prozess bei entsprechen Signaländerungen der Signale in der 'sensitivity list' zu starten. Kann es zudem das Problem sein, dass man versucht 2 Treiber ('1' und '0') auf ein Signal zu geben und dadurch ein unbekannter Zustand entsteht ? St. D. schrieb: > Alles, in diesem Fall, > > SIG <= '1'; > > und > > if SIG = '1' then > SIG <= '0'; > endif; > > sind parallel und machen keinen Sinn. Innerhalb von Prozessen werden Anweisungen doch sequentiell abgearbeitet ? St. D. schrieb: > 1. Prozessvariablen sind temporär und fast überflüssig! Mach alles mit > richtigen Signals. Danke, ich muss trotzdem noch mal nachhaken. Beispiel: (in der entity ist A : out std_logic; definiert) 1) signal test; process(X) begin if X = '0' then test <= '0'; end if; A <= test; end process; 2) process(X) variable test; begin if X = '0' then test := '0'; end if; A <= test; end process; Laut Skript ist beides syntaktisch richtig, führt aber zu zwei unterschiedlichen Ergebnissen. Warum ?
Florian schrieb: > Aha, okay. Ich dachte die 'sensitivity list' ist nur dazu da, den > Prozess bei entsprechen Signaländerungen der Signale in der 'sensitivity > list' zu starten. Ja, aber nur im Simulator. Dort wird der Prozess neu berechnet wenn sich mindestens eins der Signale in der Liste ändert. Florian schrieb: > Kann es zudem das Problem sein, dass man versucht 2 Treiber ('1' und > '0') auf ein Signal zu geben und dadurch ein unbekannter Zustand > entsteht ? Natürlich. Das gibt einen Kurzschluss und das Sythesetool meckert dir das an. Im Simulator entsteht ein 'X'. Florian schrieb: > Innerhalb von Prozessen werden Anweisungen doch sequentiell abgearbeitet > ? Naja, auch wieder nur im Simulator. Im FPGA/CPLD wird nur das sythetisiert, was das Endergebnis ist. Zwischenschritte mit Variablen etc. dienen nur der Veranschaulichung. Sequenzielle Abläufe kannst du nur über State-Machines realisieren.
Florian schrieb: > Laut Skript ist beides syntaktisch richtig, führt aber zu zwei > unterschiedlichen Ergebnissen. Warum ? 1.) test und A bekommen den neuen Wert erst am Ende des Prozesses zugewiesen, also dauert es einen Durchlauf laenger 2.) test bekommt sofort den neuen Wert zugewiesen, damit hat dann A am Ende des Prozesses auch den neuen Wert Schau mal da: http://www.mikrocontroller.net/articles/VHDL#Wann_und_warum_verwendet_man_Variablen.3F
Florian schrieb: > Laut Skript ist beides syntaktisch richtig, Dein Script lügt! Oder sagen wir so: es lenkt ab. Denn der eigentliche Trick beim Prozess mit dem Signal test ist die unvollständige Sensitivliste: es fehlt das Signal test. Also ist zwar der Prozess syntaktisch richtig, aber die Sensitivliste falsch. Und dadurch können sich seltsame Effekte ergeben. Siehe den Beitrag "Variable vs Signal" Denn syntaktisch korrekt ist auch dieser Satz: "Die grünen Radkappen schlafen im Hochdruckgebiet mit vorgelegten Salatköpfen." Jeder Teil des Satzes hat seine korrekte Stelle. Die Syntax ist tadellos. Trotzdem ist der Satz sinnlos...
:
Bearbeitet durch Moderator
Hmmm..., Wenn du innerhalb eines Processes ein Signal verwendest welches außerhalb angelegt wurde und nicht in der Sensitivliste steht so darf es nur links von einer Zuweisung stehen im Process. Wenn es rechts einer Zuweisung steht muss es in der Sensitivliste erscheinen ansonsten gibt es eine Fehlermeldung beim compilieren mit Quartus. Gruss
...beim compilieren mit Quartus weil diese sogenannte Drahtverbindung nicht hergestellt werden kann von rechts nach links der Zuweisung.
peter schrieb: > Wenn du innerhalb eines Processes ein Signal verwendest welches > außerhalb angelegt wurde und nicht in der Sensitivliste steht so darf es > nur links von einer Zuweisung stehen im Process Man darf das schon machen, aber der Synthesizer warnt dann, dass die Simulation nicht mehr zur Realität passen wird. Ob das nun eine Warnung oder eine Fehlermeldung ist, ist sicher Programmabhängig. Bei Xilinx ist es nur eine Warnung. Für die Synthese ist das nämlich unerheblich, das kommt immer das gleiche raus.
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.