You are on page 1of 7

DISEO ELECTRNICO

PRCTICA VHDL

SIMULACIN EN VHDL
CON VERIBEST
En esta prctica vamos a ver una breve introduccin a la simulacin de circuitos
electrnicos mediante el uso de Lenguajes de Descripcin de Hardware, y en concreto
utilizaremos el simulador de VHDL de Veribest. El uso de los comandos e
instrucciones ms comunes de esta herramienta se ilustra mediante un ejemplo sencillo,
y abarca desde la creacin de un fichero, la compilacin, la visualizacin de las formas
de onda...
0-. Realizacin de la prctica.
Para el desarrollo de la prctica, vamos a realizar la simulacin completa de
cuantos circuitos electrnicos podamos. Sugerencia: comenzar por los ms sencillos
(puertas), y luego aumentar la complejidad (mux, sumadores).
1-. Arranque del programa.
Se puede realizar de varias formas, desde el men de Inicio, bien mediante el
icono de acceso directo (si existe), o conociendo la ruta del programa, que debera ser:
C:\Programs\Veribest VB99.0\Veribest VHDL simulator \ Veribest VHDL
La ventana del simulador se muestra en la siguiente figura:

Fig. 1. Ventana inicial del simulador Veribest.

2-. Creacin de espacio de trabajo.


Antes de empezar a trabajar con esta herramienta, es conveniente crearse lo que
se llama un espacio de trabajo (Workspace), donde guardaremos todos nuestros ficheros
VHDL. En la barra de herramientas seleccionad Workspace, y dentro de ella New. A
continuacin se nos pedir un nombre para nuestro espacio y una ruta. El nombre ser
Practicas y la ruta c:\Practicas_VHDL.

Aparecer inmediatamente una nueva ventana con el nombre Practicas.vpd, con


una serie de botones algunos de los cuales se comentarn ms adelante, y una carpeta
llamada Practicas source, donde se guardarn nuestros ficheros.
3-. Edicin de un fichero.
Para crear un fichero nuevo se selecciona FileNew, y en la ventana que
aparece escogeremos la opcin VHDL source file. Como nombre del fichero
escogeremos el que ms nos interese, guardndolo desde FileSave as. En ocasiones
perderemos la extensin *.vhd, necesaria para que nuestro fichero sea reconocido.
A partir de este momento, podemos introducir nuestro cdigo. Es una buena
costumbre que las palabras reservadas del lenguaje las escribamos en maysculas y el
resto en minsculas, aunque el compilador no distingue entre ambas.
Una vez escrito el cdigo lo guardamos (FileSave), y aadimos el fichero
creado al espacio de trabajo, presionando en la ventana del Workspace la tecla +, y
escogiendo el nombre de nuestro fichero creado. Si no apareciese, hemos perdido la
extensin, abriendo todos los archivos (*.*) se soluciona el problema. Aparecer
nuestro archivo aadido, y podemos cerrar la ventana con el cdigo fuente.
Como simple ejemplo, empezaremos con un circuito muy sencillo; una puerta
OR de dos entradas. El cdigo para esta podra ser:
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
ENTITY or2 IS
PORT (a, b: in bit;
q: out bit);
END or2;
ARCHITECTURE or2_comp OF or2 IS
BEGIN
q <= a OR b;
END or2_comp;

4-. Compilacin.
En realidad no es un proceso exactamente de compilacin el que vamos a
realizar, porque no crearemos un archivo ejecutable, sino uno listo para ser simulado.
Establecemos las condiciones de compilacin:
WorkspaceSettings
En la nueva ventana, aseguraos que la opcin Debug est seleccionada, despus
haced clic en aceptar. A continuacin se analiza el fichero:
WorkspaceCompile <nombre de nuestro fichero>
Si el cdigo es correcto, aparecern mensajes de compilacin de las entidades y
arquitecturas, componentes y dems que nuestro circuito posea, seguidos del mensaje
Done. Si el cdigo no es correcto, aqu se marcar la lnea donde se encuentra(n) el

error(es) y de que tipo es. En este caso los corregiremos y repetiremos el proceso de
compilacin.
Cuando el proceso no da errores, lo guardamos (Save). La unidad compilada se
almacena en la librera WORK. Para ver su ubicacin, seleccionad Library en la barra
de herramientas, y dentro de ella Library Browser, o pinchad en el icono
correspondiente. Aparecen las diferentes libreras, IEEE, STD, VB, y en rojo WORK,
WORKLIB. Si pinchamos en esta aparecen, con smbolos de chip, los diferentes
circuitos que hayamos compilado; no su cdigo, sino la entidad, arquitecturaetc., que
llevan asociadas. Podemos Ver informacin de fecha y opciones de compilacin en la
parte derecha de la ventana. (Ver figura).

Fig. 2. Aspecto del Veribest con el Library Browser activado.

5-. Preparacin del diseo.


Por cuestiones de flexibilidad, se aconseja que la entidad y la(s) arquitectura(s)
asociadas a un diseo ocupen ficheros separados (pero no es en realidad necesario). Si
lo hacemos as, llegados a este punto y dentro de WORK, tendremos el icono de
nuestra entidad en blanco. Si el fichero de cdigo lleva asociada una arquitectura, estar
en rojo. No se puede simular un circuito si no tiene asociada al menos una arquitectura y
un fichero de test. En nuestro caso podramos haber separado la declaracin de entidad
de la puerta OR en un fichero (p. ej. OR2_ENT.vhd), y la arquitectura en otro
(OR2_ARQ.vhd), respetando en ambos casos el cdigo fuente, y de ser as al compilar
la entidad tendramos el chip en blanco (sin opcin a simular), y tras aadir la
arquitectura el chip en rojo (solo faltara el test).
El momento ms delicado de una simulacin es la preparacin de este fichero de
test. Debe barrer, idealmente, todas las posibles variaciones en las entradas del sistema

para que estemos seguros de que las salidas sean las correctas, pero lgicamente no
siempre va a poder ser as. En nuestro caso, est bastante claro cuales son las formas
de onda que necesitamos para verificar el comportamiento de nuestro sistema.
a
Fig. 3. Formas de onda que representan la tabla de
verdad de una puerta OR de dos entradas.

b
q
0

5 10 15 20

(tiempo en nanosegundos).

El fichero de test necesita una entidad y una arquitectura. Las entidades de


ficheros test no tienen puertos. Las arquitecturas son estructurales, incluyendo en su
declaracin el componente que se va a testear, la arquitectura que se le asocia y la
declaracin de seales. En nuestro caso:
ENTITY or2_test IS
END or2_test;
ARCHITECTURE test_flujo OF or2_test IS
COMPONENT
or2 PORT ( a, b: IN BIT;
q: OUT BIT);
END COMPONENT;
FOR I: or2 USE ENTITY WORK.or2 (or2_comp);
SIGNAL a, b, q: BIT;
BEGIN
I: or2 PORT MAP (a, b, q);
a <= '0', '1' AFTER 5 ns, '0' AFTER 15 ns;
b <= '0', '1' AFTER 10 ns, '0' AFTER 20 ns;
END test_flujo;

Se compilar el fichero buscando errores, y aadindose a la librera WORK


como se vio anteriormente. De momento, es recomendable que veamos como se han
aadido las nuevas entidad y arquitectura a la librera.
6-. Simulacin
Lo primero que hay que hacer es establecer las condiciones de simulacin, en
WorkspaceSettings
Como en el caso de la compilacin, pero ahora se selecciona SIMULATE y se
abre la carpeta WORK. Ah aparece la entidad y la arquitectura de nuestro fichero de
test, y por supuesto el resto de las que tengamos. Hay que simular el test, que es donde
tenemos configurada la entidad de nuestra puerta OR2, de modo que pinchamos en l.
Sobre el espacio que acompaa a la palabra Entity nos colocaremos, activando el botn
de Set. A continuacin seleccionamos la arquitectura Test_flujo, seleccionndola como

arquitectura mediante el mismo procedimiento. Por ltimo, activamos la opcin Trace


On (que nos permite visualizar las formas de onda resultantes). Esto tambin se logra
desplegando SimulateTrace.
A continuacin activaremos el simulador. Es recomendable tener activada, en la
parte inferior de la pantalla, la pestaa GENERAL de la ventana de mensajes. Podemos
poner en marcha la simulacin desde WorkspaceExecute Simulator, y en la pantalla
de mensajes se nos avisara, probablemente, de la no existencia de la licencia, y por lo
tanto de que el simulador funcionar a baja capacidad. Esto no es importante,
aceptaremos el mensaje y continuaremos. En la pestaa SIMULATE Se puede observar
que no hay errores, y la simulacin est lista para ser comenzada.
En la barra de herramientas, presionad el botn de Play, en verde. El tiempo en
nanosegundos resaltado debe ser superior al que en nuestro fichero de test hayamos
empleado. En nuestro caso lo es. Se nos avisar de que se ha efectuado la simulacin del
tiempo requerido. Otra opcin para activar la simulacin es, en la barra de herramientas
SimulateRun. Se puede detener la simulacin mediante la seleccin de la funcin
Quit, o su smbolo en la barra de herramientas (Stop).
Queremos visualizar los resultados de la simulacin. Lo lograremos pinchando
en el icono de visualizacin de las formas de onda (en la barra de herramientas aparece
muy grficamente reflejado de cual se trata). Aparece una ventana nueva, Waveform
Viewer, en la que debemos seleccionar las seales a visualizar, lo cual haremos una a
una mediante la funcin Add, o todas ellas a la vez con Add All. En cualquier caso,
obtenemos lo siguiente:

Fig. 4. Waveform Viewer, las formas de onda obtenidas en la simulacin.

Donde podemos ver que el resultado obtenido es el que caba esperar. Ahora
estamos en disposicin de comenzar desde el principio, aadiendo nuevos circuitos a
nuestro espacio de trabajo. Salimos del simulador mediante el icono Eject.

7-. VHDL
Es de resaltar que, como en todos los lenguajes de programacin, la versatilidad
del VHDL nos permite realizar el mismo circuito de muchas formas distintas. En un
circuito medianamente complicado tendremos probablemente tantas soluciones
diferentes como personas aborden el problema.
Un ltimo circuito nos permite estudiar algunas de las funciones ms destacadas
del VHDL. En este ejemplo nos encontramos con uno de los casos en los que el archivo
de testeo no puede cubrir todas las posibilidades, o no resulta rentable as hacerlo:
Comparador de 4 bits.
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
ENTITY comp_4bit IS
PORT (a, b: IN BIT_VECTOR (3 DOWNTO 0);
agtb, altb, aeqtb: OUT BIT);
END comp_4bit;
ARCHITECTURE comportamental OF comp_4bit IS
BEGIN
PROCESS (a, b)
VARIABLE var_agtb: BIT := '0';
VARIABLE var_altb: BIT := '0';
VARIABLE var_aeqtb: BIT := '0';
BEGIN
L1: FOR i IN 3 DOWNTO 0 LOOP
IF ((a(i) = '1') and (b(i) = '0')) THEN
var_agtb := '1';
ELSE
var_agtb := '0';
END IF;
IF ((a(i) = '0') and (b(i) = '1')) THEN
var_altb := '1';
ELSE
var_altb := '0';
END IF;
IF (a(i) = b(i)) THEN
var_aeqtb := '1';
ELSE
var_aeqtb := '0';
END IF;
END LOOP L1;
agtb <= var_agtb;
altb <= var_altb;
aeqtb <= var_aeqtb;
END PROCESS;
END comportamental;

Test del comparador.


ENTITY comp_test IS

END comp_test;
ARCHITECTURE test_flujo OF comp_test IS
COMPONENT
comp_4bit PORT (

a, b: IN BIT_VECTOR (3 DOWNTO 0);


agtb, altb, aeqtb: OUT BIT);

END COMPONENT;
FOR I: comp_4bit USE ENTITY WORK.comp_4bit (comportamental);
SIGNAL a, b: BIT_VECTOR (3 DOWNTO 0);
SIGNAL agtb, altb, aeqtb: BIT;
BEGIN
I: comp_4bit PORT MAP (a, b, agtb, altb, aeqtb);
a <= "0000", "0001" AFTER 5 ns, "0010" AFTER 10 ns, "0011" AFTER
15 ns, "0100" AFTER 20 ns, "0101" AFTER 25 ns, "0110" AFTER 30 ns,
"0111" AFTER 35 ns, "1000" AFTER 40 ns, "1001" AFTER 45 ns, "1010"
AFTER 50 ns, "1011" AFTER 55 ns, "1100" AFTER 60 ns, "1101" AFTER 65
ns, "1110" AFTER 70 ns, "1111" AFTER 75 ns, "0000" AFTER 80 ns;
b <= "0001", "0000" AFTER 5 ns, "0010" AFTER 10 ns, "0011" AFTER
15 ns, "0001" AFTER 20 ns, "0100" AFTER 25 ns, "0110" AFTER 30 ns,
"1111" AFTER 35 ns, "0110" AFTER 40 ns, "1000" AFTER 45 ns, "1011"
AFTER 50 ns, "1011" AFTER 55 ns, "1100" AFTER 60 ns, "1101" AFTER 65
ns, "0110" AFTER 70 ns, "1101" AFTER 75 ns, "0000" AFTER 80 ns;
END test_flujo;

NOTA: En las formas de onda que el simulador nos ofrece podemos observar que, por
ejemplo ante las entradas a = 0100, b = 0001 la salida del sistema es a < b, no a > b. Este error
se repite en la misma direccin y a la inversa (a > b cuando debera ser a < b) en diferentes
ejemplos de entrada y salida. A que se debe el fallo de comparacin? Cmo lo podramos
corregir?

You might also like