Está en la página 1de 367
pt many de Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL ‘© SERAFIN PEREZ LOPEZ, ENRIQUE SOTO CAMPOS Y SANTIAGO FERNANDEZ GOMEZ Gerente Editorial Area Universitaria: Disefio de cubierta: Andrés Otero Reguera Editora de Produccion: Clara M. * de la Fuente Rojo Consuelo Garcia Asensio Olga M® Vicente Crespo COPYRIGHT © 2002 International Thomson Editors Spain Paraninfo, S.A. Ediciones 1 edicién, 2* reimpresion, 2008 Magallanes, 25 28015 Madrid, ESPANA Teléfono: 902 995 240 Fax: 914 456 218 clientes@paraninfo.es www. paraninfo.es Impreso en Espaiia Printed in Spain ISBN: 84-9732-081-6 Depésito legal: M-49.847-2005 (120,5/77/99) Montytexto Impresion: CLM. Eduardo Mlaconi 3. Polig Industrial Codein. Fuenlabrada (Madrid) Reservados los derechos para todos los paises de lengua espa- fiola, De conformidad can lo dis- puesto en el articulo 270 del Cédi- go Penal vigente, podran ser casti- gados con penas de multa y priva- cién de libertad quienes reprodu- jeren o plagiaren, en todo o en parte, una obra iteraria, artistica 0 Cientifica fiada en cualquier tipo de soporte sin la preceptiva auto- rizacién. Ninguna parte de esta publicacién, incluido el disefio de la cubierta, puede ser reproduci- da, almacenada o transmitida de ninguna forma, ni por ningun me: dio, sea éste electrénico, quimico, mecénico, electro-éptico, graba- cién, fotocopia 0 cualquier otro, sin la previa autorizacion esorita por parte de la Editorial, INDICE GENERAL Presentacién XU Prélogo xv Capitulo 1. —Lenguajes de descripcién del hardware 1 Introduccién Génesis Caracteristicas Aplicaciones Limitaciones El lenguaje VHDL 1.6.1. Historia 1.6.2. Caracteristicas Ventajas de VHDL para el disefio de sistemas digitales Otros lenguajes de descripcién BABervasauwe 1. Capitulo 2. Fundamentos del lenguaje 7 2. Fundamentos de una descripcién 17 Entidades y arquitecturas 18 Bibliotecas y paquetes 20 Configuraciones 21 py © ITES - Paraninfo VI 2.5. 2.6. Capitulo 3. 3.1. 3.2. 3.3. 3.4. 3.5. 3.6. 3.7. 3.8. 3.9. Capitulo 4. 4.1. 4.2. 4.3. 44, 45. 4.6. 4.7, Capitulo 5. 5.1. INDICE GENERAL, VHDL concurrente y secuencial Metodologfa de disefio con VHDL Elementos del lenguaje Identificadores Delimitadores Comentarios Tipos de datos Nuevos tipos y subtipos Literales Operadores 3.7.1. Operadores aritméticos Operadores relacionales Operadores I6gicos y de desplazamiento 3 Otros operadores Objetos 3.8.1. Constantes 3 Variables 3.8.3. Sefiales 3.8.4. Ficheros Cuestiones y ejercicios Declaraciones basicas Entidades Arquitecturas Descripciones simples Interconexiones Declaracién de componentes Asociaci6n de entidades con componentes. Instanciacién de componentes Constantes, variables y sefiales ‘Modos y asociacién de puertos Sentencias assert-report y report Cuestiones y ejercicios VHDL concurrente y secuencial Sentencias concurrentes 5.1.1. Procesos Bloques Sentencia when-else Sentencia with-select nan © ITES - Paraninfo 22 23 25 26 27 27 29 35 36 36 38 38 40 41 41 42 43 43 49 49 SL 53 55 55 56 57 58 61 61 63 69 69 70 72 78 79 INDICE GENERAL 5.2. Sentencias secuenciales 5.2.1. Sentencia wait 5.2.2. Sentencias condicionales 5.2.2.1. If-then-elsif-else 5.2.2.2. Case-when 5.2.2.3, Bucles 5.2.2.3.1. For-loop 5.2.2.3.2. While-loop 5.2.2.3.3, Loop 5.2.2.3.4, Exit 5.2.2.3.5. Next 5.2.2.4, Null 5.3. Cuestiones y ejercicios Capitulo 6. Aspectos avanzados del lenguaje 6.1. Subprogramas 6.1.1. Funciones Procedimientos 6.2. Légica multivaluada 6.3. Sefiales 6.3.1. Modelos de retardos Concepto de driver Sefiales guarded: bus y register 64. compartidas 6.5. Alias 6.6. Atributos 6 Atributos predefinidos 6 Atributos definidos por el usuario 6.7. Sobrecarga de funciones y operadores 6.8. Firmas 6.9. Funciones de resolucién 6.10. Sentencia generate 6.11. Conversién de tipos. Conversiones explicita e implicita 6.12. Interpretacién de literales 6.13. Procesos pospuestos 6.14. Cuestiones y ejercicios Capitulo 7. Paquetes y bibliotecas TA. Paquetes 7.2. Bibliotecas 7.3. Alcance y visibilidad de las declaraciones 7.4. Configuraciones 7.5. Cuestiones y ejercicios vil 80 81 83 83 84 85 86 86 87 88 89 89 95 95, 96 98 104 106 106 107 110 il 113 114 11S 119 122 123 125 126 129 131 132 133 137 138 140 141 142 146 © ITES - Paraninfo vill INDICE GENERAL, Capitulo 8. Andlisis y simulacién de un disefio 8.1. 8.2. 8.3. 8.4. 8.5. 8.6. 8.7. Concepto de unidad de disefio Compilacién Elaboracién Modelo de tiempo Ciclo de simulacién 8.5.1. Colas de eventos 8.5. Retardo delta Banco de pruebas para simulaci6n Cuestiones y ejercicios Capitulo 9. Ejemplos practicos 9.1. 9.2. 9.3. 9.4. 95. Biestable RS sincronizado por niveles 9.1.1, Especificaciones Comentarios 9. Esquema circuital 9.1.4. Modelo VHDL y banco de pruebas 9.1.5. Resultados de la simulacién Biestable JK activado por flancos Especificaciones Esquema Comentarios Modelo VHDL y banco de pruebas 9.2.5. Resultados de la simulacién Memoria RAM de dimensién 4x16 93. Especificaciones Esquema 9.3.3. Comentarios 9.3.4. Modelo VHDL y banco de pruebas 9.3. Resultados de la simulaci6n Memoria LIFO 9.4.1. — Especificaciones 9, Comentarios 9. Esquema 9.4.4. Modelo VHDL y banco de pruebas 9.4.5. Resultados de la simulacién Memoria FIFO Especificaciones Comentarios Esquema Modelo VHDL y banco de pruebas Resultados de la simulacién © ITES - Paraninfo 147 147 148 151 151 152 152 153 160 166 169 170 170 170 171 171 173 174 174 174 175 175 179 180 180 180 181 181 184 185 185 185 185 186 189 190 190 190 190, 191 193 9.6. 9.7. 9.8. 9.9. 9.10. OL. 9.12. 9.13. {NDICE GENERAL Paquete de componentes Especificaciones Comentarios Modelo VHDL Biestable D sincronizado por flancos 9.7. Especificaciones Comentarios Esquema Modelo VHDL y banco de pruebas Resultados de la simulacién Biestable JK master-slave 9.8.1. _ Especificaciones Comentarios Esquema Modelo VHDL y banco de pruebas 9.8.5. Resultados de la simulacién Sumador binario 9.9. Especificaciones Comentarios Modelo VHDL y banco de pruebas 9.9.4, Resultados de la simulacién Paquete de funciones 9.10.1. Especificaciones 9.10.2. Comentarios 9.10.3. Modelo VHDL Contador sincrono en binario natural 9.11.1. Especificaciones 9.11.2. Comentarios 9.11.3. Esquema 9.11.4. Modelo VHDL y banco de pruebas 9.11.5. Resultados de la simulacién Contador sincrono en BCD natural 9.12.1. Especificaciones 9.12.2. Comentarios 9.12.3. Esquema 9.12.4. Modelo VHDL y banco de pruebas 9.12.5. Resultados de la simulaci6n Banco de registros 9.13.1. Especificaciones 9.13.2, Esquema 9.13.3, Comentarios 9.13.4. Modelo VHDL y banco de pruebas 9.13.5. Resultados de la simulacién 194 194 194 194 198 198 198 198 199 200 201 201 201 201 202 204 205 205 205 205 207 208 208 208 208 210 210 210 210 211 212 213 213 213 214 215 218 219 219 219 220 220 224 © ITES - Paraninfo x INDICE GENERAL, 9.14, Multiplexor de dos canales 225 9.14.1. Especificaciones 225 9.14.2. Comentarios 225 9.14.3, Esquema 225 9.14.4. Modelo VHDL y banco de pruebas 226 9.14.5. Resultados de la simulacién 227 9.15. Multiplexor de cuatro canales con retardo asociado 228 9.15.1. Especificaciones 228 9.15.2, Esquema 228 9.15.3, Comentarios 229 Modelo VHDL y banco de pruebas 229 Resultados de la simulacion 232 . Registro de desplazamiento 233 9.16.1. Especificaciones 233 9.16.2. Comentarios 233 9.16.3. Esquema 233 9.16.4. Modelo VHDL y banco de pruebas 234 9.16.5. Resultados de la simulacién 237 9.17. Memoria tipo pila (LIFO) 238 9.17.1. Especificaciones 238 9.17.2. Comentarios 238 9.17.3, Esquema 238 9.17.4. Modelo VHDL y banco de pruebas 240 9.17.5. Resultados de la simulacion 244 9.18. Controlador de un conjunto de robots 245 9.18.1. Especificaciones 245 9.18.2, Comentarios 245 9.18.3. Modelo VHDL y banco de pruebas 245 9.18.4. Resultados de la simulacién 248 9.19, Sistema secuencial sincrono microprogramable 249 9.19.1. Especificaciones 249 9.19.2, Comentarios 249 9.19.3. Diagrama de flujo y tabla de transiciones 249 9.19.4, Esquema 250 9.19.5. Modelo VHDL y banco de pruebas 251 9.19.6. Resultados de la simulacién 256 9.20. Maquina de estados finita 257 9.20.1. Caracteristicas 257 9.20.2. Comentarios 257 9.20.3, Modelo VHDL y banco de pruebas 257 9.21 Resultados de la simulacion 259 9.21. Aplicaciones del operador mod 260 9.21.1. Especificaciones 260 © ITES - Paraninfo {NDICE GENERAL 9.21.2, Comentarios 9.21.3, Modelo VHDL 9.21.4, Resultados de la simulacién Capitulo 10. Sintesis 10.1. Sintesis en el disefio de circuitos digitales 10.2. Herramientas de sintesis 10.3. Metodologia de sintesis 10.4. VHDL sintetizable y bibliotecas 10.5. Restricciones para sintesis Anilisis de la sintesis Verificacién de la sintesis 10.8. Disefio de l6gica combinacional 10.9. Diseffo de l6gica secuencial 10.10. Instrucciones no sintetizables 10.11. Ejemplos de disefio 10.12. Ejercicios propuestos Apéndice A. Glosarios A.L. Resumen de términos y conceptos A.2. AcrOnimos de interés A3. Palabras reservadas del lenguaje Apéndice B. Paquetes normalizados més importantes B.1. Paquete standard B.2. Paquete textio B.3. Paquete std_logic_1164 B.4. Paquete numeric_bit B.5. Paquete numeric_std Apéndice C. _ Sintaxis normativa Bibliografia 1, Textos y multimedia 2. Direcciones de Internet 3. Articulos y comunicaciones Indice alfabético XI 260 260 262 263 263 265 266 268 268 269 270 270 276 283 283 295 297 297 310 312 313 313 315 317 320 323 327 343 343 344 345 347 © ITES - Paraninfo PRESENTACION El auge actual de las tecnologfas de la informacién se ha debido al ex- traordinario aumento de la capacidad de integracién de los fabricantes de circuitos integrados digitales, que han pasado de contener 10 puertas légicas a mas de 1.000.000 en los tiltimos treinta y cinco afios del siglo XX. Esto ha permitido la realizacién de sistemas electrénicos digitales complejos inima- ginables en 1950, cuando se inicié la produccién de los primeros circuitos digitales sencillos basados en transistores. Pero dicho aumento no hubiera sido posible sin un cambio profundo en los procedimientos de disefio, que tuvieron que pasar de ser manuales a estar basados en herramientas consistentes en complejos programas de com- putador. Asf como en el disefio de los primeros circuitos integrados digitales se utiliz6 el método tradicional de realizaci6n de un prototipo, al aumentar su complejidad se hizo inevitable la simulacién. Igualmente dejé de ser prictico el procedimiento de describir los sistemas digitales complejos mediante un esquema, y por ello fue necesario el desarrollo de lenguajes de descripcién de sistemas digitales que recibieron el nombre de HDL (acrénimo de las palabras inglesas Hardware Description Language). Aunque diversas empre- sas y entidades definieron lenguajes de descripcién de sistemas digitales y desarrollaron compiladores y simuladores asociados con ellos, pronto se hizo patente la necesidad de definir un lenguaje normalizado, y en ello se puso a la cabeza el Departamento de Defensa de los EE.UU., que lider un consor- cio para el desarrollo de un HDL denominado VHSIC (Very High Speed © ITES - Paraninfo xIV PRESENTACION Integrated Circuit) Hardware Design/Description Language, que posterior- mente pas6 a denominarse VHDL y en 1987 fue normalizado por el IEEE con el ntimero 1076. El conocimiento del lenguaje VHDL se ha convertido en algo impres- cindible para todos los ingenieros que estén de alguna manera ligados al desarrollo de sistemas electrénicos digitales, y no slo de los que quieren convertirse en disefiadores de circuitos integrados. A través de él, el ingenie- ro se da cuenta de la importancia de la simulacién como herramienta de ayu- da al disefio, se acostumbra a estructurar los procedimientos de diseiio y adquiere conciencia de la importancia que el «hardware» tiene en el desarro- Ilo de las tecnologias de la informacién. En el aprendizaje del lenguaje VHDL es muy importante el método utilizado. La gran cantidad de conceptos asociados a los sistemas digitales hacen necesaria la utilizacién de un método que los introduzca de forma paulatina mediante la asociacién inicial de los esquemas a las descripciones en VHDL. En cualquier tecnologfa se ha demostrado siempre muy eficaz el aprendizaje de abajo arriba, en el que el técnico comienza analizando siste- mas sencillos ¢ incrementa paulatinamente su capacidad de disefio de siste- mas. En el disefio de sistemas digitales esta forma de aprendizaje es impres- cindible para consolidar poco a poco los numerosos conceptos ligados a ellos, y de esto han sido conscientes los autores de este libro, que ademas de tener experiencia en la enseffanza del VHDL, han disefiado y verificado nu- ‘merosos circuitos integrados digitales. Este libro es el resultado del esfuerzo de los autores por facilitar el pa- so a Ia utilizaci6n de los métodos modernos de disefio a los téenicos que conocen los conceptos basicos de la electr6nica digital y desean iniciarse en el disefio de sistemas digitales complejos. El lector encontrar4 en él un gran niimero de ejemplos reales que le permitiran comprobar fécilmente su nivel de asimilacién del lenguaje VHDL e ir poco a poco adquiriendo confianza en su capacidad de disefto. Por todo ello hay que dar la bienvenida a la incorporacién de este libro a la literatura en lengua castellana que se ve enriquecida con un texto que, sin duda, contribuird a la formaci6n de ingenieros en las técnicas modernas de disefio de sistemas electrénicos digitales. Enrique Mandado Pérez Catedratico de Tecnologia Electrénica de la Universidad de Vigo © ITES - Paraninfo PROLOGO VHDL es un lenguaje de descripcin del hardware que puede utilizar- se para modelar, documentar, simular, verificar y sintetizar un sistema digi- tal. Por tanto, abarca el ciclo completo de disefio, salvo el trazado fisico o layout, desde las especificaciones iniciales hasta la construccién del prototi- po hardware. Proporciona soporte suficiente para especificar su comporta- miento o su estructura, incluyendo jerarquias. Asimismo, es itil tanto para metodologfas de disefio ascendentes (bottom-up) como, sobre todo, descen- dentes (top-down). La seméntica y construcciones del Ienguaje permiten también disefiar con facilidad bancos de prueba (test-benches), mediante los que se lleva a cabo la simulacién de los sistemas modelados. Se trata de un lenguaje amplio y prolijo; tanto es asf que incluso algdn autor ya ha acufiado un segundo significado al acrénimo VHDL (Very Hard Description Language), mas que nada pot sus enormes posibilidades poten- ciales. No obstante, es factible asimilar con relativa rapidez un subconjunto del mismo, mediante el cual el futuro usuario puede comenzar a construir sus primetos modelos y bancos de prueba de una manera simple y répida. Por lo dicho anteriormente, no se pretende en este texto cubrir de una manera exhaustiva el estandar «[EEE 1076-1993», aunque sf se hace en un porcentaje elevado incidiendo, por supuesto, en los aspectos relevantes, Se pretende que, al finalizar el texto, el lector esté capacitado para disefiar mo- © ITES - Paraninfo XVI PROLOGO delos de sistemas més complejos, que pueden implicar llevar a cabo una particin, codisefio hardware-software, sistemas basados en médulos IP 0 macroceldas con procesadores empotrados (embedded processors), etc., en definitiva, todas aquellas posibilidades que hoy en dfa contempla el disefio microelectrénico digital. Existen muchos lenguajes de descripcién del hardware, pero la venta- ja del VHDL reside en haber nacido como estandar del IEEE. Ello hace que hoy en dia se haya convertido en el de mayor difusi6n, juntamente con Veri- log, también estandarizado por el IEEE en 1995. Ambos se reparten en la actualidad la practica totalidad del mercado en cuanto a herramientas comer- ciales desarrolladas y, por tanto, en cuanto a grado de penetracién y acepta- cidn, tanto a nivel industrial como universitario y de investigacién. Es por ello que ya se ha incorporado al curriculum de multitud de titu- laciones relacionadas con las tecnologfas de la informacién. El texto surge a partir de la experiencia a nivel docente e investigador de los autores a lo largo de toda la década de los 90, es decir, desde poco después de la aparicién del estandar en 1987. En base a ello, lo hemos es- tructurado en diez capitulos y tres apéndices. En el primer capitulo se hace una introduccién a los lenguajes de descripcién del hardware en general, sus origenes, caracteristicas, aplicaciones y limitaciones més importantes. A continuacién nos centramos en el VHDL y sus ventajas para el disefio de sistemas digitales con respecto a los demas HDLs. En el Capitulo 2 se exponen brevemente los fundamentos del lenguaje y sus conceptos primordiales, sin analizarlos con mayor profundidad, tarea que sera objetivo de los capitulos siguientes. El Capitulo 3 se adentra ya en la exposicién detallada, comenzando por la definicién de los elementos basicos, con abundantes ejemplos, para ayudar al lector a fijar ideas. Al final del capitulo se proponen una serie de ejercicios cuya resolucién puede encontrarse en la pdgina de soporte del texto (http://www.dte.uvigo.es/vhdl/). Se recomienda, no obstante, intentar previamente su resoluci6n a la luz de la teoria expuesta en el propio capitulo. Lo mismo se puede decir con respecto a los sucesivos capitulos. El Capitulo 4 prosigue con la exposicién de los elementos y las decla- raciones més basicas del lenguaje, incidiendo fundamentalmente en los con- ceptos de entidad, arquitectura, objetos y puertos. El Capitulo 5 presenta los aspectos més relevantes del conjunto de sentencias secuenciales y concurrentes que permiten Ilevar a cabo cualquier tipo de descripcién en cualquier nivel de abstraccién. En el Capitulo 6 se exponen aspectos avanzados del lenguaje que per- miten optimizar una descripcién, desde la utilizacién de subprogramas a los © ITES - Paraninfo PROLOGO XVI los alias, atributos, sentencias generate, variables compartidas, firmas y pro- cesos pospuestos. Asimismo, se incide en una serie de conceptos de primor- dial interés, como son los drivers de sefial, la sobrecarga de operadores y las funciones de resoluciGn, entre otros. El Capitulo 7 est dedicado a ampliar fundamentalmente los concep- tos de paquetes, bibliotecas y configuraciones. EI Capitulo 8 resulta de especial interés, puesto que en él se exponen los mecanismos necesarios para llevar a cabo la simulacién de sistemas con- currentes, algo inherente a todo Ienguaje de descripcién del hardware que lo diferencia fundamentalmente de los lenguajes de alto nivel (HLL) de prop6- sito general, El capitulo también incluye aspectos de las fases de compila- cién y elaboracién, previas a la ejecucién de una simulacién. Por tiltimo, se explica el disefio de un banco de pruebas para la aplicacién automatica de estimulos y lectura de resultados de la simulaci6n de un circuito o sistema. EI Capitulo 9 es el mas amplio y est4 dedicado a la exposicién de un extenso conjunto de ejemplos de disefio significativos en electronica digital. En cada uno se presentan las especificaciones, funcionamiento y esquema de un circuito junto con su modelo VHDL, su banco de pruebas y los resultados de simulaci6n obtenidos con una herramienta comercial. El Capitulo 10 esta dedicado a la fase de sintesis de una descripcién en VHDL, de cara a obtener un esquema circuital de bloques I6gicos. Se explican las normas generales para conseguir un modelo sintetizable y se exponen algunos ejemplos practicos con los resultados obtenidos por un sintetizador comercial. EI Apéndice A presenta tres glosarios: el primero est dedicado a ex- plicar brevemente, a modo de resumen, el conjunto de términos y conceptos mds importantes de VHDL; el segundo recoge algunos de los acrOnimos de interés relacionados tanto con el propio lenguaje, como con el disefio mi- croelectrénico en general y que han sido utilizados de forma mas 0 menos directa a lo largo del texto; el tercero presenta las palabras reservadas 0 key- words definidas por la norma. EI Apéndice B presenta los paquetes normalizados hasta la fecha de mayor interés y utilizaci6n. EI Apéndice C expone la sintaxis del lenguaje en el formato Backus- Naur, tal y como se recoge en el propio manual de referencia (LRM) de la revisién de 1993. Por diltimo, en aras de mejorar la legibilidad y reutilizacién del c6digo, en todas las descripciones VHDL a lo largo del texto se ha adoptado el con- venio de representar las palabras reservadas (keywords) en negrilla, los co- © ITES - Paraninfo XVI PROLOGO mentarios en letra de menor tamaiio, y los anglicismos, asi como los tipos de datos predefinidos, en cursiva (hardware, bit, data-flow, etc.). Los autores desean expresar su agradecimiento a José Luis Parada Ruiz y a José Luis Rodriguez Rivera por su inestimable ayuda en la clabora- cin de ejemplos y figuras, respectivamente, asf como al profesor Enrique Mandado Pérez por su presentacién preliminar. Serafin A. Pérez Lépez Enrique Soto Campos Santiago Fernandez Gémez Junio de 2002 © ITES - Paraninfo Capitulo 1 LENGUAJES DE DESCRIPCION DEL HARDWARE 1.1 INTRODUCCION La evolucién espectacular de la tecnologia y del disefio microelectr6- nicos ha permitido la realizacién de sistemas electrénicos digitales comple jos en un tinico circuito integrado de escala de integracién progresivamente elevada -muy alta (VLSI), ultra alta (ULSI), giga (GSI)- que llegan a conte- ner en su interior mas de 1.000.000 de puertas Iégicas. Pero esto sélo se ha podido llevar a cabo mediante un cambio profundo de las técnicas de disefio de circuitos integrados. Los circuitos de escala de integracién media y alta (MSI y LSI, res- pectivamente) se disefiaron mediante la realizacién de un prototipo formado por médulos més sencillos y la comprobacién de su funcionamiento antes de proceder a la integraci6n. Esta forma de disefto recibe el nombre de «abajo a arriba» (bottom-up) porque se enlazan diversos médulos para constituir un bloque funcional mas complejo. Pero en el caso de los circuitos integrados de complejidad VLSI y superiores no resulta préctica la realizacién fisica de un prototipo y por ello es necesario simular y verificar su correcto compor- tamiento antes de integrarlos. Ello trajo consigo la necesidad del desarrollo de métodos de disefio asistido por computador divididos en varias fases que, a partir de la especificacién del funcionamiento, llevan hasta la descripcién fisica del circuito, por lo que reciben el nombre de «arriba abajo» (top- down). Asi, mediante simulacién es posible una répida deteccién de errores en fases tempranas del disefio, resulta factible la reutilizacién del mismo para diferentes tecnologias y se pueden utilizar las herramientas de sintesis © ITES - Paraninfo 2 LENGUAJES DE DESCRIPCION DEL HARDWARE actuales para obtener répidamente un esquema l6gico o estructural y, en definitiva, una neilist* de entrada para el trazado fisico (layout) del ASIC, MCM, etc., 0 la asignacién de recursos (mapping) en el caso de la ldgica programable (PLDs y FPGAs). Todo ello, obviamente, incrementa la pro- ductividad y la eficacia del diseiio. No existe unanimidad en lo que se refiere al establecimiento de las distintas fases del disefio de un sistema digital complejo, aunque la necesi- dad de sistematizar esta metodologfa ha Ievado al establecimiento y progre- siva aceptacién de algunas propuestas. En la Figura 1.1 se representa una bastante aceptada que divide el disefio en siete niveles o formas de caracteri- zacion, también denominados niveles de abstraccién, por cuanto establecen la cantidad de informacién que se especifica de un circuito o el nivel de deta- lle en que se encuentra una descripcién respecto de su implementaci6n fisi ca. Nivel sistema. Describe el sistema como un conjunto de médulos semiaut6- nomos y cooperantes, cuya interacci6n se analiza para obtener un conjunto 6ptimo. No se especifica la forma de realizar cada uno de los médulos. Nivel algoritmico, funcional 0 de comportamiento. Cada médulo del nivel superior se define mediante un algoritmo en un Ienguaje de alto nivel (HLL). Dada la naturaleza paralela del hardware, en el que varios procesos pueden necesitar un mismo recurso (por ejemplo, un bus de datos) 0 en el que se deben sincronizar procesos independientes, se utilizan instrucciones muy similares a las de los lenguajes de programacién concurrentes, como por ejemplo, semaforos y regiones criticas. Nivel RTL (Register Transfer Level) o de flujo de datos (Data-Flow). En 41 se describe el sistema mediante diagramas de transferencias entre regis- tros, tablas de verdad 0 ecuaciones légicas. Se le concede més importancia a Jo que hace el sistema que a cémo lo hace. Los elementos basicos de este nivel son registros, memorias, I6gica combinacional y buses. Se distingue entre elementos con capacidad de almacenamiento y elementos sin ella. Nivel légico. Consiste en la descripcién del sistema mediante la interco- nexién de bloques basicos, como puertas Wgicas y biestables. No se realiza una descripcién del comportamiento, sino de la estructura del mismo. Si se incluyen ademis otro tipo de bloques, en general a este nivel se le suele de- nominar también estructural. * Una netlist es una descripcién textual de la estructura de un circuito, es decir, una especifi- caci6n en c6digo ASCII de sus componentes, interconexiones, entradas y salidas. Existe un formato esténdar industrial (EDIF) desde los afios 80 para hacer factible el intercambio de informacién entre herramientas de distintos fabricantes. Pero también resulta idénea como netlist de un circuito su descripcién a nivel estructural en un lenguaje de descripcién del hardware (HDL), como se vera més adelante. © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 3 Sistema Algoritmico ATL Légico j i Hy SF Dyp Fisico Eléctrico Conmutador Figura1.1 Niveles de descripcién, abstraccién o caracterizacién de un circuito Nivel conmutador. Las puertas se sustituyen por transistores considerados como conmutadores ideales que toman los valores cero 0 uno. La descrip- cidn es, por lo tanto, bésicamente la misma que en el nivel anterior, con la inica diferencia de que en algunas tecnologias, como por ejemplo CMOS, surgen nuevos tipos de circuitos, porque los conmutadores pueden ser bidi- reccionales, mientras que las puertas son unidireccionales. Nivel eléctrico. Se describe el sistema mediante modelos reales del transis- tor, con sus diferentes pardmetros eléctricos. Nivel fisico. Est constituido por la descripcién geométrica o simbélica de las mascaras que se emplean para la fabricacién el circuito. En la Figura 1.2 se representa el método de disefio conceptual pro- puesto por Lemmert y Nebel, que utiliza un Ienguaje de descripcién del hardware (HDL) a través de los distintos niveles. El disefio del circuito 0 sistema comienza de la forma mds generalizada posible, habitualmente con una especificacién algoritmica en un lenguaje de alto nivel. En cada nivel se refina la descripcién correspondiente y se compara con Ia del nivel superior. Este método implica la utilizacién de herramientas de disefio asistido por computador para simulacién y prueba en cada nivel, y por ello los lenguajes deben proporcionar compatibilidad y consistencia entre niveles. De esta ma- nera se trabaja de forma flexible y se logra que en un determinado momento coexistan descripciones de diferentes niveles que se pueden probar conjun- tamente. 1.2. GENESIS Los diferentes niveles de descripcién y especificacién implican el uso de herramientas basadas en computador para simular y comprobar los dise- fios. De ello se deduce la necesidad de que exista un lenguaje que permita © ITES - Paraninfo 4 LENGUAJES DE DESCRIPCION DEL HARDWARE Extraccién de la descripcién del nivel superior Comprobar las descripciones eCorrectas? Descripeién siguiente Figura 1.2 _Disefio conceptual de Lemmert y Nebel utilizar el mayor rango de herramientas posibles y mezclar diferentes niveles de descripcién de acuerdo con el estado de desarrollo de un proyecto. Asi nace el interés por establecer un conjunto de reglas que permitan especificar los sistemas digitales de diferentes formas y que sirvan para facilitar el dié- logo entre los diseffadores, entre las herramientas de disefio asistido por computador y entre disefiadores y herramientas. Este conjunto de reglas re- cibe el nombre de Lenguaje de Descriy mn del Hardware (Hardware Des- cription Language, en adelante HDL). Existen infinitas maneras de concebir un HDL, y por ello el problema més importante es la normalizacién. Diversos grupos de investigadores han creado distintos lenguajes con diversas caracteristicas. Las primeras solucio- nes fueron los lenguajes de transferencias entre registros, que se extendieron hacia los niveles superior e inferior, doténdolos de capacidad de expresar algoritmos mediante un lenguaje de alto nivel y de definir una estructura realizada con puertas. Ademés, se integraron con simuladores que permitian comprobar el funcionamiento mezclando diferentes niveles. Un ejemplo lo constituye el CAP/DSDL, autodenominado lenguaje de banda ancha, que permite la simulacién en los diferentes niveles situados entre el sistema y el conmutador. © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 5 Actualmente los HDL de uso mas extendido son Verilog y VHDL, es- tandarizados por el IEEE, aunque el primero ya existia como estndar indus- trial y académico «de facto» antes de su normalizacién en 1995. En el Apar- tado 1.6 se presenta el VHDL. 1.3 CARACTERISTICAS A continuacién se describen las caracteristicas funcionales mds impor- tantes de los HDL: Multinivel. Capacidad para utilizar el rango mas amplio posible de niveles de especificacién y combinarlos dentro de una misma descripcién para ser utilizados junto con las herramientas de disefto. Inteligible. Facilidad de lectura y comprensi6n para simplificar la documen- taci6n. Capacidad de descripci6n. Facilidad y potencia para describir los distintos elementos que forman parte de un sistema digital. Esta caracteristica es en general fruto de un compromiso. Por ejemplo, VHDL nacié de la necesidad del Departamento de Defensa de EE.UU. de disponer de un tinico lenguaje para especificar la realizacién fisica (hardware) de los sistemas digitales complejos, y es un lenguaje con tantas posibilidades de expresién que hasta se considera excesivamente prolijo. Estructura sintdctica. Los HDL deben poseer un conjunto de elementos que definan una sintaxis independiente del nivel. Por ejemplo, los médulos (module) de Verilog 0 el conjunto entidad-arquitectura (entity-architecture) de VHDL, que se analiza en el Capitulo 4. Ademas deben poseer instruccio- nes dependientes del nivel de descripcién en que se encuentre el disefio. Capacidad para disefio fisico estructurado. Deberian, asimismo, facilitar la especificacién de ciertos detalles de la realizacién fisica en una fase tem- prana del disefio. Un ejemplo de ello es la planificacién de la disposicién geométrica de las mascaras, o los canales de las celdas de entrada, salida 0 bidireccionales. Los HDL actuales no poseen esta caracteristica. Un HDL debe ser independiente de la tecnolo- uito. Independencia tecnol gia en la que se realice el Universalidad. Debe, asimismo, ser compatible con el mayor nimero posi- ble de herramientas de automatizacién del disefio electrénico (Electronic Design Automation, EDA), como por ejemplo, simuladores, generadores de patrones de prueba, etc. Capacidad de simular la concurrencia. Dado que los componentes de los sistemas digitales estan activos simultineamente, la concurrencia es un as- © ITES - Paraninfo 6 LENGUAJES DE DESCRIPCION DEL HARDWARE pecto fundamental a tener en cuenta por los HDL. Ello se traduce en que las sentencias de asignacién, descripciones de componentes, instanciacién* de los mismos, etc., han de ejecutarse de tal manera que parezcan ejecuciones simultaneas. Para ello se introdujo en VHDL el concepto de retardo delta, que ser explicado con detalle en el Capitulo 8. 1.4 APLICACIONES Las aplicaciones de los HDL se pueden considerar fundamentalmente de tres tipos: estructuracién del disefio, verificacién y documentacién. La independencia de la metodologfa y de las herramientas de disefio asistido por computador (CAD) empleadas permiten una mejor y mayor estructuracién de un disefio. Emplear un HDL como lenguaje base de trabajo en un proyecto constituye un medio de comunicacién ideal entre los diferen- tes departamentos de ingenieria que intervienen en el disefio y fabricacién de un circuito integrado u otro sistema electrénico. Esto facilita el trabajo en grupo y el intercambio de informacién. La verificacién también se aprovecha de las caracteristicas de los HDL a todos los niveles. Durante el desarrollo de un proyecto se deben Ile- var a cabo dos tipos de pruebas: unas para verificar la correcci6n del disefio y otras de posfabricacién. Los HDL facilitan la verificacién a través de la simulaci6n. La simulacién del sistema a alto nivel permite generar los patro- nes de prueba que se empleardn posteriormente en el resto de niveles y eta- pas del disefio. Ademds, la versatilidad de los lenguajes permite probar ar- quitecturas alternativas de forma rapida y eficiente cuando se pretende adap- tar el disefio a unos requerimientos especificos. Por tiltimo, los HDL constituyen un excelente medio de documenta- cién, Las descripciones realizadas de todo el sistema, o de las distintas partes del mismo, detallan su estructura y funcionamiento con absoluta precisién. 1.5 LIMITACIONES No obstante lo expuesto, los lenguajes de descripeién del hardware y sus programas de disefio asociados deben superar ciertas limitaciones toda- via existentes hoy en dfa: * No existe este sustantivo en castellano. Es una traduccién poco afortunada del término inglés instantation, que hace referencia a la copia de un componente de una biblioteca de recursos en el disefio. Dado que no existe uniformidad en cuanto a la traduccién, se esta ex- tendiendo la utilizacién del término mencionado. Algo parecido a lo que ya ocurri6 con hard- ware (sistema fisico), software (programa 0 conjunto de programas), librerfa (biblioteca), etc. © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 7 En general resulta menos eficiente un simulador asociado a un HDL que en un simulador especffico de la funcién que se quiere comprobar. En algunos Ienguajes como VHDL se estandariza la descripcién, pero no las herramientas asociadas a él. Por ello surgen dificultades para llevar a cabo la tarea del disefio en su totalidad. Se trata de lenguajes generales pero de aplicaci6n especifica (mayor generalidad en el caso de VHDL), con tanta complejidad como un lenguaje de programacién, lo que limita su introduccién en entornos de disefio mi- croelectrénico tradicionales. Constituyen descripciones textuales, con todas las ventajas ¢ inconve- nientes que ello conlleva en relaci6n con las descripciones graficas. No solucionan todavfa la descripcién de circuitos analégicos ni su si- mulacién. Los simuladores asociados a VHDL y a Verilog HDL funcionan mediante colas de sucesos, metodologia que no es valida en electronica ana- légica. Este es un campo de investigacién muy activo y ya existen herra- mientas de VHDL analégico. El IEEE aprobé en 1999 la norma 1076.1 VHDL-AMS (Analog Mixed Systems) como una extensién para disefio ana- l6gico, aunque su grado de penetraci6n, popularidad y utilizacién es todavia bastante reducido. Esté basada en su totalidad en el presente estandar en (1076-1993), con un conjunto de recursos adicionales para la descrip- cién de funciones analégicas. 1.6 EL LENGUAJE VHDL Una vez establecidos los objetivos, caracteristicas, aplicaciones y limi- taciones generales de los lenguajes de descripcién del hardware, el texto se centra exclusivamente a partir de ahora en el lenguaje estindar VHDL. Se revisa brevemente su historia y a continuacién se exponen sus caracteristicas fundamentales. En los sucesivos capitulos se profundizaré en ellas. 1.6.1 Historia En 1980 el Departamento de Defensa de Estados Unidos (DoD) inicié un proyecto denominado Very High Speed Integrated Circuit (VHSIC), con el principal objetivo de desarrollar circuitos integrados en tecnologia de 0,5 micras con muy altas prestaciones y resistencia a la radiacién. Estos circuitos se habrian de integrar en los sistemas militares y mejorarlos en gran medida. Antes del término de ese mismo afio se hizo evidente que para poder organizar y coordinar el desarrollo de los 28 circuitos integrados propuestos por diversas compaiiias, era necesario el empleo de un lenguaje de descrip- © ITES - Paraninfo 8 LENGUAJES DE DESCRIPCION DEL HARDWARE cién del hardware que permitiera el flujo de informacién entre disefiadores, fabricantes y usuarios. De esta forma, en otofio de 1980, se iniciaron los trémites para el desarrollo de un nuevo lenguaje de descripcién denominado VHSIC Hardware Design/Description Language 0 VHD’L, que posterior- mente se simplificaria en el acrénimo VHDL. En julio de 1983 se inicis formalmente el proyecto de desarrollo del lenguaje VHDL, con la participacién de tres compafifas: Intermetrics, Texas Instruments e IBM. El documento de partida del DoD especificaba que el VHDL deberfa ser un lenguaje para disefio y descripcién de hardware, y mas concretamente para poder ser usado para: Docnmentacién del disefio. En principio, VHDL se estandariz6 para la descripcién del hardware, pero no para disefio. Disefio en alto nivel. Simulacién. Sintesis. Verificacién. Descripcién de entrada (netlist) para las herramientas de disefio fisico. Otros requerimientos més especificos del DoD para un modelado efi- ciente fueron: Descripcién genérica de modelos, de tal forma que resultara sencillo confi- gurar un componente en cuanto a tamaiio, caracteristicas fisicas, temporales, fan-out, etc, Para ello se utilizan los denominados puertos genéricos 0 sim- plemente genéricos (generics), que se estudiardn en el Capitulo 4. Declaracién y uso de tipos de datos. Debido a los diversos niveles de abs- traccién posibles, el lenguaje no se puede restringir a los tipos mas basicos, como bit 0 boolean. Por tanto define también tipos enteros, reales, fisicos, enumerados, array, record, etc., y permite al usuario la definicién de cual- quier otro. Es por ello que se dice que VHDL esta «fuertemente orientado a tipos» (strongly typed) y es ésta una de las caracteristicas que le otorgan mayor potencia y flexibilidad. Subprogramas. Se permite la declaracién y definicién de funciones y pro- cedimientos para conversiones de tipos, redefinicién de operadores, creacién de otros nuevos, entrada y salida de datos desde el exterior y otras tareas comunes a los demas lenguajes de propésito general. Control temporal. VHDL dispone de sentencias para detectar flancos, espe- cificar retardos, especificar tiempos de set-up y hold, comprobar anchura de pulsos, establecer restricciones temporales, etc. © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 9 Descripcién estructural. Los requerimientos del DoD para un HDL estén- dar especificaban que éste deberfa tener recursos para especificar el hardwa- re a todos los niveles, incluso Hegar a describir un disefio genético de un bit y utilizarlo para descripci6n de estructuras regulares multibit en una 0 més dimensiones. Para ello dispone de sentencias como generate, de la que se hablard en el Capitulo 6. La primera fase del desarrollo del lenguaje finalizé en julio de 1984, y en este mismo afio el IEEE comenzé a trabajar en la estandarizacién, En 1985 aparecié el primer prototipo del lenguaje y en 1987 se aprobé final- mente el esténdar con el ntimero 1076. La aparicién del mismo supuso un fuerte impulso y numerosas firmas de herramientas EDA comenzaron a in- corporar compiladores y simuladores en sus paquetes de disefio a partir de 1990. Posteriormente Ilegaron las herramientas de sfntesis. En 1994 el IEEE Publicé la revisién del estindar IEEE Sid 1076-1993, que es la que se en- cuentra actualmente en vigor. 1.6.2 Caracteristicas VHDL es un Ienguaje de descripcién hardware de gran generalidad derivado del lenguaje de alto nivel ADA. Dispone de tipos abstractos para definir el formato y valores de sefiales, variables, constantes, etc., y propor- ciona amplias facilidades para la realizaci6n de algoritmos. Admite casi todos los niveles de descripcién comentados en los apar- tados anteriores, desde el algoritmico hasta el Igico. Para ello proporciona herramientas semanticas y sintécticas que se pueden agrupar asi: — Aquellas orientadas a las descripciones de comportamiento del circuito, — Aquellas orientadas a la descripcién de las relaciones entre los distintos bloques de un circuito, es decir, su estructura. Al realizar una descripci6n VHDL es importante elegir adecuadamen- te el nivel en funcién del objetivo perseguido. Por ejemplo, si se pretende sintetizar la descripci6n realizada, es decir, si el objetivo final es obtener un conjunto de puertas e interconexiones, no se debe emplear el nivel algoritmi- co, pues en general las herramientas actuales de sfntesis no aceptan como entrada estas descripciones. Sin embargo, este nivel si es adecuado cuando el objetivo es comprobar que un sistema complejo funciona correctamente, pues se puede describiry sim ular de una forma répida y eficiente. ‘A modo de introduccién, sin pretender entrar en mayores profundida- des por ahora, se presentan a continuaci6n los diversos niveles de descrip- cin o abstracci6n a través de un simple decodificador | entre 4 (Figura 1.3). © ITES - Paraninfo 10 LENGUAJES DE DESCRIPCION DEL HARDWARE & con —~ . b A 5 “ = HS Li = 2 oF Figura 1.3 Decodificador 1 entre 4 En primer lugar se declara un caja negra (entity) con un identificador para el circuito («decodificador» en este caso), y sus terminales de entrada (e0, el, en) y salida (s0, s1, s2, s3). Asimismo, se declaran las direcciones de los terminales (in, out) y el tipo de datos que admiten (bit). Todo ello se justificara adecuadamente y en mayor profundidad en el Capitulo 4. entity decodificador is port (c0, el, en: in bit; 80,s1,s2,s3: out bit); end; A continuacién se describe el circuito en sf dentro del cuerpo de una arquitectura. Esta descripcién difiere segiin el nivel. Nivel algoritmico Es el nivel con mayor grado de abstraccién. Aqui el disefiador sélo describe el comportamiento del sistema, sin preocuparse de las sefiales 0 componentes internos del mismo. Por ello al referirse a él se suele hablar de nivel de comportamiento (behavior) 0 de descripcién a alto nivel (High Le- vel Description). Dentro de la arquitectura aparece un proceso (process) (sentencia que engloba a su vez a un conjunto de sentencias que se ejecutan en secuencia, como se verd en capitulos sucesivos) en el que con facilidad, y por similitud con los lenguajes de alto nivel, se puede observar la descripcién de lo que hace el circuito, es decir, su comportamiento, al margen de cémo esté reali- zado (la descripcién es mejorable utilizando la sentencia case-when, que se estudiard en el Capitulo 5, pero por ahora puede resultar més intuitiva if- then-elsif). © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL uN architecture algoritmica of decodificador is begin process (c0, el, en) begin if en='0' then s2<='0'; s3<=' ‘0' then " and el='I' then elsif e0='1" and el='I' then end if; end process; end algoritmica; Resulta obvia pues la denominacién de nivel de comportamiento o al- goritmico. Nivel RTL Este nivel proporciona un cierto grado de abstraccién con respecto al hardware, pero el disefiador se ve obligado a describir las distintas sefiales que interacttian en un circuito y su comportamiento en funcién de las entra- das por medio de ecuaciones lgicas y sentencias de asignacién. En la arquitectura puede observarse la descripci6n de la relacién entre entradas y salidas Unicamente por medio de ecuaciones Wégicas. Como se verd en el Capitulo 3, el simbolo <= indica asignacién a sefial. architecture RTL of decodificador is signal eOn, en: bit; begin eln sO <= e0n and eln and en; 0 and eln and en; e0n and el and en; s3 <= e0 and el and en; end RTL; © ITES - Paraninfo 12 LENGUAJES DE DESCRIPCION DEL HARDWARE Utiliza los recursos que el lenguaje proporciona para describir las in- terconexiones entre los distintos componentes de un circuito. Otra denomi- nacién habitual para referirse a este nivel es la de estructural. Se han de definir 1os componentes que forman parte del circuito, si no estén disponibles en una biblioteca (library). De este modo se realiza pre- viamente la descripcién del conjunto entidad-arquitectura de los dos tipos de componentes utilizados en este ejemplo: inversor y puerta and. entity inversor is port (e: in bit; s: out bit); end inversor; architecture RTL of inversor is begin 8 <= not(e); end RTL; entity puerta_and is port (c0,el,e2: in bit; s: out bit); end puerta_and; architecture RTL of puerta_and is begin s <= 0 and el and e2; end RTL; Ahora puede hacerse la descripcién légica, equivalente a una netlist, del circuito: entity decodificador is port (e0, el, en: in bit; s0,s1,s2,s3: out bit); end decodificador; architecture estructural of decodificador is signal eOn, eln: bit; component inversor is port (e: in bit; s: out bit); end component; component puerta_and is port (e0,el,e2: in bit; s: out bit); end component; begin NO: inversor port map (¢0, e0n); © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 13 NIL: inversor port map (el, eln); ‘AO: puerta_and port map (e0n, eln, en, s0); Al: puerta_and port map (c0, eln, en, s1); ‘A2: puerta_and port map (e0n, el, en, s2); ‘A3: puerta_and port map (0, el, en, s3); end estructural; En la arquitectura se declaran las sefiales internas de interconexién y Jos componentes a utilizar. En el cuerpo de la arquitectura se invocan y co- nectan dichos componentes (mediante sentencias de instanciacién) para mo- delar la estructura del circuito. En el Capitulo 4 se estudia el VHDL a nivel légico, mientras que en el Capitulo 5 se describen las sentencias que se utilizan para los niveles RTL y algoritmico. 1.7. VENTAJAS DE VHDL PARA EL DISENO DE SISTEMAS DIGITALES VHDL permite modelar y simular un sistema desde un alto nivel de abstraccién hasta el nivel l6gico més elemental con puertas y biestables. Basicamente permite tres estilos de descripcién: algoritmico o de comporta- miento, RTL 0 flujo de datos y estructural. No obstante, pueden mezclarse en un mismo disefio los distintos esti- los de descripcién 0 niveles de abstraccién. Por ejemplo, podrian formar parte del mismo modelo descripciones de méquinas de estados u otras des- cripciones algoritmicas, ecuaciones légicas, instanciacién de componentes de bibliotecas, etc. Mediante unas gufas de modelado para sintesis es posible la obtencién directa y automdtica del circuito a nivel l6gico o netlist desde una descrip- cin de nivel superior. Los modelos creados pueden ser usados para diferentes tecnologias (reutilizacién del cddigo), las cuales se pueden cambiar con facilidad hacien- do uso de herramientas EDA. Pero también permite especificar caracteristi- cas tecnolégicas mediante la definicién de nuevos tipos, componentes, atri- butos y pardmetros genéricos. Es un lenguaje normalizado, por lo que es compatible con la préctica totalidad de las herramientas de disefio disponibles en el mercado. La norma- lizacién implica que no es un lenguaje de propietario, por lo que cualquier usuario puede desarrollar una herramienta para VHDL y comercializarla. © ITES - Paraninfo 14 LENGUAJES DE DESCRIPCION DEL HARDWARE Asimismo, puede usarse para la comunicacién entre distintas herra- mientas EDA. Por ejemplo, un programa de captura de esquemdticos podria generar una descripcién VHDL, que a su vez podria usarse como entrada a un simulador. Admite disefio jerarquico, es decir, un sistema digital puede ser mode- lado como un conjunto de componentes interconectados y cada componente a su vez ser como otro conjunto de subcomponentes, etcétera. Permite el disefio rop-down, que incrementa la productividad y efi- ciencia de los disefios, particularmente de los mas complejos, como ya se mencion6. De todos formas, también permite el disefio bottom-up 0 una combinacién de éste y top-down. Admite disefios arbitrariamente largos; no existen limitaciones im- puestas al tamaiio de los mismos. Los bancos de prueba para simulacién pueden escribirse en el propio lenguaje y ser usados para comprobar diversos modelos. El uso de pardmetros genéricos y atributos facilita la retroanotacién de tiempos para la simulacién post-layout. Los pardmetros genéricos y atributos son titiles también para simplifi- car el modelado de estructuras regulares, lo que se conoce por modelos pa- rametrizados. La definicién de nuevos tipos de datos permite modelar y simular a un alto nivel de abstraccién sin tener que hacer referencia alguna a los detalles de implementacién. VHDL permite al disefiador concentrarse en la funcionalidad sin tener que dedicar tiempo y esfuerzos a factores que no afectan a la misma. En el disefio tradicional, el disefiador tenfa que comprobar paralelamente y de forma manual factores puramente tecnolégicos como retardos, Area, fan-out, etcétera. Prototipado rapido (Rapid Prototyping). Se trata de una nueva posibi- lidad surgida recientemente para facilitar enormemente el disefio, mediante la cual un circuito de miles de puertas puede ser implementado en un circuito integrado configurable tipo FPGA desde una descripcién HDL mediante un simple PC, sin la necesidad de un equipamiento caro. El prototipado rapido permite incluso llevar a cabo una pequefia produccién en serie, Los pardmetros temporales (retardos, tiempos de set-up y hold, detec- cién de transitorios, etc.) pueden describirse, asimismo, con facilidad. No obstante, existen aspectos del lenguaje que hacen dificil la portabi- lidad de las descripciones entre los distintos simuladores comerciales. El © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 15 problema estriba en que, aunque VHDL admite muchos tipos abstractos de datos, no resuelve la forma de caracterizar la fuerza de las sefiales 0 condi- ciones tales como valor I6gico desconocido o alta impedancia. Asf pues, Iuego de la primera versién del estandar en 1987, numerosos simuladores comerciales inclufan nuevos tipos no estandarizados. Pero ello trajo consigo la incompatibilidad entre herramientas de las distintas firmas. Para solventar el problema, el II desarrollé un nuevo estandar, el 1164-1993 0 std-logic_1164, que declara tipos de datos con 9 valores l6gi- cos, por lo que también pasé a denominarse paquete estindar de Iégica mul- tivaluada MVL9. Puede consultarse en el Apéndice B. La descripcién de la informacién temporal en un modelo es crucial pa- ra llevar a cabo simulaciones precisas. La norma de VHDL dispone de recur- sos para especificacién de tiempos. Sin embargo, no describe un método estindar para modelar componentes de biblioteca con informacién temporal, ni de especificar retroanotaciones de tiempos para simulacién post-layout. Esto no ocurre con Verilog, que sf dispone de un esténdar para la es- pecificacién de retardos: SDF «Standard Delay Format». SDF permite ex- presar los datos relativos a temporizaciones de una forma tabular y ser in- cluida en el modelo a simular. Por ello, el IEEE desarrollé la extensin 1076.4, cuya primera versién fue aprobada en 1995 y la primera revisin en 2000. En principio, el objetivo de este nuevo estindar conocido por VITAL «VHDL Iniciative Towards ASIC Libraries» era facilitar la generacién de modelos de componentes con informacién de tiempos valida tanto para VHDL como Verilog, por lo que sus formatos de representacién y los del SDF son bastante similares. 1.8 OTROS LENGUAJES DE DESCRIPCION Numerosos lenguajes de descripcién del hardware han sido desarro- Ilados en los tiltimos 30 afios. Desde el Computer Design Language (CDL), presentado en 1965, hasta el Verilog, desarrollado en 1983-84, siempre se han buscado formas eémodas, sencillas y potentes de describir los circuitos electrénicos. Una excelente revisién de los lenguajes de descripcién del hardware se puede encontrar en los trabajos de Borrione et al. y Chu et al. (ver Bibliografia). Por parte de las empresas que comercializan herramientas de disefio microelectrénico, el lenguaje més conocido hasta principios de los afios 90 fue Verilog, propiedad de la compaiifa Cadence Design Systems. Este len- guaje es sencillo de aprender y utilizar, y posee gran capacidad de descrip- cidn de circuitos digitales a nivel RTL. Pero existen otros asociados a sus © ITES - Paraninfo 16 LENGUAJES DE DESCRIPCION DEL HARDWARE respectivos entornos, como por ejemplo el AHDL de Altera, que forma parte de su herramienta de disefio (MAX+PLUS II) para PLDs y FPGAs. A partir de la aparicién de VHDL se pusieron de manifiesto las venta- jas de la estandarizacién, lo que tuvo como respuesta por parte de las univer- sidades un importante interés en dicho lenguaje. Las empresas de herramien- tas de disefio microelectrénico pasaron a incluirlo como parte sus entornos. Ademés Cadence realizé un importante esfuerzo en convertir el Verilog en un esténdar, aprovechando la extendida implantacién industrial de sus herra- mientas, dando lugar a OVI «Open Verilog International» para soporte y extensién de la utilizacién de Verilog. Fste es hoy en dfa el lenguaje mas extendido, junto con VHDL. Veri- log se ha convertido en un estandar de facto debido a la gran aceptacién que ha tenido entre las compafifas de disefio de circuitos integrados y finalmente fue también normalizado por el IEEE en 1995. De hecho, algunas de las principales herramientas de sintesis presentes en el mercado se desarrollaron inicialmente para sintesis de descripciones en Verilog, siendo posteriormente ampliadas para aceptar también VHDL. © ITES - Paraninfo Capitulo 2 FUNDAMENTOS DEL LENGUAJE Comenzar el estudio de un nuevo lenguaje desde sus fundamentos puede resultar una tarea complicada debido a la necesidad de asimilar una serie de conceptos aparentemente no relacionados entre si. Sélo al avanzar en el mismo se adquiere de forma progresiva una visin global y un mayor entendimiento de las definiciones iniciales. Este capitulo pretende ayudar a la comprensién de dichos conceptos previos, con una introduccién genérica del lenguaje y sus elementos. 2.1. FUNDAMENTOS DE UNA DESCRIPCION Como indica la Figura 2.1, toda descripcién en VHDL esta constituida al menos por tres tipos de elementos: Bibliotecas* (libraries) Entidades (entities) Arquitecturas (architectures) El disefiador generalmente realiza la descripcién de las entidades y ar- quitecturas empleando elementos almacenados en las bibliotecas. Aquéllas a su vez son almacenadas en la biblioteca de trabajo (denominada work por defecto) luego de ser compiladas, como se verd en el Capitulo 8. * Habitualmente se denominan librerfas, término que constituye una traduccién errénea de libraries. © ITES - Paraninfo 18 FUNDAMENTOS DEL LENGUAJE Entidad 1 Arquitectura A Entidad 2 Arquitectura A Entidad 3 Arquitectura A Figura 2.1 Componentes principales de una descripcién en VHDL 2.2. ENTIDADES Y ARQUITECTURAS Una entidad tiene la misién de modelar la interfaz de un circuito o sis- tema con el exterior a través de unas entradas y salidas que, segdn el nivel de descripci6n, pueden reflejar diversos terminales tales como los de una puerta que forma parte de un bloque combinacional, los de un registro que forma parte de una ruta de datos o los de un bloque més abstracto. La figura 2.2 muestra el ejemplo de una puerta AND de dos entradas. La descripcién de su entidad est formada por un identificador («puer- ta_and»), la caracterizacién de sus dos entradas (A y B) y su tinica salida (©). Ademas puede contener informacién adicional, como por ejemplo el tiempo de propagacién de las sefiales a través de la puerta. EI identificador de la entidad y su comunicacién con el exterior for- man la envoltura basica de un circuito proporcionada por VHDL, que es comin a todos los niveles de descripcién en los que se modele un disefio. Esto permite formar una jerarqufa en la que una descripcién de nivel supe- rior referencia a otras a través de sus identificadores y terminales. entity puerta_and is. A generic (t_retardo: time:=2ns); c port (A, B: in bit; C: out bid; end puerta_and; Figura 2.2 Simbolo y modelo de una puerta AND © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 19 Para que la descripcién de un circuito sea completa se necesita, ade- mds de su declaracién como entidad, una especificacién de su funcionamien- to. La arquitectura es la encargada de ello. Es posible realizar diversas des- cripciones del funcionamiento de un circuito, por lo que pueden existir va- rias arquitecturas para una misma entidad. La Figura 2.3 muestra un multiplexor de dos canales y tres posibilida- des de realizaci6n o especificacién de su funcionamiento, correspondientes a sendas arquitecturas. Una posible estaria formada por dos puertas AND, una OR y un inversor. Otra utilizando dos puertas OR, una AND y un inversor, y una tercera podria estar constituida simplemente por dos Iineas de cédigo para su especificaci6n funcional, al margen de su realizacién. Para el modelado de un circuito concreto, se asigna a cada entidad una de sus posibles arquitecturas asociadas. s | Salida s s A Ac Salida : “ 8 8 1 B Entidad ¢ —| mux 5 c s_4 ‘Arquitectura A ‘Arquitectura B ‘Arquitectura C a mp) Si (s=0) entonces C = A eo \ Si (s=1) entonces ¢ = B jura 2.3 Multiplexor de dos entradas y tres posibles arquitecturas © ITES - Paraninfo 20 FUNDAMENTOS DEL LENGUAJE 2.3. BIBLIOTECAS Y PAQUETES Las bibliotecas (libraries) almacenan distintos componentes y elemen- tos a utilizar en un determinado disefio. Por ejemplo, se puede describir en VHDL una puerta Idgica AND de cuatro entradas y guardarla en una biblio- teca para su posterior uso. O bien almacenar un conjunto de funciones ma- temiticas, nuevos tipos de datos, objetos, etc. Todos estos elementos se agrupan, dentro de una biblioteca determi- nada, en unidades denominadas paquetes (packages). La Figura 2.4 muestra una biblioteca «Mi_Biblioteca» en la que coexisten varios paquetes y cada uno de ellos contiene diferentes componentes y/o elementos. Cuando se des- cribe un circuito se puede acceder a todos o a alguno de los elementos de cada biblioteca. Por ejemplo, se puede acceder a todo el paquete «Circui- tos_2» que contiene una memoria RAM y una ALU, o solamente al compo- nente V_RISC del paquete «Circuitos_I». Biblioteca “Mi_Biblioteca” Paquete “Puertas” Paquete “Funciones” Fi Type byte is ‘Subtype word is Figura 2.4 Biblioteca de componentes © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 21 La biblioteca de disefio 0 de trabajo se denomina work por defecto y, en principio, es la tinica que se puede modificar. Esta biblioteca y la std son siempre visibles, por tanto no es preciso referenciarlas explicitamente. Std contiene dos paquetes basicos: standard y textio (ver listado de ambos en el Apéndice B). Aquél contiene definiciones de tipos basicos como bit, tiempo, enteros, reales y caracteres. Textio contiene procedimientos para la entrada y salida de informacién de ficheros en sistemas de almacenamiento externos. Para usar paquetes 0 componentes de otras bibliotecas es necesario hacerlos visibles en el disefio mediante la sentencias library y use, como se verd en el Capitulo 7. 2.4 CONFIGURACIONES La configuraciones son descripciones encargadas de seleccionar qué arquitectura, de entre todas las existentes, se asocia con una entidad dada, y qué componentes de dicha arquitectura se asocian con otras entidades exter- nas para formar un circuito concreto. Cuando se describe un circuito complejo, normalmente se realizan va- tias arquitecturas de sus distintos componentes. Se pueden incluir estas ar- quitecturas dentro del disefio, sin embargo esto no es prictico, pues obliga a modificarlo cada vez que se elige una arquitectura para un componente. Las configuraciones constituyen una herramienta muy itil porque definen de forma sencilla la arquitectura que se desea asociar con una entidad y el con- junto entidad-arquitectura que se asocia con cada componente del circuito. Entidad Et Entidad £2 Arquitectura A Figura 2.5 Ejemplo de configuraciones © ITES - Paraninfo 22 FUNDAMENTOS DEL LENGUAJE La Figura 2.5 explica de forma gréfica el concepto de configuracién, que sera ampliado en el Apartado 7.4. 2.5 VHDL CONCURRENTE Y SECUENCIAL VHDL es un lenguaje que participa de las ventajas del software en ge- neral, pero ademas ha de ser capaz de modelar correctamente el hardware. Una de las diferencias més importantes entre hardware y software es el ca- récter concurrente del primero y generalmente secuencial del segundo. Un programa se ejecuta normalmente en secuencia, es decir, existe un orden en la ejecucién de las instrucciones. Asi, en el siguiente ejemplo, C adquiere su valor final de 5 s6lo tras la ejecucién de las sentencias 1 y 2: Valores iniciales: sentencia 1: sentencia 2: sentencia 3: Sin embargo, este cardcter secuencial no refleja adecuadamente el hardware. Un circuito fisico funciona concurrentemente, es decir, todas sus partes estén activas de forma simultdnea, interaccionando entre ellas a lo largo del tiempo. El mismo ejemplo anterior darfa lugar a una evolucién temporal distinta si se supone una ejecucién concurrente: cuando el tiempo avanza una unidad, los valores de A y B cambian, pasando a | y 4, respecti- vamente, pero C sigue en 0, dado que todas las sentencias se estdn evaluando concurrentemente; en la unidad de tiempo posterior C adquiere finalmente el valor 5. En definitiva: EJECUCION TIEMPO SECUENCIAL _CONCURRENTE. A B ec A B c 0 0 0 0 0 0 I T 0 0 I 4 0 2 I 4 0 1 4 5 3 1 4 5 VHDL admite descripciones en las que el eédigo se ejecuta o bien concurrente o bien secuencialmente, segiin interese reflejar el cardcter hard- ware o el de un algoritmo secuencial. © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 23 2.6 METODOLOGIA DE DISENO CON VHDL La Figura 2.6 muestra el flujo de disefio de un circuito en VHDL, des- de su concepcién hasta su fabricacién. A partir de las especificaciones iniciales se elabora una descripcién a nivel algoritmico del circuito. Las ventajas de realizar este paso previo son miltiples, como se expuso en el Capitulo 1. Este nivel permite simular el disefio para comprobar si tiene posibilidades de Ilevarse a la practica. Ade- més, esta simulaci6n permite insertar el circuito en un sistema mds complejo y observar como interacciona con el mismo, lo que proporciona una valiosa informacién para ajustar las caracteristicas finales del circuito. Este paso es rapido, pues una descripcién algoritmica en VHDL permite describir circui- tos 0 sistemas muy complejos con pocas Ifneas de cédigo. De ahf que una de las aplicaciones importantes de los HDL sea el modelado répido de prototi- pos (RASP, Rapid Systems Prototyping). ESPECIFICACIONES 4 Deseripeién algoritmica | p Descripoién para sintesis Biblioteca Sintesis Fabricacion ii Figura 2.6 Flujo de disefio con VHDL © ITES - Paraninfo 24 FUNDAMENTOS DEL LENGUAJE Una vez finalizada la prueba de concepto, se pasa al disefio detallado. Dependiendo de la herramienta de sintesis que se utilice y de las especifica- ciones del circuito, la descripcién VHDL estaré constituida por un tanto por ciento mayor 0 menor de los niveles l6gico y RTL. Por Ultimo se aborda la sintesis del circuito, es decir, el paso de una descripcién en VHDL a un circuito real. Para alcanzar las especificaciones de funcionamiento en cuanto a drea, tiempos, consumos, etc., puede ser ne- cesario realizar diversas descripciones del circuito o de alguna de sus partes. Aqui se puede apreciar la utilidad de elaborar diversas arquitecturas para cada entidad, pues permiten llevar a cabo diversos tipos de pruebas eligiendo las adecuadas combinaciones de entidades y arquitecturas. Las configuracio- nes de VHDL automatizan esta labor. EI proceso de disefio puede terminar antes si el objetivo final no es la fabricaci6n sino, por ejemplo, la creacién de componentes de biblioteca para uso posterior. El diagrama de la Figura 2.6 refleja también esta posibilidad. © ITES - Paraninfo Capitulo 3 ELEMENTOS DEL LENGUAJE Como paso previo a la descripcién de circuitos, en este capitulo se in- troducen los diversos elementos del lenguaje. Se presentan los tipos de datos predefinidos y la forma de crear nuevos tipos, los identificadores, los delimi- tadores, los literales, los operadores y los objetos. En cuanto al convenio de representacién adoptado: — Las palabras reservadas (keywords, ver Apéndice A) del lenguaje se resal- tan en negrita: entity, variable, signal, end, and, loop, process, etc. — Los tipos de datos y los anglicismos se indican en cursiva: bit, string, hardware, etcétera. — Los identificadores se indican entre comillas (salvo en el propio cédigo VHDL): «sumador», «variable|», «tipo_4», etcétera. — Los comentarios se escriben en letra de menor tamajio, ademés de ir pre- cedidos por dos guiones, de conformidad con la norma. 3.1 IDENTIFICADORES Para las denominaciones de los elementos del lenguaje se emplean los identificadores. Se distinguen dos tipos: basicos y extendidos. Un identifica- dor basico es cualquier conjunto de letras, ntimeros, y el carécter _. Las tini- cas restticciones son: © ITES - Paraninfo 26 ELEMENTOS DEL LENGUAJE — El primer carécter ha de ser necesariamente una letra (a+z, A+Z) del alfabeto inglés. — El tiltimo cardcter no puede ser «_». — No pueden utilizarse dos «_» seguidos. ‘Ademés VHDL no hace distincién entre letras maytisculas y mintiscu- las (case insensitive). En ocasiones interesa emplear un conjunto ampliado de caracteres, 0 bien distinguir entre maytisculas y mindsculas. Por ello se introdujeron los identificadores extendidos en la revisién del lenguaje de 1993, los cuales pueden contener cualquier cardcter esténdar (véase en el Apéndice B, paque- te standard, la lista de caracteres aceptados en VHDL). Un identificador extendido se delimita con caracteres \. Asi, ejemplos de identificadores posibles, son: inputA sig_l valor_binario_3 \temporal.%1238$-4A \v.1-3\beta\ Nétese que es posible emplear el cardcter \ en un identificador exten- dido. Para ello es necesario colocar dos seguidos, lo cual se entiende como uno solamente. Las palabras reservadas del lenguaje no se pueden emplear como iden- tificadores. En el Apéndice A se muestra un listado de las mismas. 3.2. DELIMITADORES Son caracteres utilizados en determinadas operaciones y sentencias. Los delimitadores simples estan constituidos por un solo caracter: => ** << o- © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 21 A lo largo del texto se irén exponiendo el significado y funcién de ca- da uno de ellos, en la medida en que vayan apareciendo formando parte de la sintaxis de las diversas sentencias y expresiones. 3.3. COMENTARIOS En las descripciones se pueden introducir comentarios que ayudan a la comprensién del c6digo y a su documentacién, Cualquier comentario co- mienza con dos guiones seguidos y termina al final de la linea. El compila- dor los ignora: Esto es un comentario Comienzo de la entidad «ejemplo» entity ejemplo is port (A: in bit; entrada A B: out bit); ~salida B end ejemplo; 3.4 TIPOS DE DATOS VHDL predefine un conjunto relativamente limitado de tipos de datos, pero dispone de gran versatilidad para que el propio usuario los cree segiin sus necesidades. Los tipos de datos predefinidos se encuentran casi en su totalidad en el paquete standard de la biblioteca std (ver Apéndice B), La Tabla 3.1 muestra los principales. EI valor de las constantes MAXINT y MAXREAL depende de la im- plementacién del compilador de VHDL, pero al menos han de ser 2"'-1 para el primer caso, y 1.0E38 para el segundo. La resoluci6n del tipo time es de 1 fs (unidad base), es decir, cualquier tiempo inferior es truncado a 0 unidades de tiempo. La representaci6n de valores en los tipos numéricos (integer, real, ti- me) se puede realizar de diversas formas. En general se emplea base 10 y se puede utilizar el cardcter «_» para hacer mejorar la legibilidad: —- niimeros enteros: 37 112234 1_123_321 © ITES - Paraninfo 28 ELEMENTOS DEL LENGUAJE DESCRIPCION -MAXINT ... MAXINT Nameros enteros 0... MAXINT Numeros naturales 1. MAXINT. Nameros positives -MAXREAL ... MAXREAL Nameros reales TRUE , FALSE Valores booleanos 0,1 Valores binarios conjunto de bits Cadena de bits véase Apéndice B Caracteres conjunto de caracteres Cadena caracteres Nameros reales con -MAXINT ... MAXINT Tidadeé Gaiters Tabla 3.1 Tipos predefinidos mas importantes — nimeros reales: 271 43_234.0 0.000_0012 Para los mimeros reales se suele emplear también la notacién expo- nencial: 3.27E4 6.0 E-3 El exponente es siempre entero y representa la potencia en base 10 por la que se multiplica la mantisa para obtener el valor en si. También es posible expresar los enteros con notacién exponencial, En este caso el exponente no puede ser negativo: 2E6 3E4 — - Error! © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 29 De todos modos, el lenguaje permite expresar un ntimero en cualquier base, de acuerdo al siguiente formato: base # entero[.entero] [# E exponente] Ambos enteros han de estar representados en la base indicada a la iz- quierda. El exponente representa una potencia de dicha base. Ejemplos: 2#0010_0001#E3 ~- 33 x 2? en decimal 8#714# -- 460 16#D3.A2#E-1 ~ 211,6328125 x 167! 10#35#E8 35 x 10%. Como la base es 10 no es preciso indicarla, puesto que ~ €8 la que se toma por defecto. Por tanto es suficiente con la ~ representacién 35#E8, 0 simplemente 35E8 Cuando una cadena de caracteres est4 compuesta por un conjunto de bits se le denomina bit string literal (literal de cadena de bits) y admite una representacin simplificada con base numérica: X10O1[B ] "cadena de bits” Ejemplos: "I111001001001011" ~se puede representar en hexadecimal X"F24B" 0 bien en octal: 0"63_72" ~- 0 bien en binario: B"1111001001001011" La base binaria se toma por defecto, es decir, puede prescindirse de indicar B. X representa la base hexadecimal y O la octal. 3.5 | NUEVOS TIPOS Y SUBTIPOS VHDL posee una gran versatilidad para la definicién de nuevos tipos y subtipos de datos. A continuacién se muestra una clasificacién de los dis- tintos tipos que es posible declarar: — escalares — enumerados © ITES - Paraninfo 30 ELEMENTOS DEL LENGUAJE — enteros — reales = fisicos — compuestos: homogéneos (arrays), heterogéneos (records) = acceso = fichero La sintaxis de declaracién de un tipo es: type is descripcisn; En la descripcién se especifica la clase de tipo a declarar y su rango de valores. A continuacién se muestran ejemplos de diversas declaraciones: type SEMANA is (L, M, X, J, V, S, D); ~ tipo enumerado type tipo_puerta is (andg, org, norg, nandg); fdem type CUENTA_ATRAS is range 9 downto 0; -tipo entero type fan is range | to 20; = fdem type intervalo is range -1.0 to 1.0; tipo real type ESPACIO is range 0 to 10000 ~ tipo fisico units mm; ~-unidad base cm= 10 mm; —miltiplo m= 1000 mm; ~ fdem km = 1_000_000 mm; -- fdem end units; ~ tipo compuesto homogéneo: type MEMORIA is array (0 to 31) of bit_vector(8 downto 0); type CUBO is array (0 to 7), (0 to 7), (0 to 7) of bit; — {dem ~ tipo acceso (a cadenas de caracteres) predefinido en el paquete textio de la biblioteca std: type LINE is access string: ~ tipo fichero (de cadenas de caracteres) predefinido también en textio: type TEXT is file of string; type puerta_logica is — tipo compuesto heterogéneo record tipo: tipo_puerta; retardo_L_H: tir retardo_H_] no_entradas fan_out: fan; end record; © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 31 Un subtipo es un tipo de rango restringido. Se declaracién obedece a la sintaxis: subtype is [funcion_de_resolucién] [rango]; ~ el concepto de funcién de resolucién seré explicado en el Capitulo 6. No se utiliza por tanto ~en los siguientes ejemplos de declaracién de subtipos. Ejemplos: subtype DIAS_LABORABLES is SEMANA range L to V; -- subtipo predefinido en el paquete standard de la biblioteca std subtype natural is integer range 0 to integer ‘high; — el atributo ‘high hace -- referencia al valor superior de un tipo escalar dado, como se veré en el Capitulo 6 subtype DIAS is SEMANA; — no sc indica el rango, porlo que tipo y subtipo - comparten el mismo conjunto de valores ‘Como se puede observar, los tipos enumerados se declaran indicando todos sus elementos separados por comas y entre paréntesis. El lenguaje los considera ordenados, de tal forma que, por ejemplo, para el tipo «semana», el elemento 0 es «lunes» y el tiltimo (elemento 6) es «domingo». Asi, el resultado de la operacién relacional (Apartado 3.7.2); «domingo > lunes» es true (verdadero). Y: «miercoles 2 martes» resulta false (falso). La palabra reservada range especifica el rango de valores que abarca un tipo o un subtipo. En el caso de los tipos fisicos es preciso indicar ademas una lista de unidades, para lo que utilizan las keywords units y end. Los tipos compuestos se forman agregando varios elementos. Cuando estos son del mismo tipo dan lugar a un tipo homogéneo 0 array. El indice de un array suele ser entero, aunque el lenguaje admite que lo pueda ser también cualquier tipo enumerado. Por ejemplo: type SEMANA is (L, M, X, J, V, S, D); type ARRAY_1 is array (SEMANA) of bit; type ARRAY_2 is array (SEMANA range M to V) of bit; ~rango ascendente Resulta habitual cometer errores en la definicién de subtipos arrays, por cuanto no esta permitido declarar subrangos de rangos ya restringidos. Por ejemplo: type word is array (31 downto 0) of bit; ~rango descendente subtype MSB is word (31 downto 24); --incorrecto © ITES - Paraninfo 32 ELEMENTOS DEL LENGUAJE ~- se puede subsanar mediante un alias (Capitulo 6) o bien declarando MSB como tipo: type MSB is array (31 downto 24) of bit; 0 también como subtipo del array predefinido bit_vector: subtype MSB is bit_vector (31 downto 24); Otro error comiin es la asignacién de valores entre tipos declarados distintos, aunque compartan los mismos valores. Por definicién, dos tipos de datos son incompatibles si uno no procede del otro, bien por restriccién del rango de valores o bien por declaraci6n de un subtipo, aunque compartan el mismo conjunto de valores. En ese caso se precisa de una conversién (implf- cita o explicita; ver Capitulo 6) entre tipos para la asignacién de valores realizacién de operaciones. Por ejemplo: type centena is range 0 to 99; type cien is range 0 to 99; ‘Aunque ambos rangos son idénticos, para VHDL son tipos distintos y por tanto incompatibles, lo que impide la asignacién o las operaciones entre objetos de estos tipos. Asi: signal num: centena; — declaracién de una sefial de tipo «centena» variable dato: cien; — — declaracién de una variable de tipo «cien» ~ error de compilacién Ejemplos de arrays de dos dimensiones: type memoria is array(0 to 255) of bit_vector (31 downto 0); ~ declaracién alternativa: type memoria is array(0 to 255, 31 downto 0) of bit; -- ambas declaraciones son equivalentes, pero difieren al referenciar los elementos del array. ~ Por ejempl constant m: memoria; ~-asignaci6n correcta para el primer tipo de declaracién — fdem para segundo Los tipos compuestos heterogéneos (records) estan formados por va- tios elementos de tipos diferentes, denominados campos. El acceso a cada campo se puede realizar de forma directa 0 empleando agregados de valores. Por ejemplo, si se declara una variable del tipo «puerta_logica» definido anteriormente, son validas las siguientes asignaciones: © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 33 ~ posicional o implicita, es necesario respetar el orden de las asignaciones a cada campo: variable puerta]: puerta_logica:= (andg, 1.5 ns, 2 ns, 2, 3); ~-asignacién agregada nominal o explicita, no es necesario conservar dicho orden: 1.5 ns, retardo_H_L => 2 ns, no_entradas => 2, fan_out => 3, tipo => andg); -- con la keyword others se abrevia la asignacién a campos que reciben el mismo valor : variable puertal: puerta_logica:= (tipo => andg, retardo_L_H => 1.5 ns, retardo_H_L => 2 ns, others => 3); ~-asignacién directa a un campo: puerta].no_entradas;= 3; Son validos también los agregados a la izquierda del simbolo de asig- naci6n a objetos. Por ejemplo: variable a, b, c, d, e: bit; variable s: bit_vector (4 downto 0); (a,b, cde) = Los tipos acceso declaran punteros similares a los que se utilizan en Ienguajes como Pascal o C, por tanto definen direcciones en las que se alma- cenan objetos de un determinado tipo creados din4micamente (es decir, que se desconoce su tamajio a priori). Ejemplos de declaraciones de tipos acceso: -~- se declaran previamente dos tipos compuestos: type pila is array (0 to 31, 0 to 3) of bit; type modulo is record tamanho: integer range 10 to 50; retardo_critico: time; no_entradas: integer; no_salidas: integer; end record; ~- ahora se declaran sendos tipos acceso: type acceso_uno is access pila; ~ tipo acceso cuyos valores son direcciones que apuntan a objetos del tipo «pila» type acceso_dos is access modulo; — idem con el tipo «modulo» Los objetos de un tipo acceso sdlo pueden ser de clase variable (ver Apartado 3.8.2). Cuando se declaran sin asignaci6n inicial, reciben por de- fecto el valor nulll, que indica no inicializado (no apunta a nada). Ejemplo: © ITES - Paraninfo 34 ELEMENTOS DEL LENGUAJE variable puntero_2: acceso_dos; _~ valor por defecto: null Los objetos direccionados por punteros pueden crearse mediante la palabra reservada new. Asf: Ppuntero_2:= new modulo; Esta sentencia crea un objeto de tipo «modulo», que a su vez ha sido declarado de tipo record. Sus valores por defecto son los valores por defecto de cada campo del mismo, es decir, el primer valor de cada uno de sus ran- gos. Asf, «tamanho» ser inicializado a 10, «tetardo_critico» a -2"'+1 fs y «no_entradas» y «no_salidas» ambos a -2"'+1. También es posible asignar valores iniciales al objeto de forma expli- cita en el momento de ser creado: puntero_2:= new modulo'(20, 2 ns, 5, 2); Estos objetos creados dinamicamente pueden ser referenciados de di- versas formas: = puntero_2.all, accede a todo el objeto apuntado por «puntero_2». Ejemplo de acceso para asignacién de valores: puntero_2.all:= (20, 2 ns, 5, 2); puntero_2. tamanho, accede al campo «tamanho» del record «modulo». puntero_1(15,3) accede al elemento (15,3) del array apuntado por «pun- tero_1». Ejemplo: Se erea un puntero para direccionar objetos del tipo array «pila» declarado més arriba variable puntero_1: acceso_uno; se erea un objeto del tipo «pila» que seré apuntado por «puntero_L»: puntero_1: new pila; = se asigna un valor al citado elemento: puntero_1(15,3):= "I's Al declarar un tipo access se declara implicitamente un procedimiento denominado deallocate. Este se encarga de liberar la memoria ocupada por un objeto creado dinémicamente, es decir, la ejecuci6n de la sentencia: deallocate(puntero_2); © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 35 destruye el objeto apuntado por «puntero_2», y a éste le asigna el valor null. Los tipos acceso son titiles en el modelado a nivel algoritmico, espe- cialmente de estructuras regulares, como memorias de acceso aleatorio, FI- FO, LIFO, etc., en las que los punteros acceden de forma secuencial. Asimismo, son importantes en el modelado de bancos de prueba para simulacién (Capitulo 8) en aquellos casos en que los estimulos se leen de un fichero externo y los resultados se escriben en otro, haciendo uso de las ruti- nas del paquete textio. Por tltimo, los tipos fichero permite acceder a informacién de un mismo tipo normalmente almacenada en disco. La sintaxis de declaraci6n es: type is file of ; Ejemplos: type vectores is file of bit_vector; type nombre is file of string; Un objeto de clase fichero (Apartado 3.8.4) de tipo «vectores» repre senta un fichero del sistema de archivos que contiene valores del tipo bit_vector. Andlogamente se puede decir de «nombre» y el tipo string. No es preciso indicar la dimensién de un array en la declaracién de un tipo fichero, al igual que ocurre con los tipos acceso. 3.6 LITERALES Son simbolos cuya representacin indica directamente su valor. Se pueden clasificar en: — Literales numéricos, que a su vez pueden ser enteros, coma flotante (que representan los valores del tipo real) y fisicos, de los que ya se hablo en el Apartado 3.4. = Literales alfanuméricos. Se componen de un conjunto de caracteres ASCII individuales 0 de cadenas de caracteres, estando los primeros delimitados por comillas simples (') y las cadenas por comillas dobles (""): Ol. “EF caracter (character): ' cadenas (string): "abcde' sh’, etc. “abl_cd2", "as=gt", etc. © ITES - Paraninfo 36 ELEMENTOS DEL LENGUAJE Como ya se mencioné, las cadenas de bits asociadas al tipo bit_vector (bit string literals) admiten una representacién simplificada en bases numé- ticas binaria (B), octal (O) y hexadecimal (X): B"1001011", B"001_100", 0"537", X"CF", etc. — Literales enumerados. Son los valores pertenecientes a un tipo enumerado. Pueden ser identificadores o bien literales de tipo cardcter. — Literal null. Literal de tipo access que identifica a un puntero nulo, es decir, que no apunta a ningiin objeto como ya se indicé. 3.7 OPERADORES En el lenguaje se encuentran predefinidos una serie de operadores; que se pueden agrupar en cinco categorias: aritméticos, relacionales, Idgicos, de desplazamiento y otros. Cada operador se puede usar con ciertos tipos de datos por defecto (ver Apéndice B). El usuario puede hacer que dichos ope- tadores trabajen con cualquier otro tipo mediante la definicién de funciones. Este concepto se conoce en VHDL como «sobrecarga de operadores» y sera analizado en el Capitulo 6. 3.7.1 Operadores aritméticos La Tabla 3.2 muestra los operadores aritméticos predefinidos. Sola- mente se pueden aplicar a algunos tipos determinados de datos, como se indica. Las siguientes expresiones son validas en VHDL: +B; ~- A, By Centeros o reales o bien los tres fisicos -1*G; Fy G de tipo entero, real 0 fisico 3.14* (¢ ** 2); —a real, r entero o real bi]; ~- ay benteros o reales, | entero e/t; -- vey tde tipo entero o real, o bien v ye fisicos, 0 bien € y t fisicos b mod c; ‘yc de tipo entero bremc; 1, by ¢ de tipo entero abs w; -- zy w de cualquier tipo numérico © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 37 OPERACION OPERADOR TIPO DE DATOS Suma Cualquier tipo numérico Resta Cualquier tipo numérico Producto Entero, real Divisién Entero, real Exponenciacién Entero, real (exponente entero) Médulo Enteros ambos Resto Enteros ambos Valor absoluto Cualquier tipo numérico Tabla 3.2 Operadores aritméticos a mod b= a-b*N, con N un entero tal que: |a mod b| < |b| y signo (a mod b) = signo b a rem b es el resto de la division de a por b, es decir: a — [parte ente- ra(a/b)}* X mod Y = X rem Y cuando signo(X) = signo(Y) e Y #0. Pero cuando signo(X) # signo(Y) el resultado puede ser distinto. Ademis en este caso: signo(X rem Y) = signo X signo(X mod Y) = signo Y Debido a las reglas de prioridad definidas en el estdndar, la expresin -5 rem 2 se interpreta como —(5 rem 2), y no como (~5) rem 2. En la Tabla 3.3 se muestra un conjunto de resultados de ambos opera- dores con operandos positivos y negativos. Mod es util para modelar contadores cfclicos (ascendentes 0 descen- dentes) 0 bien para generar nimeros pseudoaleatorios dentro de un rango, como se verd en el tiltimo apartado del Capitulo 9. © ITES - Paraninfo 38, ELEMENTOS DEL LENGUAJE HEE Los fs | 0 Tabla 3.3 Algunas operaciones con mod y rem .2 Operadores relacionales Los operadores relacionales aceptan como operandos cualquier tipo y devuelven un literal de tipo boolean, es decir, el resultado de la operacién puede ser rue o false. La Tabla 3.4 muestra los operadores predefinidos. Ejemplos de utilizacién de estos operadores en algunas sentencias: if(A=B)... while (R <= 7)... ... When (registro(3 downto 0) /= "0100") ... 3.7.3, Operadores légicos y de desplazamiento Los operadores I6gicos admiten operandos bit, boolean o arrays de dichos tipos. La Tabla 3.5 muestra la relacién de operadores predefinidos. © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 39 ee Tabla3.4 Operadores de relacién OPERACION OPERADOR oe a Negacién Desplazamiento l6gico a la izquierda Desplazamiento l6gico a la derecha Desplazamiento aritmético a la izquierda Desplazamiento aritmético a la derecha Desplazamiento circular a la izquierda Desplazamiento circular a la derecha Tabla3.5 Operadores légicos y de desplazamiento © ITES - Paraninfo 40 ELEMENTOS DEL LENGUAJE Todos tienen igual prioridad (excepto not, que tiene a mayor), por lo que cuando se combinan en una misma expresién puede resultar necesario utilizar paréntesis. Ademés, los operadores nand y nor no son asociativos y deben ir asociados explicitamente aunque no aparezcan junto a otros opera- dores. Los siguientes ejemplos muestran las diversas situaciones pos ibles: xor not C; -- Correcto and C and D; ~- Equivale a (B and C) and D o B and (C and D) iErréneo! Correcto -- Equivale a (B xor C) or D oa B xor (C or D) -- Correcto Para las operaciones de desplazamiento se dispone de seis operadores, agrupados en desplazadores circulares y no circulares. Existen dos tipos de operadores no circulares: I6gicos y aritméticos. La diferencia entre ellos reside en los valores extremos introducidos en la operacién de desplazamien- to. En un desplazamiento légico sobre un objeto de tipo bit_vector el extre- mo opuesto se rellena con ceros. En un desplazamiento aritmético se rellena con el valor del bit que se encuentra en la primera posicién. Ejemplos: "000111" sil 2; ~ resultado: "101100" sll 4; resultado: "000111" sla 2; ~ resultado: "011000" sra 3; ~ resultado: "000011" "100100" sra 1; resultado: "110010" "011001" ror 3; ~ resultado: "001011" "100111" rol 2; = resultado: "011110" "011000" ror —2; -- resultado: "100001" EI nimero de posiciones a desplazar puede ser cualquier valor entero. .4 Otros operadores La Tabla 3.6 muestra otros operadores predefinidos en el lenguaje. Resulta obvia la utilizacién de los de signo: B:= -72; C:= 3.2 E+7; © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 41 OPERACION OPERADOR a Tabla 3.6 Otros operadores EI operador de concatenacién (&) se usa para unir operandos del mismo tipo y dar lugar a uno solo. Por ejemplo: A= "0110" & "00111"; A= "011000111" 3.8 OBJETOS Los objetos son los elementos que define el lenguaje para almacenar informaci6n. Existen cuatro tipos: constantes, variables, sefiales y ficheros. La sintaxis de declaracién de todos ellos es muy similar. En esencia: objeto : tipo [+ expresi6n J; Se utiliza el simbolo := para asignar valores iniciales. En los siguientes apartados se analizan las caracterfsticas particulares de cada objeto, asf como las distintas opciones en su declaraci6n 3.8.1 Constantes Una constante es un objeto que almacena un tinico valor durante toda la simulaci6n, es decir, permanece inalterada a lo largo de la misma. Debido a su cardcter, las constantes han de inicializarse al ser declara- das. Solamente existe la excepcién de las constantes diferidas o aplazadas dentro de un paquete, concepto que seré ampliado en el Capitulo 7. No obs- tante, en los siguientes ejemplos se muestra un caso de constante diferida (deferred constant) dentro del paquete «memorias»: © ITES - Paraninfo a2 ELEMENTOS DEL LENGUAJE constant AND_DELAY: time:= 2 ns; constant E: real:= 2.7172; constant V37: bit_vector(7 downto 0) package memorias is constant MEMORY_WORDS: integer; -- constante diferida o aplazada. S6lo ~ puede declararse en un paquete y ha de asignérsele un valor en el cuerpo del mismo end package memorias; package body memorias is constant MEMORY_WORDS: integer: end package body memorias; Es posible declarar constantes en subprogramas (procedimientos y funciones, Capitulo 6). En este caso, la constante se crea cada vez que se in- voca el subprograma en una determinada sentencia. 3.8.2, Variables Las variables almacenan valores que pueden cambiar a lo largo de la simulaci6n. Ejemplos de declaracién de variables: variable contador: natural; variable resulta real:= 1.0; variable estado: bit_vector (7 downto 0); shared variable status: bit Las variables solamente pueden ser declaradas y utilizadas dentro de procesos o subprogramas (funciones y procedimientos) y, por tanto, son locales a los mismos. La tnica excepcién la constituyen las variables de tipo compartido o globales (shared). Este es un tipo especial de variable, intro- ducido en la revisin de 1993, que puede ser compartida por més de un pro- ceso. Se les dedica especfficamente el Apartado 6.3. Al declarar una variable puede asigndrsele un valor inicial. En caso de no hacerlo, el simulador Ie asigna un valor por defecto. Para un tipo enume- rado el valor de inicializacién es el primer elemento del mismo (por ejemplo el 0’ para el tipo bit). Por tanto, en la declaracién anterior de la variable compartida «status» resulta innecesaria (por redundante) la inicializ acién. © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 43 3 Sefiales Al igual que las variables, las sefiales almacenan informacién que puede cambiar a lo largo de la simulacién, sin embargo su significado est intrinsecamente ligado al cardcter hardware del lenguaje. Las sefiales repre- sentan las conexiones o terminales fisicos presentes en un circuito y, por tanto, poseen diversas propiedades para el correcto modelado de su compor- tamiento. En capitulos posteriores se estudiardn estas propiedades. A conti- nuaci6n se muestran varios ejemplos de declaracién de sefiales: signal flags: integer range 0) to 255: signal data_bus: bi signal resultados: bit_vector (0 to 15) register; vector (31 downto 0) bus; Las sefiales pueden ser utilizadas en todo tipo de sentencias, tanto concurrentes como secuenciales, aunque sélo pueden ser declaradas en aqué- las. Las sefiales de clase bus y register constituyen un caso especial (sefia- les guarded) que ser analizado en cl Capitulo 6. Para la asignacién de valores a sefiales, aparte de la inicializacin, se utiliza el simbolo <=: CLK <='1'; data_bus (31 downto 16) <= X"4F6A" after 10 ns; 3.8.4 Ficheros EI lenguaje considera este tipo especial de objeto para el intercambio de informacién con el exterior. Un fichero se representa por un identificador al cual, en la declaracién, se le asigna un archivo existente en una de las unidades de almacenamiento fisico de informacién dependiente del sistema: file : tipo [ [open modo] is ]; EI tipo de fichero viene determinado por el tipo de datos que contiene. Es obligatorio declarar un tipo fichero (ver Apartado 3.5) para ser asociado a su vez al objeto fichero antes de ser declarado éste. Solamente existe un tipo fichero predefinido en el paquete textio, el tipo text: type fext is file of string; © ITES - Paraninfo 44 ELEMENTOS DEL LENGUAJE Cualquier otro tipo de fichero ha de ser declarado explicitamente. EI modo indica si el fichero se abre para leer informaci6n, escribirla 0 afiadirla. Asf, los modos definidos en el lenguaje son, respectivamente: READ_MODE WRITE_MODE APPEND_MODE A continuacién se muestran algunos ejemplos: type filel is bit_vector; type file? is integer; file Entrada: filel open READ_MODE is "C:\...\vectores.dat"; -- 0 simplemente: file Entrada: filel is "C:\..\vectores.dat"; -- ya que READ_MODE se toma por defecto file Salida: file2 open WRITE_MODE is "C:\...\resultados.txt"; file log: text open APPEND_MODE is "C:\...\programa.log"; EI fichero «Entrada» se abre para lectura y se asocia con el fichero de disco «C:\..,\vectores.dat», que contiene datos de tipo bit_vector. El fichero «Salida» se abre en modo escritura, para datos de tipo integer, asociado con «C\\..,\resultados.txt». Finalmente, el fichero «log» se abre para afiadir datos de tipo string a los ya existentes en el ficheto de disco «C. 3.9 CUESTIONES Y EJERCICIOS 1. { Cuéles de los siguientes identificadores son validos? ;Por qué? entrada_1 Entr_sal Entrada__2 Modulo 1 Sal_ sal@2 1EN _sal2 Valor_2_3 dir_4_pos_7 © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 45 2. {Son equivalentes los siguientes identificadores? ;Por qué? eD72 y Ca72 Entr y ENTR B4yB4 3. Indicar qué tipo de literal es cada uno y su equivalencia en lenguaje convencional (donde fuera preciso). 4.S5E-7 230_000 2#1011# 8#67# 7#46_S2 16#A0#E] 2#1110_0110#E-S -5.3_16E3 "ESTA ES UNA ENTIDAD" "ESTA ES UNA ARQUITECTURA" & "Y ESTO ES UN PAQUETE" B"1110_0110" X"B7A" 0"650" 4, Escribir las sentencias correspondientes a las siguientes declaraciones y asignaciones de valores. 4.5 , constante de tipo real 20 ns , constante de tipo fisico I , constante de tipo LOGICO (tipo enumerado de valores 0, 1, X y Z) Y , variable de subtipo VALOR (subtipo entero en el rango de 0 a 60) Z,, variable tipo booleano. Inicializarla a TRUE T,, sefial de tipo array de 16 bits R,, sefial de tipo record, formado a su vez por: CLK de tipo bit, D bit_vector de 8 bits, A entero de rango ilimitado. Inicializarla a0, 1011_0111, 204 5. {Cudles serdn los valores de A y B una vez ejecutadas las dos sentencias que siguen a las siguientes declaraciones? -- declaraciones: subtype valor is integer range 0 to 420; variable A: valor; © ITES - Paraninfo 46 ELEMENTOS DEL LENGUAJE variable B: valo1 constant C: integei = sentencias: (B-4) *4+B rem4); B:= B mod 4; 4; 6. Indicar el tipo de dato del resultado de las siguientes operaciones y su valor utilizando los objetos declarados en el ejercicio anterior y ademas: signal D: bit_vector(0 to 3):= "1001"; variable time:= 10 us; signal F: bit_vector(0 to 5); E=E*(C-1); F<="01"&D; B>=C; D<=Dsra2; 7. Detectar posibles errores en las siguientes asignaciones, justificandolo, a partir de las siguientes declaraciones de objetos: constant A: time: variable B, variable R, S: bit(2 downto 0); variable T: bit_vector(3 downto 0); 5 sec; 8. Escribir 1a sentencias correspondientes para definir los tipos y subtipos de datos que cumplan las siguientes especificaciones: — Tipo de datos que contenga los valores de un contador de una cifta en hexadecimal. — Tipo que almacene las posiciones de un competidor en 10 pruebas. — Subtipo que cuantifique las distancias como miiltiplos del radio terrestre. — Tipo que defina una escala de temperaturas entre -100 y 100 grados cen- tfgrados con una precisiGn de | miligrado. © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 47 — Tipo que englobe las temperaturas medias de los meses de un affo, utili- zando datos del tipo definido en el apartado anterior. — Subtipo que cuantifique el tiempo en dfas, horas y minutos. — Tipo que almacene las medidas de 10 nifios durante10 aiios. — Tipo usado en una biblioteca para clasificar cada libro por el autor, el afio de publicacién y su precio. — Tipo que almacene los nombres de los inquilinos de un inmueble, clasifi- cAndolos por el piso y la letra de cada vivienda. 9. Detectar, justificdndolo, posibles fallos en las siguientes declaraciones de tipos y subtipos de datos: type estatura is range 0 to 3; subtype altos is estatura range 1.80 to 2; type VECTOR is array (altos) of bit; 10. ;Por qué la operacién (A and B and C) es correcta pero, sin embargo, la operaci6n (A nand B nand C) no puede ser aceptada? 11, En cuanto a los literales, qué afirmacién es incorrecta? — Los numéricos permiten la notaci6n exponencial. — Los caracteres individuales se escriben entre comillas simples. — 2#10110# es un literal de tipo bit_vector. — Al definir un tipo enumerado pueden crearse nuevos literales. — El literal X"CF" es una cadena de bits en formato hexadecimal. 12. {Qué tipos 0 subtipos de dato estén incorrectamente declarados? type estado is (marcha, pausa, paro); type byte is bit_vector(7 downto 0); subtype letras is character range 'A' to type texto is file of string; subtype vector is array (1 to 6) of integer; 13. Indicar por qué cada uno de los siguientes arrays esté correcta 0 inco- trectamente declarado: type array (0 to 5) of bit_vector; type B is array (positive range 6 downto 1) of bit; subtype C is correcto (3 downto 1); type D is array (range 0 to 8) of bit; © ITES - Paraninfo 48 ELEMENTOS DEL LENGUAJE 14, Identificar las afirmaciones correctas: — Un literal es un identificador de un objeto. — Los tipos compuestos agrupan a los tipos array y access. — Un delimitador puede formar parte de un identificador extendido, — Los operadores nand y nor no son asociativos. 15. Calcular y justificar el resultado de las operaciones: (12) rem 7; 12 rem (-7); (12) rem (-7); 12 mod 7; (12) mod 7; 12 mod (-7); (12) mod (-7); —12 mod 7; {Se puede prescindir de los paréntesis en todos los casos? 16. Indicar el significado de las siguientes sentencias: type fichero_enteros is file of integer; file F1: fichero_enteros; file F2: fichero_enteros is "test.dat"; file F3: fichero_enteros open WRITE_MODE is "test.dat"; © ITES - Paraninfo Capitulo 4 DECLARACIONES BASICAS A lo largo de este capitulo se presentan un conjunto de sentencias bé- sicas que permiten describir entidades, arquitecturas, componentes, sefiales, etc., para el modelado de circuitos. Se utilizan ejemplos a nivel Iégico que muestran c6mo modelar la interconexién de diversos componentes de un circuito. Este tipo de descripciones se denominan estructurales. En el capitulo siguiente se estudian las sentencias que permiten espe- cificar el comportamiento de un circuito, con ejemplos descritos a nivel RTL y algoritmico. 4.1 ENTIDADES Como ya se indicé en el Capitulo 2, las entidades son los elementos que describen la conexidn de un circuito o sistema con el exterior. Caracteri- zan por tanto sus entradas y sali s | Salida s fs A A ch Salida 9 2 B B 1 B Figura 4.1 Multiplexor de dos canales © ITES - Paraninfo 50 DECLARACIONES BASICAS Tomando como ejemplo un multiplexor de dos canales, representado en Figura 4.1, se puede describir de diversas formas su funcionamiento 0 su estructura, pero lo que es invariable es el conjunto de entradas y salidas del mismo, que se declaran en la entidad: entity mux2I is port (S: in bit; bit; B: in bit; C: out bit ); end mux21; Se declaran tres seffales de entrada (in): A, B, S y una de salida (out): C, indicando su tipo de datos asociado. En este ejemplo se utilizan seffales binarias (tipo bit), es decir, que solamente pueden tomar los valores 0 y 1. La declaracién consta ademas de una primera linea con el identifica- dor de la entidad y una linea final para terminar la declaraci6n. El carécter «;» es un delimitador que se usa en VHDL para indicar el final de una sen- tencia. Generalizando, la sintaxis de declaracién de una entidad es: entity is [cabecera] [declaraciones] [sentencias] end [entity] []; De los tres tipos de informacién que puede aparecer, la mds importan- te y habitual es la cabecera, formada por la relacién de sefiales de entrada y salida del circuito en torno a la palabra reservada port, como se ha visto, asf como por la posible especificacién de determinados pardmetros del disefio acompajiando a la palabra reservada generic: generic ({: tipo [:= valor_inicial]}); port ({: [modo] tipo [:= valor_inicial]}); Los puertos (ports) no son més que sefiales con direccién o modo para comunicar el circuito con exterior. El modo puede ser: in, out, inout, buffer y linkage (véase Apartado 4.5). Por defecto se toma in, modo que caracteri- za a.un puerto que solamente puede ser lefdo. © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL SI «Tipo» hace referencia al tipo de dato asociado con cada sefial. Un aspecto particularmente potenciado en VHDL es el de la parame- trizacién. Mediante la keyword generic se pueden declarar y especificar pardmetros constantes titiles para el modelado de un circuito, cuyo valor puede ser sobrescrito posteriormente al instanciar dicho circuito como com- ponente de un sistema de mayor jerarqufa (ver Apartado 4.3). Por ejemplo, si el tiempo de propagaci6n entre la entrada y la salida es de 5 nanosegundos, se puede indicar en la declaracién de la entidad de la siguiente forma: entity mux21 is generic (t_delay: time:= 5 ns); C: out bit ); end mux21; Por tanto, las declaraciones de puertos y genéricos (también denomi- nados pardmetros 0 puertos genéricos) constituyen la cabecera de la entidad (entity header). ‘A continuacién, aunque menos habituales, pueden existir sendas zonas de declaraciones y sentencias. La primera permite declarar tipos, subtipos, objetos y otros elementos del lenguaje que se describirdn en capitulos suce- sivos como subprogramas, alias, atributos, sentencias disconnect y senten- cias use. La ultima permite incluir tres tipos de sentencias, entre la palabra reservada begin y el final de la entidad: assert-report (Apartado 4.6), Ila- madas concurrentes a procedimientos (Capitulo 6) y procesos pasivos (Capi tulo 5). Enel Apartado 4.6 se muestra un ejemplo. 4.2 ARQUITECTURAS Son las unidades definidas por VHDL para describir el funcionamien- to interno de las entidades. Dentro de una arquitectura se utilizan todos los recursos del lenguaje que permiten describir comportamiento, flujo de datos (procesos, bloques, sentencias condicionales, creacién y asignacién a obje- tos, etc.) y esquemas circuitales (declaraciones de componentes, especifica- ciones de configuracién, instanciaciones 0 referencias a componentes, etc.; apartado 4.3). La sintaxis de declaracién de una arquitectura es la siguiente: © ITES - Paraninfo 32 DECLARACIONES BASICAS architecture of is -- Zona de declaraciones begin “= Cuerpo de la arquitectura end [architecture] []; De forma similar a la descripcién de entidades, las arquitecturas dis- ponen de una Ifnea inicial, en la que se indica su nombre y el de la entidad a Ta que va asociada, y una linea para finalizar la declaracién. Entre ambas existen dos partes bien diferenciadas: una zona de declaraciones de los dis- tintos objetos, subprogramas, componentes y otros elementos a utilizar, y un cuerpo donde se describe el funcionamiento del circuito. Toda sentencia en el cuerpo de una arquitectura es concurrente, a menos que esté incluida a su vez dentro de un proceso (Capitulo 5). Para cada entidad es posible definir varias arquitecturas. Por ejemplo, en el caso del multiplexor de la Figura 4.1, podria describirse su comporta- miento mediante la sentencia condicional if-then-else (Capitulo 5): architecture comportamientol of mux21 is begin process (A, B, S) - el concepto de proceso seré explicado en el capitulo siguiente begin if (S='0/) then C <= A after t_delay; else C <=B after t_delay; end if; end process; end comportamiento]; Cuando Ia entrada de seleccién $ se encuentra a nivel 0 la salida se toma de la entrada o canal A. Si S esté a nivel alto se toma del canal B. La palabra reservada after indica que la sefial de entrada correspondiente apare- ce en la salida después de un tiempo determinado por la constante «t_delay>, cuyo valor quedé establecido en 5 ns por la sentencia generic. Se podrfa utilizar una sentencia diferente: when-else (Capitulo 5) para especificar un comportamiento andlogo al anterior: architecture comportamiento2 of mux21 is begin C <=A after t_delay when (S='0') else B after t_delay; end comportamiento2; © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 53 4.3. DESCRIPCIONES SIMPLES Las dos arquitecturas anteriores tienen en comtin el hecho de no mo- delar la estructura del circuito, es decir, el disefiador esta describiendo un comportamiento, un funcionamiento, sin especificar si esté constituido el circuito internamente con puertas u otros bloques légicos. Este tipo de des- cripciones son sencillas, intuitivas y permiten modelar sistemas complejos con pocas lineas de cédigo, de forma que se puedan llevar a cabo pruebas de funcionamiento en las primeras etapas del disefio. En los siguientes capitulos se profundizaré en ello. Sin embargo, en algunas ocasiones interesa realizar una descripcién detallada del esquema del circuito con sus diversos componentes e interco- nexiones. Si estos componentes son puertas Idgicas estamos ante una des- cripcién a nivel Iégico. Si son mas complejos, VHDL permite a su vez que puedan ser modelados a distintos niveles, lo que da lugar a la posibilidad de realizar simulaciones y pruebas de descripciones multinivel. Ello aporta una gran versatilidad al lenguaje; por ejemplo se puede disefiar un circuito si- guiendo la metodologia de arriba abajo (top-down), mientras éste forma par- te de un sistema mAs complejo descrito a un nivel de abstraccién superior (por ejemplo, algoritmico). La Figura 4.2 muestra el circuito que modela la arquitectura «estructu- ra» del multiplexor. En la Figura 4.3 se pueden ver los componentes de bi- blioteca utilizados con sus etiquetas identificativas, asf como los identifica- dores de las nets internas. architecture estructura of mux21 is -- Declaracién de sefiales internas: signal net], net2, net3: bit; ~ Declaracién de componentes: component AND port (A, B: in bit; C: out bit); end component AND; component OR port (A, B: in bit; C: out bit); end component OR; component INV port (A: in bit; B: out bit ); end component INV; -- Asociacién de componentes con entidades y arquitecturas: ND use entity AND (comportamiento); Ruse entity OR (comportamiento); INV use entity INV (comportamiento); ~ Cuerpo de la arquitectura: instanciacién de componentes © ITES - Paraninfo 34 DECLARACIONES BASICAS and_l: AND port map (A and_2: AND port map (A B, C => net3); or_l: OR port map (A => net1, B => net2, C => C); end estructura; En la arquitectura aparecen las dos partes diferenciadas: por un lado la zona de declaraciones, que ocupa desde la sentencia de declaracién de arqui- tectura hasta el inicio de la misma (begin). Por otro, la zona de sentencias concurrentes, 0 descripcién del circuito en sf, entre las palabras reservadas begin y end (cuerpo de la arquitectura). La primera incluye: — Declaraci6n de las seffales intemas (net! net2, net3). — Declaracién de los componentes a utilizar (inversor, puerta AND y puerta OR), salvo si ya formasen parte de una biblioteca de recursos. En tal caso serfa suficiente hacer visible dicha biblioteca mediante las sentencias li- brary y use, como se verd en el Capitulo 7. >: Figura 4.2 Esquema légico del multiplexor ’AND_1 nett so net c A 8 AND 2 ic A net 8 8 Figura 4.3 Esquema légico con indicacién de los componentes de biblio- teca utilizados, sus etiquetas y las interconexiones © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 55 — Asociacién de componentes con entidades y arquitecturas. Dado que para cada entidad pueden existir varias arquitecturas, antes de utilizar un com- ponente es necesario indicar, ademés de la entidad a la que se asocia, qué arquitectura se selecciona para ésta, asf como la biblioteca en la que se encuentran. En el caso de que una entidad s6lo tenga asociada una arqui- tectura no es necesario indicar explicitamente la asociacién entre ambas, es decir, sobraria la sentencia for alll ... (que constituye una especificacion de configuracién, como se verd en el Capitulo 7), salvo que se utilicen identificadores distintos para el componente y su entidad asociada, lo cual no es habitual ni recomendable en aras de no empeorar la legibilidad del modelo. 4.3.1 Interconexiones En la zona de sentencias 0 cuerpo de la arquitectura se describe la co- nexién entre los diferentes componentes del circuito. En la Figura 4.2 se observa que el multiplexor precisa 2 puertas AND, una puerta OR y un in- versor, que en el modelo se etiquetan como «and_l», «and_2», «or_l» y «inv_l» respectivamente. La sentencia port map modela las conexiones directas entre los terminales de cada componente (o pardmetros formales, situados a la izquierda del delimitador =>) y las sefiales del circuito (0 para- metros locales, a la derecha de =>). Por ejemplo, la puerta «and_2» tiene su entrada A conectada a la entrada de seleccién del multiplexor, su entrada B al canal B del mismo y su salida C a la sefial interna «net3». EI tiempo de retraso de la sefial de salida, con respecto a las entradas, vendria dado por los tiempos de propagacién acumulados a través de las puertas légicas (caso de haber definido dichos tiempos en sus modelos res- pectivos), 4.3.2 Declaracién de componentes Un componente es la referencia al conjunto formado por una entidad y una arquitectura que modelan un circuito. Generalmente se almacenan en bibliotecas, de forma que se puedan utilizar en cualquier descripcién. Su sintaxis de declaracién es la siguiente: component [is] [generic (... );] [port (... ):] end component []; © ITES - Paraninfo 56 DECLARACIONES BASICAS Esta sintaxis es muy similar a la de una entidad. En la primera linea se indica el nombre del componente. Dentro de la declaracin suelen aparecer las cldusulas generic y port, aunque no son obligatorias. Antes de utilizar un componente en una descripcién es necesario de- clararlo de acuerdo a la sintaxis anterior. 4.3.3 Asocii cidn de entidades con componentes La declaracién de un componente solamente suministra informacién de su identificador y sus terminales, pero no de su funcionamiento. Es nece- sario, por tanto, asociar cada componente con una entidad y una arquitect ura. Esta asociacién, denominada especificacién de configuracién, obedece a la sintaxis: for | all lothers: use entity entidad(arquitectura); De este modo se asocia el componente con la entidad y la arquitectura indicadas: bien solamente cuando se instancia con una de- terminada , bien para todos los casos (all) o bien para todas las instanciaciones a partir de una dada (others). Para plasmarlo en un ejemplo, supéngase el circuito de la Figura 4.4 y que se dispone de una biblioteca con dos paquetes, denominados «puer- tas_a» y «puertas_b», formados por diferentes tipos de puertas légicas. La diferencia entre ambos estriba en que los componentes de «puertas_b» tienen elevado fan-out. Por tanto parece légico que las puertas 1, 2 y 3 pertenezcan al paquete «puertas_a», mientras que para la 4 se recurra al paquete «puer- tas_b». Ello es lo que especifica el siguiente modelo: ett oo> neta amo o nets -z0 Figura 4.4 Circuito ejemplo para explicar la asociacién de componentes con entidades y arquitecturas © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 37 architecture estructura of ejemplo is -- Declaraciones de componentes y sefiales internas: —- Asociacién de componentes con entidades y de éstas con ar quitecturas: for all: AND3 use entity puertas_a.AND3 (comportamiento); for or3_3: OR3 use entity puertas_a.OR3 (comportamiento); for or3_4: OR3 use entity puertas_b.OR3 (comportamiento); begin ~ Instanciaciones (vase subapartado siguiente): and3_1: AND3 port map ( and3_2: AND3 port map ( 03_3: OR3 port map (... ); or3_4: OR3 port map (... ); end estructura; 4.3.4 Instancia i6n de componentes Una vez declaradas las sefiales, los componentes y su asociacién con determinadas entidades y arquitecturas, se procede a conectarlos a los nodos correspondientes dentro del circuito. Para ello se utiliza un tipo de sentencias concurrentes denominado instanciacién de componentes, que responde a la siguiente sintaxis: ; [generic map (lista_parémetros)] [port map (lista_conexiones)]; El nombre del componente viene precedido de una etiqueta obligato- tia. La lista de parémetros que sigue a las palabras reservadas generic map se utiliza para sobrescribir los valores asignados a los pardmetros genéricos en la declaracién de la entidad. De este modo, cada instancia a un compo- nente puede especificar distintos valores para sus genéricos. Inmediatamente después de las palabras reservadas port map se describen las conexiones del componente dentro del circuito. Las asociaciones dentro de la lista de conexiones o de pardmetros ge- néricos pueden especificarse: — de forma explicita: {pardmetro formal => pardmetro local, } — implicitamente: {pardmetro local, } © ITES - Paraninfo 38 DECLARACIONES BASICAS Ejemplos: architecture estructura of ejemp| signal net1, net2, net3: bir; -- Restantes declaraciones: begin and_l: AND3 port map (A, B, C, net); and_2: AND3 port map (D, E, F, net2); or_3: AND3 port map (G, H, I, net3); or_4: AND3 port map (net, net2, net3, $); — idem end estructura; ~ asociacién implicita En este caso, la asociacién de pardmetros se ha hecho posicional 0 implicita, es decir, dentro del paréntesis se indican las seffales que se conec- tan a los terminales de los componentes rigurosamente en la misma posicién en la fueron declarados. La asociacién nominal o explicita hace irrelevante el orden de los pa- rametros por cuanto se indican tanto los formales como los locales: and_l: AND3 port map (A => A, B => C, C => C, S => net); mux21_I: MUX2I generic map (t_delay => 10 ns) port map (S => S, A=> A, B => B, C => C); VHDL permite que los identificadores de los terminales del compo- nente y de las sefiales del circuito sean iguales. Por ejemplo, estos dos iilti- mos componentes instanciados poseen sendas entradas A que se conectan a una sefial con el mismo identificador. No existe confusién porque pertenecen a elementos diferentes. Los pardmetros locales de la lista de conexiones pueden ser sefiales, constantes, literales 0 expresiones. Su tnica restriccién es la compatibilidad de tipos respecto a los pardmetros formales. Puede también dejarse desconectado algin terminal. Ello se indica con la keyword open. Por ejemplo, un biestable cuya salida negada no se utiliza: biestable_D: BIESD port map(D=>D, CK=>CLK, Q=>salida, NQ=>open); 4.4 CONSTANTES, VARIABLES Y SENALES En el Capitulo 3 se introdujeron las definiciones de estos objetos. En este apartado se amplia el conocimiento de los mismos en Io que hace refe- rencia a la asignacién y actualizacién de valores. © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 59 Las constantes almacenan valores que no cambian a lo largo de una descripcién ni durante la ejecucién de la simulacién. Esta clase de objeto recibe su tnica asignacién de valor en la propia declaracién (salvo en el caso de las constantes diferidas en un paquete; ver Apartado 7.1), valor que no se puede modificar posteriormente. Ejemplos: constant pi: real:= 3.141592654; constant hola: siring:= "Cadena de caracteres"; constant verdadero: bit:='I'; Para almacenar informacién que varia a lo largo de una simulaci6n, se declaran variables o sefiales. Las variables tienen un rango de utilizacién inferior a las sefiales, ya que solamente existen dentro de un proceso o de un subprograma (Capitulos 5 y 6), salvo en el caso de las variables compartidas (introducidas en la revi- sién de 1993; ver Apartado 6.3). Su declaracién incluye el identificador, el tipo de datos asociado y opcionalmente su inicializacién. Ejemplos: 0: variable contador: integer variable busy, clear: bit; variable estado_inicial: bit_vector:= "1101_0001"; Para asignaciones de valores a variables se utiliza el simbolo :=. Cuando una variable recibe una asignacién cambia instanténeamente. En el siguiente ejemplo, la variable «temp» adquiere diferentes valores a medida que la ejecucién de la simulacién avanza de linea en linea: temp:= 742; ~ Valor de temp =9 temp:= 7*3; — — Valor de tem EI cambio instanténeo del valor de las variables constituye una dife- rencia fundamental con respecto a las sefiales. Las sefiales son objetos de VHDL que se encuentran mucho més proximos al hardware. Una sefial se puede asimilar a una conexién fisica y dispone de una serie de propiedades que permiten modelarla como tal. Las asignaciones de valores a sefiales utilizan el simbolo <= (salvo para iniciali- zaci6n). El valor de una sefial nunca cambia de forma instantdnea, sino tras un periodo de tiempo que puede ser definido por el usuario. Véase el si- guiente ejemplo: © ITES - Paraninfo 60 DECLARACIONES BASICAS signal A: integer:= 4; — Declaracién ¢ inicializacién de la sefial A<=7; ~ Asse mantiene en 4 hasta que avance el tiempo de simulacién A<=5 after 10ns; A pasaa valer 5 después de 10 ns de ejecutada esta sentencia La sintaxis general de asignacién de valores a una sefial es la que se indica a continuaci6n: sefial <= [opciones] valor_l, valor_2, ... ; Las opciones son: guarded, transport, inertial y reject, de las que se hablar en capitulos posteriores. Los valores pueden expresarse de diversas maneras. Por ejemplo, el cronograma de la Figura 4.5 puede ser modelado mediante la siguiente asignacién: PULSO <='0'"'l' after 10 ns, '0' after 40 ns; PULSO 0 10 ns 40 ns tiempo Figura 4.5 Forma de onda equivalente a la sentencia de asignacié6n del ejemplo. La sefial toma el valor '0' en el instante 0 ns. La palabra reservada 0 keyword after indica cudndo ha de cambiar el valor de la sefial; en este caso pasa al nivel alto ('I') a los 10 ns después de la asignacién del primer valor y vuelve al nivel bajo (‘0’) a los 40 ns. El tiempo tras after siempre es absoluto con respecto a la ejecucién de la sentencia. Otra posible asignacién es null. Ello no produce ningdn cambio en el valor de la sefial y, por tanto, retiene el diltimo valor asignado. La actualizacién de sefiales es un concepto muy importante en VHDL, ya que permite modelar la concurrencia inherente del hardware. Por ello se le dedicard gran parte del Capitulo 8. © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 61 4.5 MODOS Y ASOCIACION DE PUERTOS Las sefiales no presentan ningiin problema para su conexi6n a los puertos de una entidad o componente, dado que permiten tanto ser leidas como escritas. Pero no ocurre lo mismo cuando se trata de conectar puertos entre si en el caso de que sus modos o direcciones sean diferentes. ‘A continuacién se presentan las posibilidades de conexién directa en- tre puertos en funcién de sus modos: — in Es el modo por defecto de un puerto si no hace otra indicacién expresa en su declaracién. Solamente puede ser leido, nunca escrito. Admite ser conectado a puertos de modos in, inout o buffer. — out. Este modo s6lo permite ser escrito, nunca lefdo. Puede conectarse a puertos out o inout. — inout. Permite tanto lectura como escritura. Unicamente puede ser aso- ciado a otros puertos del mismo modo inout. — buffer. Es idéntico a inout, salvo que sélo admite una fuente de escritura. Dicho de otro modo, si un puerto buffer est conectado a una net, ésta no admite ninguna otra conexién como fuente de sefial. Andlogamente al ca- so anterior, s6lo admite ser asociado a otro puerto de modo buffer. — linkage. Puede tanto leerse como escribirse. Asimismo sélo admite ser asociado con puertos del mismo modo. De todas maneras, la finalidad de linkage no esta excesivamente clarificada en la propia norma y, por tanto, no se recomienda su utilizacién. En el pasado se utiliz6 para definir inter- faces con otros lenguajes y otros simuladores. 4.6 SENTENCIAS ASSERT-REPORT Y REPORT Constituyen un método habitual de controlar 1a ejecucién de la simu- lacién, Estas sentencias muestran un texto en pantalla y envfan al simulador una indicaci6n, que puede provocar incluso que la simulacién se detenga. La sintaxis de assert-report es la siguiente: assert condicién [report "texto"] [severity NOTE | WARNING | ERROR | FAILURE]]; Cuando la condicién que aparece tras assert no se verifica (valor fal- se), sé muestra en pantalla el texto que aparece entre comillas a continuacién © ITES - Paraninfo 62 DECLARACIONES BASICAS de report, y se pasa al simulador uno de los posibles valores que pueden aparecer tras severity: NOTE, WARNING, ERROR o FAILURE; es decir, uno de los cuatro literales correspondientes al tipo enumerado severity_level, predefinido en el paquete standard (ver Apéndice B). Normaimente los simuladores detienen por defecto su ejecucién cuan- do reciben el valor ERROR o FAILURE, pero dejan libertad al usuario de configurar la accién a tomar en dicha situacién. En cualquier caso siempre muestran en pantalla dicho valor y el mensaje asociado a report, si éste se incluye en la declaraci6n. EI siguiente ejemplo utiliza esta sentencia para determinar si una sefial de entrada de un circuito es desconocida: architecture RTL of mux21 is begin Ce= A after t_delay when (S: assert (S='0' or S='1') report "El terminal de selecci6n (S) tiene un valor desconocido” severity ERROR; end RTL; ) else B after t_delay; En decir, si $ no es ‘0’ ni'I' aparece en pantalla el siguiente mensaje: ERROR: El terminal de selecci6n (S) tiene un valor desconocido y el simulador detiene su ejecucién si se ha configurado asf en respuesta al valor ERROR del tipo severity-level. La sintaxis de la sentencia report es idéntica a la de assert-report eliminando la primera Iinea. Es titil para mostrar informacién por pantalla de forma incondicional a medida que la simulaci6n avanza y, al igual que as- sert-report, puede pasar un mensaje de control al simulador tras severity. EI siguiente ejemplo emplea la sentencia assert-report en la zona de declaraciones de una entidad: entity sumador is port (A, B: in bit; R: out bit_vector (1 downto 0)); begin assert (A /='X' and B /='X’) report "Valor desconocido en las entradas" severity FAILURE; © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 63 end sumador; architecture RTL of sumador is begin R<= A+B; end RTL; Por defecto, cuando no se declara la opcién severity, se asume el va- lor ERROR para la sentencia assert-report y NOTE para report. Assert-report puede utilizarse tanto en sentencias concurrentes como: secuenciales. Report solamente dentro de estructuras de cédigo secuenciales (procesos y subprogramas). 4.7 CUESTIONES Y EJERCICIOS 1. _Indicar las afirmaciones correctas sobre instanciacién de componentes: — La transmisién de valores (pardmetros locales) a los puertos (pardmetros formales) de un componente en la sentencia port map s6lo puede hacerse mediante sefiales. — Si no se definen valores en generic map, los pardmetros toman los valo- res especificados en la declaraci6n de la entidad. — Los pardmetros en la instancia a un componente s6lo puede indicarse mediante asociacién posicional. — Enuna instanciacién de componente la etiqueta es opcional. 2. Indica las respuestas correctas a cerca de la sentencia assert-report: — Se utiliza para controlar la simulaci6n del disefio en puntos concretos de éste y emitir mensajes de advertencia ante un error. — El grado de error se define mediante el tipo predefinido severity_level. — Esta sentencia sélo es posible dentro de estructuras de cédigo secuencial. — El mensaje se emite si es falsa la condicién que sigue a assert. 3. Escribir la sintaxis correcta de assert-report para dar lugar a los mensa- jes y niveles de error siguientes: — siS=1111: mensaje «demasiado grande» nivel FAILURE — siS=0011: mensaje «puede ser excesivo» nivel WARNING © ITES - Paraninfo 64 DECLARACIONES BASICAS — si S$ < 0011: mensaje «valor correcto» nivel NOTE en una arquitectura donde se efecttia la operacién aritmética S = IN1+IN2. 4. ;Podrian incluirse las sentet anteriores en la declaracién de una en- tidad? {Cual serfa el resultado? 5. Dado el bloque combinacional de la figura 4.6 y su tabla de verdad: — Escribir la declaracién de entidad de este circuito = Escribir una posible arquitectura en el nivel de descripcién estructural utilizando exclusivamente componentes «NOR2»: component NOR2 port (a, b: in bit; s: out bit end NOR2; 6. Indicar lo erréneo en las siguientes sentencias y bloques de cédigo: U1: nand2 port map (a <= set, b Ib, c <= q); architecture comport_1 of mux21 is -- témese como entidad la de la figura 4.2 begin CIRCUITO COMBINACIONAL Figura 4.6 Ejercicio 5 © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 65 INV port map (A => S, B => net); constant uno: string: constant dos: bit:= "Cadena de caracteres"; 7. Describir las entidades y arquitecturas correspondientes a una puerta inversora y a una puerta nand de dos entradas. 8. Basdndose en los componentes definidos en el ejercicio anterior descri- bir la arquitectura de un biestable J-K. 9. Modelar un decodificador 1 entre 4 a nivel estructural, con memoriza- cién de las sefiales de salida, instanciando los componentes definidos en los dos ejercicios anteriores. 10. Modelar el circuito cuyo diagrama de bloques se indica en la Figura 4.7, haciendo uso de la instanciacién de los componentes de menor jerarquia (sup6ngase que éstos ya estin compilados y almacenados en la bibliote- ca de trabajo). El comparador recibe como entradas dos buses de 8 It- neas y tiene una tnica salida correspondiente a la operacin de igualdad. Por su parte el desplazador tiene 3 entradas de control (reloj, pues- ta_cero y carga_paralelo) y sendos buses de entrada y salida de 8 bits. El bus de entrada es comin a uno de los dos del comparador. Todos los puertos son del tipo bit y sus detivados. 11. Partiendo del modelo de una puerta AND: entity puerta_and is port (Al, A2: in bit; ZN: out bit); end puerta_and; CIRCUITO COMPARADOR - DESPLAZADOR COMPARADOR DESPLAZADOR: Figura 4.7 Ejercicio 10 © ITES - Paraninfo 66 DECLARACIONES BASICAS architecture sencilla of puerta_and is begin ZN <= Al and A2; end sencilla; explicar lo que es err6neo y por qué en los siguientes modelos que hacen uso del anterior: entity circuito_| is ~ circuito_l port (X: in bit; Y: out bit; Z: inout bit); end circuito_1; architecture erronea of circuito_| is component puerta_and port (Al, A2: in bit; ZN: out bit); end component; begin PI: puerta_and port map (X, Y, Z); end erronea; entity circuito_2 cireuito_2 port (X: in bit; Y: out bir; Z: inout bit ); end circuito_2; architecture erronea of circuito_2 is component puerta_and port (Al, A2: in bit; ZN: inout bit); end component; begin PI: puerta_and port map (X, Y, Z); end erronea; 12. Al igual que en el ejercicio anterior, se pide también razonar lo que esté err6neo en los siguientes modelos: entity modos_l is port (I: in bit; O: out bit; 10: inout bir; B: buffer bit); end; architecture RTL of modos_| is begin © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 67 end; entity modos_2 is port (I: in bit; O: out bit; IO: inout bit; B: buffer bit ); end; architecture estructura of modos_1 is component modos_1 port (I: in bit; O: out bit; IO: inout bit; B: buffer bit ); end component; begin G1: modos_1 port map (I, O , IO, B); G2: modos_I port map (O , IO, B,D; G3: modos_l port map (IO, B , I, 0); G4: modos_I port map (B , 1, O , 1); end; 13, Escribir el modelo de un sumador total de dos bits instanciando puertas and y puertas xor, ambas de dos entradas. 14. Inicializar las variables declaradas en el Ejercicio 7 del Capitulo 3. © ITES - Paraninfo Capitulo 5 VHDL CONCURRENTE Y SECUENCIAL Tras presentar los elementos basicos que componen una descripcién en VHDL, en este capitulo se exponen las sentencias més importantes del lenguaje, las cuales se clasifican atendiendo a su cardcter: concurrente o secuencial. 5.1 SENTENCIAS CONCURRENTES Las sentencias concurrentes son aquéllas que se ejecutan simultanea- mente en la simulacién, es decir, no existe una prioridad entre unas u otras. Se utilizan para el modelado del hardware, porque describen adecuadamente su comportamiento, Deben formar parte siempre del cuerpo de arquitecturas 0 de bloques. Son las siguientes: — Procesos — Asignaciones concurrentes a sefial — Llamadas concurrentes a procedimientos — Bloques — Instanciaciones de componentes — Sentencias assert-report — Sentencias generate 70 VHDL CONCURRENTE Y SECUENCIAL, En el capitulo anterior ya se dedicaron sendos apartados a la instan- ciaci6n de componentes y a assert-report. Por otra parte, los procedimientos y las sentencias generate dispondrin asimismo de respectivos apartados en el Capitulo 6. Por tanto, este capitulo se limita a los procesos, bloques y asignacio- nes a sefiales, en lo que respecta a las sentencias concurrentes. 5.1.1 Procesos Un proceso es la sentencia concurrente definida en VHDL para agru- par internamente sentencias secuenciales. Su sintaxis de declaracién es la siguiente: [ctiqueta:] [postponed] process [(Lista_de_Sensibilidad)] [is] -- Zona de declaraciones: — Subprogramas (funciones y procedimientos; se explicaran en el Capitulo 6) ~Tipos y subtipos ~ Objetos (salvo sefiales y variables compartidas) ~ Alias (Capitulo 6) - Atributos (Capitulo 6) ~ Cldusulas use (Capitulo 7) begin ~~ Cuerpo del proceso: -- Sélo sentencias secuenciales (Apartado 5.2) end [postponed] process [etiqueta]; «Lista_de_Sensibilidad» hace referencia a un conjunto de sefiales cu- yo cambio activa la ejecucién del proceso. Resulta opcional, pero el en caso de no existir se hace necesaria la presencia dentro del proceso de una o més sentencias wait, como se verd en apartados posteriores. En el siguiente ejemplo se define un proceso para el célculo de la me- dia aritmética resultante de la suma y el producto de dos niimeros enteros: entity CALCULO is port (A, B: in integer; C: out integer); end CALCULO; architecture CON_PROCESO of CALCULO is begin ‘AREA_LONGITUD: process (A,B) -- declaraciones: variable SUMA, PRODUCTO: integer: variable CUENTA: intege begin -- cuerpo del proceso: © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 1 SUMA:= A + B; PRODUCTO:= A * B; C<= (SUMA + PRODUCTO)/2; CUENTA:= CUENTA + 1; end process AREA_LONGITUD; end CON_PROCESO; Cada vez que se produce un cambio en alguna de las dos sefiales de entrada (A o B), se ejecutan en secuencia las sentencias contenidas en el cuerpo del proceso. Si en la lista de sensibilidad solamente se hubiera especi- ficado la sefial A, el proceso no se ejecutarfa cuando se producen cambios en la sefial B. La Tabla 5.1 muestra los valores que tomarfa la salida conforme cambian las entradas para distintas listas de sensibilidad. Cuando A cambia de 0 a 2, los procesos que incluyen esta sefial en su lista de sensibilidad se ejecutan y en la salida aparece el resultado 1. De for- ma similar, las salidas correspondientes a las columnas (A, B) y (B) modifi- can su valor al cambiar B. Las declaraciones realizadas en un proceso son locales al mismo y no interfieren con el resto de declaraciones del circuito. Asi, por ejemplo, es posible declarar otra variable con el identificador «t 2 0 1 0 2 6 13> t2 10 10 Tabla 5.1. Ejemplo de activacién de un proceso © ITES - Paraninfo 72 VHDL CONCURRENTE Y SECUENCIAL, contrario de lo que ocurre con las funciones y procedimientos, como se verd en el capitulo siguiente. O dicho de otra manera, un proceso es un bucle infi- nito; cada vez que se alcanza end process vuelve a su primera sentencia para ejecutarse de nuevo. Unicamente se detiene en espera de un evento en alguna de las sefiales de su lista de sensibilidad, 0 bien cuando alcanza una senten- cia wait (Apartado 5.2). Un proceso que no contiene ninguna sentencia de asignaci6n a sefial se denomina pasivo. Este tipo de proceso puede aparecer también en la zona de sentencias de una entidad, como se adelanté en el Capitulo 4. La razén es que las sefiales tinicamente pueden recibir asignaciones en el cuerpo de una arquitectura. Por ultimo, hay que sefialar que toda sentencia concurrente tiene su proceso equivalente. De hecho, el simulador solamente trabaja con procesos. Estos se obtienen a partir de cada sentencia concurrente en la fase de elabo- raci6n (ver Capitulo 8). A la opci6n postponed se le dedicar4 un apartado especifico en el ca- pitulo siguiente. 5.1.2 Bloques A pesar de la aparente similitud entre la sintaxis de los procesos y los bloques, su cometido es muy diferente. Los bloques son sentencias concu- rrentes que agrupan a otras sentencias concurrentes. No poseen lista de sen- sibilidad; en su lugar hacen uso del concepto de guarded signal para a cin condicional a sefiales. Permiten ademas declarar puertos y genéricos para interfaz con el exterior, y otra caracterfstica interesante es la de admitir declaraciones locales de sefiales. La sintaxis de un bloque es la siguiente: : block [(condicién guarded)] [is] __ -- La etiqueta resulta obligatoria -- Cabecera del bloque -- Zona de declaraciones: se permiten las mismas declaraciones que en una arquite ctura begin ~~ Cuerpo del bloque: slo sentencias concurrentes end block []; La condici6n opcional guarded permite la asignacién condicional a sefiales mediante sentencias en el cuerpo del bloque que s6lo se activan cuando dicha condicién se cumple. Para ello se utiliza la palabra reservada guarded precediendo al valor, expresi6n u objeto a asignar. Por ejemplo: © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL B block (CLK='I' and not CLK’stable) -- condicién de flanco ascendente expresada mediante el atributo ‘stable (ver Capitulo 6) begin (Q0<= guarded DO; Ql<= guarded D1; end block; Las sefiales QO y QI reciben los valores DO y D1, respectivamente, s6lo cuando se satisface la condicién guarded: CLK='1' and not CLK'sta- ble. Por tanto, las siguientes sentencias de asignacién son equivalentes: Q0<=D0 when (CLK='I' and not CLK'stable) else QO; --when-else se explica en QI<=D1 when (CLK='I' and not CLK'stable) else Q1;-cl siguiente subapartado Si no se antepone guarded se hace caso omiso de la condicién. Otra caracteristica de los bloques es la opcién de incluir una cabecera (block header), Esta se utiliza cuando el bloque modela una parte de un di- sefio, en cuyo caso se incluyen puertos y genéricos para comunicacién con el resto del circuito, de forma andloga a la instanciacién de un componente, pero incluyendo ademés su modelo de funcionamiento. La Figura 5.1 muestra como ejemplo el modelo estructural de un mul- tiplexor mediante bloques, cada uno representando una puerta nand. Por tanto, no existe una gran diferencia entre un bloque y la instanci cién de un componente. Ambos sirven para jerarquizar un disefio. La utiliza- cién de un bloque evita modelar aparte un conjunto entidad-arquitectura, declarar un componente, configurarlo y finalmente instanciarlo. La ventaja de un componente de biblioteca es su reutilizacién, ya que es posible instan- ciarlo tantas veces como sea necesario. En ocasiones se opta por un bloque en una fase intermedia de prueba, para convertirlo posteriormente en un componente. Por ejemplo, la pareja entidad-arquitectura: port (A, B: in bit; C: out bit); end EJEMPLO; architecture CUALQUIERA of EJEMPLO is begin end CUALQUIERA; © ITES - Paraninfo 74 VHDL CONCURRENTE Y SECUENCIAL, chitecture estructural of mux Is nf ° signal N, P1, P2 : bit, ew gin N <= not S; nnand_t : block a generic (t_retardo: time:=2 ns); port (a,b, S: in bit Y: out bid; eae end mux: port map (It =>a,I2.=>N, O => Pt): begin (© S, 12 => b, O => P2); begin O <= It nand [2 atter t_retardo; end block; nand_3 : block generic (t_retardo: time:=2 ns); port (It, 12: in bit; O: out bi); Port map (It => P1, P2 => b, O => Y) begin O '0'); end PAQUETE; library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.NUMERIC_STD.all; use WORK.PAQUETE.all; entity RUTA_DATOS is port (RELOJ: in Sid_Logic; DATOS_ENTR: in Std_Logic_Vector(BITS_32); CTRL: in Sid_Logic_Vector(BITS_32); ESCRITURA: in Sid_Logic; DATOS_SAL: out Sid_Logic_Vector(BITS_32)); end RUTA_DATOS; architecture PARTICION_BLOQUES of RUTA_DATOS is signal REG_A_s, REG_B_s: Std_Logic_Vector(BITS_32); signal OP_A_s, OP_B_s: Std_Logic_Vector(BITS_32); signal SALIDA_REG_ALU_s: Sid_Logic_Vector(BITS_32); begin Datos_Sal<= Salida_reg_ALU, BLOQUE_REGISTROS: block bloque de registros signal REGISTROS_s: REG; begin process (CTRL(REG_A), CTRL(REG_B)) variable [A_v, IB_v: integer; © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL n begin ‘(O_INTEGER(UNSIGNED(CTRL(REG_A))); —() | v:= TO_INTEGER(UNSIGNED(CTRL(REG_B))); = (1) REG_A_s<= REGISTROS_s(IA_v); REG_B_s<= REGISTROS_s(IB_v); end process; process begin — sentencia wait (Apartado 5.2.1) wait until RELOJevent and RELOJ ='1'; — sentencia if-then-elsif-else (Apartado 5.2.2.1) if CTRL(CARGA) = "1" and ESCRITURA = '0' then REGISTROS_s(TO_INTEGER(UNSIGNED(CTRL(DEST)))) <= SALIDA_REG_ALU_s; -( end if; end process; end block BLOQUE_REGS; bloque multiplexor -- sentencia when-else (ver Apartado 5.1.3) OP_A_s <=REG_A_s when CTRL(MUX_A) = MUXA_A else REG_B_s when CTRL(MUX_A) = MUXA_B else DATOS_ENTR when CTRL(MUX_A) = MUXA_D else CERO; process (REG_A_s, REG_B_s, DATOS_ENTR, CTRL(MUX_B)) begin case CTRL(MUX_B) is when MUXB_A => OP_B_s<= REG_A_s; when MUXB_B => OP_B_s<= REG_B _s; when MUXB_D => OP_B_s<= DATOS_ENTR; when MUXB ( OP_B_s<= CERO; when others => null; -- sentencia null (ver Apartado 5.2.2.4) end case; end process; end block BLOQUE_MU: BLOQUE_ALU: block ‘bloque ALU signal REG_ALU_s, SALIDA_ALU_s: Std_Logic_Vector(BITS_32); in process (OP_A_s, OP_B_s, CTRL(OP_ALU)) begin case CTRL(OP_ALU) is ~ sentencia case-when (Apartado 5.2.2.2) when MAS => REG_ALU_s<= © ITES - Paraninfo 78 VHDL CONCURRENTE Y SECUENCIAL, UNSIGNED(OP_A_s)+UNSIGNED(OP_B_s); -() when MENOS => REG_ALU_s<= UNSIGNED(OP_A_s)-UNSIGNED(OP_B_s); -a when Y => REG_ALU_s<= OP_A_s and OP_B_s; when OP_A => REG_ALU_s: when OP_B => REG_ALU_s: when OR_EX => REG_ALU_s<= OP. AS s xor OP_B_s; when others => null; end case; end process; process begin wait until RELOJ'event and RELOI: REG_ALU_s<= Salida_ALU_s; end process; SALIDA_REG_ALU_s<= REG_ALU_s; end block BLOQUE_ALU; end PARTICION_BLOQUES; ~- (1) estas sentencias utilizan una funcién de conversi6n (conversién explicita): ~- «. AA los conceptos -- de conversiones implicita y explicita de tipos se les dedica un apartado en el Capitulo 6. Una caracteristica que diferencia a los bloques de las arquitecturas es que admiten anidamiento. Pero la diferencia fundamental estriba en que una arquitectura es una unidad de disefio (concepto importante de VHDL, ver Capitulo 8) y como tal se compila y almacena por separado. Un bloque no lo es; ha de estar incluido en una arquitectura o anidado en otro(s) bloque(s) que deben formar parte, asimismo, del cuerpo de una arquitectura. 5.1.3. Sentencia when-else Esta sentencia concurrente permite realizar asignaciones condicionales de valores, expresiones u objetos a sefiales. Su sintaxis de declaracién es: [etiqueta:] sefial<= valor_1 when condicién_l else valor_2 [when condicin_2] [else J [else valor_n when condicién_n] [else unaffected]; La sefial recibe una asignaci6n u otra («valor_1» ... «valor_n») en fun- cidn de las condiciones que aparecen tras when. Para la opcién de no asig- nacién (no cambio en Ia seffal) puede utilizarse la keyword unaffected. © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 9 En el ejemplo siguiente se modela un sumador de un bit con retencién de la suma, entity SUMADOR is port (A, B: in bit; ENABLE: in bit; SUMA: out bit_vector (1 downto 0)); end SUMADOR; architecture CON_WHEN of SUMADOR is begin SUMA <= "00" when (A = '0' and B = '0' and ENABLE "01" when (A ='I' and B = '0' and ENABLE "01" when (A = '0' and B ='I' and ENABLE = "10" when (A ='I' and B ='1' and ENABLE unaffected; end CON_WHEN; La arquitectura «CON_WHEN> contiene solo una sentencia concu- rrente, que consiste en una asignacién condicional a la seffal «SUMA». La combinacién de valores de las entradas A y B selecciona el valor a almace- nar en «SUMA» cuando la sefial «ENABLE» se encuentra a nivel 'l'. Cuando la entrada «ENABLE» se encuentra a nivel '0', «SUMA» no cambia en virtud de la asignacién: ... unaffected. 5.1.4 Sentencia with-select La asignacin condicional del apartado anterior puede efectuarse tam- bién por medio de la sentencia de asignacién selectiva a sefial with ... select. Esta sentencia es, asimismo, concurrente, es decir, solamente puede aparecer dentro de arquitecturas y bloques. Su sintaxis es la siguiente: [etiqueta:] with expresion select sefial <= valor_! when resultado_1 [, valor_2 when resultado_2] [, olb valor_n when resultado_n] [, unaffected when others]; EI valor asignado depende de la evaluacién de la expresi6n (algebraica en general, no se restringe tinicamente a booleana) que aparece entre las palabras reservadas with y select. El resultado se compara con los valores © ITES - Paraninfo 80 VHDL CONCURRENTE Y SECUENCIAL, tras when: resultado_1, resultado_2, ..., resultado_n, y se ejecuta la asigna- cién que resulte verdadera, Por tanto, el sumador anterior puede ser descrito también del siguiente modo: architecture CON_WITH_SELECT of SUMADOR is begin with (ENABLE & A & B) select SUMA <= "00" when "100", "01" when "101", "01" when "110", "10" when "111", unaffected when others; end CON_WITH_SELECT; La expresién a evaluar es la concatenacin de las tres entradas del cir- cuito (A, B y ENABLE) para formar un string de 3 bits. A <“SUMA> se le asigna el valor de la suma aritmética de las entradas cuando «EN ABLE» esta a nivel alto. Si no lo esta, la salida permanece inalterada, pues asi lo indica la Ultima opci6n: «... unaffected when others;». La palabra reservada others engloba todos los restantes posibles valores de la expresién. Se puede utilizar el simbolo 'l para asignar el mismo valor a varios re- sultados, lo que permite reducir el nimero de Iineas: architecture CON_WITH_SELECT of SUMADOR is begin with (ENABLE & A & B) select SUMA <= "00" when "100", "01" when "101" 1"110", "10" when "111", unaffected when others; end CON_WITH_SELECT; También es admisible la indicacién de un rango, por ejemplo: when "100" to "111", when "111" downto "100", ete. 5.2 SENTENCIAS SECUENCIALES Son sentencias secuenciales las que solamente pueden aparecer dentro de procesos y subprogramas (ver Capitulo 6). Se ejecutan ordenadamente, de forma que el simulador finaliza completamente una sentencia antes de pasar © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 81 a la siguiente, al contrario de lo que ocurre con las sentencias concurrentes, en las que no importa el orden en el que estan colocadas, 5.2.1 Sentencia wait Es una de las més utilizadas en el modelado de circuitos sincronos. Wait detiene la ejecucién de un proceso o un procedimiento en espera de que se satisfaga una determinada condici6n, Su sintaxis general es: [etiqueta:] wait [on sefial_1, sefial_2, ...] [until condicién] [for expresién_temporal]; Por tanto, puede haber tres tipos de argumentos 0 una combinacién de ellos, bien ninguno. En este tiltimo caso el proceso queda detenido hasta el final de la simulaci6n. Wait on produce el mismo efecto que la lista de sensibilidad de un proceso. Por ejemplo, los dos procesos siguientes son idénticos (salvo en la sentencia en la que se detiene cada uno): PROCESO_1: process (A, B) begin end process PROCESO_1; PROCESO_2: process begin wait on A,B; end process PROCESO_2; En ambos casos el simulador ejecuta las sentencias contenidas en el proceso cuando se produce un evento en cualquiera de las sefiales A 0 B. Est4 prohibido simultanear lista de sensibilidad y sentencia(s) wait en el mismo proceso. Por ejemplo, la siguiente descripcién es incorrecta: PROCESO_INCORRECTO: process (A) begin wait on B; — jerror! end process PROCESO_INCORRECTO; © ITES - Paraninfo 82 VHDL CONCURRENTE Y SECUENCIAL, Si es correcta la utilizaci6n de varias sentencias wait. Todo proceso ha de poscer obligatoriamente lista de sensibilidad o bien una o varias sentencias wait. Asi, el modelo de un semisumador podria ser: architecture CON_WAIT of SEMISUMADOR is -- Declaraciones end process SUMA; end CON_WAIT; La suma se lleva a cabo dentro del proceso. Mientras no se produce ningtin evento en las sefiales A o B, la ejecucién esta detenida en la sentencia wait. Cuando aparece un evento, el simulador reanuda la ejecucién hasta que vuelve a detenerse en wait en espera del proximo cambio en A 0 B. Debido a que VHDL no dispone de un operador predefinido para su- ma aritmética de tipos bit_vector, en este ejemplo se calculé por separado cada bit del resultado. A continuacién se describe el modelo de un sencillo biestable tipo D activado por flancos ascendentes para ilustrar la utilizacién de wait until y wait for: entity BIESTABLE_D is generic (T_DELAY: time:= 4 ns); port (D, CLK: in bit; Q: out bit); end BIESTABLE_D; architecture CON_WAIT of BIESTABLE_D is begin process begin wait until (CLK = 'I' and CLK’event); wait for T_DELA\ Q<=D end process; end CON_WAIT; © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 83 La primera sentencia wait detiene la ejecucién del proceso hasta que se produce un flanco positivo del reloj (CLK). Esta condicién se verifica cuando lo hacen a su vez otras dos: «CLK = 'I'» y «CLK’event». Esta tiltima hace uso del atributo ‘event (Capitulo 6), el cual devuelve el valor booleano true cuando la sefial «CLK» cambia de valor. La segunda sentencia wait detiene el proceso durante un tiempo igual a T_DELAY. El comportamiento es equivalente a utilizar after en la asigna- cién a Q: Q<=D after T_DELAY;. Como ejemplo del uso combinado de varios argumentos: wait on A, B for 100 ns; Esta sentencia espera durante 100 ns a que se produzca un evento en alguna de las dos sefiales de la lista de sensibilidad (A 0 B). Si éste no ha tenido lugar transcurrido ese tiempo, el simulador ejecuta las sentencias si- guientes, Otro ejemplo: wait on A,B until ='1' for 10 ns; Se evaliia en primer lugar el evento en A o B, luego 1a condicién C='1'. Si se cumplen ambas antes de 10 ns, se reanuda la ejecucién. En caso contrario, se reanuda a los 10 ns. 5.2.2, Sentencias condicionales El lenguaje proporciona dos sentencias condicionales de cardcter se- cuencial: if-then-elsif-else y case-when. 5.2.2.1 If-then-elsif- Permite desviar el flujo de ejecucién dentro de un proceso o de un subprograma. Su sintaxis es la siguiente: [etiqueta:] if condicién then sentencias secuenciales {elsif condicién then -- se admiten 0 0 més cléusulas elsif sentencias secuenciales} © ITES - Paraninfo 84 VHDL CONCURRENTE Y SECUENCIAL, [else -- pero slo una else sentencias secuenciales] end if [etiqueta]; Ejemplo: entity BIESTABLE_D_SR is -- biestable D con set y reset sincronos port (D, CLK, SET, RESET: in bit; Q, QN: out bit); end BIESTABLE_D_SR; architecture CON_IF of BIESTABLE_D_SR is begin process begin wait until (CLK ='1' and CLK’ event) if (RESET ='0') then Q<='0'; QN<= '; ~ Reset activo a nivel bajo elsif (SET ='0') then Q<='I'; QN: Set activo a nivel bajo IN<= not D; end process; end CON_IF; ‘Cuando se produce un flanco positivo de reloj se reanuda la ejecucién del proceso, que estaba detenido en wait, y la sentencia if comprueba en si «RESET» esti a nivel bajo, en cuyo caso se ejecutan las sentencias siguien- tes previas a elsif. En caso contrario comprueba la sefial «SET» y procede de manera andloga. Solamente si ambas estan a nivel alto se ejecutan las sen- tencias tras else. 5.2.2.2 Case-when La sentencia case-when permite seleccionar una entre varias alternati- vas excluyentes entre sf (es decir, sélo una debe satisfacerse en cada ejecu- cién) de una expresién determinada y desviar el flujo de ejecucién hacia las sentencias relacionadas con una de ellas. Su sintaxis general es la siguiente: [etiqueta:] case expresién is when caso_I [| caso_2 ...] => sentencias secuenciales end case [etiqueta]; © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 85 De este modo, una arquitectura alternativa para el mismo sumador de os Apartados 5.1.3 y 5.1.4 podrfa ser: architecture CON_CASE of SUMADOR is begin process variable X: bit_vector (2 downto 0); begin X:= ENABLE & A & B; case when "100" => SUMA<= "00"; when "101" |"110" => SUMA<= "01"; when "111 SUMA<= "10"; when others => null; end case; end process; end CON_CASE; La expresién que acompaiia a case se evalia y el simulador ejecuta las sentencias que aparecen tras el valor correcto de la misma. Asi, cuando la expresién es "101" 0 "110" se ejecuta: SUMA<= "01". La palabra reservada others recoge todos los valores no contemplados anteriormente, La senten- cia null (Apartado 5.2.2.4) equivale a una indicacién de sentencia 0 ejecu- cin nula, es decir, ninguna accién se ha de llevar a cabo. Resulta asimismo valida la indicacién de un rango: case X is when "101" to "111" =>.. when "100" downto "001 Por tiltimo, el hecho de introducir la variable X, aparentemente redun- dante, es debido a que el operador & da lugar a un vector no restringido y la sentencia case exige que antes de evaluar un array se conozca su dimensi6n. 3 Bucles Para la ejecucién de bucles en VHDL se utiliza la palabra reservada loop. Existen tres formas de definir un bucle. Con for-loop siempre se hace referencia a un bucle finito, con while-loop a uno finito o infinito (depende © ITES - Paraninfo 86 VHDL CONCURRENTE Y SECUENCIAL, de la condicién asociada) y con simplemente loop a uno infinito. En los si- guientes subapartados se analizan estas tres opciones. 5.2.2.3.1 For-loop Esta sentencia causa la ejecucién de un bucle un ntimero fijo de veces. Su sintaxis es: [etiqueta:] for indice in rango loop sentencias secuenciales end loop [etiquetal; Resultan necesarias las indicaciones de un indice y un rango. El indice es una variable discreta, enumerada 0 entera, que no es preciso declarar y que cambia su valor en una unidad por cada ejecucién del bucle a lo largo del rango especificado, EI siguiente ejemplo utiliza esta sentencia para con- tar el ndimero de unos de una sefial binaria de 32 bits: for Lin 0 to 31 loop if SENAL()='I' then NUMERO_UNOS:= NUMERO_UNOS+1; end if; end loop; 5.2.2.3.2. While-loop El siguiente tipo de bucle utiliza la palabra reservada while para im- poner la condicién de repeticion. Su sintaxis es la siguiente: [etiqueta:] while condicién loop sentencias secuenciales end loop [etiqueta]; El bucle se repite en tanto que la condicién que aparece tras while sea verdadera. El ejemplo anterior admite también esta descripcién: L:=0; while (I> 32) loop if SENAL()='1' then NUMERO_UNOS:= NUMERO_UNOS+1; © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 87 end loop; ‘Ahora sf resulta necesario declarar una variable (1) para poder estable- cer la condicién del bucle, de forma que la alternativa de while-loop no re- sulta ventajosa con respecto a for-loop. Una utilizacién més afortunada de while-loop tiene lugar en este otro ejemplo: PRODUCTO:= 0; while (B/= 0) loop PRODUCTO:= PRODUCTO + A; B=B- 1; end loop; en el que se efecttia la multiplicacién de dos ntimeros (A y B) mediante su- mas sucesivas. 5.2.2.3.3 Loop Ejecuta un bucle infinito. Su sintaxis es: [etiqueta:] loop sentencias secuenciales end loop [etiqueta]; La tinica sentencia que permite romper la ejecucién del bucle es exit, la cual se describe a continuacisn. 5.2.2.3.4 Exit Permite abandonar la ejecuci6n de un bucle antes de la finalizacién del mismo. Su sintaxis es la siguiente: [etiqueta:] exit [etiqueta_bucle] [when condicién}; © ITES - Paraninfo 88 VHDL CONCURRENTE Y SECUENCIAL, Cuando existen varios bucles anidados, esta sentencia sale del mas in- terno en el que se encuentra, o bien de aquel cuya «etiqueta_bucle» se espe- cifica tras exit. En cl siguiente ejemplo se definen dos bucles anidados para buscar un literal de tipo character dentro de una tabla bidimensional y sustituirlo por el cardcter en blanco. Cuando se encuentra, se sale de ambos bucles. BUCLE_EXTERNO: for I in | to N loop BUCLE_INTERNO: for J in | to M loop if TABLA(,J) ='m' then TABLA(LJ):= "5 exit BUCLE_EXTERNO; end if; end loop BUCLE_INTERNO; end loop BUCLE_EXTERNO; 5.2.2.3.5 Next Esta sentencia permite saltar hasta la siguiente iteracién dentro de un bucle. Su sintaxis es la siguiente: {etiqueta:] next [etiqueta_bucle] [when condicisn]; Por tanto, permite alterar Ia secuencia de ejecucién. Si no se especifica ninguna condicién, next transfiere el control al inicio del bucle en el que se encuentra, pasando a ejecutar una nueva iteraci6n. La etiqueta resulta obliga- toria solamente si se el control se transfiere a otro bucle més externo. En el siguiente ejemplo se suman tinicamente los niimeros positivos existentes en 6 valores de una tabla: for J in 1 to 6 loop next when TABLA()<= 0; SUMA:= SUMA + TABLA(): end loop; Si la tabla contiene los mimeros (1, 4, -2, 7, 0, 3), la sentencia que eje- cuta la suma se alcanza s6lo cuando la variable J toma los valores 1, 2, 4 y 6. Cuando J es 3 0 5, la condicién asociada a next se verifica y el flujo de eje- cucién avanza hasta la siguiente iteracién del bucle sin ejecutar la suma. © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 89 5.2.2.4 Null Esta sentencia indica simplemente que no se ha de efectuar ninguna operacién. En el Apartado 5.2.2.2, asi como en el modelo de la ruta de datos con bloques (Apartado 5.1.3) aparecen varios ejemplos. Al igual que todas Jas sentencias, admite también una etiqueta en su sintaxis. 5.3, CUESTIONES Y EJERCICIOS 1. Utilizar la sentencia wait para que un proceso: — Sea sincronizado por niveles. — Sea sincronizado por flancos. — Asigne un retardo de 10 ns. — Se suspenda durante 40 ns si el operando de entrada es mayor que un valor predeterminado C. — Sea activado por flancos descendentes con un retardo de 6 ns. 2. Para qué se usa una lista de sensibilidad en un proceso? 3. Determinar las diferencias implicitas, si las hay, en el uso de las siguien- tes descripciones: A<=B and C; process (B, C) begin A<= B and C; end process; process begin wait on B, C; A<= B and C; end process: process begin ‘A<= Band C; wait on B, C: end process; © ITES - Paraninfo 90 VHDL CONCURRENTE Y SECUENCIAL, Discutir el efecto y la posible utilidad de utilizar una sentencia wait sin ningtin tipo de argumentos. @Son equivalentes las sentencias concurrentes de asignacién a sefial when-else y with-select? Describir la arquitectura correspondiente a un comparador de dos bits que indica si la entrada A es mayor que la B, utilizando: La sentencia concurrente when-else. La sentencia concurrente with-select. ¢Cual de ellas resulta mas adecuada? Repetir lo mismo utilizando las sentencias secuenciales if-then y case-when. 7. {Qué ocurre cuando la condicién de seleccién en una sentencia case- when es de tipo discreto pero con un ntimero ilimitado de elementos? 8. Puede estar incluido algtin proceso dentro del cuerpo de una entidad? 9. Modelar un registro de 4 bits, que carga datos o los desplaza a la dere- cha bajo el control de una sefial P_S, mediante un bloque. 10. Teniendo en cuenta que la sentencia block engloba sentencias concu- rrentes, implementar el modelo jerarquizado de un sumador de dos bits con acarreo, utilizando bloques sumadores de un bit. 11. Modelar el sumador anterior con sentencias secuenciales. Afiadir una entrada asfncrona de puesta a cero med iante una sentencia wait. 12. Escribir un proceso en el que se busca el primer cardcter L de cadena de longitud variable y que indica mediante un mensaje de texto la posicion que ocupa. 13. Supongamos que la siguiente sentencia forma parte de un modelo: wait on a, b; determinar las afirmaciones correctas respecto a la misma: © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 1 — ay b pueden ser sefiales y variables, pero no constantes. — Esta sentencia puede usarse en procesos y bloques. — Puede sustituir a la lista de sensibilidad de un proceso. — Detiene la ejecucién secuencial hasta que haya un evento en las sefiales a y b (en ambas simulténeamente). — Resulta equivalente a wait until (a’ event or b’ event); 14. Modelar el componente de la Figura 5.3: — Mediante la sentencia if... then... elsif... else — idem con ease... when — [dem con when... else 15, Modelar un decodificador 1 entre 4 con memorizacién de las salidas, a nivel estructural, instanciando puertas basicas y biestables. Escribir los modelos de estos tiltimos en el propio fichero. 16. Identificar las afirmaciones correctas: = Las sefiales pueden declararse en todas las estructuras de cédigo VHDL, concurrentes 0 secuenciales. — Las constantes no pueden declararse en el interior de un proceso. — Las variables declaradas en un bloque son locales a éste. = Los procesos pueden declarar variables locales pero no sefiales, siendo visibles en ellos todas las sefiales declaradas en la arquitectura de la que forman parte. X(2:0) Y(2:0) COMP. §(2:0) Z(2:0) Figura 5.3. Ejercicio 14 © ITES - Paraninfo 92 VHDL CONCURRENTE Y SECUENCIAL, 17. Seleccionar las afirmaciones correctas: — En la zona de declaraciones de un proceso pueden definirse localmente funciones y procedimientos. — Los componentes s6lo pueden instanciarse en el cuerpo de una arquitec- tura. — Los bloques ejecutan su cédigo interno de modo secuencial y en paralelo con las demés sentencias incluidas en el cuerpo de una arquite ctura. — Los bloques slo pueden existir en el cuerpo de una arquitectura. 18. Supongamos la siguiente sentencia secuencial: if (rst ='0') then Salida<= (others =>'0'); ~ (1) elsif (we = '0') then Registro:= entrada; 2) else Salida<= registro; -@) end if; y sean rst ='I' y we ='0'. Determinar la respuesta correcta: — Se realiza la asignacién (1). — Se produce un error de compilacién por haber dos asignaciones a la sefial «Salida». — Se realizan las asignaciones (2) y (3). — Recibe asignaci6n Ia variable «Registro». 19. Partiendo de las siguientes sentencias: type hexadecimal is (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,P); signal puerto_serie: hexadecimal; case puerto_serie is when 0) => salida<= entrada; when | to 6 => salida (1 to 6)<= (others => 0’); when 3|A|B => if OE= ‘1’ then Registro:= entrada; Salida<= (others => '0'); end if; when others => null; end case; © TTES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 93 determinar las respuestas correctas si «puerto_serie» vale 3: — Se realizan las asignaciones correspondientes a la tercera opci6n. = Se produce un error porque las opciones tras when no son todas exclu- yentes entre si. — No se puede evaluar una sefial en una sentencia case-when. — El identificador «puerto_serie» no es valido. 20. Indicar las respuestas correctas: — Los procesos ejecutan sus sentencias internas de forma concurrente. — Un proceso debe tener al menos una sentencia wait de control en caso de no existir lista de sensibilidad. — Los bloques pueden definir puertos y pardmetros genéricos como un componente. — Los procesos pueden también definir puertos y pardmetros genéricos. 21. Identificar las afirmaciones correctas sobre los objetos que pueden con- formar la lista de eventos de un proceso: Variables y sefiales. Constantes. Un puerto de la entidad. Una sefial declarada en la arquitectura. 22. Identificar las afirmaciones correctas sobre el bucle for-loop siguiente: type vocales is (‘a','e’,'','0','u'); for letra in vocales loop -- sentencias secuenciales end loop; Error, un bucle for-loop sélo admite mimeros enteros como indice. — Error, es preciso declarar la variable «letra» del tipo «vocales». El rango de valores del indice puede ser numérico o de tipo enumerado. Es correcta la siguiente restriccién del bucle: for letra in ‘o' downto ‘e’ loop. © ITES - Paraninfo 94 VHDL CONCURRENTE Y SECUENCIAL, 23. Modelar adecuadamente el circuito de la figura 5.4, a nivel RTL hacien- do uso de la sentencia concurrente when-else. {Es posible declarar los Puertos «iol» e «io02» del modo buffer? INV CTRL BTS 1O4 1O2 Figura 5.4 Ejercicio 23 © TTES - Paraninfo Capitulo 6 ASPECTOS AVANZADOS DEL LENGUAJE En el presente capitulo se explican algunos conceptos, elementos y sentencias adicionales del lenguaje no expuestos con anterioridad y se pro- fundiza en otros ya conocidos. 6.1 SUBPROGRAMAS VHDL permite emplear dos tipos de subprogramas, que ayudan a mejorar la descripcién, estructuracién y legibilidad de los modelos y, por tanto, a la posible reutilizacién del cédigo. Estos subprogramas son las fun- ciones y los procedimientos. Son muy similares a los que se definen en los Ienguajes de programacién de alto nivel (HLL) de propésito general. El ob- jetivo principal de las funciones es realizar un cAlculo puntual y devolver el Itado sin que avance el tiempo. Los procedimientos suelen estar mds ligados a la naturaleza de lenguaje de descripcién hardware de VHDL y pueden constituir pequefias descripciones encargadas de realizar prdctica- mente cualquier tarea, aunque también se utilizan con profusién en los ban- cos de prueba (test benches, Capitulo 8) para el acceso a ficheros externos. La estructura de ambos tipos de subprogramas es formalmente idén- tica. S6lo existen variaciones en cuanto a las capacidades de cada tipo. © ITES - Paraninfo 96 ASPECTOS AVANZADOS DEL LENGUAJE, 1.1. Funciones Las funciones son descripciones que a partir de unos pardémetros de- vuelven un resultado, Sus principales caracteristicas son: — No pueden modificar los pardmetros que se les pasan, s6lo los pueden leer, por tanto tinicamente admiten parémetros de modo in, que por de- fecto son constantes, aunque también es posible cualquier otra clase de objeto. En el caso de ser ficheros no debe indicarse el modo, pues éste ya va implicito en la propia declaracién del fichero. = No pueden modificar sefiales ni variables declaradas externamente; es decir, no pueden contener sentencias de asignaci6n a variables externas y a seffales, aunque estas dos clases de objetos sf pueden ser utilizadas para efectuar célculos y realizar asignaciones a variables locales. — Siempre devuelven un valor cuyo tipo se especifica en la propia declara- ci6n de la funcién. — Se ejecutan en tiempo nulo, es decir, no avanza el tiempo de simulacién entre la llamada a una funcién y la devolucién del resultado. — De lo anterior se infiere que no pueden contener ninguna sentencia wait. La sintaxis general de declaracién de una funcién es: [purelimpure] function [(lista_de_pardmetros)] return tipo ~- Zona de declaraciones begin ~ Cuerpo de la funcidn: solamente sentencias secuenciales, salvo wait ~- No asignaciones a sefiales ni a variables externas return valor; end [function] ; En las funciones no se pueden declarar sefiales, pero si las restantes clases de objetos, tipos de datos, alias (ver Apartado 6.5), atributos (Aparta- do 6.6), cldusulas use (Capitulo 7) e incluso otros subprogramas. En el cuer- po se admiten tinicamente sentencias secuenciales, a excepcién de wait. A partir de la revisin de 1993 se distinguen dos tipos de funciones: Ppuras e impuras. Funciones puras son aquellas que, a partir de unos determinados valores, siempre devuelven el mismo resultado, es decir, presentan un comportamiento determinista. Este es el tipo de funcién por defecto. Por el contrario, las impuras pueden devolver distintos valores, con los mismos pardmetros, cada vez que son invocadas. Ejemplos de ellas son: una funcién que devuelve un niimero aleatorio, otra que devuelve el tiempo actual de simulacién, otra que devuelve un dato de un fichero, etc. © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 97 La invocacién de una funcién se lleva a cabo indicando su nombre y opcionalmente la lista de pardmetros, formando siempre parte de una expre- si6n o de una sentencia de asignaci6n, Por ejemplo: area:= area_circulo (radio); La funcién «area_circulo» toma como parémetro un valor («radio») y devuelve otro necesariamente del mismo tipo que el objeto a que es asigna- da, en este caso la variable «area». Normalmente las funciones se declaran dentro de paquetes (ver capi- tulo siguiente), de forma que puedan ser empleadas en cualquier descripcién sin tener que declararlas localmente en cada una de ellas. En el siguiente ejemplo se muestra de forma parcial la declaracién de un paquete de funcio- nes matemiticas y el modelo de un circuito que hace uso de ellas. Ademds se declara una funcién local en la propia arquitectura, ~~ Declaracién del paquete «geometria» package geometria is function area_circulo (radio: real) return real; function area_cuadrado (lado: real) return real; function longitud_circulo (radio: real) return real; end package geometria; -- Cuerpo del paqucte package body geometria is -- Descripcién de la funcién que calcula el area de un circulo function area_circulo (radio: real) return real is constant pi: real:= 3.141592; begin return (pi * (radio ** 2)); end function area_circulo; end package body geometria; ~Declaracién de entidad y arquitectura. Previamente se da visibilidad al paquete anterior use WORK. geometria.all; entity algunas_operaciones is port (reloj: in bit; cod_oper: in integer range 0 to 15; radio, lado: in real; area, longitud, resultado: out real); end algunas_operaciones; architecture comportamiento of algunas_operaciones is -- Declaracién y descripcién de la funcién «max» @ITES - Paraninfo 98 ASPECTOS AVANZADOS DEL LENGUAJE, function max (op1, op2: real) return real is in if (op1 > op2) then return op1; else return op2; end if; end function max; ~ Cuerpo de la arquitectura begin process (reloj) begin if (reloj ='1') then case (cod_oper) is when 0=> resultado<= area_circulo (radio); when resultado<= longitud_circulo (radio); when resultado<= max (area_circulo(radio), area_cuadrado(lado)); end case; end if; end process; end comportamiento; En ocasiones resulta conveniente usar el mismo nombre para funcio- nes diferentes; a esto se le llama sobrecarga de funciones (Apartado 6.7). 6.1.2. Procedimientos Los procedimientos pueden emplearse para describir partes del circui- to. Una descripeién se puede particionar en procedimientos, de forma que resulte més sencilla su lectura. Al contrario que las funciones, los procedi- mientos intercambian informaci6n con el exterior en ambas direcciones, es decir, ademas de pardmetros de entrada (in) pueden declararse también pa- rémetros de salida (out) y de entrada-salida (inout). Asimismo, admiten la sentencia return, pero por sf sola (sin un resul- tado a continuacién, como en el caso de las funciones), de tal manera al eje- cutarse se detiene la ejecucién del procedimiento y se devuelve el control a la sentencia posterior a la que fue invocado. Todas las sentencias empleadas dentro de un procedimiento han de ser secuenciales, al igual que en una funcién 0 en un proceso. Otra utilidad comin de los procedimientos son las rutinas de acceso a ficheros externos, como las declaradas en el paquete textio (Apéndice B). © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 99 A continuacién se muestra la sintaxis de declaracin: procedure nombre [(lista_de_pardmetros)] -- Zona de declaraciones begin -- Cuerpo del procedimiento: solamente sentencias secuenciales end [procedure] [nombre]; Como se puede observar, la sintaxis es similar a la de las funciones. Todo 1o comentado en el apartado anterior con respecto a las mismas es vé- lido para los procedimientos, con algunas excepciones: — La posibilidad, ya comentada, de intercambio bidireccional de informa- cidn con el exterior a través de la lista de parametros. idad de incluir la sentencia wait. idad de efectuar asignaciones a sefiales. — En cuanto a los pardmetros, si son de entrada (in) se toman por defecto como constantes, y si son de salida (out) o de entrada-salida (inout) co- mo variables, aunque se admite cualquier otra clase de objeto. En el caso de ser un fichero no debe indicarse el modo, pues éste ya va implicito en la propia declaracién del fichero. Obviamente, no tiene sentido declarar como constante un pardmetro de salida o de entrada-salida. ‘Al igual que las funciones, los procedimientos se suelen declarar en paquetes, de tal forma que puedan ser invocados en cualquier descripci6n. Los procedimientos no devuelven valores de la forma que lo hacen las funciones, por lo no pueden formar parte de una expresién ni de una senten- cia de asignacién. Se invocan simplemente indicando su nombre y su lista de pardmetros. Dicho de otro modo, la llamada a un procedimiento constituye una sentencia por sf sola. Ejemplo: area_circulo (radio, area); Este procedimiento calcula el drea de un cfrculo a partir del radio y lo almacena en «area», Este pardmetro ha de ser pues de modo out o inout. EI siguiente ejemplo muestra la utilizacién de un procedimiento para realizar transferencias de datos dentro de un sistema. procedure lee_dato (signal clk, ready: in std_logic; dir: in. std_logic_vector (7 downto 0); — —constante, por defecto @ITES - Paraninfo 100 ASPECTOS AVANZADOS DEL LENGUAJE, t_delay: in time; -- fdem signal RW: out std_logi signal bus_dir: out std_logic_vector (7 downto 0); dato: out std_logic_vector (3 downto 0); - variable, por defecto signal bus_datos: inout std_logic_vector(3 downto 0)) is begin wait until clk'event and clk=' bus_dir<= dir after t_dela: -- escritura en el bus de direcciones wait until clk'event and clk='0'; RW<='T' after t delay; ~ orden de lectura ~ leetura de datos ~ bus de datos en alta impedancia -m con linea RW El procedimiento lee una posicién de memoria y para ello se encarga de acceder a los buses de direcciones y datos, tal como indica la Figura 6.1. Un procedimiento puede ser llamado por una sentencia secuencial; ejemplo: if then lee_dato © bien constituir por sf solo una sentencia concurrente. En este caso se ejecuta cada vez que tiene lugar un evento en alguna de sus sefiales de entrada (modos in 0 inout). Como ejemplo se muestra a continuacién un biestable JK modelado mediante un procedimiento declarado localmente en Ja propia arquitectura. \ bus_dir —_———————> aw ——— lecrsy dato “2 bus_datos OF Figura 6.1. Protocolo modelado por el procedimiento «lee_dato» © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 101 entity B_JK_con_procedimiento is port (J,K, clk: in bit; Q,Qbar: inout bit); end B_JK_con_procedimiento; architecture con_procedimiento of B_JK_con_procedimiento is ~ declaraciones: procedure JKFF(signal clk, J, K: in bit; signal Q, Qbar: inout bit) is begin if (clk='I' and clk’event) then if ‘and K='1') then Q<= not ") then Q<='1'; Qbar<= "0 ') then Q<= '0'; Qbar<='I'; Ee 8 2 R begin — cuerpo de la arquitectura wocaci6n concurrente del procedimiento: se ejecuta cuando tiene lugar un evento en alguna de sus sefales in o inout IKFF(clk,J,K,Q,Qbar); end con_procedimiento; Existe un conjunto de funciones y procedimentos implicitos por cada tipo fichero (ver Apartado 3.5) declarado, que se comentan a continuacién. procedure FILE_OPEN (file : tipo; archivo_externo: in string; modo: in file_open_kind: READ_MODE); ~ procedimiento que abre un fichero en el modo indicado por el tercer pardmetro y lo asocia -- con el fichero fisico (es decir, perteneciente al sistema de archivos del computador) ~ indicado por el segundo parémetro. ~- El tipo predefinido file_open_kind contempla tres posibles modos de apertura del fichero: READ_MODE para lectura (valor por defecto) WRITE_MODE para escritura destructiva ~ APPEND_MODE para aftadir datos al fichero procedure FILE_OPEN (STATUS: out file_open_status; file : tipo; archivo_externo: in string; modo: in file_open_kind: READ_MODE); ~ procedimiento idéntico al anterior, que devuelve ademés el estado del fichero en la ~ apertura. El tipo predefinido file_open_status contempla los siguientes valores: -- OPEN_OK (fichero abierto con éxito) STATUS_ERROR (el fichero ya se encontraba abierto) NAME_ERROR (fichero no encontrado en el sistema de archivos 0 no accesible) -- MODE_ERROR (apertura no permitida del fichero en el modo indicado) procedure FILE_CLOSE (file : tipo); ~ procedimiento que cierra un fichero @ITES - Paraninfo 102 ASPECTOS AVANZADOS DEL LENGUAJE, procedure READ (file : tipo; valor: out tipo); procedimiento que obtiene el siguiente valor del fichero y lo asigna a la variable indicada ‘como segundo pardmetro procedure WRITE (file : tipo; valor: in tipo); ~ procedimiento que afiade al fichero el valor indicado en el segundo parametro function ENDFILE (file : tipo) return boolean; funcin que devuelve el booleano false, si es posible obtener un nuevo valor del fichero, 0 true en caso contrario (es decir, cuando se ha alcanzado el final del mismo) Cuando el tipo es un array de rango no restringido, el procedimiento implicito READ es diferente: procedure READ (file : tipo; valor: out tipo; longitud: out natural); procedimiento que lee un niimero de elementos (indicado por «longitud») del array y los asigna ala variable «valor» Ejemplo de utilizacién de las rutinas y funcién anteriores: Declaracién del fichero «vectores» en modo lectura (READ_MODE implicito), asociado con el fichero «vectores_dat» del sistema de archivos del computador. type fis file of bit_vector; file vectores: f is "vectores.dat"; — Declaracién del fichero de resultados sin asociar a ningtin fichero extemo: file resultados: f; ~- Declaraci6n de variables para trabajar con las rutinas de ficheros: variable longitud_vector: natural; variable dato_entrada, dato_salida: bit_vector(7 downto 0); Declaracién de un puntero para almacenar mensajes a visualizar por pantalla: variable L: line; ~ Apertura del fichero de resultados con asoci ~ eresultados_dat» en modo escritura: FILE_OPEN (resultados, "resultados.dat", WRITE_MODE); WRITE (L, string'\("Inicio de la simulaci6n")); WRITELINE (OUTPUT, L); _~ Se muestra en pantalla el texto escrito en L while not ENDFILE (vectores) loop -- Recorrido completo del fichero «vectores» mediante un bucle: READ (vectores, dato_entrada, longitud_vector); _— Se lee un vector --... Aplicacién del mismo n explicita al fichero externo ‘._ Obtencién del resultado en «dato_salida» WRITE (resultados, dato_salida); end loop; FILE_CLOSE (resultados); -- Cierra «resultados». Antes de volver utilizarlo debe ser abierto de nuevo con FILE_OPEN scritura de «dato_salida» en «resultados» © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 103 EI siguiente ejemplo muestra un proceso que hace uso de los procedi- mientos definidos en el paquete textio (Apéndice B) para leer datos y escribir tesultados en ficheros. type linea_datos is ~ declaracién de un tipo record record a,b,y: bits sel: bit_vector(2 downto 0); num: integer; end record; signal puertos: linea_datos; -- declaracién de un objeto del tipo anterior lectura_escritura: process ~ declaracién de ficheros tipo text y punteros tipo line (tipos declarados a su vez.en el ~ paquete fextio): file estimulos: text open read_mode is “c: variable linea_est: line; file resultados: text open write_mode is "c:\...\resultados.txt"; variable linea_res: line; variable vdato: linea_datos; ~ variable que recoge las lecturas en el fichero begin ~ mientras no se detecte el final del fichero «estimulos», se ejecutan los procedimientos invocados dentro del bucle: while not endfile (estimulos) loop ~rutina que lee una Ifnea de «estimulos» y la almacena en el puntero «linea_est readline (estimulos, linea_est); procedimientos que leen la informacién del érea apuntada por «linea_est» y la almacenan en los respectivos campos de «vdaton: read (linea_est, vdato.a); read (linea_est, vdato.b); read (linea_est, vdato.sel); read (linea_est, vdato.num); read (linea_est, vdato.y); rutinas que escriben los campos de «puertos» en el drea apuntada por «linea_res»: write (linea_res, puertos.a); write (linea_res, puertos.b); write (linea_res, puertos.sel); write (linea_res, puertos.num); write (linea_res, puertos.y); procedimiento que escribe el contenido del Area seftalada por «linea_res» en siguiente Ifnea libre del fichero «resultados» writeline (resultados, linea_res); end loop; wait; end process; \...\estimulos.txt"; ~ detenci6n indefinida del proceso @ITES - Paraninfo 104 ASPECTOS AVANZADOS DEL LENGUAJE, 6.2 LOGICA MULTIVALUADA Para que la simulacin del hardware resulte eficiente y aporte la ma- yor informacién posible sobre el comportamiento de un modelo, se hace necesario ampliar el nimero de estados l6gicos. Para ello se introdujo el concepto de fuerza Iégica como la capacidad de entrega o absorcién de corriente en un nodo, al margen de su nivel de tensi6n. Para la simulacién en VHDL, el IEEE introdujo en 1993 el paquete «std_logic_1164» (popularmente conocido como paquete de I6gica multiva- luada), que puede consultarse en el Apéndice B. En él se define un nuevo tipo de datos, cuyos 9 literales se asocian a sendos estados I6gicos: type std_ulogic is ( "Ul = uninitialized (estado no inicializado) x’ trong unknown (desconocido fuerte) ‘0’ — — strong 0' (0 fuerte) ‘I= strong (fuerte) 'Z. = high impedance (alta impedancia) "W' — weak unknown (desconocido débil) "L = weak '0'(10' débil) 'H — weak (1 débil) ~ dont care (indiferente) ) 'U! es un estado I6gico util para detectar nodos que no han evolucio- nado desde el comienzo de la simulacién. " se utiliza fundamentalmente en sintesis (Capitulo 10). Indica valo- res '0' 0 'I' indiferentes en un determinado nodo, y sugiere a la herramienta de sintesis que asuma el valor que conduzca a un circuito més sencillo. yop nc ale 1 a vout vin “L_J] = cL ToL Figura 6.2 Ejemplo de los estados ldgicos '1’ «fuerte» y alta impedancia © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 105 El circuito de la Figura 6.2 resulta titil para exponer los conceptos de estado Igico «fuerte» y de alta impedancia. Suponiendo a nivel alto la ten- sin de control VC, la puerta de transmisién esté en conducci6n, por lo que Ja salida del inversor V y la salida total VOUT coinciden. En este caso, si conduce el transistor tipo P del inversor y el tipo N es el que esté en corte, en la salida existe un 'l' «fuerte», dado que esta unida al terminal VDD de ali- mentaci6n a través una resistencia practicamente nula. Por ello, la capacidad de entrega de corriente en del nodo VOUT es maxima. Del mismo modo, si ahora es el transistor N el que pasa a conduccién y por tanto el P a corte, en la salida existe un ‘0’ «fuerte» porque est conectada al terminal de masa de alimentacién. Por tanto, su capacidad de absorcidn de corriente también es maxima. En el caso de tener VC a nivel bajo, la puerta de transmisién est4 en corte y la salida pasa a estado de alta impedancia ('Z’). Cuando en un nodo de un circuito se produce una colisién entre los es- tados lgicos 'I' «fuerte» y '0' «fuerte», el simulador asigna a dicho nodo el estado légico 'X' o desconocido «fuerte». La Figura 6.3 es ilustrativa del estado Igico 'I' «débil», que se pro- duce cuando el transistor esté en corte, porque en ese caso la salida queda unida a la tensién Vec de alimentacién a través de una resistencia apreciable, por lo que su capacidad de entrega de corriente se ve reducida. Andlogamente, una resistencia del emisor a masa daria lugar al estado l6gico '0' «débil» cuando el transistor pasa a conduccién. Y de nuevo, si en determinado circuito confluyen ambos valores débiles en un nodo, el simulador decide que el estado Idgico es 'W' o desconocido «débil». Vec Figura 6.3 Ejemplo del estado légico 1’ «débil> @ITES - Paraninfo 106 ASPECTOS AVANZADOS DEL LENGUAJE, 6.3 SENALES 6.3.1 Modelos de retardos Las asignaciones a sefial permiten incluir informacién sobre retardos, de tal manera que los modelos se aproximen lo méximo posible al hardware que pretenden representar. EI modelo de transporte describe el comportamiento de una linea de transmisién ideal, en la que toda informacién se transmite entre dos puntos, independientemente de su duracién. Por el contrario, el modelo inercial describe los circuitos reales, es de- cir, una sefial de corta duracién puede no Ilegar a transmitirse. Por defecto, éste es el modelo que se utiliza en las asignaciones a seffales. La Figura 6.4 muestra la diferencia entre las siguientes asignaciones: B<= inertial A after 10 ns; -- Modelo inercial. Resulta redundante la keyword inertial, por cuanto es el modelo por ~- defecto. Luego es suficiente: B<= A after 10 ns; C<= transport A after 10.1ns; — Modelo de transporte En ambos casos, la sefial A se asigna a B y C tras 10 ns. Se observa c6mo el pulso inicial de 15 ns aparece en B y C tras ese retraso. Sin embar- g0, el segundo pulso, de duracién 5 ns, no se refleja en la sefial B. En el mo- delo inercial s6lo se realiza la asignaciGn de seffales si el pulso se mantiene durante un tiempo igual o superior al de rechazo. El tiempo de rechazo en este caso es de 10 ns, idéntico al tiempo de retraso de la sefial B con respecto a la seffal A. En el caso de C el modelo de asignaci6n es el de transporte, por Jo que el impulso més estrecho también se transmite. 10ns 5ns season erg omnes | | ena B Inercial ic) | Transporte Figura 6.4 Ejemplo de ambos modelos de retardo © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 107 Es posible indicar explicitamente el tiempo de rechazo para una asig- naci6n inercial utilizando la palabra reservada reject. Todos aquellos pulsos de duraci6n inferior al tiempo de rechazo se descartan: B<= reject 2 ns inertial A after 10 ns; La sefial B adquiere el valor de A con un retraso de 10 ns. Sélo los pulsos en A de duracién inferior a 2 ns son rechazados. Si no se especifica el tiempo de rechazo se asume que es igual al tiempo de retraso especificado en la sentencia de asignacién (en este caso 10 ns). En la Figura 6.5 solamente el pequefio pulso de | ns es rechazado y no se manifiesta en la sefial B. Sin embargo, sf lo hacen los restantes pulsos porque tienen duraciones superiores a 2 ns. 6.3.2 Concepto de driver Cada vez que se realiza una asignacin a una sefial se crea un driver para la misma, en el que se almacenan su valor actual y sus valores futuros como una secuencia de transacciones. Una transaccién es la pareja formada por un valor de la sefial y el instante en el que debe hacerse efectivo. Es de- cir, la secuencia de transacciones esté constituida por un conjunto ordenado de parejas { valor, tiempo}. Por ejemplo: signal S1: integer:= 0; process begin Sl<= 4 after 6 ns, 15 after 11 ns, -12 after 22 ns; end process; 15ns ins 7ns ee ee eo LL Figura 6.5 Retardo con tiempo de rechazo explicito @ITES - Paraninfo 108 ASPECTOS AVANZADOS DEL LENGUAJE Representacién del driver de $1: St Un driver debe contener al menos una transaccién, que podria ser el valor inicial de la sefial. El valor de ésta siempre viene determinado por su driver, aunque puede existir més de uno por sefial si ésta es resuelta (sefial declarada de un tipo resuelto, el cual precisa de una funcién de resolucin asociada, ver Apartado 6.8). En el ejemplo anterior, cuando la sentencia se ejecuta se crea un dri- ver para S1 con tres transacciones. En el instante T+6ns $1 toma el valor 4, la primera transaccin desaparece del driver, y asi sucesivamente, Cada sentencia concurrente solamente puede crear un driver. Por tan- to, en el caso de un proceso, si existe més de una asignaci6n a una sefial, las transacciones de cada asignacién modifican el unico driver. La forma en que Jo hacen depende del modelo de retardo utilizado, inercial o de transporte. ‘Supénganse las siguientes asignaciones a $2 dentro de un proceso: signal S2: integer:= 0; process begin ‘S2<= transport 8 after 9 ns; S2<= transport 14 after 20 ns; S2<= transport 6 after 15 ns; end process; Una vez ejecutadas las dos primeras sentencias, el driver de S2 es: ee La tercera asignacién hace que la segunda transacci6n desaparezca del driver porque aquélla tiene asociado un retardo menor (que se toma como prioritario). Asf pues, el driver pasa a ser: [worn |e] 8 S2 s2 © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 109 Por tanto, se puede concluir que para la actualizacién del driver de una sefial: — Todas las transacciones que tendrfan lugar después de una nueva se su- primen, — Las nuevas se afiaden a la cola del driver. Ademés en el caso del modelo de retardo inercial: — Se comprueban los valores de las transacciones que tengan lugar en la ventana temporal comprendida entre el instante de la nueva transaccién y dicho instante menos su tiempo de rechazo (reject). Si no coinciden se suprimen dichas transacciones, en caso contrario se mantienen. Ello se clarifica con el siguiente ejemplo: signal S3: bit_vector(7 downto 0); process begin S2<= X"1F" after 9 ns; -- rechazo de pulsos inferiores a 9 ns reject 14 ns inertial X"03" after 20 ns; ~ rechazo de 14 ns X"4A" after 16 ns; ~ rechazo de 16 ns end process; La segunda transaccién hace que la primera desaparezca del driver, dado que ésta cae en la ventana entre 20 ns y (20-14) ns y su valor (X"1F") difiere del de la nueva transaccién (X"03"). Por tanto, su driver pasa a ser: instante actual (T) Pero la ejecucién de la diltima asignacin hace que la segunda también desaparezca, porque su tiempo asociado es superior al de la nueva transac- cién. Luego el driver resulta definitivamente: instante actual (T) s2 s2 @ITES - Paraninfo 110 ASPECTOS AVANZADOS DEL LENGUAJE, 6.3.3 Seiiales guarded: bus y register Las sefiales guarded son un tipo especial de sefiales resueltas (ver Apartado 6.9), que declaran una clase (signal kind): bus o register, y permi- ten, en el interior de un bloque y bajo la accién de una «condicién guarded», controlar la asignacién de valores a estas sefiales y regular su «tiempo de desconexién» de dicha asignacién mediante la sentencia disconnect, mode- Jando asi el comportamiento fisico de un bus de datos o un registro. Su sintaxis de declaracién es: signal : [| buslregister [:= ]; La tnica diferencia con respecto a la declaracin de una sefial conven- cional estriba en la definicién de una clase, bus o register. Ademés, una sefial guarded necesariamente ha de ser resuelta, es de- cir, en el caso de que no sea un tipo resuelto, la opcién pasa a ser obligatoria. La sentencia disconnect, cuya sintaxis es: disconnect : after ; establece el tiempo, desde que la «condicién guarded» se ha hecho falsa, en que debe mantenerse el valor actual de la sefial antes de la «desconexiém». Esta sentencia debe formar parte de la misma zona en que se declara su sefial guarded asociada. El comportamiento de la sefial, bajo la accién de la condicién de con- trol (guarded), depende de la clase declarada: = Clase Bus: Cuando se cumple la «condicién guarded», se produce la asignaci6n a la sefial del valor resultante de aplicar la funcién de resolu- cién (Apartado 6.9) a todas las asignaciones concurrentes. Cuando la condicién se hace falsa, coloca todas las asignaciones concurrentes al va- lor més débil del tipo resuelto (p.e. en el caso sid_logic a 'Z’), con lo que el valor resultante ser dicho valor. Esta «desconexiém, cuando la condi- cién se hace falsa, es equivalente a una sentencia disconnect con tiempo cero. — Clase Register: Asigna el valor a la sefial cuando la «condicién guarded» es cierta. Al hacerse falsa la condicién, mantiene el valor de todas las asignaciones concurrentes antes de la «desconexién» y calcula el valor resuelto de todas ellas. © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL aia Ejemplo: architecture flujo_datos of bloque is signal REG_SIG: std_logic register; signal BUS_SIG: sid_logic bus; disconnect REG_SIG: std_logic after 5 ns; disconnect BUS_SIG: std_logic after 5 ns; begin BI: block (clk='I') begin REG_SIG<= guarded N after 10 ns; BUS_SIG<= guarded N after 5 ns; end block; end flujo_datos; En este ejemplo la sefial «BUS_SIG», de clase bus, recibe una asigna- cién guarded dentro del bloque «BI», especificando con la sentencia dis- connect que una vez se deje de cumplir la condicién «clk='I'», se temporiza 5 ns hasta poner el valor de la sefial a 'Z’. Si no utiliza la opcin disconnect, la sefial pasarfa a 'Z’ inmediatamente en cuanto la condicién se hace falsa. La especificacién de desconexién es util para modelar tiempos de ba- jada, debidos por ejemplo a la descarga de las capacidades pardsitas en un bus. Por tiltimo, conviene indicar que una sefial guarded s6lo puede recibir asignaciones de otra sefial guarded, o de un objeto o literal que anteponga la palabra reservada guarded. 6.4 VARIABLES COMPARTIDAS Este tipo de variables (introducidas en la revisién de 1993) pueden ser manipuladas por mds de un proceso. Por ello deben ser declaradas en la zona de declaraciones de una arquitectura, bloque o paquete, al igual que si se tratase de una sefial, y pueden ser utilizadas por todos los procesos u otras sentencias concurrentes que formen parte del cuerpo de dichas arquitecturas 6 bloques. En su declaraci6n se emplea la palabra reservada shared. No obstante, no es muy recomendable la utilizacién de este tipo de va- riables, ya que pueden dar lugar a comportamientos no deterministas, es decir, los resultados de la simulacién de un mismo modelo pueden diferir en funcién de la herramienta de simulacién que se utilice. Ello es debido a que el orden en que se ejecutan los procesos activos en un mismo ciclo de simu- @ITES - Paraninfo 112 ASPECTOS AVANZADOS DEL LENGUAJE, laci6n (ver Capitulo 8) puede variar de un simulador a otro. Como las varia- bles se actualizan de forma inmediata al ser asignadas, es facil construir mo- delos no deterministas si dichas variables son compartidas 0 globales. Por ejemplo: entity ejemplo is port (...); -- lista de terminales de la entidad end ejemplo; architecture una of ejemplo is type opciones is (libre, ocupado); declaracién de una variable compartida local, visible por tanto en todo el cuerpo de la ~- arquitectura: shared variable estado_sv: opciones; ~ declaracién de un procedimiento que modifica un fichero en funci6n de sus propios ~- valores almacenados: procedure ejecuta_acciones is begin ~ cuerpo del procedimiento end ejecuta_acciones; begin ~ cuerpo de la arquitectura proceso_A: process begin wait until estado_sv = lib estado_sv:= ocupado; ejecuta_acciones; ejecucién del procedimiento declarado localmente end process proceso_A: proceso_B: process begin wait until estado_sv = libre; estado_sv:= ocupado; ejecuta_acciones; _-- ejecucién del procedimiento declarado localmente end process proceso_B; end architecture una; Claramente se advierte el comportamiento no determinista, ya que la condicién «estado_sv = libre» provoca la ejecucién del mismo procedimien- to en ambos procesos. Asi pues, el primero que se ejecute accede a manipu- lar los datos del fichero y la actuacién del segundo queda condicionada por lo efectuado por aquél. Si se simula de nuevo la descripcién anterior con otra herramienta, puede que el orden de ejecucién de los procesos cambie y, como resultado de ello, el contenido final del fichero sea completamente distinto. © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 113 6.5 ALIAS Los alias permiten representar un objeto o una parte del mismo me- diante un identificador alternativo mds corto, mas intuitivo 0 mds apropiado. Pueden, asimismo, ser aplicados a los restantes elementos del lenguaje (excepto etiquetas y pardmetros de bucles), aunque resulta menos habitual. Su sintaxis de declaracién es: alias [: tipo] is ; EI tipo resulta obligatorio en el caso de un elemento o de una parte de un array, Un ejemplo caracteristico de aplicacién o constituyen los bits de la palabra de estado de un procesador: signal FLAGS: bit_vector (1 to 7); alias ZERO: bit is FLAGS(1); alias OVERFLOW: bit is FLAGS(2); alias IRQ: bit is FLAGS(3); Es factible utilizar tanto las denominaciones originales como las alter- nativas que proporcionan los alias, pero estos mejoran la legibilidad. Otro ejemplo: signal DATA_WORD: bit_vector (15 downto 0); alias RESET: bit is DATA_WORD(4); alias READY: bit is DATA_WORD(S); Los alias permiten incluso cambiar la indexacién de un array: alias STATUS: bit_vector (0 to 3) is DATA_WORD (3 downto 0); alias DATA_BUS: bit_vector (0 to 7) is DATA_WORD (15 downto 8); También resultan de interés para la normalizacién de arrays, subpro- gramas, etc., que consiste en no especificar el tamafio concreto de sus pard- metros en la declaraci6n sino en el momento en que se utilizan. El concepto de normalizacién es importante para la facil reutilizacién del cédigo, aspecto @ITES - Paraninfo 114 ASPECTOS AVANZADOS DEL LENGUAJE, primordial tanto en VHDL como en todo Io relativo a la automatizacién de los disefios (EDA, Electronic Design Automation). Por ejemplo, la funcién "and" del paquete «IEEE.std_logic_1164» (Apéndice B) normaliza los arrays ly t con alias: function "and" (1,r: std_logic_vector) return std_logic_vector is alias Iv: std_logic_vector (1 to llength) is |; alias rv: std_logic_vector (1 to r'length) is r; Como se verd en el apartado siguiente, el atributo ‘length devuelve el niimero de elementos de un array, lo cual quedaré determinado al invocar a la funci6n, por haberla definido normalizada. Otro ejemplo: library IEEE; use IEEE.Std_Logic_1164.all; entity T is end T; architecture T_a of T is procedure X (variable L: inout std_logic_vector) is alias La: std_logic_vector (L'length downto 1) is L; begin La:= not La; — asignacién a La (equivalente a asignaci6n a L) end X; begin process variable A: std_logic_vector (1 to 4):= "1011"; variable B: std_logic_vector (4 downto 1): begin X(A); X(B); wait; end process; end T_a; 6.6 ATRIBUTOS Un atributo es una caracteristica asociada a un elemento del lenguaje que permite extraer informaci6n adicional del mismo, por ejemplo el valor del primer elemento de un tipo enumerado o el diltimo valor que ha tomado una determinada sefial en un cireuito. © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 115 Los atributos son aplicables a los siguientes elementos: — Entidades — Arquitecturas — Configuraciones — Paquetes — Subprogramas — Tipos y subtipos — Objetos — Componentes — Etiquetas — Literales — Unidades de un tipo fisico La sintaxis de aplicacién de un atributo consta de un apéstrofe seguido del identificador del mismo, afiadidos a continuacién del elemento asociado: ‘ATRIBUTO Esta notacién permite también definir el atributo de un atributo, como se verd en el siguiente subapartado. Desde un punto de vista general existen dos clases de atributos: los predefinidos por el estdndar y los definidos por el usuario. 6.6.1 Atributos predefinidos Existen cuatro clases de atributos predefinidos: — Detipodedato _: devuelven el nombre del tipo base — De valor : devuelven un valor constante — De funcién : invocan a una funcién que devuelve un valor — De sefial :crean una nueva sefial — De rangos de arrays : devuelven el valor del rango En la Tabla 6.1 se muestran los mas utilizados, que constituyen a su vez la inmensa mayoria de los aprobados hasta el momento. @ITES - Paraninfo 116 ASPECTOS AVANZADOS DEL LENGUAJE ATRIBUTO. TIPO [DESCRIPCION de tipo _| tipo base de un tipo o subtipo de valor___| valor mas a Ta izquierda de un tipo escalar de valor __| valor masa la derecha de un tipo escalar de valor___| valor en la posicion superior de tipo escalar de valor__| valor en la posicion inferior de tipo escalar ‘Alength [001 ae ae del rangon de un array Rascending [(@)] __[de valor _ | devuelve true si rango n ascendente (idem) posicion del valor x en el rango de un tipo Tipos(x) de funcién | enumerado, entero o fisico, Devuelve valor entero, de 0 en adelante valor de Ia posicién x en el rango de un tipo Tval(x) de funcién | enumerado, entero o fisico (x entero entre 0 y n° maximo de elementos que contiene T) Tsucetx) de funcion_| valor de la posicion siguiente al valor x Tpred(@ de funcion_| valor de la posiciGn previa al valor x Tlefiof) de funcion_| valor ala izquierda del valor x Trightofix) de funcion_| valor ala derecha del valor x lef [c)] de funcion | Yor izquicrdo del indice n de un array (a=I por defecto) Aright (@)] de funcion_| valor derecho indice n de un array (idem) Ahigh (a1 de funcion_| valor superior indice n de un array (idem) Atow (n)] ‘de funcion_| valor inferior indice n de un array (idem) . =, | dewuelve valor true si se produce un evento en Stevent de funcién ae la senal $ ee de funcion | vuelve true si sefial recibe asignacion (sefial activa) S'last_event S'last_active de funcién: de funcién Tiempo desde ditimo evento en Ta sefial S tiempo transcurrido desde wltima asignacion a la sehal $ Silast_value de funcién valor anterior de la sefial devuelve sefial idéntica a § retrasada un tiem- S'delayed [(0] de sefial |e ced por defectoy on ~ | devuelve sefial de valor rue si no ha ocurrido S'stable [(0] de sefial | evento en § durante el tiempo t (idem) Sau TOI Tewehay | vuelve sefial de valor irue si § no ha recibi- a do asignacién durante el tiempo t (idem) 3 ~ | devuelve seal de tipo bir que conmuta cuan= poaueeeia de sefial | do § recibe una asignacién ({dem) ‘Arrange [a] de rango | devuelve el rango del indice n de unarray ‘Arreverse_range [ny] Tabla 6.1 © ITES - Paraninfo de rango devuelve tango inverso indice n de un array Atributos predetinidos mas importantes DISENO DE SISTEMAS DIGITALES CON VHDL 117 Ejemplos: ~ clk’event devuelve el valor rue si hay un cambio en la sefial «clk»: if clk='I' and clk'event ... ~R’stable(2 ns) devuelve una sefial booleana de valor true si «R» estuvo estable durante 2 ns if R='1' and R'stable(2 ns) ... ~- b’range devuelve el rango de valores de un array; p.c.: 15 downto 0, 7 to 12, etc, signal a: std_logic_vector (b‘range); Es conveniente hacer constar que para rangos ascendentes: — T'suce(x) y T'rightof(x) coincide, siempre que x no sea el valor més a la derecha. Si lo fuese, la aplicacién de estos atributos devolverfa un error. Del mismo modo, T’pred(x) y Tleftof(x) coinciden si x no es el valor ms a la izquierda. Anélogamente, para rangos descendentes: — Tsuce(x) = Tleftof(x) si x no es el valor més a la izquierda = Tpred(x) = La misma analogfa es aplicable a los atributos de arrays: = Ailefi(N) = A'low(N) y A'right(N) = A‘high(N) para rangos ascendentes = Ailefi(N) = A’high(N) y A'right(N) = A'low(N) para rangos descendentes Y también a los atributos Teft, Tright, T'low y Thigh de los tipos es- calares. Por ejemplo: ‘tightof(x) si x no es el valor més a la detecha type A is range 15 downto 0; -- Alleft = A’high = 15; Aight = Allow =0 type DIAS is (L, M, X, J, V, S, D); ~ DIASteft = DIASTow = L; DIAS'right = DIAShigh = D subtype B is DIAS range V downto L; -- Bleft = Bhhigh = V; Bright = Blow = L. Los atributos de sefial crean nuevas sefiales, que se denominan sefiales implicitas, y pueden por tanto generar a su vez nuevos eventos al igual que cualquier otra sefial, como puede verse en la Figura 6.6. CLKI'delayed (7 ns), CLKI'stable (9 ns), CLK2‘quiet (5 ns) y CLK2'transaction constituyen ejemplos de sefiales implicitas. Sin embargo, los atributos ‘event, ‘active, ‘last_event, ‘last_active y ‘last_value no crean nuevas seiiales. Mas ejemplos: integer left devuelve 1-2" natural’ left - devuelve 0 @ITES - Paraninfo 118 ASPECTOS AVANZADOS DEL LENGUAJE “4? CLK1 o 7ns 4 CLK1'delayed(7ns) TRUE 9ns CLK1’stable (9 ns) FALSE Mismo valor asignado CLK2 TRUE CLK2quite (5 ns) J 5ns FALSE CLk2'transaction | 9° (valor inicial no definido) Figura 6.6 Ejemplos de atributos de sefial type tabla is array (1 to 5, 7 downto 0) of bit; signal linea: bit_vector (15 downto 0); signal matriz: tabla; linea' left —devuelve 15 linea'right(1) 0 linea'right — —devuelve 0 matriz'left(1) 0 matriz'left_ — devuelve 1 matriz'right(2) —- devuelve 0 matriz'left(2) -- devuelve 7 matriz’high(1) -- devuelve $ linea'low -- devuelve 0 matriz'ascending(2) -- devuelve false matriz'length(2) linea'range linea'reverse_range © ITES - Paraninfo -- devuelve 0 to 15 DISENO DE SISTEMAS DIGITALES CON VHDL 119 type vocales is (‘a','¢,'i,'0',u'); type diames is integer range | to 31; diames'high ~devuelve 31 vocales'pos('i’) -- devuelve 3 vocales'val(1) -- devuelve ‘a’ Ejemplos de atributo de un atributo: vocales'base ~- devuelve character vocales'base'left -- devuelve NUL process (reloj’stable(2 ns)) Of reloj’stable(2 ns)’event vocales'pos(vocales'val(2)) -- equivale a vocales'pos(e’)y por tanto devuelve 2 6.6.2 Atributos definidos por el usuario VHDL permite definir nuevos atributos aparte de los ya contemplados por la norma. Para ello se precisan dos sentencias: — Declaracién del atributo, asociando su identificador a un tipo de dato: attribute : tipo_dato; — Especificacion, definiendo a qué elemento se asocia el atributo (sefial, tipo, funcién, entidad, etc.) y el valor que devuelve: attribute of : is ; Ejemplos: ~Declaraciones: attribute Npin: integer; attribute retardo, retardo_puerta: time; ~ Especificaciones attribute Npin of LSI: entity is 32; attribute retardo of all: signal is 10 ns; ~ también vélido of others @ITES - Paraninfo 120 ASPECTOS AVANZADOS DEL LENGUAJE, attribute retardo_puerta of NAN2T: entity is 15 ns; type dias_de_la_semana is (L, M, X, J, V, S, D); = Declaracion attribute dia_inicial: dias_de_la_semana; attribute dia_final: dias_de_la_semana; attribute no_dias_semana: integer; -- Especificacione: attribute dia_inicial of dias: signal is L; attribute dia_final of dias: signal is D; attribute no_dias_semana of all: signal is 7; E] atributo «dia_inicial» se aplica a la sefial «dias» y devuelve el valor «L» correspondiente al tipo «dias_de_la_semana». De forma similar, el atri- buto «no_dias_semana» se aplica a todas las sefiales y devuelve el entero 7: signal dias, tmp_dia: dias_de_la_semana; signal tmp: integer; tmp_dia<= dias'dia_inicial; ~tmp_diac=L tmp<= dias'no_dias_semana; ~tmp<=7 for dias'dia_inicial to dias'dia_final loop -- Bucle de LaD end loop; Solamente se pueden asociar valores constantes a los atributos defini- dos por el usuario. Los atributos mejoran la flexibilidad y la reutilizacién de un disefio. Asi, puede cambiarse un pardmetro de un objeto (tamafio, rango, longitud, etc.) sin cambiar el modelo, utilizando atributos sin indicacién numérica: for Lin Sl'range loop ~ rango de bucle for I in (SI'length-1) downto 0 loop for Lin S'high to S'‘low S(SI'range): ~ asignacién a un subconjunto de un array S2(Shigh others =>'L'); ~ asoci agregada Asimismo, en los subprogramas es importante no restringir los rangos de los parémetros formales de un array, ni fijar su direccién (normalizacién de subprogramas), y que sea la ejecucién de propio subprograma quien lo haga. Para ello se han de utilizar correctamente los atributos. Por ejemplo: © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 121 entity EJEMPLO is end; architecture ERRONEA of EJEMPLO is function ERRONEA (A: bit_vector) return bit_vector is ~- La longitud y la direccién de los siguientes arrays se heredan del pardmetro local ~ cuando se invoque la funcién variable A_v: bit_vector(A'range); variable B_v: bit_vector(A'range); begin A intercambio: for K in A'length - 1 downto 0 loop A_v(K):= B_v(A'length - 1 - K); end loop INTERCAMBIO; return A_y; end ERRONEA; signal T6d_s: bit_vector(7 downto 2):= "100111"; T6a_s <= ERRONEA (T6d_s rror!, ya que en la primera ejecucién del bucle intercambio» aparece T6d_s(0), que no existe jem con T8a_s(0) T8d_s <= ERRONEA (T8a_s end ERRONEA; Se soluciona eligiendo adecuadamente los atributos para normalizar la funcisn: architecture CORRECTA of EJEMPLO is function CORRECTA (A: bit_vector) return bit_vector is ~ Ahora la direccién de los arrays se define aqui variable A_v: bit_vector(A'length - | downto 0); variable B_v: bit_vector(A'length - | downto 0); begin A. AS B_v=A; INTERCAMBIO: for K in A'/ength - | downto 0 loop A_v(K)= B_v(A'length - | - K); end loop INTERCAMBIO; return A_v; end CORRECTA; signal T6d_s: bit_vector(7 downto 2):= "100111"; signal T8a_s: bit_vector(1 to 8):= "01001111"; @ITES - Paraninfo 122 ASPECTOS AVANZADOS DEL LENGUAJE, signal T6a_s: bit_vector(| to 6); signal T8d_s: bit_vector(7 downto 0); begin T6a_s<= CORRECTA (T6d_s); —Correcto T8d_s<=CORRECTA (T8a_s); ~ {dem end CORRECTA; 6.7 SOBRECARGA DE FUNCIONES Y OPERADORES VHDL permite declarar varios subprogramas con el mismo identifica- dor pero diferentes parémetros y/o funcionalidad. Supéngase la funcién pre- definida de suma entre niimeros enteros: function "+" (A, B: integer) return integer; En un modelo puede resultar necesario utilizar esta funcién y ademas otra que sume nimeros binarios. Una posibilidad es declarar la nueva fun- ci6n con un identificador distinto: function suma_binario (A, B: bit_vector) return bit_vector; Sin embargo, el lenguaje permite que la nueva funcién comparta iden- tificador con otra ya existente. Es decir, es totalmente licita la declarac’ function "+" (A, B: bit_vector) return bit_vector; La funci6n u operador "+" se dice entonces que est sobrecargada. El compilador diferencia una de otra por los parémetros locales con los que son invocadas. Por ejemplo: signal vector1, vector2, resultadol:: bit_vector (15 downto 0); signal enterol, entero2, resultado2: integer range 0 to 1023; resultadol<= vector] + vector2; resultado2:= enterol + entero2; resultadol<= vector! + enterol; se invoca la segunda funcién se invoca la primera funcién iError! En efecto, al ejecutar Ia tiltima sentencia se producirfa un error por no existir una funcién "+" que acepte un binario y un entero como pardmetros. © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 123 Todos los operadores predefinidos estén sobrecargados para poder realizar operaciones con distintos tipos de datos (ver Apéndice B). Otro ejemplo: type colores is (rojo, amarillo, azul, verde, blanco, negro, naranja); variable mezcla: colores; variable suma: integer; mezcla:= rojo + amarillo; suma:= 10 + 2; La variable «mezcla» tomarfa por ejemplo el valor naranja como re- sultado de la «suma» de rojo y amarillo, Evidentemente en VHDL no existe esta suma predefinida, por lo que es preciso declararla. Si para ello se utiliza el identificador "+", entonces el operador predefinido "+" se sobrecarga: function "+" (A, B: colores) return colores; Si se declara una funcién sobrecargada con el nombre de un operador predefinido, existen dos formas de invocarla: — Mediante la notacién de operador estandar: rojo + amarillo; — Mediante la notacién estandar de llamada a funcién, en cuyo caso se indi- ca el operador entre comillas seguido por los operandos entre paré ntesis: = "+" (rojo, amarillo); Del mismo modo, el lenguaje permite sobrecargar los procedimientos (como es el caso de los declarados en el paquete textio, Apéndice B), asi como los literales (ver Apartado 6.12). 6.8 FIRMAS En ocasiones no es posible distinguir entre dos operadores 0 dos literales sobrecargados. Para deshacer estas ambigiiedades se utilizan las firmas. @ITES - Paraninfo 124 ASPECTOS AVANZADOS DEL LENGUAJE, Una firma es una determinada informacién que se afiade en las decla- raciones de alias o de atributos, o bien en las especificaciones de estos ilti- mos, que permite distinguir un subprograma o un literal sobrecargado indi- cando los tipos de los pardmetros y/o del resultado. La sintaxis de declaracién es la siguiente: [[tipo, {tipo}] [return tipo] ] en la cual, los corchetes més externos son obligatorios. Como ejemplo, supéngase una funcién sobrecargada que acepta dos tipos de parémetros: conversion_: conversion_: \_decimal (A: bit_vector) return integer; \_decimal (A: std_logic_vector) return integer; Si se declara un alias para la segunda funcién, el compilador no tiene forma de conocer a cual se hace referencia: alias CD is conversion_a_decimal; Sin embargo, la ambigiiedad se deshace aifiadiendo una firma en la de- claracién: alias CD is conversion_a_decimal [std_logic_vector return integer]; De este modo queda determinado con claridad que el alias correspon- dea la segunda funcién. En el caso de la primera, la firma habria sido: [bit_vector return integer] Ejemplos de firmas en la especificacién de atributos: function mvl (op: integer; longitud: natural) return mvl; function mvl (op: bit_vector; longitud: natural) return mvl; attribute xx: boolean; attribute xx of mvl [integer, natural return mvl]: function is false; attribute xx of mvl [bit_vector, natural return mvl]: function is true; © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 125 6.9 FUNCIONES DE RESOLUCION Una funcién de resolucién decide qué valor ha de tomar una sefial cuando se le aplican dos 0 mas valores simultaneamente. En el circuito de la Figura 6.7 la salidas de la puerta AND y del inversor estén conectadas. Ello representa una situacién real posible en algunas tecnologias, por lo que ‘VHDL debe disponer de recursos adecuados para modelarla. Se hace necesa- ria la existencia de un método para resolver el valor que ha de tomar el nodo «net1», Para ello se asocia a éste una funcién de resolucién. Este es un tipo de funci6n que recibe como entradas todos los valores asignados a «netl» y decide el valor resultante. signal net]: resolv_and bit; -- se asocial la funcién «resolv_and» ala sefal «net» and_ 1: port map (A, B, net1); ort map (C, net1); La funci6n de resolucién «resolv_and» podria presentar el aspecto si- guiente: function resoly_and (A: bit_vector) return bit is begin for Lin A’range loop if AD = return end if; end for; return ‘1’; end resolv_and; Es decir, la funcién se ha definido para realizar una «Y por conexién» (wired-and). eal tt | a Figura 6.7 Conflicto entre sefales @ITES - Paraninfo 126 ASPECTOS AVANZADOS DEL LENGUAJE, Volviendo sobre la sintaxis de declaracién de un subtipo de datos (in- troducida en el Apartado 3.5): subtype is [funcién de resolucin] [rango]; se puede observar que aparece como opcional la asociacién de una funcién de resoluci6n. En el caso de ser incluida, se dice que el subtipo declarado es resuelto. Una sefial de un tipo resuelto puede recibir més de una asignacién o driver. Los tipos bisicos predefinidos no son resueltos. Un ejemplo de tipo resuelto muy utilizado es std_logic, definido en el paquete «IEEE.std_logic_1164» (ver Apéndice B): subtype std_logic is resolved std_ulogic; en donde «resolved» es la funcisn de resolucién asociada y sid_ulogic el tipo base no resuelto (la «u» indica unresolved), definido, asimismo, en el paque- te mencionado. En el caso de no asignar una funcién de resolucién a una sefial de un tipo no resuelto con mas de una asignaci6n, se produce un error en la fase de elaboracién (ver Apartado 8.3). 6.10 SENTENCIA GENERATE Esta sentencia concurrente resulta de interés para reducir ostensible- mente porciones de cédigo repetitivas 0 dependientes de determinadas con- diciones. Asi, es posible instanciar un gran ntimero de componentes idénti- cos en pocas sentencias bajo el control de un indice o de una condicién. Su sintaxis de declaracién es: : for | if generate _-- etiqueta obligatoria [-- Zona opcional de declaraciones begin] ~ Sentencias concurrentes end generate []; En el siguiente ejemplo se muestra su aplicacién para modelar un de- tector-generador de paridad, constituido por puertas OR-exclusiva (Figura 6.8). Se declara un puerto genérico «no_bits», para especificar el nimero de © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 127 entradas del circuito. La sentencia generate utiliza un bucle para dar lugar a un modelo de tamaiio independiente de dicho nimero. library IEEE; use IEEE.std_logic_1164.all; entity PARIDAD is generic (no_bits: integer:= 32); port (IN_DATA: in std_logic_vector (no_bits-1 downto 0); PARITY: out std_logic ); end PARIDAD; architecture ARBOL_XOR of PARIDAD is signal TMP: std_logic_vector (no_bits-1 downto 0); begin TMP(no_bits-1)<= IN_DATA(no_bits-1); PARITY <= tmp(0); GEN_ARBOL: for I in no_bits-2 downto 0 generate TMP(1)<= IN_DATA() xor TMP(I+1); end generate; end ARBOL_XOR; Para el modelo del circuito de la Figura 6.9 se hace uso combinado de for-generate c if-generate: jestable J-K activado por flancos a nivel estructural con generate 'e supone que las puertas estén disponibles en la biblioteca «work» library ieee; use ieee.std_logic_1164.all; entity bIK is port (R,S,J,K,CLK,OE: in std_ulogic; Q.nQ: out std_ulogic); end bK; IN_DATA(O) IN_DATA(1) IN_DATA(2) PARITY IN_DATA(n-1) Figura 6.8 Detector-generador de paridad con puertas OR-exclusiva @ITES - Paraninfo 128 ASPECTOS AVANZADOS DEL LENGUAJE Figura 6.9 Biestable JK activado por flancos ascendentes architecture estructural_con_generate of bJK is component Pnand3T port (A,B,C,OE: in sid_ulogic; Y: out std_ulogic); end component; component Pnor2T port (A,B,OE: in std_ulogic; Y: out std_ulogic); end component; component Pand4T port (A,B,C,D,OE: end component; component puertaNOT port (A,OE: in sid_ulogic; Y: out std_ulogic); end component; signal N: std_ulogic_vector(1 downto 0):= "00"; signal P: std_ulogic_vector(1 to 8):= "00000000"; type entradas is array(1 to 4) of std_ulogic; std_ulogic; Y: out std_ulogic); © ITES - Paraninfo DISENO DE SISTEMAS DIGITALES CON VHDL 129 type matriz is array(1 to 8) of entradas; signal g: matriz; begin g(1)<= (S,P(8),P(2),'0');___g(2)<= (P(1),CLK,R,'0); 9(3)<= (P(2),CLK,P(8),0.);_g(4)<= (S,P(2),PG), 2(5)<= (P),P(3),R,0); —_(6)<= (P3),R,K,P(4)); g(7)<= (P3),RJ,PS)); ——_g(8)<= (P(6),P(7),'0'0); PUERTAi: for i in 1 to 8 generate puertal: if (i<6) generate puerta_nand: Pnand3T port map (g(i)(1), g(i)(2), g(@)(), 0’, P@); end generate puertal; puerta2: if (i>S and i<8) generate puerta_and: Pand4T port map (g(1), g@2), G3), g@A), '0', PA); end generate puerta2; puerta3: if (i=8) generate puerta_nor: Pnor2T port map (g(i)(1), g(4)(2), '0', PG); end generate puerta3; end generate PUERTAi; NI: puertaNOT port map (A => P(4), OE => OE, Y => N(1)); NO: puertaNOT port map (A => P(5), OE => OE, Y => N(0)); Q<= N(0); nQ<= N(1); end estructural_con_generate; 6.11 CONVERSION DE TIPOS. CONVERSIONES IMPLICITA Y EXPLICITA En general no es posible la asignacién de valores entre objetos de ti- pos distintos, por lo que es preciso utilizar funciones de conversi6n, En este caso se habla de conversién explicita de tipos. Algunos paquetes normaliza- dos como «std_logic_1164» 0 los dos numéricos («numeric_bit» y «nume- ric_std>) (Apéndice B) contienen un amplio conjunto de funciones de con- version para facilitar el modelado del hardware. Por ejemplo, la siguiente funcién del paquete «icee.numeric_bit»: function TO_INTEGER (ARG: signed) return integer; convierte un operando de tipo signed, declarado en el mismo paquete, a su equivalente entero. Sin embargo, existe también lo que se denomina conversién implicita entre tipos de datos «préximos», que no precisa de una funcién de conver- @ITES - Paraninfo

También podría gustarte