Hallo,
nehmen wir mal an folgende Entity ist gegeben:
1 | entity sum_test is
|
2 | port (
|
3 | a : unsigned(3 downto 0);
|
4 | b : signed(2 downto 0);
|
5 | c : unsigned (4 downto 0)
|
6 | d : signed(4 downto 0);
|
7 | ...
|
Die Ports a, b, c und d sollen aufsummiert und in sum gespeichert
werden.
Ich habe nehme also jedes Signal, erweitere und konvertiere es ggf. nach
signed und führe dann die Addition durch. Die Summe wird schließlich auf
den Ergebnis-Datentyp "gecastet".
Das könnte in etwa so aussehen:
1 | signal sum : signed(5 downto 0);
|
2 | ...
|
3 | sum <= resize(
|
4 | (signed("00"&a) + b) + (signed("00"&c) + d),
|
5 | sum'length);
|
Ich finde das
a) sehr unleserlich und
b) fehleranfällig in Hinblick auf Bereichsüberschreitung.
Kommt jetzt noch eine Shift-Operation o. ä. hinzu verliert man komplett
den Überblick. Ich vertue mich bei solchen Sachen ständig.
Jetzt kam mir der Gedanke alle Operanden nach Integer zu konvertieren,
die Summe zu berechnen und dann wieder nach signed zu casten:
1 | sum <= resize(
|
2 | to_integer(a) + to_integer(b) + to_integer(c) + to_integer(d),
|
3 | sum'length);
|
Das das in der Simulation funktioniert ist klar. Aber wie sieht es mit
der Synthese aus: Integer wird ja als 32 Bit Datentyp behandelt.
Erkennen die gängigen Synthesetools "halbwegs zuverlässig" das hier
nicht der gesamte Integer-Bereich ausgeschöpft und führen
dementsprechend dann nur eine 6 Bit -Addition durch?
Vielen Dank!
Mac