Estoy utilizando la multiplicación de dos números de punto fijo: Q1.11 y Q1.18 y obtengo Q1.18 como resultado de FPGA en VHDL.
Como resultado de la multiplicación, recibiré Q2.29 - vector de 31 bits donde los dos bits más altos representarán el signo. Después de la multiplicación, tengo que cortar el vector hasta el tamaño de Q1.18 - (29 abajo a 11) en términos de VHDL. Todo está bien si el resultado es positivo, pero con números negativos las cosas se vuelven más complicadas. Si el resultado es menor que -2 ^ -18, digamos -2 ^ -20, después del truncamiento obtendré -2 ^ -18 cuando quiero obtener 0.
Entonces, mi pregunta es si hay algún algoritmo "matemático", que requiera solo la suma y la resta, de redondear números negativos pequeños a 0 o el método "si, entonces, más" es una forma de hacerlo.
Editar # 1 Esto es lo que espero lograr:
>> a = fi(-2^-20,true,31,29)
a =
-9.5367e-07
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 31
FractionLength: 29
>> b = fi(a,true,19,18)
b =
0
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 19
FractionLength: 18
Y esto es lo que obtendré si truncara la variable más larga:
bin(a)
ans =
'1111111111111111111111000000000'
q = quantizer('mode','fixed', 'format', [19 18], 'overflowmode', 'wrap')
q =
DataMode = fixed
RoundMode = floor
OverflowMode = wrap
Format = [19 18]
c = bin2num(q, '1111111111111111111')
c =
-3.8147e-06