Forum: FPGA, VHDL & Co. Unterschiedliche Reihenfolge von Summanden sorgt für Unterschiede in der Synthese


von Peter (Gast)


Lesenswert?

Hallo Zusammen,

ich bin gerade nach längerer Fehlersuche auf ein seltsames Verhalten 
gestoßen: Innerhalb eines synchronen Prozesses berechne möchte ich eine 
zwei Werte addieren und einen subtrahieren, und das Ergebnis im Register 
acc1 speichern. Komischerweise unterscheidet sich das Verhalten der 
synthetisierten Schaltung je nachdem, in welcher Reihenfolge ich die 
Summanden hinschreiben. Vielleicht kann mir ja jemand schnell auf die 
Sprünge helfen, warum VHDL das Kommutativgesetz hier außer Kraft 
setzt...
1
signal d_in : unsigned(d_width - 1 downto 0);
2
signal acc1 : unsigned(d_width + 1 downto 0);
3
variable ddc_out : unsigned(d_width - 1 downto 0);
4
5
...
6
7
-- Folgende Zeile erzeugt fehlerhaftes Verhalten
8
acc1  <= d_in - ddc_out + acc1;
9
10
-- Folgende Zeile verhält sich korrekt
11
acc1  <= acc1 + d_in - ddc_out;

Danke schonmal,

Peter

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


Lesenswert?

Peter schrieb:
> ich bin gerade nach längerer Fehlersuche auf ein seltsames Verhalten
> gestoßen:
Wie bist du darauf gekommen?
Was sagt die Simulation zum Thema?

> Komischerweise unterscheidet sich das Verhalten der
> synthetisierten Schaltung je nachdem, in welcher Reihenfolge
> ich die Summanden hinschreiben.
Klingt plausibel.
Und dementsprechend bekommst du zwischendurch auch andere Ergebnisse...

> Vielleicht kann mir ja jemand schnell auf die
> Sprünge helfen, warum VHDL das Kommutativgesetz hier außer Kraft
> setzt...
Vielleicht bekommst du zwischendurch einfach einen Über- oder Unterlauf?

Zum Thema unterschiedliche "Syntheseergebnis bei gleicher 
Beschreibung" lies mal dort den letzten Abschnitt:
http://www.lothar-miller.de/s9y/archives/52-Kompakte-Flankenerkennung.html
Obwohl die Beschreibung da wirklich funktionsgleich ist, kommen da 2 
Inverter rein, wenn die Operanden des XOR vertauscht werden.

von berndl (Gast)


Lesenswert?

moin,

das liegt nicht am Kommutativgesetz sondern an den unterschiedlichen 
Bitbreiten des ersten Summanden. Bei dir also z.B. 5 (d_in, funktioniert 
nicht) und 7 (acc1, funktioniert). Du bekommst im ersten Fall einen 
Ueberlauf.
Schau dir mal die Libraryfunktion an.

von Terry (Gast)


Lesenswert?

Der gute Mann hat vergessen, dass das Ergebnis einer Addition ein Bit 
grösser werden kann und er hat zwei davon. Der Extremfall ist ein 
Zuwachs von 1,5 Bit. Der Compiler sollte sowas IMO finden, wobei ich 
auch oft sehe, dass das nicht mal als Warnung ausgegeben werden.

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.