Forum: FPGA, VHDL & Co. Arithmetische Operationen mit to_integer() durchführen


von Mac (Gast)


Lesenswert?

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

von Mac (Gast)


Lesenswert?

Der letzte Codeabschnitt muss natürlich so aussehen (resize -> 
to_signed):
1
sum <= to_signed(
2
  to_integer(a) + to_integer(b) + to_integer(c) + to_integer(d),
3
  sum'length);

von Daniel M. (daniel__m)


Lesenswert?

Mac schrieb:
> und führen
> dementsprechend dann nur eine 6 Bit -Addition durch?

nein, drei Additionen ;)

Funktioniert einwandfrei (zumindest bei Xilinx). Da nur die unteren 6 
Bits genutzt werden, wird der Rest "weg optimiert". Da ist die Synthese 
sehr eifrig und gnadenlos.

von Mac (Gast)


Lesenswert?

Daniel M. schrieb:
> nein, drei Additionen ;)

Ja okay. Ist ja schon so spät... ;-)

>
> Funktioniert einwandfrei (zumindest bei Xilinx). Da nur die unteren 6
> Bits genutzt werden, wird der Rest "weg optimiert". Da ist die Synthese
> sehr eifrig und gnadenlos.

Ich habe es jetzt mit Altera zuhause ausprobiert, da ich nicht warten 
konnte bis ich morgen im Büro bin. Altera optimiert das auch weg. Jetzt 
habe ich das jahrelang auf die umständliche Art gemacht. Man lernt immer 
was dazu...

Schönen Abend noch!
Mac

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


Lesenswert?

Mac schrieb:
> Aber wie sieht es mit der Synthese aus:
> Integer wird ja als 32 Bit Datentyp behandelt.
Das ist dann auch die Grenze des Möglichen. Wenn du z.B. 40 Bit als 
Eingangsvektor(en) hast, dann geht das mit dem Umweg über einen Integer 
in die Hose...
Direkt mit signed bzw. unsigned gehen aber auch noch Operationen mit 
z.B. 100 Bit Breite.

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.