37 votos

VHDL: Convertir de un tipo INTEGER a un STD_LOGIC_VECTOR

Construí un contador mod-16, y el resultado de la salida es un INTEGER (todos los ejemplos que vi usaban INTEGER).

Construí un decodificador de pantalla hexagonal a 7 segmentos, y su entrada es un STD_LOGIC_VECTOR (lo escribí así porque era fácil trazar la tabla de la verdad).

Me gustaría conectar la salida del contador a la entrada del decodificador, pero tengo errores de 'tipo de desajuste' al intentar compilar en QuartusII.

¿Hay alguna manera de convertir de un tipo INTEGER a un tipo STD_LOGIC_VECTOR en un listado VHDL?

29voto

Prateek Puntos 83

Como han dicho otros, utilice ieee.numeric_std , nunca ieee.std_logic_unsigned que no es realmente un paquete IEEE.

Sin embargo, si utiliza herramientas compatibles con VHDL 2008, puede utilizar el nuevo paquete ieee.numeric_std_unsigned que esencialmente hace que std_logic_vector se comportan como sin signo.

Además, como no lo he visto explícitamente, aquí hay un ejemplo de código real para convertir de un entero (sin signo) a un std_logic_vector :

use ieee.numeric_std.all;
...
my_slv <= std_logic_vector(to_unsigned(my_int, my_slv'length));

17voto

Martin Thompson Puntos 6509

Como dice LoneTech, use ieee.numeric_std es tu amigo. Puedes convertir un std_logic_vector a un integer pero tendrás que lanzarlo como signed o unsigned primero (ya que el compilador no sabe a qué se refiere). VHDL es un lenguaje fuertemente tipado. Yo he más escrito sobre este tema en mi blog

Fundamentalmente, cambiaría su convertidor de 7seg para tomar un integer (o en realidad un natural (dado que sólo va a tratar con números positivos) - la conversión es entonces una simple búsqueda en la matriz. Configurar una matriz constante con las conversiones en y sólo el índice en él con el número entero que se utiliza en la entidad como una entrada.

0 votos

Gracias por esto. Aprecio mucho sus comentarios. Yo estaba en una posición de TA de las clases, el aprendizaje de VHDL para ayudar a un profesor de empezar a que era un poco tembloroso en los conceptos de programación. Le voy a pasar tu información - el libro de texto que usamos no profundizaba en las cuestiones de "moralidad" de VHDL.

1 votos

Es menos una cuestión de "moralidad" que una garantía de coherencia. La librería numeric_std es un estándar real instituido por el IEEE, mientras que la librería std_logic_unsigned fue inventada por un proveedor, y adoptada en la industria sin ninguna definición formal real. No hay garantía de compatibilidad entre vendedores con las librerías no estándar, aunque normalmente funciona bien. Sin embargo, es una buena forma de pasar al estándar ahora.

5voto

Chance Puntos 1

Añadir IEEE.STD_LOGIC_UNSIGNED.ALL para que su VECTOR se pueda añadir :)

1voto

Jordan S. Jones Puntos 1023

Tal vez le interese utilizar los tipos unsigned y signed de ieee.numeric_std . Son compatibles con std_logic_vector pero tienen una interpretación numérica (binaria o de 2 complementos). También existe la opción de poner dicha interpretación en std_logic_vector pero esto es no se recomienda .

0voto

Duncan Smart Puntos 9195

Digamos que tu contador de 4 bits tiene una salida INTEGER SOME_INTEGER, y quieres convertirlo en un STD_LOGIC_VECTOR de 4 bits

SOME_VECTOR <= conv_std_logic_vector(SOME_INTEGER, 4);

También puedes utilizarlo para inicializar vectores con números significativos

SOME_VECTOR <= conv_std_logic_vector(9, 4); -- instead of "1001"

Creo que es necesario añadir "use IEEE.STD_LOGIC_ARITH.ALL;" y/o STD_LOGIC_UNSIGNED.

La operación complementaria es conv_integer(vector). Me gusta usarla cuando hago comparaciones. Así que podría declarar

constant SOME_CONSTANT : integer := 999;

Y luego, más tarde, puedo usar esto en una sentencia if

if (conv_integer(SOME_VECTOR)=SOME_CONSTANT)
  then OTHER_VECTOR <= (others => '0');
end if;

EDIT: No debería ser necesario declarar la variable como un Integer. Intenta cambiar la declaración a std_logic_vector en su lugar. Los operadores + y - funcionan en std_logic_vectors.

3 votos

Por favor, no haga esto. Use numeric_std (vea las respuestas de LoneTech y las mías)

0 votos

Si tienes una forma mejor de hacerlo, está bien, pero mi sugerencia funciona, así que creo que tu voto negativo era innecesario. He utilizado std_logic_arith durante años y nunca he tenido problemas con él. Creo que el miedo a que los vendedores cambien sus implementaciones es infundado; ¿qué vendedor en su sano juicio se arriesgaría a romper los diseños de sus clientes?

1 votos

Ya tienes una respuesta a qué vendedor pondrá voluntariamente cosas específicas del vendedor en el espacio de nombres de IEEE. Sigue siendo burdo, sobre todo cuando se trata de cosas firmadas y valores sin signo.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X