Forum: FPGA, VHDL & Co. asynchrone Anweisungen


von Daniel (Gast)


Lesenswert?

1
process(clk, rst)
2
begin
3
...
4
end process;
5
pwm <= not pwm;

Wann genau wird
1
pwm <= not pwm;
 ausgeführt?
Sofort? Wann ist sofort?

von Vancouver (Gast)


Lesenswert?

Da das Statement außerhalb des Prozesses steht, wird es immer 
ausgeführt, beginnend mit dem Start der Simulation. In der Hardware 
ebenso, aber hier sollten die Tools erkennen, dass es eine 
kombinatorsuche Schleife ist und einen Fehler ausgeben.

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


Lesenswert?

Daniel schrieb:
> Wann genau wird pwm <= not pwm; ausgeführt?
Du denkst falsch!
Da wird nicht irgendwie "ausgeführt",  sondern daraus wird Hardware 
gemacht.
Siehe 
http://www.lothar-miller.de/s9y/categories/36-Kombinatorische-Schleife

> Sofort? Wann ist sofort?
Nach Anlegen der Versorgung, Laden des FPGAs und deaktivieren des 
globalen Reset (wenn es sowas in deinem FPGA gibt).

Vancouver schrieb:
> Da das Statement außerhalb des Prozesses steht, wird es immer ausgeführt
Das ist "gefühlt" richtig. Aber natürlich berechnet  der Simulator die 
Anweisung nur, wenn sich eine Änderung ergab. Man kann aus jeder 
einzelnen nebenläufigen Anweisung auch ganz einfach einen 
funktionsgleichen Prozess machen, indem man die Signale rechts der 
Zuweisung in die Sensitivliste aufnimmt:
1
process (pwm)
2
begin
3
   pwm <= not pwm;
4
end process;
Und jetzt kommt die Regel zum Tragen, die sagt, dass ein Prozess immer 
dann neu berechnet werden muss, wenn sich ein Signal in der 
Sensitivliste ändert. Man merkt schnell: Deadlock!

: Bearbeitet durch Moderator
von Vancouver (Gast)


Lesenswert?

Lothar M. schrieb:
> Man merkt schnell: Deadlock!

Deadlock oder Livelock, je nachdem, wie man es sieht :-) Ich meine, der 
Prozess wird ständig aufgerufen und hungert damit alle anderen 
Simulatoroperationen aus. (Das gleiche müsste ohne den Prozess drumherum 
passieren, aber ich habe es noch nicht ausprobiert. )

Was würde eigentlich passieren, wenn die Zuweisung im prozess stehen 
würde, aber ohne rising_edge(clk) bzw. clk'event?

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


Lesenswert?

Vancouver schrieb:
> Ich meine, der Prozess wird ständig aufgerufen und hungert damit alle
> anderen Simulatoroperationen aus. (Das gleiche müsste ohne den Prozess
> drumherum passieren, aber ich habe es noch nicht ausprobiert. )
So ist es, und während der andauerenden Toggelei die Simulationszeit 
nicht weiterläuft, kommt irgendwann die Meldung "maximum number of 
iterations reached" o.ä.

Vancouver schrieb:
> Was würde eigentlich passieren, wenn die Zuweisung im prozess stehen
> würde, aber ohne rising_edge(clk) bzw. clk'event?
Und was "würde" in diesem Fall in der Sensitivliste stehen? Wenn es 
nicht "pwm" ist, dann ist die Sensitivliste falsch und die Simulation 
auch. An der erzeugten Hardware ändert sich nichts: ein rückgekoppelter 
Inverter...

von Daniel (Gast)


Lesenswert?

OK. Vielleicht war das beispiel schlecht.
1
process(clk)
2
begin
3
pwm1 <= not pwm1;
4
end process;
5
pwm <=  pwm1;

Das trifft es wohl ehr...

von Gustl B. (-gb-)


Lesenswert?

Da ist es genauso. Die Zuweisung kannst Du Dir als Draht vorstellen. 
Sobald da eine Spannung ans eine Ende gelegt wird ist die auch am 
anderen Ende. Sprich sobald sich pwm1 ändert, übernimmt pwm diesen Wert, 
sofort.

Also im FPGA ist das eine Leitung, pwm ist da mit pwm1 direkt verbunden.

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


Lesenswert?

Daniel schrieb:
> OK. Vielleicht war das beispiel schlecht.
Tja, so ist das eben...

> Das trifft es wohl ehr...
Da gibt es in der finalen Schaltung das Signal pwm gar nicht mehr. Es 
wird direkt das Flipflop pwm1 auf den Ausgang geroutet.

von Vancouver (Gast)


Lesenswert?

Lothar M. schrieb:
> Und was "würde" in diesem Fall in der Sensitivliste stehen? Wenn es
> nicht "pwm" ist, dann ist die Sensitivliste falsch und die Simulation
> auch.

Die SensListe soll genau so aussehen wie oben im Beispiel, also clk und 
rst. Klar dass die Simulation dann falsch ist, aber was würde sie tun? 
pwm invertieren bei beiden clk-Flanken?
Auch habe ich mich schon gefragt, warum man in einem synchronen prozess 
immer clk'event und clk='1' abfragen muss. clk'event ist doch 
automatisch erfüllt, wenn clk alleine in der Sensliste steht. Warum kann 
man clk'event nicht weglassen, wenn nur clk in der Sensliste steht?

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


Lesenswert?

Vancouver schrieb:
> aber was würde sie tun? pwm invertieren bei beiden clk-Flanken?
Ja. Probiers einfach mal aus.

Vancouver schrieb:
> Warum kann man clk'event nicht weglassen, wenn nur clk in der Sensliste
> steht?
Siehe http://www.lothar-miller.de/s9y/archives/16-Takt-im-Prozess.html
Oder kurz: das 'event ist das Schlüsselwort für den Synthesizer, ein 
Flipflop zu erzeugen.

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.