Forum: FPGA, VHDL & Co. signed oder unsigned, das ist hier die Frage.


von Peter (Gast)


Lesenswert?

Hallo,

ich habe als Aufgabe einen Quadrierer für std_logic_vector und signed 
Signale zu gestalten.
Es können auch getrennt entities entstehen.
Nun stehe ich vor der Frage, wie die beiden Signale interpretiert werden 
müssen, um sie dann mit einem Addierer zu multiplizieren.

Beispiel std_logic_vector(11 downto 0), Werte von 0 bis 4095.
Ganz klassisch die schriftliche Multiplikation, wenn eine 1 in dem einen 
Faktor ist, wird der andere addiert und dann das Ergebnis einmal nach 
links geshiftet. Geshiftet wird in jedem Fall, 1 oder 0 im einen Faktor 
entscheidet nur, ob der andere Faktor oder 0 addiert wird. Als Ergebnis 
habe ich dann ein std_logic_vector(13 downto 0).

Nun zum Problemfall signed, ebenfalls (11 downto 0), Werte von -2048 bis 
2047:
(-2041)² =  4.165.681

Da ich quadrieren muss, habe ich mir gedacht, lasse ich einfach das 
Vorzeichenbit weg und multipliziere einfach nur die verbleibenden 11 
bit.

(00000000111)² = 49, weil durch das Weglassen des MSB wieder in unsigned 
gewandelt wird und ich dadurch 7² rechne.

Wie kann ich nun (100000000111)² = (-2041)² = 4.165.681 korrekt mit 
einem Addierer multiplizieren?
Eine Beschreibung a * b = c, alle sind vom Typ signed und ich überlasse 
der Synthese die Arbeit, nützt mir also nichts.

Ist es korrekt, wenn ich meinen zu quadrierenden Faktor so erstelle?
1
Faktor_multi(10 downto 0) <= not(faktor_signed(10 downto 0) + 1;
Oder hat es in meinen durchgespielten Beispielen nur durch Zufall?

Das Ergebnis ist dann zwei Bit kürzer als bei std_logic_vector, weil ich 
ja zwei Vorzeichenbit weglassen.

Vielen Dank!

von Peter (Gast)


Lesenswert?

PS: Ich merke gerade, bei den positiven signed Werten macht die Idee ja 
gar keinen Sinn mehr.... schade!

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.