Construí un contador mod-16, y el resultado de salida es un INTEGER (todos los ejemplos que vi usaban INTEGER).
Construí un decodificador de pantalla hexadecimal a 7 segmentos, y su entrada es un STD_LOGIC_VECTOR (lo escribió de esa manera porque era fácil mapear la tabla de verdad).
Me gustaría conectar la salida del contador a la entrada del decodificador, pero obtengo errores de "falta de coincidencia de tipos" cuando intento compilar en QuartusII.
¿Hay alguna forma de convertir de un tipo INTEGER a un tipo STD_LOGIC_VECTOR en una lista de VHDL?
Digamos que su contador de 4 bits tenía una salida INTEGER SOME_INTEGER y deseaba convertirlo en un STD_LOGIC_VECTOR de 4 bits.
También puede usar esto para inicializar vectores con números significativos
Creo que es posible que deba agregar "use IEEE.STD_LOGIC_ARITH.ALL;" y / o STD_LOGIC_UNSIGNED.
La operación complementaria es conv_integer (vector). Me gusta usar esto cuando hago comparaciones. Entonces podría declarar
Y luego, más tarde, puedo usar esto en una declaración if
EDITAR: no debería necesitar declarar la variable como un entero. Intente cambiar la declaración a std_logic_vector en su lugar. Los operadores + y - trabajan en std_logic_vectors.
fuente
Puede interesarle usar los tipos
unsigned
ysigned
deieee.numeric_std
. Son compatibles constd_logic_vector
, pero tienen una interpretación numérica (binaria o de 2 complementos). También existe la opción de poner tal interpretaciónstd_logic_vector
, pero esto no es recomendable .fuente
Como dice la respuesta principal, el método recomendado es el siguiente:
Sin embargo, me gustaría explicar por qué se recomienda esto y por qué VHDL tiene una forma aparentemente complicada de convertir enteros en std_logic_vectors.
Se trata de cómo estos tipos son vistos por las herramientas.
Un standard_logic_vector es literalmente un grupo de 1s o 0s. Tengo 10001. ¿Qué número es este? Bueno, eso depende. ¿Está firmado o sin firmar? El SLV no lo sabe ni le importa. Cuantos pedazos Bueno, ¿cuánto dura tu SLV?
Se firma un número entero, y generalmente 32 bits (si no recuerdo mal).
Etapa 1: acortar mi número entero y sin firmar. Esa es esta parte:
Etapa 2: Luego, toma esos bits y úsalos para manejar my_slv.
(Una nota sobre terminología.
A <= B
En VHDL se lee en voz alta como "A es impulsado por B")Combinado, esto te lleva a:
Cuando proviene de un fondo de programación tradicional, es muy fácil quedarse atrapado en una forma de pensar de programación. Pero en VHDL, el código que escribe tiene implicaciones físicas en el hardware. Saber por qué este método funciona y se recomienda está un paso más cerca de pensar en lo que está escribiendo en términos de hardware.
Consejo adicional: las funciones con el prefijo to_ son las que acortan / cambian los operandos. Los hacen sin firmar o una cierta longitud o ambos. Es por eso que to_unsigned requiere que especifique la longitud. Las funciones sin to_ (straight std_logic_vector (...) en este ejemplo) se usan cuando los tipos ya son directamente compatibles. "Toma estos bits y mételos en este tipo, no se requieren modificaciones". Estos no tienen un argumento de longitud porque ambos lados ya son iguales. Entonces, cuando construyo cosas como esta, no necesito buscarlo, solo pienso en cómo estoy cambiando los datos.
fuente
Para convertir un entero a std_logic_vector, tiene varias opciones. Usando numeric_std:
o
Usando std_logic_arith:
std_logic_arith no es un estándar ieee, pero la mayoría de las herramientas lo compilan en la biblioteca IEEE y es ampliamente utilizado.
fuente