Forum: FPGA, VHDL & Co. unsigned multiplikation: Ergebnisvektor kürzen?


von Stephan K. (Firma: FAU Erlangen) (sofa1780)


Lesenswert?

Hallo liebe Gemeinde,

ich habe es mir mittlerweile mehrfach überdacht, komme jedoch mit meiner 
Erkenntnis nicht so recht weiter.

Folgendes ist die Problemstellung:

Ich habe einen 14 Bit AD-Wandler mit 2 Ein- und Ausgängen. Dieser gibt 
die digitalen Daten parallel als offset Binary aus. Gekoppelt sind die 
Ein- und Ausgänge derweil Single Ended. Somit kann ich die binären Daten 
also im Datenformat unsigned weiter verarbeiten.

Nach einer Multiplikation der beiden Eingänge entstet jedoch ein 28 Bit 
Vektor, ebenfalls als unsigned/offset binary.

Nun frage ich mich, wie ich den Ausgangsvektor sinnvoll auf 14 Bit 
kürzen kann, damit dieser wieder über den AD-Wandler ausgegeben werden 
kann.

Bei einer Festkommaarithmetik hätte ich sicher kein geößeres Problem, 
wenn ich die LSBs rechts des Binärpunktes einfach abschneide, hier nimmt 
lediglich die Genauigkeit ab.

In meinem Fall jedoch mache ich erhebliche Fehler, da alles über die 14 
Bit hinaus einen Überlauf darstellt, wenn ich den Berreich o_mult(13 
downto 0) nehme. Sehe ich das richtig?

Wie kann ich damit nun umgehen??

Besten Gruß,
Stephan

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


Lesenswert?

Stephan K. schrieb:
> Wie kann ich damit nun umgehen??
Du darfst eigentlich immer nur die höchstwertigen Bits nehmen.

Wenn du "00000000000001" * "00000000000001" rechnest, kommt
"0000000000000000000000000001" heraus.
Wenn du "11111111111111" mit "11111111111111" multiplizierst, kommt 
"1111111111111111111111111110" heraus.
Und richtig wäre es jetzt für eine weitere Verarbeitung, mit den 
führenden Bits zu arbeiten, wenn am Eingang der gesamte Dynamikumfang 
verwendet wird.

Stephan K. schrieb:
> Nun frage ich mich, wie ich den Ausgangsvektor sinnvoll auf 14 Bit
> kürzen kann, damit dieser wieder über den AD-Wandler ausgegeben werden
> kann.
Da muss man mit einer Konterfrage kommen und fragen:
In welchen der 28 Ergebnisbits steckt denn die relevante Information? 
Wie groß sind deine Eingangswerte?

von Stephan K. (Firma: FAU Erlangen) (sofa1780)


Lesenswert?

Lothar M. schrieb:
> Stephan K. schrieb:
>> Wie kann ich damit nun umgehen??
> Du darfst eigentlich immer nur die höchstwertigen Bits nehmen.

Gelesen hatte ich das auch schon mehrfach, jedoch treten genau hier ja 
Rechenfehler in deinem zu erst genannten Beispiel auf.

> Wenn du "00000000000001" * "00000000000001" rechnest, kommt
> "0000000000000000000000000001" heraus.

Die höchstwertigen 14 Bits bestehen nur aus Nullen.

> Konterfrage:
> In welchen der 28 Ergebnisbits steckt denn die relevante Information?
> Wie groß sind deine Eingangswerte?

Die Eingangswerte liegen bei ca. 1 V, also der halben Auflösung, auf dem 
ersten Kanal und bei voller Auflösung auf dem zweiten Kanal.

Sind damit allein die LSBs schon vernachlässigbar, bzw. wie groß ist der 
Fehler den ich da mache?
Gibt es keine Mölichkeit mit einem skalierungsfaktor zu rechenen oder 
wird das durch die Benutzung der höchstwertigen Bits irrelevant?

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


Lesenswert?

Stephan K. schrieb:
> Die höchstwertigen 14 Bits bestehen nur aus Nullen.
Korrekt, weil die Eingangswerte so klein sind.

> Die Eingangswerte liegen bei ca. 1 V, also der halben Auflösung, auf dem
> ersten Kanal und bei voller Auflösung auf dem zweiten Kanal.
Du kannst also links 1 Bit wegschneiden, wenn tatsächlich und 
garantiert(!) einer der Eingänge das LSB nicht ändert.

> Sind damit allein die LSBs schon vernachlässigbar, bzw. wie groß ist der
> Fehler den ich da mache?
Der Fehler ist +1 LSB des abgetrennten Wertes. Denn z.B. der 
abgeschnittene "11111110001111" hätte genauso
"1111111000111111111111111111" wie auch
"1111111000111100000000000000" sein können.

> Gibt es keine Mölichkeit mit einem skalierungsfaktor zu rechenen
Du kannst bestenfalls nichtlinear 28 Bits auf 14 Bits reduzieren. Oder 
eben eine Fließkommazahl draus machen und z.B. aus
"0000000110000110101010101010" nicht einfach die oberen Bits 
"00000001100001" abspeichern, sondern die 8 führenden Nullen zusätzlich 
als "111"abzuspeichern und dazu den Wert "11000011010101". Dann ist dein 
neues Format also 3 Bit Exponent und 14 Bit Mantisse.
Zur ausgabe auf dem DAC musst du das natürlich wieder zurückskalieren, 
weil der ja mit einem Exponenten nichts anfangen kann.

von WS (Gast)


Lesenswert?

Fliesskomma im FPGA?

von S. R. (svenska)


Lesenswert?

WS schrieb:
> Fliesskomma im FPGA?

Kann man machen. Muss ja nicht IEEE-compliant double precision sein.

von J. S. (engineer) Benutzerseite


Lesenswert?

An der Stelle gibt es mehrere Fragen:

1) Welches ist die maximale Zahl, die aufgrund der "Füllstände" der 
Vektoren entstehen kann und welches Bit wird dabei ausgelastet?

2) Wie genau brauche Ich das Ergebnis im Bezug auf die Auflösungen der 
Eingänge? Sind beide Werte ähnlich genau oder ist der Multiplikator 
deutlich genauer?

3) Mit welcher Repräsentation will ich weiterrechnen, also wo sitzen die 
Kommastellen?

Man kann das Ganze in Excel bauen und sich die Werte anhand der 
Auflösung (die sich ja an den Genauigkeiten der physikalischen Grössen 
zu orientieren hat) ausrechnen und designen. Das Thema hatten wir an 
anderer Stelle schon mehrfach.

Was man beim Abschneiden unten beachten muss: Wie möchte Ich runden, um 
keinen unzulässigen Offset in den Datenstrom reinzuschleppen?

Da hätten wir:

a) Addition mit 0,5
b) statistische Addition mit 1 - also Rauschen

Mit Methode b) arbeite Ich z.B. bei meinen Oszillatoren: Damit laufen 
die Filter in der Tat gegen Null, ansonsten gibt es digitale Artefakte.

von J. S. (engineer) Benutzerseite


Lesenswert?

Jetzt mal konkret als Beispiel:

40% Kanal 1 x 60% Kanal 2 macht insgesamt 24% des durch die Summe der 
Bits darstellbaren Zahl. Es fallen also 2 weg. Ansonsten nur eins oder 
eben auch keins, bei z.B. 80%x80%.

Bei signed fällt eigentlich immer 1 weg, bei dem von mir empfohlenen 
Limit auf 2hn-1 für +/- sind es immer 2. D.h. man nimmt bei einem 
Wandler nicht 1023 ... -1024 sondern nur runter bis -1023. Eine 
Quadierung liefert dann maximal 20 bit im Positiven, statt 22.

Stephan K. schrieb:
> Sind damit allein die LSBs schon vernachlässigbar, bzw. wie groß ist der
> Fehler den ich da mache?

Bei einer Multiplikation würde Ich immer mal eine -> Fehlerrechnung 
machen, also "Wert 1 +/- Delta 1"  x "Wert 2 +/- Delta 2"  -> ?
Damit bekommst Du einen Hinweis auf die benötigte Auflösung. Generell 
beantwortet, schleppst Du 4 Bit mehr mit, als der schlecht aufgelöste 
Wert - das passt meistens, es sei denn da kommt irgendwann noch eine 
Subtraktion.

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.