Escalado de una entrada en VHDL

3

Quiero atenuar una señal entrante (número de signo de 16 bits entre -1 y 1) en una cierta cantidad (digamos 0,8), es decir,

incoming = incoming * 0.8

Donde entrante es una señal:

signal incoming : std_logic_vector(15 downto 0);

Pero estoy teniendo problemas para que esto funcione. Dentro de un bloque de proceso:

variable temp : std_logic_vector(31 downto 0);
variable scale_factor : std_logic_vector(15 downto 0) := x"6666";

begin

incoming_raw <= data_in;
temp := incoming_raw * scale_factor;
incoming <= temp(31 downto 16);

end process;

A ModelSim no le gusta esto y me da:

# ** Error: /home/blah/blah.vhd(254): No feasible entries for infix operator "*".
# ** Error: /home/blah/blah.vhd(254): Bad right hand side (infix expression) in variable assignment.

¿Por qué el operador * no puede hacer esto cuando ambos operandos son std_logic_vectors de 16 bits?

    
pregunta benjwy

1 respuesta

1

Puedes hacer esto con bastante elegancia con el nuevo fixed_pkg :

pr_scale : process is    
    constant b : s_fixed(0 downto -15) := to_sfixed(0.8, 0, -15);
    variable x, y : s_fixed(0 downto -15);
begin
    x        := to_sfixed(data_in, x);
    y        := resize( b * x, y);
    incoming <= to_slv(y);
end process;

Como nota al margen, quiero comentar sobre el uso indebido común de los tipos en VHDL: std_logic_vector es una matriz std_logic , que es un conjunto de variables, señales o constantes que se usan frecuentemente para modelar señales digitales. std_logic_vector no tiene una interpretación numérica por defecto y, por lo tanto, no tiene un operador * asociado. Para realizar operaciones matemáticas en std_logic_vector , debe convertirlo al tipo correcto en una de las bibliotecas numéricas proporcionadas por el IEEE: ieee.fixed_pkg y ieee.numeric_std ; Sólo tú sabes cuál. Dado que tanto std_logic_vector como (un)signed se definen como matrices de std_logic , son tipos muy relacionados y se pueden convertir con una conversión simple. Pero debido a la naturaleza tipográfica fuerte, todavía son tipos diferentes y no pueden mezclarse.

Como comentario final, quiero mencionar que parece haber un malentendido generalizado de que es necesario convertir todo a std_logic_(vector) . La mayoría de las herramientas de síntesis manejarán numeric_std tipos, enteros y booleanos muy bien, por lo que no hay necesidad de descartar esta valiosa herramienta de abstracción porque el software hace veinte años no era compatible. Para citar a Abraham Lincoln:

  

Los dogmas del pasado tranquilo son inadecuados para el presente tormentoso.

    
respondido por el trondd

Lea otras preguntas en las etiquetas