53 / 63 · Konzept
Festkomma, Rundung und Sättigung
W, F-Bereiche festlegen und Guard/Sticky-Rundung zu geraden Werten mit anschließender Sättigung entwerfen.
Lektionen sind frei lesbar. Schreibe dich ein, um deinen Fortschritt zu speichern.
Voraussetzungen: Bitbreiten, signed-Addition/-Multiplikation, arithmetisches Rechtsschieben und Overflow.
Den Binärpunkt vertraglich festlegen
FestkommaFestkomma Zahlendarstellung mit festgelegtem Binärpunkt und Skalierung einer Ganzzahlbitfolge. Breite, Vorzeichen und Nachkommabitanzahl sind gemeinsam festzulegen. interpretiert eine Ganzzahl X als . Der Binärpunkt ist kein gespeichertes Bit. Hier enthält die Gesamtbreite W das Vorzeichenbit, F zählt Nachkommabits. Da Q-Notation je nach Quelle das Vorzeichen unterschiedlich zählt, sind W und F gemeinsam an der Schnittstelle eindeutiger.
W=8, F=4 ergibt Schrittweite 1/16 und Bereich −8 bis 7.9375. 0x18 bedeutet hier 1.5 statt Ganzzahl 24; bei F=3 wäre es 3. Verbundene Leitungen garantieren keine gleiche Zahlenbedeutung: Dokumentieren Sie die Skalierung jedes Ports.
Vor Addition müssen Binärpunkte ausgerichtet werden. Erweitern Sie den Rohwert des Operanden mit dem kleineren F auf eine ausreichend große Bitbreite und verschieben Sie ihn nach links. Alternativ reduzieren Sie beim Operanden mit dem größeren F die Anzahl der Nachkommabits mit der festgelegten Rundung. Zwei Werte mit gleichem W, F benötigen für eine exakte Summe W+1 Bit bei gleichem F. Multiplikation multipliziert Rohinteger und addiert Nachkommabitanzahlen.
Das volle Produkt zweier 8-Bit-F=4-Zahlen ist signed 16 Bit mit F=8. Für 8 Bit/F=4 sind erst vier Nachkommabits zu entfernen, dann der signed-8-Bit-Bereich zu prüfen. Vorzeitiges Abschneiden des Produkts auf acht Bit verbirgt seine ursprüngliche Größe vor der Sättigung.
Abschneiden und Runden unterscheiden
Arithmetisches Rechtsschieben um d ist , auch negative Werte werden abgerundet. Für ist der genaue Quotient −1.5, q aber −2. Dies ist kein Abschneiden gegen null. Wenn nur die oberen Bits beibehalten werden, ist die Fehlerwirkung bei negativen Werten nicht automatisch dieselbe wie bei positiven.
Wir runden zum nächsten Wert und bei genauer Mitte zur geraden Ganzzahl (ties-to-even). g ist das höchste verworfene Guard-Bit, t das OR der übrigen Sticky-Bits, l das niedrigste verbleibende q-Bit.
g=0 liegt unter der Hälfte: unverändert. g=1, t=1 liegt darüber: erhöhen. g=1, t=0 liegt genau dazwischen: nur ungerades q erhöhen. Das gilt auch negativ, denn mit Bodenquotient q und Rest ist stets .
−24/16=−1.5 rundet mit geradem q=−2 zu −2; −40/16=−2.5 mit ungeradem q=−3 ebenfalls zu −2. Sonderregeln wie „bei negativ immer 1 abziehen“ sind falsch. Ohne Sättigung beträgt der Fehler höchstens ein halbes Ausgangs-LSBLSB Bit mit dem niedrigsten Stellenwert. Darstellungsrichtung und Indexkonvention müssen gemeinsam geprüft werden. Mehr erfahren. Ties-to-even garantiert nicht für jede Verteilung mittleren Fehler null, vermindert aber die einseitige Behandlung exakter Mitten.
Beim Umwandeln von 16 Bit/F=8 mit raw P=2040 nach 8 Bit/F=4 wird 127.5 erst zur geraden 128 gerundet und dann auf signed-Maximum 127 begrenzt. Die breite Darstellung muss bis zur letzten Speicherung erhalten bleiben.
- Eingang P=2040: 16 Bit · F=8
- Skalierung verringern: 2040 / 16 = 127.5
- ties-to-even: Gerundeter Rohwert = 128
- Nach Sättigung speichern: raw 127 → 7.9375
Nach der Rundung sättigen
Sättigung begrenzt zu große Werte auf das Maximum und zu kleine auf das Minimum. Anders als Wraparound wird eine große positive Zahl nicht negativ. Ein bereits verkürzter und umgelaufener Wert erlaubt jedoch keine korrekte nachträgliche Sättigung.
Das vollständige kombinatorische Modul wandelt signed 16 Bit/F=8 nach signed 8 Bit/F=4. Bei festem d=4 ist guard p[3], sticky p[2:0]. Rundungsaddition und Bereichsvergleich erfolgen in signed 17 Bit; erst zuletzt werden acht Bit gewählt.
module requantize (
input logic signed [15:0] p,
output logic signed [7:0] y,
output logic saturated
);
logic signed [16:0] wide, q, rounded;
logic inc;
always_comb begin
wide = {p[15], p};
q = wide >>> 4;
inc = p[3] & ((|p[2:0]) | q[0]);
rounded = q + (inc ? 17'sd1 : 17'sd0);
saturated = 1'b0;
if (rounded > 17'sd127) begin
y = 8'sh7f;
saturated = 1'b1;
end else if (rounded < -17'sd128) begin
y = 8'sh80;
saturated = 1'b1;
end else begin
y = rounded[7:0];
end
end
endmoduleP=2040 ergibt 127.5, gerundet 128, gesättigt 127 und damit 7.9375. Wer nur q=127 vor der Rundung prüft, übersieht den Überlauf. saturated zeigt eine tatsächliche Bereichsbegrenzung an, nicht bloß verlorene Nachkommabits.
Ein generisches Modul muss d=0 ohne verworfene Bits und d=1 ohne Sticky-Bereich getrennt behandeln. Ein ungültiger Part-select kann auch dann einen Elaborationsfehler verursachen, wenn er in einer Bedingung steht.
Rundung und Sättigung sind eigene Entscheidungen mit Addierer-, Komparator- und MUX-KostenMultiplexer Kombinatorische Schaltung, die gemäß Auswahlsignal einen Eingang zum Ausgang verbindet. Die Zuordnung von Auswahlbits und Eingangsnummern muss festgelegt sein. Mehr erfahren sowie Laufzeit. Dies unterscheidet auch AMDs Festkommadokumentation. Legen Sie beim Akkumulieren fest, ob Zwischenbreiten erhalten bleiben und erst am Ende einmal konvertiert wird. Sättigung nach jeder Addition kann Assoziativität zerstören; wiederholtes Runden kann kleine Fehler aufsummieren.
Selbst ausprobieren
Konvertieren Sie signed 16 Bit/F=8 nach 8 Bit/F=4 für P=24,40,−24,−40,2040. Geben Sie Bodenquotient q, guard/sticky, gerundete Ganzzahl, raw und realen Ausgang an. Was geht bei Sättigungsprüfung vor Rundung für 2040 schief?
Erklärung lesen
Alle unteren vier Bits sind 1000: guard=1, sticky=0. 24: q=1 ungerade→2, raw=2, Wert 0.125. 40: q=2 gerade→2, raw=2, 0.125. −24: q=−2 gerade→−2, raw=−2, −0.125. −40: q=−3 ungerade→−2, raw=−2, −0.125. 2040: q=127 ungerade→128, außerhalb signed 8 Bit, daher raw=127, Wert 7.9375, saturated=1. Wird nur q=127 geprüft und in acht Bit 1 addiert, kann 0x80=−8 entstehen. Addition und Vergleich müssen breit und signed abgeschlossen werden.