Forum: FPGA, VHDL & Co. Length of expected vs length of actual


von P. M. (o-o)


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?

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


Lesenswert?

P. M. schrieb:
> Woran liegt das
Die Breite der Vektoren unterscheidet sich.
> bzw. was kann ich tun?
Gleiche Breiten verwenden:
1
DistancexD <= resize(DistMicxD,DistancexD'length) + resize(DistSpkxD,DistancexD'length); // Zeile 118

Oder gleich mit Integern rechnen... ;-)

von ich (Gast)


Lesenswert?

DistMicxD und DistSpkxD sind 14 Bit breit, DistancexD aber 15 Bit.

von jan (Gast)


Lesenswert?

DistancexD <= '0'&DistMicxD + '0'&DistSpkxD;

von P. M. (o-o)


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.

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


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.

von P. M. (o-o)


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?

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


Lesenswert?

P. M. schrieb:
> Somit sollte man also die Operanden jeweils so breit definieren wie das
> Resultat sein wird?
Ja.

> Ich hab mir irgendwie gedacht, dass die Operationen so breit ausgeführt
> würden, wie das Resultat dann wäre. Warum auch immer.
Vermutlich, weil du diesen "Automatismus" von C so kennst...

von P. M. (o-o)


Lesenswert?

Achja, wenn wir schon dabei sind: Du empfiehlst also, direkt mit 
Integern zu rechnen? Kann ich davon ausgehen, dass mein Synthesetool 
automatisch das richtige macht betreffend Länge und Vorzeichen?

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


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.

von Duke Scarring (Gast)


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

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.