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.
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<=notpwm;
4
endprocess;
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!
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?
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...
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.
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.
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?
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang