Forum: FPGA, VHDL & Co. Grundsätzliches


von Ratlos (Gast)


Lesenswert?

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

von SeriousSam (Gast)


Lesenswert?

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.

von Ratlos (Gast)


Lesenswert?

Danke

von Nephilim (Gast)


Lesenswert?

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.

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


Lesenswert?

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