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