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...
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
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.
Eine eigene Frage?
Dieser Thread ist über 12 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.