Operación lógica VHDL en entero

2

Tengo un código VHDL que tiene la siguiente definición de señal:

signal hcount  : integer range 0 to 235;

Esto se usa como un contador en todo mi sistema (por lo que creo que debe continuar como un entero y no ser declarado como un std_logic_vector por ejemplo), pero también necesito usar sus 3 bits menos significativos para indexar un ocho. Señal de bit como esta (que no se compila):

signal somereg : std_logic_vector(7 downto 0);
...
somereg(hcount and B"00000111") <= <a bit value>;

¿Cuál es la forma más adecuada de indexar el vector "somereg" anterior?

Gracias

    
pregunta user2496237

2 respuestas

3

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.

    
respondido por el Brian Drummond
1

En primer lugar, no hay nada de malo en usar std_logic_vector como contador. Lo hago todo el tiempo. Normalmente tengo las siguientes declaraciones de biblioteca en la parte superior de cada módulo, que le proporcionan los operadores aritméticos necesarios en los vectores de bits.

library IEEE;
  use IEEE.std_logic_1164.all;
  use IEEE.std_logic_arith.all;
  use IEEE.std_logic_signed.all;   -- or IEEE.std_logic_unsigned.all

Pero si realmente quieres quedarte con integer , hay funciones estándar que convertirán un número entero a otros tipos. En tu caso, usarías algo como

somereg <= std_logic_vector (to_unsigned (hcount, somereg'length));

to_unsigned() es una función de conversión que convierte el número entero en un vector de bits, por lo que necesita saber la longitud del objetivo. Entonces, std_logic_vector() es una conversión de tipo simple del vector de bits.

    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas