Gast
#2631391
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 | |
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!