Forum: FPGA, VHDL & Co. Rechnen mit numeric Bibliothek und verschieden breiten std_logic_vector


von Michi (Gast)


Lesenswert?

Ich möchte mehrere std_logic_vector (alle gleich breit) addieren und die 
Summe in einem entsprechend breiteren std_logic_vector speichern.

Wie von Lothar Miller empfohlen sollen die Rechenoperationen mit der 
herstellerunabhängigen numeric-Bibliothek erfolgen.

Mein Codeausschnitt hierfür:
----------------------------

USE ieee.numeric_std.ALL;

SIGNAL a, b, c, d : std_logic_vector(3 DOWNTO 0);
SIGNAL z          : std_logic_vector(5 DOWNTO 0);

z <= std_logic_vector(unsigned(a) + unsigned(b) + unsigned(c) + 
unsigned(d));

Damit erhalte ich mit Lattice Diamond folgende Fehlermeldung: "ERROR - 
CD297 : Width mismatch, location has width 6, value 4


Wenn ich noch mehr Typwandlungen durchführe, funktioniert es:
z <= std_logic_vector(to_unsigned(to_integer(unsigned(a) + unsigned(b) + 
unsigned(c) + unsigned(d)), z'length));

Das sieht aber vor allem bei noch größeren Operationen, wie ich sie 
benötige, sehr unübersichtlich aus, daher die Frage, wie geht es 
"kürzer" bzw. "kompakter"?

Ich freue mich über eure Rückmeldungen.

von berndl (Gast)


Lesenswert?

hmm, abcd haben je 4bit, das macht also:
1
a+b=ab --> 5bit
2
ab+c=abc --> 6bit
3
abc+d=abcd --> 7bit
Dein z hat aber nur 6bit... Vlt. bringt ihn das in Wallung?

von Christian R. (supachris)


Lesenswert?

Alle Summanden und auch die Summe müssen dort gleich breit sein. Du 
musst also die Summanden erst mit resize() auf die richtige Breite 
bringen.

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.