Você está na página 1de 28

S

HW
W

GRUPO DE DISEO
HARDWARE SOFTWARE
DIET ESCET URJC

Informe tcnico:
Fecha:

FCLTC_000
17-01-2005

Proyecto:
Subproyecto:

Docencia
VHDL

Herramientas software:
Componentes hardware:

ModelSim
Ad-hoc

IT_FCLTC_000

Introduccin a ModelSim
Sumador binario de n bits
Resumen:
El presente informe presenta una introduccin sencilla paso a paso del simulador
VHDL ModelSim mediante la construccin de un sumador binario parametrizable
de n bits materializado como una red iterativa de sumadores binarios de 1 bit en
cascada ripple carry.

Jos Ignacio Martnez Torre


Pablo Huerta Pellitero
Despacho 160 Edificio Departamental II
Grupo de Diseo HwSw DIET (ESCET)
Universidad Rey Juan Carlos
28933 Mstoles Madrid ESPAA

niversidad Rey Juan Carlos

Tel: +34 91 664 74 96


Fax: +34 91 488 70 46
Email: j.martinez@escet.urjc.es

DOCENCIA - VHDL

Introduccin a ModelSim

Grupo de diseo Hardware Software DIET ESCET URJC


C/ Tulipn s/n, E-28933, Mstoles, Madrid, ESPAA
Telfono (34) 91 664 74 96 Fax (34) 91 664 74 90

Tabla de contenidos
OBJETIVO ...................................................................................................................................... 1
PRCTICA GUIADA ..................................................................................................................... 5
CONCEPCIN DEL SUMADOR DE ARRIBA-ABAJO .......................................................................... 5
DESCRIPCIN VHDL DEL SUMADOR DE ABAJO-ARRIBA .............................................................. 6
Edicin VHDL y gestin de espacios de diseo ..........................................................6
Compilacin del diseo vhdl ........................................................................................9
Simulacin vhdl y anlisis de resultados ...................................................................11
CDIGO VHDL DEL SUMADOR BINARIO DE N BITS ....................................................... 15
NAND2......................................................................................................................................... 15
NAND3......................................................................................................................................... 15
XOR2........................................................................................................................................... 16
ADD_1......................................................................................................................................... 16
Add_1 funcional .........................................................................................................16
Add_1 test ..................................................................................................................16
Add_1 circuito.............................................................................................................17
ADD_8......................................................................................................................................... 18
Add_8 circuito............................................................................................................18
Add_8 test .................................................................................................................19
Add_8 funcional ........................................................................................................19
ADD_N ......................................................................................................................................... 19
Add_n circuito............................................................................................................19
Add_n funcional .........................................................................................................20
Add_n test ..................................................................................................................20
BIBLIOGRAFA............................................................................................................................ 21

I N T R O D U C C I N

M O D E L S I M

J I M T @ P H P

Captulo

1
Objetivo

l objetivo de este manual es presentar a grandes rasgos el entorno de simulacin


de circuitos lgicos digitales descritos mediante un lenguaje de descripcin de
hardware como VHDL.

En la Figura 1 se muestra el diagrama general de flujo que se deber llevar a cabo para
comprobar el correcto funcionamiento de cualquier diseo.

En primer lugar, se realizar un estudio analtico a mano del circuito propuesto para
conocer su funcionamiento y tener una idea certera de qu debemos esperar como
resultado de la aplicacin de las herramientas informticas. Este estudio se deber
realizar antes de utilizar dichas herramientas y es parte fundamental para la correcta
asimilacin de los conocimientos que se imparten.

A continuacin, se har un estudio asistido por ordenador utilizando el paquete


informtico ModelSim de Mentor Graphics inc. Este paquete informtico est
compuesto por un conjunto de aplicaciones que permiten disear circuitos digitales
en VHDL y simular y analizar su comportamiento de una forma sencilla dentro de un
entorno integrado para PC. La secuencia habitual de pasos se lleva a cabo del
siguiente modo:
o

Se introduce el diseo que se pretende simular mediante la edicin del


cdigo VHDL, bien a travs del editor de la herramienta (Edit Window) o
bien a travs de otro editor convencional. Adems, se debe crear un
entorno de trabajo para gestionar las bibliotecas utilizadas y creadas
(Library Browser).

Se compila el diseo de forma ordenada jerrquicamente desde el nivel


ms bajo al nivel ms alto. ModelSim detecta de forma automtica el orden
de compilacin de los distintos archivos.

I T _ F C L T C _ 0 0 0

Estudio del diseo

Editor Window
Workspace Browser
Library Browser

Edicin VHDL del diseo


y gestin de bibliotecas

VHDL Compiler

Compilacin del
diseo VHDL

VHDL Simulator

Simulacin VHDL

Waveform Viewer
Debugger

Mejora del diseo

Anlisis de los
resultados

FIN
Figura 1: Mtodo de trabajo.
o

Se simula el diseo mediante el simulador.

Se comprueba el correcto o incorrecto funcionamiento del diseo,


analizando las formas de onda de las seales necesarias mediante el
visualizador (Waveform Viever) y/o se depura el cdigo utilizando el
depurador. En caso de que los resultados no sean los esperados, se deber
mejorar el diseo, normalmente comenzando con el estudio del propio
diseo o re-escribiendo parte o todo el cdigo VHDL.

I N T R O D U C C I N

M O D E L S I M

J I M T @ P H P

La explicacin de los pasos bsicos se realiza materializando una prctica introductoria


sencilla en el Captulo 2, de modo que se siga el flujo de diseo de la Figura 1. En
[1,2,3,4,5] se hace referencia a bibliografa que aporta informacin complementaria sobre
este paquete informtico, el lenguaje VHDL y diseo lgico.

I T _ F C L T C _ 0 0 0

I N T R O D U C C I N

M O D E L S I M

J I M T @ P H P

Captulo

2
Prctica guiada

a prctica se orienta hacia el aprendizaje del entorno de simulacin de ModelSim


aplicndolo a la descripcin en el dominio estructural y funcional de un sumador
binario parametrizable de n bits materializado como una red iterativa de sumadores

binarios de 1 bit en cascada ripple carry.


El sumador binario parametrizable de n bits se va a describir utilizando una metodologa de
arriba-abajo (top-down) para su concepcin y una metodologa de abajo-arriba (bottom-up)

para su descripcin VHDL.

Concepcin del sumador de arriba-abajo


El sumador binario parametrizable de n bits (Figura 2) es un sistema con dos entradas
vectoriales de datos de n bits (a y b), una entrada de acarreo de 1 bit (c_in), una salida
vectorial de resultados de n bits (s) y una salida de acarreo de 1 bit (c_out).
a(n-1:0)

c_out

b(n-1:0)

n-bit adder

c_in

s(n-1:0)

Figura 2: sumador binario parametrizable de n bits.


Este sumador binario parametrizable de n bits ser descrito en los dominios conductual y
estructural. En ambos dominios el sumador se puede describir y realizar de distintas
maneras. Para el dominio estructural, el sumador va a ser descrito como una red iterativa en
cascada o ripple-carry.

I T _ F C L T C _ 0 0 0

En Figura 3 se muestra la estructura de bloques e interconexiones del sumador.


a(n-1) b(n-1)

c(n)

a(2)

c(n-1)

FA

....

c(3)

b(2)

FA

s(n-1)

a(1)

c(2)

b(1)

FA

s(2)

a(0)

c(1)

b(0)

FA

s(1)

c(0)

s(0)

Figura 3: sumador binario en cascada (ripple-carry).


Los componentes de la red iterativa son sumadores binarios completos de 1 bit (FA, Full
Adder) y son idnticos entre s. De nuevo estos sumadores de 1 bit pueden ser descritos en
distintos dominios.
En Figura 4 se muestra una descripcin estructural de un sumador binario completo de 1 bit.

c_mas

FA

a
b
a
c
b
c

s1
c_mas
s2
s3

s4

s
c

Figura 4: descripcin estructural del FA.


Para acabar el ejemplo se pueden tambin hacer las descripciones de cada una de las
puertas lgicas bsicas.

Descripcin VHDL del sumador de abajo-arriba


En el apndice A se incluye el cdigo VHDL completo de los distintos diseos desde las
puertas lgicas bsicas hasta la verificacin (test) del sumador parametrizable.
El objetivo ahora es aprender a utilizar el entorno de ModelSim realizando el diseo del
sumador binario parametrizable de n bits.

Edicin VHDL y gestin de espacios de diseo


En primer lugar, se arranca la aplicacin ModelSim XE desde el men de Inicio de Windows,
como se indica en la Figura 5.

I N T R O D U C C I N

M O D E L S I M

J I M T @ P H P

Figura 5: Ventana de inicio de ModelSim


Se comienza creando un Proyecto de Trabajo (Project seleccionando New desde el men
File). Se introduce el nombre del proyecto y el lugar donde se quiere guardar, y se pulsa OK.
(Figura 6).

Figura 6: Creacin del Proyecto.

Una vez hecho esto, aparece una ventana que nos permite crear un nuevo archivo, aadir
al proyecto archivos existentes, etc. (Figura 7).
7

I T _ F C L T C _ 0 0 0

Figura 7: Aadir Archivos.


El siguiente paso consiste en crear un archivo de VHDL para introducir un diseo. Para ello,
se pulsa dos veces en Create New en File en la ventana anterior, o si la hemos cerrado
podemos hacerlo desde el men File->Add to Project->New File. Nos aparecer una
ventana donde debemos introducir el nombre del archivo, y el lenguaje que se va a usar, en
nuestro caso VHDL. (Figura 8).

Figura 8: Creacin de un archivo VHDL.


Aparecer el archivo creado en la parte derecha de la pantalla, y haciendo doble click sobre
el, se nos abrir el editor de texto en el que podremos teclear directamente el cdigo VHDL
deseado (Figura 9).

I N T R O D U C C I N

M O D E L S I M

J I M T @ P H P

Figura 9: Hoja en blanco del editor de VHDL.


En un proceso de diseo completo normal, deberamos escribir aqu el cdigo VHDL; sin
embargo, para este ejemplo ya disponemos de los archivos VHDL hechos, basta con
copiarlos del apndice A de este documento. Se pueden colocar cada unidad compilable en
un archivo distinto, mezcladas en varios archivos o todas juntas en un nico archivo. En
este caso se ha decidido tener varios archivos donde cada uno contenga todas las unidades
compilables relacionadas con una entidad, y el paquete por su cuenta. Todo el proceso de
escritura se puede hacer directamente dentro de ModelSim o primero en otro editor y
despus aadir los archivos vhd.

Compilacin del diseo vhdl


Una vez hemos introducido en el espacio de trabajo los archivos VHDL, stos se deben
compilar siguiendo un orden lgico. Es decir que se han de compilar primero aquellas
unidades de diseo que son elementos constituyentes de otras. En versiones anteriores
haba que indicar el orden en que deban compilarse los archivos, pero actualmente
ModelSim detecta el orden correcto en que se compilarn los archivos.
Una vez preparados para hacer la compilacin, la llevamos a cabo pulsando Compile All en
el men Compile o su icono correspondiente

, lo que dar lugar a la aparicin de

I T _ F C L T C _ 0 0 0

mensajes en la ventana de salida del entorno (Figura 10). Estos mensajes nos indicarn si
la compilacin ha transcurrido con normalidad o, si por el contrario han ocurrido errores.

Figura 10: Resultados de la compilacin.


Si todo ha salido correctamente, se puede proceder a salvar el diseo (Save). Si ha habido
errores, estarn resaltados en rojo. Haciendo doble clic sobre el mensaje de error, se abrir
una ventana con mas informacin acerca del error.
Antes de continuar, echemos un vistazo al esquema de bibliotecas utilizando en Library
Browser. Si seleccionamos la pestaa Library en la parte inferior derecha de la ventana,
veremos lo siguiente (Figura 11).

10

I N T R O D U C C I N

M O D E L S I M

J I M T @ P H P

Figura 11: Library Browser.


Las bibliotecas VHDL consisten en un nombre lgico y un camino fsico a la propia
biblioteca, que se pueden ver si hacemos click con el botn derecho y seleccionamos
Propiedades. Las unidades de diseo se compilan por defecto en la biblioteca WORK, que
puede ser abierta para mostrar todas las unidades existentes.

Simulacin vhdl y anlisis de resultados


El siguiente paso lgico consiste en especificar la unidad de diseo de ms alto nivel que va
a ser simulada, normalmente denominada test. Para ello crearemos un archivo de test, cuyo
cdigo podemos copiar del Apndice de este documento. En este ejemplo vamos a simular
slo el sumador de un bit. Para ello crearemos un nuevo archivo y copiaremos el cdigo del
test. Una vez hecho esto, lo compilaremos para comprobar que no hay errores.
Para comenzar la simulacin nos iremos a la pestaa Library. Expandimos la librera work, y
tendremos algo parecido a la siguiente figura.

11

I T _ F C L T C _ 0 0 0

Figura 12: Vista de la librera work.


Pulsando la tecla F5 podemos hacer que se actualice la lista de la librera, ya que si hemos
aadido nuevos archivos es posible que no los veamos directamente en la librera.
Dentro de la librera work seleccionamos el fichero que queremos simular, en este caso
test_add, y pulsando con el botn derecho sobre el elegimos Simulate. En la mitad derecha
de la pantalla se nos abrir una nueva pestaa, con los mdulos simulables (Figura 13).

12

I N T R O D U C C I N

M O D E L S I M

J I M T @ P H P

Figura 13: Pestaa de Simulacin.


Ahora solo tenemos que hacer click con el botn derecho sobre test_add y escoger Add>Add to Wave (Figura 14).

Figura 124: Adicin de seales a la ventana de visualizacin.

13

I T _ F C L T C _ 0 0 0

Una vez hecho esto, se nos abrir la ventana del visor de ondas (Wave), desde el cual
podremos ver los resultados de la simulacin. Pulsando sobre el icono

iniciaremos la

simulacin y veremos como van apareciendo los resultados. Cada pulsacin sobre este
icono hace que avance el tiempo de la simulacin 100 ns, as que podemos pulsarlo varias
veces si es necesario. En la siguiente figura se ve el resultado de la simulacin.

Figura15: Resultado de la simulacin.


A partir de aqu existen la serie habitual de posibilidades para realizar ampliaciones o
reducciones que recojan toda la informacin en la pantalla (Zoom to Fit), Zooms parciales
(Scale factor), visualizacin de valores, seleccin del tipo de informacin a mostrar (valores
binarios, hexadecimales, buses, etc.), medida de tiempo entre transiciones de seales,
adicin de cursores, etc.
Utilizando estas posibilidades es posible analizar el resultado de la simulacin sobre el
diseo y comprobar si su funcionamiento es correcto o no. Dependiendo de esto ltimo
podremos finalizar el trabajo (Save y Exit) o revisar el diseo, bien desde el principio o
desde el propio sistema.
Para esto ltimo es muy til otra de las herramientas adicionales que existen y que es el
Depurador. Su formato es idntico al de cualquier depurador de cualquier lenguaje de
programacin, luego no se hace hincapi en ella.
Con esto queda concluida, esta introduccin sobre el sistema de simulacin VHDL de
ModelSim.

14

I N T R O D U C C I N

M O D E L S I M

J I M T @ P H P

Apndice

A
Cdigo VHDL del sumador
binario de n bits
A continuacin se da el cdigo VHDL de los componentes y sistemas que se pueden
disear.

Nand2
retardo

a
s
b

Figura 13: nand2.


library ieee; use ieee.std_logic_1164.all;
entity nand2 is
generic (retardo: time := 1 ns);
port (a, b: in std_logic; s: out std_logic);
end nand2;
architecture funcional of nand2 is
begin
s <= not (a and b) after retardo;
end funcional;

Nand3
retardo
a
b
c

Figura 14: nand3.


library ieee; use ieee.std_logic_1164.all;
entity nand3 is
generic (retardo: time := 1 ns);
port (a, b, c: in std_logic; s: out std_logic);
end nand3;

15

I T _ F C L T C _ 0 0 0

architecture funcional of nand3 is


begin
s <= not (a and b and c) after retardo;
end funcional;

Xor2
retardo

a
s
b

Figura 15: xor2.


library ieee; use ieee.std_logic_1164.all;
entity xor2 is
generic (retardo: time := 1 ns);
port (a, b: in std_logic; s: out std_logic);
end xor2;
architecture funcional of xor2 is
begin
s <= a xor b after retardo;
end funcional;

Add_1
a

c_mas

FA

Figura 16: add_1.


library ieee; use ieee.std_logic_1164.all;
entity add_1 is
generic (retardo: time := 1 ns);
port (a, b, c: in std_logic; c_mas, s: out std_logic);
end add_1;

Add_1 funcional
architecture funcional of add_1 is
begin
s <= a xor b xor c after retardo;
c_mas <= (a and b) or (a and c) or (b and c) after retardo;
end funcional;

Add_1 test
library ieee; use ieee.std_logic_1164.all;
entity test_add is end test_add;

16

I N T R O D U C C I N

generador

J I M T @ P H P

generador

b
c

c_mas

M O D E L S I M

generador

FA
s
?

Figura 17: test_add.


architecture test of test_add is
component add_1
generic (retardo: time := 1 ns);
port (a, b, c: in std_logic; c_mas, s: out std_logic);
end component;
for all: add_1 use entity work.add_1(funcional);
signal a, b, c, c_mas, s: std_logic;
begin
etiqueta: add_1 port map (a, b, c, c_mas, s);
a<= '0', '1' after 100 ns, '0' after 200 ns, '1' after 300 ns, '0' after 400 ns, '1'
after 500 ns, '0' after 600 ns, '1' after 700 ns;
b<= '0', '1' after 200 ns, '0' after 400 ns, '1' after 600 ns;
c<= '0', '1' after 400 ns;
end test;

Add_1 circuito
a

s1

c_mas

s2

c
b

s3

c
a

s4
s

b
c

Figura 18: circuito de add_1.


architecture circuito of add_1 is
component nand2
generic (retardo: time := 1 ns);
port (a, b: in std_logic; s: out std_logic);
end component;
component nand3
generic (retardo: time := 1 ns);
port (a, b, c: in std_logic; s: out std_logic);
end component;
component xor2
generic (retardo: time := 1 ns);
port (a, b: in std_logic; s: out std_logic);
end component;
signal s1, s2, s3, s4: std_logic;
begin
puerta1: nand2 port map (a, b, s1);

17

I T _ F C L T C _ 0 0 0

puerta2: nand2 port map (a, c, s2);


puerta3: nand2 port map (b, c, s3);
puerta4: nand3 port map (s1, s2, s3, c_mas);
puerta5: xor2 port map (a, b, s4);
puerta6: xor2 port map (s4, c, s);
end circuito;

Add_8
a(7:0)

b(7:0)

c_out

8-bit adder

c_in

s(7:0)

Figura 19: add_8.


library ieee; use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity add_8 is
port (a, b: in std_logic_vector(7 downto 0);
c_in: in std_logic;
s: out std_logic_vector(7 downto 0);
c_out: out std_logic);
end add_8;

Add_8 circuito
a(7)

c(8)

b(7)

FA

s(7)

a(2)

c(7)

....

c(3)

b(2)

FA

s(2)

a(1)

c(2)

b(1)

FA

s(1)

Figura 20: circuito de add_8.


architecture circuito of add_8 is
component add_1
generic (retardo: time := 1 ns);
port (a, b, c: in std_logic; c_mas, s: out std_logic);
end component;
signal c: std_logic_vector(8 downto 0);
begin
c(0) <= c_in;
sumador: for i in 0 to 7 generate
puertas: add_1 port map (a(i), b(i), c(i), c(i+1), s(i));
end generate;
c_out <= c(8);
end circuito;

18

a(0)

c(1)

b(0)

FA

s(0)

c(0)

I N T R O D U C C I N

M O D E L S I M

J I M T @ P H P

Add_8 test
library ieee; use ieee.std_logic_1164.all;
entity test_add_8 is end test_add_8;
architecture test of test_add_8 is
component add_8
port (a, b: in std_logic_vector(7 downto 0);
c_in: in std_logic;
s: out std_logic_vector(7 downto 0);
c_out: out std_logic);
end component;
for all: add_8 use entity work.add_8(funcional);
--for all: add_8 use entity work.add_8(circuito);
signal a, b,s: std_logic_vector(7 downto 0);
signal c_in, c_out: std_logic;
begin
sumador: add_8 port map (a, b, c_in, s, c_out);
c_in <= '0', '1' after 25 ns, '0' after 125 ns, '1' after 225 ns;
a <= "11001110", "01110111" after 100 ns;
b <= "01110110", "11110000" after 50 ns, "01010101" after 150 ns, "11010110" after
200 ns;
end test;

Add_8 funcional
architecture funcional of add_8 is
signal long_a, long_b, long_carry, long_s: std_logic_vector(8 downto 0);
begin
long_a <= '0'&a; long_b <= '0'&b;
long_carry <= "00000000"&c_in;
long_s <= long_a + long_b + long_carry;
s <= long_s(7 downto 0);
c_out <= long_s(8);
end funcional;

Add_n
package constantes is
constant n: natural := 16;
end constantes;
library ieee; use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use work.constantes.all;
entity add_n is
port (a, b: in std_logic_vector(n-1 downto 0);
c_in: in std_logic;
s: out std_logic_vector(n-1 downto 0);
c_out: out std_logic);
end add_n;

Add_n circuito
architecture circuito of add_n is
component add_n
port (a, b: in std_logic;
c_in: in std_logic;
s: out std_logic;
c_out: out std_logic);
end component;
signal c: std_logic_vector(n downto 0);
begin
c(0) <= c_in;
sumador: for i in 0 to n-1 generate
puertas: add_1 port map (a(i), b(i), c(i), c(i+1), s(i));
end generate;

19

I T _ F C L T C _ 0 0 0

c_out <= c(n);


end circuito;

Add_n funcional
architecture funcional of add_n is
signal long_a, long_b, long_carry, long_s: std_logic_vector(n downto 0);
begin
long_a <= '0'&a; long_b <= '0'&b;
long_carry <= conv_std_logic_vector(0,n)&c_in;
long_s <= long_a + long_b + long_carry;
s <= long_s(n-1 downto 0);
c_out <= long_s(n);
end funcional;

Add_n test
library ieee; use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use work.constantes.all;
entity test_add_n is end test_add_n;
architecture test of test_add_n is
component add_n
port (a, b: in std_logic_vector(n-1 downto 0);
c_in: in std_logic;
s: out std_logic_vector(n-1 downto 0);
c_out: out std_logic);
end component;
signal a, b,s: std_logic_vector(n-1 downto 0);
signal c_in, c_out: std_logic;
begin
sumador: add_n port map (a, b, c_in, s, c_out);
c_in <= '0', '1' after 25 ns, '0' after 125 ns, '1' after 225 ns;
a <= conv_std_logic_vector(32567, n), conv_std_logic_vector(2458, n) after 100 ns;
b <= conv_std_logic_vector(59000, n), conv_std_logic_vector(2500, n) after 50 ns,
conv_std_logic_vector (3678, n) after 150 ns, conv_std_logic_vector(65000, n) after
200 ns;
end test;

20

I N T R O D U C C I N

M O D E L S I M

J I M T @ P H P

Bibliografa
[1]

Ayuda on-line de Veribest.

[2]

J-P. Deschamps. Sntesis de Circuitos Digitales. 1 edicin. Thomson. 2002.

[3]

Z. NAVABI, VHDL, Analysis and Modeling of Digital Systems, McGraw-Hill,


1993

[4]

Ll. TERS, Y. TORROJA, S. OLCOZ, E. VILLAR, VHDL - Lenguaje Estndar


de Diseo Electrnico, McGraw-Hill, 1998.

[5]

J.-P. DESCHAMPS, J.M. ANGULO, Diseo de Sistemas Digitales,


Paraninfo, 1992 (2 edicin).

21

I T _ F C L T C _ 0 0 0

22

DOCENCIA - VHDL

Introduccin a Veribest

Jos Ignacio Martnez Torre


Pablo Huerta Pellitero
Grupo de diseo Hardware Software DIET ESCET URJC
C/ Tulipn s/n, E-28933, Mstoles, Madrid, ESPAA
Telfono (34) 91 664 74 96 Fax (34) 91 664 74 90

Você também pode gostar