53 / 63 · Concetto
Virgola fissa, arrotondamento e saturazione
Definire il campo W, F e progettare ties-to-even con guard/sticky e saturazione successiva.
Le lezioni sono gratuite. Iscriviti per salvare i progressi.
Prerequisiti: larghezze di somma/prodotto signed, shift aritmetico destro e overflow.
Concordare la posizione della virgola binaria
La virgola fissaVirgola fissa Rappresentazione con posizione della virgola prefissata e scala applicata a una sequenza intera. Vanno definiti insieme larghezza, segno e bit frazionari. interpreta l'intero X come . La virgola non è un bit memorizzato. Qui W include il segno e F conta i bit frazionari. Poiché la notazione Q varia nell'inclusione del segno, indicare insieme W e F chiarisce l'interfaccia.
W=8, F=4 dà passo 1/16 e campo −8–7.9375. 0x18 significa qui 1.5, non l'intero 24; con F=3 significherebbe 3. Collegare fili non garantisce significati numerici coerenti: documentate la scala di ogni porta.
Prima di sommare allineate le virgole. Estendete e spostate a sinistra il valore con F minore, oppure riducete quello con F maggiore secondo una regola di arrotondamento. La somma esatta di due valori con stessi W, F richiede W+1 bit e lo stesso F. Il prodotto moltiplica gli interi raw e somma i bit frazionari.
Il prodotto completo di due numeri a otto bit/F=4 è signed a sedici bit/F=8. Per uscire a otto bit/F=4, eliminate prima quattro bit frazionari e poi controllate il campo signed. Tagliare prima il prodotto a otto bit nasconde la grandezza originale alla saturazione.
Distinguere troncamento e arrotondamento
Lo shift aritmetico di d bit dà : anche i negativi vengono arrotondati verso il basso. Con , il quoziente esatto è −1.5 ma q=−2. Non è troncamento verso zero. Selezionare i bit alti non ha automaticamente sui negativi le stesse proprietà d'errore dei positivi.
Progettiamo l'arrotondamento al più vicino, con metà esatte all'intero pari (ties-to-even). g è il guard, bit scartato più alto; t è lo sticky, OR degli altri; l è il bit meno significativo di q conservato.
g=0 indica meno di metà: si mantiene. g=1, t=1 indica più di metà: si incrementa. g=1, t=0 è metà esatta: si incrementa solo q dispari. Vale anche per negativi, perché con quoziente floor q e resto si ha sempre .
−24/16=−1.5, con q=−2 pari, arrotonda a −2; −40/16=−2.5, con q=−3 dispari, ancora a −2. Regole come «sottrarre sempre 1 ai negativi» sono errate. Senza saturazione, l'errore è al massimo mezzo LSBLSB Bit di peso minore. Vanno controllati insieme direzione di scrittura e convenzione degli indici. Approfondisci d'uscita. Ties-to-even non garantisce errore medio nullo per ogni distribuzione, ma riduce il bias delle metà sempre dirette dallo stesso lato.
Convertendo raw P=2040 da sedici bit/F=8 a otto bit/F=4, 127.5 viene prima arrotondato al pari 128 e poi limitato al massimo signed 127. Conservate la larghezza estesa fino all'ultima memorizzazione.
- Ingresso P=2040: 16 bit · F=8
- Ridurre la scala: 2040 / 16 = 127.5
- ties-to-even: Valore raw arrotondato = 128
- Memorizzare dopo la saturazione: raw 127 → 7.9375
Saturare dopo l'arrotondamento
La saturazione limita al massimo i valori superiori e al minimo quelli inferiori. Diversamente dal wrap, un positivo grande non diventa negativo. Tuttavia un valore già ridotto di larghezza e soggetto a wrap non consente una saturazione corretta a posteriori.
Il modulo combinatorio completo converte signed sedici bit/F=8 in otto bit/F=4. Con d=4 fisso, guard è p[3], sticky p[2:0]. Incremento e confronto si eseguono in diciassette bit signed e solo alla fine si estraggono otto bit.
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 dà 127.5, arrotondato 128, saturato 127, cioè 7.9375. Controllare solo q=127 prima dell'arrotondamento perde il superamento. saturated indica limitazione del campo, non la sola perdita di bit frazionari.
Un modulo generico deve distinguere d=0 senza bit scartati e d=1 senza area sticky. Nascondere un part-select invalido in una condizione può non eliminare l'errore di elaborazione.
Arrotondamento e saturazione sono politiche separate che aggiungono sommatori, confronti, MUXMultiplexer Circuito combinatorio che collega un ingresso all’uscita secondo la selezione. Va specificata la corrispondenza fra bit di selezione e ingressi. Approfondisci e ritardo. La distinzione appare anche nella documentazione AMD della virgola fissa. Decidete se mantenere precisione intermedia e convertire una sola volta alla fine dell'accumulo. Saturare a ogni passo può rompere l'associatività; arrotondare a ogni passo può accumulare piccoli errori.
Prova tu
Convertite signed sedici bit/F=8 in otto bit/F=4 per P=24,40,−24,−40,2040. Indicate q floor, guard/sticky, intero arrotondato, raw e valore reale. Cosa accade verificando la saturazione prima di arrotondare 2040?
Leggi la spiegazione
Tutti i quattro bit bassi sono 1000: guard=1, sticky=0. 24: q=1 dispari→2, raw=2, valore 0.125. 40: q=2 pari→2, raw=2,0.125. −24: q=−2 pari→−2, raw=−2,−0.125. −40: q=−3 dispari→−2, raw=−2,−0.125. 2040: q=127 dispari→128 fuori campo signed a otto bit, quindi raw=127, valore 7.9375, saturated=1. Controllando solo q=127 e aggiungendo 1 su otto bit si può ottenere 0x80=−8. Incremento e confronto devono terminare in larghezza signed estesa.