DESCRIPCIÓN EN VHDL DE CIRCUITOS DIGITALES
6 O BSERVANDO LA SIMULACIÓN
Varias propiedades pueden ser manipuladas para mejorar la apariencia de la simulación. A continuación se describen brevemente algunas de estas propiedades.
BUS
La líneas individuales que forman un bus pueden ser mostradas y editadas. Para mostrarlas haz clic sobre "+" que se encuentra a junto al nombre el bus. Las señales de estimulación pueden ser asignadas a cada línea del bus o al bus completo.
COLOR
Las señales de la simulación pueden ser de diferentes colores para una mejor claridad cuando varias señales son desplegadas. Para agregar color a todas las señales visibles, selecciona Waveform >
Colorize Waveforms, esto asignará diferentes
colores, arbitrariamente a cada señal dentro de la ventana de simulación. Para asignar color a cada señal, haz clic con el boton derecho sobre el nombre de la señal y selecciona la opción
60 ZOOM
Para aumentar o reducir la escala de tiempo de la simulación, selecciona View > Zoom >
In/Out/Full.
BOOKMARKS
Para colocar marcas sobre la ventana de simulación primero selecciona Waveform > Select
Mode. Cuando este modo se encuentra
seleccionado, es posible colocar marcas sobre diferentes puntos de la simulación para una rápida referencia a ciertos puntos importantes de la misma. Para colocarlas primero haz clic con el botón izquierdo en donde deseas colocar una marca, después selecciona Search > Toggle
Bookmark. Utilizando Next/Previous Bookmark
del mismo menú puedes cambiar entre una marca y otra dentro de la simulación. Las marcas son desplegadas como un triángulo azul sobre la escala de tiempo en la ventana de simulación. Para eliminar alguna marca selecciona Waveform > Edit
Mode y después haz clic con el botón izquierdo
sobre la marca que deseas eliminar.
MODO DE MEDICIÓN
Para entrar al modo de medición selecciona
Waveform > Measurement Mode. En este modo es
posible desplegar el tiempo exacto entre dos eventos de la simulación. Para obtener esta información coloca el puntero sobre una transición negativa o positiva, cuando el puntero es colocado sobre alguna transición debe cambiar a color verde, presiona el botón izquierdo sobre la transición y arrastra el puntero hasta otra transición de cualquier señal dentro de la ventana de simulación y entonces suelta el botón. La medida exacta entre estas dos transiciones se desplegara como una etiqueta entre las dos transiciones. Si la etiqueta no es mostrada o no se ve completa, amplia el alto de la fila haciendo clic con el botón derecho sobre alguna de las señales que intervienen en la medición y después selecciona
Properties, dentro de la venta de propiedades
aumenta la altura modificando el valor del cuadro de texto Height. Para eliminar alguna etiqueta de medición selecciona Waveform > Edit Mode, después seleciona la etiqueta y presiona suprimir 7. - GUARDANDO LA SIMULACIÓN
Existen dos formas de guardar la simulación. Guardar solamente la simulación de la ventana activa o guardar todas las simulaciones de las
ventas de simulación abiertas. La extensión de los archivos de simulación en Active-HDL Sim es
.awf.
4.3 COMPARADORES
El objetivo de este tema es crear, sintetizar, y simular la descripción de circuitos comparadores de magnitud utilizando WARP.
PROCEDIMIENTO
1. Primero crearemos un proyecto para el ejemplo del comparador visto en el tema 3.1.2 Antes que nada debemos crear el proyecto dentro de un directorio en el que se encontrarán todos los archivos del proyecto (.pfg, .vhd, .jed, .rpt, etc. ). Se sugiere crear primero una carpeta para todos los proyectos VHDL y dentro de esa carpeta crear otra carpeta para el presente proyecto, por ejemplo
c:\vhdl_proj\comparador_1, con el nombre
comparador_1.
Figura 4.13
2. Seleccionaremos un 22V10 con empaquetado tipo DIP para sintetizar el código.
3. Ahora creamos un nuevo archivo de texto para editar el código (File > New > Text File). Este archivo debe ser guardado con extensión .vhd y en la misma carpeta del proyecto. Se sugiere guardarlo como:
c:\vhdl_proj\comparador_1\comparador1.vhd
4. A continuación se muestra la tabla de funcionamiento de este comparador y basándose en ella haremos el código de descripción en VHDL. Primero utilizaremos el estilo de
descripción de flujo de datos, que es el mismo que se utilizó cuando se expuso el ejemplo en el tema 3.1.2. TABLA DE FUNCIONAMIENTO ENTRADAS SALIDAS x < y x_men_y '1' x < y equals '0' x < y x_may_y '0' x = y x_men_y '0' x = y equals '1' x = y x_may_y '0' x > y x_men_y '0' x > y equals '0' x > y x_may_y '1'
5. Abajo se muestra el listado del comparador correspondiente al estilo de descripción de flujo de datos. Este listado debemos editarlo dentro del archivo comparador_1.vhd.
ENTITY comparador IS
PORT ( x: IN bit_vector(3 DOWNTO 0); y: IN bit_vector(3 DOWNTO 0); x_may_y: OUT bit;
equals: OUT bit; x_men_y: OUT bit );
END comparador;
ARCHITECTURE comparador OF comparador IS
BEGIN
equals <= '1' WHEN x = y ELSE '0';
x_may_y <= '1' WHEN x > y ELSE '0';
x_men_y <= '1' WHEN x < y ELSE '0';
END comparador;
6. Como se puede observar no se cargó ninguna librería, y no es necesario hacerlo porque el tipo bit es un tipo predefinido en WARP y en muchos otros sintetizadores de VHDL. Por esto no necesitamos de ninguna librería para poder utilizarlo. Además, recuerde que la última declaración de puertos no lleva ;
Una vez que se terminó de editar el código, procedemos a guardar los cambios en el archivo y
a agregarlo al presente proyecto. Para agregarlo lo hacemos desde el menú Project y dentro de éste hacemos clic en Add Files... (Project > Add
Files...). Una vez que aparece la ventana para
agregar archivos al proyecto, seleccionamos el archivo comprador_1.vhd y presionamos el botón
"Add".
Si por error hacemos clic en la opción Add All
Files, todos los archivos .vhd dentro de la carpeta
del proyecto se agregaran al mismo. En este caso el único archivo .vhd que debería estar dentro de la carpeta del proyecto es comparador_1.vhd, lo cual en esta ocasión no nos afectará. En caso de que hubiera más de un archivo .vhd y no deseamos tenerlo dentro del proyecto basta con seleccionarlo en la ventana de proyecto y presionar la tecla
suprimir, o también desde Project > Remove Selected Source File(s). Si la ventana de proyecto
no está visible entonces seleccionamos View >
Reset Docking Windows.
Figura 4.14
7. Una vez editado y agregado el archivo al proyecto se procede a sintetizar el código en el 22V10. Seleccionamos Compile > Project o también lo podemos hacer presionado el icono de compilación.
Figura 4.15
Si el archivo tiene errores, estos aparecerán en la ventana de salida (Output Window). Dentro de "Errors & Warnings" en la ventana de salida se
62 muestra una lista completa de los errores así como
una descripción de cada error. Para acceder rápidamente a la línea en la cual ocurrió el error, basta con hacer doble clic sobre el error e inmediatamente el programa se colocará sobre la línea en donde se encuentra dicho error. Los errores pueden ser algunos de los siguientes: omitir algún punto y coma, no escribir correctamente algún identificador, sintaxis incorrecta de las instrucciones utilizadas, o uso incorrecto de los operadores. Recordemos que VHDL es un lenguaje en el que los tipos de datos son sumamente importantes y no se pueden mezclar a menos que se utilicen las librerías adecuadas.
8. La ventana de proyecto tiene 3 modos o vistas: "Source Files View", "Hierarchy View", y "Output Files View". En la primera se muestran los archivos que se han agregado al proyecto. La
"Vista de Jerarquía" es útil cuando se hacen
diseños jerárquicos, ya que en esta se muestra cual es el orden de importancia que hay entre ellos. Dentro de la "Vista de Archivos de Salida" aparecen los archivos que se generaron durante la compilación, los cuales fueron creados dentro de la carpeta del proyecto. Tales archivos de salida son:
.jed, .rpt y un .vhd que se encuentra dentro de la
carpeta "vhd" que está en la misma carpeta del proyecto (ver tema 4.2).
Figura 4.16
En el archivo .rpt se muestra un informe de los resultados de la compilación. En éste se encuentran
las ecuaciones que resultaron durante el proceso de síntesis, la asignación de pines, y un informe de utilización del dispositivo. En ocasiones es complicado realizar algunas descripciones y, aunque el código se sintetiza, durante la simulación hace algo diferente a lo que esperábamos. La función del sintetizador, en este caso WARP, es la de interpretar nuestra descripción en VHDL para generar la lógica de salida. En estos casos posiblemente la descripción no corresponde exactamente a lo que queremos. Para corregir la descripción es útil consultar las ecuaciones, ya que en estas nos podemos dar cuenta que es lo que estamos describiendo realmente. En temas posteriores se presentan algunos ejemplos en los que se exponen con más detalle este tipo de problemas.
SIMULACIÓN
9. Ahora que ya hemos logrado sintetizar el código y obtenido los archivos .jed y .vhd de postsíntesis procedemos a simular la descripción. Las simulaciones las haremos en Active-HDL Sim como se explicó en tema 4.2. Podemos abrir el programa desde Galaxy desde Tools > Active-HDL
Sim.
Figura 4.17
10. Una vez iniciado el simulador, ahora abrimos el archivo .vhd de postsíntesis como se explica a continuación. Primero seleccionamos
Figura 4.18
Para después abrir el archivo .vhd de postsíntesis, el cual debería estar (si seguiste correctamente todos los pasos) en el subdirectorio: c:\vhdl_proj\comparador_1\vhd\comparador1. vhd
Figura 4.19
11. Hecho lo anterior ahora agregamos las señales y/o puertos que deseamos simular. Seleccionamos Waveform > Add Signals...
Figura 4.20
Ahora seleccionamos los puertos como se explicó en el tema 4.2. En este ejercicio seleccionaremos solamente los puertos declarados en la entidad, tal y como se muestra en la figura 4.22
12. Lo siguiente es asignar señales de estimulo a los puertos de entrada. Al bus "x" le asignaremos un estimulador tipo formula usando la siguiente formula.
0000 0 ns, 0001 1 us, 0010 2 us, 0011 3
7 us, 1000 8 us, 1001 9 us, 1010 10 us, 1011 11 us, 1100 12 us, 1101 13 us, 1110 14 us, 1111 15 us -r 16 us
Y al bus "y" también le asignaremos un estimulador del mismo tipo con la siguiente formula.
0000 0 ns, 1111 1 us, 1110 2 us, 1101 3 us, 1100 4 us, 1011 5 us, 1010 6 us, 1001 7 us, 1000 8 us, 0111 9 us, 0110 10 us, 0101 11 us, 0100 12 us, 0011 13 us, 0010 14 us, 0001 15 us -r 16 us
13. Una vez que asignamos los estimuladores iniciamos la simulación seleccionando: Simulation
> Initialize Simulation.
14. Una vez iniciada la simulación ahora corremos la simulación. Para poder correrla existen tres opciones: correr completamente la simulación (el máximo es de 2ms+3), correrla y que se detenga en un momento especifico, o adelantar la simulación solamente por algún tiempo. Para correr la simulación completamente seleccionamos Simulation > Run. Si queremos correr la simulación y especificar un tiempo en el que debe detenerse seleccionamos Simulation >
Run Until... . Para correr la simulación "por pasos"
o por tiempos especificados, seleccionamos
Simulation > Run For. El tiempo de paso se
especifica a un lado del icono de Run For. Esta última opción es la más practica al momento de simular descripciones.
Figura 4.21
Si deseas utilizar Run For cerciórate que el tiempo de "paso" sea de 1 us. Ya que cuando asignamos los estimuladores el valor de los buses de entrada cambia cada 1 us. Si deseas utilizar Run Until... bastara con especificar un tiempo de 32 us para observar como se comporta el ciclo de asignaciones que especificamos mediante la formula, el tiempo mínimo para comprobar todos los valores (por lo menos un ciclo) es de 16 us.
15. A continuación en la figura 4.23 se muestran los resultados de la simulación. Si seguiste correctamente todos los pasos deberías obtener algo similar a lo mostrado en la siguiente figura.
64
Figura 4.22
Figura 4.23
4.4 MULTIPLEXORES
En este tema el objetivo es elaborar descripciones de circuitos multiplexores utilizando los tres estilos de descripción de VHDL.
PROCEDIMIENTO
Para la síntesis utilizaremos un 22V10 siguiendo la siguiente tabla de funcionamiento en los tres estilos de descripción. TABLA DE FUNCIONAMIENTO selec salida 00 a 01 b 10 c 11 d
4.4.1 DESCRIPCIÓN DE FLUJO DE DATOS
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
LIBRARY cypress;
USE cypress.std_arith.ALL ;
ENTITY multiplexor IS
PORT(a, b, c, d: IN std_logic_vector (3 DOWNTO 0); selec: IN std_logic_vector
(1 DOWNTO 0); salida: OUT std_logic_vector
(3 DOWNTO 0));
END multiplexor;
ARCHITECTURE data_flow OF multiplexor IS
BEGIN
salida <= a WHEN selec = 0 ELSE b WHEN selec = 1 ELSE c WHEN selec = 2 ELSE d WHEN selec = 3 ;
END data_flow;
El listado anterior corresponde a un multiplexor 4 a 1. El bus de salida es seleccionado mediante las señales de selección selec(1) y selec(0) (std_logic_vector es un arreglo de datos del tipo std_logic). Como habrás notado se hizo el llamado a una librería no mencionada anteriormente, la librería "cypress". Esta librería es de Cypress Semiconductors y fue desarrollada para facilitar la
descripción de circuitos digitales utilizando WARP. De esta librería se llamó el paquete std_arith, el cual contiene muchas funciones que facilitan el uso de vectores tipo std_logic con enteros. De no haber utilizado este paquete no podríamos hacer ninguna de la comparaciones que están en la asignación condicional WHEN... ELSE. Es decir, no es posible hacer la comparación "selec = 3" porque "selec" es del tipo std_logic_vector y "3" es un número entero. El paquete std_logic_1164 contiene los tipos de datos std_logic y std_logic_vector que comúnmente utilizamos por lo que es necesario cargar el paquete para poder utilizar estos tipos, sin embargo, no contiene funciones de comparación entre tipos std_logic (o arreglos de este) y enteros. Como la librería es de propia del sintetizador, es decir, que siempre esta cargada dentro del área de trabajo del proyecto o "work", podemos llamar el paquete como se muestra a continuación.
USE work.std_arith.ALL;
SIMULACIÓN
Para la simulación se sugiere que asignes un estimulador tipo formula a los vectores de entrada, y al vector "selec" le asignes un estimulador tipo "HOTKEY". Una vez que agregaste las señales a la simulación, selecciona con el puntero el vector "selec", después seleccionas Waveform >
Stimulators..., cuando aparezca el cuadro de
estimuladores selecciona "HOTKEY" dentro de "Stimulator type", y en "Press new hotkey" escribe la letra "s" o cualquier otra.
Figura 4.25
Cada que presiones la tecla "s" el vector s estará cambiando de valor, por omisión la lista de valores de asignación incluye el '0' y el '1' solamente, en
66 este caso necesitamos generar valores para un
vector de 2 bits. Para poder hacerlo, en el mismo cuadro de dialogo cámbiate a la sección de "Hotkeys". En esta parte aparecerán las teclas que ya han sido asignadas dentro del archivo para ser utilizadas como estimuladores, así como la lista de valores de asignación de cada tecla. Para modificar la lista de valores de la tecla "s" (la que estamos utilizando), con el puntero colócate en el cuadro de secuencia y escribe la nueva lista de valores.
Figura 4.26
Ahora puedes correr la simulación poco a poco utilizando Simulation > Run For, o presionando la tecla "F5". Y cada que lo desees presionas la tecla "s" para cambiar el valor del vector "selec". En la figura 4.24 se muestran los resultados de la simulación.
A continuación se muestran las ecuaciones obtenidas utilizando el estilo de descripción de flujo de datos. Estas ecuaciones deben ser las mismas para cualquier estilo que utilicemos, ya que estamos describiendo el mismo multiplexor sólo que de manera diferente y esto no implica que las ecuaciones vayan a ser distintas. Cuando compiles este multiplexor, en cualquiera de los tres estilos, consulta las ecuaciones dentro del archivo .rpt y verifica que sean iguales.
4.4.2 DESCRIPCIÓN COMPORTAMENTAL
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE work.std_arith.ALL;
ENTITY multiplexor IS
PORT(a: std_logic_vector
(3 DOWNTO 0); b: std_logic_vector (3 DOWNTO 0); c: std_logic_vector (3 DOWNTO 0); d: std_logic_vector (3 DOWNTO 0); selec: std_logic_vector (1 DOWNTO 0); salida: OUT std_logic_vector
(3 DOWNTO 0));
END multiplexor;
ARCHITECTURE behavorial OF multiplexor IS
BEGIN
PROCESS(selec, a, b, c, d)
VARIABLE selec_int: integer;
BEGIN