27 votos

VHDL: la Conversión de un ENTERO de tipo STD_LOGIC_VECTOR

He construido un mod-16 contador, y el resultado de salida es un número ENTERO (todos los ejemplos que me vio antes de ENTEROS).

He construido un hex-a-7-segmento-display del decodificador, y su entrada es un STD_LOGIC_VECTOR (escribió de esa manera porque era fácil de trazar el mapa de la tabla de verdad).

Me gustaría conectar la salida del contador a la entrada del decodificador, pero me sale 'no coincide el tipo de errores al intentar compilar en QuartusII.

Hay una manera de convertir de un tipo ENTERO a un tipo STD_LOGIC_VECTOR en un VHDL listado?

16voto

Martin Thompson Puntos 6509

Como LoneTech dice, use ieee.numeric_std es tu amigo. Usted puede convertir un std_logic_vector a integer, pero tendrás que lanzarla como signed o unsigned primera (ya que el compilador no tiene idea de lo que quieres decir). VHDL es un lenguaje con establecimiento inflexible. He escrito más sobre este tema en mi blog

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

14voto

Prateek Puntos 83

Como otros dijeron, uso ieee.numeric_std, nunca ieee.std_logic_unsigned, que no es realmente un paquete IEEE.

Sin embargo, si usted está utilizando las herramientas con VHDL de 2008, de apoyo, usted puede utilizar el nuevo paquete ieee.numerc_std_unsigned, lo que en esencia hace std_logic_vector se comportan como unsigned.

También, ya que yo no veo que se indique explícitamente, un verdadero ejemplo de código para convertir de un (unsigned) entero a un std_logic_vector:

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

6voto

Duncan Smart Puntos 9195

Supongamos que el 4 bits mostrador había un número ENTERO de salida SOME_INTEGER, y que quería convertir a un 4 bits STD_LOGIC_VECTOR

SOME_VECTOR <= conv_std_logic_vector(SOME_INTEGER, 4);

También puede utilizar esto para inicializar los vectores con cantidades significativas

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

Creo que usted puede necesitar agregar "use IEEE.STD_LOGIC_ARITH.TODOS"; y/o STD_LOGIC_UNSIGNED.

La operación complementaria es conv_integer(vector). Me gusta usar esto cuando tengo que hacer comparaciones. Así que yo podría declarar

constant SOME_CONSTANT : integer := 999;

Y luego, más tarde, puedo usar esto en una instrucción if

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

EDIT: no es necesario declarar la variable como un Entero. Pruebe a cambiar la declaración de std_logic_vector lugar. Los operadores + y - trabajo en std_logic_vectors.

5voto

Chance Puntos 1

agregar la IEEE.STD_LOGIC_UNSIGNED.TODOS a dejar su VECTOR añadibles :)

1voto

Jordan S. Jones Puntos 1023

Usted puede estar interesado en el uso de los tipos unsigned y signed de ieee.numeric_std. Son compatibles con std_logic_vector, pero tiene un numérico de la interpretación (binario o 2-complemento). También hay la opción de poner una interpretación de esta índole std_logic_vector, pero esto no se recomienda.

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: