Hallo. Ich liege mit einem Kollegen gerade im Diskurs darüber, die genau Berechnungen in VHDL ausgeführt werden. Ich bin der Auffassung, dass das Ergebnis einer Berechnung innerhalb eines process Blocks dem sequentiellen Ausführen der Befehle entspricht, auch wenn durch die Synthetisierung Ergebnisse durchaus parallel berechnet werden. Bsp. zum besseren Verständnis: process(clk) begin if rising_edge(clk) then x := a + b; -- some other code -- z := x + 10; end if; end process; Ich bin der Meinung, dass z am Ende a+b+10 enthält, mein Kollege, dass z am Ende den ursprünglichen Wert von x +10 enthält. Was ist denn nun der Fall? Was passiert, wenn die Berechnung innerhalb der if-Klausel länger dauert als ein Taktzylus? Macht es einen Unterschied, ob man Signale oder Variablen benutzt? Vielen Dank für eure Hilfe
So wie du den Process beschrieben hast fehlen die Variablendeklarationen. Variablen nehmen im Process sofort den neuen Wert an und werden mit := zugewiesen. Anders sind Signale die mit <= zugewiesen werden und den neuen Wert am Ende des Process übernehmen. In deinem Code wird z also in der Tat a+b+10 enthalten. Dein Kollege hat Recht, wenn du := mit <= ersetzt. Ob die Berechnung zu lange dauert sagt dir eine Timing-Analyse für den konkreten Baustein. Was dann passiert ist abhänging von eben diesem Baustein.
Also im Falle der Verwendung von Variablen hast du recht. Dann wird es so realisiert als wenn die Anweisungen direkt nacheinander ausgeführt werden. Im Falle der Verwendung von Signalen hat dein Kollege recht. Da werden alle Anweisungen parallel bearbeitet und die letzte Anweisung kennt noch nicht das Ergebnis der Ersten. Wenn die Berechnung innerhalb der If-Klausel länger dauert als dein Taktzyklus ist, dann bekommst du beim Place & Route einen Fehler, welcher dich darauf hinweisst, dass dein Timingconstraint nicht eingehalten werden kann.
> Was ist denn nun der Fall? Du hast recht, aber nur, weil du Variablen verwendet hast. Das ist aber eine ganz andere Problematik... Siehe dazu den Beitrag "Variable vs Signal" > Was passiert, wenn die Berechnung innerhalb der if-Klausel länger dauert > als ein Taktzylus? Dann werden entweder deine Timing-Constraints verletzt (so du welche verwendet hast), oder dein Design läuft nicht (zuverlässig). > Macht es einen Unterschied, ob man Signale oder Variablen benutzt? Ja. Als Anfänger solltest du nur Signale verwenden... Natürlich wirst du deren Beschränkungen kennenlernen. Aber einfach durchgängig Variablen (oder sogar Shared Variablen) zu verwenden, bringt ganz andere Effekte mit sich. Variablen sollten nur lokale Hilfswerte für Berechnungen aufnehmen. Sobald du eine Variable als Speicherglied verwendest (Zustandsmerker oder Zähler) mußt du diese Lösung und die Randeffekte sehr gut abschätzen und handhaben können. Am einfachsten passiert es, dass du eine Variable "aus Versehen" ungewollt zu einem Speicherglied umfunktionierst, wie es im Beitrag "latch probleme" passiert ist.
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.