# Como pasar un vector de 4 bits a decimal



## Andreakrol (May 19, 2012)

Hola quisiera que me pudieran ayudar con un problema que tengo realizando una programación e VHDL (Xilinx); necesito saber como puedo pasar:
          Num: in STD_LOGIC_VECTOR (0 to 3);
a un decimal para que puede leerse y luego ser asignado a una variable como Ncajas.


----------



## fms (May 19, 2012)

Hola Andreakrol
Depende de los paquetes que estes usando. Xilinx suele poner por defecto el paquete std_logic_arith, aunque yo prefiero usar el numeric_std. Los paquetes los puedes ver al principio del fichero y los puedes modificar.
Este es el numeric_std

```
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
```

Y este es el std_logic_arith (que suele poner por defecto el Xilinx)

```
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
```

Si usas el paquete numeric_std, la función de conversión es TO_INTEGER, lo que asignado a la variable tuya sería lo siguiente (en tu caso estaría dentro de un proceso o función, por ser una variable)

```
NCajas := TO_INTEGER (Num);
```
Mientras que si usas el paquete std_logic_arith, la función es CONV_INTEGER

```
NCajas := CONV_INTEGER (Num);
```

Pero esto es si Num fuese un tipo unsigned o signed, y no un std_logic_vector.
Así que antes tendrías que convertirlo con un cast a un unsigned (o signed), y quedaría así:

```
NCajas := TO_INTEGER (unsigned(Num));
```
O con el paquete std_logic_arith:

```
NCajas := CONV_INTEGER (unsigned(Num));
```
Aunque creo que el paquete std_logic_arith lo permite sin el cast, pero no estoy seguro

Por último, aunque no es una norma, muchas veces los vectores se declaran en sentido descendente:

```
Num: in STD_LOGIC_VECTOR (3 downto 0)
```

Espero que te ayude, de todos modos, si profundizar un poco, puedes mirarte el apartado 8.3.2 del libro diseño de sistemas digitales con vhdl que está en este enlace: http://hdl.handle.net/10115/5700

Saludos


----------



## Andreakrol (May 19, 2012)

mm Ahora me produce un error 

se supone que yo estoy declarando 

Num: in STD_LOGIC_VECTOR (3 downto 0)-- como una variable de entrada

constant Ncaj : natural := 0;-- como la constante donde se va a asignar el dato Num

y ahora le asigne a Ncaj asi:

Ncaj<= TO_INTEGER(unsigned(Num));--error--Se lee el número de Num y se le asigna a Ncaj

y el error que se obtiene es:
Line 81. Constant 'Ncaj' Ncaj is at left hand side of signal assignment statement.


----------



## fms (May 19, 2012)

Ncaj no la puedes declarar como una constante, porque, como su nombre indica, las constantes no cambian de valor. La tienes que declarar como una señal. Y es mejor que no le asignes valor inicial:

signal Ncaj : natural range 0 to 15;

Es importante incluir el rango de las señales que son enteros o naturales, porque si no el sintetizador generará una señal de 32 bits. En tu caso, como Num tiene 4 bits, el rango es de 0 a 15.

Por último, ten en cuenta que en VHDL una señal y una variable no es lo mismo.


----------



## Andreakrol (May 19, 2012)

Muchas gracias ya pude arreglar ese error. Pero una ultima pregunta si yo necesito hacer un contador se le asigna una constante 

constant P : natural := 0;

y se pone el contador así:

C=C+1;

o tengo algún error porque me dice que tengo un error:

Line 99. Read symbol =, expecting <= or :=



ya pude corregir todos los errores Mcuchas gracias por tu ayuda el libro esta muy bueno! =D


----------



## fms (May 19, 2012)

Que bueno que lo hayas resuelto

Como veo que estas haciendo contadores, quizá te puede ser de ayuda este otro libro en el que se tratan de manera más básica: _Diseño de circuitos digitales con VHDL_ http://hdl.handle.net/10115/4045

Saludos


----------

