Ich verwende in einem uraltdesign, das nicht mit numeric arbeitet, eine Multiplikation auf der Basis von e <= std_logic_vector (signed (x) * sigend(y)); und hadere ein wenig mit den Bitbreiten, bzw ich bin mir unklar, wie und wo ich das Ergebnis absägen muss. Z.B. ergibt ein 10 Bit Wert als signed maximal (511 x 511), was in einen 18 bit Vektor passt, während es "brutto" ja 20 Bit sind. Wie geht man da vor, wenn sich die Rechung durch etliche Zwischenrechungen durchzieht? Das maximale-Ergebnis zu simulieren ist schwer, weil ich diesen Fall nicht sicher einstellen kann, da zuviel abgezogen und hin und her gerechnet wird. Fehlerrechung?
FPGA-Programmierer schrieb im Beitrag #3157060: > Fehlerrechung? Die ist bei Differenzen, insbesondere bei unbekanntem Verhältnis von Minuend zu Subtrahend, schwierig. Eine Monte-Carlo-Simulation auf einem leistungsfähigen Rechner, kann dir die Wertebereiche zeigen. Wenn Überläufe vorkommen dürfen, brauchst du eine Überlauferkennung und ein Flag für ungültige Ergebnisse. Sonst hilft nur die worst-case Betrachtung.
FPGA-Programmierer schrieb im Beitrag #3157060: > Z.B. ergibt ein 10 Bit Wert als signed maximal (511 x 511), was in einen > > 18 bit Vektor passt, während es "brutto" ja 20 Bit sind. Das stimmt nur, wenn nicht der negativste Wert -512 auftritt. Ansonsten hast Du Recht mit Deiner Überlegung. Daher empfehle ich ja immer, diesen wegzulassen, um real mit n-1 Vektorbreite arbeiten zu können. Dann sind es wieder (n-1) + (n-1) = n-2 Bit - (vorzeichenbereinigt). Am Besten macht man sich fpr komplizierte Systeme ein Excel-Sheet und lässt sich die Ergebnisse durchrechnen. Mit schnell durchgespielten worst case Betrachtungen am Eingang erhält man dann an jeder Stelle die benötigte Auflösung.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.