Sunteți pe pagina 1din 5

Uso Correcto de los Paquetes IEEE

para Matemtica Simple


Nota Tcnica 6

Cristian Sisterna

A fin de aclarar algunos conceptos del uso de paquetes con operaciones matemticas simples, se debe
saber que los siguientes paquetes nunca deberan usarse juntos en un mismo proyecto:
ieee.numeric_std.all / ieee.std_logic_arith.all / ieee.unsigned.all/
ieee.signed.all;
ieee.numeric_std.all se refiere a un paquete de la librera estandard de la IEEE; la que debera
ser usada para todos los diseos nuevos.
ieee.std_logic_arith.all,ieee.std_logic_unsigned.all,
ieee.std_logic_signed.all se refieren a un paquete definido por Synposys algunos aos
atrs, y que por ser una de las herramientas de sntesis ms usadas, estos paquetes eran usados casi por
defecto.
Hasta el da de hoy Xilinx ISE usa los siguientes paquetes, por defecto, cuando se usa la opcin de crear
un nuevo mdulo VHDL:
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

A fin de que el cdigo VHDL a escribir sea 100% IEEE estandard, estos paquetes deben ser reemplazados
por:
use ieee.numeric_std.all;

Sin embargo, vale la pena aclarar lo siguiente: el paquete std_logic_arith es normalmente usado
porque tiene definido operaciones matemticas, como suma y resta, para el tipo std_logic, el
std_logic_vector y el tipo integer. El paquete numeric_std NO tiene definidas operaciones
matemticas para std_logic, std_logic_vector, pero s las tiene definidas para los tipos
signed,
unsigned e integer. Por ello para los casos en que sean necesarias operaciones
matemticas entre seales o variables, estas se debern declarar como tipo signed, unsigned o
integer, y usar 'casting' o funciones de conversin para pasar de unsigned/signed/integer a
std_logic_vector.
El ejemplo ms tpico es el de un contador descrito en VHDL. La forma correcta de describirlo sera la
siguiente:

C7 Tecnologa

NT 6 - V1.0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
-- entity declaration
entity counter_load is
port (
-- clock, reset ports
clock
: in std_logic;
reset
: in std_logic;
-- control ports
load
: in std_logic;
-- input ports
initial_value
: in std_logic_vector(3 downto 0);
-- output ports
count
: out std_logic_vector(3 downto 0)
) ;
end counter_load;
-- architecture declaration
architecture counter_load_beh of counter_load is
signal count_i: unsigned(3 downto 0);
-- architecture body
begin
count_proc: process(clock, reset)
begin
if(reset='0') then
count_i <= (others => '0');
elsif(rising_edge(clock)) then
if (load = '1') then
count_i <= unsigned(initial_value);
else
count_i <= count_i + 1;
end if;
end if;
end process count_proc;
count <= std_logic_vector(count_i);
end architecture counter_load_beh;

En este ejemplo se puede ver el use de 'cast'. En lnea 32 se usa el cast unsigned para asignar el
standard_logic_vector initial_value al unsigned count_i. Mientras que en lnea 39 se usa el cast
std_logic_vector para asignar el unsigned count_i al standard_logic_vector count.
Otro ejemplo similar es el siguiente:

C7 Tecnologa

NT 6 - V1.0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
-- entity declaration
entity counter_ud is
port (
-- clocks, reset ports
clock
: in std_logic;
reset
: in std_logic;
-- control ports
load
: in std_logic;
-- inputs ports
initial_value: std_logic_vector(3 downto 0);
-- output ports
count
: out std_logic_vector(3 downto 0)
);
end counter_ud;
-- architecture declaration
architecture counter_ud_beh of counter_ud is
signal count_i: integer range 0 to 15;
-- architecture body
begin
count_proc: process(clock, reset)
begin
if(reset='0') then
count_i <= 0;
elsif(rising_edge(clock)) then
if(load = '1') then
count_i <= to_integer(unsigned(initial_value));
else
count_i <= count_i + 1;
end if;
end if;
count <= std_logic_vector(to_unsigned(count_i,4));
end process count_proc;
end architecture counter_ud_beh;

En este caso en lnea 32 ocurre algo interesante: primero se usa el cast unsigned para convertir a
unsigned el std_logic_vector initial_value. Luego se usa la funcin to_integer para convetir
el unsigned a integer y asignrselo a count_i, que lgicamente es de tipo integer. En lnea 37
ocurre algo similar, pero no igual :) : se usa la funcin to_unsigned para convertir el entero count_i
que se puede representar con 4 bits (count_i es declarado de 0 a 15), y luego se usa el cast
std_logic_vector para pasar de unsigned a std_logic_vector y as poder asignar el
vector a count que es un std_logic_vector.

C7 Tecnologa

NT 6 - V1.0

Diagram de Funciones y Cast para conversin de tipos en VHDL


este blog describo en un simple diagrama cuales son las diferentes funciones de conversin de
tipo disponibles en el paquete numeric_std y su modo de uso para las conversiones
respectivas. Tambin se detalla el uso de cast para conversiones entre tipos relacionados
como std_logic_vector y unsigned.

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

to_unsigned(int,unsignedlength)

to_integer(unsigned)

integer

to_integer(signed)

to_signed(int,signedlength)

C7 Technology
www.c7t-hdl.com

unsigned

signed

function

std_logic_vector(unsigned)

unsigned(slv)
signed(slv)

std_logic_vector

std_logic_vector(signed)

cast

El uso de este diagrama para la conversin de tipos es bastante sencillo.


Por ejemplo, para convertir un tipo integer a un tipo std_logic_vector, hay que seguir la
lnea amarilla junto con las funciones respectivas: se comienza con la funcin
to_unsigned(int, unsigned'length) y luego se usa el cast std_logic_vector sobre
el unsigned obtenido previamente. unsigned'length significa el nmero de bits necesarios
para representar el respectivo integer. Por ejemplo 4 bits para el entero mayor que 7 y menor o
igual que 15; 3 bits para un entero entre 0 y 7; etc.
Para ir del tipo std_logic_vector al tipo signed, solo hace falta aplicar el cast signed
sobre el slv (std_logic_vector), es decir la lnea verde entre ambos.

C7 Tecnologa

NT 6 - V1.0

C7 Technology

www.c7t-hdl.com

Copyright 2012.
All rights reserved.

C7 Tecnologa

NT 6 - V1.0

S-ar putea să vă placă și