Me estoy enfocando en el proceso de multiplicar dos números Qm.n y generar una respuesta del mismo ancho.
Como ejemplo, pretenderé que tengo un número Q2.5 de 8 bits. Entiendo que este formato puede representar un número en el rango de -4 a 3.96875.
Comprendo que al multiplicar dos SLV de 8 bits se obtiene un SLV de 16 bits, simplemente no estoy seguro de qué significa cada bit en este resultado de 16 bits.
Aquí está mi algoritmo:
- multiplique los dos SLV de 8 bits, para obtener un resultado de 16 bits
- desplazar el resultado dejado por el número de bits fraccionarios, 5 en este caso
- asigne los 8 bits más bajos como resultado
¿Hay algo más que esto? ¿Por qué el número de bits enteros no entra en él? Aquí hay una función que he escrito para intentar hacer esto:
function qmult(a : signed; b : signed; n : integer)
return signed is
variable tmp0 : signed(a'length * 2 - 1 downto 0);
variable tmp1 : signed(a'length * 2 - 1 downto 0);
variable ret_val : signed(a'length - 1 downto 0);
begin
tmp0 := a * b;
tmp1 := tmp0 srl n;
ret_val := tmp1(a'length - 1 downto 0);
return ret_val;
end qmult;
Dos preguntas principales para concluir:
-
¿Por qué no hay tal función en numeric_std si es así de simple?
-
A mi entender, si no está seguro del formato Q de dos números, es imposible obtener un resultado de multiplicación adecuado (no conoce los bits fraccionarios, por lo que el paso [2] de los anteriores) el algoritmo no funciona) o hay un agujero en mi entendimiento?