P. 1
Estructura y Tecnologia de Computadores 3 - Libro Problemas

Estructura y Tecnologia de Computadores 3 - Libro Problemas

|Views: 607|Likes:
Published by api-19970781

More info:

Published by: api-19970781 on Dec 03, 2009
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

03/18/2014

pdf

text

original

´ UNIVERSIDAD NACIONAL DE EDUCACION A DISTANCIA (UNED) ´ ´ ESCUELA TECNICA SUPERIOR DE INGENIER´ INFORMATICA IA

Casos prácticos de diseño de circuitos digitales con VHDL

Texto de problemas de la asignatura “Estructura y Tecnología de los Computadores III” Curso 2007/08

Alfonso Urquía Carla Martín Villalba
Departamento de Inform´tica y Autom´tica, UNED a a Juan del Rosal 16, 28040 Madrid, Espa˜a n
{aurquia,carla}@dia.uned.es http://www.euclides.dia.uned.es

Índice

1 Fundamentos 1.1. 1.2. 1.3. 1.4. 1.5. 1.6. Lenguajes para la descripci´n de hardware . . . . . . o Ciclo de dise˜ o de los circuitos digitales . . . . . . . n Propiedades de los circuitos digitales . . . . . . . . . Simulaci´n de eventos discretos . . . . . . . . . . . . o Test de los circuitos . . . . . . . . . . . . . . . . . . Dos simuladores de VHDL’93: VeriBest y ModelSim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1 . 1 . 4 . 5 . 8 . 12 . 16 19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 20 21 22 23 24 28 28 28 29 34 35 37 38 38 39 39 40 41 43 44

2 Conceptos básicos de VHDL 2.1. Definici´n de la entidad de dise˜ o . . . . . o n 2.2. Entity . . . . . . . . . . . . . . . . . . . . 2.3. Architecture . . . . . . . . . . . . . . . . . 2.3.1. Asignaciones concurrentes . . . . . 2.3.2. Bloque process . . . . . . . . . . . 2.3.3. Descripci´n de la estructura . . . . o 2.3.4. Constantes generic . . . . . . . . . 2.4. Configuration . . . . . . . . . . . . . . . . 2.5. Se˜ ales, variables y constantes . . . . . . n 2.5.1. Tipos de datos . . . . . . . . . . . 2.5.2. Atributos . . . . . . . . . . . . . . 2.5.3. Operadores . . . . . . . . . . . . . 2.6. Librer´ . . . . . . . . . . . . . . . . . . . ıas 2.7. Modelado del retardo . . . . . . . . . . . . 2.7.1. Sentencia wait . . . . . . . . . . . 2.7.2. Retardos en la asignaci´n a se˜ ales o n 2.7.3. Retardo inercial y de transporte . 2.7.4. Retardo delta . . . . . . . . . . . . 2.7.5. Caso pr´ctico . . . . . . . . . . . . a 2.8. Assert . . . . . . . . . . . . . . . . . . . . 2.9. Procedimientos y funciones . . . . . . . .

ii

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

3 Casos prácticos de diseño de circuitos combinacionales 3.1. S´ ıntesis de l´gica combinacional . . . . . . . . . . . . . o 3.1.1. Empleo de sentencias concurrentes . . . . . . . 3.1.2. Empleo de bloques process . . . . . . . . . . . 3.2. Funciones l´gicas . . . . . . . . . . . . . . . . . . . . . o 3.2.1. Modelado de las funciones l´gicas . . . . . . . . o 3.2.2. Programaci´n del banco de pruebas . . . . . . o 3.3. Multiplexor de 4 entradas . . . . . . . . . . . . . . . . 3.3.1. Bloque process, sentencia if . . . . . . . . . . . 3.3.2. Bloque process, sentencias if y case . . . . . . . 3.3.3. Sentencias concurrentes . . . . . . . . . . . . . 3.4. Restador completo de 1 bit . . . . . . . . . . . . . . . 3.4.1. Descripci´n del comportamiento . . . . . . . . o 3.4.2. Descripci´n de la estructura . . . . . . . . . . . o 3.4.3. Programaci´n del banco de pruebas . . . . . . o 3.4.4. Banco de pruebas usando un procedimiento . . 3.4.5. Banco de pruebas usando una funci´n . . . . . o 3.5. Sumador binario paralelo con propagaci´n de arrastre o 3.5.1. Dise˜ o de un sumador completo . . . . . . . . n 3.5.2. Banco de pruebas de sumador completo . . . . 3.5.3. Dise˜ o del sumador de 4 bits . . . . . . . . . . n 3.6. Bus bidireccional y memorias . . . . . . . . . . . . . . 3.6.1. Memoria de s´lo lectura . . . . . . . . . . . . . o 3.6.2. Memoria de lectura y escritura . . . . . . . . . 3.6.3. Bus bidireccional . . . . . . . . . . . . . . . . . 3.7. Unidad aritm´tico l´gica (ALU) . . . . . . . . . . . . . e o 3.7.1. Modelado mediante asignaci´n concurrente . . o 3.7.2. Modelado mediante bloque process . . . . . . . 3.7.3. Programaci´n del banco de pruebas . . . . . . o 3.8. Conversor de BCD a binario . . . . . . . . . . . . . . . 3.8.1. Circuito conversor . . . . . . . . . . . . . . . . 3.8.2. Banco de pruebas . . . . . . . . . . . . . . . . 3.9. Codificador 4:2 con prioridad . . . . . . . . . . . . . . 3.9.1. Dise˜ o del circuito . . . . . . . . . . . . . . . . n 3.9.2. Banco de pruebas . . . . . . . . . . . . . . . . 4 Casos prácticos de diseño de circuitos secuenciales 4.1. Dise˜ o de circuitos secuenciales s´ n ıncronos . 4.1.1. Circuito detector de secuencias . . . 4.2. S´ ıntesis de l´gica secuencial . . . . . . . . . o 4.2.1. Sentencias condicionales incompletas 4.2.2. Sentencias condicionales completas . 4.2.3. Retardos . . . . . . . . . . . . . . . 4.2.4. Inicializaci´n . . . . . . . . . . . . . o 4.2.5. Bloques process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

47 47 48 50 50 50 51 54 55 57 59 60 61 62 65 68 70 71 72 75 77 77 78 79 80 82 83 84 85 89 90 91 93 93 94 99 99 100 102 102 103 103 103 104

´ Indice

iii

4.3. Flip-flop JK . . . . . . . . . . . . . . . 4.3.1. Dise˜ o del flip-flop . . . . . . . n 4.3.2. Banco de pruebas . . . . . . . 4.4. M´quinas de estado finito de Moore . a 4.4.1. Dise˜ o de la m´quina . . . . . n a 4.4.2. Banco de pruebas . . . . . . . 4.4.3. Modelado estructural . . . . . 4.5. M´quinas de estado finito de Mealy . . a 4.5.1. Dise˜ o de la m´quina . . . . . n a 4.5.2. Banco de pruebas . . . . . . . 4.6. Descripci´n VHDL de alto nivel . . . . o 4.6.1. Circuito detector de secuencia .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

105 105 106 109 110 113 117 119 119 126 130 130

´ APENDICES
A VeriBest VB99.0 A.1. Instalaci´n . . . . . . . . . . . . . . . . . . . . . . o A.2. Circuito digital ejemplo: buffer triestado . . . . . . A.2.1. Modelo VHDL del buffer triestado . . . . . A.2.2. Banco de pruebas . . . . . . . . . . . . . . A.3. Edici´n y compilaci´n de un modelo . . . . . . . . o o A.3.1. Arranque del simulador VeriBest VHDL . . A.3.2. Creaci´n de un espacio de trabajo . . . . . o A.3.3. Edici´n de un fichero . . . . . . . . . . . . . o A.3.4. A˜ adir un fichero al espacio de trabajo . . . n A.3.5. Compilaci´n de un fichero . . . . . . . . . . o A.3.6. Banco de pruebas . . . . . . . . . . . . . . A.4. Simulaci´n y visualizaci´n de los resultados . . . . o o A.4.1. Establecer las condiciones de la simulaci´n o A.4.2. Activaci´n del simulador . . . . . . . . . . . o A.4.3. Simulaci´n y visualizaci´n de resultados . . o o A.5. Depurado usando el debugger . . . . . . . . . . . . B ModelSim PE Student Edition B.1. Instalaci´n . . . . . . . . . . . . . . . . . . o B.2. Circuito digital ejemplo: buffer triestado . . B.2.1. Modelo VHDL del buffer triestado . B.2.2. Banco de pruebas . . . . . . . . . . B.3. Edici´n y compilaci´n de un modelo . . . . o o B.3.1. Arranque del simulador . . . . . . . B.3.2. Creaci´n de un proyecto . . . . . . . o B.3.3. A˜ adir ficheros al proyecto . . . . . n B.3.4. Compilaci´n de un fichero . . . . . . o B.3.5. Banco de pruebas . . . . . . . . . . B.4. Simulaci´n y visualizaci´n de los resultados o o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

133
133 133 134 134 135 136 136 136 137 137 138 140 140 140 141 142 144 147 147 148 148 149 150 150 151 152 156 157 160

iv

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

B.4.1. B.4.2. B.4.3. B.4.4.

Activaci´n del modo simulaci´n o o Visualizaci´n de los resultados o Ejecuci´n de la simulaci´n . . . o o Inserci´n de puntos de ruptura o

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

160 161 162 163 167 169

Índice alfabético Bibliografía

Fundamentos

1

Objetivos. Una vez estudiado el contenido del tema, deber´ saber: ıa – Discutir la finalidad de los lenguajes para la descripci´n del hardware (HDL) y o algunas de las principales ventajas que presenta su uso. – Discutir el ciclo de dise˜ o del hardware digital y el papel que desempe˜ an en n n el ciclo de dise˜ o los HDL. n – Discutir los conceptos fundamentales de la simulaci´n de eventos discretos, o en particular la gesti´n del reloj de la simulaci´n y del calendario de eventos. o o – Realizar, con “l´piz y papel”, la simulaci´n de eventos discretos de circuitos a o digitales, tal como se muestra en el Caso Pr´ctico de la Secci´n 1.4. a o – Discutir las siguientes propiedades de los circuitos digitales: el retardo de los dispositivos, su ejecuci´n concurrente, la marginalidad en el dise˜ o y la fortaleza o n de las se˜ ales. n – Discutir qu´ son los arboles de buffers y cu´l es su finalidad. e ´ a – Discutir el prop´sito y los fundamentos del test en dise˜o y manufactura, as´ o n ı como los conceptos: modelo de fallos, cobertura del test y calidad del test. – Discutir la utilidad y composici´n de los bancos de pruebas. o – Instalar en su propio ordenador y realizar las operaciones b´sicas de manejo de a alg´ n entorno de simulaci´n de VHDL’93, tal como ModelSim (preferible) o u o VeriBest. Estas operaciones b´sicas incluyen al menos: edici´n de modelos a o y depurado usando el debugger, simulaci´n y visualizaci´n de los resultados. o o

1.1

Lenguajes para la descripción de hardware
Los sistemas digitales se han ido haciendo m´s y m´s complejos durante las a a pasadas d´cadas. Este incremento en la complejidad responde, a grandes rasgos, e a la Ley de Moore, que establece que el avance tecnol´gico posibilita que cada o aproximadamente 18 meses se doble el n´mero de transistores que es posible alojar u en un circuito integrado.

2

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

De esta forma, en la d´cada de 1970 un circuito integrado t´ e ıpico conten´ ıa decenas de miles de transistores. En la d´cada de 1980, la capacidad aument´ a e o cientos de miles de transistores, y en la d´cada de 1990 fue del orden de decenas e de millones. En la d´cada de 2000, la capacidad de los circuitos integrados es del e orden de miles de millones de transistores. En los a˜ os 70, cuando se fabricaba un circuito integrado, se documentaba n su funcionamiento empleando una combinaci´n de esquem´ticos (representaci´n o a o gr´fica de los componentes del circuito), diagramas de transici´n de estados y a o lenguaje natural (por ejemplo, ingl´s). Esta documentaci´n pod´ consistir en e o ıa varios cientos de p´ginas. Los ingenieros, que compraban el circuito integrado para a usarlo en sus propios dise˜ os, ten´ que leer esta documentaci´n para entender n ıan o el funcionamiento del circuito integrado. Sin embargo, leer cientos de p´ginas a no era tarea f´cil. Adem´s, en ocasiones la documentaci´n conten´ errores o a a o ıa ambig¨ edades. La consecuencia de ello era que frecuentemente los ingenieros u ten´ problemas para emplear los circuitos integrados en el desarrollo de sus ıan propios sistemas. Debido a esta situaci´n, el Departamento de Defensa de EE.UU. busc´ un o o procedimiento mediante el cual los fabricantes de circuitos integrados pudieran especificar de forma precisa el funcionamiento de los circuitos. Con esta motivaci´n, o el Departamento de Defensa de EE.UU. inici´ el desarrollo de un lenguaje para la o descripci´n del hardware, para lo cual estableci´ un grupo de trabajo compuesto o o por expertos de varias disciplinas, pertenecientes a diferentes compa˜´ nıas. Un lenguaje para la descripci´n del hardware o HDL (siglas que provienen o del ingl´s: Hardware Description Language) es un lenguaje, legible tanto por e las m´quinas como por los seres humanos, ideado para permitir la descripci´n a o del hardware. Un HDL describe de forma precisa y rigurosa el funcionamiento, pudiendo ser simulado en un ordenador con el fin de reproducir exactamente el funcionamiento del circuito integrado. La simulaci´n por ordenador permite obo tener el valor de las se˜ ales de salida del circuito integrado para una determinada n secuencia de se˜ ales de entrada. n El HDL que el Departamento de Defensa de EE.UU. cre´ en los a˜ os 80 o n se llam´ VHDL. Las siglas VHDL provienen de VHSIC Hardware Description o Language. VHSIC es un acr´nimo de Very High Speed Integrated Circuit, que o fue el nombre del proyecto llevado a cabo por el Departamento de Defensa de EE.UU. La sintaxis de VHDL es muy similar a la del lenguaje de programaci´n ADA. o En 1987, el Institute of Electrical and Electronics Engineers (IEEE) adopt´ VHDL o como el est´ndar n´ mero 1076. El establecimiento de un est´ndar del lenguaje a u a tiene una ventaja fundamental: las compa˜´ desarrolladoras de software de nıas simulaci´n tienen una definici´n claramente establecida del lenguaje al que deben o o dar soporte.

Cap´ ıtulo 1

Fundamentos

3

Ventajas de los HDL
En la actualidad, la casi totalidad de los dise˜ adores de circuitos digitales de cierta n complejidad usan para realizar sus dise˜ os lenguajes para la descripci´n del hardn o ware. El empleo de HDL presenta ventajas respecto al empleo de descripciones basadas en esquem´ticos. Algunas de ellas son las siguientes: a 1. Puesto que una descripci´n HDL es simplemente un fichero de texto, es o mucho m´s portable que un dise˜ o esquem´tico, que debe ser visualizado a n a y editado empleando la herramienta gr´fica espec´ a ıfica del entorno de CAD (Computer-Aided Design - Dise˜ o asistido por ordenador) con el que se ha n creado. 2. Una descripci´n esquem´tica unicamente describe el dise˜ o de manera eso a ´ n tructural, mostrando los m´dulos y la conexi´n entre ellos. Por el contrario, o o la descripci´n del circuito usando un HDL puede realizarse bien mostrando o la estructura, o bien describiendo el comportamiento. Es decir, los HDL permiten describir el comportamiento que se desea que tenga el circuito, sin hacer ninguna referencia a su estructura. Las herramientas de s´ ıntesis permiten generar autom´ticamente la estructura del circuito l´gico a partir a o de la descripci´n de su comportamiento. o 3. El mismo HDL que se ha usado para la descripci´n del circuito, puede o emplearse para describir los vectores de test y los resultados esperados del test. Los vectores de test son los valores de las se˜ ales aplicadas a los n pines de entrada del circuito con la finalidad de probar 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 n e pruebas a medida que se avanza en el dise˜ o. Como ventajas a˜ adidas, la n n descripci´n de los programas de test usando HDL es altamente portable y o repetible.

HDL más ampliamente usados
En la actualidad, los HDL m´s ampliamente usados son Verilog HDL y VHDL. a Ambos son lenguajes est´ndar de IEEE para el modelado y simulaci´n de harda o ware. – Verilog se cre´, a principios de los a˜ os 80, como un lenguaje propiedad de o n la compa˜´ Philip Moorby, compa˜´ que a˜ os m´s tarde fue adquirida por nıa nıa n a Cadence Design Systems. Posteriormente, Verilog se hizo de dominio p´ bliu co y se promovi´ como un est´ndar de IEEE en el a˜ o 1995, denominado o a n IEEE 1364. – Como se ha explicado anteriormente, VHDL fue desarrollado en 1983 por el Departamento de Defensa de los EE.UU. con la finalidad de servir como lenguaje est´ndar para la descripci´n de hardware. En el a˜ o 1987 a o n

4

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

se convirti´ en un est´ndar de IEEE (IEEE 1067-1987). Posteriormente, se o a incorporaron mejoras al lenguaje que dieron lugar a dos actualizaciones del est´ndar: la primera en 1993 (IEEE 1076-1993) y la segunda en 2001 (IEEE a 1076-2001). A principios del a˜ o 2000 se desarroll´ otro HDL denominado SystemC, el n o cual consiste en un conjunto de librer´ en C++. SystemC se convirti´ en el ıas o est´ndar 1666 de IEEE en el a˜ o 2005. a n

1.2

Ciclo de diseño de los circuitos digitales
El empleo de HDL es pr´ctica habitual en las diferentes fases del ciclo de dise˜ o a n de circuitos digitales. En la Figura 1.1 se muestra el ciclo de actividades que se realizan durante el ciclo de dise˜ o e implementaci´n de circuitos digitales de n o relativa complejidad. En primer lugar, el dise˜ ador debe establecer las especificaciones del dise˜ o, en n n t´rminos de qu´ se espera que haga el circuito y qu´ restricciones debe satisfacer e e e (frecuencia de reloj, retardos, tama˜ o, etc.). n A continuaci´n, el dise˜ ador debe crear un dise˜ o de alto nivel del circuito, o n n para lo cual puede emplear un lenguaje para la descripci´n de hardware (HDL), o 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 e programas para testear el dise˜ o de alto nivel, usando para ello una herramienta n de simulaci´n (verificaci´n funcional). En funci´n de los resultados de la simulao o o ci´n de los tests, puede ser preciso modificar el dise˜ o de alto nivel, repiti´ndose o n e los pasos anteriores tantas veces como sea preciso. Una vez el dise˜ o de alto nivel funciona adecuadamente, debe traducirse al n nivel de puertas l´gicas o de transistores. Este proceso se denomina s´ntesis. S´no ı ı tesis es la generaci´n autom´tica del dise˜ o del circuito a partir de la descripci´n o a n o 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 o el circuito. La descripci´n a nivel de puertas o transistores obtenida a partir de una o descripci´n en HDL puede diferir significativamente, dependiendo de la forma en o que se ha programado el modelo en HDL y de la herramienta de s´ ıntesis empleada. Las herramientas de s´ ıntesis proporcionan numerosas opciones que permiten al dise˜ ador especificar c´mo debe realizarse. En particular, permiten especificar el n o nivel de esfuerzo a emplear por la herramienta en la optimizaci´n autom´tica del o a circuito, tanto en lo que respecta a la reducci´n del area del circuito como en lo o ´ que respecta a sus prestaciones. Asimismo, las herramientas de s´ ıntesis permiten especificar qu´ m´dulos del circuito no deben ser optimizados. e o El dise˜ o a nivel de puertas o transistores debe ser vuelto a testear mediante n simulaci´n (verificaci´n de tiempos), usando, si es posible, el mismo conjunto o o de tests que se realizaron sobre el dise˜ o de alto nivel. El objetivo es estudiar n si el dise˜ o se comporta como debe y si satisface todas las restricciones que se n

Cap´ ıtulo 1

Fundamentos

5

Figura 1.1: Ciclo de dise˜o del hardware digital. n

impusieron en la fase de especificaci´n. Si se detecta un problema a este nivel, o debe volverse al correspondiente paso del ciclo de dise˜ o. n Una vez el dise˜ o ha superado estos tests, puede implementarse usando PLD n (Programmable Logic Device), FPGA (Field-Programmable Gate Array), ASIC (Application-Specific Integrated Circuit), etc. Se emplean herramientas software para fabricar (en el caso de los ASIC) o programar (en el caso de los FPGA) el circuito integrado a partir de la netlist. Una vez implementado, el circuito integrado puede ser testado con ayuda de un generador de patrones (para generar los vectores de test) y un analizador l´gico u osciloscopio (para medir las salidas). o

1.3

Propiedades de los circuitos digitales
Los circuitos digitales reales tienen algunas caracter´ ısticas importantes que afectan a la manera en que deben ser modelados y dise˜ ados. Estas caracter´ n ısticas son debidas tanto a los transistores que componen las puertas l´gicas como a las o conexiones entre ellos. Entre las m´s importantes est´n las siguientes. a a

¡  ¢ "£ ¥ # £  © ¨ ¥ ¤ § ¤ ¥ ¦¥ £ ' & © ¨ ¥¤ §  % " ¥$ 

¡ ¥ ¡ © § #  £  ¥ ) §  £ %   £  ¥  §   £ ¡ ¥ 

65 ¤  £ 3 4 0 $  3  2  ( 1 © ¨ ¥ ¤ §  © £ " £  ¢ " 0 

§ © ¥ ¤ © % ( © ¨¥¤ §¤ ¥ ¦¥ £ ' & © ¨ ¥ ¤ § % "¥$ 

 £¡ ¥  £  © ¨ ¥ ¤ § ¤ ¥ ¦ ¥¤ £ ¢¡    £  ¥     £   £¡ ¥   ¢ ¥       £   £ ¡ £ # ¡ £ # £  ¡ § " § !  

6

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

Retardo de los dispositivos
En los sistemas f´ ısicos suelen considerarse dos tipos de retardos: el retardo inercial y el retardo puro o de transporte. Se va a emplear un motor el´ctrico e como ejemplo para ilustrar la diferencia entre ambos tipos de retardo. Cuando se enciende el motor, ´ste empieza a girar y su velocidad aumenta e hasta que alcanza la velocidad final. Este proceso puede llevar varios segundos, siendo debido principalmente este retardo a la inercia del rotor del motor. Si se apaga el motor antes de que ´ste alcance la velocidad final, la velocidad del motor e disminuye inmediatamente. Esto no suceder´ en el caso de un retardo puro. ıa Como ejemplo de retardo puro, consideremos que el motor est´ en una nave a espacial rumbo a J´ piter. Los comandos para encender y apagar el motor se env´ u ıan desde la tierra y tardan 10 minutos en llegar a la nave. Supongamos que se env´ ıa un comando para encender el motor y pasados dos minutos se env´ otro comando ıa para apagarlo. El comando para apagar el motor llegar´ 2 minutos despu´s que el ıa e comando para encenderlo, causando que el motor estuviese encendido durante dos minutos. La se˜ al recibida es exactamente igual que la enviada pero desplazada n 10 minutos en el tiempo. Los retardos puros pueden representarse por simples desplazamientos en el tiempo de la se˜ al, ya que la se˜ al en s´ misma no se n n ı modifica. El retardo inercial es adecuado para modelar los retardos a trav´s de dispoe sitivos tales como los transistores y las puertas l´gicas. Un cambio en la entrada o de un dispositivo se ha de mantener estable durante cierto tiempo para que este valor se propague a su salida. Las puertas act´ an as´ como filtros paso baja. u ı Consideremos un inversor con un retardo de 2 ns. El inversor necesita que la entrada se mantenga estable durante al menos 2 ns para que se produzca un cambio en su salida. Por tanto, un pulso de 1 ns de duraci´n no provoca cambios o en su salida, pero si los provoca un pulso de 5 ns. Si la primera transici´n del pulso o se recibe en el instante 100 ns, la respuesta de la puerta comienza a transmitirse en el instante 102 ns. Por otro lado, el retardo de transporte (o puro) es adecuado para modelar retardos a trav´s de dispositivos con poca inercia, tales como las e l´ ıneas de metal construidas en el chip para conectar los dispositivos.

Ejecución concurrente
Los m´dulos l´gicos se ejecutan concurrentemente. Cuando cambia el valor de o o una se˜ al de entrada a varios m´dulos, todos estos m´dulos deben ser ejecutados n o o concurrentemente. As´ pues, los HDL deben ser capaces de describir de manera ı precisa este comportamiento concurrente y el simulador debe ser capaz de simularlo. La metodolog´ aplicada para ello por el simulador es la simulaci´n de ıa o eventos discretos.

Diseños marginales
Los retardos de los dispositivos dependen de la condiciones de fabricaci´n del chip. o En general, existen variaciones en el valor de los retardos de los chips fabricados

Cap´ ıtulo 1

Fundamentos

7

en diferentes obleas, e incluso existen variaciones entre los chips fabricados en posiciones distantes dentro de una misma oblea. Por este motivo, no es buena idea dise˜ar un circuito cuyo funcionamiento n dependa de que los retardos tomen un determinado valor o que su magnitud sea m´nima. Este tipo de circuitos puede funcionar correctamente cuando son ı simulados, ya que las se˜ ales simuladas llegan a los m´dulos en un determinado n o orden, que viene determinado por los valores de los retardos contenidos en el modelo. Sin embargo, si el orden de llegada de los cambios en las se˜ ales depende n del valor de los retardos, y los retardos simulados no se corresponden con los existentes en el dise˜ o f´ n ısico, entonces ese dise˜ o producir´ chips que no funcionen, n a o que funcionen s´lo una parte del tiempo. o

Fortaleza de las señales
Las se˜ ales de los circuitos digitales reales poseen una determinada “fortaleza”, n que determina en qu´ medida las transiciones en el valor de la se˜ al son abruptas e n (y, por tanto, los retardos debidos a esa se˜ al), y el n´ mero y tipo de entradas a n u m´dulos que pueden ser conectados a esa se˜ al. o n Esta caracter´ ıstica de las se˜ ales, que puede ser modelada en VHDL y en n Verilog, viene determinada por los niveles de tensi´n del ‘0’ y del ‘1’ l´gicos (por o o ejemplo, para un ‘1’ l´gico, en qu´ medida est´ el voltaje de la se˜ al pr´ximo al o e a n o voltaje de la alimentaci´n), y por la cantidad de corriente que puede proporcionar o y aceptar el dispositivo que genera la se˜ al. n En un circuito digital t´ ıpico, la transferencia de un valor l´gico desde un pin o de salida de un m´dulo, a varios pines de entrada de otros m´dulos, precisa de la o o transferencia de carga el´ctrica hacia los pines de entrada (en el caso de ‘1’ l´gico) e o o hacia el pin de salida (en el caso de ‘0’ l´gico). El pin de salida debe tener la o capacidad de hacer de “fuente” y de “sumidero” de toda la corriente necesaria. Desde el punto de vista pr´ctico, esto implica que la salida de un m´dulo a o puede ser conectada como m´ximo a un determinado n´ mero de entradas de a u otros m´dulos. En aquellos casos en que la se˜ al deba conectarse a un n´ mero o n u de m´dulos superior a este n´ mero m´ximo, entonces debe emplearse un arbol de o u a ´ buffers. En la Figura 1.2 se muestra un arbol de buffers que lleva una se˜ al (out) ´ n a 16 m´dulos (in 0, ..., in 15), de tal forma que la salida de los buffers se conecta o unicamente a 4 entradas. ´ El uso del arbol de buffers tiene un beneficio a˜ adido: igualar los retardos ´ n de las se˜ ales de entrada a todos los m´dulos, ya que el arbol de buffers est´ n o ´ a dise˜ ado de modo que la longitud de las l´ n ıneas de todas sus ramas sea la misma. Este tipo de arbol de buffers se emplea para llevar la se˜ al de reloj a los flip-flops ´ n en los circuitos secuenciales s´ ıncronos, en los cuales es importante que la se˜ al de n reloj llegue a todos los flip-flops aproximadamente en el mismo instante.

8

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

´ Figura 1.2: Arbol de buffers para llevar una se˜al a 16 m´dulos. n o

1.4

Simulación de eventos discretos
A la hora de escribir c´digo en cualquier lenguaje para la descripci´n de hardware, o o resulta util saber de qu´ manera se realizar´ la simulaci´n de ese c´digo. La ´ e a o o mayor´ de las herramientas de simulaci´n de HDL emplean una metodolog´ ıa o ıa denominada simulaci´n de eventos discretos. En la simulaci´n de eventos discretos o o se lleva una lista global de eventos ordenados en el tiempo, que se denomina calendario de eventos. Los eventos se representan en el calendario de eventos por el siguiente par de valores: nuevo valor de la se˜ al e instante de tiempo en que n est´ planificado que se realice esta asignaci´n. Los eventos est´n ordenados de a o a menor a mayor instante de ejecuci´n en el calendario. o A continuaci´n se describe el algoritmo de la simulaci´n, que consta de los o o siguientes pasos: Paso 1. En el instante de inicio de la simulaci´n, se activa el evento “Inicio de o la Simulaci´n”. Como parte de las acciones asociadas a la ejecuci´n de este o o evento, se pone el reloj de la simulaci´n a cero y se registran los nuevos o eventos en el calendario de eventos. Paso 2. Se extrae el primer evento del calendario. Paso 3. Se actualiza el reloj de la simulaci´n al instante de ejecuci´n del evento. o o

Cap´ ıtulo 1

Fundamentos

9

Paso 4. Se ejecuta el evento y, si procede, se actualiza el calendario de eventos. Paso 5. Se comprueba si existen m´s eventos en el calendario de eventos. Si a existen m´s eventos se vuelve al paso 1. En caso contrario, se avanza al a paso 6. Paso 6. Fin de la simulaci´n. o El anterior algoritmo de la simulaci´n no describe c´mo se actualiza el cao o lendario de eventos. Los pasos a seguir para actualizar el calendario de eventos dependen del tipo de retardo del evento. Por defecto, se considera que los dispositivos tienen retardo inercial. El tratamiento de un evento sin retardo sobre una se˜ al se reduce al caso de un evento con retardo (ya sea inercial o de trasporte) n haciendo el valor del retardo cero. A continuaci´n se describen los pasos a seguir para actualizar el calendario o de eventos cuando en el nuevo evento sobre la se˜ al existe un retardo inercial. n Vamos a considerar que la se˜ al sobre la que se produce el evento se denomina A, n el nuevo valor de la se˜ al es Anew , el valor del retardo inercial es ret y el instante n actual de simulaci´n es tactual . Para actualizar el calendario de eventos hay que o seguir los siguientes pasos: 1. Se borran aquellos eventos sobre A cuyo instante de ejecuci´n sea igual o o mayor que tactual + ret. 2. Se insertan los nuevos eventos en el calendario de eventos. 3. Todos los antiguos eventos sobre A cuya ejecuci´n est´ planificada que suceo e da en un instante de tiempo comprendido en el intervalo (tactual , tactual + ret) y asignen a A un valor diferente de Anew se borran. Si el evento sobre la se˜ al A tuviese retardo de transporte (que denominamos n rettransp ) en lugar de un retardo inercial habr´ que dar los siguientes pasos para ıa actualizar el calendario de eventos: 1. Se borran todos los eventos sobre A existentes en el calendario de eventos cuyo instante de ejecuci´n sea igual o mayor tactual + rettransp . o 2. Se insertan los nuevos eventos en el calendario de eventos.

Caso práctico
Supongamos que se ha descrito el circuito mostrado en la Figura 1.3 usando un HDL. La puerta NAND tiene un retardo de 1 ns y la puerta OR de 2 ns. Las dos entradas, x1 y x2 , tienen el valor ‘1’ en el instante 0 ns. Las dos siguientes asignaciones describen, respectivamente, el comportamiento de la salida de la puerta NAND (s) y de la puerta OR (y) del circuito digital:

y ← s or x2 con retraso 2 ns

s ← x1 nand x2 con retraso 1 ns

(1.1) (1.2)

10

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

s

Figura 1.3: Circuito ejemplo.

A continuaci´n se describen los pasos en la simulaci´n de dicho circuito: o o Paso 1. En el instante inicial el reloj de la simulaci´n vale 0 ns y se asigna nuevo o valor a las se˜ ales x1 y x2 . Debido a ello, se ejecutan las asignaciones que n tienen en su lado derecho x1 o x2 . En este caso, se ejecutan las asignaciones correspondientes a la puerta NAND (asignaci´n 1.1) y a la puerta OR o (asignaci´n 1.2). Se producen dos nuevos eventos, denominados E0 y E1 : o – El evento E0 , planificado para el instante 1 ns, se debe a la ejecuci´n o de la asignaci´n de la puerta NAND. En este evento se asigna a s el o valor ‘0’. o o – El evento E1 se debe a la ejecuci´n de la asignaci´n de la puerta OR. En este evento se asigna a y el valor ‘1’ en el instante 2 ns. Observa que la asignaci´n y ← x1 or 1 es equivalente a y ← 1 independientemente o del valor de x1 . Si la se˜ al x2 valiese ‘0’ en lugar de ‘1’ el valor de y n ser´ indefinido hasta que s tuviese un valor definido. ıa Adem´s, se incorpora al calendario de eventos un evento, llamado E2 , a programado para el instante 5 ns, y cuya acci´n es: x2 ← 0. Los valores o de las se˜ ales y el calendario de eventos en el instante 0 ns se presentan en n las tablas siguientes: Se˜ al Valor n x1 x2 s y ‘1’ ‘1’ ‘U’ (valor indefinido) ‘U’ (valor indefinido) Calendario de eventos E0 1 ns s ← 0 E1 2 ns y ← 1

E2 5 ns x2 ← 0

Paso 2. El simulador extrae el evento E0 del calendario y lo ejecuta. El valor de la se˜ al s pasa a ser cero y el reloj de la simulaci´n vale 1 ns . El cambio en la n o se˜ al s produce que se ejecute la asignaci´n 1.2 y se genere un nuevo evento n o (E3 ). A continuaci´n se muestran los valores de las se˜ ales y el calendario o n de eventos en el instante 1 ns. Se˜ al Valor n x1 x2 s y ’1’ ’1’ ’0’ ’U’ (valor indefinido) Calendario de eventos E1 2 ns y ← 1 E3 3 ns y ← 1 E2 5 ns x2 ← 0

Cap´ ıtulo 1

Fundamentos

11

Paso 3. El simulador extrae el evento E1 del calendario y lo ejecuta. Entonces, el valor de la se˜ al y pasa a ser uno y el reloj de la simulaci´n vale 2 ns . n o El cambio en la se˜ al y no genera ning´ n evento. Los valores de las se˜ ales n u n y el calendario de eventos en el instante 2 ns se muestran a continuaci´n. o Se˜ al Valor n x1 x2 s y ’1’ ’1’ ’0’ ’1’ Calendario de eventos E3 3 ns y ← 1 E2 5 ns x2 ← 0

Paso 4. El simulador extrae el evento E3 del calendario y lo ejecuta. El reloj de la simulaci´n vale 3 ns y los valores de las se˜ ales y el contenido del o n calendario de eventos son los siguientes: Se˜ al Valor n x1 x2 s y ’1’ ’1’ ’0’ ’1’ Calendario de eventos E2 5 ns x2 ← 0

Paso 5. El simulador extrae el evento E2 del calendario y lo ejecuta. Como consecuencia, el valor de la se˜ al x2 pasa a ser cero y el reloj de la simulaci´n n o vale 5 ns . Como resultado, se ejecutan las asignaciones 1.1 y 1.2 y se generan dos eventos (E4 y E5 ). A continuaci´n se muestran los valores o de las se˜ ales y el calendario de eventos en el instante 5 ns. n Se˜ al Valor n x1 x2 s y ’1’ ’0’ ’0’ ’1’ Calendario de eventos E4 6 ns s ← 1 E5 7 ns y ← 0

Paso 6. El simulador extrae el evento E4 del calendario y lo ejecuta. El valor de la se˜ al s pasa as´ a ser uno y el reloj de la simulaci´n pasa a valer n ı o 6 ns . Cuando esto sucede, se ejecuta la asignaci´n 1.2. El evento E5 se o borra del calendario de eventos ya que E5 y el nuevo evento (E6 ) afectan a la misma se˜ al asign´ndole valores distintos y el lapsus de tiempo entre n a ambos eventos es inferior a 2 ns. Los valores de las se˜ ales y el calendario n de eventos en el instante 6 ns se muestran a continuaci´n. o Se˜ al Valor n x1 x2 s y ’1’ ’0’ ’1’ ’1’ Calendario de eventos E6 8 ns y ← 1

12

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

Figura 1.4: Cronomagrama de las se˜ales x1 , x2 , y y s del circuito ejemplo. n

Paso 7. En el instante 8 ns se ejecuta el evento E6 , que no genera otros eventos. Puesto que el calendario de eventos se encuentra vac´ el simulador finaliza ıo, la ejecuci´n. El cronomagrama de las se˜ ales x1 , x2 , y y s se muestra en la o n Figura 1.4.

1.5

Test de los circuitos
El test juega un papel muy importante en el dise˜ o de circuitos integrados. No s´lo n o se emplea para verificar el correcto funcionamiento del circuito ya completamente dise˜ ado, sino que tambi´n es una ayuda esencial para el dise˜ ador durante la n e n fase de dise˜ o del circuito. n Finalmente, el test se emplea en manufactura, para determinar qu´ chips e han resultado defectuosos o tienen limitadas prestaciones. Por ejemplo, puede emplearse para separar los chips que funcionan correctamente a alta velocidad, de los que s´lo funcionan a baja velocidad (cada tipo es vendido a diferente o precio). Si el dise˜ o se ha realizado correctamente, los chips defectuosos en los n test de manufactura se deben a problemas en los procesos de fabricaci´n o de o encapsulado. El test realizado en manufactura tiene un impacto directo sobre el rendimiento (porcentaje de chips fabricados que no son defectuosos), el cual tiene un impacto directo sobre los beneficios de la compa˜´ fabricante de los chips. nıa 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 e o 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.

Test en manufactura
Un objetivo fundamental del test en manufactura es detectar problemas en el proceso de fabricaci´n. Las causas de mal funcionamiento de los chips m´s com´ no a u mente observadas en la pr´ctica son: a – Abiertos. Conexiones entre los dispositivos que se encuentran abiertas debido a alg´ n problema, por ejemplo, debido a la rotura de la l´ u ınea de metal que establece la conexi´n. o

Cap´ ıtulo 1

Fundamentos

13

– Cortos. Conexiones que se han establecido entre diferentes dispositivos, cuando no deber´ haberse producido. ıan – Acoplos. Valores l´gicos en una parte del circuito que inadvertidamente o cambian el valor l´gico en otra parte del circuito. o Modelar estos diferentes tipos de defectos en el circuito es extremadamente dif´ Por ello, se han desarrollado diferentes modelos simplificados de fallos. ıcil. Uno de estos modelos de fallo es considerar que el defecto de fabricaci´n hace o que una de las conexiones internas del circuito permanezca siempre a 1, o que permanezca siempre a 0. En un circuito t´ ıpico, este tipo de fallos da lugar a un n´ mero muy elevado de u patrones de fallo. Un patr´n de fallo es una determinada selecci´n de conexiones o o que se encuentran permanentemente a 1 y de conexiones que se encuentran permanentemente a 0. Se da la circunstancia de que varios patrones de fallo pueden desembocar en el mismo comportamiento del circuito. Por ejemplo, si cualquiera de las entradas de una puerta NAND se encuentra siempre a 0, el circuito se comporta de la misma manera que si la salida del circuito se encontrara siempre a 1. Incluso tomando en consideraci´n que existen patrones de fallo que dan lugar o a un comportamiento equivalente (defectuoso) del circuito, el n´ mero de patrones u de fallo esencialmente distintos es extremadamente grande. Por ello, se ha desarrollado un modelo simplificado a partir del anterior. Consiste en suponer que en el circuito hay una unica conexi´n que se encuentra ´ o permanentemente a 1, o permanentemente a 0. Aunque este modelo de fallos pudiera considerarse muy restrictivo, ha demostrado ser eficaz. Una vez se adopta un determinado modelo de fallos, el siguiente paso es crear un conjunto de vectores de test que permita detectar ese tipo de fallos. Para que se produzca la detecci´n del fallo, es preciso que la salida del circuito, en caso de o estarse produciendo el fallo, sea diferente de la salida de un circuito que funcione correctamente. En este caso, se dice que el fallo se encuentra cubierto por el vector de test. Por supuesto, habr´ otros tipos de fallos que dar´n lugar, para ese vector a a de test, a las mismas salidas que un circuito que funcione correctamente. Se dice entonces que el vector de test no cubre esos otros fallos. Seg´ n se van usando m´s y m´s vectores de test, el porcentaje de fallos u a a potenciales (para un determinado modelo de fallo) que son cubiertos se aproxima al 100 %. 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 a circuito dependen no s´lo de las entradas, sino tambi´n de su estado. Por tanto, o e en este tipo de circuitos es preciso poder fijar los valores de todos los flip-flops a voluntad. Esto puede hacerse de las dos maneras siguientes: 1. Mediante una secuencia de inicializaci´n (secuencia de valores de las entrao das del circuito), se lleva el circuito al estado deseado. A continuaci´n, se o aplica el vector de test para probar el circuito en ese estado.

14

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

Mediante este procedimiento, un unico test consiste en una secuencia de ´ inicializaci´n, seguida de otro vector de test. Este procedimiento conduce o a usar un gran n´ mero de vectores de test, muchos de los cuales son u simplemente secuencias de inicializaci´n. Adem´s, en algunos casos puede o a no ser posible fijar todos los flip-flops a los valores deseados. 2. El segundo m´todo consiste el usar en el dise˜ o scan flip-flops, que son flipe n 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 scan flip-flops pueden construirse insertando multiplexores en la entrada D de los flip-flops. En el test en manufactura, la calidad de un conjunto de vectores de test (denominado programa de test) se mide por medio de la cobertura de fallos del programa de test (supuesto un determinado modelo de fallo) y del tiempo necesario para aplicar todos los vectores de test al circuito, que es directamente proporcional al n´ mero de vectores de test. u Cuanto mayor sea la cobertura de fallos, menor ser´ el n´ mero de chips a u defectuosos que superar´n con ´xito el proceso de inspecci´n. Cuanto menor sea a e o el n´ mero de vectores de test, menor ser´ el tiempo necesario para ejecutar el u a programa de test, con lo cual podr´n testearse mayor n´ mero de chips por unidad a u de tiempo.

Test funcional
El test funcional se emplea en todas las etapas del proceso de dise˜ o del circuito. n Su objetivo es verificar que el circuito realiza todas las operaciones como debiera. En los dise˜ os grandes, que normalmente se dise˜ an de manera jer´rquica, n n a todos los subcircuitos de bajo nivel deben ser comprobados funcionalmente, usando programas de test espec´ ıficos para cada uno, antes de ser incluidos en los subcircuitos de m´s alto nivel. a Aunque todos los subcircuitos sean comprobados por separado, el subcircuito obtenido de la composici´n de todos ellos debe tambi´n ser comprobado, us´ndose o e a para ello su propio programa de test. A continuaci´n, una vez se implementa el circuito usando alguna plataforma o hardware (ASIC, FPGA, etc.), debe volver a ser testeado de nuevo. Si es posible, debe emplearse para testear el prototipo hardware el mismo conjunto de tests que se ha usado en la fase de simulaci´n. Habitualmente, el primer prototipo hardware o contiene errores. La comparaci´n de los resultados del test, con los resultados de o las simulaciones para esos mismos tests, puede ayudar a identificar errores de dise˜ o y de fabricaci´n. n o

Programas de test funcional
Un m´todo para testear la funcionalidad de un circuito es probar todos los posibles e vectores de entrada. Sin embargo, en algunos circuitos esto no es posible, bien

Cap´ ıtulo 1

Fundamentos

15

porque el n´ mero de posibles vectores es muy grande, o bien porque algunas u combinaciones de valores de las entradas no son v´lidas para ese determinado a circuito. Adem´s, algunas funciones requieren de una determinada secuencia de a vectores de entrada. En conclusi´n, el programa de test es algo que depende del circuito. Sin o embargo, en general se sigue el criterio de probar todos los posibles vectores de entrada, siempre que esto sea posible. Si el n´ mero de posibles vectores de entrada es muy grande (se tardar´ u ıa meses o a˜ os en probarlos todos), existen varios m´todos heur´ n e ısticos que pueden aplicarse para reducir el n´ mero de vectores de entrada. u 1. Puede emplearse el conocimiento sobre el funcionamiento de circuito para descartar aquellos vectores de entrada que no tienen ninguna funci´n en el o circuito, o que nunca ocurrir´n en la pr´ctica. a a 2. El circuito puede dividirse en varios subcircuitos, que son testeados exhaustivamente (usando todas las combinaciones de los vectores de entrada para cada subcircuito). A continuaci´n, el circuito completo puede testaerse o usando un conjunto no exhaustivo de vectores de entrada, simplemente para comprobar que los subcircuitos han sido integrados adecuadamente. 3. Se escoge un conjunto representativo de vectores de entrada, con el fin de ejercitar el circuito bajo condiciones normales de funcionamiento y bajo condiciones extremas. Al testear un circuito, es deseable poder comparar de manera autom´tica las a salidas del circuito con las correspondientes salidas que se obtendr´ si el circuito ıan funcionara correctamente. Esto puede hacerse de varias maneras. 1. Una forma es almacenar en un fichero las salidas de un circuito que funcione correctamente, y compararlas con las salidas obtenidas. 2. Otro procedimiento consiste en calcular la salida esperada del circuito usando un m´todo diferente al empleado en el test, y comparar los resultados. e Cuando no es posible aplicar un m´todo de c´lculo alternativo al del test, e a puede comprobarse si los resultados obtenidos del test son “razonables”. Por ejemplo, si un circuito calcula la media de un conjunto de n´ meros, puede u comprobarse que el resultado obtenido sea mayor o igual que el menor de los n´ meros del conjunto, y menor o igual que el mayor de los n´ meros del u u conjunto.

Banco de pruebas
Muchas herramientas de simulaci´n incluyen men´ s que permiten asignar valores o u a las entradas del circuito. Sin embargo, el uso de este tipo de interfaces gr´ficas a de usuario puede resultar lento y el programa de test desarrollado puede no ser exportable a otras herramientas de simulaci´n. o

16

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

UUT

Figura 1.5: Diagrama de bloques del modelo de un banco de pruebas.

Una alternativa mucho m´s ventajosa consiste en codificar el programa de a test usando un HDL. Es decir, implementar el programa de test en otro m´dulo o de c´digo HDL, que es denominado banco de pruebas. o El banco de pruebas contendr´ el circuito que est´ siendo probado (denomia a nado abreviadamente UUT, del ingl´s “Unit Under Test”) como un subcircuito. e Todas las entradas al UUT ser´n generadas dentro del banco de pruebas, y todas a las salidas del circuito ser´n comprobadas dentro del banco de pruebas. a En resumen, el banco de pruebas debe incluir (v´ase el diagrama de bloques e en la Figura 1.5): – Un subcircuito generador de los vectores de test. – El circuito que est´ siendo probado (UUT). a – Un subcircuito de comprobaci´n de los resultados obtenidos del test. o Como m´dulo de c´digo en HDL, el banco de pruebas es un m´dulo sin o o o entradas ni salidas externas. Puesto que el banco de pruebas normalmente no va a ser sintetizado en un circuito f´ ısico, puede emplearse cualquier instrucci´n o disponible en el HDL para generar los vectores de test y analizar las salidas del UUT, pudi´ndose llegar a crear programas extremadamente complejos. e Finalmente, recalcar que cuando se dise˜ a un circuito digital, es conveniente n dise˜ ar tambi´n su banco de pruebas. Si el circuito se dise˜ a jer´rquicamente, n e n a entonces cada subcircuito debe ser testeado separadamente antes de ser combinado con otros subcircuitos para integrar un circuito de nivel jer´rquico superior. a Asimismo, deber´ desarrollarse un banco de pruebas para este circuito de nivel a superior.

1.6

Dos simuladores de VHDL’93: VeriBest y ModelSim
En este texto se proponen diferentes casos de dise˜ o de circuitos digitales usando n el lenguaje VHDL, que el alumno debe simular en su propio ordenador. Para ello, el alumno debe tener instalado en su ordenador un simulador de VHDL. En esta secci´n se proporcionan algunas indicaciones b´sicas para la instalao a ci´n y manejo de dos simuladores de VHDL’93: VeriBest VHDL y ModelSim PE o

We ` W d ` c e X c b Wd R e ` V e X d ` c a iU T b SX V h g XT ` c X WU R T V U T S R Q

y x x w‚ u € v t u w t

P E D H A 9 I H G C @ F E D C B8 A @ 98 7 y x x wt v t u t sr q p We ` W ` c e ` V X W T ` f e X d ` c V X c b V` a` Y X WU R T V U T S R Q

Cap´ ıtulo 1

Fundamentos

17

Student Edition. Cualquiera de los dos puede emplearse para la simulaci´n de los o modelos planteados en este texto. El simulador VeriBest VHDL fue desarrollado por la compa˜´ VeriBest Inc. nıa Cuando esta compa˜´ pas´ a formar parte de la corporaci´n Mentor Graphics, nıa o o dej´ de darse soporte al simulador VeriBest VHDL, siendo ´ste sustituido por el o e simulador ModelSim. La unica ventaja de VeriBest es que funciona para casi todas las versiones 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 n con limitadas prestaciones. Si ´ste no es el caso, es preferible emplear ModelSim e en lugar de VeriBest. Aparte de estos dos simuladores de VHDL’93, en Internet pueden encontrarse otros. Asimismo, existen versiones gratuitas de herramientas orientadas no s´lo o a la simulaci´n, sino tambi´n a la s´ o e ıntesis, entre las que cabe destacar Quartus II Web Edition, que puede descargarse gratuitamente del sitio web de la compa˜´ nıa Altera Corporation. Se sugiere al alumno que escoja en este punto qu´ entorno de simulaci´n va e o a emplear. Si decide usar VeriBest, la gu´ de instalaci´n y uso del Ap´ndice A ıa o e puede serle util. Por el contrario, si decide usar ModelSim (lo cual recomendamos), ´ encontrar´ la correspondiente gu´ en el Ap´ndice B. a ıa e

Conceptos básicos de VHDL

2

Objetivos. Una vez estudiado el contenido del tema deber´ saber: ıa – Declarar una entidad de dise˜ o en VHDL. n – Declarar los elementos sint´cticos b´sicos de VHDL. a a – Discutir las principales caracter´ ısticas de la asignaci´n concurrente o y las diferencias entre la asignaci´n secuencial y concurrente. o – Definir el comportamiento de un circuito mediante instanciaci´n o y conexi´n de otros circuitos. o – Discutir la utilidad de la parametrizaci´n en la descripci´n de un circuito. o o – Discutir las principales caracter´ ısticas de las se˜ ales, variables y constantes n en VHDL. Usar adecuadamente cada una de ellas. – Tipos de datos b´sicos en VHDL y sus principales atributos. a – Declarar y usar librer´ VHDL y conocer las librer´ m´s com´ nmente usadas. ıas ıas a u – Discutir las principales caracter´ ısticas de los tipos de retardo y modelar los distintos tipos de retardo en VHDL. – Realizar, con “l´piz y papel”, el cronograma de las se˜ ales de un circuito a n conocido el c´digo VHDL del circuito y de su banco de pruebas. o – Declarar procedimientos y funciones y discutir la utilidad de su uso.

VHDL es un lenguaje complejo, con numerosas capacidades y librer´ de funıas ciones. De hecho, aunque es un lenguaje para describir hardware, posee muchas de las capacidades de los lenguajes de programaci´n (tales como C o Fortran), o incluyendo estructuras record, funciones, procedimientos y soporte a bloques de c´digo compilados separadamente. o Pese a lo anterior, para la mayor parte de las aplicaciones de VHDL al modelado y simulaci´n de circuitos digitales, es suficiente con emplear un peque˜ o o n subconjunto de las estructuras y capacidades proporcionadas por el lenguaje. En particular, se ha definido un subconjunto del lenguaje VHDL, denominado VHDL

20

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

synthesis interoperability subset (est´ndar IEEE 1076.6), que contiene los tipos a de datos, operadores y otras capacidades de VHDL que deber´ ser usados para ıan crear c´digo VHDL sintetizable. Esto es, c´digo a partir del cual las herramientas o o de CAD puedan generar autom´ticamente circuitos hardware que funcionen. a Siguiendo estas reglas y centr´ndonos en pr´cticas “simples” para la codifia a caci´n de alto nivel, en este cap´ o ıtulo se introducen los conceptos b´sicos para el a modelado y la simulaci´n empleando VHDL. o

2.1

Definición de la entidad de diseño
Se denomina entidad de dise˜o al bloque constitutivo b´sico para la descripci´n n a o del hardware en VHDL. Consta de las dos partes siguientes: 1. Entity: interfaz con el exterior, en la que se definen los puertos de conexi´n o (se˜ ales de entrada y/o salida) de la entidad de dise˜ o. n n 2. Architecture: define el comportamiento o la estructura de la entidad de dise˜ o. Es decir, c´mo los puertos de salida de la entidad de dise˜ o se n o n relacionan con sus puertos de entrada. A continuaci´n, se explica c´mo se define la entity y la architecture, asi o o como el procedimiento que proporciona VHDL para asociar una entity a una determinada architecture.

2.2

Entity
La entity define la interfaz externa de la entidad de dise˜ o. Incluye: n – El nombre de la entidad de dise˜ o. n – La lista de las se˜ales de salida y de entrada que componen la interfaz n (normalmente se aplica el convenio de escribir primero las salidas y a continuaci´n las entradas). A cada una de estas se˜ ales se le denomina puerto o n (port). Existen tres tipos de puertos: in (entrada), out (salida) e inout (bidireccional). Ejemplo 2.2.1. En la Figura 2.1 se muestra la definici´n de las interfaces de las o puertas l´gicas NOT, XOR y AND. o La palabra reservada entity, seguida del nombre de la interfaz y de las palabras reservadas is port, indica el comienzo de la definici´n de la interfaz. o A continuaci´n, se especifica el nombre de cada uno de los puertos, su direco ci´n (in, out o inout) y su tipo. En el ejemplo mostrado en la Figura 2.1, todos o los puertos son se˜ales del tipo std logic. n Finalmente, las palabras reservadas end entity, seguidas del nombre de la interfaz, indican el final de la definici´n. o

Cap´ ıtulo 2

Conceptos b´sicos de VHDL a

21

x0

y0

x0 x1

y0

x0 x1

y0

entity not is port ( y0 : out std_logic; x0 : in std_logic ); end entity not;

entity xor2 is port ( y0 : out std_logic; x0, x1 : in std_logic ); end entity xor2;

entity and2 is port ( y0 : out std_logic; x0, x1 : in std_logic ); end entity and2;

Figura 2.1: Ejemplos de interfaz (entity) de puertas NOT, XOR y AND.

En VHDL, las palabras reservadas (por ejemplo, entity, is, port, in, out, end) y los nombres definidos por el usuario (por ejemplo, not1, xor2, and2, x0, x1, y) pueden escribirse indistintamente en may´ sculas o en min´ sculas, u u puesto que en VHDL no se diferencia entre los caracteres en may´ scula y en u min´ scula. Por ejemplo, es equivalente escribir entity, ENTITY y EnTiTy, as´ u ı como tambi´n es equivalente escribir not1 y NoT1. e 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, u o con la limitaci´n de que ni pueden aparecer dos guiones bajos seguidos, ni el gui´n o o bajo puede ser el ultimo caracter del nombre. ´

2.3

Architecture
La architecture describe el comportamiento o la estructura de la entidad de dise˜ o. Esta definici´n puede emplear: n o – Una descripci´n estructural, en la cual el componente es descrito mediante o la conexi´n de componentes de m´s bajo nivel. o a – Una descripci´n de su comportamiento, en la que se describe el comportao miento que debe tener el componente. – Una descripci´n mixta de la estructura y del comportamiento, que incluya o componentes de m´s bajo nivel y c´digo describiendo el comportamiento. a o Ejemplo 2.3.1. En la Figura 2.2 se muestran las architecture que describen el comportamiento de las puertas l´gicas NOT, XOR y AND. Las correspondientes o entity son las definidas en la Figura 2.1. En este ejemplo 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. n A grandes rasgos, la definici´n de la architecture tiene la sintaxis siguiente: o
architecture <nombre architecture> of <nombre entity> is <Declaraci´n de se~ales, variables y constantes locales> o n

22

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

x0

y0

x0 x1

y0

x0 x1

y0

architecture not of not is begin y0 <= not x0; end architecture not;

architecture xor2 of xor2 is begin y0 <= x0 xor x1; end architecture xor2;

architecture and2 of and2 is begin y0 <= x0 and x1; end architecture and2;

Figura 2.2: Architecture de las puertas NOT, XOR y AND.

<Declaraci´n de la entity de los componentes> o begin <Instanciaci´n de los componentes> o <Asignaciones concurrentes y bloques process> end architecture <nombre architecture>;

En el area de texto previa a la palabra reservada begin, es donde se declaran ´ las se˜ ales, variables y constantes, todas ellas locales a la definici´n de la archin o tecture, as´ como tambi´n las entity de los componentes usados en la definici´n ı e o de la arquitectura.

2.3.1

Asignaciones concurrentes

Las asignaciones directamente contenidas entre las palabras reservadas begin y end de la architecture se denominan asignaciones concurrentes, debido a que todas ellas se ejecutan de forma concurrente. Es decir, el orden de ejecuci´n o de las sentencias no est´ determinado por el orden en que se han escrito. a El instante de ejecuci´n de una sentencia de asignaci´n concurrente viene o o determinado por los eventos en las se˜ ales a las cuales la sentencia es “sensible”. n Ejemplo 2.3.2. La sentencia de asignaci´n concurrente o
y0 <= not x0;

es ejecutada cada vez que se produce un cambio en el valor de la se˜al x0, n calcul´ndose el nuevo valor de la se˜al y0. En la terminolog´a de VHDL, se dice a n ı que esta sentencia, de la cual se calcula y0, es “sensible” a la se˜al x0. n Ejemplo 2.3.3. Dado el c´digo mostrado a continuaci´n, se producir´ un cambio o o a en la se˜al a cada vez que cambie b, y se producir´ un cambio en la se˜al c cada n a n vez que cambie u o v.
architecture archEjemplo of ... ... begin a <= b; -- Asignaciones concurrentes

Cap´ ıtulo 2

Conceptos b´sicos de VHDL a

23

c <= u and v; ... end archEjemplo;

-- a las se~ales: a, c n

Si dos sentencias de alto nivel (es decir, asignaciones concurrentes) asignan diferentes valores a una misma se˜ al en un determinado instante de tiempo, n entonces la se˜ al toma el valor X. Obs´rvese que en un circuito real una situaci´n n e o de ese tipo podr´ producir un da˜ o en el circuito o resultar en la asignaci´n del ıa n o valor 1 o 0 a la se˜ al de manera impredecible. ´ n

2.3.2

Bloque process

Para describir la operaci´n de un determinado circuito, puede ser preciso emplear o una secuencia de sentencias que se ejecuten en secuencia (es decir, en el orden en que han sido escritas). Para ello se emplea el bloque process. Una secuencia de sentencias contenidas dentro de un bloque process es simulada ejecut´ndolas de a manera secuencial. Por otra parte, los bloques process se ejecuta concurrentemente unos respecto a los otros (s´lo las sentencias dentro de cada bloque process se ejecutan o secuencialmente), al igual que las dem´s sentencias de alto nivel, puesto que un a bloque process constituye una sentencia de alto nivel dentro de la definici´n de o la architecture. Las sentencias interiores a un bloque process se ejecutan repetidamente, desde la primera sentencia del bloque hasta el punto en el cual se alcanza el final del bloque, en un bucle infinito. Para evitar que un bloque process consuma los recursos de CPU, debe: – O bien incluirse sentencias wait dentro del bloque process (esperar hasta que ocurra cierto evento, o hasta que transcurra cierta cantidad de tiempo simulado). – O bien definir la lista de se˜ ales a las cuales el bloque process es “sensible”. n Esta lista se escribe, entre par´ntesis, a continuaci´n de la palabra reservada e o process. En este caso, el bloque process es ejecutado s´lo en el instante o en que una o varias de estas se˜ ales a las que es “sensible” cambia de valor. n Ejemplo 2.3.4. El siguiente c´digo muestra un m´todo est´ndar de modelar un o e a biestable D disparado por el flanco de subida del reloj (clk) y con una entrada reset as´ncrona (reset_n) activada en LOW. Esto significa que cuando la entrada ı de reset pasa de valer ’1’ a valer ’0’, entonces se inicializa el biestable: q <- ’0’, q_n <- ’1’.
--------------------------------------------------- Biestable D con reset as´ncrono activado en LOW ı library IEEE; use IEEE.std_logic_1164.all;

24

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

use IEEE.numeric_std.all; entity flipflop_D is port ( q, q_n : out std_logic; d, clk, reset_n : in std_logic); end entity flipflop_D; architecture flipflop_D of flipflop_D is begin process(reset_n, clk) is begin if reset_n = ’0’ then q <= ’0’; -- Proceso activo cuando cambia -- el valor de reset_n o de clk -- Comprueba reset as´ncrono ı

q_n <= ’1’; elsif rising_edge(clk) then q <= d; q_n <= not d; end if;

-- En el flanco de subida del reloj

end process; end architecture flipflop_D; --------------------------------------------------

2.3.3

Descripción de la estructura

VHDL permite definir circuitos de forma modular y jer´rquica. Es decir, es posible a definir un circuito mediante instanciaci´n y conexi´n de otros circuitos, y a su vez o o usar este nuevo circuito para definir, mediante su conexi´n con otros circuitos, o otro circuito de un nivel jer´rquico superior, y as´ sucesivamente. A esto se a ı denomina realizar una descripci´n modular y jer´rquica del hardware. o a Para describir un circuito mediante la instanciaci´n y conexi´n de subcircuio o tos, es necesario: 1. Escribir la declaraci´n completa de la entity de cada clase de subcircuito. o 2. Instanciar los subcircuitos, asignando un nombre a cada uno de los objetos creados de cada entity. 3. Conectar los subcircuitos. Se hace de la forma siguiente: – Una conexi´n entre subcircuitos se indica usando se˜ ales con nombres o n id´nticos. e – Una conexi´n entre el circuito y un subcircuito se indica “mapeando” o la se˜ al del circuito con el correspondiente puerto del subcircuito. Esta n conexi´n entre se˜ ales puede realizarse mediante: o n · Asociaci´n posicional, es decir, mediante la posici´n en que la o o se˜ al se sit´ a en la lista de par´metros. n u a

Cap´ ıtulo 2

Conceptos b´sicos de VHDL a

25

· Asociaci´n mediante el nombre, tambi´n llamada asignaci´n exo e o pl´cita, en la cual la se˜ al y su puerto asociado son incluidos en la ı n lista de par´metros de la forma a
puerto => se~al n

Ejemplo 2.3.5. En la Figura 2.3 se muestra el diagrama y la implementaci´n de o un multiplexor de 2 se˜ales de 1 bit. Cuando la se˜al de control s0 vale ’0’, la n n se˜al i0 se transmite a la salida d, mientras que cuando s0 vale ’1’ es la se˜al n n i1 la que se transmite a la salida.

Figura 2.3: Multiplexor de 2 se˜ales de 1 bit: a) diagrama; b) implementan ci´n. o

Como puede observarse en la Figura 2.3b, este circuito multiplexor est´ coma 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 n tienen por objeto describir la conexi´n entre los componentes. o A continuaci´n, se muestra la descripci´n de la estructura del circuito en o o lenguaje VHDL. Obs´rvese que al instanciar cada componente, se indica qu´ se˜al e e n debe asociarse a cada uno de sus puertos. Una misma se˜al asociada a diferentes n puertos indica el establecimiento de una conexi´n entre esos puertos. o
----------------------------------------------- MUX 2:1 de 1 bit library IEEE; use IEEE.std_logic_1164.all; entity Mux2_1bit is d : out i0, i1 : in s0 : in end entity Mux2_1bit; port ( std_logic; std_logic; std_logic );

•–

“’ ‘  ‰ ˆ † „‡ …ƒ •” „ƒ

26

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

architecture Mux2_1bit of Mux2_1bit is component not1 is port ( y0 : out std_logic; x0 : in std_logic ); end component not1; component or2 is port ( y0 : out std_logic; x0, x1 : in std_logic ); end component or2; component and2 is port ( y0 : out std_logic; x0, x1 : in std_logic ); end component and2; signal n1, n2, n3 : std_logic; begin Inv_1 And2_1 And2_2 Or2_1 : : : : not1 and2 and2 or2 port port port port map map map map ( ( ( ( x0 x0 x0 x0 => => => => s0, i0, i1, n2, y0 x1 x1 x1 => => => => n1); n1, y0 => n2); s0, y0 => n3); n3, y0 => d);

end architecture Mux2_1bit; ----------------------------------------------

Ejemplo 2.3.6. El circuito multiplexor de dos se˜ales de 1 bit puede emplearse n para dise˜ar un multiplexor de dos se˜ales de 4 bits. En la Figura 2.4 se muestra n n la representaci´n esquem´tica del circuito. El c´digo VHDL que describe este o a o circuito se muestra a continuaci´n. o
----------------------------------------------- MUX 2:1 de 4 bit library IEEE; use IEEE.std_logic_1164.all; entity Mux2_4bit is port ( d0, d1, d2, d3 a0, a1, a2, a3 b0, b1, b2, b3 s0 end entity Mux2_4bit;

: out : in : in : in

std_logic; std_logic; std_logic; std_logic );

architecture Mux2_4bit of Mux2_4bit is

Cap´ ıtulo 2

Conceptos b´sicos de VHDL a

27

a3 b3

i0 i1

a2 b2

i0 i1

a1 b1

i0 i1

a0 b0

i0 i1

Figura 2.4: Multiplexor de 2 se˜ales de 4 bit dise˜ado mediante la conexi´n n n o de 4 multiplexores de 2 se˜ales de 1 bit. n

component Mux2_1bit is d : out std_logic; i0, i1 : in std_logic; std_logic ); s0 : in end component Mux2_1bit; begin Mux2_0 Mux2_1 Mux2_2 port (

: Mux2_1bit port map ( d => d0, i0 => a0, i1 => b0 , s0 => s0 ); : Mux2_1bit port map ( d => d1, i0 => a1, i1 => b1 , s0 => s0 );

: Mux2_1bit port map ( d => d2, i0 => a2, i1 => b2 , s0 => s0 ); Mux2_3 : Mux2_1bit port map ( d => d3, i0 => a3, i1 => b3 , s0 => s0 ); end architecture Mux2_4bit; ----------------------------------------------

— fed ™˜

— fed ™˜

— fed ™˜

— fed ™˜

d s0

d3

d s0

d2

d s0

d1

d s0 s0

d0

28

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

2.3.4

Constantes generic

Una propiedad muy relacionada con la modularidad y la jerarqu´ es la parameıa trizaci´n, que es la capacidad de modificar el valor de ciertas propiedades de un o circuito cuando es instanciado, con el fin de adaptarlo a la aplicaci´n en concreto o a la que vaya a destinarse al formar parte del circuito de nivel jer´rquico superior. a La parametrizaci´n es una propiedad fundamental en la reutilizaci´n del c´digo, o o o ya que permite adaptar un mismo fragmento de c´digo a diferentes usos. o La palabra reservada generic se usa para definir aquellas constantes del dispositivo a las que se desea asignar valor cuando el dispositivo es instanciado, es decir, cuando es usado como un subcircuito de otro circuito de mayor nivel jer´rquico. Ejemplos t´ a ıpicos de constantes gen´ricas son el valor de determinados e retardos, el n´ mero de bits de un bus de se˜ ales, etc. Cuando una entity con u n constante generic es instanciada como un subcircuito, puede cambiarse el valor de las constantes generic para definir diferentes subcircuitos, con diferentes valores de los retardos, anchura de los buses, etc. El caso pr´ctico descrito en a la Secci´n 3.6 ilustra el empleo de constantes generic. o

2.4

Configuration
Se emplea una pareja entity-architecture para describir en VHDL las entidades de dise˜ o (es decir, circuitos y subcircuitos) que pueden ser compilados n separadamente. El hecho de que se definan separadamente la interfaz (entity) y la arquitectura (architecture) facilita la definici´n de varias arquitecturas para una misma o entidad de dise˜ o (con una unica interfaz). Por ejemplo, pueden definirse varias n ´ arquitecturas de una misma entidad de dise˜ o, correspondientes a diferentes n versiones del circuito: velocidad baja, media y alta. En este caso, cuando se emplee esa entidad de dise˜ o debe indicarse expl´ n ıcitamente qu´ arquitectura hay que emplear. Esto puede hacerse mediante la e definici´n de una configuraci´n (configuration). o o

2.5

Señales, variables y constantes
En VHDL se emplean variables, se˜ ales y constantes para describir la operaci´n n o del circuito. Las se˜ ales corresponden con las se˜ ales l´gicas reales existentes en n n o el circuito. Las variables pueden o no corresponder con se˜ ales f´ n ısicas reales. Las constantes corresponden a magnitudes cuyo valor no cambia durante la simulaci´n o (t´ ıpicamente retardos, n´ mero de l´ u ıneas de buses, n´ mero de bits de palabras, u etc.). Las variables siempre deben usarse dentro de bloques process. Aparte de esta restricci´n, pueden ser usadas con relativa libertad. o Por el contrario, hay que ser cuidadoso con el empleo de las se˜ ales. Las n se˜ ales definidas en el port de una entity tienen una direcci´n, lo cual condiciona n o

Cap´ ıtulo 2

Conceptos b´sicos de VHDL a

29

su uso: no puede leerse el valor de una se˜ al de salida (out), ni asignarse un n valor a una se˜ al de entrada (in). Las se˜ ales declaradas en la definici´n de la n n o architecture puede ser usadas tanto en la parte derecha como en la izquierda de las asignaciones. Un criterio general respecto al uso de las variables y las se˜ ales es el siguiente: n – Emplear una variable cuando vaya a usarse s´lo dentro de un bloque proo cess. – Emplear una se˜ al para datos a los que deba asignarse valor fuera del bloque n process, o para datos que necesitan ser transferidos desde un puerto de entrada o a un puerto de salida. Esto ultimo es equivalente a decir que los ´ port s´lo pueden ser se˜ ales. o n Para asignar valor a una variable o constante se emplea :=, mientras que se emplea <= para asignar valor a una se˜ al. S´lo puede asignarse valor a las n o variables en los bloques process. Puede asignarse valor a las se˜ ales mediante n asignaciones concurrentes o en los bloques process. La diferencia fundamental entre una asignaci´n a una se˜ al y una asignaci´n a o n o una variable, ambas realizadas dentro de un bloque process, es que la asignaci´n o a la se˜ al se ejecuta concurrentemente con la siguiente sentencia del bloque n process, mientras que la asignaci´n a la variable se ejecuta antes que la siguiente o sentencia del bloque process. Dos ejemplos t´ ıpicos de uso de las variables son los siguientes: 1. Cuando hace falta realizar una serie de c´lculos para poder asignarle valor a a una se˜ al, se definen nuevas variables, se hacen los c´lculos usando esas n a variables, y finalmente se asigna el resultado de los c´lculos a la se˜ al. a n 2. Puesto que una se˜ al de salida (es decir, un puerto out) no puede ser le´ n ı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 n de salida. Asimismo, existe una diferencia importante en el retraso asociado a una asignaci´n de una variable y de una se˜ al. Este punto es discutido en la Secci´n o n o 2.7. Pueden definirse constantes en VHDL usando la palabra reservada constant. Las sentencias de definici´n de constantes pueden situarse en los bloques entity o y architecture, antes de la palabra reservada begin. Tambi´n pueden definirse e constantes dentro de la definici´n de un paquete (package), en cuyo caso deben o ser incluidas mediante una cl´usula use. a

2.5.1

Tipos de datos

T´ ıpicamente, la informaci´n se comunica dentro de un sistema digital usando o se˜ ales de valor binario (0 o 1). En los sistemas de l´gica positiva, cuando el n ´ o voltaje de la se˜ al tiene un valor “alto” (3.3 o 5 voltios en la tecnolog´ CMOS), n ´ ıa

30

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

representa un 1 l´gico, y cuando toma un valor “bajo” (0 voltios en la tecnolog´ o ıa CMOS) representa un 0 l´gico. o Aunque todas las se˜ ales son interpretadas en los sistemas digitales como 0 y n 1 l´gicos, no es siempre posible modelar y simular los sistemas digitales usando o s´lo se˜ ales 0 l´gico y 1 l´gico. Un motivo es que el valor de algunas se˜ ales o n o o n puede no ser conocido en determinado intervalo de tiempo de la simulaci´n, por o ejemplo porque esas se˜ ales todav´ no hayan sido inicializadas, es decir, no se n ıa les haya asignado valor. Por otra parte, una se˜ al puede tener un nivel de voltaje n intermedio (que puede ser interpretado como un 0 l´gico o un 1 l´gico), por o o ejemplo debido a que est´ producida por una puerta l´gica con una salida “d´bil”. a o e En VHDL se emplean tipos de datos para modelar las se˜ ales. Estos tipos de n datos pueden ser los est´ndar o bien tipos definidos por el usuario. El usuario a puede definir sus propios tipos de datos, bien como un subconjunto de tipos de datos est´ndar, o bien puede definir sus propios tipos enumerados. a Los tipos m´s comunes en el modelado de se˜ ales digitales son bit y std logic. a n A continuaci´n se describen ambos tipos. o

bit y std_logic
Una variable, se˜ al o constante del tipo bit s´lo puede tomar dos valores: 0 y n o 1 (obs´rvese que los valores se escriben sin comillas). As´ pues, este tipo es util e ı ´ para realizar modelos sencillos de sistemas digitales. Las variables, se˜ ales o constantes del tipo std logic pueden tomar nueve n valores. Adem´s de los valores ’0’ y ’1’ (obs´rvese que en este caso los valores se a e escriben entre comillas simples), pueden tomar otros valores usados para modelar valores intermedios o desconocidos de la se˜ al. De estos valores, los m´s comunes n a son los tres siguientes: ’U’ ’X’ El valor de la se˜ al est´ sin inicializar. Es decir, a la n a se˜ al no se le ha asignado todav´ un valor. n ıa No puede determinarse el valor de la se˜ al, quiz´ n a debido a un conflicto en las salidas (por ejemplo, una puerta l´gica intenta poner a ‘0’ la se˜ al mientras otra o n puerta l´gica intenta ponerla a ‘1’). o Alta impedancia, es decir, la se˜ al ha quedado descon nectada.

’Z’

Los restantes posibles valores de una se˜ al del tipo std logic son: ’W’ (desn conocida d´bil), ’L’ (cero d´bil), ’H’ (uno d´bil) y ’-’ (don’t care). e e e Por lo general, en los modelos mostrados en este texto se emplear´ el tipo a std logic para representar las se˜ ales binarias. n

bit_vector y std_logic_vector
Los conjuntos de se˜ ales pueden agruparse formando lo que se denominan buses. n An´logamente, los conjuntos de variables pueden agruparse en vectores. Los a buses y vectores pueden modelarse en VHDL mediante los tipos bit vector (un

Cap´ ıtulo 2

Conceptos b´sicos de VHDL a

31

conjunto de se˜ ales o variables de tipo bit) y std logic vector (un conjunto de n se˜ ales o variables de tipo std logic). n Una desventaja de los tipos de datos bit vector y std logic vector es que no pueden realizarse operaciones aritm´ticas sobre este tipo de se˜ ales. Esto e n es razonable, ya que en los circuitos digitales no pueden realizarse operaciones aritm´ticas directamente sobre los buses de se˜ ales, s´lo pueden realizarse operae n o ciones l´gicas. La forma de representar los valores literales de estos tipos de datos o se muestran en la Tabla 2.1.
Tabla 2.1: Valores literales.

Literales bit 0, 1 std logic ’U’, ’0’, ’1’, ’Z’, ’W’, ’L’, ’H’, ’-’ bit vector Strings (cadenas de caracteres delimitadas por dobles std logic vector comillas) de sus tipos b´sicos. a Para especificar la base, se antepone la letra: B (para d´ ıgitos binarios) O (para d´ ıgitos en octal) X (para d´ ıgitos en hexadecimal) El caracter _ (gui´n bajo) puede usarse como marcador o (es ignorado por el compilador de VHDL) con el fin de facilitar la lectura de los n´ meros. u Por ejemplo, las siguientes son tres formas de expresar el n´ mero sin signo 29: u B"01_1101" O"35" X"1D" integer Sus literales est´n expresados por defecto en base 10. a real Para especificar valores en otras bases, es necesario usar # para delimitar el valor, con la base precediendo el primer #. Las constantes de tipo real se representan usando un punto decimal para separar la parte entera de la parte decimal, y un E (o e) precediendo el valor del exponente. Por ejemplo, a continuaci´n se muestran diferentes foro mas de expresar el n´ mero decimal 29: u 2#01_1101# 8#35# 16#1D# 2.9e1 2.9E1 29

unsigned y signed
En aquellos casos en que resulte util modelar operaciones aritm´ticas realizadas ´ e sobre buses, pueden usarse los tipos de datos unsigned y signed. Ambos tipos de datos est´n definidos usando como tipo de datos base std logic, con lo cual a son vectores de valores std logic. As´ pues, la diferencia entre el tipo de datos std logic vector y los tipos ı de datos unsigned y signed es que para el tipo de datos std logic vector

32

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

est´n definidas las operaciones l´gicas, pero no las aritm´ticas, mientras que para a o e los tipos de datos unsigned y signed est´n definidas las operaciones l´gicas y a o aritm´ticas. e Puede cambiarse el tama˜ o (es decir, el n´ mero de bits) de los datos unsigned n u y signed mediante la funci´n resize. El par´metro size representa el nuevo o a n´ mero de bits del dato. u
Tabla 2.2: Funciones para cambio de tama˜o de unsigned y signed. n

Tipo de dato Funci´n o unsigned resize(arg,size) signed resize(arg,size)

real e integer
Tambi´n existen tipos de datos est´ndar que no se corresponden necesariamente e a con se˜ ales en los circuitos f´ n ısicos. Resultan utiles para realizar descripciones del ´ comportamiento de los circuitos y para modelar los tests. Los tipos de datos integer (32 bits) y real (64 bits) se definen de manera similar a como se hace en los lenguajes de programaci´n. Lo mismo sucede con las operaciones aritm´ticas o e para este tipo de datos. En la Tabla 2.1 se muestra la forma de representar los valores literales de los tipos integer y real.

time y string
Los tipos de datos time y string son utiles, en el proceso de depuraci´n (debug´ o ging) del modelo, para mostrar mensajes que son generados durante la simulaci´n. o 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, a o a sin argumentos), que devuelve el valor actual del tiempo simulado. Para mostrar mensajes de texto y valores de datos en la pantalla, es preciso convertir todos los argumentos de la sentencia report (la sentencia “print” de VHDL) a tipos de dato string. Como en la mayor´ de los lenguajes de prograıa maci´n, un string se define simplemente como un array de caracteres. o

Tipos enumerados
Adem´s de los tipos est´ndar de datos descritos anteriormente, es posible definir a a tipos enumerados de datos. Por ejemplo, supongamos una se˜ al llamada opcode, que representa el c´digo n o de operaci´n de un circuito. Suponiendo que s´lo puede tomar cuatro valores o o

Cap´ ıtulo 2

Conceptos b´sicos de VHDL a

33

(suma, resta, salto y parar), entonces es posible definir un nuevo tipo (type), llamado, por ejemplo, opcode_type, de la manera siguiente: type opcode_type is ( SUMA, RESTA, SALTO, PARAR ); y declarar opcode del tipo opcode_type. Este tipo de construcci´n hace el c´digo VHDL m´s sencillo de entender. Sin o o a 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. o o o Una forma alternativa de programar el ejemplo anterior es definir SUMA, RESTA, SALTO y PARAR como constantes (constant) de dos bits, y definir opcode como una se˜ al que sea un vector de dos bits. n

Conversión entre tipos
El compilador del lenguaje VHDL comprueba el tipo de los datos, mostrando un error si en alguna operaci´n se emplean tipos para los cuales esa operaci´n o o no est´ expl´ a ıcitamente permitida. La finalidad de ello es reducir los errores de programaci´n, si bien tambi´n obliga a realizar conversiones de tipos, incluso o e entre tipos que son esencialmente el mismo (como, por ejemplo, unsigned y std logic vector). Las funciones para la conversi´n de tipos est´n definidas en las librer´ o a ıas est´ndar y packages, t´ a ıpicamente en el package en el que se define el tipo. Por ejemplo, entre las funciones incluidas en el package IEEE.numeric std est´n: a to unsigned Convierte de integer a unsigned Convierte de unsigned a integer to integer Asimismo, la conversi´n entre tipos cercanos puede realizarse usando funcioo nes cuyo nombre coincide con el nombre de los tipos. Por ejemplo, unsigned(t) convierte una se˜ al t del tipo std logic vector al tipo unsigned. n
Tabla 2.3: Funciones para la conversi´n de tipos. o

Conversi´n de: o a: Funci´n o std logic vector unsigned unsigned(arg) std logic vector signed signed(arg) std_logic_vector(arg) unsigned std logic vector signed std logic vector std_logic_vector(arg) integer unsigned to_unsigned(arg,size) integer signed to_signed(arg,size) unsigned integer to_integer(arg) signed integer to_integer(arg) integer std logic vector integer → unsigned/signed → std logic vector std logic vector integer std logic vector → unsigned/signed → integer Obs´rvese en la Tabla 2.3 que en la conversi´n del tipo integer a los tipos e o unsigned o signed, es preciso especificar el n´ mero de bits (size) de la se˜ al u n del tipo unsigned o signed resultante.

34

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

2.5.2

Atributos

Puede considerarse que los atributos son propiedades de los tipos de datos. Existen conjuntos est´ndar de atributos que son soportados para diferentes prop´sitos. a o No todos los atributos son soportados para s´ ıntesis. En la Tabla 2.4 se muestra un conjunto de atributos est´ndar que son soportados por la mayor´ de las a ıa herramientas de s´ ıntesis.
Tabla 2.4: Atributos soportados por la mayor´ de las herramientas de ıa s´ ıntesis.

Atributo

Significado <tipo>’ Indica que el argumento es del tipo <tipo> <tipo>’base Tipo base de <tipo> <tipo>’left Primer (m´s a la izquierda) valor en <tipo> a ´ <tipo>’right Ultimo (m´s a la derecha) valor en <tipo> a <tipo>’low Valor m´s peque˜ o en <tipo> a n <tipo>’high Valor m´s grande en <tipo> a <vector>’range Rango de ´ ındices de un vector <vector>’reverse_range Rango de ´ ındices del vector, en orden inverso <vector>’length N´ mero de valores en el rango del vector u <array>’range(n) Rango de ´ ındices en la dimensi´n n del array o <array>’reverse\_range(n) Rango de ´ ındices, en la dimensi´n n del array, o en orden inverso <array>’length(n) N´ mero de valores en el rango de la dimensi´n u o n del array <se~al>’stable n true mientras no hay cambios en <se~al> n <se~al>’event n true s´lo cuando hay un cambio en <se~al> o n

El primer atributo, <tipo>’, se usa para especificar el tipo de una se˜ al o de n un valor. Por ejemplo,
unsigned’("00")

establece que el string "00" se usa como un vector del tipo unsigned, en lugar de como bit vector o std logic vector. Hay atributos para tipos escalares de datos, para arrays de una dimensi´n o (vectores), para arrays de n dimensiones, y para se˜ ales. En la Tabla 2.4 se ha n empleado la terminolog´ siguiente: ıa un tipo de datos escalar, est´ndar o definido por el usuario. a <vector> un tipo array unidimensional. <array> un tipo array. <se~al> una se˜ al. n n n un valor entero.
<tipo>

Cap´ ıtulo 2

Conceptos b´sicos de VHDL a

35

Asimismo, existen atributos que resultan utiles para programar bancos de ´ prueba y que, por tanto, no necesitan ser sintetizados. Un atributo particularmente util es ´
<tipo>’image(se~al) n

que devuelve un string con el valor del tipo <tipo>de la se˜ al <se˜ al>. Este n n atributo se usa para convertir el valor de una se˜ al a un string, de modo que n pueda ser mostrado en la consola (con el fin de depurar o monitorizar). La lista completa de atributos soportados por VHDL es bastante extensa. No obstante, s´lo son necesarios unos pocos para programar la mayor parte de los o tipos de circuitos digitales y bancos de pruebas. Por ejemplo, en VHDL’87 se emplea
clk’event and ( clk = ’1’ )

para modelar el flanco de subida de la se˜ al de reloj. Sin embargo, puesto que n este predicado es tambi´n cierto cuando la se˜ al clk cambia del valor U (no e n inicializado) o del valor X (desconocido forzado) a 1, en VHDL’93 se usa
rising_edge(clk)

para modelar el flanco de subida de la se˜ al clk. n Otro atributo usado frecuentemente es <tipo>’range el cual se emplea para especificar (por ejemplo, en un bucle for) el rango completo de ´ ındices de un determinado tipo de dato.

2.5.3

Operadores

Los operadores de VHDL’93 est´n resumidos en la Tabla 2.5. a En la Tabla 2.6 se muestra el tipo de dato obtenido al realizar operaciones aritm´ticas entre operandos del tipo unsigned, signed, e integer. e

Tabla 2.5: Operadores de VHDL’93

Operador ** abs not Multiplicaci´n / Divisi´n o o * / mod rem Unitarios (signo) + – Suma / Resta + – & Desplazamiento sll srl sla sra rol ror Relacional = /= < <= > >= L´gico o and or nand nor xor xnor

Categor´ ıa Miscel´neos a

Significado Exponenciaci´n o Valor absoluto NOT l´gico o Multiplicaci´n o Divisi´n o M´dulo o Resto Identidad Negaci´n (complemento a 2) o Suma Resta Concatenaci´n o Desplazamiento l´gico izquierda o Desplazamiento l´gico derecha o Desplazamiento aritm´tico izquierda e Desplazamiento aritm´tico derecha e Rotaci´n l´gica izquierda o o Rotaci´n l´gica derecha o o Comprueba igualdad Comprueba desigualdad Menor que Menor o igual que Mayor que Mayor o igual que AND l´gica o OR l´gica o NAND l´gica o NOR l´gica o OR exclusiva l´gica o NOR exclusiva l´gica o

Tabla 2.6: Tipo obtenido como resultado de las operaciones aritm´ticas. e

Operando 1 Operando 2 Resultado unsigned unsigned unsigned unsigned integer unsigned integer unsigned unsigned signed signed signed signed integer signed integer signed signed

Cap´ ıtulo 2

Conceptos b´sicos de VHDL a

37

2.6

Librerías
En VHDL, una librer´a de dise˜o contiene la definici´n de un conjunto de tipos ı n o de datos, as´ como la definici´n de los operadores y funciones que pueden aplicarse ı o sobre estos tipos de datos. Existe un buen n´ mero de librer´ de dise˜ o est´ndar u ıas n a y de librer´ espec´ ıas ıficas, que son proporcionadas junto con las herramientas de simulaci´n. o A excepci´n de los tipos bit y bit vector, todos los dem´s tipos precisan de o a la inclusi´n de alguna librer´ de dise˜ o. Por ejemplo, es necesario usar la librer´ o ıa n ı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. VHDL permite organizar las librer´ ıas, estructurando su contenido en sublibrer´ denominadas packages. Un beneficio a˜ adido de ello es que incluir ıas n unicamente los tipos de datos necesarios para el dise˜ o reduce el tama˜ o del ´ n n c´digo y simplifica la simulaci´n del programa en VHDL. o o Por este motivo, adem´s de especificar qu´ librer´ deben ser incluidas, a e ıas conviene que el dise˜ ador indique qu´ paquetes en concreto de la librer´ son n e ıa usados en la definici´n del circuito. Si no se especifica el paquete, o si un mismo o objeto est´ definido en varios paquetes, es preciso referirse a ´l usando la notaci´n a e o punto: librer´ ıa.paquete.objeto Entre los paquetes m´s com´ nmente usados, cabe mencionar los siguientes, pera u tenecientes a la librer´ IEEE: ıa IEEE.std logic 1164 Incluye la definici´n de los tipos de datos o std logic y std logic vector, y de las operaciones en las que intervienen estos tipos de datos. Incluye la definici´n de los tipos de datos unsigo ned y signed, y de las operaciones m´s comunes a realizadas sobre estos tipos de datos. Incluye la definici´n de las operaciones en las que o intervienen n´ meros reales (tipo real). Estos son u n´ meros reales en coma flotante de 64 bits seg´ n u u el est´ndar de IEEE. a

IEEE.numeric std

IEEE.math real

As´ pues, es frecuente incluir, antes de la definici´n de la entidad de dise˜ o, ı o n las tres sentencias siguientes:
library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all;

La primera sentencia indica que va a emplearse la librer´ de IEEE. Las otras ıa dos indican que los paquetes IEEE.std logic 1164 y IEEE.numeric std deben estar listos para su uso en el c´digo VHDL que sigue a continuaci´n. Por supuesto, si o o

38

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

en el c´digo no se usan los tipos de datos unsigned y signed, entonces puede o omitirse la tercera sentencia. Las herramientas de simulaci´n y s´ o ıntesis con VHDL suelen incluir otras librer´ que pueden ser examinadas desde la propia herramienta. ıas, Existen librer´ y paquetes que son cargados por defecto, con lo cual no ıas necesitan ser incluidas. Las m´s notables son las dos siguientes: a work Librer´ por defecto donde se compilan todos ıa los tipos, las funciones, entity, architecture, package, etc. definidos por el usuario. Contiene la mayor´ de las definiciones y consıa trucciones est´ndar soportadas por VHDL. a

std

2.7

Modelado del retardo
Puesto que los dispositivos y las conexiones entre los dispositivos tienen retardos asociados, para simular de manera precisa el comportamiento de los circuitos es necesario modelar adecuadamente su retardo. De hecho, hay circuitos que no funcionan adecuadamente cuando son simulados si no se toman en consideraci´n o los retardos que se producen en ellos. Una recomendaci´n cuando se modelan circuitos digitales es asignar alg´ n o u retardo (incluso un retardo arbitrario, como 1 ns) a todas las operaciones al nivel de transferencia entre registros usadas en el c´digo VHDL que describe el o circuito. Obs´rvese, no obstante, que esos retardos no son soportados al realizar la e s´ ıntesis: algunas herramientas de s´ ıntesis simplemente los ignoran, mientras que otras obligan al dise˜ ador a poner esos retardos a cero o a eliminarlos del c´digo. n o Los retardos pueden ser modelados mediante varios m´todos. A continuaci´n e o se describen algunos de ellos.

2.7.1

Sentencia wait

El m´todo m´s sencillo de modelar un retardo es emplear la sentencia wait, e a indicando el n´ mero de unidades de tiempo que debe durar la espera. Por ejemplo, u la sentencia:
wait for 10 ns;

dentro de un bloque process, hace que la ejecuci´n del bloque se detenga durante o 10 nanosegundos. Pueden usarse otras formas de la sentencia wait. Por ejemplo, la sentencia:
wait;

dentro de un bloque process, hace que ´ste se quede esperando indefinidamente, e con lo cual se detiene la ejecuci´n del bloque. o

Cap´ ıtulo 2

Conceptos b´sicos de VHDL a

39

Asimismo, las construcciones:
wait until <condici´n>; o wait until <lista de se~ales>; n

dentro de un bloque process, detienen la ejecuci´n del bloque hasta que la o condici´n booleana se haga verdadera, o hasta que alguna de las se˜ ales de la o n lista cambie de valor, respectivamente. Si la sentencia:
wait until <lista de se~ales>; n

es la primera sentencia de un bloque process (esta en concreto es la unica forma ´ de uso de la sentencia wait permitida para s´ ıntesis), entonces es equivalente a n n usar <lista de se~ales> como la lista de se˜ ales a las que el bloque process es sensible.

2.7.2

Retardos en la asignación a señales

Pueden especificarse retardos en las asignaciones a se˜ ales usando la palabra n reservada after. Por ejemplo, puede modelarse el comportamiento de una puerta NAND con un retardo de propagaci´n de 2 ns mediante la sentencia: o
y <= x0 nand x1 after 2 ns;

Cuando se encuentra esta sentencia en la simulaci´n, se emplean los valores o actuales de x0 y x1 para calcular el resultado de la operaci´n x0 nand x1. Este o resultado no se asigna a y hasta transcurridos 2 ns. Sin embargo, esto no implica que la siguiente sentencia no sea ejecutada hasta que transcurran los 2 ns. Al contrario, la siguiente sentencia es ejecutada inmediatamente, aun cuando estas sentencias sean parte de un bloque process. As´ pues, el cambio en la se˜ al y no habr´ ocurrido en el instante en el cual se ı n a ejecute la siguiente sentencia. Para especificar que la simulaci´n se detenga durante un periodo de tiempo o antes de que la siguiente sentencia sea ejecutada, debe usarse el comando wait.

2.7.3

Retardo inercial y de transporte

Cuando se realiza una descripci´n jer´rquica del circuito, cobran importancia los o a conceptos de retardo inercial y retardo de transporte. Un dispositivo l´gico real tiene la propiedad de que un glitch en un puerto o de entrada, con una duraci´n inferior al retardo de propagaci´n del dispositivo, o o no tiene efecto sobre la salida del dispositivo. Se denomina glitch a un cambio temporal (un pico de subida o bajada) e inesperado en el voltaje. Por ejemplo, si una puerta NAND tiene un retardo de propagaci´n de 1 ns, o entonces un glitch de 0.5 ns (un 0 o 1 temporal, de duraci´n 0.5 ns) en una de ´ o sus entradas no produce ning´ n cambio en su salida. u

40

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

Este tipo de comportamiento del retardo se denomina retardo inercial y es el modelo del retardo usado por defecto para todos los dispositivos en VHDL. 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. Este tipo de comportamiento se modela usando la palabra clave transport tras el operador de asignaci´n (<=). o El modo recomendado de modelar el retardo en el c´digo VHDL sintetizable o es el retardo inercial.

2.7.4

Retardo delta

Es importante tener en cuenta que todas las operaciones que involucran se˜ ales n poseen un retardo, dado que todas las se˜ ales en los circuitos f´ n ısicos experimentan retardos cuando pasan a trav´s de los dispositivos y las conexiones. e En vista de ello, aunque no se especifique de manera expl´ ıcita en el c´digo o VHDL el retardo, todas las se˜ ales son simuladas someti´ndolas a un retardo en n e cada operaci´n de asignaci´n o instanciaci´n de un subcircuito. o o o As´ pues, cuando se ejecuta una sentencia en la que se asigna un nuevo ı valor a una se˜ al, se aplica por defecto un retardo de valor delta. Es decir, un n retardo infinitesimal, inferior al incremento de tiempo m´s peque˜ o que puede a n ser especificado en VHDL, que es un femtosegundo (1 fs = 10−15 s). Como consecuencia de este m´todo de retardo delta empleado en la simulae ci´n, cuando se asigna un valor a una se˜ al en VHDL, hay dos eventos de inter´s: o n e 1. Se calcula el nuevo valor y se planifica el cambio en la se˜ al. n 2. Transcurrido un tiempo delta, se asigna a la se˜ al su nuevo valor. n Este comportamiento no tiene un efecto apreciable para las sentencias de asignaci´n que est´n fuera de bloques process, que en cualquier caso se ejecutan o a concurrentemente. Sin embargo, tiene un efecto importante en las asignaciones a se˜ ales que n est´n dentro de bloques process: a 1. Se planifica el cambio en la se˜ al antes de que se ejecute la siguiente n sentencia. 2. El cambio en el valor de la se˜ al debido a la primera sentencia ocurre despu´s n e de que se haya planificado el cambio debido a la siguiente sentencia, para lo cual se usan los valores de las se˜ ales en el instante actual. n As´ pues, una cadena de asignaciones a se˜ ales contenida en un bloque proı n cess se comporta de manera diferente a un conjunto de sentencias en un lenguaje de programaci´n. Por ejemplo, suponga el siguiente fragmento de c´digo VHDL: o o
process (clk) is begin if rising_edge(clk) then b <= a;

Cap´ ıtulo 2

Conceptos b´sicos de VHDL a

41

c <= b; ...

Puesto que b y c son se˜ ales, existe un retardo delta antes de que se produzca n la asignaci´n del nuevo valor a b. Antes de que transcurra este retardo, se calcula o el nuevo valor de la variable c, us´ndose para ello el valor “antiguo” de b. En este a ejemplo, la se˜ al c adquiere el valor que ten´ la se˜ al b en el anterior ciclo de n ıa n reloj, dado que el proceso es activado unicamente en los flancos de subida de la ´ se˜ al de reloj. n La discusi´n anterior acerca del retardo delta no aplica a las asignaciones a o variables. De hecho, ni siquiera es posible asociar un retardo a una asignaci´n o a una variable (no pueden usarse sentencias de la forma a := b after c ns;). Las asignaciones a variables ocurren inmediatamente, sin retardos delta, lo cual es razonable considerando que las variables en VHDL est´n ideadas para ser usadas a como las variables de los programas de los lenguajes de programaci´n. o As´ pues, dada una cadena de asignaciones a variables contenida dentro de ı un bloque process, estas asignaciones a variables se realizan de manera estrictamente secuencial (de la misma forma que se ejecutan las sentencias en C o en Fortran).

2.7.5

Caso práctico

El modelo mostrado a continuaci´n pretende ilustrar los conceptos relacionados o con el retardo expuestos en esta secci´n, as´ como la diferencia entre las se˜ ales o ı n y las variables en lo que respecta al retardo. En primer lugar, se muestra el c´digo de una puerta NAND con un retardo o inercial del 2 ns, y a continuaci´n el c´digo del banco de pruebas. o o

-------------------------------------- Puerta NAND con retardo inercial library IEEE; use IEEE.std_logic_1164.all; entity nand2 is port ( y0 : out std_logic; x0, x1 : in std_logic); end entity nand2; architecture nand2 of nand2 is begin y0 <= x0 nand x1 after 2 ns; -- Retardo inercial de 2 ns end architecture nand2; -------------------------------------

42

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

-------------------------------------------- Banco de pruebas de diferentes retardos library IEEE; use IEEE.std_logic_1164.all; entity retardo_bp is end entity retardo_bp; architecture retardo_bp of retardo_bp is signal s1, s2, s3, s4 : std_logic; signal in1, in2 : std_logic; component nand2 is port ( y0 : out std_logic; x0, x1 : in std_logic); end component nand2; begin -- Crear el UUT para el test g0 : component nand2 port map (s1, in1, in2); s2 <= in1 nand in2 after 2 ns; -- Misma forma de onda que s1 process is variable var1, var2 : std_logic; begin for i in 0 to 4 loop -- Itera 5 veces var1 var2 s3 s4 := in1 nand in2; := var1; -- var2 debe ser igual a var1 <= in1 nand in2; <= s3; -- s4 debe ser igual al valor -- antiguo de s3

wait for 10 ns; -- Repetir para 0, 10, 20, 30 y 40 ns end loop; wait; -- Detiene el proceso end process; -- Crear los vectores de test in1 <= ’1’; in2 <= ’0’, ’1’ after 10 ns, ’0’ after 11 ns, ’1’ after 20 ns, ’0’ after 22 ns, ’1’ after 26 ns, ’0’ after 29 ns; end architecture retardo_bp; -------------------------------------------

-- in2 comienza a 0 -- Pulso de 1 ns -- en el instante 10 ns -- Pulso de 2 ns -- en el instante 20 ns -- Pulso en el instante 26 ns

Cap´ ıtulo 2

Conceptos b´sicos de VHDL a

43

Las formas de onda obtenidas de la simulaci´n se muestran en la Figura 2.5. o La se˜ al in2 comienza con el valor 0 y tiene pulsos en los instantes 10, 20 y 26 n ns. Sin embargo, el pulso en el instante 10 ns es m´s corto que el retardo de a propagaci´n de la puerta NAND y de la asignaci´n a la se˜ al s2. Por ello, las o o n se˜ ales s1 y s2 ignoran ese pulso. n

Figura 2.5: Formas de onda obtenidas de simular el banco de pruebas.

Debido al retardo de 2 ns, el valor de las se˜ ales s1 y s2 no est´ definido n a hasta el instante 2 ns. Por ello, estas se˜ ales inicialmente tienen el valor U. n Inicialmente, la se˜ al s3 est´ indefinida. Toma el valor 0 en el instante 10 + ∆ n a ns, puesto que in1 e in2 valen 1 en el instante 10 ns. Finalmente, cambia al valor 1 en el instante 30 + ∆ ns. La se˜ al s4 va un ciclo retrasada respecto a s3. n La variable var1 toma los mismos valores que s3, excepto que la variable var1 no tiene el retardo delta (∆) de la variable s3. La variable var2 toma los mismos valores que la variable var1.

2.8

Assert
La sentencia assert se usa para hacer comprobaciones de condiciones l´gicas que, o dado el valor esperado en ese punto del estado del programa, deber´ valer true. ıan Se emplea frecuentemente para depurar el c´digo. Su sintaxis es: o
assert <condici´n_booleana> o report <string> severity <valor>;

Mientras la condici´n booleana es true, la sentencia no realiza ninguna acci´n. o o Cuando la condici´n se hace false, la sentencia muestra el texto <string> en la o consola. La clausula severity se usa para indicar qu´ gravedad tiene la violaci´n de e o la condici´n booleana. Posibles valores de <valor> son: o
note warning error failure

No es un error. Aviso. Error. Error severo que hace que termine la simulaci´n. o

44

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

2.9

Procedimientos y funciones
Dos construcciones que pueden ser utiles en la descripci´n de las arquitecturas ´ o son los procedimientos (bloques procedure) y las funciones (function), ya que contribuyen a hacer el c´digo VHDL m´s legible, portable y compacto. o a Las funciones son usadas como operadores en las sentencias de asignaci´n, o mientras que los procedimientos son usandos de forma m´s general, para describir a tareas que deben ejecutarse concurrentemente o tareas contenidas en bloques process. Las funciones y los procedimientos deben ser definidos dentro de la secci´n o de declaraci´n de una architecture o de un bloque process. Es decir, tras la o sentencia architecture o process y antes del begin de esa arquitectura o bloque process. Los bloques procedure permiten a los dise˜ adores manejar peque˜ os fragn n mentos de c´digo reutilizable. Algunas de sus caracter´ o ısticas m´s destacables son a las siguientes: – Desde dentro de un procedimiento se puede acceder a todas las se˜ ales, n variables y constantes del bloque desde el que es llamado el procedimiento. – Pueden pasarse argumentos (variables o se˜ ales) al procedimiento, que n pueden ser in, out e inout. · Puede modificarse en el procedimiento el valor de los argumentos declarados como out o inout, pero no el valor de los argumentos declarados como in. · Puede leerse en el procedimiento el valor de los argumentos declarados como in o inout, pero no puede leerse dentro del procedimiento el valor de los argumentos declarados como out. · Si no se especifica la direcci´n de un argumento del procedimiento, se o asume por defecto que es in. · Un argumento out o inout es por defecto una variable, a menos que se indique expl´ ıcitamente que es una se˜ al. n · Se considera que un argumento in es una constante dentro del bloque del procedimiento. No obstante, si el argumento in es una se˜ al, entonn ces los cambios que se produzcan en la se˜ al fuera del procedimiento se n producir´n igualmente en el valor de la se˜ al dentro del procedimiento. a n – Dentro de un procedimiento pueden definirse variables locales, a las que no se puede acceder desde fuera del procedimiento. – A excepci´n del uso de las variables locales, el efecto de usar un proceo dimiento es equivalente a reemplazar la llamada al procedimiento por el c´digo del procedimiento. o Las dos diferencias fundamentales entre los procedimientos y las funciones en VHDL son las siguientes:

Cap´ ıtulo 2

Conceptos b´sicos de VHDL a

45

– La funci´n debe devolver un valor al c´digo que la llama. o o – Los argumentos de la funci´n deben ser de tipo in, con lo cual no es necesario o especificar su direcci´n. o El caso pr´ctico descrito en la Secci´n 3.4 ilustra el empleo de procedimientos a o y funciones.

Casos prácticos de diseño de circuitos combinacionales

3

Objetivos. Una vez estudiado el contenido del tema deber´ saber: ıa – Dise˜ ar circuitos l´gicos combinacionales empleando VHDL, tales como funn o ciones l´gicas, multiplexores, sumadores y restadores binarios, buses, ALUs, o conversores de c´digo y decodificadores, describiendo el comportamiento y/o o la estructura del circuito. – Dise˜ ar y simular bancos de pruebas para circuitos combinacionales. n

3.1

Síntesis de lógica combinacional
Cuando el objetivo de la descripci´n del circuito mediante VHDL es la s´ o ıntesis, es util saber c´mo escribir c´digo VHDL para crear determinadas estructuras ´ o o circuitales. El comportamiento y las salidas de un bloque l´gico combinacional dependen o unicamente del valor actual de las entradas. No dependen del valor pasado de las ´ entradas, ni tampoco del estado. As´ pues, el c´digo VHDL que describe un circuito combinacional no deı o be tener “historia”, ni tampoco debe describir dependencia respecto al estado. Tambi´n, debe evitarse incluir retardos temporales en la descripci´n VHDL del e o circuito, ya que los retardos del circuito real ser´n dependientes del hardware en a particular que se emplee para implementar el circuito. Existen varios m´todos para describir circuitos combinacionales en VHDL. e De hecho, el mismo tipo de circuito puede ser descrito empleando diferentes sentencias VHDL. Por ejemplo, un multiplexor 2:1 puede definirse indicando su estructura (conexi´n de las correspondientes puertas l´gicas) o describiendo su o o

48

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

comportamiento, mediante una sentencia concurrente de asignaci´n a una se˜ al, o n tal como:
out <= in1 when (sel=’1’) else in0;

A continuaci´n, se describe un m´todo para la descripci´n de circuitos combio e o nacionales que es sencillo de entender, aplicable de manera general y ampliamente usado.

3.1.1

Empleo de sentencias concurrentes

Los circuitos l´gicos combinacionales pueden ser descritos empleando sentencias o concurrentes de asignaci´n a se˜ ales. Este tipo de sentencias modelan de manera o n correcta el comportamiento de los dispositivos combinacionales, que est´n activos a durante todo el tiempo de manera concurrente. – En la parte izquierda de una sentencia de asignaci´n concurrente debe o aparecer, o bien una se˜ al local de la architecture, o bien una se˜ al de la n n interfaz (definida en la entity) del tipo out o inout. – En la parte derecha de la asignaci´n concurrente pueden aparecer se˜ ales o n locales de la architecture y tambi´n se˜ ales de la interfaz, del tipo in o e n inout. Las herramientas de s´ ıntesis pueden sintetizar las puertas l´gicas simples a o partir de las operaciones l´gicas primitivas de VHDL. A continuaci´n, se muestran o o dos ejemplos: Puerta NAND Puerta OR-exclusiva
nand_out <= i0 nand i1; xor_out <= i0 xor i1;

Tambi´n, pueden sintetizarse arrays de puertas l´gicas a partir de este mise o mo tipo de sentencias. Por ejemplo, la siguiente sentencia describe un array de inversores: Array de inversores
inv_vec <= not i0_vec; donde inv_vec e i0_vec son std logic vector.

El que la herramienta de s´ ıntesis cree una unica puerta l´gica o un array de ´ o puertas l´gicas, depende del tipo de se˜ ales usadas en la sentencia de asignaci´n o n o concurrente. Por ejemplo, las siguientes sentencias dan lugar a un buffer triestado y a un array de buffers triestado, respectivamente. Buffer triestado Array de buffers triestado
tri_out <= i0 when (sel=’1’) else ’Z’; else (others => ’Z’); donde tri_vec e i0_vec son std logic vector.

tri_vec <= i0_vec when (sel=’1’)

Es posible sintetizar multiplexores y decodificadores que est´n descritos mea diante sentencias condicionales del tipo siguiente:

Cap´ ıtulo 3

Casos pr´cticos de dise˜o de circuitos combinacionales a n

49

Decodificador 2:4

dec_vec <= else else else

"0001" when (sel_vec = "00") "0010" when (sel_vec = "01") "0100" when (sel_vec = "10") "1000";

y tambi´n es posible emplear sentencias with, por ejemplo: e Multiplexor 4:1
with sel_vec select mux41_out <= i0 when "00", i1 when "01", i2 when "10", i3 when others;

De hecho, es preferible usar cl´usulas with para describir multiplexores y a decodificadores, ya que el empleo de cl´usulas condicionales puede dar lugar a a la s´ ıntesis de circuitos innecesariamente complejos. Esto es debido a que las condiciones de las cl´usulas condicionales en general no tienen que ser excluyentes a entre s´ cosa que s´ sucede siempre con las condiciones de las cl´usulas with. ı, ı a Es posible tambi´n realizar una descripci´n del circuito basada unicamente e o ´ en la operaci´n que se desea que realice. Por ejemplo: o Multiplexor 4:1
mux41_out <= i0_vec( TO_INTEGER(unsigned(sel_vec)) ); donde i0_vec y sel_vec son std logic vector.

donde se emplean las funciones de conversi´n de tipo TO INTEGER y unsigo ned, que est´n definidas en el package IEEE.numeric std. a Finalmente, los circuitos que realizan operaciones aritm´ticas pueden ser dese critos aplicando las correspondientes operaciones aritm´ticas a los tipos de datos e adecuados. Por ejemplo, los operandos std logic vector deben ser convertidos a unsigned antes de emplear los operandos suma o multiplicaci´n. Por ejemplo: o Sumador Multiplicador
add_uvec <= unsigned(i0_vec) + i1_uvec; donde i1_uvec y add_uvec son unsigned. mult_uvec <= unsigned(i0_vec) * i1_uvec; donde i1_uvec y mult_uvec son unsigned.

Sin embargo, este tipo de descripci´n da lugar a la s´ o ıntesis de los tipos est´ndar a de circuitos aritm´ticos. Dependiendo de la opci´n seleccionada en la s´ e o ıntesis, las unidades aritm´ticas sintetizadas pueden ser circuitos lentos que usan un n´ mero e u peque˜ o de puertas l´gicas (si se escoge la opci´n “optimizar el area”) o bien n o o ´ circuitos r´pidos que utilizan gran n´ mero de puertas l´gicas (se se escoge la a u o opci´n “optimizar la velocidad”). o Para crear tipos espec´ ıficos de unidades aritm´ticas, tales como tipos especiae les de sumadores o multiplicadores r´pidos, puede ser necesario describirlos o bien a indicando su estructura, o bien mediante una descripci´n de su comportamiento o a m´s bajo nivel, tal como se explica a continuaci´n. a o

50

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

3.1.2

Empleo de bloques process

Aunque las sentencias concurrentes de asignaci´n a se˜ al son utiles para crear o n ´ estructuras combinacionales simples, es necesario disponer de otro m´todo para e crear circuitos m´s complejos. En concreto, cierto n´ mero de cl´usulas de VHDL a u a (tales como if, case, for, etc.) s´lo pueden ser usadas dentro de bloques process. o Los bloques process pueden ser usados para describir l´gica combinacional. o Para que el circuito resultante de la s´ ıntesis sea combinacional, deben respetarse las siguientes reglas: 1. Todas las entradas del circuito deben estar incluidas en la lista de se˜ ales n a las que es sensible el bloque process. 2. Ninguna otra se˜ al debe estar incluida en dicha lista. n 3. Ninguna de las sentencias internas al bloque process debe ser sensible al flanco de subida o de bajada de ninguna se˜ al. n A continuaci´n, se muestran varios ejemplos sencillos de dise˜ o de circuitos o n combinacionales, empleando tanto sentencias concurrentes como bloques process.

3.2

Funciones lógicas
En esta secci´n se describe el modelado de dos funciones l´gicas y de su banco o o de pruebas. Las dos funciones l´gicas (F y G), que dependen de 3 variables (a, b o y c), son las siguientes:
F = a and b or not c G = a and b or not b and c

3.2.1

Modelado de las funciones lógicas

A continuaci´n se muestra el c´digo VHDL que describe las funciones l´gicas. o o o Obs´rvese que el orden en el cual deben realizarse las operaciones booleanas e debe indicarse expl´ ıcitamente mediante par´ntesis en el c´digo VHDL (en caso e o contrario se obtiene error). Es decir, las funciones l´gicas deben escribirse de la o forma siguiente:
F = ( a and b ) or not c G = ( a and b ) or ( not b and c )

--------------------------------------- Funciones l´gicas: o -F = ab + c’ -G = ab + b’c

Cap´ ıtulo 3

Casos pr´cticos de dise˜o de circuitos combinacionales a n

51

library IEEE; use IEEE.std_logic_1164.all; entity funcLog_F_G is port ( F, G : out std_logic; a, b, c : in std_logic ); end entity funcLog_F_G; architecture funcLog_F_G of funcLog_F_G is begin F <= (a and b) or not c; G <= (a and b) or (not b and c); end architecture funcLog_F_G; --------------------------------------

La interfaz externa del circuito que implementa las funciones l´gicas es deso crita 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, c). Todos los puertos son del tipo std logic ya que representan se˜ ales transmitidas por el cableado n de los circuitos. La definici´n de la architecture comienza especificando el nombre de la o entity. En este caso, se ha dado el mismo nombre a la entity y a la architecture. En general se les puede dar nombres diferentes. En el cuerpo de la architecture (es decir, a continuaci´n de la palabra o reservada begin) se describe c´mo se calculan los puertos de salida a partir de o los puertos de entrada.

3.2.2

Programación del banco de pruebas

Una vez modelado el circuito, debe programarse su banco de pruebas. Puesto que el banco de pruebas no va a ser sintetizado, puede emplearse para su programaci´n cualquier instrucci´n VHDL disponible (incluso aquellas que dar´ lugar o o ıan a circuitos no sintetizables). Instrucciones utiles de este tipo son wait, assert y ´ report, que permiten controlar el progreso de la simulaci´n, comprobar y mostrar o sus resultados. En este caso, la finalidad del banco de pruebas es unicamente generar las ´ 23 posibles entradas al circuito. Normalmente, los propios programas de test contienen los algoritmos necesarios para determinar si las salidas del circuito son las esperadas y muestran los correspondientes mensajes en aquellos casos en que no lo sean. Por simplicidad, en este caso esta labor la asume el dise˜ ador. n Es decir, observando las se˜ ales de salida del circuito y comparando con la tabla n de la verdad de las funciones l´gicas, el dise˜ ador determina si el funcionamiento o n del circuito es el esperado. Como programa VHDL, el banco de pruebas es un tipo especial de pareja entity-architecture, que no tiene ni entradas ni salidas externas. Por este motivo, la entity del banco de pruebas no contiene ning´ n puerto. u

52

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

Internamente, el banco de pruebas tiene conexiones al UUT. Se han definido se˜ ales internas al banco de pruebas para todas las conexiones al UUT: n
signal y0, y1 : std_logic; -- Conectar salidas UUT signal x0, x1, x2 : std_logic; -- Conectar entradas UUT

La conexi´n del UUT en el banco de pruebas se realiza instanciando el UUT o como un subcircuito dentro del banco de pruebas. En este caso, la conexi´n se o realiza nombrando expl´ ıcitamente los puertos:
uut : component funcLog_F_G port map ( F => y0, G => y1, a => x0, b => x1, c => x2 );

Obs´rvese que la se˜ al y su puerto asociado son incluidos en la lista de e n par´metros de la forma siguiente: a
puerto => se~al n

La architecture del banco de pruebas contiene un proceso (bloque process) en el cual se generan los vectores de test y se introducen como entradas del UUT. A continuaci´n, se muestra el c´digo VHDL del banco de pruebas. o o

--------------------------------------- Banco de pruebas library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; entity bp_funcLog_F_G is end entity bp_funcLog_F_G; architecture bp_funcLog_F_G of bp_funcLog_F_G is signal y0, y1 : std_logic; -- Conectar salidas UUT signal x0, x1, x2 : std_logic; -- Conectar entradas UUT component funcLog_F_G is port ( F, G : out std_logic; a, b, c : in std_logic); end component funcLog_F_G; begin -- Instanciar y conectar UUT uut : component funcLog_F_G port map ( F => y0, G => y1, a => x0, b => x1, c => x2 ); gen_vec_test : process

Cap´ ıtulo 3

Casos pr´cticos de dise˜o de circuitos combinacionales a n

53

variable test_in begin test_in := B"000";

: unsigned (2 downto 0); -- Vector de test

for count in 0 to 7 loop x2 <= test_in(2); x1 <= test_in(1); x0 <= test_in(0); wait for 10 ns; test_in := test_in + 1; end loop; wait; end process gen_vec_test; end architecture bp_funcLog_F_G; --------------------------------------

El bloque process se emplea para encapsular una secuencia de sentencias que ser´n ejecutadas secuencialmente. En el c´digo del banco de pruebas, el bloque a o process tiene la estructura siguiente:
gen_vec_test : process variable ... begin ... end process gen_vec_test;

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. o Una variable (variable) es conceptualmente diferente a una se˜ al (signal), n puesto que la variable puede no corresponder con una se˜ al f´ n ısica. La variable simplemente se usa como ayuda en la descripci´n de la operaci´n del circuito. La o o asignaci´n a una variable se representa mediante :=, mientras que la asignaci´n o o a una se˜ al se representa mediante <=. n En el c´digo del banco de pruebas, la variable test_in se usa para almacenar o 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. Observa que la variable test_in se ha declarado de tipo unsigned ya que se emplea para realizar operaciones aritm´ticas. e La longitud del vector se especifica por el rango (2 downto 0). El primer n´ mero u del rango (2) indica el ´ ındice del bit m´s significativo del vector, y el segundo a n´ mero del rango (0) indica el ´ u ındice del bit menos significativo del vector. La sentencia for en VHDL tiene el formato siguiente:
for <variable> in <rango> loop ... end loop;

donde <variable> es una nueva variable temporal, con un rango entero (<rango>), que no necesita ser definida previamente.

54

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

La sentencia wait se emplea para esperar durante un n´ mero determinado de u unidades de tiempo. En el c´digo del banco de pruebas, se emplea o
wait for 10 ns;

para esperar hasta que el UUT pueda producir las salidas correspondientes a las entradas aplicadas. En este caso, podr´ haberse escogido cualquier otro tiempo ıa de espera, ya que en el modelo del UUT no se especific´ ning´ n retardo. o u La segunda sentencia wait, que est´ situada al final de c´digo, no tiene a o ninguna indicaci´n acerca del tiempo que hay que esperar. Este tipo de sentencia o wait se emplea para detener el proceso, ya que “espera para siempre”. Como resultado de la simulaci´n del banco de pruebas, se obtienen las formas o de onda mostradas en la Figura 3.1.

Figura 3.1: Formas de onda obtenidas de simular el banco de pruebas.

3.3

Multiplexor de 4 entradas
En la Figura 3.2 se muestra un multiplexor de 4 entradas (i3, i2, i1, i0), dos entradas de selecci´n (s1, s0) y una salida (d). En esta secci´n se describen o o diferentes maneras de modelar el multiplexor, as´ como bancos de pruebas que ı permite simular tests sobre los modelos del circuito.
i0 i1 d i2 i3 s0 s1
lkj ihg

Figura 3.2: Multiplexor de 4 entradas.

Cap´ ıtulo 3

Casos pr´cticos de dise˜o de circuitos combinacionales a n

55

3.3.1

Bloque process, sentencia if

A continuaci´n, se muestra el c´digo VHDL del MUX 4:1 que describe el como o portamiento del multiplexor mediante una sentencia if incluida en un bloque process.

--------------------------------------- MUX 4x1 library IEEE; use IEEE.std_logic_1164.all; entity mux_4x1 is port ( d : out std_logic; i3, i2, i1, i0 : in s1, s0 : in end entity mux_4x1; std_logic; std_logic );

architecture mux_4x1 of mux_4x1 is begin process (i3, i2, i1, i0, s1, s0) begin if (s1=’0’and s0=’0’) then d <= i0; elsif d elsif d else (s1=’0’and s0=’1’) then <= i1; (s1=’1’and s0=’0’) then <= i2;

d <= i3; end if; end process; end architecture mux_4x1; --------------------------------------

Obs´rvese que el bloque process es sensible a las se˜ ales i3, i2, i1, i0, s1, e n s0. Esto significa que se ejecutar´ el contenido del bloque cada vez que alguna a de estas se˜ ales cambie de valor. n A continuaci´n, se muestra el c´digo de un banco de prueba que aplica algunos o o vectores de test al multiplexor (es s´lo un peque˜ o ejemplo, no se trata de un o n programa de test exhaustivo para este circuito).

--------------------------------------- Banco de pruebas library IEEE; use IEEE.std_logic_1164.all;

56

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

use IEEE.numeric_std.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 i0, i1, i2, i3, s0, s1 : std_logic; -- Conectar entradas UUT

component mux_4x1 is port ( d : out std_logic; i3, i2, i1, i0 : in std_logic; s1, s0 : in end component mux_4x1; std_logic );

begin -- Instanciar y conectar UUT uut : component mux_4x1 port map ( d => d, i0 => i0, i1 => i1, i2 => i2, i3 => i3, s0 => s0, s1 => s1 ); gen_vec_test : process begin i0 <= ’0’; i1 <= ’0’; i2 <= ’1’; i3 <= ’0’; s0 <= ’0’; s1 <= ’0’; wait for 5 ns; i0 <= ’1’; wait for 5 ns; s0 <= ’1’; wait for 10 ns; s0 <= ’0’; s1 <= ’1’; wait for 10 ns; s0 <= ’1’; wait; end process gen_vec_test; end architecture bp_mux_4x1; --------------------------------------

En la Figura 3.3a se muestran las formas de onda obtenidas al simular el banco de pruebas. Un error que se comete a veces 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 a

Cap´ ıtulo 3

Casos pr´cticos de dise˜o de circuitos combinacionales a n

57

la variable no incluida en la lista, con lo cual el modelo simulado no reproducir´ a correctamente el circuito real. Por ejemplo, supongamos que en el modelo del multiplexor no se incluyen las entradas i3, i2, i1, i0 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 de la forma siguiente:

--------------------------------------- MUX 4x1 -- ERROR al definir la sensibilidad del bloque process architecture mux_4x1 of mux_4x1 is begin process (s1, s0) -- Error: no se incluyen i3,i2,i1,i0 begin if (s1=’0’and s0=’0’) then d <= i0; elsif (s1=’0’and s0=’1’) then d <= i1; elsif (s1=’1’and s0=’0’) then d <= i2; else d <= i3; end if; end process; end architecture mux_4x1; --------------------------------------

Este modelo no reproduce adecuadamente el comportamiento de un multiplexor, como puede observarse en la Figura 3.3b. Obs´rvese que es este caso la e salida d no reproduce el cambio en el valor de la entrada i0 que se produce en el instante 5 ns. En el instante 5 ns la entrada i0 pasa de valer ’0’ a valer ’1’, mientras que el valor de la salida d no cambia: sigue siendo ’0’. Esto es debido a que el cambio en el valor de i0 no dispara la ejecuci´n del bloque process, con o lo cual el valor de la salida no se actualiza al nuevo valor de la entrada i0.

3.3.2

Bloque process, sentencias if y case

A continuaci´n, se muestra el c´digo VHDL del MUX 4:1 que describe el como o portamiento del multiplexor mediante sentencias if y case incluidas en un bloque process.

--------------------------------------- MUX 4x1 library IEEE; use IEEE.std_logic_1164.all;

58

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

entity mux_4x1 is port ( d : out std_logic; i3, i2, i1, i0 : in s1, s0 : in end entity mux_4x1; std_logic; std_logic );

architecture mux_4x1 of mux_4x1 is begin process (i3, i2, i1, i0, s1, s0) variable sel : integer; begin if (s1=’0’and s0=’0’) then sel := 0; elsif (s1=’0’and s0=’1’) then sel := 1; elsif (s1=’1’and s0=’0’) then sel := 2; else sel := 3; end if; case sel is when 0

no

nm

Figura 3.3: Formas de onda obtenidas de simular el banco de pruebas: a) modelo del multiplexor correcto; b) modelo del multiplexor err´neo. o

=>

d <= i0; when 1 => d <= i1; when 2 =>

Cap´ ıtulo 3

Casos pr´cticos de dise˜o de circuitos combinacionales a n

59

d <= i2; when others => d <= i3; end case; end process; end architecture mux_4x1; --------------------------------------

3.3.3

Sentencias concurrentes

A continuaci´n, se muestra la descripci´n del circuito multiplexor usando una o o sentencia concurrente, en la cual se asigna valor a la se˜ al d en funci´n del valor n o que tomen las entradas al circuito.

--------------------------------------- MUX 4x1 library IEEE; use IEEE.std_logic_1164.all; entity mux_4x1 is port ( d : out std_logic; i3, i2, i1, i0 : in s1, s0 : in end entity mux_4x1; std_logic; std_logic );

architecture mux_4x1_concurrente of mux_4x1 is begin d <= i0 when (s1=’0’and s0=’0’) else i1 when (s1=’0’and s0=’1’) else i2 when (s1=’1’and s0=’0’) else i3; end architecture mux_4x1_concurrente; --------------------------------------

Con el fin de ilustrar el empleo de se˜ ales del tipo integer, a continuaci´n n o se muestra una variaci´n del modelo anterior en el cual se describe el comportao miento 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 n o o la segunda, se asigna valor a la salida del circuito en funci´n de las entradas de o datos y del valor de la se˜ al entera. A continuaci´n se muestra el c´digo. n o o

--------------------------------------- MUX 4x1 library IEEE; use IEEE.std_logic_1164.all;

60

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

Figura 3.4: Formas de onda obtenidas de simular el banco de pruebas, empleando la descripci´n del comportamiento del multiplexor. o

entity mux_4x1 is port ( d : out std_logic; i3, i2, i1, i0 : in std_logic; s1, s0 : in std_logic ); end entity mux_4x1; architecture mux_4x1_concurrente of mux_4x1 is signal sel : integer; begin sel <= 0 when (s1=’0’and s0=’0’) else 1 when (s1=’0’and s0=’1’) else 2 when (s1=’1’and s0=’0’) else 3; d <= i0 when sel = 0 else i1 when sel = 1 else i2 when sel = 2 else i3; end architecture mux_4x1_concurrente; --------------------------------------

En la Figura 3.4 se muestran las formas de onda resultado de la simulaci´n. o

3.4

Restador completo de 1 bit
En esta secci´n se describe el modelado de un circuito restador completo de 1 o bit y de su banco de pruebas. Emplearemos este caso de estudio para introducir algunos conceptos nuevos. VDHL permite describir la architecture de un circuito mediante su comportamiento y tambi´n mediante su estructura, es decir, indicando c´mo est´n e o a conectados los subcircuitos que lo componen. En primer lugar se realizar´ una a descripci´n del circuito basada en el comportamiento y, a continuaci´n, se har´ o o a una descripci´n basada en su estructura. o

Cap´ ıtulo 3

Casos pr´cticos de dise˜o de circuitos combinacionales a n

61

3.4.1

Descripción del comportamiento

A continuaci´n se muestra la tabla de la verdad del circuito restador de 1 bit. o Este circuito calcula el resultado (res) y el acarreo (acarreo) obtenidos de realizar la resta (a–b) de dos bits (a,b). a b res acarreo 0 0 1 1 0 1 0 1 0 1 1 0 0 1 0 0

Un circuito restador completo de 1 bit tiene una entrada adicional: el acarreo de entrada. Conectando varios de estos circuitos, puede obtenerse un restador de n´ meros de varios bits. A continuaci´n, se muestra el c´digo VHDL de un restador u o o completo de 1 bit. Obs´rvese que la architecture describe el funcionamiento del e circuito, sin entrar en detalles acerca de su implementaci´n. o

------------------------------------------ Restador completo de 1 bit library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; entity rest_completo is port ( res, acarreo_out : out std_logic; a, b, acarreo_in : in std_logic); end entity rest_completo; architecture rest_completo_comport of rest_completo is signal result : unsigned ( 1 downto 0 ); begin result <= (’0’ & a) - (’0’ & b) - (’0’ & acarreo_in); acarreo_out <= result(1); res <= result(0); end architecture rest_completo_comport; -----------------------------------------

La interfaz externa del restador completo es descrita en la entity llamada rest_completo. En ella se definen los dos puertos de salida (res, acarreo_out) seguidos de los tres puertos de entrada (a, b, acarreo_in). Todos 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 n y std logic vector para modelar las se˜ ales transmitidas por el cableado de los n circuitos f´ ısicos.

62

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

La definici´n de la architecture incluye el nombre de la entity. Se define o una se˜ al del tipo unsigned de 2 bits (llamada result), con el fin de almacenar n el resultado de la operaci´n de sustracci´n. Al declararla, se indica que la se˜ al o o n tiene 2 bits, especificando para ello su rango: ( 1 downto 0 ). Si no se especifica el rango, las se˜ ales del tipo unsigned tienen por defecto 32 bits. n El tipo de la se˜ al debe ser unsigned, a fin de permitir el uso del operador n sustracci´n (–). o Las se˜ ales de entrada, de 1 bit, deben ser extendidas a 2 bits (concatenando n un 0), de modo que el resultado de la resta pueda ser almacenado en una se˜ al n de 2 bits del tipo unsigned. Finalmente, el resultado de la resta se asigna a res y acarreo_out. Obs´rvese e que es posible realizar las asignaciones:
acarreo_out <= result(1); res <= result(0);

porque cada elemento de una se˜ al del tipo unsigned es del tipo std logic, que n es exactamente el tipo de las se˜ ales res y acarreo_out. n

3.4.2

Descripción de la estructura

En la Figura 3.5 se muestra un circuito restador completo de 1 bit. Para su definici´n, se emplean puertas OR-exclusiva de 2 entradas (xor2), AND de dos o entradas (and2), OR de tres entradas (or3) e inversor (not1).
|

Figura 3.5: Diagrama de un circuito restador completo de 1 bit.

Obs´rvese que, a fin de facilitar la descripci´n del modelo, se han etiquetado e o las se˜ ales internas (not a, c, d, e, f) y las puertas l´gicas (g0, ..., g6). La definici´n n o o de la entity y architecture de cada una de estas puertas l´gicas se muestra a o continuaci´n. o

{ z u v u t ssp r p y ts …~ €~

t } „~ ƒ~ r p v{u x ~ ~ xw v u t ssp r p q p

‚~

Cap´ ıtulo 3

Casos pr´cticos de dise˜o de circuitos combinacionales a n

63

--------------------------------------- OR exclusiva de 2 entradas: xor2 library IEEE; use IEEE.std_logic_1164.all; entity xor2 is port ( y0 : out std_logic; x0, x1 : in std_logic ); end entity xor2; architecture xor2 of xor2 is begin y0 <= x0 xor x1; end architecture xor2; ---------------------------------------------------------------------------- Inversor de 1 entrada: not1 library IEEE; use IEEE.std_logic_1164.all; entity not1 is port ( y0 : out std_logic; x0 : in std_logic ); end entity not1; architecture not1 of not1 is begin y0 <= not x0; end architecture not1; ---------------------------------------------------------------------------- AND de 2 entradas: and2 library IEEE; use IEEE.std_logic_1164.all; entity and2 is port ( y0 : out std_logic; x0, x1 : in std_logic ); end entity and2; architecture and2 of and2 is begin y0 <= x0 and x1; end architecture and2; --------------------------------------

64

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

--------------------------------------- OR de 3 entradas: or3 library IEEE; use IEEE.std_logic_1164.all; entity or3 is port ( y0 : out std_logic; x0, x1, x2 : in std_logic ); end entity or3; architecture or3 of or3 is begin y0 <= x0 or x1 or x2; end architecture or3; --------------------------------------

Para componer el circuito restador usando las puertas l´gicas anteriores, es o necesario instanciar los componentes necesarios y conectarlos. Para ello, es preciso escribir la entity de cada uno de los componentes, instanciar los componentes y describir la conexi´n entre ellos. A continuaci´n, se muestra el c´digo del circuito o o o restador, donde la architecture describe la estructura del circuito.

------------------------------------ Restador completo de 1 bit library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; entity rest_completo is port ( res, acarreo_out : out std_logic; a, b, acarreo_in : in std_logic); end entity rest_completo; architecture rest_completo_estruc of rest_completo is signal not_a, c, d, e, f : std_logic; -- Declaraci´n de las clases de los componentes o component xor2 is port ( y0 : out std_logic; x0, x1 : in std_logic ); end component xor2; component not1 is port ( y0 : out std_logic; x0 : in std_logic ); end component not1; component and2 is port

Cap´ ıtulo 3

Casos pr´cticos de dise˜o de circuitos combinacionales a n

65

( y0 : out std_logic; x0, x1 : in std_logic ); end component and2; component or3 is port ( y0 : out std_logic; x0, x1, x2 : in std_logic ); end component or3; begin -g0 g1 -g2 Instanciaci´n y conexi´n de los componentes o o : component xor2 port map (c, a, b); : component xor2 port map (res, c, acarreo_in); g2 : component not1 port map (not_a, a); : component not1 port map (y0 => not_a, x0 => a); and2 port map (d, not_a, acarreo_in); and2 port map (e, not_a, b); and2 port map (f, b, acarreo_in); or3 port map (acarreo_out, d, e, f); rest_completo_estruc;

g3 : component g4 : component g5 : component g6 : component end architecture

-----------------------------------

En el modelo anterior, se realiza la conexi´n entre los componentes mediante o asociaci´n posicional. Es posible tambi´n usar asignaci´n impl´cita. Por ejemplo: o e o ı
g2 : component not1 port map (y0 => not_a, x0 => a);

3.4.3

Programación del banco de pruebas

En este caso, en el c´digo del banco de pruebas se comprueban las salidas obo tenidas del UUT con las salidas esperadas. Es decir, el propio banco de pruebas comprueba si el comportamiento del circuito es correcto y en caso de que no lo sea generar´ el correspondiente mensaje. Se usar´ la descripci´n estructural del a a o restador para modelar el UUT, y su descripci´n del comportamiento para obtener o las salidas “correctas”, que se comparar´n con las salidas del UUT. a La architecture del banco de pruebas contiene un proceso (bloque process) en el cual se generan los vectores de test, se introducen como entradas del UUT y se comprueban las salidas del UUT. A continuaci´n, se muestra el c´digo VHDL o o del banco de pruebas.

--------------------------------------------------- Banco de pruebas del restador completo de 1 bit library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; entity bp_rest_completo is -- El banco de pruebas no tiene

66

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

end entity bp_rest_completo;

-- ni entradas ni salidas

architecture bp_rest_completo of bp_rest_completo is signal res, acarreo_out : std_logic; -- Para conectar el UUT signal a, b, acarreo_in : std_logic; -- Para conectar el UUT component rest_completo is port ( res, acarreo_out : out std_logic; a, b, acarreo_in : in std_logic); end component rest_completo; 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 : unsigned (2 downto 0); -- Vector de test variable test_in variable esperado : unsigned (1 downto 0); -- Salida esperada variable num_errores : integer := 0; -- Numero de errores begin test_in := B"000"; for count in 0 to 7 loop a <= test_in(2); b <= test_in(1); acarreo_in <= test_in(0); wait for 10 ns; esperado := (’0’ & a) - (’0’ & b) - (’0’ & acarreo_in); if (esperado /= ( acarreo_out & res )) then report "ERROR : Esperado (" & std_logic’image(esperado(1)) & std_logic’image(esperado(0)) & ") /= 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; -- Comprueba resultado -- Report del error

Cap´ ıtulo 3

Casos pr´cticos de dise˜o de circuitos combinacionales a n

67

end process gen_vec_test; end architecture bp_rest_completo; --------------------------------------------------

El banco de pruebas no tiene ni entradas ni salidas externas. Por ese motivo, la entity del banco de pruebas no contiene ning´ n puerto (port): u
entity bp_rest_completo is end entity bp_rest_completo;

La conexi´n del UUT en el banco de pruebas se realiza instanciando el restador o binario como un subcircuito dentro del banco de pruebas. Aunque la conexi´n o se realiza mediante asociaci´n posicional, podr´ haberse realizado la asociaci´n o ıa o nombrando expl´ ıcitamente los puertos:
uut : component rest_completo port map (res => res, acarreo_out => acarreo_out, a => a, b => b, acarreo_in => acarreo_in);

Se han definido se˜ ales internas al banco de pruebas para todas las conexiones n al UUT. Aunque en este ejemplo si lo sean, los nombres de las se˜ ales no tienen n que ser id´nticos a los nombres de los puertos del UUT. e Se ha definido un proceso (process) para generar las formas de onda de las entradas 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 salie das “esperadas” del UUT debe ser diferente del m´todo empleado en el propio e UUT para obtener las salidas. En este ejemplo, el UUT contiene una descripci´n o estructural de la arquitectura del restador, mientras que las salidas “esperadas” (variable esperado) se calculan a partir de una descripci´n del comportamiento o del restador:
esperado := (’0’ & a) - (’0’ & b) - (’0’ & acarreo_in);

El comando report se usa para escribir texto en la consola. El argumento del comando (esto es, el texto a escribir) debe ser del tipo string. Por ejemplo, cadenas de caracteres concatenadas mediante el operador &. Por ello, todo lo que se desee mostrar deben ser convertido previamente al tipo string. Por ejemplo, std_logic’image(res) se usa para convertir el valor de res, que es del tipo std logic, a un dato del tipo string. Asimismo, now es una funci´n predefinida que devuelve el tiempo simulado o como un dato del tipo time. Puede usarse time’image(now) para obtener una representaci´n del tipo string del tiempo actual de la simulaci´n. o o Como resultado de la simulaci´n del banco de pruebas, se obtienen las formas o de onda y el mensaje en la consola mostrados en la Figura 3.6.

68

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

Figura 3.6: Formas de onda y mensaje en la consola obtenidos de simular el banco de pruebas.

3.4.4

Banco de pruebas usando un procedimiento

Frecuentemente, en un banco de pruebas es preciso comparar el valor esperado de una se˜ al con el valor obtenido de la simulaci´n del circuito. Si ambos valores no n o coinciden, entonces se muestra un mensaje de error y se incrementa el contador del n´ mero de errores. u A continuaci´n, se muestra el c´digo del banco de pruebas para el circuito o o restador completo de 1 bit, programado empleando un procedimiento que realiza la comparaci´n entre el valor esperado y el actual, y que, en su caso, muestra los o correspondientes mensajes de error.

--------------------------------------------------- Banco de pruebas del restador completo de 1 bit -- empleando un procedimiento library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; entity bp_rest_completo is end entity bp_rest_completo; -- El banco de pruebas no tiene -- ni entradas ni salidas

architecture bp_rest_completo_procedure of bp_rest_completo is signal res, acarreo_out : std_logic; -- Para conectar el UUT signal a, b, acarreo_in : std_logic; -- Para conectar el UUT procedure error_check( esperado, actual : in unsigned; num_errores : inout integer ) is begin if (esperado /= actual) then -- Comprueba resultado report "ERROR : Esperado (" & -- Report del error

Cap´ ıtulo 3

Casos pr´cticos de dise˜o de circuitos combinacionales a n

69

std_logic’image(esperado(1)) & std_logic’image(esperado(0)) & ") /= actual (" & std_logic’image(actual(1)) std_logic’image(actual(0)) ") en el instante" time’image(now); num_errores := num_errores + 1; end if; end procedure error_check; component rest_completo is port ( res, acarreo_out : out std_logic; a, b, acarreo_in : in std_logic); end component rest_completo; 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 0); -- Vector de test variable esperado : unsigned (1 downto 0); -- Salida esperada variable num_errores : integer := 0; -- Numero de errores begin test_in := B"000"; for count in 0 to 7 loop a <= test_in(2); b <= test_in(1); acarreo_in <= test_in(0); 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; -------------------------------------------------& & &

70

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

3.4.5

Banco de pruebas usando una función

El c´digo anterior del banco de pruebas puede modificarse con el fin de emplear o una funci´n en lugar de un procedimiento. A continuaci´n, se muestra una posible o o forma de modificar el c´digo. Obs´rvese que se ha sustituido la cl´usula if, que o e a compara el valor esperado con el valor actual, por una sentencia assert. El motivo es unicamente ilustrar el uso de assert. ´

--------------------------------------------------- Banco de pruebas del restador completo de 1 bit -- empleando un procedimiento library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; entity bp_rest_completo is end entity bp_rest_completo; -- El banco de pruebas no tiene -- ni entradas ni salidas

architecture bp_rest_completo_funcion of bp_rest_completo is signal res, acarreo_out : std_logic; -- Para conectar el UUT signal a, b, acarreo_in : std_logic; -- Para conectar el UUT function error_check( esperado, actual : unsigned; tnow : time ) return integer is begin assert ( esperado = actual ) -- Comprobacion usando assert report "ERROR : Esperado (" & -- Report del error std_logic’image(esperado(1)) std_logic’image(esperado(0)) ") /= actual (" std_logic’image(actual(1)) std_logic’image(actual(0)) ") en el instante " time’image(tnow) severity error; if ( esperado /= actual ) then return 1; else return 0; end if; end function error_check; component rest_completo is port ( res, acarreo_out : out std_logic; a, b, acarreo_in : in std_logic); & & & & & & -- Opcion severity -- Indica error -- Indica que no hay error

Cap´ ıtulo 3

Casos pr´cticos de dise˜o de circuitos combinacionales a n

71

end component rest_completo; 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 0); -- Vector de test variable esperado : unsigned (1 downto 0); -- Salida esperada variable num_errores : integer := 0; -- Numero de errores begin test_in := B"000"; for count in 0 to 7 loop a <= test_in(2); b <= test_in(1); acarreo_in <= test_in(0); wait for 10 ns; esperado := (’0’ & a) - (’0’ & b) - (’0’ & acarreo_in); num_errores := num_errores + error_check( esperado, acarreo_out & res, now ); 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_funcion; --------------------------------------------------

3.5

Sumador binario paralelo con propagación de arrastre
En esta secci´n se describe el modelo de un sumador de 4 bits, compuesto a o partir de la conexi´n de cuatro sumadores completos de 1 bit. En primer lugar se o realizar´ el modelo del sumador completo de 1 bit mediante la conexi´n de puertas a o l´gicas AND, OR y XOR. A continuaci´n, se usar´ este modelo de sumador o o a completo para componer el sumador de 4 bits.

72

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

3.5.1

Diseño de un sumador completo

Un sumador completo es un circuito con tres bits de entrada (xi , yi , ci ) y dos salida: el bit suma (si ) y el bit acarreo (Ci+1 ). El funcionamiento del circuito est´ a descrito por la tabla de la verdad siguiente: ci xi yi ci+1 si 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 0 0 0 1 0 1 1 1 0 1 1 0 1 0 0 1

Simplificando las funciones l´gicas mediante mapas de Karnaugh, se llega a o las expresiones siguientes:

ci+1 = xi yi + xi ci + yi ci si = xi ⊕ yi ⊕ ci En la Figura 3.7 se muestra el circuito del sumador completo.
†‡

Figura 3.7: Sumador completo.

Las puertas l´gicas AND, OR y XOR se modelan con un retardo de 10 ns. A o continuaci´n, se muestran los modelos de las puertas l´gicas. o o

--------------------------------------- AND de 2 entradas con retardo

Ž Š‹

+

Œ

 ‘’ “” •’



ˆ‰ Š‹

Cap´ ıtulo 3

Casos pr´cticos de dise˜o de circuitos combinacionales a n

73

library IEEE; use IEEE.std_logic_1164.all; entity and2 is generic ( DELAY : time := 10 ns ); port ( y0 : out std_logic; x0, x1 : in std_logic ); end entity and2; architecture and2 of and2 is begin y0 <= ( x0 and x1 ) after DELAY; end architecture and2; ---------------------------------------------------------------------------- OR de 3 entradas con retardo library IEEE; use IEEE.std_logic_1164.all; entity or3 is generic ( DELAY : time := 10 ns ); port ( y0 : out std_logic; x0, x1, x2 : in std_logic ); end entity or3; architecture or3 of or3 is begin y0 <= ( x0 or x1 or x2 ) after DELAY; end architecture or3; ------------------------------------------------------------------------------- OR exclusiva de 2 entradas con retardo library IEEE; use IEEE.std_logic_1164.all; entity xor2 is generic ( DELAY : time := 10 ns ); port ( y0 : out std_logic; x0, x1 : in std_logic ); end entity xor2; architecture xor2 of xor2 is begin y0 <= ( x0 xor x1 ) after DELAY; end architecture xor2;

74

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

------------------------------------------

En este caso, en lugar de declarar los componentes en la architecture del sumador, se han definido los componentes en un package, que se ha llamado puertasLogicas_package, y ´ste se ha usado en la definici´n de la architecture. e o La definici´n del package se muestra a continuaci´n. o o

------------------------------------ package de componentes -- Puertas l´gicas o library IEEE; use IEEE.std_logic_1164.all; package puertasLogicas_package is component xor2 is generic ( DELAY : time := 10 ns ); port ( y0 : out std_logic; x0, x1 : in end component xor2; std_logic );

component and2 is generic ( DELAY : time := 10 ns ); port ( y0 : out std_logic; x0, x1 : in std_logic ); end component and2; component or3 is generic ( DELAY : time := 10 ns ); port ( y0 : out std_logic; x0, x1, x2 : in std_logic ); end component or3; end package puertasLogicas_package;

La definici´n del sumador completo es la siguiente: o

------------------------------------ Sumador completo de 1 bit library IEEE; use IEEE.std_logic_1164.all; use work.puertasLogicas_package.all;

Cap´ ıtulo 3

Casos pr´cticos de dise˜o de circuitos combinacionales a n

75

entity sum_completo is port ( s, C_out : out std_logic; x, y, C_in : in std_logic); end entity sum_completo; architecture sum_completo_estruc of sum_completo is signal n1, n2, n3, n4: std_logic; begin -- Instanciaci´n y conexi´n de los componentes o o XOR2_1 : component xor2 port map (x0 => x, x1 => y, y0 => n1 XOR2_2 : component xor2 port map (x0 => C_in, x1 => n1, y0 => s AND2_1 : component and2 port map (x0 => x, x1 => y, AND2_2 : component and2 port map (x0 => x, x1 => C_in, AND2_3 : component and2 port map OR3_1 y0 => n2 y0 => n3

); ); ); );

(x0 => y, x1 => C_in, y0 => n4 ); : component or3 port map (x0 => n2, x1 => n3, x2 => n4, y0 => C_out ); end architecture sum_completo_estruc; -----------------------------------

3.5.2

Banco de pruebas de sumador completo

Para comprobar el correcto funcionamiento de este circuito, se puede emplear un banco de pruebas muy similar al que se dise˜ o para el restador de 1 bit. n´ En el banco de pruebas se compara el resultado obtenido de la descripci´n de o la estructura del sumador, con el resultado obtenido de la descripci´n de su o comportamiento. Se muestra un mensaje si ambos resultados no coinciden y se lleva la cuenta del n´ mero de errores, mostrando al final de la simulaci´n un u o mensaje con el n´ mero total de errores. A continuaci´n, se muestra el c´digo del u o o banco de pruebas.

--------------------------------------------------- Banco de pruebas del sumador completo de 1 bit library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; entity bp_sum_completo is end entity bp_sum_completo; -- El banco de pruebas no tiene -- ni entradas ni salidas

76

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

architecture bp_sum_completo of bp_sum_completo is signal s, C_out, x, y, C_in : std_logic; -- Para conectar el UUT 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 0); -- Vector de test variable esperado : unsigned (1 downto 0); -- Salida esperada variable num_errores : integer := 0; -- Numero de errores begin test_in := B"000"; for count in 0 to 7 loop C_in <= test_in(2); x <= test_in(1); y <= test_in(0); wait for 50 ns; esperado := (’0’ & x) + (’0’ & y) + (’0’ & C_in); if (esperado /= ( C_out & s )) then -- Comprueba resultado report "ERROR : Esperado (" & -- Report del error std_logic’image(esperado(1)) std_logic’image(esperado(0)) ") /= actual (" std_logic’image(C_out) std_logic’image(s) ") 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_sum_completo; & & & & & &

Cap´ ıtulo 3

Casos pr´cticos de dise˜o de circuitos combinacionales a n

77

--------------------------------------------------

En la Figura 3.8 se muestra el resultado de la simulaci´n del banco de pruebas. o Obs´rvese que, debido al retardo de las puertas l´gicas, desde el instante inicial e o hasta el instante 20ns las salidas del sumador toman el valor ’U’ (indefinido). Asimismo, los cambios en las se˜ ales de entrada tardan 20ns en propagarse a las n se˜ ales de salida. n

Figura 3.8: Simulaci´n del banco de pruebas del sumador completo. o

3.5.3

Diseño del sumador de 4 bits

En la Figura 3.9 se muestra un sumador binario paralelo de 4 bits con propagaci´n o del arrastre.
¼ ÈÇ É ž ­ Ÿ ½ ¼ ¾ ±   ¡¢ ºÆ £©
+

+

+

+

Figura 3.9: Sumador binario paralelo de 4 bits con propagaci´n del arrastre. o

3.6

Bus bidireccional y memorias
Se pretende modelar dos unidades de memoria y un bus que conecta ambas. Para simplificar, se supone que las unidades de memoria tienen capacidad para almacenar una unica palabra de N bits. Una de las memorias tiene capacidad de ´ lectura y escritura. La otra s´lo lectura. Adem´s de las dos memorias, se modela o a un bus de N l´ ıneas que puede leer de ambas memorias y escribir en la memoria que admite escritura. A continuaci´n, se describe el modelado mediante VHDL o de este sistema.

˜ —–

›œ

¥¦

˜ —–

¸ ¹ §¨ £¤ º

»

¥¦

·   ¡¢ ÄÅ ž

˜ —–

² ³ ›œ £¤ ´

µ

°

™š

±   ¡¢ ®Ã ž

˜ —–

¬ ­ ›œ Ÿ ®

¯

ª

™š

«   ¡¢ ÁÀ¿ Â

78

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

3.6.1

Memoria de sólo lectura

Los puertos de la memoria son los siguientes: – Se˜ al de entrada de 1 bit (OE_n). Cuando esta se˜ al se pone a ’0’, habilita n n la operaci´n de lectura de la memoria. Cuando est´ a ’1’, la operaci´n de o a o lectura est´ deshabilitada. a – Vector de salida de N bits (data). Contiene el dato almacenado en memoria (palabra de N bits) una vez ejecutada la operaci´n de lectura. Eso t´ a alta impedancia cuando la operaci´n de lectura est´ deshabilitada a o a (OE_n = ’1’). A continuaci´n, se muestra el c´digo VHDL que describe la interfaz y el o o funcionamiento de esta memoria. Se definen dos constantes generic: WORD_SIZE, que contiene el n´ mero de bits de la palabra (N ) y READ_DELAY, que contiene el u tiempo de retardo entre que se habilita la se˜ al de lectura hasta que el dato est´ n a disponible.

-------------------------------------------- Fuente de datos unidireccional (lectura) library IEEE; use IEEE.std_logic_1164.all; entity fuenteUnidireccional is generic ( WORD_SIZE : integer READ_DELAY : port ( data : out time

:= 8; := 10 ns);

-----

Bits por palabra, por defecto 8 Retardo en la lectura, por defecto 10 ns

std_logic_vector(WORD_SIZE-1 downto 0); -- 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 <= ( 0 => ’1’, others => ’0’) after READ_DELAY; else data <= (others => ’Z’); end if; end process rom; end architecture fuenteUnidireccional; -------------------------------------------

La sentencia

Cap´ ıtulo 3

Casos pr´cticos de dise˜o de circuitos combinacionales a n

79

data <= ( 0 => ’1’, others => ’0’ ) after READ_DELAY;

indica que debe asignarse al vector de se˜ ales data, una vez transcurrido el n retardo de tiempo READ_DELAY, una palabra del tama˜ o de data, con todos n sus bits igual a ’0’ excepto el menos significativo, que debe valer ’1’ (es decir, data <= "00...01";). 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. o An´logamente, la sentencia a
data <= (others => ’Z’);

asigna al vector de se˜ ales data una palabra, con el mismo n´ mero de bits que n u data, con todos sus bits al valor ’Z’ (alta impedancia).

3.6.2

Memoria de lectura y escritura

Los puertos de esta memoria son los siguientes: – Se˜ al de entrada de 1 bit (OE_n). Cuando esta se˜ al se pone a ’0’, habilita n n la operaci´n de lectura de la memoria. Cuando est´ a ’1’, la operaci´n de o a o lectura est´ deshabilitada. a – Se˜ al de entrada de 1 bit (WE_n). Cuando esta se˜ al se pone a ’0’, habilita n n la operaci´n de escritura en la memoria. Cuando est´ a ’1’, la operaci´n de o a o escritura est´ deshabilitada. a – Vector de entrada y salida de N bits (data).

------------------------------------------------------- Fuente de datos bidireccional (lectura y escritura) library IEEE; use IEEE.std_logic_1164.all; entity fuenteBidireccional is generic ( WORD_SIZE : integer READ_DELAY : time

:= 8; := 10 ns;

-- Bits por palabra, -- por defecto 8 bits -- 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 0); -- Se~al de datos bidireccional n OE_n : in std_logic; WE_n : in std_logic ); end entity fuenteBidireccional; -- Habilita lectura -- Habilita escritura

architecture fuenteBidireccional of fuenteBidireccional is

80

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

signal data_stored : std_logic_vector(WORD_SIZE-1 downto 0); -- Datos almacenados internamente begin ram : process (OE_n, WE_n, data) begin if (OE_n = ’0’) then data <= data_stored after READ_DELAY; elsif ( WE_n = ’0’) then data_stored <= data after WRITE_DELAY; else data <= (others => ’Z’); end if; end process ram; end architecture fuenteBidireccional; ------------------------------------------------------

3.6.3

Bus bidireccional

A continuaci´n, se muestra el c´digo del bus de datos que se emplea para realizar o o 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 n bits, y a los retardos: – Memoria de s´lo lectura: retardo en la lectura de 20 ns. o – Memoria de lectura y escritura: retardo en la lectura de 30 ns y retardo en la escritura de 40 ns. Las operaciones que se realizan son las siguientes: 1. tiempo = 0 (instante inicial). Se asigna valor ’1’ a las se˜ ales OE1_n, 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 e inicial, se asigna el valor 0x0fc3 a la se˜ al writeData del banco de pruebas, n cuya finalidad es almacenar el valor que va a ser escrito en la memoria. 2. tiempo = 100 ns. Se habilita la operaci´n de escritura, para ello se pone o a ’0’ la se˜ al WE_n. A consecuencia de ello, en el instante tiempo = 140 ns n se escribe el valor 0x0fc3 en la memoria. 3. tiempo = 200 ns. Se deshabilita la operaci´n de escritura, poniendo la o se˜ al WE_n al valor ’1’. Se habilita la operaci´n de lectura de la memoria de n o s´lo lectura, para lo cual se pone la se˜ al OE2_n a ’0’. A consecuencia de o n ello, el valor 0x0001 est´ disponible en el bus en el instante tiempo = 220 a ns. 4. tiempo = 300 ns. Se deshabilita la lectura de la memoria de s´lo lectura, o para lo cual se pone la se˜ al OE2_n a ’1’. Finalmente, se habilita la lectura n

Cap´ ıtulo 3

Casos pr´cticos de dise˜o de circuitos combinacionales a n

81

de la memoria de lectura y escritura, para lo cual se pone la se˜ al OE1_n a n ’0’. A consecuencia de ello, en el instante tiempo = 330 ns el valor 0x0fc3 est´ disponible en el bus. a A continuaci´n, se muestra el c´digo VHDL que describe las operaciones o o realizadas sobre las memorias mediante el empleo del bus.

------------------------------------------------ Conexi´n de la fuente de datos bidireccional o -- y la fuente unidireccional mediante un bus library IEEE; use IEEE.std_logic_1164.all; entity tb_bus is constant WORD_SZ constant PERIOD end entity tb_bus;

: :

integer time

:= 16; := 100 ns;

-- Bits por palabra -- Periodo ciclo reloj

architecture tb_bus of tb_bus is signal data : std_logic_vector(WORD_SZ-1 downto 0); -- Datos en el bus signal OE1_n : std_logic; -- Habilita lectura memoria lectura/escritura signal OE2_n : std_logic; -- Habilita lectura memoria s´lo lectura o signal WE_n : std_logic; -- Habilita escritura signal writeData : std_logic_vector(WORD_SZ-1 downto 0); -- Datos a escribir 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 0); -- Se~al de datos bidireccional n OE_n : in std_logic; WE_n : in std_logic ); end component fuenteBidireccional; component fuenteUnidireccional is generic ( WORD_SIZE : READ_DELAY : integer time := 8; := 10 ns); -- Bits por palabra -- Retardo en la lectura -- Habilita lectura -- Habilita escritura

port ( data : out std_logic_vector(WORD_SIZE-1 downto 0); -- Se~al de datos bidireccional n OE_n : in std_logic); end component fuenteUnidireccional; begin -- Habilita lectura

82

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

-- 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); data <= writeData when ( WE_n = ’0’) else ( others => ’Z’); vectoresTest : process is begin OE1_n <= ’1’; OE2_n <= ’1’; WE_n <= ’1’; -- Deshabilita se~ales n writeData <= B"0000_1111_1100_0011"; -- Dato a escribir (=0x0fc3) wait for PERIOD; WE_n <= ’0’; wait for PERIOD; WE_n <= ’1’; OE2_n <= ’0’; wait for PERIOD; OE2_n <= ’1’; OE1_n <= ’0’; wait for PERIOD; wait; end process vectoresTest; end architecture tb_bus; ------------------------------------------------ Habilita escritura (se escribe 0x0fc3) -- Deshabilita escritura -- Habilita lectura desde la fuente unidireccional -- El dato en el bus debe ser 0x0001 -- Deshabilita lectura de la fuente unidireccional -- Habilita lectura desde la fuente bidireccional -- El dato en el bus debe ser 0x0fc3

En la Figura 3.10 se muestra el resultado obtenido de la simulaci´n. o

Figura 3.10: Formas de onda obtenidas de simular el circuito.

3.7

Unidad aritmético lógica (ALU)
Una unidad aritm´tico l´gica (ALU) es un circuito que, dependiendo del valor de e o sus entradas de selecci´n de funci´n, realiza una operaci´n l´gica o aritm´tica, de o o o o e entre un conjunto de operaciones posibles, sobre uno o dos operandos.

Cap´ ıtulo 3

Casos pr´cticos de dise˜o de circuitos combinacionales a n

83

Este tipo de circuito puede ser descrito mediante una asignaci´n concurrente o a una se˜ al, o bien mediante varias asignaciones incluidas dentro de un bloque n process. En general, un circuito combinacional puede ser descrito mediante un bloque process siempre que todas las se˜ ales de entrada al circuito combinacional sean n incluidas en la lista de variables a las que es sensible el bloque process. A continuaci´n, se muestran dos posibles formas de modelar una ALU: la o primera usando una asignaci´n concurrente y la segunda usando un bloque proo cess. Ambas versiones dan lugar a circuitos combinacionales equivalentes. En la Tabla 3.1 se muestran las operaciones entre los operandos A y B que realiza la ALU, en funci´n del valor de la entrada de selecci´n de funci´n de 3 bits mode. o o o mode Operaci´n o 000 A∗2 001 A+B 010 A−B 011 −A 1 0 0 A and B 101 A or B 1 1 0 A xor B 111 not A Descripci´n o Multiplicar por 2 (equivale a desplazamiento a la izqda) Suma Resta Complemento a dos AND l´gico o OR l´gico o XOR l´gico o Complemento de todos los bits
Tabla 3.1: Tabla de operaciones de la ALU

3.7.1

Modelado mediante asignación concurrente

Para ilustrar el empleo de las clases package para almacenar constantes globales, a continuaci´n se muestra un package con las las constantes que definen el o tama˜ o de palabra de los operandos y el tama˜ o de la palabra de selecci´n de la n n o operaci´n. o

----------------------------------------------- Definici´n de constantes globales de la ALU o package ALU_CONSTANTS is constant WIDTH : integer := 16; -- N´m. bits de los operandos u integer := 3; -- N´m. bits selecci´n de operaci´n u o o end package ALU_CONSTANTS; ---------------------------------------------constant SEL_BITS :

A continuaci´n, se muestra el c´digo que define el comportamiento de la ALU o o mediante una unica sentencia de asignaci´n concurrente a una se˜ al. ´ o n

84

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

----------------------------------------------- ALU -- architecture: sentencia concurrente library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; use work.ALU_CONSTANTS.all; entity ALU is port ( C : out A, B : in mode : in end entity ALU;

std_logic_vector (WIDTH-1 downto 0); std_logic_vector (WIDTH-1 downto 0); std_logic_vector (SEL_BITS-1 downto 0) );

architecture ALU_concurrente of ALU is begin C <= std_logic_vector (signed(A)+signed(A)) when (mode="000") else std_logic_vector (signed(A)+signed(B)) when (mode="001") else else else else else std_logic_vector (signed(A)-signed(B)) when (mode="010") std_logic_vector (-signed(A) ) when (mode="011") A and B when (mode="100") A or B when (mode="101") A xor B when (mode="110")

else not A; end architecture ALU_concurrente; ----------------------------------------------

3.7.2

Modelado mediante bloque process

El comportamiento de la ALU tambi´n puede ser descrito empleando un bloque e process sensible a tres se˜ ales: los dos operandos y la se˜ al de selecci´n de la n n o operaci´n. o

----------------------------------------------- ALU -- architecture: bloque process library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; use work.ALU_CONSTANTS.all; architecture ALU_bloqueProcess of ALU is begin process (A, B, mode) is

Cap´ ıtulo 3

Casos pr´cticos de dise˜o de circuitos combinacionales a n

85

begin case mode is when "000" when when when when when "001" "010" "011" "100" "101"

=> C <= std_logic_vector(signed(A)+signed(A)); => => => => => C C C C C <= <= <= <= <= std_logic_vector(signed(A)+signed(B)); std_logic_vector(signed(A)-signed(B)); std_logic_vector(-signed(A)); A and B; A or B;

when "110" => C <= A xor B; when others => C <= not A; end case; end process; end architecture ALU_bloqueProcess; ----------------------------------------------

3.7.3

Programación del banco de pruebas

Como hemos visto en otros ejemplos, el banco de pruebas est´ t´ a ıpicamente formado por las tres partes siguientes: el dispositivo que va a ser probado (UUT), el c´digo para la generaci´n de los vectores de test y el c´digo para comprobar o o o los resultados del test. A´ n en el caso de una ALU sencilla como esta, examinar que la ALU realiza u correctamente las operaciones para todos los posibles valores de los operadores consumir´ bastante tiempo. En la pr´ctica esta t´cnica ser´ inviable, por lo cual ıa a e ıa 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, 0, 1 y 2. – Se escogen valores de los operandos en el l´ ımite inferior de su rango. Si MIN_NEG_DATA representa el valor m´ ınimo que puede tomar el operando, entonces se escogen los valores MIN_NEG_DATA, . . . , MIN_NEG_DATA+4 para cada uno de los operandos. – Se escogen valores de los operandos en el l´ ımite superior de su rango. Si MAX_POS_DATA representa el valor m´ximo que puede tomar el operando, a entonces se escogen los valores MAX_POS_DATA-4, . . . , MAX_POS_DATA para cada uno de los operandos. – Finalmente, se escogen algunos valores “al azar”, m´s o menos distribuidos a uniformemente en el rango de los operandos. Se ha definido un package con las constantes globales del banco de pruebas, cuyo valor es calculado a partir de las constantes globales de la ALU.

86

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

----------------------------------------------- Definici´n de constantes globales o -- del banco de pruebas de la ALU use work.ALU_CONSTANTS.all; package TB_ALU_CONSTANTS is constant SEL_MAX : integer := 2**SEL_BITS - 1; constant MAX_POS_DATA : integer := 2**(WIDTH-1) - 1; constant MIN_NEG_DATA : integer := -2**(WIDTH-1); constant DELAY : time := 10 ns; end package TB_ALU_CONSTANTS; ----------------------------------------------

A continuaci´n se muestra el c´digo del banco de pruebas. o o

----------------------------------------------- Banco de pruebas para la ALU library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; use work.ALU_CONSTANTS.all; use work.TB_ALU_CONSTANTS.all; entity TB_ALU is constant PERIOD : time := 100 ns; end entity TB_ALU; architecture TB_ALU of TB_ALU is signal A,B,C : std_logic_vector (WIDTH-1 signal mode

downto 0);

: std_logic_vector (SEL_BITS-1 downto 0);

component ALU is port ( C : out A, B : in mode : in end component ALU;

std_logic_vector (WIDTH-1 std_logic_vector (WIDTH-1

downto 0); downto 0);

std_logic_vector (SEL_BITS-1 downto 0) );

-- Procedure que calcula C (expected_C) y lo compara con el -- valor de C que se pasa como argumento (actual_C) -- Si ambos valores no coinciden, se muestra un mensaje y se -- incrementa el contador de errores (error_count) procedure check_ALU ( i, j, k : in integer; actual_C : in std_logic_vector (WIDTH-1 downto 0); error_count : inout integer ) is

Cap´ ıtulo 3

Casos pr´cticos de dise˜o de circuitos combinacionales a n

87

variable expected_C : integer; begin case k is when when when when when 0 1 2 3 4 => => => => => expected_C expected_C expected_C expected_C expected_C := := := := := i*2; i+j; i-j; -i; TO_INTEGER(signed(

when 5

std_logic_vector(TO_SIGNED(i,WIDTH)) and std_logic_vector(TO_SIGNED(j,WIDTH)) )); => expected_C := TO_INTEGER(signed( std_logic_vector(TO_SIGNED(i,WIDTH)) or std_logic_vector(TO_SIGNED(j,WIDTH)) ));

when 6

=> expected_C := TO_INTEGER(signed( std_logic_vector(TO_SIGNED(i,WIDTH)) xor std_logic_vector(TO_SIGNED(j,WIDTH)) )); when others => expected_C := TO_INTEGER(signed( not std_logic_vector(TO_SIGNED(i,WIDTH)) )); end case; expected_C := TO_INTEGER(TO_SIGNED(expected_C,WIDTH)); -- Trunca el resultado a WIDTH bits assert( expected_C = TO_INTEGER(signed(actual_C)) ) report "ERROR. Ops: " & integer’image(i) & "," & integer’image(j) & ", Operacion: " & integer’image(k) & ", resultado esperado: " & integer’image(expected_C) & ", resultado actual: " & integer’image(TO_INTEGER(signed(actual_C))) & "en el instante " & time’image(now); if (expected_C /= TO_INTEGER(signed(actual_C))) then error_count := error_count + 1; end if; end procedure check_ALU; -- Fin de la definici´n del procedure o begin UUT : component ALU port map (C, A, B, mode); -- bloque process para generar los vectores de test y -- comprobar el resultado main : process is variable error_count : integer := 0; begin

88

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

report "Comienza la simulaci´n"; o -- Vectores de test: operandos con valor pr´ximo a cero o for i in -2 to 2 loop for j in -2 to 2 loop for k in 0 to SEL_MAX loop A <= std_logic_vector(TO_SIGNED(i,WIDTH)); b <= std_logic_vector(TO_SIGNED(j,WIDTH)); mode <= std_logic_vector(TO_SIGNED(k,SEL_BITS)); wait for DELAY; check_ALU(i, j, k, C, error_count); end loop; end loop; end loop; -- Vectores de test: operandos con valor pr´ximo al m´nimo o ı 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 0 to SEL_MAX loop A <= std_logic_vector(TO_SIGNED(i,WIDTH)); b <= std_logic_vector(TO_SIGNED(j,WIDTH)); mode <= std_logic_vector(TO_SIGNED(k,SEL_BITS)); wait for DELAY; check_ALU(i, j, k, C, error_count); end loop; end loop; end loop; -- Vectores de test: operandos con valor pr´ximo al m´ximo o a for i in MAX_POS_DATA-4 to MAX_POS_DATA loop for j in MAX_POS_DATA-4 to MAX_POS_DATA loop for k in 0 to SEL_MAX loop A <= std_logic_vector(TO_SIGNED(i,WIDTH)); b <= std_logic_vector(TO_SIGNED(j,WIDTH)); mode <= std_logic_vector(TO_SIGNED(k,SEL_BITS)); wait for DELAY; check_ALU(i, j, k, C, error_count); end loop; end loop; end loop; -- Vectores de test: operandos con valores al azar for i in 0 to 9 loop for j in 0 to 9 loop for k in 0 to SEL_MAX loop

Cap´ ıtulo 3

Casos pr´cticos de dise˜o de circuitos combinacionales a n

89

A <= std_logic_vector(TO_SIGNED(41*i-273,WIDTH)); b <= std_logic_vector(TO_SIGNED(89*j-384,WIDTH)); mode <= std_logic_vector(TO_SIGNED(k,SEL_BITS)); wait for DELAY; check_ALU(41*i-273, 89*j-384, k, C, error_count); end loop; end loop; end loop; wait for DELAY; -- Informe mostrando el resultado del test if (error_count=0) then report "Finaliza la simulaci´n: 0 errores"; o else report "Finaliza la simulaci´n: " & integer’image(error_count) & "errores"; o end if; wait; -- Termina la simulaci´n o end process main; end architecture TB_ALU; ----------------------------------------------

3.8

Conversor de BCD a binario
En los circuitos l´gicos digitales se emplean diferentes c´digos binarios. En ocao o siones, dos circuitos que usan diferente c´digo necesitan comunicarse entre s´ o ı, siendo preciso emplear otro circuito para realizar la conversi´n de un c´digo a o o otro. Como ejemplo de este tipo de circuitos conversores de c´digo, en esta secci´n o o de describir´ el dise˜ o de un conversor para n´ meros en c´digo BCD de longitud a n u o fija a c´digo binario. o En el c´digo BCD (binary-coded decimal), cada grupo de cuatro bits conseo cutivos es convertido a un d´ ıgito decimal. El n´ mero completo es interpretado u como un n´ mero decimal compuesto por estos d´ u ıgitos decimales. Por ejemplo, 0101 1001BCD es interpretado como 5910 , ya que los primeros cuatro bits (0101) corresponden a un 5 decimal y los ultimos cuatro bits (1001) corresponden a un 9 ´ decimal. El equivalente binario al n´ mero 5910 es 0011 10112 . El circuito descrito u en esta secci´n deber´ realizar la conversi´n de 0101 1001BCD a 0011 10112 . o ıa o Existen varios algoritmos de conversi´n de c´digo BCD a binario, los cuales o o t´ ıpicamente requieren la realizaci´n de una secuencia de operaciones sobre el o n´ mero BCD de entrada, que aparentemente deber´ ser implementadas usando u ıan un circuito secuencial. Sin embargo, el algoritmo descrito a continuaci´n puede o

90

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

ser transformado en una secuencia de puertas l´gicas, y por tanto puede ser o implementado usando un circuito combinacional.
Paso 1. Paso 2. Paso 2a. Paso 2b. bcd <- bcd_data_input; bin <- 0 (mismo n´mero de bits que bcd) u For count <- 1 to bcd_bit_size do begin {bcd,bin} <- {bcd,bin} >> 1; For cada secuencia de 4 bits en bcd do If secuencia de 4 bits > 7 then restar 3 de esa secuencia de 4 bits; end // del bucle For bin contiene el n´mero convertido u

Paso 3.

3.8.1

Circuito conversor

La constante global que almacena el n´ mero de bits del n´ mero en BCD, se u u declara en un package, que ser´ usado desde la descripci´n del circuito y desde a o la descripci´n del banco de pruebas. o
------------------------------------------- Definici´n de constantes globales o package BCD_CONST is constant LENGTH : integer := 16; -- Longitud (# bits) del n´mero BCD u end package BCD_CONST; ------------------------------------------

A continuaci´n se muestra la descripci´n de un circuito que ejecuta el algoo o ritmo de conversi´n de BCD a binario descrito anteriormente. o
--------------------------------------- Circuito conversor de BCD a binario library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; use work.BCD_CONST.all; entity bcd_to_bin is port( bin: out std_logic_vector(LENGTH-1 downto 0); bcd: in std_logic_vector(LENGTH-1 downto 0) ); end entity bcd_to_bin; architecture bcd_to_bin of bcd_to_bin is begin process (bcd) is -- bloque sensible a cambios en la entrada variable bcd_concat_bin: unsigned(2*LENGTH-1 downto 0); variable temp : unsigned(3 downto 0);

Cap´ ıtulo 3

Casos pr´cticos de dise˜o de circuitos combinacionales a n

91

begin bcd_concat_bin := unsigned(bcd) & TO_UNSIGNED(0,LENGTH); for i in 0 to LENGTH-1 loop -- Paso 2 bcd_concat_bin := bcd_concat_bin srl 1; -- Paso 2a for j in 0 to (LENGTH/4)-1 loop -- Paso 2b temp := bcd_concat_bin(LENGTH+j*4+3 downto LENGTH+j*4); if (temp(3) = ’1’) then -- Si la secuencia de 4 bits temp := temp - "0011"; -- es mayor que 7, se resta 3 end if; bcd_concat_bin(LENGTH+j*4+3 downto LENGTH+j*4) := temp; end loop; -- end for Paso 2b end loop; -- end for Paso 2 bin <= std_logic_vector(bcd_concat_bin(LENGTH-1 downto 0)); end process; end architecture bcd_to_bin; --------------------------------------

Obs´rvese que un bloque process puede dar lugar a un circuito combinacional e si en la lista de se˜ ales a las cuales el bloque es sensible incluye todas las entradas n al circuito. Dado que ese bloque process ser´ activado cada vez que una de las ıa se˜ ales de entrada cambia, este c´digo representa un circuito combinacional. n o Igualmente, un bucle for no implica necesariamente que el circuito sintetizado deba ser secuencial. En este caso, el bucle for unicamente representa la ´ interconexi´n de puertas l´gicas combinacionales. o o

3.8.2

Banco de pruebas

A continuaci´n se muestra el c´digo del banco de pruebas del circuito conversor. o o Para probar el circuito, se generan todos los posibles n´ meros en BCD con LENGTH u bits. En este caso, todos los posibles n´ meros de 16 bits. Puesto que un n´ mero u u BCD de 16 bits puede representar cualquier n´ mero entero comprendido entre 0 u y 999910 , ese ser´ el rango de n´ meros que se emplee en el test. a u
----------------------------------------------- Banco de pruebas para el circuito conversor -- de BCD a binario library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; use work.BCD_CONST.all; entity bp_bcd_to_bin is constant MAX_BCD : integer := 9999; -- Valor m´ximo de entrada a constant DELAY : time := 10ns; -- Retardo usado en el test; end entity bp_bcd_to_bin;

92

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

architecture bp_bcd_to_bin of bp_bcd_to_bin is signal bin: std_logic_vector(LENGTH-1 downto 0); -- Salida de UUT signal bcd: std_logic_vector(LENGTH-1 downto 0); -- Entrada a UUT -- Declaraci´n del componente (UUT) o component bcd_to_bin is port( bin: out std_logic_vector(LENGTH-1 downto 0); bcd: in std_logic_vector(LENGTH-1 downto 0) ); end component bcd_to_bin; begin -- Instancia la unidad a testear UUT : component bcd_to_bin port map(bin,bcd); -- Genera vectores de test y comprueba resultados main: process is : unsigned (LENGTH-1 downto 0); variable temp variable digit : unsigned (LENGTH-1 downto 0); -- Un digito BCD variable digits : unsigned (LENGTH-1 downto 0); -- Todos digitos variable expected : unsigned (LENGTH-1 downto 0); variable error_count : integer := 0; -- N´mero de errores u begin report "Comienza la simulaci´n."; o -- Generar todos los posibles valores for i in 0 to MAX_BCD loop temp := TO_UNSIGNED(i,LENGTH); for j in 0 to (LENGTH/4-1) loop digit := temp mod 10; -- Obtiene el digito BCD menos significativo digits(j*4+3 downto j*4) := digit(3 downto 0); temp := temp/10; end loop; bcd <= std_logic_vector(digits); -- Asigna vector de test expected := TO_UNSIGNED(i, LENGTH); wait for DELAY; assert (expected = unsigned(bin)) report "ERROR: Resultado esperado " & integer’image(TO_INTEGER(expected)) & ", resultado obtenido " & integer’image(TO_INTEGER(unsigned(bin))) & " en el instante " & time’image(now); if (expected /= unsigned(bin)) then error_count := error_count + 1; end if; end loop;

Cap´ ıtulo 3

Casos pr´cticos de dise˜o de circuitos combinacionales a n

93

wait for DELAY; -- Informe final if (error_count = 0) then o report "Simulaci´n finalizada sin errores"; else report "ERROR: Hay " & integer’image(error_count) & " errores."; end if; wait; -- Final de la simulaci´n o end process main; end architecture bp_bcd_to_bin;

3.9

Codificador 4:2 con prioridad
Un codificador es un circuito que convierte un valor decimal en su equivalente binario (realiza la funci´n inversa a un decodificador). Este circuito, que tiene 2N o entradas y N salidas, presenta en la salida el c´digo binario correspondiente a la o entrada activada. El codificador no funciona correctamente si en un determinado instante se produce m´s de una entrada al circuito. En aquellos casos en que deba cona templarse esta situaci´n, se emplean circuitos codificadores con prioridad, en los o cuales queda definido qu´ entrada debe codificarse cuando se presenten varias en e un determinado instante. Asimismo, el codificador tiene una salida que se activa cuando hay alguna entrada al circuito. Obs´rvese que cuando no hay ninguna entrada, la salida del e codificador no es v´lida. a

3.9.1

Diseño del circuito

A continuaci´n, se muestra el c´digo VHDL de un codificador 4:2 con prioridad. o o La entrada 3 tiene mayor prioridad que la 2, ´sta mayor que la 1 y finalmente la e entrada 0 es la de menor prioridad. La salida valida se pone a ’1’ cuando hay al menos una entrada al circuito.
-------------------------------------------- Codificador 4:2 con prioridad library IEEE; use IEEE.std_logic_1164.all; entity codificador_4_2_prioridad is port ( valida : out std_logic; -- ’1’ si hay entrada codificada : out std_logic_vector(1 downto 0); i3, i2, i1, i0 : in std_logic ); end entity codificador_4_2_prioridad;

94

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

architecture codificador_4_2_prioridad of codificador_4_2_prioridad is begin process (i3, i2, i1, i0) is -- Activado cuando cambia alguna entrada begin if ( (i3=’1’) or (i2=’1’) or (i1=’1’) or (i0=’1’) ) then valida <= ’1’; -- Indica que la salida es v´lida a else valida <= ’0’; end if; if (i3=’1’) then -- Salida no v´lida, puesto que no hay entrada a

codificada <= "11"; codificada <= "10"; codificada <= "01"; codificada <= "00";

elsif (i2=’1’) then elsif (i1=’1’) then else end if;

end process; end architecture codificador_4_2_prioridad; -------------------------------------------

Obs´rvese que el bloque process es activado cuando cambia cualquiera de las e entradas, ya que el bloque es sensible a estas cuatro se˜ ales. n Se emplean sentencias if-elsif para inspeccionar de manera priorizada las entradas.

3.9.2

Banco de pruebas

A continuaci´n, se muestra el c´digo del banco de pruebas. o o

------------------------------------------------------ Banco de pruebas del codificador 4:2 con prioridad library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; 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;

architecture bp_codificador_4_2 of bp_codificador_4_2 is -- Salidas UUT

Cap´ ıtulo 3

Casos pr´cticos de dise˜o de circuitos combinacionales a n

95

signal valida signal codificada -- Entradas UUT

: std_logic; : std_logic_vector(1 downto 0);

signal i3, i2, i1, i0 : std_logic; component codificador_4_2_prioridad is port ( valida : out std_logic; codificada : out std_logic_vector(1 downto 0); i3, i2, i1, i0 : in std_logic ); end component codificador_4_2_prioridad; begin -- Cuerpo de la arquitectura UUT : component codificador_4_2_prioridad port map (valida, codificada, i3, i2, i1, i0); main : process is a variable temp : unsigned (3 downto 0); -- Usado en los c´lculos variable esperado_valida : std_logic; variable esperado_codificada : std_logic_vector(1 downto 0); variable error_count : integer := 0; begin report "Comienza la simulaci´n"; o -- Generar todos los posibles valores de entrada for i in 0 to (MAX_COMB-1) loop temp := TO_UNSIGNED(i,4); i3 <= std_logic(temp(3)); i2 <= std_logic(temp(2)); i1 <= std_logic(temp(1)); i0 <= std_logic(temp(0)); -- Calcular el valor esperado if (i=0) then esperado_valida := ’0’; esperado_codificada := "00"; else esperado_valida := ’1’; if (i=1) then esperado_codificada := "00"; elsif (i<=3) then esperado_codificada := "01"; elsif (i<=7) then esperado_codificada := "10"; else end if; end if; esperado_codificada := "11";

wait for DELAY; -- Espera y compara con las salidas de UUT if ( esperado_valida /= valida ) then

96

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

report "ERROR en la salida valida. Valor esperado: " std_logic’image(esperado_valida) ", valor actual: " std_logic’image(valida) " en el instante: " time’image(now); error_count := error_count + 1; end if;

& & & & &

if ( esperado_codificada /= codificada ) then report "ERROR en la salida codificada. Valor esperado: " & std_logic’image(esperado_codificada(1)) & std_logic’image(esperado_codificada(0)) & ", valor actual: " std_logic’image(codificada(1)) std_logic’image(codificada(0)) " en el instante: " time’image(now); error_count := error_count + 1; end if; end loop; -- Final del bucle for de posibles valores de entrada -- Informe del n´mero total de errores u if (error_count = 0) then report "Simulaci´n finalizada sin errores"; o else report "ERROR: Hay " & integer’image(error_count) & " errores."; end if; wait; -- Final de la simulaci´n o & & & &

end process main; end architecture bp_codificador_4_2; -----------------------------------------------------

La ejecuci´n del banco de pruebas indica que no hay ning´ n error en el o u circuito. En la Figura 3.11 se muestra el resultado de la simulaci´n. o

Figura 3.11: Formas de onda obtenidas de simular el banco de pruebas.

Casos prácticos de diseño de circuitos secuenciales

4

Objetivos. Una vez estudiado el contenido del tema deber´ saber: ıa – Dise˜ ar en VHDL m´quinas de estado finito de Moore y de Mealy sintetizables, n a realizando el dise˜ o en base a la descripci´n de su estructura y/o comportan o miento. – Dise˜ ar y programar en VHDL bancos de pruebas de circuitos secuenciales. n

Muchos problemas de dise˜ o pueden ser resueltos usando m´quinas de estado n a finito. Una m´quina de estado finito consiste esencialmente en un conjunto de a estados (codificados usando flip-flops) y transiciones entre estos estados, gobernadas por un conjunto de bits de condici´n. Es esta secci´n trataremos algunos o o aspectos del dise˜ o de m´quinas de estado finito de Moore y de Mealy usando n a VHDL. – M´quina de Moore. Una m´quina de estado finito de Moore (o simplemente, a a “m´quina de Moore”) es una m´quina de estado en la cual las salidas del a a circuito dependen del estado actual y no del valor actual de las entradas. – M´quina de Mealy. Las salidas de una m´quina de Mealy dependen del a a estado actual y tambi´n del valor actual de las entradas. e Ambos tipos de m´quina pueden ser dise˜ ados de manera sistem´tica usando a n a un m´todo de dise˜ o de m´quinas de estado finito descrito en la siguiente secci´n. e n a o

4.1

Diseño de circuitos secuenciales síncronos
Las m´quinas de Moore y Mealy pueden ser dise˜ adas de manera sistem´tica a n a siguiendo los pasos descritos a continuaci´n: o

100

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

1. Dibujar el diagrama de estados del circuito. 2. Crear un conjunto de variables de estado y codificar los estados del diagrama de estados usando estas variables de estado. 3. Escribir la tabla de transici´n del estado usando el diagrama dibujado en el o Paso 1 y la codificaci´n de los estados del Paso 2. o 4. Formular, a partir de la tabla de transici´n del estado del Paso 3, las o funciones l´gicas simplificadas para el nuevo estado y las salidas. o 5. Dise˜ ar el circuito empleando un flip-flop por cada variable de estado, y n l´gica combinacional para las funciones de transici´n del estado y de salida o o obtenidas en el Paso 4.

4.1.1

Circuito detector de secuencias

El m´todo anterior puede aplicarse al dise˜ o de un circuito que detecte la secuene n cia 101. El circuito tiene una unica entrada, por la que recibe bits en serie, y una ´ unica salida, en la que genera un bit 1 cuando detecta la secuencia 101 en los ´ bits de entrada, y genera un 0 en caso contrario. Observese que tambi´n deben e detectarse las secuencias cuando se encuentran solapadas, por ejemplo: 10101 El primer paso del dise˜ o es dibujar el diagrama de estados del circuito, n que consiste en un conjunto de estados y (posiblemente) transiciones etiquetadas entre los estados. En la Figura 4.1 se muestra el diagrama de transici´n para el o circuito detector de la secuencia 101.
Ê ËÊ

s1
Ï ËÏ

s2

Figura 4.1: Diagrama de estados del circuito detector de la secuencia 101.

Cada estado del diagrama “recuerda” una porci´n de la secuencia 101. Las o transiciones entre los estados est´n etiquetadas x/y, donde x corresponde con el a valor de la entrada que produce la transici´n, e y corresponde con el valor de o la variable de salida dado el estado en el que empieza la transici´n y el valor o de entrada x. Dado que la salida depende del estado actual y de la variable de entrada, este tipo de diagrama corresponde con una m´quina de Mealy. a 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 o en ese estado.

Î ÍÌ Î ÍÌ Ê ËÊ

s0
Ê ËÊ

Cap´ ıtulo 4

Casos pr´cticos de dise˜o de circuitos secuenciales a n

101

El segundo paso del m´todo de dise˜ o consiste en codificar los estados. e n Puesto que hay tres estados, son necesarias dos variables de estado: A y B. Por simplicidad en la exposici´n, realizaremos una codificaci´n binaria de los estados: o o Estado A B S0 S1 S2 0 0 1 0 1 0

En general, unas codificaciones de los estados conducen a circuitos m´s sena cillos que otras, aunque las diferencias t´ ıpicamente no son muy grandes. El tercer paso del m´todo de dise˜ o consiste en escribir la tabla de transici´n e n o de estados y salidas. Esto puede hacerse de manera sencilla a partir del diagrama de transici´n de estados mostrado en la Figura 4.1 y de la tabla anterior de o codificaci´n de los estados. La tabla de transici´n de estados y salidas es la o o siguiente: o Estado actual Entrada Pr´ximo estado Salida A B x NA NB y S0 : S0 : S1 : S1 : S2 : S2 : 0 0 0 0 1 1 0 0 1 1 0 0 0 1 0 1 0 1 S0 : S1 : S2 : S1 : S0 : S1 : 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 1

El cuarto paso consiste en obtener las funciones l´gicas simplificadas que o relacionan el pr´ximo estado y la salida con el estado actual y la entrada. Estas o funciones son:

NA = x B NB = x y=xA

(4.1) (4.2) (4.3)

Finalmente, el quinto paso consiste en sintetizar el circuito secuencial s´ ıncrono que implemente las funciones l´gicas anteriores. Si se usan flip-flops D, las o entradas al flip-flop corresponden con el nuevo estado (DA = N A, DB = N B), mientras que las salidas del flip-flop corresponden con el estado actual (QA = A, QB = B). En la Figura 4.2 se muestra el circuito.

102

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

Figura 4.2: Circuito detector de la secuencia 101.

4.2

Síntesis de lógica secuencial
El comportamiento y la salida de un bloque de l´gica secuencial depende del valor o actual de sus entradas y de sus variables de estado. El valor de las variables de estado se almacena t´ ıpicamente en elementos de memoria, ya sea en latches o en flip-flops. – Suele llamarse latches a aquellos circuitos cuyo estado cambia unicamente ´ cuando su entrada enable est´ a un determinado nivel (’0’ o ’1’). A contia ´ nuaci´n, se muestra parte de la architecture de un latch-D. o
process (enable, D) is begin if (enable = ’1’) then q <= D; end if; end process;

– Suele llamarse flip-flops a aquellos circuitos cuyo estado cambia o bien en el flanco de subida del reloj, o bien en el flanco de bajada del reloj.

4.2.1

Sentencias condicionales incompletas

Obs´rvese que el latch se define empleando una cl´usula if-then sin else. Se e a 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 a satisface.

Cap´ ıtulo 4

Casos pr´cticos de dise˜o de circuitos secuenciales a n

103

Un motivo por el cual podr´ pensarse en omitir el caso else, es que sea ıa indiferente el valor que se asigne a las se˜ ales en este caso (ya que en la pr´ctica n a nunca se producir´). Si no deseamos que el circuito se sintetice mediante un latch, a debemos incluir el caso else en la sentencia condicional y asignar a las se˜ ales el n valor ’X’ (don’t care).

4.2.2

Sentencias condicionales completas

Una caracter´ ıstica inherente a las sentencias if-elsif-else es que las condiciones no tienen forzosamente que ser excluyentes entre s´ La herramienta se s´ ı. ıntesis asume, por tanto, que deben comprobarse las condiciones en un cierto orden de prioridad, generando la l´gica para ello. Esto da lugar a circuiter´ innecesaria en o ıa el caso en que las condiciones sean excluyentes. En aquellos casos en que las condiciones de la sentencia condicional completa sean excluyentes entre s´ es preferible emplear sentencias case o with. Esto ı, es debido a que las sentencias case y with se sintetizan de manera natural en multiplexores o estructuras equivalente a multiplexores, que son r´pidas y ocupan a relativamente poco area. ´

4.2.3

Retardos

En la Secci´n 3.1 se explic´ que en la descripci´n para s´ o o o ıntesis de los circuitos combinacionales debe evitarse el uso de retardos. Lo mismo aplica a la descripci´n o de circuitos secuenciales. Los retardos en el hardware son dependientes de la tecnolog´ empleada en su fabricaci´n y est´n sujetos a la variabilidad del proceso ıa o a de fabricaci´n, por ello es extremadamente dif´ construir circuitos que presenten o ıcil un determinado retardo. As´ pues, no es posible sintetizar sentencias tales como wait for x ns. Igualı mente, no es posible sintetizar sentencias que empleen la cl´usula after. Algunas a herramientas de s´ ıntesis ignoran estas sentencias, mientras que otras muestran mensajes de error. Cuando es preciso emplear retardos para describir adecuadamente el circuito, puede definirse un retardo constante en la parte superior del c´digo o
constant DEL : time := 1 ns;

y usar este retardo en el c´digo del circuito. Por ejemplo: o A <= B after DEL; Puede asignarse un valor positivo a esta constante de retardo para realizar la simulaci´n del circuito y posteriormente asignarle el o valor cero cuando vaya a realizarse la s´ ıntesis. Obs´rvese que esta discusi´n acerca de los retardos aplica a los circuitos, no e o a los bancos de prueba, que no necesitan ser sintetizados.

4.2.4

Inicialización

Debe evitarse inicializar las variables y las se˜ ales al declararlas, ya que este tipo n de inicializaci´n no puede ser sintetizada. o

104

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

La inicializaci´n de una variable o se˜ al implica una acci´n que se realiza o n o unicamente una vez al comienzo de la simulaci´n. Si es preciso realizar una acci´n ´ o o al comienzo de la simulaci´n, entonces debe situarse en la secuencia de acciones o que se ejecutan cuando se activa la se˜ al de reset. Estas acciones se definen n t´ ıpicamente dentro de un bloque process sensible a la se˜ al de reset. n

4.2.5

Bloques process

La descripci´n de la architecture de los circuitos secuenciales se basa fundao mentalmente en el empleo de bloques process. Las asignaciones a se˜ ales dentro n de los bloques process deben cumplir que: – La se˜ al en la parte izquierda de la asignaci´n concurrente debe ser una n o se˜ al definida dentro del bloque process, o una se˜ al out o inout de la n n interfaz del circuito. – Las se˜ ales en la parte derecha de la asignaci´n concurrente deben ser n o se˜ ales definidas dentro del bloque process, o se˜ ales in o inout de la n n interfaz del circuito. – No se debe asignar valor a una determinada se˜ al dentro de m´s de un n a bloque process. Es decir, cada se˜ al debe ser evaluada en un unico bloque n ´ process. Aunque VHDL no impide que se asigne valor a una misma se˜ al en n varios bloques process, esta pr´ctica da lugar a circuito dif´ a ıciles de depurar y t´ ıpicamente no es soportada por las herramientas de s´ ıntesis comerciales. Para asignar valor a las salidas de los flip-flops y latches dentro de un bloque process, pueden emplearse sentencias de asignaci´n a se˜ al (usan el operador o n <=) y sentencias de asignaci´n a variable (usan el operador :=). Las asignaciones o a variable tienen efecto inmediatamente, mientras que las asignaciones a se˜ al n tienen efecto en un instante de tiempo 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). o a Cuando se emplean bloques process para describir un circuito secuencial, debe indicarse la lista de sensibilidad de cada bloque process con el fin de controlar cu´ndo se activa el bloque. Cuando se especifica una lista de sensibilidad, a el simulador no ejecuta el bloque process hasta que no se produce un cambio en alguna de las se˜ ales que componen la lista. n Obs´rvese que es posible controlar la ejecuci´n del bloque process mediante e o la lista de sensibilidad y tambi´n mediante el empleo de cl´usulas wait dentro del e a cuerpo el bloque process. Sin embargo, no es recomendable emplear este segundo m´todo (uso de cl´usulas wait dentro del bloque process), ya que puede dar lugar e a a circuitos no sintetizables. Si un bloque process no tiene lista de sensibilidad, entonces ese bloque se ejecuta continuamente, con lo cual su simulaci´n es muy ineficiente. Por este o motivo, es recomendable que todo bloque process tenga su lista de sensibilidad.

Cap´ ıtulo 4

Casos pr´cticos de dise˜o de circuitos secuenciales a n

105

4.3

Flip-flop JK
En esta secci´n se describe el dise˜ o de un flip-flop JK con reset as´ o n ıncrono activado al nivel LOW. Este circuito puede encontrarse en dos estados: Q=’0’ y Q=’1’. La tabla de verdad del circuito, considerando unicamente las entradas J (entrada ´ set), K (entrada reset), el estado actual (Qt ) y el siguiente estado Qt+1 es la mostrada a continuaci´n. Las transiciones de estado se producen en el flanco de o subida del reloj.

J (set) K (reset) 0 0 0 1 1 0 1 1
ÑÐ

Nuevo estado Qt+1 = Qt Qt+1 = 0 Qt+1 = 1 Qt+1 = not Qt
ÐÑ ÒÓ Ó Ò

0

1

Figura 4.3: Transici´n de estados de un flip-flop JK. En los arcos del o diagrama se muestra el valor de las se˜ales JK. El bit ’X’ es“don’t care”(por n ejemplo, “0X” representa “00” o “01”). La transici´n de reset se representa ´ o mediante una l´ ınea punteada.

Cuando la entrada de reset pasa de valer ’1’ a valer ’0’, el circuito pasa al estado Q=’0’. Se denomina reset as´ ıncrono porque la transici´n al estado ’0’ se o produce en el instante en que cambia la se˜ al de reset, con independencia del n valor de la se˜ al de reloj. La transici´n de reset se representa mediante una l´ n o ınea punteada en la Figura 4.3. El circuito tiene dos salidas: Q y Q. La salida Q es igual al estado y la salida Q es su inversa: Q = not Q.

4.3.1

Diseño del flip-flop

A continuaci´n, se muestra el c´digo VHDL del flip-flop JK con reset as´ o o ıncrono activado al nivel LOW. La architecture contiene un bloque process que es sensible a la se˜ al de reset y a la se˜ al de reloj. En el cuerpo del bloque process n n se examina primero la se˜ al de reset, ya que en caso de estar activa esa se˜ al (con n n valor ’0’) la m´quina debe pasar al estado Q=’0’. a
------------------------------------------------- Biestable JK con reset as´ncrono en nivel LOW ı library IEEE; use IEEE.std_logic_1164.all;

106

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

entity flipflop_JK is port ( q, q_n clk, J, K, reset_n end entity flipflop_JK;

: out std_logic; : in std_logic );

architecture flipflop_JK of flipflop_JK is signal q_interna : std_logic; begin q <= q_interna; q_n <= not q_interna; process (reset_n, clk) is variable JK : std_logic_vector(1 downto 0); begin if (reset_n = ’0’) then q_interna <= ’0’; elsif rising_edge(clk) then JK := J & K; case (JK) is when "01" when "10" when "11" when others => => => => q_interna <= ’0’; q_interna <= ’1’; q_interna <= not q_interna; null;

end case; end if; end process; end architecture flipflop_JK; ------------------------------------------------

4.3.2

Banco de pruebas

En el caso de los circuitos combinacionales, el objetivo del programa de test es comprobar (cuando esto es posible) todas las posibles combinaciones de valores de las entradas al circuito. En los circuitos secuenciales, el programa de test debe recorrer (cuando esto es posible) todos los arcos del diagrama de estado, para cada uno de los valores de las entradas que producen la transici´n. o En el caso del biestable JK, esto implica testear 8 transiciones. En la Figura 4.4 se indica el orden en que el programa de test recorrer´ los arcos (n´ mero inscrito a u en una circunferencia), y qu´ valores de las entradas se aplicar´ en cada caso para e a producir la transici´n. o En el banco de pruebas se ha definido un procedure, que comprueba que los valores actuales de la salida del flip-flop coinciden con los esperados, mostrando el correspondiente mensaje en caso de que no coincidan.

Cap´ ıtulo 4

Casos pr´cticos de dise˜o de circuitos secuenciales a n

107

0

Figura 4.4: Orden en que el programa de test recorre los arcos del diagrama de transiciones.

Obs´rvese que la sentencia wait que hay al final del bloque process finaliza e la ejecuci´n de dicho bloque, pero no la simulaci´n, ya que la simulaci´n de o o o las sentencias de asignaci´n concurrente a las se˜ ales de reset y reloj se realiza o n indefinidamente. Por tanto, la simulaci´n del banco de pruebas no finaliza por s´ o ı misma, siendo preciso fijar su duraci´n: 900 ns. o
--------------------------------------- Banco de pruebas del flip-flop JK library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; entity bp_flipflopJK is end entity bp_flipflopJK; architecture bp_flipflopJK of bp_flipflopJK is constant signal signal signal PERIODO q, q_n clk J, K, reset_n : : : : time := 100 ns; -- Reloj std_logic; -- Salidas UUT std_logic := ’0’; -- Entradas UUT std_logic;

component flipflop_JK is port ( q, q_n clk, J, K, reset_n end component flipflop_JK;

: out std_logic; : in std_logic );

-- Procedimiento para comprobar las salidas del flip-flop procedure comprueba_salidas ( esperado_q : std_logic; actual_q, actual_q_n : std_logic; error_count : inout integer) is begin -- Comprueba q if ( esperado_q /= actual_q ) then report "ERROR: Estado esperado (" &

ÕÖ Þ ÔÔ Ý

×× ß ÖÕ Û ×× Ü ÕÖ Ú

ÖÕ

ÔÔ Ø Ù à

1

108

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

std_logic’image(esperado_q) "), estado actual (" std_logic’image(actual_q) "), instante: " time’image(now); error_count := error_count + 1; end if; -- Comprueba q_n

& & & &

if ( (not esperado_q) /= actual_q_n ) then report "ERROR: q_n esperado (" std_logic’image((not esperado_q)) "), valor actual (" std_logic’image(actual_q_n) "), instante: " time’image(now); error_count := error_count + 1; end if; end procedure comprueba_salidas; begin -- Instanciar y conectar UUT uut : component flipflop_JK port map (q, q_n, clk, J, K, reset_n); reset_n <= ’1’, ’0’ after (PERIODO/4), ’1’ after (PERIODO+PERIODO/4); clk <= not clk after (PERIODO/2);

& & & & &

gen_vec_test : process is variable error_count : integer := 0; -- N´m. errores u begin report "Comienza la simulaci´n"; o -- Vectores de test y comprobaci´n del resultado o J <= ’0’; K <= ’0’; wait for PERIODO; -- 1 comprueba_salidas(’0’,q,q_n,error_count); J <= ’0’; K <= ’1’; wait for PERIODO; -- 2 comprueba_salidas(’0’,q,q_n,error_count); J <= ’1’; K <= ’0’; wait for PERIODO; -- 3 comprueba_salidas(’1’,q,q_n,error_count); wait for PERIODO; -- 4 J <= ’0’; K <= ’1’; comprueba_salidas(’0’,q,q_n,error_count); J <= ’1’; K <= ’1’; wait for PERIODO; -- 5 comprueba_salidas(’1’,q,q_n,error_count);

Cap´ ıtulo 4

Casos pr´cticos de dise˜o de circuitos secuenciales a n

109

J <= ’0’; K <= ’0’; wait for PERIODO; -- 6 comprueba_salidas(’1’,q,q_n,error_count); J <= ’1’; K <= ’0’; wait for PERIODO; -- 7 comprueba_salidas(’1’,q,q_n,error_count); wait for PERIODO; -- 8 J <= ’1’; K <= ’1’; comprueba_salidas(’0’,q,q_n,error_count); J <= ’0’; K <= ’0’; -- Deja el flip-flop en el estado ’0’ -- Informe final if (error_count = 0) then report "Simulaci´n finalizada sin errores"; o else report "ERROR: Hay " & integer’image(error_count) & " errores."; end if; wait; -- Final del bloque process, pero como

-- la architecture tiene sentencias de -- asignaci´n concurrente, esta sentencia o -- wait no finaliza la simulaci´n o end process gen_vec_test; end architecture bp_flipflopJK; --------------------------------------

La simulaci´n del banco de pruebas se realiza con cero errores. En la Figura 4.5 o se muestra el resultado obtenido de la simulaci´n. o

Figura 4.5: Resultado de la ejecuci´n del banco de pruebas del flip-flop JK. o

4.4

Máquinas de estado finito de Moore
Hay varias maneras de escribir c´digo VHDL para una m´quina de Moore. En o a primer lugar, puede escogerse describir el comportamiento o la estructura del circuito. En la mayor´ de los casos es preferible describir el comportamiento ıa

110

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

del circuito, ya que este tipo de descripci´n suele ser menos propensa a errores o y las herramientas de s´ ıntesis convertir´n estos dise˜ os en implementaciones a n optimizadas. En la Figura 4.6 se muestra una m´quina de Moore sencilla. La transici´n a o entre los tres estados depende del valor de la entrada, x. La salida del circuito, z, vale 1 en el estado S2 y 0 en los dem´s estados. Este c´digo puede ser adaptado a o f´cilmente para la descripci´n de otras m´quinas de Moore. a o a

1
S /0

0 0 0

1
S /1
â

1
S /0
ã

Figura 4.6: Maquina de estado finito de Moore.

4.4.1

Diseño de la máquina

A continuaci´n se muestra el c´digo VHDL que describe la m´quina de Moore o o a mostrada en la Figura 4.6. En primer lugar, se define un package con las constantes que ser´n usadas en el circuito y en el banco de pruebas. Definir las constantes a globales de esta manera facilita realizar cambios globales y la legibilidad del c´digo. o
-------------------------------------------------------- Paquete con la definici´n de las constantes globales o library IEEE; use IEEE.std_logic_1164.all; package STATE_CONSTANTS is constant STATE_BITS: integer := 2; -- Bits codifican estado constant S0: std_logic_vector(1 downto 0) := "00"; -- Estados constant S1: std_logic_vector(1 downto 0) := "01"; constant S2: std_logic_vector(1 downto 0) := "10"; end package; -------------------------------------------------------

El c´digo VHDL que describe el comportamiento de la m´quina de estado o a finito mostrada en la Figura 4.6 es el siguiente.
------------------------------------------------------- M´quina de Moore a library IEEE;

á

Cap´ ıtulo 4

Casos pr´cticos de dise˜o de circuitos secuenciales a n

111

use IEEE.std_logic_1164.all; use work.STATE_CONSTANTS.all; -- Definici´n de la entidad o entity maquinaMooreSimple is port( z : out std_logic; -- Se~al de salida n state : out std_logic_vector(STATE_BITS-1 downto 0); -- Estado actual de la m´quina a reset_n : in std_logic; -- Se~al reset activada en bajo n clk : in std_logic; -- Se~al de reloj n x : in std_logic); -- Se~al de entrada n end entity maquinaMooreSimple; -- Definici´n de la arquitectura o architecture maquinaMooreSimple of maquinaMooreSimple is signal internal_state: std_logic_vector(STATE_BITS-1 downto 0); begin state <= internal_state; -- Muestra el estado -- Genera la salida salida: process(internal_state) is begin case internal_state is when S0 when S1 when S2 when others end case; => => => => z z z z <= <= <= <= ’0’; ’0’; ’1’; ’X’;

end process salida; -- Genera el siguiente estado proximo_estado: process(reset_n,clk) is begin if (reset_n = ’0’) then -- Reset as´ncrono ı internal_state <= S0; elsif rising_edge(clk) then -- En flanco subida del reloj case internal_state is when S0 => -- Estado actual: S0 if (x = ’1’) then internal_state <= S1; else internal_state <= S2; end if; when S1 => if (x = ’0’) then -- Estado actual: S1

112

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

internal_state <= S2; end if; when S2 => -- Estado actual: S2 if (x = ’0’) then internal_state <= S0; end if; when others => -- Por completitud internal_state <= "XX"; end case; end if; end process proximo_estado; end architecture maquinaMooreSimple; ------------------------------------------------------

En el c´digo anterior, puede observarse que: o – La interfaz del circuito est´ compuesta por dos puertos de salida (la salida a y el estado actual) y tres puertos de entrada (se˜ al de reset as´ n ıncrono, reloj y entrada). Cuando la se˜ al de reset (reset_n) pasa de valer 1 a valer 0, n entonces la m´quina pasa al estado S0 . a – Se ha definido una se˜ al interna a la architecture, llamada internal_state, n que almacena el estado actual en que se encuentra la m´quina. Cabe preguna tarse por qu´ no se usa directamente la se˜ al state, ya que ambas se˜ ales e n n representan lo mismo y, de hecho, la sentencia
state <= internal_state;

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´ en el cuerpo de la n ıda architecture. Puesto que internal_state es una se˜ al interna, puede ser n le´ y escrita. ıda – La architecture contiene dos bloques process: 1. El primero, que es activado cuando hay un cambio en internal_state, describe los cambios en la se˜ al de salida, z. n 2. El segundo, que es activado cuando cambia la se˜ al de reset as´ n ıncrono (reset_n) o el reloj (clk), describe los cambios en el estado de la m´quina, actualizando el valor de la se˜ al internal_state. a n Puesto que se comprueba antes el valor de reset_n, esta se˜ al tiene n prioridad sobre la se˜ al de reloj. n Se emplea la funci´n est´ndar de VHDL rising edge para representar o a que las transiciones en el estado s´lo se producen en el flanco de subida o de la se˜ al de reloj. n – Se ha a˜ adido una cl´usula when other al final de los dos bloques case, n a con el fin de contemplar todos los casos posibles. Obs´rvese que se asigna e

Cap´ ıtulo 4

Casos pr´cticos de dise˜o de circuitos secuenciales a n

113

el valor ’X’ (don’t care) a la se˜ al de salida. Esta es una buena pr´ctica, n a ya que con ello se ayuda a la herramienta de s´ ıntesis a optimizar el circuito combinacional para la se˜ al de salida (z). n

4.4.2

Banco de pruebas

A continuaci´n, se muestra el c´digo VHDL de un banco de pruebas que puede o o usarse para comprobar el funcionamiento de la m´quina de estado finito. El a programa de test ejercita completamente la m´quina: todos los arcos de las a transiciones son recorridos al menos una vez. En la Figura 4.7 se indica el instante de tiempo en el cual se produce la transici´n entre los estados. La constante T es el periodo de la se˜ al de reloj, que o n en el c´digo VHDL del banco de pruebas de denomina PERIODO y toma el valor o 100 ns. La se˜ al de reloj, que inicialmente vale 0, tiene un periodo (PERIODO) n de T = 100 ns. Esto implica que los flancos de subida de la se˜ al de reloj se n 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 4.7. Para generar la se˜ al de reloj se u n emplea la siguiente sentencia concurrente:
clk <= not clk after ( PERIODO/2 );

donde se asume que la se˜ al de reloj ha sido inicializada al valor ’0’. Obs´rvese n e que de esta forma se crea una se˜ al de reloj infinitamente larga, con lo cual la n simulaci´n no finalizar´ autom´ticamente, sino que hay que definir el instante de o a a finalizaci´n. o
ûú ùùø ö÷öõôóò ü ç è ê é î íì ï î íìí

=

=

S /0
æ

Figura 4.7: Transiciones en el estado realizadas durante el test.

En el c´digo del banco de pruebas, se define un procedimiento para comparar o el valor esperado del estado y la salida de la m´quina con los actuales. De esta a forma el c´digo se hace m´s f´cilmente comprensible. o a a
------------------------------------------------------- Banco de pruebas para la m´quina de Moore a library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all;

å

î íì ð

î íìñ

S /1

î íì ë

S /0
ä

¡  ÿþý

114

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

use work.STATE_CONSTANTS.all; -- Definici´n de la entity o entity bp_maquinaMooreSimple is constant PERIODO : time := 100 ns; -- Periodo reloj end entity bp_maquinaMooreSimple; -- Definici´n de la architecture o architecture bp_maquinaMooreSimple of bp_maquinaMooreSimple is signal z : std_logic; signal state : std_logic_vector(STATE_BITS-1 downto 0); signal reset_n : std_logic; signal clk : std_logic := ’0’; -- Inicializada a ’0’ signal x : std_logic;

-- Declaraci´n del componente: UUT o component maquinaMooreSimple is : out std_logic; -- Se~al de salida n port( z state : out std_logic_vector(STATE_BITS-1 downto 0); -- Estado actual de la m´quina a reset_n : in std_logic; -- Se~al reset activada en bajo n clk : in std_logic; -- Se~al de reloj n x : in std_logic); -- Se~al de entrada n end component maquinaMooreSimple; -- Procedimiento para comprobar el resultado procedure comprueba_state_z ( esperado_state : std_logic_vector(STATE_BITS-1 downto 0); esperado_z actual_state actual_z error_count begin : : : : inout std_logic; std_logic_vector(STATE_BITS-1 downto 0); std_logic; integer ) is

-- Comprueba el estado assert ( esperado_state = actual_state ) report "ERROR : estado esperado (" & std_logic’image(esperado_state(1)) & std_logic’image(esperado_state(0)) & "), estado actual (" std_logic’image(actual_state(1)) std_logic’image(actual_state(0)) ") en el instante " time’image(now); if ( esperado_state /= actual_state ) then error_count := error_count + 1; & & & &

Cap´ ıtulo 4

Casos pr´cticos de dise˜o de circuitos secuenciales a n

115

end if; -- Comprueba la salida if ( esperado_z /= actual_z ) then report "ERROR: salida esperada (" std_logic’image(esperado_z) "), salida actual (" std_logic’image(actual_z) ") en el instante " time’image(now); error_count := error_count + 1; end if; end procedure comprueba_state_z; -- Cuerpo de la architecture begin -- Instancia UUT UUT : component maquinaMooreSimple port map ( z, state, reset_n, clk, x ); -- Genera un unico pulso LOW para reset_n ´ -- En el instante PERIODO/4 se resetea la m´quina a reset_n <= ’1’, ’0’ after ( PERIODO/4 ), ’1’ after ( PERIODO + PERIODO/4 ); -- Genera se~al clk, asumiendo que se inicializ´ a 0 n o -- Flanco de subida en los instantes: -- PERIODO/2, PERIODO+PERIODO/2, 2*PERIODO+PERIODO/2, ... clock : clk <= not clk after ( PERIODO/2 ); -- main process: -- genera vectores de test y comprueba resultados main : process is variable error_count : integer := 0; -- Num. errores begin report "Comienza la simulaci´n"; o x <= ’0’; -- Valor inicial de entrada a UUT wait for PERIODO; -- En el instante PERIODO, el estado deber´a ser S0 ı comprueba_state_z(S0, ’0’, state, z, error_count); wait for PERIODO; -- En el instante 2*PERIODO, el estado deber´a ser S2 ı comprueba_state_z(S2, ’1’, state, z, error_count); x <= ’1’; wait for PERIODO; & & & & &

116

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

-- En el instante 3*PERIODO, el estado deber´a ser S2 ı comprueba_state_z(S2, ’1’, state, z, error_count); x <= ’0’; wait for PERIODO; -- En el instante 4*PERIODO, el estado deber´a ser S0 ı comprueba_state_z(S0, ’0’, state, z, error_count); x <= ’1’; wait for PERIODO; -- En el instante 5*PERIODO, el estado deber´a ser S1 ı comprueba_state_z(S1, ’0’, state, z, error_count); wait for PERIODO; -- En el instante 6*PERIODO, el estado deber´a ser S1 ı comprueba_state_z(S1, ’0’, state, z, error_count); x <= ’0’; wait for PERIODO; -- En el instante 7*PERIODO, el estado deber´a ser S2 ı comprueba_state_z(S2, ’1’, state, z, error_count); x <= ’1’; -- El estado final es S2 wait for PERIODO; if (error_count = 0) then o report "Simulaci´n finalizada con 0 errores"; else report "ERROR: hay " & integer’image(error_count) & " errores."; end if; wait; -- Final de la ejecuci´n del bloque process. o -- La simulaci´n continua debido a la sentencia de o -- asignaci´n a la se~al clk o n end process main; end architecture bp_maquinaMooreSimple;

En la Figura 4.8 se muestran las formas de onda obtenidas al ejecutar el banco de pruebas. El test de ejecuta con cero errores.

Figura 4.8: Resultado de la ejecuci´n del test. o

Cap´ ıtulo 4

Casos pr´cticos de dise˜o de circuitos secuenciales a n

117

4.4.3

Modelado estructural

Ahora veremos c´mo describir la m´quina de estado finito de la Figura 4.6 o a empleando c´digo VHDL estructural. Usando c´digo estructural se tiene mayor o o control acerca de la l´gica que se emplea en el dise˜ o, con lo cual pueden conseo n guirse circuitos m´s optimizados que los dados por las herramientas de s´ a ıntesis a partir de la descripci´n del comportamiento. Sin embargo, implica realizar parte o del dise˜ o manualmente, con el consiguiente riesgo de cometer errores. n Para emplear c´digo VHDL estructural, en primer lugar hay que decidir qu´ o e componentes van a usarse en el dise˜ o. Emplearemos puertas l´gicas b´sicas n o a (AND, OR, inversor, NAND, NOR y XOR), as´ como flip-flops tipo D tales como ı el descrito en el Ejemplo 2.3.4. A continuaci´n, debemos obtener las funciones l´gicas para el c´lculo de la o o a salida y del siguiente estado. La tabla de transici´n de estados y salidas para la o m´quina descrita en la Figura 4.6 es la siguiente: a Estado actual Entrada Pr´ximo estado Salida o A B x NA NB z S0 : S0 : S1 : S1 : S2 : S2 : 0 0 0 0 1 1 0 0 1 1 0 0 0 1 0 1 0 1 S2 : S1 : S2 : S1 : S0 : S2 : 1 0 1 0 0 1 0 1 0 1 0 0 0 0 0 0 1 1

Las funciones l´gicas simplificadas que relacionan el pr´ximo estado (N A, o o N B) y la salida (z), con el estado actual (A, B) y la entrada (x) son:

NA = x A + x A NB = x A z=A

(4.4) (4.5) (4.6)

Puede escribirse el siguiente c´digo VHDL estructural a partir de la funciones o l´gicas anteriores. Se define una nueva architecture para la entity del circuito o anteriormente definida.
------------------------------------------------------- M´quina de Moore, dise~o estructural a n library IEEE; use IEEE.std_logic_1164.all; -- Definici´n de la arquitectura o architecture maquinaMooreSimple_estruc of maquinaMooreSimple is signal A, B : std_logic; -- Variables de estado actuales signal NA, NB : std_logic; -- Pr´ximas variables de estado o

118

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

-- Componente: flip-flop 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 -- Conexiones de los flip-flops -- Las salidas q_n se dejan sin conectar dff_A: component flipflop_D port map ( q => A, d => NA, clk => clk, reset_n => reset_n ); dff_B: component flipflop_D port map ( q => B, d => NB, clk => clk, reset_n => reset_n ); -- Funciones para el c´lculo del nuevo estado y la salida a NA <= ((not x) and (not A)) or (x and A); NB <= x and (not A); z <= A; end architecture maquinaMooreSimple_estruc; ------------------------------------------------------

Puede emplearse el banco de pruebas descrito en la Secci´n 4.4.2 para testear o esta descripci´n del circuito. Se obtienen los mismos resultados que se obtuvieron o cuando se hizo el test de la descripci´n del comportamiento (v´ase la Figura 4.8). o e Los resultados del test se muestran en la Figura Figura 4.9.

Figura 4.9: Resultado de la ejecuci´n del test. o

Cap´ ıtulo 4

Casos pr´cticos de dise˜o de circuitos secuenciales a n

119

4.5

Máquinas de estado finito de Mealy
En las m´quinas de Mealy, las salidas del circuito dependen del estado actual y a del valor actual de las entradas. As´ pues, aunque la m´quina permanezca en un ı a determinado estado, sus salidas pueden cambiar si cambian las entradas. Como ejemplo de implementaci´n de una m´quina de Mealy, consideremos o a la m´quina para el reconocimiento de la secuencia de bits 0110 mostrada en la a Figura 4.10. Obs´rvese que se permite el solapamiento de secuencias (por ejemplo, e 0110110). La salida de la m´quina es un ’1’ l´gico cada vez que se detecta el patr´n a o o 0110 en la secuencia de bits de entrada, que se supone que est´ sincronizada con a el reloj de la m´quina. El tiempo que transcurre entre la entrada del ultimo ’0’ a ´ del patr´n y la salida del ’1’ es igual al retardo de una puerta l´gica. Para los o o dem´s bits de la secuencia de entrada, la salida de la m´quina es ’0’. a a
¢ £¢
Figura 4.10: Diagrama de estado de una m´quina de Mealy para el a reconocimiento de la secuencia 0110.

4.5.1

Diseño de la máquina

Adem´s de la entrada serie de la secuencia de bits (x) y la entrada del reloj (clk), a la m´quina tiene una entrada de reset s´ a ıncrono activada en ’0’ (reset_n). Esto significa que si cuando se produce un flanco de subida de la se˜ al del reloj, la n entrada reset_n vale ’0’, entonces se resetea la m´quina, es decir, pasa al estado a S0. La m´quina tiene dos salidas: el estado actual de la m´quina (state) y la a a salida de detecci´n del patr´n 0110 (z). o o Las constantes globales, que son usadas tanto en el dise˜ o del circuito como n en el banco de pruebas, son definidas en el package mostrado a continuaci´n. o
----------------------------------------- Definici´n de las constantes globales o library IEEE; use IEEE.std_logic_1164.all; 

S

©

¦ ¥¤

¢ £¢

¤ ¥¦ ¦ ¥¤

§

S

¦ ¥¤

¨

S

¢ £¢

¦ ¥¤

S

120

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

package seq0110_CONST is constant STATE_BITS : integer := 2; -- Num. bits del estado constant S0 : std_logic_vector(1 downto 0) := "00"; constant S1 : std_logic_vector(1 downto 0) := "01"; constant S2 : std_logic_vector(1 downto 0) := "10"; constant S3 : std_logic_vector(1 downto 0) := "11"; end package seq0110_CONST; ----------------------------------------

A continuaci´n se muestra el c´digo VHDL que describe el comportamiento o o de la m´quina. Obs´rvese que se han definido dos bloques process: uno para a e generar la salida, que es sensible al estado y a la entrada, y otro para generar el pr´ximo estado y resetear al m´quina, que es sensible unicamente a la se˜ al de o a ´ n reloj. Puesto que la m´quina tiene reset s´ a ıncrono, este segundo bloque process no es sensible a la se˜ al de reset. n
--------------------------------------------------- M´quina de Mealy detectora de la secuencia 0110 a library IEEE; use IEEE.std_logic_1164.all; use work.seq0110_CONST.all; -- Definici´n de la entity o entity seq0110 is port ( z : out std_logic; -- Se~al de salida n state : out std_logic_vector(STATE_BITS-1 downto 0); -- Estado actual reset_n : in std_logic; -- Reset s´ncrono activado LOW ı clk : in std_logic; x : in std_logic ); end entity seq0110; -- Definici´n de la architecture o architecture seq0110 of seq0110 is signal internal_state : std_logic_vector(STATE_BITS-1 downto 0); begin state <= internal_state; -- C´lculo de la salida a calculo_salida: process (internal_state, x) is begin if ( (internal_state = S3) and (x = ’0’) ) then z <= ’1’; else z <= ’0’; -- Se~al de reloj n -- Bit de entrada

Cap´ ıtulo 4

Casos pr´cticos de dise˜o de circuitos secuenciales a n

121

end if; end process calculo_salida; -- C´lculo del pr´ximo estado a o proximo_estado: process (clk) is begin if ( (reset_n = ’0’) and rising_edge(clk) ) then -- Reset s´ncrono ı internal_state <= S0; elsif rising_edge(clk) then case internal_state is when S0 => if (x = ’0’) then internal_state <= S1; else internal_state <= S0; end if; when S1 => if (x = ’1’) then internal_state <= S2; else internal_state <= S1; end if; when S2 => if (x = ’1’) then internal_state <= S3; else internal_state <= S1; end if; when others => if (x = ’0’) then internal_state <= S1; else internal_state <= S0; end if; end case; end if; end process proximo_estado; end architecture seq0110; --------------------------------------------------- Tercer bit del patr´n o -- Flanco de subida del reloj

-- Primer bit del patr´n o

-- Segundo bit del patr´n o

-- Cuarto bit del patr´n o

El bloque process usado para generar el pr´ximo estado corresponde dio rectamente con el diagrama mostrado en la Figura 4.10. La se˜ al de reset no n se ha incluido en la lista de se˜ ales a las que es sensible el bloque. As´ pues, n ı este bloque s´lo es activado cuando se produce un cambio en la se˜ al de reloj: o n la condici´n if ( (reset_n = ’0’) and rising_edge(clk) ) s´lo se comprueba o o

122

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

cuando se produce un cambio en la se˜ al de reloj. De esta forma, se implementa n un reset s´ ıncrono. El bloque process usado para generar la se˜ al de salida podr´ reemplazarse n ıa por la siguiente sentencia concurrente:
z <= ’1’ when ( (internal_state = S3) and (x = ’0’) ) else ’0’;

que es activada cada vez que se produce un cambio en alguna de las se˜ ales de n la parte derecha de la asignaci´n. o Puesto que ´ste es un bloque combinacional, la duraci´n de la se˜ al ’1’ de e o n salida puede ser m´s peque˜ a que un ciclo de reloj, ya que su duraci´n depende a n o del tiempo durante el cual la entrada x siga valiendo ’0’ mientras la m´quina a permanezca en el estado S3. Para garantizar que la salida ’1’ tiene una duraci´n de al menos un ciclo de o reloj, es necesario hacer pasar la se˜ al de salida por un flip-flop D. Esto puede n hacerse a˜ adiendo a la descripci´n de la arquitectura el siguiente bloque process: n o
ffD_salida: process (clk) is begin if ( rising_edge(clk) ) then z_long <= z; end if; end process ffD_salida;

y haciendo que z_long sea la salida del circuito. La definici´n del circuito, modio ficada de la forma descrita anteriormente, es mostrada a continuaci´n. o
--------------------------------------------------- M´quina de Mealy detectora de la secuencia 0110 a library IEEE; use IEEE.std_logic_1164.all; use work.seq0110_CONST.all; -- Definici´n de la entity o entity seq0110 is port ( z_long : out std_logic; state

-- Se~al de salida n

: out std_logic_vector(STATE_BITS-1 downto 0); -- Estado actual reset_n : in std_logic; -- Reset s´ncrono activado LOW ı clk : in std_logic; -- Se~al de reloj n x : in std_logic ); -- Bit de entrada end entity seq0110; -- Definici´n de la architecture o architecture seq0110 of seq0110 is signal internal_state : std_logic_vector(STATE_BITS-1 downto 0); signal z : std_logic; -- Se~al de salida obtenida n

Cap´ ıtulo 4

Casos pr´cticos de dise˜o de circuitos secuenciales a n

123

-- a partir del estado actual -- y la entrada actual, mediante -- un circuito combinacional begin state <= internal_state; -- C´lculo de la salida a -- z <= ’1’ when ( (internal_state = S3) and (x = ’0’) ) else ’0’; calculo_salida: process (internal_state,x) is begin if ( (internal_state = S3) and (x = ’0’) ) then z <= ’1’; else z <= ’0’; end if; end process calculo_salida; -- Se hace pasar la salida por un flip-flop D para garantizar que -- se mantiene su valor un ciclo de reloj ffD_salida: process (clk) is begin if ( rising_edge(clk) ) then z_long <= z; end if; end process ffD_salida; -- C´lculo del pr´ximo estado a o proximo_estado: process (clk) is begin if ( (reset_n = ’0’) and rising_edge(clk) ) then -- Reset s´ncrono ı internal_state <= S0; elsif rising_edge(clk) then -- Flanco de subida del reloj case internal_state is when S0 => if (x = ’0’) then internal_state <= S1; else internal_state <= S0; end if; when S1 => if (x = ’1’) then internal_state <= S2; else internal_state <= S1; end if; -- Primer bit del patr´n o

-- Segundo bit del patr´n o

124

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

when S2 => if (x = ’1’) then internal_state <= S3; else internal_state <= S1; end if; when others => if (x = ’0’) then internal_state <= S1; else internal_state <= S0; end if; end case; end if; end process proximo_estado; end architecture seq0110; --------------------------------------------------

-- Tercer bit del patr´n o

-- Cuarto bit del patr´n o

Para mostrar el funcionamiento del circuito, puede dise˜ arse un peque˜ o n n banco de pruebas que introduzca algunos vectores de test. A continuaci´n, se o muestra un ejemplo de este tipo de banco de pruebas.
------------------------------------------------------- Banco de pruebas que introduce algunos vectores de -- test en la m´quina detectora de la secuencia 0110 a library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; use work.seq0110_CONST.all; entity bp1_seq0110 is constant PERIODO : time := 100 ns; -- Periodo reloj end entity bp1_seq0110; architecture bp1_seq0110 of bp1_seq0110 is signal z_long : std_logic; -- Salida de la m´quina a signal state : std_logic_vector(STATE_BITS-1 downto 0); -- Estado actual signal reset_n : std_logic; signal clk : std_logic := ’0’; signal x : std_logic; -- Declaraci´n del componente o component seq0110 is port ( z_long : out std_logic; -- Reset s´ncrono activado LOW ı -- Se~al de reloj n -- Entrada a la m´quina a

Cap´ ıtulo 4

Casos pr´cticos de dise˜o de circuitos secuenciales a n

125

state : out std_logic_vector(STATE_BITS-1 downto 0); reset_n : in std_logic; clk : in std_logic; x : in end component seq0110; begin -- Instanciar UUT UUT: component seq0110 port map ( z_long, state, reset_n, clk, x ); -- Generar un pulso LOW en la entrada de reset reset_n <= ’1’, ’0’after ( PERIODO/4 ), ’1’after ( PERIODO + PERIODO/4 ); -- Generar la se~al de reloj, n -- asumiendo que ha sido inicializada a ’0’ clk <= not clk after ( PERIODO/2 ); -- Generar algunos vectores de test main : process is begin report "Comienza la simulaci´n"; o x <= ’0’; wait for 2*PERIODO; x <= ’1’; wait for PERIODO; x <= ’1’; wait for PERIODO; x <= ’0’; wait for PERIODO; x <= ’1’; x <= ’1’; x <= ’0’; x <= ’1’; wait; wait for PERIODO; wait for PERIODO; wait for PERIODO; wait for PERIODO; -- Detiene este bloque process, pero no -- finaliza la simulaci´n debido a que o -- hay asignaciones concurrentes end process main; end architecture bp1_seq0110; std_logic );

Ejecutando este banco de pruebas durante 1200 ns, se obtienen las se˜ ales n mostradas en la Figura 4.11. Obs´rvese que la se˜ al z vale ’1’ mientras el circuito e n se encuentra en el estado S3 y la entrada vale ’0’. La se˜ al z est´ conectada a la n a entrada de un flip-flop D, cuya salida es la se˜ al z_long, que mantiene su valor a n ’1’ durante un ciclo completo de reloj.

126

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

Figura 4.11: Resultado de la simulaci´n del circuito detector del patr´n o o 0110.

4.5.2

Banco de pruebas

El banco de pruebas anterior da cierta informaci´n acerca del comportamiento del o circuito, pero no lo prueba de manera sistem´tica. A continuaci´n, se muestra el a o c´digo de un banco de pruebas que testea sistem´ticamente el circuito, pasando o a al menos una vez por cada uno de los arcos de transici´n entre estados de la o m´quina. El orden en el cual el banco de pruebas recorre los arcos de transici´n a o de la m´quina es mostrado en la Figura 4.12. El c´digo del banco de pruebas es a o mostrado a continuaci´n. o
4

3 1

10

13

9

Figura 4.12: Orden en que el programa de test recorre los arcos del diagrama de estado de la m´quina. a

------------------------------------------------------- Banco de pruebas - M´quina detectora secuencia 0110 a library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; use work.seq0110_CONST.all; entity bp_seq0110 is constant PERIODO : time := 100 ns; -- Periodo reloj end entity bp_seq0110; architecture bp_seq0110 of bp_seq0110 is signal z_long : std_logic; -- Salida de la m´quina a signal state : std_logic_vector(STATE_BITS-1 downto 0); 

S

8 12  

S 

6

2

S

5

7

11

S

Cap´ ıtulo 4

Casos pr´cticos de dise˜o de circuitos secuenciales a n

127

signal reset_n : std_logic; signal clk : std_logic := ’0’; signal x : std_logic;

-- Estado actual -- Reset s´ncrono activado LOW ı -- Se~al de reloj n -- Entrada a la m´quina a

-- Declaraci´n del componente o component seq0110 is port ( z_long : out std_logic; state : out reset_n : in clk : in x : in end component seq0110; std_logic_vector(STATE_BITS-1 downto 0); std_logic; std_logic; std_logic );

-- Procedimiento para comprobar si se produce error procedure comprueba_estado_salida std_logic_vector(STATE_BITS-1 downto 0); ( esperado_state : std_logic; esperado_z : actual_state actual_z error_count begin -- Comprueba el : std_logic_vector(STATE_BITS-1 downto 0); : std_logic; : inout integer) is estado & & & & & & &

assert( esperado_state = actual_state ) report "ERROR: Estado esperado (" std_logic’image(esperado_state(1)) std_logic’image(esperado_state(0)) "), estado actual (" std_logic’image(actual_state(1)) std_logic’image(actual_state(0)) "), instante: " time’image(now); if ( esperado_state /= actual_state ) then error_count := error_count + 1; end if; -- Comprueba salida assert( esperado_z = actual_z ) report "ERROR: Salida esperada (" std_logic’image(esperado_z) "), salida actual (" std_logic’image(actual_z) "), instante: " time’image(now); if ( esperado_z /= actual_z ) then

& & & & &

128

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

error_count := error_count + 1; end if; end procedure comprueba_estado_salida; begin -- Instanciar UUT UUT: component seq0110 port map ( z_long, state, reset_n, clk, x ); -- Generar un pulso LOW en la entrada de reset reset_n <= ’1’, ’0’after ( PERIODO/4 ), ’1’after ( PERIODO + PERIODO/4 ); -- Generar la se~al de reloj, n -- asumiendo que ha sido inicializada a ’0’ clk <= not clk after ( PERIODO/2 ); -- Generar vectores de test y comprobar el resultado main : process is u variable error_count : integer := 0; -- N´m. errores begin report "Comienza la simulaci´n"; o x <= ’0’; wait for PERIODO; -- Comprueba reset, empieza en S0 comprueba_estado_salida(S0,’0’,state,z_long,error_count); x <= ’1’; wait for PERIODO; -- Sigue en S0 comprueba_estado_salida(S0,’0’,state,z_long,error_count); x <= ’0’; wait for PERIODO; -- Va a S1 comprueba_estado_salida(S1,’0’,state,z_long,error_count); x <= ’0’; wait for PERIODO; -- Sigue en S1 comprueba_estado_salida(S1,’0’,state,z_long,error_count); x <= ’1’; wait for PERIODO; -- Va a S2 comprueba_estado_salida(S2,’0’,state,z_long,error_count); x <= ’0’; wait for PERIODO; -- Va a S1 comprueba_estado_salida(S1,’0’,state,z_long,error_count); x <= ’1’; wait for PERIODO; -- Va a S2 comprueba_estado_salida(S2,’0’,state,z_long,error_count); x <= ’1’; wait for PERIODO; -- Va a S3 comprueba_estado_salida(S3,’0’,state,z_long,error_count); x <= ’1’; wait for PERIODO; -- Va a S0 comprueba_estado_salida(S0,’0’,state,z_long,error_count); wait for PERIODO; -- Va a S1 x <= ’0’; comprueba_estado_salida(S1,’0’,state,z_long,error_count); x <= ’1’; wait for PERIODO; -- Va a S2 comprueba_estado_salida(S2,’0’,state,z_long,error_count);

Cap´ ıtulo 4

Casos pr´cticos de dise˜o de circuitos secuenciales a n

129

x <= ’1’; wait for PERIODO; -- Va a S3 comprueba_estado_salida(S3,’0’,state,z_long,error_count); x <= ’0’; wait for PERIODO/4; -- Va a S1 comprueba_estado_salida(S3,’0’,state,z_long,error_count); -- Salida ’0’ en S3 wait for 3*(PERIODO/4); comprueba_estado_salida(S1,’1’,state,z_long,error_count); -- Salida ’1’ en S1 wait for PERIODO; -- Sigue en S1 comprueba_estado_salida(S1,’0’,state,z_long,error_count); wait for PERIODO; -- Tests finalizados if (error_count = 0) then report "Simulaci´n finalizada sin errores"; o else report "ERROR: Hay " & integer’image(error_count) & " errores."; end if; wait; -- Detiene este bloque process, pero no -- finaliza la simulaci´n debido a que o -- hay asignaciones concurrentes

end process main; end architecture bp_seq0110;

El test se ejecuta durante 1500 ns, sin que se produzca ning´ n error. En la u Figura 4.13 se muestra la evoluci´n de las se˜ ales durante los primeros 1400 ns. o n

Figura 4.13: Resultado de la simulaci´n del programa de test. o

130

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

4.6

Descripción VHDL de alto nivel
Las herramientas de s´ ıntesis actuales son capaces de generar circuitos eficientes a partir de una descripci´n RTL (register-transfer level) del circuito. De hecho, a o menos que el dise˜ ador est´ muy familiarizado con la arquitectura hardware en la n e que va a implementarse el circuito, generalmente se obtienen mejores circuitos si se realiza una descripci´n VHDL de alto nivel del circuito y se emplea una buena o herramienta de s´ ıntesis, en lugar de dise˜ ar manualmente (al nivel de puertas n l´gicas o transistores) el circuito. o Debido a esto, el m´todo de dise˜ o de hardware recomendado actualmente e n es realizar una descripci´n VHDL de alto nivel del circuito y emplear una buena o herramienta de s´ ıntesis para obtener la netlist para la arquitectura hardware de la implementaci´n. Cuando se describe el comportamiento del circuito a alto nivel, o la herramienta de s´ ıntesis tiene mayor libertad para optimizar su estructura, produciendo circuitos m´s eficientes. a Por ejemplo, si el dise˜ ador realiza una descripci´n estructural basada en n o puertas NAND, o emplean una secuencia de ecuaciones l´gicas para describir o el circuito, entonces la herramienta de s´ ıntesis s´lo puede eliminar las puertas o redundantes y simplificar las funciones l´gicas. En cambio, si el dise˜ ador describe o n el comportamiento esperado de ese mismo circuito, la herramienta de s´ ıntesis puede producir un dise˜ o l´gico completamente diferente que sea m´s eficiente n o a que el considerado originalmente por el dise˜ ador. n Para ilustrar c´mo puede realizarse una descripci´n VHDL de alto nivel a o o partir de una descripci´n algor´ o ıtmica, consideraremos nuevamente el dise˜ o de n un circuito detector de patrones en una secuencia de bits.

4.6.1

Circuito detector de secuencia

Supongamos que deseamos dise˜ ar un circuito para la detecci´n de la siguiente n o secuencia de entrada serie: 0111 1110 (esta secuencia de emplea frecuentemente como marcadora de final de paquete). El siguiente algoritmo permite resolver este problema:
Paso 1. Paso 2. prev_data <- 1111 1111; /* Almacena 8 bits anteriores */ while (true) do /* Se repite indefinidamente */ data_in <- siguiente dato de entrada; prev_data <- prev_data << 1 /* Desplazamiento izqda */ prev_data[0] <- data_in; /* Se almacena data_in en LSB */ if (prev_data == 0111 1110) then detectado <- 1; /* Secuencia detectada */ else detectado <- 0; /* Secuencia no detectada */ end while

El c´digo VHDL del circuito detector de secuencia puede escribirse direco tamente bas´ndose en el algoritmo anterior. A continuaci´n, se muestran dos a o versiones de la descripci´n del circuito: una en la cual prev_data es una variable o

Cap´ ıtulo 4

Casos pr´cticos de dise˜o de circuitos secuenciales a n

131

y otra en la cual es una se˜ al. Ambas descripciones de la arquitectura son n igualmente v´lidas. a
-------------------------------------------- Circuito detector de secuencia 0111 1110 library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; entity detector_sec is port ( detectado : out reset_n : in clk : in data_in : in end entity detector_sec; std_logic; std_logic; std_logic; std_logic );

architecture detector_sec1 of detector_sec is begin process (reset_n, clk) is variable prev_data : unsigned (7 downto 0); begin if (reset_n = ’0’) then prev_data := B"1111_1111"; elsif rising_edge(clk) then prev_data := prev_data sll 1; prev_data(0) := data_in; if (prev_data = B"0111_1110") then detectado <= ’1’; else detectado <= ’0’; end if; end if; end process; end architecture detector_sec1; -------------------------------------------

La unica diferencia entre la descripci´n en VHDL y la descripci´n algor´ ´ o o ıtmica, aparte del uso de la sintaxis de VHDL, es que en el c´digo VHDL no se ha incluido o la sentencia
data_in <- siguiente dato de entrada;

En el c´digo VHDL no es necesario realizar la asignaci´n del siguiente bit de o o la secuencia de entrada a data_in porque se supone que los bits de datos entran en sincron´ con el flanco de subida de la se˜ al de reloj. ıa n A continuaci´n, se muestra otra forma de describir la architecture del ciro cuito. En este caso, prev_data es una se˜ al. n

132

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

------------------------------------------architecture detector_sec2 of detector_sec is signal prev_data : unsigned (7 downto 0); begin process (reset_n, clk) is begin if (reset_n = ’0’) then prev_data <= B"1111_1111"; elsif rising_edge(clk) then prev_data <= (prev_data(6 downto 0) & data_in); if ((prev_data(6 downto 0) & data_in) = B"0111_1110") then detectado <= ’1’; else detectado <= ’0’; end if; end if; end process; end architecture detector_sec2; -------------------------------------------

La sentencia
prev_data <= (prev_data(6 downto 0) & data_in);

realiza un desplazamiento l´gico de un bit hacia la izquierda e inserta data_in en o el bit menos significativo. Puesto que la asignaci´n a se˜ ales no tiene efecto inmediatamente, sino un o n delta de tiempo posterior al tiempo simulado actual, esta operaci´n de deso plazamiento se ejecuta concurrentemente con la sentencia if que comprueba la ıa igualdad con B"0111_1110". Puesto que el valor de prev_data todav´ no ha sido actualizado en el momento en que se realiza la comparaci´n, es necesario realizar o la comparaci´n usando el valor de prev_data anterior al desplazamiento. o

VeriBest VB99.0

A

Objetivos. Instalar en su propio ordenador y realizar las operaciones b´sicas de a manejo del entorno de simulaci´n de VHDL’93 VeriBest. Estas operaciones b´sicas o a incluyen al menos: – Edici´n y compilaci´n de modelos. o o – Simulaci´n y visualizaci´n de los resultados. o o – Depurado usando el debugger.

A.1 Instalación
La versi´n de evaluaci´n VB99.0 presenta la limitaci´n siguiente: el modelo no o o o puede superar las 2000 l´ ıneas o las 2000 referencias a componentes. Para instalar Veribest VB99.0, pueden seguirse los pasos siguientes: 1. Ejecute el fichero setup.exe, que se encuentra dentro del directorio VHDL Simulator. 2. Acepte los t´rminos de la licencia. e 3. Escoja el directorio en el cual desea que se instale el simulador. 4. Seleccione para su instalaci´n “VeriBest VHDL Simulator”, que es la opci´n o o se˜ alada por defecto. n 5. El programa de instalaci´n copia todos los ficheros necesarios en el disco, o creando en el grupo de programas de Windows un nuevo grupo llamado VeriBest VB99.0. Dentro de ´ste hay una carpeta, “VeriBest VHDL Simue lator”, en la que se encuentra el simulador VHDL (VeriBest VHDL), un tutorial y la documentaci´n en l´ o ınea.

134

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

A.2

Circuito digital ejemplo: buffer triestado
Va a emplearse el modelo de un buffer triestado para ilustrar las explicaciones acerca del manejo del simulador. Este tipo de componente se emplea com´ nmente u para conectar varios dispositivos a un mismo bus. Tal como se muestra en la Figura A.1, el buffer triestado tiene dos entradas (d y E) y una salida (y). La salida puede tomar tres valores: 0, 1 y Z (alta impedancia). El estado de alta impedancia es equivalente a un interruptor abierto. Dependiendo del valor de la entrada E, la salida puede tomar el valor de la entrada o el valor Z.
E d a) y b) E 0 1 Y Z d

Figura A.1: Buffer triestado: a) s´ ımbolo l´gico; b) tabla de verdad. o

A.2.1

Modelo VHDL del buffer triestado

-------------------------------------------- Buffer triestado library IEEE; use IEEE.std_logic_1164.all; entity Buffer_TriEstado is port ( E : in std_logic; d : in std_logic; y : out std_logic); end entity Buffer_TriEstado ; architecture Behavioral of Buffer_TriEstado is begin process (E, d) begin if (E = ’1’ ) then y <= d ; else y <= ’Z’; end if; end process; end architecture Behavioral; -------------------------------------------

Ap´ndice A e

VeriBest VB99.0

135

A.2.2

Banco de pruebas

El siguiente banco de pruebas genera las 22 posibles combinaciones de entradas al buffer.
--------------------------------------- Banco de pruebas library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; entity bp_Buffer_TriEstado is end entity bp_Buffer_TriEstado; architecture bp_Buffer_TriEstado of bp_Buffer_TriEstado is signal y : std_logic; -- Conectar salida UUT signal d, E : std_logic; -- Conectar entradas UUT

component Buffer_TriEstado is port ( E, d : in std_logic; y : out std_logic); end component Buffer_TriEstado; begin -- Instanciar y conectar UUT uut : component Buffer_TriEstado port map ( E => E, d => d, y => y); gen_vec_test : process begin E <= ’0’; d <= ’0’; wait for 5 ns; d <= ’1’; wait for 5 ns; E <= ’1’; wait for 10 ns; d <= ’0’; wait; end process gen_vec_test; end architecture bp_Buffer_TriEstado; --------------------------------------

136

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

A.3

Edición y compilación de un modelo
En esta secci´n se describe c´mo editar y compilar modelos con el simulador o o VeriBest VHDL.

A.3.1

Arranque del simulador VeriBest VHDL

Seleccione el icono VeriBest VHDL del grupo de programas Inicio → Programas → Veribest VB99.0 → Veribest VHDL Simulator.

A.3.2

Creación de un espacio de trabajo

Para crear un espacio de trabajo, puede seguir una de las dos opciones siguientes: 1. Despliegue el men´ “Workspace” y seleccione la opci´n “New... ” u o 2. Seleccione el comando “New...” del men´ “File”. Se mostrar´ una ventana u a en la que tiene que seleccionar la opci´n “VHDL Workspace”. o Tras seguir una de estas dos opciones, se mostrar´ una ventana (v´ase la a e Figura A.2). Teclee en dicha ventana el nombre del espacio de trabajo, que en este caso se ha llamado bufferTriestado.

Figura A.2: Espacio de trabajo.

Aparecer´ en el lateral izquierdo de la ventana principal del simulador una a nueva ventana con el t´ ıtulo bufferTriestado.vpd. Inicialmente, la ventana s´lo o muestra una carpeta vac´ denominada bufferTriestado source (v´ase la Figura ıa, e A.3). En dicha ventana ubicaremos todos los ficheros necesarios para simular el buffer triestado, que en este caso son dos: la descripci´n del circuito (bufferTrieso tado.vhd) y de su banco de pruebas (bp bufferTriestado.vhd). Al igual que el buffer

Ap´ndice A e

VeriBest VB99.0

137

Figura A.3: Entorno de simulaci´n tras crear el espacio de trabajo. o

se ha definido en un unico fichero, podr´ haberse definido en dos: un fichero con ´ ıa el c´digo de la interfaz y otro con el c´digo de la arquitectura. o o

A.3.3

Edición de un fichero

Puede crearse un nuevo fichero utilizando el comando “New...” del men´ “File”. u Obtendr´ una ventana en blanco en la que puede teclear el c´digo VHDL. Escriba a o el c´digo que se muestra en la secci´n A.2.1. Una vez haya concluido, gu´rdelo con o o a el nombre bufferTriestado.vhd mediante el comando “Save”, situado en el men´ u “File”.

A.3.4

Añadir un fichero al espacio de trabajo

Incluya el fichero bufferTriestado.vhd en el espacio de trabajo bufferTriestado.vpd. Hay dos formas equivalentes de hacerlo: 1. Haga clic con el puntero del rat´n sobre el bot´n “+”, situado en la esquina o o 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´ u “Workspace”. Tras realizar este paso obtendr´ una ventana para la selecci´n de un fichero. a o Seleccione el fichero bufferTriestado.vhd. La ventana principal del simulador tiene que quedar tal y como se muestra en la Figura A.4.

138

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

Figura A.4: Entorno de simulaci´n tras incluir el fichero bufferTriestado.vhd o el espacio de trabajo.

A.3.5

Compilación de un fichero

Para establecer las opciones de compilaci´n, seleccionamos la opci´n “Settings...” o o del men´ “Workspace”, o bien recurrimos al icono “Workspace Settings” que est´ u a situado en la barra de herramientas. Con ello se mostrar´ una ventana, en la a cual seleccionamos la pesta˜ a “Compile”. De este modo, accedemos al cuadro de n di´logo donde se muestran, entre otras, las siguientes opciones de compilaci´n: a o “Debug”
Activando esta opci´n el archivo seleccionado ser´ compilado o a con la opci´n de depuraci´n. Con esta opci´n activa antes de o o o una compilaci´n, es posible utilizar todos los comandos del o men´ Debug durante la fase de simulaci´n. Si se desea que u o todos los archivos del espacio de trabajo sean compilados con esta opci´n, basta con seleccionar la carpeta del espacio de o trabajo en la ventana y activar la opci´n. o

“Index Checks” “Range Checks”

Si esta opci´n se encuentra activa, el compilador comprueba la o existencia de errores en los ´ ındices de los arrays. Si esta opci´n se encuentra activa, el compilador comprueba la o existencia de errores en los rangos de los subtipos que se hayan definido.

Ap´ndice A e

VeriBest VB99.0

139

Compile el fichero. Para ello seleccione el comando “Compile”, que est´ situado a en el men´ “Workspace”. u El resultado de la compilaci´n se muestra en la ventana de informaci´n, o o situada en la parte inferior de la ventana principal. Observe que la ventana de informaci´n contiene las tres pesta˜ as siguientes: o n “General” “Build”
Proporciona informaci´n sobre cualquier acci´n que se realice o o en la herramienta. Muestra la informaci´n referente al proceso de compilaci´n o o de ficheros. En el caso de que haya habido errores en la compilaci´n muestra la l´ o ınea de c´digo donde aparece cada o error y el tipo de error que es.

“Simulate”

Proporciona informaci´n sobre la fase de simulaci´n. o o

Cuando el proceso no da errores, lo guardamos (“Save”). La unidad compilada se almacena en la librer´ WORK. Para ver su ubicaci´n, se selecciona el comando ıa o “Library Browser” ubicado en el men´ “Library”, o se pincha en el icono corresu pondiente. Aparecen las diferentes librer´ IEEE, STD, VB, y en rojo WORK, ıas, WORKLIB. Si pinchamos en ´sta, aparecen la interfaz (entity) y arquitectura e (architecture) de los diferentes circuitos que hayamos compilado. Podemos ver informaci´n de fecha y opciones de compilaci´n en la parte derecha de la ventana o o (ver Figura A.5). Observe que el chip asociado a la interfaz aparece en color blanco y el asociado a la arquitectura en color rojo. Se puede reinicializar la librer´ en la que se est´ trabajando mediante el ıa a comando “Reinitialize Lib environment” situado en el men´ “Workspace”. Al u reinicializar la librer´ desaparecen las unidades compiladas. ıa,

Figura A.5: Library Browser.

140

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

A.3.6

Banco de pruebas

1. Cree un nuevo fichero con el c´digo que se muestra en la secci´n A.2.2. Una o o vez haya concluido, gu´rdelo con el nombre bp bufferTriestado.vhd. a 2. Incluya el fichero bp bufferTriestado.vhd en el espacio de trabajo bufferTriestado.vpd. La ventana principal del simulador tiene que quedar tal y como se muestra en la Figura A.6. El orden de compilaci´n de un fichero se o puede modificar mediante las flechas situadas en la esquina superior derecha de la ventana del espacio de trabajo bufferTriestado.vpd.

Figura A.6: Entorno de simulaci´n tras incluir el banco de pruebas en el o espacio de trabajo.

3. Compile el fichero bp bufferTriestado.vhd.

A.4

Simulación y visualización de los resultados
En esta secci´n se describen los pasos a seguir para realizar la simulaci´n y la o o visualizaci´n de resultados, usando el buffer triestado como ejemplo. o

A.4.1

Establecer las condiciones de la simulación

Para fijar las condiciones de la simulaci´n, siga los pasos siguientes: o 1. Seleccione la opci´n “Settings...” del men´ “Workspace” o haga clic sobre o u el icono correspondiente, denominado “Workspace Settings”, de la barra de

Ap´ndice A e

VeriBest VB99.0

141

Figura A.7: Opciones de simulaci´n. o

herramientas. A continuaci´n, se abrir´ la ventana mostrada en la Figura o a A.7. 2. Para acceder al cuadro de di´logo con las opciones de simulaci´n, seleccione a o la pesta˜ a “Simulate” de la ventana. n 3. Despliegue la carpeta “WORK” para visualizar los elementos sobre los que se puede realizar una simulaci´n. Obtendr´ las interfaces (entity) y aro a quitecturas (architecture) que ha programado en los pasos anteriores. Para realizar la prueba de la puerta l´gica debe seleccionar la arquitectura o BP BUFFER TRIESTADO (que es la que contiene la prueba) y la interfaz que lleva asociada esa arquitectura (BP BUFFER TRIESTADO). Para ello, seleccione la arquitectura BP BUFFER TRIESTADO de la interfaz BP BUFFER TRIESTADO con el cursor del rat´n (haga clic sobre ella) o y pulse el bot´n “Set”. Tras esta acci´n, los campos “Entity” y “Arch” se o o rellenar´n autom´ticamente con los nombres de la interfaz y de la arquia a tectura. Por ultimo, activamos la opci´n “Trace On” (que nos permite vi´ o sualizar las formas de onda resultantes). Esto tambi´n se logra desplegando e Simulate→Trace. 4. Fijadas las condiciones de simulaci´n, pulse el bot´n “Aceptar”. o o

A.4.2

Activación del simulador

Para realizar la simulaci´n hay que arrancar el simulador. Esto se puede realizar o de dos formas: mediante la opci´n “Execute Simulator” del men´ “Workspace”, o o u mediante el icono correspondiente, denominado “Execute Simulator”, situado en la barra de herramientas. Mediante cualquiera de las dos opciones, el simulador se activa. Durante el proceso de activaci´n del simulador aparecer´ una ventana de aviso (v´ase o a e

142

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

la Figura A.8) en la que se indica que, al no encontrar una licencia, se est´ a utilizando el simulador en modo limitado. Pulse el bot´n “Aceptar” para continuar o trabajando.

Figura A.8: Mensaje de aviso sobre la ausencia de licencia.

Tras la activaci´n del simulador, en la ventana denominada “Simulate”, situao da en la parte inferior del espacio de trabajo, aparece un texto. En la ultima l´ ´ ınea del texto se indica si ha habido errores o avisos (warnings).

A.4.3

Simulación y visualización de resultados

Una vez activada la simulaci´n, ya puede empezar a realizar simulaciones. Para o realizar simulaciones puede elegir una de las siguientes opciones: 1. Presionar el bot´n de color verde, denominado “Run”, que est´ situado en o a la barra de herramientas (v´ase la Figura A.9). e 2. Seleccionar la opci´n “Run” o “Run Forever” del men´ “Simulate”. o u Los siguientes controles de la barra de herramientas del entorno (ver Figura A.9) nos permiten controlar la simulaci´n: o

Run Tiempo de Unidades del simulación tiempo de simulación

Stop Quit

Figura A.9: Botones para controlar la simulaci´n. o

– Lista desplegable. Permite seleccionar las unidades del tiempo de simulaci´n. Por defecto, la unidad de tiempo es nanosegundos (ns). o

Ap´ndice A e

VeriBest VB99.0

143

– Casilla num´rica (junto al bot´n “Run”). Permite indicar el tiempo de e o simulaci´n. o – Bot´n “Run”. Permite ejecutar una simulaci´n. o o – Bot´n “Stop”. Permite detener la simulaci´n. o o – Bot´n “Quit”. Permite salir del simulador. o Para visualizar los resultados de la simulaci´n, podemos o bien pinchar con o el rat´n sobre el icono “WaveForm Window”, que est´ situado en la barra de o a herramientas, o bien ejecutar el comando “New WaveForm Window”, que se encuentra en el men´ “Tools...” u Obtendr´ una ventana con una escala de tiempos, en la que no se visualiza a ninguna se˜ al. Para seleccionar las se˜ ales, pulse el bot´n “Add signals” en la n n o ventana de visualizaci´n de se˜ ales. Dicho bot´n se encuentra indicado en la o n o Figura A.10.

Add signals

Figura A.10: Selecci´n de las se˜ales a visualizar. o n

Obtendr´ una nueva ventana, mostrada tambi´n en la Figura A.10, en la que a e puede seleccionar las se˜ ales que desea representar. Pueden seleccionarse se˜ ales n n tanto de la arquitectura del banco de pruebas (E, d e y), como de la arquitectura del buffer (E, d e y). Para seleccionar las se˜ ales que corresponden a la arquitectura del banco de n pruebas, pulse sobre el bot´n “Add All”. Pulse “Close” para cerrar la ventana. Se o obtiene una ventana como la mostrada en la Figura A.11. Para salir del simulador, podemos hacer clic con el rat´n sobre el icono “Quit”, o que se encuentra indicado en la Figura A.9.

144

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

Figura A.11: Resultados de la simulaci´n. o

A.5

Depurado usando el debugger
Para poder hacer uso del depurador se tienen que haber compilado los ficheros con la opci´n “Debug” habilitada y se ha de activar el simulador. o Una vez activado el simulador, aparece el men´ “Debug”. Hasta que no se u inicie la simulaci´n no aparecer´n habilitados todos los comandos del depurador. o a Entre los comandos del depurador habilitados antes de iniciar la simulaci´n, cabe o destacar los siguientes (v´ase la Figura A.12): e

Insert/remove Examine breakpoint Clear all breakpoint

Show breakpoints New watch window

Call stack

Figura A.12: Opciones de depuraci´n antes del inicio de la simulaci´n. o o

– “Insert/Remove a breakpoint”: nos permite introducir un punto de ruptura (breakpoint) o eliminar un punto de ruptura que hab´ ıamos introducido previamente.

Ap´ndice A e

VeriBest VB99.0

145

– “Clear all breakpoints”: nos permite eliminar todos los puntos de ruptura que estaban introducidos. – “New watch window”: abre una ventana que nos permite observar la evoluci´n de las se˜ ales de forma num´rica. Esta ventana, mostrada en la Figura o n e A.13, dispone de hasta 4 paneles de observaci´n independientes (“Watch1” o a “Watch4”). Para a˜ adir a uno de los cuatro paneles los elementos a observar, pulse el n bot´n “Add Watch...” y obtendr´ una ventana cuyo t´ o a ıtulo es “Add watch” (v´ase la Figura A.13), en la que puede seleccionar tanto las se˜ ales de e n forma independiente (se selecciona la se˜ al y se pulsa el bot´n “Watch”), n o como todas las se˜ ales de un elemento (se selecciona el componente o bloque n en la parte izquierda de la ventana y se pulsa el bot´n “Watch block”). o

Figura A.13: Ventanas para observar la evoluci´n de las se˜ales. o n

– “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 o bot´n se abre una ventana, denominada “Source Breakpoint Condition”, en o la que puede establecer condiciones de activaci´n para un punto de ruptura o determinado. Desde la ventana “Source Breakpoint Condition” podr´ indicar que el punto a de ruptura permanezca activo unicamente para una instancia o proceso ´ espec´ ıfico. De esta forma, cuando se establecen condiciones, el simulador se detiene unicamente en el punto de ruptura que hay dentro del proceso ´ especificado, no en todos los procesos en los que est´ el punto de ruptura. a – “Call stack”: nos permite conocer la pr´xima l´ o ınea de c´digo VHDL que se o ejecutar´ cuando se contin´ e con la simulaci´n. Si se realiza doble clic sobre a u o

146

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

una de las entradas que aparecen en la “Call Stack”, se obtendr´ una nueva a ventana en la que se muestra el c´digo fuente VHDL que se indica en la o entrada que ha seleccionado. En el caso de que el dise˜ o que est´ ejecutando contenga subprogramas n a anidados, en el momento en que se entre a ejecutar un subprograma, la ventana “Call Stack” se incrementar´ con una nueva entrada correspondiente a a la llamada al subprograma. Cuando concluya la ejecuci´n del subprograma, o la correspondiente entrada en la ventana ser´ eliminada. a Para empezar el proceso de depuraci´n hay que comenzar la simulaci´n. Una o o vez comenzada la simulaci´n, se habilitar´n, entre otros, los siguientes comandos o a de depuraci´n (v´ase la Figura A.14): o e – “Continue”: contin´ a la ejecuci´n de la simulaci´n hasta el siguiente punto u o o de ruptura o hasta que concluya el tiempo de simulaci´n. o – “Step”: avanza la simulaci´n una l´ o ınea del c´digo fuente VHDL. o

Step Continue

Figura A.14: Opciones de depuraci´n una vez iniciada la simulaci´n. o o

ModelSim PE Student Edition

B

Objetivos. Instalar en su propio ordenador y realizar las operaciones b´sicas de a manejo del entorno de simulaci´n ModelSim PE Student Edition. Estas operaciones o b´sicas incluyen al menos: a – Edici´n y compilaci´n de modelos. o o – Simulaci´n y visualizaci´n de los resultados. o o – Depurado de modelos.

B.1

Instalación
El grupo Mentor Graphics, desarrollador de ModelSim, ofrece de manera gratuita una versi´n de evaluaci´n temporal (180 d´ del simulador. El simulador Modelo o ıas) Sim es una herramienta muy completa y potente, de hecho varias herramientas de s´ ıntesis desarrolladas por fabricantes de circuitos FPGA ofrecen la posibilidad de simular los modelos usando ModelSim. Los pasos a seguir para la descarga e instalaci´n se describen a continuaci´n. o o Durante todo el proceso debe disponerse de conexi´n a Internet. o 1. Descargar el fichero ejecutable de instalaci´n (aproximadamente 60MB) de o la direcci´n: o http://www.model.com/resources/student edition/download.asp para lo cual en primer lugar tendr´ que rellenar un formulario electr´nico a o con sus datos y se˜ alar una casilla que indica que s´lo va a usar la herran o mienta para fines educativos. 2. Ejecutar dicho fichero, el cual realiza la instalaci´n del simulador. En la fase o final de la instalaci´n, el programa de instalaci´n se conecta a una p´gina o o a web en la cual hay un formulario para la solicitud de la licencia.

148

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

3. En la hoja de solicitud de licencia, debemos indicar a qu´ direcci´n de e o correo electr´nico deseamos que nos env´ el fichero de licencia. En esa o ıen direcci´n de correo recibiremos un correo con el fichero de licencia y las o indicaciones de d´nde debe guardarse. La licencia tiene una validez de 180 o d´ transcurridos los cuales debe repetirse la instalaci´n y la solicitud de ıas, o la licencia. La licencia s´lo es v´lida para el ordenador en el que se hizo la o a descarga del ejecutable. Si se quiere instalar ModelSim en otro ordenador, debe repetirse el proceso de descarga del ejecutable y solicitud de la licencia.

B.2

Circuito digital ejemplo: buffer triestado
Va a emplearse el modelo de un buffer triestado para ilustrar las explicaciones acerca del manejo del simulador. Este tipo de componente se emplea com´ nmente u para conectar varios dispositivos a un mismo bus. Tal como se muestra en la Figura B.1, el buffer triestado tiene dos entradas (d y E) y una salida (y). La salida puede tomar tres valores: 0, 1 y Z (alta impedancia). El estado de alta impedancia es equivalente a un interruptor abierto. Dependiendo del valor de la entrada E, la salida puede tomar el valor de la entrada o el valor Z.
E d a) y b) E 0 1 Y Z d

Figura B.1: Buffer triestado: a) s´ ımbolo l´gico; b) tabla de verdad. o

B.2.1

Modelo VHDL del buffer triestado

-------------------------------------------- Buffer triestado library IEEE; use IEEE.std_logic_1164.all; entity Buffer_TriEstado is port ( E : in std_logic; d : in std_logic; y : out std_logic); end entity Buffer_TriEstado ; architecture Behavioral of Buffer_TriEstado is begin process (E, d)

Ap´ndice B e

ModelSim PE Student Edition

149

begin if (E = ’1’ ) then y <= d ; else y <= ’Z’; end if; end process; end architecture Behavioral; -------------------------------------------

B.2.2

Banco de pruebas

El siguiente banco de pruebas genera las 22 posibles combinaciones de entradas al buffer.
--------------------------------------- Banco de pruebas library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; entity bp_Buffer_TriEstado is end entity bp_Buffer_TriEstado; architecture bp_Buffer_TriEstado of bp_Buffer_TriEstado is signal y : std_logic; -- Conectar salida UUT signal d, E : std_logic; -- Conectar entradas UUT component Buffer_TriEstado is port ( E, d : in std_logic; y : out std_logic); end component Buffer_TriEstado; begin -- Instanciar y conectar UUT uut : component Buffer_TriEstado port map ( E => E, d => d, y => y); gen_vec_test : process begin E <= ’0’; d <= ’0’; wait for 5 ns; d <= ’1’; wait for 5 ns;

150

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

E <= ’1’; wait for 10 ns; d <= ’0’; wait; end process gen_vec_test; end architecture bp_Buffer_TriEstado; --------------------------------------

B.3

Edición y compilación de un modelo
En esta secci´n se describe c´mo editar y compilar modelos con el simulador o o ModelSim. Para ilustrar las explicaciones, se va a usar el modelo del buffer triestado descrito anteriormente.

B.3.1

Arranque del simulador

Seleccione el icono ModelSim PE del grupo de programas Inicio → Programas → ModelSim PE Student Edition 6.3c → ModelSim. Inicialmente aparecer´ la a 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 o el bot´n “Close”. o

Menús Workspace

Iconos

Transcript

Figura B.2: Ventana principal de ModelSim.

Se abrir´ entonces la ventana principal del entorno (v´ase la Figura B.2), que a e cuenta con los elementos siguientes:

Ap´ndice B e

ModelSim PE Student Edition

151

“Workspace”

Panel situado a la izquierda de la ventana principal. Al arrancar la aplicaci´n este panel tiene una unica pesta˜a o ´ n denominada “Library”. En esta pesta˜ a aparecen los nombres n l´gicos de las librer´ de recursos. o ıas

“Transcript”

Panel de texto situado en la parte inferior de la ventana principal. Este panel tiene una doble finalidad: 1. Mostrar los mensajes producidos por la ejecuci´n de o comandos. 2. Permitir teclear comandos en l´ ınea. Se mantiene un hist´rico de todos los comandos ejecutados. Usando las o teclas ↑ y ↓ se puede acceder a comandos anteriores y posteriores para ejecutarlos de nuevo.

Barra de men´ s u Barra de iconos

B.3.2

Creación de un proyecto

Para crear un proyecto, debe seguir los pasos siguientes: 1. Seleccione la opci´n File → New → Project. Aparecer´ la ventana de di´logo o a a para la creaci´n de proyectos (v´ase la Figura B.3). En dicha ventana se o e establece el nombre del proyecto, el directorio en el que desea ubicarse y el nombre de la librer´ por defecto. ıa

Figura B.3: Ventana de di´logo para la creaci´n de un proyecto. a o

2. En la casilla “Project Name” teclee bufferTriestado como nombre del proyecto. 3. En la casilla “Project Location”, seleccione el directorio d´nde va a ubicar o los ficheros del proyecto. Puede ayudarse del bot´n “Browse...” para moo verse por el disco. Si el directorio introducido no existe, la herramienta le pedir´ confirmaci´n para su creaci´n. En este directorio se crear´ el fichero a o o a bufferTriestado.mpf.

152

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

Figura B.4: Entorno de simulaci´n tras crear un nuevo proyecto. o

4. En la casilla “Default Library Name”, se escribe el nombre de la librer´ ıa de trabajo. Por defecto aparece work y, en general, puede emplearse este nombre. El nombre dado a la librer´ ser´ el que, una vez creado el proyecto, ıa a la herramienta asigne autom´ticamente a un directorio ubicado debajo del a indicado en el cuadro “Project Location”. En este directorio se almacenar´n a las unidades de dise˜ o VHDL compiladas. En la Figura B.3 se muestra el n cuadro de di´logo una vez realizados estos pasos. a 5. Pulse el bot´n “OK”. o

B.3.3

Añadir ficheros al proyecto

Al crear un proyecto, se producen los siguientes cambios en el entorno de simulaci´n (v´ase la Figura B.4): o e – Aparece una nueva pesta˜ a en el panel “Workspace” denominada “Project”. n En dicha pesta˜ a se muestran los ficheros que forman parte del proyecto. n Observe que si la pesta˜ a “Project” est´ seleccionada se muestra un men´ n a u llamado “Project”. Por el contrario, si la pesta˜ a “Library” est´ seleccionada n a no se muestra el men´ “Project” sino un men´ denominado “Library”. u u – Se muestra el nombre del proyecto en la barra de estado de la parte inferior izquierda de la ventana principal. – Se abre una ventana de di´logo denominada “Add items to the Project”. Esa ta ventana, que permite a˜ adir elementos al proyecto, incluye las siguientes n opciones (v´ase la Figura B.4): e

Ap´ndice B e

ModelSim PE Student Edition

153

“Create New File” “Add Existing File”

Permite crear un nuevo fichero de dise˜ o. n Permite incluir un fichero ya existente en el proyecto actual copi´ndolo al directorio del proyecto o referena ci´ndolo desde su ubicaci´n actual. a o Permite crear configuraciones para simulaci´n. o Permite crear directorios virtuales. Estos directorios tienen, sobre la pesta˜ a “Project” del panel “Workspace”, n un aspecto similar al de los directorios del sistema operativo. Estos directorios son internos al proyecto y no se crean realmente en el disco.

“Create Simulation” “Create New Folder”

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 a trav´s del men´ Project → Add to Project. e u

Inserción de un fichero nuevo en el proyecto
Para crear un fichero nuevo se pueden seguir los siguientes pasos: 1. Realizar una de las dos siguientes opciones: – Seleccionar el icono “Create New File” en el cuadro de di´logo “Add a items to the Project” mostrado en la Figura B.4. – O bien, seleccionar del men´ el comando Project → Add to Project u → New File... Para poder usar el men´ , si est´ abierta la ventana de u a di´logo “Add items to the Project”, hay que cerrarla presionando el a bot´n “Close”. o Aparece una ventana de di´logo denominada “Create Project File”. Esta a ventana tiene los siguientes elementos (ver Figura B.5): “File Name”
Permite especificar la ubicaci´n y nombre del fichero o fuente. El bot´n “Browse...” nos permite especificar la o ubicaci´n del fichero navegando a trav´s de las carpetas o e del sistema. Si especificamos un nombre del fichero, sin indicar ning´ n directorio, ´ste se guardar´ en el u e a directorio del proyecto.

“Add File As Type” “Folder”

Nos permite seleccionar el tipo de fichero. Lista desplegable donde aparecen todos los directorios existentes en el proyecto. En el caso de que no se haya creado ning´ n directorio esta lista s´lo tendr´ un u o a elemento: “Top Level”.

2. Complete los cuadros de la ventana de di´logo “Create Project File” del a siguiente modo: – En el cuadro “File Name” escriba bufferTriestado.vhd o bufferTriestado.

154

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

– En la lista desplegable “Add file as type” seleccione VHDL. – Pulse “OK”. Si ha a˜ adido el fichero a trav´s del cuadro de di´logo n e a “Add items to the Project” y no quiere a˜ adir por el momento m´s n a elementos al proyecto cierre dicha ventana. Ello lo puede hace pulsando el bot´n “Close”. o

Figura B.5: Ventana de di´logo “Create Project File”. a

Una vez finalizado este proceso se crea un fichero denominado bufferTriestado.vhd en el directorio del proyecto. En la Figura B.6 se muestra la ventana principal tras seguir estos pasos. Observe que en la pesta˜ a “Project” del n panel “Workspace” aparece la informaci´n sobre el fichero creado. La inforo maci´n mostrada es la siguiente: o “Name” “Status”
Nombre del fichero. S´ ımbolo que refleja el estado del fichero. Existen los siguientes tres s´ ımbolos: – ?: El fichero a´ n no ha sido compilado. u – X: El fichero se ha compilado y contiene errores. √ – : El fichero ha sido compilado con ´xito. e

“Type” “Order”

Indica el tipo de fichero (VHDL, Verilog, Folder, Simulation). Indica la posici´n del fichero en la secuencia de compilaci´n o o cuando hay varios ficheros fuente. El primer fichero de la secuencia de compilaci´n es aqu´l con un n´ mero menor. o e u Muestra la fecha y hora en que el fichero fue modificado por ultima vez. ´

“Modified”

3. Al crear el fichero, se abre autom´ticamente una ventana del editor de texto a del entorno con el fichero vac´ como muestra la Figura B.6. ıo 4. Edite, empleando la ventana del editor de texto mostrada en la Figura B.6, el c´digo VHDL mostrado en la Secci´n B.2.1. o o 5. Salve el fichero seleccionando la opci´n File → Save del men´ de la ventana o u del editor o bien pulsando el icono correspondiente. De al fichero el nombre bufferTriestado.vhd.

Ap´ndice B e

ModelSim PE Student Edition

155

Figura B.6: Entorno de simulaci´n tras crear un nuevo fichero. o

Figura B.7: Ventana de di´logo “Add File to Project”. a

Inserción de un fichero existente en el proyecto
A continuaci´n, se describen los pasos que habr´ que seguir para incorporar al o ıa proyecto un fichero ya existente: – Seleccionar del men´ el comando Project → Add to Project → Existing u File... Tambi´n se puede realizar la misma acci´n desde la ventana de di´logo e o a “Add items to the Project” seleccionando la opci´n “Add Existing File”. o Aparece una ventana de di´logo denominada “Add File to Project” (v´ase a e la Figura B.7). Esta ventana tiene los siguientes elementos:

156

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

“File Name”

Permite seleccionar el fichero fuente. El bot´n “Browo se...” nos facilita la selecci´n de dicho fichero navegando o a trav´s de las carpetas del sistema. e

“Add File As Type” “Folder”

Nos permite seleccionar el tipo de fichero. Lista desplegable donde aparecen todos los directorios existentes en el proyecto. En el caso de que no se haya creado ning´ n directorio esta lista s´lo tendr´ un u o a elemento: “Top Level”. Realiza una copia f´ ısica del fichero desde su localizaci´n o al directorio del proyecto. El fichero se incluye en el proyecto, pero no se copia al directorio del mismo.

“Copy to project directory” “Reference from current location”

– Localice y seleccione el fichero en el cuadro “File Name” (puede ayudarse del bot´n “Browse...”). Seleccione VHDL de la lista deplegable “Add file as o type” y “Top Level” de “Folder”. Por ultimo, seleccione la opci´n “Copy to ´ o project directory” y pulse “OK”.

B.3.4

Compilación de un fichero

Para verificar que el c´digo VHDL es correcto, es necesario compilar el fichero. o Al compilar el fichero se genera el fichero binario que posteriormente se emplear´ a en la simulaci´n. Para compilar el fichero podemos seguir una de las opciones o siguientes: – Seleccionar la opci´n Compile → Compile All. Mediante esta opci´n se o o compilan todos los ficheros del proyecto. El orden de compilaci´n que se o sigue es el indicado en la columna “Order” del panel “Workspace”. – Seleccionar la opci´n Compile → Compile Selected. Mediante esta opci´n o o se compila unicamente el fichero seleccionado. ´ – Situar el rat´n en el panel “Workspace” de la ventana principal y pulsar el o bot´n derecho. Aparece un men´ contextual con varias opciones para lanzar o u directamente la compilaci´n. Mediante la opci´n Compile → Compile Outo o of-Date de este men´ se compila unicamente los ficheros que no hayan sido u ´ compilados con ´xito anteriormente. Es decir, todos los que no presenten el e √ icono en la columna “Status”. – Teclear vcom bufferTriestado.vhd en el panel “Transcript”. La unidad compilada se almacena en la librer´ work. Para ver su ubicaci´n, ıa o se selecciona la pesta˜ a “Library” del panel ”Workspace”. Pulsando sobre el signo n “+” que aparece a la izquierda de la librer´ work podemos ver su contenido ıa (v´ase la Figura B.8). En la librer´ existe una interfaz (entity) denominada e ıa bufferTriestado y una arquitectura (architecture) llamada behavioral.

Ap´ndice B e

ModelSim PE Student Edition

157

Figura B.8: Contenido de la librer´ work tras compilar el fichero bufferıa Triestado.vhd.

Errores de compilación
A continuaci´n, se describe qu´ ocurre cuando existen errores de compilaci´n en o e o un fichero. Para ello vamos a modificar el fichero bufferTriestado.vhd. Introducimos un error quitando el ; de la l´ ınea 15 del fichero. Al guardar el fichero su nuevo “status” es ?. Al compilar el fichero su “status” cambia a X (v´ase la Figura B.9). e Tambi´n aparece un mensaje de error en color rojo en el panel “Transcript”. e El mensaje de error del panel “Transcript” nos informa de que existen errores de compilaci´n en el fichero bufferTriestado.vhd. Si hacemos doble clic con el rat´n o o sobre el mensaje de error se muestra una ventana de di´logo (v´ase la Figura B.9). a e Dicha ventana contiene en color rojo un mensaje con informaci´n sobre el tipo de o error que se ha producido y el n´ mero de l´ u ınea en que aparece. Si hacemos doble clic con el rat´n sobre dicho mensaje se abre la ventana de edici´n con la l´ o o ınea del c´digo que ha producido el error marcada en color naranja (v´ase la Figura B.9). o e En este caso, la l´ ınea 16 aparece en color naranja debido a que hemos eliminado el ; que debiera haber al final de la l´ ınea 15.

B.3.5

Banco de pruebas

Se va a crear un nuevo fichero con el c´digo del banco de pruebas, que se va a o guardar con el nombre bp bufferTriestado.vhd. El c´digo del banco de pruebas se o muestra en la Secci´n B.2.2. Para crear el fichero, siga los siguientes pasos: o – Seleccione del men´ el comando Project → Add to Project → New File · · · u – Complete la ventana de di´logo denominada “Create Project File” del sia guiente modo:

158

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

Figura B.9: Entorno de simulaci´n cuando hay errores de compilaci´n en el o o fichero bufferTriestado.vhd.

– En el cuadro “File Name” escriba bp bufferTriestado. – En la lista desplegable “Add file as type” seleccione VHDL. – Pulse “OK”. Tras seguir estos pasos, el panel “Workspace” queda tal como se muestra en la Figura B.10. La columna “Status” del fichero bp bufferTriestado.vhd tiene el icono ?, ya que a´ n no ha sido compilado. El fichero tiene el u n´ mero 1 en la columna “Order”. Esto indica que si usamos la opci´n de u o compilaci´n Compile → Compile All, el fichero bp bufferTriestado.vhd se o compilar´ despu´s que el fichero bufferTriestado.vhd. Compile el fichero a e bp bufferTriestado.vhd siguiendo algunas de las opciones descritas en la secci´n B.3.4. o Existen ocasiones en que el orden de compilaci´n de los ficheros puede o no ser el correcto en funci´n de la estructura del c´digo VHDL y de las o o reglas que el lenguaje impone. Por ejemplo, considere el caso de que haya un fichero llamado paquete.vhd donde se defina un paquete, y otro fichero, denominado uso paquete.vhd, que use dicho paquete. El fichero paquete.vhd ha de ser compilado antes que el fichero uso paquete.vhd. En caso contrario, se produce un error de compilaci´n. o Se puede modificar el orden de compilaci´n del siguiente modo: o – Situar el rat´n en el area del panel “Workspace”. o ´ – Apretar el bot´n derecho del rat´n. Aparece as´ un men´ textual. o o ı u – Seleccionar la opci´n Compile → Compile Order... del men´ . Aparece o u una ventana denominada “Compile Order” (ver Figura B.11). – Puede cambiar el orden de posici´n del fichero en la secuencia de o compilaci´n seleccionando dicho fichero en la ventana “Compile Order” o y pulsando sobre los botones (ver Figura B.11).

Figura B.10: Panel bp bufferTriestado.vhd.

“Workspace”

tras

insertar

el

fichero

Botones para cambiar el orden en la secuencia de compilación

Figura B.11: Ventana “Compile Order”.

160

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

B.4

Simulación y visualización de los resultados
En esta secci´n se describen los pasos a seguir para realizar la simulaci´n y la o o visualizaci´n de los resultados, usando el buffer triestado como ejemplo. o

B.4.1

Activación del modo simulación

Para iniciar el simulador se selecciona en la pesta˜ a “Library” la interfaz (entity) n que queremos simular. En este caso, seleccionamos bp bufferTriestado. Con el bot´n derecho de rat´n sobre esta interfaz seleccionamos la opci´n “Simulate” o o o (v´ase la Figura B.12). e Observe que la ventana principal del simulador se modifica. Cabe destacar los cambios siguientes: – Aparecen las tres pesta˜ as siguientes en el panel “Workspace”: n “sim” “Files” “Memories”
Muestra la jerarqu´ de dise˜ o. ıa n Muestra los ficheros fuente. Herramienta de an´lisis para los arrays de registros del a sistema (si hay alguno).

– Aparece el panel “Objects”. Este panel muestra las variables, registros, etc., su valor y sus caracter´ ısticas. Para interaccionar con el simulador y visualizar los resultados de la simulaci´n, o la herramienta dispone de un conjunto de paneles. Estos paneles pueden formar parte de la ventana principal del simulador o pueden ser separados de dicha ventana haciendo clic con el rat´n sobre el bot´n “undocked” (v´ase la Figura B.13a). o o e Puede volver a insertar el panel en la ventana principal presionando el bot´n o “docked” (v´ase la Figura B.13b). Podemos seleccionar los paneles a mostrar e usando el men´ “View”. A continuaci´n, se comenta brevemente la funcionalidad u o de algunos paneles: “Dataflow”
Permite visualizar, de modo gr´fico, la conectividad entre a los elementos (procesos, sentencias de asignaci´n concurrente, o etc.) del modelo y rastrear eventos. Muestra, en modo texto, los valores de las se˜ ales y variables n en un formato tabular. Muestra la lista de procesos junto con informaci´n sobre su o estado. Muestra la lista de se˜ ales de la interfaz (entity) seleccionada n en la pesta˜ a “Sim”. n Permite visualizar la forma de onda de las se˜ ales y variables. n

“List” “Process” “Objects” “Wave”

Ap´ndice B e

ModelSim PE Student Edition

161

Figura B.12: Activaci´n del modo simulaci´n. o o

a)

b)

Figura B.13: Botones: a) “undocked”; y b) “docked”.

B.4.2

Visualización de los resultados

Las se˜ ales se pueden visualizar en el panel “Wave”. Este panel se puede separar n de la ventana principal pulsando el bot´n “undocked” (v´ase la Figura B.13a). o e Podemos a˜ adir se˜ ales de inter´s al panel “Wave” siguiendo uno de los dos n n e siguientes procedimientos: – Seleccionar todas las se˜ ales que queremos visualizar del panel “Objects”. n Arrastrar la selecci´n con el rat´n y llevarla hasta el panel “Wave”. o o – Pulsar sobre el panel “Objects” con el bot´n derecho del rat´n. En el men´ o o u que aparece podemos realizar las dos siguiente acciones: 1. Incluir en el panel “Wave” todas las se˜ ales que aparecen en el panel n “Objects”. Para ello hacemos clic en la opci´n Add to Wave → Signals o in Region. 2. Mostrar una selecci´n de las se˜ ales del panel. Para ello hacemos clic o n en la opci´n Add to Wave → Selected Signals. Para seleccionar un o

162

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

conjunto de se˜ ales pulsamos el bot´n “Shift” del teclado al mismo n o tiempo que hacemos clic con el rat´n sobre las se˜ ales que queremos o n seleccionar. Para quitar se˜ ales del conjunto seleccionado mantenemos n pulsado el bot´n “Control” mientras hacemos clic con el rat´n sobre o o las se˜ ales que queremos quitar. n Caben destacar las siguientes caracter´ ısticas del panel “Wave” (v´ase la Figue ra B.14): – Se puede adaptar la informaci´n visualizada en el panel “Wave” usando los o diferentes iconos de zoom. A continuaci´n se describe la funcionalidad de o los iconos de zoom: “Zoom In” “Zoom Out” “Zoom Full”
Amplia la escala de tiempos. Reduce la escala de tiempos. Cambia el rango de la escala de tiempo de modo que vaya desde el instante inicial hasta el instante actual de simulaci´n. o

– Podemos a˜ adir cursores presionando el bot´n “Insert Cursor”. Al pie del n o cursor se indica el instante de tiempo en que se encuentra situado. Adem´s, a aparece el valor de cada se˜ al en dicho instante de tiempo en el area que hay n ´ junto a los nombres de las se˜ ales. Se puede eliminar un cursor presionando n el bot´n “Delete Cursor” una vez hayamos seleccionando dicho cursor. o

B.4.3

Ejecución de la simulación

Los siguientes botones nos permiten controlar la simulaci´n y realizar el depurado o del modelo (ver Figura B.15): “Run”
Ejecuta la simulaci´n durante el tiempo indicado por defecto o en el cuadro de la ventana principal (la simulaci´n puede o detenerse antes, si se han introducido puntos de ruptura, o manualmente o por la ejecuci´n de alguna sentencia del banco o de pruebas).

“Continue Run”

Contin´ a la simulaci´n en curso hasta agotar el tiempo de u o simulaci´n por defecto (la simulaci´n puede detenerse antes o o por los motivos indicados en el p´rrafo anterior). a Ejecuta la simulaci´n durante tiempo indefinido. Esta podr´ o a detenerse si se han incluido puntos de ruptura en el c´digo o o si se interrumpe con el bot´n siguiente. En la zona de estado o de la ventana principal (parte inferior) se muestra el tiempo de simulaci´n. o

“Run - All”:

Ap´ndice B e

ModelSim PE Student Edition

163

Zoom In Zoom Out Zoom Full Zoom In On Active Cursor

Insert cursor

Delete Find Find Next cursor Previous Transition Transition

Figura B.14: Panel “Wave”.

“Break” “Restart”

Detiene la simulaci´n en curso. o Reinicia la simulaci´n. Carga de nuevo el modelo binario, o sit´ a el tiempo de simulaci´n en cero y, opcionalmente, puede u o mantener el formato dado a algunas ventanas, los puntos de ruptura, etc.

“Step”

Ejecuta la simulaci´n hasta la siguiente sentencia de c´digo. o o El valor de las variables en ese punto se puede visualizar en el panel “Objects”. Ejecuta funciones y procedimientos en un solo paso.

“Step Over”

B.4.4

Inserción de puntos de ruptura

A continuaci´n, se describen los pasos a seguir para insertar punto de ruptura o (breakpoint) en el c´digo: o – Seleccionamos la unidad de dise˜ o en cuyo c´digo queremos introducir el n o punto de ruptura. Las unidades de dise˜ o se muestran en la pesta˜ a “Sim” n n del panel “Workspace”.

164

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

Restart

Run Length

Run Continue Run All Step Step Over Run

Figura B.15: Botones para la simulaci´n y depurado del modelo. o

– Hacemos doble clic sobre la unidad de dise˜ o seleccionada. Aparece as´ un n ı panel con el c´digo de dicha unidad de dise˜ o. o n – En el c´digo mostrado en el panel podemos insertar puntos de ruptura o usando el rat´n. Las l´ o ıneas en las que podemos introducir puntos de ruptura son aquellas cuyo n´ mero de l´ u ınea est´ en color rojo. Para introducir el a punto de ruptura hacemos clic con el rat´n en la columna BP de la l´ o ınea donde queremos introducir el punto de ruptura. Para modificar los puntos de ruptura podemos acceder a una ventana de di´a logo denominada “Modify Breakpoints”. Para ello, seguimos los pasos siguientes: – Hacemos clic con el bot´n derecho del rat´n en el area del panel donde se o o ´ muestra el c´digo de la unidad de dise˜ o seleccionada. o n – En el men´ textual que aparece seleccionamos la opci´n “Breakpoints...”. u o A continuaci´n, se describen los pasos a dar para introducir un punto de rupo tura en la l´ ınea n´ mero 15 del fichero bufferTriestado.vhd (v´ase la Figura B.16): u e – Hacemos doble clic sobre la unidad de dise˜ o uut. Aparece as´ un panel que n ı muestra el c´digo del fichero bufferTriestado.vhd. o – Hacemos clic con el rat´n a la izquierda del n´ mero de l´ o u ınea 15. Aparecer´ a un c´ ırculo rojo indicando la existencia del punto de ruptura. Para poder modificar el punto de ruptura podemos situarnos con el rat´n sobre el c´ o ırculo y hacer clic con el bot´n derecho. Se despliega un men´ de texto que nos o u permite deshabilitar el punto de ruptura (“Disable Breakpoint”) y quitar el punto de ruptura (“Remove Breakpoint”).

Figura B.16: Inserci´n de puntos de ruptura. o

Índice alfabético

after, 103 Alta impedancia, 134, 148 Arbol de buffers, 7 Architecture, 20, 21 comportamiento, 21, 55, 61 estructura, 21, 62, 117 Register-Transfer Level, 130 Asignaci´n concurrente, 22, 48, 59, 83 o Atributos, 34

Descripci´n del hardware o mediante esquem´tico, 3 a mediante lenguaje, 3 modular y jer´rquica, 24 a Detector de secuencias, 100, 130 Diagrama de estados, 100 downto, 53

Ejecuci´n concurrente, 6 o Entidad de dise˜ o, 20 n Banco de pruebas, 16, 51, 55, 65, 75, 85, Entity, 20 91, 94, 106, 113, 124, 126 Est´ndar IEEE a Buffer triestado, 48, 134, 148 1067-1987 (VHDL’87), 4 Bus bidireccional, 80 1076-1993 (VHDL’93), 4 1076-2001 (VHDL-AMS), 4 CAD, 3 1076.6 (VHDL sintetizable), 20 Calendario de eventos, 8 1364-1995 (Verilog), 3 case, 57, 103 1666-2005 (SystemC), 4 Ciclo de dise˜ o, 4 n Circuito integrado Fallo ASIC, 5 Abierto, 12 FPGA, 5 Acoplo, 13 PLD, 5 Corto, 13 Codificador Modelo, 13 4:2 con prioridad, 93 Patr´n, 13 o Configuraci´n, 28 o Flip-flop, 102 Constantes generic, 28, 78 JK, 105 Conversor for, 53 BCD a binario, 89 Funci´n, 44, 70 o l´gica, 50 o Decodificador, 48

168

A. Urqu´ C. Mart´ Villalba ıa, ın

Casos Pr´cticos de Dise˜o de Circuitos Digitales con VHDL a n

Glitch, 39 HDL, 2 ventajas, 3 if, 55, 102 Inicializaci´n, 103 o Latch, 102 Ley de Moore, 1 Librer´ VHDL, 37 ıas IEEE.math real, 37 IEEE.numeric std, 37 IEEE.std logic 1164, 37 Literales, 31 Memoria de lectura y escritura, 79 de s´lo lectura, 78 o Modelo de fallos, 13 Multiplexor, 48 4:1, 54 M´quina de estado finito, 99 a de Mealy, 99, 119 de Moore, 99, 109 m´todo de dise˜ o, 99 e n Netlist, 4 now, 32, 67 Operadores, 35 package, 37, 74, 85, 90, 110 Palabras reservadas, 21 Parametrizaci´n, 28 o Procedimiento, 44, 68 procedure, 106 process, 23, 50, 55, 84, 104 Puerto, 20 in, 20 inout, 20 out, 20 Reloj de la simulaci´n, 8 o Rendimiento, 12 report, 32, 67 Restador completo de 1 bit, 61

de 1 bit, 61 Retardo, 38, 103 de Transporte, 39 Inercial, 39 scan flip-flops, 14 Sumador completo de 1 bit, 72 de 4 bits, 77 SystemC, 4 S´ ıntesis, 4 de l´gica secuencial, 102 o Tabla de transici´n de estados, 100 o Test, 12 Calidad, 14 Cobertura de fallos, 13 Funcional, 14 Manufactura, 14 Modelo de fallos, 13 Programa, 12 Programa de test, 3 Vector, 12 Vector de test, 3 Tipo de datos bit, 30 enumerado, 32 integer, 59 std logic, 30 string, 32 time, 32 Unidad Aritm´tico L´gica, 82 e o UUT (Unit Under Test), 16 Verificaci´n o de tiempos, 4 funcional, 4 Verilog HDL, 3 VHDL, 2 VHDL sintetizable, 20 wait, 38, 54, 103, 104 when, 48 with, 49, 103

Bibliografía

Armstrong, J. & Gray, F. (2000), VHDL Design, Representation and Synthesis, Prentice Hall. Brown, S. & Vranesic, Z. (2006), Fundamentos de L´gica Digital con Dise˜o o n VHDL, Mc Graw-Hill. Lee, S. (2006), Advanced Digital Logic Design: Using VDHL, State Machines and Syntesis for FPGAs, Thomsom Canada Limited. Mentor Graphics Corporation (2008), ModelSim LE/PE User’s Manual. Software Version 6.3e. Disponible en: http://www.model.com/resources/resources\ _manuals.asp. Pardo, F. & Boluda, J. A. (2004), VHDL, Lenguaje de S´ntesis y Modelado de ı Circuitos, RA-MA. Perry, D. L. (2002), VHDL: Programming by Example, McGraw-Hill. Salcic, Z. & Smailagic, A. (2000), Digital Systems Design and Prototyping, Kluwer Academic Publishers. Vahid, F. & Lysecky, R. (2007), VHDL for Digital Design, Wiley. VeriBest Inc. (1998), Documentaci´n en l´nea de VeriBest VB99.0. Suministrada o ı con VeriBest VB99.0.

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->