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!