Hallo,
ich möchte auf einem PSoC 5LP einen Multiplizierer realisieren. Da dort
die Ressourcen verglichen mit FPGAs sehr beschränkt sind, möchte ich
einen seriellen Multiplizierer verwenden.
Mir geht es hier erstmal nicht um die konkrete Lösung in Verilog (PSoC
"spricht" kein VHDL), sondern um's Verständnis, denn daran hapert es
gerade. Ich versuche, den Multiplizierer aus Wikipedia zu verstehen:
https://en.wikipedia.org/wiki/Binary_multiplier#More_advanced_approach:_signed_integers
Momentan versuche ich das per Papier & Block durchzurechnen, aber
offenbar setze ich die einzelnen Summanden schon falsch zusammen:
Im Endeffekt hapert es wohl an meiner Interpretation des englischen
Textes, denn schon der erste Summand bringt das ganze zum Scheitern,
weil das LSB = 0 ist, im Ergebnis jedoch eine 1 stehen muss.
So, wie ich den Text verstehe, muss das LSB jeweils invertiert werden.
Das im Text erwähnte, implizite subtrahieren von 1 unterhalb des
jeweiligen MSBs ist aus meiner Sicht bereits durch das invertieren des
Vorzeichenbits drin, ist das korrekt?
Und der letzte Summand ist das 2er-Komplement, da eigentlich abgezogen
werden muss. Auch hier das LSB wieder invertiert.
Rechne ich nun alle Summanden zusammen, komme ich auf 30d und nicht die
erwarteten 21d. Wo liegt mein Fehler?
Vielen Dank.
Ralf
Hallo,
danke für die Beispiele. Das sind vorzeichenlose Rechnungen, wie
schaut's denn mit vorzeichenbehaftet aus? (Sorry, es wird aus meinem
Text wohl nicht ganz klar, dass es um vorzeichenbehaftete Berechnungen
geht).
Ralf
Okay, dann muss ich noch präzisieren: der von mir verlinkte Wiki-Artikel
verwendet eine Implementierung, welche auf das Auffüllen des
Vorzeichenbits (sign extension) bis zur Breite des Ergebnisses
verzichtet. Das würde es mir ermöglichen, einen Teil der Berechnung
direkt im Ergebnisregister auszuführen. Wie gesagt, die Ressourcen sind
knapp.
Deswegen hatte ich auch meine Interpretation(tm) des Rechenweges
basierend auf diesem Artikel widergegeben. Sorry für das
Missverständnis.
Ralf
Am LSB wird doch nichts geändert. Es wird nur das MSB invertiert und im
letzten Schritt zusätzlich alle Bits (bzw alles außer das MSB).
Als Summanden treten folglich auf:
1
1001 .... (die Konstanten, z.B. Vorbelegung Summenreg)
2
+ .... 1111 A<<0, MSB invertiert
3
+ ...1 111. A<<1, MSB invertiert
4
+ ..10 00.. 0<<2, MSB invertiert
5
+ .011 1... 0<<3, MSB invertiert, alles invertiert
6
-------------
7
= 1 0001 0101 21 mod 256
Ich frag mich allerdings, was das bringen soll - Vorzeichenerweiterung
ist billig und passiert eh nur einmal am Anfang.
Hi foobar,
danke für deine Antwort.
> Ich frag mich allerdings, was das bringen soll - Vorzeichenerweiterung> ist billig und passiert eh nur einmal am Anfang.
Bei den Implementierungen, die ich bisher gesehen habe, geschieht die
Vorzeichenerweiterung bei jedem Durchgang.
Hier hatte ich eine Implementierung gefunden, welche das verkürzt, aber
mit Papier und Block kam ich da auch auf die falschen Ergebnisse.
Deswegen versuche ich herauszufinden, wo mein Denkfehler liegt:
https://www.dsprelated.com/showarticle/555.php> 1001 .... (die Konstanten, z.B. Vorbelegung Summenreg)
Wie bist du auf die 1001 gekommen? Mit -7d vorbelegt?
Ralf
>> 1001 .... (die Konstanten, z.B. Vorbelegung Summenreg)> Wie bist du auf die 1001 gekommen?
Das sind einfach die beiden Einser in der Tabelle des
Wikipedia-Artikels. Ich habe nicht versucht, die Bittricksereien des
Algorithmus' nachzuvollziehen, hab nur das Ergebnis interpretiert -
scheint zu stimmen :-)
Eine Multiplikation ist im Zweierkomplement richtig, wenn das Ergebnis
die gleiche Breite wie die Operanden hat. Eine Vorzeichenberechnung ist
daher nicht nötig.
Hallo,
ich verstehe Deine Absichten nicht ganz. Ressourcen - knapp?Da gibt es
wesentlich kleinere Prozessoren.
Möchtest Du den DFB verwenden und selber programmieren?
Wäre schön zu wissen, was Du beabsichtigst. Vll. kann Dir der ein oder
andere nicht nur bei der ursprünglichen Frage helfen, sondern evtl.
Impulse geben, wie Deine Problemstellung auch einfacher gelöst werden
kann.
Hallo soso,
vielen Dank für den Link zu der Komponente, das schau ich mir an.
zur Frage was ich machen möchte: ganz lapidar gesagt möchte ich ein per
DAC ausgegebenes Signal in der Amplitude variieren. Mit der
WaveDAC-Komponente kann man zwar Sinus & Co. sehr einfach ausgeben und
auch in der Frequenz variieren, aber die Amplitude ist leider fix. Im
Prinzip geht's um einen Signalgenerator.
Ralf