Length of expected vs length of actual

OP #2412030
Lesenswert?

Ich habe ein Problem mit dem folgenden Codeausschnitt:
1
constant DistanceWidth : natural := 15;
2

3
signal DistMicxD : unsigned(DistanceWidth - 1 - 1 downto 0);
4
signal DistSpkxD : unsigned(DistanceWidth - 1 - 1 downto 0);
5

6
signal DistancexD : unsigned(DistanceWidth - 1 downto 0);
7

8
...
9

10
DistancexD <= DistMicxD + DistSpkxD; // Zeile 118

Dieser Code compiliert in Xilinx ISE problemlos, aber Modelsim meint 
dazu:

# ** Error: D:/Studium/Semesterarbeit 
IIS/fpga/datacapture/OffsetCalculator.vhd(118): (vcom-1272) Length of 
expected is 15; length of actual is 14.

Woran liegt das bzw. was kann ich tun?
OP #2412181
Lesenswert?

Ja schon. Da aber beide unsigned sind und das Resultat bei der Addition 
eben 15 lang werden kann, so muss das Resultat eben auch an ein 15 
langes Signal zugewiesen werden. Das klappt übrigens bei allen anderen 
Berechnungen problemlos, nur diese eine scheint Modelsim nicht zu mögen.
Moderator (Firma: Titel) Persönliche Seite #2412193
Lesenswert?

P. M. schrieb:
> Da aber beide unsigned sind und das Resultat bei der Addition
> eben 15 lang werden kann,
Und an welcher Stelle wird dann dieser 15-Bit-Wert auftreten?

> so muss das Resultat eben auch an ein 15 langes Signal zugewiesen werden
Es muß erst mal ein 15 Bit breites Resultat erzeugt werden, und das kann 
dann an das 15-bit Signal zugewiesen werden.
Bei deiner Berechnung wird auch in der Hardware erst mal ein 14 Bit 
Ergebins erzeugt, das dann an einen 15 Bit Vektor zugewiesen wird. Ein 
Überlauf wird ignoriert! Das ist sicher nicht das, was du wolltest... 
:-o

> Das klappt übrigens bei allen anderen Berechnungen problemlos...
Zeig die doch mal.
OP #2412211
Lesenswert?

Lothar Miller schrieb:
> Bei deiner Berechnung wird auch in der Hardware erst mal ein 14 Bit
> Ergebins erzeugt, das dann an einen 15 Bit Vektor zugewiesen wird. Ein
> Überlauf wird ignoriert! Das ist sicher nicht das, was du wolltest...

Ach, so ist das. Macht auch irgendwie Sinn. Ich hab mir irgendwie 
gedacht, dass die Operationen so breit ausgeführt würden, wie das 
Resultat dann wäre. Warum auch immer.

Somit sollte man also die Operanden jeweils so breit definieren wie das 
Resultat sein wird?
Moderator (Firma: Titel) Persönliche Seite #2412316
Lesenswert?

P. M. schrieb:
> Kann ich davon ausgehen, dass mein Synthesetool
> automatisch das richtige macht betreffend Länge und Vorzeichen?
Du kannst von gar nichts ausgehen.
Du mußt einfach wissen, was du machst, oder nicht?  :-/

>  betreffend Länge und Vorzeichen?
Uneingeschränkte Integer sind in VHDL 32 Bit breit. Wenn du größere 
Wortbreiten brauchst, dann bleibt dir nichts anderes als mit 
signed/unsigend zu rechnen.
Gast #2413282
Lesenswert?

P. M. schrieb:
> Ich hab mir irgendwie
> gedacht, dass die Operationen so breit ausgeführt würden, wie das
> Resultat dann wäre. Warum auch immer.
Das ist m.E. eine Inkonsistenz von VHDL.
Bei der Addition wird ungefragt abgeschnitten aber bei der 
Multiplikation muß es passen :-(

Zu den erforderlichen Bitbreite siehe auch [1].

Duke

[1] http://www.vhdl.org/comp.lang.vhdl/FAQ1.html#4.8.1

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren