Estoy diseñando un filtro de interpolación personalizable y estoy buscando la mejor manera de pasar los coeficientes (en lugar de puntos de apoyo) al filtro. A continuación verá la implementación actual.
package lin_interpol_filter_unsigned_pack is
type supp_point_vector is array (integer range <>) of integer;
end package;
--! Use std libraries.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.lin_interpol_filter_unsigned_pack.all;
entity lin_interpol_filter_unsigned is
generic (
--! Determines number of interpolations steps by steps = 2 ^ <interpol_steps_exp_g>
interpol_steps_exp_g : integer := 6;
input_width_g : integer := 12;
output_width_g : integer := 12
);
port (
clk_i : in std_logic;
supp_points_vect_i : in supp_point_vector (0 to 2**interpol_steps_exp_g);
input_stream_i : in unsigned (input_width_g downto 0);
output_stream_o : out unsigned (output_width_g downto 0)
);
end;
El usuario tendría que pasar los puntos de apoyo al módulo como una constante. Ahora me preocupa que Vivado no pueda optimizar el puerto de entrada al ancho de bits mínimo, sino que utilice el rango entero (32 bits?). ¿Puedo esperar que Vivado minimice el ancho de bits?
No estoy del todo contento con este enfoque. Me gustaría que el usuario pase los puntos de apoyo como genéricos, pero la declaración genérica dependería de otro genérico (el interpol_steps_exp_g
genérico) que no está permitido. ¿Hay tal vez otra manera de pasar los puntos de apoyo convenientemente?
Gracias.