Documentos de Académico
Documentos de Profesional
Documentos de Cultura
circuitos
digitales. Estos lenguajes facilitan la descripción del funcionamiento y la estructura de los circuitos, así como la codificación de sus
bancos de pruebas, que sirve como entrada para las herramientas software de simulación y síntesis.
En este texto se explican metodologías básicas para el diseño con VHDL de circuitos digitales combinacionales y secuenciales,
empleándose aquellas capacidades del lenguaje que son relevantes en el diseño para síntesis, así como en la programación de
bancos de pruebas. A lo largo del texto se muestran diferentes ejemplos de diseño y test de circuitos, y se plantean ejercicios prácticos,
proporcionándose en todos los casos el código VHDL completo, disponible también en el CD-ROM que acompaña al texto.
Alfonso Urquía Mora leda es licenciado en CC. Físicas por la Universidad Complutense de Madrid y doctor en CC. Físicas por la
UNED. Durante el periodo 1996-2001 ha trabajado como Ingeniero de I+D en la empresa AT&T Microelectrónica España (posteriormente
Lucent Technologies- Bell Labs y Agere Systems) en Tres Cantos (Madrid), puesto en el cual ha participado en numerosos proyectos
relacionados con la fabricación de circuitos integrados. Desde el año 1995 ha ocupado diferentes puestos docentes dentro del
Departamento de Informática y Automática de la UNED, en el cual actualmente es profesor titular de universidad.
Carla Martín Villalba se graduó en Ingeniería Electrónica por la Universidad Complutense de Madrid en 2001 y obtuvo su grado
de doctor en Informática con Mención Europea por la UNED en 2007. Desde el año 2004 ha ocupado diferentes puestos docentes
en el Departamento de Informática y Automática de la UNED. Desde 2010 es profesor contratado doctor y centra su labor investigadora
en el modelado, la simulación por ordenador y la enseñanza a distancia.
·¡ .LSBN: 978-84-362-6274-2
01201
colección
Editorial Grado
9 788436 262742
7101201 GR01A01
J
COLECCIÓN GRADO
Diseño y análisis
de circuitos digitales
con VHDL
ISBN: 978-84-362-6274-2
Depósito legal: M. 33.404-2011
Prefacio 25
Objetivos docentes 27
1.1. Introducción . . . . . . . . . . . . . . 33
7
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
1.8.5. Configuración .. 78
2.3. Entity . . . . . . . 97
8
ÍNDICE
9
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
10
ÍNDICE
11
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
12
ÍNDICE
13
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
APÉNDICES 561
14
ÍNDICE
15
CÓDIGO VHDL
17
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
18
CÓDIGO VHDL
19
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
20
CÓDIGO VHDL
21
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
22
CÓDIGO VHDL
23
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
24
PREFACIO
25
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
26
PREFACIO
Por regla general, los ejemplos mostrados en los Temas 3 a 7 están completamente
desarrollados. Es decir, cada diseño está acompañado de su banco de pruebas. Es
muy recomendable que el alumno realice las simulaciones de estos diseños por sí
mismo, familiarizándose de esta forma con el manejo del entorno de simulación y
con la interpretación de los resultados de las simulaciones.
OBJETIVOS DOCENTES
l. Discutir las diferentes etapas del ciclo de diseño de circuitos digitales y el uso
de los lenguajes para la descripción del hardware (HDL) en cada una de ellas.
2. Discutir qué características fundamentales deben tener los HDL para poder
describir circuitos digitales y qué características fundamentales deben tener
los entornos de simulación que soportan este tipo de lenguajes.
Al comienzo de cada tema se indican los objetivos docentes que deben alcan-
zarse una vez completado su estudio y realizados los ejercicios prácticos. Un buen
procedimiento de autoevaluación consiste en repasar los objetivos docentes una vez
completado el estudio del tema, analizando en cada caso si se ha alcanzado o no el
objetivo.
27
TEMA 1
1.1. Introducción
1.2. Lenguajes para la descripción de hardware
1.3. Ciclo de diseño de los circuitos digitales
1.4. Tecnologías de circuitos integrados
1.5. Propiedades de los circuitos digitales
1.6. Test de los circuitos
l. 7. Representaciones y niveles de abstracción
1.8. Conceptos básicos a través de un ejemplo
1.9. Dos simuladores de VHDL'93: VeriBest y ModelSim
1.10. Lecturas recomendadas
1.11. Ejercicios de autocomprobación
1.12. Soluciones de los ejercicios
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
OBJETIVOS DOCENTES
Una vez estudiado el contenido del tema y realizados los ejercicios prácticos,
debería saber:
31
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
1.1. INTRODUCCIÓN
Los sistemas digitales se han ido haciendo más y más complejos durante las pasa-
das décadas. Este incremento en la complejidad responde, a grandes rasgos, a la Ley
de Moore, según la cual el avance tecnológico posibilita que cada aproximadamente
18 meses se doble el número de transistores que es posible alojar en un circuito
integrado.
Un lenguaje para la descripción del hardware o HDL (siglas que provienen del in-
glés: Hardware Description Language) es un lenguaje, legible tanto por las máquinas
como por los seres humanos, ideado para describir tanto el comportamiento como
la estructura del hardware. El HDL permite describir de forma precisa y rigurosa
el funcionamiento del circuito digital, el cual puede ser simulado en un ordenador
con el fin de reproducir exactamente el funcionamiento del circuito. La simulación
por ordenador permite obtener el valor de las señales de salida del circuito para una
determinada secuencia de señales de entrada.
33
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
3. El mismo HDL que se ha usado para la descripción del circuito, puede em-
plearse para describir los vectores de test y los resultados esperados del test.
Los vectores de test son los valores de las señales que se aplicarán a los pirres
de entrada del circuito con la finalidad de comprobar si el funcionamiento del
circuito es correcto. Así pues, pueden realizarse los programas de test (vectores
de test e instantes en los cuales son aplicados) del circuito a medida que se
diseña el propio circuito, pudiéndose con ello ir realizando diferentes pruebas
34
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
- Documentación formal. Un programa HDL puede ser usado como una especi-
ficación formal de un sistema digital. Se trata de un tipo de documentación
explícita y precisa acerca del sistema, que es intercambiable entre diferentes
diseñadores y usuarios.
En la actualidad, los HDL más ampliamente usados son Verilog HDL y VHDL.
Ambos son lenguajes estándar de IEEE para el modelado y simulación de hardware.
35
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
A principios del año 2000 se desarrolló otro HDL denominado SystemC, el cual
consiste en un conjunto de librerías en C++. SystemC se convirtió en el estándar
1666 de IEEE en el año 2005.
El empleo de HDL es práctica habitual en las diferentes fases del ciclo de diseño
de circuitos digitales. En la Figura 1.1 se muestran las actividades que típicamente
se realizan durante el ciclo de diseño e implementación de los circuitos digitales.
A continuación, el diseñador debe crear un diseño de alto nivel del circuito, para
lo cual puede emplear un lenguaje para la descripción de hardware (HDL), por
ejemplo VHDL o Verilog. Seguidamente, debe desarrollar un conjunto de programas
de test (usando también VHDL o Verilog) y, si es posible, usar estos programas
para testear el diseño de alto nivel, usando para ello una herramienta de simulación
(verificación funcional). En función de los resultados de la simulación de los tests,
puede ser preciso modificar el diseño de alto nivel, repitiéndose los pasos anteriores
tantas veces como sea preciso.
Una vez el diseño de alto nivel funciona adecuadamente, debe traducirse al nivel
de puertas lógicas o de transistores. Este proceso se denomina síntesis. Síntesis es
la generación automática del diseño del circuito a partir de la descripción de su
comportamiento. El resultado obtenido de la síntesis, denominado netlist, es una
descripción de todas las conexiones y componentes que deben componer el circuito.
36
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
Programas de Test
37
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Una vez implementado, el circuito integrado puede ser testeado con ayuda de un
generador de patrones (para generar los vectores de test), y un analizador lógico u
osciloscopio (para medir las salidas).
En este texto únicamente se explican las primeras fases del ciclo de diseño, en las
cuales se establece la especificación funcional del circuito, se realiza el diseño de alto
nivel del circuito, se elabora el programa de test, y se simula el banco de pruebas
con el fin de realizar una verificación funcional del circuito. La especificación de las
restricciones que debe satisfacer el circuito, así como las fases de síntesis, verificación
de tiempos, implementación y testeo del prototipo, quedan fuera del alcance de este
texto.
38
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
- Full-custom ASIC
- Standard-cell ASIC
Full-custom ASIC
En la tecnología full custom todos los aspectos del circuito integrado son diseña-
dos específicamente para una determinada aplicación, especificándose las caracterís-
ticas de cada uno de los dispositivos electrónicos (transistores, diodos, capacitares,
etc.) que componen el circuito. En consecuencia, el circuito resultante estará com-
pletamente optimizado y tendrá el mejor comportamiento posible.
39
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
de un bit, que son usados de manera repetitiva para el diseño de una memoria y un
sumador de dos números den bits, respectivamente.
Standard-cell ASIC
40
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
Las celdas lógicas de los dispositivos programables en campo son bastante más
complejas que las celdas base de los gate array ASICs. De acuerdo a la estructura
circuital de sus celdas lógicas, los dispositivos complejos programables en campo
pueden clasificarse en dos tipos: CPLD ( Complex Programmable Logic Device) y
FPGA (Field Programmable Gate Array).
41
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
( Programmable Logic Devices). Están compuestos por dos arrays, uno de puertas
AND y otro de puertas OR. Pueden programarse las interconexiones en uno de
estos arrays o en ambos, con el fin de adaptar el circuito a su aplicación.
Una vez se ha decidido desarrollar hardware para una aplicación, debe escogerse
qué tecnología emplear. En esta sección se compararán las tres tecnologías FPGA,
42
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
gate array y standard cell, empleando para ello cuatro criterios: área, velocidad,
potencia consumida y coste. Cada tecnología tiene sus puntos fuertes y débiles, de
modo que para cada aplicación debe decidirse qué tecnología es más adecuada.
Área
En la tecnología gate array, el circuito debe ser construido a partir de celdas base
cuya posición en el circuito está predefinida. Dado que la funcionalidad y posición
de las celdas base no son específicas a la aplicación, el aprovechamiento del silicio
no es óptimo. En consecuencia, normalmente un circuito integrado de la tecnología
gate arra y necesita mayor área (aproximadamente entre un 20% y un 100% más)
que ese mismo circuito desarrollado en la tecnología standard cell.
En la tecnología FPGA, una parte considerable del área del circuito integrado
está dedicada a posibilitar que el circuito pueda ser programado en campo. Más
aun, la funcionalidad de las celdas lógicas y las interconexiones están preestableci-
das, siendo frecuente que cierto porcentaje de la capacidad no sea utilizado en la
aplicación en concreto a la que se destina el FPGA. Por todo ello, puede estimarse
que un circuito implementado en la tecnología FPGA tiene entre 2 y 5 veces mayor
área que ese mismo circuito implementado en una tecnología ASIC.
43
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Velocidad
Al igual que sucedía con el área, la diferencia que existe respecto a la velocidad
entre las tecnologías ASIC standard cell y gate array es considerablemente menor
que entre estas tecnologías ASIC y la tecnología FPGA.
Potencia consumida
Por todo lo dicho hasta el momento, se deduce que la tecnología standard cell es
la mejor elección desde el punto de vista técnico, ya que un chip construido en esa
tecnología es tan pequeño, rápido y consume tan poca potencia como sea posible.
44
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
Coste
El coste de producción ( eprod) son los euros que cuesta producir una unidad
del circuito integrado. Incluye dos conceptos: el coste de ingeniería (eing) y el coste
de fabricación (efab).
eing
eprod = efab + . . (1.1)
Unidades producidas
En la Figura 1.2 se muestra el coste por unidad para las tecnologías standard
cell, gate array y FPGA. A medida que el número de unidades fabricadas aumenta,
en primer lugar gate array, y a continuación standard cell, se hacen rentables. Los
puntos de intersección entre las curvas indican el volumen de producción a partir del
cual cada una de estas dos tecnologías resulta rentable. Obsérvese que el coste de
producción de la tecnología FPGA es constante, debido a que su coste de ingeniería
es nulo. Es decir, para la tecnología FPGA se verifica que: eprod = efab·
45
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
(1) (2)
Unidades producidas
Figura 1.2: Comparación del coste de producción por unidad de circuito integrado.
46
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
Los circuitos digitales reales tienen algunas características importantes que afec-
tan a la manera en que deben ser modelados y diseñados. Estas características
son debidas tanto a los transistores que componen las puertas lógicas como a las
conexiones entre ellos. Entre las más importantes están las siguientes.
Otro tipo alternativo de modelo del retardo, en el cual todos los glitches a la
entrada se manifiestan en la salida, se denomina retardo de transporte o retardo puro.
El retardo de transporte es adecuado para modelar retardos a través de dispositivos
con poca inercia, tales como las líneas de metal construidas en el chip para conectar
los dispositivos. Los retardos puros pueden considerarse como desplazamientos en
el tiempo de la señal, ya que la señal en sí misma no se modifica. Al describir el
retardo de los circuitos, VHDL permite diferenciar entre ambos tipos de retardo.
47
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Messages
+x O
+v1 u
+v2 u
111111111 llllllllllllllllllllttlllllllltllllllllllllllllllllllllllllllllllllllllllllllllllllllllllltlllllll
donde el símbolo <= representa la asignación del valor de la señal de la derecha (x) a
la señal de la izquierda (y1), una vez transcurrido el retardo indicado tras la palabra
reservada after. Supongamos que la señal digital x varía de la forma indicada en la
tabla siguiente:
48
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
instante 200 ns. Esto sucede porque el cambio en la señal x se mantiene durante un
tiempo inferior al valor del retardo inercial (100 ns).
Esta Unidad Didáctica se centra únicamente las primeras fases del ciclo de diseño.
Esto es, en la realización en VHDL del diseño de alto nivel, la programación en VHDL
de los programas de test y la simulación para la verificación funcional. Dado que en
estas fases iniciales del diseño no se conocen los retardos de los bloques circuitales
que componen el diseño, ya que todavía no se ha tomado la decisión acerca de cómo
van a implementarse en hardware, es práctica común no especificar el valor estimado
de los retardos en el diseño de alto nivel de los circuitos. En su lugar, suele asignarse
a cada uno de los bloques circuitales un retardo por defecto, denominado retardo 6.
Como se explicará ampliamente más adelante, esta forma de modelar el retardo es
suficiente para realizar la verificación funcional de los circuitos.
En un paso posterior, una vez realizada la síntesis, se incluirán los valores esti-
mados de los retardos en el diseño y se comprobará si se satisfacen las restricciones
referentes al tiempo de respuesta, que se impusieron en la especificación del diseño.
El paso en el cual se realiza la simulación del circuito, teniendo en cuenta los valores
estimados del retardo, es el señalado en la Figura 1.1 como "Simulación: Verificación
de tiempos".
49
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Desde el punto de vista práctico, esto implica que la salida de un módulo puede
ser conectada como máximo a un determinado número de entradas de otros módulos.
En aquellos casos en que la señal deba conectarse a un número de módulos superior a
este número máximo, entonces debe emplearse un árbol de buffers. En la Figura 1.4
se muestra un árbol de buffers que lleva una señal (out) a 16 módulos (in_O, ... ,
in_15), de tal forma que la salida de los buffers se conecta únicamente a 4 entradas.
El uso del árbol de buffers tiene un beneficio añadido: igualar los retardos de las
señales de entrada a todos los módulos, ya que el árbol de buffers está diseñado de
modo que la longitud de las líneas de todas sus ramas sea la misma. Este tipo de
árbol de buffers se emplea para llevar la señal de reloj a los flip-flops en los circuitos
secuenciales síncronos, en los cuales es importante que la señal de reloj llegue a todos
los flip- flops aproximadamente en el mismo instante.
50
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
in_4
in_5
¡······················¡
>--+------1
in_6
: ...................... ;
>-~---------------~~~
f'""'''""'' ""'"¡ in_?
>-~--------------r-~
f"""'"""""""'¡ in_8
...................... ;
:
in_9
in_10
in_11
51
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Esencialmente, el test consiste en fijar valores en todas las entradas del circuito
y observar qué valores se obtienen en sus salidas. A cada asignación de valores a
todas las entradas del circuito se le llama un vector de test. El programa de test
consiste en un conjunto de vectores de test, que se aplican sobre el dispositivo en
una determinada secuencia.
- Acopios. Valores lógicos en una parte del circuito que inadvertidamente cam-
bian el valor lógico en otra parte del circuito.
Uno de estos modelos de fallo es considerar que el defecto de fabricación hace que
una de las conexiones internas del circuito permanezca siempre a 1, o que permanezca
siempre a O.
52
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
Incluso tomando en consideración que existen patrones de fallo que dan lugar a
un comportamiento equivalente (defectuoso) del circuito, el número de patrones de
fallo esencialmente distintos es extremadamente grande.
Según se van usando más y más vectores de test, el porcentaje de fallos potenciales
(para un determinado modelo de fallo) que son cubiertos se aproxima al lOO%. Dado
un conjunto de vectores de test, la cobertura de fallos de ese conjunto de vectores
de test (dado un modelo específico de fallos) corresponde con el porcentaje de fallos
cubiertos.
El test de los circuitos secuenciales es más complicado, ya que las salidas del
circuito dependen no sólo de las entradas, sino también de su estado. Por tanto,
en este tipo de circuitos es preciso poder fijar los valores de todos los fiip-fiops a
voluntad. Esto puede hacerse de las dos maneras siguientes:
53
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
2. El segundo método consiste en usar en el diseño sean fiip-fiops, que son flip-
flops cuyo valor puede ser cargado desde las entradas al circuito (mientras se
realiza el test) , o bien pueden ser usados del mismo modo que un flip-flop sin
modificar (durante el modo normal de funcionamiento del circuito). Los sean
flip-flops pueden construirse insertando multiplexores en la entrada D de los
fli p-flops.
Cuanto mayor sea la cobertura de fallos, menor será el número de chips defectuo-
sos que superarán con éxito el proceso de inspección. Cuanto menor sea el número
de vectores de test, menor será el tiempo necesario para ejecutar el programa de
test, con lo cual podrán testearse mayor número de chips por unidad de tiempo.
El test funcional se emplea en todas las etapas del proceso de diseño del circuito.
Su objetivo es verificar que el circuito realiza todas las operaciones como debiera.
54
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
En conclusión, el programa de test es algo que depende del circuito. Sin embargo,
en general se sigue el criterio de probar todos los posibles vectores de entrada, siempre
que esto sea posible.
55
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
56
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
Cada una de las tareas del proceso de desarrollo y producción del hardware
digital, requiere el conocimiento de un tipo específico de información acerca del
sistema, que va desde la especificación del sistema hasta el layout de los componentes
físicos.
- Representación de la estructura
- Representación física
57
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Representación de la estructura
Representación física
Una abstracción es un modelo simplificado del sistema, el cual muestra sólo unas
determinadas características relevantes del sistema e ignora todos los demás detalles.
58
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
Una abstracción de alto nivel está enfocada y muestra únicamente los datos más
vitales. Por otra parte, una abstracción de bajo nivel es más detallada y tiene en
cuenta información que es ignorada en abstracciones de nivel superior. Por ello, la
abstracción de bajo nivel es, a la vez que más compleja, también más precisa en sus
predicciones acerca del comportamiento del circuito real.
- Nivel de transistor
- Nivel de procesador
59
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Representad ón
flsica
Nivel de transistor
60
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
2:1 de un bit, elementos básicos de memoria, tales como latch y flip-flop. En lugar
de considerar que las señales tienen valores continuos, se considera únicamente si la
señal está por encima o por debajo de un valor umbral, lo cual es interpretado como
'1' lógico y 'O' lógico, respectivamente.
Puesto que se realiza la simplificación de considerar que las señales tienen única-
mente dos valores, el comportamiento es descrito mediante ecuaciones booleanas. Es
decir, la abstracción esencialmente convierte un sistema continuo, que era descrito
mediante ecuaciones diferenciales y algebraicas, en un sistema discreto, descrito
mediante ecuaciones booleanas.
61
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
En este texto distinguiremos entre ambos usos del término. Hablaremos de "nivel
de transferencia entre registros" (RTL: Register Transfer Level) para referirnos a la
abstracción al nivel de módulos y llamaremos "metodología de transferencia entre
registros" a la metodología específica de diseño.
El layout físico en esta abstracción se denomina fioor plan. Se emplea para en-
contrar el camino más lento entre los elementos de almacenamiento y así determinar
el periodo de la señal de reloj.
Nivel de procesador
62
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
En esta sección se muestra un ejemplo sencillo que ilustra los conceptos básicos
de modelado empleando VHDL, así como las diferencias semánticas entre VHDL y
los lenguajes de programación tradicionales. Con este ejemplo se pretende dar una
63
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
visión general de VHDL. Los detalles acerca de la sintaxis y las construcciones del
lenguaje VHDL se explicarán en el Tema 2.
En la Tabla 1.1 se muestra la tabla de la verdad del circuito, que tiene tres
entradas (a 2 , a 1 , a0 ) y un salida (par). Obsérvese que la salida tiene el valor '1'
cuando la palabra de tres bits de entrada tiene un número par de bits '1'. Al realizar
el diseño, se considera que el cero es un número par.
(1.2)
64
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
a2 al ao par
o o o 1
o o 1 o
o 1 o o
o 1 1 1
1 o o o
1 o 1 1
1 1 o 1
1 1 1 o
Las palabras reservadas (por ejemplo, enti ty, is, port, in, out, end) y los
nombres definidos por el usuario (por ejemplo, not1, xor2, and2, xO, x1, y) pueden
escribirse en VHDL indistintamente en mayúsculas o en minúsculas, puesto que
en VHDL no se diferencia entre los caracteres en mayúscula y en minúscula. Por
ejemplo, es equivalente escribir en ti ty, ENTITY y EnTi Ty, así como también es
equivalente escribir detectorPar y DETECTORPAR.
65
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity detectorPar is
port ( par : out std_logic;
a : in std_logic_vector(2 downto o) );
end entity detectorPar;
Los nombres definidos por el usuario deben comenzar por una letra, seguida
opcionalmente por cualquier secuencia de letras, números y caracteres guión bajo,
con la limitación de que ni pueden aparecer dos guiones bajos seguidos, ni el guión
bajo puede ser el último carácter del nombre.
Los comentarios comienzan con doble guión (--) y se extienden hasta el final de
la línea. Está permitido escribir comentarios en cualquier parte del código VHDL.
Cuando se desea comentar varias líneas seguidas de código, es preciso anteponer
el doble guión a cada una de ellas. VHDL'93 no ofrece la sintaxis para comentar
simultáneamente varias líneas de código. En la práctica esto no supone ninguna
limitación, ya que las herramientas de CAD que soportan VHDL suelen proporcionar
opciones de edición para comentar y descomentar cómodamente varias líneas de
texto. Es decir, es la herramienta de CAD quien antepone el doble guión o lo borra
de las líneas de código que el usuario ha seleccionado.
66
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
Las señales p1, p2, p3 y p4 pueden ser interpretadas como conexiones entre las
partes internas. La declaración es visible sólo dentro de la architecture.
Una asignación concurrente puede ser interpretada como un bloque del circuito.
La señal de la izquierda de la asignación es la salida del bloque. Todas las señales
que intervienen en la parte derecha de la asignación son las entradas al bloque.
El resultado está disponible tras un cierto retardo, que se especifica mediante la
cláusula after.
puede ser interpretada como un bloque circuital con entradas p1, p2, p3 y p4, y salida
par. El bloque realiza la operación OR de las cuatro entradas, y la operación tarda
20 ns en realizarse. Las otras cuatro asignaciones pueden ser interpretadas de forma
análoga.
67
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
'----
a(2) and
p4
- a (1) and -
(not a (O))
68
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
Así pues, con independencia de que se especifique la cláusula after, siempre hay
un retardo de propagación asociado a una sentencia concurrente.
(1.3)
69
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
a(2)
impar par
a (1) a ( 2) xor a ( 1) xor a (O) 1--------1 not impar
a (O)
a( O)
:~ :
___ : : : : : :
::~·::::::::::::::::::::::::::::::::::::¡
: : : ~==
: . :
· ~
. ¡
x ·R ·
..·....· · ·
...o ··.·.·.·.·.·.~.·
· D · . · ~ = .
a(2)
........................................ unitl
........................................
Una vez definidas las puertas lógicas, puede describirse el circuito de la manera
mostrada en el Código VHDL 1.4. Obsérvese que la descripción de los componentes
(en este caso las puertas XOR y NOT) puede codificarse en ficheros diferentes y
compilarse separadamente del fichero en el cual se define el circuito. Esto permite
crear librerías de componentes y facilita la reutilización del código.
component xor2 is
port ( yO out std_logic;
xO, x1 in std_logic );
end component xor2;
70
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
Código VHDL 1.4: Puerta inversora. Puerta XOR con dos entradas. Architecture del detector
de paridad describiendo la estructura del circuito.
71
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Hay tres elementos en esta sentencia. El primero es la etiqueta uni t 1, que sirve
para designar este componente. El segundo es la clase del componente: xor2. La
tercera es port map ( ... ), que define la correspondencia entre las señales formales
(puertos definidos en la entity del componente) y las señales actuales (las señales
usadas en el cuerpo de la architecture).
En este ejemplo, port map ( ... ) indica que xO, x1, yO están conectadas a
a(O), a(1), s1 respectivamente. El código es esencialmente la descripción textual del
esquemático mostrado en la Figura 1.9. Las tres instanciaciones de los componentes
describen el circuito completo. Las conexiones se realizan implícitamente, usando el
mismo nombre de la señal.
En un diseño grande, la implementación puede ser muy compleja. Por este motivo,
el diseño se realiza en diferentes pasos, progresando desde una descripción inicial
abstracta del funcionamiento del circuito, independiente de la plataforma hardware
que vaya a usarse para implementar el circuito, hasta llegar a la descripción detallada
al nivel hardware.
72
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
usarse variables, que son locales al bloque process. La característica distintiva del
código secuencial es que es ejecutado en el mismo orden en el cual ha sido escrito.
La sintaxis básica del bloque process es la siguiente (en la Sección 2. 7 se ofrece una
descripción más completa):
process ( lista_de_sensibilidad )
Declaración de variables locales
begin
Código_secuencial
end process;
73
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Código VHDL 1.5: Architecture del detector de paridad descrita mediante una red XOR.
procesa (a)
variable tmp : std_logic;
a(2) begin
tmp . - 1 o 1 i impar par
a (1) for i in 2 downto o loop
not impar
a (O) tmp . - tmp xor a(i);
end loop;
impar <= tmp;
end procese;
74
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
Código VHDL 1.6: Architecture del det ect or de paridad descrita mediante un algoritmo.
procesa (a)
variable suma, r : integer;
begin
suma . - o i
for i in 2 downto o loop
if a (i) = 111 then
a(2) suma . - suma + 1;
end if; par
a ( 1) end loop;
a(O) r . - suma mod 2·,
if (r = O) then
pa r <= 111 i
el se
pa r <= 1 o 1 i
end if;
end procesa;
75
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
76
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
entity bp_detectorPar is
end entity bp_detectorPar;
77
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
1.8.5. Configuración
Por ejemplo, la entity detectorPar de esta sección tiene media docena de archi-
tecture. A la hora de realizar la simulación y la síntesis, debemos especificar qué
architecture asociar con la entity. Esto puede hacerse definiendo una configura-
tion, como la mostrada en el Código VHDL 1.8 para nuestro circuito ejemplo. Si no
se ha definido una configuration, el entorno de simulación escogerá por defecto la
última architecture que ha sido compilada.
Código VHDL 1.8: Configuration para la simulación del banco de pruebas del detector de
paridad.
78
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
La única ventaja de VeriBest es que funciona para casi todas las versiones anti-
guas de Windows: Windows NT 4.0, Windows 95, Windows 98, etc. Por tratarse de
una herramienta software del año 1998, resulta adecuada para su uso en ordenadores
con limitadas prestaciones. Si éste no es el caso, es decir, si el alumno dispone de
un ordenador relativamente moderno, es preferible emplear M odelSim en lugar de
VeriBest VHDL.
79
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
b)
80
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
-- Banco de pruebas
-- bp_bufferTriestado. vhd
library IEEE;
use IEEE. std_logic_1164. all;
entity bp_Buffer_TriEstado is
end entity bp_Buffer_TriEstado;
architecture bp_Buffer_TriEstado of bp_Buffer_TriEstado is
signa} y : std_logic; -- Conectar salida UUT
signa} d, E : std_logic; -- Conectar entradas UUT
component Buffer_ TriEstado is port
( y : out std_logic;
E, d : in std_logic ) ;
end component Buffer_TriEstado;
begin
-- Instanciar y conectar UUT
uut : component Buffer_TriEstado port map
( y => y, E => E, d => d );
gen_ ve e_ test : process
begin
E <= '0'; d <= '0';
wait for 10 ns;
d <= '1';
wait for 10 ns;
E<= '1';
wait for 10 ns;
d <= '0';
wait for 10 ns;
report "Final de la simulación";
wait;
end process gen_ ve e_ test;
end architecture bp_Buffer_TriEstado;
Messages
1 1 1 1 1 ~ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
~~i¡') Now 40 ns 12 ns 16 ns 20 ns 24 ns 28 ns 32 ns
IS 4nsg8ns 36 ns 40 ns
~#'O Cursor 1 6 ns 6 ns
[[1 www 1 1 I/
1 O ns to 43 ns 1 Now: 40 ns Delta: 1
La definición del banco de pruebas contiene las mismas tres partes que la descrip-
ción del circuito: en primer lugar se indica qué librerías van a usarse, a continuación
se define la interfaz del circuito (módulo entity) y finalmente se define su compor-
tamiento (módulo architecture).
81
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
En los siguientes temas de esta Uni dad Didáctica se explicará con detalle la
forma en que debe realizarse el diseño de los circuitos y de sus bancos de pruebas.
La finalidad de este ejemplo del buffer triestado es simplemente proporcionar código
VHDL sencillo con el cual aprender el manejo del simulador de VHDL.
82
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
Ejercicio 1.1
Discuta razonadamente por qué una descripción HDL es más portable que un
diseño esquemático.
Ejercicio l. 2
Ejercicio 1.3
Suponga que quiere implementar una única unidad de un circuito integrado con
un coste de producción mínimo. Indique razonadamente cuál de las tres tecnologías
siguientes conllevará un coste de producción menor: FPGA, gate array y standard
cell.
Ejercicio 1.4
83
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Ejercicio 1.5
Señale al menos tres de las causas de mal funcionamiento de los chips más
comúnmente observadas en la práctica.
Ejercicio 1.6
Dada una puerta AND de dos entradas (A y B) y una salida (z), se pide obtener
el mínimo número de vectores de test que detectan los 6 patrones de fallos siguientes:
Ejercicio l. 7
84
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
y
...........................
Ejercicio 1.8
85
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Código VHDL 1.11: Diseño del circuito de control de la alarma de seguridad de un coche.
Código VHDL 1.12: Diseño alternativo del circuito de control de la alarma de seguridad de un
coche.
86
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
El coste de producción (Cprod) depende del coste de fabricación (C¡ab), del coste
de ingeniería (Cing) y del número de unidades producidas, como se muestra en la
Ecuación 1.1.
La tecnología FPGA no tiene Cing, pero tiene un valor de C¡ab mayor que el que
tienen las otras dos tecnologías.
Como resultado, para producir una única unidad la tecnología FPGA es la que
tiene un Cprod menor.
87
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Tabla 1.2: Salidas de la puerta AND de 2 entradas para varios patrones de fallos.
Obsérvese que para los patrones de fallo A/0, B /0 y z /0 la salida incorrecta sólo
difiere de la salida correcta cuando las señales A y B del circuito tienen valor 1
(vector de test "11"). Este vector de test no nos va a permitir saber cuál de los tres
fallos se está produciendo.
- El patrón de fallo z /1 se puede detectar con los vectores de test "00", "O 1" y
"10'. Obsérvese que cualquier vector de test que detecte los patrones de fallos
A/1 o B /1, detecta también este patrón de fallo.
88
FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL
Por tanto, el mínimo número de vectores de test para detectar los 6 patrones de
fallo es tres. Los tres vectores de test son los siguientes: "11", "01" y "10".
Solución al Ejercicio l. 7
Para que el nodo E pueda ser controlado por las señales A o B, se pone el valor
e
de la señal a O. En consecuencia, el valor del nodo E es el resultado de realizar la
operación AND lógica de las señales A y B.
89
TEMA 2
2.1. Introducción
2.2. Unidades de diseño
2.3. Entity
2.4. Architecture
2.5. Asignaciones concurrentes
2.6. Sentencia generate
2.7. Bloque process
2.8. Código secuencial
2.9. Descripción de la estructura
2.10. Parametrización
2 .11. Señales, variables y constantes
2.12. Tipos de datos y operadores
2.13. Atributos
2.14. Librerías
2.15. Assert
2.16. Subprogramas
2.17. Paquetes
2.18. Lecturas recomendadas
2.19. Ejercicios de autocomprobación
2.20. Soluciones de los ejercicios
CONCEPTOS BÁSICOS DE VHDL
OBJETIVOS DOCENTES
Una vez estudiado el contenido del tema y realizados los ejercicios prácticos,
debería saber:
- Discutir cuáles son los tipos predefinidos de VHDL y sus operadores básicos.
Asimismo, discutir las finalidad, los operadores básicos y las funciones de
conversión de los tipos de dato std_logic, std_logic_vector, unsigned y
signed. Finalmente, discutir las características de los tipos de dato time y
string, así como de los tipos enumerados.
93
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
- Discutir qué finalidad tienen las librerías en VHDL y conocer las librerías más
comúnmente usadas.
94
CONCEPTOS BÁSICOS DE VHDL
2.1. INTRODUCCIÓN
95
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
library IEEE;
use IEEE. std_logic_1164. all;
entity detectorPar is
port ( par : out std_logic;
a : in std_logic_vector( 2 downto O) ) ;
end entity detectorPar;
architecture comp_funcLog of detectorPar is
signal p1, p2, p3, p4 : std_logic;
begin
par < = ( p 1 or p2 ) or ( p3 or p4 ) ;
pi <= ( not a(2) ) and ( not a(1) ) and ( not a(O) );
p2 <= ( not a(2) ) and a(1) and a(O);
p3 <= a(2) and ( not a(1) ) and a(O);
p4 <= a(2) and a(1) and ( not a(O) );
end architecture comp_funcLog;
Un fichero con código VHDL puede contener varias unidades de diseño, pero una
unidad de diseño no puede ser dividida en dos o más ficheros.
96
CONCEPTOS BÁSICOS DE VHDL
2.3. ENTITY
entity bp_detectorPar is
end entity bp_detectorPar;
97
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Los puertos declarados en la entity son visibles desde la propia entity y desde
las architecture asociadas a la entity.
- Las palabras reservadas in y out indican que la señal fluye hacia el circuito
o desde el circuito, respectivamente. Describen el hecho de que el puerto
correspondiente es una entrada o una salida del circuito.
Como ejemplo de uso del modo inout, en la Figura 2.2 se ilustra el funciona-
miento de un puerto I/0 bidireccional con doble buffer. Como las señales de control
de los buffers triestado están conectadas a señales enable complementarias, cuando
uno de los buffers está habilitado, el otro tiene la salida a alta impedancia.
dir ---~:>-----1
- bi
sig_in
-
Figura 2.2: Puerto I/0 bidireccional con doble buffer triestado.
98
CONCEPTOS BÁSICOS DE VHDL
Al describir los circuitos debe tenerse en cuenta que un puerto cuyo modo es out
no puede ser usado como una señal de entrada. Por ejemplo, consideremos el circuito
mostrado en la Figura 2.3. Podría pensarse en describir el circuito de la Figura 2.3
mediante el Código VHD L 2. 2.
a ¡...............................¡
X
..............................................
·8••••:
b
. ::::::::•! i. . Q ••moO
G; m::
......... . .... ..........
1..... : ........... .:. ... 1
y
::::::::::::::::::::::::::;:::::::::::::::::::
library IEEE;
use IEEE. std_logic_1164. all;
entity modoPuertos is
port ( x, y : out std_logic;
a, b : in std_logic ) ;
end entity modoPuertos;
architecture arch_incorrecta of modoPuertos is
begin
x <=a and b;
y <= not x; --MAL, pToduce eTTOT de compilación
end architecture arch_incorrecta;
Sin embargo, puesto que en dicho código se usa la señal x para calcular la señal
y, el compilador de VHDL considera que la señal x fluye hacia el circuito (véase
la Figura 2.4a). Esto contradice el hecho de que el modo de la señal x es out. La
consecuencia de ello es que se produce un error de compilación.
Una posible solución sería cambiar el modo del puerto x a inout. Sin embargo,
ésta no es una buena solución, ya que de hecho no se trata de un puerto bidireccional.
Una alternativa mucho mejor es definir una señal interna para representar el
resultado intermedio (véase la Figura 2.4b), tal como se muestra en el Código
VHDL 2.3.
99
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
a ,. . . . .. . . . . . . . .. . .
~:: ¡! o
b ;, - '
d .-. é;,.•
Interpretación del compilador de
VHDL sobre el flujo de la señal
: - ··~· · .•.
x
- -~
a
: 8····::·:.:.:: .:.-J
b
¡
¡o
¡
a) b)
Figura 2.4: a) La asignación y <= x hace que el compilador interprete que la señal x fluye hacia
el circuito; b) Definición de la señal ab.
library IEEE;
use IEEE. std_logic_1164. all;
entity modoPuertos is
port ( x, y : out std_logic;
a, b : in st<lJogic ) ;
end entity modoPuertos;
architecture arch_correcta of modoPuertos is
signa} ab : std_logic;
begin
ab <=a and b;
x <= ab;
y <= not ab;
end architecture arch_correcta;
Código VHDL 2.3: Descripción correcta del circuito mostrado en la Figura 2.3.
Las constantes generic son visibles desde la propia entity en que son declaradas y
desde las architecture asociadas a la entity. Ejemplos típicos de constantes generic
son el valor de determinados retardos, el número de bits de un bus de señales, etc.
Un ejemplo sencillo de declaración de entity incluyendo una cláusula generic es el
siguiente:
entity and2 is
generic ( Tpd: time);
port ( yO : out std_logic;
xO, x1 : in std_logic );
end entity and2;
100
CONCEPTOS BÁSICOS DE VHDL
Esta entity incluye una constante generic, Tpd, del tipo predefinido time.
El valor de esta constante generic puede ser usado en el cuerpo de cualquier
architecture asociada a esta entity. En la Sección 2.10 se volverá sobre este tema.
2.3.3. Declaraciones
entity bp is
constant WORD SZ integer := 16;
constant DELAY time 10 ns;
end entity bp;
2.3.4. Sentencias
101
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
en caso de que la entity contenga alguna sentencia. La declaración termina con las
palabras reservadas end entity seguidas del nombre asignado a la entity.
entity nombre_enti ty is
cláusula generic
cláusula port
declaraciones
begin
sentencias
end entity nombre_enti ty;
entity shiftReg is
generic (N : integer );
port ( SO out std_logic;
RSTn, clk, SI : in std_logic );
signal T: std_logic_vector( N downto O);
begin
assert (N>3) and (N<33)
report "N fuera del rango 4 a 32";
end entity shiftReg;
2.4. ARCHITECTURE
102
CONCEPTOS BÁSICOS DE VHDL
..-..................................,- ..-...................................-.
xo EG yO
:~ PI.. 2. ...lyo :~ l. ..!. . . . 2. . . .l yO
En los ejemplos mostrados en las Figuras 2.1 y 2.5 se ha dado el mismo nombre
a la entity y a la architecture de cada entidad de diseño. En general, se les puede
dar nombres diferentes. De hecho, como ya hemos visto, en VHDL pueden definirse
varias architecture para una misma entity. De este modo, es justamente a la hora
de realizar la simulación o la síntesis cuando se asocia una architecture en concreto
a la entity.
103
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
En la sentencia
104
CONCEPTOS BÁSICOS DE VHDL
calculándose el nuevo valor de yO. Este nuevo valor se asigna a la señal transcurrido
un tiempo 5.
e <= u and v;
La asignación concurrente
105
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
a
b
e
xl ---1
x2 ---1 y
x3 ---1
x4 ---1
y <= '1';
y <= a + b + e - 1;
y<= ( x1 and x2) or ( x3 and x4 );
la señal de salida y oscila entre los valores 'O' y '1' mientras la señal en vale 'O'.
106
CONCEPTOS BÁSICOS DE VHDL
expr_nuevo_valor_señal_n;
Si todas las expresiones booleanas valen false, el nuevo valor de la señal se calcula
evaluando expr _nuevo_ valor _señal_n. En cualquier caso, el nuevo valor calculado
se asigna a la señal una vez ha transcurrido un retardo, que por defecto vale 5.
107
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity decodificador4 is
port ( X : OUt std_logic_vector(3 downto 0);
s : in std_logic_vector( 1 downto O) ) ;
end entity decodificador4;
entity codificadorPrioridad4a2 is
port ( codigo : out std_logic_vector(1 downto O);
activo : out std_logic;
X : in std_logic_vector(3 downto 0) );
end entity codificadorPrioridad4a2;
108
CONCEPTOS BÁSICOS DE VHDL
expr_nuevo_valor_señal_n;
se emplean los circuitos necesarios para obtener cada uno de los nuevos valores de
la señal (expr_nuevo_valor_señal_1, ... , expr_nuevo_valor_señal_n), los circuitos
necesarios para obtener cada una de las expresiones booleanas (expr_booleana_1,
... , expr_booleana_n-1), y el circuito que implementa la red de prioridad.
expr_nuevo_valor_señal_l señal
expr_nuevo_valor_señal_2
expr_booleana_1
Figura 2. 7: Diagrama conceptual de la síntesis de una sentencia concurrente condicional con una
única cláusula when.
109
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
expr_nuevo_valor_señal_l
------------------------~ señal
expr_nuevo_valor_señal_2
expr_nuevo_valor_señal_3
expr_nuevo_valor_señal_4
expr_booleana_3
expr_booleana_2 -------------------.J
expr_booleana_1
Figura 2.8: Diagrama conceptual de la síntesis de una sentencia concurrente condicional con tres
cláusulas when.
el número de cláusulas when. Esto debe ser tenido en cuenta a la hora de diseñar
para síntesis.
110
CONCEPTOS BÁSICOS DE VHDL
entity mux4 is
port ( x : out std_logic_vector(7 downto O);
a, b, e, d : in std_logic_vector(7 downto O);
S : in std_logic_vector(1 downto o) );
end entity mux4;
architecture areh_selee of mux4 is
begin
with s select
x <= a when "00",
b when "01",
e when "10",
d when others;
end architecture areh_selee;
111
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
-- D ecodificador binario 2 a 4
-- fichero: decodificador2x4_archSelec. vhd
library IEEE;
use IEEE . std_logic_1164.all;
entity decodificador4 is
port ( x : out std_logic_vector(3 downto O);
s : in std_logic_vector ( 1 downto O) ) ;
end entity decodificador4;
architecture arch_decSelec of decodificador4 is
begin
with s select
x <= "0001" when "00",
"0010" when "01",
"0100" when "10",
"1000" when others;
end architecture arch_decSelec;
-- Codificador de prioridad 4 a 2
-- fichero: codificadorPrioridad4 a2_archSelec. vhd
library IEEE;
use IEEE. std_logic_1164. all;
entity codificadorPrioridad4a2 is
port ( codigo : out std_logic_vector( 1 downto O);
activo : out std_logic;
X : in std_logic_vector(3 downto 0) );
end entity codificadorPrioridad4a2;
112
CONCEPTOS BÁSICOS DE VHDL
expr_nuevo_valor_señal_n
m
señal
m
expr_nuevo_valor_señal_2
m
expr_nuevo_valor_señal_l
m
expresión_selección
expr_nuevo_valor_señal_3
1---~ c3
señal
'----~ c2
expr_nuevo_valor_señal_2 -------IC}
expr_nuevo_valor_señal_l
expresión_selección
donde se supone que la expresión de selección puede tomar cinco posibles valores:
cO, c1, c2, c3 y c4.
113
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Una asignación concurrente simple es sensible a todas las señales que intervienen
en la expresión para el cálculo del nuevo valor de la señal.
Una sentencia concurrente condicional es sensible a todas las señales que inter-
vienen en las expresiones para el cálculo del nuevo valor de la señal y también a
todas las señales que intervienen en las expresiones booleanas.
Una sentencia concurrente de selección es sensible a todas las señales que In-
tervienen en la expresión de selección y a todas las señales que intervienen en las
expresiones para el cálculo del nuevo valor de la señal.
begin
114
CONCEPTOS BÁSICOS DE VHDL
El bucle generate repite las sentencias concurrentes del cuerpo del bucle un
número fijo de iteraciones, que está determinado por el rango de valores rango_bucle.
Para que la sentencia sea sintetizable, es necesario que los límites del rango sean
estáticos.
El índice del bucle (índice) especifica el valor del rango de valores que co-
rresponde con la iteración actual, con lo cual va tomando los sucesivos valores
de rango_bucle. El índice del bucle (índice) no necesita ser declarado, ya que
automáticamente pertenece al mismo tipo de dato que rango_bucle.
115
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
116
CONCEPTOS BÁSICOS DE VHDL
Las variables declaradas dentro del bloque process son visibles sólo dentro del
bloque. El valor de una variable no puede pasarse directamente fuera del bloque
process. Cuando es necesario emplear el valor de una variable fuera del bloque
process, éste debe ser asignado a una señal. Las señales y las variables serán
estudiadas con detalle en la Sección 2.11.
Por otra parte, los bloques process se ejecuta concurrentemente unos respecto a
los otros. El bloque process en su conjunto se considera una sentencia concurrente
de alto nivel dentro de la definición de la architecture, al igual que las sentencias
concurrentes descritas en la Sección 2.5.
117
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Wait on
Se suspende la ejecución del código secuencial hasta que cambia el valor de una
o varias de las señales señal1, señal2, ... , señalN.
118
CONCEPTOS BÁSICOS DE VHDL
Wait until
Supongamos que clk es una señal de tipo std_logic, enable es una señal de tipo
boolean y ves una variable de tipo integer. Entonces, la condición booleana de la
sentencia
nunca serían evaluadas, ya que no contienen ninguna señal. La ejecución del bloque
process quedaría suspendida indefinidamente en esas sentencias.
Cuando cambia el valor de alguna de las señales señal1 , ... , señal N, entonces
se comprueba la expresión booleana. Si vale true, se reanuda la ejecución de las
sentencias del bloque process.
119
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Wait for
La sentencia wait for puede combinarse con las otras dos formas de la sentencia
wait. Por ejemplo, la sentencia
hace que la ejecución del código secuencial se suspenda hasta que una de las dos
siguientes condiciones se satisfaga:
Puede definirse la lista de señales a las cuales el bloque process es sensible. Esta
lista se escribe, entre paréntesis, a continuación de la palabra reservada process.
En este caso, el bloque process es ejecutado sólo en el instante en que una o varias
de estas señales a las que es sensible cambia de valor. En la lista de sensibilidad
sólo pueden incluirse señales que puedan ser leídas. Es decir, no pueden incluirse los
puertos de salida.
120
CONCEPTOS BÁSICOS DE VHDL
Código VHDL 2.10: Biestable D con reset asíncrono activado al nivel LOW.
121
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
situada como última sentencia del código secuencial, donde las señales que aparecen
en la sentencia wait son las de la lista de sensibilidad. Por ejemplo, los dos bloques
process siguientes son equivalentes:
122
CONCEPTOS BÁSICOS DE VHDL
las señales su nuevo valor una vez ha finalizado la ejecución de todas las sentencias
del bloque.
es equivalente a:
123
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
variable := expr_nuevo_valor_variable;
o
No se produce retardo en las asignaciones a variables. Es decir, se asigna el
nuevo valor a la variable en el mismo instante en que se evalúa la expresión. Por
ejemplo, consideremos el siguiente fragmento de código:
Obsérvese que las variables son locales al bloque process y por ello tienen que
ser declaradas dentro del bloque.
2.8.3. Sentencia if
if expresión_booleana_1 then
sentencias_secuenciales
elsif expresión_booleana_2 then
sentencias_secuenciales
el se
sentencias secuenciales
end if;
124
CONCEPTOS BÁSICOS DE VHDL
Obsérvese que cada una de las ramas de la sentencia if puede consistir en varias
sentencias secuenciales, entre las cuales pueden encontrarse otras sentencias if.
entity mux4 is
port ( x : out std_logic_vector(7 downto O);
a, b, e, d : in std_logic_vector(7 downto O);
S : in std_logic_vector ( 1 downto O) ) ;
end entity mux4;
125
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
-- Decodificador binario 2 a 4
-- fichero: decodificador2x4_archProcessif. vhd
library IEEE;
use IEEE. std_logic_1164. all;
entity decodificador4 is
port ( x : out std_logic_vector(3 downto O);
s : in std_logic_vector ( 1 downto O) ) ;
end entity decodificador4;
-- Codificador de prioridad 4 a 2
-- fichero: codificadorPrioridad4a2_archProciJ. vhd
library IEEE;
use IEEE. std_logic_1164. all;
entity codificadorPrioridad4a2 is
port ( codigo out std_logic_vector(1 downto O);
activo out std_logic;
x : in std_logic_vector ( 3 downto O) ) ;
end entity codificadorPrioridad4a2;
126
CONCEPTOS BÁSICOS DE VHDL
Una cuestión que debe tenerse en cuenta es que cuando se asigna valor a una señal
en alguna de las ramas de una sentencia if, pero no en todas las ramas, entonces
se está introduciendo "memoria" en el circuito. Es decir, la síntesis de ese código
VHDL dará lugar a un circuito secuencial. Esta situación se produce siempre que
no existe la rama else, ya que en este caso no hay sentencias de asignación a las
señales en caso de que todas las expresiones booleanas valgan false. Así pues, si se
desea sintetizar un circuito combinacional, debe incluirse la rama else.
Por ejemplo, supongamos que se programa el siguiente bloque process con el fin
de describir un circuito comparador con dos entradas (a y b) y tres salidas (mayor,
menor e igual), cuyo valor es '1' cuando se satisface la condición a>b, a<b o a=b,
respectivamente.
process ( a, b )
begin
if a > b ) then
mayor <= ' 1' ;
menor <= '0';
igual <= '0';
elsif ( a < b ) then
mayor <= '0';
menor<= '1';
127
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
process e a, b )
begin
mayor <= '0';
menor <= '0';
igual <= '0';
if e a > b ) then
mayor <= ' 1 ' ;
elsif e a < b ) then
menor <= ' 1 ' ;
el se
igual <= ' 1 ' ;
end if;
end process;
Recuérdese que si se realizan varias asignaciones con retardo 6 a una misma señal
en un bloque process con lista de sensibilidad, sólo tiene efecto la última asignación
a la señal. En el código anterior, si se realiza una asignación a la señal en la rama de
la sentencia if, entonces esa es la asignación que tiene efecto. Si no se asigna valor a
la señal en la sentencia if, entonces tiene efecto la asignación del valor por defecto
(valor '0'). En cualquier caso, se asigna valor a las tres señales.
En los diseños de los circuitos es una buena práctica asignar valores por defecto
a las señales al comienzo del bloque process, cubriendo de esta forma los valores
no asignados en las ramas de la sentencia if.
128
CONCEPTOS BÁSICOS DE VHDL
case expresión_case is
when valor_1 =>
sentencias_secuenciales
when valor _2 =>
sentencias_secuenciales
Cada término valor _i debe ser un valor o conjunto de valores que puede tomar
expresión_case. Los valores valor_1, ... , valor_n deben ser exclusivos entre sí y
deben cubrir completamente el conjunto de valores posibles de expresión_case.
Puede emplearse others en la última selección para cubrir todos los valores no
considerados.
entity mux4 is
port ( x : out std_logic_vector(? downto O);
a, b, e, d : in std_logic_vector(7 downto O);
s : in std_logic_vector ( 1 downto O) ) ;
end entity mux4;
architecture areh_proeCase of mux4 is
begin
process ( a, b, e, d, s )
begin
case s is
when "00" =>
x <=a;
when "01" =>
X<= b;
when "10" =>
x <=e;
w hen others = >
X<= d;
end case;
end process;
end architecture areh_proeCase;
129
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
-- D ecodificador binario 2 a 4
-- fi chero: decod~ficador2x4_ archProcess Case . vhd
library IEEE;
use IEEE. std_logic_1164. all;
entity decodificador4 is
port ( x : out std_logic_vector(3 downto O);
s : in std_logic_vector ( 1 downto O) ) ;
end entity decodificador4;
-- Codificador de prioridad 4 a 2
-- fi chero: codificadorPrioridad4 a2_archProcCase. vhd
library IEEE;
use IEEE . std_logic_1164. all;
entity codificadorPrioridad4a2 is
port ( codigo out std_logic_vector( 1 downto O);
activo out std_logic;
X : in std_logic_vector(3 downto 0) );
end entity codificadorPrioridad4a2; ·
130
CONCEPTOS BÁSICOS DE VHDL
Por otra parte, si se asigna valor a alguna señal en unas ramas de la sentencia case
y no en otras, se está introduciendo "memoria" en el circuito, ya que la semántica
de VHDL especifica que si no se asigna valor a una señal, entonces ésta conserva su
valor anterior.
131
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
VHDL proporciona varios tipos de bucle, tales como los bucles for y while, así
como sentencias para el control de la ejecución del bucle, como la sentencia exit,
que hace que no se ejecuten las restantes iteraciones del bucle, o la sentencia next,
que hace que no se ejecuten las restantes sentencias de la iteración actual. De todas
estas sentencias, sólo un conjunto muy restringido puede ser usado para síntesis.
En esta sección nos limitaremos a presentar la sentencia for simple, que se emplea
para representar de manera abreviada la repetición de un conjunto de sentencias.
La sintaxis de esta sentencia es básicamente la siguiente:
132
CONCEPTOS BÁSICOS DE VHDL
El bucle for anterior repite las sentencias secuenciales del cuerpo del bucle un
número fijo de iteraciones, que está determinado por el rango de valores rango_bucle.
El índice del bucle (índice) especifica el valor del rango de valores que corresponde
con la iteración actual, con lo cual va tomando los sucesivos valores de rango_bucle.
El índice del bucle (índice) no necesita ser declarado, ya que automáticamente
pertenece al mismo tipo de dato que rango_bucle.
Para que el bucle for pueda ser sintetizado, es preciso que rango_bucle quede
fijado en el momento de la síntesis, no pudiendo cambiar en función del valor de las
señales de entrada.
Los dos ejemplos siguientes pretenden ilustrar el uso de la sentencia for. El primer
ejemplo, mostrado en el Código VHDL 2.17, es un circuito que realiza bit a bit la
operación XOR de dos señales, cada una de las cuales tiene 4 bits. El rango del bucle
es (WIDTH-1) downto O. Se ha definido la constante WIDTH para hacer el código más
fácilmente legible y sencillo de modificar en el futuro. El índice del bucle es i: es
local al bucle y no necesita ser declarado. El índice toma el valor 3 en la primera
iteración del bucle, el valor 2 en la segunda iteración y así sucesivamente, hasta que
en la última iteración adquiere el valor O.
133
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Similarmente, el código plano correspondiente al bucle for del Código VHDL 2.18
es el mostrado a continuación:
134
CONCEPTOS BÁSICOS DE VHDL
Puede considerarse que el bucle for es una forma abreviada de escribir sentencias
repetitivas. El rango del bucle puede emplearse para especificar el número de réplicas
que debe realizarse del hardware, lo cual facilita la parametrización de los diseños,
por ejemplo, permitiendo ajustar el número de bits del circuito.
component nombre_componente is
cláusula_generic;
cláusula_port;
end component nombre_ componente;
135
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Como puede observarse en la Figura 2.11b, este circuito multiplexor está com-
puesto por un inversor ( inv _1), dos puertas AND de dos entradas (AND2_1, AND2_2)
y una puerta OR de dos entradas (OR2_1). Las señales n1, n2 y n3 tienen por objeto
describir la conexión entre los componentes.
136
CONCEPTOS BÁSICOS DE VHDL
MUX2:1
iO
d
il
sO
a) b)
-- MUX 2: 1 de 1 bit
-- fich ero: mux2_1 b'it. vhd
library IEEE; use IEEE.std_logic_1164.all;
entity Mux2_1bit is
port ( d :out std_logic;
iO, i1 : in std_logic;
sO : in std_logic ) ;
end entity Mux2_1 bit;
Código VHDL 2.19: Descripción estructural al nivel de puertas lógicas de un multiplexor de dos
señales de un bit.
137
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
í------------------------------------1
1 1
1
1 MUX2:1 1
1
~ iO
1
1
1 d3
d
hl...:~ i 1
sO
MUX2:1
a2 iO d2
b2: d
il
sO
MUX2:1
al iO dl
bl : d
il
sO
MUX2:1
aO iO dO
1
d ..... ~
bO 1
il 1
1
1
1
sO 1
1
: -Á :
L------------------ ------- -----~-----1
sO
138
CONCEPTOS BÁSICOS DE VHDL
139
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
y(5) y(7)
iO(O) i1(0) i0(1) i1(1) i0(2) i1(2) i0(3) i1(3) i0(4) i1(4) i0(5) i1(5) i0(6) i1(6) i0(7) i1(7)
140
CONCEPTOS BÁSICOS DE VHDL
parity_IN(O)
parity_IN(7)
entity paridad is
port ( pari ty : out std_logic;
parity_IN : in std_logic_vector(? downto O));
end entity paridad;
architecture paridad of paridad is
signal temp: std_logic_vector(6 downto O);
component xor2 is
port ( yO : out std_logic;
xO, x1 : in std_logic );
end component xor2;
begin
intermedio: if I /= O generate
resto_xor: xor2
port map (temp(I), temp(I-1), parity_IN(I+1));
end generate intermedio;
end generate gen_array;
141
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
2.10. PARAMETRIZACIÓN
entity and2 is
generic ( Tpd: time);
port ( yO out std_logic;
xO, xl : in std_logic );
end entity and2;
142
CONCEPTOSBÁffiCOSDEVHDL
- Las señales corresponden con las señales lógicas reales existentes en el circuito.
Se emplean señales para representar datos a los que deba asignarse valor fuera
de los bloques secuenciales (process, function y procedure), y datos que
necesitan ser transferidos desde un puerto de entrada o a un puerto de salida.
Los puertos sólo pueden ser señales.
- Las variables pueden o no corresponder con señales físicas reales. Dos ejemplos
típicos de uso de las variables son los siguientes:
Cuando hace falta realizar una serie de cálculos para poder asignarle valor
a una señal, se definen nuevas variables, se hacen los cálculos usando esas
variables, y finalmente se asigna el resultado de los cálculos a la señal.
Puesto que una señal de salida (un puerto cuyo modo es out) no puede
ser leída, puede ser necesario definir una variable, leer y escribir sobre esa
variable tantas veces como sea necesario, y finalmente asignar esa variable
a la señal de salida.
143
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Sólo puede asignarse valor a las variables en sentencias incluidas dentro de los
bloques de código secuencial. La asignación a la variable del nuevo valor se
realiza inmediatamente. Es decir, sin ningún retardo.
144
CONCEPTOSBÁffiCOSDEVHDL
Debe tenerse en cuenta que las señales definidas en el port de una entity
tienen una dirección, lo cual condiciona su uso: no puede leerse el valor de una
señal de salida (out), ni asignarse un valor a una señal de entrada (in).
Las señales declaradas en la definición de la architecture puede ser usadas
tanto en la parte derecha como en la izquierda de las asignaciones.
tmp := O; tmp := O;
for i in 2 downto O loop for i in (BUS_WIDTH-1) downto O loop
tmp := tmp xor a(i); tmp := tmp xor a(i);
end loop; end loop;
145
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
La motivación que hay detrás de hacer que un lenguaje sea fuertemente tipado
es facilitar la detección de errores de programación. Por ejemplo, si se asigna un
valor booleano a una señal del tipo integer, entonces el entorno de simulación puede
detectar el error en la fase de análisis. La desventaja de este tipo de lenguajes es que
precisan de la definición de funciones para la conversión entre tipos de datos, cuyo
uso en ocasiones dificulta la programación y la comprensión del código.
En VHDL se emplean tipos de datos para modelar las señales, variables y cons-
tantes. Estos tipos de datos pueden ser los estándar de VHDL o bien tipos definidos
por el programador. Los tipos de datos más comúnmente usados para las señales
son los tipos estándar std_logic, std_logic_vector, signed y unsigned.
El programador puede definir sus propios tipos de datos, bien como un subconjun-
to de los tipos de datos estándar, o bien puede definir sus propios tipos enumerados.
En teoría, cualquier tipo de dato con un número finito de valores puede hacerse
corresponder con un conjunto de representaciones binarias, y por tanto puede ser
realizado en hardware.
Hay cerca de una docena de tipos de datos predefinidos en VHDL estándar IEEE
1076. De ellos, sólo algunos son relevantes desde el punto de vista de la síntesis:
integer VHDL no define el rango exacto de valores del tipo integer, pero
especifica que el rango mínimo debe ser desde -(2 31 - 1) hasta
231 - 1, que corresponde con 32 bits. Dos tipos de datos relacionados
(formalmente denominados subtipos) son natural y positive. El
primero incluye el cero y los números positivos, mientras que el
segundo incluye sólo los números positivos.
boolean Puede tomar dos valores: false, true.
bit Puede tomar dos valores: 'O' , ' 1 ' .
bit_vector Vector unidimensional de elementos del tipo bit.
146
CONCEPTOS BÁSICOS DE VHDL
La longitud del literal cadena de bits es el número de valores del tipo bit en la
secuencia representada. Por ejemplo, los cuatro literales
Operadores
Durante la síntesis, los operadores que se emplean en el código VHDL deben ser
implementados mediante componentes físicos. La complejidad del hardware asociado
a cada operador varía significativamente. Los operadores de desplazamiento (sil, srl,
sla, sra, rol, ror) y el operador xnor no están definidos en VHDL'87 y no están
incluidos en el estándar de síntesis IEEE 1076.6 RTL, que define el subconjunto de
VHD L a emplear para síntesis.
En la Tabla 2.2 se indica la precedencia de los operadores, los cuales han si-
do clasificados en siete grupos. Los operadores del mismo grupo tienen la misma
precedencia. Por ejemplo, en la expresión siguiente:
a + b > e or a < d
147
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Precedencia Operadores
Mayor
** abs not
* 1 mod rem
+ (identidad y negación)
& + (suma y resta)
sll srl sla sra rol ror
/= < <= > >=
Menor and or nand nor xor xnor
148
CONCEPTOS BÁSICOS DE VHDL
a + b + e + d
ea and b ) or ee and d )
a + b > e or a < d
e e a + b ) > e ) or e a < d )
Ambas expresiones son equivalentes, pero la segunda es más descriptiva y por ello
más sencilla de interpretar. En definitiva, es código más fácilmente comprensible.
El propósito original del tipo de dato bit era representar los dos valores binarios
usados en el álgebra booleana y la lógica digital. Obsérvese que la información se
comunica dentro de un sistema digital usando señales de valor binario (O ó 1). En
los sistemas de lógica positiva, cuando el voltaje de la señal tiene un valor "alto",
representa un 1 lógico, y cuando toma un valor "bajo" representa un O lógico.
149
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
5V
Ilógico
3.5V
1.5 V
} Valor lógico
indefinido
O lógico
ov
Figura 2.15: Rangos típicos de voltaje para O y 1 lógicos en tecnologías CMOS de 5 voltios.
Aunque todas las señales son interpretadas en los sistemas digitales como O y 1
lógicos, no siempre es posible modelar y simular los sistemas digitales usando sólo
señales O lógico y 1lógico. En un sistema real la señal puede tener otros valores. Por
ejemplo, puede valer "alta impedancia" a la salida de un buffer triestado. Asimismo,
puede tomar un valor intermedio entre los valores O y 1 lógicos, debido a que la
señal es generada por dos drivers, uno que intenta ponerla a O lógico y el otro que
intenta ponerla a 1 lógico. Por otra parte, el valor de algunas señales puede no ser
conocido en determinado intervalo de tiempo de la simulación, por ejemplo porque
esas señales todavía no hayan sido inicializadas, es decir, no se les haya asignado
valor.
Con el fin de reflejar mejor las propiedades del hardware digital, en el estándar
IEEE 1164 se introdujeron nuevos tipos de datos, que extendían los tipos bit y
bit_vector.
Para poder usar en los diseños estos tipos de dato, es necesario especificar que se
desea usar el paquete IEEE. std_logic_1164. Esto se hace escribiendo las siguientes
sentencias al comienzo del código, donde library y use son palabras reservadas:
library IEEE;
use IEEE.std_logic_1164.all;
150
CONCEPTOS BÁSICOS DE VHDL
std.Jogic
El tipo de dato std_logic pueden tomar nueve valores. Además de los valores
'O' y ' 1 ' , pueden tomar otros valores usados para modelar valores intermedios o
desconocidos de la señal. De estos valores, los más comunes son los tres siguientes:
'U' El valor de la señal está sin inicializar. Es decir, aún no se ha asignado valor a
la señal.
'Z' Alta impedancia. El valor indica que la señal ha quedado desconectada. Los
buffers triestado proporcionan una salida con este valor (véase la Sección l. 9.1).
Los restantes posibles valores de una señal del tipo std_logic son: 'W' (descono-
cida débil), 'L' (cero débil), 'H' (uno débil) y'-' (don't care, que puede traducirse
como "no importa").
Los valores 'L' (cero débil) y 'H' (uno débil) indican que la señal es obtenida de
circuitos de lógica cableada, en los cuales la corriente es débil. En la actualidad estos
valores raramente se usan, ya que no suelen emplearse circuitos de lógica cableada.
El valor '-' ( don't ca re) se usa para facilitar el diseño lógico. Puede usarse como
valor de entrada, con el fin de hacer más compacta y fácil de entender la tabla de la
verdad. Por ejemplo, la tabla de la verdad del codificador 4 a 2 con prioridad diseñado
en el Código VHDL 2.6, 2.9, 2.13 y 2.16 puede expresarse de manera compacta y
descriptiva usando don't care:
X codigo activo
1 - - - 1 1 1
o1 1 o 1
oo 1 o1 1
oo o 1 oo 1
oo o o oo o
151
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Cuando don't care se usa como valor de salida, indica que el valor exacto ('O' ó
'1 ') no es importante. Esto ocurre cuando algunas de las combinaciones de entrada
no son usadas. Al indicar que la salida es don't care, se deja libertad al algoritmo de
síntesis para que asigne a la salida aquel valor que permita reducir la complejidad
del circuito.
- Los valores '-'y 'X' son interpretados como don't care. Así, en algunos diseños
mostrados en el Tema 6 se usará 'X' como don't ca re.
std_logic_ vector
La declaración indica que la señal tiene 8 bits, que están indexados desde 7 hasta
O. El bits más significativo, es decir, el situado más a la izquierda, tiene el índice 7.
El bit menos significativo, es decir, el situado más a la derecha, tiene el índice O.
Es posible acceder a uno de los bits usando su índice. Por ejemplo: a(2), a(7).
También, es posible acceder a una conjunto de bits especificando su rango. Por
ejemplo: a(7 downto 2), a(2 downto O).
152
CONCEPTOS BÁSICOS DE VHDL
En este caso, el bit más significativo (situado más a la izquierda) tiene el índice
O, lo cual puede inducir a error si el bus o vector es interpretado como un número
binario. Por ello, no usaremos esa forma en este libro.
Operadores
Conversión de tipos
Por ejemplo, pueden realizarse las siguientes asignaciones entre estas señales:
153
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
s1 <= to_stdlogicvector( b1 );
b2 <= to_bitvector( s1 and s2 );
s3 <= to_stdlogicvector( b1 ) or s2;
Operadores relacionales
Los operadores relacionales (=, /=, <, <=, >, >=) pueden ser empleados para
comparar dos datos de tipo vector. Los dos operandos deben tener el mismo tipo de
elementos, pero sus longitudes pueden ser diferentes.
Cuando se aplica el operador, los dos vectores son comparados elemento a elemen-
to. La comparación comienza por el elemento situado más a la izquierda y continúa
hasta que puede establecerse cuál es el resultado. Si se alcanza el final de un vector
antes que el final del otro, entonces se considera que el primer vector (el de menor
longitud) es menor que el segundo, y por tanto, se considera que los dos vectores no
son iguales.
Por ejemplo, cada una de las siguientes operaciones devuelve el valor true:
11
o11 = o11
11 11 11
'
11
o11 11
> 11
o1o
11
'
11
o11 11
>11 0001 o11 '
11
o11 o
11
> 11
o11 11
if ( s1 = s2 ) then
el se
154
CONCEPTOS BÁSICOS DE VHDL
Operador concatenación
La siguiente sentencia rota los elementos del vector hacia la derecha dos posicio-
nes:
Agregación de vectores
y<= "10101010";
es equivalente a:
y <= e, 1 , , , o, , , 1 , , , o, , , 1, , , o, , , 1, , , o, ) ;
También, puede emplearse la forma
155
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
para especificar de manera explícita el valor para cada índice. Esta forma de agrega-
ción se denomina asociación mediante nombre. La sentencia anterior puede escribirse
de la forma siguiente:
y <= ( 7 => ' 1 ' ' 6 => 'o' ' 5 => ' 1 ' ' 4 => 'o' '
3 => ' 1 ' ' 2 => 'o' ' 1 => ' 1' ' o => 'o' ) ;
y <= ( 7 => ' 1 ' ' 3 => ' 1 ' ' 5 => ' 1 ' ' 1 => ' 1 ' '
6 => 'o' ' 2 => 'o' ' 4 => 'o' ' o => 'o' ) ;
Esta asignación indica que el valor asignado al componente con índice 7 (es
decir, y(7)) es '1', que el valor asignado el componente con índice 6 es '0', y así
sucesivamente.
o bien, emplear la palabra reservada others para referirse a todos los índices que
no han sido nombrados. Por ejemplo:
156
CONCEPTOS BÁSICOS DE VHDL
Sí pueden realizarse operaciones aritméticas sobre los datos del tipo integer. Por
ejemplo, para realizar la suma de las señales a y b, puede emplearse el tipo integer:
suma <= a + b;
unsigned y signed
Obsérvese que los tres tipos de dato std_logic_vector, unsigned y signed están
definidos como vectores de elementos del tipo std_logic. Puesto que VHDL es un
lenguaje fuertemente tipado, estos tres tipos son considerados como tipos de datos
independientes, lo cual por otra parte es razonable ya que los tres tipos de dato son
interpretados de manera diferente.
157
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Puesto que los tipos de dato unsigned y signed son vectores, sus declaraciones
son similares a las del tipo std_logic_vector. Por ejemplo:
Para poder usar los tipos de dato unsigned y signed, debe incluirse la sentencia
especificando que va a usarse el paquete IEEE. numerie_std. Asimismo, puesto que
el paquete IEEE. numeric_std emplea el tipo de dato std_logic, debe indicarse que
va a usarse el paquete IEEE. std_logic_1164. Es decir, las primeras sentencias del
diseño deben ser:
library IEEE;
use IEEE.std_logie_1164.all;
use IEEE.numerie_std.all;
Operadores
a <= b + e;
d <= b + 1;
e <= ( 5 + a + b ) - e;
Los operadores relacionales (=, !=, <, <=, >, >=) han sido sobrecargados. Los
operadores relacionales aplicados a datos del tipo unsigned o signed no comparan
los componentes del vector elemento a elemento, sino que interpretan los vectores
como números binarios.
158
CONCEPTOS BÁSICOS DE VHDL
Si el tipo de dato de los dos operandos es unsigned, entonces los operandos son
interpretados como 3 y 8 respectivamente. La expresión vale nuevamente false.
Sin embargo, si el tipo de los operandos es signed, entonces estos son interpre-
tados como 3 y -8, con lo cual la expresión vale true.
Funciones
- shift_left (a, b), shift_right (a, b), rotate_left (a, b), rotate_right (a, b):
se emplean para realizar las operaciones de desplazamiento y rotación. El
operando a es de tipo unsigned o signed, mientras que bes de tipo natural.
El resultado es del mismo tipo que el operando a.
Se trata de nuevas funciones, no de los operadores de VHDL sobrecargados.
Esta distinción es importante, ya que las herramientas de síntesis soportan
estas funciones de desplazamiento del paquete IEEE. numeric_std, mientras que
no soportan los operadores de desplazamiento de VHDL.
- resize (a, b): se emplea para modificar el tamaño (es decir, el número de bits)
del operando a, que debe ser del tipo unsigned y signed. El operando b es
de tipo natural y representa el nuevo número de bits del dato. El resultado
es del mismo tipo que el operando a.
- std_match(a, b): se emplea para comparar vectores que tienen el valor'-' (don't
care). El operando a debe ser del tipo unsigned, signed std_logic_vector o
std_logic. El operando b debe ser del mismo tipo que a. El resultado es del
tipo boolean.
159
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
X codigo activo
1 - - -
1 1 1
o1 1 o 1
oo 1 o1 1
oo o 1 oo 1
oo o o oo o
La función std_match permite comparar vectores con bits don't care. En este
caso, la señal codigo podría definirse de la forma siguiente:
-- Diseño correcto
use IEEE.numeric_std.all;
160
CONCEPTOS BÁSICOS DE VHDL
u1 <= unsigned( x1 ) ;
x2 <= std_logic_vector( u2 );
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
161
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Las operaciones aritméticas no están sobrecargadas para la mezcla entre los tipos
signed y unsigned, por lo tanto, la sentencia siguiente produce error:
Para poder realizar la asignación, es necesario convertir el dato del tipo signed
a unsigned:
Las siguientes dos asignaciones a señales del tipo std_logic_vector son incorrec-
tas:
162
CONCEPTOS BÁSICOS DE VHDL
Los tipos de datos time y string son útiles, en el proceso de depuración ( debug-
ging) del modelo, para mostrar mensajes que son generados durante la simulación.
Las variables del tipo time son usadas para representar el tiempo simulado. La
unidad por defecto de este tipo de variables es el fs (femtosegundo = 10- 15 s). Los
valores del tiempo pueden representarse en otras unidades escribiendo la unidad
de tiempo tras el valor del tiempo, el cual es escrito como una constante entera o
real. Las unidades de tiempo disponibles son: fs, ps, ns, us (microsegundos), ms,
sec, min y hr (horas). Además, existe una función estándar (llamada now, sin
argumentos), que devuelve el valor actual del tiempo simulado.
163
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Tipos enumerados
Por ejemplo, supongamos una señal llamada opcode, que representa el código de
operación de un circuito. Suponiendo que sólo puede tomar cuatro valores (suma,
resta, salto y parar), entonces es posible definir un nuevo tipo (type), llamado, por
ejemplo, opcode_ type, de la manera siguiente:
Este tipo de construcción hace el código VHDL más sencillo de entender. Sin
embargo, esta forma de realizar el modelo no permite especificar explícitamente el
código binario correspondiente a cada uno de los códigos de operación.
164
CONCEPTOS BÁSICOS DE VHDL
VHDL permite al usuario definir sus propios tipos vectoriales. Por ejemplo,
vectores lD en los cuales los componentes sean a su vez de tipo vectorial lD, por
ejemplo std_logic_vector. Estos vectores unidimensionales, cuyos componentes son
a su vez vectores unidimensionales, se denominan vectores lD x lD.
Supongamos que se quiere definir un nuevo tipo vectorial lD x lD, que sea un
vector de 4 componentes, donde cada uno de los componentes sea a su vez un vector
de 8 componentes del tipo std_logic. El nuevo tipo, al que se asigna el nombre
regFile_ type, puede declararse de la forma siguiente:
Puede declararse una constante y una señal de este tipo, a las cuales se asignan
los nombres data y reg_f ile respectivamente, y asignar valor a la constante, de la
forma mostrada a continuación:
Para referirse a los elementos de los objetos de tipo vectoriallD x lD, se emplean
dos pares de paréntesis. Por ejemplo, reg_file (2) (3).
165
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Para referirse a los elementos de los objetos de tipo vectorial 2D, se emplea un
único par de paréntesis. Por ejemplo, mem_data (2, 3).
2.13. ATRIBUTOS
Puede considerarse que los atributos son propiedades de los tipos de datos. No
todos los atributos de los tipos estándar de datos son soportados para síntesis. En
la Tabla 2.5 se muestran algunos de los atributos que son soportados por la mayoría
de las herramientas de síntesis. Por otra parte, VHDL permite al usuario definir sus
propios atributos.
Asimismo, existen atributos que resultan útiles para programar bancos de prueba
y que, por tanto, no necesitan ser sintetizados. Un atributo particularmente útil es
<tipo>'image(señal)
el cual se usa para convertir el valor de una señal a un string, de modo que pueda
ser mostrado en la consola (con el fin de depurar o monitorizar).
166
CONCEPTOS BÁSICOS DE VHDL
Tabla 2.5: Algunos atributos soportados por la mayoría de las herramientas de síntesis. La
nomenclatura empleada en la tabla se explica a continuación. < tipo > : tipo de dato. < vectorlD > :
tipo vectorial lD. <señal> : señal.
Atributo Significado
<tipo>' Indica que el argumento es del tipo <tipo>.
Por ejemplo, unsigned' ( "00") establece que
"00" se usa como unsigned, en lugar de como
bit_vector o std_logic_vector.
<vector1D>'range Rango de índices de un vector lD
<vector1D>'reverse_range Rango de índices del vector lD, en orden inverso
<vector1D>'length Número de componentes del vector lD
<vector1D>'low Índice más pequeño del vector
<vector1D>'high Índice más grande del vector
<vector1D>'left Índice del componente más a la izquierda
<vector1D>'right Índice del componente más a la derecha
<señal>'stable true mientras no hay cambios en <señal>
<señal>'event true sólo cuando hay un cambio en <señal>
para detectar el flanco de subida de la señal de reloj. Sin embargo, puesto que este
predicado es también cierto cuando la señal el k cambia del valor 'U' (no inicializado)
o del valor 'X' (desconocido forzado) a ' 1' , en VHD L'93 se usa
rising_edge(clk)
falling_edge(clk)
2.14. LIBRERÍAS
167
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
A excepción de los tipos bit y bit_vector, todos los demás tipos precisan de la
inclusión de alguna librería de diseño. Por ejemplo, es necesario usar la librería de
IEEE (que es proporcionada en todos los simuladores) para poder usar los tipos de
datos std_logic, std_logic_vector, unsigned y signed.
Por este motivo, además de especificar qué librerías deben ser incluidas, conviene
que el diseñador indique qué paquetes en concreto de la librería son usados en la
definición del circuito. Si no se especifica el paquete, o si un mismo objeto está
definido en varios paquetes, es preciso referirse a él usando la notación punto:
librería.paquete.objeto
Entre los paquetes más comúnmente usados, cabe mencionar los siguientes, per-
tenecientes a la librería IEEE:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
168
CONCEPTOS BÁSICOS DE VHDL
Las herramientas de simulación y síntesis con VHDL suelen incluir otras librerías,
que pueden ser examinadas desde la propia herramienta.
Existen librerías y paquetes que son cargados por defecto, con lo cual no necesitan
ser incluidas. Las más notables son las dos siguientes:
work Librería por defecto donde se compilan todos los tipos, las
funciones, entity, architecture, package, etc. definidos
por el usuario.
std Contiene la mayoría de las definiciones y construcciones
estándar soportadas por VHDL.
2.15. ASSERT
note No es un error.
warning Aviso.
error Error.
failure Error grave que provoca que termine la simulación.
169
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
2.16. SUBPROGRAMAS
2.16.1. Funciones
170
CONCEPTOS BÁSICOS DE VHDL
si se trata de una señal. El tipo del parámetro formal puede ser cualquiera de los
tipos sintetizables, boolean, std_logic, integer, etc.
end function f;
recibe tres parámetros formales: las constant c1 y c2, de tipo integer, y la signal
s, de tipo std_logic_vector. Obsérvese que no se especifica el rango de valores de
los parámetros enteros, ni tampoco el rango del índice del parámetro vectorial. El
valor que devuelve la función es de tipo boolean.
171
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
begin
y < = conv _integer(a);
end architecture conv _int;
Código VHDL 2.23: La función conv_integer convierte un parámetro del tipo std_logic_vector
a un entero.
2.16.2. Procedimientos
172
CONCEPTOS BÁSICOS DE VHDL
- Un parámetro formal out o inout es por defecto una variable, a menos que se
indique explícitamente que es una señal.
173
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
tiene tres entradas: la constante de tipo std_logic a, y las señales del tipo std_logic b
y c. Se ha omitido la palabra reservada constant para el primer parámetro formal de
entrada, ya que por defecto se sobreentiende que es una constante. El procedimiento
tiene dos parámetros formales de salida: las señales x e y. Esta última tiene el modo
inout.
La invocación del procedimiento es una sentencia por sí misma, que puede formar
parte de código concurrente o secuencial.
174
CONCEPTOS BÁSICOS DE VHDL
entity minMax is
generic ( 1 imite : integer : = 255 ) ;
port ( min_out, max_out : out integer range O to limite;
ena : in std_logic;
d1_in, d2_in : in integer range O to limite );
end entity minMax;
architecture minMax of minMax is
procedure ordena ( signal in1, in2 : in integer range O to limite;
signal min, max : out integer range O to limite ) is
begin
if (in1>in2) then
max <= in1;
min <= in2;
else
max <= in2;
min <= in1;
end if;
end procedure ordena;
begin
process (e na)
begin
if (e na= ' 1 ' ) then
ordena(d1_in, d2_in, min_out, max_out);
end if;
end process;
end architecture minMax;
Código VHDL 2.24: Procedimiento que devuelve dos parámetros de entrada ordenados.
175
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
2.17. PAQUETES
package nombre_paquete is
declaraciones
end package nombre_paquete;
2. La segunda parte, esto es, el cuerpo del paquete (package body), es necesaria
sólo cuando se han declarado subprogramas (procedimientos o funciones) en
176
CONCEPTOS BÁSICOS DE VHDL
library IEEE;
use IEEE.std_logic_1164.all;
package ejemplo! is
type estado is (st1, st2, st3, st4);
constant datoinicial : std_logic_vector(7 downto O) "11111111";
end package ejemplo!;
use work.ejemplo1.all;
177
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
package pack1 is
function conv_integer (signal vector : std_logic_vector)
return integer;
end package pack1;
178
CONCEPTOS BÁSICOS DE VHDL
179
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Ejercicio 2.1
x OR2_1
e=:>-·-·-- : r····························· ¡
:~:;;~_ xory
OR2_2
,. ............................ NOT
z 1 xoryorz
>D--!--_..r·~· ::::::: ·:~·
..~. ~. -=.~-. ..
-r-
1 - - - - - - - - . . - , '
>--i--------+---1
: .............................. ;
: ......................;
Ejercicio 2.2
Realice nuevamente el diseño del circuito mostrado en la Figura 2.16, pero esta
vez describa la estructura del circuito, usando como componentes dos puertas OR
de dos entradas y una puerta inversora.
Ejercicio 2.3
Dado el Código VHDL 2.27, indique cuál es el valor de las señales x1, x2, x3, x4,
x5, x6, x7 y x8 una vez se han realizado las operaciones de asignación.
180
CONCEPTOS BÁSICOS DE VHDL
library IEEE;
use IEEE. std_logic_1164. all;
entity codigo is
end entity codigo;
architecture codigo of codigo is
begin
x1 <=a & e;
x2 <=e & b;
x3 <= b xor e;
x4 <= a and b(3);
x5 <= d sll 2;
x6 <= d rol 2;
x7 <= (5=> '0', others=>'1');
x8 <= (5=> '0', others=>'1');
end architecture codigo;
Ejercicio 2.4
181
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Para estos cuatro tipos de datos, indique el valor de los atributos señalados en
la tabla siguiente:
Ejercicio 2.5
l .........................~.
--not2_l_
'·....·.·.-
. ........ . .-....·.·.·.·...[.·'
~~
.. m ........ ..... m,
·.·.r.---i-g:u
.............-----;-
.......... -+----ll
.... :_ ____..·___,
·.·.·. ·.·.t>o.·.·.
·.·..... ·.·.·.·.·.....__,
.
l.. . . . . . . . . . J ~
1ns 1ns 1ns
Figura 2.17: Circuito "one-shof', correspondiente al Ejercicio 2.5.
182
CONCEPTOS BÁSICOS DE VHDL
Ejercicio 2.6
en il io d3 d2 dl do
do ---+
o o o o o
---+ io
---+ il dl ---+ o o o o o
d2 ---+ o 1 o o 1 o
en o o 1 o o
d3 ---+
o o o
t
Ejercicio 2. 7
183
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Ejercicio 2.8
Ejercicio 2.9
Ejercicio 2.10
with s select
x <=(a and b) when "11'',
184
CONCEPTOS BÁSICOS DE VHDL
Ejercicio 2.11
Ejercicio 2.12
Ejercicio 2.13
if boolean_expr then
a <= valor_expr_a_1;
b <= valor_expr_b_1;
el se
a <= valor_expr_a_2;
b <= valor_expr_b_2;
end if;
185
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Ejercicio 2.14
if boolean_expr_1 then
if boolean_expr_2 then
a <= valor_expr_a_1;
el se
a <= valor_expr_a_2;
end if;
el se
if boolean_expr_3 then
a <= valor_expr_a_3;
el se
a <= valor_expr_a_4;
end if;
end if;
Ejercicio 2.15
case expr_case is
when cO =>
a <= valor_expr_a_O;
b <= valor_expr_b_O;
when c1 =>
a<= valor_expr_a_1;
b <= valor_expr_b_1;
when others =>
a <= valor_expr_a_n;
b <= valor_expr_b_n;
end case;
CONCEPTOS BÁSICOS DE VHDL
para esperar hasta que el UUT pueda producir las salidas correspondientes a las
entradas aplicadas. La sentencia wait situada al final del bloque process, no tiene
ninguna indicación acerca del tiempo que hay que esperar. Este tipo de sentencia
wait se emplea para detener el proceso, ya que "espera para siempre".
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Library IEEE;
use IEEE. std_logic_1164. all;
entity puerta_nor3 is
port( f : out std_logic;
x, y, z : in stdJogic);
end entity puerta_nor3;
architecture fluj o_de_datos of puerta_nor3 is
signal xory, xoryorz: std_logic;
begin
xory < = x or y; -- Tres asignaciones concurrentes
xoryorz < = xory or z;
f <= not xoryorz;
end architecture fluj o_de_datos;
-- Banco de pruebas
library IEEE;
use IEEE. std_logic_1164. all;
entity bp_puerta_nor3 is
end entity bp_puerta_nor3;
188
CONCEPTOS BÁSICOS DE VHDL
x OR2_1
··~·~·~~~······ xory
OR2_2
NOT
xoryorz r······················:
...
z
:
.. ~:.~.·.-:::.~-
....-t-
_j - - - - - - - - - t - - : > ' : .......... ............;
... J
library IEEE;
use IEEE. std_logic_1164. all;
entity puerta_nor3 is
port( f : out std_logic;
x, y, z : in std_logic);
end entity puerta_nor3;
architecture estructura of puerta_nor3 is
component or2 is
port ( y : out std_logic;
x1, x2 : in std_logic);
end component or2;
component not 1 is
port ( y : out std_logic;
x : in std_logic);
end component not1;
signal xory, xoryorz: std_logic;
begin
or2_1 : or2 port map ( y => xory, x1 = > x, x2 = > y);
or2_2 : or2 port map ( y = > xoryorz, x1 = > xory, x2 = > z);
Inv_1 : not1 port map ( y => f, x = > xoryorz);
end architecture estructura;
189
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
En la tabla mostrada a continuación se indican los valores de las señales x1, x2,
x3, x4, x5, x6, x7 y x8.
Señal Valor
x1 10010
x2 00101100
x3 1110
x4 1
x5 0000
x6 0011
x7 11011111
x8 11111011
190
CONCEPTOS BÁSICOS DE VHDL
library IEEE;
use IEEE. std_logic_1164. all;
entity oneShot is
port ( y : out std_logic;
x : in std_logic);
end oneShot;
architecture oneShot of oneShot is
signal x1, x2, x3 : std_logic;
begin
x1 <= not x after 1ns; --Salida p'uer-ta notl
x2 <= not x1 after 1ns; --Salida puer-ta not2
x3 <= not x2 after 1ns; --Salida pueda not3
y <= x and x3;
end architecture oneShot;
191
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
-- Banco de pruebas
library IEEE;
use IEEE. std_logic_1164. all;
entity bp_oneShot is
end entity bp_oneShot;
architecture bp_oneShot of bp_oneShot is
signal y : std_logic; -- Conectar salida UUT
signal x : std_logic; -- Conectar entradas UUT
component oneShot is
port (y : out std_logic;
x : in std_logic ) ;
end component oneShot;
begin
-- Instanciar y conectar UUT
uut : component oneShot port map
( y => y, x = > x);
x <= ' O' ,
' 1 ' after 5 ns,
'O' after 20 ns, '1' after 30 ns,
'O' after 35 ns;
end architecture bp_oneShot;
Obsérvese que en el código del banco de pruebas, la variable temp se usa para
almacenar en un mismo vector de tres bits las entradas al UUT, de modo que este
vector pueda ser incrementado (con el fin de generar todas las posibles combinaciones
de vectores de test) empleando un bucle for. La variable temp se ha declarado de
tipo unsigned. La longitud del vector se especifica por el rango (2 downto 0). El
primer número del rango (2) indica el índice del bit más significativo del vector,
y el segundo número del rango (O) indica el índice del bit menos significativo del
vector. Se ha empleado las función de conversión de tipo TO_UNSIGNED, que está
definida en el package IEEE.numeric_std, para convertir el índice del bucle i en
una variable de tipo unsigned de 3 bits de longitud.
192
CONCEPTOS BÁSICOS DE VHDL
193
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity bp_Dcd2x4 is
constant DELA Y : time := 10 ns; -- Retardo usado en el test
end entity bp_Dcd2x4;
component Dcd2x4 is
port ( d3, d2, d1, dO : out std_logic;
i1, iO : in std_logic;
en : in std_logic ) ;
end component Dcd2x4;
begin
UUT : component Dcd2x4 port map
(d3, d2, d1, dO, i1, iO, en);
Código VHDL 2.33: Banco de pruebas de un decodificador 2:4 con entrada enable.
194
CONCEPTOS BÁSICOS DE VHDL
Solución al Ejercicio 2. 7
a) b)
xo Xl XQ = X1
o o 1
o 1 o
1 o o
1 1 1
La función lógica del comparador es: x 0 ' ·x 1'+xo·x 1 , o equivalentemente: (x 0 EBx 1 )'.
Conectando la salida de este circ~ito comparador (puerta XNOR) a la entrada de
selección del MUX 2:1, se obtiene el circuito mostrado en la Figura 2.20b.
195
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
10
o
o
01
o
00
x(1)
x(2)
o
x(1)
x(2)
a) b)
. . .0. . . . . . . . . . . . . . . . . ;
........................................\
. . . t . . ............. .. . . . .i
. . xC2.L. . .. . . . . . . i
196
CONCEPTOS BÁSICOS DE VHDL
a
b
o
x+y>l
197
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
with s select
x <= (a and b) when "11",
(a or b) when "01" 1 "10",
'0' when others;
198
CONCEPTOS BÁSICOS DE VHDL
valor_expr_a_l
a
if boolean_expr then
a<= valor_expr_a_l; valor_expr_a_2
b <= valor_expr_b_l;
else
valor_expr_b_1 ----+---t
a<= valor_expr_a_2;
b <= valor_expr_b_2;
end if; valor_expr_b_ 2 ----+---t
boolean_expr - - - o - - - . . . . ¡
199
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
if boolean_expr_1 then
if boolean_expr_2 then valor_expr_a_1
a<= valor_expr_a_1;
else valor_expr_a_2
a<= valor_expr_a_2;
end if; boolean_expr_2
el se valor_ expr_a_3
ifboolean_expr_3 then
a<= valor_expr_a_3;
el se valor_expr_a_4
a<= valor_expr_a_4; boolean_expr_3
end if;
end if; boolean_expr_1
valor_expr_a_n ______,____--;
case expr_case is
when cO =>
valor_expr_a_1 - - - - - ;
a<= valor_expr_a_O;
b <= valor_expr_b_O; valor_expr_a_O - - - - - ;
when el=>
a<= valor_expr_a_l;
b <= valor_expr_b_l;
when others =>
valor_expr_b_n -+--ti,___--;
a<= valor_expr_a_n;
b <= valor_expr_b_n;
end case;
valor_expr_b_1 - + - - - - ;
valor_expr_b_O - + - - - - ;
expr_case
200
TEMA 3
3.1. Introducción
3.2. Procesamiento del código VHDL
3.3. Orden de compilación
3.4. Drivers
3.5. Inicialización
3.6. Atributos de las señales
3. 7. El retardo delta
3.8. Gestión de la cola de transacciones del driver
3.9. Ejemplo: simulación de un circuito sencillo
3.10. Lecturas recomendadas
3.11. Ejercicios de autocomprobación
3.12. Soluciones de los ejercicios
SIMULACIÓN DEL CÓDIGO VHDL
OBJETIVOS DOCENTES
Una vez estudiado el contenido del tema y realizados los ejercicios prácticos,
debería saber:
- Discutir qué son los atributos de las señales y los conceptos evento, señal activa,
transacción y señal implícita.
203
SIMULACIÓN DEL CÓDIGO VHDL
3.1. INTRODUCCIÓN
También se explicó que en VHDL hay dos tipos de código: el código concurrente
y el código secuencial. Las sentencias concurrentes son la asignación condicional
(when-else), la asignación de selección (with-select-when) y la sentencia ge-
nerate. Las sentencias secuenciales son las incluidas dentro de bloques process,
function o procedure. Sentencias secuenciales son if, wait, case y for. Aun
cuando dentro de estos bloques la ejecución es secuencial, el bloque en su conjunto
es concurrente con el resto de bloques y sentencias concurrentes.
signal variable
Asignación <=
Qué representa Interconexiones en el circuito Información local
Visibilidad Puede ser global (visible desde Local (visible sólo desde el co-
todo el código) rrespondiente bloque process,
function o procedure)
Comportamiento El nuevo valor es asignado El nuevo valor es asignado in-
transcurrido un retardo, que mediatamente
por defecto vale 5.
Uso En package, entity y archi- Sólo en código secuencial. Es
tecture. En una entity, los decir, dentro de process, fun-
puertos son por defecto señales ction o proced ure
205
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
206
SIMULACIÓN DEL CÓDIGO VHDL
Cuando existen dependencias entre las unidades de diseño, debe seguirse un orden
en su compilación. Si una unidad de diseño usa un paquete, entonces la declaración
del paquete (package) debe compilarse primero. El cuerpo del paquete (package
body) puede compilarse posteriormente. Si en la declaración del paquete se hace
referencia a otros paquetes, entonces las declaraciones de estos deben compilarse
pnmero.
Las dependencias entre las unidades de diseño puede obligar a recompilar varias
unidades de diseño si se modifica el código de una de ellas. A continuación, se
explican algunas reglas para la recompilación, en caso de que se modifique el código
de una unidad de diseño:
207
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
3. Si se modifica una entity, entonces todas las architecture que usan esa
entity, incluyendo aquellas en las cuales se declaran o instancian componentes
de esa entity, deben ser recompiladas. Las declaraciones de configuration
deben ser también recompiladas.
3.4. DRIVERS
Cada señal tiene asociado uno o varios drivers. El valor de la señal viene deter-
minado en todo momento por el valor de sus drivers. En el caso más sencillo, en que
la señal tiene un único driver, el valor de la señal coincide en todo momento con el
valor de su driver.
Cada driver de una señal está asociado a una o varias asignaciones a dicha señal.
Cada señal tiene un driver asociado a cada asignación concurrente a la señal y un
driver asociado a cada bloque process en el cual hay asignaciones a la señal. Las
reglas que se siguen para establecer dicha asociación son las siguientes:
208
SIMULACIÓN DEL CÓDIGO VHDL
Cada driver contiene una cola. En ella van almacenándose las transacciones
futuras planificadas para la señal, debidas a la ejecución de las asignaciones asociadas
al driver. Cada una de estas transacciones planificadas consta de: el nuevo valor que
debe asignarse a la señal y el instante de tiempo en que debe asignarse dicho valor.
El valor de la señal en cada instante se calcula a partir del valor de sus drivers
en ese instante. Si hay varios drivers asociados a una misma señal y todos ellos
proporcionan un mismo valor, entonces no se produce conflicto. Sin embargo, si los
drivers asociados a una señal proporcionan diferentes valores, entonces para decidir
qué valor asignar debe recurrirse a la función de resolución del tipo de dato de la
señal. Si el tipo de dato no tiene función de resolución, se produce un error. Este es
el caso, por ejemplo, de los tipos boolean e integer.
Una función de resolución es una función que examina los valores de los drivers
de la señal y resuelve el conflicto, devolviendo un valor. La función de resolución
209
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Dado que no hay ninguna otra transacción planificada y que el bloque process
está suspendido indefinidamente, finaliza la simulación. El resultado de la simulación,
representado mediante la lista de eventos en la señal a, se muestra en la tabla
siguiente. En la columna de la izquierda se indica el instante en el cual se asigna un
nuevo valor a la señal. En la columna de la derecha se indica cuál es ese nuevo valor.
tiempo a
o 'Z'
5 '1'
212
SIMULACIÓN DEL CÓDIGO VHDL
bloque! : process
begin
wait for 10 ns;
a <= '1';
wait for 20 ns;
a <= '0';
end process bloque!;
bloque2 : process
begin
wait for 20 ns;
a <= '1';
wait for 20 ns;
a <= '0';
end process bloque2;
El simulador crea dos drivers para la señal. Un driver se asocia a las asignaciones
a la señal que se producen dentro del bloque process llamado bloque! y el otro
driver se asocia a las asignaciones a la señal realizadas dentro del bloque process
llamado bloque2.
213
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Simulando el código durante 100 ns, se obtiene que el driver asociado al bloque
process bloque1 evoluciona de la forma siguiente:
tiempo driver1_a
o 'Z'
10 ns +o '1'
30 ns +o '0'
40 ns +o '1'
60 ns +o '0'
70 ns +o '1'
90 ns +o '0'
100 ns +O '1'
tiempo driver2_a
o 'Z'
20 ns +o '1'
40 ns +o '0'
60 ns +o '1'
80 ns +o '0'
100 ns +o '1'
214
SIMULACIÓN DEL CÓDIGO VHDL
tiempo a
o 'Z'
10 ns +6 '1'
30 ns +6 'X'
70 ns +6 '1'
80 ns +6 'X'
90 ns +6 '0'
100 ns +6 '1'
se escribe
signal a : std_logic;
215
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
tiempo a
o 'U'
20 ns +5 '1'
30 ns +5 'X'
70 ns +5 '1'
80 ns +5 'X'
90 ns +5 '0'
100 ns +5 '1'
Los siguientes conceptos están relacionados con las señales y sus atributos: evento,
señal activa, transacción y señal implícita. A continuación se explica su significado.
- Se dice que una señal está activa cuando su valor es actualizado, con indepen-
dencia de que el nuevo valor sea el mismo que el valor actual o sea diferente.
Por ejemplo, si en determinado instante el valor de la señal es '1' y se le asigna
el valor ' 1 ' , en ese instante la señal está activa, pese a que su valor no cambie.
- Se llama transacción a asignar valor a una señal, ya sea este valor igual o
diferente al valor que tiene la señal previamente a dicha asignación. En el
instante en que se produce la transacción, la señal está activa. Cuando el valor
216
SIMULACIÓN DEL CÓDIGO VHDL
Los atributos de las señales pueden clasificarse en dos tipos: aquellos que repre-
sentan una señal implícita y aquellos que equivalen a la llamada a una función. Los
atributos se muestran en la Tabla 3.3.
217
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
218
SIMULACIÓN DEL CÓDIGO VHDL
Uno de los requisitos que debe satisfacer la simulación del código concurrente es
el siguiente: el resultado de la simulación debe ser independiente del orden en que
se ejecuten en un determinado instante las sentencias concurrentes.
Para satisfacer este requisito, una vez se han evaluado todas las sentencias
concurrentes activas en el instante t y se han calculado los nuevos valores de las
señales, estos nuevos valores se asignan a las señales en el instante t + 6 (supuesto
que no se indique en el código explícitamente el retardo).
bloque! : process
begin
wait for 100 ns;
a2 <= '1';
a1 <= '1';
end process bloque!;
bloque2 : process
begin
a1 <= not a1 after 1 ns;
wait on a2;
end process bloque2;
219
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
- Dos drivers a la señal a1, uno por cada bloque process. En las explicaciones
siguientes llamaremos dri ver1_a1 y dri ver2_a1 a los drivers de la señal a1
asociados a los bloques process bloque! y bloque2, respectivamente.
En el instante t = O, los drivers y las señales tienen valor 'O', debido a que ese
es el valor con el que las señales han sido inicializadas al declararlas.
En el instante t = 100 ns +<5 se asigna el valor '1' a dri ver1_a1. Los dos drivers
de la señal a1 valen ' 1 ' , con lo cual la señal adquiere el valor ' 1 ' en el instante
t = 100 ns +<5.
Asimismo, en el instante t = 100 ns +<5 se asigna el valor '1' a driver _a2. La
señal a2 tiene un único driver, con lo cual en todo momento el valor de la señal y del
220
SIMULACIÓN DEL CÓDIGO VHDL
driver coinciden. Así pues, la señal a2 adquiere el valor '1' en el instante t = 100
ns +5.
Cada driver contiene una cola, en la cual van almacenándose las transacciones
planificadas para la señal. Cuando se ejecuta una sentencia de asignación a la
señal, las transacciones calculadas en dicha sentencia son añadidas a la cola del
driver asociado a dicha asignación. Una vez añadidas las nuevas transacciones,
se aplican unas reglas para decidir si las transacciones que estaban anteriormente
almacenadas en la cola deben ser eliminadas o no. Estas reglas dependen de si las
nuevas transacciones deben producirse con un retardo inercial o de transporte.
221
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Regla 2 Si las nuevas transacciones tiene retardo inercial (para retardo de trans-
porte este paso no se realiza), se van inspeccionando las transacciones que se
encontraban en la cola del driver, progresando hacia atrás en el tiempo, desde
el instante t 1 hacia el cero:
222
SIMULACIÓN DEL CÓDIGO VHDL
tiempo si
3 ns 3
6 ns 1
15 ns 2
22 ns 7
24 ns 30
80 ns 70
tiempo si
3 ns 3
6 ns 1
15 ns 2
(n) 20 ns 2
22 ns 7
24 ns 30
(n) 25 ns 30
(n) 60 ns 6
80 ns 70
tiempo si
3 ns 3
6 ns 1
15 ns 2
(n) 20 ns 2
(x) 22 ns 7
(x) 24 ns 30
(n) 25 ns 30
(n) 60 ns 6
(x) 80 ns 70
223
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
tiempo s1
(x) 3 ns 3
(x) 6 ns 1
15 ns 2
(n) 20 ns 2
(x) 22 ns 7
(x) 24 ns 30
(n) 25 ns 30
(n) 60 ns 6
(x) 80 ns 70
tiempo s1
15 ns 2
(n) 20 ns 2
(n) 25 ns 30
(n) 60 ns 6
tiempo s1
O ns o
15 ns 2
25 ns 30
60 ns 6
224
SIMULACIÓN DEL CÓDIGO VHDL
tiempo s2
3 ns 3
6 ns 1
15 ns 2
(n) 20 ns 2
22 ns 7
24 ns 30
(n) 25 ns 30
(n) 60 ns 6
80 ns 70
225
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
tiempo s2
3 ns 3
6 ns 1
15 ns 2
(n) 20 ns 2
(x) 22 ns 7
(x) 24 ns 30
(n) 25 ns 30
(n) 60 ns 6
(x) 80 ns 70
tiempo s2
O ns o
3 ns 3
6 ns 1
15 ns 2
25 ns 30
60 ns 6
El circuito mostrado en la Figura 3.2, así como las formas de onda de las señales
x1 y x2, son descritas por el código VHDL mostrado a continuación:
library IEEE;
use IEEE.std_logic_1164.all;
entity delay3 is
end entity delay3;
226
SIMULACIÓN DEL CÓDIGO VHDL
xl
retardo = 1 ns
:·:·~.: ~~¡
:~
....
2·:·:: : : : : ·: : :.:·: : : : : : _..: :..
: :.x·:·::::.:· :.::::.:.::::.:.::::::·:.::¡··.
t !.....~.~~ ~J ::::::::::::::::::::6:
............................... ¡ retardo = 2 ns
Al declarar las señales no se especifica su valor inicial. Por ello, las cuatro señales
tienen en t = O el valor por defecto para std_logic, es decir, valen 'U'. En t = O,
se ejecutan las sentencias de asignación a las cuatro señales. A continuación, se
muestra el resultado de la inicialización y el contenido de las colas de transacciones
planificadas para cada señal:
tiempo x1 x2 S y
o 'U' 'U' 'U' 'U'
tiempo x1 x2 S y
o 'U' 'U' 'U' 'U'
5 '1' '1' 'U' 'U'
227
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
El siguiente evento está planificado para el instante 1 ns, por tanto, el reloj
de la simulación avanza hasta t = 1 ns. En t = 1 ns, se asigna a la señal s el
valor 'O'. El cambio en el valor de la señal s hace que se ejecute la asignación
y <= s or x2 after 2 ns;, calculándose un nuevo valor para y, que se introduce
en la cola de la señal. El resultado de la simulación y el contenido de las colas de
transacciones planificadas para cada señal se muestran a continuación:
tiempo x1 x2 S y
o 'U' 'U' 'U' 'U'
ó '1' '1' 'U' 'U'
1 ns '1' '1' '0' 'U'
El siguiente evento está planificado para el instante t = 2 ns, con lo cual el reloj
de la simulación salta hasta ese instante, en el cual se asigna el valor a la señal y. El
resultado de la simulación y el contenido de las colas de transacciones planificadas
para cada señal se muestran a continuación:
tiempo x1 x2 S y
o 'U' 'U' 'U' 'U'
ó '1' '1' 'U' 'U'
1 ns '1' '1' '0' 'U'
2 ns '1' '1' '0' '1'
228
SIMULACIÓN DEL CÓDIGO VHDL
tiempo x1 x2 S y
o 'U' 'U' 'U' 'U'
5 '1' '1' 'U' 'U'
1 ns '1' '1' '0' 'U'
2 ns '1' '1' '0' '1'
5 ns '1' '0' '0' '1'
tiempo x1 x2 S y
o 'U' 'U' 'U' 'U'
5 '1' '1' 'U' 'U'
1 ns '1' '1' '0' 'U'
2 ns '1' '1' '0' '1'
5 ns '1' '0' '0' '1'
6 ns '1' '0' '1' '1'
229
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
tiempo x1 x2 S y
o 'U' 'U' 'U' 'U'
8 '1' '1' 'U' 'U'
1 ns '1' '1' '0' 'U'
2 ns '1' '1' '0' '1'
5 ns '1' '0' '0' '1'
6 ns '1' '0' '1' '1'
Messages
+x 1 1 ::S
+x2 1
+s
+ v
u
u
j
1
1 1 1 1 1 1 1 1
~!m@ Now 8 ns hs 2 ns 4 ns 6 ns 8 ns
t]¡./'0 O nsJ
liJ li.GJ ~ih 1 1/
1 Onsto8ns 1 Now: 8 ns Delta: 1 //.
La mayor parte de los textos sobre VHDL, incluyendo (Chang 1997, Chu 2006,
Vahid & Lysecky 2007, Pedroni 2004, Lee 2006, Ashenden 2002, Armstrong & Gray
2000, Heinkel 2000), abordan con mayor o menor profundidad la simulación del
código. Sin embargo, es raro encontrar una descripción tan detallada acerca de los
drivers y la simulación del retardo como la que se ofrece en los Capítulos 4 y 5 de
(Cohen 1995).
230
SIMULACIÓN DEL CÓDIGO VHDL
Ejercicio 3.1
library IEEE;
use IEEE . std_logic_1164. all;
entity codigo is
end entity codigo;
architecture codigo of codigo is
signal y1, y2, y3, y4 : std_logic;
begin
y1 <= '0',
'1' after 100 ns;
y1 <= '0',
'1' after 50 ns;
y2 <= '0',
'1' after 100 ns,
'O' after 200 ns,
'1' after 250 ns;
y3 <= y2 after 100 ns;
y4 <= transport y2 after 100 ns;
end architecture codigo;
Ejercicio 3.2
xl
.........................................
x2
.........................................
:. ............... . ?..~. ! ........ ............ ................... . ..
... ~~..............................¡
231
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
library IEEE;
use IEEE. std_logic_1164 . all;
entity delay4 is
end entity delay4;
architecture delay4 of delay4 is
signal x1, x2, x3, s, y : std_logic;
begin
s <= x1 and x2 after 10 ns;
y <= s or x3 after 20 ns;
x1 <= '1',
'O' after 15 ns,
'1 'after 20 ns,
'O' after 30 ns,
'1 'after 70 ns,
'O' after 80 ns;
x2 <= '1';
x3 <= '0',
'1 'after 70 ns,
'O' after 80 ns;
end architecture delay4;
Ejercicio 3.3
library IEEE;
use IEEE. std_logic_1164. all;
entity codigo1 is
port( X1, X2, X3: in std_logic;
Y1 :out std_logic);
end entity codigo 1;
architecture behv of codigo1 is
signal sig_s1: std_logic;
begin
Proc1: process (X1, X2, X3)
begin
sig_s1 <= X1;
Y1 <= sig_s1 xor X3;
sig_s1 <= X2;
end process;
end architecture behv;
232
SIMULACIÓN DEL CÓDIGO VHDL
-- Banco de pruebas
library IEEE;
use IEEE. std_logic_1164. all;
entity bp_codigo1 is
end entity bp_codigo1;
architecture bp_codigo1 of bp_codigo1 is
signal Y1 : std_logic; -- Conectar salida UUT
signal X1 , X2, X3 : std_logic; -- Conectar entradas UUT
component codigo1 is
port ( Y1 : out std_logic;
X1 , X2, X3 : in std_logic );
end component codigo1 ;
begin
-- Instanciar y conectar UUT
uut : component codigo 1 port map
( Y1 = > Y1 , X1 = > X1 , X2 = > X2, X3 => X3 );
gen_vec_ test : process
begin
X1 <= '0'; X2 <= '0' ; X3 <= '1' ; wait for 100 ns;
X1 <= '0'; X2 <= '1 ' ; X3 <= '1' ; wait for 100 ns;
X1 <= '1'; X2 <= '0' ; X3 <= '0' ; wait for 100 ns;
X1 <= '1'; X2 <= '1' ; X3 <= '0' ; wait for 100 ns ;
X1 <= '0'; X2 <= '1'; X3 <= '0'; wait for 100 ns;
X1 <= '1'; X2 <= '0' ; X3 <= '1 ' ;
wait ;
end process gen_vec_test ;
end a r chitecture bp_codigo1;
233
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Ejercicio 3.4
library IEEE;
use IEEE. std_logic_1164. all;
entity codigo2 is
port( X1, X2, X3 : in std_logic;
Y2 : out std_logic);
end entity codigo2;
architecture behv of codigo2 is
begin
proc2: process (X1, X2, X3)
variable var _s 1 : std_logic;
begin
var_s1 := X1;
Y2 <= var_s1 xor X3;
var_s1 := X2;
end process proc2;
end architecture behv;
234
SIMULACIÓN DEL CÓDIGO VHDL
-- Banco de pruebas
library IEEE;
use IEEE. std_logic_1164. all;
entity bp_codigo2 is
end entity bp_codigo2;
architecture bp_codigo2 of bp_codigo2 is
signal Y2 : std_logic; -- Conectar salida UUT
signal X1, X2, X3 : std_logic; -- Conectar entradas UUT
component codigo2 is
port ( Y2 : out std_logic;
X1, X2, X3 : in std_logic);
end component codigo2;
begin
-- Instanciar y conectar UUT
uut : component codigo2 port map
( Y2 => Y2, X1 => X1, X2 => X2, X3 => X3 );
gen_vec_ test : process
begin
X1 <= '0'; X2 <= '0'; X3 <= ' 1'; wait for 100 ns;
X1 <= '0'; X2 <= '1'; X3 <= ' 1'; wait for 100 ns;
X1 <= '1'; X2 <= '0'; X3 <= 'O'; wait for 100 ns;
X1 <= '1'; X2 <= '1 '; X3 <= 'O'; wait for 100 ns;
X1 <= '0'; X2 <= '1 '; X3 <= '0'; wait for 100 ns;
X1 <= '1'; X2 <= '0'; X3 <= '1 ';
wait;
end process gen_vec_test;
end architecture bp_codigo2;
------------------------
235
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Ejercicio 3.5
library IEEE;
use IEEE. std_logic_1164. all;
entity deltas is
port( d : out std_logic;
a, b, e : in std_logic);
end deltas;
architecture arquitectura of deltas is
signal s 1, s2, s3 : std_logic;
begin
p1 : process (a, b)
begin
s1 <= a and b;
end process p1;
p2 : process(b, e)
begin
s2 <= b ore;
end process p2;
p3 : process (s1, s2)
begin
s3 <= s1 xor s2;
end process p3;
p4 : process (s3)
begin
d <= not s3;
end process p4;
end architecture arquitectura;
236
SIMULACIÓN DEL CÓDIGO VHDL
-- Banco de pruebas
library IEEE;
use IEEE. std_logie_1164. all;
entity bp_del tas is
end entity bp_del tas;
architecture bp_del tas of bp_del tas is
signal d : std_logic; -- Conectar salida UUT
signal a, b, e : std_logic; -- Conectar entradas UUT
component deltas is
port ( d : out std_logic;
a, b, e : in std_logic ) ;
end component deltas;
begin
-- Instanciar y conectar UUT
uut : component deltas port map
( d=>d, a => a, b => b, e => e);
gen_ ve e_ test : process
begin
a<= '1';
b<= '1';
e<= '0';
wait;
end process. gen_vee_test;
end architecture bp_del tas;
Ejercicio 3.6
El Código VHDL 3.9 describe una puerta NAND con un retardo inercial de 2 ns
y su banco de pruebas. Dibuje y explique la evolución de las señales in1, in2, s1,
s2, s3 y s4 durante los primeros 50 ns. A continuación, simule el banco de pruebas
y compare los resultados obtenidos con los que usted ha predicho.
237
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity retardo_bp is
end entity retardo_bp;
Código VHDL 3.9: Puerta NAND con retardo inercial y su banco de pruebas.
238
SIMULACIÓN DEL CÓDIGO VHDL
Ejercicio 3. 7
Dado el Código VHDL 3.10, indique los valores que toman las señales YO y
Y1 en los instantes de tiempo en que existen eventos en estas señales. Explique
razonadamente la evolución de cada una de las señales. A continuación, simule el
código VHDL y compare los resultados obtenidos con los que usted ha predicho.
library IEEE;
use IEEE. std_logic_1164. all;
entity codigoP is
end entity codigoP;
architecture codigoP of codigoP is
signa} YO: std_logic := '1';
signa} Y1: std_logic;
begin
Y1 <= YO after 10 ns;
process
begin
YO <= transport 'O' after 10 ns;
YO <= transport '1' after 20 ns;
YO <= transport '1' after 15 ns;
YO <= transport 'O' after 30 ns;
wait;
end process;
end architecture codigoP;
239
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
• y1 X 11
.y2 o 11
.y3 u
.y4 u
1111111111111 d lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
~Q@ow 400 ns lS 50 ns 1 100 ns 150 ns 200 ns 250 ns 300 ns 350 ns 400 ns
~,0 l?§JJ.:J
Figura 3.5: Cronograma de las señales Yl, Y2, y3, Y4·
tiempo y1 y2 y3 y4
o 'U' 'U' 'U' 'U'
8 o o 'U' 'U'
50 ns 'X' o 'U' 'U'
100 ns 1 1 o o
200 ns 1 o 1 1
250 ns 1 1 1 1
300 ns 1 1 1 o
350 ns 1 1 1 1
240
SIMULACIÓN DEL CÓDIGO VHDL
Al declarar las señales no se especifica su valor inicial. Por ello, las cinco señales
tienen en t =O el valor por defecto para std_logic, es decir, valen 'U'. En t =O, se
ejecutan las sentencias de asignación a las cinco señales. A continuación, se muestra el
resultado de la inicialización y el contenido de las colas de transacciones planificadas
para cada señal:
tiempo x1 x2 x3 S y
o 'U' 'U' 'U' 'U' 'U'
tiempo x1 x2 x3 S y
o 'U' 'U' 'U' 'U' 'U'
5 '1' '1' '0' 'U' 'U'
241
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
tiempo x1 x2 x3 S y
o 'U' 'U' 'U' 'U' 'U'
6 '1' '1' '0' 'U' 'U'
10 ns '1' '1' '0' '1' 'U'
tiempo x1 x2 x3 S y
o 'U' 'U' 'U' 'U' 'U'
6 '1' '1' '0' 'U' 'U'
10 ns '1' '1' '0' '1' 'U'
15 ns '0' '1' '0' '1' 'U'
242
SIMULACIÓN DEL CÓDIGO VHDL
tiempo x1 x2 x3 S y
o 'U' 'U' 'U' 'U' 'U'
o '1' '1' '0' 'U' 'U'
10 ns '1' '1' '0' '1' 'U'
15 ns '0' '1' '0' '1' 'U'
20 ns '1' '1' '0' '1' 'U'
tiempo x1 x2 x3 S y
o 'U' 'U' 'U' 'U' 'U'
o '1' '1' '0' 'U' 'U'
10 ns '1' '1' '0' '1' 'U'
15 ns '0' '1' '0' '1' 'U'
20 ns '1' '1' '0' '1' 'U'
30 ns '0' '1' '0' '1' '1'
243
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
tiempo x1 x2 x3 S y
o 'U' 'U' 'U' 'U' 'U'
o '1' '1' '0' 'U' 'U'
10 ns '1' '1' '0' '1' 'U'
15 ns '0' '1' '0' '1' 'U'
20 ns '1' '1' '0' '1' 'U'
30 ns '0' '1' '0' '1' '1'
40 ns '0' '1' '0' '0' '1'
tiempo x1 x2 x3 S y
o 'U' 'U' 'U' 'U' 'U'
o '1' '1' '0' 'U' 'U'
10 ns '1' '1' '0' '1' 'U'
15 ns '0' '1' '0' '1' 'U'
20 ns '1' '1' '0' '1' 'U'
30 ns '0' '1' '0' '1' '1'
40 ns '0' '1' '0' '0' '1'
60 ns '0' '1' '0' '0' '0'
244
SIMULACIÓN DEL CÓDIGO VHDL
tiempo x1 x2 x3 S y
o 'U' 'U' 'U' 'U' 'U'
5 '1' '1' '0' 'U' 'U'
10 ns '1' '1' '0' '1' 'U'
15 ns '0' '1' '0' '1' 'U'
20 ns '1' '1' '0' '1' 'U'
30 ns '0' '1' '0' '1' '1'
40 ns '0' '1' '0' '0' '1'
60 ns '0' '1' '0' '0' '0'
70 ns '1' '1' '1' '0' '0'
tiempo x1 x2 x3 S y
o 'U' 'U' 'U' 'U' 'U'
5 '1' '1' '0' 'U' 'U'
10 ns '1' '1' '0' '1' 'U'
15 ns '0' '1' '0' '1' 'U'
20 ns '1' '1' '0' '1' 'U'
30 ns '0' '1' '0' '1' '1'
40 ns '0' '1' '0' '0' '1'
60 ns '0' '1' '0' '0' '0'
70 ns '1' '1' '1' '0' '0'
80 ns '0' '1' '0' '1' '0'
245
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
tiempo x1 x2 x3 S y
o 'U' 'U' 'U' 'U' 'U'
c5 '1' '1' '0' 'U' 'U'
10 ns '1' '1' '0' '1' 'U'
15 ns '0' '1' '0' '1' 'U'
20 ns '1' '1' '0' '1' 'U'
30 ns '0' '1' '0' '1' '1'
40 ns '0' '1' '0' 'o' '1'
60 ns '0' '1' '0' 'o' '0'
70 ns '1' '1' '1' 'o' '0'
80 ns '0' '1' '0' '1' '0'
90 ns '0' '1' '0' 'o' '1'
tiempo x1 x2 x3 S y
o 'U' 'U' 'U' 'U' 'U'
c5 '1' '1' '0' 'U' 'U'
10 ns '1' '1' '0' '1' 'U'
15 ns '0' '1' '0' '1' 'U'
20 ns '1' '1' '0' '1' 'U'
30 ns '0' '1' '0' '1' '1'
40 ns '0' '1' '0' '0' '1'
60 ns '0' '1' '0' '0' '0'
70 ns '1' '1' '1' '0' '0'
80 ns '0' '1' '0' '1' '0'
90 ns '0' '1' '0' '0' '1'
110 ns '0' '1' '0' '0' '0'
246
SIMULACIÓN DEL CÓDIGO VHDL
+ x1 1 L
- 1---
+ x2 1
1---
+ x3 o
-
.y
+ s u
u
-
¡---
l
l!
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Clil0' Now l40 ns :l s 20 ns 40 ns 60 ns 80 ns 100 ns 12(
~,0 i!Óns]
Figura 3.6: Cronograma de las señales.
Se ejecutan las tres primeras sentencias del bloque process del banco de
pruebas y la ejecución queda suspendida en la sentencia wait. Los nuevos
valores se asignarán a las señales x1, x2 y x3 en el instante t = 6.
- Se ejecutan las tres sentencias del bloque process del componente. Obsérvese
que la primera y la tercera sentencia son asignaciones a una misma señal:
sig_s1. Cuando en el instante t se ejecuta la primera sentencia, se planifica
una transacción para la señal sig_s1 para el instante t + 6. Cuando en ese
mismo instante t se ejecuta la tercera sentencia, se planifica otra transacción
para la señal sig_s1 para el instante t + 6, anulándose la transacción que
se planificó para esa señal como resultado de ejecutar la primera sentencia
(aplicación Regla 1). El resultado es que la primera sentencia de asignación no
tiene ningún efecto. Es decir, al ejecutar el bloque process en el instante t, se
planifica asignar en el instante en t + 6 a la señal sig_s1 el valor que tenga la
señal X2 en el instante t. En este caso t vale cero, pero la discusión anterior es
válida para cualquier instante t.
247
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
tiempo x1 x2 x3 Y1 sig_s1
o 'U' 'U' 'U' 'U' 'U'
Los eventos en las señales x1, x2, x3 hacen que se ejecute el bloque process del
componente, calculándose nuevos valores para las señales Y1, sig_s1. El nuevo valor
de sig_s1 es igual al valor de x2, que es 'O'. El nuevo valor de Y1 es el resultado
de la operación XOR de los valores actuales de sig_s1 y X3, es decir, 'U' XOR '1',
que es 'U' . Estos nuevos valores se asignarán a las señales en el instante t = 26. El
resultado de la simulación y las colas de transacciones planificadas son:
tiempo x1 x2 x3 Y1 sig_s1
o 'U' 'U' 'U' 'U' 'U'
6 '0' '0' '1' 'U' 'U'
tiempo x1 x2 x3 Y1 sig_s1
o 'U' 'U' 'U' 'U' 'U'
6 '0' '0' '1' 'U' 'U'
26 '0' '0' '1' 'U' '0'
El reloj de la simulación avanza hasta el instante t = 100 ns, ya que en ese instante
se reanuda la ejecución del bloque process del banco de pruebas. Se ejecutan las
248
SIMULACIÓN DEL CÓDIGO VHDL
tres sentencias de asignación a las señales x1, x2, x3, y se suspende la ejecución
del bloque al ejecutarse la sentencia wait. Los nuevos valores se planifican para
el instante t = 100 + 6. El resultado de la simulación y las colas de transacciones
planificadas son:
tiempo x1 x2 x3 Y1 sig_s1
o 'U' 'U' 'U' 'U' 'U'
6 '0' '0' '1' 'U' 'U'
26 '0' '0' '1' 'U' '0'
tiempo x1 x2 x3 Y1 sig_s1
o 'U' 'U' 'U' 'U' 'U'
6 '0' '0' '1' 'U' 'U'
26 '0' '0' '1' 'U' '0'
100 ns+6 '0' '1' '1' 'U' '0'
249
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
tiempo x1 x2 x3 Y1 sig_s1
o 'U' 'U' 'U' 'U' 'U'
5 '0' '0' '1' 'U' 'U'
25 '0' '0' '1' 'U' '0'
100 ns+5 '0' '1' '1' 'U' '0'
100 ns+25 '0' '1' '1' '1' '1'
tiempo x1 x2 x3 Y1 sig_s1
o 'U' 'U' 'U' 'U' 'U'
5 '0' '0' '1' 'U' 'U'
25 '0' '0' '1' 'U' '0'
100 ns+5 '0' '1' '1' 'U' 'o'
100 ns+25 '0' '1' '1' '1' '1'
200 ns+5 '1' '0' '0' '1' '1'
200 ns+25 '1' '0' '0' '1' 'o'
300 ns+5 '1' '1' '0' '1' '0'
300 ns+25 '1' '1' '0' '0' '1'
400 ns+5 '0' '1' '0' '0' '1'
400 ns+25 '0' '1' '0' '1' '1'
500 ns+5 '1' '0' '1' '1' '1'
500 ns+25 '1' '0' '1' '0' '0'
250
SIMULACIÓN DEL CÓDIGO VHDL
+ jbp_codigo1/uut¡)(1 o
+ ¡bp_codigo1/uut,(.l(2 o
+ ¡bp_codigo1/uut¡)(3 1
+ jbp_codigo1/uutjY1 u
+ jbp_codigo1/uutjsig_sl o
d d d 11
1
11111111 lllllllttlttllllltllttllllll lllllllltlttlllllltlttllllll llllllltllttllllltllttllllll llllllltllttlllllltlttll
Now 600 ns S 100 ns 200 ns 300 ns 400ns 500 ns 600 ns
Cursor 1 O ns O nsl
Se ejecutan las tres primeras sentencias del bloque process del banco de
pruebas y la ejecución queda suspendida en la sentencia wait. Los nuevos
valores se asignarán a las señales X1, X2, X3 en el instante t = fJ.
Se ejecutan las tres sentencias del bloque process del componente. Cuando
se ejecuta el bloque process en el instante t, en primer lugar se asigna a la
variable var_s1 el valor que tiene la señal X1 en el instante t. A continuación,
se calcula el nuevo valor de la señal Y2, que es el resultado de la operación
XOR entre el valor de la variable var_s1 y el valor de la señal X3. Dado que el
valor de la variable var_s1 es igual al valor de la señal X1, el nuevo valor de la
señal Y2 es el resultado de la operación XOR entre los valores que tienen las
señales X1 y X3 en el instante t. El nuevo valor se asignará a la señal Y2 en el
instante t + fJ. La tercera sentencia asigna un nuevo valor a la variable var _s 1.
Este nuevo valor de var_s1 no influye en la señal Y2.
tiempo X1 X2 X3 Y2
o 'U' 'U' 'U' 'U'
251
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Los eventos en las señales X1, X2, X3 hacen que se ejecute el bloque process del
componente. El nuevo valor de la señal Y2 es el resultado de la operación XOR entre
el valor de X1 y el de X3. Se planifica la transacción para el instante t = 25.
tiempo X1 X2 X3 Y2
o 'U' 'U' 'U' 'U'
5 '0' '0' '1' 'U'
tiempo X1 X2 X3 Y2
o 'U' 'U' 'U' 'U'
5 '0' '0' '1' 'U'
25 '0' '0' '1' '1'
tiempo X1 X2 X3 Y2
o 'U' 'U' 'U' 'U'
5 '0' '0' '1' 'U'
25 '0' '0' '1' '1'
252
SIMULACIÓN DEL CÓDIGO VHDL
tiempo X1 X2 X3 Y2
o 'U' 'U' 'U' 'U'
o '0' '0' '1' 'U'
20 '0' '0' '1' '1'
100 ns +o '0' '1' '1' '1'
tiempo X1 X2 X3 Y2
o 'U' 'U' 'U' 'U'
o '0' '0' '1' 'U'
20 '0' '0' '1' '1'
100 ns +o '0' '1' '1' '1'
200 ns +o '1' '0' '0' '1'
300 ns +o '1' '1' '0' '1'
400 ns +o '0' '1' '0' '1'
400 ns + 20 '0' '1' '0' '0'
500 ns +o '1' '0' '1' '0'
253
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
¡... Msgs
+ ¡bp_codigo2/X1 1
+ ¡bp_codigo2/X2 o
+ ¡bp_codigo2/X3 1
+ ¡bp_codigo2/Y2 o
1 1 1 1 1 1
1~:1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1- 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
iO Now 700 ns s 100 ns 200 ns 300 ns 400 ns 500 ns 600
;o Cursor 1 O ns llo nsJ
Figura 3.8: Cronograma de las señales.
Dado que ninguna de las señales ha sido inicializada al ser declarada, todas las
señales valen 'U' en t = O. En t = O se ejecutan todos los bloques process. Se
planifica asignar los nuevos valores a las señales en el instante t = o. El resultado de
la simulación en t = O y las transacciones planificadas son las siguientes:
tiempo a b e s1 s2 s3 d
o 'U' 'U' 'U' 'U' 'U' 'U' 'U'
t a t b t e t s1 t s2 t s3 t d
o '1' o '1' o '0' o 'U' o 'U' o 'U' o 'U'
tiempo a b e s1 s2 s3 d
o 'U' 'U' 'U' 'U' 'U' 'U' 'U'
o '1' '1' '0' 'U' 'U' 'U' 'U'
254
SIMULACIÓN DEL CÓDIGO VHDL
ejecute el bloque process p3. El nuevo valor calculado para la señal s3 se asignará
a la misma en el instante t = 35.
tiempo a b e si s2 s3 d
o 'U' 'U' 'U' 'U' 'U' 'U' 'U'
5 'i' 'i' '0' 'U' 'U' 'U' 'U'
25 'i' 'i' '0' 'i' 'i' 'U' 'U'
1 2
03
1 t 1 a 11 t 1 b 11 t 1 e 11 t 1 s 11 t 1 s 11
3; 1 ," ' 11 t 1 d 1
tiempo a b e si s2 s3 d
o 'U' 'U' 'U' 'U' 'U' 'U' 'U'
5 'i' 'i' '0' 'U' 'U' 'U' 'U'
25 'i' 'i' '0' 'i' 'i' 'U' 'U'
35 'i' 'i' '0' 'i' 'i' '0' 'U'
'~'
1 2 3
1 t 1 a 11 t 1 b 11 t 1 e 11 t 1 s 11 t 1 s 11 t 1 s 11 4; 1 1
tiempo a b e si s2 s3 d
o 'U' 'U' 'U' 'U' 'U' 'U' 'U'
5 'i' 'i' '0' 'U' 'U' 'U' 'U'
25 'i' 'i' '0' 'i' 'i' 'U' 'U'
35 'i' 'i' '0' 'i' 'i' '0' 'U'
45 'i' 'i' '0' 'i' 'i' '0' 'i'
El Código VHDL 3.8 muestra el banco de pruebas que hay que simular para
obtener la evolución temporal de las señales. Una vez activada la simulación del
banco de pruebas usando el simulador ModelSim, para poder obtener los valores de
las señales en los instantes de tiempo O, 5, 25, 35 y 45 hay que seguir los siguientes
pasos:
255
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
l. Añadir la ventana "List". Para ello seleccionamos la opción "List" del menú
"View". La ventana "List" muestra, en modo texto, los valores de las señales en
el tiempo en un formato tabular. La opción "List preferences ... " del menú "List"
nos permite configurar las propiedades de dicha ventana. Para poder obtener
el valor de las señales teniendo en cuenta los retardos 6 hay que configurar las
opciones de la ventana "List", tal como se muestra en la Figura 3.9.
2. Añadir a la ventana "List" las señales del diseño. Para ello, hay que seleccionar
las señales de la ventana "Objects" (véase la Figura 3.10).
256
SIMULACIÓN DEL CÓDIGO VHDL
~Deltas:
G: Expand Deltas C Collapse Deltas O No Deltas
1
,..---Trigger On:
- Trigger Gating:
Expression: 1
On Duration: lo ns
OK 1 Cancel 1 8J:tply 1
Name
ns.,.. /bp_deltas/uut/ ct.,.. /bp_deltas/uut/s2.,..
+a delta.,.. /bp_deltas/uut/ a.,.. /bp_deltas/uut/s3.,..
+b /bp_deltas/uut/b.,..
+e /bp_deltas/uut/c.,..
+d /bp_deltas/uut/s1.,..
+s i O +O u u u u u ~ u +----o
+ s2 o +1 u 1 1 o u u u +----o
+s3 o +2 u 1 1 o 1 1 u +---- 28
o +3 u 1 1 o 1 1 o +---- 38
View Declaration
Vie1N r.1emory Contents
o +4 1 1 1 o 1 1 o +---- 48
View Messages
Copy
Find ...
Insert Breakpoint
Add to Wave
Selected Signals
Add to Log Signals in Region
Add to Dataflow
Toggle Coverage
257
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Ninguna de las señales ha sido inicializada al ser declarada, por ello valen 'u' en
t = O. Asimismo, en t = O se ejecutan las sentencias concurrentes, calculándose el
nuevo valor de las señales s1, s2, in1, in2, y se ejecuta el bloque process. Se ejecuta
la primera iteración del bucle for que hay dentro del bloque process, quedando la
ejecución suspendida en la sentencia wait. Con ello, se calcula el nuevo valor de
las señales s3, s4. Se planifica asignar los nuevos valores a las señales en el instante
t = 6. El resultado de la simulación en t = O y las transacciones planificadas son las
siguientes:
t in1 t in2 t s1 t s2 t s3 t s4
6 '1' 6 '0' 6 'U' 6 'U' 6 'U' 6 'U'
10 ns '1'
11 ns '0'
20 ns '1'
22 ns '0'
26 ns '1'
29 ns '0'
Los eventos en in1, in2 hacen que se ejecuten las sentencias concurrentes para el
cálculo de los nuevos valores de s1, s2. Dado que estas sentencias tienen un retardo
inercial de 2 ns, los nuevos valores se asignarán a s1, s2 en el instante t = 2 ns.
258
SIMULACIÓN DEL CÓDIGO VHDL
t in1 t in2 t s1 t s2 t s3 t s4
10 ns '1' 2 ns '1' 2 ns '1'
11 ns '0'
20 ns '1'
22 ns '0'
26 ns '1'
29 ns '0'
t in1 t in2 t s1 t s2 t s3 t s4
10 ns '1'
11 ns '0'
20 ns '1'
22 ns '0'
26 ns '1'
29 ns '0'
259
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
t in1 t in2 t s1 t s2 t s3 t s4
11 ns '0' 12 ns '0' 12 ns '0' 10 ns +5 '0' 10 ns +5 'U'
20 ns '1'
22 ns '0'
26 ns '1'
29 ns '0'
t in1 t in2 t s1 t s2 t s3 t s4
11 ns '0' 12 ns '0' 12 ns '0'
20 ns '1'
22 ns '0'
26 ns '1'
29 ns '0'
260
SIMULACIÓN DEL CÓDIGO VHDL
t in1 t in2 t s1 t s2 t s3 t s4
20 ns '1' 13 ns '1' 13 ns '1'
22 ns '0'
26 ns '1'
29 ns '0'
t in1 t in2 t s1 t s2 t s3 t s4
20 ns '1'
22 ns '0'
26 ns '1'
29 ns '0'
Asimismo, el evento en in2 hace que se ejecuten las sentencias que calculan el
nuevo valor de las señales s1, s2. Los nuevos valores se asignaran a estas señales en
el instante t = 22 ns.
261
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
t ini t in2 t si t s2 t s3 t s4
22 ns '0' 22 ns '0' 22 ns '0' 20 ns +o '0' 20 ns +o '0'
26 ns 'i'
29 ns '0'
t ini t in2 t si t s2 t s3 t s4
22 ns '0' 22 ns '0' 22 ns '0'
26 ns 'i'
29 ns '0'
262
SIMULACIÓN DEL CÓDIGO VHDL
t in1 t in2 t s1 t s2 t s3 t s4
26 ns '1' 24 ns '1' 24 ns '1'
29 ns '0'
t in1 t in2 t s1 t s2 t s3 t s4
26 ns '1'
29 ns '0'
263
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
t ini t in2 t si t s2 t s3 t s4
29 ns '0' 28 ns '0' 28 ns '0'
n: ~~~
81 82 83 84
1 t 1 ini 11 29 1 11 t 1 11 t 1 11 t 1 11 t 1 1
264
SIMULACIÓN DEL CÓDIGO VHDL
t ini t in2 t si t s2 t s3 t s4
31 ns 'i' 31 ns 'i'
265
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
t ini t in2 t si t s2 t s3 t s4
31 ns 'i' 31 ns 'i' 30 ns +o 'i' 30 ns + o 'o'
t ini t in2 t si t s2 t s3 t s4
31 ns 'i' 31 ns 'i'
266
SIMULACIÓN DEL CÓDIGO VHDL
267
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
t ini t in2 t si t s2 t s3 t s4
40 ns +5 'i' 40 ns +o 'i'
+ /retardo_bp/s1 u
+ /retardo_bp/s2
+ /retardo_bp/s3
u
u
f---l
f-----1 tF=CJ J
+ / retardo_bp/s4 u
+ /retardo_bp/in1 1
+ /retardo bp/in2 o
1
Now 50 ns 1 ' ' ' '
1
' ' ' ' 101 ' ' ' ' 1
' ' ' ' 1
20
' ' ' ' 1
' ' ' ' 301 ' ' ' ' 1
' ' ' ' 401 ' ' ' 1
' ' ' ' 501
...
Cursor 1 Ons
.... ....
~
268
SIMULACIÓN DEL CÓDIGO VHDL
Solución al Ejercicio 3. 7
Al declarar las señales se especifica que el valor inicial de YO es ' 1 ' , pero no se
especifica el valor inicial de Y1. Por ello, la señal YO tiene en t = O el valor ' 1',
mientras que la señal Y1 tiene el valor por defecto para std_logic, que es 'U' .
- Las sentencias del bloque process se ejecutan secuencialmente, una tras otra,
hasta que se ejecuta la sentencia wait, que hace que la ejecución del bloque
process quede suspendida. La ejecución de cada sentencia de asignación a YO
hace que se actualice la cola de transacciones del driver. Por tratarse de asig-
naciones con retardo de transporte, en cada caso se actualiza la cola aplicando
únicamente la Regla l. Obsérvese que al añadir la transacción correspondiente
a la sentencia
YO <= transport '1' after 15 ns;
ya que la transacción descrita por esta última asignación está planificada para
un tiempo posterior a 15 ns (aplicación de la Regla 1).
tiempo YO Y1
o '1' 'U'
tiempo YO tiempo Y1
10 ns '0' 10 ns '1'
15 ns '1'
30 ns '0'
269
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
tiempo YO Y1
o '1' 'U'
10 ns '0' '1'
tiempo YO tiempo Y1
15 ns '1' 20 ns '0'
30 ns '0'
El siguiente evento está planificado para el instante 15 ns. Por tanto, el reloj de
la simulación avanza hasta t = 15 ns, instante en el cual se asigna a la señal YO el
valor '1 '.
calculándose el nuevo valor para Y1, que es ' 1'. Este nuevo valor se asignará a la
señal en el instante t = 25 ns. Al introducir esta nueva transacción en la cola de
transacciones del driver, se elimina de la cola la transacción que estaba planificada
para el instante t = 20 ns (aplicación de la Regla 2.2). El resultado de la simulación
hasta el instante t = 15 ns y el contenido de las colas de transacciones se muestran
a continuación.
tiempo YO Y1
o '1' 'U'
10 ns '0' '1'
15 ns '1' '1'
tiempo YO tiempo Y1
30 ns '0' 25 ns '1'
270
SIMULACIÓN DEL CÓDIGO VHDL
señal y el valor actual son iguales. Por tanto, el reloj de la simulación avanza hasta
t = 30 ns, instante en el cual está planificado el evento más próximo.
tiempo YO Y1
o '1' 'U'
10 ns '0' '1'
15 ns '1' '1'
30 ns '0' '1'
tiempo YO tiempo Y1
40 ns '0'
El siguiente evento está planificado para el instante 40 ns. Por tanto, el reloj de
la simulación avanza hasta t = 40 ns , instante en el cual se asigna a la señal Y1 el
valor 'o' . Como no existen más eventos planificados, la simulación termina en este
instante.
La tabla siguiente muestra los valores que toman las señales YO e Y1 en los
instantes de tiempo en que existe un evento en alguna de estas señales.
tiempo YO Y1
o '1' 'U'
10 ns '0' '1'
15 ns '1' '1'
30 ns '0' '1'
40 ns '0' '0'
271
TEMA 4
4.1. Introducción
4.2. Diseño para síntesis de lógica combinacional
4.3. Funciones lógicas
4.4. Multiplexor de 4 entradas
4.5. Restador completo de 1 bit
4.6. Sumador completo de 1 bit
4. 7. Unidad aritmético lógica
4.8. Lecturas recomendadas
4.9. Ejercicios de autocomprobación
4.10. Soluciones de los ejercicios
DISEÑO DE LÓGICA COMBINACIONAL
OBJETIVOS DOCENTES
Una vez estudiado el contenido del tema y realizados los ejercicios prácticos,
debería saber:
- Discutir qué características debe reunir un diseño para que el circuito resul-
tante de su síntesis sea combinacional.
275
DISEÑO DE LÓGICA COMBINACIONAL
4.1. INTRODUCCIÓN
Por otra parte, al realizar el diseño debe evitarse incluir retardos temporales
en la descripción VHDL del circuito, ya que los retardos del circuito real serán
dependientes del hardware en particular que se emplee para implementar el circuito.
277
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Las herramientas de síntesis pueden sintetizar las puertas lógicas simples a partir
de las operaciones lógicas primitivas de VHDL. A continuación, se muestran dos
ejemplos:
Puerta NAND nand_out <= iO nand i1;
Puerta OR-exclusiva xor_out <= iO xor i1;
También, pueden sintetizarse arrays de puertas lógicas a partir de este mismo tipo
de sentencias. Por ejemplo, la siguiente sentencia describe un array de inversores:
Array de inversores inv_vec <= not iO_vec;
donde inv_vec e iO_vec son std_logic_vector.
278
DISEÑO DE LÓGICA COMBINACIONAL
Finalmente, los circuitos que realizan operaciones aritméticas pueden ser des-
critos aplicando las correspondientes operaciones aritméticas a los tipos de datos
adecuados. Por ejemplo, los operandos std_logic_vector deben ser convertidos a
unsigned antes de emplear los operandos suma o multiplicación. Por ejemplo:
Sumador add_uvec <= unsigned(iO_vec) + i1_uvec;
donde i1_uvec y add_uvec son unsigned.
Multiplicador mult_uvec <= unsigned(iO_vec) * i1_uvec;
donde i1_uvec y mult_uvec son unsigned.
Para crear tipos específicos de unidades aritméticas, tales como tipos especiales
de sumadores o multiplicadores rápidos, puede ser necesario describirlos o bien
indicando su estructura, o bien mediante una descripción de su comportamiento
a más bajo nivel, tal como se explica a continuación.
279
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Aunque las sentencias concurrentes de asignación a señal son útiles para crear
estructuras combinacionales simples, es necesario disponer de otro método para crear
circuitos más complejos. En concreto, cierto número de cláusulas de VHDL (tales
como if, case y for) sólo pueden ser usadas dentro de bloques process.
Los bloques process pueden ser usados para describir lógica combinacional. Para
que el circuito resultante de la síntesis sea combinacional, deben respetarse las reglas
siguientes:
l. Todas las entradas del circuito deben estar incluidas en la lista de sensibilidad
del bloque process.
3. Ninguna de las sentencias internas al bloque process debe ser sensible al flanco
de subida o de bajada de ninguna señal.
El Código VHDL 4.1 describe las funciones lógicas. Obsérvese que el orden en
el cual deben realizarse las operaciones booleanas debe indicarse explícitamente
mediante paréntesis en el código VHDL (en caso contrario se obtiene error). Es
decir, las funciones lógicas deben escribirse de la forma siguiente:
F ( a and b ) or not e
G ( a and b ) or ( not b and e )
280
DISEÑO DE LÓGICA COMBINACIONAL
-- Funcion es lógicas:
F = ab + e'
G = ab + b'c
Fichero: fun cLog_F_G.vhd
library IEEE; use IEEE.std_logie_1164.all;
entity funeLog_F _G is port
( F, G : out std_logic;
a, b, e : in std_logic );
end entity funeLog_F _G;
architecture funeLog_F _G of funeLog_F _G is
begin
F <= (a and b) or not e;
G <= (a and b) or (not b and e);
end arch1tecture funeLog_F _G;
La interfaz externa del circuito que implementa las funciones lógicas es descrita
en la entity llamada funcLog_F _G. En ella se declaran los dos puertos de salida (F,
G), seguidos de los tres puertos de entrada (a, b, e). Todos los puertos son del tipo
std_logic, ya que representan señales transmitidas por el cableado de los circuitos.
Una vez modelado el circuito, puede programarse su banco de pruebas tal como
se muestra en el Código VHDL 4.2. Puesto que el banco de pruebas no va a ser
sintetizado, puede emplearse para su programación cualquier instrucción VHDL dis-
ponible (incluso aquellas que darían lugar a circuitos no sintetizables). Instrucciones
útiles de este tipo son wait, assert y report, que permiten controlar el progreso de
la simulación, comprobar y mostrar sus resultados.
281
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
-- Banco de pruebas
-- Fichero: bp_funcLog_F_G. vhd
library IEEE;
use IEEE. std_logie_1164. all;
use IEEE.numerie_std . all;
entity bp_funeLog_F _G is
end entlty bp_funeLog_F _G;
begin
Código VHDL 4.2: Banco de pruebas del circuito que implementa las dos funciones lógicas.
282
DISEÑO DE LÓGICA COMBINACIONAL
simplicidad, en este caso esta labor la asume el diseñador. Es decir, observando las
señales de salida del circuito y comparando con la tabla de la verdad de las funciones
lógicas, el diseñador determina si el funcionamiento del circuito es el esperado.
gen_vec_test : process
variable
begin
donde las variables se declaran antes de la palabra reservada begin, y las sentencias a
ejecutar secuencialmente se escriben a continuación de la palabra begin. Obsérvese
que VHDL permite opcionalmente asignar un nombre a los bloques process. En
este caso, se ha asignado al bloque el nombre gen_ ve e_ test.
283
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
pueda ser incrementado (con el fin de generar todas las posibles combinaciones de
vectores de test) empleando un bucle for. La variable test_in se ha declarado de
tipo unsigned, ya que se emplea para realizar operaciones aritméticas. La longitud
del vector se especifica por el rango (2 downto 0). El primer número del rango (2)
indica el índice del bit más significativo del vector, y el segundo número del rango
(O) indica el índice del bit menos significativo del vector.
para esperar hasta que el UUT pueda producir las salidas correspondientes a las
entradas aplicadas. En este caso, podría haberse escogido cualquier otro tiempo de
espera, ya que en el modelo del UUT no se especificó ningún retardo.
La segunda sentencia wait , que está situada al final del bloque process, no tiene
ninguna indicación acerca del tiempo que hay que esperar. Este tipo de sentencia
wait se emplea para suspender indefinidamente la ejecución del bloque process, ya
que "espera para siempre".
+ /bp_funclog_f_g/_yO 1 1 1
+ /bp_funclog_f_g/_y1 1 1
1 1 1
+ /bp_funclog_f_g/xO 1 1 1 1 1 1 l 1
+·/bp_funclog_f_g/x1 1 1 1 1
+ /bp_funclog_f_g/x2 1 1
~11111111
2
~ü
4
~ü ~~~
6
~ü ~~
8
111 1 1 1 1 1 1 1 1 1 1 1 1 1 1 111 1 1 1 1 1 1 1 1111111 11 11111 1111111 1 1111111 ~ü 11
Now 80 ns
Cursor 1 Ons llQflil
El wW~I hl l .,.....
1 O ns to 84 ns 1 Now: 80 ns Delta: 1
284
DISEÑO DE LÓGICA COMBINACIONAL
En la Figura 4.2 se muestra un multiplexor de 4 entradas (i3, i2, i1, iO), dos
entradas de selección (si, so) y una salida (d). En esta sección se describen diferentes
maneras de modelar el multiplexor, así como bancos de pruebas que permiten simular
tests sobre los modelos del circuito.
El Código VHDL 4.3 describe el MUX 4:1, empleando para ello una sentencia
if incluida en un bloque process. Asimismo, el Código VHDL 4.4 describe el com-
portamiento del multiplexor mediante sentencias if y case incluidas en un bloque
process. Obsérvese que en ambos diseños el bloque process es sensible a las señales
i3, i2, i1, iO, s1, sO. Esto significa que las sentencias del bloque se ejecutarán cada
vez que alguna de estas señales cambie de valor.
El Código VHDL 4.5 es un banco de pruebas que aplica algunos vectores de test
al multiplexor. Se trata únicamente de un pequeño ejemplo, no es un programa de
test exhaustivo para este circuito. En la Figura 4.3a se muestran las formas de onda
obtenidas al simular el banco de pruebas.
Un error que a veces se comete consiste en olvidar incluir en la lista alguna de las
variables a las que es sensible el bloque process. La consecuencia de este error es que
el bloque process no se ejecutará cuando cambie el valor de la variable no incluida
en la lista, con lo cual el modelo simulado no reproducirá correctamente el circuito
real. Por ejemplo, supongamos que en el modelo del multiplexor no se incluyen las
entradas i3, i2, i1, iO en la lista de variables a las que es sensible el bloque process.
Es decir, supongamos que por error la architecture del multiplexor se define tal
como se muestra en el Código VHDL 4.6.
285
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
-- MUX 4x1
-- Fichero: mux_4xLprocess_if. vhd
library IEEE; use IEEE. std_logic_1164. all;
entity mux_ 4x1 is port
( d : out std_logic;
i3, i2, i1, iO : in std_logic;
s 1, sO : in std_logic ) ;
end entity mux_4x1;
architecture mux_ 4x1 of mux_ 4x1 is
begin
process (i3, i2, i1, iO, s1, sO)
begin
if (s1='0' and s0='0') then
d <= iO;
elsif (s1=' O' and sO=' 1 ') then
d <= i1;
elsif (s1=' 1' and sO=' O') then
d <= i2;
el se
d <= i3;
end if;
end process;
end architecture mux_4x1;
Código VHDL 4.3: Diseño de un MUX 4:1 mediante una sentencia if.
El Código VHDL 4.8 ilustra el empleo de señales del tipo integer. Este diseño
es una variación del anterior, describiéndose en este caso el comportamiento del
circuito mediante dos sentencias concurrentes. En la primera, se asigna valor a la
señal integer sel en función del valor de las entradas de selección. En la segunda,
se asigna valor a la salida del circuito en función de las entradas de datos y del valor
de la señal entera. En la Figura 4.4 se muestra el resultado de la simulación.
286
DISEÑO DE LÓGICA COMBINACIONAL
-- MUX 4x1
-- Fichero: mux_4xLprocess_if_case. vhd
library IEEE; use IEEE. std_logic_1164. all;
entity mux_ 4x1 is port
( d : out std_logic;
i3, i2, i1, iO : in stcLlogic;
s1, sO : in std_logic );
end entity mux_4x1;
Código VHDL 4.4: Descripción del MUX 4:1 mediante sentencias if y case.
287
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
-- Banco de pruebas
-- Fichero: bp_mux_4x1. vhd
library IEEE;
use IEEE. std_logic_1164. all;
entity bp_mux_ 4x1 is
end entity bp_mux_4x1;
architecture bp_mux_ 4x1 of bp_mux_ 4x1 is
signal d : std_logic; -- Conectar salida UUT
signal iO, i1, i2, i3,
sO, s1 : std_logic; -- Conectar entmdas UUT
288
DISEÑO DE LÓGICA COMBINACIONAL
+ /bp_mux_4x1/d o 1 L 1 1
+ /bp_mux_4x1 /i0 1 1
+ /bp_mux_4x1/i1 o
+ /bp_mux_4x1/i2 1
+ /bp_mux_4x1 /i3 o
+ /bp_mux_4x1/s0 1 1 1 1
+ /bp_mux_4x1/s1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Now 60 ns ) 10 20 30 40
a)
+ /bp_mux_4x1/d o 1 1
+ /bp_mux_4x1/i0 1 11 1
+ /bp_mux_4x1/i1 o 11
+ /bp_mux_4x1/i2 1 11
+ /bp_mux_4x1/i3 o 11
+ /bp_mux_4x1/s0 1 11 1 1 1
+ /bp_mux_4x1/s1 1 11 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Now 60 ns ) 10 20 30 40
b)
Figura 4 .3: Formas de onda obtenidas de simular el banco de pruebas: a) modelo del multiplexor
correct o; b) modelo del mult iplexor erróneo.
-- MUX 4x 1
-- ERROR al definir la sensibilidad del bloque process
-- Fich ero : mux_4x Lprocess_if"_in sen sible_i3i2i1iO. vhd
architecture mux_4x1 of mux_4x1 is
begin
process (s1 , sO) -- Error: no se incluyen i3,i2, i1,i0
begin
if (s1='0'and s0='0') then
d <= iO;
elsif (s1=' O' and sO=' 1 ') t hen
d <= i1;
elsif (s1=' 1 'and sO=' O') then
d <= i2 ;
el se
d <= i3 ;
end if;
end process;
end architectur e mux_4x1;
289
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
-- MUX 4x1
-- Fichero: mnx_4xLconcnrrente1. vhd
library IEEE; use IEEE.std_logic_ii64.all;
entity mux_ 4xi is port
( d : out std_logic;
i3, i2, ii, iO : in std_logic;
si, sO : in std_logic );
end entity mux_4xi;
-- MUX 4x1
-- Fichero: mnx_4xLconcurrente. vhd
library IEEE; use IEEE. std_logic_ii64.all;
entity mux_ 4xi is port
( d : out std_logic;
i3, i2, ii, iO : in std_logic;
si, sO : in std_logic ) ;
end entity mux_4xi;
architecture mux_4xi_concurrente of mux 4xi is
signal sel : integer;
begin
sel <=O when (si='O' and s0='0') else
i w hen (si= ' O' and sO= ' i ' ) else
2 when (si='i' and s0='0') else
3;
d <= iO when sel = O else
i i when sel = i else
i2 when sel = 2 else
i3;
end architecture mux_4xi_concurrente;
Código VHDL 4.8: Diseño de un MUX 4:1 mediante dos sentencias concurrentes.
+ /bp_mux_ 4x1/uutld o 11 1 1 1 1
+ /bp_mux_4x1/uutli0 1 11 1
+ /bp_mux_4x1/uutli1 o 11
+ /bp_mux_ 4x1/uut/i2 1 1'
+ /bp_mux_ 4x1/uut/i3 o 11
+ /bp_mux_ 4x1/uut/s0 1 11 1 1 1
+ /bp_mux_4x1/uutls1 1 11 1
+ /bp_mux_4x1/uut/sel 3 o 1 2 3
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Now 45 ns ) 10 20 30 40
Figura 4.4: Formas de onda obtenidas de simular el banco de pruebas, empleando la descripción
del comportamiento del multiplexor.
290
DISEÑO DE LÓGICA COMBINACIONAL
a b res acarreo
o o o o
o 1 1 1
1 o 1 o
1 1 o o
Los puertos de entrada y de salida se definen del tipo std_logic, con el fin de
facilitar el uso del restador como subcircuito en otros circuitos: se emplean señales
del tipo std_logic y std_logic_vector para modelar las señales transmitidas por el
cableado de los circuitos físicos.
291
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
declararla, se indica que la señal tiene 2 bits, especificando para ello su rango:
( 1 downto O ) . Si no se especifica el rango, las señales del tipo unsigned tienen
por defecto 32 bits. El tipo de la señal debe ser unsigned, a fin de permitir el uso
del operador resta.
porque cada elemento de una señal del tipo unsigned es del tipo std_logic, que es
exactamente el tipo de las señales res y acarreo_out.
292
DISEÑO DE LÓGICA COMBINACIONAL
.----+r--;
··. . ... . . . . . . . . . 1 d
a
.............................................
res
b
............................................. -~ ...
;:.·.·.-.·.·.·.-.·.·.-.·.-.-.....................
acarreo m
.............................................
Obsérvese que, a fin de facilitar la descripción del modelo, se han etiquetado las
señales internas (not_a, e, d, e, f) y las puertas lógicas (gO, ... , g6). La definición de
cada una de estas puertas lógicas se muestra en el Código VHDL 4.10.
293
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Código VHDL 4.10: Diseño de las puertas lógicas XOR2, NOTl , AND2 y OR3.
294
DISEÑO DE LÓGICA COMBINACIONAL
295
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity bp_rest_completo is
end entity bp_rest_completo;
Se han definido señales internas al banco de pruebas para todas las conexiones
al UUT. Aunque en este ejemplo si lo sean, los nombres de las señales no tienen que
ser idénticos a los nombres de los puertos del UUT.
Se ha definido un proceso (process) para generar las formas de onda de las entra-
das al UUT, y en ese mismo proceso se han incluido las sentencias para comprobar
si las salidas del UUT coinciden con las esperadas.
Es esencial tener en cuenta que el método empleado para calcular las salidas
"esperadas" del UUT debe ser diferente del método empleado en el propio UUT para
obtener las salidas. En este ejemplo, el UUT contiene una descripción estructural de
la arquitectura del restador, mientras que las salidas "esperadas" (variable esperado)
se calculan a partir de una descripción del comportamiento del restador:
esperado := ('0' & a)- ('0' & b)- ('0' & acarreo_in);
296
DISEÑO DE LÓGICA COMBINACIONAL
begin
-- Instanciar y conectar UUT
uut : component rest_completo port map
(res, acarreo_out, a, b, acarreo_in);
-- Crear vectores de test y comprobar salidas del UUT
gen_vec_test : process
variable test_in : unsigned (2 downto O); -- Vector de test
variable esperado : unsigned (1 downto O); -- Salida esperada
variable num_errores : integer := O; -- Numero de errores
begin
test_in := B"OOO";
for count in O to 7 loop
a <= test_in(2);
b <= test_in(1);
acarreo_in <= test_in(O);
wait for 10 ns;
esperado := ('0' & a)- ('0' & b)- ('0' & acarreo_in);
if (esperado /= ( acarreo_out & res )) then -- Comprueba resultado
report "ERROR : Esperado (" & -- Report del error
std_logic' image (esperado( 1)) &
std_logic' image (esperado( O)) &
") /= actual (" &
std_logic' image (acarreo_ out) &
std_logic' image (res) &
") en el instante " &
time ' image ( now);
num_errores := num_errores + 1;
end if;
test_in := test_in + 1;
end loop;
report "Test completo. Hay " &
integer' image(num_errores) &
"errores.";
wait;
end process gen_vec_test;
end architecture bp_rest_completo;
297
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
j
1 1 1 1
+ /bp_rest_completo/a 1
+ /bp_rest_completo/b 1
+ /bp_rest_completo/acarreo_in 1 l r l 1 1 1
VSIM 11 >
Figura 4.6: Formas de onda y mensaje en la consola obtenidos al simular el banco de pruebas.
El código anterior del banco de pruebas puede modificarse con el fin de emplear
una función en lugar de un procedimiento. El Código VHDL 4.14 es una posible
forma de hacerlo. Obsérvese que se ha sustituido la cláusula if, que compara el valor
esperado con el valor actual, por una sentencia assert. El motivo es únicamente
ilustrar el uso de la sentencia assert.
298
DISEÑO DE LÓGICA COMBINACIONAL
begin
-- Instanciar y conectar UUT
uut : component rest_completo port map
(res, acarreo_out, a, b, acarreo_in);
-- Crear vectores de test y comprobar salidas del UUT
gen_ vec_ test : process
variable test_in : unsigned (2 downto O); -- Vector de test
variable esperado : unsigned (1 downto O); --Salida esperada
variable num_errores : integer := O; -- Numero de errores
begin
test_in := B"OOO";
for count in O to 7 loop
a <= test_in(2);
b <= test_in(1);
acarreo_in <= test_in(O);
wait for 10 ns;
esperado := ('0' & a)- ('0' & b)- ('0' & acarreo_in);
error_check( esperado, acarreo_out & res, num_errores );
test_in := test_in + 1;
end loop;
report "Test completo. Hay " & integer' image(num_errores ) & " errores.";
wait;
end process gen_vec_test;
end architecture bp_rest_completo_procedure;
Código VHDL 4.13: Banco de pruebas del restador completo de un bit usando un procedimiento.
299
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
begin
uut : component rest_completo port map (res, acarreo_out, a, b, acarreo_in);
gen_ vec_ test : process
variable test_in : unsigned (2 downto O); -- Vector de test
variable esperado : unsigned (1 downto O); --Salida esperada
variable num_errores : integer := O; -- Numero de errores
begin
test_in := B11 000 11 ;
for count in O to 7 loop
a <= test_in(2); b <= test_in(1); acarreo in <= test_in(O);
wait for 10 ns;
esperado := ('0' & a)- ('0' & b)- ('0' & acarreo_in);
num_errores := num_errores -t-
error_check( esperado, acarreo_out & res, now );
test_in := test_in -t- 1;
end loop;
report 11 Test completo. Hay 11 & integer'image(num_errores) & 11 errores. 11 ;
wait;
end process gen_vec_test;
end architecture bp_rest_completo_funcion;
Código VHDL 4.14: Banco de pruebas del restador completo de un bit usando una función.
300
DISEÑO DE LÓGICA COMBINACIONAL
Un sumador completo es un circuito con tres bits de entrada (xi, Yi, ci) y dos
bits de salida: el bit suma (si) y el bit acarreo (Ci+ 1 ). El funcionamiento del circuito
está descrito por la tabla de la verdad siguiente:
Ci Xi Yi Ci+l Si
o o o o o
o o 1 o 1
o 1 o o 1
o 1 1 1 o
1 o o o 1
1 o 1 1 o
1 1 o 1 o
1 1 1 1 1
X¡
............................................
.·.·.·.·. ·.)!L.·.·.·.·.·:.-.·.·.·.·.·.·.·.·.·.·.·.·:.·.·.·.·.·.:
"''''•c;•••oo•••••oooooooooooo•••oo•'
..........................................
¡A:N52.....................¡
-----+-:....,. ¡ n2
i.~.~º~-1... ..........1
l---+¡A-t·No2""""""""'""1n .....__...,.¡o_
...R-'1.·3"""""""""""'1
3 .............................................
301
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
El Código VHDL 4.15 describe las puertas lógicas necesarias para componer el
circuito sumador de la Figura 4.7. Las puertas lógicas AND, OR y XOR se modelan
con un retardo de 10 ns.
+ /bp_sum_completo/c_in 1 1
+ /bp_sum_completo/ x 1 1 1
+ /bp_sum_completo/y
1
1 1 1 1 1 1 1
+ /bp_sum_completo/c_out
1
1 ----., 1 1 1
+ /bp_sum_completo/s 1 ----., 1 1 1
11111111111111111111111111111111111111111111111111111111111111111111 d 111111111111111111111
Now 450 ns ) 100 200 300 400
.... . ....
.. .... _,
/~ . \,.: . ,. . . :
'
DISEÑO DE LÓGICA COMBINACIONAL
entity and2 is
generic ( DELAY : time := 10 ns );
port ( yO : out std_logic;
xO, x 1 : in std_logic ) ;
end entity and2;
architecture and2 of and2 is
begin
yO <= ( xO and x1 ) after DELAY;
end architecture and2;
entity or3 is
generic ( DELAY : time := 10 ns );
port ( yO : out std_logic;
xO, x1, x2 : in std_logic );
end entity or3;
architecture or3 of or3 is
begin
yO <= ( xO or x1 or x2 ) after DELAY;
end architecture or3;
entity xor2 is
generic ( DELAY : time := 10 ns );
port ( yO : out std_logic;
xO, x1 : in std_logic );
end entity xor2;
architecture xor2 of xor2 is
begin
yO <= ( xO xor x1 ) after DELAY;
end architecture xor2;
Código VHDL 4.15: Diseño de las puertas lógicas AND2, OR3 y XOR2 con retardo.
BERGARA
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Código VHDL 4.16: Package con los componentes del sumador y diseño del sumador.
304 .
DISEÑO DE LÓGICA COMBINACIONAL
component sum_completo is
port ( s, C_out : out std_logic;
x, y, C_in : in std_logic);
end component sum_completo;
begin
-- Instanciar y conectar UUT
uut : component sum_completo port map
(s => s, C_out => C_out, x => x, y => y, C_in => C_in);
-- Crear vectores de test y comprobar salidas del UUT
gen_vec_test : process
variable test_in : unsigned (2 downto O); -- Vector de test
variable esperado : unsigned (1 downto O); --Salida esperada
variable num_errores : integer := O; -- Numero de errores
begin
test_in := B"OOO";
for count in O to 7 looi_>
C_in <= test_in(2);
x <= test_in(1);
y <= test_in(O);
wait for 50 ns;
esperado := ('0' & x) + ('0' & y)+ ('0' & C_in);
if (esperado / = ( C_out & s ) ) then -- Comprueba resultado
report "ERROR : Esperado ( 11 & -- Report del error
std_logic' image( esperado( 1)) &
std_logic ' image (esperado (O)) &
") /= actual (" &
std_logic' image(C_out) &
std_logic ' image ( s) &
11
) en el instante
11
&
time' image(now);
num_errores := num_errores + 1;
end if;
test_in := test_in + 1;
end loop;
report "Test completo. Hay 11 & integer'image(mim_errores) & 11 errores.";
wait;
end process gen_vec_test;
end architecture bp_sum_completo;
305
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Una unidad aritmético lógica (ALU) es un circuito que, dependiendo del valor
de sus ·entradas de selección de función, realiza una operación lógica o aritmética,
de entre un conjunto de operaciones posibles, sobre uno o dos operandos.
mo de Operación Descripción
000 A* 2 Multiplicar por 2 (equivale a desplazamiento a la izqda)
oo1 A+B Suma
o1 o A-B Resta
o1 1 -A Complemento a dos
1 oo A and B AND lógico
1 o1 A or B OR lógico
11o A xor B XOR lógico
111 notA Complemento de todos los bits
Este circuito puede ser descrito mediante una asignación concurrente a una señal,
o bien mediante varias asignaciones incluidas dentro de un bloque process, tal
como se muestra en el Código VHDL 4.18. Ambos diseños dan lugar a circuitos
combinacionales equivalentes.
use work.ALU_CONSTANTS.all;
306
DISEÑO DE LÓGICA COMBINACIONAL
entity ALU is
port ( e : out std_logic_vector (WIDTH-1 downto O);
A, B :in std_logic_vector (WIDTH-1 downto O);
mode : in std_logic_vector (SEL_BITS-1 downto O) );
end entity ALU;
architecture ALU_concurrente of ALU is
begin
e <= std_logic_vector (signed(A)+signed(A)) when (mode= 11 000 11 )
else std_logic_vector (signed(A)+signed(B)) when (mode= 11 001 11 )
else std_logic_vector (signed(A)-signed(B)) when (mode= 11 010 11 )
else std_logic_vector (-signed(A)) when (mode= 11 011 11 )
else A and B when (mode= 11 100 11 )
else A or B when (mode= 11 101 11 )
else A xor B when (mode= 11 110 11 )
else not A;
end architecture ALU_concurrente;
Código VHDL 4 .18: Uso de package para la definición de const antes, y diseño de la ALU
mediante una asignación concurrente y un bloque process.
307
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Aún en el caso de una ALU sencilla como esta, examinar que la ALU realiza
correctamente las operaciones para todos los posibles valores de los operadores
consumiría bastante tiempo. En la práctica esta técnica sería inviable, por lo cual
debe seleccionarse un conjunto de vectores de test, por ejemplo, atendiendo a los
criterios siguientes:
- Se escogen valores de los operandos entorno al cero. Por ejemplo: -2, -1, O,
1 y 2.
308
DISEÑO DE LÓGICA COMBINACIONAL
entity TB_ALU is
end entity TB_ALU;
component ALU is
port ( C : out std_logic_vector (WIDTH-1 downto O);
A, B : in std_logic_vector (WIDTH-1 downto O);
mode : in std_logic_vector (SEL_BITS-1 downto O) );
end component ALU;
Código VHDL 4.19: Package en el cual se definen las constantes usadas en el banco de pruebas
de la AL U y comienzo de la definición del banco de pruebas de la AL U.
309
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Código VHDL 4.20: Fragmento del banco de pruebas de la ALU: definición del procedure
check_ALU.
310
DISEÑO DE LÓGICA COMBINACIONAL
begin
UUT : component ALU port map (e, A, B, mo de);
311
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Código VHDL 4.22: Parte final de la definición del banco de pruebas de la ALU.
312
DISEÑO DE LÓGICA COMBINACIONAL
313
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Ejercicio 4.1
Diseñe en VHDL un codificador 4:2 con prioridad. Este circuito tiene cuatro
entradas de 1 bit (i3, i2, i1, iO) y dos salidas: la señal valida, de 1 bit, que vale '1'
cuando al menos una de las entradas vale '1', y la señal codificada, de 2 bits, cuyo
valor corresponde con la entrada de mayor prioridad cuyo valor es '1 '. La entrada
i3 tiene mayor prioridad que i2, ésta mayor que i1 y finalmente la entrada iO es la
de menor prioridad.
Ejercicio 4.2
Ejercicio 4.3
314
DISEÑO DE LÓGICA COMBINACIONAL
f b
Z3 Z2 Zl zo a b e d e f g
o o o o 1 1 1 1 1o 1
o o o 1 o 1 1 o o o o
o o 1 o 1 1 o 1 1 o 1
o o 1 1 1 1 1 1 o o 1
o 1 o o o 1 1 o o 1 1
o 1 o 1 1 o 1 1 o 1 1
o 1 1 o 1 o 1 1 1 1 1
o 1 1 1 1 1 1 o o o o
1 o o o 1 1 1 1 1 1 1
1 o o 1 1 1 1 o o 1 1
Ejercicio 4.4
315
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Ejercicio 4.5
Ejercicio 4.6
Ejercicio 4. 7
x3 Y3 x2 Y2 xl yl Xo Yo
X¡ y¡ X¡ Y; X¡ Y; X¡ y¡
eout c3 c2 el ein
ci+l SBC C¡ ci+I SBC C¡ ci+l SBC C¡ ci+l SBC C¡
S¡ S¡ S¡ S¡
s3 s2 SI So
Figura 4.10: Sumador binario paralelo de 4 bits con propagación del arrastre.
316
DISEÑO DE LÓGICA COMBINACIONAL
Ejercicio 4.8
op Operación
00 Desplaza a la izquierda rellenando con 'O'
o1 Desplaza a la derecha rellenando con 'O'
1o Rota a la izquierda
11 Rota a la derecha
Ejercicio 4. 9
Diseñe un circuito que compare si dos números de N bits tienen igual valor.
Construya el circuito de manera iterativa, tal como se muestra en la Figura 4.11.
Po
'1'
EQ EQ ••• EQ
Figura 4.11: Circuito que compara si dos números de N bits son iguales.
Diseñe inicialmente un comparador de 1 bit, que tenga las tres entradas siguien-
tes: los dos operandos de un bit (xi e Yi) y el resultado de la comparación de la
etapa anterior (Pi)· Pi es un bit cuyo valor es '1' sólo si todas las parejas de bits
comparadas hasta esa etapa son iguales. La salida del comparador de 1 bit, Pi+l ,
es el resultado de la comparación llevada acabo en esa etapa, teniendo en cuenta
el valor de las tres entradas. Finalmente, encadene N comparadores de 1 bit para
implementar el comparador de N bits, usando para ello la sentencia generate.
317
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Ejercicio 4.10
Diseñe la ALU cuyo circuito se muestra en la Figura 4.12 y que realiza las
operaciones descritas en la la Tabla 4.4. La salida de la AL U se selecciona mediante
el bit más significativo de la señal sel, mientras que la operación que realiza es
especificada por los otros tres bits de esta señal. Emplee en el diseño de la AL U
únicamente código concurrente. A continuación, programe un banco de pruebas que
testee el correcto funcionamiento de la AL U diseñada.
a(7:0) - -....--t
Unidad
Lógica
b(7:0) - .....-+o--1
y(7:0)
Unidad
aritmética
cin(O:O)---~
sel(3)
318
DISEÑO DE LÓGICA COMBINACIONAL
Ejercicio 4.11
Ejercicio 4.12
X y
000 000
001 001
010 011
011 010
100 110
101 111
110 101
111 100
entity codGray is
port ( y : out std_logic_vector(2 downto O);
x : in std_logic_vector(2 downto O) );
end entity codGray;
319
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
- Finalmente, describa la estructura del circuito, empleando para ello dos puertas
lógicas XOR de dos entradas. Tenga en cuenta que el bit en la posición i de
una palabra del código Gray es 1 si los bits en las posiciones i e i + 1 de la
correspondiente palabra binaria son diferentes. La entity de la puerta lógica
XOR se muestra a continuación.
entity xor2 is
port ( yO out std_logic;
xO, x1 in std_logic );
end entity xor2;
320
DISEÑO DE LÓGICA COMBINACIONAL
end process;
end architecture codificador_4_2_prioridad;
321
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity bp_codificador_4_2 is
constant MAX_COMB : integer := 16; -- Num. combinaciones entrada
constant DELAY : time .- 10 ns; -- Retardo usado en el test
end entity bp_codificador_4_2;
Código VHDL 4.24: Parte inicial del banco de pruebas de un codificador 4:2 con prioridad.
322
DISEÑO DE LÓGICA COMBINACIONAL
Código VHDL 4.25: Parte final del banco de pruebas de un codificador 4:2 con prioridad.
323
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
x3 x2 x1 xO F = X<5
o o o o 1
o o o 1 1
o o 1 o 1
o o 1 1 1
o 1 o o 1
o 1 o 1 o
o 1 1 o o
o 1 1 1 o
1 - - - o
F (not x3 and not x2) or (not x3 and x2 and not x1 and not xO)
-- Comparador F = X< 5:
F = x3'x2'+x3'x2x1 'xO'
-- Fichero: comparaXmenor5.vhd
library IEEE; use IEEE. std_logic_1164. all;
entity comparaXmenor5 is port
( F : out std_logic;
x : in std_logic_vector ( 3 downto O) ) ;
end entity comparaXmenor5;
architecture comparaXmenor5 of comparaXmenor5 is
begin
F <= (not x(3) and not x(2))
or (not x(3) and x(2) and not x(1) and not x(O));
end architecture comparaXmenor5;
Código VHDL 4.26: Diseño del circuito comparador de 4 bit para X<5.
324
DISEÑO DE LÓGICA COMBINACIONAL
entity bp_comparaXmenor5 is
end entity bp_comparaXmenor5;
begin
-- Instanciar y conectar UUT
uut : component comparaXmenor5 port map
( F => F, X => X );
report 11
Test completo. Hay &
integer'image(num_errores) &
11
errores. 11 ;
wait; --Final simulación
end process gen_vec_test;
Código VHDL 4.27: Banco de pruebas del circuito comparador de 4 bit para X<5.
325
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Código VHDL 4.28: Decodificador BCD a 7 segmentos descrito empleando una sentencia case.
326
DISEÑO DE LÓGICA COMBINACIONAL
entity bp_bcdTo7Seg is
constant DELAY : time := 10 ns; -- Retardo usado en el test
end entity bp_bcdTo7Seg;
architecture bp_bcdTo7Seg of bp_bcdTo7Seg is
component bcdTo7Seg is
port ( a, b, e, d, e, f, g : out std_logic;
i3, i2, i1, iO : in std_logic);
end component bcdTo7Seg;
begin
UUT : component bcdTo7Seg port map
(segs(6), segs(5), segs(4), segs(3), segs(2),
segs(1), segs(O), bcd(3), bcd(2), bcd(1), bcd(O));
ve e_ test : process is
variable valor : unsigned (3 downto O);
begin
report "Comienza la simulación";
-- Gen erar todos los posibles valores de entrada
for i in O to 9 loop
valor := TO_UNSIGNED(i,4);
bcd <= std_logic(valor(3)) & std_logic(valor(2))
& std_logic(valor(1)) & std_logic(valor(O));
wait for DELAY;
end loop;
report "Simulación finalizada";
wait; -- Final de la simulación
end process ve e_ test;
327
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Código VHDL 4.30: Decodificador BCD descrito empleando una sentencia if.
328
DISEÑO DE LÓGICA COMBINACIONAL
Código VHDL 4.31: Decodificador BCD descrito empleando una sentencia de asignación
concurrente condicional.
329
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity BCDto7seg is
port( a, b, e, d, e, f, g : out std_logic;
i3, i2, i1, iO : in std_logic);
end BCDto7seg;
Código VHDL 4.32: Decodificador BCD descrito empleando una sentencia with select.
330
DISEÑO DE LÓGICA COMBINACIONAL
Solución al Ejercicio 4. 7
entity sumador_Nbits is
begin
carryv(O) <= C_in;
--Instanciación y conexión de componentes usando GENERATE
conexion: for k in N-1 downto O generate --GENERATE iterat'ivo
FullAdder: sum_completo
port map (s(k), Carryv(k+1), x(k), y(k),Carryv(k));
end generate conexion;
331
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
component sumador_Nbits is
generic (N: integer :=4);
port ( s : out std_logic_vector(N-1 downto O);
C_out : out std_logic;
x, y : in std_logic_vector(N-1 downto O);
C_in : in std_logic);
end component sumador _Nbi ts;
begin
-- Instanciar y conectar UUT
uut : component sumador_Nbits port map
( s => s, C_out => C_out(O),
x => x, y => y, C_in => C_in(O) );
Código VHDL 4.34: Parte inicial del banco de pruebas del sumador de 4 bits.
332
DISEÑO DE LÓGICA COMBINACIONAL
Código VHDL 4.35: Parte final del banco de pruebas del sumador de 4 bits.
333
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
-- Desplazador de 4 bits
-- Fichero: desplazador. vhd
library IEEE;
use IEEE . std_logic_1164. all;
entity desplazador is
port( salida : out std_logic_vector(3 downto O);
op : in std_logic_vector(1 downto O);
entrada : in std_logic_vector(3 downto o));
end desplazador;
architecture desplazador of desplazador is
begin
334
DISEÑO DE LÓGICA COMBINACIONAL
entity bp_desplazador is
constant DELA Y : time := 10 ns; -- R etaTdo 'Usado en el test
end entity bp_desplazador;
component desplazador is
port ( salida : out std_logic_vector(3 downto O);
op : in std_logic_vector ( 1 downto O);
entrada : in std_logic_vector(3 downto o));
end component desplazador ;
Código VHDL 4.37: Primera parte del banco de pruebas del circuito desplazador.
335
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Código VHDL 4.38: Segunda parte del banco de pruebas del circuito desplazador.
336
DISEÑO DE LÓGICA COMBINACIONAL
entity comparadorEQNbi ts is
generic (N: integer :=4);
port ( s : out std_logic;
x, y : in std_logic_vector(N-i downto O));
end entity comparadorEQNbi ts;
architecture comparadorEQNbi ts of comparadorEQNbi ts is
signal p: std_logic_vector(N downto O);
component comparadorEQibi t is
port ( pi : out std_logic;
pO, x, y : in std_logic);
end component comparadorEQibi t;
begin
p(O) <= 'i';
--Instanciación y conexión de componentes usando GENERATE
conexion: for k in N-i downto O generate --GENERATE iterativo
comparadorNbits: comparadorEQibit
port map (p(k+i), p(k), x(k), y(k));
end generate conexion;
s <= p(N);
end architecture comparadorEQNbi ts;
Código VHDL 4.39: Diseño del circuito comparador de igualdad de dos números de 1 bit y del
circuito comparador de igualdad de dos números de N bits.
337
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity bp_comparadorEQNbi ts is
end entity bp_comparadorEQNbi ts;
component comparadorEQNbi ts is
generic ( N: integer : =4);
port ( s : out std_logic;
x, y : in std_logic_vector(N-1 downto O));
end component comparadorEQNbi ts;
begin
-- Instanciar y conectar UUT
uut : component comparadorEQNbi ts port map
( S => s, X => x, y => y );
gen_ ve e_ test : process
variable num_errores : integer := O; -- Numero de errores
begin
for op_X in O to 2**4-1 loop
for op_Y in O to 2**4-1 loop
x <= std_logic_vector(to_unsigned( op_x,4) );
y <= std_logic_vector(to_unsigned( op_y,4) );
wait for 10 ns;
-- Comprueba resultado
if (x=y and s='O') or (x/=y and s='1') then
report 11 Error. Valores 11 &
integer'image(op_x) &
.. , 11 &
integer' image ( op _y);
num_errores := num_errores + 1;
end if;
end loop;
end loop;
Código VHDL 4.40: Banco de pruebas del circuito comparador de igualdad de 4 bits.
338
DISEÑO DE LÓGICA COMBINACIONAL
- Se escogen valores de los operandos entorno al cero. Por ejemplo: -2, -1, O,
1 y 2.
339
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Código VHDL 4.41: Diseño de la ALU cuyo circuito se muestra en la Figura 4.12.
340
DISEÑO DE LÓGICA COMBINACIONAL
component ALU is
port ( y : out std_logic_vector(WIDTH-1 downto O);
a, b : in std_logic_vector (WIDTH-1 downto O);
e in : in std_logic_vector (O downto O);
sel : in std_logic_vector (SEL_BITS-1 downto O) );
end component ALU;
Código VHDL 4.42: Package en el cual se definen las constantes usadas en el banco de pruebas
de la ALU cuyo circuito se muestra en la Figura 4.12 y comienzo de la definición del banco de
pruebas de la ALU.
341
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Código VHDL 4.43: Fragmento del banco de pruebas de la ALU cuyo circuito se muestra en la
Figura 4.12: primera parte de la definición del procedure check_ALU.
342
DISEÑO DE LÓGICA COMBINACIONAL
begin
UUT : component ALU port map (y, a, b, cin, sel);
-- Bloque process para generar los vectores de test y comprobar el resultado
main : process is
variable error _count : integer := O;
begin
report "Comienza la simulación";
-- Vectores de test: operandos con valor- próx:imo a cer-o
for i in -2 to 2 loop
for j in -2 to 2 loop
for k in O to SEL_MAX loop
for 1 in O to 1 loop
a <= std_logic_vector(TO_SIGNED( i,WIDTH));
b <= std_logic_vector(TO_SIGNED(j,WIDTH));
sel <= std_logic_vector(TO_SIGNED(k,SEL_BITS));
cin <= std_logic_vector(TO_SIGNED(l,1));
wait for DELAY;
check_ALU(i, j, 1, k, y, error_count);
end loop;
end loop;
end loop;
end loop;
-- Vectores de test: operandos con valor pr-óximo al mínimo
for i in MIN_NEG_DATA to MIN_NEG_DATA+4 loop
for j in MIN_NEG_DATA to MIN_NEG_DATA+4 loop
for k in O to SEL_MAX loop
for 1 in O to 1 loop
A <= std_logic_vector(TO_SIGNED(i,WIDTH) );
b <= std_logic_vector(TO_SIGNED(j ,WIDTH));
sel <= std_logic_vector(TO_SIGNED(k,SEL_BITS));
cin <= std_logic_vector(TO_SIGNED(l,1) );
wait for DELAY;
check_ALU(i, j, 1, k, y, error_count);
end loop;
end loop;
end loop;
end loop;
Código VHDL 4.44: Fragmento de la definición del banco de pruebas de la ALU cuyo circuito
se muestra en la Figura 4.12.
343
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Código VHDL 4.45: Parte final de la definición del banco de pruebas de la ALU cuyo circuito
se muestra en la Figura 4.12.
344
DISEÑO DE LÓGICA COMBINACIONAL
-- NOT de 1 entrada
library IEEE; use IEEE. std_logic_1164. all;
entity not 1 is
port ( y : out std_logic;
x : in std_logic ) ;
end entity not 1;
architecture not 1 of not 1 is
begin
y <= not x;
end architecture not1;
--AND de 4 entradas
library IEEE; use IEEE.std_logic_1164.all;
entity and4 is
port ( y : out std_logic;
xO, x1, x2, x3 : in std_logic ) ;
end entity and4;
architecture and4 of and4 is
begin
y <= xO and x1 and x2 and x3;
end architecture and4;
Código VHDL 4.46: Diseño de una puerta NOT de 1 entrada y de una puerta AND de 4
entradas.
345
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Nombrando las entradas y salidas del circuito tal como se muestra en la Fi-
gura 4.13a, la tabla de la verdad del circuito decodificador es la mostrada en la
Figura 4.13b.
E A¿ Al Ao y7 y6 Ys y4 y3 y2 yl Yo
o X X X o o o o o o o o
1 o o o o o o o o o o 1
1 o o 1 o o o o o o 1 o
1 o 1 o o o o o o 1 o o
1 o 1 1 o o o o 1 o o o
1 1 o o o o o 1 o o o o
1 1 o 1 o o 1 o o o o o
1 1 1 o o 1 o o o o o o
E
a) b) 1 1 1 1 1 o o o o o o o
Figura 4.13: Decodificador 3 a 8: a) circuito; y b) tabla de verdad.
Existen varias formas de realizar el diseño del banco de pruebas del circuito
decodificador 3 a 8 con entrada enable. En el Código VHDL 4.48 y 4.49 se muestra
una de ellas.
346
E:~r i~l A ,~~ i~l
2 1 0
1 11 ! ! 1 ( 111 ! 1 !1 : 111 1 1 1 i: ;
.···
. .~···w· ··.~····
........ ......··.··. .· .· .··. .· ..· · .··· ···. . .· .· .· .··. .· .· ..· · .· .········
.. . . . . . . . . .··. .
··. .· .···
. . .·· · · .··. .· .· .··. .· .· .· .··..· ..· · .···. . .· .· .· .· .· .··. .· .· .· .· ..·· .· .······
. .. .. . . . .· ·. ..
···. ·. .··. .· .· .· ..· · .· .··. .· .····
. .. .· .
· .· .··. .· .· .· ..· · .· ..···.
••• "!• i ':¡ •~J • • • ••• •••••••••••••• • ••••••••••••••••••••••.•• • • • • •••••••••• •• ••••••••••••• ••••••••••• • •••••••••:••
..........
; ~
: A.2::
n·ot_A.d ::1: :1: : 1: . : 1: • : • : : • : • :1 : : •• : • : • • • : • : : 1: • • • • : • • : : : : : : : : 1: : : : : : : : : : : : : : : 1 : : : : :·: : : : : : : :+:: ::::::::::::+.............; ............ i .
:A.f ::1::1: 1 ::::::: :1:;::
1
:::: :1; .... :::::1 ::::::::::::::1 .... .. .. .. 1., .. .. .. .. .... 1 1
. ... . ·ll<itj\1'
:::: :: : A.a:
. ·1·::· ·: 1·::· ·: :• •:::· • ·: ::• · 1·: 1·::• ·::· :::::
•· • •• :••::·¡·¡·
: : ·: ::
•· •:::::
•· ••·::••: ::•·¡·r
: ·::••:::
•••::••::•::· •::••¡•r•
: :::
•••: ::::
••· ••: :••¡•¡•
: : :::
•••: :::
••••::•::: : :::
•••¡•¡• •••: ::•••: ::::
••••¡•r •••••••••·11
• . • . . ' ' ' 1
__....
. . . . ... . . . . . ~
U1
•••• o ••• o ••• ••••••••• - •
• • • • o • • • ••• o •• o • • • • • t::rJ
. . . .. . .. . .. . . . .. . . .. . . . . . . .. . . Z•
o
tj
t::rJ
t"'
o,
0
Q
;¡:;..
o
o
~
tJ:j
Figura 4.14: Diagrama estructural al nivel de puertas lógicas del circuito decodificador 3 a 8.
z
;¡:;..
o
e,..;¡
oz
~ ;¡:;..
-..;¡ t"'
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
-- Decodificador 3 a 8 bits
library IEEE;
use IEEE.std_logic_1164.all;
-- Banco de pruebas
-- decodificador_3_a_8
library IEEE;
use IEEE. std_logic_1164. all;
use IEEE. numeric_std. all;
entity bp_decodificador_3_a_8 is
end entity bp_decodificador_3_a_8;
begin
Código VHDL 4.48: Fragmento inicial del banco de pruebas del decodificador 3 a 8.
348
DISEÑO DE LÓGICA COMBINACIONAL
end loop;
report "ERROR: Hay " &
integer'image(error_count) &
"errores.";
wait;
end process gen_vec_test;
end architecture bp_decodificador_3_a_8;
Código VHDL 4.49: Fragmento final del banco de pruebas del decodificador 3 a 8.
349
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Código VHDL 4.50: Diseño del conversor de código binario a código Gray, empleando un bloque
process con una sentencia case.
350
DISEÑO DE LÓGICA COMBINACIONAL
Código VHDL 4.51: Diseño del conversor de código binario a código Gray, empleando una
asignación concurrente de selección (with - select).
Código VHDL 4.52: Diseño del conversor de código binario a código Gray, describiendo la
estructura del circuito al nivel de puertas lógicas.
351
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity bp_codGray is
constant DELA Y : time := 10 ns; -- R etardo usado en el test
end entity bp_codGray;
architecture bp_codGray of bp_codGray is
signal x : std_logic_vector(2 downto O);
signal y : std_logic_vector ( 2 downto O);
component codGray is
port ( y : out std_logic_vector(2 downto O);
X : in std_}ogic_vector(2 downto 0));
end component codGray;
begin
UUT : component codGray port map
(y, x);
vec_ test : process is
variable temp : unsigned (2 downto O);
begin
report "Comienza la simulación";
-- Generar todos los posibles valores de entrada
for i in O to 7 loop
temp := TO_UNSIGNED(i,3);
x(2) <= std_logic(temp(2));
x(1) <= std_logic(temp(1));
x(O) <= std_logic(temp(O));
wait for DELAY;
end loop;
report "Simulación finalizada";
wait; -- Final de la simulación
end process vec_ test;
end architecture bp_codGray;
Código VHDL 4.53: Banco de pruebas del conversor de código binario a código Gray.
352
TEMA 5
REGISTROS Y MEMORIAS
5.1. Introducción
5.2. Registro de 4 bits
5.3. Registro multifunción
5.4. Registro de desplazamiento
5.5. Register file
5.6. Bus bidireccional y memorias
5.7. Lecturas recomendadas
5.8. Ejercicios de autocomprobación
5.9. Soluciones de los ejercicios
REGISTROS Y MEMORIAS
OBJETIVOS DOCENTES
Una vez estudiado el contenido del tema y realizados los ejercicios prácticos,
debería saber:
- Diseñar usando VHDL registros con las funcionalidades siguientes: reset, carga
serie y paralelo, lectura serie y paralelo, y desplazamiento de 1 bit hacia la
derecha e izquierda. Programar usando VHDL bancos de pruebas para los
registros que testeen las funcionalidades anteriores.
355
REGISTROS Y MEMORIAS
5.1. INTRODUCCIÓN
Los circuitos secuenciales almacenan bits, siendo los registros, las RAM y las
ROM los componentes básicos usados para ello.
En este tema se aborda el diseño y test usando VHDL de varios tipos de registros
y memorias. Asimismo, se introduce una capacidad de VHDL no presentada hasta
el momento: el acceso a fichero. Esta capacidad resulta útil en la programación de
los bancos de pruebas.
357
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity Reg4 is
port ( Q : out std_logic_vector(3 downto O);
I : in std_logic_vector ( 3 downto O);
clk, rst : in std_logic );
end entity Reg4;
y carga 0000
11 11
•
358
REGISTROS Y MEMORIAS
component Reg4 is
port ( Q : out std_logic_vector(3 downto O);
I : in std_logic_vector(3 downto O);
clk, rst : in std_logic );
end component Reg4;
begin
uut : component Reg4 port map (Q, I, clk, rst);
Código VHDL 5.2: Banco de pruebas de un registro de 4 bits con reset síncrono.
359
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Tras aplicar cada uno de estos vectores de test, se ejecutan las dos sentencias
wait siguientes:
espera hasta que la condición cambie de valer false a valer true. Si la condición
inicialmente vale true, entonces la sentencia wait espera hasta que la condición se
haga false y posteriormente vuelva a valer true.
.
Messages
, l
8 + /bp_reg4/q 0000 uuuu ~000 ~1111 ~1010 ~000
+ /bp_reg4/clk o 1 1 1 1 1 1 1 L_
8 + /bp_reg4/i 0000 ¡1111 ~1010 ~000
+ /bp _reg4/rst o 1
1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
>'«QO Now 50 ns lS 10 ns 20 ns 30 ns 40 ns
!il ..L~ ~ ~
:......... !h 1 1 /
1 O ns to 43 ns 1 Now: 50 ns Delta: 1
360
REGISTROS Y MEMORIAS
Q3 Q2 Q¡ Qo o o o o Mantiene valor
o o o Desplaz. Izq.
o o Desplaz. Drcha.
o Carga paralelo
Reset (carga "0000")
es equivalente a escribir:
361
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Q <= R;
process ( clk)
begin
if rising_edge( clk) then
if(rst = '1') then
R <= "0000";
elsif (Ld = '1') then
R <= I;
elsif (Shr = '1 ') then
R(3) <= Shr_In;
for index in O to 2 loop
R(index) <= R(index+1);
end loop;
elsif (Shl = '1 ') then
R(O) <= Shl_In;
for index in O to 2 loop
R(index+1) <= R(index);
end loop;
end if;
end if;
end process;
end architecture Reg4mf;
362
REGISTROS Y MEMORIAS
Dado que en el puerto de salida del registro Q debe obtenerse en todo momento
el valor almacenado, R, es necesario copiar en todo momento el valor de la señal R
en la señal Q. Para ello, en el diseño se ha incluido la sentencia de asignación:
Q <= R;
que se ejecuta cada vez que cambia el valor de R, asignando transcurrido un tiempo
infinitesimal oeste nuevo valor a la señal Q.
Obsérvese que esta sentencia no ha sido incluida dentro de ningún bloque pro-
cess. Recuérdese que este tipo de sentencias de asignación a señal, que se encuentran
en la architecture fuera de los bloques process, se denominan sentencias concu-
rrentes de asignación a señal.
Q <= R;
process (R)
begin
Q <= R;
end process;
Cada vez que cambia el valor de la señal R, se ejecuta el bloque process, con lo
cual el valor de Q es actualizado al nuevo valor de R transcurrido un tiempo o(delta).
363
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
El Código VHDL 5.4- 5.6 es un banco de pruebas parcial para el registro multifun-
ción, que prueba únicamente un grupo muy reducido de vectores de test. El banco
de pruebas correctamente diseñado debería comprobar el circuito de manera más
exhaustiva, testeando, por ejemplo, todas las posibles combinaciones de las entradas
de control.
Messages r V
[±) + fbp_reg4mf/q 0000 u.. . mooo U111 l!O!O 1.0101 1.0011 U001 1.0100 1.0000 1.0001 1.0010 1.0000
+ fbp_reg4mf/clk
GJ + fbp_reg4mf/i
o
1111
1
1111 l!010 1.0101 1.0011 U111 roooo
•
U111
+ fbp_reg4mf/rst 1 lr---J
+fbp_reg4mf/shr_in 1 lr---J 1 L___j
+fbp_reg4mf/shl_in 1 r---L____J L____j
+ fbp_reg4mf/ld 1 1 1
+fbp_reg4mf/shr 1 J
+ fbp_reg4mf/shl 1 1 1
.~1iii}@
11111111 .¡,,,,,,,,,,,, 1111111111111111 , , , , , , , , , , d t l l l l l l l l l l l l l l l l l ,,,,1111111111111111 d 11111111 , , , , , , , , , , , , , , , , , , , , , , , , 1
Now 120 ns 15 20 ns 40 ns 60 ns 80 ns 100 ns 120 ns
w i.J ~ L!:Jik l 1 /
1 Ons to 123 ns 1 Now: 120ns Delta: 1
364
REGISTROS Y MEMORIAS
-- R eset
I <= "1111"; Shr_In <= '1'; Shl_In <= '1';
rst <= '1'; Ld <= '1'; Shr <= '1'; Shl <= '1';
wait until rising_edge( clk);
wait for (PERIOD0/2);
numTest := numTest + 1;
assert ( Q = "0000")
report "Error vector " & integer' image(numTest);
365
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
-- Carga 1111
I <= "1111"; Shr_In <= '0'; Shl_In <= '0';
rst < = 'O' ; Ld < = ' 1 ' ; Shr < = ' 1 ' ; Shl < = ' 1' ;
wait until rising_edge( clk);
wait for (PERIOD0/2);
numTest := numTest + 1;
assert ( Q = 11 111 !1')
report "Error vector 11 & integer' image(numTest);
-- Carga 101 O
I <= "1010"; Shr_In <= '0'; Shl_In <= '1';
rst <= '0'; Ld <= '1'; Shr <= '1'; Shl <= '1';
wait until rising_edge( clk);
wait for (PERIOD0/2);
numTest := numTest + 1;
assert ( Q = "1010" )
report "Error vector " & integer' image(numTest);
-- Carga 0101
I <= "010!1'; Shr_In <= '1'; Shl_In <= '1';
rst <= '0'; Ld <= '1'; Shr <= '1'; Shl <= '1';
wait until rising_edge( clk);
wait for (PERIOD0/2);
numTest := numTest + 1;
assert ( Q = "0101" )
report "Error vector 11 & integer' image(numTest);
-- Carga 0011
I <= "0011"; Shr_In <= '1'; Shl_In <= '1';
rst <= '0'; Ld <= '1'; Shr <= '1'; Shl <= '1';
wait until rising_edge( clk);
wait for (PERIOD0/2);
numTest := numTest + 1;
assert ( Q = "0011" )
report "Error vector 11 & integer' image(numTest);
-- D esplazamiento D erecha, Carga serie '1'
I <= "1111"; Shr_In <= '1'; Shl_In <= '1';
rst <= '0'; Ld <= '0'; Shr <= '1'; Shl <= '0';
wait until rising_edge( clk);
wait for (PERIOD0/2);
numTest := numTest + 1;
assert ( Q = "100!1' )
report "Error vector 11 & integer' image(numTest);
Código VHDL 5.5: Continuación del banco de pruebas de un registro multifunción de 4 bits.
366
REGISTROS Y MEMORIAS
Código VHDL 5.6: Parte final del banco de pruebas de un registro multifunción de 4 bits.
367
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
El registro multifunción mostrado en la Figura 5.3 incluye, entre otras, las ope-
raciones de desplazamiento hacia la izquierda y la derecha. En aquellos casos en que
sólo se requiera la operación de desplazamiento y la entrada serie de bits, puede
emplearse un circuito más sencillo, tal como el registro de desplazamiento mostrado
en la Figura 5.5.
368
REGISTROS Y MEMORIAS
entity RegDesp32 is
port ( Q : out std_logic_vector(31 downto O);
Shr, Shr _in : in std_logic;
clk, rst : in std_logic ) ;
end entity RegDesp32;
architecture RegDesp32 of RegDesp32 is
signal R : std_logic_vector ( 31 downto O);
begin
process (el k)
begin
if rising_edge( clk) then
if (rst = '1 ') then
R <= X11 00000000 11 ;
elsif (Shr = '1 ') then
R(31) <= Shr_in;
for index in O to 30 loop
R(index) <= R(index+1);
end loop;
end if;
end if;
end process;
Q <= R;
end architecture RegDesp32;
El Código VHDL 5.8 muestra un banco de pruebas que aplica algunos vectores
de test al registro de desplazamiento. En primer lugar, el programa de test resetea
el circuito. A continuación, pone las señales Shr y Shr_in al valor '1' y espera
durante 16 ciclos de reloj. Con ello, se realizan 16 desplazamientos hacia la derecha,
introduciéndose 16 bits '1' por la parte izquierda del registro. El valor almacenado
resultante es X"FFFFOOOO". A continuación, el programa de test pone la señal Shr_in
al valor 'O' y espera durante otros 16 ciclos de reloj. El valor almacenado resultante
es X"OOOOFFFF". Finalmente, el programa de test pone la señal Shr al valor 'O' y
finaliza el bloque process en el que se aplican los vectores de test.
369
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity bp_RegDesp32 is
end entity bp_RegDesp32;
component RegDesp32 is
port ( Q : out std_logic_vector(31 downto O);
Shr, Shr _in : in std_logic;
clk, rst : in std_logic ) ;
end component RegDesp32;
begin
uut : component RegDesp32 port map (Q, Shr, Shr_in, clk, rst);
-- Reset
rst < = '1'; Shr < = '1'; Shr_in < = '1';
wait until rising_edge( clk); wait for (PERIODD/2);
-- Carga serie 16 bits '1 '
rst < = '0'; Shr < = '1'; Shr_in < = '1';
for index in O to 15 loop
wait until rising_edge( clk);
end loop;
wait for (PERIODD/2);
assert ( Q = X" FFFFOOOO 11 ) report "Fallado Q=FFFFOOOO";
-- Carga serie 16 bits 'O'
rst < = '0'; Shr <= '1'; Shr_in < = '0';
for index in O to 15 loop
wait until rising_edge( clk);
end loop;
wait for (PERIODD/2);"
assert ( Q = X"OOOOFFFF") report "Fallado Q=OOOOFFFF";
370
REGISTROS Y MEMORIAS
---· ·-·-···-·-·- --
Messages r
(±] + /bpJegdesp32/q 0000000000 XXXXXXXXXXXXXXX. .. IC 00000 000000000000000000000000 10000000000000000000000000000000 110000000000000000 ...
+ lbpJegdesp32/clk 1 1 1 L_
+ /bpJegdesp32/shr 1
+ /bpJegdesp32/shr _in 1
+ lbpJegdesp32/rst 1 1
1 1 1 1 1
Jil~s
1 1 1 1 1 1 1 1 1 1 1 1 1 1
Ni~@ Now 350 ns 4 ns 16 ns 20 ns 24 ns 28 ns
lS 12 ns
GJJ'~ Cursor 1 7 ns S
Messages V
±; + /bp_regdesp32/q 0000000000 0000000000000111111111111111100 000000000000001111111111 1111110 !00000000000000001111111111111111
+ lbpJegdesp32/clk o 1
+ lbp_regdesp32/shr 1
+ /bpJegdesp32/shr jn O
+ lbpJegdesp32/rst o
1 1 1 1 1 1 1 1 1 1 1 1 ~ 1 1 1 1 1 1 1 1 1
a~~@ Now 350 ns 308 ns 312 ns 316 ns 320 ns ~ 324 ns 328 ns 332 ns 33E
f-.1,/'0 Cursor 1 322ns 322 ns
Figura 5.6: Fragmentos del resultado de la simulación del banco de pruebas del registro de
desplazamiento de 32 bits.
Una alternativa consiste en que el banco de pruebas lea de un fichero los vectores
de test. De esta forma, resulta relativamente sencillo incluir nuevos vectores de test,
y pueden emplearse diferentes ficheros para testear diferentes aspectos del diseño y
371
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
escenarios. Otra ventaja es que de esta forma pueden añadirse nuevos vectores de
test al fichero y realizar la simulación, sin necesidad de recompilar el código VHDL
del banco de pruebas.
El Código VHDL 5.9 muestra un banco de pruebas en el cual se van leyendo los
bits de carga serie ( Shr_in) de un fichero. Para ello, se usa el paquete std. textio. all,
en el cual se define el tipo file y los subprogramas (procedimientos y funciones)
asociados que permiten leer de ficheros: file_open(), file_close(), endfile(), read-
line() y read().
Obsérvese que dentro del bloque process del Código VHDL 5.9 se realiza la
declaración siguiente:
La primera sentencia define un fichero del tipo "fichero de texto" y cuyo identifi-
cador es fichVectores. Un "fichero de texto" es un fichero que contiene un número
arbitrario de caracteres ASCII y, por tanto, puede ser editado empleando cualquier
editor de texto.
En primer lugar, el banco de pruebas abre el fichero usando una llamada al pro-
cedimiento file_open(). Este procedimiento tiene tres parámetros: el identificador
del fichero, el nombre del fichero y el modo de acceso. El modo de acceso puede
tomar tres valores: read_mode, write_mode y append_mode. La sentencia
372
REGISTROS Y MEMORIAS
Código VHDL 5.9: Banco de pruebas del registro con acceso a fichero.
373
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
readline(fichVectores, inputLinea);
lee una línea del fichero fichVectores y la almacena en la variable inputLinea. Para
leer los caracteres individuales de la línea de entrada, es preciso usar el procedi-
miento read. Se usa un bucle for para acceder a los bits de inputLinea, donde
inputLinea' range especifica el número de caracteres de la línea.
Dentro del bucle for, se lee cada bit de inputLinea mediante la sentencia
read(inputLinea, inputBit);
Una vez se alcanza el final del fichero, finaliza el bucle while y se ejecuta la
sentencia de cierre del fichero. El procedimiento file_close tiene un único parámetro,
que es un identificador de fichero (del tipo file).
374
REGISTROS Y MEMORIAS
El fichero vectores. txt debe estar situado en el directorio espacio de trabajo del
entorno de simulación. Si el contenido del fichero es:
1111111111111111
0000000000000000
W data 32 32 R data
dl
Ío R addr
Í¡ Ío
Í¡
d2
en
W enable en
,.___--+----1 d R enable
3
rst ______.+----------+~
elk
375
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Además de los cuatro registros de 32 bits, el register file está compuesto por
dos decodificadores 2:4 con entrada enable, uno para escritura (situado en la parte
izquierda) y otro para lectura (situado en la parte derecha), y por cuatro buffers
triestado. El funcionamiento del buffer triestado se explicó en la Sección 1.9.1.
En este caso, el propósito de los buffers triestado es permitir que las salidas de los
registros se conecten al bus R_data, evitando así tener que utilizar un multiplexor,
que es un circuito más grande y lento. Esta estructura de conexión al bus a través de
buffers triestado funciona correctamente cuando se garantiza que en todo momento
no hay más de un buffer que tenga una salida diferente de alta impedancia ( 'Z'). El
decodificador de lectura garantiza este comportamiento.
1
OE
~·~---------+------~
o
Figura 5.8: Registro con entrada OE output enable.
376
REGISTROS Y MEMORIAS
entity Reg32_DE is
port ( Q : out std_logic_vector(31 downto O);
I : in std_logic_vector(31 downto O);
Ld, DE : in std_logic;
el k, rst : in std_logic ) ;
end entity Reg32_DE;
que asigna el valor 'O' a cada uno de los 32 bits del vector R. Esta sentencia es
equivalente a:
R <= X"OOOOOOOO";
con la diferencia de que usando others no se especifica el número de bits del vector,
con lo cual pueden escribirse diseños más generales. Asimismo, others proporciona
una notación más compacta y legible. Por ejemplo, en el segundo bloque process
se ha escrito
Q <= "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ";
377
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
dado que en este caso no se hubiera podido usar la representación hexadecimal para
reducir el tamaño de la palabra. Una peculiaridad de others es que sólo puede usarse
en sentencias de asignación, no puede usarse como parte de una condición.
Tal como se explicó en la Sección 3.4, el valor de una señal está determinado
en todo momento por el valor de sus drivers. Si un bloque process contiene una
sentencia de asignación a señal, entonces el bloque process tendrá un driver para
esa señal. En el caso del register file , la señal R_data tiene cuatro drivers.
Por la forma en que se ha realizado el diseño del register file, en cada instante
a lo sumo uno de los drivers escribe el valor 'O' ó '1' en la señal, mientras que los
demás drivers escriben el valor 'Z'. En consecuencia, en cada instante se escriben
cuatro valores en la señal, tres de los cuales son 'Z', y el cuarto es 'O', '1' ó 'Z'.
378
REGISTROS Y MEMORIAS
entity RegFile4x32 is
port ( R_data : out std_logic_vector(31 downto O);
W_data : in std_logic_vector(31 downto O);
R_addr, W_addr : in std_logic_vector(1 downto O);
R_en, W_en : in std_logic;
clk, rst : in std_logic );
end entity RegFile4x32;
component Dcd2x4 is
port ( d3, d2, d1, dO : out std_logic;
i1, iO : in std_logic;
en : in std_logic );
end component Dcd2x4;
component Reg32_0E is
port ( Q : out std_logic_vector(31 downto O);
I : in std_logic_vector(31 downto O);
Ld, DE : in std_logic;
clk, rst : in std_logic ) ;
end component Reg32_0E;
begin
R_Dcd : Dcd2x4 port map (R_d3, R_d2, R_d1, R_dO, R_addr(1), R_addr(O), R_en);
W_Dcd : Dcd2x4 port map (W_d3, W_d2, W_d1, W_dO, W_addr(1), W_addr(O), W_en);
RegO : Reg32_0E port map (R_data, W_data, W_dO, R_dO, clk, rst );
Reg1 : Reg32_0E port map (R_data, W_data, W_d1, R_d1, clk, rst );
Reg2 : Reg32_0E port map (R_data, W_data, W_d2, R_d2, clk, rst );
Reg3 : Reg32_0E port map (R_data, W_data, W_d3, R_d3, clk, rst );
379
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Cuando hay varios drivers para una misma señal, el simulador automáticamente
llama a la función de resolución asociada con el tipo de dato de la señal. En el
caso de la señal R_data, como es del tipo std_logic_vector, el simulador llama
a la función de resolución de ese tipo, que se encuentra definida en el paquete
IEEE. std_logic_1164. all (véase la Tabla 3.2). Esta función de resolución devuelve
'O' si uno de los drivers es 'O' y los demás 'Z'. Devuelve '1' si uno de los drivers es
'1' y los demás 'Z'. Sin embargo, si unos drivers valen 'O' y otros valen '1', entonces
la función de resolución devuelve 'X', cuyo significado es "valor desconocido".
El Código VHDL 5.12 y 5.13 es un banco de pruebas para el register file, que lee
los vectores de test de un fichero. Cada una de las líneas de este fichero (vectores. txt)
consta de una palabra de 39 bits, cuyo significado es mostrado en la Figura 5.9. En
la Figura 5.10 se muestra parte del resultado de la simulación.
Obsérvese que la línea leída del fichero es asignada a la variable aux, del tipo
std_logic_vector, que es definida dentro del bloque process gen_ ve e_ test. A con-
tinuación, descomponiendo esta palabra como se muestra en la Figura 5.9, se asigna
valor a los puertos de entrada del register file. Para ilustrar el funcionamiento del
banco de pruebas, se define un fichero de vectores de test (vectores. txt) muy sencillo,
cuyo contenido se muestra a continuación. La interpretación se indica en la Tabla 5.1.
111111111111111111111111111111111000000
011111111111111111111111111111111001000
010101010101010101010101010101010011000
011111111111111111111111111111111101000
001010101010101010101010101010101111000
000000000000000000000000000000000000001
000000000000000000000000000000000000011
000000000000000000000000000000000000101
000000000000000000000000000000000000111
380
REGISTROS Y MEMORIAS
entity bp_regFile4x32 is
constant PERIODO : time := 10 ns;
end entity bp_regFile4x32;
component RegFile4x32 is
port ( R_data : out std_logic_vector(31 downto O);
W_data : in std_logic_vector(31 downto O);
R_addr, W_addr : in std_logic_vector(1 downto O);
R_en, W_en : in std_logic;
clk, rst : in std_logic ) ;
end component RegFile4x32;
begin
uut : component RegFile4x32 port map
(R_data, W_data, R_addr, W_addr, R_en, W_en, clk, rst);
begin
report "Comienza la simulación";
-- Carga de vectores de test desde fichero
file_open(fichVectores, "vectores. txt", read_mode );
while not endfile(fichVectores) loop
Código VHDL 5.12: Banco de pruebas del register file, con acceso a fichero.
381
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
-- Continuación del banco de pruebas del register file. Fichero: bp_RegFile4x32. vhd
-- Asigna valor a W_data) W_addr) W_en) R_addr, R_en
rst <= aux(38);
W_data <= aux(37 downto 6);
W_addr <= aux(5 downto 4);
W_en <= aux(3);
R_addr <= aux(2 downto 1);
R_en <= aux(O);
wait for PERIODO;
end loop; -- bucle while
file_close(fichVectores);
wait until rising_edge( clk);
report "Finaliza la simulación";
wait; -- Final del bloque process
end process gen_ ve e_ test;
end architecture bp_regFile4x32;
Código VHDL 5.13: Continuación del banco de pruebas del register file.
382
REGISTROS Y ME~ORIAS
Messages
m
.
W+
Messages
/bp_regfile4x32/r _data
/bp_regfile4x32/w_data
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
11111111111111111111111111111111 10101010101010101010101010 01010 1111111111111111111111111111111 !0101010.
W + /bp_regfile4x32/r _addr 00 00
W+ /bp_regfile4x32/w_addr 10 10 11
+ /bp_regfile4x32/r _en o
+ /bp_regfile4x32/w_en
+ /bp_regfile4x32/rst
m
..
m
+ /bp_regfile4x32/clk
/bp_regfile4x32/uut/reg0/r
/bp_regfile4x32/uut/reg1/r
11111111111111111111111111111111
1o 101 o 10101 o 10101 o 10101 o 1o 101 o 1o
11111111111111111111111111111111
00000000000000000000000 ... 10101010101010101010101010101010
[___
1 1 1 1 1 1 1
22 ns 24 ns 26 ns 28 ns JO ns 32ns 34 ns 40 ns
W + /bp regfile4x32/r data 11111111111111111111111111111111 11111111111111111111111111111111 10101 o 10101 o 10101 o 10101 o 101 o 101 o
w + /bp_regfile4x32/w_data oooooooooooooooooooooooooooooooo ~~0~10~10::1:::01:::01:=0:::10:=
.. ·=oo=oo=o=oo=oo=o=oo=oo=oo=o=oo=oo=o=oo=oo=oo=o=oo===F=====;~==============1
w + /bp_regfile4x32/r_addr 00 00 1!11
w + /bp_regfile4x32/w_addr 00 1~1:;:1= = = = ; ; ; : ; ; = = = = = = = = = = = F = = = = = = = = = = = = = = = = = = = 1
+ /bp_regfile4x32/r _en
+ /bp_regfile4x32/w_en
+ /bp_regfile4x32/rst
+ /bp_regfile4x32/clk
::±J + /bp_regfile4x32/uut/reg0/r 11111111111111111111111111111111 ~~1;;;11~1~11~11*11~1~11;;;11~11~1~11*11~1~11;;;11~11~1~11;=======!f=================:::j
8+ /bp_regfile4x32/uut/reg1/r 10101010101010101010101010101010 ~~1~01~0~10~10~10~10~1~01~01~0~10~10~10~1~01~01~0~10========!f=================:::j
@+ /bp_regfile4x32/uut/reg2/r 11111111111111111111111111111111 11111111111111111111111111111111
8 + /bp_regfile4x32/uut/reg3/r 01010101010101010101010101010101 1;0:;10;:10~1;;;01~01~0~10:;10;:10~1;;;01:;;=01~0~10:;10;:10~10~1=======!f=================:::j
l-----------------------------i--,l--,l---,l--l-1-·-¡--¡---¡-¡--~-~--¡---
~ -~-~-~---
~ --~ -~--T--1-
1
~~~ Curs:~: ~~ ~: 48 ns 50 ns 52 ns 54 ns 56 ns ~58 ns 60 ns 62 ns 64 ns 66 ns 68 ns
l.!,r-J
1 47 ns to 69 ns J Now: 100 ns Delta: 1
Figura 5.10: Algunas formas de onda resultantes de la ejecución del banco de pruebas del register
file. En la figura superior, puede observarse la operación de reset síncrono, que se produce en
el instante 5 ns. En el instante 15 ns se escribe en regO. En la figura central, se muestran las
operaciones de escritura en reg1 (25 ns) y en reg2 (35 ns). La escritura es una operación síncrona:
se produce en el flanco de subida de la señal de reloj. Finalmente, en la figura inferior se muestran
las operaciones de lectura de regO (50 ns) y reg1 (60 ns). Obsérvese que la operación de lectura
es asíncrona: se produce en el flanco de subida de la señal r_en, con independencia del valor de la
señal de reloj.
383
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
En el Código VHDL 5.14 se muestra otro diseño del register file, en el cual
se realiza una descripción de su comportamiento. Obsérvese que en este diseño se
declara un nuevo tipo de dato, llamado regfile_type, que es un array:
type regfile_type is
array (Oto 3) of std_logic_vector(31 downto O);
El diseño del register file consta de dos bloques process. En el bloque process
W_process se escribe en los registros, tanto en la operación de reset como en la
operación normal de escritura, en la cual la dirección del registro viene determinada
por el vector de dos bits W_addr. Obsérvese cómo se realiza la conversión del vector
de dos bits a un entero, que es usado como índice del array regfile:
384
REGISTROS Y MEMORIAS
-- R egister fi le 4x32.
-- Descripción del comportamiento
-- Fichero: R egFile4x32_comp. vhd
library IEEE;
use IEEE. std_logic_1164. all;
use IEEE. std_logic_unsigned. all;
entity RegFile4x32 is
port ( R_data : out st<Llogic_vector(31 downto O);
W_data : in std_logic_vector(31 downto O);
R_ addr, W_ addr : in std_logic_vector ( 1 downto O);
R_en, W_en : in std_logic;
clk, rst : in std_logic ) ;
end entity RegFile4x32;
type regfile_type is
array (O to 3) of std_logic_vector ( 31 downto O);
signal regfile : regfile_ type;
begin
W_process : process ( clk)
begin
if rising_edge( clk) then
if ( rst = ' 1 ') then
regfile(O) <= X"OOOOOOOO";
regfile(1) <= X"OOOOOOOO";
regfile(2) <= X"OOOOOOOO";
regfile(3) <= X"OOOOOOOO";
elsif ( W_en = '1 ') then
regfile( conv _integer(W_addr)) <= W_data;
end if;
end if;
end process W_process;
Código VHDL 5.14: Diseño del regist er file mediante la descripción del comportamiento.
385
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Messages r
8 + /bp_regfile4x32/r _data zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
8 + /bp_regfile4x32/w_data 10101010101010101010101010101010 11111111111111111111111111111111 10101010101010101010 ' ..
8 + /bp_regfile4x32/r _addr 00 o
lB+ /bp_regfile4x32/w_addr 01 o 1
+ lbp_regfile4x32/r_en o
+ lbp_regfile4x32/w_en 1
+ lbp_regfile4x32/rst o
+ /bp_regfile4x32/clk 1 1
i.::J + /bp_regfile4x32/uut/regfile {11111111111111111111111111111111}{ uuuuuuuuuuu .. . HOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ... !{1111111111111111111111111111111 ... H11• ..
m+ <o) 11111111111111111111111111111111 uuuuuuuuuuuu. '' !00000000000000000000000000000000 11111111111111111111111111111111
w+ <1> 10101010101010101010101010101010 uuuuuuuuuuuu. '' !00000000000000000000000000000000 101 ..
@. (2) 00000000000000000000000000000000 UUUUUUUUUUUU ... lOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
@. (3) 00000000000000000000000000000000 uuuuuuuuuuuu' '' lO 0000000000000000000000000000000
,\X[ilf@ Now 100 ns 15
1 1
4 ns
1
ens
1 1 1
12ns
1 1
16 ns
1 1
20 ns
1
' 1 '
24ns ~
i
Gl!I'O Cursor 1 26 ns 26 ns
~~ ..!.,..!.L_1 l!. 1 /
Figura 5.11: Simulación del banco de pruebas, empleando el diseño del register file basado en su
comportamiento.
Señal de entrada de 1 bit (OE_n). Cuando esta señal se pone a '0', habilita la
operación de lectura de la memoria. Cuando está a '1 ', la operación de lectura
está deshabilitada.
386
REGISTROS Y MEMORIAS
entity fuenteUnidireccional is
generic ( WORD_SIZE integer := 8; -- B its por palabm, por defecto 8
READ_DELAY : time := 10 ns); -- RetaTdo en la lectura, por def ecto 10 ns
port ( data : out std_logic_vector(WORD_SIZE-1 downto O); --Datos de salida
OE_n : in std_logic); -- Habilita lectura
end entity fuenteUnidireccional;
architecture fuenteUnidireccional of fuenteUnidireccional is
begin
rom : process (OE_n)
begin
if (OE_n = '0') then
data <= ( O => '1', others = > 'O') after READ_DELAY;
else
data <= (others => 'Z');
end if;
end process rom;
end architecture fuenteUnidireccional;
palabra (N) y READ_DELAY, que contiene el tiempo de retardo entre que se habilita
la señal de lectura hasta que el dato está disponible.
La sentencia
indica que debe asignarse al vector de señales data, una vez transcurrido el retardo
de tiempo READ_DELAY , una palabra del tamaño de data, con todos sus bits igual a
'O' excepto el menos significativo, que debe valer '1' (es decir, data<= "OO ... 01" ;) 1 .
Esta palabra es la que se encuentra almacenada en la memoria y es la que se lee
cada vez que se habilita la operación de lectura.
Análogamente, la sentencia
asigna al vector de señales data una palabra, con el mismo número de bits que data,
con todos sus bits al valor 'z' (alta impedancia).
1
El software de CAD VeriBest muestra un error de compilación en esta sentencia, debido a que
en VHDL 93-2002 la selección others puede usarse junto con otms elecciones sólo si el mngo de
la señal es localment e estático. Por el contrario, el software de CAD ModelSim no muestra error
de compilación, ya que se ha relajado esta restricción del lenguaj e.
387
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Señal de entrada de 1 bit (DE_n). Cuando esta señal se pone a 'O', habilita la
operación de lectura de la memoria. Cuando está a '1 ', la operación de lectura
está deshabilitada.
Señal de entrada de 1 bit (WE_n). Cuando esta señal se pone a '0', habilita
la operación de escritura en la memoria. Cuando está a '1', la operación de
escritura está deshabilitada.
entity fuenteBidireccional is
generic ( WORD_SIZE : integer := 8; -- Bits por palabra, por defecto 8 bits
READ_DELAY : time := 10 ns; -- Retardo en la lectura, por defecto 10 ns
WRITE_DELAY : time := 10 ns); --Retardo en la escritura, por defecto 10 ns
port ( data : inout std_logic_vector(WORD_SIZE-1 downto O); -- Señal bidireccional datos
OE_n : in std_logic; -- Habilita lectura
WE_n : in std_logic ) ; -- Habilita escritura
end entity fuenteBidireccional;
388
REGISTROS Y MEMORIAS
A continuación, se muestra el código del bus de datos que se emplea para rea-
lizar varias operaciones de lectura y escritura sobre las memorias. Al instanciar las
memorias, se asignan nuevos valores al tamaño de la palabra, que pasa a ser 16 bits,
y a los retardos:
l. tiempo== O (instante inicial). Se asigna valor '1' a las señales OE1_n, OE2_n
y WE_n, es decir, inicialmente se encuentras deshabilitadas las operaciones de
lectura y escritura en las memorias. También, en el instante inicial, se asigna
el valor Ox0fc3 a la señal wri teData del banco de pruebas, cuya finalidad es
almacenar el valor que va a ser escrito en la memoria.
El Código VHDL 5.17 y 5.18 describe las operaciones realizadas sobre las memo-
rias mediante el empleo del bus. En la Figura 5.12 se muestra el resultado obtenido
de la simulación.
389
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity tb_bus is
constant WORD_SZ integer := 16; -- B'its por palabra
constant PERIOD time := 100 ns; -- Periodo ciclo reloj
end entity tb_bus;
component fuenteBidireccional is
generic ( WORD_SIZE integer := 8; -- Bits por palabra
READ_DELAY time := 10 ns; -- Retardo en la lectura
WRITE_DELAY : time := 10 ns); --Retardo en la escritura
port ( data : inout std_logic_vector(WORD_SIZE-1 downto O);
-- Señal de datos bidireccional
OE_n : in std_logic; -- Habilita lectura
WE_n : in std_logic ); -- Habilita escr'itura
end component fuenteBidireccional;
component fuenteUnidireccional is
generic ( WORD_SIZE integer := 8; -- Bits por palabra
READ DELAY time := 10 ns); --- Retardo en la lectura
begin
-- Instanciar las fuentes de datos, asignando valor a sus constantes generic
U1 : component fuenteBidireccional
generic map (WORD_SZ, 30 ns, 40 ns) -- Asigna valor constantes generic
port map (data, OE1_n, WE_n);
U2 : component fuenteUnidireccional
generic map (WORD_SZ, 20 ns ) -- Asigna valor constantes generic
port map (data, OE2_n);
------------- Continua ... ----------------------------------
390
REGISTROS Y MEMORIAS
data <= writeData when ( WE_n = '0') else ( others => 'Z');
vectoresTest : process is
begin
OE1_n <= '1 '; OE2_n <= '1'; WE_n <= '1'; -- D eshabilita señales
writeData <= B"0000_1111_1100_0011"; --Dato a escribir {= Ox0fc3)
wait for PERIOD;
WE_n <= '0'; -- Habilita escritura (se escribe Ox0fc3)
wait for PERIOD;
WE_n <= '1'; -- Deshabilita escritura
OE2_n <= '0'; -- Habilita lectura desde la fu ente unidireccional
-- El dato en el bus debe ser Ox0001
wait for PERIOD;
OE2_n <= '1'; -- D eshabilita lectura de la fu ente unidireccional
OE1_n <= '0'; -- Habilita lectura desde la fuente bidireccional
-- El dato en el bus debe ser Ox0fc3
wait for PERIOD;
wait;
end process vectoresTest;
end architecture tb_bus;
Código VHDL 5.18: Bus bidireccional (continuación del Código VHDL 5.17).
,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Now 500 ns ) 50 100 150 200 250 300 350 400
' ·-
391
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Ejercicio 5.1
elk
Ejercicio 5.2
392
REGISTROS Y MEMORIAS
Ejercicio 5.3
D3 D2 D¡ Do
Serial in
SHSel1
SHSel 0 Clock
º3 º2 Q¡ Qo
Por otro lado, para la conversión paralelo-a-serie, se realiza primero una escritura
en paralelo y a continuación se realiza la lectura del contenido del registro bit a
bit a través de la salida serie. Para ello, es necesario realizar tres operaciones de
desplazamiento. En la Tabla 5.2 se muestran las operaciones del registro.
SHSel1 Operación
o o Mantiene valor
o 1 Carga en paralelo
1 o Desplaza 1 bit a la derecha el contenido del
registro y asigna a Q3 el valor en SeriaLin
393
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Ejercicio 5.4
Diseñe usando VHDL el circuito mostrado en la Figura 5.15, que está compuesto
por una unidad aritmético lógica (ALU) y un registro de desplazamiento. La salida de
la ALU es la entrada al registro de desplazamiento. El tamaño de los dos operandos
de entrada, A y B, es de 16 bits.
A B
Realice el diseño del circuito usando dos bloques process, uno para describir
las operaciones de la AL U y otro para describir las operaciones del registro. A
continuación, programe un banco de pruebas para testear el circuito.
Sel(O) Operación
o Desplazamiento a la derecha introduciendo un 'O' a la izquierda
1 Carga el nuevo valor
394
REGISTROS Y MEMORIAS
Ejercicio 5.5
Diseñe una memoria de sólo lectura que contenga 8 palabras de 8 bits (ROM
8 x 8). Como se muestra en la Figura 5.16, la ROM contiene un conjunto de palabras
( words) almacenadas. La ROM tiene los siguientes valores (decimales) almacenados
en las direcciones O a 7: O, 2, 4, 8, 6, 32, 64 y 128.
ROM
word O
word 1
addr-~...~ ~-:~data
word 2
Realice el diseño en VHDL de modo que el número de bits de cada palabra (bits)
y el número de palabras de la memoria (words) sean constantes de tipo generic.
Una vez realizado el diseño, programe y simule un banco de pruebas.
395
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Ejercicio 5. 6
Tal como se muestra en la Figura 5.17, la RAM tiene una bus de entrada de
datos (data_in), un bus de salida de datos (data_out), un bus de direcciones (addr),
una entrada de reloj ( clk) y una entrada para habilitar la escritura (wr_ena).
RAM
word O
data_in--+
word 1
data_out
word 2
addr--+
clk wr_ena
Por otro lado, el bus de salida de datos debe mostrar continuamente los datos
seleccionados por addr.
Realice el diseño en VHDL de modo que el número de bits de cada palabra (bits)
y el número de palabras de la memoria (words) sean constantes de tipo generic.
Una vez realizado el diseño, programe y simule un banco de pruebas.
396
REGISTROS Y MEMORIAS
Obsérvese que se usan las variables antes de que se les asigne un valor y por ello
la síntesis dará lugar a flip-fiops que almacenan los valores de la anterior ejecución
del bloque process.
Asimismo, puesto que se asigna valor a la señal Serial_ out en el flanco de subida
de la señal de reloj, se generará al realizar la síntesis un fiip-flop que almacenará el
correspondiente bit.
El Código VHDL 5.20 es otra posible forma de realizar el diseño del registro. En
este caso, se usan 4 señales del tipo std_logic para almacenar los bits: Serial_out,
R2, R1 y RO. La asignación a una señal en el flanco de subida de la señal de reloj da
lugar a la síntesis de un fiip-flop. Por tanto , se sintetizarán 4 fiip-fiops.
397
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity regDesp is
port(Serial_out : out std_logic;
Serial_in, clk : in std_logic);
end entity regDesp;
entity regDesp is
port (Serial_out : out std_logic;
Serial_in, el k : in std_logic);
end entity regDesp;
architecture regDesp of regDesp is
begin
process (el k)
variable RO, R1, R2 : std_logic;
begin
if ( rising_edge( clk) ) then
RO := Serial_in;
R1 :=RO;
R2 := R1;
Serial_out <= R2;
end if;
end process;
end architecture regDesp;
falling_edge(clk)
398
REGISTROS Y MEMORIAS
entity bp_regDesp is
end entity bp_regDesp;
component regDesp is
port ( Serial_out : out std_logic;
clk : in std_logic·
Serial_in : in std_logic);
end component regDesp;
begin
-- Instanciar y conectar UUT
uut : component regDesp port map (Serial_out, clk, Serial_in);
Código VHDL 5.22: Banco de pruebas de un registro de desplazamiento de 4 bits con entrada
y salida serie.
399
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity regDesp is
generic (N: integer := 4);
port (Serial_out : out std_logic;
Serial_ in, clk : in std_logic);
end entity regDesp;
architecture regDesp of regDesp is
begin
process ( clk)
variable R: std_logic_vector(N-2 downto O);
begin
if (rising_edge( clk)) then
Serial_out <= R(N-2);
for index in N-3 downto O loop
R(index+1) := R(index);
end loop;
R(O) := Serial_in;
end if;
end process;
end architecture regDesp;
Código VHDL 5.23: Diseño de un registro de desplazamiento de N bits con entrada y salida
serie.
400
REGISTROS Y MEMORIAS
entity registroSerieParalelo is
port( Serial_out : out std_logic;
Q : out std_logic_vector(3 downto O);
Clock : in std_logic;
SHSel : in std_logic_vector( 1 downto O);
Serial in : in std_logic;
D : in std_logic_vector(3 downto O));
end entity registroSerieParalelo;
architecture registroSerieParalelo of registroSerieParalelo is
signal content: std_logic_vector(3 downto O);
begin
process(Clock)
begin
if(rising_edge(Clock)) then
case SHSel is
when "01" => -- carga paralelo
content <= D;
when "10" => -- desplazamiento derecha
--y Tellena a la izqda con bits
--entrada SeriaLin
content <= Serial_in & content(3 downto 1);
w hen others = >
null;
end case;
end if;
end process;
Q <= content;
Serial_out <= content(O); --Bit más a la derecha
401
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity bp_registroSerieParalelo is
end entity bp_registroSerieParalelo;
component registroSerieParalelo is
port ( Serial_out : out std_logic;
Q : out std_logic_vector(3 downto O);
Clock : in std_logic;
SHSel : in std_logic_vector(1 downto O);
Serial_in : in std_logic;
D : in std_logic_vector ( 3 downto O));
end component registroSerieParalelo;
begin
-- Instanciar y conectar UUT
uut : component registroSerieParalelo
port map (Serial_out, Q, Clock, SHSel, Serial_in, D);
Código VHDL 5.25: Parte inicial del banco de pruebas para el registro serie-a-paralelo y paralelo-
a-serie de 4 bits.
402
REGISTROS Y MEMORIAS
-- Operacion Serie-Paralelo: desplazamos los bits que van llegando por entrada serie y
-- después realizamos una lectura en paralelo
SHSel<= 11 01 11 ; Serial_in<=' O'; 0<= 11 0000 11 ;--Car:qa paralelo
wait until falling_edge(Clock); --1000ns
SHSel<= 11 10 11 ; Serial_in<=' 1'; --Desplaza a la derecha
wait until falling_edge(Clock); --1200ns
SHSel<= 11 10 11 ; Serial_in<='O';--Desplaza a la derecha
wait until falling_edge(Clock); --1400ns
SHSel<= 11 10 11 ; Serial_in<=' 1' ;--Desplaza a la derecha
wait until falling_edge(Clock); --1600ns
SHSel<= 11 10 11 ; Serial_in<='O';--Desplaza a la derecha y leemos
wait until falling_edge(Clock); --1800ns
report 11 Finaliza la simulación 11 ;
wait; -- Final del bloque pmcess
end process gen_ ve e_ test;
end architecture bp_registroSerieParalelo;
Código VHDL 5.26: Parte final del banco de pruebas para el registro serie-a-paralelo y paralelo-
a-serie de 4 bits.
403
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
- Se escogen valores de los operandos entorno al cero. Por ejemplo: -2, -1, O,
1 y 2.
404
REGISTROS Y MEMORIAS
entity ALUReg is
port( Z : out std_logic_vector(WIDTH-1 downto O);
A, B : in std_logic_vector(WIDTH-1 downto O);
Sel : in std_logic_vector(SEL_BITS-1 downto O);
clk : in std_logic);
end ALUReg;
architecture ALUReg of ALUReg is
signal alu_salida : std_logic_vector(WIDTH-1 downto O);
begin
--ALU
alu: process (Sel, A, B)
begin
case Sel (SEL_BITS-1 downto 1) is
when "00" =>
alu_salida <= std_logic_vector(signed(A) + signed(B));
when "01" =>
alu_salida <= std_logic_vector (signed(A) - signed(B));
when "10" =>
alu_salida <= A and B;
when others =>
alu_salida <= A or B;
end case;
end process alu;
--Registro
reg:process(clk)
begin
if rising_edge( clk) then
if (Sel(O) = '1 ') then --Desplaza a la drcha introduciendo O
Z <= '0'& alu_salida(WIDTH-1 downto 1);
el se
Z <= alu_salida; --Carga el nuevo valor
end if;
end if;
end process reg;
end architecture ALUReg;
Código VHDL 5.27: Diseño del circuito ALU y registro, mostrado en la Figura 5.15.
405
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity bp_ALUReg is
constant PERIODO : time := 100 ns;
end entity bp_ALUReg;
component ALUReg is
port ( Z : out std_logic_vector(WIDTH-1 downto O);
A, B : in std_logic_vector(WIDTH-1 downto O);
Sel : in std_logic_vector(SEL_BITS-1 downto O);
el k : in std_logic);
end component ALUReg;
Código VHDL 5.28: Package en el cual se definen las constantes y comienzo del banco de
pruebas de ALU+registro.
406
REGISTROS Y MEMORIAS
Código VHDL 5.29: Fragmento del banco de pruebas de ALU+registro: procedure checLALU.
407
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
---------------- Continuación banco de pruebas de AL U+ Reg (fichero bp_AL UReg. vhd) -------------
begin
UUT : component ALUReg port map (Z, A, B, Sel, clk);
clk <= not clk after (PERIODO /2);
-- Bloque process para generar los vectores de test y comprobar el resultado
main : process is
variable erroLcount : integer : = O;
begin
report 11 Comienza la simulación 11 ;
-- Vectores de test: operandos con valor prÓX'i mo a cero
for i in -2 to 2 loop
for j in -2 to 2 loop
for k in O to SEL_MAX loop
A <= std_logic_vector(TO_SIGNED(i,WIDTH));
b <= std_logic_vector(TO_SIGNED(j,WIDTH) );
Sel < = std_logic_vector (TO_SIG NED (k,SEL_BITS));
wai t until falling_edge ( clk);
check....ALU(i, j, k, Z, error_count);
end loop;
end loop;
end loop;
-- Vectores de test: operandos con valor próximo al mínimo
for i in MIN_NEG_DATA to MIN_NEG_DATA +4 loop
for j in MIN_NEG_DATA to MIN_NEG_DATA +4 loop
for k in O to SEL_MAX loop
A <= std_logic_vector(TO_SIGNED(i,WIDTH));
b <= std_logic_vector(TO_SIGNED(j,WIDTH));
Sel <= std_logic_vector(TO_SIGNED(k,SEL_BITS));
wait until falling_edge(clk);
check....ALU(i, j, k, Z, error_count);
end loop;
end loop;
end loop;
-- Vectores de test: operandos con valor próximo al máximo
for i in MA)LPOS_DATA-4 to MA)LPOS_DATA loop
for j in MA)LPOS_DATA-4 to MA)LPOS_DATA loop
for k in O to SEL_MAX loo~
A <= std_logic_vector(TO_SIGNED(i,WIDTH));
b <= std_logic_vector(TO_SIGNED(j,WIDTH));
Sel <= std_logic_vector(TO_SIGNED(k,SEL_BITS));
wai t unt il falling_edge (el k) ;
check....ALU(i, j, k, Z, erroLcount);
end loop;
end loop;
end loop;
408
REGISTROS Y MEMORIAS
Código VHDL 5.31: Parte final de la definición del banco de pruebas de ALU+registro.
409
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity rom is
generic( bits : integer := 8; --Num. bits por palabra
words : integer := 8 ); --Num. palabras en memoria
port( data : out std_logic_vector(bits-1 downto O);
addr : in integer range O to words-1 ) ;
end rom;
410
REGISTROS Y MEMORIAS
entity bp_ROM is
constant DELA Y :time .- 10 ns; -- Retardo usado en el test
end entity bp_RDM;
component rom is
generic( bits : integer := 8; --Num. bits por palabra
words : integer := 8);--Num. palabras en mem.
port( data : out std_logic_vector(7 downto O);
addr : in integer range O to 7);
end component rom;
begin
UUT : component rom port map
(data, addr);
411
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity ram is
generic( bits : integer := 8; --Num. bits por palabra
words : integer := 16);--Num. palabras en mem.
port( data_out : out std_logic_vector(bits-1 downto O);
wr _en a : in std_logic;
clk : in std_logic;
addr : in integer range O to words-1;
data_in : in std_logic_vector(bits-1 downto o));
end entity ram;
architecture ram of ram is
type vector _array is array (O to words-1) of
std_logic_vector(bi ts-1 downto O);
412
REGISTROS Y MEMORIAS
413
TEMA 6
6.1. Introducción
6.2. Diseño de máquinas de estado finito
6.3. Síntesis de lógica secuencial
6.4. Flip-flop JK
6.5. Máquinas de estado finito de Moore
6.6. Máquinas de estado finito de Mealy
6.7. Máquinas de estado finito seguras
6.8. Lecturas recomendadas
6.9. Ejercicios de autocomprobación
6.10. Soluciones de los ejercicios
DISEÑO DE LÓGICA SECUENCIAL
OBJETIVOS DOCENTES
Una vez estudiado el contenido del tema y realizados los ejercicios prácticos,
debería saber:
- Discutir qué son las máquinas de estado finito seguras y realizar el diseño de
este tipo de máquinas usando VHDL.
417
DISEÑO DE LÓGICA SECUENCIAL
6.1. INTRODUCCIÓN
4. Formular, a partir de la tabla de transición del estado del Paso 3, las funciones
lógicas simplificadas para el nuevo estado y las salidas.
419
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
¡------------------------------
1
1
1
salidas
entradas: Lógica
combinacional -
f estado actual
El primer paso del diseño es dibujar el diagrama de estados del circuito, que
consiste en un conjunto de estados y (posiblemente) transiciones etiquetadas entre
los estados. En la Figura 6.2 se muestra el diagrama de transición para el circuito
detector de la secuencia 101.
Cada estado del diagrama "recuerda" una porción de la secuencia 101. Lastran-
siciones entre los estados están etiquetadas x/y, donde x corresponde con el valor
de la entrada que produce la transición, e y corresponde con el valor de la variable
de salida dado el estado en el que empieza la transición y el valor de entrada x.
Dado que la salida depende del estado actual y de la variable de entrada, este tipo
420
DISEÑO DE LÓGICA SECUENCIAL
de diagrama corresponde con una máquina de Mealy. En este tipo de diagrama debe
tenerse en cuenta que debe escribirse una transición desde cada estado por cada
posible valor que puede tomar la entrada en ese estado.
El segundo paso del método de diseño consiste en codificar los estados. Puesto
que hay tres estados, son necesarias dos variables de estado: A y B. Obsérvese
la diferencia conceptual entre los estados de la máquina y las variables de estado
definidas para codificar dichos estados. Por simplicidad en la exposición, realizaremos
una codificación binaria de los estados:
Estado A B
So O O
s1 o 1
s2 1 o
El cuarto paso consiste en obtener las funciones lógicas simplificadas que re-
lacionan el próximo estado y la salida, con el estado actual y la entrada. Estas
funciones son las siguientes:
NA xB (6.1)
NB X (6.2)
y xA (6.3)
421
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
. - - - - - - - - - - - - - - - - - + r - -..............................
r l !.............................~........
: "~ ··· · ·······""'''''''''''''''''''' ''' ''' '
; ........................... ,..;
X
.........................................
elK
.........................................
process (enable, D) is
begin
if (enable = '1') then
q <= D;
end if;
end process;
422
DISEÑO DE LÓGICA SECUENCIAL
Obsérvese que el latch se define empleando una cláusula if-then sin else. Se
denomina sentencias condicionales incompletas a este tipo de sentencias. Este punto
es importante, ya que muestra que las sentencias condicionales incompletas (if, case,
etc. sin else) son sintetizadas mediante latches. Esto es debido a que la salida debe
mantener su valor si ninguna de las condiciones de la cláusula se satisface.
Un motivo por el cual podría pensarse en omitir el caso else, es que sea indiferente
el valor que se asigne a las señales en este caso (ya que en la práctica nunca se
producirá). Si no deseamos que el circuito se sintetice mediante un latch, debemos
incluir el caso else en la sentencia condicional y asignar a las señales el valor 'X'.
6.3.3. Retardos
Así pues, no es posible sintetizar sentencias tales como wai t for x ns. Igual-
mente, no es posible sintetizar sentencias que empleen la cláusula after. Algunas
423
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
herramientas de síntesis ignoran estas sentencias, mientras que otras muestran men-
sajes de error.
Obsérvese que esta discusión acerca de los retardos aplica a los circuitos, no a
los bancos de prueba, que no necesitan ser sintetizados.
6.3.4. Inicialización
Debe evitarse inicializar las variables y las señales al declararlas, ya que este tipo
de inicialización no puede ser sintetizada.
La inicialización de una variable o señal implica una acción que se realiza úni-
camente una vez al comienzo de la simulación. Si es preciso realizar una acción al
comienzo de la simulación, entonces debe situarse en la secuencia de acciones que
se ejecutan cuando se activa la señal de reset. Estas acciones se definen típicamente
dentro de un bloque process sensible a la señal de reset.
424
DISEÑO DE LÓGICA SECUENCIAL
Para asignar valor a las salidas de los fiip-fiops y latches dentro de un bloque
process, pueden emplearse sentencias de asignación a señal (usan el operador <=) y
sentencias de asignación a variable (usan el operador : =). Las asignaciones a variable
tienen efecto inmediatamente, mientras que las asignaciones a señal tienen efecto en
un instante de tiempo 6 (delta) unidades de tiempo posterior al tiempo simulado
actual (suponiendo que no se ha especificado el retraso en la asignación empleando
la cláusula after).
6.4. FLIP-FLOP JK
425
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
J K Nuevo estado
0- -0
o o
-- -------~GJ-~-~~GJ
Qt+l=Q,
o 1 Qt+l=O
1 o Qt+l =1
1 1 Q1+1=not Q,
Figura 6.4: Transición de estados de un flip-flop JK. En los arcos del diagrama se muestra el
valor de las señales JK. El bit '-' es "don't care" (por ejemplo, "0-" representa "00" ó "01"). La
transición de reset se representa mediante una línea punteada.
Cuando la entrada de reset asíncrono pasa de valer '1' a valer 'O', el circuito pasa
al estado Q='O'. Se denomina reset asíncrono porque la transición al estado 'O' se
produce en el instante en que cambia la señal de reset, con independencia del valor
de la señal de reloj. La transición de reset asíncrono se representa mediante una
línea punteada en el diagrama situado en la parte derecha de la Figura 6.4.
En el caso del biestable JK, esto implica testear 8 transiciones. En la Figura 6.5
se indica el orden en que el programa de test recorrerá los arcos (número inscrito
426
DISEÑO DE LÓGICA SECUENCIAL
en una circunferencia), y qué valores de las entradas se aplicará en cada caso para
producir la transición. El Código VHDL 6.2 y 6.3 es el banco de pruebas.
Obsérvese que la sentencia wait que hay al final del bloque process finaliza
la ejecución de dicho bloque, pero no la simulación, ya que la simulación de las
sentencias de asignación concurrente a las señales de reset y reloj se realiza indefi-
nidamente. Por tanto, la simulación del banco de pruebas no finaliza por sí misma,
siendo preciso fijar su duración: 900 ns. La simulación del banco de pruebas se realiza
con cero errores. En la Figura 6.6 se muestra el resultado obtenido de la simulación.
427
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity bp_flipflopJK is
end entity bp_flipflopJK;
428
DISEÑO DE LÓGICA SECUENCIAL
429
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
CD oo ® oo
~ ®10 ~
G) 11
Figura 6.5: Orden en que el programa de test recorre los arcos del diagrama de transiciones.
Messages , V
+ /bp_flipflopjk/q o ---, 1 1
+ /bp_flipflopjk/q_n 1 ---' 1 1 1 1
+ /bp_flipflopjk/clk o
+ /bp_flipflopjk/j o 1 1 1 1 1 1
+ tbp_flipflopjk/k o 1
+ /bp_flipflopjk/reset_n 1 'l 1
lllllllllllllllllllllllllllllltlllllllllllllllllllllllllllllltllllllllllllllllllllllllllll
,~¡;;¡}~ Now ~00 ns lS 200 ns 400 ns 600 ns 800 ns
iJ .!.J .!J.!.J r-. 1 1
1 Onsto935ns 1 Now: 900 ns Delta: 1
Figura 6.6: Resultado de la ejecución del banco de pruebas del flip-flop JK.
Hay varias maneras de escribir código VHDL para una máquina de Moore.
En primer lugar, puede escogerse describir el comportamiento o la estructura del
circuito. En la mayoría de los casos es preferible describir el comportamiento del
circuito, ya que este tipo de descripción suele ser menos propensa a errores y las
herramientas de síntesis convertirán estos diseños en implementaciones optimizadas.
430
DISEÑO DE LÓGICA SECUENCIAL
esta manera facilita realizar cambios globales y también favorece la legibilidad del
código. Asimismo, en el diseño de la máquina puede observarse que:
- La interfaz del circuito está compuesta por dos puertos de salida (la salida
y el estado actual) y tres puertos de entrada (señal de reset asíncrono, reloj
y entrada). Cuando la señal de reset (reset_n) pasa de valer '1' a valer '0',
entonces la máquina pasa al estado 8 0 .
hace que ambas tengan el mismo valor. El motivo es que, por ser state
una señal de salida de la interfaz, no puede ser leída en el cuerpo de la
architecture. Puesto que internal_state es una señal interna, puede ser
leída y escrita.
431
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
-- Máquina de Moore
-- Fichero : maquinaMooreSimple. vhd
library IEEE;
use IEEE. std_logic_1164. all;
use work.STATE_CONSTANTS.all;
-- Definición de la entity
entity maquinaMooreSimple is
port( z : out std_logic; -- Señal de salida
state : out std_logic_vector(STATE_BITS-1 downto O);
-- Estado actual de la máquina
reset_n : in std_logic; -- Señal reset activada en bajo
clk : in std_logic· -- Señal de reloj
x : in std_logic); -- Señal de entrada
end entity maquinaMooreSimple;
-- Definición de la architecture
architecture maquinaMooreSimple of maquinaMooreSimple is
signa! internal_state: std_logic_vector(STATE_BITS-1 downto O);
begin
state <= internal_state; -- Estado actual
-- Genera la salida
salida: process(internal_state) is
begin
case internal_state is
when SO => z <= '0';
when S1 => z <= '0';
when S2 => z <= '1 ';
when others => z <= 'X';
end case;
end process salida;
Código VHDL 6.4: Definición del package con la codificación de los estados y parte inicial del
diseño de la máquina de Moore de la Figura 6.7.
432
DISEÑO DE LÓGICA SECUENCIAL
Código VHDL 6.5: Continuación del diseño de la máquina de Moore de la Figura 6.7.
Se ha añadido una cláusula when others al final de las dos sentencias case,
con el fin de contemplar todos los casos posibles. Obsérvese que se asigna el
valor 'X' a la señal de salida. Esta es una buena práctica, ya que con ello se
ayuda a la herramienta de síntesis a optimizar el circuito combinacional para
la señal de salida (z). Se volverá sobre este tema en la Sección 6.7, en la cual
se discutirá una forma más adecuada de describir el comportamiento de la
máquina en los estados ilegales.
433
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
reloj, que inicialmente vale O, tiene un periodo (PERIODO) de T = 100 ns. Esto implica
que los flancos de subida de la señal de reloj se producen en los instantes: 0.5 · T = 50
ns, 1.5 · T = 150 ns, 2.5 · T = 250 ns, ... que son precisamente los instantes en que se
producen las sucesivas transiciones en el estado, según se muestra en la Figura 6.8.
Para generar la señal de reloj se emplea la siguiente sentencia concurrente:
donde se asume que la señal de reloj ha sido inicializada al valor 'O'. Obsérvese que
de esta forma se crea una señal de reloj infinitamente larga, con lo cual la simulación
no finalizará automáticamente, sino que hay que definir el instante de finalización.
~ IT=PERIODO=lOOnsl
s~~T
_o:~~:!_,. @~
8 4.5 ri 3.5-r
434
DISEÑO DE LÓGICA SECUENCIAL
entity bp_maquinaMooreSimple is
constant PERIODO : time := 100 ns; -- Periodo reloj
end entity bp_maquinaMooreSimple;
component maquinaMooreSimple is
port( z : out std_logic; -- Señal de salida
state : out std_logic_vector(STATE_BITS-1 downto O);
-- Estado actual de la máquina
reset_n : in std_logic; -- Señal reset activada en bajo
clk : in std_logic; -- Señal de reloj
x : in std_logic); -- Serial de entrada
end component maquinaMooreSimple;
435
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
-- Genera señal clk, asumiendo que se inicializó a O. Flanco de subida en los instantes:
-- PERIOD0/2, PERIODO+PERIOD0/2, 2*PERIODO+PERIOD0/2, ...
clock : clk <= not clk after ( PERIOD0/2 );
436
DISEÑO DE LÓGICA SECUENCIAL
Para emplear código VHDL estructural, en primer lugar hay que decidir qué
componentes van a usarse en el diseño. Emplearemos puertas lógicas básicas (AND,
OR, inversor, NAND, NOR y XOR), así como flip-flops D. Recuérdese que en la
Sección 2.7 se describió el diseño de un flip-flop D. Para ello, deben obtenerse las
funciones lógicas para el cálculo de la salida y del siguiente estado. La tabla de
transición de estados y salidas para la máquina descrita en la Figura 6. 7 es:
NA xA+xA (6.4)
NB xA (6.5)
z A (6.6)
437
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
-- Componente: fiip-fiop D
component flipflop_D is
port ( q, q_n : out std_logic;
d, clk, reset_n : in std_logic);
end component flipflop_D;
begin
state <= A & B; -- Muestra estado actual en el puerto de salida
+ /bp_maquinamooresimple/uut/reset_n 1
+ /bp_maquinamooresimple/uut/clk
+ /bp_maquinamooresimple/uut/x
+ /bp_maquinamooresimple/uut/dff_a/q 1
+ /bp_maquinamooresimple/uut/dff_b/q O
lf) + /bp_maquinamooresimple/uut/state 10 10 00 01
+ /bp_maquinamooresimple/uut/z 1
.---------,
1 Ons to 834 ns
438
DISEÑO DE LÓGICA SECUENCIAL
En las máquinas de Mealy, las salidas del circuito dependen del estado actual
y del valor actual de las entradas. Así pues, aunque la máquina permanezca en un
determinado estado, sus salidas pueden cambiar si cambian las entradas.
0/0
~
1/0 0,
~~~~
----------~0 r 0/1 0/0 ®
~®~
Figura 6.11: Diagrama de una máquina de Mealy para el reconocimiento de la secuencia 0110.
La salida de la máquina es un '1' lógico cada vez que se detecta el patrón 0110
en la secuencia de bits de entrada, que se supone que está sincronizada con el reloj
de la máquina. El tiempo que transcurre entre la entrada del último 'O' del patrón
y la salida del '1' es igual al retardo de una puerta lógica. Para los demás bits de la
secuencia de entrada, la salida de la máquina es 'O'.
Las constantes globales, que son usadas tanto en el diseño del circuito como en
el banco de pruebas, son definidas en el package mostrado en el Código VHDL 6.9.
El Código VHDL 6.9 y 6.10 describe el comportamiento de la máquina.
439
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Obsérvese que se han definido dos bloques process: uno para generar la salida,
que es sensible al estado y a la entrada, y otro para generar el próximo estado y
resetear la máquina, que es sensible únicamente a la señal de reloj. Puesto que la
máquina tiene reset síncrono, este segundo bloque process no es sensible a la señal
de reset.
El bloque process usado para generar la señal de salida podría reemplazarse por
la siguiente sentencia concurrente:
que es activada cada vez que se produce un cambio en alguna de las señales de la
parte derecha de la asignación.
Para garantizar que la salida '1' tiene una duración de al menos un ciclo de reloj,
es necesario hacer pasar la señal de salida por un flip-flop D. Esto puede hacerse
añadiendo a la descripción de la arquitectura el siguiente bloque process:
y haciendo que z_long sea la salida del circuito. La definición del circuito, modificada
de la forma descrita anteriormente, es mostrada en el Código VHDL 6.11.
440
DISEÑO DE LÓGICA SECUENCIAL
package seq0110_CONST is
constant STATE_BITS : integer := 2; -- Nnm. bits del estado
constant SO : std_logic_vector(1 downto O) .- 11 00 11 ;
constant 81 : std_logic_vector(1 downto O) := 11 01 11 ;
constant 82 : std_logic_vector ( 1 downto O) : = 11 1O11 ;
constant 83 : std_logic_vector(1 downto O) := 11 11 11 ;
end package seq0110_CONST;
entity seq0110 is
port ( z : out std_logic; -- Señal de salida
state : out std_logic_vector(STATE_BITS-1 downto O);
-- Estado actual
reset_n : in std_logic; -- Reset síncrono activado LOW
clk : in std_logic; -- Señal de reloj
x : in std_logic ) ; -- Bit de entrada
end entity seq0110;
-- Definición de la architecture
architecture seq0110 of seq0110 is
signal internal_state : std_logic_vector(STATE_BITS-1 downto O);
begin
state <= internal_state;
-- Cálculo de la salida
calculo_salida: process (internal_state, x) is
begin
if ( (internal_state = 83) and (x = '0')) then
z <= '1';
el se
z <= '0';
end if;
end process calculo_salida;
Código VHDL 6.9: Package con la codificación de los estados y diseño de la máquina de Mealy
de la Figura 6.11.
441
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Código VHDL 6.10: Continuación del diseño de la máquina de Mealy de la Figura 6.11.
442
DISEÑO DE LÓGICA SECUENCIAL
entity seq0110 is
port ( z_long : out std_logic; -- Señal de salida
state : out std_logic_vector(STATE_BITS-1 downto O); --Estado actual
reset_n : in std_logic; -- Reset síncrono activarlo LOW
clk : in std_logic; -- Señal de reloj
x : in std_logic ) ; -- Bit de entrada
end entity seq0110;
-- Cálculo de la salida
z <= '1' when ( (internal_state = 83) and (x ' O' ) ) else ' O' ;
ffD_salida: process ( clk) is
begin
if ( rising_edge( clk) ) then
z_long <= z;
end if;
end process ffD_salida;
Código VHDL 6.11: Diseño de la máquina de Mealy de la Figura 6.11. La salida se obtiene de
un circuito combinacional y se hace pasar por un flip-fl.op D. El bloque process para la obtención
del próximo estado es igual al mostrado en el Código VHDL 6.10
443
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity bp1_seq0110 is
constant PERIODO : time := 100 ns; -- Per-íodo reloj
end entity bp1_seq0110;
component seq0110 is
port ( z_long : out std_logic;
state : out std_logic_vector(STATE_BITS-1 downto O);
reset_n : in std_logic;
clk : in std_logic;
x : in std_logic ) ;
end component seq0110;
begin
UUT: component seq0110 port map ( z_long, state, reset_n, clk, x );
Código VHDL 6.12: Banco de pruebas que introduce algunos vectores de test en la máquina de
Mealy de la Figura 6.11.
444
DISEÑO DE LÓGICA SECUENCIAL
8
+ /bp1_seq0110/uut/z
+ /bp1_seq0110/uut/state
O
00
~~~------------~' 1~--------~r 1~------------------
.illL____,OO 01 10 11 01 10 11 01 10 11 00
+ /bp1_seq01 10/uut/reset_n 1
+ /bp1_seq0110/uut/clk O
+ /bp1_seq01 10/uut/x
¿j :ilil '~ /
ro-,;-;t;!232;;-;---- ,Ñ~;;-¡;-2oQ-,;-;o~·¡·------·-·--·-----------·--·-----·--·----------·------·----·------
Figura 6.12: Resultado de la simulación del circuito detector del patrón 0110.
Ejecutando el banco de pruebas del Código VHDL 6.12 durante 1200 ns, se
obtienen las señales mostradas en la Figura 6.12. Obsérvese que la señal z vale '1'
mientras el circuito se encuentra en el estado 83 y la entrada vale 'O'. La señal z
está conectada a la entrada de un fl.ip-fl.op D, cuya salida es la señal z_long, que
mantiene su valor a '1' durante un ciclo completo de reloj.
Figura 6.13: Orden en que el programa de test recorre los arcos del diagrama de estado.
445
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity bp_seq0110 is
constant PERIODO : time := 100 ns; -- Periodo reloj
end entity bp_seq0110;
component seq0110 is
port ( z_long : out std_logic;
state : out std_logic_vector(STATE_BITS-1 downto O);
reset_n : in std_logic;
clk : in std_logic;
x : in std_logic ) ;
end component seq0110;
446
DISEÑO DE LÓGICA SECUENCIAL
Código VHDL 6.14: Parte final del banco de pruebas de la máquina de Mealy.
447
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
+ /bp_seq0110/uut/z_long o ----,
+ /bp_seq0110/uut/z o
(±) + /bp_seq0110/uut/state 01 uu .00 01 10 01 10 11
+ /bp_seq0110/uut/reset_n 1 '1
•
1
+ tbp_seq0110/uut/clk o
+ /bp_seq0110/uut/x o 1 1 1 1 1
rrr r rrrrrlrrrrrrrrrlrrrrrrrrrlrrr1rrrrrlrrrrrrrrrlrrrrrrrrrlrrrrrrrrrlrrrrrrr1rlrrr
a'\~1$) Now 1400 ns lS 200 ns 400 ns 600 ns 800 ns
+ /bp_seq0110/uut/z_long
m. + /bp_seq0110/uut/z
+
/bp_seq0110/uut/state
tbp_seq0110/uut/reset_n
01
+ /bp_seq0110/uut/clk
+ /bp_seq0110/uut/x
1606 ns to 1442 ns
Una máquina de estado finito (FSM) segura es una FSM tal que en su definición
se ha considerado la posibilidad de que la máquina alcance un estado ilegal y, en tal
caso, se ha descrito cómo debe realizarse la transición a un estado legal.
448
DISEÑO DE LÓGICA SECUENCIAL
1
~
@"Z¿
d o r;;0
----------· r:-::s!:;?~
~ o
a)
Figura 6.15: Definición insegura y segura de una maquina de estado finito: a) FSM insegura, ya
que si la máquina entra en el estado indefinido (83 ="11"), no puede salir de él; y b) FSM segura,
con transiciones explícitas desde los estados indefinidos a estados definidos.
Uno podría pensar que no es necesario incluir la opción others cuando el número
de estados es potencia de dos. Esto es así cuando se codifican los estados empleando el
mínimo número de bits. Sin embargo, recuérdese que también es posible codificar los
estados de modo que el registro de estado tenga un bit por cada estado del diagrama
de transiciones. Desde el punto de vista estructural, se emplearía un flip-flop D por
cada estado de la FSM. Este tipo de codificación, que se denomina one-hot encoding,
da lugar a numerosos estados ilegales. En este caso, el uso de others garantiza que
estos estados ilegales, en caso de producirse, tendrán una transición a un estado
legal.
449
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
-- Genera la salida
salida: process(internal_state) is
begin
case internal_state is
when SO => z <= '0';
when S1 => z <= '0';
when S2 => z <= '1';
when others => z <= 'O'; -- Salida en el estado ilegal
end case;
end process salida;
450
DISEÑO DE LÓGICA SECUENCIAL
451
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Ejercicio 6.1
Diseñe usando VHDL un latch D con entrada enable activa a nivel alto y pro-
grame un banco de pruebas para comprobar su correcto funcionamiento. Emplee en
la descripción de la architecture una sentencia if.
Ejercicio 6.2
Diseñe usando VHDL un flip-flop RS disparado por el flanco de subida del reloj
y con reset asíncrono (reset_n) activado a nivel bajo. A continuación, programe un
banco de pruebas que testee de manera sistemática el funcionamiento del circuito.
Ejercicio 6.3
Cuando la señal Set es puesta al valor '1', el estado del flip-fiop cambia inmedia-
tamente al valor '1 '. Por el contrario, cuando la señal Clear es puesta al valor '1 ',
el estado del flip-flop cambia inmediatamente al valor 'O'. Es decir, las señales Set y
Clear cambian de manera asíncrona el estado del fiip-flop.
Si la señal Enable vale '1 ', entonces en el flanco de subida de la señal de reloj se
asigna el valor de la entrada D al estado del fiip-fiop Q. Por el contrario, si la señal
Enable vale 'O', la carga del fiip-fiop desde la entrada D está deshabilitada.
Al realizar el diseño de este circuito, emplee una sentencia if. Una vez realizado
el diseño, programe y simule un banco de pruebas para testearlo.
Ejercicio 6.4
452
DISEÑO DE LÓGICA SECUENCIAL
Ejercicio 6.5
Ejercicio 6.6
+--------- 1 periodo
Figura 6.16: Forma de onda de entrada (reloj, en la parte superior) y de salida (en la parte
inferior de la figura) del generador de señales.
Ejercicio 6. 7
453
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity divisor_frecuencia_3 is
port( clk3 : out std_logic;
clk, resetn: in std_logic );
end entity divisor_frecuencia_3;
La salida clk3 es una señal periódica con la misma forma de onda que la señal
clk, pero con un tercio de su frecuencia. Es decir, un periodo de la señal clk3 se
corresponde con tres periodos de la señal clk. Los cambios síncronos en la señal clk3
se producen en el flanco de la señal clk. La entrada resetn pone asíncronamente la
señal clk3 a O, manteniéndose dicho valor mientras el valor de resetn valga O.
Una vez realizado el diseño, programe y simule un banco de pruebas para tes-
tearlo.
Ejercicio 6.8
entity ffd is
port( q out std_logic;
d, clk, rst in std_logic );
end entity ffd;
454
DISEÑO DE LÓGICA SECUENCIAL
Ejercicio 6.9
En el diseño del circuito, implemente dos máquinas de estado, una que opere
exclusivamente en la transición positiva de la señal clk y otra que opere exclusiva-
mente en la transición negativa. Estas máquinas de estado generan las señales out 1
y out2. Obtenga la señal out3 mediante una AND lógica de las señales out1 y out2.
entity gen is
port( out1, out2, out3 out std_logic;
el k in std_logic );
end entity gen;
455
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
el k
:Perio~o clk:
~:
1
1
outl 1 1
Periodo o~ t 1
1
1
1
out2 Periodo o1Jl. t 2
1
out3 1
1 Periodo o* t 3
:•
Figura 6.17: Señales generadas en el circuito correspondiente al Ejercicio 6.9.
Ejercicio 6.10
entity detector is
port( Y out std_logic;
state out std_logic_vector(1 downto O);
X in std_logic;
reset in std_logic;
clk in std_logic);
end entity detector;
456
DISEÑO DE LÓGICA SECUENCIAL
Ejercicio 6.11
entity contador is
port( count out std_logic_vector(3 downto O);
clk, reset in std_logic );
end entity contador;
Ejercicio 6.12
457
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
secuencia, sino que detecta secuencias solapadas. La señal reset pone el circuito
en su estado inicial. Todos los cambios tienen lugar en el flanco de subida de la
señal de reloj. Escriba en VHDL la architecture que describe el comportamiento
del circuito en términos de una máquina de Moore. Dibuje el diagrama de estados
correspondiente al circuito que ha diseñado.
entity detector is
port( Y out std_logic;
state out std_logic_vector(2 downto O);
X in std_logic;
reset in std_logic;
clk in std_logic );
end entity detector;
Ejercicio 6.13
entity udcounter is
port ( Q out std_logic_vector(3 downto O);
Clock in std_logic;
Clear in std_logic;
Count in std_logic;
Down in std_logic );
end udcounter;
Mientras Clear vale 'O' y Count vale '1 ', en cada flanco de subida de la señal de
reloj el contador se incrementa o decrementa en uno. Se incrementa si Down vale 'O'
y se decrementa si Down vale '1 '.
Mientras Clear vale 'O' y Count vale 'O', el valor de la cuenta se mantiene
constante.
458
DISEÑO DE LÓGICA SECUENCIAL
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
Ejercicio 6.14
Señal Significado
r1 Pone el semáforo 1 en rojo
r2 Pone el semáforo 2 en rojo.
g1 Pone el semáforo 1 en verde.
g2 Pone el semáforo 2 en verde.
y1 Pone el semáforo 1 en amarillo.
y2 Pone el semáforo 2 en amarillo.
459
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
1
1
1
1
reseti
1
Una vez realizado el diseño del circuito controlador en VHDL, programe un banco
de pruebas para comprobar que funciona correctamente.
460
DISEÑO DE LÓGICA SECUENCIAL
Ejercicio 6.15
Una vez realizado el diseño del circuito, programe un banco de pruebas que lo
testee.
Tabla 6.3: Entradas al circuito controlador de un microondas.
Entrada Significado
minuto Incrementa el contador de tiempo de cocc1on en 60 seg. En
cualquier momento se puede apretar este botón para aumentar
el periodo de cocción.
marcha Inicia la marcha del horno siempre que el tiempo de cocción sea
mayor que O.
stop_Reset Si el microondas se encuentra en estado de cocción, cuando esta
señal está a '1' se detiene la marcha del horno. Si se activa esta
señal cuando el horno no está en estado de cocción se resetea el
tiempo de cocción.
puerta Según su valor sea '1' ó 'O' indica si la puerta del microondas
está abierta o cerrada. Abrir la puerta en el periodo de cocción
interrumpe la cocción. Abrir la puerta cuando la alarma está
activada la desconecta.
clk Reloj de entrada con periodo de 125 ms.
reset Señal asíncrona para resetear el sistema.
Salida Significado
segundos(9 ... 0) Indjr>an a una pantalla el número de segundos de cocción restantes.
La 1dificación es binaria, por lo que se pueden programar hasta
10"' seg.
calentar Cu do está a '1' el horno calienta.
luz e;,, :lo está a '1' enciende la luz interna del horno.
alarma io está a '1' suena la alarma. La alarma debe sonar cuando
E. .npo de cocción llegue a O después de que el horno ha estado
e ttando. La alarma se debe desconectar cuando se abre la
p 'ta del horno.
-------------------
461
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Estado Significado
PuertaAbierta Microondas parado con la puerta abierta. Las señales de salida tie-
nen los siguientes valores: calentar = O, luz = 1 y alarma = O
PuertaCerrada Microondas parado con la puerta cerrada. Las señales de salida tie-
nen los siguientes valores: calentar = O, luz = O y alarma = O
Coccion El microondas está cociendo. Las señales de salida tienen los
siguientes valores: calentar = 1, luz = 1 y alarma = O
AlarmaActivada La alarma se encuentra activa. Las señales de salida tienen los
siguientes valores: calentar = O, luz = O y alarma = 1.
reset ,
~ stop_Reset
uerta
stop_Reset Q t_alarma=O
462
DISEÑO DE LÓGICA SECUENCIAL
-- Latch D
-- Fichero: latclL.D. vhd
Library IEEE;
use IEEE. std_logic_1164. all;
entity latch_D is port(
Q : out std_logic;
D, Enable: in std_logic);
end entity latch_D;
architecture latch_D of latch_D is
begin
process(D, Enable)
begin
if Enable = ' 1' then
Q <= D;
end if;
end process;
end architecture latch_D;
463
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity flipflopRS is
port ( q, notq : out std_logic;
el k, R, S, reset_n: in std_logic);
end entity flipflopRS;
BERGARA
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity bp_flipflopRS is
end entity bp_flipflopRS;
begin
-- Instanciar y conectar UUT
uut : component flipflopRS port map (q, notq, clk, R, S, reset_n);
Código VHDL 6.19: Parte inicial del banco de pruebas de un fiip-fiop RS.
466
DISEÑO DE LÓGICA SECUENCIAL
-- Informe fina l
if (error_count = o) then
report "Simulación finalizada sin errores";
else
report "ERROR: Hay " & integer' image (error_ count) & 11
errores. 11
;
end if;
wait; -- Final del bloque process
end process gen_vec_test;
467
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
1---
0)0011
-- Flip fiop D con entradas Enable, set and clear. Fichero: FFD_Enable_SeLClear.vhd
library IEEE;
use IEEE. std_logic_1164. all;
entity FFD is
port(Q : out std_logic;
Clock, Enable, Set, Clear, D : in std_logic);
end entity FFD;
architecture FFD of FFD is
begin
process(Clock, Set, Clear)
begin
if Set = ' 1 ' then
Q <= '1';
elsif Clear = ' 1' then
Q<='O';
elsif (rising_edge(Clock)) then
if (Enable =' 1') then
Q <= D;
end if;
end if;
end process;
end architecture FFD;
Código VHDL 6.21: Diseño de un flip-flop D con señales enable, set y clear.
468
DISEÑO DE LÓGICA SECUENCIAL
entity bp_FFD is
end entity bp_FFD;
component FFD is
port ( Q : out std_logic;
Clock, Enable, Set, Clear, D : in std_logic );
end component FFD;
-- Procedimiento para comprobar las salidas del fiip-fiop
procedure comprueba_salidas
( esperado_q std_logic;
actual_q std_logic;
error_count : inout integer) is
begin
-- Comprueba q
if ( esperado_q /= actual_q ) then
report "ERROR: Estado esperado (" & std_logic'image(esperado_q) &
"),estado actual (" & st<Llogic'image(actual_q) &
"),instante:" & time'image(now);
error count := error_count + 1;
end if;
end procedure comprueba_salidas;
begin
uut : component FFD port map ( Q, Clock, Enable, Set, Clear, D );
Clock <= not Clock after (PERIOD0/2);
gen_vec_test : process is
variable error _count : integer := O; -- Núm. errores
begin
report "Comienza la simulación";
-- Vectores de test y comprobación del resultado
Set <= '1'; Clear <= '0'; Enable <= '0'; D<='1'; --1
wait for PERIODO; comprueba_salidas(' 1', Q, error_count);
Set <= '0'; Clear <= '0'; Enable <= '1'; D<='O'; --2
wait for PERIODO; comprueba_salidas('O', Q, error_count);
Set <= '0'; Clear <= '0'; Enable <= '0'; D<='1'; --3
wait for PERIODO; comprueba_salidas('O', Q, error_count);
Set <= '0'; Clear <= '0'; Enable <= '1'; D<='1'; --4
wait for PERIODO; comprueba_salidas(' 1 ', Q, error_count);
Set <= 'O'; Clear <= '1'; Enable <= '1'; D<=' 1 '; --5
wait for PERIODO; comprueba_salidas( 'O', Q, error _count );
report "Num. errores: Hay " & integer'image(error_count) & " errores.";
wait; -- Final del bloque process
end process gen_vec_test;
end architecture bp_FFD;
469
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Código VHDL 6.23: Package en el cual se definen las constantes del diseño del contador
ascendente módulo 4.
470
DISEÑO DE LÓGICA SECUENCIAL
471
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
begin
-- InstanciaT y conectaT UUT
uut : component contador _Mod_ 4 port map (q, clk, reset, e);
Código VHDL 6.25: Parte inicial del banco de pruebas del contador ascendente módulo 4.
472
DISEÑO DE LÓGICA SECUENCIAL
gen_vec_test : process ~
variable error _count : integer := O; -- Núm. errores
begin
report 11 eomienza la simulación 11 ;
-- Informe final
if (error_count =o) then
report 11 Simulación finalizada sin errores 11 ;
else
report 11 ERROR: Hay 11 &
integer'image(error_count ) &
11
errores. 11 ;
end if;
wait; -- Final del bloque process
end process gen_vec_test;
end architecture bp_contador _Mod_ 4;
Código VHDL 6.26: Parte final del banco de pruebas del contador ascendente módulo 4.
473
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Dl e Ql + Ql QO +e Ql QO
DO e QO +e QO
State(l) Ql
State(O) Q
En el diseño del contador se han empleado puertas lógicas básicas (AND, ORe
inversor) y 2 fiip-fiops D (uno por cada variable de estado). Los fiip-flops D usados
son activos en el flanco de subida de la señal del reloj y tienen una entrada reset
asíncrona activa a nivel bajo.
474
DISEÑO DE LÓGICA SECUENCIAL
Q1
not_1
Q1_n : ·:······~-- ····+-¡- - - - - - - - - - - - ,
~ ............... . . .i
e QO
...r ,·¿··¡ QO_n : .......1-
...¡ ! - - - - - - - - - - - - ,
'--c-lo_c_k-------t~---!""""iC~~~~ yan1~¡--- ¡
:::º:::::::::::::::: not_3
reset :·········.:··¡ reset_n
::::º:::::::::::::::: !. ... ~ ......... !
Figura 6.23: Contador módulo 4 compuesto por flip-flops D y puertas lógicas.
475
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
begin
state(1) <= Q1;
state(O) <= QO;
not_1: not1 port map (Q1_n, Q1);
not_2: not1 port map (QO_n, QO);
not_3: not1 port map (reset_n, reset);
not_4: not1 port map (c_n, e);
and_1: and2 port map (yand_1, c_n, Q1);
and_2: and2 port map (yand_2, Q1, QO_n);
and_3: and3 port map (yand_3, e, Q1_n, QO);
or_1: or3 port map (yor_1, yand_1, yand_2, yand_3);
and_ 4: and2 port map (yand_ 4, c_n, QO);
and_5 : and2 port map (yand_5, e, QO_n);
or_2: or2 port map (yor_2, yand_4, yand_5);
D1 flipflop_D port map (Q1, yor_1, clock, reset_n);
D2 flipflop_D port map (QO, yor_2, clock, reset_n);
476
DISEÑO DE LÓGICA SECUENCIAL
El Código VHDL 6.28 es el diseño del generador de señal. Obsérvese que el valor
de la señal de salida wave se asigna en el flanco de subida de la señal de reloj.
Esto supone que al sintetizar el circuito se inferirá un flip-flop, cuya finalidad será
almacenar el valor de esta señal. No resultaría adecuado que la salida del generador
de señales fuera directamente la salida de un circuito combinacional, ya que no deben
producirse glitches en la salida de un generador de señales.
entity generador is
port(wave : out std_logic;
clk : in std_logic);
end entity generador;
477
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity bp_generador is
end entity bp_generador;
component generador is
port ( wave : out std_logic;
clk : in std_logic);
end component generador;
begin
-- Instanciar y conectar UUT
uut : component generador port map (wave, clk);
478
DISEÑO DE LÓGICA SECUENCIAL
Solución al Ejercicio 6. 7
La señal clk3 se genera haciendo la operación lógica XNOR de las señales rise
y fall.
479
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
480
DISEÑO DE LÓGICA SECUENCIAL
48 1
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
482
DISEÑO DE LÓGICA SECUENCIAL
Código VHDL 6.32: Fragmento inicial del diseño del circuito especificado en el Ejercicio 6.9.
483
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
--------Maquina de estados 2
proximo_estado2:process (clk)
begin
if (falling_edge( clk)) then
case internal_state2 is
when one =>
internal_state2 <= two;
when two =>
internal_state2 <= three;
when three =>
internal_state2 <= one;
end case;
end if;
end process proximo_estado2;
salida2:process (internal_state2)
begin
case internal_state2 is
when one =>
temp_out2 <= '1';
when two =>
temp_out2 <= '1';
when three =>
temp_out2 <= 'O';
end case;
end process salida2;
out1 <= temp_out1;
out2 <= temp_out2;
out3 <= temp_out 1 and temp_out2;
end gen;
Código VHDL 6.33: Fragmento final del diseño del circuito especificado en el Ejercicio 6.9.
begin
-- Instanciar y conectar UUT
uut : component gen port map
( out1, out2, out3, clk);
Código VHDL 6.34: Banco de pruebas del diseño del circuito especificado en el Ejercicio 6.9.
484
DISEÑO DE LÓGICA SECUENCIAL
Figura 6.24: Diagrama de estados del circuito detector de una secuencia 3 unos o más consecutivos.
Figura 6.25: Orden en que el programa de test recorre los arcos del circuito detector de una
secuencia 3 unos o más consecutivos.
485
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
library IEEE;
use IEEE. std_logic_1164.all;
entity detector is
port ( Y : out std_logic;
state : out std_logic_vector(1 downto O);
X : in std_logic;
reset : in std_logic;
clk : in std_logic);
end entity detector;
--Cálculo salida
salida: process ( internal_state) is
begin
case internal_state is
when 11 00 11 = > Y <= '0';
when 11 01 11 =>Y <= '0';
when 11 10 11 = > Y < = '0';
when others = > Y <= '1 ';
end case;
end process salida;
--Calculo del proximo estado
proximo_estado: process (clk, reset)
begin
if (reset = '1 ') then --reset asíncrono
internal_state <= 11 00 11 ;
elsif (rising_edge( clk)) then
case internal_state is
when 11 00 11 = > -- Estado actual: 00
if X = ' 1 ' then
internal_state <= 11 01 11 ;
el se
internal_state < = 11 00 11 ;
end if;
when 11 01 11 = > --Estado actual: 01
if X = ' 1 ' then
internal_state < = 11 10 11 ;
el se
internal_state < = 11 00 11 ;
end if;
when 11 10 11 = > --Estado actual: 10
if X = ' 1 ' then
internal_state <= 11 11 11 ;
el se
internal_state < = 11 00 11 ;
end if;
when 11 11" = > -- Estado actual: 11
if X = ' 1 ' then
internal_state < = 11 11 11 ;
el se
internal_state < = 11 00 11 ;
end if;
when others= > -- Por completitud
internal_state < = 11 00 11 ;
end case;
end if;
end process proximo_estado;
end architecture detector;
Código VHDL 6.35: Diseño del detector de una secuencia 3 unos o más consecutivos.
486
DISEÑO DE LÓGICA SECUENCIAL
entity bp_detector is
end entity bp_detector;
component detector is
port ( Y : out std_logic;
state : out std_logic_vector( 1 downto O);
X : in std_logic;
reset : in stcLlogict
clk : in std_logic);
end component detector;
Código VHDL 6.36: Diseño del banco de pruebas del detector de una secuencia 3 unos o más
consecutivos.
487
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
begin
-- Instanciar y conectar UUT
uut : component detector port map
(Y, state, X, reset, clk);
Código VHDL 6.37: Continuación del diseño del banco de pruebas del detector de una secuencia
3 unos o más consecutivos.
488
DISEÑO DE LÓGICA SECUENCIAL
El banco de pruebas del contador BCD diseñado se muestra en el Código VHDL 6.39
y 6.40.
489
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
library IEEE;
use IEEE. std_logic_1164. all;
entity contador is port(
count out std_logic_vector(3 downto O);
clk, reset : in std_logic);
end entity contador;
architecture contador of contador is
signal internal_state: std_logic_vector(3 downto O);
begin
count < = internal_state;
490
DISEÑO DE LÓGICA SECUENCIAL
component contador is
port ( count : out std_logic_vector(3 downto O);
clk, reset : in std_logic );
end component contador;
Código VHDL 6.39: Diseño del banco de pruebas del contador BCD.
491
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
begin
-- Instanciar y conectar UUT
uut : component contador port map
(q, clk, reset);
Código VHDL 6.40: Continuación del diseño del banco de pruebas del contador BCD.
492
DISEÑO DE LÓGICA SECUENCIAL
El circuito diseñado tiene 5 estados: SO, S1, S2, S3 y S4. El circuito se encuentra
en el estado SO cuando no se ha detectado ningún bit de la secuencia. Está en
los estados S1, S2, S3 y S4 cuando se han detectado respectivamente el primero,
segundo, tercero y cuarto bit de la secuencia, respectivamente. En la Figura 6.26 se
muestra el diagrama de estados de dicho circuito.
reset
'O'
'O' '1'
493
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
-- Cálcv,lo salida
salida: process (internal_state) ~
begin
case internal_state is
when "100" = > Y<= '1';
when others = > Y <= '0';
end case;
end process salida;
494
DISEÑO DE LÓGICA SECUENCIAL
Código VHDL 6.42: Continuación del diseño del detector de la secuencia "1011".
495
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity bp_detector is
end entity bp_detector;
component detector is
port ( Y : out std_logic;
state : out std_logic_vector(2 downto O);
X : in std_logic;
reset : in std_logic;
clk : in std_logic);
end component detector;
Código VHDL 6.43: Diseño del banco de pruebas del detector de la secuencia "1011".
496
DISEÑO DE LÓGICA SECUENCIAL
begin
-- lm;tanciar y conectaT UUT
uut : component detector port map
(Y, state, X, reset, clk);
Código VHDL 6.44: Continuación del diseño del banco de pruebas del detector de la secuencia
"1011".
497
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
library IEEE;
use IEEE. std_logic_1164. all;
use IEEE. numeric_std. all;
entity udcounter is port (
Q: out std_logic_vector(3 downto O);
Clock: in std_logic;
Clear: in std_logic;
Count: in std_logic;
Down: in std_logic);
end udcounter;
architecture udcounter OF udcounter IS
begin
process {Clock, Clear)
variable value: INTEGER RANGE O TO 15;
begin
if (Clear = '1 ') then
value :=O;
elsif (rising_edge(Clock)) then
if (Count = '1 ') then
if (Down = '0') then
value := value + 1;
else
value := value - 1;
end if;
end if;
end if;
Q <= std_logic_vector(to_unsigned(value,4));
end process;
end udcounter;
Código VHDL 6.45: Diseño del contador binario ascendente y descendente de 4 bits.
498
DISEÑO DE LÓGICA SECUENCIAL
entity bp_udcounter is
end entity bp_udcounter;
component udcounter is
port ( Q : out std_logic_vector(3 downto O);
Clock, Clear, Count, Down : in std_logic ) ;
end component udcounter;
Código VHDL 6.46: Diseño del banco de pruebas del contador binario ascendente y descendente
de 4 bits.
499
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
begin
-- Inst an ciar y conectar UUT
uut : component udcounter port map
(Q, Clock, Clear, Count, Down);
Clear <= 'O', '1' after (PERIOD0/4),
'0' after (3*PERIOD0/4);
Clock <= not Clock after (PERIOD0/2);
gen_ vec_ test : process is
variable temp : unsigned (3 downto O);
variable error _count : integer := O; -- Núm. ermres
begin
report "Comienza la simulación";
-- Vectores de t est y compmbación del resultado
wait for PERIODO;
Count <= '1'; Down <='0';
for i in O to 4 loop
temp := TO_UNSIGNED(i,4);
comprueba_salidas( std_logic_vector(temp), Q, error_count);
wait for PERIODO;
end loop;
Count <= '0'; Down <= '1';
wait for PERIODO; -- 1
Count <= '1';
for i in 5 downto 1 loop
temp := TO_UNSIGNED(i,4);
comprueba_salidas( std_logic_vector(temp), Q, error_count);
wait for PERIODO;
end loop;
Count <= '0';
-- Inform e final
if (error_ count = O) then
report "Simulación finalizada sin errores";
else
report "ERROR: Hay " &
integer' image(error_count ) &
" errores. ";
end if;
wait; -- Final del bloque process
end process gen_vec_test;
end architecture bp_udcounter;
Código VHDL 6.47: Continuación del diseño del banco de pruebas del contador binario
ascendente y descendente de 4 bits.
500
DISEÑO DE LÓGICA SECUENCIAL
entity ctrl_semaforo is
port(r1, r2, y1, y2, g1, g2 : out std_logic;
clk, reset : in std_logic);
end entity ctrl_semaforo;
Código VHDL 6.48: Package con la definición de las constantes y parte inicial del diseño del
controlador de dos semáforos.
501
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
salidas: process(internal_state)
begin
case internal_state is
when RG =>
r1 <= '1 '; r2 <= '0'; y1 <= '0';
y2 <= '0'; g1 <= '0'; g2 <= '1';
when RY =>
r1 <= '1 '; r2 <= '0'; y1 <= '0';
y2 <= '1 '; g1 <= '0'; g2 <= '0';
when GR =>
r1 <= '0'; r2 <= '1'; y1 <= '0';
y2 <= '0'; g1 <= '1'; g2 <= '0';
when YR =>
r1 <= '0'; r2 <= '1'; y1 <= '1';
y2 <= '0'; g1 <= '0'; g2 <= '0';
when YY =>
r1 <= '0'; r2 <= '0'; y1 <= '1';
y2 <= '1'; g1 <= '0'; g2 <= '0';
end case;
end process salidas;
end architecture ctrl_semaforo;
Código VHDL 6.49: Parte final del diseño del controlador de dos semáforos.
502
DISEÑO DE LÓGICA SECUENCIAL
entity bp_ctrl_semaforo is
end entity bp_ctrl_semaforo;
component ctrl_semaforo is
port ( r1, r2, y1, y2, g1, g2 : out std_logic;
clk, reset : in std_logic ) ;
end component ctrl_semaforo;
Código VHDL 6.50: Parte inicial del banco de pruebas del controlador.
503
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
begin
-- Instanciar y conectar UUT
uut: component ctrLsemaforo port map (z(5), z(4), z(3), z(2), z(1), z(O),clk, reset);
reset <= 'O',
'1' after (PERIOD0/4),
'O' after (PERIODO+PERIOD0/4);
clk <= not clk after (PERIODO /2);
gen_vec_test : process is
variable error_count : integer := O; -- Núm. errores
begin
report "Comienza la simulación";
-- Vectores de test y comprobación del resultado
wait for PERIODO; -- 1
comprueba_salidas ( "00 1100", z, error_count);
wait for PERIODO; -- 2
comprue ba_salidas (" 100100", z, error_count);
wait for timeRY*PERIODO; -- 3
comprueba_salidas("010010", z, error_count);
wait for timeGR *PERIODO; -- 4
comprueba_salidas("011000", z, error_count);
wait for timeYR*PERIODO; -- 5
comprueba_salidas(" 100001 ", z, error_count);
wait for timeRG*PERIODO; -- 6
comprueba_salidas(" 100100", z, error_count);
-- Informe final
if ( error_count = O) then
report "Simulación finalizada sin errores" ;
else
report "ERROR: Hay" &
integer'image( error_count) &
"errores.";
end if;
wait; -- Final del bloque process
end process gen_vec_test;
end architecture bp_ctrLsemaforo;
Código VHDL 6.51: Parte final del banco de pruebas del controlador.
504
DISEÑO DE LÓGICA SECUENCIAL
El Código VHDL 6.52- 6.54 es el diseño del controlador del microondas. Se han de-
clarado las siguientes señales auxiliares: minutoAnterior, internalState, t_coccion,
t_alarma, reset_alarma y resetTimer. La señal internalState almacena el estado
actual. Las señales t_coccion y t_alarma se usan para llevar la cuenta del tiempo
restante para finalizar la cocción y para apagar la alarma, respectivamente. Las
señales reset_alarma y resetTimer son del tipo boolean y se usan para resetear el
tiempo de alarma y de cocción, respectivamente.
505
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Código VHDL 6.52: Package con la definición de las constantes y parte inicial del diseño del
controlador del microondas.
506
DISEÑO DE LÓGICA SECUENCIAL
Código VHDL 6.53: Continuación del diseño del controlador del microondas.
507
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Código VHDL 6. 54: Parte final del diseño del controlador del microondas.
508
DISEÑO DE LÓGICA SECUENCIAL
reset
stop_Reset
@
t_alarma=O
Figura 6.27: Transiciones en el estado realizadas durante el test del circuito controlador del
microondas.
509
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
component microondas is
port( segundos : out std_logic_vector( 9 downto O);
calentar, luz, alarma : out std_logic;
reset, minuto, marcha : in std_logic;
stop_Reset, puerta, clk : in std_logic);
end component microondas;
procedure comprueba -- Procedimiento para comprobar las salidas
( esperado_segundos: integer;
esperado_luz, esperado_alarma, esperado_calentar : std_logic;
actual_segundos: std_logic_vector(9 downto O);
actual_luz, actual_alarma, actual_calentar std_logic;
error_count : inout integer) is
variable e_seg: integer range O to 1023;
begin
if ( esperado_luz /= actual_luz ) then -- Comprueba luz
report "ERROR: Luz esperada (" & std_logic' image(esperado_luz) &
"), luz actual (" & std_logic' image(actual_luz) &
"), instante: " & time' image(now);
error_count := error_count + 1;
end if;
if ( esperado_alarma / = actual_alarma) then -- Comprueba alarma
report "ERROR: Alarma esperada (" & std_logic' image( esperado_alarma) &
"), alarma actual (" & std_logic' image(actual_alarma) &
"), instante: " & time' image(now);
error count := error_count + 1;
end if;
Código VHDL 6.55: Banco de pruebas del diseño del controlador del microondas.
510
DISEÑO DE LÓGICA SECUENCIAL
Código VHDL 6.56: Continuación del banco de pruebas del controlador del microondas.
511
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
report "Finaliza la simulación con " & integer' image( error _count) &
"errores."; -- Informe final
wait; -- Final del bloque process
end process gen_ vec_ test;
end architecture bp_microondas;
Código VHDL 6.57: Parte final del banco de pruebas del controlador de microondas.
512
TEMA 7
METODOLOGÍA DE
TRANSFERENCIA ENTRE REGISTROS
7.1. Introducción
7.2. Operaciones de transferencia entre registros
7.3. Máquinas de estado finito con camino de datos
7.4. Descripción del programa RT usando VHDL
7.5. Circuito detector de secuencia
7.6. Control de una máquina expendedora
7. 7. Lecturas recomendadas
7.8. Ejercicios de autocomprobación
7.9. Soluciones de los ejercicios
METODOLOGÍA DE TRANSFERENCIA ENTRE REGISTROS
OBJETIVOS DOCENTES
Una vez estudiado el contenido del tema y realizados los ejercicios prácticos,
debería saber:
515
METODOLOGÍA DE TRANSFERENCIA ENTRE REGISTROS
7.1. INTRODUCCIÓN
- La lógica de control, que consiste en la lógica necesaria para generar las señales
de control que controlan todos los componentes del camino de datos. Puede
tratarse de una FSM del tipo que se explicó en el Capítulo 6, con la lógica
combinacional necesaria para generar las señales de control correspondientes
a cada estado.
517
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Lógica de
control
Figura 7.1: Circuito secuencial síncrono con lógica de control y camino de datos.
donde los registros situados en el lado de la derecha son los registros origen de los
datos (r origl, r orig2, ... , r origN), la funciÓn f representa la operaciÓn a realizar, y el
registro situado en el lado de la izquierda es el registro destino (r dest), en el cual se
almacena el resultado de la operación.
En resumen, esta notación significa que el nuevo valor de r dest se calcula evaluando
f ( r origl, r orig2, ... , r origN), y que el resultado Se almacena en r dest en el siguiente
flanco de subida de la señal de reloj. Obsérvese que la notación f - no existe en
VHDL. Se emplea únicamente para representar la operación RT.
518
METODOLOGÍA DE TRANSFERENCIA ENTRE REGISTROS
519
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
2. Los datos son operados por el circuito combinacional que realiza la función
f y el resultado es ruteado a la entrada del registro r dest. Se asume que el
periodo de la señal de reloj es lo suficientemente grande como para acomodar
el retardo de propagación de los registros y del circuito combinacional.
7.2.2. Programa RT
Las operaciones que se realizan en un mismo paso del programa RT serán tra-
ducidas a sentencias VHDL que se ejecutarán concurrentemente. Así pues, varias
operaciones pueden realizarse en un mismo paso del programa RT si pueden ser
ejecutadas unas independientemente de las otras. Es decir, si no existe dependencia
entre los datos y los recursos involucrados en dichas operaciones.
Pueden incluirse diferentes tipos de operaciones en los pasos del programa RT,
tales como asignaciones a variables, operaciones aritméticas o lógicas, acciones con-
dicionales, llamadas a subrutinas y funciones, y bucles for y while.
Los bucles for y while pueden constituir un único paso del programa RT,
cuando las acciones del cuerpo del bucle puedan ejecutarse concurrentemente. Por
el contrario, si las operaciones del cuerpo del bucle deben ejecutarse en varios pasos
consecutivos, entonces el cuerpo del bucle se estructurará en varios pasos.
520
METODOLOGÍA DE TRANSFERENCIA ENTRE REGISTROS
Sin embargo, ambas versiones del Paso 1 son equivalentes, ya que en la sentencia
se utiliza el valor antiguo de num. Esto es debido a que las sentencias de un paso se
ejecutan concurrentemente y por ello el orden en que están escritas es indiferente.
521
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
rl ~ rl + r2;
r1 ~ r1 + 1;
1-----~d q
.-------1:>
ft
clk - - - - - - - - - ó - - 0
f2
522
METODOLOGÍA DE TRANSFERENCIA ENTRE REGISTROS
Como hemos indicado anteriormente, el camino de datos realiza todas las opera-
ciones RT del algoritmo. Ahora bien, es necesario disponer de un mecanismo para
especificar cuándo y qué operaciones RT deben realizarse. Esta es la finalidad de la
lógica de control.
- La transición entre los estados de una FSM se produce en los instantes en que
se produce el flanco de subida de la señal de reloj. Puesto que el instante en
que se produce la ejecución de las operaciones RT está también dictado por la
señal de reloj, puede asociarse la operación RT a un estado de la FSM.
- En una FSM las transiciones entre los estados se producen siguiendo una
secuencia bien definida. Así pues, la FSM puede emplearse para definir la
secuencia en la cual deben ejecutarse la operaciones RT.
- En función del valor de sus señales de entrada, la FSM puede realizar unas u
otras transiciones entre estados, con lo cual la FSM permite realizar bifurca-
ciones en la secuencia de operaciones RT. Esto posibilita la implementación
de las sentencias if y de los bucles que pueda haber en el programa RT.
523
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
CAMINO DE DATOS
~-------------------------~------------------------,
D atos de
entrada
l Conexionado
de
H Unidades ____.
Conexionado
de
____. d q
Registros
1
Datos d e
salida ..
-,
Comandos
externos y
l..------.
Lócricapara
o·
obtener el r--t
d Lógica para
q 1--o-~,obtener la
Señal de
status
externa
...
-----+--o-~ siguiente estado Registro ~ salida
de estado
~
LÓGICA DE CONTROL
- Unidades funcionales, que realizan las funciones (!) especificadas en las ope-
raciones RT. Entre las unidades funcionales típicas se encuentran un sumador,
un restador, un circuito incrementador y uno decrementador, etc.
- El conexionado de enrutamiento, que conecta por una parte las salidas de los
registros con las entradas de las unidades funcionales, y por otra las resul-
tados obtenidos de las unidades funcionales con las entradas a los registros.
Normalmente el enrutamiento se realiza mediante multiplexores.
- Los datos de entrada, que son los datos externos que debe procesar la FSMD.
- Los datos de salida, que son los resultados del programa que implementa la
FSMD.
524
METODOLOGÍA DE TRANSFERENCIA ENTRE REGISTROS
- La señal de status interna es una señal generada por el camino de datos cuya
finalidad es informar a la lógica de control de que se ha satisfecho cierta
condición, por ejemplo, que el contenido de un registro es cero. Esta señal es
usada por la lógica de control para determinar la secuencia futura de acciones.
- Los comandos externos, que son señales externas que señalan que deben rea-
lizarse determinadas acciones, por ejemplo, que comience la operación de la
FSMD.
- La señal de status interna, que proviene del camino de datos, y que es empleada
para determinar el siguiente estado.
- La señal de status externa, que es una señal de salida de la FSM cuya finalidad
es indicar cuál es el estado de la operación de la máquina, por ejemplo, si se
encuentra libre u ocupada.
525
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Obsérvese que se define una señal, llamada state, cuyo valor indica qué paso del
algoritmo se está ejecutando en cada momento. En el Código VHDL 7.1 esta señal
es de tipo integer, si bien puede ser de otro tipo.
Cada vez que se produce un flanco de subida de la señal de reloj se ejecutan dos
sentencias concurrentes. La primera de ellas incrementa el valor de la señal state.
La otra es un bloque case, que ejecuta las sentencias del correspondiente paso del
seudocódigo.
526
METODOLOGÍA DE TRANSFERENCIA ENTRE REGISTROS
package DEFS is
constant FUNCION 1 : integer := z; -- z es un número de estado que define unívocamente
-- esta función. D ebe satisfa cerse: z > m + x + 1
end package DEFS;
architecture ...
signal state : integer; -- Contador que indica el paso del seudocodigo ejecutandose
when k=>
i <= O; -- Inicialización del bucle for
when k+ 1 = >
. . . -- Primer paso dentro del bucle for
when k+ 2 =>
. . . -- Segundo paso dentro del bucle for
when k+ x = >
. . . -- Último paso dentro del bucle for
if (i < max) then
state <= k+1;
end if;
i <= i + 1;
527
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Para ilustrar cómo puede realizarse una descripción VHDL de alto nivel a partir
de una descripción algorítmica RT, consideraremos nuevamente el diseño de un
circuito detector de patrones en una secuencia de bits.
La sentencia
528
METODOLOGÍA DE TRANSFERENCIA ENTRE REGISTROS
Código VHDL 7.2: Dos diseños de un circuito detector de la secuencia 0111 1110.
529
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Además de introducir las monedas, el cliente puede pulsar uno de los botones
de selección de producto (agua y refresco). También puede pulsar el botón de
devolución, con el fin de obtener el dinero que ha introducido en la máquina. En la
Tabla 7.2 se resumen las entradas al circuito descritas anteriormente. Se supone que
dos de estas entradas al circuito no pueden estar activas simultáneamente.
Entrada Descripción
m10 Introducida moneda de 10 céntimos.
m20 Introducida moneda de 20 céntimos.
m50 Introducida moneda de 50 céntimos.
devolución Solicitud de devolución del dinero.
selec_agua Selección de producto: una botella de agua.
selec_refresco Selección de producto: una lata de refresco.
En la Tabla 7.3 se muestran algunas de las señales de salida del circuito. Las
señales dispensa_refresco, dispensa_aguay devuelve_cambio se usan para controlar
la entrega al cliente de una lata de refresco, una botella de agua, y del dinero que
ha introducido en la máquina y aun no ha gastado (es decir, del cambio).
La señal beep sirve para indicar al cliente que no ha introducido dinero suficiente
para comprar el producto que ha seleccionado. Por tanto, esta señal se activa cuando
el cliente selecciona un producto sin haber introducido el dinero suficiente para
comprarlo.
530
METODOLOGÍA DE TRANSFERENCIA ENTRE REGISTROS
Señal Descripción
total Dinero total introducido por el cliente.
beep Se activa cuando el cliente selecciona el producto
sin haber introducido dinero suficiente.
devuelve_moneda Se activa para devolver la última moneda intro-
ducida, si esta moneda hace que se exceda el
dinero total máximo que acepta la máquina.
dispensa_refresco Dispensa una lata de refresco.
dispensa_ agua Dispensa una botella de agua.
devuelve_ cambio Devuelve el dinero restante.
La señal devuel ve_moneda se activa si el cliente introduce más dinero del que
puede ser almacenado en la señal total. En este caso, se devuelve la última moneda
introducida por el cliente.
2. El circuito B, al detectar que req pasa de valer 'O' a valer '1 ', carga el dato
(por ejemplo, en latches), lo procesa y entonces cambia el valor de la señal ack
de 'O' a '1'. Con ello indica al circuito A que ha recibido los datos y los ha
procesado.
3. El circuito A espera hasta que detecta ack=' 1 ', lo cual indica que los datos
han sido recibidos y procesados, y entonces el circuito A pone req=' O'.
531
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
4. Al ver el circuito B que el circuito A ha puesto req=' O', entonces pone ack=' O',
quedando así preparado para la recepción del siguiente dato.
5. Finalmente, el circuito A debe esperar hasta que ack=' O' para enviar el si-
guiente dato y poner de nuevo req=' 1 ' (que es nuevamente el primer paso del
protocolo).
Todas las selecciones del cliente (agua, refresco o devolución del dinero), así como
la entrada de monedas (10 céntimos, 20 céntimos y 50 céntimos), están codificadas
en una única señal de entrada al circuito, llamada data, de 3 bits. La codificación es
la mostrada en la Tabla 7.4. Obsérvese que la codificación de las monedas coincide
con su valor en múltiplos de 10 céntimos. Esta codificación simplifica el algoritmo.
Entrada data
miO "001"
m20 "010"
m50 "101"
devolución "100"
selec_agua "011"
selec_refresco ''000"
Al observar req=' 1', el circuito decodifica la señal de 3 bits data para determinar
la acción solicitada, realiza las acciones solicitadas y a continuación, usando la señal
ack, notifica que ya ha realizado la acción solicitada.
532
METODOLOGÍA DE TRANSFERENCIA ENTRE REGISTROS
533
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Código VHDL 7.3: Package con la definición de las constantes del circuito de la máquina
expendedora.
Obsérvese que las operaciones del Paso O del seudocódigo se ejecutan cuando
(reset_n = 'O'). Asimismo, en esta parte del código se inicializa la señal estado,
que representa el estado actual en el que se encuentra la máquina.
534
METODOLOGÍA DE TRANSFERENCIA ENTRE REGISTROS
begin
total <= total_int;
Código VHDL 7.4: Entity y comienzo de la architecture del circuito de control de la máquina
expendedora.
535
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Código VHDL 7.5: Continuación del diseño del circuito de control de la máquina expendedora.
536
METODOLOGÍA DE TRANSFERENCIA ENTRE REGISTROS
537
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity bp_maquinaExpend is
end entity bp_maquinaExpend;
component maquinaExpend is
port ( total : out unsigned(TOTAL_BITS-1 downto O);
ack : out std_logic;
beep : out std_logic;
devuel ve_moneda : out std_logic;
dispensa_refresco : out std_logic;
dispensa_agua : out std_logic;
devuelve_cambio : out std_logic;
req : in std_logic;
data : in unsigned(DATA_BITS-1 downto O);
reset_n : in std_logic;
el k : in std_logic ) ;
end component maquinaExpend;
begin
Código VHDL 7.6: Banco de pruebas del circuito de control de la máquina expendedora.
538
METODOLOGÍA DE TRANSFERENCIA ENTRE REGISTROS
req <= '1 '; data <= DATA_m20; -- Introdv,ce moneda de 20 cent.
wait for (PERIOD0*3);
req <= 'O'; wait for (PERIOD0*2);
req <= '1 '; data <= DATA_m10; -- Introdu ce moneda de 10 cent.
wait for (PERIOD0*3);
req <= 'O'; wait for (PERIOD0*2);
Código VHDL 7.7: Continuación del banco de pruebas del circuito de la máquina expendedora.
539
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
540
METODOLOGÍA DE TRANSFERENCIA ENTRE REGISTROS
Ejercicio 7.1
541
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Ejercicio 7.2
Indique el número de estados que deberá tener la lógica de control del circuito
FSMD resultante. Asimismo, indique el número de flip-flops D que resultarán de la
síntesis de la lógica de control.
Ejercicio 7.3
Diseñe en VHDL un circuito que, dados dos números de entrada de 4 bits (opA
y opB), calcule su máximo común divisor empleando el algoritmo de Euclides. El
circuito debe tener una señal reset asíncrona y una señal de salida, fin, para indicar
que se ha obtenido el máximo común divisor de los dos números.
542
METODOLOGÍA DE TRANSFERENCIA ENTRE REGISTROS
Ejercicio 7.4
Ejercicio 7.5
543
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Ejercicio 7.6
Paso 1. 11 Inicialización
expo <- y;
base <- x;
if (start)
if (x==O)
resultado <- O;
go to Paso 3;
else if (y==O)
resultado <- 1;
go to Paso 3;
el se
resultado <- 1;
go to Paso 2;
end if;
end if;
Paso 2. 11 Repetición de las multiplicaciones
resultado <- resultado * base;
expo--;
if (expo==O)
go to Paso 3;
el se
go to Paso 2;
end if;
Paso 3. 11 Almacena el resultado
z <- resultado;
go to Paso 1;
Diseñe usando VHDL un circuito cuyo comportamiento venga descrito por este
seudocódigo. A continuación, programe un banco de prueba que aplique al circuito
los tres vectores de test siguientes:
544
METODOLOGÍA DE TRANSFERENCIA ENTRE REGISTROS
545
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
El Código VHDL 7.8 es el diseño del circuito que calcula el máximo común divisor
de 2 números de 4 bits.
El Código VHDL 7.9 es el diseño del banco de pruebas del circuito. Obsérvese
que el banco de pruebas testea únicamente dos casos.
546
METODOLOGÍA DE TRANSFERENCIA ENTRE REGISTROS
Código VHDL 7.8: Diseño del circuito que calcula el máximo común divisor de dos números.
547
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity bp_gcd is
end entity bp_gcd;
Código VHDL 7.9: Banco de pruebas del circuito que calcula el máximo común divisor de dos
números.
548
METODOLOGÍA DE TRANSFERENCIA ENTRE REGISTROS
El Código VHDL 7.10 es el diseño del circuito que calcula la media de 4 números
de 4 bits.
El Código VHDL 7.11 es el diseño del banco de pruebas del circuito. Obsérvese
que el banco de pruebas testea únicamente dos casos.
549
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Código VHDL 7.10: Diseño del circuito que calcula la media de 4 números de 4 bits.
550
METODOLOGÍA DE TRANSFERENCIA ENTRE REGISTROS
Código VHDL 7.11: Banco de pruebas del diseño del circuito que calcula la media de 4 números
de 4 bits.
551
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
El Código VHDL 7.13 y 7.14 es el banco de pruebas del circuito conversor. Para
probar el circuito, se generan todos los posibles números en BCD con LENGTH bits.
En este caso, todos los posibles números de 16 bits. Puesto que un número BCD de
16 bits puede representar cualquier número entero comprendido entre O y 9999 10 ,
ese será el rango de números que se emplee en el test.
552
METODOLOGÍA DE TRANSFERENCIA ENTRE REGISTROS
package BCD_CONST is
constant LENGTH : integer := 16; -- Longitud ( # bits) del número BCD
end package BCD_ CONST;
Código VHDL 7.12: Package con la definición de constantes y diseño del conversor de código
BCD a binario.
553
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity bp_bcd_to_bin is
constant MAX_BCD : integer := 9999; -- Valor máximo de entrada
constant DELAY : time := 10ns; -- Retardo usado en el test
end entity bp_bcd_ to_bin;
Código VHDL 7.13: Parte inicial del banco de pruebas del conversor de código BCD a binario.
554
METODOLOGÍA DE TRANSFERENCIA ENTRE REGISTROS
-- Informe final
if (error_count =o) then
report "Simulación finalizada sin errores";
else
report "ERROR: Hay " & integer'image(error_count) & " errores.";
end if;
Código VHDL 7.14: Parte final del banco de pruebas del conversor de código BCD a binario.
555
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
En el package del Código VHDL 7.15 se han definido las constantes globales, que
serán usadas en el diseño del circuito y en el banco de pruebas. Asimismo, el Código
VHDL 7.15 contiene la definición de la entity del circuito. El Código VHDL 7.16
es la architecture del diseño del circuito exponenciador.
El Código VHDL 7.17 y 7.18 es el banco de pruebas con los 3 vectores de test
indicados en el enunciado. Obsérvese que la señal fin se emplea para finalizar el
bloque process que genera la señal de reloj, una vez ha finalizado la aplicación de
los vectores de test. Con ello se consigue que la simulación finalice por sí misma. En
la Figura 7.4 se muestra el resultado de la simulación del banco de pruebas.
entity exponen is
port ( z : out std_logic_vector (MAX_DATA_BITS-1 downto O);
-- Resultado de la exponenciación
paso : out std_logic_vector (BITS_PAS0-1 downto O);
-- Paso en ejecución del algoritmo
reset_n : in std_logic; -- Reset asíncrono activado LOW
clk : in std_logic;
start : in std_logic;
x : in std_logic_vector(MAX_DATA_BITS-1 downto O);
y : in std_logic_vector(MAX_DATA_BITS-1 downto O) );
end entity exponen;
Código VHDL 7.15: Package con la definición de las constantes globales y entity del circuito
exponenciador.
556
METODOLOGÍA DE TRANSFERENCIA ENTRE REGISTROS
557
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
entity bp_exponen is
constant PERIODO : time := 100 ns; -- Periodo del reloj
end entity bp_exponen;
component exponen is
port ( z : out std_logic_vector (MAX_DATA_BITS-1 downto O);
paso : out std_logic_vector (BITS_PAS0-1 downto O);
reset_n : in std_logic; -- Reset asíncrono activado LOW
clk : in std_logic;
start : in std_logic;
x : in std_logic_vector(MAX_DATA_BITS-1 downto O);
y : in std_logic_vector(MAX_DATA_BITS-1 downto O) );
end component exponen;
begin
uut : component exponen
port map (z, paso, reset_n , clk , start, x , y);
-- Pulso de reset
reset_n <= '1',
'O' after (PERIODO/ 4),
' 1 'after (PERIODO + PERIODO/ 4);
-- Señal de reloj
reloj : process is
begin
clk <= 'O'; wait for (PERIOD0/2);
clk <= '1'; wait for (PERIOD0/2);
if (fin) then
wait; -- Termina este proceso
end if;
end process reloj;
Código VHDL 7.17: Principio del banco de pruebas del circuito exponenciador.
558
METODOLOGÍA DE TRANSFERENCIA ENTRE REGISTROS
Con t. del banco de pruebas del circuito exponen ciación. Fichero: bp_ exponen. vhd
-- Gen eración de los vectores de test
genera_ vectores : process is
begin
wait until falling_edge( clk);
-- Test 1: x vale O, y vale 1
x <= (others => '0'); y<= (O=> '1', others => '0');
wait for PERIODO;
start <= '1 '; -- Comienza el cálculo x**y
wait until (z = B"OOOO_OOOO"); --Espera hasta obtener z= O
-- Test 2: x vale 1, y vale O
x <=(o => '1', others = > '0'); y < = (others = > '0');
wait for PERIODO;
start <= '1'; -- Comienza el cálculo x**y
wait until (z = B"0000_0001"); -- Espera hasta obtener z=1
-- Test 3: :r; vale 0000_0011 , y vale 0000_0010
X <= "00000011"; y <= 11 00000010";
wait for PERIODO;
start <= '1'; -- Comienza el cálculo x**y
wait until (z = B"0000_1001"); -- Espera hasta obtener z=9
-- Final de la simulación
report "Fin de la simulación";
fin < = true; -- Finaliza el proceso del reloj
wait; -- Finaliza est e proceso
end process genera_ vectores;
end architecture bp_exponen;
Código VHDL 7.18: Parte final del banco de pruebas del circuito exponenciador.
l l l l l l l l t l t t l l l l l l l l t t l l l l l l l l t t l l l l l t l l t t l l l l l l t l t t l l l l l l ,,, l l l l l l t l l t t l l l l l l t l t t l l l l l l t l t t l l l l t ,,,,,
& ]¡¡}© Now 1000 ns 1s 200 ns 400 ns 600 ns 800 ns · 000 ns
~;·o Cursor 1 975 ns ~
..!J ...t.JJ ~
-'
1 1 I /
1 Ons to 1041 ns 1 Now: 1 us Delta: 1
Figura 7.4: Resultado de la simulación del banco de pruebas del circuito exponenciador.
559
APÉNDICE A
VERIBEST VB99.0
A.l. Instalación
A.2. Edición y compilación de un modelo
A.3. Simulación y visualización de los resultados
A.4. Depurado usando el debugger
VERIBEST VB99.0
A.l. INSTALACIÓN
l. Ejecute el fichero setup. exe, que se encuentra dentro del directorio VHDL_Si-
mulator.
En esta sección se describe cómo editar y compilar modelos con el simulador VeriBest
VHDL.
Seleccione el icono VeriBest VHDL del grupo de programas Inicio --+ Programas--+
Veribest VB99.0 --+ Veribest VHDL Simulator.
Para crear un espacio de trabajo, puede seguir una de las dos opciones siguientes:
563
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
2. Seleccione el comando "New ... " del menú "File". Se mostrará una ventana en
la que tiene que seleccionar la opción "VHDL Workspace".
Tras seguir una de estas dos opciones, se mostrará una ventana (véase la Fi-
gura A.l). Teclee en dicha ventana el nombre del espacio de trabajo, que en este
caso se ha llamado bufferTriestado, y seleccione el directorio en el cual quiere crear
el espacio de trabajo. El path a dicho directorio (Workspace Path) no debe tener
espacios en blanco, ya que en caso de tenerlos se producirá un error y no se creará
correctamente el espacio de trabajo.
Workspace Name:
Create
1buffer Trie~tad?
Cancel
Workspace Path:
I BASE\\AfOR~S,~~CEVE"RIBEST\ , Help
127 d:\
127 Docencia
127 ETCIII
127 TextoB ase
CJ vbvhdl.chkpt
_ ~ WORKLIB-LVS
! Network... 1
En dicha ventana ubicaremos todos los ficheros necesarios para simular el buffer
triestado, que son los dos siguientes, tal como se describió en las Secciones 1.9.1 y
l. 9. 2: buffer Triestado. vhd y bp_bufferTriestado. vhd.
Puede crearse un nuevo fichero utilizando el comando "New ... " del menú "File".
Obtendrá una ventana en blanco en la que puede teclear el código VHDL. Escriba el
código que describe el buffer triestado y que se muestra en la Sección 1.9.1. Una vez
haya concluido, guárdelo con el nombre buffer Triestado. vhd mediante el comando
564
VERIBEST VB99 .0
Command
vbinit .exe
Working 1 ibrary i s : D : '-DOCENCIA '-ETCI I I '-TEXTOBASE'-WORKSPACEVERIBEST'-WORKLIB
Reference to library WORKLIB (physical name : D: '-DOCENCIA'-ETCIII '-TEXTOBASE'-WORKSPACEVERIBEST'-WORKLIB) added
Done
l. Haga die con el puntero del ratón sobre el botón situado en la esquina "+",
superior derecha de la ventana del espacio de trabajo bufferTriestado. vpd.
2. O bien, utilice el comando "Add Files into Workspace ... " situado en el menú
"Workspace".
Tras realizar este paso obtendrá una ventana para la selección de un fichero.
Seleccione el fichero bufferTriestado. vhd. La ventana principal del simulador tiene
que quedar tal y como se muestra en la Figura A.3.
565
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Para establecer las opciones de compilación, seleccionamos la opción "Settings ... "
del menú "Workspace", o bien recurrimos al icono "Workspace Settings" que está
situado en la barra de herramientas. Con ello, se mostrará una ventana, en la cual
seleccionamos la pestaña "Compile". De este modo, accedemos al cuadro de diálogo
donde se muestran, entre otras, las siguientes opciones de compilación:
566
VERIBEST VB99 .0
~~-~%::2;i~z~=r:bJrt;;·""r;r:;;r;a6r~-c""++--++~~+-
-:-:..-pi.i H~:r::Tr;i:~~ t ád9 :. y~d,
librarv .. I'EEE;·
J.l.s~ · I,É;EE·>std_,:)·ocii.c.:_ l16. ~:. aH.; .
enti~y Í3üÍfe:r_Tr-i:És .taqo i s ·· por t
e~- : ·{~~ ~~~~i~~l6 : ,
,d. :. i ~ )~:t d_,) ogiq .. •);
. end :·é~ti ty :13tH f e;r:-::,..Tri'E~tá,pq
áf ch'l :tect ur'ei i3eha:v i oi al "6 i Bu f'fer~.TriEst; ació
be9j:n · . · : · · ··· · ·
is
·· prqc~s ~ ' (:E " d .)
begin•
H '( E, ;= ~·· 1 ' ), .then.
y ':<= ·. d; '
-'els e:
.• Y <:.' ·.z:· ;.
; élid' if ;
eM·tJroqess.:
end, archit.ec .t .í.txe · Beha~dorál ;
Figura A.4: Entorno de simulación tras compilar el fichero buffer Triestado. vhd.
567
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
~File Edit Search Workspace Simulate Library Tools Window Help .. :::J.::i'L.~.]
~~--;t~~rcir~r~r~r~~~Jfoo -------¡
~ g-~ ¡----------------·---·-
l< d.
Couand 1 .
Compile el fichero. Para ello, seleccione el comando "Compile", que está situado
en el menú "Workspace". El resultado de la compilación se muestra en la ventana de
información, situada en la parte inferior de la ventana principal (véase la Figura A.4).
Observe que la ventana de información contiene las tres pestañas siguientes:
568
VERIBEST VB99.0
Una vez editado y compilado el diseño del buffer triestado, debemos editar y compilar
su banco de pruebas. Para ello:
l. Cree un nuevo fichero con el código del banco de pruebas, que se muestra en
la Sección 1.9.2. Una vez haya concluido, guárdelo en un fichero con el nombre
bp_bufferTriestado. vhd. Recuerde que el path hasta ese fichero no debe contener
espacios en blanco.
vbinit .exe
Working library i s : D : '-DOCENCIA'-ETCIII '-TEXTOBASE'-WORI<SPACEVERIBEST'-WORI<LIB
Reference to library WORI<LIB (physical name : D: '-DOCENCIA'-ETCIII '-TEXTOBASEWORI<SPACEVERIBEST'-WORI<LIB) added
Done
Figura A.6: Entorno de simulación tras incluir el banco de pruebas en el espacio de trabajo.
569
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
A continuación, se describen los pasos a seguir para simular el banco de pruebas del
buffer triestado y para visualizar los resultados de la simulación.
l. Seleccione la opción "Settings ... " del menú "Workspace" o haga clic sobre
el icono correspondiente, denominado "Workspace Settings", de la barra de
herramientas. Se abrirá la ventana mostrada en la Figura A.7.
ji Arch: I BP_BUFFER_TRI~STADO . J
¡ ~----------------~
i
1 Time Unit:j none[!J Terminate Level:j FAILURE
! ············· ········· ....
GJ
1 R: Trace On
i
1 Suppress lnit Phase Message: GJ
1NO~E __
3. Despliegue la carpeta "WORK" para visualizar los elementos sobre los que se
puede realizar una simulación. Obtendrá las interfaces (entity) y arquitecturas
(architecture) que ha programado en los pasos anteriores. Para realizar el test
de la puerta lógica debe seleccionar la arquitectura BP_BUFFER._TRIESTADO
(que es el banco de pruebas) y la interfaz que lleva asociada esa arquitectura
(BP _BUFFER._TRIESTADO).
Para ello, seleccione la architecture BP _BUFFER._TRIESTADO con el cur-
sor del ratón (haga clic sobre ella) y pulse el botón "Set". Tras esta acción, los
570
VERIBEST VB99.0
Para realizar la simulación hay que arrancar el simulador. Esto se puede realizar
de dos formas: mediante la opción "Execute Simulator" del menú "Workspace", o
mediante el icono correspondiente, denominado "Execute Simulator", situado en la
barra de herramientas.
1 Aceptar 1
571
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
File Edit Search Workspace Simulate Debug Libr ary Tools Window Help
-~~--¿iJ~T~fr~r:~~iriT:§fliJ1r~¡-;---;~~·---·-----------------------··-·----·-----·-·-··-·---·-·····---··-···-·-······-·
Para seleccionar qué formas de onda desea visualizar, puede pinchar con el ratón
sobre el icono "WaveForm Window", que está situado en la barra de herramientas.
Equivalentemente, puede ejecutar "New WaveForm Window", que se encuentra en
el menú "Tools ... ".
Obtendrá una ventana con una escala de tiempos, en la que no se muestra ninguna
señal. Para seleccionar las señales, pulse el botón "Add signals" en la ventana de
visualización de señales. Dicho botón se encuentra indicado en la Figura A.lO.
Para salir del simulador, podemos hacer clic con el ratón sobre el icono "Quit",
el cual se encuentra señalado en la Figura A. 9.
572
VERIBEST VB99 .0
,f'l y
'li"l! D
. li"l!E
Colll.llland
Gene~al
573
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Para usar el depurador, es preciso previamente haber compilado los ficheros con la
opción "Debug" habilitada. Una vez activado el simulador, aparece el menú "Debug",
si bien hasta que no se inicie la simulación no aparecerán habilitados todos los
comandos del depurador. Entre los comandos del depurador habilitados antes de
iniciar la simulación, cabe destacar los siguientes (véase la Figura A.12):
- "New Watch Window": abre una ventana que permite observar la evolución
de las señales de forma numérica. Esta ventana, mostrada en la Figura A.13,
dispone de hasta cuatro paneles de observación independientes ("Watchl" a
"Watch4").
Para añadir a uno de los cuatro paneles los elementos a observar, pulse el
botón "Add Watch ... " y obtendrá una ventana cuyo título es "Add watch"
(véase la Figura A.13), en la que puede seleccionar, o bien las señales de forma
independiente (se selecciona la señal y se pulsa el botón "Watch"), o bien todas
las señales de un elemento (se selecciona el componente o bloque en la parte
izquierda de la ventana y se pulsa el botón "Watch block").
- "Show Breakpoints": abre una ventana que tiene como título "Breakpoints",
en la que se muestran todos los puntos de ruptura existentes. En la ventana
"Breakpoints" existe un botón denominado "Condition ... " Pulsando este botón
se abre una ventana, denominada "So urce Breakpoint Condition", en la que
se pueden establecer las condiciones de activación de un punto de ruptura
determinado.
Desde la ventana "So urce Breakpoint Condition", podrá indicar que el punto
de ruptura permanezca activo únicamente para una instancia o proceso espe-
cífico. De esta forma, cuando se establecen condiciones, el simulador se detiene
únicamente en el punto de ruptura que hay dentro del proceso especificado,
no en todos los procesos en los que está el punto de ruptura.
- "Call stack": permite conocer la próxima línea de código VHDL que se ejecutará
cuando se continúe con la simulación. Si se realiza doble die sobre una de
las entradas que aparecen en la ventana "Call Stack", se obtendrá una nueva
574
VERIBEST VB99.0
lnsert/Remove Show
a Breakpoint Breakpoi
Clear All Breakpoints NewWatch
~!'~· Watch Winaow
Show.Br~a!<Points ... Examine Call Window
caHStack Stack
~chi tect,).lre BehaviCJral of BuHer_TriÉst.ad,o is
14 bli¡gin
15 process (E,d)
16 begin
17 i f (E= '1') them
18 y <= d;
19. el se
20 y <= 'Z' ;
21 end if,;
22 end PrOCSS<;l;
23 end archi tecture Behaviorál ;
24
575
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
576
APÉNDICE B
B .l. Instalación
B.2. Edición y compilación de un modelo
B.3. Simulación, visualización y depurado
MODELSIM PE STUDENT EDITION
B.l. INSTALACIÓN
para lo cual en primer lugar tendrá que rellenar un formulario electrónico con
sus datos y señalar una casilla que indica que sólo va a usar la herramienta
para fines educativos.
En esta sección se describe cómo editar y compilar modelos con el simulador Model-
Sim. Para ilustrar las explicaciones, se va a usar el modelo del buffer triestado y su
banco de pruebas, descritos en las Secciones 1.9.1 y 1.9.2 respectivamente.
579
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Seleccione el icono M odelSim PE del grupo de programas Inicio --+ Programas --+
ModelSim PE Student Edition 6.3c --+ ModelSim. Inicialmente aparecerá la ventana
de bienvenida. Si desea que no vuelva a aparecer marque la casilla "Don't show
this dialog again". Para cerrar esta ventana y acceder a la aplicación pulse el botón
"Close".
~ Transcript
Se abrirá entonces la ventana principal del entorno (véase la Figura B.l), que
está compuesta por la barra de menús, la barra de iconos y por los dos elementos
siguientes:
580
MODELSIM PE STUDENT EDITION
581
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
u
Create New File
D
Add Existing File
~ Transcrfpt
582
MODELSIM PE STUDENT EDITION
Para crear un nuevo fichero se pueden usar las opciones de la ventana de diálogo
"Add items to the Project". Se pueden acceder a estas mismas opciones a través del
menú Project - t Add to Project.
Para crear un nuevo fichero con código VHDL, se puede realizar cualquiera de las
dos acciones siguientes:
Con ello, aparece una ventana de diálogo denominada "Create Project File",
que en nuestro caso puede rellenarse como se muestra en la Figura B.4. Tiene los
elementos siguientes:
583
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
File Edit View Compile Simulate Add Source Tools Layout Window Help
~
l iHJ bufferTriestado.vhd 1
Una vez finalizado este proceso, se crea un fichero denominado buffer Tries-
tado. vhd en el directorio del proyecto. En la Figura B.5 se muestra la ventana
principal tras seguir estos pasos. Observe que en la pestaña "Project" del panel
"Workspace" aparece la información sobre el fichero creado. La información mostrada
es la siguiente:
584
MODELSIM PE STUDENT EDITION
585
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
"File Name" Nombre del fichero. El botón "Browse ... " facilita la
selección de dicho fichero navegando a través de las
carpetas del sistema.
"Add File As Type" Nos permite seleccionar el tipo de fichero.
"Folder" Lista desplegable donde aparecen todos los direc-
torios existentes en el proyecto. En el caso de que
no se haya creado ningún directorio esta lista sólo
tendrá un elemento: "Top Level".
"Copy to project di- Realiza una copia física del fichero desde su locali-
rectory" zación al directorio del proyecto.
"Reference from cu- El fichero se incluye en el proyecto, pero no se copia
rrent location" al directorio del mismo.
- Seleccionar la opción Compile ----+ Compile All. Mediante esta opción se com-
pilan todos los ficheros del proyecto. El orden de compilación que se sigue es
el indicado en la columna "Order" del panel "Workspace".
586
MODELSIM PE STUDENT EDITION
Name Path
~
Library work
- E. buffer _triestado Entity D: \Docencia\ETCIII\ TextoBase\ Works ooo
A behavior al Architecture
i1HJl. mtiAvm Library $MODEL_TECH/o o/avm
l±J-1ll sv _std Library $MODEL_TECH/o o/sv _std
8-1Jl vital2000 Library $MODEL_TECH/o o/vital2000
~ieee Library $MODEL_TECH/o o/ieee
l±J-1ll modelsim_lib Library $MODEL_TECH/o o/modelsim_lib
~std Library $MODEL_TECH/o o/std
~ std_developerskit Library $MODEL_TECH/o o/std_developerskit
L:!:Hll synopsys Library $MODEL_TECH/o o/synopsys
~ verilog Library $MODEL_TECH/ .. /verilog
Figura B. 7: Contenido de la librería work tras compilar el fichero buffer Triestado. vhd.
Errores de compilación
Para describir qué sucede cuando hay errores de compilación, vamos a modificar el
fichero buffer Triestado. vhd introduciendo intencionadamente un error: eliminamos
el punto y coma final (;) en la sentencia de asignación siguiente y <= d;
Si se hace doble die sobre este mensaje de error del panel "Transcript", se abre
una ventana de diálogo (Unsuccessful Compile), con información sobre el tipo de
error que se ha producido y el número de línea en que aparece.
Si se hace doble die sobre uno de los mensajes mostrados en la ventana Un-
successful Compile, se abre la ventana de edición mostrando el código VHDL del
fichero, con la línea de código que ha producido el error marcada en color naranja
587
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
i 11
(véase la Figura B.8). En este caso, la línea 16 aparece en color naranja, debido a
que hemos eliminado el símbolo ; que debería aparecer al final de la línea 15.
l. Seleccione del menú Project --7 Add to Project --7 New File ...
Tras seguir estos pasos, el panel "Workspace" queda tal como se muestra en la
Figura B.9. La columna "Status" del fichero bp_bufferTriestado. vhd tiene el icono ? ,
ya que aún no ha sido compilado. El fichero tiene el número 1 en la columna "Order".
Esto indica que, si usamos la opción de compilación Compile --7 Compile All, el
fichero bp_bufferTriestado. vhd se compilará después del fichero bufferTriestado. vhd.
Compile el fichero bp_bufferTriestado. vhd, siguiendo para ello el procedimiento des-
crito en la Sección B.2.4.
588
MODELSIM PE STUDENT EDITION
Existen ocasiones en que el orden de compilación de los ficheros, tal como aparece
en la ventana Workspace, no es correcto y debe ser modificado. Por ejemplo, si en
el fichero paquete. vhd se define un paquete, que se usa en el fichero uso_ paquete. vhd,
entonces es necesario compilar antes el fichero paquete. vhd, ya que en caso contrario
se produce un error de compilación. Puede modificarse el orden de compilación de
los ficheros del modo siguiente:
l. Sitúe el ratón en el área del panel "Workspace" y pulse el botón derecho del
ratón. Aparece así un menú textual.
589
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
~ bufferTriestado.vhd
¡;j bp_butferTnestado .vhd
590
MODELSIM PE STUDENT EDITION
En esta sección se describen los pasos a seguir para realizar la simulación y pa-
ra mostrar los resultados, usando nuevamente el diseño del buffer triestado como
ejemplo.
bp_buffer _triestado
Simulate with Cover age
Edit
GJ-j,l sv _std Refresh
GJ-j,l vital2000 Recompile
GJ-j,l ieee Optimize
¡:±.J-Jll modelsim_lib Update
GJ-j,l std Delete
¡:±.J-Jll std_developerskit Copy
¡:±.J-Jll synopsys
GJ-j,l verilog New
Properties ...
591
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
+acc=v
bp_buffer _t ... Process +acc=v
std_logic_l ... Package +acc=v
standard Package +acc=v
a) ~ b) ~
Figura B.13: Botones: a) "undocked"; y b) "docked".
haciendo clic con el ratón sobre el botón "undocked" (véase la Figura B.13a). Para
volver a insertar el panel en la ventana principal, debe presionarse el botón "docked"
(véase la Figura B.13b).
592
MODELSIM PE STUDENT EDITION
Seleccionar todas las señales que queremos visualizar del panel "Objects".
Arrastrar la selección con el ratón y llevarla hasta el panel "Wave".
Pulsar sobre el panel "Objects" con el botón derecho del ratón. En el menú
que aparece, podemos realizar las dos acciones siguientes:
Cabe destacar las siguientes características del panel "Wave" (véase la Figu-
ra B.14):
593
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
~1 20 ns iJ ~~[!J!
l
Restart
l
Run Length
lll
Run Continue Run All Step Step Over
Run
594
MODELSIM PE STUDENT EDITION
595
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
l. Hacemos clic, con el botón derecho del ratón, en el área del panel donde se
muestra el código de la unidad de diseño seleccionada.
l. Hacemos doble clic sobre la unidad de diseño uut. Aparece así un panel que
muestra el código del fichero bufferTriestado. vhd.
2. Hacemos clic con el ratón a la izquierda del número de línea 15. Aparecerá un
círculo rojo indicando la existencia del punto de ruptura. Para poder modificar
el punto de ruptura, nos situamos con el ratón sobre el círculo y hacemos clic
con el botón derecho. Se despliega un menú de texto que permite deshabilitar el
punto de ruptura ("Disable Breakpoint") y quitar el punto de ruptura ("Remove
Breakpoint").
596
Índice alfabético
- (don't care), 151 Banco de pruebas, 56, 76, 80, 281, 285,
O, 1 lógicos, 149 296, 302, 308, 426, 433, 440, 445
acceso a fichero, 371
Abierto, 52
Binario, 147
Abstracción, 58
Buffer, 47
nivel de procesador, 62
triestado, 79, 278, 376
nivel de puertas, 60
árbol, 50
nivel de RTL, 61
Bus bidireccional, 389
nivel de transistor, 60
Acoplo, 52 CAD, 34
after, 48, 67, 105, 424 Calidad del test, 54
Agregación de vectores, 155 case, 128, 423
Algoritmo, 73, 517 Casting, 161
Alta impedancia, 79, 151 Ciclo de diseño, 36
Architecture Codificador, 108, 111, 125, 129, 151, 159
comportamiento, 285, 291 Comentarios, 66
estructura, 293, 437 Compilación, 207
architecture, 65, 95, 102 component, 70
comportamiento, 102 Componente
estructura, 102 conexión, 72, 136
sintaxis, 103 Declaración, 135
array, 384 declaración, 70
Asignación concurrente, 67, 104, 278, 286 instanciación, 72, 136
condicional, 107 configuration, 78
de selección, 110 constant, 101
simple, 104 Constante, 101, 143
síntesis, 105, 108, 112 generic, 100, 142, 386
Asignación secuencial, 117, 122 Corto, 52
a señal, 122 Coste, 45
a variable, 124 Código VHDL
assert, 101, 169, 298 análisis, 206
Atributos, 166 compilación, 207
ejecución, 206
597
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
598
ÍNDICE ALFABÉTICO
599
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
600
ÍNDICE ALFABÉTICO
601
Bibliografía
Brown, S. & Vranesic, Z. (2006), Fundamentos de Lógica Digital con Diseño VHDL,
Me Graw-Hill.
Chang, K. C. (1997), Digital Design and Modeling with VHDL and synthesis, IEEE
Computer Society Press.
Hwang, E. O. (2005), Digital Logic and Microprocessor Design with VHDL, Cengage-
Engineering.
Lee, S. (2006), Advanced Digital Logic Design: Using VDHL, State Machines and
Syntesis for FPGAs, Thomsom Canada Limited.
603
DISEÑO Y ANÁLISIS DE CIRCUITOS DIGITALES CON VHDL
Salcic, Z. & Smailagic, A. (2000), Digital Systems Design and Prototyping, Kluwer
Academic Publishers.
604