Forum: FPGA, VHDL & Co. VHDL Grundlagenverständnis


von Florian (Gast)


Lesenswert?

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.

von Rufio00 (Gast)


Lesenswert?

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!

von St. D. (st_d)


Lesenswert?

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)

von Florian (Gast)


Lesenswert?

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 ?

von Christian R. (supachris)


Lesenswert?

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.

von berndl (Gast)


Lesenswert?

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

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


Lesenswert?

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
von peter (Gast)


Lesenswert?

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

von peter (Gast)


Lesenswert?

...beim compilieren mit Quartus weil diese sogenannte Drahtverbindung 
nicht hergestellt werden kann von rechts nach links der Zuweisung.

von Christian R. (supachris)


Lesenswert?

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
Noch kein Account? Hier anmelden.