Altifigence Academy

53 / 63 · Concepto

Punto fijo, redondeo y saturación

Defina rangos con W,F e implemente redondeo al par con guard/sticky y saturación posterior.

Requisitos previos: anchos de suma y multiplicación signed, desplazamiento aritmético derecho y overflow.

Acuerde la posición fraccionaria de los bits

En punto fijoPunto fijo Representación que fija de antemano la posición del separador fraccionario y aplica una escala constante a una secuencia de bits entera. Deben definirse el ancho, el signo y el número de bits fraccionarios., el entero X representa x=X2−Fx=X2^{-F}. No se almacena un «bit de coma». Aquí W es el ancho signed completo, incluido el signo, y F el número de bits fraccionarios. La notación Q varía según se incluya el signo en la parte entera; indicar W,F en la interfaz evita ambigüedad.

−2W−1−F≤x≤2W−1−F−2−F-2^{W-1-F}\le x\le 2^{W-1-F}-2^{-F}

Con W=8,F=4, el paso es 1/16 y el rango −8 a 7.9375. 0x18 representa 1.5 bajo este contrato, no el entero 24; con F=3 representaría 3. Conectar cables no garantiza coherencia numérica: documente la escala de cada puerto.

Antes de sumar, alinee las posiciones fraccionarias. Si F difiere, amplíe suficientemente el operando de menor F y desplácelo a la izquierda, o reduzca el de mayor F con el redondeo elegido. La suma exacta de dos valores con el mismo W,F requiere W+1 bits y el mismo F. En multiplicación, se multiplican los enteros raw y se suman los números de bits fraccionarios de ambos operandos:

P=XAXB,FP=FA+FBP=X_A X_B,\qquad F_P=F_A+F_B

El producto completo de dos operandos de ocho bits F=4 es signed de 16 bits F=8. Para devolver ocho bits F=4, reduzca cuatro bits fraccionarios y compruebe después el rango signed de ocho bits. Truncar primero el producto a ocho bits destruye la magnitud que necesitaría la saturación.

Truncamiento y redondeo

Un desplazamiento aritmético derecho de d bits calcula q=⌊P/2d⌋q=\lfloor P/2^d\rfloor, también hacia abajo para negativos. Con P=−24,d=4P=-24,d=4, el cociente exacto es −1.5 y q=−2, distinto de truncar hacia cero. Seleccionar simplemente los bits superiores no tiene necesariamente el mismo comportamiento de error para positivos y negativos.

Diseñemos redondeo al más cercano con empates al par. Sea g el bit superior descartado (guard), t la OR de los restantes (sticky) y l el bit inferior de q conservado.

inc=g∧(t∨l),qrnd=q+inc\mathrm{inc}=g\land(t\lor l),\qquad q_{\mathrm{rnd}}=q+\mathrm{inc}

Con g=0, la fracción es menor que la mitad y se conserva q. Con g=1,t=1, supera la mitad y se incrementa. Con g=1,t=0, es exactamente la mitad y se suma 1 solo si q es impar. La regla también vale para negativos: con el cociente inferior q, el resto r=P−q2dr=P-q2^d cumple siempre 0≤r<2d0\le r<2^d.

Así, −24/16=−1.5 redondea a −2 porque q=−2 es par; −40/16=−2.5 redondea a −2 porque q=−3 es impar. Una regla adicional de «restar siempre 1 a negativos» sería incorrecta. Sin saturación, el error final no supera medio LSBLSB Bit de menor peso. Deben comprobarse conjuntamente el sentido de la notación y las reglas de indexación. Más información de salida. Empatar al par reduce el sesgo de resolver todos los empates hacia un lado, pero no garantiza error medio cero para cualquier distribución.

En la conversión de raw P=2040, 16 bits F=8 a ocho bits F=4, 127.5 redondea al par 128 y luego se limita a 127. Conserve el ancho amplio hasta el almacenamiento final.

Primero redondee, después sature
  1. Entrada P=2040: 16 bits · F=8
  2. Reduzca la escala: 2040 / 16 = 127.5
  3. Empates al par: Raw redondeado = 128
  4. Almacene después de saturar: raw 127 → 7.9375

Sature después de terminar el redondeo

Saturar limita el valor al máximo o al mínimo cuando se supera el rango. A diferencia del retorno modular, un positivo grande no se vuelve negativo. Un valor ya truncado que ha sufrido un retorno modular no permite saturar correctamente.

El módulo combinacional siguiente convierte signed de 16 bits F=8 a ocho bits F=4. Con d=4, guard=p[3] y sticky=p[2:0]. Incremento y comparación se realizan en signed de 17 bits y solo al final se toman ocho.

SystemVerilog
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
endmodule

P=2040 produce 127.5, redondea a 128 y satura a 127: valor final 7.9375. Comprobar solo q=127 antes de redondear pierde ese exceso. saturated indica limitación por rango, no simplemente pérdida de bits fraccionarios.

Al generalizar, separe d=0, sin bits descartados, y d=1, sin zona sticky. Ocultar una selección inválida dentro de un condicional puede no evitar un error de elaboración.

Redondeo y saturación añaden sumadores, comparadores, MUXMultiplexor Circuito combinacional que conecta una de varias entradas a la salida según una señal de selección. Debe especificarse la correspondencia entre los bits de selección y los números de entrada. Más información y retardo, y se eligen como políticas independientes; vea los formatos de punto fijo de AMD. Al acumular varios términos, decida si conserva ancho intermedio y convierte una sola vez al final. Saturar en cada paso puede romper la asociatividad; redondear en cada paso puede acumular pequeños errores.

Inténtalo tú

Convierta P signed de 16 bits F=8 a signed de 8 bits F=4 para 24,40,−24,−40,2040. Calcule cociente hacia abajo q, guard/sticky, entero redondeado, raw final y valor real. ¿Qué falla si comprueba saturación antes de redondear 2040?

Leer la explicación

Los cuatro bits bajos son siempre 1000: guard=1, sticky=0. P=24: q=1 impar→2, raw=2, valor 0.125. P=40: q=2 par→2, raw=2, 0.125. P=−24: q=−2 par→−2, raw=−2, −0.125. P=−40: q=−3 impar→−2, raw=−2, −0.125. P=2040: q=127 impar→128; excede signed de 8 bits, así que raw=127, valor 7.9375, saturated=1. Comprobar solo q=127 y después sumar en ocho bits puede retornar a 0x80 y producir −8. Termine incremento y comparación en un signed ancho.

Tu elección se aplica a este navegador. Puedes cambiarla en el pie de página.