Una forma mejor que usar std_logic_vector y las bibliotecas no estándar std_logic_arith
y std_logic_signed
es use IEEE.numeric_std.all;
y hacer el contador unsigned
(o firmado en otros contextos donde necesite valores negativos).
signal hcount : unsigned(7 downto 0);
Y puede realizar conversiones desde y hacia enteros y operaciones a nivel de bits:
hcount <= to_unsigned(123,hcount'length);
signal somereg : std_logic_vector(7 downto 0);
...
somereg(to_integer(hcount(2 downto 0)) <= <a bit value>;
Sin embargo, en el ejemplo dado, las operaciones a nivel de bits resultan ser innecesarias: en lugar de enmascarar bits para extraer una dirección de registro de 3 bits, podría usar operaciones de división y modificación. Las herramientas de síntesis (en su mayoría) no son estúpidas: la división y la modificación por potencias de 2 están optimizadas en las extracciones de campo obvias y ni siquiera generan "y" puertas.
signal hcount : natural range 0 to 235;
signal reg_addr : natural range 0 to 7;
signal somereg : std_logic_vector(7 downto 0);
...
reg_addr <= hcount mod 8;
somereg(reg_addr) <= <a bit value>;
Uno de los beneficios de esto (aparte de las conversiones menos feas) es que aún se beneficia del subtipo entero que declaró para hcount
: incrementarlo a 236 provocará un error de desbordamiento en la simulación, lo que le permite detectar y corregir la lógica errores tempranos.