SlideShare ist ein Scribd-Unternehmen logo
1 von 30
Downloaden Sie, um offline zu lesen
CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES




IV                                   DESCRIPCIÓN DE
                                          CIRCUITOS
                                          DIGITALES


IEC FRANCISCO JAVIER TORRES VALLE                 54
CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES




4.1      PROYECTOS EN WARP 5.0                                              Figura 4.2

   El objetivo de este capítulo es enseñarte a crear       3. Posteriormente debe aparecer un cuadro de
proyectos en VHDL utilizando Warp de Cypress            dialogo como el que se muestra a continuación.
Semiconductors. Así como diferentes métodos             Para crear un proyecto con el que quieres
prácticos para la síntesis de los circuitos digitales   programar un dispositivo debes de seleccionar la
más comunes.                                            segunda opción (Project [Target - Device]).

PROCEDIMIENTO
   1. Una vez en Windows haz click en el botón de
inicio, selecciona Programas > Warp R5.0 >
Galaxy.


                                                           4. Cuando selecciones la opción de Project
                                                        [Target - Device] aparecerá una ventana que te
                                                        pide que pongas un nombre a tu proyecto, escribe
                                                        el nombre de nuevo. En el segundo cuadro de texto
                                                        te pide que especifiques el directorio en donde
                                                        debe de guardar tu proyecto, puedes hacer un
                                                        directorio nuevo desde esa misma ventana con solo
                                                        escribir el nombre, por ejemplo c:nuevo, o puedes
                                                        buscar una carpeta ya existente con la opción
                                                        Browse. Cuando hayas terminado de especificar
                                                        los nombres haz click en el botón de Siguiente.




                    Figura 4.1

   2. Cuando te encuentres dentro del Galaxy,
selecciona File > New.




                                                                            Figura 4.3

                                                           5. Aparecerá una ventana con título Add Files to
                                                        Project, esta ventana se usa cuando ya tienes
                                                        archivos que quieres agregar a tu proyecto, pero en
                                                        esta ocasión por tratarse de un proyecto totalmente
                                                        nuevo no es necesario especificar nada dentro de
                                                        esta ventana. Solo haz click en el botón de
                                                        Siguiente.




IEC FRANCISCO JAVIER TORRES VALLE                                                                       55
CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES




                                                         7. Luego de lo anterior, aparecerá una ventana
                                                       que te pregunta si deseas guardar tu nuevo
                                                       proyecto, solo haz click en Sí.
                                                          8. Ahora ya tienes un nuevo proyecto donde se
                                                       encuentra suficiente información para que el
                                                       compilador te genere el archivo .jed. Pero te falta
                                                       agregar el código que habrá de compilarse.
                                                       Selecciona File > New > Text File, o puedes hacer
                                                       click en el icono de nuevo. Escribe lo siguiente
                                                       dentro del archivo de texto:

                                                       library ieee;

                                                          Elige File > Save As y en la opción de Guardar
                                                       en, selecciona el nombre de la carpeta que usaste
                    Figura 4.4                         en el paso número 4 (c:nuevo). Una vez que hayas
   6. La siguiente ventana lleva el título de Select   seleccionado el directorio, escribe el nombre de
Target Device, esta ventana es muy importante ya       archivo, se sugiere el nombre nuevo, con la
que es aquí donde debes de especificar el PLD en       extensión .vhd, ya que de esta manera se especifica
el que vas a trabajar. Los PLD's que se usan           un archivo que contiene un código en VHDL.
cuando se está aprendiendo son los pequeños            Luego de hacer esto, guarda tu archivo.
(generalmente 16V8, 22V8 ó 22V10), estos PLD's           9. Cierra el archivo de texto.
están en la ventana como SPLD. Haz doble click
sobre este texto, te aparecerá una lista de los          10. Selecciona Project > Add Files, te aparecerá
SPLD's más comunes, selecciona el SPLD que te          una ventana que debe de tener tu archivo
interese y nuevamente aparecerá una lista donde        nuevo.vhd , haz click en Add, y posteriormente en
hay varios tipos del mismo SPLD, por ejemplo           OK.
PALCE16V8-10PC/PI. Esta parte es importante,
ya que debes de seleccionar un SPLD que tenga un
encapsulado de tipo PDIP, para que lo puedas
montar en tu protoboard. En la parte inferior
aparece información sobre el SPLD que te interese.
Cuando escojas el SPLD adecuado haz click en
Finalizar.




                                                                           Figura 4.6

                                                          11. Tu archivo de texto se ha convertido en un
                                                       archivo de VHDL y está dentro de tu proyecto,
                                                       todo lo que programes, será compilado en el
                                                       dispositivo que especificaste. En tu ventana de
                                                       proyecto (si no se encuentra abierta, la puedes
                                                       activar haciendo View > Project Window) debe de
                                                       aparecer un icono en forma de hoja que tiene el
                                                       nombre de tu proyecto. Haz click en esta hoja y te
                    Figura 4.5                         debe de aparecer un archivo con la instrucción:
                                                       library ieee; solo que ahora la palabra library está

IEC FRANCISCO JAVIER TORRES VALLE                                                                       56
CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES




en color azul porque es una palabra reservada. Esto      1. Una vez que se ha creado un nuevo proyecto
demuestra que haz hecho correctamente el               en Galaxy, dentro del menú Project selecciona
procedimiento.                                         Compiler Options.




                    Figura 4.7

   12. Si la configuración de colores es la normal,                        Figura 4.8
notarás que todas las palabras reservadas se
muestran en color azul y los comentarios en color         2. Lo anterior abrirá la ventana de opciones de
rojo. Ahora ya puedes comenzar a hacer tu              compilación, dentro de esta se encuentra una
descripción en VHDL.                                   sección para elegir el formato de los retardos para
                                                       simular el circuito Simulation—Timing Model.
                                                       Aquí es donde debes de seleccionar el formato
4.2      SIMULACIÓN DE                                 1164/VHDL.
         PROYECTOS
   Active - HDL de la empresa Aldec Inc. es un
simulador que utiliza un archivo de post - síntesis
creado por WARP. Éste es un archivo .vhd con los
retardos de tiempo del código sintetizado en el
dispositivo seleccionado. Este tema tiene por
objetivo dar una pequeña introducción a este
simulador de VHDL en las siguientes tres
secciones.
  1. Formato de simulación 1164/VHDL.
  2. Simulación.
  3. Tipos de señales de estimulación.

FORMATO DE SIMULACIÓN 1164/VHDL
   El archivo de entrada para Active - HDL es un
modelo de simulación post - síntesis generado                              Figura 4.9
cuando se compila un archivo .vhd en el
dispositivo elegido. En WARP es posible crear            3. Asegúrate que se encuentre habilitado el
archivos con diferentes formatos para simulación       cuadro de Enable Testbench Output.
post - síntesis. Active - HDL requiere de un archivo
con el formato de simulación IEEE - 1164 / VHDL.       4.2.1    PROCESO DE SIMULACIÓN
  Para crear este archivo post - síntesis debes
                                                          El proceso de simulación lo podemos resumir en
seguir el siguiente procedimiento.
                                                       los siguientes siete pasos.

IEC FRANCISCO JAVIER TORRES VALLE                                                                      57
CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES




  1. Cargar un archivo con el formato de              2. - INICIACIÓN DE LA SIMULACIÓN
     simulación 1164/VHDL.                               Para iniciar la simulación, activa el simulador
                                                      utilizando la opción Initialize Simulation, dentro
  2. Iniciación de la simulación.
                                                      del menú Simulation. Después abre una ventana
  3. Agregar señales.                                 para el análisis de señales Waveform Window, si es
                                                      que no se encontrara ya una abierta.. Para crear
  4. Asignar señales de estimulación.                 una nueva ventana de este tipo, haz clic en el icono
  5. Correr la simulación.                            dentro de la barra estándar de trabajo o selecciona
                                                      File > New Waveform..
  6. Observación de la simulación.
                                                      3. - AGREGANDO SEÑALES
  7. Guarda la simulación.
                                                         El siguiente paso es agregar señales a la ventana
1. - CARGA DEL ARCHIVO                                de análisis, para esto selecciona Add Signals...en el
                                                      menú Waveform. La ventana para agregar señales
   El primer paso es abrir el programa Active-HDL     aparecerá con una lista de todas las señales de
Sim que normalmente se encuentra en Menu Inicio       entrada, salida, entrada/salida y nodos internos de
> Programas > Warp > Active-HDL Sim. Para             conexión disponibles en el diseño. Para agregar
cargar el archivo selecciona Open Vhdl dentro del     alguna de las señales que se encuentran en esta
Menú File.                                            lista basta con hacer doble clic sobre el nombre de
                                                      la señal. Si deseas agregar varias señales al mismo
                                                      tiempo, puedes seleccionarlas mediante la tecla
                                                      control y haciendo clic sobre cada señal que deseas
                                                      agregar para después hacer clic sobre el botón Add
                                                      que se encuentra en la parte inferior de la ventana.




                   Figura 4.10

   Es importante mencionar que el archivo con el                          Figura 4.11
formato 1164/VHDL se crea en el subdirectorio
vhd dentro del directorio de trabajo del proyecto     4. - TIPOS DE SEÑALES DE ESTIMULACIÓN
una vez que éste es compilado. Si se selecciona por
accidente el archivo .vhd creado por el usuario, el      Las señales de estimulación son utilizadas para
compilador del programa generará varios errores y     definir diferentes impulsos a los puertos de entrada
no podrá ser simulado. Una vez que el archivo         del diseño que esta siendo simulado. Para
apropiado es cargado, se desplegarán una serie de     seleccionar alguno de estos tipos primero
mensajes dentro de la ventana de compilación.         selecciona la señal y después selecciona Waveform
Uno de los mensaje que debería aparecer cuando el     > Stimulators..., a continuación se describe
archivo es compilado correctamente es el              brevemente los diferentes tipos de señales de
siguiente:                                            estimulación de Active-HDL Sim.

-- Compile success 0 Errors 0 Warnings
Analysis time: 3.0 [s].




IEC FRANCISCO JAVIER TORRES VALLE                                                                       58
CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES




                                                        VALOR
                                                          Con este tipo de estimulador asignamos un valor
                                                        constante a la señal especificada.
                                                        HOTKEY
                                                           Con este estimulador podemos estar cambiando
                                                        el valor de la señal presionando una tecla. Cuando
                                                        asignamos este tipo de estimulador es conveniente
                                                        asignar una lista de valores. Cada que presionemos
                                                        la tecla asignada, estaremos cambiando entre los
                                                        valores de esta lista.
                                                           Para una descripción más completa de las
                    Figura 4.12                         características del simulador consulta la ayuda del
                                                        programa.
CLOCK
                                                        5. - CORRIENDO LA SIMULACIÓN
   Sirve para definir señales de reloj definidas con
los siguientes parámetros: frecuencia, valor inicial,      Para correr la simulación selecciona Simulation
ciclo de trabajo y tiempo de inicio.                    > Run. La simulación se detendrá después que la
                                                        duración especificada haya sido terminada. En este
CUSTOM
                                                        momento las señales de estimulación para los
   Un estimulador personalizado se crea editando        puertos de entrada pueden ser alterados y
los valores deseados en la ventana de simulación.       producirán efectos sobre la simulación cuando esta
Estado en el modo de edición, al estimulador de         continué. Para volver a iniciar la simulación
entrada se le puede asignar un estado bajo o un         selecciona Simulation > Restart Simulation.
estado alto presionando '1' o '0' respectivamente.
                                                        6. - OBSERVANDO LA SIMULACIÓN
FORMULA
                                                           Varias propiedades pueden ser manipuladas
   Un estimulador del tipo formula produce una          para mejorar la apariencia de la simulación. A
señal definida por una simple sintaxis. La señal es     continuación se describen brevemente algunas de
definida con secuencias pares de valor - tiempo.        estas propiedades.
Con la componente tiempo indicamos el momento
                                                        BUS
en el que la señal asume el valor especificado. La
unidad del tiempo es en picosegundos. Para repetir         La líneas individuales que forman un bus
durante un periodo especificado, se agrega el           pueden ser mostradas y editadas. Para mostrarlas
modificador -r. La sintaxis del estimulador tipo        haz clic sobre "+" que se encuentra a junto al
formula se muestra a continuación.                      nombre el bus. Las señales de estimulación pueden
                                                        ser asignadas a cada línea del bus o al bus
<valor> <tiempo> [,<valor> <tiempo>,                    completo.
<valor> <tiempo>, ...] [ -r <periodo>]
                                                        COLOR
EJEMPLO                                                    Las señales de la simulación pueden ser de
'0000' 0 ps, '1111' 100000 ps, '0011'
                                                        diferentes colores para una mejor claridad cuando
200000 ps -r 300000                                     varias señales son desplegadas. Para agregar color
                                                        a todas las señales visibles, selecciona Waveform >
PREDEFINIDOS                                            Colorize Waveforms, esto asignará diferentes
                                                        colores, arbitrariamente a cada señal dentro de la
   Los estimuladores predefinidos son una serie de      ventana de simulación. Para asignar color a cada
señales tipo clock con diferentes frecuencias o         señal, haz clic con el boton derecho sobre el
señales del tipo formula que pueden ser asignados       nombre de la señal y selecciona la opción
a las señales. Para agregar un nuevo estimulador a      Properties..
esta lista, lo puedes hacer en la misma ventana
dentro del cuadro Predefined.

IEC FRANCISCO JAVIER TORRES VALLE                                                                       59
CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES




ZOOM                                                     ventas de simulación abiertas. La extensión de los
                                                         archivos de simulación en Active-HDL Sim es
   Para aumentar o reducir la escala de tiempo de
                                                         .awf.
la simulación, selecciona View > Zoom >
In/Out/Full.
                                                         4.3      COMPARADORES
BOOKMARKS
   Para colocar marcas sobre la ventana de                  El objetivo de este tema es crear, sintetizar, y
simulación primero selecciona Waveform > Select          simular la descripción de circuitos comparadores
Mode. Cuando este modo se encuentra                      de magnitud utilizando WARP.
seleccionado, es posible colocar marcas sobre            PROCEDIMIENTO
diferentes puntos de la simulación para una rápida
referencia a ciertos puntos importantes de la               1. Primero crearemos un proyecto para el
misma. Para colocarlas primero haz clic con el           ejemplo del comparador visto en el tema 3.1.2
botón izquierdo en donde deseas colocar una              Antes que nada debemos crear el proyecto dentro
marca, después selecciona Search > Toggle                de un directorio en el que se encontrarán todos los
Bookmark. Utilizando Next/Previous Bookmark              archivos del proyecto (.pfg, .vhd, .jed, .rpt, etc. ).
del mismo menú puedes cambiar entre una marca y          Se sugiere crear primero una carpeta para todos los
otra dentro de la simulación. Las marcas son             proyectos VHDL y dentro de esa carpeta crear otra
desplegadas como un triángulo azul sobre la escala       carpeta para el presente proyecto, por ejemplo
de tiempo en la ventana de simulación. Para              c:vhdl_projcomparador_1, con el nombre
eliminar alguna marca selecciona Waveform > Edit         comparador_1.
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                          Figura 4.13
etiqueta no es mostrada o no se ve completa,
amplia el alto de la fila haciendo clic con el botón        2. Seleccionaremos un 22V10 con empaquetado
derecho sobre alguna de las señales que                  tipo DIP para sintetizar el código.
intervienen en la medición y después selecciona            3. Ahora creamos un nuevo archivo de texto
Properties, dentro de la venta de propiedades            para editar el código (File > New > Text File).
aumenta la altura modificando el valor del cuadro        Este archivo debe ser guardado con extensión .vhd
de texto Height. Para eliminar alguna etiqueta de        y en la misma carpeta del proyecto. Se sugiere
medición selecciona Waveform > Edit Mode,                guardarlo como:
después seleciona la etiqueta y presiona suprimir
                                                           c:vhdl_projcomparador_1comparador1.vhd
7. - GUARDANDO LA SIMULACIÓN
                                                           4. A continuación se muestra la tabla de
   Existen dos formas de guardar la simulación.          funcionamiento de este comparador y basándose
Guardar solamente la simulación de la ventana            en ella haremos el código de descripción en
activa o guardar todas las simulaciones de las           VHDL. Primero utilizaremos el estilo de

IEC FRANCISCO JAVIER TORRES VALLE                                                                           60
CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES




descripción de flujo de datos, que es el mismo que       a agregarlo al presente proyecto. Para agregarlo lo
se utilizó cuando se expuso el ejemplo en el tema        hacemos desde el menú Project y dentro de éste
3.1.2.                                                   hacemos clic en Add Files... (Project > Add
                                                         Files...). Una vez que aparece la ventana para
TABLA DE FUNCIONAMIENTO                                  agregar archivos al proyecto, seleccionamos el
                                                         archivo comprador_1.vhd y presionamos el botón
                                                         "Add".
       ENTRADAS               SALIDAS
                                                            Si por error hacemos clic en la opción Add All
            x<y         x_men_y         '1'              Files, todos los archivos .vhd dentro de la carpeta
            x<y           equals        '0'              del proyecto se agregaran al mismo. En este caso
                                                         el único archivo .vhd que debería estar dentro de la
            x<y         x_may_y         '0'
                                                         carpeta del proyecto es comparador_1.vhd, lo cual
            x=y         x_men_y         '0'              en esta ocasión no nos afectará. En caso de que
                                                         hubiera más de un archivo .vhd y no deseamos
            x=y           equals        '1'
                                                         tenerlo dentro del proyecto basta con seleccionarlo
            x=y         x_may_y         '0'              en la ventana de proyecto y presionar la tecla
                                                         suprimir, o también desde Project > Remove
            x>y         x_men_y         '0'
                                                         Selected Source File(s). Si la ventana de proyecto
            x>y           equals        '0'              no está visible entonces seleccionamos View >
            x>y         x_may_y         '1'              Reset Docking Windows.


   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                                             Figura 4.14
             '0';
  x_may_y <= '1' WHEN x > y ELSE
                                                           7. Una vez editado y agregado el archivo al
             '0';
  x_men_y <= '1' WHEN x < y ELSE                         proyecto se procede a sintetizar el código en el
             '0';                                        22V10. Seleccionamos Compile > Project o
END comparador;                                          también lo podemos hacer presionado el icono de
                                                         compilación.
   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                               Figura 4.15
declaración de puertos no lleva ;
                                                            Si el archivo tiene errores, estos aparecerán en
  Una vez que se terminó de editar el código,            la ventana de salida (Output Window). Dentro de
procedemos a guardar los cambios en el archivo y         "Errors & Warnings" en la ventana de salida se

IEC FRANCISCO JAVIER TORRES VALLE                                                                         61
CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES




muestra una lista completa de los errores así como     las ecuaciones que resultaron durante el proceso de
una descripción de cada error. Para acceder            síntesis, la asignación de pines, y un informe de
rápidamente a la línea en la cual ocurrió el error,    utilización del dispositivo. En ocasiones es
basta con hacer doble clic sobre el error e            complicado realizar algunas descripciones y,
inmediatamente el programa se colocará sobre la        aunque el código se sintetiza, durante la
línea en donde se encuentra dicho error. Los           simulación hace algo diferente a lo que
errores pueden ser algunos de los siguientes: omitir   esperábamos. La función del sintetizador, en este
algún punto y coma, no escribir correctamente          caso WARP, es la de interpretar nuestra
algún identificador, sintaxis incorrecta de las        descripción en VHDL para generar la lógica de
instrucciones utilizadas, o uso incorrecto de los      salida. En estos casos posiblemente la descripción
operadores. Recordemos que VHDL es un                  no corresponde exactamente a lo que queremos.
lenguaje en el que los tipos de datos son              Para corregir la descripción es útil consultar las
sumamente importantes y no se pueden mezclar a         ecuaciones, ya que en estas nos podemos dar
menos que se utilicen las librerías adecuadas.         cuenta que es lo que estamos describiendo
                                                       realmente. En temas posteriores se presentan
   8. La ventana de proyecto tiene 3 modos o
                                                       algunos ejemplos en los que se exponen con más
vistas: "Source Files View", "Hierarchy View", y
                                                       detalle este tipo de problemas.
"Output Files View". En la primera se muestran los
archivos que se han agregado al proyecto. La           SIMULACIÓN
"Vista de Jerarquía" es útil cuando se hacen
                                                         9. Ahora que ya hemos logrado sintetizar el
diseños jerárquicos, ya que en esta se muestra cual
                                                       código y obtenido los archivos .jed y .vhd de
es el orden de importancia que hay entre ellos.
                                                       postsíntesis procedemos a simular la descripción.
Dentro de la "Vista de Archivos de Salida"
                                                       Las simulaciones las haremos en Active-HDL Sim
aparecen los archivos que se generaron durante la
                                                       como se explicó en tema 4.2. Podemos abrir el
compilación, los cuales fueron creados dentro de la
                                                       programa desde Galaxy desde Tools > Active-HDL
carpeta del proyecto. Tales archivos de salida son:
                                                       Sim.
.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.17

                                                          10. Una vez iniciado el simulador, ahora
                                                       abrimos el archivo .vhd de postsíntesis como se
                                                       explica a continuación. Primero seleccionamos
                                                       File > Open VHDL.




                   Figura 4.16

   En el archivo .rpt se muestra un informe de los
resultados de la compilación. En éste se encuentran

IEC FRANCISCO JAVIER TORRES VALLE                                                                      62
CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES




                   Figura 4.18                         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
  Para después abrir el archivo .vhd de
postsíntesis, el cual debería estar (si seguiste
correctamente todos los pasos) en el subdirectorio:       Y al bus "y" también le asignaremos un
c:vhdl_projcomparador_1vhdcomparador1.
                                                       estimulador del mismo tipo con la siguiente
vhd                                                    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
                   Figura 4.19                         que se detenga en un momento especifico, o
                                                       adelantar la simulación solamente por algún
  11. Hecho lo anterior ahora agregamos las            tiempo. Para correr la simulación completamente
señales y/o puertos que deseamos simular.              seleccionamos Simulation > Run. Si queremos
Seleccionamos Waveform > Add Signals...                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
                   Figura 4.20                            Si deseas utilizar Run For cerciórate que el
                                                       tiempo de "paso" sea de 1 us. Ya que cuando
   Ahora seleccionamos los puertos como se             asignamos los estimuladores el valor de los buses
explicó en el tema 4.2. En este ejercicio              de entrada cambia cada 1 us. Si deseas utilizar Run
seleccionaremos solamente los puertos declarados       Until... bastara con especificar un tiempo de 32 us
en la entidad, tal y como se muestra en la figura      para observar como se comporta el ciclo de
4.22                                                   asignaciones que especificamos mediante la
   12. Lo siguiente es asignar señales de estimulo a   formula, el tiempo mínimo para comprobar todos
los puertos de entrada. Al bus "x" le asignaremos      los valores (por lo menos un ciclo) es de 16 us.
un estimulador tipo formula usando la siguiente           15. A continuación en la figura 4.23 se muestran
formula.                                               los resultados de la simulación. Si seguiste
                                                       correctamente todos los pasos deberías obtener
0000 0 ns, 0001 1 us, 0010 2 us, 0011 3
us, 0100 4 us, 0101 5 us, 0110 6 us, 0111
                                                       algo similar a lo mostrado en la siguiente figura.

IEC FRANCISCO JAVIER TORRES VALLE                                                                       63
CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES




                                        Figura 4.22




                                        Figura 4.23




                                        Figura 4.24


IEC FRANCISCO JAVIER TORRES VALLE                     64
CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES




4.4      MULTIPLEXORES                                 descripción de circuitos digitales utilizando
                                                       WARP. De esta librería se llamó el paquete
   En este tema el objetivo es elaborar                std_arith, el cual contiene muchas funciones que
descripciones de circuitos multiplexores utilizando    facilitan el uso de vectores tipo std_logic con
los tres estilos de descripción de VHDL.               enteros. De no haber utilizado este paquete no
                                                       podríamos hacer ninguna de la comparaciones que
PROCEDIMIENTO                                          están en la asignación condicional WHEN... ELSE.
                                                       Es decir, no es posible hacer la comparación "selec
   Para la síntesis utilizaremos un 22V10 siguiendo    = 3" porque "selec" es del tipo std_logic_vector y
la siguiente tabla de funcionamiento en los tres       "3" es un número entero. El paquete
estilos de descripción.                                std_logic_1164 contiene los tipos de datos
                                                       std_logic y std_logic_vector que comúnmente
TABLA DE FUNCIONAMIENTO                                utilizamos por lo que es necesario cargar el
                                                       paquete para poder utilizar estos tipos, sin
                                                       embargo, no contiene funciones de comparación
                   selec salida
                                                       entre tipos std_logic (o arreglos de este) y enteros.
                    00      a                          Como la librería es de propia del sintetizador, es
                                                       decir, que siempre esta cargada dentro del área de
                    01      b                          trabajo del proyecto o "work", podemos llamar el
                    10      c                          paquete como se muestra a continuación.
                    11      d                          USE work.std_arith.ALL;

                                                       SIMULACIÓN
4.4.1   DESCRIPCIÓN DE FLUJO DE DATOS                     Para la simulación se sugiere que asignes un
                                                       estimulador tipo formula a los vectores de entrada,
LIBRARY ieee;                                          y al vector "selec" le asignes un estimulador tipo
USE ieee.std_logic_1164.ALL;
                                                       "HOTKEY". Una vez que agregaste las señales a
LIBRARY cypress;                                       la simulación, selecciona con el puntero el vector
USE cypress.std_arith.ALL ;                            "selec", después seleccionas Waveform >
ENTITY multiplexor IS
                                                       Stimulators..., cuando aparezca el cuadro de
  PORT(a, b, c, d: IN std_logic_vector                 estimuladores selecciona "HOTKEY" dentro de
                       (3 DOWNTO 0);                   "Stimulator type", y en "Press new hotkey" escribe
       selec: IN std_logic_vector                      la letra "s" o cualquier otra.
                       (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                          Figura 4.25
std_logic). Como habrás notado se hizo el llamado
a una librería no mencionada anteriormente, la           Cada que presiones la tecla "s" el vector s estará
librería "cypress". Esta librería es de Cypress        cambiando de valor, por omisión la lista de valores
Semiconductors y fue desarrollada para facilitar la    de asignación incluye el '0' y el '1' solamente, en

IEC FRANCISCO JAVIER TORRES VALLE                                                                        65
CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES




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.




                                                       4.4.2   DESCRIPCIÓN COMPORTAMENTAL

                                                       LIBRARY ieee;
                                                       USE ieee.std_logic_1164.ALL;
                                                       USE work.std_arith.ALL;

                                                         ENTITY multiplexor IS
                   Figura 4.26                             PORT(a: std_logic_vector
                                                                               (3 DOWNTO 0);
   Ahora puedes correr la simulación poco a poco                   b: std_logic_vector
                                                                               (3 DOWNTO 0);
utilizando Simulation > Run For, o presionando la
                                                                   c: std_logic_vector
tecla "F5". Y cada que lo desees presionas la tecla                            (3 DOWNTO 0);
"s" para cambiar el valor del vector "selec". En la                d: std_logic_vector
figura 4.24 se muestran los resultados de la                                   (3 DOWNTO 0);
                                                                 selec: std_logic_vector
simulación.                                                                    (1 DOWNTO 0);
                                                                  salida: OUT std_logic_vector
                                                                               (3 DOWNTO 0));
   A continuación se muestran las ecuaciones           END multiplexor;
obtenidas utilizando el estilo de descripción de
flujo de datos. Estas ecuaciones deben ser las         ARCHITECTURE behavorial OF multiplexor IS
mismas para cualquier estilo que utilicemos, ya        BEGIN
                                                         PROCESS(selec, a, b, c, d)
que estamos describiendo el mismo multiplexor              VARIABLE selec_int: integer;
sólo que de manera diferente y esto no implica que       BEGIN
las ecuaciones vayan a ser distintas. Cuando               selec_int := to_integer(selec);
compiles este multiplexor, en cualquiera de los tres       CASE selec_int IS
                                                              WHEN 0 =>
estilos, consulta las ecuaciones dentro del archivo             salida <= a ;
.rpt y verifica que sean iguales.                             WHEN 1 =>
                                                                salida <= b ;
                                                              WHEN 2 =>
                                                                salida <= c ;
                                                              WHEN 3 =>
                                                                salida <= d ;
                                                              WHEN OTHERS =>
                                                                NULL;
                                                           END CASE;
                                                         END PROCESS;
                                                       END behavorial;




IEC FRANCISCO JAVIER TORRES VALLE                                                                66
CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES




   Dentro del proceso se hace uso de un objeto de
datos del tipo variable declarado como entero. Al
inicio del proceso se hace la asignación "selec_int
<= to_integer ( selec ) ;", esto es para poder usar
enteros en la instrucción CASE, de otra manera
tendríamos que indicar todos los casos utilizando
los valores naturales de un vector, es decir, "00",
"01", "10", y "11" para este ejemplo. Esto es
solamente para facilitar la descripción y no
significa que obtengamos una mejor síntesis del
código en el dispositivo. Es necesario que
"selec_int" sea una variable para que se le asigne                          Figura 4.27
inmediatamente el valor actual del vector "selec" y
estemos describiendo el correctamente el                 4.4.3   DESCRIPCIÓN ESTRUCTURAL
funcionamiento del multiplexor. Si quisiéramos
utilizar una señal en vez de una variable tenemos           Para la descripción estructural primero debemos
que hacerlo de la siguiente manera.                      realizar la descripción de un multiplexor 2 a 1 para
                                                         después interconectar tres de ello como se muestra
ARCHITECTURE behavorial2 OF multiplexor IS               en la figura siguiente.
  SIGNAL selec_int:integer;
BEGIN
  selec_int <= to_integer( selec );
  PROCESS(selec_int, a, b, c, d)
  BEGIN
    CASE selec_int IS
       WHEN 0 =>
         salida <= a ;
       WHEN 1 =>
         salida <= b ;
       WHEN 2 =>
         salida <= c ;
       WHEN 3 =>
         salida <= d ;
       WHEN OTHERS =>
         NULL;
    END CASE;
  END PROCESS;
END behavorial2;

   Si observas con cuidado podrás ver que                                   Figura 4.28
seguimos describiendo exactamente los mismo.
Tanto el procesos como la asignación son de                 Para realizar descripciones estructurales lo
naturaleza concurrente, por lo que selec_int tiene       recomendable es utilizar varios archivos .vhd, cada
siempre el valor actual de selec y lo convertimos a      uno para una entidad o paquete en particular. Crea
un tipo entero para facilitar la descripción. Trata de   un proyecto para la descripción estructural del
imaginar la asignación "selec_int <= to_integer (        multiplexor 4 a 1. Ahora crea un nuevo archivo de
selec )" como un circuito combinacional cuya             texto y copia la siguiente descripción.
función es cambiar el tipo de datos con el estamos
manejando el vector selec y cuya salida (selec_int)      LIBRARY ieee;
                                                         USE ieee.std_logic_1164.ALL;
se la conectamos (piensa en señales como cables)
al proceso, que viene siendo otro circuito que           PACKAGE multiplexor IS
"procesa" la información que se le suministra y            COMPONENT mux_2_a_1
obtiene finalmente la lógica de salida. A                    PORT( in1: IN std_logic_vector
                                                                           (3 DOWNTO 0);
continuación se muestra un diagrama a bloques                       in2: IN std_logic_vector
que trata de representar lo que estamos haciendo                           (3 DOWNTO 0);
en la arquitectura anterior (behavorial2).                          sel: IN std_logic;
                                                                    out1: OUT std_logic_vector
                                                                           (3 DOWNTO 0));

IEC FRANCISCO JAVIER TORRES VALLE                                                                         67
CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES




  END COMPONENT;                                       funcionamiento. Dentro de la ventana de proyecto
END multiplexor;
                                                       en la "vista de jerarquía" (Hierarchy View) aparece
LIBRARY ieee;                                          el orden en que los componentes están siendo
USE ieee.std_logic_1164.ALL;                           utilizados dentro del diseño jerárquico.
ENTITY mux_2_a_1 IS
  PORT (in1, in2: IN std_logic_vector
                    (3 DOWNTO 0);
         sel: IN std_logic;
         out1: OUT std_logic_vector
                    (3 DOWNTO 0));
END mux_2_a_1;

ARCHITECTURE data_flow OF mux_2_a_1 IS
BEGIN
  out1 <= in1 WHEN sel = '0' ELSE
           in2;
END data_flow;

   Guarda este archivo como mux_2_a_1.vhd
                                                                          Figura 4.29
dentro de la carpeta de trabajo del proyecto. Como
podrás ver estamos creando un paquete con                 Una vez que has compilado y simulado este
nombre "multiplexor" el cual se agrega a la librería   multiplexor utilizando los tres estilos podrás ver
del proyecto work. Además se tienen que llamar         que no hay ninguna diferencia entre usar un estilo
las librerías que se necesiten antes del paquete y     u otro. Lo importante es describir el mismo
antes de la entidad. Ahora abre un nuevo archivo       funcionamiento para obtener los mismo resultados.
de texto y copia en él la siguiente descripción.       De hecho, mientras estemos describiendo
                                                       exactamente lo mismo no importa el número de
-- mux_structural.vhd
LIBRARY ieee;                                          líneas que se hagan, porque VHDL no es un
USE ieee.std_logic_1164.ALL;                           lenguaje de programación de software.
USE work.multiplexor.ALL;
-- llamado al paquete multiplexor que se
-- encuentra en la librería                            4.5      SUMADORES
-- del proyecto
                                                          El diseño de circuitos aritméticos eficientes es
ENTITY multiplexor IS
PORT ( a,b,c,d: IN std_logic_vector                    un tema fundamental en el diseño de circuitos
                    (3 DOWNTO 0);                      digitales, por lo que es importante para el
       selec: IN std_logic_vector                      diseñador estar familiarizado con las opciones
                    (3 DOWNTO 0);                      disponibles en la selección de algoritmos eficientes
       salida: OUT std_logic_vector
                    (3 DOWNTO 0));                     en sus aplicaciones. Está práctica tiene por
END multiplexor;                                       objetivo familiarizarte en el diseño de circuitos
                                                       sumadores utilizando algoritmos eficientes en
ARCHITECTURE structural OF multiplexor IS
  SIGNAL salida1, salida2:
                                                       VHDL.
         std_logic_vector(3 DOWNTO 0);
BEGIN                                                  4.5.1   SUMADOR TOTAL
  u1: mux_2_a_1 PORT MAP(a, b, selec(0),
                         salida1);                        El componente básico usado en la adición de
  u2: mux_2_a_1 PORT MAP(c, d, selec(0),               dos operandos es conocido como "sumador total".
                         salida2);
  u3: mux_2_a_1 PORT MAP ( salida1,                    Este sumador total representa el componente con
             salida2, selec(1), salida);               el cual podemos formar sumadores de cualquier
END structural;                                        número de bits. A continuación se muestra la tabla
                                                       de funcionamiento y la representación esquemática
  Guarda este archivo como mux_structural.vhd,         de un sumador total, y basándose en la tabla se
y agrega ambos archivos al proyecto (Proyect >         hará la descripción de sumador total en VHDL,
Add Files...). Compila el proyecto y comprueba         para posteriormente diseñar un circuito sumador de
que las ecuaciones de salida siguen siendo las         4 bits utilizando un 22V10.
mismas ya que estamos describiendo el mismo

IEC FRANCISCO JAVIER TORRES VALLE                                                                       68
CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES




                                                               "10" WHEN entradas = 5 ELSE
                                                               "10" WHEN entradas = 6 ELSE
                                                               "11" WHEN entradas = 7;
                                                    sum <= salidas(0);
                                                    co <= salidas(1) ;
                                                  END data_flow;

                                                    Si conoces las ecuaciones del circuito también
                                                  puedes utilizarlas para hacer la descripción.
                                                  ARCHITECTURE data_flow OF full_adder IS
                                                  BEGIN
                                                    sum <= a XOR b XOR C;
                Figura 4.30                         co <= (a AND b) OR
                                                           (a AND ci) OR
TABLA DE FUNCIONAMIENTO                                    (b AND ci);
                                                  END data_flow;
    ENTRADAS              SALIDAS
     a     b         ci      co   suma               Crea un nuevo proyecto en c:vhdl_projprac5
                                                  y llámalo sumador. Después crea un nuevo archivo
     0     0         0       0      0
                                                  de texto y copia en él la descripción anterior.
     0     0         1       0      1
                                                  Guarda el archivo de texto como full_adder.vhd
     0     1         0       0      1             dentro de la carpeta de trabajo del proyecto.
     0     1         1       1      0             Agrega el archivo al proyecto y compila el
     1     0         0       0      1             proyecto utilizando la arquitectura data_flow. Abre
     1     0         1       1      0             el reporte de compilación y observa las ecuaciones.
     1     1         0       1      0             Ahora compila el proyecto utilizando la segunda
     1     1         1       1      1             arquitectura data_flow. Vuele a abrir el proyecto y
                                                  observa las ecuaciones. ¿Por qué son las mismas
LIBRARY ieee; -- full_adder.vhd                   ecuaciones? porque estamos describiendo el
USE ieee.std_logic_1164.ALL;
                                                  mismo funcionamiento y el estilo o el número de
PACKAGE adder IS                                  líneas que utilices no importa siempre y cuando
  COMPONENT full_adder                            este describiendo exactamente el mismo circuito.
    PORT(ci: IN std_logic;
         a, b: IN std_logic;
         sum: OUT std_logic;                      4.5.2   SUMADOR DE CUATRO BITS
         co: OUT std_logic);
  END COMPONENT;
END adder;
                                                    Para hacer la descripción utilizaremos cuatro
                                                  unidades del sumador total (u1 a u4) y las
LIBRARY ieee;                                     conectaremos como se muestra continuación.
USE ieee.std_logic_1164.ALL;
USE work.std_arith.ALL;

ENTITY full_adder IS
  PORT(ci: IN std_logic;
       a, b: IN std_logic;
       sum: OUT std_logic;
       co: OUT std_logic);
END full_adder;

ARCHITECTURE data_flow OF full_adder IS
  SIGNAL entradas: std_logic_vector
                    (2 DOWNTO 0);
  SIGNAL salidas: std_logic_vector
                    (1 DOWNTO 0);                                    Figura 4.31
BEGIN
  entradas <= a&b&ci ;                               Abre un nuevo archivo de texto y copia en él la
  salidas <= "00" WHEN entradas = 0 ELSE
             "01" WHEN entradas = 1 ELSE          siguiente descripción.
             "01" WHEN entradas = 2 ELSE
             "10" WHEN entradas = 3 ELSE          -- sumador de 4 bits utilizando
             "01" WHEN entradas = 4 ELSE          -- un sumador total


IEC FRANCISCO JAVIER TORRES VALLE                                                                 69
CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES




                                                               co, c1, c2, c3: INOUT std_logic);
LIBRARY ieee;                                         END sumador;
USE ieee.std_logic_1164.ALL;
USE work.std_arith.ALL;
USE work.adder.ALL;                                      De esta forma enviamos los nodos c1, c2, y c3 a
                                                      la salida de una macroceldas, en el caso del 22V10
ENTITY sumador IS                                     a un pin de salida, y así evitamos que el
  PORT (ci: IN std_logic;                             sintetizador elimine el nodo porque ya lo
         a, b: IN std_logic_vector
                  (3 DOWNTO 0);                       declaramos como puerto.
         sum: OUT std_logic_vector
                  (3 DOWNTO 0);
         co: OUT std_logic);                          4.5.3    SYNTHESIS OFF
END sumador;
                                                         Otra forma de evitar que se simplifique el nodo
ARCHITECTURE structural OF sumador IS                 es utilizando directivas de síntesis. En este caso
  SIGNAL c1, c2, c3: std_logic;
BEGIN
                                                      utilizaremos la directiva synthesis_off que está
  u1: full_adder PORT MAP (ci, a(0), b(0),            incluida en WARP. Esta directiva nos permite
                           sum(0), c1 ) ;             controlar la forma en que el sintetizador factoriza y
  u2: full_adder PORT MAP (c1, a(1), b(1),            obtiene las ecuaciones de salida y de esta manera
                           sum(1), c2 ) ;
  u3: full_adder PORT MAP (c2, a(2), b(2),            evitar que la ecuación de un nodo se incluya en la
                           sum(2), c3);               ecuación de otro nodo y así evitar
  u4: full_adder PORT MAP (c3, a(3), b(3),            retroalimentaciones. Para entender como funciona
                           sum(3), co);               esta directiva observe el siguiente ejemplo.
END structural;
                                                      ENTITY synthesis_off IS
   Guarda el archivo de texto en la carpeta de          PORT ( a, b, c: IN bit;
trabajo del proyecto (c:vhdl_projprac5) como                 y: OUT bit);
sumador.vhd. Compila el proyecto y observa lo         END synthesis_off;
que sucede. Si estas usando la versión 5.0 o 5.2 de   ARCHITECTURE simplifica_nodo OF
WARP, la compilación te indicará los siguientes       synthesis_off IS
errores.                                                SIGNAL x: bit;
                                                      BEGIN
                                                        x <= a AND b;
Error: Logic equation has too many product              y <= x OR c;
terms on signal co.
                                                      END simplifica_nodo;
Error: Logic equation has too many product
terms on signal sum(2).                                 Cuando compilemos el archivo la ecuación del
Error: Logic equation has too many product            nodo "x" se sustituye en la ecuación del puerto "y"
terms on signal sum(3).
                                                      como se muestra abajo.
   Abre el reporte de compilación y observa las       y = a * b + c
ecuaciones. La descripción no se pudo compilar
porque las ecuaciones tienen demasiadas sumas de        Lo que trataríamos de hacer entonces sería
productos. El sintetizador de WARP siempre trata      declara el nodo "x" como puerto y no como señal
de evitar retroalimentaciones para que el circuito    de interconexión, pero observa que es lo que
funcione con la mayor velocidad posible. Nosotros     sucede.
deseamos que los nodos c1, c2, y c3 queden en un
pin de salida del 22V10 para de esta forma hacer      x = a * b               y = a * b + c
las conexiones como se muestran en el diagrama a
bloques del sumador de 4 bits. Para lograrlo basta       La ecuación de "x" se sigue sustituyendo en la
con describir la entidad como se muestra a            ecuación del puerto "y". Como habíamos
continuación.                                         mencionado, el sintetizador siempre busca que el
                                                      circuito que le estamos describiendo funcione a la
ENTITY sumador IS
  PORT ( ci: IN std_logic;
                                                      mayor frecuencia posible. Al obtener las
         a, b: IN std_logic_vector                    ecuaciones de la forma anterior evitamos que
                  (3 DOWNTO 0);                       exista una retroalimentación desde el pin del
         sum: OUT std_logic_vector                    puerto "x", ya que si retroalimentamos tenemos
                  (3 DOWNTO 0);
                                                      que esperar el tiempo de retardo de las compuertas

IEC FRANCISCO JAVIER TORRES VALLE                                                                       70
CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES




que intervienen en las ecuaciones de "x" para que        Esta directiva sólo puede ser aplicada a señales,
después el valor de "x" se incorpore a las            para una explicación más detallada de esta y otras
ecuaciones del puerto "y". Por lo que el tiempo de    directivas de síntesis consulta la ayuda del
retardo para el puerto "y" sería mayor. Sin           programa (Help > Help Topics). Para diseño de
embargo, aunque lo mejor es que nuestro circuito      circuitos aritméticos y no aritméticos que sean
funcione a mayor velocidad, en ocasiones              grandes o complejos, lo mejor es hacer
necesitamos que el nodo quede en una macrocelda       descripciones estructurales y utilizar las directivas
para que después se retroalimente hacia otras         de síntesis cuando sea necesario.
ecuaciones. Ya sea por que lo necesitamos en el
diseño del circuito o por las limitaciones del
dispositivo programable. Es aquí donde las
                                                      4.6      REGISTROS
directivas de síntesis nos permiten controlar el         Existen dos métodos para implementar lógica
proceso de síntesis. Observa el siguiente ejemplo     registrada en VHDL: mediante instanciación de
en el que se muestra como utilizar la directiva       registros (utilizando librerías de componentes) o
synthesis_off.                                        utilizando procesos para realizar la descripción
ENTITY synthesis_off IS                               comportamental del registro.
  PORT ( a, b, c: IN bit;
         y: OUT bit);                                    Por ejemplo, si se desea utilizar un registro D y
END synthesis_off;
                                                      un contador de 4 bits, basta con realizar la
ARCHITECTURE no_simplifica_nodo OF                    instanciación de dichos componentes después de
synthesis_off IS                                      incluir los paquetes apropiados.
  SIGNAL x: bit;
ATTRIBUTE synthesis_off OF x: SIGNAL IS
                               true;                  EJEMPLO
BEGIN
  x <= a AND b;                                       USE work.rtlpkg.ALL; -- paquetes de WARP
  y <= x OR c;                                        USE work.lpmpkg.ALL;
END no_simplifica_nodo;                               . . .
                                                      -- DSRFF: definido en rtlpkg
   Las ecuaciones que resultan del proceso de         d1: dsrff PORT MAP(d, s, r, clk, q ;
síntesis son las siguientes.                          -- Mcounter: definido en lpmpkg
                                                      c1: Mcounter GENERIC MAP (4)
/y = /c * /x                                                       PORT MAP (data, clk, one,
x = a * b                                                          one, one, count, zero, rst,
                                                                   zero, zero, zero, zero zero,
                                                                   zero, OPEN);
   Ahora las ecuaciones tienen menos términos y
obligamos a que el nodo "x" quede en una
terminal, obligándolo a quedar en una macrocelda         Otra forma de registrar elementos es incluir un
para que después se retroalimente. Para el circuito   proceso que sea sensible a las transiciones de una
sumador de cuatro bits podemos utilizar esta          señal de reloj o que espere una transición de reloj
directiva de la siguiente forma.                      utilizando la instrucción WAIT, de esta manera el
                                                      compilador asigna un registro a las señales
ARCHITECTURE structural OF sumador IS                 afectadas dentro del proceso. Existen 4 formas
  SIGNAL c1, c2, c3: std_logic;                       básicas para describir registros, cada una de ellas
  ATTRIBUTE synthesis_off OF c1, c2, c3:              se explica a continuación.
                        SIGNAL IS true;
BEGIN
  u1: full_adder PORT MAP (ci, a(0), b(0),            PROCESS
                           sum(0), c1 ) ;             BEGIN
  u2: full_adder PORT MAP (c1, a(1), b(1),            WAIT UNTIL clk = '1';
                           sum(1), c2 ) ;             . . .
  u3: full_adder PORT MAP (c2, a(2), b(2),            END PROCESS;
                           sum(2), c3);
  u4: full_adder PORT MAP (c3, a(3), b(3),               Este proceso no tiene lista sensible, por lo que
                           sum(3), co);
END structural;
                                                      comienza con una instrucción WAIT. Las
                                                      instrucciones dentro del proceso se comenzarán a
                                                      ejecutar cuando exista una transición positiva de la

IEC FRANCISCO JAVIER TORRES VALLE                                                                       71
CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES




señal de reloj "clk". Todas las asignaciones a         . . .
                                                       END IF;
señales dentro del proceso serán registradas, ya       END PROCESS;
que estas sólo cambian de valor en las transiciones
de reloj y lo retienen por lo menos hasta la              Este proceso es sensible a los cambios en la
siguiente transición.                                  señales "clk", "rst" y "pst", como se indica en la
PROCESS (clk)
                                                       lista sensible. De esta forma es posible realizar la
BEGIN                                                  descripción de registros con "preset" y "reset"
  IF ( clk'event AND clk ='1' ) THEN                   asíncronos. La primera instrucción dentro del
  . . .                                                proceso checa el estado de la señal "rst". Todas las
  END IF;
END PROCESS;
                                                       señales que son asignadas dentro de la primera
                                                       porción de la estructura, se asume que serán
   Este proceso es sensible solamente a los            registradas mediante la señal de "rst" asíncrono. La
cambios en la señal "clk", como se indica en la        segunda condición checa el estado de la señal
lista sensible. La primera instrucción, IF... THEN,    "pst", y todas las señales que sean asignadas dentro
dentro del proceso restringe al resto de las           de esta porción del proceso son registradas
instrucciones a ser ejecutadas únicamente durante      asíncronamente mediante la señal de "preset"
la transición positiva de la señal "clk", por lo que   asíncrono "pst". Si las dos primeras condiciones no
ahora también todas las señales que reciban una        se cumplen, el resto de la instrucción IF... THEN...
asignación dentro de la instrucción IF... THEN         ELSIF, representa el funcionamiento síncrono del
serán registradas y mantendrán dicho valor             registro.
recibido por lo menos hasta la siguiente transición    EJEMPLO
de reloj.

PROCESS(rst, clk)
                                                          A continuación se muestra una forma de realizar
BEGIN                                                  la descripción de un registro de 32 bits con "reset"
  IF rst = '1' THEN                                    asíncrono.
  . . .
  ELSIF(clk'event AND clk='1') THEN                    PROCESS(r, clk2)
  . . .                                                BEGIN
  END IF;                                                IF (r = '1') THEN
END PROCESS;                                               q <= x"123DEABC" ;
                                                         ELSIF (clk2'event AND clk2='1') THEN
   Este proceso es sensible a los cambios en la            q <= d;
                                                         END IF;
señal de reloj "clk" y la señal de reinicio "rst",     END PROCESS;
como es indicado en la lista sensible. Mediante
este método de descripción comportamental es               Asumiendo que "q" y "d" son declarados como
posible registrar señales y además tener un "reset"    señales o puertos de 32 bits, entonces este código
asíncrono. La primera instrucción checa primero el     ejemplifica la implementación de un registro de 32
estado de la señal "rst". Las señales que son          bits con d(i) como entrada, q(i) como salida, "clk2"
asignadas dentro de esta porción de la estructura      como la señal de reloj, y "r" como la señal de
IF... THEN... ELSIF, se asume que son registradas      "reset" asíncrono para algunos registros y también
asíncronamente con la señal de "reset" asignada, y     como señal de "preset" asíncrono para otros. Esto
serán sintetizadas en registros con capacidad para     significa que cuando se cumple la condición: r =
realizar dicha acción. Si la condición de "reset" no   '1', la asignación q <= x"ABC123DE" provocará
se cumple, el resto de la instrucción IF... THEN...    que algunos registros sean puestos en alto mientras
ELSIF, funciona como el proceso explicado              que otros van a quedar en un estado de cero lógico.
anteriormente.

PROCESS(rst, pst, clk)                                 EJEMPLOS
BEGIN
IF rst = '1' THEN                                         A continuación realice la descripción de los
. . .
ELSIF pst = '1' THEN
                                                       siguientes registros de acuerdo con su tabla de
. . .                                                  funcionamiento.
ELSIF (clk'event AND clk='1') THEN


IEC FRANCISCO JAVIER TORRES VALLE                                                                       72
CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES




REGISTRO NO. 1
                                                      ARCHITECTURE areg2 OF reg2 IS
  Elabore la descripción del registro utilizando un   BEGIN
                                                        PROCESS(clk, reset, d)
22V10 y posteriormente trate de implementar la          BEGIN
descripción en un 16V8, simule la descripción y           IF clk'event AND clk = '1' THEN
obtenga sus conclusiones.                                    IF reset = '0' THEN
                                                               q <= '0';
TABLA DE FUNCIONAMIENTO                                      ELSE
                                                               q <= d;
                                                             END IF;
              ENTRADAS                SALIDAS             END IF;
                                                        END PROCESS;
      reset d           clk              q            END areg2;

          1   0 transición positiva      0
                                                      REGISTRO NO. 3
          1   1 transición positiva      1
                                                         Elabore la descripción del siguiente registro
          0   -          -               0            utilizando un 22V10, simule la descripción y
                                                      obtenga sus conclusiones.
ENTITY reg1 IS
  PORT(reset: IN bit;                                 TABLA DE FUNCIONAMIENTO
       d: IN bit;
       clk: IN bit;
       q: OUT bit);                                               ENTRADAS                SALIDAS
END reg1;
                                                           enable d         clk              q
ARCHITECTURE areg OF reg1 IS
BEGIN                                                        1    0 transición positiva      0
  PROCESS(clk, reset, d)
  BEGIN                                                      1    1 transición positiva      1
    IF reset = '0' THEN
       q <= '0';                                             0    -          -              Z
    ELSIF clk'event AND clk = '1' THEN
       q <= d;                                        LIBRARY ieee;
    END IF;                                           USE ieee.std_logic_1164.ALL;
  END PROCESS;
END areg;                                             ENTITY reg2 IS
                                                        PORT(enable: IN std_logic;
                                                             d: IN std_logic;
REGISTRO NO. 2                                               clk: IN std_logic;
                                                             q: OUT std_logic);
  Elabore la descripción del registro utilizando un   END reg2;
22V10 y posteriormente utilice un 16V8, simule la
descripción en ambos casos y obtenga sus              ARCHITECTURE areg2 OF reg2 IS
conclusiones.                                           SIGNAL q_tmp: std_logic;
                                                      BEGIN
TABLA DE FUNCIONAMIENTO
                                                      -- lógica registrada
      ENTRADAS                SALIDAS                   PROCESS(clk, reset, d)
                                                        BEGIN
reset d           clk             q                       IF clk'event AND clk = '1' THEN
                                                               q_tmp <= d;
 1   0 transición positiva        0                          END IF;
                                                          END IF;
 1   1 transición positiva        1                     END PROCESS;

 0   - transición positiva        0                   -- buffer
                                                        q <= q_tmp WHEN enable = '1' g
                                                             'Z';
                                                      END areg2;
ENTITY reg2 IS
  PORT(reset, d,clk: IN bit;
       q: OUT bit);
END reg2;

IEC FRANCISCO JAVIER TORRES VALLE                                                                   73
CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES




4.7      CONTADORES                                     LIBRARY ieee;
                                                        USE ieee.std_logic_1164.ALL;
   La finalidad de un contador es computar el           USE ieee.numeric_std.ALL;
número de ocurrencias de un evento que se da en
intervalos aleatorios o uniformes. En los siguientes    ENTITY counter IS
                                                        PORT (clk, load, reset: IN std_logic;
ejemplos se muestran diferentes tipos de                    data: IN unsigned(3 DOWNTO 0);
contadores y la forma más común de describir su             count: BUFFER unsigned(3 DOWNTO 0));
comportamiento con VHDL.                                END counter;

EJEMPLOS                                                ARCHITECTURE archcounter OF counter IS
                                                        BEGIN
LIBRARY ieee;                                             PROCESS(clk, reset, load, count, data)
USE ieee.std_logic_1164.ALL;                              BEGIN
USE ieee.numeric_std.ALL;                                   IF ( clk’event AND clk= '1' ) THEN
                                                               IF reset = '1' THEN
ENTITY counter IS                                                count <= (OTHERS => '0');
  PORT( clk, load: IN std_logic;                               ELSIF load = '1' THEN
       data: IN unsigned(3 DOWNTO 0);                            count <= data;
       count: BUFFER unsigned(3 DOWNTO 0));                    ELSE
END counter;                                                     count <= count + 1;
                                                               END IF;
ARCHITECTURE archcounter OF counter IS                      END IF;
BEGIN                                                     END PROCESS;
  PROCESS( clk, load, count, data )                     END archcounter;
  BEGIN
    IF( clk'event AND clk= '1' ) THEN                      En este ejemplo se describe un contador
       IF load = ’1’ THEN
         count <= data;
                                                        ascendente, con reset síncrono dependiendo de la
       ELSE                                             entrada "reset", además, con capacidad de carga
         count <= count + 1;                            paralela de datos mediante el puerto de control
       END IF;                                          "load". Al igual que el ejemplo anterior, la
    END IF;
  END PROCESS;                                          instrucción IF (clk'event AND clk = '1' ) aparece al
END archcounter;                                        principio e implica que todas las operaciones del
   La instrucción USE ieee.numeric_std.ALL es           contador se ejecuten durante la transición positiva
para incluir el tipo de datos unsigned, así como las    de la señal de reloj "clk". La subsecuente
funciones aritméticas y lógicas que nos permiten        instrucción IF describe la operación de reset
manipular objetos de datos que manejen este tipo.       síncrono durante la transición positiva del reloj. El
En este ejemplo en particular nos interesa la           resto de las operaciones, el conteo y la carga
función "+" definida para ser utilizada con el tipo     paralela, son descritas en las siguientes cláusulas
unsigned y enteros. Ya que el operador "+" en           ELSIF y ELSE dentro de la misma instrucción IF,
VHDL originalmente está definido únicamente             por lo que podemos observar que la operación de
para ser utilizado con enteros. La arquitectura que     reset tiene precedencia sobre las operaciones de
describe     al    contador    utiliza   el    estilo   carga y conteo. Así, si reset no es '1', entonces la
comportamental. En este diseño el contador              operación de conteo depende de la señal "load".
funciona ascendentemente y, además, realiza carga       Como podemos ver las operaciones de carga y
paralela de datos síncronamente con la señal de         conteo son identificas al contador en el ejemplo
reloj dependiendo del valor del puerto de control       anterior.
"load".                                                    Ahora se expone a continuación un contador
   Dentro del proceso, la instrucción IF ( clk’event    con reset asíncrono y con capacidad para salida en
AND clk= ’1’ ) THEN... implica que el                   alta impedancia.
funcionamiento del contador, conteo y carga             LIBRARY ieee;
paralela, tome lugar durante la transición positiva     USE ieee.std_logic_1164.ALL;
de la señal de reloj "clk". La siguiente instrucción    USE ieee.numeric_std.ALL;
IF... THEN... define la operación de conteo o de
                                                        ENTITY cnt_oe IS
carga paralela del circuito dependiendo de la             PORT(clk, reset, oe: IN std_logic;
condición: load = '1'. A continuación se expone un             count_io: INOUT std_logic_vector
contador similar pero con reset síncrono.                               (7 DOWNTO 0));

IEC FRANCISCO JAVIER TORRES VALLE                                                                         74
CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES




END ldcnt;
                                                        1      0       transición positiva descendente
ARCHITECTURE arch_cnt_oe OF cnt_oe IS
  SIGNAL count: std_logic_vector                        0      -                -               0
                  (7 DOWNTO 0);
BEGIN
  PROCESS(clk, reset, count)                          ENITTY counter IS
  BEGIN                                                 PORT(reset: IN bit;
    IF reset = '0' THEN                                      ud: IN bit;
       count <= (OTHERS => '0');                             clk: IN bit;
    ELSIIF ( clk’event AND clk=’1’ ) THEN                    conteo: INOUT integer RANGE 0 TO 15
       count <= count + 1;                                   );
    END IF;                                           END counter;
  END PROCESS;
  count_io <= count WHEN oe = ’1’ ELSE                ARCHITECTURE counter OF counter IS
              (OTHERS => 'Z');                        BEGIN
END arch_cnt_oe;                                        PROCESS(reset,ud,clk)
                                                        BEGIN
                                                          IF reset = '1' THEN
   Este diseño desempeña un contador ascendente              conteo <= 0;
con reset asíncrono. Cuando se cumple la                  ELSIF (clk'event AND clk = '1') THEN
condición: reset = '0', se produce un reset                  IF ud = '1' THEN
asíncrono en el contador. Cuando esta condición                conteo <= conteo + 1;
                                                             ELSE
no se satisface, la operación de conteo funciona               conteo <= conteo - 1;
síncronamente con la señal de reloj "clk". Además,           END IF;
independientemente de las señal de reset, el uso de       END IF;
                                                      END counter;
los buffers de tres estados en los pines de I/O es
posible mediante el uso del puerto de entrada "oe".
Así, cuando se satisface la condición oe = '1', el    CONTADOR NO. 2
conteo es conducido hacia los pines de salida. De
lo contrario presentarán alta impedancia en los                 ENTRADAS                     SALIDAS
pines del circuito. Conceptualmente, el código en
VHDL del contador se implementa de la siguiente        reset up_down          clk             conteo
manera.                                                 1      1       transición positiva ascendente
                                                        1      0       transición positiva descendente
                                                        0      -       transición positiva      0


                                                      ENITTY counter IS
                                                        PORT(reset: IN bit;
                                                             ud: IN bit;
                                                             clk: IN bit;
                   Figura 4.32                               conteo: INOUT integer RANGE 0 TO 15
                                                             );
   A continuación se elabore la descripción en        END counter;
VHDL para los siguientes contadores de cuatro         ARCHITECTURE counter OF counter IS
bits de acuerdo a su tabla de funcionamiento y        BEGIN
posteriormente realice las simulaciones. Elija el       PROCESS(reset,ud,clk)
                                                        BEGIN
dispositivo que más convenga.                             IF (clk'event AND clk = '1') THEN
                                                             IF reset = '1' THEN
CONTADOR NO. 1                                                 conteo <= 0;
                                                             ELSIF ud = '1' THEN
                                                               conteo <= conteo + 1;
             ENTRADAS                SALIDAS                 ELSE
                                                               conteo <= conteo - 1;
 reset up_down           clk           conteo                END IF;
                                                          END IF;
   1       1     transición positiva ascendente       END counter;



IEC FRANCISCO JAVIER TORRES VALLE                                                                      75
CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES




CONTADOR NO. 3                                                               transición     descendente
                                                        1    1      0
                                                                              positiva          9-0
            ENTRADAS                     SALIDAS
                                                        0    1      -            -               0
reset oe up_down               clk         conteo
                                                        0    0      -            -               Z
 1    1         1    transición positiva ascendente
 1    1         0    transición positiva descendente     ** NOTA

 0    1         -               -               0         Aunque se encuentre la salida del circuito en
                                                       alta impedancia, el conteo y reset asíncrono deben
 0    0         -               -            Z         seguir funcionando internamente. En el momento
                                                       de cambio de sentido ascendente/descendente, el
  ** NOTA                                              contador no debe de iniciar la cuenta, por ejemplo:
                                                       si el contador está funcionando ascendentemente y
   Aunque se encuentre la salida del circuito en       se encuentra en el número 5 cuando se cambia a
alta impedancia, el conteo y reset asíncrono deben     descendente, en la siguiente transición positiva se
seguir funcionando internamente.                       debe continuar la cuenta con un 4, después un 3...
                                                       etc.
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;                              LIBRARY ieee;
                                                       USE ieee.std_logic_1164.ALL;
ENITTY counter IS                                      USE ieee.numeric_std.ALL;
  PORT(reset: IN std_logic;
       ud: IN std_logic;                               ENITTY counter IS
       oe: IN std_logic;                                 PORT(reset: IN std_logic;
       clk: IN std_logic;                                     ud: IN std_logic;
       conteo: INOUT unsigned (3 DOWNTO 0)                    oe: IN std_logic;
       );                                                     clk: IN std_logic;
END counter;                                                  conteo: INOUT unsigned (3 DOWNTO 0)
                                                              );
ARCHITECTURE counter OF counter IS                     END counter;
  SIGNAL count_tmp: unsigned(3 DOWNTO 0);
BEGIN                                                  ARCHITECTURE counter OF counter IS
  PROCESS(reset,ud,clk)                                  SIGNAL count_tmp: unsigned(3 DOWNTO 0);
  BEGIN                                                BEGIN
    IF reset = '1' THEN                                  PROCESS(reset,ud,clk)
         count_tmp <= (OTHERS => '0');                   BEGIN
    ELSIF (clk'event AND clk = '1') THEN                   IF reset = '1' THEN
       IF ud = '1' THEN                                         count_tmp <= (OTHERS => '0');
         count_tmp <= count_tmp + 1;                       ELSIF (clk'event AND clk = '1') THEN
       ELSE                                                   IF ud = '1' THEN
         count_tmp <= count_tmp - 1;                            count_tmp <= count_tmp + 1;
       END IF;                                                  IF count_tmp = 9 THEN
    END IF;                                                       count_tmp <= (OTHERS => '0');
                                                                END IF;
-- instanciación de los buffers                               ELSIF ud = '0' THEN
  conteo <= count_tmp WHEN oe = '1' ELSE                        count_tmp <= count_tmp - 1;
             (OTHERS 'Z');                                      IF count_tmp = 0 THEN
END counter;                                                         count_tmp <= "1001";
                                                                END IF;
                                                              END IF;
CONTADOR NO. 4                                             END IF;

                                                       -- instanciación de los buffers
          ENTRADAS                   SALIDAS             conteo <= count_tmp WHEN oe = '1' ELSE
                                                                    (OTHERS 'Z');
reset oe up_down         clk           conteo          END counter;

                      transición     ascendente
 1    1     1
                       positiva          0-9


IEC FRANCISCO JAVIER TORRES VALLE                                                                      76
CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES




4.8        ALU DE CUATRO BITS                            solamente con un bit, y en la entidad TOP se
                                                         realiza la interconexión de cuatr de estos módulos
   Realice la descripción en VHDL para la                para formar la ALU de cuatro bits.
siguiente unidad aritmético - lógica de acuerdo a
                                                         ENTIDAD TOP
la tabla de funcionamiento utilizando un 22V10. El
circuito consta de 2 bus de entrada "a" y "b", de 4      LIBRARY ieee;
bits cada uno y mediante el bus "s", de 3 bits, se       USE ieee.std_logic_1164.ALL;
selecciona la operación a realizar en la ALU.            USE work.modulo_alu.ALL;
Dicha operación se realiza combinacionalmente y
                                                         ENTITY alu IS
en el momento que ocurre una transición positiva           PORT(a: IN std_logic_vector(3 DOWNTO 0);
en la señal de reloj el resultado de dicha operación            b: IN std_logic_vector(3 DOWNTO 0);
se registra en los flip-flop's tipo D del 22V10.                cin: IN std_logic ;
Además, la salida registrada será conducida hacia               clk: IN std_logic ;
                                                                reset: IN std_logic ;
los pines de salida (I/O pads) únicamente cuando                oe: IN std_logic ;
se habiliten los buffers de tres estados mediante la            s: IN std_logic_vector(2 DOWNTO 0);
entrada de control "oe", de lo contrario deberán                cout: OUT std_logic;
                                                           output: OUT std_logic_vector(3 DOWNTO 0)
encontrarse en alta impedancia.                            );
                                                         END alu ;
           ENTRADAS                   SALIDAS
                                                         ARCHITECTURE a_alu OF alu IS
s(2) s(1) s(0)          clk    oe output      cout         SIGNAL c2, c3, c4: std_logic;
                                                           SIGNAL salida_r: std_logic_vector
                  transición       a AND                                     (3 DOWNTO 0);
 0     0     0                 0                0
                   positiva           b                    ATTRIBUTE synthesis_off OF c2, c3, c4:
                                                                                    SIGNAL IS true;
                  transición                             BEGIN
 0     0     1                 0 a OR b         0
                   positiva                                x0: modulo PORT MAP(a(0), b(0), cin,
                                                                  clk, reset, s, c2, salida_r(0));
                  transición       a XOR
 0     1     0                 0                0
                   positiva           b                    x1: modulo PORT MAP(a(1), b(1), c2, clk,
                                                                    reset, s, c3, salida_r(1));
                  transición
 0     1     1                 0 NOT a          0
                   positiva                                x2: modulo PORT MAP(a(2), b(2), c3, clk,
                                                                      reset, s, c4, salida_r(2));
                  transición                               x3: modulo PORT MAP(a(3), b(3), c4, clk,
 1     0     0                 0   a+0          0
                   positiva                                         reset, s, cout, salida_r(3));

                  transición                acarreo de   -- instanciación de los biffers
 1     0     1                 0   a+b
                   positiva                  la suma       output <= (OTHERS=>'Z') WHEN oe='1' ELSE
                                                                      salida_r;
                  transición                acarreo de   END a_alu;
 1     1     0                 0   a + b'
                   positiva                  la suma
                  transición                             MÓDULO
 1     1     1                 0   a-1          0        LIBRARY ieee ;
                   positiva                              USE ieee.std_logic_1164.ALL;
 -     -      -          -     1     Z          0
                                                         ENTITY modulo IS
                                                           PORT (in1: IN std_logic;
                                                           in2: IN std_logic;
     ** NOTA                                               cin: IN std_logic;
                                                           clk: IN std_logic;
           b' = NOT b                                      reset: IN std_logic;
                                                           selec: IN std_logic_vector(2 DOWNTO 0);
                                                           cout: OUT std_logic ;
4.8.1 DESCRIPCIÓN ESTRUCTURAL                              salida_r: INOUT std_logic);
                                                         END modulo;
   La descripción se realiza utilizando tres
archivos, los cuales contienen: la entidad TOP, el       ARCHITECTURE a_modulo OF modulo IS
                                                           SIGNAL salida_comb: std_logic ;
módulo y el paquete respectivamente. El módulo           BEGIN
realiza todas las operaciones dela ALU pero                PROCESS(in2, in1, selec, cin)


IEC FRANCISCO JAVIER TORRES VALLE                                                                       77
Circuitos
Circuitos
Circuitos
Circuitos
Circuitos
Circuitos

Weitere ähnliche Inhalte

Ähnlich wie Circuitos

Primera aplicación de Android
Primera aplicación de AndroidPrimera aplicación de Android
Primera aplicación de Androidspartha187
 
Manual Instalación JLex & CUP
Manual Instalación JLex & CUPManual Instalación JLex & CUP
Manual Instalación JLex & CUPrubeniii
 
1 Antecedentes C++
1 Antecedentes C++1 Antecedentes C++
1 Antecedentes C++UVM
 
Manual de netbeans_7(2)(2)(2)
Manual de netbeans_7(2)(2)(2)Manual de netbeans_7(2)(2)(2)
Manual de netbeans_7(2)(2)(2)javier_ot99
 
USO DE HERRAMIENTAS IDE VISUAL C++
USO DE HERRAMIENTAS IDE VISUAL C++USO DE HERRAMIENTAS IDE VISUAL C++
USO DE HERRAMIENTAS IDE VISUAL C++Luz Fa Calderòn
 
Inf 1 (instalación de visual studio code)
Inf 1 (instalación de visual studio code) Inf 1 (instalación de visual studio code)
Inf 1 (instalación de visual studio code) Carlos Guzmán
 
Manual_java.pdf
Manual_java.pdfManual_java.pdf
Manual_java.pdfAnaLpez275
 
Gestionar mis proyectos con ayuda de CodeIgniter
Gestionar mis proyectos con ayuda de CodeIgniterGestionar mis proyectos con ayuda de CodeIgniter
Gestionar mis proyectos con ayuda de CodeIgniterandrewzg
 
Curso Moodle v1.9 Agregar Recursos
Curso Moodle v1.9 Agregar RecursosCurso Moodle v1.9 Agregar Recursos
Curso Moodle v1.9 Agregar Recursosjoseluisgil
 
Tutorial de eclipse_terminado
Tutorial de eclipse_terminadoTutorial de eclipse_terminado
Tutorial de eclipse_terminadoAixa Rodriguez
 
Tutorial 1 programas de consola con net beans 5
Tutorial 1   programas de consola con net beans 5Tutorial 1   programas de consola con net beans 5
Tutorial 1 programas de consola con net beans 5cardoso_rca
 
Entorno de visual foxpro
Entorno de visual foxproEntorno de visual foxpro
Entorno de visual foxproxxvackerdark95
 
Actividades tema 12
Actividades tema 12Actividades tema 12
Actividades tema 12mariavarey
 
Dreamweaver - Fichas de Aprendizaje 2014
Dreamweaver - Fichas de Aprendizaje 2014Dreamweaver - Fichas de Aprendizaje 2014
Dreamweaver - Fichas de Aprendizaje 2014jorgequiat
 

Ähnlich wie Circuitos (20)

Primera aplicación de Android
Primera aplicación de AndroidPrimera aplicación de Android
Primera aplicación de Android
 
Proyecto netbeans (1)
Proyecto netbeans (1)Proyecto netbeans (1)
Proyecto netbeans (1)
 
Manual Instalación JLex & CUP
Manual Instalación JLex & CUPManual Instalación JLex & CUP
Manual Instalación JLex & CUP
 
Presentación1
Presentación1Presentación1
Presentación1
 
Presentación1
Presentación1Presentación1
Presentación1
 
1 Antecedentes C++
1 Antecedentes C++1 Antecedentes C++
1 Antecedentes C++
 
Manual de netbeans_7(2)(2)(2)
Manual de netbeans_7(2)(2)(2)Manual de netbeans_7(2)(2)(2)
Manual de netbeans_7(2)(2)(2)
 
USO DE HERRAMIENTAS IDE VISUAL C++
USO DE HERRAMIENTAS IDE VISUAL C++USO DE HERRAMIENTAS IDE VISUAL C++
USO DE HERRAMIENTAS IDE VISUAL C++
 
Inf 1 (instalación de visual studio code)
Inf 1 (instalación de visual studio code) Inf 1 (instalación de visual studio code)
Inf 1 (instalación de visual studio code)
 
Manual_java.pdf
Manual_java.pdfManual_java.pdf
Manual_java.pdf
 
eclipse
eclipseeclipse
eclipse
 
Gestionar mis proyectos con ayuda de CodeIgniter
Gestionar mis proyectos con ayuda de CodeIgniterGestionar mis proyectos con ayuda de CodeIgniter
Gestionar mis proyectos con ayuda de CodeIgniter
 
Curso Moodle v1.9 Agregar Recursos
Curso Moodle v1.9 Agregar RecursosCurso Moodle v1.9 Agregar Recursos
Curso Moodle v1.9 Agregar Recursos
 
Tutorial de eclipse_terminado
Tutorial de eclipse_terminadoTutorial de eclipse_terminado
Tutorial de eclipse_terminado
 
Tutorial 1 programas de consola con net beans 5
Tutorial 1   programas de consola con net beans 5Tutorial 1   programas de consola con net beans 5
Tutorial 1 programas de consola con net beans 5
 
Entorno de visual foxpro
Entorno de visual foxproEntorno de visual foxpro
Entorno de visual foxpro
 
Tutorial exelearning
Tutorial  exelearningTutorial  exelearning
Tutorial exelearning
 
Actividades tema 12
Actividades tema 12Actividades tema 12
Actividades tema 12
 
Dreamweaver - Fichas de Aprendizaje 2014
Dreamweaver - Fichas de Aprendizaje 2014Dreamweaver - Fichas de Aprendizaje 2014
Dreamweaver - Fichas de Aprendizaje 2014
 
Ejecutables en net beans
Ejecutables en net beansEjecutables en net beans
Ejecutables en net beans
 

Mehr von Maury Johe Castillo Melgarejo (8)

Redes informe pizarrasinteractivas_250506
Redes informe pizarrasinteractivas_250506Redes informe pizarrasinteractivas_250506
Redes informe pizarrasinteractivas_250506
 
Matematica basica
Matematica basicaMatematica basica
Matematica basica
 
Control de motor (eje flexible)
Control de motor (eje flexible)Control de motor (eje flexible)
Control de motor (eje flexible)
 
Control de motor (eje flexible)
Control de motor (eje flexible)Control de motor (eje flexible)
Control de motor (eje flexible)
 
Circuitos
CircuitosCircuitos
Circuitos
 
Rectas y-planos-en-el-espacio-u
Rectas y-planos-en-el-espacio-uRectas y-planos-en-el-espacio-u
Rectas y-planos-en-el-espacio-u
 
Rectas y-planos-en-el-espacio-u
Rectas y-planos-en-el-espacio-uRectas y-planos-en-el-espacio-u
Rectas y-planos-en-el-espacio-u
 
Rectas y-planos-en-el-espacio-u
Rectas y-planos-en-el-espacio-uRectas y-planos-en-el-espacio-u
Rectas y-planos-en-el-espacio-u
 

Circuitos

  • 1. CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES IV DESCRIPCIÓN DE CIRCUITOS DIGITALES IEC FRANCISCO JAVIER TORRES VALLE 54
  • 2. CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES 4.1 PROYECTOS EN WARP 5.0 Figura 4.2 El objetivo de este capítulo es enseñarte a crear 3. Posteriormente debe aparecer un cuadro de proyectos en VHDL utilizando Warp de Cypress dialogo como el que se muestra a continuación. Semiconductors. Así como diferentes métodos Para crear un proyecto con el que quieres prácticos para la síntesis de los circuitos digitales programar un dispositivo debes de seleccionar la más comunes. segunda opción (Project [Target - Device]). PROCEDIMIENTO 1. Una vez en Windows haz click en el botón de inicio, selecciona Programas > Warp R5.0 > Galaxy. 4. Cuando selecciones la opción de Project [Target - Device] aparecerá una ventana que te pide que pongas un nombre a tu proyecto, escribe el nombre de nuevo. En el segundo cuadro de texto te pide que especifiques el directorio en donde debe de guardar tu proyecto, puedes hacer un directorio nuevo desde esa misma ventana con solo escribir el nombre, por ejemplo c:nuevo, o puedes buscar una carpeta ya existente con la opción Browse. Cuando hayas terminado de especificar los nombres haz click en el botón de Siguiente. Figura 4.1 2. Cuando te encuentres dentro del Galaxy, selecciona File > New. Figura 4.3 5. Aparecerá una ventana con título Add Files to Project, esta ventana se usa cuando ya tienes archivos que quieres agregar a tu proyecto, pero en esta ocasión por tratarse de un proyecto totalmente nuevo no es necesario especificar nada dentro de esta ventana. Solo haz click en el botón de Siguiente. IEC FRANCISCO JAVIER TORRES VALLE 55
  • 3. CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES 7. Luego de lo anterior, aparecerá una ventana que te pregunta si deseas guardar tu nuevo proyecto, solo haz click en Sí. 8. Ahora ya tienes un nuevo proyecto donde se encuentra suficiente información para que el compilador te genere el archivo .jed. Pero te falta agregar el código que habrá de compilarse. Selecciona File > New > Text File, o puedes hacer click en el icono de nuevo. Escribe lo siguiente dentro del archivo de texto: library ieee; Elige File > Save As y en la opción de Guardar en, selecciona el nombre de la carpeta que usaste Figura 4.4 en el paso número 4 (c:nuevo). Una vez que hayas 6. La siguiente ventana lleva el título de Select seleccionado el directorio, escribe el nombre de Target Device, esta ventana es muy importante ya archivo, se sugiere el nombre nuevo, con la que es aquí donde debes de especificar el PLD en extensión .vhd, ya que de esta manera se especifica el que vas a trabajar. Los PLD's que se usan un archivo que contiene un código en VHDL. cuando se está aprendiendo son los pequeños Luego de hacer esto, guarda tu archivo. (generalmente 16V8, 22V8 ó 22V10), estos PLD's 9. Cierra el archivo de texto. están en la ventana como SPLD. Haz doble click sobre este texto, te aparecerá una lista de los 10. Selecciona Project > Add Files, te aparecerá SPLD's más comunes, selecciona el SPLD que te una ventana que debe de tener tu archivo interese y nuevamente aparecerá una lista donde nuevo.vhd , haz click en Add, y posteriormente en hay varios tipos del mismo SPLD, por ejemplo OK. PALCE16V8-10PC/PI. Esta parte es importante, ya que debes de seleccionar un SPLD que tenga un encapsulado de tipo PDIP, para que lo puedas montar en tu protoboard. En la parte inferior aparece información sobre el SPLD que te interese. Cuando escojas el SPLD adecuado haz click en Finalizar. Figura 4.6 11. Tu archivo de texto se ha convertido en un archivo de VHDL y está dentro de tu proyecto, todo lo que programes, será compilado en el dispositivo que especificaste. En tu ventana de proyecto (si no se encuentra abierta, la puedes activar haciendo View > Project Window) debe de aparecer un icono en forma de hoja que tiene el nombre de tu proyecto. Haz click en esta hoja y te Figura 4.5 debe de aparecer un archivo con la instrucción: library ieee; solo que ahora la palabra library está IEC FRANCISCO JAVIER TORRES VALLE 56
  • 4. CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES en color azul porque es una palabra reservada. Esto 1. Una vez que se ha creado un nuevo proyecto demuestra que haz hecho correctamente el en Galaxy, dentro del menú Project selecciona procedimiento. Compiler Options. Figura 4.7 12. Si la configuración de colores es la normal, Figura 4.8 notarás que todas las palabras reservadas se muestran en color azul y los comentarios en color 2. Lo anterior abrirá la ventana de opciones de rojo. Ahora ya puedes comenzar a hacer tu compilación, dentro de esta se encuentra una descripción en VHDL. sección para elegir el formato de los retardos para simular el circuito Simulation—Timing Model. Aquí es donde debes de seleccionar el formato 4.2 SIMULACIÓN DE 1164/VHDL. PROYECTOS Active - HDL de la empresa Aldec Inc. es un simulador que utiliza un archivo de post - síntesis creado por WARP. Éste es un archivo .vhd con los retardos de tiempo del código sintetizado en el dispositivo seleccionado. Este tema tiene por objetivo dar una pequeña introducción a este simulador de VHDL en las siguientes tres secciones. 1. Formato de simulación 1164/VHDL. 2. Simulación. 3. Tipos de señales de estimulación. FORMATO DE SIMULACIÓN 1164/VHDL El archivo de entrada para Active - HDL es un modelo de simulación post - síntesis generado Figura 4.9 cuando se compila un archivo .vhd en el dispositivo elegido. En WARP es posible crear 3. Asegúrate que se encuentre habilitado el archivos con diferentes formatos para simulación cuadro de Enable Testbench Output. post - síntesis. Active - HDL requiere de un archivo con el formato de simulación IEEE - 1164 / VHDL. 4.2.1 PROCESO DE SIMULACIÓN Para crear este archivo post - síntesis debes El proceso de simulación lo podemos resumir en seguir el siguiente procedimiento. los siguientes siete pasos. IEC FRANCISCO JAVIER TORRES VALLE 57
  • 5. CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES 1. Cargar un archivo con el formato de 2. - INICIACIÓN DE LA SIMULACIÓN simulación 1164/VHDL. Para iniciar la simulación, activa el simulador utilizando la opción Initialize Simulation, dentro 2. Iniciación de la simulación. del menú Simulation. Después abre una ventana 3. Agregar señales. para el análisis de señales Waveform Window, si es que no se encontrara ya una abierta.. Para crear 4. Asignar señales de estimulación. una nueva ventana de este tipo, haz clic en el icono 5. Correr la simulación. dentro de la barra estándar de trabajo o selecciona File > New Waveform.. 6. Observación de la simulación. 3. - AGREGANDO SEÑALES 7. Guarda la simulación. El siguiente paso es agregar señales a la ventana 1. - CARGA DEL ARCHIVO de análisis, para esto selecciona Add Signals...en el menú Waveform. La ventana para agregar señales El primer paso es abrir el programa Active-HDL aparecerá con una lista de todas las señales de Sim que normalmente se encuentra en Menu Inicio entrada, salida, entrada/salida y nodos internos de > Programas > Warp > Active-HDL Sim. Para conexión disponibles en el diseño. Para agregar cargar el archivo selecciona Open Vhdl dentro del alguna de las señales que se encuentran en esta Menú File. lista basta con hacer doble clic sobre el nombre de la señal. Si deseas agregar varias señales al mismo tiempo, puedes seleccionarlas mediante la tecla control y haciendo clic sobre cada señal que deseas agregar para después hacer clic sobre el botón Add que se encuentra en la parte inferior de la ventana. Figura 4.10 Es importante mencionar que el archivo con el Figura 4.11 formato 1164/VHDL se crea en el subdirectorio vhd dentro del directorio de trabajo del proyecto 4. - TIPOS DE SEÑALES DE ESTIMULACIÓN una vez que éste es compilado. Si se selecciona por accidente el archivo .vhd creado por el usuario, el Las señales de estimulación son utilizadas para compilador del programa generará varios errores y definir diferentes impulsos a los puertos de entrada no podrá ser simulado. Una vez que el archivo del diseño que esta siendo simulado. Para apropiado es cargado, se desplegarán una serie de seleccionar alguno de estos tipos primero mensajes dentro de la ventana de compilación. selecciona la señal y después selecciona Waveform Uno de los mensaje que debería aparecer cuando el > Stimulators..., a continuación se describe archivo es compilado correctamente es el brevemente los diferentes tipos de señales de siguiente: estimulación de Active-HDL Sim. -- Compile success 0 Errors 0 Warnings Analysis time: 3.0 [s]. IEC FRANCISCO JAVIER TORRES VALLE 58
  • 6. CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES VALOR Con este tipo de estimulador asignamos un valor constante a la señal especificada. HOTKEY Con este estimulador podemos estar cambiando el valor de la señal presionando una tecla. Cuando asignamos este tipo de estimulador es conveniente asignar una lista de valores. Cada que presionemos la tecla asignada, estaremos cambiando entre los valores de esta lista. Para una descripción más completa de las Figura 4.12 características del simulador consulta la ayuda del programa. CLOCK 5. - CORRIENDO LA SIMULACIÓN Sirve para definir señales de reloj definidas con los siguientes parámetros: frecuencia, valor inicial, Para correr la simulación selecciona Simulation ciclo de trabajo y tiempo de inicio. > Run. La simulación se detendrá después que la duración especificada haya sido terminada. En este CUSTOM momento las señales de estimulación para los Un estimulador personalizado se crea editando puertos de entrada pueden ser alterados y los valores deseados en la ventana de simulación. producirán efectos sobre la simulación cuando esta Estado en el modo de edición, al estimulador de continué. Para volver a iniciar la simulación entrada se le puede asignar un estado bajo o un selecciona Simulation > Restart Simulation. estado alto presionando '1' o '0' respectivamente. 6. - OBSERVANDO LA SIMULACIÓN FORMULA Varias propiedades pueden ser manipuladas Un estimulador del tipo formula produce una para mejorar la apariencia de la simulación. A señal definida por una simple sintaxis. La señal es continuación se describen brevemente algunas de definida con secuencias pares de valor - tiempo. estas propiedades. Con la componente tiempo indicamos el momento BUS en el que la señal asume el valor especificado. La unidad del tiempo es en picosegundos. Para repetir La líneas individuales que forman un bus durante un periodo especificado, se agrega el pueden ser mostradas y editadas. Para mostrarlas modificador -r. La sintaxis del estimulador tipo haz clic sobre "+" que se encuentra a junto al formula se muestra a continuación. nombre el bus. Las señales de estimulación pueden ser asignadas a cada línea del bus o al bus <valor> <tiempo> [,<valor> <tiempo>, completo. <valor> <tiempo>, ...] [ -r <periodo>] COLOR EJEMPLO Las señales de la simulación pueden ser de '0000' 0 ps, '1111' 100000 ps, '0011' diferentes colores para una mejor claridad cuando 200000 ps -r 300000 varias señales son desplegadas. Para agregar color a todas las señales visibles, selecciona Waveform > PREDEFINIDOS Colorize Waveforms, esto asignará diferentes colores, arbitrariamente a cada señal dentro de la Los estimuladores predefinidos son una serie de ventana de simulación. Para asignar color a cada señales tipo clock con diferentes frecuencias o señal, haz clic con el boton derecho sobre el señales del tipo formula que pueden ser asignados nombre de la señal y selecciona la opción a las señales. Para agregar un nuevo estimulador a Properties.. esta lista, lo puedes hacer en la misma ventana dentro del cuadro Predefined. IEC FRANCISCO JAVIER TORRES VALLE 59
  • 7. CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES ZOOM ventas de simulación abiertas. La extensión de los archivos de simulación en Active-HDL Sim es Para aumentar o reducir la escala de tiempo de .awf. la simulación, selecciona View > Zoom > In/Out/Full. 4.3 COMPARADORES BOOKMARKS Para colocar marcas sobre la ventana de El objetivo de este tema es crear, sintetizar, y simulación primero selecciona Waveform > Select simular la descripción de circuitos comparadores Mode. Cuando este modo se encuentra de magnitud utilizando WARP. seleccionado, es posible colocar marcas sobre PROCEDIMIENTO diferentes puntos de la simulación para una rápida referencia a ciertos puntos importantes de la 1. Primero crearemos un proyecto para el misma. Para colocarlas primero haz clic con el ejemplo del comparador visto en el tema 3.1.2 botón izquierdo en donde deseas colocar una Antes que nada debemos crear el proyecto dentro marca, después selecciona Search > Toggle de un directorio en el que se encontrarán todos los Bookmark. Utilizando Next/Previous Bookmark archivos del proyecto (.pfg, .vhd, .jed, .rpt, etc. ). del mismo menú puedes cambiar entre una marca y Se sugiere crear primero una carpeta para todos los otra dentro de la simulación. Las marcas son proyectos VHDL y dentro de esa carpeta crear otra desplegadas como un triángulo azul sobre la escala carpeta para el presente proyecto, por ejemplo de tiempo en la ventana de simulación. Para c:vhdl_projcomparador_1, con el nombre eliminar alguna marca selecciona Waveform > Edit comparador_1. 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 Figura 4.13 etiqueta no es mostrada o no se ve completa, amplia el alto de la fila haciendo clic con el botón 2. Seleccionaremos un 22V10 con empaquetado derecho sobre alguna de las señales que tipo DIP para sintetizar el código. intervienen en la medición y después selecciona 3. Ahora creamos un nuevo archivo de texto Properties, dentro de la venta de propiedades para editar el código (File > New > Text File). aumenta la altura modificando el valor del cuadro Este archivo debe ser guardado con extensión .vhd de texto Height. Para eliminar alguna etiqueta de y en la misma carpeta del proyecto. Se sugiere medición selecciona Waveform > Edit Mode, guardarlo como: después seleciona la etiqueta y presiona suprimir c:vhdl_projcomparador_1comparador1.vhd 7. - GUARDANDO LA SIMULACIÓN 4. A continuación se muestra la tabla de Existen dos formas de guardar la simulación. funcionamiento de este comparador y basándose Guardar solamente la simulación de la ventana en ella haremos el código de descripción en activa o guardar todas las simulaciones de las VHDL. Primero utilizaremos el estilo de IEC FRANCISCO JAVIER TORRES VALLE 60
  • 8. CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES descripción de flujo de datos, que es el mismo que a agregarlo al presente proyecto. Para agregarlo lo se utilizó cuando se expuso el ejemplo en el tema hacemos desde el menú Project y dentro de éste 3.1.2. hacemos clic en Add Files... (Project > Add Files...). Una vez que aparece la ventana para TABLA DE FUNCIONAMIENTO agregar archivos al proyecto, seleccionamos el archivo comprador_1.vhd y presionamos el botón "Add". ENTRADAS SALIDAS Si por error hacemos clic en la opción Add All x<y x_men_y '1' Files, todos los archivos .vhd dentro de la carpeta x<y equals '0' del proyecto se agregaran al mismo. En este caso el único archivo .vhd que debería estar dentro de la x<y x_may_y '0' carpeta del proyecto es comparador_1.vhd, lo cual x=y x_men_y '0' en esta ocasión no nos afectará. En caso de que hubiera más de un archivo .vhd y no deseamos x=y equals '1' tenerlo dentro del proyecto basta con seleccionarlo x=y x_may_y '0' en la ventana de proyecto y presionar la tecla suprimir, o también desde Project > Remove x>y x_men_y '0' Selected Source File(s). Si la ventana de proyecto x>y equals '0' no está visible entonces seleccionamos View > x>y x_may_y '1' Reset Docking Windows. 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 Figura 4.14 '0'; x_may_y <= '1' WHEN x > y ELSE 7. Una vez editado y agregado el archivo al '0'; x_men_y <= '1' WHEN x < y ELSE proyecto se procede a sintetizar el código en el '0'; 22V10. Seleccionamos Compile > Project o END comparador; también lo podemos hacer presionado el icono de compilación. 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 Figura 4.15 declaración de puertos no lleva ; Si el archivo tiene errores, estos aparecerán en Una vez que se terminó de editar el código, la ventana de salida (Output Window). Dentro de procedemos a guardar los cambios en el archivo y "Errors & Warnings" en la ventana de salida se IEC FRANCISCO JAVIER TORRES VALLE 61
  • 9. CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES muestra una lista completa de los errores así como las ecuaciones que resultaron durante el proceso de una descripción de cada error. Para acceder síntesis, la asignación de pines, y un informe de rápidamente a la línea en la cual ocurrió el error, utilización del dispositivo. En ocasiones es basta con hacer doble clic sobre el error e complicado realizar algunas descripciones y, inmediatamente el programa se colocará sobre la aunque el código se sintetiza, durante la línea en donde se encuentra dicho error. Los simulación hace algo diferente a lo que errores pueden ser algunos de los siguientes: omitir esperábamos. La función del sintetizador, en este algún punto y coma, no escribir correctamente caso WARP, es la de interpretar nuestra algún identificador, sintaxis incorrecta de las descripción en VHDL para generar la lógica de instrucciones utilizadas, o uso incorrecto de los salida. En estos casos posiblemente la descripción operadores. Recordemos que VHDL es un no corresponde exactamente a lo que queremos. lenguaje en el que los tipos de datos son Para corregir la descripción es útil consultar las sumamente importantes y no se pueden mezclar a ecuaciones, ya que en estas nos podemos dar menos que se utilicen las librerías adecuadas. cuenta que es lo que estamos describiendo realmente. En temas posteriores se presentan 8. La ventana de proyecto tiene 3 modos o algunos ejemplos en los que se exponen con más vistas: "Source Files View", "Hierarchy View", y detalle este tipo de problemas. "Output Files View". En la primera se muestran los archivos que se han agregado al proyecto. La SIMULACIÓN "Vista de Jerarquía" es útil cuando se hacen 9. Ahora que ya hemos logrado sintetizar el diseños jerárquicos, ya que en esta se muestra cual código y obtenido los archivos .jed y .vhd de es el orden de importancia que hay entre ellos. postsíntesis procedemos a simular la descripción. Dentro de la "Vista de Archivos de Salida" Las simulaciones las haremos en Active-HDL Sim aparecen los archivos que se generaron durante la como se explicó en tema 4.2. Podemos abrir el compilación, los cuales fueron creados dentro de la programa desde Galaxy desde Tools > Active-HDL carpeta del proyecto. Tales archivos de salida son: Sim. .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.17 10. Una vez iniciado el simulador, ahora abrimos el archivo .vhd de postsíntesis como se explica a continuación. Primero seleccionamos File > Open VHDL. Figura 4.16 En el archivo .rpt se muestra un informe de los resultados de la compilación. En éste se encuentran IEC FRANCISCO JAVIER TORRES VALLE 62
  • 10. CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES Figura 4.18 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 Para después abrir el archivo .vhd de postsíntesis, el cual debería estar (si seguiste correctamente todos los pasos) en el subdirectorio: Y al bus "y" también le asignaremos un c:vhdl_projcomparador_1vhdcomparador1. estimulador del mismo tipo con la siguiente vhd 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 Figura 4.19 que se detenga en un momento especifico, o adelantar la simulación solamente por algún 11. Hecho lo anterior ahora agregamos las tiempo. Para correr la simulación completamente señales y/o puertos que deseamos simular. seleccionamos Simulation > Run. Si queremos Seleccionamos Waveform > Add Signals... 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 Figura 4.20 Si deseas utilizar Run For cerciórate que el tiempo de "paso" sea de 1 us. Ya que cuando Ahora seleccionamos los puertos como se asignamos los estimuladores el valor de los buses explicó en el tema 4.2. En este ejercicio de entrada cambia cada 1 us. Si deseas utilizar Run seleccionaremos solamente los puertos declarados Until... bastara con especificar un tiempo de 32 us en la entidad, tal y como se muestra en la figura para observar como se comporta el ciclo de 4.22 asignaciones que especificamos mediante la 12. Lo siguiente es asignar señales de estimulo a formula, el tiempo mínimo para comprobar todos los puertos de entrada. Al bus "x" le asignaremos los valores (por lo menos un ciclo) es de 16 us. un estimulador tipo formula usando la siguiente 15. A continuación en la figura 4.23 se muestran formula. los resultados de la simulación. Si seguiste correctamente todos los pasos deberías obtener 0000 0 ns, 0001 1 us, 0010 2 us, 0011 3 us, 0100 4 us, 0101 5 us, 0110 6 us, 0111 algo similar a lo mostrado en la siguiente figura. IEC FRANCISCO JAVIER TORRES VALLE 63
  • 11. CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES Figura 4.22 Figura 4.23 Figura 4.24 IEC FRANCISCO JAVIER TORRES VALLE 64
  • 12. CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES 4.4 MULTIPLEXORES descripción de circuitos digitales utilizando WARP. De esta librería se llamó el paquete En este tema el objetivo es elaborar std_arith, el cual contiene muchas funciones que descripciones de circuitos multiplexores utilizando facilitan el uso de vectores tipo std_logic con los tres estilos de descripción de VHDL. enteros. De no haber utilizado este paquete no podríamos hacer ninguna de la comparaciones que PROCEDIMIENTO están en la asignación condicional WHEN... ELSE. Es decir, no es posible hacer la comparación "selec Para la síntesis utilizaremos un 22V10 siguiendo = 3" porque "selec" es del tipo std_logic_vector y la siguiente tabla de funcionamiento en los tres "3" es un número entero. El paquete estilos de descripción. std_logic_1164 contiene los tipos de datos std_logic y std_logic_vector que comúnmente TABLA DE FUNCIONAMIENTO utilizamos por lo que es necesario cargar el paquete para poder utilizar estos tipos, sin embargo, no contiene funciones de comparación selec salida entre tipos std_logic (o arreglos de este) y enteros. 00 a Como la librería es de propia del sintetizador, es decir, que siempre esta cargada dentro del área de 01 b trabajo del proyecto o "work", podemos llamar el 10 c paquete como se muestra a continuación. 11 d USE work.std_arith.ALL; SIMULACIÓN 4.4.1 DESCRIPCIÓN DE FLUJO DE DATOS Para la simulación se sugiere que asignes un estimulador tipo formula a los vectores de entrada, LIBRARY ieee; y al vector "selec" le asignes un estimulador tipo USE ieee.std_logic_1164.ALL; "HOTKEY". Una vez que agregaste las señales a LIBRARY cypress; la simulación, selecciona con el puntero el vector USE cypress.std_arith.ALL ; "selec", después seleccionas Waveform > ENTITY multiplexor IS Stimulators..., cuando aparezca el cuadro de PORT(a, b, c, d: IN std_logic_vector estimuladores selecciona "HOTKEY" dentro de (3 DOWNTO 0); "Stimulator type", y en "Press new hotkey" escribe selec: IN std_logic_vector la letra "s" o cualquier otra. (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 Figura 4.25 std_logic). Como habrás notado se hizo el llamado a una librería no mencionada anteriormente, la Cada que presiones la tecla "s" el vector s estará librería "cypress". Esta librería es de Cypress cambiando de valor, por omisión la lista de valores Semiconductors y fue desarrollada para facilitar la de asignación incluye el '0' y el '1' solamente, en IEC FRANCISCO JAVIER TORRES VALLE 65
  • 13. CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES 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. 4.4.2 DESCRIPCIÓN COMPORTAMENTAL LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE work.std_arith.ALL; ENTITY multiplexor IS Figura 4.26 PORT(a: std_logic_vector (3 DOWNTO 0); Ahora puedes correr la simulación poco a poco b: std_logic_vector (3 DOWNTO 0); utilizando Simulation > Run For, o presionando la c: std_logic_vector tecla "F5". Y cada que lo desees presionas la tecla (3 DOWNTO 0); "s" para cambiar el valor del vector "selec". En la d: std_logic_vector figura 4.24 se muestran los resultados de la (3 DOWNTO 0); selec: std_logic_vector simulación. (1 DOWNTO 0); salida: OUT std_logic_vector (3 DOWNTO 0)); A continuación se muestran las ecuaciones END multiplexor; obtenidas utilizando el estilo de descripción de flujo de datos. Estas ecuaciones deben ser las ARCHITECTURE behavorial OF multiplexor IS mismas para cualquier estilo que utilicemos, ya BEGIN PROCESS(selec, a, b, c, d) que estamos describiendo el mismo multiplexor VARIABLE selec_int: integer; sólo que de manera diferente y esto no implica que BEGIN las ecuaciones vayan a ser distintas. Cuando selec_int := to_integer(selec); compiles este multiplexor, en cualquiera de los tres CASE selec_int IS WHEN 0 => estilos, consulta las ecuaciones dentro del archivo salida <= a ; .rpt y verifica que sean iguales. WHEN 1 => salida <= b ; WHEN 2 => salida <= c ; WHEN 3 => salida <= d ; WHEN OTHERS => NULL; END CASE; END PROCESS; END behavorial; IEC FRANCISCO JAVIER TORRES VALLE 66
  • 14. CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES Dentro del proceso se hace uso de un objeto de datos del tipo variable declarado como entero. Al inicio del proceso se hace la asignación "selec_int <= to_integer ( selec ) ;", esto es para poder usar enteros en la instrucción CASE, de otra manera tendríamos que indicar todos los casos utilizando los valores naturales de un vector, es decir, "00", "01", "10", y "11" para este ejemplo. Esto es solamente para facilitar la descripción y no significa que obtengamos una mejor síntesis del código en el dispositivo. Es necesario que "selec_int" sea una variable para que se le asigne Figura 4.27 inmediatamente el valor actual del vector "selec" y estemos describiendo el correctamente el 4.4.3 DESCRIPCIÓN ESTRUCTURAL funcionamiento del multiplexor. Si quisiéramos utilizar una señal en vez de una variable tenemos Para la descripción estructural primero debemos que hacerlo de la siguiente manera. realizar la descripción de un multiplexor 2 a 1 para después interconectar tres de ello como se muestra ARCHITECTURE behavorial2 OF multiplexor IS en la figura siguiente. SIGNAL selec_int:integer; BEGIN selec_int <= to_integer( selec ); PROCESS(selec_int, a, b, c, d) BEGIN CASE selec_int IS WHEN 0 => salida <= a ; WHEN 1 => salida <= b ; WHEN 2 => salida <= c ; WHEN 3 => salida <= d ; WHEN OTHERS => NULL; END CASE; END PROCESS; END behavorial2; Si observas con cuidado podrás ver que Figura 4.28 seguimos describiendo exactamente los mismo. Tanto el procesos como la asignación son de Para realizar descripciones estructurales lo naturaleza concurrente, por lo que selec_int tiene recomendable es utilizar varios archivos .vhd, cada siempre el valor actual de selec y lo convertimos a uno para una entidad o paquete en particular. Crea un tipo entero para facilitar la descripción. Trata de un proyecto para la descripción estructural del imaginar la asignación "selec_int <= to_integer ( multiplexor 4 a 1. Ahora crea un nuevo archivo de selec )" como un circuito combinacional cuya texto y copia la siguiente descripción. función es cambiar el tipo de datos con el estamos manejando el vector selec y cuya salida (selec_int) LIBRARY ieee; USE ieee.std_logic_1164.ALL; se la conectamos (piensa en señales como cables) al proceso, que viene siendo otro circuito que PACKAGE multiplexor IS "procesa" la información que se le suministra y COMPONENT mux_2_a_1 obtiene finalmente la lógica de salida. A PORT( in1: IN std_logic_vector (3 DOWNTO 0); continuación se muestra un diagrama a bloques in2: IN std_logic_vector que trata de representar lo que estamos haciendo (3 DOWNTO 0); en la arquitectura anterior (behavorial2). sel: IN std_logic; out1: OUT std_logic_vector (3 DOWNTO 0)); IEC FRANCISCO JAVIER TORRES VALLE 67
  • 15. CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES END COMPONENT; funcionamiento. Dentro de la ventana de proyecto END multiplexor; en la "vista de jerarquía" (Hierarchy View) aparece LIBRARY ieee; el orden en que los componentes están siendo USE ieee.std_logic_1164.ALL; utilizados dentro del diseño jerárquico. ENTITY mux_2_a_1 IS PORT (in1, in2: IN std_logic_vector (3 DOWNTO 0); sel: IN std_logic; out1: OUT std_logic_vector (3 DOWNTO 0)); END mux_2_a_1; ARCHITECTURE data_flow OF mux_2_a_1 IS BEGIN out1 <= in1 WHEN sel = '0' ELSE in2; END data_flow; Guarda este archivo como mux_2_a_1.vhd Figura 4.29 dentro de la carpeta de trabajo del proyecto. Como podrás ver estamos creando un paquete con Una vez que has compilado y simulado este nombre "multiplexor" el cual se agrega a la librería multiplexor utilizando los tres estilos podrás ver del proyecto work. Además se tienen que llamar que no hay ninguna diferencia entre usar un estilo las librerías que se necesiten antes del paquete y u otro. Lo importante es describir el mismo antes de la entidad. Ahora abre un nuevo archivo funcionamiento para obtener los mismo resultados. de texto y copia en él la siguiente descripción. De hecho, mientras estemos describiendo exactamente lo mismo no importa el número de -- mux_structural.vhd LIBRARY ieee; líneas que se hagan, porque VHDL no es un USE ieee.std_logic_1164.ALL; lenguaje de programación de software. USE work.multiplexor.ALL; -- llamado al paquete multiplexor que se -- encuentra en la librería 4.5 SUMADORES -- del proyecto El diseño de circuitos aritméticos eficientes es ENTITY multiplexor IS PORT ( a,b,c,d: IN std_logic_vector un tema fundamental en el diseño de circuitos (3 DOWNTO 0); digitales, por lo que es importante para el selec: IN std_logic_vector diseñador estar familiarizado con las opciones (3 DOWNTO 0); disponibles en la selección de algoritmos eficientes salida: OUT std_logic_vector (3 DOWNTO 0)); en sus aplicaciones. Está práctica tiene por END multiplexor; objetivo familiarizarte en el diseño de circuitos sumadores utilizando algoritmos eficientes en ARCHITECTURE structural OF multiplexor IS SIGNAL salida1, salida2: VHDL. std_logic_vector(3 DOWNTO 0); BEGIN 4.5.1 SUMADOR TOTAL u1: mux_2_a_1 PORT MAP(a, b, selec(0), salida1); El componente básico usado en la adición de u2: mux_2_a_1 PORT MAP(c, d, selec(0), dos operandos es conocido como "sumador total". salida2); u3: mux_2_a_1 PORT MAP ( salida1, Este sumador total representa el componente con salida2, selec(1), salida); el cual podemos formar sumadores de cualquier END structural; número de bits. A continuación se muestra la tabla de funcionamiento y la representación esquemática Guarda este archivo como mux_structural.vhd, de un sumador total, y basándose en la tabla se y agrega ambos archivos al proyecto (Proyect > hará la descripción de sumador total en VHDL, Add Files...). Compila el proyecto y comprueba para posteriormente diseñar un circuito sumador de que las ecuaciones de salida siguen siendo las 4 bits utilizando un 22V10. mismas ya que estamos describiendo el mismo IEC FRANCISCO JAVIER TORRES VALLE 68
  • 16. CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES "10" WHEN entradas = 5 ELSE "10" WHEN entradas = 6 ELSE "11" WHEN entradas = 7; sum <= salidas(0); co <= salidas(1) ; END data_flow; Si conoces las ecuaciones del circuito también puedes utilizarlas para hacer la descripción. ARCHITECTURE data_flow OF full_adder IS BEGIN sum <= a XOR b XOR C; Figura 4.30 co <= (a AND b) OR (a AND ci) OR TABLA DE FUNCIONAMIENTO (b AND ci); END data_flow; ENTRADAS SALIDAS a b ci co suma Crea un nuevo proyecto en c:vhdl_projprac5 y llámalo sumador. Después crea un nuevo archivo 0 0 0 0 0 de texto y copia en él la descripción anterior. 0 0 1 0 1 Guarda el archivo de texto como full_adder.vhd 0 1 0 0 1 dentro de la carpeta de trabajo del proyecto. 0 1 1 1 0 Agrega el archivo al proyecto y compila el 1 0 0 0 1 proyecto utilizando la arquitectura data_flow. Abre 1 0 1 1 0 el reporte de compilación y observa las ecuaciones. 1 1 0 1 0 Ahora compila el proyecto utilizando la segunda 1 1 1 1 1 arquitectura data_flow. Vuele a abrir el proyecto y observa las ecuaciones. ¿Por qué son las mismas LIBRARY ieee; -- full_adder.vhd ecuaciones? porque estamos describiendo el USE ieee.std_logic_1164.ALL; mismo funcionamiento y el estilo o el número de PACKAGE adder IS líneas que utilices no importa siempre y cuando COMPONENT full_adder este describiendo exactamente el mismo circuito. PORT(ci: IN std_logic; a, b: IN std_logic; sum: OUT std_logic; 4.5.2 SUMADOR DE CUATRO BITS co: OUT std_logic); END COMPONENT; END adder; Para hacer la descripción utilizaremos cuatro unidades del sumador total (u1 a u4) y las LIBRARY ieee; conectaremos como se muestra continuación. USE ieee.std_logic_1164.ALL; USE work.std_arith.ALL; ENTITY full_adder IS PORT(ci: IN std_logic; a, b: IN std_logic; sum: OUT std_logic; co: OUT std_logic); END full_adder; ARCHITECTURE data_flow OF full_adder IS SIGNAL entradas: std_logic_vector (2 DOWNTO 0); SIGNAL salidas: std_logic_vector (1 DOWNTO 0); Figura 4.31 BEGIN entradas <= a&b&ci ; Abre un nuevo archivo de texto y copia en él la salidas <= "00" WHEN entradas = 0 ELSE "01" WHEN entradas = 1 ELSE siguiente descripción. "01" WHEN entradas = 2 ELSE "10" WHEN entradas = 3 ELSE -- sumador de 4 bits utilizando "01" WHEN entradas = 4 ELSE -- un sumador total IEC FRANCISCO JAVIER TORRES VALLE 69
  • 17. CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES co, c1, c2, c3: INOUT std_logic); LIBRARY ieee; END sumador; USE ieee.std_logic_1164.ALL; USE work.std_arith.ALL; USE work.adder.ALL; De esta forma enviamos los nodos c1, c2, y c3 a la salida de una macroceldas, en el caso del 22V10 ENTITY sumador IS a un pin de salida, y así evitamos que el PORT (ci: IN std_logic; sintetizador elimine el nodo porque ya lo a, b: IN std_logic_vector (3 DOWNTO 0); declaramos como puerto. sum: OUT std_logic_vector (3 DOWNTO 0); co: OUT std_logic); 4.5.3 SYNTHESIS OFF END sumador; Otra forma de evitar que se simplifique el nodo ARCHITECTURE structural OF sumador IS es utilizando directivas de síntesis. En este caso SIGNAL c1, c2, c3: std_logic; BEGIN utilizaremos la directiva synthesis_off que está u1: full_adder PORT MAP (ci, a(0), b(0), incluida en WARP. Esta directiva nos permite sum(0), c1 ) ; controlar la forma en que el sintetizador factoriza y u2: full_adder PORT MAP (c1, a(1), b(1), obtiene las ecuaciones de salida y de esta manera sum(1), c2 ) ; u3: full_adder PORT MAP (c2, a(2), b(2), evitar que la ecuación de un nodo se incluya en la sum(2), c3); ecuación de otro nodo y así evitar u4: full_adder PORT MAP (c3, a(3), b(3), retroalimentaciones. Para entender como funciona sum(3), co); esta directiva observe el siguiente ejemplo. END structural; ENTITY synthesis_off IS Guarda el archivo de texto en la carpeta de PORT ( a, b, c: IN bit; trabajo del proyecto (c:vhdl_projprac5) como y: OUT bit); sumador.vhd. Compila el proyecto y observa lo END synthesis_off; que sucede. Si estas usando la versión 5.0 o 5.2 de ARCHITECTURE simplifica_nodo OF WARP, la compilación te indicará los siguientes synthesis_off IS errores. SIGNAL x: bit; BEGIN x <= a AND b; Error: Logic equation has too many product y <= x OR c; terms on signal co. END simplifica_nodo; Error: Logic equation has too many product terms on signal sum(2). Cuando compilemos el archivo la ecuación del Error: Logic equation has too many product nodo "x" se sustituye en la ecuación del puerto "y" terms on signal sum(3). como se muestra abajo. Abre el reporte de compilación y observa las y = a * b + c ecuaciones. La descripción no se pudo compilar porque las ecuaciones tienen demasiadas sumas de Lo que trataríamos de hacer entonces sería productos. El sintetizador de WARP siempre trata declara el nodo "x" como puerto y no como señal de evitar retroalimentaciones para que el circuito de interconexión, pero observa que es lo que funcione con la mayor velocidad posible. Nosotros sucede. deseamos que los nodos c1, c2, y c3 queden en un pin de salida del 22V10 para de esta forma hacer x = a * b y = a * b + c las conexiones como se muestran en el diagrama a bloques del sumador de 4 bits. Para lograrlo basta La ecuación de "x" se sigue sustituyendo en la con describir la entidad como se muestra a ecuación del puerto "y". Como habíamos continuación. mencionado, el sintetizador siempre busca que el circuito que le estamos describiendo funcione a la ENTITY sumador IS PORT ( ci: IN std_logic; mayor frecuencia posible. Al obtener las a, b: IN std_logic_vector ecuaciones de la forma anterior evitamos que (3 DOWNTO 0); exista una retroalimentación desde el pin del sum: OUT std_logic_vector puerto "x", ya que si retroalimentamos tenemos (3 DOWNTO 0); que esperar el tiempo de retardo de las compuertas IEC FRANCISCO JAVIER TORRES VALLE 70
  • 18. CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES que intervienen en las ecuaciones de "x" para que Esta directiva sólo puede ser aplicada a señales, después el valor de "x" se incorpore a las para una explicación más detallada de esta y otras ecuaciones del puerto "y". Por lo que el tiempo de directivas de síntesis consulta la ayuda del retardo para el puerto "y" sería mayor. Sin programa (Help > Help Topics). Para diseño de embargo, aunque lo mejor es que nuestro circuito circuitos aritméticos y no aritméticos que sean funcione a mayor velocidad, en ocasiones grandes o complejos, lo mejor es hacer necesitamos que el nodo quede en una macrocelda descripciones estructurales y utilizar las directivas para que después se retroalimente hacia otras de síntesis cuando sea necesario. ecuaciones. Ya sea por que lo necesitamos en el diseño del circuito o por las limitaciones del dispositivo programable. Es aquí donde las 4.6 REGISTROS directivas de síntesis nos permiten controlar el Existen dos métodos para implementar lógica proceso de síntesis. Observa el siguiente ejemplo registrada en VHDL: mediante instanciación de en el que se muestra como utilizar la directiva registros (utilizando librerías de componentes) o synthesis_off. utilizando procesos para realizar la descripción ENTITY synthesis_off IS comportamental del registro. PORT ( a, b, c: IN bit; y: OUT bit); Por ejemplo, si se desea utilizar un registro D y END synthesis_off; un contador de 4 bits, basta con realizar la ARCHITECTURE no_simplifica_nodo OF instanciación de dichos componentes después de synthesis_off IS incluir los paquetes apropiados. SIGNAL x: bit; ATTRIBUTE synthesis_off OF x: SIGNAL IS true; EJEMPLO BEGIN x <= a AND b; USE work.rtlpkg.ALL; -- paquetes de WARP y <= x OR c; USE work.lpmpkg.ALL; END no_simplifica_nodo; . . . -- DSRFF: definido en rtlpkg Las ecuaciones que resultan del proceso de d1: dsrff PORT MAP(d, s, r, clk, q ; síntesis son las siguientes. -- Mcounter: definido en lpmpkg c1: Mcounter GENERIC MAP (4) /y = /c * /x PORT MAP (data, clk, one, x = a * b one, one, count, zero, rst, zero, zero, zero, zero zero, zero, OPEN); Ahora las ecuaciones tienen menos términos y obligamos a que el nodo "x" quede en una terminal, obligándolo a quedar en una macrocelda Otra forma de registrar elementos es incluir un para que después se retroalimente. Para el circuito proceso que sea sensible a las transiciones de una sumador de cuatro bits podemos utilizar esta señal de reloj o que espere una transición de reloj directiva de la siguiente forma. utilizando la instrucción WAIT, de esta manera el compilador asigna un registro a las señales ARCHITECTURE structural OF sumador IS afectadas dentro del proceso. Existen 4 formas SIGNAL c1, c2, c3: std_logic; básicas para describir registros, cada una de ellas ATTRIBUTE synthesis_off OF c1, c2, c3: se explica a continuación. SIGNAL IS true; BEGIN u1: full_adder PORT MAP (ci, a(0), b(0), PROCESS sum(0), c1 ) ; BEGIN u2: full_adder PORT MAP (c1, a(1), b(1), WAIT UNTIL clk = '1'; sum(1), c2 ) ; . . . u3: full_adder PORT MAP (c2, a(2), b(2), END PROCESS; sum(2), c3); u4: full_adder PORT MAP (c3, a(3), b(3), Este proceso no tiene lista sensible, por lo que sum(3), co); END structural; comienza con una instrucción WAIT. Las instrucciones dentro del proceso se comenzarán a ejecutar cuando exista una transición positiva de la IEC FRANCISCO JAVIER TORRES VALLE 71
  • 19. CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES señal de reloj "clk". Todas las asignaciones a . . . END IF; señales dentro del proceso serán registradas, ya END PROCESS; que estas sólo cambian de valor en las transiciones de reloj y lo retienen por lo menos hasta la Este proceso es sensible a los cambios en la siguiente transición. señales "clk", "rst" y "pst", como se indica en la PROCESS (clk) lista sensible. De esta forma es posible realizar la BEGIN descripción de registros con "preset" y "reset" IF ( clk'event AND clk ='1' ) THEN asíncronos. La primera instrucción dentro del . . . proceso checa el estado de la señal "rst". Todas las END IF; END PROCESS; señales que son asignadas dentro de la primera porción de la estructura, se asume que serán Este proceso es sensible solamente a los registradas mediante la señal de "rst" asíncrono. La cambios en la señal "clk", como se indica en la segunda condición checa el estado de la señal lista sensible. La primera instrucción, IF... THEN, "pst", y todas las señales que sean asignadas dentro dentro del proceso restringe al resto de las de esta porción del proceso son registradas instrucciones a ser ejecutadas únicamente durante asíncronamente mediante la señal de "preset" la transición positiva de la señal "clk", por lo que asíncrono "pst". Si las dos primeras condiciones no ahora también todas las señales que reciban una se cumplen, el resto de la instrucción IF... THEN... asignación dentro de la instrucción IF... THEN ELSIF, representa el funcionamiento síncrono del serán registradas y mantendrán dicho valor registro. recibido por lo menos hasta la siguiente transición EJEMPLO de reloj. PROCESS(rst, clk) A continuación se muestra una forma de realizar BEGIN la descripción de un registro de 32 bits con "reset" IF rst = '1' THEN asíncrono. . . . ELSIF(clk'event AND clk='1') THEN PROCESS(r, clk2) . . . BEGIN END IF; IF (r = '1') THEN END PROCESS; q <= x"123DEABC" ; ELSIF (clk2'event AND clk2='1') THEN Este proceso es sensible a los cambios en la q <= d; END IF; señal de reloj "clk" y la señal de reinicio "rst", END PROCESS; como es indicado en la lista sensible. Mediante este método de descripción comportamental es Asumiendo que "q" y "d" son declarados como posible registrar señales y además tener un "reset" señales o puertos de 32 bits, entonces este código asíncrono. La primera instrucción checa primero el ejemplifica la implementación de un registro de 32 estado de la señal "rst". Las señales que son bits con d(i) como entrada, q(i) como salida, "clk2" asignadas dentro de esta porción de la estructura como la señal de reloj, y "r" como la señal de IF... THEN... ELSIF, se asume que son registradas "reset" asíncrono para algunos registros y también asíncronamente con la señal de "reset" asignada, y como señal de "preset" asíncrono para otros. Esto serán sintetizadas en registros con capacidad para significa que cuando se cumple la condición: r = realizar dicha acción. Si la condición de "reset" no '1', la asignación q <= x"ABC123DE" provocará se cumple, el resto de la instrucción IF... THEN... que algunos registros sean puestos en alto mientras ELSIF, funciona como el proceso explicado que otros van a quedar en un estado de cero lógico. anteriormente. PROCESS(rst, pst, clk) EJEMPLOS BEGIN IF rst = '1' THEN A continuación realice la descripción de los . . . ELSIF pst = '1' THEN siguientes registros de acuerdo con su tabla de . . . funcionamiento. ELSIF (clk'event AND clk='1') THEN IEC FRANCISCO JAVIER TORRES VALLE 72
  • 20. CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES REGISTRO NO. 1 ARCHITECTURE areg2 OF reg2 IS Elabore la descripción del registro utilizando un BEGIN PROCESS(clk, reset, d) 22V10 y posteriormente trate de implementar la BEGIN descripción en un 16V8, simule la descripción y IF clk'event AND clk = '1' THEN obtenga sus conclusiones. IF reset = '0' THEN q <= '0'; TABLA DE FUNCIONAMIENTO ELSE q <= d; END IF; ENTRADAS SALIDAS END IF; END PROCESS; reset d clk q END areg2; 1 0 transición positiva 0 REGISTRO NO. 3 1 1 transición positiva 1 Elabore la descripción del siguiente registro 0 - - 0 utilizando un 22V10, simule la descripción y obtenga sus conclusiones. ENTITY reg1 IS PORT(reset: IN bit; TABLA DE FUNCIONAMIENTO d: IN bit; clk: IN bit; q: OUT bit); ENTRADAS SALIDAS END reg1; enable d clk q ARCHITECTURE areg OF reg1 IS BEGIN 1 0 transición positiva 0 PROCESS(clk, reset, d) BEGIN 1 1 transición positiva 1 IF reset = '0' THEN q <= '0'; 0 - - Z ELSIF clk'event AND clk = '1' THEN q <= d; LIBRARY ieee; END IF; USE ieee.std_logic_1164.ALL; END PROCESS; END areg; ENTITY reg2 IS PORT(enable: IN std_logic; d: IN std_logic; REGISTRO NO. 2 clk: IN std_logic; q: OUT std_logic); Elabore la descripción del registro utilizando un END reg2; 22V10 y posteriormente utilice un 16V8, simule la descripción en ambos casos y obtenga sus ARCHITECTURE areg2 OF reg2 IS conclusiones. SIGNAL q_tmp: std_logic; BEGIN TABLA DE FUNCIONAMIENTO -- lógica registrada ENTRADAS SALIDAS PROCESS(clk, reset, d) BEGIN reset d clk q IF clk'event AND clk = '1' THEN q_tmp <= d; 1 0 transición positiva 0 END IF; END IF; 1 1 transición positiva 1 END PROCESS; 0 - transición positiva 0 -- buffer q <= q_tmp WHEN enable = '1' g 'Z'; END areg2; ENTITY reg2 IS PORT(reset, d,clk: IN bit; q: OUT bit); END reg2; IEC FRANCISCO JAVIER TORRES VALLE 73
  • 21. CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES 4.7 CONTADORES LIBRARY ieee; USE ieee.std_logic_1164.ALL; La finalidad de un contador es computar el USE ieee.numeric_std.ALL; número de ocurrencias de un evento que se da en intervalos aleatorios o uniformes. En los siguientes ENTITY counter IS PORT (clk, load, reset: IN std_logic; ejemplos se muestran diferentes tipos de data: IN unsigned(3 DOWNTO 0); contadores y la forma más común de describir su count: BUFFER unsigned(3 DOWNTO 0)); comportamiento con VHDL. END counter; EJEMPLOS ARCHITECTURE archcounter OF counter IS BEGIN LIBRARY ieee; PROCESS(clk, reset, load, count, data) USE ieee.std_logic_1164.ALL; BEGIN USE ieee.numeric_std.ALL; IF ( clk’event AND clk= '1' ) THEN IF reset = '1' THEN ENTITY counter IS count <= (OTHERS => '0'); PORT( clk, load: IN std_logic; ELSIF load = '1' THEN data: IN unsigned(3 DOWNTO 0); count <= data; count: BUFFER unsigned(3 DOWNTO 0)); ELSE END counter; count <= count + 1; END IF; ARCHITECTURE archcounter OF counter IS END IF; BEGIN END PROCESS; PROCESS( clk, load, count, data ) END archcounter; BEGIN IF( clk'event AND clk= '1' ) THEN En este ejemplo se describe un contador IF load = ’1’ THEN count <= data; ascendente, con reset síncrono dependiendo de la ELSE entrada "reset", además, con capacidad de carga count <= count + 1; paralela de datos mediante el puerto de control END IF; "load". Al igual que el ejemplo anterior, la END IF; END PROCESS; instrucción IF (clk'event AND clk = '1' ) aparece al END archcounter; principio e implica que todas las operaciones del La instrucción USE ieee.numeric_std.ALL es contador se ejecuten durante la transición positiva para incluir el tipo de datos unsigned, así como las de la señal de reloj "clk". La subsecuente funciones aritméticas y lógicas que nos permiten instrucción IF describe la operación de reset manipular objetos de datos que manejen este tipo. síncrono durante la transición positiva del reloj. El En este ejemplo en particular nos interesa la resto de las operaciones, el conteo y la carga función "+" definida para ser utilizada con el tipo paralela, son descritas en las siguientes cláusulas unsigned y enteros. Ya que el operador "+" en ELSIF y ELSE dentro de la misma instrucción IF, VHDL originalmente está definido únicamente por lo que podemos observar que la operación de para ser utilizado con enteros. La arquitectura que reset tiene precedencia sobre las operaciones de describe al contador utiliza el estilo carga y conteo. Así, si reset no es '1', entonces la comportamental. En este diseño el contador operación de conteo depende de la señal "load". funciona ascendentemente y, además, realiza carga Como podemos ver las operaciones de carga y paralela de datos síncronamente con la señal de conteo son identificas al contador en el ejemplo reloj dependiendo del valor del puerto de control anterior. "load". Ahora se expone a continuación un contador Dentro del proceso, la instrucción IF ( clk’event con reset asíncrono y con capacidad para salida en AND clk= ’1’ ) THEN... implica que el alta impedancia. funcionamiento del contador, conteo y carga LIBRARY ieee; paralela, tome lugar durante la transición positiva USE ieee.std_logic_1164.ALL; de la señal de reloj "clk". La siguiente instrucción USE ieee.numeric_std.ALL; IF... THEN... define la operación de conteo o de ENTITY cnt_oe IS carga paralela del circuito dependiendo de la PORT(clk, reset, oe: IN std_logic; condición: load = '1'. A continuación se expone un count_io: INOUT std_logic_vector contador similar pero con reset síncrono. (7 DOWNTO 0)); IEC FRANCISCO JAVIER TORRES VALLE 74
  • 22. CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES END ldcnt; 1 0 transición positiva descendente ARCHITECTURE arch_cnt_oe OF cnt_oe IS SIGNAL count: std_logic_vector 0 - - 0 (7 DOWNTO 0); BEGIN PROCESS(clk, reset, count) ENITTY counter IS BEGIN PORT(reset: IN bit; IF reset = '0' THEN ud: IN bit; count <= (OTHERS => '0'); clk: IN bit; ELSIIF ( clk’event AND clk=’1’ ) THEN conteo: INOUT integer RANGE 0 TO 15 count <= count + 1; ); END IF; END counter; END PROCESS; count_io <= count WHEN oe = ’1’ ELSE ARCHITECTURE counter OF counter IS (OTHERS => 'Z'); BEGIN END arch_cnt_oe; PROCESS(reset,ud,clk) BEGIN IF reset = '1' THEN Este diseño desempeña un contador ascendente conteo <= 0; con reset asíncrono. Cuando se cumple la ELSIF (clk'event AND clk = '1') THEN condición: reset = '0', se produce un reset IF ud = '1' THEN asíncrono en el contador. Cuando esta condición conteo <= conteo + 1; ELSE no se satisface, la operación de conteo funciona conteo <= conteo - 1; síncronamente con la señal de reloj "clk". Además, END IF; independientemente de las señal de reset, el uso de END IF; END counter; los buffers de tres estados en los pines de I/O es posible mediante el uso del puerto de entrada "oe". Así, cuando se satisface la condición oe = '1', el CONTADOR NO. 2 conteo es conducido hacia los pines de salida. De lo contrario presentarán alta impedancia en los ENTRADAS SALIDAS pines del circuito. Conceptualmente, el código en VHDL del contador se implementa de la siguiente reset up_down clk conteo manera. 1 1 transición positiva ascendente 1 0 transición positiva descendente 0 - transición positiva 0 ENITTY counter IS PORT(reset: IN bit; ud: IN bit; clk: IN bit; Figura 4.32 conteo: INOUT integer RANGE 0 TO 15 ); A continuación se elabore la descripción en END counter; VHDL para los siguientes contadores de cuatro ARCHITECTURE counter OF counter IS bits de acuerdo a su tabla de funcionamiento y BEGIN posteriormente realice las simulaciones. Elija el PROCESS(reset,ud,clk) BEGIN dispositivo que más convenga. IF (clk'event AND clk = '1') THEN IF reset = '1' THEN CONTADOR NO. 1 conteo <= 0; ELSIF ud = '1' THEN conteo <= conteo + 1; ENTRADAS SALIDAS ELSE conteo <= conteo - 1; reset up_down clk conteo END IF; END IF; 1 1 transición positiva ascendente END counter; IEC FRANCISCO JAVIER TORRES VALLE 75
  • 23. CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES CONTADOR NO. 3 transición descendente 1 1 0 positiva 9-0 ENTRADAS SALIDAS 0 1 - - 0 reset oe up_down clk conteo 0 0 - - Z 1 1 1 transición positiva ascendente 1 1 0 transición positiva descendente ** NOTA 0 1 - - 0 Aunque se encuentre la salida del circuito en alta impedancia, el conteo y reset asíncrono deben 0 0 - - Z seguir funcionando internamente. En el momento de cambio de sentido ascendente/descendente, el ** NOTA contador no debe de iniciar la cuenta, por ejemplo: si el contador está funcionando ascendentemente y Aunque se encuentre la salida del circuito en se encuentra en el número 5 cuando se cambia a alta impedancia, el conteo y reset asíncrono deben descendente, en la siguiente transición positiva se seguir funcionando internamente. debe continuar la cuenta con un 4, después un 3... etc. LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.numeric_std.ALL; LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENITTY counter IS USE ieee.numeric_std.ALL; PORT(reset: IN std_logic; ud: IN std_logic; ENITTY counter IS oe: IN std_logic; PORT(reset: IN std_logic; clk: IN std_logic; ud: IN std_logic; conteo: INOUT unsigned (3 DOWNTO 0) oe: IN std_logic; ); clk: IN std_logic; END counter; conteo: INOUT unsigned (3 DOWNTO 0) ); ARCHITECTURE counter OF counter IS END counter; SIGNAL count_tmp: unsigned(3 DOWNTO 0); BEGIN ARCHITECTURE counter OF counter IS PROCESS(reset,ud,clk) SIGNAL count_tmp: unsigned(3 DOWNTO 0); BEGIN BEGIN IF reset = '1' THEN PROCESS(reset,ud,clk) count_tmp <= (OTHERS => '0'); BEGIN ELSIF (clk'event AND clk = '1') THEN IF reset = '1' THEN IF ud = '1' THEN count_tmp <= (OTHERS => '0'); count_tmp <= count_tmp + 1; ELSIF (clk'event AND clk = '1') THEN ELSE IF ud = '1' THEN count_tmp <= count_tmp - 1; count_tmp <= count_tmp + 1; END IF; IF count_tmp = 9 THEN END IF; count_tmp <= (OTHERS => '0'); END IF; -- instanciación de los buffers ELSIF ud = '0' THEN conteo <= count_tmp WHEN oe = '1' ELSE count_tmp <= count_tmp - 1; (OTHERS 'Z'); IF count_tmp = 0 THEN END counter; count_tmp <= "1001"; END IF; END IF; CONTADOR NO. 4 END IF; -- instanciación de los buffers ENTRADAS SALIDAS conteo <= count_tmp WHEN oe = '1' ELSE (OTHERS 'Z'); reset oe up_down clk conteo END counter; transición ascendente 1 1 1 positiva 0-9 IEC FRANCISCO JAVIER TORRES VALLE 76
  • 24. CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES 4.8 ALU DE CUATRO BITS solamente con un bit, y en la entidad TOP se realiza la interconexión de cuatr de estos módulos Realice la descripción en VHDL para la para formar la ALU de cuatro bits. siguiente unidad aritmético - lógica de acuerdo a ENTIDAD TOP la tabla de funcionamiento utilizando un 22V10. El circuito consta de 2 bus de entrada "a" y "b", de 4 LIBRARY ieee; bits cada uno y mediante el bus "s", de 3 bits, se USE ieee.std_logic_1164.ALL; selecciona la operación a realizar en la ALU. USE work.modulo_alu.ALL; Dicha operación se realiza combinacionalmente y ENTITY alu IS en el momento que ocurre una transición positiva PORT(a: IN std_logic_vector(3 DOWNTO 0); en la señal de reloj el resultado de dicha operación b: IN std_logic_vector(3 DOWNTO 0); se registra en los flip-flop's tipo D del 22V10. cin: IN std_logic ; Además, la salida registrada será conducida hacia clk: IN std_logic ; reset: IN std_logic ; los pines de salida (I/O pads) únicamente cuando oe: IN std_logic ; se habiliten los buffers de tres estados mediante la s: IN std_logic_vector(2 DOWNTO 0); entrada de control "oe", de lo contrario deberán cout: OUT std_logic; output: OUT std_logic_vector(3 DOWNTO 0) encontrarse en alta impedancia. ); END alu ; ENTRADAS SALIDAS ARCHITECTURE a_alu OF alu IS s(2) s(1) s(0) clk oe output cout SIGNAL c2, c3, c4: std_logic; SIGNAL salida_r: std_logic_vector transición a AND (3 DOWNTO 0); 0 0 0 0 0 positiva b ATTRIBUTE synthesis_off OF c2, c3, c4: SIGNAL IS true; transición BEGIN 0 0 1 0 a OR b 0 positiva x0: modulo PORT MAP(a(0), b(0), cin, clk, reset, s, c2, salida_r(0)); transición a XOR 0 1 0 0 0 positiva b x1: modulo PORT MAP(a(1), b(1), c2, clk, reset, s, c3, salida_r(1)); transición 0 1 1 0 NOT a 0 positiva x2: modulo PORT MAP(a(2), b(2), c3, clk, reset, s, c4, salida_r(2)); transición x3: modulo PORT MAP(a(3), b(3), c4, clk, 1 0 0 0 a+0 0 positiva reset, s, cout, salida_r(3)); transición acarreo de -- instanciación de los biffers 1 0 1 0 a+b positiva la suma output <= (OTHERS=>'Z') WHEN oe='1' ELSE salida_r; transición acarreo de END a_alu; 1 1 0 0 a + b' positiva la suma transición MÓDULO 1 1 1 0 a-1 0 LIBRARY ieee ; positiva USE ieee.std_logic_1164.ALL; - - - - 1 Z 0 ENTITY modulo IS PORT (in1: IN std_logic; in2: IN std_logic; ** NOTA cin: IN std_logic; clk: IN std_logic; b' = NOT b reset: IN std_logic; selec: IN std_logic_vector(2 DOWNTO 0); cout: OUT std_logic ; 4.8.1 DESCRIPCIÓN ESTRUCTURAL salida_r: INOUT std_logic); END modulo; La descripción se realiza utilizando tres archivos, los cuales contienen: la entidad TOP, el ARCHITECTURE a_modulo OF modulo IS SIGNAL salida_comb: std_logic ; módulo y el paquete respectivamente. El módulo BEGIN realiza todas las operaciones dela ALU pero PROCESS(in2, in1, selec, cin) IEC FRANCISCO JAVIER TORRES VALLE 77