Beruflich Dokumente
Kultur Dokumente
circuitos
digitales. Estos lenguajes facilitan la descripcin del funcionamiento y la estructura de los circuitos, as como la codificacin de sus
bancos de pruebas, que sirve como entrada para las herramientas software de simulacin y sntesis.
En este texto se explican metodologas bsicas para el diseo con VHDL de circuitos digitales combinacionales y secuenciales,
emplendose aquellas capacidades del lenguaje que son relevantes en el diseo para sntesis, as como en la programacin de
bancos de pruebas. A lo largo del texto se muestran diferentes ejemplos de diseo y test de circuitos, y se plantean ejercicios prcticos,
proporcionndose en todos los casos el cdigo VHDL completo, disponible tambin en el CD-ROM que acompaa al texto.
Alfonso Urqua Mora leda es licenciado en CC. Fsicas por la Universidad Complutense de Madrid y doctor en CC. Fsicas por la
UNED. Durante el periodo 1996-2001 ha trabajado como Ingeniero de I+D en la empresa AT&T Microelectrnica Espaa (posteriormente
Lucent Technologies- Bell Labs y Agere Systems) en Tres Cantos (Madrid), puesto en el cual ha participado en numerosos proyectos
relacionados con la fabricacin de circuitos integrados. Desde el ao 1995 ha ocupado diferentes puestos docentes dentro del
Departamento de Informtica y Automtica de la UNED, en el cual actualmente es profesor titular de universidad.
Carla Martn Villalba se gradu en Ingeniera Electrnica por la Universidad Complutense de Madrid en 2001 y obtuvo su grado
de doctor en Informtica con Mencin Europea por la UNED en 2007. Desde el ao 2004 ha ocupado diferentes puestos docentes
en el Departamento de Informtica y Automtica de la UNED. Desde 2010 es profesor contratado doctor y centra su labor investigadora
en el modelado, la simulacin por ordenador y la enseanza a distancia.
.LSBN: 978-84-362-6274-2
Editorial
01201
coleccin
Grado
9 788436 262742
7101201 GR01A01
COLECCIN GRADO
Diseo y anlisis
de circuitos digitales
con VHDL
Madrid 2011
Librera UNED: el Bravo Murillo, 38- 28015 Madrid
Tels.: 91 398 75 601 73 73
e-mail: libreria@adm.uned.es
Alfonso Urqua Moraleda y Carla Martn Villalba
NDICE
Prefacio
25
25
26
Objetivos docentes
27
. . . . . . . . . .
29
33
34
35
35
36
..
38
39
42
47
47
49
50
50
51
52
. ..
54
55
56
. . .
57
58
63
63
64
70
72
76
1.8.5. Configuracin ..
78
79
79
80
82
83
87
91
2.1. Introduccin . . . .
95
95
2.3. Entity . . . . . . .
97
57
98
100
2.3.3. Declaraciones
101
2.3.4. Sentencias .
101
NDICE
101
2.4. Architecture . . . . . . . .
102
104
104
107
110
114
. . . . . . . . .
115
115
116
2. 7. Bloque process
. . . .
116
118
120
2. 8. Cdigo secuencial . . . . . .
122
122
124
2.8.3. Sentencia if . .
124
128
132
135
139
2.10. Parametrizacin . . . . . . . . . . . . .
142
142
142
143
145
146
149
154
156
163
163
2.13. Atributos
166
2.14. Libreras
167
2.15. Assert .
169
2.16. Subprogramas
170
2.16.1. Funciones
170
2.16.2. Procedimientos
172
175
2.17. Paquetes . . . . . . . . .
176
179
180
187
201
3.1. Introduccin . . . . . . . . .
. 205
. 206
. 207
3.4. Drivers . . . .
. 208
3.5. Inicializacin
. 211
10
. 212
. 213
. 216
. 219
. 221
NDICE
226
230
231
240
273
4.1. Introduccin .
. ...... .
277
277
278
280
. . .
280
280
281
285
285
286
. . .
291
291
293
296
301
302
302
306
306
308
11
. 313
314
321
5. Registros y memorias
5.1. Introduccin . . .
357
357
358
358
360
361
364
368
368
369
371
375
376
378
378
380
384
12
353
386
386
388
389
391
392
NDICE
415
6 .l. Introduccin . . . . . . . .
. 419
. 419
. 420
. 422
. 423
. 423
6.3.3. Retardos . . .
. 423
6.3.4. Inicializacin
. 424
. 424
6.4. Flip-flop JK . . . . . .
. 425
. 426
. 426
. 430
. 430
. 433
. 437
. 439
. 439
. 445
. 448
. 451
. 452
. 463
513
13
7 .1. Introduccin . . . . . . .
. . . .
. . .
. 517
518
518
7.2.2. Programa RT . . . .
. 520
. 522
. 522
. 523
...
. 523
. 525
. 528
. 530
. 531
. 532
. 532
. 537
7. 7. Lecturas recomendadas . . . ..
. 540
. 541
. 545
APNDICES
561
A. VeriBest VB99.0
561
A.l. Instalacin . .
. 563
. 563
14
. 563
. 563
. 564
. 565
NDICE
566
569
570
570
571
571
574
577
B .l. Instalacin . . . . . . . . . . .
579
579
580
581
582
586
588
591
591
593
594
595
15
CDIGO VHDL
17
130
Decodificador binario de 2 entradas. . .
130
Codificador 4 a 2 con prioridad . . . . .
133
XOR bit a bit de dos seales de 4 bits.
134
XOR de los bits de una seal de 4 bits.
Descripcin estructural al nivel de puertas lgicas de un multiplexor
137
de dos seales de un bit. . . . . . . . . . . . . . . . . . . . . . .
2.20. Descripcin estructural de un multiplexor de 2 seales de 4 bit.
138
140
2.21. Array de 8 puertas AND. . . . . . . . . . . . . . . . . . . . . . .
2.22. Detector de paridad de 8 bits. . . . . . . . . . . . . . . . . . . .
141
2.23. La funcin conv_integer convierte un parmetro del tipo std_logic_vector
a un entero. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
2.24. Procedimiento que devuelve dos parmetros de entrada ordenados. . 175
2.25. Definicin de una funcin en un package. .
178
2.26. Uso de una funcin definida en un package. . . . . . . . . .
178
2.27. Diseo correspondiente al Ejercicio 2.3. . . . . . . . . . . . .
181
2.28. Diseo y banco de pruebas correspondientes al Ejercicio 2.1.
188
2.29. Diseo correspondiente al Ejercicio 2.2. .
189
2.30. Diseo del circuito "one-shof'. . . . . . . . . . . . .
191
2.31. Banco de pruebas del circuito "one-shof'. . . . . . .
192
193
2.32. Diseo de un decodificador 2:4 con entrada enable. .
194
2.33. Banco de pruebas de un decodificador 2:4 con entrada enable.
231
3.1. Cdigo correspondiente al Ejercicio 3.1.
3.2. Cdigo correspondiente al Ejercicio 3.2.
232
232
3.3. Diseo del Ejercicio 3.3. . . . . . .
3.4. Banco de pruebas del Ejercicio 3.3.
233
3.5. Diseo del Ejercicio 3.4. . . . . . .
234
235
3.6. Banco de pruebas del Ejercicio 3.4.
3. 7. Diseo correspondiente al Ejercicio 3.5.
236
3.8. Banco de pruebas correspondiente al Ejercicio 3.5.
237
238
3.9. Puerta NAND con retardo inercial y su banco de pruebas.
3.10. Diseo del Ejercicio 3.7. . . . . . . . . . . . . . . . . . . .
239
281
4.1. Diseo mediante la descripcin de las funciones lgicas. . .
4.2. Banco de pruebas del circuito que implementa las dos funciones lgicas.282
4.3. Diseo de un MUX 4:1 mediante una sentencia if. . . . .
286
287
4.4. Descripcin del MUX 4:1 mediante sentencias if y case.
4.5. Banco de pruebas del MUX 4: l. . . . . . . . . . . . . . .
288
4.6. Descripcin errnea de la architecture del MUX 4:1. . .
289
4.7. Diseo de un MUX 4:1 mediante una sentencia concurrente.
290
4.8. Diseo de un MUX 4:1 mediante dos sentencias concurrentes.
290
2.15.
2.16.
2.17.
2.18.
2.19.
18
CDIGO VHDL
4.9.
4.10.
4.11.
4.12.
4.13.
4.14.
4.15.
4.16.
4.17.
4.18.
4.19.
4.20.
4.21.
4.22.
4.23.
4.24.
4.25.
4.26.
4.27.
4.28.
4.29.
4.30.
4.31.
4.32.
4.33.
4.34.
4.35.
4.36.
4.37.
4.38.
4.39.
19
20
338
340
341
342
343
344
345
348
348
349
350
351
351
352
358
359
362
365
366
367
369
370
373
377
379
381
382
385
CDIGO VHDL
5.15.
5.16.
5.17.
5.18.
5.19.
5.20.
5.21.
5.22.
387
388
390
391
397
398
398
399
400
401
402
403
405
406
407
408
409
410
411
412
413
427
428
429
432
433
435
436
438
441
21
22
CDIGO VHDL
6.41.
6.42.
6.43.
6.44.
6.45.
6.46.
6.47.
6.48.
6.49.
6.50.
6.51.
6.52.
6.53.
6.54.
6.55.
6.56.
6.57.
7.1.
7.2.
7.3.
7.4.
7.5.
7.6.
7. 7.
7.8.
7.9.
7.10.
7.11.
23
24
PREFACIO
25
26
PREFACIO
Por regla general, los ejemplos mostrados en los Temas 3 a 7 estn completamente
desarrollados. Es decir, cada diseo est acompaado de su banco de pruebas. Es
muy recomendable que el alumno realice las simulaciones de estos diseos por s
mismo, familiarizndose de esta forma con el manejo del entorno de simulacin y
con la interpretacin de los resultados de las simulaciones.
Como actividad complementaria se sugiere al alumno que introduzca variaciones
en los diseos y en los bancos de pruebas propuestos en la parte terica de los temas,
realizando por s mismo las simulaciones y la interpretacin de los resultados.
Al final de cada tema se plantean ejercicios de autocomprobacin y se explican
sus soluciones. La forma en que se deberan trabajar los ejercicios es la siguiente. En
primer lugar, el alumno debera estudiar la parte de teora del tema. A continuacin,
debera intentar resolver por s mismo los ejercicios de ese tema, sin consultar para
ello la parte de teora. Una vez el alumno ha desarrollado su solucin al ejercicio,
debera compararla con la solucin propuesta en la Unidad Didctica.
OBJETIVOS DOCENTES
Como objetivos docentes fundamentales, con esta Unidad Didctica se pretende
que el alumno adquiera las capacidades siguientes:
l. Discutir las diferentes etapas del ciclo de diseo de circuitos digitales y el uso
de los lenguajes para la descripcin del hardware (HDL) en cada una de ellas.
27
TEMA 1
1.1. Introduccin
1.2. Lenguajes para la descripcin de hardware
1.3. Ciclo de diseo de los circuitos digitales
1.4. Tecnologas de circuitos integrados
1.5. Propiedades de los circuitos digitales
1.6. Test de los circuitos
l. 7. Representaciones y niveles de abstraccin
OBJETIVOS DOCENTES
Una vez estudiado el contenido del tema y realizados los ejercicios prcticos,
debera saber:
- Discutir la finalidad de los lenguajes para la descripcin del hardware (HDL)
y algunas de las principales ventajas que presenta su uso.
- Discutir el ciclo de diseo del hardware digital y el papel que desempean en
el ciclo de diseo los HDL.
- Discutir y comparar las caractersticas de las siguientes tecnologas de fabricacin de circuitos integrados: full-custom ASIC, standard cell ASIC, gate array
ASIC, dispositivos programables en campo (FPGA, CPLD, PROM, PAL y
PLA), y componentes estndar de pequeo y medio tamao.
- Discutir las siguientes propiedades de los circuitos digitales: el retardo de
los dispositivos, su ejecucin concurrente, la marginalidad en el diseo y la
fortaleza de las seales.
- Discutir el propsito y los fundamentos del test en diseo y manufactura, as
como los conceptos: modelo de fallos, cobertura del test y calidad del test.
- Discutir la utilidad y composicin de los bancos de pruebas.
- Discutir y comparar los niveles de abstraccin y representacin de los sistemas
digitales.
- Instalar en su propio ordenador y realizar las operaciones bsicas de manejo
de algn entorno de simulacin de VHDL'93 de su eleccin. Estas operaciones
bsicas incluyen al menos la edicin de modelos VHDL, su depurado usando
el debugger, su simulacin y la visualizacin de los resultados.
31
1.1.
INTRODUCCIN
Los sistemas digitales se han ido haciendo ms y ms complejos durante las pasadas dcadas. Este incremento en la complejidad responde, a grandes rasgos, a la Ley
de Moore, segn la cual el avance tecnolgico posibilita que cada aproximadamente
18 meses se doble el nmero de transistores que es posible alojar en un circuito
integrado.
De esta forma, en la dcada de 1970 un circuito integrado tpico contena decenas
de miles de transistores. En la dcada de 1980, la capacidad aument a cientos de
miles de transistores, y en la dcada de 1990 fue del orden de decenas de millones.
En la dcada de 2000, la capacidad de los circuitos integrados es del orden de miles
de millones de transistores.
Cuando se fabricaba un circuito integrado en la dcada de 1970, se documentaba
su funcionamiento empleando una combinacin de esquemticos (representacin grfica de los componentes del circuito), diagramas de transicin de estados y lenguaje
natural (por ejemplo, ingls). Esta documentacin poda consistir en varios cientos
de pginas. Los ingenieros, que compraban el circuito integrado para usarlo en sus
propios diseos, tenan que leer esta documentacin para entender el funcionamiento
del circuito integrado. Como puede imaginarse, leer cientos de pginas no era tarea
fcil. Adems, en ocasiones la documentacin contena errores o ambigedades. La
consecuencia de ello era que frecuentemente los ingenieros tenan problemas para
emplear los circuitos integrados en el desarrollo de sus propios sistemas.
Debido a esta situacin, el Departamento de Defensa de EE.UU. busc un procedimiento mediante el cual los fabricantes de circuitos integrados pudieran especificar
de forma precisa el funcionamiento de los circuitos. Con esta motivacin, el Departamento de Defensa de EE.UU. inici el desarrollo de un lenguaje para la descripcin
del hardware, para lo cual estableci un grupo de trabajo compuesto por expertos
de varias disciplinas, pertenecientes a diferentes compaas.
Un lenguaje para la descripcin del hardware o HDL (siglas que provienen del ingls: Hardware Description Language) es un lenguaje, legible tanto por las mquinas
como por los seres humanos, ideado para describir tanto el comportamiento como
la estructura del hardware. El HDL permite describir de forma precisa y rigurosa
el funcionamiento del circuito digital, el cual puede ser simulado en un ordenador
con el fin de reproducir exactamente el funcionamiento del circuito. La simulacin
por ordenador permite obtener el valor de las seales de salida del circuito para una
determinada secuencia de seales de entrada.
33
1.2.
34
1.2.1.
- Documentacin formal. Un programa HDL puede ser usado como una especificacin formal de un sistema digital. Se trata de un tipo de documentacin
explcita y precisa acerca del sistema, que es intercambiable entre diferentes
diseadores y usuarios.
- Entrada a un simulador. La simulacin por ordenador del circuito permite
estudiar y comprobar su operacin, sin necesidad de tener que construir fsicamente el circuito. La entrada al simulador es el programa HDL que describe
el circuito, as como la descripcin, tambin en el HDL, de los vectores de
test que deben aplicarse al circuito. Durante la ejecucin de la simulacin, el
simulador interpreta el cdigo HDL y genera las respuestas del circuito.
- Entrada a una herramienta de sntesis. El flujo de diseo del hardware digital se basa en un proceso de refinamiento, que convierte gradualmente una
descripcin de alto nivel del sistema a una descripcin estructural de bajo
nivel. Algunos de estos pasos de refinamiento pueden ser realizados por las
herramientas software de sntesis.
Las herramientas software de sntesis aceptan como entrada la descripcin
HDL del circuito y componen el correspondiente circuito empleando para ello
los componentes proporcionados en una librera. La salida de la herramienta de
sntesis es un nuevo programa HDL con la descripcin estructural del circuito
sintetizado.
1.2.2.
35
1.3.
El empleo de HDL es prctica habitual en las diferentes fases del ciclo de diseo
de circuitos digitales. En la Figura 1.1 se muestran las actividades que tpicamente
se realizan durante el ciclo de diseo e implementacin de los circuitos digitales.
En primer lugar, el diseador debe establecer la especificacin del diseo. Dicha especificacin consiste en establecer qu se espera que haga el circuito y qu
restricciones deben satisfacerse (frecuencia de reloj, retardos, tamao, etc.).
A continuacin, el diseador debe crear un diseo de alto nivel del circuito, para
lo cual puede emplear un lenguaje para la descripcin de hardware (HDL), por
ejemplo VHDL o Verilog. Seguidamente, debe desarrollar un conjunto de programas
de test (usando tambin VHDL o Verilog) y, si es posible, usar estos programas
para testear el diseo de alto nivel, usando para ello una herramienta de simulacin
(verificacin funcional). En funcin de los resultados de la simulacin de los tests,
puede ser preciso modificar el diseo de alto nivel, repitindose los pasos anteriores
tantas veces como sea preciso.
Una vez el diseo de alto nivel funciona adecuadamente, debe traducirse al nivel
de puertas lgicas o de transistores. Este proceso se denomina sntesis. Sntesis es
la generacin automtica del diseo del circuito a partir de la descripcin de su
comportamiento. El resultado obtenido de la sntesis, denominado netlist, es una
descripcin de todas las conexiones y componentes que deben componer el circuito.
36
Programas de Test
La descripcin al nivel de puertas o transistores, obtenida a partir de una descripcin en HDL, depende de la forma en que se ha programado el modelo en HDL
y de la herramienta de sntesis empleada. Las herramientas de sntesis proporcionan
numerosas opciones que permiten al diseador especificar cmo debe realizarse la
sntesis. En particular, permiten especificar el nivel de esfuerzo a emplear por la
herramienta en la optimizacin automtica del circuito, tanto en lo que respecta
a la reduccin del rea del circuito como en lo que respecta a sus prestaciones.
Asimismo, las herramientas de sntesis permiten especificar qu mdulos del circuito
no deben ser optimizados.
El diseo a nivel de puertas o transistores debe ser vuelto a testear mediante
simulacin (verificacin de tiempos), usando, si es posible, el mismo conjunto de
tests que se realizaron sobre el diseo de alto nivel. El objetivo es estudiar si el
diseo se comporta como debe y si satisface todas las restricciones que se impusieron
37
1.4.
38
1.4.1.
Full-custom ASIC
En la tecnologa full custom todos los aspectos del circuito integrado son diseados especficamente para una determinada aplicacin, especificndose las caractersticas de cada uno de los dispositivos electrnicos (transistores, diodos, capacitares,
etc.) que componen el circuito. En consecuencia, el circuito resultante estar completamente optimizado y tendr el mejor comportamiento posible.
Sin embargo, realizar el diseo al nivel de los dispositivos electrnicos es complejo
y slo resulta prctico hacerlo para circuitos con un nmero de dispositivos relativamente bajo. No resulta prctico usar este procedimiento para disear sistemas
completos, los cuales en la actualidad pueden constar de decenas e incluso cientos
de millones de transistores.
La aplicacin fundamental de la tecnologa full custom es el diseo de pequeos
circuitos digitales bsicos, denominados "celdas estnda'f', que posteriormente sern
usados de manera modular para componer circuitos de mayor tamao. Un tipo
importante de este tipo de mdulo son los circuitos bsicos a partir de los cuales,
por repeticin, se construyen celdas estndar. Dos ejemplos son el circuito que
implementa un bit de memoria y el circuito que realiza la suma de dos nmeros
39
de un bit, que son usados de manera repetitiva para el diseo de una memoria y un
sumador de dos nmeros den bits, respectivamente.
Standard-cell ASIC
En la tecnologa standard cell el circuito integrado es construido conectando entre
s celdas estndar predefinidas, que ya han sido previamente diseadas y testeadas.
Esta tecnologa permite trabajar al nivel de puertas lgicas, en lugar de al nivel de
transistores, lo cual simplifica bastante el proceso de diseo.
Los fabricantes de dispositivos normalmente proporcionan libreras de celdas
estndar que implementan los bloques constitutivos bsicos, tales como puertas
lgicas, componentes combinacionales simples (and-or-inverter, MUX 2:1, sumador
completo de 1 bit, etc.), elementos bsicos de memoria (latch-D, flip-flop D, etc.),
memorias RAM, etc.
El circuito se construye conectando estas celdas estndar. El tipo de celdas
empleadas y la forma de conectarlas depende de la aplicacin. As pues, cada diseo
de circuito integrado de esta tecnologa requiere de un juego especfico de mscaras
de fotolitografa, con lo cual debe ser construido especficamente en la fbrica de
circuitos integrados.
40
41
( Programmable Logic Devices). Estn compuestos por dos arrays, uno de puertas
1.4.2.
Una vez se ha decidido desarrollar hardware para una aplicacin, debe escogerse
qu tecnologa emplear. En esta seccin se compararn las tres tecnologas FPGA,
42
gate array y standard cell, empleando para ello cuatro criterios: rea, velocidad,
potencia consumida y coste. Cada tecnologa tiene sus puntos fuertes y dbiles, de
modo que para cada aplicacin debe decidirse qu tecnologa es ms adecuada.
rea
El rea del circuito integrado (o equivalentemente, su tamao) depende de la
arquitectura del circuito y de la tecnologa. Los circuitos integrados pequeos requieren menos recursos, precisan de programas de test ms sencillos y tienen un mejor
rendimiento en fabricacin, entendiendo dicho rendimiento como el porcentaje de
chips buenos que se obtienen por oblea.
Frecuentemente, una misma funcionalidad puede conseguirse empleando diferentes arquitecturas, con diferentes reas y velocidades. Por ejemplo, existen diferentes
circuitos que realizan la suma de dos nmeros den bits, algunos de ellos son sencillos
(ocupan poco rea) y lentos, mientras que otros son complejos (ocupan mayor rea)
y rpidos. Una vez se ha determinado la arquitectura del circuito, el rea del circuito
integrado depende de la tecnologa.
En la tecnologa standard cell, las celdas estndar y sus interconexiones son
particularizadas para la aplicacin en concreto, con lo cual no hay desperdicio de
rea de silicio. El chip resultante est completamente optimizado y el rea es mnima.
En la tecnologa gate array, el circuito debe ser construido a partir de celdas base
cuya posicin en el circuito est predefinida. Dado que la funcionalidad y posicin
de las celdas base no son especficas a la aplicacin, el aprovechamiento del silicio
no es ptimo. En consecuencia, normalmente un circuito integrado de la tecnologa
gate arra y necesita mayor rea (aproximadamente entre un 20% y un 100% ms)
que ese mismo circuito desarrollado en la tecnologa standard cell.
En la tecnologa FPGA, una parte considerable del rea del circuito integrado
est dedicada a posibilitar que el circuito pueda ser programado en campo. Ms
aun, la funcionalidad de las celdas lgicas y las interconexiones estn preestablecidas, siendo frecuente que cierto porcentaje de la capacidad no sea utilizado en la
aplicacin en concreto a la que se destina el FPGA. Por todo ello, puede estimarse
que un circuito implementado en la tecnologa FPGA tiene entre 2 y 5 veces mayor
rea que ese mismo circuito implementado en una tecnologa ASIC.
43
Velocidad
La velocidad de un circuito digital es el tiempo necesario para que dicho circuito
realice su funcin. Este tiempo se estima considerando el mayor retardo en la
propagacin que puede producirse en cada etapa del circuito. Normalmente, cuanto
ms rpido sea un circuito, mejor. Sin embargo, para poder realizar las operaciones
ms rpidamente, es necesario emplear circuitos con arquitecturas ms complejas,
que ocupan mayor rea.
Si se usan arquitecturas idnticas, normalmente un circuito integrado con mayor
rea es ms lento, debido a sus mayores capacidades parsitas.
Dado que en la tecnologa standard celllas interconexiones y el rea pueden ser
optimizadas, esta tecnologa es la que permite menores retardos de propagacin y,
consiguientemente, mayor velocidad. En el otro extremo, la tecnologa FPGA es la
que tiene retardos de propagacin mayores.
Al igual que suceda con el rea, la diferencia que existe respecto a la velocidad
entre las tecnologas ASIC standard cell y gate array es considerablemente menor
que entre estas tecnologas ASIC y la tecnologa FPGA.
Potencia consumida
La potencia consumida es la energa que consume el circuito integrado por unidad
de tiempo. En algunas aplicaciones, tales como los equipos porttiles alimentados
con pilas, tiene una gran importancia que los circuitos integrados consuman poca
potencia.
El consumo de potencia est relacionado con el nmero de transistores que
contenga el circuito integrado, con lo cual un criterio que puede imponerse al realizar
la sntesis automtica de un diseo es minimizar el consumo de potencia.
Respecto a las tres tecnologas que estamos comparando, la tecnologa standard
cell consume la menor cantidad de potencia, mientras que la tecnologa FPGA es la
que consume mayor cantidad de potencia de las tres.
Por todo lo dicho hasta el momento, se deduce que la tecnologa standard cell es
la mejor eleccin desde el punto de vista tcnico, ya que un chip construido en esa
tecnologa es tan pequeo, rpido y consume tan poca potencia como sea posible.
44
Coste
El coste es un factor importante, y en ocasiones decisivo, a la hora de seleccionar
la tecnologa en la que implementar un circuito. Pueden considerarse las tres contribuciones al coste siguientes: el coste de produccin, el coste de desarrollo y el coste
del tiempo de llegada al mercado.
El coste de produccin ( eprod) son los euros que cuesta producir una unidad
del circuito integrado. Incluye dos conceptos: el coste de ingeniera (eing) y el coste
de fabricacin (efab).
eprod
efab
eing
Unidades producidas
(1.1)
45
Coste de
produccin
(Cprod)
''
''
''
'
(2)
Unidades producidas
Figura 1.2: Comparacin del coste de produccin por unidad de circuito integrado.
46
1.5.
Los circuitos digitales reales tienen algunas caractersticas importantes que afectan a la manera en que deben ser modelados y diseados. Estas caractersticas
son debidas tanto a los transistores que componen las puertas lgicas como a las
conexiones entre ellos. Entre las ms importantes estn las siguientes.
1.5.1.
47
Messages
+x
+v1 u
+v2 u
111111111
llllllllllllllllllllttlllllllltllllllllllllllllllllllllllllllllllllllllllllllllllllllllllltlllllll
450 ns 1s
100 ns
200 ns
300 ns
400 ns
500 ns
l5o nsJ
.i._ kl
1 O ns to 542 ns
J
1 Now: 450 ns Delta : O
donde el smbolo <= representa la asignacin del valor de la seal de la derecha (x) a
la seal de la izquierda (y1), una vez transcurrido el retardo indicado tras la palabra
reservada after. Supongamos que la seal digital x vara de la forma indicada en la
tabla siguiente:
Tiempo (ns)
X
100
200
250
'0'
'1'
'0'
'1'
48
instante 200 ns. Esto sucede porque el cambio en la seal x se mantiene durante un
tiempo inferior al valor del retardo inercial (100 ns).
Una observacin final respecto al modelado del retardo. Obsrvese nuevamente la
Figura 1.1, en la cual se representa el ciclo de diseo del hardware digital. Cuando
se realizan los pasos "Diseo de alto nivel", "Programas de test" y "Simulacin:
Verificacin funcional", se sabe que todos los bloques circuitales del diseo van a
tener retardos. Sin embargo, en este punto del ciclo de diseo se desconoce el valor de
dichos retardos. Hasta que no se realice la sntesis, y por tanto quede especificada la
implementacin hardware del circuito, no podr estimarse el retardo de cada bloque
circuital.
Esta Unidad Didctica se centra nicamente las primeras fases del ciclo de diseo.
Esto es, en la realizacin en VHDL del diseo de alto nivel, la programacin en VHDL
de los programas de test y la simulacin para la verificacin funcional. Dado que en
estas fases iniciales del diseo no se conocen los retardos de los bloques circuitales
que componen el diseo, ya que todava no se ha tomado la decisin acerca de cmo
van a implementarse en hardware, es prctica comn no especificar el valor estimado
de los retardos en el diseo de alto nivel de los circuitos. En su lugar, suele asignarse
a cada uno de los bloques circuitales un retardo por defecto, denominado retardo 6.
Como se explicar ampliamente ms adelante, esta forma de modelar el retardo es
suficiente para realizar la verificacin funcional de los circuitos.
En un paso posterior, una vez realizada la sntesis, se incluirn los valores estimados de los retardos en el diseo y se comprobar si se satisfacen las restricciones
referentes al tiempo de respuesta, que se impusieron en la especificacin del diseo.
El paso en el cual se realiza la simulacin del circuito, teniendo en cuenta los valores
estimados del retardo, es el sealado en la Figura 1.1 como "Simulacin: Verificacin
de tiempos".
1.5.2.
Ejecucin concurrente
49
1.5.3.
Diseos marginales
1.5.4.
50
in_O
in_1
in_2
in_3
in_4
in_5
>--+------1
in_6
:
...................... ;
f'""'''""'' ""'"
>-~---------------~~~
f"""'"""""""'
>-~--------------r-~
in_?
in_8
...................... ;
in_9
in_10
in_11
in_15
in_14
in_13
in_12
1.6.
51
1.6.1.
Test en manufactura
Un objetivo fundamental del test en manufactura es detectar problemas en el proceso de fabricacin. Las causas de mal funcionamiento de los chips ms comnmente
observadas en la prctica son:
- Abiertos. Conexiones entre los dispositivos que se encuentran abiertas debido
a algn problema, por ejemplo, debido a la rotura de la lnea de metal que
establece la conexin.
- Cortos. Conexiones que se han establecido entre diferentes dispositivos, cuando no deberan haberse producido.
- Acopios. Valores lgicos en una parte del circuito que inadvertidamente cambian el valor lgico en otra parte del circuito.
52
Mediante este procedimiento, un nico test consiste en una secuencia de inicializacin, seguida de otro vector de test. Este procedimiento conduce a usar
un gran nmero de vectores de test, muchos de los cuales son simplemente
secuencias de inicializacin. Adems, en algunos casos puede no ser posible
fijar todos los fiip-fiops a los valores deseados.
53
2. El segundo mtodo consiste en usar en el diseo sean fiip-fiops, que son flipflops cuyo valor puede ser cargado desde las entradas al circuito (mientras se
realiza el test) , o bien pueden ser usados del mismo modo que un flip-flop sin
modificar (durante el modo normal de funcionamiento del circuito). Los sean
flip-flops pueden construirse insertando multiplexores en la entrada D de los
fli p-flops.
En el test en manufactura, la calidad de un conjunto de vectores de test (denominado programa de test) se mide por medio de la cobertura de fallos del programa de
test (supuesto un determinado modelo de fallo) y del tiempo necesario para aplicar
todos los vectores de test al circuito, que es directamente proporcional al nmero de
vectores de test.
Cuanto mayor sea la cobertura de fallos, menor ser el nmero de chips defectuosos que superarn con xito el proceso de inspeccin. Cuanto menor sea el nmero
de vectores de test, menor ser el tiempo necesario para ejecutar el programa de
test, con lo cual podrn testearse mayor nmero de chips por unidad de tiempo.
1.6.2.
Test funcional
El test funcional se emplea en todas las etapas del proceso de diseo del circuito.
Su objetivo es verificar que el circuito realiza todas las operaciones como debiera.
En los diseos grandes, que normalmente se disean de manera jerrquica, todos
los subcircuitos de bajo nivel deben ser comprobados funcionalmente, usando programas de test especficos para cada uno, antes de ser incluidos en los subcircuitos
de ms alto nivel.
Aunque todos los subcircuitos sean comprobados por separado, el subcircuito
obtenido de la composicin de todos ellos debe tambin ser comprobado, usndose
para ello su propio programa de test.
A continuacin, una vez se implementa el circuito usando alguna plataforma
hardware (ASIC, FPGA, etc.), debe volver a ser testeado de nuevo. Si es posible,
debe emplearse para testear el prototipo hardware el mismo conjunto de tests que
se ha usado en la fase de simulacin. Habitualmente, el primer prototipo hardware
contiene errores. La comparacin de los resultados del test, con los resultados de las
simulaciones para esos mismos tests, puede ayudar a identificar errores de diseo y
de fabricacin.
54
1.6.3.
55
Subcircuito
generador de
los vectores de test
Entradas
al UUT
UUT
Salidas
delUUT
Subcircuito
de comprobacin
de los resultados
del test
1.6.4.
Banco de pruebas
56
1.7.
l. 7 .l.
Cada una de las tareas del proceso de desarrollo y produccin del hardware
digital, requiere el conocimiento de un tipo especfico de informacin acerca del
sistema, que va desde la especificacin del sistema hasta el layout de los componentes
fsicos.
El mismo sistema es descrito de diferentes formas y es examinado desde diferentes
perspectivas. Estas perspectivas se denominan las representaciones o visiones del
sistema. Pueden diferenciarse tres:
- Representacin del comportamiento
- Representacin de la estructura
- Representacin fsica
57
Representacin de la estructura
La representacin estructural describe la implementacin interna del sistema,
especificando de qu componentes se compone y cmo estn conectados estos componentes entre s. Corresponde con una representacin esquemtica o diagrama del
sistema.
Normalmente se emplea el trmino "nef' para describir un conjunto de cables
o lneas conductoras que estn conectados a un mismo nodo, y se usa el trmino
"netlisf' (lista de nets) para referirse a la descripcin esquemtica del sistema.
Representacin fsica
La representacin fsica describe las caractersticas fsicas del sistema, especificando las dimensiones de los componentes electrnicos, su posicin en el circuito
integrado y el camino fsico del cableado de conexin entre los componentes. Aade,
por tanto, informacin adicional a la visin estructural del mismo. Se trata, de hecho,
de la especificacin final para la fabricacin del sistema.
l. 7.2.
Niveles de abstraccin
58
59
Representacin del
comportamiento
Representacin de la
estructura
Procesador, memoria, interfaz I/0
Representad n
flsica
Nivel de transistor
El nivel de abstraccin ms bajo es el nivel de transistor. En este nivel, los
bloques bsicos constitutivos de la visin estructural del circuito son los dispositivos
electrnicos, tales como los transistores, resistencias y capacitares.
La descripcin del comportamiento se realiza normalmente mediante ecuaciones
diferenciales y algebraicas, que son simuladas usando entornos de simulacin de
sistemas analgicos, como por ejemplo Spice. Al nivel de transistor, el circuito digital
es tratado como un sistema analgico, en el cual las seales son de tiempo continuo,
pudiendo tomar cualquier valor en un rango continuo.
La visin fsica del circuito al nivel de transistor consiste en el layout de los
componentes y sus conexiones. Define las mscaras fotolitogrficas que deben usarse
en los diferentes niveles del proceso de fabricacin y es, por tanto, el resultado final
del proceso de diseo.
60
2:1 de un bit, elementos bsicos de memoria, tales como latch y flip-flop. En lugar
de considerar que las seales tienen valores continuos, se considera nicamente si la
seal est por encima o por debajo de un valor umbral, lo cual es interpretado como
'1' lgico y 'O' lgico, respectivamente.
Puesto que se realiza la simplificacin de considerar que las seales tienen nicamente dos valores, el comportamiento es descrito mediante ecuaciones booleanas. Es
decir, la abstraccin esencialmente convierte un sistema continuo, que era descrito
mediante ecuaciones diferenciales y algebraicas, en un sistema discreto, descrito
mediante ecuaciones booleanas.
En este nivel se simplifica tambin el modelado de la respuesta temporal. Se define
el retardo en la propagacin como el intervalo de tiempo que precisa un sistema para
proporcionar una seal de salida estable.
La representacin fsica en este nivel consiste en la situacin espacial de las
puertas o celdas, y el camino ( routing) que sigue el conexionado entre ellas.
En el nivel inferior de abstraccin, se hablaba del rea de silicio necesaria para
construir el circuito. En este nivel, se cuenta el nmero de puertas lgicas que componen el circuito (denominado gate count), de modo que la medida es independiente
de la tecnologa. Se usa el rea de la puerta NAND de dos entradas como unidad
bsica de medida, ya que este normalmente es el circuito lgico ms sencillo desde
el punto de vista fsico. As pues, en lugar de emplear el rea fsica para expresar el
tamao a la complejidad del circuito, se emplea el nmero equivalente de puertas
NAND en una determinada tecnologa en particular.
61
Nivel de procesador
El nivel de procesador es el mayor nivel de abstraccin. Los bloques constitutivos
bsicos en este nivel, llamados frecuentemente intellectual properties (IPs), incluyen
procesadores, mdulos de memoria, etc.
La descripcin del comportamiento del circuito es similar a un programa codificado en un lenguaje de programacin convencional, tal como C. Las seales son
62
l. 7. 3.
1.8.
En esta seccin se muestra un ejemplo sencillo que ilustra los conceptos bsicos
de modelado empleando VHDL, as como las diferencias semnticas entre VHDL y
los lenguajes de programacin tradicionales. Con este ejemplo se pretende dar una
63
visin general de VHDL. Los detalles acerca de la sintaxis y las construcciones del
lenguaje VHDL se explicarn en el Tema 2.
Tal como se explic en la Seccin l. 7, un sistema digital puede ser descrito en
cuatro niveles de abstraccin (transistor, puertas lgicas, RTL y procesador) y desde
tres visiones o representaciones diferentes (comportamiento, estructura y fsica).
El lenguaje VHDL permite realizar descripciones del comportamiento y la estructura de los circuitos digitales al nivel de puertas lgicas, RTL y procesador. Es
decir, permite:
- Describir el comportamiento del circuito mediante funciones lgicas, operaciones de transferencia entre registros y algoritmos.
- Describir la estructura del circuito mediante la instanciacin y conexin de
unidades de diseo de diferente complejidad, desde puertas lgicas hasta IPs.
En esta seccin se mostrarn diferentes diseos de un circuito muy sencillo: un
detector de paridad. Se trata de un circuito con tres entradas, agrupadas en un bus,
y una salida. La salida toma el valor '1' cuando hay un nmero par de entradas con
valor '1 '. Se supone que el cero es un nmero par. Por ello, la salida vale '1' bien
cuando ninguna de las entradas vale '1 ', o bien cuando dos de las entradas valen '1 '.
Se realizarn tres descripciones del comportamiento del circuito, una al nivel
de funciones lgicas y dos descripciones abstractas diferentes. Por tratarse de un
circuito muy sencillo, slo se realizar una descripcin estructural, empleando para
ello los bloques constitutivos digitales ms sencillos: las puertas lgicas.
1.8.1.
En la Tabla 1.1 se muestra la tabla de la verdad del circuito, que tiene tres
entradas (a 2 , a 1 , a0 ) y un salida (par). Obsrvese que la salida tiene el valor '1'
cuando la palabra de tres bits de entrada tiene un nmero par de bits '1'. Al realizar
el diseo, se considera que el cero es un nmero par.
A partir de la tabla de la verdad, puede obtenerse la funcin lgica que describe
la salida del circuito:
(1.2)
64
a2
al
ao par
o o o
o o 1
o 1 o
o 1 1
1 o o
1 o 1
1
1 o
1
o
o
1
o
1
1
65
entity detectorPar is
port ( par : out std_logic;
a
: in
std_logic_vector(2 downto o) );
end entity detectorPar;
ns;
12 ns;
12 ns;
12 ns;
Los nombres definidos por el usuario deben comenzar por una letra, seguida
opcionalmente por cualquier secuencia de letras, nmeros y caracteres guin bajo,
con la limitacin de que ni pueden aparecer dos guiones bajos seguidos, ni el guin
bajo puede ser el ltimo carcter del nombre.
Los comentarios comienzan con doble guin (--) y se extienden hasta el final de
la lnea. Est permitido escribir comentarios en cualquier parte del cdigo VHDL.
Cuando se desea comentar varias lneas seguidas de cdigo, es preciso anteponer
el doble guin a cada una de ellas. VHDL'93 no ofrece la sintaxis para comentar
simultneamente varias lneas de cdigo. En la prctica esto no supone ninguna
limitacin, ya que las herramientas de CAD que soportan VHDL suelen proporcionar
opciones de edicin para comentar y descomentar cmodamente varias lneas de
texto. Es decir, es la herramienta de CAD quien antepone el doble guin o lo borra
de las lneas de cdigo que el usuario ha seleccionado.
66
Las seales p1, p2, p3 y p4 pueden ser interpretadas como conexiones entre las
partes internas. La declaracin es visible slo dentro de la architecture.
La descripcin de la architecture est comprendida entre begin y end architecture. Est compuesta por cinco asignaciones concurrentes a seales:
par
p1
p2
p3
p4
Una asignacin concurrente puede ser interpretada como un bloque del circuito.
La seal de la izquierda de la asignacin es la salida del bloque. Todas las seales
que intervienen en la parte derecha de la asignacin son las entradas al bloque.
El resultado est disponible tras un cierto retardo, que se especifica mediante la
clusula after.
Por ejemplo, la sentencia de asignacin concurrente
par <= ( p1 or p2 ) or ( p3 or p4 ) after 20 ns;
puede ser interpretada como un bloque circuital con entradas p1, p2, p3 y p4, y salida
par. El bloque realiza la operacin OR de las cuatro entradas, y la operacin tarda
20 ns en realizarse. Las otras cuatro asignaciones pueden ser interpretadas de forma
anloga.
Esta architecture contiene cinco asignaciones concurrentes, que son interpretadas como cinco bloques circuitales. Las asignaciones concurrentes estn conectadas
a travs de las seales que tienen en comn. Cuando una seal aparece en la parte
izquierda de una asignacin y en la parte derecha de otra, esto significa que hay
una conexin entre el bloque circuital representado por la primera asignacin y el
bloque circuital representado por la segunda. En la Figura l. 7 se muestra el diagrama
conceptual de esta architecture.
Obsrvese que, puesto que cada sentencia de asignacin concurrente representa
una parte del circuito y su interconexin, el orden en que se escriben las sentencias
de asignacin concurrente es indiferente. Por ejemplo, podra escribirse el cdigo de
la forma siguiente:
67
a(2)
a (1)
a (O)
~~
..___
'----
p2
_Jr=
-
(p1 or p2) or
(p3 or p4)
par
1---
p4
p2
p3
par
pi
p4
i2 ns;
i2 ns;
i5 ns;
i2 ns;
68
(1.3)
El cuerpo de la architecture basado en esta funcin lgica se muestra en el
Cdigo VHDL 1.3.
Nuevamente, las dos sentencias concurrentes de asignacin representan dos partes
del circuito. En la Figura 1.8 se muestra el diagrama conceptual del circuito. Puesto
que no se especifica el valor del retardo, se supone que cada uno de los dos bloques
circuitales tiene un retardo o.
69
a(2)
a (1)
impar
1--------1
not impar
par
a (O)
a( O)
:~
:
:
:
:
:
:
:
:
:
:
~==
:
.
:
~
.
......~.
~
=
.
::~::::::::::::::::::::::::::::::::::::
___
a(2)
........................................
........................................
......
...
unitl
1.8.2.
Descripcin de la estructura
xO, x1
end component xor2;
70
out std_logic;
in std_logic );
is
Cdigo VHDL 1.4: Puerta inversora. Puerta XOR con dos entradas. Architecture del detector
de paridad describiendo la estructura del circuito.
71
Hay tres elementos en esta sentencia. El primero es la etiqueta uni t 1, que sirve
para designar este componente. El segundo es la clase del componente: xor2. La
tercera es port map ( ... ), que define la correspondencia entre las seales formales
(puertos definidos en la entity del componente) y las seales actuales (las seales
usadas en el cuerpo de la architecture).
En este ejemplo, port map ( ... ) indica que xO, x1, yO estn conectadas a
a(O), a(1), s1 respectivamente. El cdigo es esencialmente la descripcin textual del
esquemtico mostrado en la Figura 1.9. Las tres instanciaciones de los componentes
describen el circuito completo. Las conexiones se realizan implcitamente, usando el
mismo nombre de la seal.
La instanciacin de un componente es un tipo de sentencia concurrente y puede
mezclarse en el cuerpo de una architecture con otros tipos de sentencias concurrentes, tales como las sentencias de asignacin concurrente a seal o como los bloques
process, que explicaremos a continuacin.
1.8.3.
En un diseo grande, la implementacin puede ser muy compleja. Por este motivo,
el diseo se realiza en diferentes pasos, progresando desde una descripcin inicial
abstracta del funcionamiento del circuito, independiente de la plataforma hardware
que vaya a usarse para implementar el circuito, hasta llegar a la descripcin detallada
al nivel hardware.
El lenguaje VHDL facilita al diseador realizar una descripcin abstracta del
comportamiento del circuito. Uno de los recursos que proporciona para ello el lenguaje son los bloques process. Un bloque process es una construccin que encapsula
un fragmento de cdigo VHDL secuencial, y dentro de la cual pueden declararse y
72
usarse variables, que son locales al bloque process. La caracterstica distintiva del
cdigo secuencial es que es ejecutado en el mismo orden en el cual ha sido escrito.
La sintaxis bsica del bloque process es la siguiente (en la Seccin 2. 7 se ofrece una
descripcin ms completa):
process ( lista_de_sensibilidad )
Declaracin de variables locales
begin
Cdigo_secuencial
end process;
73
<= tmp;
end process;
end architecture comp_red_xor;
Cdigo VHDL 1.5: Architecture del detector de paridad descrita mediante una red XOR.
a(2)
a (1)
a (O)
procesa (a)
variable tmp : std_logic;
begin
tmp . - 1 o 1 i
for i in 2 downto o loop
tmp . - tmp xor a(i);
end loop;
impar <= tmp;
end procese;
impar
not impar
74
par
end if;
end loop;
+ 1;
r := suma mod 2;
if (r
o) then
el se
par < = '0';
end if;
end process;
end architecture comp_alg;
Cdigo VHDL 1.6: Architecture del det ect or de paridad descrita mediante un algoritmo.
a(2)
a ( 1)
a(O)
procesa (a)
variable suma, r : integer;
begin
suma . - o i
for i in 2 downto o loop
if a (i) = 111 then
suma . - suma + 1;
end if;
end loop;
r . - suma mod 2,
if (r = O) then
pa r <= 111 i
el se
pa r <= 1 o 1 i
end if;
end procesa;
par
75
1.8.4.
Banco de pruebas
76
77
UUT
test in
f - - - - . - - - - - - l A [ 2 .. OJ
verif : procesa
variable error_sta tu s : boolean;
begin
wai t on test in;
wait for 10 0-ns;
if ( ( test_in = "000" and te st_out = '1' )
( test_in = "001" and test_out = ' O' )
( test_in = " 010" and test_out = 'O' )
test out
( test_i n = "011" and test_out = '1')
par f-----~
( test_in = "lOO" and test_out = ' O' )
( test_in = "1 01 " and test_out = '1 ' )
( test_in = "110" and t est_out = '1' )
( test_i n = "111" and test_out = 'O' ) )
then
error_status : = falsa ;
el se
error_ stat u s : = true ;
end if;
assert not error_status
report "Test fa lla do."
severity note ;
end procesa verif;
1.8.5.
Configuracin
Cdigo VHDL 1.8: Configuration para la simulacin del banco de pruebas del detector de
paridad.
78
1.9.
1.9.1.
79
b)
El Cdigo VHDL 1.9 describe el comportamiento de un buffer triestado. Obsrvese que el diseo consta de tres partes. En primer lugar, se indica qu libreras van
a usarse en la definicin del modelo. A continuacin, se define la interfaz del circuito
(mdulo entity). Finalmente, se define el comportamiento del circuito (mdulo
architecture). Todo ello ser explicado con detalle en el tema siguiente.
1.9.2.
80
-- Banco de pruebas
-- bp_bufferTriestado. vhd
library IEEE;
use IEEE. std_logic_1164. all;
entity bp_Buffer_TriEstado is
end entity bp_Buffer_TriEstado;
architecture bp_Buffer_TriEstado of bp_Buffer_TriEstado is
signa} y
: std_logic; -- Conectar salida UUT
signa} d, E : std_logic; -- Conectar entradas UUT
component Buffer_ TriEstado is port
( y
: out std_logic;
E, d : in std_logic ) ;
end component Buffer_TriEstado;
begin
-- Instanciar y conectar UUT
uut : component Buffer_TriEstado port map
( y => y, E => E, d => d );
gen_ ve e_ test : process
begin
+
+
+
Messages
/bp buffer triestado/y
/bp_buffer _triestado/d
o
o
/bp_buffer _triestado/e
~~i')
~#'O
[[1
1 O ns to 43 ns
1
1
1
1
Now
40 ns
Cursor 1
6 ns
www
IS
4nsg8ns
6 ns
1
12 ns
16 ns
20 ns
24 ns
28 ns
32 ns
36 ns
40 ns
I/
1 Now: 40 ns Delta: 1
La definicin del banco de pruebas contiene las mismas tres partes que la descripcin del circuito: en primer lugar se indica qu libreras van a usarse, a continuacin
se define la interfaz del circuito (mdulo entity) y finalmente se define su comportamiento (mdulo architecture).
81
1.10.
LECTURAS RECOMENDADAS
82
1.11.
EJERCICIOS DE AUTOCOMPROBACIN
Ejercicio 1.1
Discuta razonadamente por qu una descripcin HDL es ms portable que un
diseo esquemtico.
Ejercicio l. 2
Discuta razonadamente la veracidad o falsedad de la siguiente afirmacin:
"Empleando cualquier herramienta de sntesis se genera, a partir de una descripcin HDL, una nica descripcin al nivel de puertas lgicas o transistores."
Ejercicio 1.3
Suponga que quiere implementar una nica unidad de un circuito integrado con
un coste de produccin mnimo. Indique razonadamente cul de las tres tecnologas
siguientes conllevar un coste de produccin menor: FPGA, gate array y standard
cell.
Ejercicio 1.4
Seale cul de las siguientes cuatro afirmaciones es falsa:
A. La implementacin hardware de un circuito digital empleando un circuito
integrado de la tecnologa FPGA consume menor cantidad de potencia que
si se emplea un circuito integrado de las tecnologas standard cell o gate array.
B. La tecnologa standard cell permite construir circuitos integrados con menores
retardos de propagacin que las tecnologas FPGA y gate array.
C. El rea del circuito integrado depende de la arquitectura del circuito y de la
tecnologa.
D. La contribucin del coste de ingeniera al coste de produccin de un circuito
integrado depende del nmero de unidades producidas.
83
Ejercicio 1.5
Ejercicio 1.6
Dada una puerta AND de dos entradas (A y B) y una salida (z), se pide obtener
el mnimo nmero de vectores de test que detectan los 6 patrones de fallos siguientes:
- La entrada A se encuentra permanentemente a O (A/0).
- La entrada B se encuentra permanentemente a O (B/0).
- La salida z se encuentra permanentemente a O ( z /O).
- La entrada A se encuentra permanentemente a 1 (A/1).
- La entrada B se encuentra permanentemente a 1 (B/1).
- La salida z se encuentra permanentemente a 1 ( z /1).
Para designar el fallo de que una seal x se encuentra permanentemente al valor
v se ha usado la notacin x/v. Indique tambin cuntos vectores de test habra que
usar para probar exhaustivamente el funcionamiento del circuito.
Ejercicio l. 7
84
...........................
Ejercicio 1.8
85
entity buzzer is
port ( Warning
: out std_logic;
Door, Ignition, Sbelt : in std_logic);
end entity buzzer;
<= (not
Cdigo VHDL 1.11: Diseo del circuito de control de la alarma de seguridad de un coche.
entity BUZZER is
port ( Warning
: out std_logic;
Door, Ignition, Sbelt : in std_logic);
end entity BUZZER;
:
:
:
:
:
NOT1
NOT1
AND2
AND2
OR2
port
port
port
port
port
map
map
map
map
map
Cdigo VHDL 1.12: Diseo alternativo del circuito de control de la alarma de seguridad de un
coche.
86
1.12.
Cprod
Cing,
resultante es la suma de
Cab
Cab
Cing
87
Entradas
Salida
correcta z
AjO
z
B/0
z
z /0
z
A/1
z
B/1
z
o1
1o
o
o
o
o
o
o
o
o
o
o
o
o
o
11
o
o
o
o
A B
00
o
1
1
1
z /1
z
1
1
1
1
88
Por tanto, el mnimo nmero de vectores de test para detectar los 6 patrones de
fallo es tres. Los tres vectores de test son los siguientes: "11", "01" y "10".
Para probar exhaustivamente el circuito, habra que testear el circuito para
cualquier valor de las seales de entrada. Puesto que existen dos seales de entrada,
que pueden tomar dos valores (O 1), el nmero de vectores de test para testear
exhaustivamente el circuito es 22 = 4.
Solucin al Ejercicio l. 7
Para que pueda ser observado el valor en el nodo E, se pone la seal D a l. De
este modo, el valor de la seal de salida de la puerta ancL2 (y) es igual al valor en
el nodo E.
Para que el nodo E pueda ser controlado por las seales A o B, se pone el valor
de la seal a O. En consecuencia, el valor del nodo E es el resultado de realizar la
operacin AND lgica de las seales A y B.
e a Oy D
a 1 nos permite
Obsrvese que no es necesario que las seales A y B tengan valor O simultneamente, ya que el que una de estas dos seales tenga valor Oes suficiente para detectar
el fallo.
89
TEMA 2
2.1. Introduccin
2.2. Unidades de diseo
2.3. Entity
2.4. Architecture
2.5. Asignaciones concurrentes
2.6. Sentencia generate
2.7. Bloque process
2.8. Cdigo secuencial
2.9. Descripcin de la estructura
2.10. Parametrizacin
2 .11. Seales, variables y constantes
2.12. Tipos de datos y operadores
2.13. Atributos
2.14. Libreras
2.15. Assert
2.16. Subprogramas
2.17. Paquetes
2.18. Lecturas recomendadas
2.19. Ejercicios de autocomprobacin
2.20. Soluciones de los ejercicios
OBJETIVOS DOCENTES
Una vez estudiado el contenido del tema y realizados los ejercicios prcticos,
debera saber:
- Discutir la finalidad de las unidades de diseo de VHDL entity, architecture,
package y configuration.
- Describir la interfaz de los circuitos digitales mediante unidades de diseo
entity. Discutir las caractersticas y !'as diferencias entre los modos in, out e
inout de los puertos.
- Discutir la sintaxis y la finalidad de las sentencias concurrentes simple, condicional y de seleccin. Dibujar el diagrama conceptual del hardware a que da
lugar la sntesis de estas sentencias y el correspondiente circuito al nivel de
puertas lgicas.
- Discutir la sintaxis y la finalidad de la sentencia generate.
- Discutir la sintaxis y la finalidad de los bloques process y de las sentencias
secuenciales de asignacin a seal, a variable, if, case y del bucle for. En
casos sencillos, dibujar el diagrama conceptual del hardware a que da lugar
la sntesis del bloques process, y el correspondiente circuito compuesto de
puertas lgicas y biestables.
- Discutir cmo se realiza el modelado del retardo en VHDL.
- Definir en VHD L la estructura de un circuito mediante instanciacin y conexin de otros circuitos. Asimismo, discutir la utilidad de la parametrizacin en
la descripcin de un circuito.
- Discutir las principales caractersticas de las seales, variables y constantes en
VHDL. Discutir la diferencia entre seales y variables en lo que respecta al
retardo en la asignacin de los nuevos valores.
- Discutir cules son los tipos predefinidos de VHDL y sus operadores bsicos.
Asimismo, discutir las finalidad, los operadores bsicos y las funciones de
conversin de los tipos de dato std_logic, std_logic_vector, unsigned y
signed. Finalmente, discutir las caractersticas de los tipos de dato time y
string, as como de los tipos enumerados.
- Discutir qu son los atributos en VHDL y la finalidad de algunos de ellos.
93
94
2.1.
INTRODUCCIN
VHDL es un lenguaje complejo, con numerosas capacidades y libreras de funciones. De hecho, aunque es un lenguaje para describir hardware, posee muchas
de las capacidades de los lenguajes de programacin (tales como C o Fortran),
incluyendo estructuras record, funciones, procedimientos y soporte a bloques de
cdigo compilados separadamente.
Pese a lo anterior, para la mayor parte de las aplicaciones de VHDL al modelado
y simulacin de circuitos digitales, es suficiente con emplear un pequeo subconjunto
de las estructuras y capacidades proporcionadas por el lenguaje. En particular,
se ha definido un subconjunto del lenguaje VHDL, denominado VHDL synthesis
interoperability subset (estndar IEEE 1076.6), que contiene los tipos de datos,
operadores y otras capacidades de VHDL que deberan ser usados para crear cdigo
VHDL sintetizable. Esto es, cdigo a partir del cual las herramientas de CAD puedan
generar automticamente circuitos hardware que funcionen.
Siguiendo estas reglas y centrndonos en prcticas "simples" para la codificacin
de alto nivel, en este tema se introducen los conceptos bsicos para el modelado
y simulacin de circuitos digitales empleando VHDL. En las explicaciones sobre
los fundamentos del lenguaje VHDL proporcionadas en el resto del tema, no se
pretende revisar de manera sistemtica todas las posibilidades que ofrece la sintaxis
de VHDL, que son muchas. El objetivo es ir introduciendo paulatinamente los
conceptos bsicos, cuya utilidad para el diseo de circuitos se demostrar en los
sucesivos temas.
2.2.
UNIDADES DE DISENO
95
library IEEE;
use IEEE. std_logic_1164. all;
entity detectorPar is
port ( par : out std_logic;
a
: in
std_logic_vector( 2 downto O) ) ;
end entity detectorPar;
architecture comp_funcLog of detectorPar is
signal p1, p2, p3, p4 : std_logic;
begin
par < = ( p 1 or p2 ) or ( p3 or p4 ) ;
pi <= ( not a(2) ) and ( not a(1) ) and ( not a(O) );
p2 <= ( not a(2) ) and a(1) and a(O);
p3 <= a(2) and ( not a(1) ) and a(O);
p4 <= a(2) and a(1) and ( not a(O) );
end architecture comp_funcLog;
Un fichero con cdigo VHDL puede contener varias unidades de diseo, pero una
unidad de diseo no puede ser dividida en dos o ms ficheros.
El diseo del circuito descrito en la Seccin 1.8, que es mostrado nuevamente
en el Cdigo VHDL 2.1, puede servir para ilustrar cul es el esqueleto bsico
de una entidad de diseo de VHDL, la cual est compuesta por una entity y
una architecture. Obsrvese que en las sentencias concurrentes de asignacin a
seal hay implcitamente un retardo 5. En las Secciones 2.3 y 2.4 se explican los
fundamentos de la definicin de la entity y la architecture.
Un tercer tipo de unidad de diseo de VHDL es el package, el cual se emplea
normalmente para agrupar una coleccin de tipos de datos, subprogramas y componentes, que estn de alguna forma relacionados entre s y que van a ser usados por
otros programas VHDL.
Finalmente, otro tipo de unidad de diseo. de VHDL es la configuration, que
permite relacionar en tiempo de compilacin la entity con la architecture.
El hecho de que la entity y la architecture se definan por separado, y que
puedan ser compiladas separadamente, facilita la definicin de varias architecture
para una misma entity. En la Seccin 1.8 se describi un ejemplo de ello. Otro
ejemplo diferente sera el caso en el cual se definieran varias architecture de
una misma entidad de diseo, correspondientes a diferentes versiones del circuito:
velocidad baja, media y alta.
Si no se define la configuration, en la cual se especifica explcitamente la
architecture que corresponde con la entity, entonces el entorno de simulacin
asocia a la entity aquella de sus architecture que ha sido compilada en ltimo
96
2.3.
ENTITY
........................................
....................... ,............
...
xO ~ yO
L. . ~~. ..!
:~ P~.?.. .! yo
entity not is
port ( yO : out std_logic;
xO : in std_logic ) ;
end entity not;
entity xor2 is
port ( yO
entity and2 is
port ( yO
: out std_logic;
xO, x1 : in std_logic );
end entity xor2;
yO
: out std_logic;
xO, x1 : in std_logic ) ;
end entity and2;
97
2.3.1.
Clusula port
nombres_puertos
modo tipo_dato
) ;
Los puertos declarados en la entity son visibles desde la propia entity y desde
las architecture asociadas a la entity.
El modo del puerto indica la direccin de la seal:
- Las palabras reservadas in y out indican que la seal fluye hacia el circuito
o desde el circuito, respectivamente. Describen el hecho de que el puerto
correspondiente es una entrada o una salida del circuito.
- La palabra reservada inout indica que la seal fluye en ambas direcciones, es
decir, que se trata de un puerto bidireccional.
En este texto se aplica el convenio de declarar primero los puertos de salida y a
continuacin los de entrada, si bien este convenio no es universalmente aceptado.
Como ejemplo de uso del modo inout, en la Figura 2.2 se ilustra el funcionamiento de un puerto I/0 bidireccional con doble buffer. Como las seales de control
de los buffers triestado estn conectadas a seales enable complementarias, cuando
uno de los buffers est habilitado, el otro tiene la salida a alta impedancia.
dir ---~:>-----1
bi
sig_in
98
Al describir los circuitos debe tenerse en cuenta que un puerto cuyo modo es out
no puede ser usado como una seal de entrada. Por ejemplo, consideremos el circuito
mostrado en la Figura 2.3. Podra pensarse en describir el circuito de la Figura 2.3
mediante el Cdigo VHD L 2. 2.
8:
. ::::::::!
b
...............................
i. . Q moO
..............................................
G; m::
......... . .... ..........
::::::::::::::::::::::::::;:::::::::::::::::::
library IEEE;
use IEEE. std_logic_1164. all;
entity modoPuertos is
port ( x, y : out std_logic;
a, b : in std_logic ) ;
end entity modoPuertos;
architecture arch_incorrecta of modoPuertos is
begin
x <=a and b;
y <= not x;
--MAL, pToduce eTTOT de compilacin
end architecture arch_incorrecta;
Cdigo VHDL 2.2: Cdigo incorrecto, que produce un error de compilacin.
Sin embargo, puesto que en dicho cdigo se usa la seal x para calcular la seal
y, el compilador de VHDL considera que la seal x fluye hacia el circuito (vase
la Figura 2.4a). Esto contradice el hecho de que el modo de la seal x es out. La
consecuencia de ello es que se produce un error de compilacin.
Una posible solucin sera cambiar el modo del puerto x a inout. Sin embargo,
sta no es una buena solucin, ya que de hecho no se trata de un puerto bidireccional.
Una alternativa mucho mejor es definir una seal interna para representar el
resultado intermedio (vase la Figura 2.4b), tal como se muestra en el Cdigo
VHDL 2.3.
99
d .-. ;,.
a
,. . . . .. . . . . . . . .. . .
~:: ! o
b
;, - '
: - ~ ..
x
- -~
a)
: 8:::.:.:: .:.-J
b
b)
Figura 2.4: a) La asignacin y <= x hace que el compilador interprete que la seal x fluye hacia
el circuito; b) Definicin de la seal ab.
library IEEE;
use IEEE. std_logic_1164. all;
entity modoPuertos is
port ( x, y : out std_logic;
a, b : in st<lJogic ) ;
end entity modoPuertos;
architecture arch_correcta of modoPuertos is
signa} ab : std_logic;
begin
ab <=a and b;
x <= ab;
y <= not ab;
end architecture arch_correcta;
Cdigo VHDL 2.3: Descripcin correcta del circuito mostrado en la Figura 2.3.
2.3.2.
Clusula generic
100
Esta entity incluye una constante generic, Tpd, del tipo predefinido time.
El valor de esta constante generic puede ser usado en el cuerpo de cualquier
architecture asociada a esta entity. En la Seccin 2.10 se volver sobre este tema.
2.3.3.
Declaraciones
En la entity pueden declararse subprogramas, atributos, tipos de datos, constantes, seales, etc. Estas declaraciones son visibles desde la propia entity y las
architecture asociadas.
Por ejemplo, en la entity de un banco de pruebas puede declararse una constante
que represente el nmero de bits del circuito a testear y otra que represente el retardo
usado en el test.
entity bp is
constant WORD SZ
constant DELAY
end entity bp;
2.3.4.
integer := 16;
time
10 ns;
Sentencias
En la entity pueden incluirse sentencias assert, llamadas concurrentes a procedimientos y bloques process. En ninguno de los casos deben producirse asignaciones
a seal.
El propsito de estas sentencias puede ser realizar comprobaciones sobre algunas
de las caractersticas de la entity. Por ejemplo, si se incluye una sentencia assert
en la entity, el mensaje se mostrara (si procede) al comienzo de la simulacin, para
cada una de las architecture que tenga esa entity.
2.3.5.
101
en caso de que la entity contenga alguna sentencia. La declaracin termina con las
palabras reservadas end entity seguidas del nombre asignado a la entity.
entity nombre_enti ty is
clusula generic
clusula port
declaraciones
begin
sentencias
end entity nombre_enti ty;
std_logic;
std_logic );
N downto O);
4 a 32";
2.4.
ARCHITECTURE
102
xo
EG
..-..................................,-
yO
..-...................................-.
:~ PI.. 2. ...lyo
:~ l. ..!. . . . 2. . . .l
yO
103
2.5.
ASIGNACIONES CONCURRENTES
2.5.1.
104
calculndose el nuevo valor de yO. Este nuevo valor se asigna a la seal transcurrido
un tiempo 5.
Anlogamente, la sentencia de asignacin concurrente
e <= u and v;
105
a
b
e
xl
x2
---1
x3
---1
x4
---1
---1
y <= '1';
y <= a + b + e - 1;
la seal de salida y oscila entre los valores 'O' y '1' mientras la seal en vale 'O'.
Cuando una asignacin concurrente contiene un lazo cerrado, el valor de la seal
de salida es sensible al retardo interno en la propagacin y puede oscilar. Este tipo
de circuito confunde a las herramientas de sntesis, y complica la verificacin y el test
del circuito. Es una mala prctica de diseo y debe evitarse por completo cuando se
disea para sntesis.
106
2. 5. 2.
entity mux4 is
port ( x
a, b, e, d
S
107
entity decodificador4 is
port ( X
: OUt std_logic_vector(3 downto 0);
s
: in std_logic_vector( 1 downto O) ) ;
end entity decodificador4;
architecture arch_decodificador4 of decodificador4 is
begin
x < = "0001" when (s="OO") else
"0010" when (s="01") else
"0100" when (s="10") else
"1000";
end architecture arch_decodificador4;
entity codificadorPrioridad4a2 is
port ( codigo
: out std_logic_vector(1 downto O);
activo
: out std_logic;
X
:
in std_logic_vector(3 downto 0) );
end entity codificadorPrioridad4a2;
architecture codPrior4a2 of codificadorPrioridad4a2 is
begin
codigo < = "11" when ( x(3) = '1') else
"10" when ( x(2) = '1') else
"01" when ( x(1) = '1') else
"00" ;
activo <= x(3) or x(2) or x(1) or x(O);
end architecture codPrior4a2;
108
seal <=
se emplean los circuitos necesarios para obtener cada uno de los nuevos valores de
la seal (expr_nuevo_valor_seal_1, ... , expr_nuevo_valor_seal_n), los circuitos
necesarios para obtener cada una de las expresiones booleanas (expr_booleana_1,
... , expr_booleana_n-1), y el circuito que implementa la red de prioridad.
La red de prioridad puede implementarse mediante la conexin de multiplexores
de dos entradas (MUX 2:1). Para entender cmo se construye la red de prioridad,
consideremos primero una sentencia condicional con una nica clusula when:
seal <=
expr_nuevo_valor_seal_l
seal
expr_nuevo_valor_seal_2
expr_booleana_1
Figura 2. 7: Diagrama conceptual de la sntesis de una sentencia concurrente condicional con una
nica clusula when.
109
expr_nuevo_valor_seal_l
------------------------~
seal
expr_nuevo_valor_seal_2
expr_nuevo_valor_seal_3
expr_nuevo_valor_seal_4
expr_booleana_3
expr_booleana_2 -------------------.J
expr_booleana_1
Figura 2.8: Diagrama conceptual de la sntesis de una sentencia concurrente condicional con tres
clusulas when.
el nmero de clusulas when. Esto debe ser tenido en cuenta a la hora de disear
para sntesis.
2.5.3.
110
entity mux4 is
port ( x
a, b, e, d
S
111
-- D ecodificador binario 2 a 4
-- fichero: decodificador2x4_archSelec. vhd
library IEEE;
use IEEE . std_logic_1164.all;
entity decodificador4 is
port ( x
: out std_logic_vector(3 downto O);
s
: in std_logic_vector ( 1 downto O) ) ;
end entity decodificador4;
architecture arch_decSelec of decodificador4 is
begin
with s select
x <= "0001" when "00",
"0010" when "01",
"0100" when "10",
"1000" when others;
end architecture arch_decSelec;
Cdigo
Y~DL_
-- Codificador de prioridad 4 a 2
-- fichero: codificadorPrioridad4 a2_archSelec. vhd
library IEEE;
use IEEE. std_logic_1164. all;
entity codificadorPrioridad4a2 is
port ( codigo
: out std_logic_vector( 1 downto O);
activo
: out std_logic;
X
:
in std_logic_vector(3 downto 0) );
end entity codificadorPrioridad4a2;
architecture codPrior4a2_selec of codificadorPrioridad4a2 is
begin
with x select
codigo <= "11" when "1000" 1 "1001" 1 "1010" 1"1011" 1
"1100" 1 "1101" 1 "1110" 1 "1111",
"10" when "0100" 1 "0101" 1 "0110" 1 "0111",
"01" when "0010" 1 "0011",
"00" when others;
activo <= x(3) or x(2) or x(1) or x(O);
end architecture codPrior4a2_selec;
Conceptualmente, la implementacin hardware de una asignacin concurrente de seleccin puede realizarse empleando un multiplexor, que utiliza la seal
expresin_seleccin para seleccionar cul de las expresiones del nuevo valor de
la seal debe usarse para evaluar la seal. Cada uno de los posibles valores de la
seal expresin_seleccin corresponde con un puerto de entrada del multiplexor.
En la Figura 2.9 se muestra el diagrama conceptual de la sntesis de una sentencia
concurrente de seleccin, en la cual la expresin de seleccin puede tomar n diferentes
valores y la seal a evaluar tiene m bits.
112
expr_nuevo_valor_seal_n
m
seal
m
expr_nuevo_valor_seal_2
expr_nuevo_valor_seal_l
expresin_seleccin
Figura 2.9: Diagrama conceptual de la sntesis de una sentencia concurrente de seleccin.
expr_nuevo_valor_seal_3
expr_nuevo_valor_seal_2
1---~
c3
'----~
c2
seal
-------IC}
expr_nuevo_valor_seal_l
expresin_seleccin
Figura 2.10: Ejemplo de diagrama conceptual de la implementacin de una sentencia concurrente
de seleccin con tres when y en la cual la expresin de seleccin puede tomar cinco posibles valores.
Por ejemplo, en la Figura 2.10 se muestra el diagrama conceptual de la implementacin de la siguiente sentencia concurrente de seleccin:
with expresin_seleccin select
seal <= expr_nuevo_valor_seal_1 when cO,
expr_nuevo_valor_seal_2 when c1,
expr_nuevo_valor_seal_3 when others;
donde se supone que la expresin de seleccin puede tomar cinco posibles valores:
cO, c1, c2, c3 y c4.
113
2.5.4.
el se
'0' else
"1111"
"0000"
114
in2
30
30
40
40
40
ns
ns
ns
ns
ns
when
when
when
when
when
when
"00000001",
"00000010",
"00000011",
"00000100",
"00000101",
others;
el se
el se
2.6.
SENTENCIA GENERATE
2.6.1.
Bsicamente, la sentencia generate iterativa tiene la sintaxis mostrada a continuacin, donde for, in, generate, begin y end son palabras reservadas.
etiqueta: for ndice in rango_bucle generate
Declaracin de seales locales y constantes locales
begin
Sentencias_ concurrentes
end generate etiqueta;
El bucle generate repite las sentencias concurrentes del cuerpo del bucle un
nmero fijo de iteraciones, que est determinado por el rango de valores rango_bucle.
Para que la sentencia sea sintetizable, es necesario que los lmites del rango sean
estticos.
El ndice del bucle (ndice) especifica el valor del rango de valores que corresponde con la iteracin actual, con lo cual va tomando los sucesivos valores
de rango_bucle. El ndice del bucle (ndice) no necesita ser declarado, ya que
automticamente pertenece al mismo tipo de dato que rango_bucle.
Si no se realiza la declaracin de seales y constantes locales, puede omitirse la
palabra reservada begin. Por ejemplo:
signal z
std_logic_vector( 7 downto O);
signal x
std_logic_vector( 7 downto O);
signal y
std_logic_vector(15 downto O);
E1: for i in x'range generate
z(i) <= x(i) AND y(i+8);
end generate E1;
115
2.6.2.
2.7.
BLOQUE PROCESS
116
La lista de sensibilidad es tambin opcional. Como veremos ms adelante, proporciona un mecanismo para definir la condicin de ejecucin del bloque: el bloque
process se ejecuta cada vez que cambia el valor de una de las seales de su lista de
sensibilidad.
En un bloque process no pueden declararse seales. Sin embargo, todas las
seales declaradas en la architecture, y todas las seales y puertos declarados en la
entity, son visibles desde dentro del bloque process. Por ejemplo, pueden intervenir
en la parte derecha e izquierda de las asignaciones secuenciales, respetando siempre
las limitaciones de lectura y escritura que impone el modo de los puertos (no se
pueden leer puertos con modo out, ni escribir puertos con modo in).
La declaracin de variables es opcional y se realiza antes de la palabra reservada
begin. La sintaxis es:
variable nombre_variable tipo rango := valor_inicial;
117
2. 7.1.
Sentencias wait
Wait on
La sintaxis de la sentencia es:
wait on
Se suspende la ejecucin del cdigo secuencial hasta que cambia el valor de una
o varias de las seales seal1, seal2, ... , sealN.
118
Wait until
La sintaxis de la sentencia es:
wait until
expresin_booleana;
nunca seran evaluadas, ya que no contienen ninguna seal. La ejecucin del bloque
process quedara suspendida indefinidamente en esas sentencias.
Es posible especificar explcitamente la lista de sensibilidad de la sentencia wait
until:
wait on
until
Cuando cambia el valor de alguna de las seales seal1 , ... , seal N, entonces
se comprueba la expresin booleana. Si vale true, se reanuda la ejecucin de las
sentencias del bloque process.
119
Wait for
La sintaxis de la sentencia es:
wait for
expresin_ temporal;
O ns;
la ejecucin del cdigo secuencial queda suspendida durante un tiempo 6, reanundndose en t + 6. De esta manera, se permite que se asignen a las seales los valores
calculados en el instante t.
La sentencia wait for puede combinarse con las otras dos formas de la sentencia
wait. Por ejemplo, la sentencia
wait until clk='1' and enable and v<30
for 50 ns;
hace que la ejecucin del cdigo secuencial se suspenda hasta que una de las dos
siguientes condiciones se satisfaga:
l. Cambia el valor de alguna de las seales ( clk, enable) y adems se satisface
la condicin clk=' 1' and enable and v<30.
2. 7.2.
Lista de sensibilidad
Puede definirse la lista de seales a las cuales el bloque process es sensible. Esta
lista se escribe, entre parntesis, a continuacin de la palabra reservada process.
En este caso, el bloque process es ejecutado slo en el instante en que una o varias
de estas seales a las que es sensible cambia de valor. En la lista de sensibilidad
slo pueden incluirse seales que puedan ser ledas. Es decir, no pueden incluirse los
puertos de salida.
120
Cdigo VHDL 2.10: Biestable D con reset asncrono activado al nivel LOW.
121
situada como ltima sentencia del cdigo secuencial, donde las seales que aparecen
en la sentencia wait son las de la lista de sensibilidad. Por ejemplo, los dos bloques
process siguientes son equivalentes:
procA: process (a1, a2)
begin
a1 <= '0';
a2 <= '1' after 2 ns;
end process procA;
procB: process
begin
a1 <= '0';
a2 <= '1' after 2 ns;
wait on a1, a2;
end process procB;
2.8.
CDIGO SECUENCIAL
Es importante no confundir las sentencias secuenciales con los circuitos secuenciales. Las sentencias secuenciales son las sentencias de VHDL que estn incluidas
dentro de los bloques process y los subprogramas, mientras que los circuitos secuenciales son circuitos con estados internos. Los bloques process y las sentencias
secuenciales que contienen pueden emplearse para describir tanto circuitos combinacionales como secuenciales.
A continuacin, se describir el uso de las asignaciones secuenciales a variables y
a seales, las sentencias if y case, y el bucle for.
2.8.1.
122
las seales su nuevo valor una vez ha finalizado la ejecucin de todas las sentencias
del bloque.
Dentro de un bloque process pueden realizarse varias asignaciones secuenciales
a una misma seal. Si todas las asignaciones a la seal tienen un retardo b, entonces
slo la ltima de ellas tiene efecto. Dado que el valor de la seal no es actualizado
hasta que se completa la ejecucin del bloque, la seal nunca adquiere valores
"intermedios". Por ejemplo, el fragmento de cdigo:
x1, x2, x3, x4, y:
std_logic;
es equivalente a:
x1, x2, x3, x4, y:
std_logic;
std_logic;
123
2.8.2.
2.8.3.
Sentencia if
124
x <=a;
elsif (s
=
=
11
01 11 ) then
X<= b;
11
elsif ( s
1O11 ) then
x <=e;
else
X<= d;
end if;
end process;
end architecture areh_proeif;
125
-- Decodificador binario 2 a 4
-- fichero: decodificador2x4_archProcessif. vhd
library IEEE;
use IEEE. std_logic_1164. all;
entity decodificador4 is
port ( x
: out std_logic_vector(3 downto O);
s
: in std_logic_vector ( 1 downto O) ) ;
end entity decodificador4;
architecture arch_decProcif of decodificador4 is
begin
process ( s )
begin
if ( s = 11 00 11 ) then
11
X <=
0001 11 ;
elsif ( s = 11 01 11 ) then
11
X <=
0010 11 ;
elsif ( s = 11 10 11 ) then
11
X <=
0100 11 ;
el se
11
X <=
1000 11 ;
end if;
end process;
end architecture arch_decProcif;
-- Codificador de prioridad 4 a 2
-- fichero: codificadorPrioridad4a2_archProciJ. vhd
library IEEE;
use IEEE. std_logic_1164. all;
entity codificadorPrioridad4a2 is
port ( codigo
out std_logic_vector(1 downto O);
activo
out std_logic;
x
: in std_logic_vector ( 3 downto O) ) ;
end entity codificadorPrioridad4a2;
architecture codPrior4a2_procif of codificadorPrioridad4a2 is
begin
process ( x )
begin
if ( x(3) = '1 ') then
codigo <= 11 11 11 ;
elsif ( x(2) = '1') then
codigo <= 11 10 11 ;
elsif ( x(1) = '1') then
codigo <= 11 01 11 ;
else
codigo <= 11 00 11 ;
end if;
activo <= x(3) or x(2) or x(1) or x(O);
end process;
end architecture codPrior4a2_procif;
126
Una cuestin que debe tenerse en cuenta es que cuando se asigna valor a una seal
en alguna de las ramas de una sentencia if, pero no en todas las ramas, entonces
se est introduciendo "memoria" en el circuito. Es decir, la sntesis de ese cdigo
VHDL dar lugar a un circuito secuencial. Esta situacin se produce siempre que
no existe la rama else, ya que en este caso no hay sentencias de asignacin a las
seales en caso de que todas las expresiones booleanas valgan false. As pues, si se
desea sintetizar un circuito combinacional, debe incluirse la rama else.
Por ejemplo, supongamos que se programa el siguiente bloque process con el fin
de describir un circuito comparador con dos entradas (a y b) y tres salidas (mayor,
menor e igual), cuyo valor es '1' cuando se satisface la condicin a>b, a<b o a=b,
respectivamente.
process ( a, b )
Diseo incorrecto!!
begin
if ( a > b ) then
mayor <= ' 1 ' ;
elsif ( a < b ) then
menor <= ' 1 ' ;
el se
igual <= ' 1 ' ;
end if;
end process;
127
igual <=
el se
mayor <=
menor <=
igual <=
end if;
end process;
'0';
'0';
'0';
'1';
Recurdese que si se realizan varias asignaciones con retardo 6 a una misma seal
en un bloque process con lista de sensibilidad, slo tiene efecto la ltima asignacin
a la seal. En el cdigo anterior, si se realiza una asignacin a la seal en la rama de
la sentencia if, entonces esa es la asignacin que tiene efecto. Si no se asigna valor a
la seal en la sentencia if, entonces tiene efecto la asignacin del valor por defecto
(valor '0'). En cualquier caso, se asigna valor a las tres seales.
En los diseos de los circuitos es una buena prctica asignar valores por defecto
a las seales al comienzo del bloque process, cubriendo de esta forma los valores
no asignados en las ramas de la sentencia if.
2.8.4.
Sentencia case
128
case expresin_case is
when valor_1 =>
sentencias_secuenciales
when valor _2 =>
sentencias_secuenciales
when valor _n =>
sentencias_secuenciales
end case;
Cada trmino valor _i debe ser un valor o conjunto de valores que puede tomar
expresin_case. Los valores valor_1, ... , valor_n deben ser exclusivos entre s y
deben cubrir completamente el conjunto de valores posibles de expresin_case.
Puede emplearse others en la ltima seleccin para cubrir todos los valores no
considerados.
El Cdigo VHDL 2.14, 2.15 y 2.16 describe el multiplexor, el decodificador y el
codificador, respectivamente, usando sentencias case.
-- MUX 4:1 de 8 bits
-- ficheTO: rnux_4xL8bits_aTchPTOcessCase. vhd
library IEEE;
use IEEE. std_logie_1164. all;
entity mux4 is
port ( x
: out std_logic_vector(? downto O);
a, b, e, d : in std_logic_vector(7 downto O);
s
: in std_logic_vector ( 1 downto O) ) ;
end entity mux4;
architecture areh_proeCase of mux4 is
begin
process ( a, b, e, d, s )
begin
case s is
when "00" =>
x <=a;
<=e;
129
-- D ecodificador binario 2 a 4
-- fi chero: decod~ficador2x4_ archProcess Case . vhd
library IEEE;
use IEEE. std_logic_1164. all;
entity decodificador4 is
port ( x
: out std_logic_vector(3 downto O);
s
: in std_logic_vector ( 1 downto O) ) ;
end entity decodificador4;
architecture arch_decProcCase of decodificador4 is
begin
process ( s )
begin
case s is
when "00" = >
11
X <=
0001";
when "01" = >
11
X <=
0010";
when "10" = >
11
X <=
0100";
w hen others = >
11
X <=
1000";
end case;
end process;
end architecture arch_decProcCase;
-- Codificador de prioridad 4 a 2
-- fi chero: codificadorPrioridad4 a2_archProcCase. vhd
library IEEE;
use IEEE . std_logic_1164. all;
entity codificadorPrioridad4a2 is
port ( codigo
out std_logic_vector( 1 downto O);
activo
out std_logic;
X
:
in std_logic_vector(3 downto 0) );
end entity codificadorPrioridad4a2;
130
La sentencia secuencial case es similar a la sentencia select de asignacin concurrente. Si cada rama when de la sentencia case consiste en una nica asignacin
a una seal, entonces ambas sentencias son equivalentes. Es decir, la sentencia de
asignacin concurrente de seleccin mostrada a continuacin en la parte izquierda
puede ser escrita de la forma mostrada en la parte de la derecha.
with expresin_seleccin select
seal <= expr_nuevo_valor_seal_1
when valor_seleccin_1,
expr_nuevo_valor_seal_2
when valor_seleccin_2,
case expresin_seleccin is
when valor_seleccin_1 =>
seal <= expr_nuevo_valor_seal_1;
when valor_seleccin_2 =>
seal <= expr_nuevo_valor_seal_2;
expr_nuevo_valor_seal_n
when valor_seleccin_n;
=>
131
2.8.5.
=>
Bucle for
VHDL proporciona varios tipos de bucle, tales como los bucles for y while, as
como sentencias para el control de la ejecucin del bucle, como la sentencia exit,
que hace que no se ejecuten las restantes iteraciones del bucle, o la sentencia next,
que hace que no se ejecuten las restantes sentencias de la iteracin actual. De todas
estas sentencias, slo un conjunto muy restringido puede ser usado para sntesis.
En esta seccin nos limitaremos a presentar la sentencia for simple, que se emplea
para representar de manera abreviada la repeticin de un conjunto de sentencias.
La sintaxis de esta sentencia es bsicamente la siguiente:
for ndice in rango_bucle loop
sentencias_secuenciales
end loop;
132
El bucle for anterior repite las sentencias secuenciales del cuerpo del bucle un
nmero fijo de iteraciones, que est determinado por el rango de valores rango_bucle.
El ndice del bucle (ndice) especifica el valor del rango de valores que corresponde
con la iteracin actual, con lo cual va tomando los sucesivos valores de rango_bucle.
El ndice del bucle (ndice) no necesita ser declarado, ya que automticamente
pertenece al mismo tipo de dato que rango_bucle.
Para que el bucle for pueda ser sintetizado, es preciso que rango_bucle quede
fijado en el momento de la sntesis, no pudiendo cambiar en funcin del valor de las
seales de entrada.
Los dos ejemplos siguientes pretenden ilustrar el uso de la sentencia for. El primer
ejemplo, mostrado en el Cdigo VHDL 2.17, es un circuito que realiza bit a bit la
operacin XOR de dos seales, cada una de las cuales tiene 4 bits. El rango del bucle
es (WIDTH-1) downto O. Se ha definido la constante WIDTH para hacer el cdigo ms
fcilmente legible y sencillo de modificar en el futuro. El ndice del bucle es i: es
local al bucle y no necesita ser declarado. El ndice toma el valor 3 en la primera
iteracin del bucle, el valor 2 en la segunda iteracin y as sucesivamente, hasta que
en la ltima iteracin adquiere el valor O.
133
entity xor_1seal_4bits is
port ( y : out std_logic;
a : in std_logic_vector(3 downto o) );
end entity xor_1seal_4bits;
architecture xor_1seal_4bits_bucleFor of xor_1seal_4bits is
constant WIDTH : integer := 4;
signal
tmp
: std_logic_vector( WIDTH-1 downto O );
begin
process ( a , tmp )
begin
tmp(O)
<=
a(O);
<=
tmp(WIDTH-1);
<=
<=
<=
<=
a(3)
a(2)
a(1)
a(O)
xor
xor
xor
xor
b(3);
b(2);
b(1);
b(O);
Similarmente, el cdigo plano correspondiente al bucle for del Cdigo VHDL 2.18
es el mostrado a continuacin:
tmp(1) <= a(1) xor tmp(O);
tmp(2) <= a(2) xor tmp(1);
tmp(3) <= a(3) xor tmp(2);
134
Puede considerarse que el bucle for es una forma abreviada de escribir sentencias
repetitivas. El rango del bucle puede emplearse para especificar el nmero de rplicas
que debe realizarse del hardware, lo cual facilita la parametrizacin de los diseos,
por ejemplo, permitiendo ajustar el nmero de bits del circuito.
2.9.
DESCRIPCIN DE LA ESTRUCTURA
135
cornponent nombre_componente
port rnap ( asociacin_puertos_seales );
A continuacin, se muestran dos ejemplos de diseo mediante descripcin estructural. El primer ejemplo es la descripcin estructural al nivel de puertas de un
multiplexor de dos seales de un bit. En la Figura 2.11 se muestra el diagrama y la
implementacin al nivel de puertas del circuito. Cuando la seal de control sO vale
'O', la seal iO se transmite a la salida d, mientras que cuando sO vale '1' es la seal
i 1 la que se transmite a la salida.
Como puede observarse en la Figura 2.11b, este circuito multiplexor est compuesto por un inversor ( inv _1), dos puertas AND de dos entradas (AND2_1, AND2_2)
y una puerta OR de dos entradas (OR2_1). Las seales n1, n2 y n3 tienen por objeto
describir la conexin entre los componentes.
136
MUX2:1
iO
il
a)
sO
b)
-- MUX 2: 1 de 1 bit
-- fich ero: mux2_1 b'it. vhd
library IEEE; use IEEE.std_logic_1164.all;
entity Mux2_1bit is
port ( d
:out std_logic;
std_logic;
iO, i1 : in
std_logic ) ;
sO
: in
end entity Mux2_1 bit;
architecture Mux2_1 bit of Mux2 1bit is
component not1 is
port ( yO : out std_logic;
xO : in std_logic ) ;
end component not1;
component or2 is
port ( yO
: out std_logic;
xO, x1 : in std_logic );
end component or2;
component and2 is
port ( yO
: out std_logic;
xO, x1 : in std_logic );
end component and2;
signa} n1, n2, n3 : std_logic;
begin
Inv_1 : not1 port map ( xO => sO,
And2_1 : and2 port map ( xO => iO,
And2_2 : and2 port map ( xO => i1,
Or2_1 : or2
port map ( xO => n2,
end architecture Mux2_1 bit;
yO
x1
x1
x1
=>
=>
=>
=>
n1);
n1, yO
sO, yO
n3, yO
=>
=>
=>
n2);
n3);
d);
Cdigo VHDL 2.19: Descripcin estructural al nivel de puertas lgicas de un multiplexor de dos
seales de un bit.
137
------------------------------------1
1
1
1
1
1
1
1
1
1
MUX2:1
~ iO
hl...:~ i 1
d3
sO
MUX2:1
a2
b2:
iO
il
d2
d
sO
MUX2:1
al
bl :
iO
il
dl
d
sO
MUX2:1
aO
1
bO
dO
d ..... ~
iO
il
1
1
1
1
sO
1
1
sO
: out
: in
: in
: in
std_logic;
std_logic;
std_logic;
std_logic ) ;
>
>
>
>
dO,
d1,
d2,
d3,
iO
iO
iO
iO
=
=
=
=
>
>
>
>
ao,
a1,
a2,
a3,
i1
i1
i1
i1
= >
= >
= >
=>
bO
b1
b2
b3
,
,
,
,
sO
sO
sO
sO
=
=
=
=
>
>
>
>
sO
sO
sO
sO
);
);
);
);
138
2.9.1.
139
y(5)
iO(O)
i1(0)
i0(1) i1(1)
i0(2)
i1(2)
i0(3) i1(3)
i0(4) i1(4)
i0(5) i1(5)
entity arrayAND is
port ( y
: out stdJogic_vector(7 downto O);
i1, iO : in
std_logic_vector(7 downto O));
end entity arrayAND;
architecture arrayAND of arrayAND is
component and2 is
port ( yO
: out std_logic;
xO, x1 : in std_logic );
end component and2;
begin
gen_array: for I in 7 downto O generate
begin
and_array: and2
140
y(7)
i0(6) i1(6)
i0(7)
i1(7)
parity_IN(O)
parity_IN(7)
std_logic;
std_logic_vector(? downto O));
<= temp(6);
141
2.10.
PARAMETRIZACIN
2.10.1.
2.10.2.
Parametrizacin de la estructura
Cuando se instancia un componente, puede asignarse valor a sus constantes generic. Esto permite adaptar la instancia del componente a la aplicacin en concreto
a la que vaya a destinarse al formar parte del circuito de nivel jerrquico superior.
142
CONCEPTOSBffiCOSDEVHDL
La sintaxis para asignar valor a las constantes generic, al instanciar el componente, es mostrada a continuacin. La palabra reservada component es opcional.
nombre instancia
cornponent nombre_componente
generic rnap e valores_constantes_generic )
port
rnap e asociacin_puertos_seales );
Por ejemplo, podra asignarse el valor 3 ns a la constante generic Tpd, al instanciar un componente and2 llamado puertaAND1, de la forma siguiente:
puertaAND1 : component and2
generic map eTpd => 3ns)
port
map e yO=> sig_out, xO =>sigO, x1 => sig1);
2.11.
143
nombre seal
nombre_ variable
nombre constante
tipo_dato
tipo_dato
tipo_dato
valor_inicial;
valor_inicial;
expresin;
Slo puede asignarse valor a las variables en sentencias incluidas dentro de los
bloques de cdigo secuencial. La asignacin a la variable del nuevo valor se
realiza inmediatamente. Es decir, sin ningn retardo.
- Para asignar valor a una seal se emplea <=. La sintaxis es:
nombre_seal <= forma_de_onda;
Las sentencias de asignacin a seal pueden ser tanto asignaciones concurrentes, como asignaciones secuenciales (aquellas situadas dentro de los bloques
de cdigo secuencial). En ambos casos, salvo que se indique explcitamente el
retardo, se asigna a la seal el nuevo valor una vez transcurrido un retardo 6.
144
CONCEPTOSBffiCOSDEVHDL
Debe tenerse en cuenta que las seales definidas en el port de una entity
tienen una direccin, lo cual condiciona su uso: no puede leerse el valor de una
seal de salida (out), ni asignarse un valor a una seal de entrada (in).
Las seales declaradas en la definicin de la architecture puede ser usadas
tanto en la parte derecha como en la izquierda de las asignaciones.
- Como .se ha explicado anteriormente, la asignacin de valor a las constantes se
realiza al declararlas. Se les asigna el valor obtenido de evaluar expresin:
constant
nombre_constante
: tipo_dato := expresin;
2.12.
145
2.12.1.
Hay cerca de una docena de tipos de datos predefinidos en VHDL estndar IEEE
1076. De ellos, slo algunos son relevantes desde el punto de vista de la sntesis:
integer
boolean
bit
bit_vector
146
0"7777"
8"1111_1111_1111"
"1111_1111 1111"
Operadores
En VHDL hay definidos cerca de 30 operadores. En un lenguaje fuertemente
tipado, la definicin del tipo de dato incluye las operaciones que pueden realizarse
sobre los objetos de ese tipo. Es importante saber qu tipos de dato pueden usarse
con cada operador.
En la Tabla 2.1 se muestran algunos de los operadores definidos en VHDL'93 y
los tipos de dato a los que puede aplicarse cada operador.
Durante la sntesis, los operadores que se emplean en el cdigo VHDL deben ser
implementados mediante componentes fsicos. La complejidad del hardware asociado
a cada operador vara significativamente. Los operadores de desplazamiento (sil, srl,
sla, sra, rol, ror) y el operador xnor no estn definidos en VHDL'87 y no estn
incluidos en el estndar de sntesis IEEE 1076.6 RTL, que define el subconjunto de
VHD L a emplear para sntesis.
En la Tabla 2.2 se indica la precedencia de los operadores, los cuales han sido clasificados en siete grupos. Los operadores del mismo grupo tienen la misma
precedencia. Por ejemplo, en la expresin siguiente:
a + b > e or a < d
en primer lugar se realizar la operacin +, a continuacin se realizarn las operaciones > y <, y finalmente se realizar la operacin or.
147
Operador
Significado
Tipo del
operando a
integer
integer
boolean, bit,
bit_vector
integer
a ** b
abs a
not a
Exponenciacin
Valor absoluto
NOT lgico
a * b
a 1 b
a mod b
a rem b
+ a
- a
a + b
a - b
a &b
Multiplicacin
Divisin
Mdulo
Resto
Identidad
Negacin
Suma
Resta
Concatenacin
a
a
a
a
a
a
sll b
srl b
sla b
sra b
rol b
ror b
a = b
a /= b
a < b
a <= b
a > b
a >= b
a and b
a or b
a nand b
a nor b
a xor b
a xnor b
OR lgica
NAND lgica
NOR lgica
OR exclusiva lgica
NOR exclusiva lgica
Tipo del
operando b
integer
integer
integer
integer
integer
integer
integer
vector, elemento
bit_vector
vector, elemento
integer
vector
cualquiera
mismo que a
boolean
escalar, vector
mismo que a
boolean
boolean,bit,
bit_vector
mismo que a
mismo que a
Precedencia
Mayor
Menor
148
Tipo del
resultado
integer
integer
boolean,bit,
bit_vector
integer
Operadores
** abs not
* 1 mod rem
(identidad y negacin)
+
& +
(suma y resta)
sll srl sla sra rol ror
/= < <= > >=
and or nand nor xor xnor
bit_vector
ea
and b ) or
ee
and d )
e e
a + b ) > e ) or
a < d )
2.12.2.
El propsito original del tipo de dato bit era representar los dos valores binarios
usados en el lgebra booleana y la lgica digital. Obsrvese que la informacin se
comunica dentro de un sistema digital usando seales de valor binario (O 1). En
los sistemas de lgica positiva, cuando el voltaje de la seal tiene un valor "alto",
representa un 1 lgico, y cuando toma un valor "bajo" representa un O lgico.
En los circuitos alimentados por fuentes de tensin de 5 voltios, suele interpretarse
que los voltajes en el rango entre O voltios y 1.5 voltios corresponden a un 'O',
mientras que los voltajes en el rango entre 3.5 voltios y 5 voltios corresponden a
'1' lgico (vase la Figura 2.15). La seal slo debera tomar valores intermedios
cuando pasa de ' O' a ' 1 ' , o viceversa.
149
5V
Ilgico
3.5V
1.5 V
Valor lgico
indefinido
O lgico
ov
Figura 2.15: Rangos tpicos de voltaje para O y 1 lgicos en tecnologas CMOS de 5 voltios.
Aunque todas las seales son interpretadas en los sistemas digitales como O y 1
lgicos, no siempre es posible modelar y simular los sistemas digitales usando slo
seales O lgico y 1lgico. En un sistema real la seal puede tener otros valores. Por
ejemplo, puede valer "alta impedancia" a la salida de un buffer triestado. Asimismo,
puede tomar un valor intermedio entre los valores O y 1 lgicos, debido a que la
seal es generada por dos drivers, uno que intenta ponerla a O lgico y el otro que
intenta ponerla a 1 lgico. Por otra parte, el valor de algunas seales puede no ser
conocido en determinado intervalo de tiempo de la simulacin, por ejemplo porque
esas seales todava no hayan sido inicializadas, es decir, no se les haya asignado
valor.
Con el fin de reflejar mejor las propiedades del hardware digital, en el estndar
IEEE 1164 se introdujeron nuevos tipos de datos, que extendan los tipos bit y
bit_vector.
Estos nuevos tipos de datos fueron definidos en el paquete IEEE. std_logic_1164.
Entre estos nuevos tipos, sin duda los ms ampliamente usados son std_logic y
std_logic_vector. El tipo std_logic es ms verstil que bit, ya que aparte de los
valores 'O' y ' 1 ' , puede tomar otros siete valores.
Para poder usar en los diseos estos tipos de dato, es necesario especificar que se
desea usar el paquete IEEE. std_logic_1164. Esto se hace escribiendo las siguientes
sentencias al comienzo del cdigo, donde library y use son palabras reservadas:
library IEEE;
use IEEE.std_logic_1164.all;
150
std.Jogic
El tipo de dato std_logic pueden tomar nueve valores. Adems de los valores
'O' y ' 1 ' , pueden tomar otros valores usados para modelar valores intermedios o
desconocidos de la seal. De estos valores, los ms comunes son los tres siguientes:
'U' El valor de la seal est sin inicializar. Es decir, an no se ha asignado valor a
la seal.
'X'
'Z' Alta impedancia. El valor indica que la seal ha quedado desconectada. Los
buffers triestado proporcionan una salida con este valor (vase la Seccin l. 9.1).
Los restantes posibles valores de una seal del tipo std_logic son: 'W' (desconocida dbil), 'L' (cero dbil), 'H' (uno dbil) y'-' (don't care, que puede traducirse
como "no importa").
Los valores 'L' (cero dbil) y 'H' (uno dbil) indican que la seal es obtenida de
circuitos de lgica cableada, en los cuales la corriente es dbil. En la actualidad estos
valores raramente se usan, ya que no suelen emplearse circuitos de lgica cableada.
El valor '-' ( don't ca re) se usa para facilitar el diseo lgico. Puede usarse como
valor de entrada, con el fin de hacer ms compacta y fcil de entender la tabla de la
verdad. Por ejemplo, la tabla de la verdad del codificador 4 a 2 con prioridad diseado
en el Cdigo VHDL 2.6, 2.9, 2.13 y 2.16 puede expresarse de manera compacta y
descriptiva usando don't care:
X
o1
oo 1
oo o 1
oo o o
codigo
activo
1 1
o1
oo
oo
151
Cuando don't care se usa como valor de salida, indica que el valor exacto ('O'
'1 ') no es importante. Esto ocurre cuando algunas de las combinaciones de entrada
no son usadas. Al indicar que la salida es don't care, se deja libertad al algoritmo de
sntesis para que asigne a la salida aquel valor que permita reducir la complejidad
del circuito.
Algunos comentarios respecto a la interpretacin que hacen las herramientas de
sntesis de los valores del tipo std_logic:
- Los valores 'O' y 'L' son interpretados como O lgico.
- Los valores '1' y 'H' son interpretados como 1 lgico.
- El valor 'z' es interpretado como alta impedancia.
- Los valores '-'y 'X' son interpretados como don't care. As, en algunos diseos
mostrados en el Tema 6 se usar 'X' como don't ca re.
- Algunas herramientas de sntesis no aceptan los valores 'U' y 'W' . Por el
contrario, otras interpretan 'W' como don't ca re.
std_logic_ vector
En general, un vector es una coleccin de elementos del mismo tipo de dato. Cada elemento del vector es identificado mediante un ndice. El tipo de dato
std_logic_vector es un vector de elementos del tipo std_logic.
El siguiente ejemplo ilustra el uso de std_logic_vector. Supongamos una seal
de 8 bits llamada a. Su declaracin es:
signal
La declaracin indica que la seal tiene 8 bits, que estn indexados desde 7 hasta
O. El bits ms significativo, es decir, el situado ms a la izquierda, tiene el ndice 7.
El bit menos significativo, es decir, el situado ms a la derecha, tiene el ndice O.
Es posible acceder a uno de los bits usando su ndice. Por ejemplo: a(2), a(7).
Tambin, es posible acceder a una conjunto de bits especificando su rango. Por
ejemplo: a(7 downto 2), a(2 downto O).
Otra forma de std_logic_vector es usando un rango ascendente, como en:
signal
152
a: std_logic_vector (Oto 7 );
Operadores
La definicin de un tipo de dato incluye no slo el conjunto de valores que puede
tomar, sino que tambin incluye el conjunto de operaciones que pueden realizarse
sobre los datos de ese tipo. En VHDL pueden emplearse funciones con el mismo
nombre para operados de distinto tipo. Es decir, pueden definirse varias funciones
con el mismo nombre, cada una para un tipo diferente de dato. Esto se denomina
sobrecarga de los operadores.
En el paquete IEEE. std_logic_1164 se han sobrecargado todos los operadores
lgicos (and, or, nand, nor, xor, xnor) para std_logic y std_logic_vector. Obsrvese que en el paquete IEEE. std_logic_1164 no se han sobrecargado las operaciones
aritmticas y por tanto estas operaciones no pueden aplicarse a estos tipos de datos.
Conversin de tipos
En el paquete IEEE. std_logic_1164 se han definido las funciones para la conversin entre los tipos bit y std_logic, as como entre los tipos bit_vector y
std_logic_vector. En la Tabla 2.3 se muestran estas funciones.
Tabla 2.3: Funciones del paquete IEEE.stcLlogic_ll64.
Conversin de:
std_logic
bit
std_logic_vector
bit_vector
a:
bit
std_logic
bit_vector
std_logic_vector
Funcin
to_bit(arg)
to_stdulogic(arg)
to_bitvector(arg)
to_stdlogicvector(arg)
Por ejemplo, pueden realizarse las siguientes asignaciones entre estas seales:
153
s1 <= to_stdlogicvector( b1 );
b2 <= to_bitvector( s1 and s2 );
s3 <= to_stdlogicvector( b1 ) or s2;
2.12.3.
Operadores relacionales
Los operadores relacionales (=, /=, <, <=, >, >=) pueden ser empleados para
comparar dos datos de tipo vector. Los dos operandos deben tener el mismo tipo de
elementos, pero sus longitudes pueden ser diferentes.
Cuando se aplica el operador, los dos vectores son comparados elemento a elemento. La comparacin comienza por el elemento situado ms a la izquierda y contina
hasta que puede establecerse cul es el resultado. Si se alcanza el final de un vector
antes que el final del otro, entonces se considera que el primer vector (el de menor
longitud) es menor que el segundo, y por tanto, se considera que los dos vectores no
son iguales.
Por ejemplo, cada una de las siguientes operaciones devuelve el valor true:
11
o11 = o11
11
11
11
'
11
o11
11
>
11
o1o
11
'
11
o11
11
'
11
o11 o
11
>
11
o11
11
Los vectores de diferente longitud pueden generar en ocasiones resultados inesperados (o dicho de otra manera, errores sutiles difciles de localizar). Por ejemplo,
supongamos que las seales s1 y s2 tienen diferente longitud y escribimos:
if ( s1 = s2 ) then
el se
154
Operador concatenacin
El operador de concatenacin, &, permite concatenar elementos, segmentos de
vectores y vectores completos, para formar vectores de mayor longitud. Por ejemplo,
la siguiente sentencia desplaza los elementos del vector a dos posiciones hacia la
derecha e insertar dos bits 'O' por la izquierda:
y<= "00" & a( 7 downto 2 );
La siguiente sentencia rota los elementos del vector hacia la derecha dos posiciones:
y<= a( 1 downto O) & a( 7 downto 2 );
Agregacin de vectores
La agregacin no es un operador, sino una construccin que permite asignar valor
a vectores. La forma ms sencilla de expresar una agregacin es usar una coleccin de
valores escritos entre comillas dobles. Por ejemplo, pueden realizarse las asignaciones
siguientes:
x1 <= "101111";
x2 <= 0"57";
x3 <= H"2F";
Representacin binaria
del decimal 47
Representacin octal
del decimal 47
Representacin hexadecimal del decimal 47
Otra posibilidad es especificar la lista de valores, cada uno en su correspondiente posicin. Este tipo de agregacin se denomina agregacin mediante asociacin
posicional. La asignacin
y<= "10101010";
es equivalente a:
y <=
e, 1 , , , o, , , 1 , , , o, , , 1, , , o, , , 1, , , o, ) ;
155
para especificar de manera explcita el valor para cada ndice. Esta forma de agregacin se denomina asociacin mediante nombre. La sentencia anterior puede escribirse
de la forma siguiente:
y <= ( 7 => ' 1 ' ' 6 => 'o' ' 5 => ' 1 ' ' 4 => 'o' '
3 => ' 1 ' ' 2 => 'o' ' 1 => ' 1' ' o => 'o' ) ;
o equivalentemente, con las asociaciones en un orden cualquiera:
y <= ( 7 => ' 1 ' ' 3 => ' 1 ' ' 5 => ' 1 ' ' 1 => ' 1 ' '
6 => 'o' ' 2 => 'o' ' 4 => 'o' ' o => 'o' ) ;
Esta asignacin indica que el valor asignado al componente con ndice 7 (es
decir, y(7)) es '1', que el valor asignado el componente con ndice 6 es '0', y as
sucesivamente.
Tambin, es posible combinar los ndices, como por ejemplo en:
y <= ( 7
6
1 => '1''
o => 'o' ) ;
o bien, emplear la palabra reservada others para referirse a todos los ndices que
no han sido nombrados. Por ejemplo:
y<= ( 7
others
1 => '1',
=> '0' );
y<= ( others
=> '0' );
2.12.4.
156
S pueden realizarse operaciones aritmticas sobre los datos del tipo integer. Por
ejemplo, para realizar la suma de las seales a y b, puede emplearse el tipo integer:
signal
a, b, suma : integer;
suma <= a + b;
unsigned y signed
Los tipos unsigned y signed estn definidos en el paquete IEEE. numeric_std.
Son vectores de elementos del tipo std_logic:
- Para el tipo de dato unsigned, el vector se interpreta como un nmero
binario sin signo, donde el elemento situado ms a la izquierda es el bit ms
significativo del nmero binario.
- Para el tipo de dato signed, se interpreta el vector como un nmero binario
con signo, en el formato de complemento a 2. El elemento situado ms a la
izquierda es el bit ms significativo del nmero binario, que representa el signo
del nmero.
Obsrvese que los tres tipos de dato std_logic_vector, unsigned y signed estn
definidos como vectores de elementos del tipo std_logic. Puesto que VHDL es un
lenguaje fuertemente tipado, estos tres tipos son considerados como tipos de datos
independientes, lo cual por otra parte es razonable ya que los tres tipos de dato son
interpretados de manera diferente.
157
Para poder usar los tipos de dato unsigned y signed, debe incluirse la sentencia
especificando que va a usarse el paquete IEEE. numerie_std. Asimismo, puesto que
el paquete IEEE. numeric_std emplea el tipo de dato std_logic, debe indicarse que
va a usarse el paquete IEEE. std_logic_1164. Es decir, las primeras sentencias del
diseo deben ser:
library IEEE;
use IEEE.std_logie_1164.all;
use IEEE.numerie_std.all;
Operadores
Puesto que la finalidad del paquete IEEE. numerie_std es facilitar la realizacin
de operaciones aritmticas, en este paquete se sobrecargan todos los operadores
aritmticos: abs, *, 1, mod, rem, + y -. Por ejemplo, las siguientes sentencias son
vlidas:
signal a, b, e, d
a <= b + e;
<= b + 1;
<= ( 5 + a + b ) - e;
d
e
158
011 11 >
11
1000 11
Funciones
Se definen algunas funciones nuevas en el paquete IEEE. numeric_std, entre las
cuales estn las siguientes:
- shift_left (a, b), shift_right (a, b), rotate_left (a, b), rotate_right (a, b):
del operando a, que debe ser del tipo unsigned y signed. El operando b es
de tipo natural y representa el nuevo nmero de bits del dato. El resultado
es del mismo tipo que el operando a.
- std_match(a, b): se emplea para comparar vectores que tienen el valor'-' (don't
159
o1
oo 1
oo o 1
oo o o
codigo
activo
1 1
o1
oo
oo
diseo
"1---"
"01--"
"001-"
incorrecto!
else
else
else
160
Conversin de:
std_logic_vector, signed
std_logic_vector, unsigned
unsigned, signed
unsigned, signed
integer, natural
integer
integer
a:
unsigned
signed
Funcin
unsigned(arg)
signed(arg)
std_logic_vector
integer
unsigned
signed
std_logic_vector
std_logic_vector
integer
std_logic_vector(arg)
to_integer(arg)
to_unsigned(arg,size)
to_signed(arg,size)
integer ---+ unsigned/signed
std_logic_vector
std_logic_vector
unsigned/ signed ---+ integer
---+
---+
( 7 downto
unsigned
std_logic_vector ( 7 downto
o
o
) ;
) ;
u1 <= unsigned( x1 ) ;
x2 <= std_logic_vector( u2 );
161
Error
Error
Bien, casting
Bien, funcin de conversin
Las operaciones aritmticas no estn sobrecargadas para la mezcla entre los tipos
signed y unsigned, por lo tanto, la sentencia siguiente produce error:
u7 <= sg + u1;
Para poder realizar la asignacin, es necesario convertir el dato del tipo signed
a unsigned:
u7 <= unsigned( sg ) + u1;
-- Bien, casting
La conversin anterior, del tipo signed a unsigned, implica cambiar la interpretacin que se hace del vector. Por ejemplo, 1111 es -1 para el tipo signed,
mientras que es 15 para el tipo unsigned.
11
11
Las siguientes dos asignaciones a seales del tipo std_logic_vector son incorrectas:
s3 <= u3;
s4 <= 5;
Error
Error
162
s3 <= std_logic_vector( u3 );
s4 <= std_logic_vector ( to_unsigned(5,4) );
Bien, casting
Bien, func. conversin
Para solucionar el problema, es preciso convertir los operandos al tipo unsigned o signed, realizar la suma, y a continuacin convertir el resultado al tipo
std_logic_vector.
s5 <= std_logic_vector( unsigned(s2) + unsigned(s1) );
s6 <= std_logic_vector( unsigned(s2) + 1 );
2.12.5.
Bien
Bien
Los tipos de datos time y string son tiles, en el proceso de depuracin ( debugging) del modelo, para mostrar mensajes que son generados durante la simulacin.
Las variables del tipo time son usadas para representar el tiempo simulado. La
unidad por defecto de este tipo de variables es el fs (femtosegundo = 10- 15 s). Los
valores del tiempo pueden representarse en otras unidades escribiendo la unidad
de tiempo tras el valor del tiempo, el cual es escrito como una constante entera o
real. Las unidades de tiempo disponibles son: fs, ps, ns, us (microsegundos), ms,
sec, min y hr (horas). Adems, existe una funcin estndar (llamada now, sin
argumentos), que devuelve el valor actual del tiempo simulado.
Para mostrar mensajes de texto y valores de datos en la pantalla, es preciso
convertir todos los argumentos de la sentencia report (la sentencia "print" de VHDL)
a tipos de dato string. Como en la mayora de los lenguajes de programacin, un
string se define simplemente como un vector de caracteres.
2.12.6.
163
Tipos enumerados
Adems de los tipos estndar de datos descritos anteriormente, es posible definir
tipos enumerados de datos.
Por ejemplo, supongamos una seal llamada opcode, que representa el cdigo de
operacin de un circuito. Suponiendo que slo puede tomar cuatro valores (suma,
resta, salto y parar), entonces es posible definir un nuevo tipo (type), llamado, por
ejemplo, opcode_ type, de la manera siguiente:
type opcode_type is (SUMA, RESTA, SALTO, PARAR);
164
VHDL permite al usuario definir sus propios tipos vectoriales. Por ejemplo,
vectores lD en los cuales los componentes sean a su vez de tipo vectorial lD, por
ejemplo std_logic_vector. Estos vectores unidimensionales, cuyos componentes son
a su vez vectores unidimensionales, se denominan vectores lD x lD.
Pueden definirse tipos vectoriales 2D (es decir, bidimensionales) con componentes, por ejemplo, del tipo std_logic. Tambin pueden definirse tipos vectoriales con
dimensin mayor que dos, si bien generalmente no son sintetizables.
En general, puede declararse un nuevo tipo vectorial empleando la sintaxis mostrada a continuacin:
type nombre_ tipo is array especificacion_dimension of tipo_dato;
Puede declararse una constante y una seal de este tipo, a las cuales se asignan
los nombres data y reg_f ile respectivamente, y asignar valor a la constante, de la
forma mostrada a continuacin:
constant data : regFile_type
( ( '0', '0', '1',
( '1' ' '0'' '1',
( '0'' '1'' '0''
( '1'' '0'' '1''
signal reg_file : regFile_type;
) '
) '
) ) ;
Para referirse a los elementos de los objetos de tipo vectoriallD x lD, se emplean
dos pares de parntesis. Por ejemplo, reg_file (2) (3).
En el Cdigo VHDL 5.14 se muestra un diseo en el cual se define un tipo
vectorial lD x lD similar al del ejemplo anterior y se declara una seal de ese tipo.
El siguiente ejemplo muestra la declaracin de un tipo vectorial bidimensional,
llamado matriz2D, y de una constante y una seal de ese tipo. Obsrvese que la
forma de asignar valor a las constantes de un tipo vectorial lD x lD y de un tipo
165
signal mem_data :
'0''
'1''
'0''
'1''
'0''
'0''
'1''
'0''
'1''
'1''
'0''
'1''
matriz2D;
'1''
'0''
'1''
'0''
Para referirse a los elementos de los objetos de tipo vectorial 2D, se emplea un
nico par de parntesis. Por ejemplo, mem_data (2, 3).
2.13.
ATRIBUTOS
Puede considerarse que los atributos son propiedades de los tipos de datos. No
todos los atributos de los tipos estndar de datos son soportados para sntesis. En
la Tabla 2.5 se muestran algunos de los atributos que son soportados por la mayora
de las herramientas de sntesis. Por otra parte, VHDL permite al usuario definir sus
propios atributos.
Por ejemplo, dada la seal
signal d : std_logic_vector( 7 downto O);
d' high=7
d'left=7
d'length=8
d'range=(7 downto O)
d' reverse_range=(O to 7)
d'right=
Asimismo, existen atributos que resultan tiles para programar bancos de prueba
y que, por tanto, no necesitan ser sintetizados. Un atributo particularmente til es
<tipo>'image(seal)
el cual se usa para convertir el valor de una seal a un string, de modo que pueda
ser mostrado en la consola (con el fin de depurar o monitorizar).
La lista completa de atributos soportados por VHDL es bastante extensa. No
obstante, slo son necesarios unos pocos para describir la mayor parte de los diseos
de circuitos digitales y bancos de pruebas. Se irn introduciendo estos atributos en
los casos de estudio explicados en los siguientes temas.
166
Tabla 2.5: Algunos atributos soportados por la mayora de las herramientas de sntesis. La
nomenclatura empleada en la tabla se explica a continuacin. < tipo > : tipo de dato. < vectorlD > :
tipo vectorial lD. <seal> : seal.
Atributo
Significado
<tipo>'
<vector1D>'range
<vector1D>'reverse_range
<vector1D>'length
<vector1D>'low
<vector1D>'high
<vector1D>'left
<vector1D>'right
<seal>'stable
<seal>'event
bit_vector o std_logic_vector.
2.14.
LIBRERAS
167
A excepcin de los tipos bit y bit_vector, todos los dems tipos precisan de la
inclusin de alguna librera de diseo. Por ejemplo, es necesario usar la librera de
IEEE (que es proporcionada en todos los simuladores) para poder usar los tipos de
datos std_logic, std_logic_vector, unsigned y signed.
VHDL permite organizar las libreras, estructurando su contenido en sub-libreras
denominadas packages. Un beneficio aadido de ello es que incluir nicamente los
tipos de datos necesarios para el diseo reduce el tamao del cdigo y simplifica la
simulacin del programa en VHDL.
Por este motivo, adems de especificar qu libreras deben ser incluidas, conviene
que el diseador indique qu paquetes en concreto de la librera son usados en la
definicin del circuito. Si no se especifica el paquete, o si un mismo objeto est
definido en varios paquetes, es preciso referirse a l usando la notacin punto:
librera.paquete.objeto
Entre los paquetes ms comnmente usados, cabe mencionar los siguientes, pertenecientes a la librera IEEE:
IEEE. std_logic_1164
IEEE. numeric_std
IEEE.math_real
168
Las herramientas de simulacin y sntesis con VHDL suelen incluir otras libreras,
que pueden ser examinadas desde la propia herramienta.
Existen libreras y paquetes que son cargados por defecto, con lo cual no necesitan
ser incluidas. Las ms notables son las dos siguientes:
Librera por defecto donde se compilan todos los tipos, las
funciones, entity, architecture, package, etc. definidos
por el usuario.
Contiene la mayora de las definiciones y construcciones
estndar soportadas por VHDL.
work
std
2.15.
ASSERT
No es un error.
Aviso.
Error.
Error grave que provoca que termine la simulacin.
169
2.16.
SUBPROGRAMAS
Los subprogramas permiten definir fragmentos de cdigo secuencial, contribuyendo a hacer el cdigo VHDL ms legible, portable y compacto. Hay dos tipos de
subprogramas: las funciones y los procedimientos.
Lo subprogramas (funciones y procedimientos) pueden ser definidos dentro de
paquetes (package), de modo que sean fcilmente reutilizados en diferentes proyectos, o en el propio cdigo principal del diseo. En este ltimo caso, los subprogramas
deben ser definidos dentro de la seccin de declaracin de la entity, architecture
o de los bloques process.
2.16.1.
Funciones
170
si se trata de una seal. El tipo del parmetro formal puede ser cualquiera de los
tipos sintetizables, boolean, std_logic, integer, etc.
Cuando se declaran parmetros formales vectoriales o enteros, no debe especificarse su rango. Por ejemplo, no hay que especificar el range en el caso de los
parmetros integer, ni to / downto para los parmetros std_logic_vector. Esto
facilita la reutilizacin de la funcin en diferentes contextos.
La funcin devuelve un nico valor, cuyo tipo debe especificarse al declarar la
funcin. Por ejemplo, la siguiente funcin
function f ( c1, c2
signal s
integer;
std_logic_vector) return boolean is
end function f;
recibe tres parmetros formales: las constant c1 y c2, de tipo integer, y la signal
s, de tipo std_logic_vector. Obsrvese que no se especifica el rango de valores de
los parmetros enteros, ni tampoco el rango del ndice del parmetro vectorial. El
valor que devuelve la funcin es de tipo boolean.
Para ilustrar las explicaciones anteriores, en el Cdigo VHDL 2.23 se muestra
la declaracin de una funcin que acepta un vector del tipo std_logic_vector y
devuelve el nmero entero que equivale al vector, interpretando ste como un nmero
binario sin signo.
171
Cdigo VHDL 2.23: La funcin conv_integer convierte un parmetro del tipo std_logic_vector
a un entero.
2.16.2.
Procedimientos
begin
sentencias secuenciales
172
En este caso, en la lista de parmetros formales no slo se especifican los parmetros formales de entrada, sino tambin los parmetros formales de salida. Es decir,
aquellos que son calculados en el procedimiento.
Un procedimiento puede tener un nmero cualquiera de parmetros formales,
cada uno de los cuales debe tener un modo: in, out o inout. Los parmetros formales
de un procedimiento pueden ser constantes, variables y seales. La sintaxis para
declarar cada parmetro formal en la lista de parmetros, segn se trate de una
constante, una seal o una variable, es la siguiente:
constant
signal
variable
nombre constante
nombre seal
nombre variable
modo tipo_dato;
modo tipo_dato;
modo tipo_dato;
in
in
out
in out
std_logic;
std_logic;
std_logic_vector(7 downto O);
integer range O to 99 ) is
173
tiene tres entradas: la constante de tipo std_logic a, y las seales del tipo std_logic b
y c. Se ha omitido la palabra reservada constant para el primer parmetro formal de
entrada, ya que por defecto se sobreentiende que es una constante. El procedimiento
tiene dos parmetros formales de salida: las seales x e y. Esta ltima tiene el modo
inout.
La invocacin del procedimiento es una sentencia por s misma, que puede formar
parte de cdigo concurrente o secuencial.
- Cuando el procedimiento es invocado fuera de un bloque de cdigo secuencial,
entonces la invocacin es una sentencia concurrente. Esta sentencia concurrente
es equivalente a un bloque process que contuviera la llamada al procedimiento,
seguida de una sentencia wait on cuya lista de sensibilidad contuviera todos
los parmetros del procedimiento que son seales con modo in e in out. Los
procedimientos invocados en sentencias concurrentes no pueden tener parmetros formales variable.
- Cuando el procedimiento es invocado en un fragmento de cdigo secuencial, por
ejemplo, dentro de un bloque process, entonces no existe un wait implcito
al final del procedimiento. Esto significa que, una vez ejecutada la ltima
sentencia del procedimiento, se ejecuta la sentencia secuencial siguiente a la
de invocacin del procedimiento.
Los parmetros actuales de la invocacin al procedimiento se hacen corresponden
con los parmetros formales del procedimiento, bien por asociacin posicional o bien
mediante la sintaxis
param_formal => param_actual
174
Cdigo VHDL 2.24: Procedimiento que devuelve dos parmetros de entrada ordenados.
2.16.3.
175
- U na funcin es invocada como parte de una sentencia, mientras que la invocacin a un procedimiento es una sentencia en s misma.
- En los procedimientos puede usarse la sentencia wait, en las funciones no. En
todo caso, la sentencia wait no es sintetizable.
- La declaracin de funciones y procedimientos puede realizarse o bien dentro
de packages, con lo cual se facilita su reutilizacin desde diferentes diseos, o
bien en el cdigo principal del diseo (en la parte declarativa de la entity, de
la architecture o de un bloque process).
El caso prctico descrito en la Seccin 4.5 ilustra el empleo de procedimientos y
funciones.
2.17.
PAQUETES
2. La segunda parte, esto es, el cuerpo del paquete (package body), es necesaria
slo cuando se han declarado subprogramas (procedimientos o funciones) en
176
"11111111";
177
package pack1 is
function conv_integer (signal vector : std_logic_vector)
return integer;
end package pack1;
package body pack1 is
function conv _integer ( signal vector : std_logic_vector)
return integer is
variable resultado, pot : integer range O to 2**vector' length-1;
begin
pot := 1;
if ( vector( vector' low)=' 1 ') then
resultado := 1;
el se
resultado := O;
end if;
for i in (vector'low+1) to (vector'high) loop
pot := pot*2;
if (vector(i)=' 1 ') then
resultado := resultado + pot;
end if;
end loop;
return resultado;
end function conv _integer;
end package body pack1;
entity conv_int1 is
port ( y : out integer range O to 15;
a : in std_logic_vector ( 3 downto O) ) ;
end entity conv_int1;
architecture conv _int 1 of conv _int 1 is
begin
y <= conv_integer(a);
end architecture conv_int1;
178
2.18.
LECTURAS RECOMENDADAS
179
2.19.
EJERCICIOS DE AUTOCOMPROBACIN
Ejercicio 2.1
Escriba el cdigo VHDL que describe el comportamiento del circuito de la Figura 2.16, usando para ello sentencias de asignacin concurrente y operadores lgicos.
x
e=:>---- :
OR2_1
r
:~:;;~_
xory
OR2_2
,. ............................
..~. ~. -=.~-. ..
NOT
1
xoryorz
>--i--------+---1
-r1 - - - - - - - - . . - , '
>D--!--_..r~ ::::::: :~
......................;
: .............................. ;
Ejercicio 2.2
Realice nuevamente el diseo del circuito mostrado en la Figura 2.16, pero esta
vez describa la estructura del circuito, usando como componentes dos puertas OR
de dos entradas y una puerta inversora.
Simule este diseo empleando el banco de pruebas que program al resolver el
Ejercicio 2.1. Compruebe el correcto funcionamiento del circuito observando visualmente sus seales de salida.
Ejercicio 2.3
Dado el Cdigo VHDL 2.27, indique cul es el valor de las seales x1, x2, x3, x4,
x5, x6, x7 y x8 una vez se han realizado las operaciones de asignacin.
180
library IEEE;
use IEEE. std_logic_1164. all;
entity codigo is
end entity codigo;
architecture codigo of codigo is
signal
signal
signal
signal
signal
signal
signal
signal
signal
signal
signal
signal
a :
b :
e :
d :
x1:
x2:
x3:
x4:
x5:
x6:
x7:
x8:
begin
x1
x2
x3
x4
x5
x6
x7
x8
<=a & e;
<=e & b;
<= b xor e;
<= a and b(3);
<= d sll 2;
<= d rol 2;
<= (5=> '0', others=>'1');
<= (5=> '0', others=>'1');
Ejercicio 2.4
VHDL permite al usuario definir nuevos tipos de datos. En particular, la definicin de nuevos tipos de datos enteros, enumerados y compuestos puede realizarse
siguiendo la sintaxis indicada a continuacin.
Tipo de dato entero:
type identificador is range rango_del_tipo;
181
tipo1
tipo2
tipo3
tipo4
is
is
is
is
range O to 10;
range 21 downto 11;
(s1, s2, s3, s4);
Para estos cuatro tipos de datos, indique el valor de los atributos sealados en
la tabla siguiente:
Atributo
tipol 'left
tipol'high
tipo2'left
tipo2'high
tipo3'left
tipo3'high
tipo4'left(l)
tipo4'high(l)
tipo4'range(l)
tipo4'length(l)
Valor
Atributo
tipol 'right
tipol'low
tipo2'right
tipo2'low
tipo3'right
tipo3'low
tipo4'right(2)
tipo4'low(2)
ti po4 'reverse_r ange (2)
tipo4'length(2)
Valor
Ejercicio 2.5
Escriba el cdigo VHDL que describe el comportamiento del circuito de la Figura 2.17 usando sentencias de asignacin concurrente y operadores lgicos. Tenga
en cuenta que cada inversor tiene un retardo de 1 ns. Este circuito, denominado
"one-sho-f', tiene como salida un pulso de corta duracin cuando la seal de entrada
pasa de valer 'O' a valer '1' .
.....
~... . . . . . . . . . . . . . . .
.~>--- ~-r=-no-t1
~~
!"""~'~'~'~""''"'"!
~.~
.
?
~
~
m~
..r.---i-g:u
--not2_l_
'....... ........ . .-..........[.'
.............-----;..........
.... :_
l.. . . . . . . . . . J
1ns
-+----ll
.. m
........
l .........................~.
..... m,
____..___,
... ..t>o...
...... .........__,
.
1ns
1ns
182
.........................................
Ejercicio 2.6
Disee un decodificador 2:4 con entrada enable, como el mostrado en la Figura 2.18. La architecture debe describir el comportamiento del circuito, empleando
para ello una nica sentencia if dentro de un bloque process.
---+
io
---+
il
en
do
---+
dl
---+
d2
---+
d3
---+
en il io
o
o o
o 1
o
d3 d2 dl do
o o o o
o o o
o o 1 o
o 1 o o
o o o
Ejercicio 2. 7
Considere el siguiente fragmento de cdigo VHDL:
std_logic;
x1 else
183
Ejercicio 2.8
signal x
signal y
'1' else
'1' else
Ejercicio 2.9
signal a, b, r
signal x, y
r <= a+b
el se
when x+y>1
a-b-1 when x>y and y!=O el se
a+1;
Ejercicio 2.10
184
when "11'',
(a or
'0'
b)
Ejercicio 2.11
when
when
when
when
cO,
c1 1 c3
c2
c4,
others;
c5,
Ejercicio 2.12
Ejercicio 2.13
185
Ejercicio 2.14
Dibuje el diagrama conceptual correspondiente a las sentencias if anidadas siguientes:
if boolean_expr_1 then
if boolean_expr_2 then
a <= valor_expr_a_1;
el se
a <= valor_expr_a_2;
end if;
el se
if boolean_expr_3 then
a <= valor_expr_a_3;
el se
a <= valor_expr_a_4;
end if;
end if;
Ejercicio 2.15
Dibuje el diagrama conceptual correspondiente a la sentencia case siguiente,
suponiendo que expr_case tiene cinco posibles valores: cO, c1, c2, c3 y c4.
case expr_case is
when cO =>
a <= valor_expr_a_O;
b <= valor_expr_b_O;
when c1 =>
a<= valor_expr_a_1;
b <= valor_expr_b_1;
when others =>
a <= valor_expr_a_n;
b <= valor_expr_b_n;
end case;
2.20.
para esperar hasta que el UUT pueda producir las salidas correspondientes a las
entradas aplicadas. La sentencia wait situada al final del bloque process, no tiene
ninguna indicacin acerca del tiempo que hay que esperar. Este tipo de sentencia
wait se emplea para detener el proceso, ya que "espera para siempre".
Library IEEE;
use IEEE. std_logic_1164. all;
entity puerta_nor3 is
port( f
: out std_logic;
x, y, z : in stdJogic);
end entity puerta_nor3;
architecture fluj o_de_datos of puerta_nor3 is
signal xory, xoryorz: std_logic;
begin
xory
< = x or y; -- Tres asignaciones concurrentes
xoryorz < = xory or z;
f
<= not xoryorz;
end architecture fluj o_de_datos;
-- Banco de pruebas
library IEEE;
use IEEE. std_logic_1164. all;
entity bp_puerta_nor3 is
end entity bp_puerta_nor3;
architecture bp_puerta_nor3 of bp_puerta_nor3 is
signal f
: std_logic; -- Conectar salida UUT
signal x, y, z : std_logic; -- Con ectar entradas UUT
component puerta_nor3 is
port ( f
: out std_logic;
x, y, z : in std_logic);
end component puerta_nor3;
begin
-- Instanciar y con ectar UUT
uut : component puerta_nor3 port map
( f = > f, x = > x, y = > y, z = > z);
gen_ ve e_ test : process
begin
x < = '0'; y < = '0'; z < = '0'; wait for
x < ='O'; y < = 'O';z < = '1';waitfor
x < ='O'; y < = '1';z < = 'O';waitfor
x < ='O'; y < = '1';z < = '1';waitfor
x < = '1'; y < = '0'; z < = '0'; wait for
x < = '1'; y < = '0'; z < = '1'; wait for
x < = '1'; y < = '1'; z < = '0'; wait for
X < = '1'; y < = '1'; Z < = '1';
wait;
-- Final de la simulacin
end process gen_ ve e_ test;
end architecture bp_puerta_nor3;
100
100
100
100
100
100
100
ns;
ns;
ns;
ns;
ns;
ns;
ns;
188
OR2_1
~~~~~
...
xory
OR2_2
NOT
xoryorz
r:
... J
: .......... ............;
library IEEE;
use IEEE. std_logic_1164. all;
entity puerta_nor3 is
port(
f
: out std_logic;
x, y, z : in std_logic);
end entity puerta_nor3;
architecture estructura of puerta_nor3 is
component or2 is
port ( y
: out std_logic;
x1, x2 : in std_logic);
end component or2;
component not 1 is
port ( y : out std_logic;
x : in std_logic);
end component not1;
signal xory, xoryorz: std_logic;
begin
or2_1 : or2 port map ( y => xory,
x1 = > x,
x2 = > y);
or2_2 : or2 port map ( y = > xoryorz, x1 = > xory, x2 = > z);
Inv_1 : not1 port map ( y => f,
x = > xoryorz);
end architecture estructura;
189
Seal
x1
x2
x3
x4
x5
x6
x7
x8
Valor
10010
00101100
1110
1
0000
0011
11011111
11111011
190
Atributo
tipo1 'left
tipo1'high
tipo2'left
tipo2'high
tipo3'left
tipo3'high
tipo4'left(1)
tipo4'high(1)
tipo4'range(1)
tipo4'length(1)
Valor
o
10
21
21
s1
s4
1
4
1 to 4
4
Atributo
tipo1 'right
tipo1'low
tipo2'right
tipo2'low
tipo3'right
tipo3'low
tipo4'right(2)
tipo4'low(2)
tipo4'reverse_range(2)
tipo4'length(2)
Valor
10
o
11
11
s4
s1
o
o
Oto 5
6
191
-- Banco de pruebas
library IEEE;
use IEEE. std_logic_1164. all;
entity bp_oneShot is
end entity bp_oneShot;
architecture bp_oneShot of bp_oneShot is
signal y : std_logic; -- Conectar salida UUT
signal x : std_logic; -- Conectar entradas UUT
component oneShot is
port (y : out std_logic;
x : in std_logic ) ;
end component oneShot;
begin
-- Instanciar y conectar UUT
uut : component oneShot port map
( y => y, x = > x);
x <=
' O' ,
192
entity Dcd2x4 is
port ( d3, d2, di, dO : out std_logic;
ii, iO
: in
std_logic;
en
: in
std_logic ) ;
end entity Dcd2x4;
architecture Dcd2x4 of Dcd2x4 is
begin
process (en, ii, iO) is
begin
if
( en = ' O ' ) then
di <= '0';
d3 <= '0';
d2 <= '0';
elsif ( ii = '0' and iO = '0' ) then
di <= '0';
d3 < = 'o' ;
d2 < = 'o' ;
elsif ( i i = ' O' and i O = ' i ' ) then
d3
< = 'o' ;
= 'i '
d3 < = 'o' ;
elsif ( i i = ' i '
d3 < = ' i ' ;
elsif ( i i
end if;
end process;
d2
< = 'o' ;
= ' O'
d2 < = ' i ' ;
and i O = ' i '
d2 < = 'o' ;
and i O
di
dO
<= '0';
dO
<=
'i';
dO
<= '0';
<= '0';
dO
<= '0';
<=
dO
<= '0';
<=
) then
di
) then
di
'0';
'i';
193
entity bp_Dcd2x4 is
constant DELA Y
: time
end entity bp_Dcd2x4;
Cdigo VHDL 2.33: Banco de pruebas de un decodificador 2:4 con entrada enable.
194
Solucin al Ejercicio 2. 7
std_logic;
x1 else
xO
xl
a)
b)
Xl
XQ
= X1
o o
o 1
1
o
o
o
La funcin lgica del comparador es: x 0 ' x 1'+xox 1 , o equivalentemente: (x 0 EBx 1 )'.
Conectando la salida de este circ~ito comparador (puerta XNOR) a la entrada de
seleccin del MUX 2:1, se obtiene el circuito mostrado en la Figura 2.20b.
195
'1' else
'1' else
o
o
10
01
00
x(1)
x(2)
x(1)
x(2)
b)
a)
. ...1................................
.................................
''
''
. . .0. . . . . . . . . . . . . . . . . ;
........................................\
. . . t . . ............. .. . . . .i
. . .0................ ........ ......;
. . xC2.L. . .. . . . . . . i
Figura 2.22: Diagrama al nivel de puertas lgicas.
196
signal a, b, r
signal x, y
when x+y>1
r <= a+b
el se
a-b-1 when x>y and y!=O el se
a+1;
a
b
o
x+y>l
197
when "11",
when "01" 1 "10",
when others;
when
when
when
when
c,
c1 1 c3
c2 1 c4,
others;
c5,
198
"110"
"111",
valor_expr_a_l
if boolean_expr then
a<= valor_expr_a_l;
b <= valor_expr_b_l;
else
a<= valor_expr_a_2;
b <= valor_expr_b_2;
end if;
valor_expr_a_2
valor_expr_b_1
----+---t
valor_expr_b_ 2
----+---t
boolean_expr - - - o - - - . . . .
Figura 2.25: Sentencia if y su diagrama conceptual.
199
valor_expr_a_1
valor_expr_a_2
boolean_expr_2
valor_ expr_a_3
valor_expr_a_4
boolean_expr_3
boolean_expr_1
case expr_case is
when cO =>
a<= valor_expr_a_O;
b <= valor_expr_b_O;
when el=>
a<= valor_expr_a_l;
b <= valor_expr_b_l;
when others =>
a<= valor_expr_a_n;
b <= valor_expr_b_n;
end case;
valor_expr_a_1 - - - - - ;
valor_expr_a_O - - - - - ;
valor_expr_b_n -+--ti,___--;
valor_expr_b_1 - + - - - - ;
valor_expr_b_O - + - - - - ;
expr_case
200
TEMA 3
3.1. Introduccin
3.2. Procesamiento del cdigo VHDL
3.3. Orden de compilacin
3.4. Drivers
3.5. Inicializacin
3.6. Atributos de las seales
3. 7. El retardo delta
3.8. Gestin de la cola de transacciones del driver
3.9. Ejemplo: simulacin de un circuito sencillo
3.10. Lecturas recomendadas
3.11. Ejercicios de autocomprobacin
3.12. Soluciones de los ejercicios
OBJETIVOS DOCENTES
Una vez estudiado el contenido del tema y realizados los ejercicios prcticos,
debera saber:
- Discutir las etapas anlisis, elaboracin y ejecucin, de que consta el procesamiento y simulacin del cdigo VHD L realizado por las herramientas de CAD.
- Discutir el orden en el cual debe compilarse el cdigo VHDL, atendiendo a las
relaciones existentes entre las diferentes unidades de diseo.
- Discutir los conceptos driver y funcin de resolucin.
- Discutir en qu consiste la inicializacin y cmo se realiza.
- Discutir qu son los atributos de las seales y los conceptos evento, seal activa,
transaccin y seal implcita.
- Discutir cmo se realiza la simulacin de las asignaciones con retardo 5, y cmo
se combina la simulacin de asignaciones con retardo explcito y asignaciones
con retardo 5.
- Discutir cmo se gestionan las colas de transacciones de los drivers.
Realizar manualmente, paso a paso, la simulacin de diseos sencillos, Indicando cmo se realiza la inicializacin, cmo va avanzando el reloj de la
simulacin, qu eventos se producen y cmo se gestionan las colas de transacciones planificadas. Saber comprobar el resultado de las simulaciones realizadas
manualmente, usando para ello algn simulador de VHDL.
203
3.1.
INTRODUCCIN
Asignacin
Qu representa
Visibilidad
Comportamiento
Uso
signal
<=
Interconexiones en el circuito
Puede ser global (visible desde
todo el cdigo)
El nuevo valor es asignado
transcurrido un retardo, que
por defecto vale 5.
En package, entity y architecture. En una entity, los
puertos son por defecto seales
variable
Informacin local
Local (visible slo desde el correspondiente bloque process,
function o procedure)
El nuevo valor es asignado inmediatamente
Slo en cdigo secuencial. Es
decir, dentro de process, function o proced ure
205
3.2.
Normalmente, el cdigo VHDL es procesado por la herramienta de CAD siguiendo las etapas consecutivas siguientes:
l. Anlisis. Durante la etapa de anlisis, el entorno de simulacin comprueba la
sintaxis y semntica del cdigo VHD L. El anlisis se realiza sobre cada una
de las unidades de diseo. Si no hay errores, el entorno de simulacin traduce
el cdigo VHDL que describe la unidad de diseo a un formato propio y lo
almacena en la correspondiente librera.
Cuando existen dependencias entre las unidades de diseo, la compilacin
de las mismas debe realizarse siguiendo un determinado orden. Las reglas
referentes al orden de compilacin, as como las reglas de recompilacin cuando
se hacen cambios en una de las unidades de diseo, sern explicadas en la
Seccin 3.3.
2. Elaboracin. En un diseo complejo, normalmente el sistema es descrito de
manera modular y jerrquica. Durante la etapa de elaboracin el entorno de
simulacin comienza por la unidad de diseo de nivel jerrquico superior y
enlaza la declaracin de la entity del sistema con la definicin de su architecture. En la architecture, va reemplazando cada componente instanciado
por su definicin. Este proceso se repite recursivamente, descendiendo por los
niveles jerrquicos del diseo, hasta que se obtiene una descripcin "plana" del
sistema, en la cual se ha deshecho la jerarqua y composicin.
3. Ejecucin. Durante la etapa de ejecucin, la descripcin plana del sistema,
obtenida de la elaboracin, sirve como entrada al software de simulacin o de
sntesis.
Al comienzo de la simulacin se resuelve el problema de la inicializacin. Se
denomina inicializacin al clculo del valor inicial (es decir, en el instante
de tiempo cero) de las seales explcitas (aquellas seales declaradas en las
entity y en las architecture) y de las seales implcitas. En la Seccin 3.6 se
introducir el concepto de seal implcita.
En la inicializacin, los bloques process son ejecutados hasta que son suspendidos. Si el bloque process tiene sentencias wait, se ejecuta el bloque hasta
que queda suspendido en la primera sentencia wait. Si el bloque process
tiene lista de sensibilidad, se ejecuta una vez el cdigo completo del bloque,
quedando suspendido tras la ejecucin de la ltima sentencia del bloque.
206
3.3.
ORDEN DE COMPILACIN
Cuando existen dependencias entre las unidades de diseo, debe seguirse un orden
en su compilacin. Si una unidad de diseo usa un paquete, entonces la declaracin
del paquete (package) debe compilarse primero. El cuerpo del paquete (package
body) puede compilarse posteriormente. Si en la declaracin del paquete se hace
referencia a otros paquetes, entonces las declaraciones de estos deben compilarse
pnmero.
Si en una architecture se declaran componentes, entonces las entity de los
componentes deben compilarse primero. La architecture de los componentes puede
compilarse posteriormente.
Resumiendo lo anterior, el orden de compilacin de las unidades de diseo puede
ser el siguiente:
l. Declaraciones de los paquetes (package), teniendo en cuenta las interdependencias entre los paquetes. Por ejemplo, si un paquete paqueteA necesita declaraciones de un paquete paqueteE, entonces paqueteE debe compilarse primero.
2. Las entity que hacen uso de los paquetes anteriores.
3. Las architecture. El orden en la compilacin de las architecture puede ser
cualquiera, ya que cuando en una architecture se instancian componentes
(por ejemplo, en los bancos de prueba y en las descripciones estructurales),
esta architecture puede ser compilada sin necesidad de haber compilado
previamente las architecture de los componentes que utiliza.
4. Las unidades de diseo configuration.
5. El cuerpo de los paquetes (package body). Los cuerpos de los paquetes
pueden ser compilados en cualquier orden una vez han sido compiladas sus
declaraciones, no tienen forzosamente que compilarse al final. De hecho, normalmente los cuerpos de los paquetes son compilados a continuacin de sus
declaraciones.
Las dependencias entre las unidades de diseo puede obligar a recompilar varias
unidades de diseo si se modifica el cdigo de una de ellas. A continuacin, se
explican algunas reglas para la recompilacin, en caso de que se modifique el cdigo
de una unidad de diseo:
207
3.4.
DRIVERS
208
209
3.5.1.
a<= '1';
wait;
end process bloque!;
end architecture drivers2;
tiempo
5
a
'1'
212
'Z'
'1'
3.5.2.
213
Simulando el cdigo durante 100 ns, se obtiene que el driver asociado al bloque
process bloque1 evoluciona de la forma siguiente:
tiempo
driver1_a
o
10 ns +o
30 ns +o
40 ns +o
60 ns +o
70 ns +o
90 ns +o
100 ns +O
'Z'
'1'
'0'
'1'
'0'
'1'
'0'
'1'
driver2_a
o
20 ns +o
40 ns +o
60 ns +o
80 ns +o
100 ns +o
'Z'
'1'
'0'
'1'
'0'
'1'
o
10
20
30
40
60
70
80
90
100
214
ns
ns
ns
ns
ns
ns
ns
ns
ns
+o
+o
+o
+o
+o
+o
+o
+o
+o
driver1_a
driver2_a
'Z'
'Z'
'Z'
'1'
'Z'
'1'
'1'
'1'
'1'
'0'
'1'
'X'
'1'
'0'
'X'
'0'
'1'
'X'
'1'
'1'
'1'
'1'
'0'
'X'
'0'
'0'
'0'
'1'
'1'
'1'
o
10
30
70
80
90
100
ns
ns
ns
ns
ns
ns
+6
+6
+6
+6
+6
+6
a
'Z'
'1'
'X'
'1'
'X'
'0'
'1'
'Z';
se escribe
signal a : std_logic;
ns
ns
ns
ns
ns
ns
ns
ns
ns
driver1_a
driver2_a
'U'
+6
+6
+6
+6
+6
+6
+6
+6
+6
'1'
'U'
'U'
'U'
'U'
'1'
'1'
'1'
'0'
'1'
'X'
'1'
'0'
'X'
'0'
'1'
'1'
'1'
'X'
'1'
'1'
'0'
'X'
'0'
'0'
'0'
'1'
'1'
'1'
215
tiempo
20
30
70
80
90
100
ns
ns
ns
ns
ns
ns
'U'
+5
+5
+5
+5
+5
+5
'1'
'X'
'1'
'X'
'0'
'1'
3.6.
216
217
s'event
s'active
s 'transaction
s 'delayed(T)
s 'stable (T)
s 'quiet (T)
s' last_event
s 'last_acti ve
218
3.7.
EL RETARDO DELTA
Uno de los requisitos que debe satisfacer la simulacin del cdigo concurrente es
el siguiente: el resultado de la simulacin debe ser independiente del orden en que
se ejecuten en un determinado instante las sentencias concurrentes.
Para satisfacer este requisito, una vez se han evaluado todas las sentencias
concurrentes activas en el instante t y se han calculado los nuevos valores de las
seales, estos nuevos valores se asignan a las seales en el instante t + 6 (supuesto
que no se indique en el cdigo explcitamente el retardo).
El tiempo 6 es una cantidad infinitesimal de tiempo, que representa un tiempo
mayor que cero, pero que se considera cero cuando se suma a una cantidad de tiempo
no infinitesimal.
Por ejemplo, supongamos que en el instante t = 15 ns +46 se evala la asignacin
s <= '1' after 3 ns;
219
= 1 ns.
220
= 100
3.8.
driver1_a1
driver2_a1
a1
a2
'0'
'0'
'0'
'0'
1 ns
100 ns +5
101 ns
'0'
'1'
'X'
'0'
'1'
'1'
'1'
'1'
'1'
'0'
'X'
'1'
Cada driver contiene una cola, en la cual van almacenndose las transacciones
planificadas para la seal. Cuando se ejecuta una sentencia de asignacin a la
seal, las transacciones calculadas en dicha sentencia son aadidas a la cola del
driver asociado a dicha asignacin. Una vez aadidas las nuevas transacciones,
se aplican unas reglas para decidir si las transacciones que estaban anteriormente
almacenadas en la cola deben ser eliminadas o no. Estas reglas dependen de si las
nuevas transacciones deben producirse con un retardo inercial o de transporte.
Supongamos que en el instante t se aaden a la cola un conjunto de transacciones,
que estn planificadas para los instantes futuros t 1 , t 2 , . . . Se aplican las siguientes
reglas para decidir si las transacciones que estaban almacenadas en la cola del driver
deben eliminarse o conservarse:
Regla 1 Se eliminan de la cola todas las transacciones planificadas para instantes
de tiempo iguales o posteriores a t 1 .
221
Regla 2 Si las nuevas transacciones tiene retardo inercial (para retardo de transporte este paso no se realiza), se van inspeccionando las transacciones que se
encontraban en la cola del driver, progresando hacia atrs en el tiempo, desde
el instante t 1 hacia el cero:
Regla 2.1 Si la transaccin que est siendo inspeccionada asigna a la seal
el mismo valor que la nueva transaccin planificada para t 1 , entonces la
transaccin inspeccionada se mantiene en la cola.
Regla 2.2 Si la transaccin inspeccionada asigna a la seal un valor diferente
del que asigna la nueva transaccin planificada para t 1 , entonces se elimina de la cola la transaccin que est siendo inspeccionada y todas las
transacciones planificadas para instantes anteriores a sta.
3.8.1.
222
tiempo
3 ns
6 ns
15 ns
22 ns
24 ns
80 ns
si
3
1
2
7
30
70
(n)
(n)
(n)
tiempo
3 ns
6 ns
15 ns
20 ns
22 ns
24 ns
25 ns
60 ns
80 ns
si
3
1
2
2
7
30
30
6
70
(n)
(x)
(x)
(n)
(n)
(x)
tiempo
3 ns
6 ns
15 ns
20 ns
22 ns
24 ns
25 ns
60 ns
80 ns
si
3
1
2
2
7
30
30
6
70
223
(x)
(x)
(n)
(x)
(x)
(n)
(n)
(x)
tiempo
3 ns
6 ns
15 ns
20 ns
22 ns
24 ns
25 ns
60 ns
80 ns
s1
3
1
2
2
7
30
30
6
70
(n)
(n)
(n)
tiempo
15 ns
20 ns
25 ns
60 ns
s1
2
2
30
6
224
s1
o
2
30
6
3.8.2.
3
6
15
22
24
80
20
25
60
ns,
ns,
ns,
ns,
ns,
ns;
ns,
ns,
ns;
(n)
(n)
(n)
tiempo
3 ns
6 ns
15 ns
20 ns
22 ns
24 ns
25 ns
60 ns
80 ns
s2
3
1
2
2
7
30
30
6
70
225
(n)
(x)
(x)
(n)
(n)
(x)
tiempo
3 ns
6 ns
15 ns
20 ns
22 ns
24 ns
25 ns
60 ns
80 ns
s2
3
1
2
2
7
30
30
6
70
3.9.
s2
o
3
1
2
30
6
El circuito mostrado en la Figura 3.2, as como las formas de onda de las seales
x1 y x2, son descritas por el cdigo VHDL mostrado a continuacin:
library IEEE;
use IEEE.std_logic_1164.all;
entity delay3 is
end entity delay3;
architecture delay3 of delay3 is
signal x1, x2, s, y : std_logic;
begin
s <= x1 nand x2 after 1 ns;
y <= s or
x2 after 2 ns;
x1 <= '1';
x2 <= '1', '0' after 5 ns;
end architecture delay3;
226
xl
retardo = 1 ns
::~.:
:~
:.::::.:.::::.:.:::::::.::.
....
: :.x:::::.:
~~
t !.....~.~~ ~J ::::::::::::::::::::6:
retardo
...............................
2 ns
Al declarar las seales no se especifica su valor inicial. Por ello, las cuatro seales
tienen en t = O el valor por defecto para std_logic, es decir, valen 'U'. En t = O,
se ejecutan las sentencias de asignacin a las cuatro seales. A continuacin, se
muestra el resultado de la inicializacin y el contenido de las colas de transacciones
planificadas para cada seal:
tiempo
x1
x2
'U'
'U'
'U'
'U'
tiempo
x1
tiempo
x2
'1'
5
5 ns
'1'
tiempo
1 ns
'U'
tiempo
2 ns
y
'U'
'0'
tiempo
x1
x1
x2
'U'
'U'
'U'
'U'
'1'
'1'
'U'
'U'
tiempo
5 ns
x2
'0'
tiempo
1 ns
'0'
tiempo
2 ns
y
'1'
227
El siguiente evento est planificado para el instante 1 ns, por tanto, el reloj
de la simulacin avanza hasta t = 1 ns. En t = 1 ns, se asigna a la seal s el
valor 'O'. El cambio en el valor de la seal s hace que se ejecute la asignacin
y <= s or x2 after 2 ns;, calculndose un nuevo valor para y, que se introduce
en la cola de la seal. El resultado de la simulacin y el contenido de las colas de
transacciones planificadas para cada seal se muestran a continuacin:
tiempo
1 ns
tiempo
x1
tiempo
5 ns
x1
x2
'U'
'U'
'U'
'U'
'1'
'1'
'U'
'U'
'1'
'1'
'0'
'U'
x2
tiempo
tiempo
2 ns
3 ns
'0'
'1'
'1'
El siguiente evento est planificado para el instante t = 2 ns, con lo cual el reloj
de la simulacin salta hasta ese instante, en el cual se asigna el valor a la seal y. El
resultado de la simulacin y el contenido de las colas de transacciones planificadas
para cada seal se muestran a continuacin:
tiempo
1 ns
2 ns
tiempo
x1
tiempo
5 ns
x1
x2
'U'
'U'
'U'
'U'
'1'
'1'
'U'
'U'
'1'
'1'
'0'
'U'
'1'
'1'
'0'
'1'
x2
'0'
tiempo
tiempo
3 ns
'1'
228
tiempo
x1
x2
'U'
'U'
'U'
'U'
5
1 ns
2 ns
5 ns
'1'
'1'
'U'
'U'
'1'
'1'
'0'
'U'
'1'
'1'
'0'
'1'
'1'
'0'
'0'
'1'
tiempo
x2
tiempo
6 ns
tiempo
x1
tiempo
7 ns
'1'
'0'
o
1
2
5
6
tiempo
x1
5
ns
ns
ns
ns
tiempo
x1
x2
'U'
'U'
'U'
'U'
'1'
'1'
'U'
'U'
'1'
'1'
'0'
'U'
'1'
'1'
'0'
'1'
'1'
'0'
'0'
'1'
'1'
'0'
'1'
'1'
x2
tiempo
tiempo
8 ns
'1'
229
tiempo
x1
x2
'U'
'U'
'U'
'U'
'1'
'1'
'U'
'U'
1 ns
2 ns
5 ns
6 ns
'1'
'1'
'0'
'U'
'1'
'1'
'0'
'1'
'1'
'0'
'0'
'1'
'1'
'0'
'1'
'1'
Messages
+x 1
+x2
+s
u
u
+ v
::S
j
1
~!m@
Now
t]./'0
liJ
1 Onsto8ns
8 ns hs
O nsJ
li.GJ
2 ns
4 ns
6 ns
~ih 1
8 ns
1/
1 Now: 8 ns Delta: 1
//.
3.10.
LECTURAS RECOMENDADAS
La mayor parte de los textos sobre VHDL, incluyendo (Chang 1997, Chu 2006,
Vahid & Lysecky 2007, Pedroni 2004, Lee 2006, Ashenden 2002, Armstrong & Gray
2000, Heinkel 2000), abordan con mayor o menor profundidad la simulacin del
cdigo. Sin embargo, es raro encontrar una descripcin tan detallada acerca de los
drivers y la simulacin del retardo como la que se ofrece en los Captulos 4 y 5 de
(Cohen 1995).
230
3.11.
EJERCICIOS DE AUTOCOMPROBACIN
Ejercicio 3.1
Dado el Cdigo VHDL 3.1, dibuje el cronograma de la evolucin de las seales
y1, y2, y3, y4.
library IEEE;
use IEEE . std_logic_1164. all;
entity codigo is
end entity codigo;
architecture codigo of codigo is
signal y1, y2, y3, y4 : std_logic;
begin
y1
<= '0',
y1
<= '0',
y2
<= '0',
Ejercicio 3.2
Consideremos el circuito mostrado en la Figura 3.4. Las puertas AND2 y OR2
tienen un retardo inercial de 10 ns y 20 ns, respectivamente. El Cdigo VHDL 3.2
describe el circuito y las seales de entrada. Explique detalladamente cmo se realiza
la simulacin del cdigo y dibuje el cronograma de las seales.
xl
.........................................
x2
.........................................
... ~~..............................
231
library IEEE;
use IEEE. std_logic_1164 . all;
entity delay4 is
end entity delay4;
architecture delay4 of delay4 is
signal x1, x2, x3, s, y : std_logic;
begin
s <= x1 and x2 after 10 ns;
y <= s or x3 after 20 ns;
x1
<=
'1',
'O' after
'1 'after
'O' after
'1 'after
'O' after
x2 <= '1';
x3
15 ns,
20
30
70
80
ns,
ns,
ns,
ns;
<= '0',
Ejercicio 3.3
library IEEE;
use IEEE. std_logic_1164. all;
entity codigo1 is
port( X1, X2, X3: in std_logic;
Y1
:out std_logic);
end entity codigo 1;
architecture behv of codigo1 is
signal sig_s1: std_logic;
begin
Proc1: process (X1, X2, X3)
begin
sig_s1
Y1
sig_s1
<=
<=
<=
X1;
sig_s1 xor X3;
X2;
end process;
end architecture behv;
232
-- Banco de pruebas
library IEEE;
use IEEE. std_logic_1164. all;
entity bp_codigo1 is
end entity bp_codigo1;
architecture bp_codigo1 of bp_codigo1 is
signal Y1
: std_logic; -- Conectar salida UUT
signal X1 , X2, X3 : std_logic; -- Conectar entradas UUT
component codigo1 is
port ( Y1
: out std_logic;
X1 , X2, X3 : in std_logic );
end component codigo1 ;
begin
-- Instanciar y conectar UUT
uut : component codigo 1 port map
( Y1
begin
X1
X1
X1
X1
X1
X1
<=
<=
<=
<=
<=
<=
'0';
'0';
'1';
'1';
'0';
'1';
X2
X2
X2
X2
X2
X2
<=
<=
<=
<=
<=
<=
'0' ;
'1 ' ;
'0' ;
'1' ;
'1';
'0' ;
wait ;
end process gen_vec_test ;
end a r chitecture bp_codigo1;
X3
X3
X3
X3
X3
X3
<=
<=
<=
<=
<=
<=
'1' ;
'1' ;
'0' ;
'0' ;
'0';
'1 ' ;
wait
wait
wait
wait
wait
for
for
for
for
for
100
100
100
100
100
ns;
ns;
ns;
ns ;
ns;
233
Ejercicio 3.4
library IEEE;
use IEEE. std_logic_1164. all;
entity codigo2 is
port( X1, X2, X3 :
in
std_logic;
: out std_logic);
end entity codigo2;
Y2
begin
var_s1 := X1;
Y2
<= var_s1 xor X3;
var_s1 := X2;
end process proc2;
234
-- Banco de pruebas
library IEEE;
use IEEE. std_logic_1164. all;
entity bp_codigo2 is
end entity bp_codigo2;
architecture bp_codigo2 of bp_codigo2 is
signal Y2
: std_logic; -- Conectar salida UUT
signal X1, X2, X3 : std_logic; -- Conectar entradas UUT
component codigo2 is
port ( Y2
: out std_logic;
X1, X2, X3 : in std_logic);
end component codigo2;
begin
-- Instanciar y conectar UUT
uut : component codigo2 port map
( Y2
begin
X1
X1
X1
X1
X1
X1
<=
<=
<=
<=
<=
<=
'0';
'0';
'1';
'1';
'0';
'1';
X2
X2
X2
X2
X2
X2
<=
<=
<=
<=
<=
<=
'0';
'1';
'0';
'1 ';
'1 ';
'0';
wait;
end process gen_vec_test;
end architecture bp_codigo2;
X3
X3
X3
X3
X3
X3
<=
<=
<=
<=
<=
<=
------------------------
235
Ejercicio 3.5
Dado el diseo mostrado en el Cdigo VHDL 3.7 y el banco de pruebas mostrado
en el Cdigo VHDL 3.8, indique cul es el valor de las seales a, b, e, d, s1, s2, s3
en los instantes de tiempo O, <5, 2<5, 3<5, 4<5.
library IEEE;
use IEEE. std_logic_1164. all;
entity deltas is
port( d
a, b, e
end deltas;
: out std_logic;
: in std_logic);
begin
s1 <= a and b;
end process p1;
p2 : process(b, e)
begin
s2 <= b ore;
end process p2;
p3 : process (s1, s2)
begin
begin
236
-- Banco de pruebas
library IEEE;
use IEEE. std_logie_1164. all;
entity bp_del tas is
end entity bp_del tas;
architecture bp_del tas of bp_del tas is
signal d
: std_logic; -- Conectar salida UUT
signal a, b, e : std_logic; -- Conectar entradas UUT
component deltas is
port ( d
: out std_logic;
a, b, e : in std_logic ) ;
end component deltas;
begin
-- Instanciar y conectar UUT
uut : component deltas port map
( d=>d, a => a, b => b, e => e);
gen_ ve e_ test : process
begin
a<= '1';
<= '1';
e<= '0';
wait;
end process. gen_vee_test;
end architecture bp_del tas;
Ejercicio 3.6
El Cdigo VHDL 3.9 describe una puerta NAND con un retardo inercial de 2 ns
y su banco de pruebas. Dibuje y explique la evolucin de las seales in1, in2, s1,
s2, s3 y s4 durante los primeros 50 ns. A continuacin, simule el banco de pruebas
y compare los resultados obtenidos con los que usted ha predicho.
237
-- Retardo inercial de 2 ns
entity retardo_bp is
end entity retardo_bp;
architecture retardo_bp of retardo_bp is
signal s1, s2, s3, s4
std_logic;
signal in1, in2
: std_logic;
component nand2 is port
( yO
: out std_logic;
xO, x1 : in std_logic);
end component nand2;
begin
-- Instancia la UUT
gO : component nand2 port map (s1, in1, in2);
s2 <= in1 nand in2 after 2 ns; -- Misma forma de onda que s1
process is
variable var1, var2 : std_logic;
begin
for i in O to 4 loop -- Itera 5 veces
var1 := in1 nand in2;
var2 := var1;
-- var2 debe ser igual a vaT1
s3
<= in1 nand in2;
s4
<= s3;
-- s4 debe 8er igual al valor antiguo de 83
wait for 10 ns;
-- Repetir para O, 1O, 20, 30 y 40 n8
end loop;
wait;
-- D etiene este bloque proces8
end process;
-- Genera lo8 vectores de te8t
in1 <= '1';
-- in2 comienza a O
in2 <= '0',
' 1 ' after 1O ns, ' O' after 11 ns, -- Pul8o de 1 n8 en el in8tante 1O n8
'1' after 20 ns, 'O' after 22 ns, -- Pulso de 2 ns en el instante 20 ns
'1' after 26 ns, 'O' after 29 ns; -- Pulso en el instante 26 ns
end architecture retardo_bp;
Cdigo VHDL 3.9: Puerta NAND con retardo inercial y su banco de pruebas.
238
Ejercicio 3. 7
Dado el Cdigo VHDL 3.10, indique los valores que toman las seales YO y
Y1 en los instantes de tiempo en que existen eventos en estas seales. Explique
razonadamente la evolucin de cada una de las seales. A continuacin, simule el
cdigo VHDL y compare los resultados obtenidos con los que usted ha predicho.
library IEEE;
use IEEE. std_logic_1164. all;
entity codigoP is
end entity codigoP;
architecture codigoP of codigoP is
signa} YO: std_logic := '1';
signa} Y1: std_logic;
begin
Y1 <= YO after 10 ns;
process
begin
YO <= transport 'O' after
YO <= transport '1' after
YO <= transport '1' after
YO <= transport 'O' after
wait;
end process;
end architecture codigoP;
10
20
15
30
ns;
ns;
ns;
ns;
239
3.12.
11
.y2
11
.y3 u
.y4
~Q@ow
~,0
u
400 ns
1111111111111 d
lS
50 ns
lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
100 ns
150 ns
200 ns
250 ns
300 ns
350 ns
400 ns
l?JJ.:J
Figura 3.5: Cronograma de las seales Yl, Y2, y3, Y4
tiempo
50
100
200
250
300
350
y1
y2
y3
y4
'U'
'U'
'U'
'U'
'U'
'U'
ns
ns
ns
ns
ns
ns
'X'
o
o
'U'
'U'
1
1
1
1
1
1
1
1
1
1
1
1
1
1
o
1
240
o
tiempo
5
15 ns
20 ns
30 ns
70 ns
80 ns
x1
'1'
tiempo
5
x2
'1'
'0'
'1'
x1
x2
x3
'U'
'U'
'U'
'U'
'U'
tiempo
5
70 ns
80 ns
x3
'0'
tiempo
10 ns
'U'
tiempo
20 ns
'U'
'1'
'0'
'0'
'1'
'0'
tiempo
15 ns
20 ns
30 ns
70 ns
80 ns
x1
'0'
'1'
tiempo
x1
x2
x3
o 'U'
'U'
'U'
'1'
'0'
'U'
'U'
'U'
'U'
tiempo
70 ns
80 ns
x3
x2
'1'
'1'
tiempo
10 ns
'1'
tiempo
20 ns
y
'U'
'0'
'0'
'1'
'0'
241
tiempo
15 ns
20 ns
30 ns
70 ns
80 ns
x1
x1
x2
x3
'U'
'U'
'U'
'U'
'U'
6
10 ns
'1'
'1'
'0'
'U'
'U'
'1'
'1'
'0'
'1'
'U'
tiempo
x2
tiempo
x3
70 ns
80 ns
'1'
'0'
'1'
tiempo
tiempo
30 ns
'1'
'0'
'0'
'1'
'0'
o
6
10 ns
15 ns
tiempo
20 ns
30 ns
70 ns
80 ns
x1
'1'
'0'
tiempo
x2
x1
x2
x3
'U'
'U'
'U'
'U'
'U'
'1'
'1'
'0'
'U'
'U'
'1'
'1'
'0'
'1'
'U'
'0'
'1'
'0'
'1'
'U'
tiempo
70 ns
80 ns
x3
tiempo
25 ns
'1'
'0'
tiempo
30 ns
'1'
'0'
'1'
'0'
242
tiempo
x1
x2
x3
'U'
'U'
'U'
'U'
'U'
'1'
'1'
'0'
'U'
'U'
'1'
'1'
'0'
'1'
'U'
'0'
'1'
'0'
'1'
'U'
'1'
'1'
'0'
'1'
'U'
tiempo
70 ns
80 ns
x3
tiempo
30 ns
10 ns
15 ns
20 ns
tiempo
30 ns
70 ns
80 ns
x1
tiempo
x2
'0'
'1'
'1'
tiempo
30 ns
'1'
'1'
'0'
'0'
10
15
20
30
tiempo
70 ns
80 ns
x1
'1'
'0'
tiempo
x1
x2
x3
'U'
'U'
'U'
'U'
'U'
'1'
'1'
'0'
'U'
'U'
'1'
'1'
'0'
'1'
'U'
'0'
'1'
'0'
'1'
'U'
'1'
'1'
'0'
'1'
'U'
'0'
'1'
'0'
'1'
'1'
ns
ns
ns
ns
x2
tiempo
70 ns
80 ns
x3
'1'
tiempo
40 ns
tiempo
'0'
'0'
243
tiempo
10
15
20
30
40
tiempo
70 ns
80 ns
x1
x1
x2
x3
'U'
'U'
'U'
'U'
'U'
'1'
'1'
'0'
'U'
'U'
'1'
'1'
'0'
'1'
'U'
'0'
'1'
'0'
'1'
'U'
'1'
'1'
'0'
'1'
'U'
'0'
'1'
'0'
'1'
'1'
'0'
'1'
'0'
'0'
'1'
ns
ns
ns
ns
ns
tiempo
tiempo
70 ns
80 ns
x2
'1'
'0'
x3
tiempo
tiempo
60 ns
'1'
'0'
'0'
10
15
20
30
40
60
tiempo
70 ns
80 ns
x1
'1'
'0'
x1
x2
x3
'U'
'U'
'U'
'1'
'1'
'0'
'U'
'U'
'1'
'1'
'0'
'1'
'0'
'1'
'0'
'1'
'1'
'1'
'0'
'1'
'U'
'U'
'U'
'U'
'U'
'0'
'1'
'0'
'1'
'1'
'0'
'1'
'0'
'0'
'1'
'0'
'1'
'0'
'0'
'0'
ns
ns
ns
ns
ns
ns
tiempo
x2
tiempo
70 ns
80 ns
x3
tiempo
tiempo
'1'
'0'
244
tiempo
10
15
20
30
40
60
70
tiempo
80 ns
x1
tiempo
x1
x2
x3
'U'
'U'
'U'
'U'
5
ns
ns
ns
ns
ns
ns
ns
'1'
'1'
'U'
'0'
'U'
'U'
'1'
'1'
'0'
'1'
'U'
'0'
'1'
'0'
'1'
'U'
'1'
'1'
'0'
'1'
'U'
'0'
'1'
'0'
'1'
'1'
'0'
'1'
'0'
'0'
'1'
'0'
'1'
'0'
'0'
'0'
'1'
'1'
'1'
'0'
'0'
tiempo
80 ns
x3
tiempo
80 ns
x2
'0'
'0'
'1'
tiempo
90 ns
'1'
10
15
20
30
40
60
70
80
tiempo
x1
tiempo
x1
x2
x3
'U'
'U'
'U'
'U'
5
ns
ns
ns
ns
ns
ns
ns
ns
'1'
'1'
'U'
'0'
'U'
'U'
'1'
'1'
'0'
'1'
'U'
'0'
'1'
'0'
'1'
'U'
'1'
'1'
'0'
'1'
'U'
'0'
'1'
'0'
'1'
'1'
'0'
'1'
'0'
'0'
'1'
'0'
'1'
'0'
'0'
'0'
'1'
'1'
'1'
'0'
'0'
'0'
'1'
'0'
'1'
'0'
x2
tiempo
x3
tiempo
90 ns
'0'
tiempo
90 ns
100 ns
'1'
'1'
245
o
c5
10
15
20
30
40
60
70
80
90
tiempo
x1
ns
ns
ns
ns
ns
ns
ns
ns
ns
tiempo
x1
x2
x3
'U'
'1'
'U'
'1'
'U'
'0'
'U'
'U'
'U'
'1'
'1'
'0'
'U'
'1'
'0'
'1'
'0'
'1'
'U'
'1'
'1'
'0'
'1'
'0'
'1'
'0'
'1'
'U'
'1'
'0'
'1'
'0'
'1'
'0'
'1'
'0'
'1'
'1'
'1'
'o'
'o'
'o'
'0'
'1'
'0'
'1'
'0'
'0'
'1'
'0'
'o'
'1'
x3
tiempo
tiempo
x2
'U'
'0'
'0'
tiempo
110 ns
'0'
o
c5
10
15
20
30
40
60
70
80
90
110
246
ns
ns
ns
ns
ns
ns
ns
ns
ns
ns
x1
x2
x3
'U'
'1'
'U'
'1'
'U'
'0'
'U'
'U'
'U'
'1'
'1'
'0'
'U'
'1'
'0'
'1'
'0'
'1'
'U'
'1'
'1'
'0'
'1'
'U'
'0'
'1'
'0'
'1'
'1'
'0'
'1'
'0'
'0'
'1'
'0'
'1'
'0'
'0'
'0'
'1'
'1'
'1'
'0'
'0'
'0'
'1'
'0'
'1'
'0'
'0'
'1'
'0'
'0'
'1'
'0'
'1'
'0'
'0'
'0'
'U'
x1
x2
x3
.y
+
1---
1---
---
l!
Clil0'
~,0
Now
l40 ns :l s
20 ns
40 ns
60 ns
80 ns
100 ns
12(
i!ns]
Figura 3.6: Cronograma de las seales.
247
tiempo
x1
x2
x3
Y1
sig_s1
'U'
'U'
'U'
'U'
'U'
tiempo
x1
tiempo
x2
tiempo
x3
tiempo
Y1
tiempo
sig_s1
'0'
'0'
'1'
'U'
'U'
tiempo
x1
tiempo
x1
x2
x3
Y1
sig_s1
'U'
'U'
'U'
'U'
'U'
'0'
'0'
'1'
'U'
'U'
x2
tiempo
x3
tiempo
26
Y1
'U'
tiempo
26
sig_s1
'0'
tiempo
x1
tiempo
x1
x2
x3
Y1
sig_s1
'U'
'U'
'U'
'U'
'U'
6
26
'0'
'0'
'1'
'U'
'U'
'0'
'0'
'1'
'U'
'0'
x2
tiempo
x3
tiempo
Y1
tiempo
sig_s1
El reloj de la simulacin avanza hasta el instante t = 100 ns, ya que en ese instante
se reanuda la ejecucin del bloque process del banco de pruebas. Se ejecutan las
248
tres sentencias de asignacin a las seales x1, x2, x3, y se suspende la ejecucin
del bloque al ejecutarse la sentencia wait. Los nuevos valores se planifican para
el instante t = 100 + 6. El resultado de la simulacin y las colas de transacciones
planificadas son:
tiempo
o
6
26
tiempo
x1
100 ns+6
'0'
tiempo
100 ns+6
x1
x2
x3
Y1
sig_s1
'U'
'U'
'U'
'U'
'U'
'0'
'0'
'1'
'U'
'U'
'0'
'0'
'1'
'U'
'0'
tiempo
100 ns+6
x3
tiempo
x2
'1'
Y1
tiempo
sig_s1
'1'
o
6
26
100 ns+6
tiempo
x1
tiempo
x2
x1
x2
x3
Y1
sig_s1
'U'
'U'
'U'
'U'
'U'
'0'
'0'
'1'
'U'
'U'
'0'
'0'
'1'
'U'
'0'
'0'
'1'
'1'
'U'
'0'
x3
tiempo
100 ns+26
tiempo
Y1
'1'
tiempo
100 ns+26
sig_s1
'1'
249
tiempo
tiempo
x1
x1
x2
x3
Y1
sig_s1
'U'
'U'
'U'
5
25
100 ns+5
100 ns+25
'0'
'0'
'1'
'U'
'U'
'0'
'0'
'1'
'0'
'1'
'1'
'U'
'U'
'U'
'U'
'0'
'0'
'1'
'1'
'1'
'1'
tiempo
x2
tiempo
tiempo
x3
'0'
Y1
tiempo
sig_s1
tiempo
250
x1
x2
x3
Y1
sig_s1
'U'
'U'
'o'
'U'
'U'
'U'
5
25
100 ns+5
100 ns+25
200 ns+5
200 ns+25
300 ns+5
300 ns+25
400 ns+5
400 ns+25
500 ns+5
500 ns+25
'0'
'0'
'1'
'0'
'0'
'1'
'0'
'1'
'1'
'U'
'U'
'U'
'U'
'0'
'1'
'1'
'1'
'1'
'1'
'0'
'0'
'1'
'1'
'1'
'0'
'0'
'1'
'o'
'1'
'1'
'0'
'1'
'0'
'1'
'1'
'0'
'0'
'1'
'0'
'1'
'0'
'0'
'1'
'0'
'1'
'0'
'1'
'1'
'1'
'0'
'1'
'1'
'1'
'1'
'0'
'1'
'0'
'0'
'0'
+
+
+
+
+
jbp_codigo1/uut)(1
bp_codigo1/uut,(.l(2
o
o
bp_codigo1/uut)(3
jbp_codigo1/uutjY1
jbp_codigo1/uutjsig_sl
Now
600 ns
Cursor 1
O ns
11111111
lllllllttlttllllltllttllllll
lllllllltlttlllllltlttllllll
200 ns
100 ns
llllllltllttllllltllttllllll
300 ns
400ns
11
llllllltllttlllllltlttll
500 ns
600 ns
O nsl
o
tiempo
fJ
X1
X2
X3
Y2
'U'
'U'
'U'
'U'
X1
tiempo
X2
tiempo
X3
'0'
fJ
'0'
fJ
'1'
tiempo
fJ
= O y la cola de
Y2
'U'
251
tiempo
X1
X1
X2
X3
Y2
'U'
'U'
'U'
'U'
'0'
'0'
'1'
'U'
tiempo
X2
tiempo
X3
tiempo
25
Y2
'1'
X1
X2
X3
Y2
'U'
'U'
'U'
'U'
'0'
'0'
'1'
'U'
25
'0'
'0'
'1'
'1'
o
5
25
252
X1
X2
X3
Y2
'U'
'U'
'U'
'U'
'0'
'0'
'1'
'U'
'0'
'0'
'1'
'1'
tiempo
X1
+o
'0'
100 ns
tiempo
X2
+O
'1'
100 ns
tiempo
100 ns +o
X3
tiempo
Y2
'1'
100 ns
tiempo
X1
X1
X2
X3
Y2
'U'
'U'
'U'
'U'
'0'
'0'
'1'
'U'
20
'0'
'0'
'1'
'1'
+o
'0'
'1'
'1'
'1'
tiempo
X2
tiempo
X3
tiempo
Y2
+ 2o
'1'
100 ns
X1
X2
X3
Y2
'U'
'U'
'U'
'U'
'0'
'0'
'1'
'U'
'0'
'0'
'1'
'1'
'0'
'1'
'1'
'1'
'1'
'0'
'0'
'1'
'1'
'1'
'0'
'1'
'0'
'1'
'0'
'1'
'0'
'1'
'0'
'0'
'1'
'0'
'1'
'0'
20
+o
200 ns +o
300 ns +o
400 ns +o
100 ns
400 ns + 20
500 ns
+o
253
...
Msgs
+ bp_codigo2/X1
+ bp_codigo2/X2
+ bp_codigo2/X3
+ bp_codigo2/Y2
iO
;o
o
1
o
Now
700 ns
Cursor 1
O ns
1~:1
1
1 1 1
1 1 1 1
1
1 -1 1 1
1 1 1 1
100 ns
1
1 1 1 1
1 -1
1 1 1
1
1 1- 1 1
1 1 1 1
300 ns
200 ns
1
1 1 1 1
400 ns
1 1 1 1
1
1 1 1 1
500 ns
1 1 1 1
600
llo nsJ
Figura 3.8: Cronograma de las seales.
Dado que ninguna de las seales ha sido inicializada al ser declarada, todas las
seales valen 'U' en t = O. En t = O se ejecutan todos los bloques process. Se
planifica asignar los nuevos valores a las seales en el instante t = o. El resultado de
la simulacin en t = O y las transacciones planificadas son las siguientes:
tiempo
s1
s2
s3
'U'
'U'
'U'
'U'
'U'
'U'
'U'
s1
s2
s3
'1'
'1'
'0'
'U'
'U'
'U'
'U'
o,
s1
s2
s3
'U'
'U'
'U'
'U'
'U'
'U'
'U'
'1'
'1'
'0'
'U'
'U'
'U'
'U'
254
ejecute el bloque process p3. El nuevo valor calculado para la seal s3 se asignar
a la misma en el instante t = 35.
tiempo
si
s2
s3
'U'
'U'
'U'
'U'
'U'
'U'
'U'
'i'
'i'
'0'
'U'
'U'
'U'
'U'
25
'i'
'i'
'0'
'i'
'i'
'U'
'U'
1
1
11
11
11
2
11
11
3;
03
'
1 ,"
11
si
s2
s3
'U'
'U'
'U'
'U'
'U'
'U'
'U'
'i'
'i'
'0'
'U'
'U'
'U'
'U'
25
'i'
'i'
'0'
'i'
'i'
'U'
'U'
35
'i'
'i'
'0'
'i'
'i'
'0'
'U'
1
1
11
11
11
2
11
3
11
11
4;
'~'
si
s2
s3
'U'
'U'
'U'
'U'
'U'
'U'
'U'
5
25
35
45
'i'
'i'
'0'
'U'
'U'
'U'
'U'
'i'
'i'
'0'
'i'
'i'
'U'
'U'
'i'
'i'
'0'
'i'
'i'
'0'
'U'
'i'
'i'
'0'
'i'
'i'
'0'
'i'
El Cdigo VHDL 3.8 muestra el banco de pruebas que hay que simular para
obtener la evolucin temporal de las seales. Una vez activada la simulacin del
banco de pruebas usando el simulador ModelSim, para poder obtener los valores de
las seales en los instantes de tiempo O, 5, 25, 35 y 45 hay que seguir los siguientes
pasos:
255
l. Aadir la ventana "List". Para ello seleccionamos la opcin "List" del men
"View". La ventana "List" muestra, en modo texto, los valores de las seales en
el tiempo en un formato tabular. La opcin "List preferences ... " del men "List"
nos permite configurar las propiedades de dicha ventana. Para poder obtener
el valor de las seales teniendo en cuenta los retardos 6 hay que configurar las
opciones de la ventana "List", tal como se muestra en la Figura 3.9.
2. Aadir a la ventana "List" las seales del diseo. Para ello, hay que seleccionar
las seales de la ventana "Objects" (vase la Figura 3.10).
3. Realizar la simulacin del banco de pruebas. En la Figura 3.10 se muestran
los valores obtenidos tras realizar la simulacin. Los valores de las seales se
muestran en una tabla que tiene 5 filas, una fila por cada instante de tiempo, y
7 columnas, una columna por cada seal. Las columnas de izquierda a derecha
se corresponden respectivamente con las seales d, a, b, e, s_1, s_2 y s_3. Las
filas, de arriba a abajo, se corresponden con los instantes de tiempo O, 8, 28,
36 y 48.
256
...
~"
lli
Triggers
~Deltas:
G: Expand Deltas
'l&l
'
_ilij
Collapse Deltas
No Deltas
1
,..---Trigger On:
rJ
Strobe
lo
lo
Strobe Period:
M Signa! Change
ns
ns
- Trigger Gating:
lo ns
OK
Cancel
8J:tply
Name
ns.,..
delta.,..
+a
+b
+e
+d
+s i
+ s2
+s3
View Declaration
Vie1N r.1emory Contents
+O
u u u u u
+1
u
u
u
o
o
o
+2
+3
+4
1
1
1
1 1
1
1
1
1
o u
o 1
o 1
o 1
u +----o
u u +----o
1 u +---- 28
1 o +---- 38
1 o +---- 48
View Messages
Copy
Find ...
Insert Breakpoint
Add to Wave
Add to Log
Add to Dataflow
Toggle Coverage
Selected Signals
Signals in Region
257
o
t in1
6 '1'
10
11
20
22
26
29
t
6
ns
ns
ns
ns
ns
ns
in1
in2
s1
s2
s3
s4
'U'
'U'
'U'
'U'
'U'
'U'
in2
'0'
t
6
t
6
s1
'U'
s2
'U'
t
6
s3
'U'
t
6
s4
'U'
'1'
'0'
'1'
'0'
'1'
'0'
258
in1
in2
s1
s2
s3
s4
'U'
'U'
'U'
'U'
'U'
'U'
'1'
'0'
'U'
'U'
'U'
'U'
in1
10
11
20
22
26
29
t
ns
ns
ns
ns
ns
ns
t
2 ns
in2
'1'
s1
'1'
t
2 ns
s2
s3
s4
'1'
'0'
'1'
'0'
'1'
'0'
in1
in2
s1
s2
s3
s4
'U'
'U'
'U'
'U'
'U'
5
2 ns
'1'
'U'
'0'
'U'
'U'
'U'
'U'
'1'
'0'
'1'
'1'
'U'
'U'
in1
10
11
20
22
26
29
t
ns
ns
ns
ns
ns
ns
in2
s1
s2
s3
s4
'1'
'0'
'1'
'0'
'1'
'0'
in1
in2
s1
s2
s3
s4
'U'
'U'
'U'
'U'
'U'
'1'
'U'
'0'
'U'
'U'
'U'
'U'
2 ns
10 ns
'1'
'0'
'1'
'1'
'U'
'U'
'1'
'1'
'1'
'1'
'U'
'U'
259
in1
11
20
22
26
29
t
ns
ns
ns
ns
ns
t
12 ns
in2
'0'
t
12 ns
s1
'0'
s2
10 ns
'0'
s3
+5
'0'
10 ns
s4
+5
'U'
'1'
'0'
'1'
'0'
o
5
2 ns
10 ns
10 ns + 5
t
in1
11
20
22
26
29
t
ns
ns
ns
ns
ns
in2
'0'
in1
in2
s1
s2
s3
s4
'U'
'U'
'U'
'U'
'U'
'U'
'1'
'0'
'U'
'U'
'U'
'U'
'1'
'0'
'1'
'1'
'U'
'U'
'1'
'1'
'1'
'1'
'U'
'U'
'1'
'1'
'1'
'1'
'0'
'U'
s2
t
12 ns
t
12 ns
s1
'0'
s3
s4
'0'
'1'
'0'
'1'
'0'
260
in1
in2
s1
s2
s3
s4
'U'
'U'
'U'
'U'
'U'
'U'
'1'
'0'
'U'
'U'
'U'
'U'
2 ns
10 ns
10 ns + 5
11 ns
'1'
'0'
'1'
'1'
'U'
'U'
'1'
'1'
'1'
'1'
'U'
'U'
'1'
'1'
'1'
'1'
'0'
'U'
'1'
'0'
'1'
'1'
'0'
'U'
in1
20
22
26
29
t
ns
ns
ns
ns
in2
'1'
t
13 ns
t
13 ns
s1
'1'
s2
s3
s4
'1'
'0'
'1'
'0'
in1
in2
s1
s2
s3
s4
'U'
'U'
'U'
'U'
'U'
'U'
c5
'1'
'0'
'U'
'U'
'U'
'U'
2 ns
10 ns
10 ns + c5
11 ns
'1'
'0'
'1'
'1'
'U'
'U'
'1'
'1'
'1'
'1'
'U'
'U'
'1'
'1'
'1'
'1'
'0'
'U'
'1'
'0'
'1'
'1'
'0'
'U'
t
ns
ns
ns
ns
in2
s2
in1
20
22
26
29
s1
s3
s4
'1'
'0'
'1'
'0'
in1
in2
s1
s2
s3
s4
'U'
'U'
'U'
'U'
'U'
'U'
c5
'1'
'0'
'U'
'U'
'U'
'U'
2 ns
10 ns
10 ns + c5
11 ns
20 ns
'1'
'0'
'1'
'1'
'U'
'U'
'1'
'1'
'1'
'1'
'U'
'U'
'1'
'1'
'1'
'1'
'0'
'U'
'1'
'0'
'1'
'1'
'0'
'U'
'1'
'1'
'1'
'1'
'0'
'U'
261
t
22 ns
26 ns
29 ns
ini
t
22 ns
in2
'0'
t
22 ns
si
'0'
s2
20 ns
'0'
s3
+o
'0'
20 ns
s4
+o
'0'
'i'
'0'
ini
in2
si
s2
s3
s4
'U'
'U'
'U'
'U'
'U'
'U'
'i'
'0'
'U'
'U'
'U'
'U'
'i'
'0'
'i'
'i'
'U'
'U'
'i'
'i'
'i'
'i'
'U'
'U'
'i'
'i'
'i'
'i'
'0'
'U'
'i'
'0'
'i'
'i'
'0'
'U'
'i'
'i'
'i'
'i'
'0'
'U'
'i'
'i'
'i'
'i'
'0'
'0'
s2
2 ns
10 ns
10 ns
11 ns
20 ns
20 ns
+o
+o
ini
t
22 ns
26 ns
29 ns
in2
'0'
t
22 ns
t
22 ns
si
'0'
s3
s4
'0'
'i'
'0'
ini
in2
si
s2
s3
s4
'U'
'U'
'U'
'U'
'U'
'U'
'i'
'0'
'U'
'U'
'U'
'U'
'i'
'0'
'i'
'i'
'U'
'U'
'i'
'i'
'i'
'i'
'U'
'U'
'i'
'i'
'i'
'i'
'0'
'U'
'i'
'0'
'i'
'i'
'0'
'U'
'i'
'i'
'i'
'i'
'0'
'U'
+o
'i'
'i'
'i'
'i'
'0'
'0'
ns
'i'
'0'
'0'
'0'
'0'
'0'
2
10
10 ns
11
20
20 ns
22
ns
ns
+o
262
ns
ns
in1
t
26 ns
29 ns
in2
'1'
t
24 ns
t
24 ns
s1
'1'
s2
s3
s4
'1'
'0'
tiempo
in1
in2
s1
s2
s3
s4
'U'
'U'
'U'
'U'
'U'
'U'
'1'
'0'
'U'
'U'
'U'
'U'
2 ns
10 ns
10 ns + 5
11 ns
20 ns
20 ns + 5
22 ns
24 ns
'1'
'0'
'1'
'1'
'U'
'U'
'1'
'1'
'1'
'1'
'U'
'U'
'1'
'1'
'1'
'1'
'0'
'U'
'1'
'0'
'1'
'1'
'0'
'U'
'1'
'1'
'1'
'1'
'0'
'U'
'1'
'1'
'1'
'1'
'0'
'0'
'1'
'0'
'0'
'0'
'o'
'0'
'1'
'0'
'1'
'1'
'0'
'0'
t
26 ns
29 ns
in2
s2
in1
s1
s3
s4
'1'
'0'
in1
in2
s1
s2
s3
s4
'U'
'U'
'U'
'U'
'U'
'U'
'1'
'0'
'U'
'U'
'U'
'U'
2 ns
10 ns
10 ns + 5
11 ns
20 ns
20 ns + 5
22 ns
24 ns
26 ns
'1'
'0'
'1'
'1'
'U'
'U'
'1'
'1'
'1'
'1'
'U'
'U'
'1'
'1'
'1'
'1'
'0'
'U'
'1'
'0'
'1'
'1'
'0'
'U'
'1'
'1'
'1'
'1'
'0'
'U'
'1'
'1'
'1'
'1'
'0'
'0'
'1'
'0'
'0'
'0'
'0'
'0'
'1'
'0'
'1'
'1'
'0'
'0'
'1'
'1'
'1'
'1'
'0'
'0'
263
t
29 ns
ini
t
28 ns
in2
'0'
t
28 ns
si
'0'
s2
s3
s4
'0'
ini
in2
si
s2
s3
s4
'U'
'U'
'U'
'U'
'U'
'U'
'i'
'0'
'U'
'U'
'U'
'U'
2 ns
10 ns
10 ns + 8
11 ns
20 ns
20 ns + 8
22 ns
24 ns
26 ns
28 ns
'i'
'0'
'i'
'i'
'U'
'U'
'i'
'i'
'i'
'i'
'U'
'U'
'i'
'i'
'i'
'i'
'0'
'U'
'i'
'0'
'i'
'i'
'0'
'U'
'i'
'i'
'i'
'i'
'0'
'U'
'i'
'i'
'i'
'i'
'0'
'0'
'i'
'0'
'0'
'0'
'0'
'0'
'i'
'0'
'i'
'i'
'0'
'0'
'i'
'i'
'i'
'i'
'0'
'0'
'i'
'i'
'0'
'0'
'0'
'0'
ini
11
29
n: ~~~
1
81
11
82
11
84
83
11
11
264
tiempo
ini
ini
in2
si
s2
s3
s4
'U'
'U'
'U'
'U'
'U'
'U'
t5
'i'
'0'
'U'
'U'
'U'
'U'
2 ns
10 ns
10 ns + t5
11 ns
20 ns
20 ns + t5
22 ns
24 ns
26 ns
28 ns
29 ns
'i'
'0'
'i'
'i'
'U'
'U'
'i'
'i'
'i'
'i'
'u'
'U'
'i'
'i'
'i'
'i'
'0'
'U'
'i'
'0'
'i'
'i'
'0'
'U'
'i'
'i'
'i'
'i'
'0'
'U'
'i'
'i'
'i'
'i'
'0'
'0'
'i'
'0'
'0'
'0'
'0'
'0'
'i'
'0'
'i'
'i'
'0'
'0'
'i'
'i'
'i'
'i'
'o'
'0'
'i'
'i'
'0'
'0'
'0'
'0'
'i'
'0'
'0'
'0'
'0'
'0'
t
31 ns
in2
si
'i'
t
31 ns
s2
s3
s4
'i'
ini
in2
si
s2
s3
s4
'U'
'U'
'U'
'U'
'U'
'U'
t5
'i'
'0'
'U'
'U'
'U'
'U'
2 ns
10 ns
10 ns + t5
11 ns
20 ns
20 ns + t5
22 ns
24 ns
26 ns
28 ns
29 ns
'i'
'0'
'i'
'i'
'U'
'U'
'i'
'i'
'i'
'i'
'U'
'U'
'i'
'i'
'i'
'i'
'0'
'U'
'i'
'0'
'i'
'i'
'0'
'U'
'i'
'i'
'i'
'i'
'0'
'U'
'i'
'i'
'i'
'i'
'0'
'0'
'i'
'0'
'0'
'0'
'0'
'0'
'i'
'0'
'i'
'i'
'0'
'0'
'i'
'i'
'i'
'i'
'0'
'0'
'i'
'i'
'0'
'0'
'0'
'0'
'i'
'0'
'0'
'0'
'0'
'0'
265
ini
in2
t
31 ns
si
'i'
t
31 ns
s3
+o
'i'
s2
'i'
30 ns
t
30 ns
s4
+ o 'o'
ini
in2
si
s2
s3
s4
'U'
'U'
'U'
'U'
'U'
'U'
'i'
'0'
'U'
'U'
'U'
'U'
'i'
'0'
'i'
'i'
'U'
'U'
'i'
'i'
'i'
'i'
'U'
'U'
'i'
'i'
'i'
'i'
'0'
'U'
'i'
'0'
'i'
'i'
'0'
'U'
'i'
'i'
'i' ./ i'
'0'
'U'
'i'
'i'
'i'
'i'
'0'
'0'
'i'
'0'
'0'
'0'
'0'
'0'
'i'
'0'
'i'
'i'
'0'
'0'
'i'
'i'
'i'
'i'
'0'
'0'
'i'
'i'
'0'
'0'
'0'
'0'
'i'
'0'
'0'
'0'
'0'
'0'
'i'
'0'
'0'
'0'
'i'
'0'
2 ns
10 ns
10 ns + o
11 ns
20 ns
20 ns + o
22 ns
24 ns
26 ns
28 ns
29 ns
30 ns + o
t
ini
in2
t
31 ns
si
'i'
t
31 ns
s2
s3
s4
'i'
266
tiempo
o
5
2 ns
10 ns
10 ns + 5
11 ns
20 ns
20 ns + 5
22 ns
24 ns
26 ns
28 ns
29 ns
30 ns + 5
31 ns
in1
in2
s1
s2
s3
s4
'U'
'1'
'U'
'U'
'U'
'U'
'U'
'0'
'U'
'U'
'U'
'1'
'0'
'U'
'1'
'1'
'U'
'U'
'1'
'1'
'1'
'1'
'U'
'U'
'1'
'1'
'1'
'1'
'0'
'U'
'1'
'0'
'1'
'1'
'0'
'U'
'1'
'1'
'1'
'1'
'0'
'U'
'1'
'1'
'1'
'1'
'0'
'0'
'1'
'0'
'0'
'0'
'0'
'0'
'1'
'0'
'1'
'1'
'0'
'0'
'1'
'1'
'1'
'1'
'0'
'0'
'1'
'1'
'0'
'0'
'0'
'0'
'1'
'0'
'0'
'0'
'0'
'0'
'1'
'0'
'0'
'0'
'1'
'0'
'1'
'0'
'1'
'1'
'1'
'0'
o
5
2 ns
10 ns
10 ns + 5
11 ns
20 ns
20 ns + 5
22 ns
24 ns
26 ns
28 ns
29 ns
30 ns + 5
31 ns
in1
in2
s1
s2
s3
s4
'U'
'1'
'U'
'U'
'U'
'U'
'U'
'0'
'U'
'U'
'U'
'U'
'1'
'0'
'1'
'1'
'U'
'1'
'1'
'1'
'1'
'U'
'U'
'1'
'1'
'1'
'1'
'0'
'U'
'1'
'0'
'1'
'1'
'0'
'U'
'1'
'1'
'1'
'1'
'0'
'U'
'1'
'1'
'1'
'1'
'0'
'0'
'1'
'0'
'0'
'0'
'0'
'0'
'1'
'0'
'1'
'1'
'0'
'0'
'1'
'1'
'1'
'1'
'0'
'0'
'1'
'1'
'0'
'0'
'0'
'0'
'1'
'0'
'0'
'0'
'0'
'0'
'1'
'0'
'0'
'0'
'1'
'0'
'1'
'0'
'1'
'1'
'1'
'0'
'U'
267
ini
in2
si
s3
+5
'i'
s2
40 ns
40 ns
s4
+o
'i'
tiempo
o
o
10
20
30
40
+ /retardo_bp/s1
+ /retardo_bp/s2
+ /retardo_bp/s3
+ / retardo_bp/s4
+ /retardo_bp/in1
+ /retardo bp/in2
...
u
u
u
u
2 ns
10 ns
ns +o
11 ns
20 ns
ns +o
22 ns
24 ns
26 ns
28 ns
29 ns
ns +O
31 ns
ns +o
ini
in2
si
s2
s3
s4
'U'
'U'
'U'
'U'
'U'
'U'
'i'
'0'
'U'
'U'
'U'
'U'
'i'
'0'
'i'
'i'
'U'
'U'
'i'
'i'
'i'
'i'
'U'
'U'
'i'
'i'
'i'
'i'
'0'
'U'
'i'
'0'
'i'
'i'
'0'
'U'
'i'
'i'
'i'
'i'
'0'
'U'
'i'
'i'
'i'
'i'
'0'
'0'
'i'
'0'
'0'
'0'
'0'
'0'
'i'
'0'
'i'
'i'
'0'
'0'
'i'
'i'
'i'
'i'
'0'
'0'
'i'
'i'
'0'
'0'
'0'
'0'
'i'
'0'
'0'
'0'
'0'
'0'
'i'
'0'
'0'
'0'
'i'
'0'
'i'
'0'
'i'
'i'
'i'
'0'
'i'
'0'
'i'
'i'
'i'
'i'
tF=CJ
f---l
f-----1
o
Now
50 ns
Cursor 1
Ons
.... ....
20
268
Solucin al Ejercicio 3. 7
Al declarar las seales se especifica que el valor inicial de YO es ' 1 ' , pero no se
especifica el valor inicial de Y1. Por ello, la seal YO tiene en t = O el valor ' 1',
mientras que la seal Y1 tiene el valor por defecto para std_logic, que es 'U' .
Asimismo, en t =O se ejecutan la sentencia de asignacin a la seal Y1 y el bloque
process:
- Al ejecutar la sentencia de asignacin a Y1, se calcula el nuevo valor para Y1,
que es igual al valor que tiene YO en t = O. Es decir, ' 1 ' . Este nuevo valor se
asignar a la seal transcurridos 10 ns. Esto es, en el instante t = 10 ns.
- Las sentencias del bloque process se ejecutan secuencialmente, una tras otra,
hasta que se ejecuta la sentencia wait, que hace que la ejecucin del bloque
process quede suspendida. La ejecucin de cada sentencia de asignacin a YO
hace que se actualice la cola de transacciones del driver. Por tratarse de asignaciones con retardo de transporte, en cada caso se actualiza la cola aplicando
nicamente la Regla l. Obsrvese que al aadir la transaccin correspondiente
a la sentencia
YO <= transport '1' after 15 ns;
ya que la transaccin descrita por esta ltima asignacin est planificada para
un tiempo posterior a 15 ns (aplicacin de la Regla 1).
A continuacin, se muestra el resultado de la inicializacin y el contenido en t = O
de las colas de transacciones planificadas.
tiempo
o
tiempo
10 ns
15 ns
30 ns
YO
'0'
YO
Y1
'1'
'U'
tiempo
10 ns
Y1
'1'
'1'
'0'
269
o
10 ns
tiempo
15 ns
30 ns
YO
'1'
YO
Y1
'1'
'U'
'0'
'1'
tiempo
20 ns
Y1
'0'
'0'
El siguiente evento est planificado para el instante 15 ns. Por tanto, el reloj de
la simulacin avanza hasta t = 15 ns, instante en el cual se asigna a la seal YO el
valor '1 '.
El cambio en el valor de la seal YO hace que se ejecute la sentencia de asignacin
a la seal Y1, esto es,
Y1 <= YO after 10 ns;
calculndose el nuevo valor para Y1, que es ' 1'. Este nuevo valor se asignar a la
seal en el instante t = 25 ns. Al introducir esta nueva transaccin en la cola de
transacciones del driver, se elimina de la cola la transaccin que estaba planificada
para el instante t = 20 ns (aplicacin de la Regla 2.2). El resultado de la simulacin
hasta el instante t = 15 ns y el contenido de las colas de transacciones se muestran
a continuacin.
tiempo
o
10 ns
15 ns
tiempo
30 ns
YO
'0'
YO
Y1
'1'
'U'
'0'
'1'
'1'
'1'
tiempo
25 ns
Y1
'1'
No se genera ningn evento en el instante t = 25 ns, aunque existe una transaccin planificada para la seal Y1 en dicho instante, ya que el valor planificado para la
270
seal y el valor actual son iguales. Por tanto, el reloj de la simulacin avanza hasta
t = 30 ns, instante en el cual est planificado el evento ms prximo.
En t = 30 ns, se asigna a la seal YO el valor 'o'. El cambio en el valor de la
seal YO hace que se ejecute la asignacin concurrente a la seal Y1. El nuevo valor
de la seal Y1 es 'o' y se asignar a la seal en el instante t = 40 ns. El resultado
de la simulacin hasta este instante y el contenido de las colas de transacciones
planificadas se muestran a continuacin.
tiempo
o
10 ns
15 ns
30 ns
tiempo
YO
YO
Y1
'1'
'U'
'0'
'1'
'1'
'1'
'0'
'1'
tiempo
40 ns
Y1
'0'
El siguiente evento est planificado para el instante 40 ns. Por tanto, el reloj de
la simulacin avanza hasta t = 40 ns , instante en el cual se asigna a la seal Y1 el
valor 'o' . Como no existen ms eventos planificados, la simulacin termina en este
instante.
La tabla siguiente muestra los valores que toman las seales YO e Y1 en los
instantes de tiempo en que existe un evento en alguna de estas seales.
tiempo
o
10
15
30
40
ns
ns
ns
ns
YO
Y1
'1'
'U'
'0'
'1'
'1'
'1'
'0'
'1'
'0'
'0'
271
TEMA
4.1. Introduccin
4.2. Diseo para sntesis de lgica combinacional
4.3. Funciones lgicas
4.4. Multiplexor de 4 entradas
4.5. Restador completo de 1 bit
4.6. Sumador completo de 1 bit
4. 7. Unidad aritmtico lgica
4.8. Lecturas recomendadas
4.9. Ejercicios de autocomprobacin
4.10. Soluciones de los ejercicios
OBJETIVOS DOCENTES
Una vez estudiado el contenido del tema y realizados los ejercicios prcticos,
debera saber:
- Discutir qu caractersticas debe reunir un diseo para que el circuito resultante de su sntesis sea combinacional.
- Disear circuitos lgicos combinacionales empleando VHDL, tales como funciones lgicas, multiplexores, sumadores y restadores binarios, y ALUs, describiendo el comportamiento y/ o la estructura del circuito.
- Describir un mismo circuito combinacional usando diferentes representaciones (comportamental, estructural o mixta) y empleando diferentes tipos de
sentencias, tanto concurrentes como secuenciales.
- Programar y simular bancos de prueba para circuitos combinacionales, yanalizar los resultados de la simulacin.
275
4.1.
INTRODUCCIN
4.2.
A continuacin, se describe un mtodo para la descripcin de circuitos combinacionales que es sencillo de entender, aplicable de manera general y ampliamente
usado.
277
4.2.1.
Tambin, pueden sintetizarse arrays de puertas lgicas a partir de este mismo tipo
de sentencias. Por ejemplo, la siguiente sentencia describe un array de inversores:
Array de inversores
278
110011)
110111)
111011)
when
when
when
when
"00",
"01",
"10",
others;
279
4.2.2.
Aunque las sentencias concurrentes de asignacin a seal son tiles para crear
estructuras combinacionales simples, es necesario disponer de otro mtodo para crear
circuitos ms complejos. En concreto, cierto nmero de clusulas de VHDL (tales
como if, case y for) slo pueden ser usadas dentro de bloques process.
Los bloques process pueden ser usados para describir lgica combinacional. Para
que el circuito resultante de la sntesis sea combinacional, deben respetarse las reglas
siguientes:
l. Todas las entradas del circuito deben estar incluidas en la lista de sensibilidad
del bloque process.
4.3.
FUNCIONES LGICAS
4.3.1.
a and b or not e
El Cdigo VHDL 4.1 describe las funciones lgicas. Obsrvese que el orden en
el cual deben realizarse las operaciones booleanas debe indicarse explcitamente
mediante parntesis en el cdigo VHDL (en caso contrario se obtiene error). Es
decir, las funciones lgicas deben escribirse de la forma siguiente:
280
( a and b ) or not e
-- Funcion es lgicas:
F = ab + e'
G = ab + b'c
Fichero: fun cLog_F_G.vhd
library IEEE; use IEEE.std_logie_1164.all;
La interfaz externa del circuito que implementa las funciones lgicas es descrita
en la entity llamada funcLog_F _G. En ella se declaran los dos puertos de salida (F,
G), seguidos de los tres puertos de entrada (a, b, e). Todos los puertos son del tipo
std_logic, ya que representan seales transmitidas por el cableado de los circuitos.
La definicin de la architecture comienza especificando el nombre de la entity.
En este caso, se ha dado el mismo nombre a la entity y a la architecture. En
general se les puede dar nombres diferentes.
En el cuerpo de la architecture (es decir, a continuacin de la palabra reservada
begin) se describe cmo se calculan los puertos de salida a partir de los puertos de
entrada.
4.3.2.
Una vez modelado el circuito, puede programarse su banco de pruebas tal como
se muestra en el Cdigo VHDL 4.2. Puesto que el banco de pruebas no va a ser
sintetizado, puede emplearse para su programacin cualquier instruccin VHDL disponible (incluso aquellas que daran lugar a circuitos no sintetizables). Instrucciones
tiles de este tipo son wait, assert y report, que permiten controlar el progreso de
la simulacin, comprobar y mostrar sus resultados.
En este caso, la finalidad del banco de pruebas es nicamente generar las 23
posibles entradas al circuito. Normalmente, los propios programas de test contienen
los algoritmos necesarios para determinar si las salidas del circuito son las esperadas
y muestran los correspondientes mensajes en aquellos casos en que no lo sean. Por
281
-- Banco de pruebas
-- Fichero: bp_funcLog_F_G. vhd
library IEEE;
use IEEE. std_logie_1164. all;
use IEEE.numerie_std . all;
entity bp_funeLog_F _G is
end entlty bp_funeLog_F _G;
architecture bp_funeLog_F _G of bp_funeLog_F _G is
signal yO, y1
: std_logic;
signal xO, x1, x2 : std_logic;
Cdigo VHDL 4.2: Banco de pruebas del circuito que implementa las dos funciones lgicas.
282
simplicidad, en este caso esta labor la asume el diseador. Es decir, observando las
seales de salida del circuito y comparando con la tabla de la verdad de las funciones
lgicas, el diseador determina si el funcionamiento del circuito es el esperado.
Como programa VHDL, el banco de pruebas es un tipo especial de pareja entityarchitecture, que no tiene ni entradas ni salidas externas. Por este motivo, la entity
del banco de pruebas no contiene ningn puerto.
Internamente, el banco de pruebas tiene conexiones al UUT. Se han definido
seales internas al banco de pruebas para todas las conexiones al UUT:
signal yO, y1
signal xO, x1, x2
std_logic;
std_logic;
donde las variables se declaran antes de la palabra reservada begin, y las sentencias a
ejecutar secuencialmente se escriben a continuacin de la palabra begin. Obsrvese
que VHDL permite opcionalmente asignar un nombre a los bloques process. En
este caso, se ha asignado al bloque el nombre gen_ ve e_ test.
En el cdigo del banco de pruebas, la variable test_in se usa para almacenar
en un mismo vector de tres bits las entradas al UUT, de modo que este vector
283
pueda ser incrementado (con el fin de generar todas las posibles combinaciones de
vectores de test) empleando un bucle for. La variable test_in se ha declarado de
tipo unsigned, ya que se emplea para realizar operaciones aritmticas. La longitud
del vector se especifica por el rango (2 downto 0). El primer nmero del rango (2)
indica el ndice del bit ms significativo del vector, y el segundo nmero del rango
(O) indica el ndice del bit menos significativo del vector.
La sentencia wait for se emplea para esperar durante un nmero determinado
de unidades de tiempo. En el cdigo del banco de pruebas, se emplea
wait for 10 ns;
para esperar hasta que el UUT pueda producir las salidas correspondientes a las
entradas aplicadas. En este caso, podra haberse escogido cualquier otro tiempo de
espera, ya que en el modelo del UUT no se especific ningn retardo.
La segunda sentencia wait , que est situada al final del bloque process, no tiene
ninguna indicacin acerca del tiempo que hay que esperar. Este tipo de sentencia
wait se emplea para suspender indefinidamente la ejecucin del bloque process, ya
que "espera para siempre".
Como resultado de la simulacin del banco de pruebas, se obtienen las formas de
onda mostradas en la Figura 4.1.
+ /bp_funclog_f_g/_yO
+ /bp_funclog_f_g/_y1
+ /bp_funclog_f_g/xO
+/bp_funclog_f_g/x1
+ /bp_funclog_f_g/x2
1
1
1
1
Now
80 ns
Cursor 1
Ons
~11111111
111 1 1 1 1 1 1 1
llQflil
1 1 1 1 1 1 1 111 1 1 1 1 1 1 1
1111111
~~~
11 11111
1111111 1
wW~I hl
El
1
1
1
1
1
1
O ns to 84 ns
1111111
11
l .,.....
1
Now: 80 ns Delta: 1
284
~~
4.4.
MULTIPLEXOR DE 4 ENTRADAS
En la Figura 4.2 se muestra un multiplexor de 4 entradas (i3, i2, i1, iO), dos
entradas de seleccin (si, so) y una salida (d). En esta seccin se describen diferentes
maneras de modelar el multiplexor, as como bancos de pruebas que permiten simular
tests sobre los modelos del circuito.
4.4.1.
El Cdigo VHDL 4.3 describe el MUX 4:1, empleando para ello una sentencia
if incluida en un bloque process. Asimismo, el Cdigo VHDL 4.4 describe el comportamiento del multiplexor mediante sentencias if y case incluidas en un bloque
process. Obsrvese que en ambos diseos el bloque process es sensible a las seales
i3, i2, i1, iO, s1, sO. Esto significa que las sentencias del bloque se ejecutarn cada
vez que alguna de estas seales cambie de valor.
El Cdigo VHDL 4.5 es un banco de pruebas que aplica algunos vectores de test
al multiplexor. Se trata nicamente de un pequeo ejemplo, no es un programa de
test exhaustivo para este circuito. En la Figura 4.3a se muestran las formas de onda
obtenidas al simular el banco de pruebas.
Un error que a veces se comete consiste en olvidar incluir en la lista alguna de las
variables a las que es sensible el bloque process. La consecuencia de este error es que
el bloque process no se ejecutar cuando cambie el valor de la variable no incluida
en la lista, con lo cual el modelo simulado no reproducir correctamente el circuito
real. Por ejemplo, supongamos que en el modelo del multiplexor no se incluyen las
entradas i3, i2, i1, iO en la lista de variables a las que es sensible el bloque process.
Es decir, supongamos que por error la architecture del multiplexor se define tal
como se muestra en el Cdigo VHDL 4.6.
285
-- MUX 4x1
-- Fichero: mux_4xLprocess_if. vhd
library IEEE; use IEEE. std_logic_1164. all;
Cdigo VHDL 4.3: Diseo de un MUX 4:1 mediante una sentencia if.
4.4.2.
El Cdigo VHDL 4. 7 describe el circuito multiplexor usando una sentencia concurrente, en la cual se asigna valor a la seal d en funcin del valor que tomen las
entradas al circuito.
El Cdigo VHDL 4.8 ilustra el empleo de seales del tipo integer. Este diseo
es una variacin del anterior, describindose en este caso el comportamiento del
circuito mediante dos sentencias concurrentes. En la primera, se asigna valor a la
seal integer sel en funcin del valor de las entradas de seleccin. En la segunda,
se asigna valor a la salida del circuito en funcin de las entradas de datos y del valor
de la seal entera. En la Figura 4.4 se muestra el resultado de la simulacin.
286
-- MUX 4x1
-- Fichero: mux_4xLprocess_if_case. vhd
library IEEE; use IEEE. std_logic_1164. all;
Cdigo VHDL 4.4: Descripcin del MUX 4:1 mediante sentencias if y case.
287
-- Banco de pruebas
-- Fichero: bp_mux_4x1. vhd
library IEEE;
use IEEE. std_logic_1164. all;
begin
iO < = '0'; i1 < = '0'; i2 <= '1'; i3 < = '0';
sO < = '0'; s1 < = '0';
wait for 5 ns;
iO < = '1';
wait for 5 ns;
sO < = '1';
wait for 10 ns;
sO<= '0'; s1 < = '1';
wait for 10 ns;
sO < = '1';
wait;
end process gen_vec_test;
end architecture bp_mux_4x1;
288
+ /bp_mux_4x1/d
+ /bp_mux_4x1 /i0
+ /bp_mux_4x1/i1
+ /bp_mux_4x1/i2
+ /bp_mux_4x1 /i3
+ /bp_mux_4x1/s0
+ /bp_mux_4x1/s1
+ /bp_mux_4x1/d
+ /bp_mux_4x1/i0
+ /bp_mux_4x1/i1
+ /bp_mux_4x1/i2
+ /bp_mux_4x1/i3
+ /bp_mux_4x1/s0
+ /bp_mux_4x1/s1
Now
o
1
o
1
1
60 ns
Now
a)
10
o
1
11
11
11
11
1
1
30
40
11
11
60 ns
20
10
20
30
40
b)
Figura 4 .3: Formas de onda obtenidas de simular el banco de pruebas: a) modelo del multiplexor
correct o; b) modelo del mult iplexor errneo.
-- MUX 4x 1
-- ERROR al definir la sensibilidad del bloque process
-- Fich ero : mux_4x Lprocess_if"_in sen sible_i3i2i1iO. vhd
architecture mux_4x1 of mux_4x1 is
begin
process (s1 , sO) -- Error: no se incluyen i3,i2, i1,i0
begin
if
(s1='0'and s0='0') then
<=
iO;
<=
i1;
<=
i2 ;
<=
i3 ;
el se
end if;
end process;
end architectur e mux_4x1;
289
-- MUX 4x1
-- Fichero: mnx_4xLconcnrrente1. vhd
library IEEE;
use IEEE.std_logic_ii64.all;
entity mux_ 4xi is port
( d
: out std_logic;
i3, i2, ii, iO
: in std_logic;
si, sO
: in std_logic );
end entity mux_4xi;
architecture mux_4xi concurrente of mux_4xi is
begin
d
<= iO when (si='O' and s0='0') else
ii when (si=' O' and sO=' i ') else
i2 when (si=' i' and sO=' O') else
i3;
end architecture mux_4xi_concurrente;
-- MUX 4x1
-- Fichero: mnx_4xLconcurrente. vhd
library IEEE; use IEEE. std_logic_ii64.all;
entity mux_ 4xi is port
( d
: out std_logic;
i3, i2, ii, iO
: in std_logic;
si, sO
: in std_logic ) ;
end entity mux_4xi;
architecture mux_4xi_concurrente of mux
signal sel : integer;
begin
sel <=O when (si='O' and s0='0')
i w hen (si= ' O' and sO= ' i ' )
2 when (si='i' and s0='0')
3;
<= iO when sel = O else
d
i i when sel = i else
i2 when sel = 2 else
i3;
end architecture mux_4xi_concurrente;
4xi is
else
else
else
Cdigo VHDL 4.8: Diseo de un MUX 4:1 mediante dos sentencias concurrentes.
+ /bp_mux_ 4x1/uutld
+ /bp_mux_4x1/uutli0
+ /bp_mux_4x1/uutli1
+ /bp_mux_ 4x1/uut/i2
+ /bp_mux_ 4x1/uut/i3
+ /bp_mux_ 4x1/uut/s0
+ /bp_mux_4x1/uutls1
+ /bp_mux_4x1/uut/sel
Now
11
11
11
1'
11
1
1
3
11
45 ns
11
o
1
1
1
10
2
1
20
3
1
30
40
Figura 4.4: Formas de onda obtenidas de simular el banco de pruebas, empleando la descripcin
del comportamiento del multiplexor.
290
4.5.
4.5.1.
res
o o o
o 1 1
1 o 1
1 1 o
acarreo
o
1
o
o
291
-- R estador completo de 1 bt
-- Fchero: restadorCompletol btComport. vhd
library IEEE;
use IEEE. std_logic_1164. all;
use IEEE. numeric_std. all;
entity rest_completo is port
( res, acarreo_out : out std_logic;
a, b, acarreo_in : in std_logic);
end entity rest_completo;
architecture rest_completo_comport of rest_completo is
signal result : unsigned ( 1 downto O );
begin
result
<= ('0' & a)- ('0' & b)- ('0' & acarreo_in);
acarreo_out <= result(1);
res
<= result(O);
end architecture rest_completo_comport;
declararla, se indica que la seal tiene 2 bits, especificando para ello su rango:
( 1 downto O ) . Si no se especifica el rango, las seales del tipo unsigned tienen
por defecto 32 bits. El tipo de la seal debe ser unsigned, a fin de permitir el uso
del operador resta.
Las seales de entrada, de 1 bit, deben ser extendidas a 2 bits (concatenando un
O), de modo que el resultado de la resta pueda ser almacenado en una seal de 2
bits del tipo unsigned.
Finalmente, el resultado de la resta se asigna a res y acarreo_out. Obsrvese
que es posible realizar las asignaciones:
acarreo_out <= result(1);
res
<= result(O);
porque cada elemento de una seal del tipo unsigned es del tipo std_logic, que es
exactamente el tipo de las seales res y acarreo_out.
292
4.5 .2.
Descripcin de la estructura
.----+r--;
. . ... . . . . . . . . .
acarreo out
a
.............................................
b
.............................................
res
-~ ...
;:...-....-...-..-.-.....................
acarreo m
.............................................
Figura 4.5: Diagrama de un circuito restador completo de 1 bit.
Obsrvese que, a fin de facilitar la descripcin del modelo, se han etiquetado las
seales internas (not_a, e, d, e, f) y las puertas lgicas (gO, ... , g6). La definicin de
cada una de estas puertas lgicas se muestra en el Cdigo VHDL 4.10.
Para componer el circuito restador usando las puertas lgicas anteriores , es
necesario instanciar los componentes necesarios y conectarlos. Para ello, es preciso
escribir la entity de cada uno de los componentes, instanciar los componentes y
describir la conexin entre ellos. El Cdigo VHDL 4.11 describe la estructura del
circuito restador completo.
En el modelo anterior, se realiza la conexin entre los componentes mediante
asociacin posicional. Es posible tambin usar asignacin implcita. Por ejemplo:
g2 : component not1 port map (yO=> not_a, xO =>a);
293
Cdigo VHDL 4.10: Diseo de las puertas lgicas XOR2, NOTl , AND2 y OR3.
294
295
4.5.3.
Se han definido seales internas al banco de pruebas para todas las conexiones
al UUT. Aunque en este ejemplo si lo sean, los nombres de las seales no tienen que
ser idnticos a los nombres de los puertos del UUT.
Se ha definido un proceso (process) para generar las formas de onda de las entradas al UUT, y en ese mismo proceso se han incluido las sentencias para comprobar
si las salidas del UUT coinciden con las esperadas.
Es esencial tener en cuenta que el mtodo empleado para calcular las salidas
"esperadas" del UUT debe ser diferente del mtodo empleado en el propio UUT para
obtener las salidas. En este ejemplo, el UUT contiene una descripcin estructural de
la arquitectura del restador, mientras que las salidas "esperadas" (variable esperado)
se calculan a partir de una descripcin del comportamiento del restador:
esperado := ('0' & a)- ('0' & b)- ('0' & acarreo_in);
296
297
UJ wave default
+ /bp_rest_completo/res
+ /bp_rest_completo/acarreo_out
+ /bp_rest_completo/a
+ /bp_rest_completo/b
+ /bp_rest_completo/acarreo_in
.J.~J29
1
.3
1
1
1
GJ
1 t!{ r~stadorCompl~to1bit_bp.vhd 1
...!.J..!.J
UJ wave 1
...!... h.l
----
.iliJ
Figura 4.6: Formas de onda y mensaje en la consola obtenidos al simular el banco de pruebas.
298
entity bp_rest_completo is
end entity bp_rest_completo;
Cdigo VHDL 4.13: Banco de pruebas del restador completo de un bit usando un procedimiento.
299
Cdigo VHDL 4.14: Banco de pruebas del restador completo de un bit usando una funcin.
300
4.6.
Un sumador completo es un circuito con tres bits de entrada (xi, Yi, ci) y dos
bits de salida: el bit suma (si) y el bit acarreo (Ci+ 1 ). El funcionamiento del circuito
est descrito por la tabla de la verdad siguiente:
Ci
Xi
o o o
o o 1
o 1 o
o 1 1
1 o o
1 o 1
1 1 o
1
o o
o 1
o 1
1
o
o 1
1
o
1
o
Si
Ci+l
Yi
Ci+l
Si
XiYi
Xi
+ XiCi + YiCi
EB Yi EB
Ci
X
............................................
..... .)!L.....:.-............:......:
"''''c;oooooooooooooooo'
..........................................
A:N52.....................
-----+-:....,.
n2
i.~.~~-1... ..........1
l---+A-tNo2""""""""'""1n
.....__...,.o_
...R-'1.3"""""""""""'1
i.~NQL?. ............1
A:N52.....................
1------+-:-+
.............................................
i.QR~-~ ...............1
n4
i.~NR~-~ ............1
301
4.6.1.
El Cdigo VHDL 4.15 describe las puertas lgicas necesarias para componer el
circuito sumador de la Figura 4.7. Las puertas lgicas AND, OR y XOR se modelan
con un retardo de 10 ns.
En este caso, en lugar de declarar los componentes en la architecture del
sumador, se han definido los componentes en un package, tal como se muestra
en el Cdigo VHDL 4.16.
4.6.2.
Banco de pruebas
+ /bp_sum_completo/c_in
+ /bp_sum_completo/ x
+ /bp_sum_completo/y
+ /bp_sum_completo/c_out
+ /bp_sum_completo/s
1
1
1
1
1
Now
1
1
----.,
----.,
450 ns
....
. ....
1
1
1
1
1
1
11111111111111111111111111111111111111111111111111111111111111111111
100
200
111111111111111111111
300
.. .... _,
/~
\,.: . ,. . . :
'
400
entity and2 is
generic ( DELAY : time := 10 ns );
port ( yO
: out std_logic;
xO, x 1 : in std_logic ) ;
end entity and2;
architecture and2 of and2 is
begin
yO <= ( xO and x1 ) after DELAY;
end architecture and2;
entity or3 is
generic ( DELAY : time := 10 ns );
port ( yO
: out std_logic;
xO, x1, x2 : in std_logic );
end entity or3;
architecture or3 of or3 is
begin
yO <= ( xO or x1 or x2 ) after DELAY;
end architecture or3;
entity xor2 is
generic ( DELAY : time := 10 ns );
port ( yO
: out std_logic;
xO, x1 : in std_logic );
end entity xor2;
architecture xor2 of xor2 is
begin
yO <= ( xO xor x1 ) after DELAY;
end architecture xor2;
Cdigo VHDL 4.15: Diseo de las puertas lgicas AND2, OR3 y XOR2 con retardo.
BERGARA
package puertasLogicas_package is
component xor2 is
generic ( DELAY : time := 10 ns );
port ( yO
: out std_logic;
xO, x 1
: in std_logic ) ;
end component xor2;
component and2 is
generic ( DELAY : time := 10 ns );
port ( yO
: out std_logic;
xO, x 1
: in std_logic ) ;
end component and2;
component or3 is
generic ( DELAY : time := 10 ns );
port ( yO
: out std_logic;
xO, x1, x2 : in std_logic );
end component or3;
end package puertasLogicas_package;
-- Sumador completo de 1 bit
-- Fich ero: snmadorCompletol bitEstrnc. vhd
library IEEE;
use IEEE. std_logic_1164. all;
use work. puertasLogicas_package. all;
);
);
);
);
);
);
Cdigo VHDL 4.16: Package con los componentes del sumador y diseo del sumador.
304 .
305
4.7.
Una unidad aritmtico lgica (ALU) es un circuito que, dependiendo del valor
de sus entradas de seleccin de funcin, realiza una operacin lgica o aritmtica,
de entre un conjunto de operaciones posibles, sobre uno o dos operandos.
En esta seccin se realizar el diseo de una AL U que realiza operaciones entre
dos operandos, A y B, en funcin del valor de la seal de entrada de seleccin de
funcin, mode, que tiene 3 bits (vase la Tabla 4.1).
Tabla 4.1: Tabla de operaciones de la AL U.
mo de
000
oo1
o1 o
o1 1
1 oo
1 o1
11o
111
4.7.1.
Operacin
A* 2
A+B
A-B
-A
A and B
A or B
A xor B
notA
Descripcin
Multiplicar por 2 (equivale a desplazamiento a la izqda)
Suma
Resta
Complemento a dos
AND lgico
OR lgico
XOR lgico
Complemento de todos los bits
Diseo de la ALU
Este circuito puede ser descrito mediante una asignacin concurrente a una seal,
o bien mediante varias asignaciones incluidas dentro de un bloque process, tal
como se muestra en el Cdigo VHDL 4.18. Ambos diseos dan lugar a circuitos
combinacionales equivalentes.
Recurdese que, en general, un circuito combinacional puede ser descrito mediante un bloque process siempre que todas las seales de entrada al circuito
combinacional sean incluidas en la lista de variables a las que es sensible el bloque
process. En este caso, el bloque process es sensible a tres seales: los dos operandos
y la seal de seleccin de la operacin.
En estos diseos se emplear un package para definir tanto la constante que
determina el tamao de palabra de los operandos, como la constante que determina
el tamao de la palabra de seleccin de la operacin. Obsrvese que para poder usar
este package se incluye en ambos diseos la sentencia:
use work.ALU_CONSTANTS.all;
306
entity ALU is
downto O);
port ( e
: out std_logic_vector (WIDTH-1
std_logic_vector (WIDTH-1
downto O);
A, B :in
std_logic_vector (SEL_BITS-1 downto O) );
mode : in
end entity ALU;
architecture ALU_concurrente of ALU is
begin
e <=
std_logic_vector (signed(A)+signed(A))
else std_logic_vector (signed(A)+signed(B))
else std_logic_vector (signed(A)-signed(B))
else std_logic_vector (-signed(A))
else A and B
else A or B
else A xor B
else not A;
end architecture ALU_concurrente;
Cdigo VHDL 4 .18: Uso de package para la definicin de const antes, y diseo de la ALU
mediante una asignacin concurrente y un bloque process.
307
4.7.2.
1 y 2.
- Se escogen valores de los operandos en el lmite inferior de su rango. Por ejemplo, si MIN_NEG_DATA representa el valor mnimo que puede tomar el operando,
entonces se escogen los valores MIN_NEG_DATA, ... , MIN_NEG_DATA+4 para cada
uno de los operandos.
- Se escogen valores de los operandos en el lmite superior de su rango. Si
MAX_POS_DATA representa el valor mximo que puede tomar el operando, entonces se escogen los valores MAX_POS_DATA-4, ... , MAX_POS_DATA para cada uno
de los operandos.
- Finalmente, se escogen algunos valores "al azar", ms o menos distribuidos
uniformemente en el rango de los operandos.
El Cdigo VHDL 4.19 contiene un package en el cual de definen las constantes
globales del banco de pruebas, cuyo valor es calculado a partir de las constantes
globales de la ALU. El Cdigo VHDL 4.19- 4.22 es el banco de pruebas.
308
Cdigo VHDL 4.19: Package en el cual se definen las constantes usadas en el banco de pruebas
de la AL U y comienzo de la definicin del banco de pruebas de la AL U.
309
---------------- Continua banco de pruebas para la AL U (fichero TB_AL U. vhd) -------------- Procedure que calcula C ( expectecL C) y lo compara con el
-- valor de C que se pasa como argumento ( actuaLC)
-- Si ambos valores no co'i nciden, se muestra un mensaje y se
-- incrementa el contador de errores (error_count)
procedure check_ALU
( i, j, k : in integer;
actual_C : in std_logic_vector (WIDTH-1
downto O);
error _count : inout integer ) is
variable expected_C : integer;
begin
case k is
when O
=> expected_C := i *2;
when 1
=> expected_C := i+j;
when 2
=> expected_C := i-j;
when 3
=> expected_C := -i;
when 4
=> expected_C := TO_INTEGER(signed(
std_logic_vector(TO_SIGNED( i,WIDTH)) and
std_logic_vector(TO_SIGNED(j ,WIDTH))
) );
when 5
=> expected_C := TO_INTEGER(signed(
std_logic_vector(TO_SIGNED( i,WIDTH)) or
std_logic_vector(TO_SIGNED(j ,WIDTH))
));
when 6
=> expected_C := TO_INTEGER(signed(
std_logic_vector(TO_SIGNED( i,WIDTH)) xor
std_logic_vector(TO_SIGNED(j ,WIDTH))
));
when others => expected_C := TO_INTEGER(signed(
not std_logic_vector(TO_SIGNED(i,WIDTH)) ));
end case;
expected_C := TO_INTEGER(TO_SIGNED( expected_C,WIDTH) );
-- Trunca el resultado a WIDTH bits
assert( expected_C = TO_INTEGER(signed(actual_C)) )
report 11 ERROR. Ops: 11 & integer' image ( i) & 11 , 11 & integer' image (j) &
11
11
, Operacion:
& integer' image(k) &
11
11
, resultado esperado:
&
integer' image( expected_C) &
11
11
, resultado actual:
&
integer'image(TO_INTEGER(signed(actual_C))) &
11
en el instante 11 &
time ' image ( now);
if (expected_C /= TO_INTEGER(signed(actual_C))) then
error_count := error_count + 1;
end if;
end procedure check_ALU;
-- Fin de la definicin del procedure
Cdigo VHDL 4.20: Fragmento del banco de pruebas de la ALU: definicin del procedure
check_ALU.
310
---------------- Continua banco de pruebas para la AL U (fichero TB_AL U. vhd) ------------ begin
UUT : component ALU port map (e, A, B, mo de);
-- bloque process para generar los vectores de test y
-- comprobar el resultado
main : process is
variable error_count : integer := O;
begin
report "Comienza la simulacin";
-- Vectores de test: operandos con valor prximo a cero
for i in -2 to 2 loop
for j in -2 to 2 loop
for k in O to SEL_MAX loop
A
<= std_logic_vector(TO_SIGNED( i,WIDTH) );
b
<= std_logic_vector(TO_SIGNED(j ,WIDTH) );
mode <= std_logic_vector(TO_SIGNED(k,SEL_BITS));
wait for DELAY;
check_ALU(i, j, k, e, error_count);
end loop;
end loop;
end loop;
-- Vectores de test: operandos con valor prximo al mnimo
for i in MIN_NEG_DATA to MIN_NEG_DATA+4 loop
for j in MIN_NEG_DATA to MIN_NEG_DATA+4 loop
for k in O to SEL_MAX loop
A
<= std_logic_vector(TO_SIGNED( i,WIDTH) );
b
<= std_logic_vector(TO_SIGNED(j ,WIDTH) );
mode <= std_logic_vector(TO_SIGNED(k,SEL_BITS));
wait for DELAY;
check_ALU(i, j, k, e, error_count);
end loop;
end loop;
end loop;
-- Vectores de test: operandos con valor prximo al mximo
for i in MAX_POS_DATA-4 to MAX_POS_DATA loop
for j in MAX_POS_DATA-4 to MAX_POS_DATA loop
for k in O to SEL_MAX loop
A
<= std_logic_vector(TO_SIGNED(i,WIDTH));
b
<= std_logic_vector(TO_SIGNED(j ,WIDTH) );
mode <= std_logic_vector(TO_SIGNED(k,SEL_BITS));
wait for DELAY;
che ck_ALU ( i, j, k, e, error_ count);
end loop;
end loop;
end loop;
311
---------------- Continua banco de pruebas para la AL U (fichero TB_AL U. vhd) -------------- Vectores de test: operandos con valores al azar
for i in O to 9 loop
for j in O to 9 loop
for k in O to SEL_MAX loop
A
<= std_logic_vector(TO_SIGNED(41 *i-273,WIDTH));
<= std_logic_vector(TO_SIGNED(89*j-384,WIDTH));
b
mode <= std_logic_vector(TO_SIGNED(k,SEL_BITS) );
wait for DELAY;
check_ALU(41 *i-273, 89*j-384, k, e, error_count);
end loop;
end loop;
end loop;
wait for DELAY;
Cdigo VHDL 4.22: Parte final de la definicin del banco de pruebas de la ALU.
312
4.8.
LECTURAS RECOMENDADAS
313
4.9.
EJERCICIOS DE AUTOCOMPROBACIN
Ejercicio 4.1
Disee en VHDL un codificador 4:2 con prioridad. Este circuito tiene cuatro
entradas de 1 bit (i3, i2, i1, iO) y dos salidas: la seal valida, de 1 bit, que vale '1'
cuando al menos una de las entradas vale '1', y la seal codificada, de 2 bits, cuyo
valor corresponde con la entrada de mayor prioridad cuyo valor es '1 '. La entrada
i3 tiene mayor prioridad que i2, sta mayor que i1 y finalmente la entrada iO es la
de menor prioridad.
A continuacin, programe un banco de pruebas que testee todas las posibles
entradas al circuito y simlelo.
Ejercicio 4.2
Ejercicio 4.3
314
b
g
d
Figura 4.9: Display de 7 segmentos.
Z2
o
o
o
o
o
o
o
o
o o o 1
o o 1 o
o 1 o 1
o 1 1 1
1 o o o
1 o 1 1
1 1 o 1
1
1
Zl
zo
Z3
o o o
o o 1
1
1
1
b e
1 1
1 1
1 o
1 1
1 1
o 1
o 1
1 1
1 1
1 1
d
1
e
1
1 1
o
o o o o
1 1 o 1
1 o o 1
o o 1 1
1 o 1 1
1
o o o o
1
1 1
o 1
1
1
Ejercicio 4.4
315
Ejercicio 4.5
Ejercicio 4.6
Ejercicio 4. 7
eout
ci+l
SBC
xl yl
x2 Y2
c3
C
ci+I
Y;
SBC
Y;
c2
C
ci+l
Xo Yo
SBC
el
C
ci+l
SBC
s3
s2
SI
So
ein
C
Figura 4.10: Sumador binario paralelo de 4 bits con propagacin del arrastre.
316
Ejercicio 4.8
Disee un circuito desplazador de 4 bits de entrada que realice las operaciones que se muestran en la Tabla 4.3, usando nicamente sentencias de asignacin
concurrentes. Programe un banco de pruebas y simlelo.
Tabla 4.3: Operaciones del circuito desplazador
op
00
o1
1o
11
Operacin
Desplaza a la izquierda rellenando con 'O'
Desplaza a la derecha rellenando con 'O'
Rota a la izquierda
Rota a la derecha
Ejercicio 4. 9
Disee un circuito que compare si dos nmeros de N bits tienen igual valor.
Construya el circuito de manera iterativa, tal como se muestra en la Figura 4.11.
EQ
EQ
EQ
Po
'1'
Figura 4.11: Circuito que compara si dos nmeros de N bits son iguales.
Disee inicialmente un comparador de 1 bit, que tenga las tres entradas siguientes: los dos operandos de un bit (xi e Yi) y el resultado de la comparacin de la
etapa anterior (Pi) Pi es un bit cuyo valor es '1' slo si todas las parejas de bits
comparadas hasta esa etapa son iguales. La salida del comparador de 1 bit, Pi+l ,
es el resultado de la comparacin llevada acabo en esa etapa, teniendo en cuenta
el valor de las tres entradas. Finalmente, encadene N comparadores de 1 bit para
implementar el comparador de N bits, usando para ello la sentencia generate.
317
Ejercicio 4.10
Disee la ALU cuyo circuito se muestra en la Figura 4.12 y que realiza las
operaciones descritas en la la Tabla 4.4. La salida de la AL U se selecciona mediante
el bit ms significativo de la seal sel, mientras que la operacin que realiza es
especificada por los otros tres bits de esta seal. Emplee en el diseo de la AL U
nicamente cdigo concurrente. A continuacin, programe un banco de pruebas que
testee el correcto funcionamiento de la AL U diseada.
a(7:0) - -....--t
b(7:0) -
.....-+o--1
Unidad
Lgica
y(7:0)
Unidad
aritmtica
cin(O:O)---~
sel(3)
sei(3:0) _ _ _..__ _ _,.__ _ _ _ _ ____J
Unidad
Unidad Aritmtica
U ni dad Lgica
318
sel
Operacin
Descripcin
0000
ooo 1
oo1 o
oo1 1
o 1 oo
o1 o1
o1 1 o
o1 1 1
1 ooo
1 oo1
1 o1 o
1 o1 1
1 1 oo
1 1 o1
111o
1111
a
a+ 1
a- 1
b
a+b
a+b+cin
Deja pasar a
Incrementa a
Decrementa a
Deja pasar b
Incrementa b
Decrementa b
Suma a y b
Suma a, b y cin
nota
not b
a and b
a or b
a nand b
a nor b
a xor b
a xnor b
Complemento de a
Complemento de b
AND lgico
OR lgico
NAND lgico
NOR lgico
XOR lgico
XNOR lgico
b+1
b-1
Ejercicio 4.11
Escriba en VHDL la entity y la architecture que describe el comportamiento
de una puerta NOT de 1 entrada. A continuacin, escriba en VHDL la entity y la
architecture que describe el comportamiento de una puerta AND de 4 entradas.
Finalmente, escriba en VHDL la entity y la architecture que describe la
estructura al nivel de puertas lgicas de un circuito combinacional decodificador
3 a 8, con entrada enable. La architecture debe describir la estructura del circuito
combinacional, instanciando y conectando adecuadamente las puertas lgicas NOT
y AND cuyo diseo ha realizado anteriormente.
Programe en VHDL el banco de pruebas del circuito decodificador que ha diseado. Explique detalladamente cmo el programa de test comprueba exhaustivamente
el valor del UUT para todos los posibles valores de la entrada. El banco de pruebas
debe comprobar que los valores obtenidos del UUT coinciden con los esperados,
mostrando el correspondiente mensaje en caso de que no coincidan. Al final del test,
debe mostrarse un mensaje indicando el nmero total de errores.
Ejercicio 4.12
A continuacin de muestra la tabla de la verdad de un circuito conversor de
cdigo binario de 3 bits a cdigo Gray. Debajo se ha escrito la entity del circuito.
X
000
001
010
011
100
101
110
111
000
001
011
010
110
111
101
100
entity codGray is
port ( y : out std_logic_vector(2 downto O);
x : in std_logic_vector(2 downto O) );
end entity codGray;
319
out std_logic;
in std_logic );
320
4.10.
321
entity bp_codificador_4_2 is
constant MAX_COMB : integer := 16;
-- Num. combinaciones entrada
constant DELAY
: time
.- 10 ns; -- Retardo usado en el test
end entity bp_codificador_4_2;
architecture bp_codificador_4_2 of bp_codificador_4_2 is
-- Salidas UUT
: std_logic;
signal valida
signal codificada
: std_logic_vector ( 1 downto O);
-- Entradas UUT
signal i3, i2, i1, iO : std_logic;
component codificador_ 4_2_prioridad is
port ( valida
: out std_logic;
codificada
: out std_logic_vector(1 downto O);
i3, i2, i1, iO : in std_logic );
end component codificador_ 4_2_prioridad;
begin -- Cuerpo de la arquitectura
UUT : component codificador_4_2_prioridad port map
(valida, codificada, i3, i2, i1, iO);
main : process is
variable temp : unsigned (3 downto O); -- Usado en los clculos
variable esperado_ valida
: std_logic;
variable esperado_codificada : std_logic_vector(1 downto O);
variable error _count
: integer
:= O;
begin
report "Comienza la simulacin";
-- GeneraT todos los posibles valoTes de entrada
for i in O to (MAX_COMB-1) loop
temp := TO_UNSIGNED(i,4);
i3 <= std_logic(temp(3));
i2 <= std_logic(temp(2));
i1 <= std_logic(temp(1));
iO <= std_logic(temp(O) );
-- Calcular el valor esperado
if (i=O) then
esperado_valida
.- '0';
esperado_codificada := "00";
else
esperado_ valida
.- '1';
if
(i=1) then esperado_codificada := "00";
elsif (i<=3) then esperado_codificada := "01";
elsif (i<=7) then esperado_codificada := "10";
else
esperado_ codificada := "11";
end if;
end if;
Cdigo VHDL 4.24: Parte inicial del banco de pruebas de un codificador 4:2 con prioridad.
322
11
&
&
&
&
&
&
&
-- Final de la simulacin
Cdigo VHDL 4.25: Parte final del banco de pruebas de un codificador 4:2 con prioridad.
323
(not x3
x1
xO
x3
x2
o
o
o
o
o
o
o
o
o o o
o o 1
o 1 o
o 1 1
1 o o
1 o 1
1 o
1
1
= X<5
1
1
1
1
1
o
o
o
o
and not x2) or (not x3 and x2 and not x1 and not xO)
-- Comparador F = X< 5:
F = x3'x2'+x3'x2x1 'xO'
-- Fichero: comparaXmenor5.vhd
Cdigo VHDL 4.26: Diseo del circuito comparador de 4 bit para X<5.
324
11
Cdigo VHDL 4.27: Banco de pruebas del circuito comparador de 4 bit para X<5.
325
entity BCDto7seg is
port( a, b, e, d, e, f, g : out std_logic;
i3, i2, i1, iO
: in std_logic);
end BCDto7seg;
architecture BCDto7segCASE of BCDto7seg is
begin
process {i3, i2, i1, iO)
variable bed : std_logic_vector ( 3 downto O);
variable segs : std_logic_vector ( 6 downto O);
begin
bed := i3 & i2 & i1 & iO;
case bed is
when "0000" => segs .- "1111110";
when "0001" => segs .- "0110000";
when "0010" => segs .- "1101101";
when "0011" => segs .- "1111001";
when "0100" => segs .- "0110011";
when "0101" => segs .- "1011011";
when "0110" => segs .- "1011111";
when "0111" => segs .- "1110000";
when "1000" => segs := "1111111";
when "1001" => segs := "1110011";
when others => segs := "0000000";
end case;
a
e
<=
<=
segs(6);
segs(2);
b
f
<=
<=
segs(5);
segs(1);
e
g
<=
<=
segs(4);
segs(O);
<=
segs(3);
end process;
end architecture BCDto7segCASE;
Cdigo VHDL 4.28: Decodificador BCD a 7 segmentos descrito empleando una sentencia case.
326
entity bp_bcdTo7Seg is
constant DELAY
: time
end entity bp_bcdTo7Seg;
: out
: in
std_logic;
std_logic);
begin
UUT : component bcdTo7Seg port map
(segs(6), segs(5), segs(4), segs(3), segs(2),
segs(1), segs(O), bcd(3), bcd(2), bcd(1), bcd(O));
ve e_ test : process is
variable valor : unsigned (3 downto O);
begin
report "Comienza la simulacin";
-- Gen erar todos los posibles valores de entrada
for i in O to 9 loop
valor := TO_UNSIGNED(i,4);
bcd <= std_logic(valor(3)) & std_logic(valor(2))
& std_logic(valor(1)) & std_logic(valor(O));
wait for DELAY;
end loop;
327
entity BCDto7seg is
port( a, b, e, d, e, f, g : out std_logic;
i3, i2, i1, iO
: in std_logic);
end BCDto7seg;
architecture BCDto7segiF of BCDto7seg is
begin
process (i3, i2, i1, iO)
variable bed : std_logic_vector ( 3 downto O);
variable segs : std_logic_vector ( 6 downto O);
begin
bed := i3 & i2 & i1 & iO;
if (bed = "0000") then segs := "1111110";
elsif (bed = "0001") then segs := "0110000";
elsif (bed = "0010") then segs := "1101101";
elsif (bed = "0011") then segs := "1111001";
elsif (bed = "0100") then segs := "0110011";
elsif (bed = "0101") then segs := "1011011";
elsif (bed = "0110") then segs := "1011111";
elsif (bed = "0111") then segs := "1110000";
elsif (bed = "1000") then segs := "1111111";
elsif (bed = "1001") then segs := "1110011";
else segs := "0000000";
end if;
a
b
e
d
e
f
<=
<=
<=
<=
<=
<=
<=
segs(6);
segs(5);
segs(4);
segs(3);
segs(2);
segs(1);
segs(O);
end process;
end architecture BCDto7segiF;
Cdigo VHDL 4.30: Decodificador BCD descrito empleando una sentencia if.
328
entity BCDto7seg is
port( a, b, e, d, e, f, g : out std_logic;
i3, i2, i1, iO
: in std_logic);
end BCDto7seg;
architecture BCDto7segCone of BCDto7seg is
signal bed : std_logic_vector ( 3 downto O);
signal segs : std_logic_vector ( 6 downto O);
begin
bed <= i3 & i2 & i1 & iO;
segs <= 11 1111110 11 when (bed = 11 0000 11 )
else 11 0110000 11 when (bed = 11 0001 11 )
else 11 1101101 11 when (bed = 11 0010 11 )
else 11 1111001 11 when (bed = 11 0011 11 )
else 11 0110011 11 when (bed = 11 0100 11 )
else 11 1011011 11 when (bed = 11 0101 11 )
else 11 1011111 11 when (bed = 11 0110 11 )
11
else 11 1110000 11 when (bed
0111 11 )
11
else 11 1111111 11 when (bed
1000 11 )
11
11
11
else 1110011 when (bed
1001 11 )
else 11 0000000 11 ;
a
b
e
d
e
<=
<=
<=
<=
<=
<=
<=
segs(6);
segs(5);
segs(4);
segs(3);
segs(2);
f
segs(1);
g
segs(O);
end architecture BCDto7segCone;
Cdigo VHDL 4.31: Decodificador BCD descrito empleando una sentencia de asignacin
concurrente condicional.
329
Cdigo VHDL 4.32: Decodificador BCD descrito empleando una sentencia with select.
330
Solucin al Ejercicio 4. 7
El diseo del sumador y su banco de pruebas se muestran en el Cdigo VHDL 4.33,
4.34 y 4.35.
Obsrvese que en la architecture del sumador hay una sentencia generate
iterativa que tiene la etiqueta conexion. El cuerpo del bucle generate incluye la
sentencia que instancia y conecta los sumadores completos de 1 bit. Esta sentencia
se ejecuta N veces, desde que el ndice del bucle, k, toma el valor N-1 hasta que toma
el valor O.
( s
C_out
x, y
C_in
331
entity bp_sum_Nbi ts is
end entity bp_sum_Nbi ts;
4 bits
Cdigo VHDL 4.34: Parte inicial del banco de pruebas del sumador de 4 bits.
332
4 bits
-- Comprueba resultado
Cdigo VHDL 4.35: Parte final del banco de pruebas del sumador de 4 bits.
333
-- Desplazador de 4 bits
-- Fichero: desplazador. vhd
library IEEE;
use IEEE . std_logic_1164. all;
entity desplazador is
port( salida : out std_logic_vector(3 downto O);
op
: in std_logic_vector(1 downto O);
entrada : in std_logic_vector(3 downto o));
end desplazador;
architecture desplazador of desplazador is
begin
salida
<=
334
"00")
= "01")
= "10")
entity bp_desplazador is
constant DELA Y
: time
end entity bp_desplazador;
Cdigo VHDL 4.37: Primera parte del banco de pruebas del circuito desplazador.
335
begin
UUT : component desplazador port map
vec_test : process is
variable temp
: std_logic_vector (5 downto O);
variable error_count: integer := O;
begin
report 11 Comienza la simulacin";
-- Generar todos los posibles valores de entrada
for i in O to 2**6-1 loop
temp := std_logic_vector(to_unsigned(i,6));
op <= temp(5 downto 4);
entrada <= temp(3 downto O);
wait for DELAY;
checlLdesp ( to_integer ( unsigned ( op)), unsigned (entrada), unsigned (salida) , error_count);
end loop;
-- Informe mostrando el resultado del test
if ( error_count=O) then
report 11 Finaliza la simulacin: O errores 11 ;
el se
report "Finaliza la simulacin: 11 & integer'image(error_count) &
end if;
11
errores";
Cdigo VHDL 4.38: Segunda parte del banco de pruebas del circuito desplazador.
336
Cdigo VHDL 4.39: Diseo del circuito comparador de igualdad de dos nmeros de 1 bit y del
circuito comparador de igualdad de dos nmeros de N bits.
337
entity bp_comparadorEQNbi ts is
end entity bp_comparadorEQNbi ts;
architecture bp_comparadorEQNbi ts of bp_comparadorEQNbi ts is
signa} s
: std_logic; -- Conectar salidas UUT
signa} x, y : std_logic_vector(3 downto O); -- Conectar entradas UUT
component comparadorEQNbi ts is
generic ( N: integer : =4);
port
( s
: out std_logic;
x, y : in std_logic_vector(N-1 downto O));
end component comparadorEQNbi ts;
begin
-- Instanciar y conectar UUT
uut : component comparadorEQNbi ts port map
( S => s, X => x, y => y );
gen_ ve e_ test : process
variable num_errores : integer := O;
-- Numero de errores
begin
for op_X in O to 2**4-1 loop
for op_Y in O to 2**4-1 loop
x
<= std_logic_vector(to_unsigned( op_x,4) );
y
<= std_logic_vector(to_unsigned( op_y,4) );
wait for 10 ns;
-- Comprueba resultado
if (x=y and s='O') or (x/=y and s='1') then
report 11 Error. Valores 11 &
integer'image(op_x) &
.. ,
11
&
+ 1;
11
Cdigo VHDL 4.40: Banco de pruebas del circuito comparador de igualdad de 4 bits.
338
- Se escogen valores de los operandos en el lmite inferior de su rango. Por ejemplo, si MIN_NEG_DATA representa el valor mnimo que puede tomar el operando,
entonces se escogen los valores MIN_NEG_DATA, ... , MIN_NEG_DATA+4 para cada
uno de los operandos.
- Se escogen valores de los operandos en el lmite supenor de su rango. Si
MAX_POS_DATA representa el valor mximo que puede tomar el operando, entonces se escogen los valores MAX_POS_DATA-4, ... , MAX_POS_DATA para cada uno
de los operandos.
- Finalmente, se escogen algunos valores "al azar", ms o menos distribuidos
uniformemente en el rango de los operandos.
339
Cdigo VHDL 4.41: Diseo de la ALU cuyo circuito se muestra en la Figura 4.12.
340
package bp_ALU_CONSTANTS is
constant SEL_MAX
: integer
constant MAX_POS_DATA : integer
constant MIN_NEG_DATA : integer
constant DELA Y
: time
end package bp_ALU_CONSTANTS;
:= 2**SEL_BITS - 1;
:= 2**(WIDTH-1) - 1;
:= -2**(WIDTH-1);
: = 1O ns;
entity bp_ALU is
end entity bp_ALU;
architecture bp_ALU of bp_ALU is
signal a, b, y : std_logic_vector (WIDTH-1 downto O);
signal e in
: std_logic_vector (O downto O);
signal sel
: std_logic_vector (SEL_BITS-1 downto O);
component ALU is
port ( y
: out std_logic_vector(WIDTH-1 downto O);
a, b : in std_logic_vector (WIDTH-1 downto O);
e in : in std_logic_vector (O downto O);
sel : in std_logic_vector (SEL_BITS-1 downto O) );
end component ALU;
Cdigo VHDL 4.42: Package en el cual se definen las constantes usadas en el banco de pruebas
de la ALU cuyo circuito se muestra en la Figura 4.12 y comienzo de la definicin del banco de
pruebas de la ALU.
341
---------------- Continua banco de pruebas para la AL U {fichero bp_AL U. vhd) -------------- Procedure que calcula C ( expectecL C) y lo compara con el
-- valor de C que se pasa como argumento (actuaL C)
-- Si ambos valores no coinciden, se muestra 'Un mensaje y se
-- incrementa el contador de errores (error_count)
procedure check_ALU
( a, b, cin, sel : in integer;
actual_y
: in std_logic_vector (WIDTH-1 downto O);
error _count : inout integer ) is
variable expected_y : integer;
begin
case sel is
when O
=> expected_y := a;
when 1
=> expected_y := a+1;
when 2
=> expected_y := a-1;
=> expected_y := b;
when 3
when 4
=> expected_y := b+1;
=> expected_y := b-1;
when 5
when 6
=> expected_y := a+b;
when 7
=> expected_y := a+b+cin;
=> expected_y := TO_INTEGER(signed(
when 8
not std_logic_vector(TO_SIGNED(a,WIDTH)) ));
=> expected_y := TO_INTEGER(signed(
when 9
not std_logic_vector(TO_SIGNED(b, WIDTH)) ) ) ;
=> expected_y := TO_INTEGER(signed(
when 10
std_logic_vector (TO _SI GNED (a, WIDTH)) and
std_logic_vector(TO_SIGNED(b,WIDTH))
));
=> expected_y := TO_INTEGER(signed(
when 11
std_logic_vector(TO_SIGNED( a,WIDTH)) or
std_logic_vector(TO_SIGNED(b,WIDTH))
) );
=> expected_y := TO_INTEGER(signed(
when 12
std_logic_vector(TO_SIGNED( a,WIDTH)) nand
std_logic_vector(TO_SIGNED(b,WIDTH))
));
=> expected_y := TO_INTEGER(signed(
when 13
std_logic_vector(TO_SIGNED( a,WIDTH)) nor
std_logic_vector(TO_SIGNED(b,WIDTH))
) );
=> expected_y := TO_INTEGER(signed(
when 14
std_logic_vector(TO_SIGNED( a,WIDTH)) xor
std_logic_vector(TO_SIGNED(b,WIDTH))
) );
when others => expected_y := TO_INTEGER(signed(
std_logic_vector(TO_SIGNED( a,WIDTH)) xnor
std_logic_vector(TO_SIGNED(b,WIDTH))
));
end case;
Cdigo VHDL 4.43: Fragmento del banco de pruebas de la ALU cuyo circuito se muestra en la
Figura 4.12: primera parte de la definicin del procedure check_ALU.
342
Cdigo VHDL 4.44: Fragmento de la definicin del banco de pruebas de la ALU cuyo circuito
se muestra en la Figura 4.12.
343
---------------- Continua banco de pTuebas paTa la AL U (ficheTo bp_AL U. vhd) -------------- VectoTes de test: opeTandos con valoT pTximo al mximo
for i in MAX_POS_DATA-4 to MAX_POS_DATA loop
for j in MAX_POS_DATA-4 to MAX_POS_DATA loop
for k in O to SEL_MAX loop
for 1 in O to 1 loop
a
<= std_logic_vector(TO_SIGNED(i,WIDTH));
<= std_logic_vector(TO_SIGNED(j ,WIDTH) );
b
sel <= std_logic_vector(TO_SIGNED(k,SEL_BITS) );
cin <= std_logic_vector(TO_SIGNED(l,1));
wait for DELAY;
check_ALU(i, j, 1, k, y, error_count);
end loop;
end loop;
end loop;
end loop;
-- VectoTes de test: opeTandos con valoTes "al azar
for i in O to 9 loop
for j in O to 9 loop
for k in O to SEL_MAX loop
for 1 in O to 1 loop
A
<= std_logic_vector(TO_SIGNED( 41 *i-273,WIDTH));
<= std_logic_vector(TO_SIGNED(89*j-384,WIDTH));
b
sel <= std_logic_vector(TO_SIGNED(k,SEL_BITS));
cin <= std_logic_vector(TO_SIGNED(l,1) );
wait for DELAY;
check_ALU(41 *i-273, 89*j-384, 1, k, y, error_count);
end loop;
end loop;
end loop;
end loop;
Cdigo VHDL 4.45: Parte final de la definicin del banco de pruebas de la ALU cuyo circuito
se muestra en la Figura 4.12.
344
-- NOT de 1 entrada
library IEEE; use IEEE. std_logic_1164. all;
entity not 1 is
port ( y
: out std_logic;
x
: in std_logic ) ;
end entity not 1;
architecture not 1 of not 1 is
begin
y <= not x;
end architecture not1;
--AND de 4 entradas
library IEEE; use IEEE.std_logic_1164.all;
entity and4 is
port ( y
xO, x1, x2, x3
end entity and4;
: out std_logic;
: in std_logic ) ;
Cdigo VHDL 4.46: Diseo de una puerta NOT de 1 entrada y de una puerta AND de 4
entradas.
345
Nombrando las entradas y salidas del circuito tal como se muestra en la Figura 4.13a, la tabla de la verdad del circuito decodificador es la mostrada en la
Figura 4.13b.
Al
Ao
y7
y6
Ys
y4
y3
y2
yl
Yo
o
o
o
o
1
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
1
1
E
a)
b)
346
11
111 ! 1
!1
: 111 1 1 1
i:
.~
.. . . .. . .. .
. . . . . .. . . .. . .
. . .
.. . . .. . . . ... .. .. . . . . . . .. . . . . .. . .
. . .. . . . .. . .. . .
. .. . . . .. . ...
.
. .~w
........
......
.. .
. . . . . . . .. .
. . .
. ..
.. . . . . . ..
. .. . .
i ': ~J . :
"!
..........
: A.2::
:::: :1;
. ... . ll<itj\1'
:::: :: : A.a:
: : : ::
: :::::
: :::
: : :::
: :::
. 1:: : 1:: : : ::: : :: 1: 1:: :: :::::
:::
:::::
::: ::r
:::::: ::r
: ::::
: :
: :::
:::::
: ::: ::::
r 11
. . .
'
:E :: : :: :: : : no(AO
'
1: 1: 1. .. .. .. : 1: 1:;: : : : : : : : : : : : 1: 1: 1: :
'
: 1:1:1 : .. ....
.. .
.. . . 1 1.1 .
__....
. . . . ... . . . . .
11
U1
. . . .. . .. . .. . . . .. . . .. . . . . . . .. . .
t::rJ
tj
t::rJ
t"'
o,
0
Q
;:;..
tJ:j
Figura 4.14: Diagrama estructural al nivel de puertas lgicas del circuito decodificador 3 a 8.
e,..;
~
-..;
z
;:;..
oz
;:;..
t"'
-- Decodificador 3 a 8 bits
library IEEE;
use IEEE.std_logic_1164.all;
entity decodificador_3_a_8 is port
( Y7, Y6, Y5, Y4, Y3, Y2, Y1, YO : out std_logic;
E, AO, A1, A2
: in std_logic);
end entity decodificador_3_a_8;
architecture decodificador_3_a_8 of decodificador_3_a_8 is
signal not_A2, not_A1, not_AO : std_logic;
-- Declaracin de las clases de los componentes
component not 1 is port
( y
: out std_logic;
x
: in std_logic ) ;
end component not 1;
component and4 is port
( y
: out std_logic;
xO, x1, x2, x3 : in std_logic );
end component and4;
begin
-- Instanciacin y conexin de los componentes
NOT_O : component not1 port map (not_AO, AO);
NOT_1 : component not1 port map (not_A1, A1);
NOT_2 : component not1 port map (not_A2, A2);
AND_7 : component and4 port map (Y7, E, A2, A1, AO);
AND_6 : component and4 port map (Y6, E, A2, A1, not_AO);
AND_5 : component and4 port map (Y5, E, A2, not_A1, AO);
AND_4 : component and4 port map (Y4, E, A2, not_A1, not_AO);
AND_3 : component and4 port map (Y3, E, not_A2, A1, AO);
AND_2 : component and4 port map (Y2, E, not_A2, A1, not_AO);
AND_1 : component and4 port map (Y1, E, not_A2, not_A1, AO);
AND_O : component and4 port map (YO, E, not_A2, not_A1, not_AO);
end architecture decodificador_3_a_8;
-- Banco de pruebas
-- decodificador_3_a_8
library IEEE;
use IEEE. std_logic_1164. all;
use IEEE. numeric_std. all;
entity bp_decodificador_3_a_8 is
end entity bp_decodificador_3_a_8;
architecture bp_decodificador_3_a_8 of bp_decodificador_3_a_8 is
signal Y
: std_logic_vector( 7 downto O); -- Conectar salidas UUT
signal E, AO, A1, A2 : std_logic; -- Conectar entradas UUT
component decodificador_3_a_8 is
port ( Y7 , Y6, Y5, Y4, Y3, Y2, Y1, YO : out std_logic;
E, AO, A1, A2
: in std_logic);
end component decodificador _3_a_8;
begin
Cdigo VHDL 4.48: Fragmento inicial del banco de pruebas del decodificador 3 a 8.
348
Cdigo VHDL 4.49: Fragmento final del banco de pruebas del decodificador 3 a 8.
349
architecture arch_codGrayCase
begin
process ( x) is
begin
case x is
when ("000") = >
when ("001") = >
when ("010") = >
when ("011") = >
when ("100") = >
when ("101") = >
when ("110") = >
when ("111") = >
when others = >
end case;
end process;
of codGray is
y < = "000";
y<="001";
y < ="011";
y < ="010";
y<="110";
y < ="111";
y < ="101";
y < ="100";
y < ="OOO";
Cdigo VHDL 4.50: Diseo del conversor de cdigo binario a cdigo Gray, empleando un bloque
process con una sentencia case.
350
Cdigo VHDL 4.51: Diseo del conversor de cdigo binario a cdigo Gray, empleando una
asignacin concurrente de seleccin (with - select).
<=
x(2);
=>
x(1) );
=>
x(O) );
Cdigo VHDL 4.52: Diseo del conversor de cdigo binario a cdigo Gray, describiendo la
estructura del circuito al nivel de puertas lgicas.
351
entity bp_codGray is
constant DELA Y
: time
end entity bp_codGray;
Cdigo VHDL 4.53: Banco de pruebas del conversor de cdigo binario a cdigo Gray.
352
TEMA 5
REGISTROS Y MEMORIAS
5.1. Introduccin
5.2. Registro de 4 bits
5.3. Registro multifuncin
5.4. Registro de desplazamiento
5.5. Register file
5.6. Bus bidireccional y memorias
5.7. Lecturas recomendadas
5.8. Ejercicios de autocomprobacin
5.9. Soluciones de los ejercicios
REGISTROS Y MEMORIAS
OBJETIVOS DOCENTES
Una vez estudiado el contenido del tema y realizados los ejercicios prcticos,
debera saber:
- Discutir la diferencia conceptual entre la operacin de reset sncrono y asncrono. Describir ambas usando VHDL.
- Disear usando VHDL registros con las funcionalidades siguientes: reset, carga
serie y paralelo, lectura serie y paralelo, y desplazamiento de 1 bit hacia la
derecha e izquierda. Programar usando VHDL bancos de pruebas para los
registros que testeen las funcionalidades anteriores.
- Discutir las caractersticas de los registros siguientes: registro de desplazamiento, registro multifuncin, register file y registro triestado.
- Realizar el diseo comportamental y estructural usando VHDL de un register
file.
- Programar bancos de pruebas que lean los vectores de test de fichero.
- Disear usando VHDL el acceso al bus de varios componentes mediante buffers
triestado.
- Disear en VHDL memorias RAM y ROM, y buses bidireccionales.
355
REGISTROS Y MEMORIAS
5.1.
INTRODUCCIN
5.2.
REGISTRO DE 4 BITS
357
5.2.1.
entity Reg4 is
port ( Q
: out std_logic_vector(3 downto O);
I
: in std_logic_vector ( 3 downto O);
clk, rst : in std_logic );
end entity Reg4;
architecture Reg4 of Reg4 is
begin
process ( clk)
begin
if rising_edge( clk) then
if(rst = '1') then
Q <= "0000";
else
Q <= I;
end if;
end if;
end process;
end architecture Reg4;
5.2.2.
11
Banco de pruebas
11
358
11
11
11
11
REGISTROS Y MEMORIAS
entity bp_Reg4 is
end entity bp_Reg4;
architecture bp_Reg4 of bp_Reg4 is
constant PERIODO
: time
:= 10 ns; -- Periodo reloj
signal
Q
: std_logic_vector(3 downto O);
-- Salidas UUT
signal
clk : std_logic := 'O';
-- Entradas UUT
signal
I
: std_logic_vector(3 downto O);
signal
rst : std_logic;
component Reg4 is
port ( Q
: out std_logic_vector(3 downto O);
I
: in std_logic_vector(3 downto O);
clk, rst : in std_logic );
end component Reg4;
begin
uut : component Reg4 port map (Q, I, clk, rst);
clk
<= not
begin
report "Comienza la simulacin";
<=
<=
"1111";
-- Reset
'1';
wait until rising_edge( clk);
wait for (PERIOD0/2);
I
rst
<=
<=
"1111";
-- Carga 1111
'0';
wait until rising_edge( clk);
wait for (PERIOD0/2);
I
rst
<=
<=
"1010";
--Carga 1010
'0';
wait until rising_edge( clk);
wait for (PERIOD0/2);
I
rst
<=
<=
"0000";
-- Carga 0000
'0';
wait until rising_edge( clk);
wait for (PERIOD0/2);
I
rst
Cdigo VHDL 5.2: Banco de pruebas de un registro de 4 bits con reset sncrono.
359
Tras aplicar cada uno de estos vectores de test, se ejecutan las dos sentencias
wait siguientes:
wait until rising_edge(clk);
wait for (PERIOD0/2);
espera hasta que la condicin cambie de valer false a valer true. Si la condicin
inicialmente vale true, entonces la sentencia wait espera hasta que la condicin se
haga false y posteriormente vuelva a valer true.
El resultado del programa de test es inspeccionado visualmente, con el fin de
comprobar si el registro ha sido diseado correctamente. En la Figura 5.2 se muestra
el resultado obtenido al simular el banco de pruebas durante 50 ns. Se comprueba
que el funcionamiento del registro es el esperado .
.
Messages
+
+
8 +
+
8
0000
/bp_reg4/i
0000
1111
/bp _reg4/rst
Now
to 43 ns
~1111
50 ns
..L~
!il
~000
uuuu
/bp_reg4/q
/bp_reg4/clk
>'QO
1 O ns
~ ~
:.........
~000
~1010
L_
~000
~1010
1
!h
10 ns
lS
20 ns
30 ns
40 ns
1
1 Now:
50 ns Delta: 1
5.3.
REGISTRO MULTIFUNCIN
360
REGISTROS Y MEMORIAS
Q3 Q2 Q Qo
rst
Ld
Shr
Shl
o
o
o
o
o
o
o
o
o
Operacin
Mantiene valor
Desplaz. Izq.
Desplaz. Drcha.
Carga paralelo
Reset (carga "0000")
5.3.1.
es equivalente a escribir:
R(O) <= R(1);
R(1) <= R(2);
R(2) <= R(3);
361
<=
"0000";
362
REGISTROS Y MEMORIAS
Dado que en el puerto de salida del registro Q debe obtenerse en todo momento
el valor almacenado, R, es necesario copiar en todo momento el valor de la seal R
en la seal Q. Para ello, en el diseo se ha incluido la sentencia de asignacin:
Q <= R;
que se ejecuta cada vez que cambia el valor de R, asignando transcurrido un tiempo
infinitesimal oeste nuevo valor a la seal Q.
Obsrvese que esta sentencia no ha sido incluida dentro de ningn bloque process. Recurdese que este tipo de sentencias de asignacin a seal, que se encuentran
en la architecture fuera de los bloques process, se denominan sentencias concurrentes de asignacin a seal.
Puede considerarse que una sentencia concurrente de asignacin a seal constituye por s misma un bloque process, que se ejecuta concurrentemente con el resto
de bloques process. Por ejemplo, la sentencia de asignacin concurrente
Q <= R;
es equivalente al bloque process siguiente:
process (R)
begin
Q <= R;
end process;
Cada vez que cambia el valor de la seal R, se ejecuta el bloque process, con lo
cual el valor de Q es actualizado al nuevo valor de R transcurrido un tiempo o(delta).
Una forma incorrecta de describir Q hubiera sido incluir la sentencia Q <= R;
dentro del bloque process, justo antes del segundo end if. Es decir:
process (clk)
-- No describe el comportamiento del registro
begin
if rising_edge(clk) then
if
(rst = '1') then
R <= ...
elsif (Ld = '1') then
R <= ...
elsif (Shr = '1') then
R <= ...
elsif (Shl = '1') then
R <=
end if;
Q <= R;
Mal ! !
end if;
end process;
363
Este cdigo no reproduce adecuadamente el comportamiento del registro. Recurdese el funcionamiento de las asignaciones a seal dentro de un bloque process:
el nuevo valor de las seales se evala a partir del valor actual de las mismas y el
nuevo valor no se asigna hasta transcurrido un tiempo 5.
As pues, la sentencia aadida al bloque process asignara a la variable Q el
valor "antiguo" de R y no el nuevo valor que se ha asignado a R en el cuerpo de la
sentencia if-elsif-end if. El valor "antiguo" de R es el valor asignado a dicha seal
en la evaluacin anterior del bloque process. Es decir, el valor de la seal R en la
transicin anterior de la seal de reloj. En consecuencia, la seal Q ira retrasada
respecto a la seal R.
5.3.2.
Banco de pruebas
El Cdigo VHDL 5.4- 5.6 es un banco de pruebas parcial para el registro multifuncin, que prueba nicamente un grupo muy reducido de vectores de test. El banco
de pruebas correctamente diseado debera comprobar el circuito de manera ms
exhaustiva, testeando, por ejemplo, todas las posibles combinaciones de las entradas
de control.
En la Figura 5.4 se muestra el resultado obtenido de simular el banco de pruebas
del registro multifuncin durante 120 ns.
Messages
.~1iii}@
w
1 Ons
to 123 ns
o
1111
1
1
1
1
1
1
Now
U111
l!O!O
1.0101
1.0011
U001
1.0100
1
1111
l!010
1.0101
1.0011
U111
lr---J
lr---J
1.0000
1.0001
1.0010
U111
L___j
L____j
1
J
1
11111111
15
.,,,,,,,,,,,,
20 ns
1111111111111111 , , , , , , , , , , d t l l l l l l l l l l l l l l l l l ,,,,1111111111111111
40 ns
60 ns
80 ns
11111111 , , , , , , , , , , , , , , , , , , , , , , , , 1
100 ns
L!:Jik l
1 Now:
120ns Delta: 1
364
1.0000
roooo
r---L____J
120 ns
i.J ~
u.. . mooo
0000
[) + fbp_reg4mf/q
+ fbp_reg4mf/clk
GJ + fbp_reg4mf/i
+ fbp_reg4mf/rst
+fbp_reg4mf/shr_in
+fbp_reg4mf/shl_in
+ fbp_reg4mf/ld
+fbp_reg4mf/shr
+ fbp_reg4mf/shl
120 ns
1 /
REGISTROS Y MEMORIAS
365
-- Carga 0101
I
<= "010!1'; Shr_In <= '1'; Shl_In <= '1';
rst <= '0'; Ld <= '1'; Shr <= '1'; Shl <= '1';
wait until rising_edge( clk);
wait for (PERIOD0/2);
numTest := numTest
1;
assert ( Q = "0101" )
report "Error vector 11 & integer' image(numTest);
-- Carga 0011
I
<= "0011"; Shr_In <= '1'; Shl_In <= '1';
rst <= '0'; Ld <= '1'; Shr <= '1'; Shl <= '1';
wait until rising_edge( clk);
wait for (PERIOD0/2);
numTest := numTest
1;
assert ( Q = "0011" )
report "Error vector 11 & integer' image(numTest);
Cdigo VHDL 5.5: Continuacin del banco de pruebas de un registro multifuncin de 4 bits.
366
REGISTROS Y MEMORIAS
-- Carga 0000
I
<= 11 0000 11 ; Shr_In <= '1'; Shl_In <= '1';
rst <= '0'; Ld <= '1'; Shr <= '1'; Shl <= '1';
wait until rising_edge( clk);
wait for (PERIOD0/2);
numTest := numTest
1;
assert ( Q = 11 0000 11 )
report 11 Error vector 11 & integer' image(numTest);
Cdigo VHDL 5.6: Parte final del banco de pruebas de un registro multifuncin de 4 bits.
367
5.4.
REGISTRO DE DESPLAZAMIENTO
El registro multifuncin mostrado en la Figura 5.3 incluye, entre otras, las operaciones de desplazamiento hacia la izquierda y la derecha. En aquellos casos en que
slo se requiera la operacin de desplazamiento y la entrada serie de bits, puede
emplearse un circuito ms sencillo, tal como el registro de desplazamiento mostrado
en la Figura 5.5.
Ql Qo
rst
Shr
o
o
Operacin
Mantiene valor
Desplaz. Drcha.
Reset (carga X"OOOOOOOO")
5.4.1.
368
REGISTROS Y MEMORIAS
5.4.2.
Banco de pruebas
El Cdigo VHDL 5.8 muestra un banco de pruebas que aplica algunos vectores
de test al registro de desplazamiento. En primer lugar, el programa de test resetea
el circuito. A continuacin, pone las seales Shr y Shr_in al valor '1' y espera
durante 16 ciclos de reloj. Con ello, se realizan 16 desplazamientos hacia la derecha,
introducindose 16 bits '1' por la parte izquierda del registro. El valor almacenado
resultante es X"FFFFOOOO". A continuacin, el programa de test pone la seal Shr_in
al valor 'O' y espera durante otros 16 ciclos de reloj. El valor almacenado resultante
es X"OOOOFFFF". Finalmente, el programa de test pone la seal Shr al valor 'O' y
finaliza el bloque process en el que se aplican los vectores de test.
En la Figura 5.6 se muestran algunos fragmentos del resultado obtenido al simular
el banco de pruebas durante 350 ns.
369
entity bp_RegDesp32 is
end entity bp_RegDesp32;
architecture bp_RegDesp32 of bp_RegDesp32 is
constant PERIODO
: time
: = 1O ns;
signal
Q
: std_logic_vector(31 downto O);
signal
clk
: std_logic := 'O';
signal
Shr
: std_logic;
signal
Shr in : std_logic;
signal
rst
: std_logic;
component RegDesp32 is
port ( Q
: out std_logic_vector(31 downto O);
Shr, Shr _in : in std_logic;
clk, rst
: in std_logic ) ;
end component RegDesp32;
begin
uut : component RegDesp32 port map
370
REGISTROS Y MEMORIAS
---
Messages
(] +
+
+
+
+
/bpJegdesp32/q
lbpJegdesp32/clk
/bpJegdesp32/shr
/bpJegdesp32/shr _in
lbpJegdesp32/rst
Ni~@
GJJ'~
-----
10000000000000000000000000000000
000000000000000000000000
1
1
1
Now
350 ns
7 ns
...!.,_ill
L_
4 ns
lS
Jil~s
16 ns
12 ns
20 ns
28 ns
.!..,!f,J...J__J
/"
Messages
a:;. /bp_regdesp32/q
11111111111
/bp_regdesp32/clk
/bpJegdesp32/shr
+
+
/bpJegdesp32/shr _in 1
o
/bp_regdesp32/rst
.W~
~.1'0
Now
350 ns
Cursor 1
167 ns
..t. ill
..:!.1
l1111111111 1111100000000000000000
_j
1
1
+
+
1 154 ns to 185 ns
.!..
156 ns
160 ns
1111111 1111111110000000000000000
ro 1111111111111111 ooooooooooooooo
~8ns
164 ns
172 ns
176 ns
180 ns
184 ns
t-~J
__j_J
,/
Messages
+
+
+
+
24 ns
1 O ns to 31 ns
; +
110000000000000000 ...
Cursor 1
..:!.1
--
0000000000
/bp_regdesp32/q
0000000000000111111111111111100
000000000000001111111111 1111110
!00000000000000001111111111111111
o
lbpJegdesp32/clk
1
lbp_regdesp32/shr
/bpJegdesp32/shr jn O
o
lbpJegdesp32/rst
a~~@
Now
350 ns
f-.1,/'0
Cursor 1
322ns
..!..ill
..:!.1
1 305 ns to 336 ns
1 1 1
308 ns
312 ns
316 ns
1
1 ~
1 1 1
320 ns ~ 324 ns
322 ns
.!.. , J
328 ns
332 ns
33E
_LJ
./
Figura 5.6: Fragmentos del resultado de la simulacin del banco de pruebas del registro de
desplazamiento de 32 bits.
5.4.3.
371
escenarios. Otra ventaja es que de esta forma pueden aadirse nuevos vectores de
test al fichero y realizar la simulacin, sin necesidad de recompilar el cdigo VHDL
del banco de pruebas.
El Cdigo VHDL 5.9 muestra un banco de pruebas en el cual se van leyendo los
bits de carga serie ( Shr_in) de un fichero. Para ello, se usa el paquete std. textio. all,
en el cual se define el tipo file y los subprogramas (procedimientos y funciones)
asociados que permiten leer de ficheros: file_open(), file_close(), endfile(), readline() y read().
Obsrvese que dentro del bloque process del Cdigo VHDL 5.9 se realiza la
declaracin siguiente:
file
fichVectores
variable inputLinea
variable inputBit
text;
line;
bit;
La primera sentencia define un fichero del tipo "fichero de texto" y cuyo identificador es fichVectores. Un "fichero de texto" es un fichero que contiene un nmero
arbitrario de caracteres ASCII y, por tanto, puede ser editado empleando cualquier
editor de texto.
Las variables inputLinea e inputBi t, de los tipos line y bit respectivamente, son empleadas en la lectura del fichero. El tipo line se define en el paquete
std. textio. all y representa una lnea que puede ser leda o escrita El tipo bit es
uno de los tipos predefinidos que fueron descritos en la Seccin 2.12. Puede tomar
nicamente los valores 'O' y '1'.
En primer lugar, el banco de pruebas abre el fichero usando una llamada al procedimiento file_open(). Este procedimiento tiene tres parmetros: el identificador
del fichero, el nombre del fichero y el modo de acceso. El modo de acceso puede
tomar tres valores: read_mode, write_mode y append_mode. La sentencia
file_open(fichVectores, "vectores.txt", read_mode);
372
REGISTROS Y MEMORIAS
11
Finaliza la simulacin 11 ;
Cdigo VHDL 5.9: Banco de pruebas del registro con acceso a fichero.
373
lee una lnea del fichero fichVectores y la almacena en la variable inputLinea. Para
leer los caracteres individuales de la lnea de entrada, es preciso usar el procedimiento read. Se usa un bucle for para acceder a los bits de inputLinea, donde
inputLinea' range especifica el nmero de caracteres de la lnea.
Dentro del bucle for, se lee cada bit de inputLinea mediante la sentencia
read(inputLinea, inputBit);
374
REGISTROS Y MEMORIAS
El fichero vectores. txt debe estar situado en el directorio espacio de trabajo del
entorno de simulacin. Si el contenido del fichero es:
1111111111111111
0000000000000000
5.5.
-REGISTER FILE
W data
R data
32
32
dl
R addr
d2
en
W enable
en
,.___--+----1 d
rst
elk
R enable
______.+----------+~
375
5.5.1.
Registro triestado
~~---------+------~
o
Figura 5.8: Registro con entrada OE output enable.
376
REGISTROS Y MEMORIAS
que asigna el valor 'O' a cada uno de los 32 bits del vector R. Esta sentencia es
equivalente a:
R <= X"OOOOOOOO";
con la diferencia de que usando others no se especifica el nmero de bits del vector,
con lo cual pueden escribirse diseos ms generales. Asimismo, others proporciona
una notacin ms compacta y legible. Por ejemplo, en el segundo bloque process
se ha escrito
Q <= "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ";
377
dado que en este caso no se hubiera podido usar la representacin hexadecimal para
reducir el tamao de la palabra. Una peculiaridad de others es que slo puede usarse
en sentencias de asignacin, no puede usarse como parte de una condicin.
5.5.2.
5.5.3.
378
REGISTROS Y MEMORIAS
: out
: in
: in
: in
: in
);
component Reg32_0E is
port ( Q
: out std_logic_vector(31 downto O);
I
: in std_logic_vector(31 downto O);
Ld, DE
: in std_logic;
clk, rst : in std_logic ) ;
end component Reg32_0E;
signal W_d3, W_d2, W_d1, W_dO : std_logic;
signal R_d3, R_d2, R_d1, R_dO : std_logic;
begin
R_Dcd
W_Dcd
RegO
Reg1
Reg2
Reg3
:
:
:
:
:
:
Dcd2x4
Dcd2x4
Reg32_0E
Reg32_0E
Reg32_0E
Reg32_0E
port
port
port
port
port
port
map
map
map
map
map
map
379
Cuando hay varios drivers para una misma seal, el simulador automticamente
llama a la funcin de resolucin asociada con el tipo de dato de la seal. En el
caso de la seal R_data, como es del tipo std_logic_vector, el simulador llama
a la funcin de resolucin de ese tipo, que se encuentra definida en el paquete
IEEE. std_logic_1164. all (vase la Tabla 3.2). Esta funcin de resolucin devuelve
'O' si uno de los drivers es 'O' y los dems 'Z'. Devuelve '1' si uno de los drivers es
'1' y los dems 'Z'. Sin embargo, si unos drivers valen 'O' y otros valen '1', entonces
la funcin de resolucin devuelve 'X', cuyo significado es "valor desconocido".
5.5.4.
El Cdigo VHDL 5.12 y 5.13 es un banco de pruebas para el register file, que lee
los vectores de test de un fichero. Cada una de las lneas de este fichero (vectores. txt)
consta de una palabra de 39 bits, cuyo significado es mostrado en la Figura 5.9. En
la Figura 5.10 se muestra parte del resultado de la simulacin.
1 bit
32 bits
2 bits
1 bit
2 bits
1 bit
+-++-------------------++----~~---+~----~---+
W data
R_en
Obsrvese que la lnea leda del fichero es asignada a la variable aux, del tipo
std_logic_vector, que es definida dentro del bloque process gen_ ve e_ test. A continuacin, descomponiendo esta palabra como se muestra en la Figura 5.9, se asigna
valor a los puertos de entrada del register file. Para ilustrar el funcionamiento del
banco de pruebas, se define un fichero de vectores de test (vectores. txt) muy sencillo,
cuyo contenido se muestra a continuacin. La interpretacin se indica en la Tabla 5.1.
111111111111111111111111111111111000000
011111111111111111111111111111111001000
010101010101010101010101010101010011000
011111111111111111111111111111111101000
001010101010101010101010101010101111000
000000000000000000000000000000000000001
000000000000000000000000000000000000011
000000000000000000000000000000000000101
000000000000000000000000000000000000111
380
REGISTROS Y MEMORIAS
entity bp_regFile4x32 is
constant PERIODO : time
end entity bp_regFile4x32;
:= 10 ns;
begin
uut : component RegFile4x32 port map
(R_data, W_data, R_addr, W_addr, R_en, W_en, clk, rst);
clk
Cdigo VHDL 5.12: Banco de pruebas del register file, con acceso a fichero.
381
-- Continuacin del banco de pruebas del register file. Fichero: bp_RegFile4x32. vhd
-- Asigna valor a W_data) W_addr) W_en) R_addr, R_en
rst
<= aux(38);
W_data <= aux(37 downto 6);
W_addr <= aux(5 downto 4);
W_en
<= aux(3);
R_addr <= aux(2 downto 1);
R_en
<= aux(O);
wait for PERIODO;
end loop;
-- bucle while
file_close(fichVectores);
wait until rising_edge( clk);
report "Finaliza la simulacin";
wait;
-- Final del bloque process
end process gen_ ve e_ test;
end architecture bp_regFile4x32;
Cdigo VHDL 5.13: Continuacin del banco de pruebas del register file.
Tabla 5.1: Interpretacin de los vectores de test.
rst
1
o
o
o
o
o
o
o
o
382
W_data
11111111111111111111111111111111
11111111111111111111111111111111
10101010101010101010101010101010
11111111111111111111111111111111
01010101010101010101010101010101
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
w_addr
00
00
01
10
11
00
00
00
00
W_en
o
1
1
1
1
o
o
o
o
ILaddr
00
00
00
00
00
00
01
10
11
!Len
o
o
o
o
o
1
1
1
1
Reset
Escribe regO
Escribe reg1
Escribe reg2
Escribe reg3
Lee regO
Lee reg1
Lee reg2
Lee reg3
REGISTROS Y
ME~ORIAS
Messages
l +/bp_regfile4x32/r_data
C!) + /bp_regfile4x32/w_data
C!) + /bp_regfile4x32/r _addr
::J + /bp_regfile4x32/w_addr
+ /bp_regfile4x32/r _en
/bp_regfile4x32/w_en
+ /bp_regfile4x32/rst
/bp_regfile4x32/clk
;:) + /bp_regfile4x32/uut/reg0/r
::J + /bp_regfile4x32/uut/reg1/r
;:) + /bp_regfile4x32/uut/reg2/r
W /bp_regfile4x32/uut/reg3/r
+
+
+
~c;l@
2!J"@
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ l;;;:=;;;;:;=:=;;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:=;;;=================t====~;,:;;:d
11111111111111111111111111111111 ~~1;;:_:11:=11=:1=:11:=11:=1:=11=:11:=11=:1=:11:=11:=1:=11=:11:=11:=1:=11=================i=====~1=01:::01:::0::j1.
00
00
O
L
11111111111111111111111111111111
00000000000000000000000000000000
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
00000000000000000000000000000000
Now
100 ns
Cursor2
17 ns
1111111111111111111111111111111
0000000000000000000000000000000
UUUUUUUUUUUUUUUUUUUU. .. OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
UUWUUUUUUUUUUUUUUUU.. . 000 OOOOOOOOOOOOOOOOOOOOOOOOOO
UUWUUUUUUUUUUUUUUUU...
4 ns
2 ns
6 ns
8 ns
10ns
12 ns
14 ns
16 ns r::'---118ns
117 nsl
20 ns
l.!,
1Onsto22ns
m
.
W+
W
W+
+
+
+
+
+
/bp_regfile4x32/r _data
/bp_regfile4x32/w_data
/bp_regfile4x32/r _addr
/bp_regfile4x32/w_addr
/bp_regfile4x32/r _en
/bp_regfile4x32/w_en
/bp_regfile4x32/rst
/bp_regfile4x32/clk
/bp_regfile4x32/uut/reg0/r
/bp_regfile4x32/uut/reg1/r
/bp_regfile4x32/uut/reg2/r
/bp_regfile4x32/uut/reg3/r
m
m
..
+
+
W
::J
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
11111111111111111111111111111111
00
10
[___
11111111111111111111111111111111
1o 101 o 10101 o 10101 o 10101 o 1o 101 o 1o
11111111111111111111111111111111
00000000000000000000000000000000
11111111111111111111111111111111
00000000000000000000000 ... 10101010101010101010101010101010
00000000000000000000000000000000
00000000000000000000000000000000
24 ns
+
+
28 ns
JO ns
32ns
34 ns
40 ns
/bp_regfile4x32/w_data
/bp_regfile4x32/r_addr
/bp_regfile4x32/w_addr
11111111111111111111111111111111
11111111111111111111111111111111
oooooooooooooooooooooooooooooooo ~~0~10~10::1:::01:::01:=0:::10:=
.. =oo=oo=o=oo=oo=o=oo=oo=oo=o=oo=oo=o=oo=oo=oo=o=oo===F=====;~==============1
00
00
1!11
00
1~1:;:1= = = = ; ; ; : ; ; = = = = = = = = = = = F = = = = = = = = = = = = = = = = = = = 1
/bp_regfile4x32/rst
/bp_regfile4x32/clk
+ /bp_regfile4x32/uut/reg0/r
8+
@+
8 +
26 ns
+ /bp_regfile4x32/r _en
+ /bp_regfile4x32/w_en
::J
1111111111111111111111111111111
--=---
w +
w +
w +
11
!0101010.
10
22 ns
120 ns to 42 ns
F'""------------- .---------
1111111111111111111111111111111
10101010101010101010101010 01010
00
/bp_regfile4x32/uut/reg1/r
/bp_regfile4x32/uut/reg2/r
/bp_regfile4x32/uut/reg3/r
11111111111111111111111111111111
10101010101010101010101010101010
11111111111111111111111111111111
01010101010101010101010101010101
~~1;;;11~1~11~11*11~1~11;;;11~11~1~11*11~1~11;;;11~11~1~11;=======!f=================:::j
~~1~01~0~10~10~10~10~1~01~01~0~10~10~10~1~01~01~0~10========!f=================:::j
11111111111111111111111111111111
1;0:;10;:10~1;;;01~01~0~10:;10;:10~1;;;01:;;=01~0~10:;10;:10~10~1=======!f=================:::j
~~~
Curs:~:
~~ ~:
48 ns
50 ns
52 ns
54 ns
56 ns
~58 ns
60 ns
62 ns
64 ns
66 ns
68 ns
l.!,r-J
1
47 ns to 69 ns
Figura 5.10: Algunas formas de onda resultantes de la ejecucin del banco de pruebas del register
file. En la figura superior, puede observarse la operacin de reset sncrono, que se produce en
el instante 5 ns. En el instante 15 ns se escribe en regO. En la figura central, se muestran las
operaciones de escritura en reg1 (25 ns) y en reg2 (35 ns). La escritura es una operacin sncrona:
se produce en el flanco de subida de la seal de reloj. Finalmente, en la figura inferior se muestran
las operaciones de lectura de regO (50 ns) y reg1 (60 ns). Obsrvese que la operacin de lectura
es asncrona: se produce en el flanco de subida de la seal r_en, con independencia del valor de la
seal de reloj.
383
5.5.5.
En el Cdigo VHDL 5.14 se muestra otro diseo del register file, en el cual
se realiza una descripcin de su comportamiento. Obsrvese que en este diseo se
declara un nuevo tipo de dato, llamado regfile_type, que es un array:
type regfile_type is
array (Oto 3) of std_logic_vector(31 downto O);
<=
<=
<=
<=
X"OOOOOOOO";
X"OOOOOOOO";
X"OOOOOOOO";
X"OOOOOOOO";
El diseo del register file consta de dos bloques process. En el bloque process
W_process se escribe en los registros, tanto en la operacin de reset como en la
operacin normal de escritura, en la cual la direccin del registro viene determinada
por el vector de dos bits W_addr. Obsrvese cmo se realiza la conversin del vector
de dos bits a un entero, que es usado como ndice del array regfile:
regfile(conv_integer(W_addr)) <= W_data;
384
REGISTROS Y MEMORIAS
-- R egister fi le 4x32.
-- Descripcin del comportamiento
-- Fichero: R egFile4x32_comp. vhd
library IEEE;
use IEEE. std_logic_1164. all;
use IEEE. std_logic_unsigned. all;
entity RegFile4x32 is
port ( R_data
W_data
R_ addr, W_ addr
R_en, W_en
clk, rst
end entity RegFile4x32;
: out
: in
: in
: in
: in
<= W_data;
Cdigo VHDL 5.14: Diseo del regist er file mediante la descripcin del comportamiento.
385
Messages
8
8
8
+
+
+
lB+
+
+
+
+
i.::J +
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
/bp_regfile4x32/r _data
/bp_regfile4x32/w_data
/bp_regfile4x32/r _addr
/bp_regfile4x32/w_addr
lbp_regfile4x32/r_en
lbp_regfile4x32/w_en
lbp_regfile4x32/rst
/bp_regfile4x32/clk
/bp_regfile4x32/uut/regfile
m+
w+
@.
@.
10101010101010101010101010101010
11111111111111111111111111111111
10101010101010101010 ' ..
00
o
01
o
1
o
1
o
1
1
{11111111111111111111111111111111}{ uuuuuuuuuuu .. . HOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ... !{1111111111111111111111111111111 ... H11 ..
11111111111111111111111111111111
uuuuuuuuuuuu. '' !00000000000000000000000000000000 11111111111111111111111111111111
10101010101010101010101010101010
uuuuuuuuuuuu. '' !00000000000000000000000000000000
101 ..
00000000000000000000000000000000
UUUUUUUUUUUU ... lOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
00000000000000000000000000000000
uuuuuuuuuuuu' '' lO 0000000000000000000000000000000
<o)
<1>
(2)
(3)
,\X[ilf@
Gl!I'O
~
Now
100 ns
Cursor 1
26 ns
..!.,..!.L_1
1 Onsto27ns
1
15
4 ns
l!.
ens
12ns
16 ns
20 ns
'
'
24ns ~
26 ns
/
Figura 5.11: Simulacin del banco de pruebas, empleando el diseo del register file basado en su
comportamiento.
5.6.
5.6.1.
386
REGISTROS Y MEMORIAS
entity fuenteUnidireccional is
generic ( WORD_SIZE
integer := 8;
-- B its por palabm, por defecto 8
READ_DELAY : time
:= 10 ns); -- RetaTdo en la lectura, por def ecto 10 ns
port ( data : out std_logic_vector(WORD_SIZE-1 downto O); --Datos de salida
OE_n : in
std_logic);
-- Habilita lectura
end entity fuenteUnidireccional;
architecture fuenteUnidireccional of fuenteUnidireccional is
begin
rom : process (OE_n)
begin
if (OE_n = '0') then
data <= ( O => '1', others = > 'O') after READ_DELAY;
else
data <= (others => 'Z');
end if;
end process rom;
end architecture fuenteUnidireccional;
palabra (N) y READ_DELAY, que contiene el tiempo de retardo entre que se habilita
la seal de lectura hasta que el dato est disponible.
La sentencia
data<= (O=> '1', others => '0' ) after READ_DELAY;
indica que debe asignarse al vector de seales data, una vez transcurrido el retardo
de tiempo READ_DELAY , una palabra del tamao de data, con todos sus bits igual a
'O' excepto el menos significativo, que debe valer '1' (es decir, data<= "OO ... 01" ;) 1 .
Esta palabra es la que se encuentra almacenada en la memoria y es la que se lee
cada vez que se habilita la operacin de lectura.
Anlogamente, la sentencia
data<= (others => 'Z');
asigna al vector de seales data una palabra, con el mismo nmero de bits que data,
con todos sus bits al valor 'z' (alta impedancia).
1
El software de CAD VeriBest muestra un error de compilacin en esta sentencia, debido a que
en VHDL 93-2002 la seleccin others puede usarse junto con otms elecciones slo si el mngo de
la seal es localment e esttico. Por el contrario, el software de CAD ModelSim no muestra error
de compilacin, ya que se ha relajado esta restriccin del lenguaj e.
387
5.6.2.
388
REGISTROS Y MEMORIAS
5.6.3.
Bus bidireccional
A continuacin, se muestra el cdigo del bus de datos que se emplea para realizar varias operaciones de lectura y escritura sobre las memorias. Al instanciar las
memorias, se asignan nuevos valores al tamao de la palabra, que pasa a ser 16 bits,
y a los retardos:
- Memoria de slo lectura: retardo en la lectura de 20 ns.
- Memoria de lectura y escritura: retardo en la lectura de 30 ns y retardo en la
escritura de 40 ns.
Las operaciones que se realizan son las siguientes:
l. tiempo== O (instante inicial). Se asigna valor '1' a las seales OE1_n, OE2_n
389
integer
time
data
OE1_n
OE2_n
WE_n
wri teData
:
:
:
:
:
component fuenteBidireccional is
generic ( WORD_SIZE
integer := 8;
-- Bits por palabra
READ_DELAY
time
:= 10 ns; -- Retardo en la lectura
WRITE_DELAY : time
:= 10 ns); --Retardo en la escritura
port ( data : inout std_logic_vector(WORD_SIZE-1 downto O);
-- Seal de datos bidireccional
OE_n : in
std_logic;
-- Habilita lectura
WE_n : in
std_logic );
-- Habilita escr'itura
end component fuenteBidireccional;
component fuenteUnidireccional is
generic ( WORD_SIZE
integer := 8;
-- Bits por palabra
READ DELAY
time
:= 10 ns); --- Retardo en la lectura
port ( data : out std_logic_vector(WORD_SIZE-1 downto O);
-- Seal de datos bidireccional
OE_n : in
std_logic);
-- Habilita lectura
end component fuenteUnidireccional;
begin
-- Instanciar las fuentes de datos, asignando valor a sus constantes generic
U1 : component fuenteBidireccional
generic map (WORD_SZ, 30 ns, 40 ns) -- Asigna valor constantes generic
port
map (data, OE1_n, WE_n);
U2 : component fuenteUnidireccional
generic map (WORD_SZ, 20 ns )
port
map (data, OE2_n);
------------- Continua ... ---------------------------------Cdigo VHDL 5.17: Bus bidireccional (contina en el Cdigo VHDL 5.18).
390
REGISTROS Y MEMORIAS
<=
=>
'Z');
vectoresTest : process is
begin
OE1_n <= '1 '; OE2_n <= '1'; WE_n <= '1'; -- D eshabilita seales
writeData <= B"0000_1111_1100_0011";
--Dato a escribir {= Ox0fc3)
wait for PERIOD;
-- Habilita escritura (se escribe Ox0fc3)
WE_n <= '0';
wait for PERIOD;
-- Deshabilita escritura
WE_n <= '1';
-- Habilita lectura desde la fu ente unidireccional
OE2_n <= '0';
-- El dato en el bus debe ser Ox0001
wait for PERIOD;
-- D eshabilita lectura de la fu ente unidireccional
OE2_n <= '1';
-- Habilita lectura desde la fuente bidireccional
OE1_n <= '0';
-- El dato en el bus debe ser Ox0fc3
wait for PERIOD;
wait;
end process vectoresTest;
end architecture tb_bus;
Cdigo VHDL 5.18: Bus bidireccional (continuacin del Cdigo VHDL 5.17).
0+ /tb_bus/data
+ /tb_bus/oe1_n
+ /tb_bus/oe2_n
+ /tb_bus/we_n
0+ /tb_bus/writedata
0+ /tb_bus/u1/data_stored
0000111111000011
1
1
0000111111000011
0000111111000011
Now
'
0000111111000011
0000000000000001 --0000111111000011
500 ns
0000111111000011
uuuuuuuuuuuuuuuu
0000111111000011
,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
)
50
100
150
200
250
300
350
400
5.7.
LECTURAS RECOMENDADAS
391
5.8.
EJERCICIOS DE AUTOCOMPROBACIN
Ejercicio 5.1
Disee en VHD L un registro de desplazamiento de 4 bits con una entrada serie
(Serial_in) y una salida serie (Serial_out), como el mostrado en la Figura 5.13. El
registro realiza una operacin de desplazamiento de 1 bit en cada flanco de subida
de la seal de reloj ( clk).
elk
A continuacin, programe un banco de pruebas y simlelo. Inspeccionando visualmente las seales de entrada y salida, compruebe que el registro que acaba de disear
funciona correctamente. Si la solucin es correcta, la seal de salida (Serial_ out)
debera estar retrasada 4 flancos de subida de la seal de reloj respecto a la seal de
entrada (Serial_in).
Ejercicio 5.2
Generalice el diseo del Ejercicio 5.1 al caso de un registro de desplazamiento
de N bits, con una entrada serie y una salida serie. Para ello, defina el nmero de
bits del registro (N) como una constante de tipo generic. Emplee una sentencia for
dentro de un bloque process para describir la operacin de desplazamiento.
392
REGISTROS Y MEMORIAS
Ejercicio 5.3
D3 D2 D
Do
Serial in
SHSel1
SHSel 0
3 2 Q
Clock
Qo
SHSel1
o
o
1
Operacin
o
1
Mantiene valor
Carga en paralelo
Desplaza 1 bit a la derecha el contenido del
registro y asigna a Q3 el valor en SeriaLin
393
Ejercicio 5.4
Disee usando VHDL el circuito mostrado en la Figura 5.15, que est compuesto
por una unidad aritmtico lgica (ALU) y un registro de desplazamiento. La salida de
la ALU es la entrada al registro de desplazamiento. El tamao de los dos operandos
de entrada, A y B, es de 16 bits.
B
Sel(O)
o
1
Operacin
Desplazamiento a la derecha introduciendo un 'O' a la izquierda
Carga el nuevo valor
Sel(2)
Sel(1)
o
o
1
1
394
o
o
Operacin
suma
resta
and
or
REGISTROS Y MEMORIAS
Ejercicio 5.5
Disee una memoria de slo lectura que contenga 8 palabras de 8 bits (ROM
8 x 8). Como se muestra en la Figura 5.16, la ROM contiene un conjunto de palabras
( words) almacenadas. La ROM tiene los siguientes valores (decimales) almacenados
en las direcciones O a 7: O, 2, 4, 8, 6, 32, 64 y 128.
ROM
word O
word 1
addr-~...~
word 2
~-:~data
395
Ejercicio 5. 6
Disee en VHD L una memoria de acceso aleatorio que contenga 16 palabras de
8 bits (RAM 16 x 8).
Tal como se muestra en la Figura 5.17, la RAM tiene una bus de entrada de
datos (data_in), un bus de salida de datos (data_out), un bus de direcciones (addr),
una entrada de reloj ( clk) y una entrada para habilitar la escritura (wr_ena).
RAM
data_in--+
word O
word 1
data_out
word 2
addr--+
clk
wr_ena
396
REGISTROS Y MEMORIAS
5.9.
entity regDesp is
port (Serial_out
: out std_logic;
Serial_in, clk : in std_logic);
end entity regDesp;
end if;
end process;
end architecture regDesp;
El Cdigo VHDL 5.20 es otra posible forma de realizar el diseo del registro. En
este caso, se usan 4 seales del tipo std_logic para almacenar los bits: Serial_out,
R2, R1 y RO. La asignacin a una seal en el flanco de subida de la seal de reloj da
lugar a la sntesis de un fiip-flop. Por tanto , se sintetizarn 4 fiip-fiops.
Finalmente, el Cdigo VHDL 5.21 es una forma errnea de realizar el diseo.
Se usan 3 variables, como en el Cdigo VHDL 5.19. Sin embargo, en este caso las
asignaciones de los valores se realizan en el orden inverso, con lo cual el diseo
397
entity regDesp is
port(Serial_out
: out std_logic;
Serial_in, clk : in std_logic);
end entity regDesp;
architecture regDesp of regDesp is
signal RO, R1, R2: std_logic;
begin
process ( clk)
begin
if ( rising_edge( clk) ) then
RO <= Serial_in;
R1 < =RO;
R2 <= R1;
Serial_out < = R2;
end if;
end process;
end architecture regDesp;
entity regDesp is
port (Serial_out
: out std_logic;
Serial_in, el k : in std_logic);
end entity regDesp;
architecture regDesp of regDesp is
begin
process (el k)
variable RO, R1, R2 : std_logic;
begin
if ( rising_edge( clk) ) then
RO := Serial_in;
R1 :=RO;
R2 := R1;
Serial_out <= R2;
end if;
end process;
end architecture regDesp;
398
REGISTROS Y MEMORIAS
--200ns
--400ns
--600ns
--800ns
Cdigo VHDL 5.22: Banco de pruebas de un registro de desplazamiento de 4 bits con entrada
y salida serie.
399
entity regDesp is
generic (N: integer := 4);
port (Serial_out
: out std_logic;
Serial_ in, clk : in std_logic);
end entity regDesp;
architecture regDesp of regDesp is
begin
process ( clk)
variable R: std_logic_vector(N-2 downto O);
begin
if (rising_edge( clk)) then
Serial_out <= R(N-2);
for index in N-3 downto O loop
R(index+1) := R(index);
end loop;
R(O) := Serial_in;
end if;
end process;
end architecture regDesp;
Cdigo VHDL 5.23: Diseo de un registro de desplazamiento de N bits con entrada y salida
serie.
400
REGISTROS Y MEMORIAS
4 bits
entity registroSerieParalelo is
port( Serial_out : out std_logic;
Q
: out std_logic_vector(3 downto O);
Clock
: in std_logic;
SHSel
: in std_logic_vector( 1 downto O);
Serial in : in std_logic;
D
: in std_logic_vector(3 downto O));
end entity registroSerieParalelo;
architecture registroSerieParalelo of registroSerieParalelo is
signal content: std_logic_vector(3 downto O);
begin
process(Clock)
begin
if(rising_edge(Clock)) then
case SHSel is
when "01" => -- carga paralelo
content <= D;
when "10" => -- desplazamiento derecha
--y Tellena a la izqda con bits
--entrada SeriaLin
content <= Serial_in & content(3 downto 1);
w hen others = >
null;
end case;
end if;
end process;
Q <= content;
Serial_out <= content(O); --Bit ms a la derecha
end architecture registroSerieParalelo;
401
entity bp_registroSerieParalelo is
end entity bp_registroSerieParalelo;
architecture bp_registroSerieParalelo of bp_registroSerieParalelo is
constant PERIODO
: time
:= 200 ns; --Reloj
signal Serial_out : std_lo~ic; -- Salidas UUT
signal Q: std_logic_vector(3 downto O);
signal Clock: std_logic:= 'O'; -- Entradas UUT
signal SHSel: std_logic_vector(1 downto O);
signal Serial_in: std_logic;
signal D: std_logic_vector(3 downto O);
component registroSerieParalelo is
port ( Serial_out : out std_logic;
Q
: out std_logic_vector(3 downto O);
Clock
: in std_logic;
SHSel
: in std_logic_vector(1 downto O);
Serial_in : in std_logic;
D
: in std_logic_vector ( 3 downto O));
end component registroSerieParalelo;
begin
-- Instanciar y conectar UUT
uut : component registroSerieParalelo
port map (Serial_out, Q, Clock, SHSel, Serial_in, D);
Clock <= not Clock after (PERIOD0/2);
gen_ ve e_ test : process is
begin
report "Comienza la simulacin";
-- Operacion Paralelo-Serie: realizamos una escritura en paralelo y
-- desp'us vamos desplazando los bits que vamos leyendo de la salida serie
SHSel<="Oi";
Serial_in<='O'; D<="1010"; --Carga paralelo
wait until falling_edge(Clock); --200ns
SHSel<="10"; --Desplaza a la derecha
wait until falling_edge(Clock); --400ns
SHSel<="10"; --Desplaza a la derecha
wait until falling_edge(Clock); --600ns
SHSel<="10"; --Desplaza a la derecha
wait until falling_edge(Clock); --800ns
Cdigo VHDL 5.25: Parte inicial del banco de pruebas para el registro serie-a-paralelo y paraleloa-serie de 4 bits.
402
REGISTROS Y MEMORIAS
Cdigo VHDL 5.26: Parte final del banco de pruebas para el registro serie-a-paralelo y paraleloa-serie de 4 bits.
403
404
REGISTROS Y MEMORIAS
Cdigo VHDL 5.27: Diseo del circuito ALU y registro, mostrado en la Figura 5.15.
405
entity bp_ALUReg is
constant PERIODO : time := 100 ns;
end entity bp_ALUReg;
architecture bp_ALUReg of bp_ALUReg is
signal A, B, Z : std_logic_vector (WIDTH-1
downto O);
signal Sel
: std_logic_vector (SEL_BITS-1 downto O);
signal clk : std_logic:=' O';
component ALUReg is
port ( Z
: out std_logic_vector(WIDTH-1 downto O);
A, B : in std_logic_vector(WIDTH-1 downto O);
Sel : in std_logic_vector(SEL_BITS-1 downto O);
el k : in std_logic);
end component ALUReg;
Cdigo VHDL 5.28: Package en el cual se definen las constantes y comienzo del banco de
pruebas de ALU+registro.
406
REGISTROS Y MEMORIAS
---------------- Continua banco de pruebas de AL U+ R eg (fichero bp_AL UReg. vhd) -------------- Procedure que calcula Z ( expectecLZ) y lo compara con el
-- valor de Z que se pasa como argumento ( actuaLZ)
-- Si ambos valores no coinC'iden, se muestra 'Un mensaje y se
-- incrementa el contador de errores {error_count)
proced ure checLAL U
( i, j, k : in integer;
actuaLZ: in std_logic_vector (WIDTH-1 downto O);
error_count : inout integer ) is
variable var_Z : integer;
variable expected_Z : integer;
variable varAux: std_logic_vector(WIDTH-1 downto O);
begin
case k is
=> var_Z := i+j;
when O 11
=> var_Z := i-j;
when 2 1 3
=> var_Z := TO_INTEGER(signed(
when 4 1 5
std_logic_vector(TO_SIGNED (i, WIDTH)) and
std_logic_vector (TO_SI G NED (j, WIDTH))
) );
when others => var_Z := TO_INTEGER(signed(
std_logic_vector(TO_SIG NED ( i, WIDTH)) or
std_logic_vector(TO_SIGNED(j, WIDTH))
));
end case;
case k is
when 1 1 31 51 7 =>
varAUX := std_logic_vector(TO_SIGNED(var_Z,WIDTH));
expected_Z := TO_INTEGER(signed('O'& varAUX(WIDTH-1 DOWNTO 1)));
Cdigo VHDL 5.29: Fragmento del banco de pruebas de ALU+registro: procedure checLALU.
407
---------------- Continuacin banco de pruebas de AL U+ Reg (fichero bp_AL UReg. vhd) -------------
begin
UUT : component ALUReg port map (Z, A, B, Sel, clk);
clk <= not clk after (PERIODO /2);
-- Bloque process para generar los vectores de test y comprobar el resultado
main : process is
variable erroLcount : integer : = O;
begin
report 11 Comienza la simulacin 11 ;
-- Vectores de test: operandos con valor prX'i mo a cero
for i in -2 to 2 loop
for j in -2 to 2 loop
for k in O to SEL_MAX loop
A <= std_logic_vector(TO_SIGNED(i,WIDTH));
b <= std_logic_vector(TO_SIGNED(j,WIDTH) );
Sel < = std_logic_vector (TO_SIG NED (k,SEL_BITS));
wai t until falling_edge ( clk);
check....ALU(i, j, k, Z, error_count);
end loop;
end loop;
end loop;
-- Vectores de test: operandos con valor prximo al mnimo
408
REGISTROS Y MEMORIAS
---------------- Continua banco de pruebas de AL U+ R eg (fichero bp_AL UReg. vhd) -------------- Vectores de test: operandos con valores 11 al azar 11
for i in O to 9 loop
for j in O to 9 loop
for k in O to SEL_MAX looPA <= std_logic_vector(TO_SIGNED(41 *i-273,WIDTH));
b <= std_logic_vector(TO_SIGNED(89*j-384,WIDTH));
Sel <= std_logic_vector(TO_SIGNED(k,SEL_BITS));
wait until falling_edge( clk);
check_ALU(41 *i-273, 89*j-384, k, Z, error_count);
end loop;
end loop;
end loop;
11
errores 11 ;
Cdigo VHDL 5.31: Parte final de la definicin del banco de pruebas de ALU+registro.
409
410
REGISTROS Y MEMORIAS
entity bp_ROM is
constant DELA Y
end entity bp_RDM;
:time
411
entity ram is
generic( bits
words
port( data_out
wr _en a
clk
addr
data_in
end entity ram;
412
REGISTROS Y MEMORIAS
entity bp_RAM is
constant PERIODO
end entity bp_RAM;
:time
<= not
begin
report "Comienza la simulacin";
wr _ena <=
addr <= 3;
addr <= 4;
addr <= 5;
wr _ena <=
addr <= 3;
addr <= 4;
addr <= 5;
413
TEMA
6.1. Introduccin
6.2. Diseo de mquinas de estado finito
6.3. Sntesis de lgica secuencial
6.4. Flip-flop JK
6.5. Mquinas de estado finito de Moore
6.6. Mquinas de estado finito de Mealy
6.7. Mquinas de estado finito seguras
6.8. Lecturas recomendadas
6.9. Ejercicios de autocomprobacin
6.10. Soluciones de los ejercicios
OBJETIVOS DOCENTES
Una vez estudiado el contenido del tema y realizados los ejercicios prcticos,
debera saber:
- Disear usando VHDL distintos tipos de flip-flop y sus bancos de prueba.
Disear usando VHDL el circuito latch. Discutir la diferencia entre un flip-flop
y un latch.
- Discutir buenas prcticas aplicables al diseo para sntesis de circuitos secuenciales sncronos.
- Disear en VHD L mquinas de estado finito de Moore y de Me aly sintetizables,
realizando el diseo tanto en base a la descripcin de su estructura al nivel de
puertas lgicas y flip-flops, como en base a su comportamient?.
- Disear y programar en VHDL bancos de pruebas de circuitos secuenciales
sncronos. Discutir diferencias conceptuales entre los bancos de pruebas para
circuitos secuenciales sncronos y para circuitos combinacionales.
- Discutir qu son las mquinas de estado finito seguras y realizar el diseo de
este tipo de mquinas usando VHDL.
417
6.1.
INTRODUCCIN
6.2.
419
-----------------------------1
salidas
1
1
entradas:
Lgica
combinacional
estado actual
Registro de estado
elk
1
1
1
1
1
1
1
prximo estado
L------------------------------
6.2.1.
El mtodo anterior puede aplicarse al diseo de un circuito que detecte la secuencia 101. El circuito tiene una nica entrada, por la que recibe bits en serie, y una
nica salida, en la que genera un bit 1 cuando detecta la secuencia 101 en los bits de
entrada, y genera un O en caso contrario. Obsrvese que tambin deben detectarse
las secuencias cuando se encuentran solapadas, por ejemplo: 10101
El primer paso del diseo es dibujar el diagrama de estados del circuito, que
consiste en un conjunto de estados y (posiblemente) transiciones etiquetadas entre
los estados. En la Figura 6.2 se muestra el diagrama de transicin para el circuito
detector de la secuencia 101.
Cada estado del diagrama "recuerda" una porcin de la secuencia 101. Lastransiciones entre los estados estn etiquetadas x/y, donde x corresponde con el valor
de la entrada que produce la transicin, e y corresponde con el valor de la variable
de salida dado el estado en el que empieza la transicin y el valor de entrada x.
Dado que la salida depende del estado actual y de la variable de entrada, este tipo
420
de diagrama corresponde con una mquina de Mealy. En este tipo de diagrama debe
tenerse en cuenta que debe escribirse una transicin desde cada estado por cada
posible valor que puede tomar la entrada en ese estado.
El segundo paso del mtodo de diseo consiste en codificar los estados. Puesto
que hay tres estados, son necesarias dos variables de estado: A y B. Obsrvese
la diferencia conceptual entre los estados de la mquina y las variables de estado
definidas para codificar dichos estados. Por simplicidad en la exposicin, realizaremos
una codificacin binaria de los estados:
Estado
So
s1
s2
O
1
Estado actual
A B
So:
So:
S1:
S1:
S2:
S2:
Entrada
X
Prximo estado
NA NB
Salida
y
00
00
So:
S1:
o1
o1
1o
1o
S2:
S1:
o1
1o
o1
So:
00
o
o
o
o
o
S1:
o1
00
El cuarto paso consiste en obtener las funciones lgicas simplificadas que relacionan el prximo estado y la salida, con el estado actual y la entrada. Estas
funciones son las siguientes:
NA
xB
(6.1)
NB
(6.2)
xA
(6.3)
421
........................... ,..;
X
.........................................
elK
.........................................
6.3.
end if;
end process;
422
6.3.1.
Obsrvese que el latch se define empleando una clusula if-then sin else. Se
denomina sentencias condicionales incompletas a este tipo de sentencias. Este punto
es importante, ya que muestra que las sentencias condicionales incompletas (if, case,
etc. sin else) son sintetizadas mediante latches. Esto es debido a que la salida debe
mantener su valor si ninguna de las condiciones de la clusula se satisface.
Un motivo por el cual podra pensarse en omitir el caso else, es que sea indiferente
el valor que se asigne a las seales en este caso (ya que en la prctica nunca se
producir). Si no deseamos que el circuito se sintetice mediante un latch, debemos
incluir el caso else en la sentencia condicional y asignar a las seales el valor 'X'.
6.3.2.
6.3.3.
Retardos
423
herramientas de sntesis ignoran estas sentencias, mientras que otras muestran mensajes de error.
Cuando es preciso emplear retardos para describir adecuadamente el circuito,
puede definirse un retardo constante en la parte superior del cdigo
constant DEL : time := 1 ns;
6.3.4.
Inicializacin
Debe evitarse inicializar las variables y las seales al declararlas, ya que este tipo
de inicializacin no puede ser sintetizada.
La inicializacin de una variable o seal implica una accin que se realiza nicamente una vez al comienzo de la simulacin. Si es preciso realizar una accin al
comienzo de la simulacin, entonces debe situarse en la secuencia de acciones que
se ejecutan cuando se activa la seal de reset. Estas acciones se definen tpicamente
dentro de un bloque process sensible a la seal de reset.
6.3.5.
Bloques process
La descripcin de la architecture de los circuitos secuenciales se basa fundamentalmente en el empleo de bloques process. Las asignaciones a seales dentro de
los bloques process deben cumplir que:
- La seal en la parte izquierda de la asignacin secuencial debe ser una seal
definida dentro del bloque process, o una seal out o inout de la interfaz del
circuito.
424
6.4.
FLIP-FLOP JK
425
Nuevo estado
o
o
Qt+l=Q,
Qt+l=O
Qt+l =1
Q1+1=not Q,
0-
-0
-- -------~GJ-~-~~GJ
Figura 6.4: Transicin de estados de un flip-flop JK. En los arcos del diagrama se muestra el
valor de las seales JK. El bit '-' es "don't care" (por ejemplo, "0-" representa "00" "01"). La
transicin de reset se representa mediante una lnea punteada.
Cuando la entrada de reset asncrono pasa de valer '1' a valer 'O', el circuito pasa
al estado Q='O'. Se denomina reset asncrono porque la transicin al estado 'O' se
produce en el instante en que cambia la seal de reset, con independencia del valor
de la seal de reloj. La transicin de reset asncrono se representa mediante una
lnea punteada en el diagrama situado en la parte derecha de la Figura 6.4.
El circuito tiene dos salidas: Q y Q. La salida Q es igual al estado y la salida Q
es su inversa: Q = not Q.
6.4.1.
6.4.2.
Banco de pruebas
426
entity flipflop_JK is
port ( q, q_n
clk, J, K, reset_n
end entity flipflop_JK;
: out std_logic;
: in std_logic ) ;
<= q_interna;
<= not q_interna;
<=
'0';
427
entity bp_flipflopJK is
end entity bp_flipflopJK;
architecture bp_flipflopJK of bp_flipflopJK is
constant PERIODO
: time
:= 100 ns; -- Reloj
signal
q, q_n
: std_logic;
-- Salidas UUT
signal
clk
: std_logic := 'O';
-- Entradas UUT
signal
J, K, reset_n : std_logic;
component flipflop _JK is
port ( q, q_n
: out std_logic;
clk, J, K, reset_n : in std_logic ) ;
end component flipflop_JK;
-- P rocedimiento para compro bar las salidas del fiip-fi op
procedure comprueba_salidas
( esperado_q
std_logic;
actual_q, actual_q_n
std_logic;
error_count
: inout integer) is
begin
-- Com prueba q
if ( esperado_q /= actual_q ) then
report "ERROR: Estado esperado ("
&
std_logic' image( esperado_q)
&
"), estado actual ("
&
std_logic' image(actual_q)
&
11
11
) , instante:
&
time' image(now) ;
error count := error_count + 1;
end if;
-- Comprueba q_n
if ( (not esperado_q) /= actual_q_n ) then
report "ERROR: q_n esperado ("
std_logic' image((not esperado_q))
"), valor actual ("
std_logic' image(actual_q_n)
11
) , instante: "
time' image ( now);
error count := error_count + 1;
end if;
end procedure comprueba_salidas;
&
&
&
&
&
428
wait;
429
CD oo
oo
---~----~ ~+-----~-:-~ ~
1_1-
10
G) 11
Figura 6.5: Orden en que el programa de test recorre los arcos del diagrama de transiciones.
Messages
+
+
+
+
+
+
/bp_flipflopjk/q
/bp_flipflopjk/q_n
/bp_flipflopjk/clk
/bp_flipflopjk/j
tbp_flipflopjk/k
/bp_flipflopjk/reset_n
,~;;}~
---,
---'
'l
~00
ns
1
1
1
1
1
1
1
1
1
lllllllllllllllllllllllllllllltlllllllllllllllllllllllllllllltllllllllllllllllllllllllllll
200 ns
lS
Onsto935ns
1
1
o
o
o
Now
iJ
400 ns
600 ns
800 ns
Figura 6.6: Resultado de la ejecucin del banco de pruebas del flip-flop JK.
6.5.
Hay varias maneras de escribir cdigo VHDL para una mquina de Moore.
En primer lugar, puede escogerse describir el comportamiento o la estructura del
circuito. En la mayora de los casos es preferible describir el comportamiento del
circuito, ya que este tipo de descripcin suele ser menos propensa a errores y las
herramientas de sntesis convertirn estos diseos en implementaciones optimizadas.
En la Figura 6. 7 se muestra una mquina de Moore sencilla. La transicin entre
los tres estados depende del valor de la entrada, x. La salida del circuito, z , vale 1
en el estado 8 2 y O en los dems estados. Este cdigo puede ser adaptado fcilmente
para la descripcin de otras mquinas de Moore.
6.5.1.
Diseo de la mquina
El Cdigo VHDL 6.4 y 6.5 describe la mquina de Moore mostrada en la Figura 6.7. En primer lugar, se define un package con las constantes que sern
usadas en el circuito y en el banco de pruebas. Definir las constantes globales de
430
esta manera facilita realizar cambios globales y tambin favorece la legibilidad del
cdigo. Asimismo, en el diseo de la mquina puede observarse que:
- La interfaz
y el estado
y entrada).
entonces la
del circuito est compuesta por dos puertos de salida (la salida
actual) y tres puertos de entrada (seal de reset asncrono, reloj
Cuando la seal de reset (reset_n) pasa de valer '1' a valer '0',
mquina pasa al estado 8 0 .
hace que ambas tengan el mismo valor. El motivo es que, por ser state
una seal de salida de la interfaz, no puede ser leda en el cuerpo de la
architecture. Puesto que internal_state es una seal interna, puede ser
leda y escrita.
La architecture contiene dos bloques process:
l. El primero, que es activado cuando hay un cambio en internal_state,
431
-- Mquina de Moore
-- Fichero : maquinaMooreSimple. vhd
library IEEE;
use IEEE. std_logic_1164. all;
use work.STATE_CONSTANTS.all;
-- Definicin de la entity
entity maquinaMooreSimple is
port( z
: out std_logic; -- Seal de salida
state
: out std_logic_vector(STATE_BITS-1 downto O);
-- Estado actual de la mquina
reset_n : in std_logic; -- Seal reset activada en bajo
clk
: in std_logic -- Seal de reloj
x
: in std_logic); -- Seal de entrada
end entity maquinaMooreSimple;
-- Definicin de la architecture
architecture maquinaMooreSimple of maquinaMooreSimple is
signa! internal_state: std_logic_vector(STATE_BITS-1 downto O);
begin
state <= internal_state; -- Estado actual
-- Genera la salida
salida: process(internal_state) is
begin
case internal_state is
when SO
=> z <= '0';
when S1
=> z <= '0';
when S2
=> z <= '1 ';
when others => z <= 'X';
end case;
end process salida;
Cdigo VHDL 6.4: Definicin del package con la codificacin de los estados y parte inicial del
diseo de la mquina de Moore de la Figura 6.7.
432
Cdigo VHDL 6.5: Continuacin del diseo de la mquina de Moore de la Figura 6.7.
Se ha aadido una clusula when others al final de las dos sentencias case,
con el fin de contemplar todos los casos posibles. Obsrvese que se asigna el
valor 'X' a la seal de salida. Esta es una buena prctica, ya que con ello se
ayuda a la herramienta de sntesis a optimizar el circuito combinacional para
la seal de salida (z). Se volver sobre este tema en la Seccin 6.7, en la cual
se discutir una forma ms adecuada de describir el comportamiento de la
mquina en los estados ilegales.
6.5.2.
Banco de pruebas
433
reloj, que inicialmente vale O, tiene un periodo (PERIODO) de T = 100 ns. Esto implica
que los flancos de subida de la seal de reloj se producen en los instantes: 0.5 T = 50
ns, 1.5 T = 150 ns, 2.5 T = 250 ns, ... que son precisamente los instantes en que se
producen las sucesivas transiciones en el estado, segn se muestra en la Figura 6.8.
Para generar la seal de reloj se emplea la siguiente sentencia concurrente:
clk <= not clk after ( PERIOD0/2 );
donde se asume que la seal de reloj ha sido inicializada al valor 'O'. Obsrvese que
de esta forma se crea una seal de reloj infinitamente larga, con lo cual la simulacin
no finalizar automticamente, sino que hay que definir el instante de finalizacin.
IT=PERIODO=lOOnsl
s~~T
8
_o:~~:!_,. @~
4.5
ri
3.5-r
+
+
+
+
/bp_maquinamooresimple/clk
/bp_maquinamooresimple/x
/bp_maquinamooresimple/state
/bp_maquinamooresimple/z
10
Now
10
.!,&LOO
---,
800 ns
_!..~
.. -- ----------------------------- ---------
00
01
'''''';~~~~ ' ''''' 1 ''''''~b~~~~~''''' ' '''''3~~ ~~~'''''''''''''~b'~ ~~~'''''' ''''''~o~~~''''''' ''''''~b'~ ~~~'''''''''''' ~o~~~'''''''''''' '~O'~'~~''
_!.. t-. 1
,
1o -ns-to -82-6 n-s ----~ Now: 800 ns Delta: 1
434
10
,..------
1 /
entity bp_maquinaMooreSimple is
constant PERIODO : time := 100 ns; -- Periodo reloj
end entity bp_maquinaMooreSimple;
architecture bp_maquinaMooreSimple of bp_maquinaMooreSimple is
signal z
: std_logic;
signal state
: std_logic_vector(STATE_BITS-1 downto O);
signal reset_n : std_logic;
signal clk
: std_logic := 'O'; -- Inicializada a 'O'
signal x
: std_logic;
component maquinaMooreSimple is
port( z
: out std_logic; -- Seal de salida
state
: out std_logic_vector(STATE_BITS-1 downto O);
-- Estado actual de la mquina
reset_n : in std_logic; -- Seal reset activada en bajo
clk
: in std_logic; -- Seal de reloj
x
: in std_logic); -- Serial de entrada
end component maquinaMooreSimple;
-- Procedimiento para comprobar el resultado
procedure comprueba_state_z
( esperado_state
std_logic_vector(STATE_BITS-1 downto O);
esperado_z
std_logic;
actual_state
std_logic_vector(STATE_BITS-1 downto O);
actual z
:
std_logic;
error _count
: inout integer ) is
begin
-- Comprue ba el estado
assert ( esperado_state = actual_state )
report "ERROR : estado esperado ("
&
std_logic' image( esperado_state(1)) & std_logic' image( esperado_state(O)) &
"), estado actual C'
&
std_logic' image(actual_state(1))
& std_logic' image(actual_state(O))
&
") en el instante "
& time' image(now);
if ( esperado_state 1= actual_state ) then
error_count := error_count + 1;
end if;
-- Comprueba la salida
if ( esperado_z 1= actual_z ) then
report "ERROR: salida esperada ("
&
std_logic' image (esperado _z)
&
"), salida actual ("
&
std_logic' image ( actual_z)
&
")en el instante "
& time'image(now);
error_count := error_count + 1;
end if;
end procedure comprueba_state_z;
435
-- Genera seal clk, asumiendo que se inicializ a O. Flanco de subida en los instantes:
-- PERIOD0/2, PERIODO+PERIOD0/2, 2*PERIODO+PERIOD0/2, ...
clock : clk <= not clk after ( PERIOD0/2 );
-- main process: genera vectores de test y comprueba resultados
main : process is
variable error _count : integer := O; -- Num. errores
begin
report "Comienza la simulacin";
x <= '0';
-- Valor inicial de entrada a UUT
wait for PERIODO;
-- En el instante PERIODO, el estado debera ser SO
comprueba_state_z(SO, 'O', state, z, error _count);
wait for PERIODO;
-- En el instante 2*PERIODO, el estado debera ser S2
comprueba_state_z(S2, '1 ', state, z, error _count);
x <= '1 ';
wait for PERIODO;
-- En el instante 3*PERIODO, el estado debera ser 82
comprueba_state_z(S2, '1', state, z, error _count );
x <= 'O';
wait for PERIODO;
-- En el instante 4 *PERIODO, el estado debera ser SO
comprueba_state_z(SO, 'O', state, z, error _count);
x <= '1';
wait for PERIODO;
-- En el instante 5*PERIODO, el estado debera ser S1
comprueba_state_z(S1, '0', state, z, error_count);
wait for PERIODO;
-- En el instante 6*PERIODO, el estado debera ser S1
comprueba_state_z(S1, '0', state, z, error_count);
x <= 'O';
wait for PERIODO;
-- En el instante 7*PERIODO, el estado debera ser 82
comprueba_state_z(S2, '1', state, z, error _count);
x <= '1 '; -- El estado final es S2
wait for PERIODO;
if (error_count = o) then
report "Simulacin finalizada con O errores";
el se
report "ERROR: hay 11 & integer'image(error_count)
end if;
wait;
-- Final de la ejecucin del bloque process.
end process main;
end architecture bp_maquinaMooreSimple;
&
" errores.";
436
6.5.3.
Modelado estructural
Entrada
Prximo estado
NA NB
00
00
S2: 1
S1:
o1
o1
1o
1o
S2:
S1:
So:
S2:
o1
1o
o1
oo
1o
Salida
z
o
o
o
o
1
1
NA
NB
z
xA+xA
xA
(6.4)
(6.6)
(6.5)
437
-- Componente: fiip-fiop D
component flipflop_D is
port ( q, q_n
: out std_logic;
d, clk, reset_n : in std_logic);
end component flipflop_D;
begin
state <= A & B; -- Muestra estado actual en el puerto de salida
=>
reset_n );
=>
reset_n );
+ /bp_maquinamooresimple/uut/reset_n
+ /bp_maquinamooresimple/uut/clk
+ /bp_maquinamooresimple/uut/x
+ /bp_maquinamooresimple/uut/dff_a/q
+ /bp_maquinamooresimple/uut/dff_b/q
lf) + /bp_maquinamooresimple/uut/state
+ /bp_maquinamooresimple/uut/z
1
O
10
1
10
00
200 ns
01
.---------,
400 ns
Ons to 834 ns
438
600 ns
800 ns
6.6.
En las mquinas de Mealy, las salidas del circuito dependen del estado actual
y del valor actual de las entradas. As pues, aunque la mquina permanezca en un
determinado estado, sus salidas pueden cambiar si cambian las entradas.
Como ejemplo de implementacin de una mquina de Mealy, consideremos la
mquina para el reconocimiento de la secuencia de bits 0110 mostrada en la Figura 6.11. Obsrvese que se permite el solapamiento de secuencias (por ejemplo,
0110110).
0/0
1/0
0,
~~~~
----------~0
r
~~
0/1
0/0
Figura 6.11: Diagrama de una mquina de Mealy para el reconocimiento de la secuencia 0110.
La salida de la mquina es un '1' lgico cada vez que se detecta el patrn 0110
en la secuencia de bits de entrada, que se supone que est sincronizada con el reloj
de la mquina. El tiempo que transcurre entre la entrada del ltimo 'O' del patrn
y la salida del '1' es igual al retardo de una puerta lgica. Para los dems bits de la
secuencia de entrada, la salida de la mquina es 'O'.
6.6.1.
Diseo de la mquina
439
Obsrvese que se han definido dos bloques process: uno para generar la salida,
que es sensible al estado y a la entrada, y otro para generar el prximo estado y
resetear la mquina, que es sensible nicamente a la seal de reloj. Puesto que la
mquina tiene reset sncrono, este segundo bloque process no es sensible a la seal
de reset.
El bloque process usado para generar el prximo estado corresponde directamente con el diagrama mostrado en la Figura 6.11. La seal de reset no se ha incluido
en la lista de seales a las que es sensible el bloque. As pues, este bloque slo es
activado cuando se produce un cambio en la seal de reloj. Es decir, la condicin
if ( (reset_n
que es activada cada vez que se produce un cambio en alguna de las seales de la
parte derecha de la asignacin.
Puesto que ste es un bloque combinacional, la duracin de la seal '1' de salida
puede ser ms pequea que un ciclo de reloj, ya que su duracin depende del tiempo
durante el cual la entrada x siga valiendo 'O' mientras la mquina permanezca en el
estado 53.
Para garantizar que la salida '1' tiene una duracin de al menos un ciclo de reloj,
es necesario hacer pasar la seal de salida por un flip-flop D. Esto puede hacerse
aadiendo a la descripcin de la arquitectura el siguiente bloque process:
ffD_salida: process (clk) is
begin
if ( rising_edge(clk) ) then
z_long <= z;
end if;
end process ffD_salida;
y haciendo que z_long sea la salida del circuito. La definicin del circuito, modificada
de la forma descrita anteriormente, es mostrada en el Cdigo VHDL 6.11.
Para mostrar el funcionamiento del circuito, puede disearse un pequeo banco
de pruebas que introduzca algunos vectores de test. El Cdigo VHDL 6.12 es un
ejemplo de este tipo de banco de pruebas.
440
Cdigo VHDL 6.9: Package con la codificacin de los estados y diseo de la mquina de Mealy
de la Figura 6.11.
441
begin
if ( (reset_n = 'O') and rising_edge( clk) ) then -- Reset sncrono
internal_state <= SO;
elsif rising_edge( clk) then
-- Flanco de subida del reloj
case internal_state is
when SO =>
if ( x = ' O' ) then
-- Primer bit del patrn
internal_state <= S1;
el se
internal_state <= SO;
end if;
when S1 =>
-- Segundo bit del patrn
if ( x = ' 1 ' ) then
internal_state <= S2;
el se
internal_state <= S1;
end if;
when S2 =>
-- Tercer bit del patrn
if ( x = ' 1 ' ) then
internal_state
<=
internal_state
<= S1;
else
end if;
when others =>
if ( x = ' O' ) then
S3;
internal_state
<= S1;
internal_state
<= SO;
else
end if;
end case;
end if;
end process proximo_estado;
end architecture seq0110;
Cdigo VHDL 6.10: Continuacin del diseo de la mquina de Mealy de la Figura 6.11.
442
entity seq0110 is
port ( z_long : out std_logic;
-- Seal de salida
state
: out std_logic_vector(STATE_BITS-1 downto O); --Estado actual
reset_n : in std_logic;
-- Reset sncrono activarlo LOW
clk
: in std_logic;
-- Seal de reloj
x
: in std_logic ) ;
-- Bit de entrada
end entity seq0110;
architecture seq0110 of seq0110 is
signa} internal_state : std_logic_vector(STATE_BITS-1 downto O);
signa} z
: std_logic; -- Seal de salida obtenida de circ. combinacional
begin
state <= internal_state;
-- Clculo de la salida
z <= '1' when ( (internal_state
ffD_salida: process ( clk) is
begin
if ( rising_edge( clk) ) then
z_long <= z;
end if;
end process ffD_salida;
= 83) and (x
Cdigo VHDL 6.11: Diseo de la mquina de Mealy de la Figura 6.11. La salida se obtiene de
un circuito combinacional y se hace pasar por un flip-fl.op D. El bloque process para la obtencin
del prximo estado es igual al mostrado en el Cdigo VHDL 6.10
443
Cdigo VHDL 6.12: Banco de pruebas que introduce algunos vectores de test en la mquina de
Mealy de la Figura 6.11.
444
+
~~O
O
O
00
1
O
.illL____,OO
Now 120005
:ilil
~~--------------~
~~~------------~' 1~--------~r
'~
01
10
11
01
10
11
1~-----------------01
10
11
00
,,
, ~~~ ~~
ro-,;-;t;!232;;-;---- ,~;;-;-2oQ-,;-;o~-------------------------------------------------------
Figura 6.12: Resultado de la simulacin del circuito detector del patrn 0110.
Ejecutando el banco de pruebas del Cdigo VHDL 6.12 durante 1200 ns, se
obtienen las seales mostradas en la Figura 6.12. Obsrvese que la seal z vale '1'
mientras el circuito se encuentra en el estado 83 y la entrada vale 'O'. La seal z
est conectada a la entrada de un fl.ip-fl.op D, cuya salida es la seal z_long, que
mantiene su valor a '1' durante un ciclo completo de reloj.
6.6.2.
Banco de pruebas
Figura 6.13: Orden en que el programa de test recorre los arcos del diagrama de estado.
445
entity bp_seq0110 is
constant PERIODO : time := 100 ns; -- Periodo reloj
end entity bp_seq0110;
architecture bp_seq0110 of bp_seq0110 is
signal z_long : std_logic;
-- Salida de la mquina
signal state
: std_logic_vector(STATE_BITS-1 downto O);
-- Estado actual
signal reset_n : std_logic;
-- Reset sncrono activado LOW
signal clk
: std_logic := 'O'; -- Seal de reloj
signal x
: std_logic;
-- Entrada a la mquina
component seq0110 is
port ( z_long : out std_logic;
state
: out std_logic_vector(STATE_BITS-1 downto O);
reset_n : in std_logic;
clk
: in std_logic;
x
: in std_logic ) ;
end component seq0110;
-- Procedimiento para comprobar si se produce error
procedure comprueba_estado_salida
( esperado_state
std_logic_vector(STATE_BITS-1 downto O);
esperado_z
std_logic;
actual_state
std_logic_vector(STATE_BITS-1 downto O);
actual z
:
std_logic;
error_count
: inout integer) is
begin
-- Comprueba el estado
assert~ esperado_state = actual_state )
report "ERROR: Estado esperado ("
&
std_logic' image( esperado_state( 1)) & std_logic' image( esperado_state(O)) &
"), estado actual ("
&
std_logic' image(actual_state(1))
& std_logic' image(actual_state(O)) &
"), instante: 11 & time' image(now);
if ( esperado_state /= actual_state ) then
error_count := error_count + 1;
end if;
-- Comprueba salida
assert( esperado_z = actual_z )
report "ERROR: Salida esperada ("
&
std_logic' image( esperado_z)
&
"), salida actual ("
&
std_logic' image ( actual_z)
&
"), instante: 11
& time' image(now);
if ( esperado_z / = actual_z ) then
error_count := error_count + 1;
end if;
end procedure comprueba_estado_salida;
446
Cdigo VHDL 6.14: Parte final del banco de pruebas de la mquina de Mealy.
447
+
+
() +
+
+
+
/bp_seq0110/uut/z_long
/bp_seq0110/uut/z
/bp_seq0110/uut/state
/bp_seq0110/uut/reset_n
tbp_seq0110/uut/clk
/bp_seq0110/uut/x
a'\~1$)
Now
/bp_seq0110/uut/z_long
+
+
+
/bp_seq0110/uut/state
tbp_seq0110/uut/reset_n
/bp_seq0110/uut/clk
/bp_seq0110/uut/x
m.
o
o
01
1
o
o
1400 ns
----,
uu
.00
01
'1
10
01
10
11
rrr r rrrrrlrrrrrrrrrlrrrrrrrrrlrrr1rrrrrlrrrrrrrrrlrrrrrrrrrlrrrrrrrrrlrrrrrrr1rlrrr
lS
200 ns
400 ns
600 ns
800 ns
+ /bp_seq0110/uut/z
01
1606 ns to 1442 ns
6.7.
Una mquina de estado finito (FSM) segura es una FSM tal que en su definicin
se ha considerado la posibilidad de que la mquina alcance un estado ilegal y, en tal
caso, se ha descrito cmo debe realizarse la transicin a un estado legal.
En teora, los estados ilegales son inalcanzables. Sin embargo, en la prctica la
mquina puede entrar en un estado ilegal debido a un error en el circuito. Por
ejemplo, ruido elctrico elevado puede hacer que un bit cambie de 'O' a '1', o
viceversa. Si se alcanza un estado ilegal, el comportamiento de la FSM es indefinido
y por tanto el circuito o bien queda bloqueado en dicho estado, o bien comienza a
realizar transiciones entre estados ilegales.
Consideremos de nuevo la FSM de Moore que se dise en la Seccin 6.5 y que
se muestra nuevamente en la Figura 6.15a. El estado 8 3 es un estado ilegal y, por
tanto, no ha sido considerado en el diseo. Si debido a un error en el circuito la
mquina entra en ese estado, queda atrapada en l.
En la Figura 6.15b se muestra la versin segura de esta FSM, en la cual se ha
incluido explcitamente en el diseo el estado ilegal 8 3 . En el diseo seguro, si la
mquina alcanza el estado 8 3 , entonces la salida es 'O' y el siguiente estado es 8 0 .
Obsrvese que resulta extrao tener un estado sin ninguna transicin que conduzca
a l, pero recurdese que este estado slo puede alcanzarse debido a un error en el
circuito.
448
@"Z
d o r;;0
---------- r:-::s!:;?~
~ o
a)
Figura 6.15: Definicin insegura y segura de una maquina de estado finito: a) FSM insegura, ya
que si la mquina entra en el estado indefinido (83 ="11"), no puede salir de l; y b) FSM segura,
con transiciones explcitas desde los estados indefinidos a estados definidos.
449
end case;
end process salida;
-- Genera el siguiente estado
proximo_estado: process(reset_n,clk) is
begin
if (reset_n = 'O') then
-- Reset asncrono
internal_state <= SO;
elsif rising_edge( clk) then -- En flanco subida del reloj
case internal_state is
when SO =>
-- Estado actual: SO
if ( x = ' 1 ' ) then
internal_state <= S1;
el se
internal_state <= S2;
end if;
-- Estado actual: S 1
when S1 =>
if (x = '0') then
internal_state <= S2;
end if;
-- Estado actual: S2
when S2 =>
if (x = '0') then
internal_state <=SO;
end if;
-- Del estado ilegal va a SO
when others =>
internal_state <= "00";
end case;
end if;
end process proximo_estado;
450
6.8.
LECTURAS RECOMENDADAS
451
6.9.
EJERCICIOS DE AUTOCOMPROBACIN
Ejercicio 6.1
Disee usando VHDL un latch D con entrada enable activa a nivel alto y programe un banco de pruebas para comprobar su correcto funcionamiento. Emplee en
la descripcin de la architecture una sentencia if.
Ejercicio 6.2
Disee usando VHDL un flip-flop RS disparado por el flanco de subida del reloj
y con reset asncrono (reset_n) activado a nivel bajo. A continuacin, programe un
banco de pruebas que testee de manera sistemtica el funcionamiento del circuito.
Ejercicio 6.3
Disee usando VHDL un flip-flop D que es activado por el flanco de subida de la
seal de reloj. Adems de la entrada de reloj, el fiip-fiop tiene otras cuatro seales
de entrada: D, Enable, Set y Clear. El flip-fiop tiene una nica seal de salida, cuyo
valor coincide en todo momento con el valor del estado del circuito (Q).
Cuando la seal Set es puesta al valor '1', el estado del flip-fiop cambia inmediatamente al valor '1 '. Por el contrario, cuando la seal Clear es puesta al valor '1 ',
el estado del flip-flop cambia inmediatamente al valor 'O'. Es decir, las seales Set y
Clear cambian de manera asncrona el estado del fiip-flop.
Si la seal Enable vale '1 ', entonces en el flanco de subida de la seal de reloj se
asigna el valor de la entrada D al estado del fiip-fiop Q. Por el contrario, si la seal
Enable vale 'O', la carga del fiip-fiop desde la entrada D est deshabilitada.
Al realizar el diseo de este circuito, emplee una sentencia if. Una vez realizado
el diseo, programe y simule un banco de pruebas para testearlo.
Ejercicio 6.4
Realice el diseo usando VHDL de un contador sncrono ascendente mdulo 4.
Es decir, la salida del circuito toma cclicamente los valores '0', '1' , '2', '3'. Si la
452
Ejercicio 6.5
Disee nuevamente el contador sncrono ascendente mdulo 4 descrito en el
Ejercicio 6.4 usando VHDL, pero esta vez describiendo su estructura. Emplee puertas
lgicas bsicas (AND, OR y NOT) y fiip-fiops D con entrada reset asncrona.
Ejercicio 6.6
Disee un generador de seales que obtenga la forma de onda mostrada en la
parte inferior de la Figura 6.16 a partir de una seal de reloj clk. Describa su
comportamiento como una mquina de estado finito. A continuacin, programe un
banco de pruebas para comprobar su correcto funcionamiento.
+--------- 1
periodo
Figura 6.16: Forma de onda de entrada (reloj, en la parte superior) y de salida (en la parte
inferior de la figura) del generador de seales.
Ejercicio 6. 7
Escribaen VHDL la architecture que describe el comportamiento de un divisor
de frecuencias por 3, con seal de reset asncrona activa a nivel bajo. El cdigo VHDL
de la entity del divisor de frecuencias se muestra a continuacin.
453
entity divisor_frecuencia_3 is
port( clk3
: out std_logic;
clk, resetn: in std_logic );
end entity divisor_frecuencia_3;
La salida clk3 es una seal peridica con la misma forma de onda que la seal
clk, pero con un tercio de su frecuencia. Es decir, un periodo de la seal clk3 se
corresponde con tres periodos de la seal clk. Los cambios sncronos en la seal clk3
se producen en el flanco de la seal clk. La entrada resetn pone asncronamente la
seal clk3 a O, mantenindose dicho valor mientras el valor de resetn valga O.
Una vez realizado el diseo, programe y simule un banco de pruebas para testearlo.
Ejercicio 6.8
A continuacin, se muestra el diseo de cuatro circuitos. La entity de todos ellos
es la siguiente.
entity ffd is
port( q
d, clk, rst
end entity ffd;
out std_logic;
in std_logic );
454
Para cada circuito, explique detalladamente si tiene la funcionalidad de un flipflop D con seal de reset asncrona.
Ejercicio 6.9
out std_logic;
in std_logic );
455
el k
:Perio~o clk:
~:
outl
1
1
Periodo o~ t 1
1
1
out2
Periodo o1Jl. t 2
1
out3
1
1
Periodo o* t 3
Ejercicio 6.10
Disee un circuito secuencial sncrono capaz de detectar cundo le llegan al
menos tres unos consecutivos por su entrada. La entity del circuito se muestra
a continuacin. El circuito tiene una seal de reloj (clk), un entrada serie de un bit
(x), una seal de reset asncrona activa en '1' (reset), una seal que indica el estado
en que se encuentra el circuito (state) y una seal de salida de un bit (Y). La seal
Y se pone a '1' si por la entrada X se han recibido tres o ms unos consecutivos.
La seal reset pone el circuito en su estado inicial. Todos los cambios tienen lugar
en el flanco de subida de la seal de reloj. Escriba en VHDL la architecture que
describe el comportamiento del circuito en trminos de una mquina de Moore.
Dibuje el diagrama de estados correspondiente al circuito que ha diseado.
entity detector is
port( Y
out std_logic;
state
out std_logic_vector(1 downto O);
in std_logic;
X
reset
in std_logic;
clk
in std_logic);
end entity detector;
456
Ejercicio 6.11
Realice el diseo usando VHDL de un contador sncrono BCD. Es decir, la salida
del circuito toma cclicamente los valores "0000", "0001", "0010", "0011", "0100",
"0101", "0110", "0111", "1000" y "1001". Se obtiene un nuevo valor de la salida en
cada flanco de subida de la seal de reloj. El contador debe tener una entrada reset
asncrona activa a nivel alto, que pone la cuenta a cero. Describa el comportamiento
del circuito en trminos de una mquina de Moore.
La entity del circuito es:
entity contador is
port( count
clk, reset
end entity contador;
Ejercicio 6.12
Disee un circuito secuencial sncrono capaz de detectar cuando le llega la secuencia "1011" por su entrada. La entity del circuito se muestra a continuacin.
El circuito tiene una seal de reloj (clk), un entrada serie de un bit (x), una seal
de reset asncrona activa en '1' (reset), una seal que indica el estado en que se
encuentra el circuito (state) y una seal de salida de un bit (Y). La seal Y se pone
a '1' si por la entrada X los ltimos 4 bits que han llegado se corresponden con la
secuencia "1011". La mquina no vuelve al estado inicial tras haber reconocido la
457
secuencia, sino que detecta secuencias solapadas. La seal reset pone el circuito
en su estado inicial. Todos los cambios tienen lugar en el flanco de subida de la
seal de reloj. Escriba en VHDL la architecture que describe el comportamiento
del circuito en trminos de una mquina de Moore. Dibuje el diagrama de estados
correspondiente al circuito que ha diseado.
entity detector is
port( Y
out std_logic;
state
out std_logic_vector(2 downto O);
X
in std_logic;
reset
in std_logic;
clk
in std_logic );
end entity detector;
Ejercicio 6.13
Disee usando VHDL un contador binario ascendente y descendente de 4 bits. La
entity del circuito se muestra a continuacin. Las entradas al circuito son: seal de
reloj (Clock), seal de reset asncrono activo a nivel alto (Clear), seal que habilita
la cuenta (Count) y seal para seleccionar si la cuenta es ascendente o descendente
(Down). El circuito tiene una seal de 4 bits de salida de datos (Q).
entity udcounter is
port ( Q
out std_logic_vector(3 downto O);
Clock
in std_logic;
Clear
in std_logic;
Count
in std_logic;
Down
in std_logic );
end udcounter;
Mientras Clear vale 'O' y Count vale '1 ', en cada flanco de subida de la seal de
reloj el contador se incrementa o decrementa en uno. Se incrementa si Down vale 'O'
y se decrementa si Down vale '1 '.
Mientras Clear vale 'O' y Count vale 'O', el valor de la cuenta se mantiene
constante.
458
Ejercicio 6.14
Seal
r1
r2
g1
g2
y1
y2
Significado
Pone el semforo
Pone el semforo
Pone el semforo
Pone el semforo
Pone el semforo
Pone el semforo
1
2
1
2
1
2
en
en
en
en
en
en
rojo
rojo.
verde.
verde.
amarillo.
amarillo.
459
Estado
RG
RY
GR
YR
yy
Tiempo
timeRG (30 s)
timeRY (5 s)
timeGR (45 s)
timeYR (5 s)
Salida
r1
r1
g1
y1
y1
'1''
'1''
'1',
'1',
'1''
g2
y2
r2
r2
y2
'1'
'1'
'1'
'1'
'1'
1
1
1
reseti
1
Una vez realizado el diseo del circuito controlador en VHDL, programe un banco
de pruebas para comprobar que funciona correctamente.
460
Ejercicio 6.15
Entrada
minuto
Significado
Incrementa el contador de tiempo de cocc1on en 60 seg. En
cualquier momento se puede apretar este botn para aumentar
el periodo de coccin.
Inicia la marcha del horno siempre que el tiempo de coccin sea
mayor que O.
Si el microondas se encuentra en estado de coccin, cuando esta
seal est a '1' se detiene la marcha del horno. Si se activa esta
seal cuando el horno no est en estado de coccin se resetea el
tiempo de coccin.
Segn su valor sea '1' 'O' indica si la puerta del microondas
est abierta o cerrada. Abrir la puerta en el periodo de coccin
interrumpe la coccin. Abrir la puerta cuando la alarma est
activada la desconecta.
Reloj de entrada con periodo de 125 ms.
Seal asncrona para resetear el sistema.
marcha
stop_Reset
puerta
clk
reset
Salida
segundos(9 ... 0)
calentar
luz
alarma
Significado
Indjr>an a una pantalla el nmero de segundos de coccin restantes.
La 1dificacin es binaria, por lo que se pueden programar hasta
10"' seg.
Cu do est a '1' el horno calienta.
e;,, :lo est a '1' enciende la luz interna del horno.
io est a '1' suena la alarma. La alarma debe sonar cuando
E.
.npo de coccin llegue a O despus de que el horno ha estado
ttando. La alarma se debe desconectar cuando se abre la
e
p 'ta del horno.
-------------------
461
Estado
PuertaAbierta
PuertaCerrada
Coccion
AlarmaActivada
Significado
Microondas parado con la puerta abierta. Las seales de salida tienen los siguientes valores: calentar = O, luz = 1 y alarma = O
Microondas parado con la puerta cerrada. Las seales de salida tienen los siguientes valores: calentar = O, luz = O y alarma = O
El microondas est cociendo. Las seales de salida tienen los
siguientes valores: calentar = 1, luz = 1 y alarma = O
La alarma se encuentra activa. Las seales de salida tienen los
siguientes valores: calentar = O, luz = O y alarma = 1.
reset ,
~ stop_Reset
uerta
stop_Reset
t_alarma=O
462
6.10.
-- Latch D
-- Fichero: latclL.D. vhd
Library IEEE;
use IEEE. std_logic_1164. all;
463
entity bp_latch_D is
end entity bp_latch_D;
architecture bp_latch_D of bp_latch_D is
signal
Q
: std_logic;
-- Salidas UUT
signal
D, Enable : std_logic;
-- Entradas UUT
component latch_D is
port ( Q
: out std_logic;
D, Enable : in std_logic ) ;
end component latch_D;
-- Procedimiento para comprobar las salidas de la latch
procedure comprueba_salidas
std_logic;
( esperado_Q
actual_Q
:
std_lo⁣
error_count
: inout integer) is
begin
if ( esperado_Q / = actual_Q ) then
report "ERROR: Estado esperado (" &
std_logic' image( esperado_Q)
"), estado actual ("
&
std_logic' image( actual_Q)
"), instante: "
& time' image(now);
error count := error_count
+ 1;
end if;
end procedure comprueba_salidas;
begin
uut : component latch_D port map
(Q, D, Enable);
gen_ vec_ test : process is
variable error _count : integer := O; -- Nm. errores
begin
report "Comienza la simulacin";
-- Vectores de test y comprobacin del resultado
-- 10ns
D <= '0'; Enable <= '0';
wait for 10ns;
Enable <= '1 ';
wait for 5ns;
-- 15ns
comprueba_salidas( 'O' ,Q,error_count );
-- 25ru;
D <= '1'; Enable <= '0';
wait for 10ns;
Enable <= '1 ';
wait for 5ns;
-- 30ns
comprueba_salidas(' 1 ',Q,error_count);
Enable <= '0';
-- Informe final
if (error_ count = O) then
report "Simulacin finalizada sin errores";
else
report "ERROR: Hay " & integer' image(error_count) &
end if;
wait;
-- Final del bloque process
end process gen_vec_test;
end architecture bp_latch_D;
"errores.";
&
&
___
... --''
@reset__:~
Figura 6.20: Diagrama de estados del flip-flop RS.
entity flipflopRS is
port ( q, notq
: out std_logic;
el k, R, S, reset_n: in std_logic);
end entity flipflopRS;
architecture flipflopRS of flipflopRS is
signal q_interna: std_logic;
begin
q <= q_interna;
notq <= not q_interna;
process(reset_n, clk)
variable aux: std_logic;
begin
if (reset_n = 'O') then
aux := '0';
elsif (rising_edge( clk)) then
if (R='1' and S='O') then
aux := '0';
elsif (R= 'O' and S=' 1 ') then
aux:='1';
end if;
end if;
q_interna <= aux;
end process;
end architecture flipflopRS;
BERGARA
entity bp_flipflopRS is
end entity bp_flipflopRS;
architecture bp_flipflopRS of bp_flipflopRS is
constant PERIODO : time := 100 ns; -- Reloj
signal q, notq : std_logic; -- Salidas UUT
signal clk : std_logic := 'O'; -- Entradas UUT
signal R, S, reset_n : std_logic;
component flipflopRS is
port ( q, notq
: out std_logic;
clk, R, S, reset_n : in std_logic );
end component flipflopRS;
-- Procedimiento para compmbar las salidas del flip-flop
procedure comprueba_salidas
( esperado_q : std_logic;
actual_q, actual_q_n : std_logic;
error _count : inout integer) is
begin
-- Comprueba q
if ( esperado_q /= actual_q ) then
report "ERROR: Estado esperado (" & std_logic'image(esperado_q) &
"), estado actual (" & std_logic' image(actual_q) &
"), instante: " & time' image(now);
error_count := error_count + 1;
end if;
-- Comprueba q_n
if ( (not esperado_q) /= actual_q_n ) then
report "ERROR: q_n esperado (" & std_logic' image((not esperado_q)) &
"),valor actual (" & std_logic'image(actual_q_n) &
"), instante: " & time' image(now);
error_count := error_count + 1;
end if;
end procedure comprueba_salidas;
begin
-- Instanciar y conectar UUT
uut : component flipflopRS port map (q, notq, clk, R, S, reset_n);
reset_n
clk
466
11
errores.
11
467
-- Flip fiop D con entradas Enable, set and clear. Fichero: FFD_Enable_SeLClear.vhd
library IEEE;
use IEEE. std_logic_1164. all;
entity FFD is
port(Q
: out std_logic;
Clock, Enable, Set, Clear, D : in std_logic);
end entity FFD;
architecture FFD of FFD is
begin
process(Clock, Set, Clear)
begin
if Set = ' 1 ' then
Q <= '1';
elsif Clear = ' 1' then
Q<='O';
elsif (rising_edge(Clock)) then
if (Enable =' 1') then
Q <= D;
end if;
end if;
end process;
end architecture FFD;
Cdigo VHDL 6.21: Diseo de un flip-flop D con seales enable, set y clear.
468
entity bp_FFD is
end entity bp_FFD;
architecture bp_FFD of bp_FFD is
constant PERIODO
signal
Q
signal
Clock
signal
Enable, Set, Clear, D
:time
:= 100 ns; -- R eloj
-- Salidas UUT
: std_logic;
: std_logic := 'O'; -- Entradas UUT
: std_logic;
component FFD is
port ( Q
: out std_logic;
Clock, Enable, Set, Clear, D : in std_logic );
end component FFD;
-- Procedimiento para comprobar las salidas del fiip-fiop
procedure comprueba_salidas
( esperado_q
std_logic;
actual_q
std_logic;
error_count
: inout integer) is
begin
-- Comprueba q
if ( esperado_q /= actual_q ) then
report "ERROR: Estado esperado ("
& std_logic'image(esperado_q)
&
"),estado actual ("
& st<Llogic'image(actual_q)
&
"),instante:"
& time'image(now);
error count := error_count + 1;
end if;
end procedure comprueba_salidas;
begin
uut : component FFD port map ( Q, Clock, Enable, Set, Clear, D );
Clock <= not Clock after (PERIOD0/2);
gen_vec_test : process is
variable error _count : integer := O; -- Nm. errores
begin
report "Comienza la simulacin";
-- Vectores de test y comprobacin del resultado
Set <= '1'; Clear <= '0'; Enable <= '0'; D<='1'; --1
wait for PERIODO; comprueba_salidas(' 1', Q, error_count);
Set <= '0'; Clear <= '0'; Enable <= '1'; D<='O'; --2
wait for PERIODO; comprueba_salidas('O', Q, error_count);
Set <= '0'; Clear <= '0'; Enable <= '0'; D<='1'; --3
wait for PERIODO; comprueba_salidas('O', Q, error_count);
Set <= '0'; Clear <= '0'; Enable <= '1'; D<='1'; --4
wait for PERIODO; comprueba_salidas(' 1 ', Q, error_count);
Set <= 'O'; Clear <= '1'; Enable <= '1'; D<=' 1 '; --5
wait for PERIODO; comprueba_salidas( 'O', Q, error _count );
report "Num. errores: Hay " & integer'image(error_count) & " errores.";
wait;
-- Final del bloque process
end process gen_vec_test;
end architecture bp_FFD;
469
Cdigo VHDL 6.23: Package en el cual se definen las constantes del diseo del contador
ascendente mdulo 4.
470
471
-- CompTueba q
&
&
&
&
&
&
&
begin
<=
(q,
Cdigo VHDL 6.25: Parte inicial del banco de pruebas del contador ascendente mdulo 4.
472
gen_vec_test : process ~
variable error _count : integer := O; -- Nm. errores
begin
report 11 eomienza la simulacin 11 ;
-- VectoTes de test y comprobacin del resultado
e <= 'O';
wait for PERIODO;
-- 1
comprueba_salidas(SO, q, error_count);
e <= '1';
wait for PERIODO;
-- 2
comprueba_salidas(S1, q, error_count);
e <= 'O';
wait for PERIODO;
-- 3
comprueba_salidas(S1,q, error_count);
e <= '1';
wait for PERIODO;
-- 4
comprueba_salidas(S2, q, error_count);
e <= 'O';
wait for PERIODO;
-- 5
comprueba_salidas(S2 ,q, error_count);
e <= '1';
wait for PERIODO;
-- 6
comprueba_salidas(S3, q, error_count);
e <= 'O';
wait for PERIODO;
-- 7
comprueba_salidas(S3, q, error_count);
e <= '1';
wait for PERIODO;
-- 8
comprueba_salidas(SO, q, error_count);
-- Informe final
if (error_count =o) then
report 11 Simulacin finalizada sin errores 11 ;
else
report 11 ERROR: Hay 11
&
integer'image(error_count ) &
11
errores. 11 ;
end if;
wait;
-- Final del bloque process
end process gen_vec_test;
end architecture bp_contador _Mod_ 4;
Cdigo VHDL 6.26: Parte final del banco de pruebas del contador ascendente mdulo 4.
473
e Ql + Ql QO +e Ql QO
e QO +e QO
Dl
DO
State(l)
Ql
State(O)
En el diseo del contador se han empleado puertas lgicas bsicas (AND, ORe
inversor) y 2 fiip-fiops D (uno por cada variable de estado). Los fiip-flops D usados
son activos en el flanco de subida de la seal del reloj y tienen una entrada reset
asncrona activa a nivel bajo.
Tabla 6.6: Tabla de transicin de estados del contador ascendente mdulo 4.
Estado actual
Ql QO
Entrada
e
Prximo estado
DI DO
Salida
State(l : O)
o o
o o
o 1
o 1
1 o
1 o
o o
o 1
o 1
1 o
1 o
o o
o o
o 1
o 1
1 o
1 o
1
1
1
1
o
1
o
1
o
1
1
1
1
1
o o
1 1
1 1
474
Q1
not_1
Q1_n
: :~-+-- - - - - - - - - - - - ,
~ ............... . . .i
QO
e
...r
QO_n
: .......1... ! - - - - - - - - - - - - ,
g __<
~---1-f--f--+-i!-,----.,1\
t.........................J
and 2
1-f---+--+--!-!"'-f"'"'"""""""'"!
or 1
;= .. .......;
;............ .......;
L. ..~... .!
and_3
:-=~ yand_3
c_n
state(1)
r-
yor_2
'-----+--+J_,'LJ.iyan~=~ ()~"'f
~+>
l
;. . . . . . . .
hd...
CLAN
:..:::<:::... ,
'--c-lo_c_k-------t~---!""""iC~~~~ yan1~---
:::::::::::::::::::
reset
::::::::::::::::::::
not_3
:.:
reset_n
!. ... ~ ......... !
475
476
El Cdigo VHDL 6.28 es el diseo del generador de seal. Obsrvese que el valor
de la seal de salida wave se asigna en el flanco de subida de la seal de reloj.
Esto supone que al sintetizar el circuito se inferir un flip-flop, cuya finalidad ser
almacenar el valor de esta seal. No resultara adecuado que la salida del generador
de seales fuera directamente la salida de un circuito combinacional, ya que no deben
producirse glitches en la salida de un generador de seales.
-- Paquete con la definicin de las constantes globales. Fichero: STATE_CONST.vhd
library IEEE;
use IEEE. std_logic_1164. all;
package STATE_CONST is
constant STATE_BITS: integer := 3;
-- Bits codifican estado
constant SO: std_logic_vector(2 downto o) := 11 000 11 ; --Estados
constant S1: std_logic_vector ( 2 downto O) : = 11 00 1 11 ;
constant S2: std_logic_vector(2 downto O) := 11 010 11 ;
constant S3: std_logic_vector ( 2 downto O) : = 11 O11 11 ;
constant S4: std_logic_vector(2 downto O) := 11 100 11 ;
constant S5: std_logic_vector(2 downto O) .- 11 101 11 ;
constant S6: std_logic_vector(2 downto O) .- 11 110 11 ;
constant S7: std_logic_vector ( 2 downto O) . - 11 111 11 ;
end package;
---Generador de seal implementado como mquina de estados. Fichero: generadorOnda. vhd
library IEEE;
use IEEE. std_logic_1164. all;
use work. STATE_CONST. all;
entity generador is
port(wave : out std_logic;
clk : in std_logic);
end entity generador;
architecture fsm of generador is
signal state : std_logic_vector(STATE_BITS-1
begin
--Clculo del prximo estado
proximo_estado: process (clk)
begin
if (rising_edge( clk)) then
case state is
when SO => state <= S1; wave <=
when S1 => state <= S2; wave <=
when S2 => state <= S3; wave <=
when S3 = > state <= S4; wave <=
when S4 = > state <= S5; wave <=
when S5 => state <= S6; wave <=
when S6 = > state <= S7; wave <=
when others = > state <= SO; wave
end case;
end if;
end process proximo_estado;
end architecture f sm;
downto O);
'O';
'1';
'O';
'1';
'1';
'1';
'O';
<=
'O';
477
entity bp_generador is
end entity bp_generador;
architecture bp_generador of bp_generador is
constant PERIODO
: time
:= 100 ns; -- Reloj
signal
wave
: std_logic; -- Salida UUT
signal
clk
: std_logic := 'O'; -- Entrada UUT
component generador is
port ( wave : out std_logic;
clk : in std_logic);
end component generador;
begin
-- Instanciar y conectar UUT
uut : component generador port map (wave,
clk
clk);
478
Solucin al Ejercicio 6. 7
Un posible diseo del divisor de frecuencias por 3 se muestra en el Cdigo
VHDL 6.30. En este cdigo existen dos bloques process, uno de ellos es sensible a
los flancos de subida de la seal de reloj y a la seal resetn, mientras que el otro
bloque es sensible a los flancos de bajada de la seal de reloj y a la seal resetn.
En el primero de estos bloques se genera una seal, llamada rise, y en el segundo
una seal denominada f al l. Estas dos seales tienen un sexto de la frecuencia de la
seal clk y un cierto desfase entre ambas, de modo que en el semiperiodo en que la
seal rise tiene valor '1' la seal fall tiene valor 'O' la mitad del tiempo y despus
pasa a tener valor '1 '.
La seal clk3 se genera haciendo la operacin lgica XNOR de las seales rise
y fall.
479
else
r _cnt := r _cnt
end if;
end if;
end process;
+ 1;
else
f_cnt := f_cnt
end if;
end if;
end process;
+ 1;
480
48 1
482
Cdigo VHDL 6.32: Fragmento inicial del diseo del circuito especificado en el Ejercicio 6.9.
483
--------Maquina de estados 2
proximo_estado2:process (clk)
begin
if (falling_edge( clk)) then
case internal_state2 is
when one =>
internal_state2 <= two;
when two =>
internal_state2 <= three;
when three =>
internal_state2 <= one;
end case;
end if;
end process proximo_estado2;
salida2:process (internal_state2)
begin
case internal_state2 is
when one =>
temp_out2 <= '1';
when two =>
temp_out2 <= '1';
when three =>
temp_out2 <= 'O';
end case;
end process salida2;
out1 <= temp_out1;
out2 <= temp_out2;
out3 <= temp_out 1 and temp_out2;
end gen;
Cdigo VHDL 6.33: Fragmento final del diseo del circuito especificado en el Ejercicio 6.9.
Cdigo VHDL 6.34: Banco de pruebas del diseo del circuito especificado en el Ejercicio 6.9.
484
Figura 6.24: Diagrama de estados del circuito detector de una secuencia 3 unos o ms consecutivos.
Figura 6.25: Orden en que el programa de test recorre los arcos del circuito detector de una
secuencia 3 unos o ms consecutivos.
485
--Clculo salida
salida: process ( internal_state) is
begin
case internal_state is
when 11 00 11 = > Y <= '0';
when 11 01 11 =>Y <= '0';
when 11 10 11 = > Y < = '0';
when others = > Y <= '1 ';
end case;
end process salida;
--Calculo del proximo estado
proximo_estado: process (clk, reset)
begin
if (reset = '1 ') then --reset asncrono
internal_state <= 11 00 11 ;
elsif (rising_edge( clk)) then
case internal_state is
when 11 00 11 = >
-- Estado actual: 00
if X = ' 1 ' then
internal_state <= 11 01 11 ;
el se
internal_state < = 11 00 11 ;
end if;
when 11 01 11 = > --Estado actual: 01
if X = ' 1 ' then
internal_state < = 11 10 11 ;
el se
internal_state < = 11 00 11 ;
end if;
when 11 10 11 = > --Estado actual: 10
if X = ' 1 ' then
internal_state <= 11 11 11 ;
el se
internal_state < = 11 00 11 ;
end if;
when 11 11" = > -- Estado actual: 11
if X = ' 1 ' then
internal_state < = 11 11 11 ;
el se
internal_state < = 11 00 11 ;
end if;
when others= > -- Por completitud
internal_state < = 11 00 11 ;
end case;
end if;
end process proximo_estado;
end architecture detector;
Cdigo VHDL 6.35: Diseo del detector de una secuencia 3 unos o ms consecutivos.
486
487
begin
-- Instanciar y conectar UUT
uut : component detector port map
(Y, state, X, reset, clk);
reset
<=
Cdigo VHDL 6.37: Continuacin del diseo del banco de pruebas del detector de una secuencia
3 unos o ms consecutivos.
488
489
library IEEE;
use IEEE. std_logic_1164. all;
entity contador is port(
count
out std_logic_vector(3 downto O);
clk, reset :
in std_logic);
end entity contador;
architecture contador of contador is
signal internal_state: std_logic_vector(3 downto O);
begin
count < = internal_state;
490
entity bp_contador is
end entity bp_contador;
architecture bp_contador of bp_contador is
constant PERIODO
: time
:= 100 ns; -- Reloj
signal
q
: std_logic_vector(3 downto 0);-- Salidas UUT
signal
clk
: std_logic := 'O';
-- Entradas UUT
signal
reset : std_logic;
component contador is
port ( count
: out std_logic_vector(3 downto O);
clk, reset : in std_logic );
end component contador;
-- Procedimiento pam compro bar las salidas
procedure comprueba_salidas
( esperado_q
std_logic_vector( 3 downto O);
actual_q
std_logic_vector(3 downto O);
error_count
: in out integer) is
begin
-- Comprueba q
if ( esperado_q /= actual_q ) then
report "ERROR: Estado esperado ("
&
std_logic' image( esperado_q(3))
&
std_logic' image( esperado_q(2))
&
std_logic' image( esperado_q( 1))
&
std_logic ' image (esperado_ q (O))
&
"), estado actual ("
&
std_logic' image( actual_q(3))
&
std_logic' image(actual_q(2))
&
std_logic' image ( actual_q ( 1))
&
std_logic' image ( actual_q (O))
&
"), instante: 11
&
time' image ( now);
error count := error _count + 1;
end if;
end procedure comprueba_salidas;
Cdigo VHDL 6.39: Diseo del banco de pruebas del contador BCD.
491
begin
-- Instanciar y conectar UUT
uut : component contador port map
(q, clk, reset);
<=
Cdigo VHDL 6.40: Continuacin del diseo del banco de pruebas del contador BCD.
492
reset
'O'
'O'
'1'
493
-- Clcv,lo salida
begin
case internal_state is
when "100" = > Y<= '1';
when others = > Y <= '0';
end case;
end process salida;
494
Cdigo VHDL 6.42: Continuacin del diseo del detector de la secuencia "1011".
495
entity bp_detector is
end entity bp_detector;
architecture bp_detector of bp_detector is
constant PERIODO
: time
:= 100 ns; --Reloj
signal
state
: std_logic_vector(2 downto 0);-- Salidas UUT
signal
Y
: std_logic;
signal
clk
: std_logic := 'O';
-- Entradas UUT
signal
reset, X : std_logic;
component detector is
port ( Y
: out std_logic;
state : out std_logic_vector(2 downto O);
X
: in std_logic;
reset : in std_logic;
clk
: in std_logic);
end component detector;
-- Procedimiento para comprobar las salidas
procedure comprueba_salidas
( esperado_state
std_logic_vector(2 downto O);
actual_state
std_logic_vector(2 downto O);
esperado_ Y
std_logic;
actual Y
std_logic;
error count
inout integer) is
begin
-- Comprueba state
if ( esperado_state / = actual_state ) then
report "ERROR: Estado esperado ("
&
std_logic' image( esperado_state(2))
&
std_logic' image( esperado_state( 1))
&
std_logic' image( esperado_state(O))
&
"), estado actual ("
&
std_logic' image(actual_state(2))
&
std_logic' image ( actual_state ( 1))
&
std_logic' image ( actual_state (O))
&
"), instante: "
&
time' image(now);
error count := error_count + 1;
end if;
-- Comprueba Y
if ( esperado_Y /= actual_Y ) then
report "ERROR: Salida Y esperada ("
&
std_logic' image (esperado_ Y)
&
"), salida actual ("
&
std_logic' image (actual_ Y)
&
&
"), instante: "
time ' image ( now);
error count := error_count + 1;
end if;
end procedure comprueba_salidas;
Cdigo VHDL 6.43: Diseo del banco de pruebas del detector de la secuencia "1011".
496
begin
-- lm;tanciar y conectaT UUT
uut : component detector port map
(Y, state, X, reset, clk);
reset
<=
Cdigo VHDL 6.44: Continuacin del diseo del banco de pruebas del detector de la secuencia
"1011".
497
498
499
begin
-- Inst an ciar y conectar UUT
uut : component udcounter port map
(Q, Clock, Clear, Count, Down);
Clear
<=
Cdigo VHDL 6.47: Continuacin del diseo del banco de pruebas del contador binario
ascendente y descendente de 4 bits.
500
Cdigo VHDL 6.48: Package con la definicin de las constantes y parte inicial del diseo del
controlador de dos semforos.
501
y1
g2
<=
<=
'0';
'1';
y1
g2
<=
<=
'0';
'0';
y1
g2
<=
<=
'0';
'0';
y1
g2
<=
<=
'1';
'0';
y1
g2
<=
<=
'1';
'0';
Cdigo VHDL 6.49: Parte final del diseo del controlador de dos semforos.
502
entity bp_ctrl_semaforo is
end entity bp_ctrl_semaforo;
architecture bp_ctrl_semaforo of bp_ctrl_semaforo is
signal
z
: std_logic_vector(5 downto O);
-- Salidas UUT
signal
clk
: std_logic .- 'O';
-- Entradas UUT
signal
reset : std_logic;
component ctrl_semaforo is
port ( r1, r2, y1, y2, g1, g2
clk, reset
end component ctrl_semaforo;
: out std_logic;
: in std_logic ) ;
Cdigo VHDL 6.50: Parte inicial del banco de pruebas del controlador.
503
sem~foros
begin
-- Instanciar y conectar UUT
uut: component ctrLsemaforo port map (z(5), z(4), z(3), z(2), z(1), z(O),clk, reset);
reset <= 'O',
'1' after (PERIOD0/4),
'O' after (PERIODO+PERIOD0/4);
clk <= not clk after (PERIODO /2);
gen_vec_test : process is
variable error_count : integer := O; -- Nm. errores
begin
report "Comienza la simulacin";
-- Vectores de test y comprobacin del resultado
wait for PERIODO; -- 1
comprueba_salidas ( "00 1100", z, error_count);
wait for PERIODO; -- 2
comprue ba_salidas (" 100100", z, error_count);
wait for timeRY*PERIODO; -- 3
comprueba_salidas("010010", z, error_count);
wait for timeGR *PERIODO; -- 4
comprueba_salidas("011000", z, error_count);
wait for timeYR*PERIODO; -- 5
comprueba_salidas(" 100001 ", z, error_count);
wait for timeRG*PERIODO; -- 6
comprueba_salidas(" 100100", z, error_count);
-- Informe final
if ( error_count = O) then
report "Simulacin finalizada sin errores" ;
else
report "ERROR: Hay"
&
integer'image( error_count) &
"errores.";
end if;
wait;
-- Final del bloque process
end process gen_vec_test;
Cdigo VHDL 6.51: Parte final del banco de pruebas del controlador.
504
505
package microondas_CONST is
constant PERIODO
: time
constant ALARMAT
: integer
constant SESENTASEC
: integer
constant UNSEC
: integer
constant TMAX
: integer
type estadoMicro is
:=
:=
:=
:=
:=
<=
true;
Cdigo VHDL 6.52: Package con la definicin de las constantes y parte inicial del diseo del
controlador del microondas.
506
end if;
if stop_Reset = '1' then resetTimer < = true;
else resetTimer < = false ;
end if;
when puertaCerrada = >
if puerta = '1' then
internal_state < = puertaAbierta;
end if;
if t_coccion> O and marcha = '1' then
internal_state < = coccion;
end if;
if stop_Reset = '1' then resetTimer < = true ;
else resetTimer < = false;
end if;
when coccion = >
if puerta = '1' then
internal _state < = puertaAbierta;
end if;
if t_coccion=O then
internal_state < = alarmaActivada;
resetTimer < = true; reset_alarma < = false;
end if;
if stop_Reset = '1' then
internal_state < = puertaCerrada;
end if;
when alarmaActivada = >
if puerta = ' 1' then
internal_state < = puertaAbierta;
reset _alarma < = true ;
end if;
if t_alarma = (ALARMAT-1) then
reset_alarma < = true;
internal_state < = puertaCerrada;
end if;
if stop_Reset = '1' then
resetTimer < = true ;
el se
resetTimer < = false ;
end if;
end case;
end if;
end process proximo_estado;
Cdigo VHDL 6.53: Continuacin del diseo del controlador del microondas.
507
Cdigo VHDL 6. 54: Parte final del diseo del controlador del microondas.
508
reset
stop_Reset
t_alarma=O
Figura 6.27: Transiciones en el estado realizadas durante el test del circuito controlador del
microondas.
509
entity bp_microondas is
end entity bp_microondas;
architecture bp_microondas of bp_microondas is
signal
calentar, luz, alarma : std_logic;
-- Salidas UUT
signal
segundos: std_logic_vector(9 downto O); -- Salidas UUT
-- Entradas UUT
signal
clk : std_logic := 'O';
signal
reset, minuto, marcha : std_logic;
-- Entradas UUT
signal
stop_Reset, puerta : std_logic;
-- Entradas UUT
component microondas is
port( segundos
: out std_logic;
calentar, luz, alarma
: in std_logic;
reset, minuto, marcha
stop_Reset, puerta, clk : in std_logic);
end component microondas;
procedure comprueba -- Procedimiento para comprobar las salidas
( esperado_segundos: integer;
esperado_luz, esperado_alarma, esperado_calentar : std_logic;
actual_segundos: std_logic_vector(9 downto O);
actual_luz, actual_alarma, actual_calentar
std_logic;
error_count : inout integer) is
variable e_seg: integer range O to 1023;
begin
if ( esperado_luz /= actual_luz ) then -- Comprueba luz
report "ERROR: Luz esperada (" & std_logic' image(esperado_luz) &
"), luz actual (" & std_logic' image(actual_luz)
&
"), instante: "
& time' image(now);
error_count := error_count
+ 1;
end if;
if ( esperado_alarma / = actual_alarma) then -- Comprueba alarma
report "ERROR: Alarma esperada (" & std_logic' image( esperado_alarma) &
"), alarma actual (" & std_logic' image(actual_alarma)
&
"), instante: " & time' image(now);
error count := error_count
end if;
+ 1;
Cdigo VHDL 6.55: Banco de pruebas del diseo del controlador del microondas.
510
Cdigo VHDL 6.56: Continuacin del banco de pruebas del controlador del microondas.
511
report
"Finaliza la simulacin con " & integer' image( error _count) &
"errores."; -- Informe final
wait;
-- Final del bloque process
end process gen_ vec_ test;
end architecture bp_microondas;
Cdigo VHDL 6.57: Parte final del banco de pruebas del controlador de microondas.
512
TEMA
METODOLOGA DE
TRANSFERENCIA ENTRE REGISTROS
7.1. Introduccin
7.2. Operaciones de transferencia entre registros
7.3. Mquinas de estado finito con camino de datos
7.4. Descripcin del programa RT usando VHDL
7.5. Circuito detector de secuencia
7.6. Control de una mquina expendedora
7. 7. Lecturas recomendadas
7.8. Ejercicios de autocomprobacin
7.9. Soluciones de los ejercicios
OBJETIVOS DOCENTES
Una vez estudiado el contenido del tema y realizados los ejercicios prcticos,
debera saber:
- Discutir los conceptos siguientes: operaciones RT , notacin RT, programa RT
y metodologa RT.
- Discutir el ciclo de ejecucin de una operacin RT.
- Discutir los principios fundamentales de la programacin RT.
- Dado un algoritmo , traducirlo a un programa RT.
- Describir usando VHDL programas RT sencillos y programar bancos de pruebas para testear estos diseos.
- Discutir los conceptos fundamentales de la sntesis de programas RT mediante
FSMD. En particular, discutir la estructura general de la FSMD, cmo se
realiza la sntesis del camino de datos y por qu la unidad de control puede
sintetizarse como una FSM.
515
7.1.
INTRODUCCIN
El comportamiento de los sistemas se describe frecuentemente mediante algoritmos. Es decir, mediante una secuencia de acciones o pasos, que deben ejecutarse
para resolver un problema o realizar una tarea. Dos caractersticas bsicas de los
algoritmos son, por una parte, el empleo de variables, que sirven para almacenar los
resultados intermedios de los clculos, y por otra parte, la ejecucin secuencial de
las acciones. Es decir, los pasos de un algoritmo se ejecutan uno tras otro, siguiendo
un orden bien establecido.
La metodologa de transferencia entre registros (metodologa RT) permite describir de manera algortmica el comportamiento del hardware. En esta metodologa, los
registros se emplean para almacenar los datos intermedios, desempeando de esta
forma el mismo papel que juegan las variables en los algoritmos.
En la notacin RT ( Register Transfer), todas las operaciones son descritas como la
transferencia de datos de uno o ms registros, a otro registro. Durante la transferencia de los datos, stos pueden transformarse mediante operaciones combinacionales
aritmticas y lgicas, desplazamientos, etc.
Por lo general, la sntesis de este tipo de descripciones da lugar a circuitos secuenciales, si bien en algunos casos sencillos puede dar lugar a circuitos combinacionales.
En este tema nos centraremos en el diseo de programas RT para sntesis de circuitos
secuenciales sncronos con camino de datos. En estos circuitos cabe distinguir dos
partes (vase la Figura 7.1):
El camino de los datos, que consiste en componentes, tanto combinacionales
como secuenciales, que almacenan, combinan y manipulan los datos. Entre los
componentes que tpicamente forman parte del camino de datos se encuentran
los registros, los sumadores, los multiplexores, etc.
- La lgica de control, que consiste en la lgica necesaria para generar las seales
de control que controlan todos los componentes del camino de datos. Puede
tratarse de una FSM del tipo que se explic en el Captulo 6, con la lgica
combinacional necesaria para generar las seales de control correspondientes
a cada estado.
El camino de datos enva seales de status (que indican el estado de determinados
datos) a la lgica de control, que a su vez enva seales de control al camino de datos,
basadas en la seales de status recibidas y en el propio estado interno de la lgica
de control.
517
Lgica de
control
Figura 7.1: Circuito secuencial sncrono con lgica de control y camino de datos.
Resumiendo lo anterior, llamamos a esta metodologa de implementacin metodologa de transferencia entre registros porque un algoritmo es transformado en una
secuencia de acciones que especifican cmo los datos son manipulados y transferidos
entre registros. Una implementacin RT tpica incluye un camino de datos y la lgica
de control. Este tipo de circuito, consistente en una mquina de estado finito (FSM)
a la que se ha aadido el camino de datos, se denomina FSMD (FSM con un camino
de Datos).
7.2.
7.2.1.
Operacin RT bsica
rdest
f-
donde los registros situados en el lado de la derecha son los registros origen de los
datos (r origl, r orig2, ... , r origN), la funcin f representa la operacin a realizar, y el
registro situado en el lado de la izquierda es el registro destino (r dest), en el cual se
almacena el resultado de la operacin.
En resumen, esta notacin significa que el nuevo valor de r dest se calcula evaluando
f ( r origl, r orig2, ... , r origN), y que el resultado Se almacena en r dest en el siguiente
flanco de subida de la seal de reloj. Obsrvese que la notacin f - no existe en
VHDL. Se emplea nicamente para representar la operacin RT.
518
Sentencia VHD L
X <= Y;
X <= O;
X<= (others => '1');
<= 1;
X <= X slr 1;
X
X <= X ror 4;
X<= M( 16#C2# );
X <= Y or Z;
X <= Y and Z;
X <= Y xor Z;
X <= not Y;
X <= -Y;
X <= Y + Z;
X <= Y - Z;
X<= (e and Y) or ((note) and Z);
X <= Y when e else Z;
if (e) then X <= Y; else X <= Z;
Operacin RT
Transfiere el contenido de Y a X
Guarda en X el valor decimal O
Pone todos los bits de X al valor '1'
Guarda en X el valor decimal 1
Desplaza el contenido de X un bit
hacia la derecha e introduce el valor
'O' en el bit ms significativo (MSB)
Desplaza el contenido de X cuatro
bits hacia la derecha de manera
circular
Transfiere a X el contenido del elemento C216 (elemento 194w) de M
X+-- Y or Z
(or bit a bit)
X+-- Y and Z
(and bit a bit)
X+-- Y xor Z
(xor bit a bit)
X +-- complemento a 1 de Y
X +-- complemento a 2 de Y
X+-Y+Z
X+-Y-Z
X+-- (e and Y) or (e and Z)
Equivalente a la anterior
Equivalente a la anterior
519
7.2.2.
Programa RT
520
Paso 1.
Paso 2.
fact<15:0> <- 1;
fin <- O;
num <- 2;
if (num <= n) then begin
fact <- fact * num;
num <- num + 1 ;
go to Paso 1;
end 1* if *1
fin <- 1;
Sin embargo, ambas versiones del Paso 1 son equivalentes, ya que en la sentencia
fact <- fact
num;
se utiliza el valor antiguo de num. Esto es debido a que las sentencias de un paso se
ejecutan concurrentemente y por ello el orden en que estn escritas es indiferente.
521
7.3.
7.3.1.
Un programa RT consiste en varios pasos y, en general, un determinado registro puede ser cargado con diferentes datos en diferentes pasos del algoritmo. Por
ejemplo, el registro r 1 puede ser cargado con el valor O en el paso de inicializacin,
seguidamente puede sumarse su contenido al del registro r 2 en un paso de suma, y
finalmente puede incrementarse su contenido. As pues, hay tres operaciones RT que
usan el registro r 1 como registro destino:
rl
rl
r1
r1
+ r2;
+ 1;
1-----~d
.-------1:>
Sefiales de control
-____;>~,------J
ft
q
clk - - - - - - - - - - - 0
f2
522
posibilidades, es necesario emplear un circuito multideseado hasta la entrada del registro r 1 . El diagrama
Figura 7.2. Se puede escoger la operacin RT deseada
a la seal de seleccin del multiplexor.
7.3.2.
Como hemos indicado anteriormente, el camino de datos realiza todas las operaciones RT del algoritmo. Ahora bien, es necesario disponer de un mecanismo para
especificar cundo y qu operaciones RT deben realizarse. Esta es la finalidad de la
lgica de control.
7.3.3.
523
CAMINO DE DATOS
~-------------------------~------------------------,
D atos de
entrada
Conexionado
de
..,. enrutamiento
____.
Unidades
funcionales
Conexionado
de
enrutamiento
____. d
Datos d e
salida ..
-,
Registros
de datos
t>
l..------.
Lcricapara
o
Comandos
y
obtener el
externos
-----+--o-~ siguiente estado
r--t
Seal de control
Lgica para
obtener la
~
salida
q 1--o-~,
Registro
de estado
Seal de
status
externa
...
LGICA DE CONTROL
524
7.4.
525
Paso
o.
Paso 1.
Paso 2.
Inicializa variables;
while (true) do begin
Paso 1 del algoritmo;
Paso 2 del algoritmo;
Paso k.
Paso m.
Paso n.
end
Paso k+1.
Paso k+x.
end
526
1*
*1
when k =>
i <= O; -- Inicializacin
when k + 1 =>
. .. --Paso 1 dentro del bucle
when k + x =>
. .. --Paso x dentro del bucle
if (i < max) then
state <= k + 1;
end if;
i <= i + 1;
package DEFS is
constant FUNCION 1 : integer := z;
=>
del Paso 1 de la funcin FUNCION_1
+ 1 =>
del Paso 2 de la funcin FUNCION_1
527
7.5.
Para ilustrar cmo puede realizarse una descripcin VHDL de alto nivel a partir
de una descripcin algortmica RT, consideraremos nuevamente el diseo de un
circuito detector de patrones en una secuencia de bits.
Supongamos que deseamos disear un circuito para la deteccin de la siguiente
secuencia de entrada serie: O111 111 O (esta secuencia de emplea frecuentemente
como marcadora de final de paquete). El siguiente programa RT permite resolver
este problema:
Paso O.
Paso 1.
528
std_logic;
std_logic;
std_logic;
std_logic ) ;
el se
detectado
<=
'0';
end if;
end if;
end process;
end architecture detector_sec1;
architecture detector _sec2 of detector _sec is
signal prev_data : unsigned (7 downto O);
begin
process (reset_n, clk) is
begin
if (reset_n = 'O') then
prev_data
<=
B"1111_1111";
else
detectado
<=
'0';
end if;
end if;
end process;
end architecture detector _sec2;
Cdigo VHDL 7.2: Dos diseos de un circuito detector de la secuencia 0111 1110.
529
7.6.
Entrada
m10
m20
m50
devolucin
selec_agua
selec_refresco
Descripcin
Introducida moneda de 10 cntimos.
Introducida moneda de 20 cntimos.
Introducida moneda de 50 cntimos.
Solicitud de devolucin del dinero.
Seleccin de producto: una botella de agua.
Seleccin de producto: una lata de refresco.
En la Tabla 7.3 se muestran algunas de las seales de salida del circuito. Las
seales dispensa_refresco, dispensa_aguay devuelve_cambio se usan para controlar
la entrega al cliente de una lata de refresco, una botella de agua, y del dinero que
ha introducido en la mquina y aun no ha gastado (es decir, del cambio).
La seal beep sirve para indicar al cliente que no ha introducido dinero suficiente
para comprar el producto que ha seleccionado. Por tanto, esta seal se activa cuando
el cliente selecciona un producto sin haber introducido el dinero suficiente para
comprarlo.
En la seal total, de 5 bits, se lleva la cuenta del dinero que ha introducido el
cliente en la mquina y que todava no ha gastado.
530
Seal
total
beep
devuelve_moneda
dispensa_refresco
dispensa_ agua
devuelve_ cambio
Descripcin
Dinero total introducido por el cliente.
Se activa cuando el cliente selecciona el producto
sin haber introducido dinero suficiente.
Se activa para devolver la ltima moneda introducida, si esta moneda hace que se exceda el
dinero total mximo que acepta la mquina.
Dispensa una lata de refresco.
Dispensa una botella de agua.
Devuelve el dinero restante.
7.6.1.
Protocolo de handshaking
531
4. Al ver el circuito B que el circuito A ha puesto req=' O', entonces pone ack=' O',
quedando as preparado para la recepcin del siguiente dato.
5. Finalmente, el circuito A debe esperar hasta que ack=' O' para enviar el siguiente dato y poner de nuevo req=' 1 ' (que es nuevamente el primer paso del
protocolo).
7.6.2.
Entrada
miO
m20
m50
devolucin
selec_agua
selec_refresco
data
"001"
"010"
"101"
"100"
"011"
''000"
Al observar req=' 1', el circuito decodifica la seal de 3 bits data para determinar
la accin solicitada, realiza las acciones solicitadas y a continuacin, usando la seal
ack, notifica que ya ha realizado la accin solicitada.
7.6.3.
532
total<4:0> <- O;
beep <- O;
dispensa_refresco <- O;
devuelve_cambio <- O;
ack <- O;
devuelve_moneda <- O;
dispensa_agua <- O;
MAX <- 31;
Paso 2.
Paso 3.
Paso 4.
ack <- O;
devuelve_moneda <- O;
dispensa_agua <- O;
end
beep <- O;
dispensa_refresco <- O;
devuelve_cambio <- O;
533
package maqExpend_defs is
constant TOTAL_BITS : integer := 5; -- Bits del registro total
constant MAX
: integer := 31; -- Num. mx. en el registro total
constant ESTADO_BITS : integer := 2; -- Bits del estado de la mquina
constant DATA_BITS
: integer := 3; -- Bits de la seal data
constant DATA_m10
: unsigned(DATA_BITS-1 downto O) :=
constant DATA_m20
: unsigned(DATA_BITS-1 downto O) :=
constant DATA_m50
: unsigned(DATA_BITS-1 downto O) :=
constant DATA_devolucion
: unsigned(DATA_BITS-1 downto O) :=
constant DATA_selec_agua
: unsigned(DATA_BITS-1 downto O) :=
constant DATA_selec_refresco : unsigned(DATA_BITS-1 downto O) :=
end package maqExpend_defs;
11
001 11 ;
010 11 ;
11
101 11 ;
11
100 11 ;
11
011";
11
000 11 ;
11
Cdigo VHDL 7.3: Package con la definicin de las constantes del circuito de la mquina
expendedora.
534
entity maquinaExpend is
port ( total
ack
beep
devuelve_moneda
dispensa_refresco
dispensa_ agua
devuelve_ cambio
req
data
reset_n
el k
end entity maquinaExpend;
<=
total_int;
ack
<= '0';
beep
<= '0';
devuel ve_moneda
<= 'O';
dispensa_refresco <= 'O';
dispensa_agua
<= '0';
devuelve_ cambio
<= 'O';
estado
<= "00"; --Estado inicial
elsif rising_edge( clk) then
estado <= estado
1; -- Actualiza estado para el siguiente pulso de reloj
case estado is
-- Los pasos del algoritmo se codifican como estados
when "00"
if (req
=>
'0') then
estado
<=
"00";
end if;
Cdigo VHDL 7.4: Entity y comienzo de la architecture del circuito de control de la mquina
expendedora.
535
el se
total_int
<=
<=
'1';
total_int
end if;
when DATA_selec_refresco =>
if (total_int < 6) then
beep
else
<=
data;
'1';
end if;
when DATA_selec_agua =>
if (total_int < 7) then
beep
else
<=
'1';
end if;
when DATA_devolucion =>
total_int <= (others = > '0');
devuelve_cambio
<=
'1';
end if;
when others
=>
ack
beep
devuel ve_moneda
dispensa_refresco
dispensa_agua
devuelve_cambio
<=
<=
<=
<=
<=
<=
'0';
'0';
'O';
'O';
'0';
'0';
Cdigo VHDL 7.5: Continuacin del diseo del circuito de control de la mquina expendedora.
536
7.6.4.
537
entity bp_maquinaExpend is
end entity bp_maquinaExpend;
architecture bp_maquinaExpend of bp_maquinaExpend is
component maquinaExpend is
port ( total
: out unsigned(TOTAL_BITS-1 downto O);
ack
: out std_logic;
beep
: out std_logic;
devuel ve_moneda
: out std_logic;
dispensa_refresco : out std_logic;
dispensa_agua
: out std_logic;
devuelve_cambio
: out std_logic;
req
: in std_logic;
data
: in unsigned(DATA_BITS-1 downto O);
reset_n
: in std_logic;
el k
: in std_logic ) ;
end component maquinaExpend;
constant PERIODO : time := 100 ns; -- Periodo seal de Teloj
signal
signal
signal
signal
signal
signal
signal
signal
signal
signal
signal
total
ack
beep
devuelve_moneda
dispensa_refresco
dispensa_ agua
devuelve_ cambio
req
data
reset n
clk
:
:
:
:
:
:
:
:
:
:
:
begin
uut : maquinaExpend port
map ( total, ack ,beep, devuelve_moneda,
dispensa_refresco, dispensa_agua,
devuelve_cambio, req, data, reset_n, clk );
-- Crea un pulso de reset
reset_n <= '1',
'O' after (PERIOD0*3/ 4),
'1' after (2*PERIODO);
Cdigo VHDL 7.6: Banco de pruebas del circuito de control de la mquina expendedora.
538
begin
req
<=
'0';
data
<=
<=
'0');
<=
<=
<=
'1'; data
<=
<=
'1'; data
<=
<=
<=
<=
<=
<=
'1'; data
<=
<=
'1'; data
<=
<=
'1'; data
<=
wait;
Cdigo VHDL 7.7: Continuacin del banco de pruebas del circuito de la mquina expendedora.
539
7.7.
LECTURAS RECOMENDADAS
El Captulo 11 de (Chu 2006) describe el diseo de circuitos siguiendo la metodologa RT, mediante el empleo de diagramas ASMD (diagrama ASM con camino
de datos), y en el Captulo 12 se desarrollan varios casos de estudio.
El Captulo 5 de (Lee 2006) proporciona informacin adicional acerca del diseo
aplicando la metodologa RT, as como ejemplos de diseo detallados, como es el
caso de un controlador LCD.
En (Perry 2002) puede encontrarse un ejemplo de diseo de relativa complejidad usando VHDL: una pequea CPU, compuesta de un array de registros, una
AL U, varios registros (de desplazamiento, contador de programa, de direccin y de
instruccin), un comparador y una unidad de control.
Tambin en (Lee 2006) pueden encontrarse diseos completos de relativa complejidad: un analizador de protocolo USB, varias unidades aritmticas rpidas y un
microprocesador RISC.
540
7.8.
EJERCICIOS DE AUTOCOMPROBACIN
Ejercicio 7.1
Escriba el programa RT correspondiente al diseo de un termostato digital:
un circuito que enciende y apaga un sistema de aire acondicionado y un sistema
calentador, con el fin de mantener la temperatura de una habitacin dentro de un
cierto rango determinado de valores.
Supongamos que el circuito termostato tiene un registro de 8 bits llamado temp ,
que almacena la temperatura a la que se encuentra actualmente la habitacin, y
otro registro de 8 bits llamado consigna, que almacena el valor de consigna para la
temperatura de la habitacin. El valor del registro consigna cambia cuando el usuario
ajusta el valor deseado de la temperatura. El valor almacenado en el registro temp
va refrescndose con las medidas tomadas de la temperatura de la habitacin. La
actualizacin de los valores de estos dos registros no es tarea del termostato.
El circuito termostato tiene dos seales digitales de salida, calentador _on y
ac_on, que actan sobre los sistemas de calefaccin y aire acondicionado, respectivamente. Cuando la seal calentador_on se pone a '1', se enciende el sistema
calentador. Cuando se pone a 'O', se apaga. Igualmente, cuando la seal ac_on se
pone a '1', se enciende el sistema de aire acondicionado. Cuando se pone a 'O', se
apaga. El termostato usa estas dos seales para actuar sobre el sistema calentador
y de aire acondicionado.
El funcionamiento del circuito termostato debe ser el siguiente. El controlador
pone a '1' la correspondiente seal cuando la diferencia entre la temperatura de la
habitacin y la temperatura de consigna excede de un determinado valor umbral,
umbral, que es una constante de diseo. Es decir, cuando la temperatura de la
habitacin es mayor que el valor de consigna ms el valor umbral, el controlador
enciende el aire acondicionado. Igualmente, cuando la temperatura de la habitacin
es menor que el valor de consigna menos el umbral, el controlador enciende el sistema
calentador.
Por otra parte, si cuando est encendido el sistema calefactor la temperatura de
la habitacin supera la temperatura de consigna, entonces el termostato debe apagar
el sistema calefactor. Igualmente, si el sistema de aire acondicionado est encendido
y la temperatura de la habitacin se hace inferior al valor de consigna, entonces el
termostato debe apagar el sistema de aire acondicionado.
541
Ejercicio 7.2
Escriba un programa RT que describa la operacin de multiplicacin de dos
nmeros binarios sin signo de 8 bits. Emplee 3 registros de desplazamiento (A,
B, P) y un contador descendente ( count). Los registros de desplazamiento A y B,
de 8 bits, almacenan los operandos (multiplicando y multiplicador). El registro de
desplazamiento P, de 16 bits, almacena el resultado de los clculos intermedios y el
resultado final del producto.
Indique el nmero de estados que deber tener la lgica de control del circuito
FSMD resultante. Asimismo, indique el nmero de flip-flops D que resultarn de la
sntesis de la lgica de control.
Ejercicio 7.3
Disee en VHDL un circuito que, dados dos nmeros de entrada de 4 bits (opA
y opB), calcule su mximo comn divisor empleando el algoritmo de Euclides. El
circuito debe tener una seal reset asncrona y una seal de salida, fin, para indicar
que se ha obtenido el mximo comn divisor de los dos nmeros.
El algoritmo de Euclides del clculo del mximo comn divisor es el siguiente:
Paso O.
Paso 1.
Paso 2.
542
a
<- opA;
<- opB;
b
fin <- O;
if (b=a) then begin
result <- b;
else if(b > a) then begin
b <- (b- a);
goto Paso 1
else if (b < a) then begin
a<- (a- b);
go to Paso 1
end 1* if *1
fin<- 1;
Ejercicio 7.4
Disee en VHDL un circuito que calcule la media aritmtica de 4 nmeros de
entrada de 4 bits. El circuito debe tener una seal reset asncrona y una seal de
salida, fin, para indicar que se ha obtenido el resultado.
Ejercicio 7.5
En los circuitos lgicos digitales se emplean diferentes cdigos binarios. En ocasiones, dos circuitos que usan diferente cdigo necesitan comunicarse entre s, siendo
preciso emplear otro circuito para realizar la conversin de un cdigo a otro. Como
ejemplo de este tipo de circuitos conversores de cdigo, en este ejercicio se propone
realizar el diseo de un conversor para nmeros en cdigo BCD de longitud fija a
cdigo binario.
En el cdigo BCD ( binary-coded decimal), cada grupo de cuatro bits consecutivos
es convertido a un dgito decimal. El nmero completo es interpretado como un
nmero decimal compuesto por estos dgitos decimales. Por ejemplo, 0101 1001BcD
es interpretado como 59 10 , ya que los primeros cuatro bits (0101) corresponden a
un 5 decimal y los ltimos cuatro bits (1001) corresponden a un 9 decimal. El
equivalente binario al nmero 59 10 es 00111011 2 . El circuito descrito en esta seccin
debe realizar la conversin de 0101 1001BcD a 0011 1011 2 .
El algoritmo siguiente realiza la conversin de cdigo BCD a binario:
Paso 1.
Paso 2.
Paso 2a.
Paso 2b.
Paso 3.
543
Ejercicio 7.6
El seudo cdigo mostrado a continuacin calcula z = xY (x elevado a la potencia
y), dados los dos nmeros x e y binarios sin signo de 8 bits. Se supone que el
resultado z es tambin un nmero de 8 bits, ignorndose las excepciones debidas al
rebosamiento.
Paso 1.
Paso 2.
Paso 3.
11 Inicializacin
expo <- y;
base <- x;
if (start)
if (x==O)
resultado <- O;
go to Paso 3;
else if (y==O)
resultado <- 1;
go to Paso 3;
el se
resultado <- 1;
go to Paso 2;
end if;
end if;
11 Repeticin de las multiplicaciones
resultado <- resultado * base;
expo--;
if (expo==O)
go to Paso 3;
el se
go to Paso 2;
end if;
11 Almacena el resultado
z <- resultado;
go to Paso 1;
Disee usando VHDL un circuito cuyo comportamiento venga descrito por este
seudocdigo. A continuacin, programe un banco de prueba que aplique al circuito
los tres vectores de test siguientes:
Test 1: x = O, y= l. Valor esperado: z =O.
Test 2: x = 1, y= O. Valor esperado: z = l.
Test 3: x = 3, y = 2. Valor esperado: z = 9.
Realice la simulacin e inspeccione visualmente los resultados, para ver si el
circuito funciona correctamente.
544
7.9.
Paso 1b.
Paso 1c.
Paso 1d.
calentador_on <- O;
ac_on
<- O;
while (TRUE) do begin
if ( temp < (consigna-umbral) ) then
calentador_on <- 1;
ac_on
<- O;
else if ( calentador_on and (temp>consigna) ) then
calentador_on <- O;
else if ( temp > (consigna+umbral) ) then
calentador_on <- O;
ac_on
<- 1;
else if ( ac_on and (temp<consigna) ) then
ac_on
<- O;
end if;
end while;
Paso 2.
Paso 2a.
Paso 2b.
A
<- multiplicando;
B
<- multiplicador;
P
<-O; 11 Variable que almacena el resultado
count <- 8; /1 Usada para el bucle for
if ( count > O ) then
P[15:8] <- P[15:8] + ( A[O] and B );
P <- P >> 1; // Desplzto Drcha, Introduce O en P[15]
A <-A >> 1;
count <- count - 1;
go to Paso 2
end if;
545
546
when 1 = >
if (B = A) then
-- In cr-ementa state
-- state codifica los pasos del algor-itmo
result < = B;
fin < = '1';
state < = 2;
el se
A < = std_logic_vector ( signed(A) - signed(B) );
state < = 1;
end if;
when others = >
state < = 2; --Espera a q'ue la seal r-eset sea 1
end case;
end if; -- de r-ising_edge( clk )
end process;
end architecture gcd;
Cdigo VHDL 7.8: Diseo del circuito que calcula el mximo comn divisor de dos nmeros.
547
entity bp_gcd is
end entity bp_gcd;
architecture bp_gcd of bp_gcd is
constant PERIODO : time
:= 100 ns; -- Reloj
signal result
: std_logic_vector (3 downto O);
-- Salidas UUT
signal opA, opB
: std_logic_vector ( 3 downto O);
signal clk
: std_logic := 'O';
-- Entradas UUT
signal reset, fin : std_logic;
component gcd is
port ( result
: out std_logic_vector(3 downto O);
fin
: out std_logic;
opA, opB : in std_logic_vector(3 downto O);
reset,clk : in std_logic);
end component gcd;
begin
uut : component gcd port map
(result, fin, opA, opB, reset, clk);
clk <= not clk after (PERIOD0/2);
process
variable err _cnt: integer :=0 ;
begin
-- caso 1: la salida debera ser 0100
reset<='1'; opA < ="1100"; opB < ="1000";
wait for PERIOD0/3; reset < =' O';
wait for 4*PERIODO;
-- caso 2: la salida debera ser 001 O
reset < ='1'; opA < ="1100"; opB < ="0010";
wait for PERIOD0/3; reset < =' O';
wait for ?*PERIODO;
Cdigo VHDL 7.9: Banco de pruebas del circuito que calcula el mximo comn divisor de dos
nmeros.
548
Sum
R(O)
R(1)
R(2)
R(3)
i <fin
<<<<<-
o'
A'
B'
C;'
D
'
<- O;
Paso 1.
Paso 2.
Paso 3.
goto Paso 3;
El Cdigo VHDL 7.10 es el diseo del circuito que calcula la media de 4 nmeros
de 4 bits.
El Cdigo VHDL 7.11 es el diseo del banco de pruebas del circuito. Obsrvese
que el banco de pruebas testea nicamente dos casos.
549
-- Inicializa state
<= i
end if;
when 3 = >
+ 1;
end case;
end if; -- de rising_edge( clk)
end process;
end architecture media;
Cdigo VHDL 7.10: Diseo del circuito que calcula la media de 4 nmeros de 4 bits.
550
entity bp_media is
end entity bp_media;
architecture bp_media of bp_media is
constant PERIODO : time
:= 100 ns; --Reloj
signal result
: std_logic_vector (3 downto O);
--Salidas UUT
signal A, B, e, D : std_logic_vector (3 downto O);
signal clk
: std_logic := 'O';
-- Entradas UUT
signal reset, fin : std_logic;
component media is
port ( result
: out std_logic_vector(3 downto O);
fin
: out std_logic;
A, B, e, D : in std_logic_vector(3 downto O);
reset,clk
: in std_logic);
end component media;
begin
uut : component media port map
(result, fin, A, B, e, D, reset, clk);
clk <= not clk after (PERIOD0/2);
process
variable err _cnt: integer :=0 ;
begin
-- caso 1: la salida debera ser 0001
reset < ='1'; A< ="0001"; B< ="0001"; e < ="0001"; D< ="0001";
wait for PERIOD0/3; reset < =' O';
wait for 6*PERIODO;
-- caso 2: la salida debeTa seT 001 O
reset < ='1'; A< ="0010"; B< ="0010"; e<="0010"; D< ="0010";
wait for PERIOD0/3; reset<= 'O';
wait for ?*PERIODO;
Cdigo VHDL 7.11: Banco de pruebas del diseo del circuito que calcula la media de 4 nmeros
de 4 bits.
551
Paso 3.
552
Cdigo VHDL 7.12: Package con la definicin de constantes y diseo del conversor de cdigo
BCD a binario.
553
entity bp_bcd_to_bin is
constant MAX_BCD : integer := 9999; -- Valor mximo de entrada
constant DELAY
: time
:= 10ns; -- Retardo usado en el test
end entity bp_bcd_ to_bin;
architecture bp_bcd_ to_bin of bp_bcd_ to_bin is
signal bin: std_logic_vector(LENGTH-1 downto O); -- Salida de UUT
signal bcd: std_logic_vector(LENGTH-1 downto O); -- Entrada a UUT
-- D eclaracin del componente (UUT)
component bcd_to_bin is
port( bin: out std_logic_vector(LENGTH- 1 downto O);
bcd: in std_logic_vector(LENGTH-1 downto O) );
end component bcd_to_bin;
begin
-- Instancia la unidad a testear
UUT : component bcd_to_bin port map(bin,bcd);
-- Genera vectores de test y comprue ba resultados
main: process is
variable temp
: uns igned (LENGTH-1 downto O);
variable digi t
: unsigned (LENGTH-1 downto O); -- Un digito BCD
variable digi ts
: unsigned (LENGTH-1 downto O); -- Todos digitos
variable expected
: unsigned (LENGTH-1 downto O);
variable error _count : integer := O;
-- Nmero de errores
begin
report "Comienza la simulacin.";
-- Generar todos los posibles valores
for i in O to MAX_BCD loop
temp := TO_UNSIGNED(i,LENGTH);
for j in O to (LENGTH/ 4-1) loop
digi t := temp mod 10; -- Obtiene el digito BCD menos significativo
digits(j*4+3 downto j*4) := digit(3 downto O);
temp := temp/10;
end loop;
bcd <= std_logic_vector( digi ts ); -- Asigna vector de test
expected := TO_UNSIGNED(i, LENGTH);
wait for DELAY;
assert ( expected = unsigned(bin))
report "ERROR: Resultado esperado " &
integer' image(TO_INTEGER( expected)) &
", resultado obtenido " &
integer' image(TD_INTEGER(unsigned(bin))) &
" en el instante " & time'image(now);
if ( expected /= unsigned(bin)) then
error_count := error_count + 1;
end if;
end loop;
Cdigo VHDL 7.13: Parte inicial del banco de pruebas del conversor de cdigo BCD a binario.
554
-- Final de la simulacin
Cdigo VHDL 7.14: Parte final del banco de pruebas del conversor de cdigo BCD a binario.
555
Cdigo VHDL 7.15: Package con la definicin de las constantes globales y entity del circuito
exponenciador.
556
** y
557
** y
entity bp_exponen is
constant PERIODO : time := 100 ns; -- Periodo del reloj
end entity bp_exponen;
architecture bp_exponen of bp_exponen is
-- Declaracin de seales para conectar la UUT
signal z
: std_logic_vector (MAX_DATA_BITS-1 downto O);
signal paso
: std_logic_vector (BITS_PAS0-1 downto O);
signal reset_n : std_logic;
signal clk
: std_logic;
signal start
: std_logic;
signal x
: std_logic_vector(MAX_DATA_BITS-1 downto O);
signal y
: std_logic_vector(MAX_DATA_BITS-1 downto O);
-- Declaracin de otras seales
signal fin
: boolean := false;
component exponen is
port ( z
: out std_logic_vector (MAX_DATA_BITS-1 downto O);
paso
: out std_logic_vector (BITS_PAS0-1 downto O);
reset_n : in std_logic; -- Reset asncrono activado LOW
clk
: in std_logic;
start
: in std_logic;
x
: in std_logic_vector(MAX_DATA_BITS-1 downto O);
y
: in std_logic_vector(MAX_DATA_BITS-1 downto O) );
end component exponen;
begin
uut : component exponen
port map (z, paso, reset_n , clk , start, x , y);
-- Pulso de reset
reset_n <= '1',
'O' after (PERIODO/ 4),
' 1 'after (PERIODO + PERIODO/ 4);
-- Seal de reloj
reloj : process is
begin
clk <= 'O'; wait for (PERIOD0/2);
clk <= '1'; wait for (PERIOD0/2);
if (fin) then
wait;
-- Termina este proceso
end if;
end process reloj;
Cdigo VHDL 7.17: Principio del banco de pruebas del circuito exponenciador.
558
Con t. del banco de pruebas del circuito exponen ciacin. Fichero: bp_ exponen. vhd
-- Gen eracin de los vectores de test
genera_ vectores : process is
begin
wait until falling_edge( clk);
-- Test 1: x vale O, y vale 1
x <= (others => '0'); y<= (O=> '1', others => '0');
wait for PERIODO;
start <= '1 '; -- Comienza el clculo x**y
wait until (z = B"OOOO_OOOO"); --Espera hasta obtener z= O
-- Test 2: x vale 1, y vale O
x <=(o => '1', others = > '0'); y < = (others = > '0');
wait for PERIODO;
start <= '1'; -- Comienza el clculo x**y
wait until (z = B"0000_0001"); -- Espera hasta obtener z=1
-- Test 3: :r; vale 0000_0011 , y vale 0000_0010
<= "00000011"; y <= 11 00000010";
wait for PERIODO;
start <= '1'; -- Comienza el clculo x**y
wait until (z = B"0000_1001"); -- Espera hasta obtener z=9
X
-- Final de la simulacin
report "Fin de la simulacin";
fin < = true; -- Finaliza el proceso del reloj
wait;
-- Finaliza est e proceso
end process genera_ vectores;
end architecture bp_exponen;
Cdigo VHDL 7.18: Parte final del banco de pruebas del circuito exponenciador.
+ /bp_exponen/z
+ /bp_exponen/paso
+ /bp_exponen/reset_n
+ /bp_exponen/clk
+ /bp_exponen/start
[J + /bp_exponen/x
[J + /bp_exponen/y
+ /bp_exponen/fin
[J
[J
& ]}
~;o
..!J
101
11
100000000
101
11
].(0000001
lC1
o ..
10
Now
Cursor 1
11
uuuuuuuu 100000000
uuuuuuuu 100000001
100000001
100000000
lCOOOOOll
l:00000010
1 -
true
...t.JJ
1 Ons to 1041 ns
uuuuuuuu
uu
'l
00001001
01
1
1
1
00000011
00000010
l l l l l l l l t l t t l l l l l l l l t t l l l l l l l l t t l l l l l t l l t t l l l l l l t l t t l l l l l l ,,, l l l l l l t l l t t l l l l l l t l t t l l l l l l t l t t l l l l t ,,,,,
1000 ns 1s
200 ns
975 ns
~
-'
1 Now: 1 us
400 ns
600 ns
800 ns
000 ns
~
1
I /
Delta: 1
Figura 7.4: Resultado de la simulacin del banco de pruebas del circuito exponenciador.
559
APNDICE A
VERIBEST VB99.0
A.l. Instalacin
A.2. Edicin y compilacin de un modelo
A.3. Simulacin y visualizacin de los resultados
A.4. Depurado usando el debugger
VERIBEST VB99.0
A.l.
INSTALACIN
mulator.
A.2.
En esta seccin se describe cmo editar y compilar modelos con el simulador VeriBest
VHDL.
A.2.1.
Seleccione el icono VeriBest VHDL del grupo de programas Inicio --+ Programas--+
Veribest VB99.0 --+ Veribest VHDL Simulator.
A.2.2.
Para crear un espacio de trabajo, puede seguir una de las dos opciones siguientes:
l. Despliegue el men "Workspace" y seleccione la opcin "New ... "
563
2. Seleccione el comando "New ... " del men "File". Se mostrar una ventana en
la que tiene que seleccionar la opcin "VHDL Workspace".
Tras seguir una de estas dos opciones, se mostrar una ventana (vase la Figura A.l). Teclee en dicha ventana el nombre del espacio de trabajo, que en este
caso se ha llamado bufferTriestado, y seleccione el directorio en el cual quiere crear
el espacio de trabajo. El path a dicho directorio (Workspace Path) no debe tener
espacios en blanco, ya que en caso de tenerlos se producir un error y no se crear
correctamente el espacio de trabajo.
Workspace Name:
Create
1buffer Trie~tad?
Cancel
Workspace Path:
I BASE\\AfOR~S,~~CEVE"RIBEST\ ,
Help
127 d:\
127 Docencia
127 ETCIII
127 TextoB ase
CJ vbvhdl.chkpt
_ ~ WORKLIB-LVS
A.2.3.
Edicin de un fichero
Puede crearse un nuevo fichero utilizando el comando "New ... " del men "File".
Obtendr una ventana en blanco en la que puede teclear el cdigo VHDL. Escriba el
cdigo que describe el buffer triestado y que se muestra en la Seccin 1.9.1. Una vez
haya concluido, gurdelo con el nombre buffer Triestado. vhd mediante el comando
564
VERIBEST VB99 .0
Command
vbinit .exe
Working 1 ibrary i s : D : '-DOCENCIA '-ETCI I I '-TEXTOBASE'-WORKSPACEVERIBEST'-WORKLIB
Reference to library WORKLIB (physical name : D: '-DOCENCIA'-ETCIII '-TEXTOBASE'-WORKSPACEVERIBEST'-WORKLIB) added
Done
A.2.4.
"+",
situado en la esquina
superior derecha de la ventana del espacio de trabajo bufferTriestado. vpd.
2. O bien, utilice el comando "Add Files into Workspace ... " situado en el men
"Workspace".
Tras realizar este paso obtendr una ventana para la seleccin de un fichero.
Seleccione el fichero bufferTriestado. vhd. La ventana principal del simulador tiene
que quedar tal y como se muestra en la Figura A.3.
565
:. ... [!)
buffer Triestado.vhd
<=
'Z' ;
end if ;
end process ;
end architecture Behavioral ;
A.2.5.
Compilacin de un fichero
Para establecer las opciones de compilacin, seleccionamos la opcin "Settings ... "
del men "Workspace", o bien recurrimos al icono "Workspace Settings" que est
situado en la barra de herramientas. Con ello, se mostrar una ventana, en la cual
seleccionamos la pestaa "Compile". De este modo, accedemos al cuadro de dilogo
donde se muestran, entre otras, las siguientes opciones de compilacin:
566
VERIBEST VB99 .0
. end
,d. :. i ~
:~ti ty
:13tH f e;r:-::,..Tri'E~t,pq
is
begin
H '( E,
;=
~ 1
y ':<= . d;
-'els e:
. Y <:.'
' ), .then.
'
.z: ;.
; lid' if ;
eMtJroqess.:
Figura A.4: Entorno de simulacin tras compilar el fichero buffer Triestado. vhd.
"Debug"
Activando esta opcin el archivo seleccionado ser compilado con la opcin de depuracin. Con esta opcin activa
antes de una compilacin, es posible utilizar todos los
comandos del men Debug durante la fase de simulacin.
Si se desea que todos los archivos del espacio de trabajo
sean compilados con esta opcin, basta con seleccionar la
carpeta del espacio de trabajo en la ventana y activar la
opcin.
"Index Checks"
Si esta opcin se encuentra activa, el compilador comprueba la existencia de errores en los ndices de los arrays.
"Range Checks"
Si esta opcin se encuentra activa, el compilador comprueba la existencia de errores en los rangos de los
subtipos que se hayan definido.
567
.. :::J.::i'L.~.]
~~--;t~~rcir~r~r~r~~~Jfoo -------
~ g-~ --------------------
g ..
IEEE
STO
VB
WORK,WORKLIB
BUFFER_TRIESTADO
i. ..
BEHAVIORAL
f2:l
Biil
BO
fl
Source Location
D C:\VeriBest\vbvhdl\lib93\IEEE
D C:\VeriBest\vbvhdl\lib93\STD
D C:\VeriBest\vbvhdl\lib93\VB
DwoRKLIB
D D:\DOCENCIA\ETCIII\TEXTOBASE\MODELOSVHDL\TUTORIALSIMULADORES\BUFFERTRIESTADO. VHD
D D:\DOCENCIA\ETCIII\TEXTOBASE\MODELOSVHDL\TUTORIALSIMULADORES\BUFFERTRIESTADO. VHD
1Compilation Time
1Ce
l< d.
Couand
Jlllllllllll lt iiiiiii J
Ready
Compile el fichero. Para ello, seleccione el comando "Compile", que est situado
en el men "Workspace". El resultado de la compilacin se muestra en la ventana de
informacin, situada en la parte inferior de la ventana principal (vase la Figura A.4).
Observe que la ventana de informacin contiene las tres pestaas siguientes:
"General"
"Build"
Muestra la informacin referente al proceso de compilacin de ficheros. En el caso de que haya habido errores en
la compilacin muestra la lnea de cdigo donde aparece
cada error y el tipo de error que es.
"Simulate"
568
VERIBEST VB99.0
Se puede reinicializar la librera en la que se est trabajando mediante el comando "Reinitialize Lib environment", que est situado en el men "Workspace". Al
reinicializar la librera, desaparecen de ella las unidades compiladas.
A.2.6.
Banco de pruebas
Una vez editado y compilado el diseo del buffer triestado, debemos editar y compilar
su banco de pruebas. Para ello:
l. Cree un nuevo fichero con el cdigo del banco de pruebas, que se muestra en
la Seccin 1.9.2. Una vez haya concluido, gurdelo en un fichero con el nombre
bp_bufferTriestado. vhd. Recuerde que el path hasta ese fichero no debe contener
espacios en blanco.
2. Incluya el fichero bp_bufferTriestado. vhd en el espacio de trabajo bufferTriestado. vpd. La ventana principal del simulador tiene que quedar tal y como se
muestra en la Figura A.6. El orden de compilacin de un fichero se puede
modificar mediante las flechas situadas en la esquina superior derecha de la
ventana del espacio de trabajo bufferTriestado. vpd.
\ [!)
buffer Triestado.vhd
i - ~ bp_bufferTriestado.vhd
vbinit .exe
Working library i s : D : '-DOCENCIA'-ETCIII '-TEXTOBASE'-WORI<SPACEVERIBEST'-WORI<LIB
Reference to library WORI<LIB (physical name : D: '-DOCENCIA'-ETCIII '-TEXTOBASEWORI<SPACEVERIBEST'-WORI<LIB) added
Done
Figura A.6: Entorno de simulacin tras incluir el banco de pruebas en el espacio de trabajo.
569
A.3.
A continuacin, se describen los pasos a seguir para simular el banco de pruebas del
buffer triestado y para visualizar los resultados de la simulacin.
A.3.1.
BQ
BUFFER TRIESTADO
BEHAVIDRAL
, ..
i \o: Ent1ty/Arch
li
Ei Q
C: Conflg
Set
11
i
BP_BUFFER_TRIESTADO J
: . . BP_BUFFER_TRIESTA91 Entlty. 1~~~B~F~~~:::!RI~~T~D?
1
ji Arch:
I BP_BUFFER_TRI~STADO
~----------------~
R:
....
GJ
Trace On
j Suppress Message:
GJ
~~O~~ GJ
1NO~E __
Additional Options:
~ ~------------------
1!;..:4! ,.
-~~,.,;:::;...~"-'-"-. C~il
570
VERIBEST VB99.0
A.3.2.
Para realizar la simulacin hay que arrancar el simulador. Esto se puede realizar
de dos formas: mediante la opcin "Execute Simulator" del men "Workspace", o
mediante el icono correspondiente, denominado "Execute Simulator", situado en la
barra de herramientas.
Mediante cualquiera de las dos opciones, el simulador se activa. Durante el proceso de activacin del simulador aparecer una ventana de aviso (vase la Figura A.8),
en la que se indica que se est utilizando la versin del simulador que no necesita
licencia. Pulse el botn "Aceptar" para continuar trabajando.
Aceptar
A.3.3.
571
File
Edit
Search
Workspace
Simulate
Debug
Libr ary
Tools
Window
Help
-~~--iJ~T~fr~r:~~iriT:fliJ1r~-;---;~~--------------------------------------------------
~~~~~ l.e.tl
m m
o m
mmmmmm
572
VERIBEST VB99 .0
,f'l y
'li"l! D
. li"l!E
Colll.llland
Gene~al
573
A.4.
Para usar el depurador, es preciso previamente haber compilado los ficheros con la
opcin "Debug" habilitada. Una vez activado el simulador, aparece el men "Debug",
si bien hasta que no se inicie la simulacin no aparecern habilitados todos los
comandos del depurador. Entre los comandos del depurador habilitados antes de
iniciar la simulacin, cabe destacar los siguientes (vase la Figura A.12):
- "Insert/Remove a Breakpoint": permite introducir un punto de ruptura (breakpoint) o eliminar un punto de ruptura introducido previamente.
- "Clear All Breakpoints": elimina todos los puntos de ruptura.
- "New Watch Window": abre una ventana que permite observar la evolucin
de las seales de forma numrica. Esta ventana, mostrada en la Figura A.13,
dispone de hasta cuatro paneles de observacin independientes ("Watchl" a
"Watch4").
Para aadir a uno de los cuatro paneles los elementos a observar, pulse el
botn "Add Watch ... " y obtendr una ventana cuyo ttulo es "Add watch"
(vase la Figura A.13), en la que puede seleccionar, o bien las seales de forma
independiente (se selecciona la seal y se pulsa el botn "Watch"), o bien todas
las seales de un elemento (se selecciona el componente o bloque en la parte
izquierda de la ventana y se pulsa el botn "Watch block").
- "Show Breakpoints": abre una ventana que tiene como ttulo "Breakpoints",
en la que se muestran todos los puntos de ruptura existentes. En la ventana
"Breakpoints" existe un botn denominado "Condition ... " Pulsando este botn
se abre una ventana, denominada "So urce Breakpoint Condition", en la que
se pueden establecer las condiciones de activacin de un punto de ruptura
determinado.
Desde la ventana "So urce Breakpoint Condition", podr indicar que el punto
de ruptura permanezca activo nicamente para una instancia o proceso especfico. De esta forma, cuando se establecen condiciones, el simulador se detiene
nicamente en el punto de ruptura que hay dentro del proceso especificado,
no en todos los procesos en los que est el punto de ruptura.
- "Call stack": permite conocer la prxima lnea de cdigo VHDL que se ejecutar
cuando se contine con la simulacin. Si se realiza doble die sobre una de
las entradas que aparecen en la ventana "Call Stack", se obtendr una nueva
574
VERIBEST VB99.0
lnsert/Remove
a Breakpoint
Clear All Breakpoints
14
15
16
17
18
19.
20
21
22
23
Show
Breakpoi
Examine
Call
NewWatch
Window
Stack
<= d;
el se
y <= 'Z' ;
end if,;
end PrOCSS<;l;
24
576
APNDICE
B .l. Instalacin
B.2. Edicin y compilacin de un modelo
B.3. Simulacin, visualizacin y depurado
B.l.
INSTALACIN
B.2.
En esta seccin se describe cmo editar y compilar modelos con el simulador ModelSim. Para ilustrar las explicaciones, se va a usar el modelo del buffer triestado y su
banco de pruebas, descritos en las Secciones 1.9.1 y 1.9.2 respectivamente.
579
B.2.1.
Seleccione el icono M odelSim PE del grupo de programas Inicio --+ Programas --+
ModelSim PE Student Edition 6.3c --+ ModelSim. Inicialmente aparecer la ventana
de bienvenida. Si desea que no vuelva a aparecer marque la casilla "Don't show
this dialog again". Para cerrar esta ventana y acceder a la aplicacin pulse el botn
"Close".
.:ti
Workspace _ _ _ _ ,;:.;;;
;:j~~;-
...................... . . .
- -::;;;;~ ---J;~;;--
ll-iWJ. mtiAvm
ll-iWJ. sv_std
ll-iWJ. vital2000
ll-iWJ. ieee
Library
(j}:.{tj. modelsimjib
Library
ll-iWJ. std
ll-iWJ. std_developerskit
ll-iWJ. synopsys
Library
ll-iWJ. verilog
Library
- --
$MODEL_TEO
Libr ary
Libr ary
Library
Library
Ubr ary
~ Transcript
Se abrir entonces la ventana principal del entorno (vase la Figura B.l), que
est compuesta por la barra de mens, la barra de iconos y por los dos elementos
siguientes:
580
"Workspace"
"Transcript"
de comandos.
2. Permitir teclear comandos en lnea. Se mantiene un
histrico de todos los comandos ejecutados. Usando
las teclas j y l se puede acceder a comandos
anteriores y posteriores para ejecutarlos de nuevo.
B.2.2.
Creacin de un proyecto
581
!ch_pe_edu_6.3c/modelsim.ini
~ow~ ... 1
Create Simulation
~ Transcrfpt
B.2.3.
582
"Create Simulation"
"Create New Folder"
Para crear un nuevo fichero se pueden usar las opciones de la ventana de dilogo
"Add items to the Project". Se pueden acceder a estas mismas opciones a travs del
men Project - t Add to Project.
583
~ 1
l rFolder
[Top Level
IVHDL
File
Edit
View
Compile
Simulate
Add
Source
Tools
Layout
Window
Help
l iHJ bufferTriestado.vhd 1
"File Name"
Una vez finalizado este proceso, se crea un fichero denominado buffer Triestado. vhd en el directorio del proyecto. En la Figura B.5 se muestra la ventana
principal tras seguir estos pasos. Observe que en la pestaa "Project" del panel
"Workspace" aparece la informacin sobre el fichero creado. La informacin mostrada
es la siguiente:
584
"N ame"
"Status"
"Type"
"Order"
Indica la posicin del fichero en la secuencia de compilacin cuando hay varios ficheros fuente. El primer fichero
de la secuencia de compilacin es aqul con un nmero
menor.
"Modified"
''
ff
r.
~ Cancel !
585
"File Name"
B.2.4.
586
Edit
View
Compile
Simulate
Add
Transcript
Tools
Name
Layout
Window
Help
Path
~
i1HJl.
- E. buffer _triestado
A behavior al
Library
work
Entity
Architecture
Library
$MODEL_TECH/o o/avm
Library
8-1Jl vital2000
Library
$MODEL_TECH/o o/vital2000
~ieee
Library
lJ-1ll modelsim_lib
$MODEL_TECH/o o/ieee
Library
$MODEL_TECH/o o/modelsim_lib
~std
Library
$MODEL_TECH/o o/std
~ std_developerskit
Library
$MODEL_TECH/o o/std_developerskit
mtiAvm
lJ-1ll sv _std
L:!:Hll synopsys
Library
$MODEL_TECH/o o/synopsys
~ verilog
Library
$MODEL_TECH/ .. /verilog
Figura B. 7: Contenido de la librera work tras compilar el fichero buffer Triestado. vhd.
Errores de compilacin
Para describir qu sucede cuando hay errores de compilacin, vamos a modificar el
fichero buffer Triestado. vhd introduciendo intencionadamente un error: eliminamos
el punto y coma final (;) en la sentencia de asignacin siguiente y <= d;
Al guardar el fichero as modificado, su nuevo "status" es ? . Al compilar el fichero,
su "status" cambia a X (vase la Figura B.8), ya que hay un error de compilacin.
Tambin, aparece un mensaje de error en color rojo en el panel "Transcript".
Si se hace doble die sobre este mensaje de error del panel "Transcript", se abre
una ventana de dilogo (Unsuccessful Compile), con informacin sobre el tipo de
error que se ha producido y el nmero de lnea en que aparece.
Si se hace doble die sobre uno de los mensajes mostrados en la ventana Unsuccessful Compile, se abre la ventana de edicin mostrando el cdigo VHDL del
fichero, con la lnea de cdigo que ha producido el error marcada en color naranja
587
standard
Loadinq packaqe std_loqic_ll64
Compilinq entity buffer_triestado
Compilinq archi tecture behavioral of buffer triestado
Error: D: /Docencia/ETCIII/Textf:,Base/lJJorkspa;;el1odelSim/bufferTriestado . vhd ( 16)
"else": expecting ;
Error: D: /Docencia/ETCIII/TextoBase/lJJorkspaceModelSim/bufferTriestado. vhd ( 20)
: VHDL Compiler exitinq
11
(vase la Figura B.8). En este caso, la lnea 16 aparece en color naranja, debido a
que hemos eliminado el smbolo ; que debera aparecer al final de la lnea 15.
B.2.5.
Banco de pruebas
--7
Add to Project
--7
588
Existen ocasiones en que el orden de compilacin de los ficheros, tal como aparece
en la ventana Workspace, no es correcto y debe ser modificado. Por ejemplo, si en
el fichero paquete. vhd se define un paquete, que se usa en el fichero uso_ paquete. vhd,
entonces es necesario compilar antes el fichero paquete. vhd, ya que en caso contrario
se produce un error de compilacin. Puede modificarse el orden de compilacin de
los ficheros del modo siguiente:
l. Site el ratn en el rea del panel "Workspace" y pulse el botn derecho del
589
~ bufferTriestado.vhd
;j bp_butferTnestado .vhd
Auto Generate 1 ~
Cancel 1
590
B.3.
En esta seccin se describen los pasos a seguir para realizar la simulacin y para mostrar los resultados, usando nuevamente el diseo del buffer triestado como
ejemplo.
B.3.1.
Para iniciar el simulador, en la pestaa "Library" se selecciona la entity que queremos simular. En este caso, seleccionamos la entity bp_buffer_triestado. Pulsando
sobre ella con el botn derecho del ratn, se abre un men en el que seleccionamos
"Simulate" (vase la Figura B.ll).
bp_buffer _triestado
GJ-j,l sv _std
GJ-j,l vital2000
GJ-j,l ieee
:.J-Jll modelsim_lib
GJ-j,l std
:.J-Jll std_developerskit
:.J-Jll synopsys
GJ-j,l verilog
Refresh
Recompile
Optimize
Update
Delete
Copy
New
Properties ...
fr1l Project
[.il
Library
591
+acc=v
+acc=v
+acc=v
+acc=v
a)
b)
haciendo clic con el ratn sobre el botn "undocked" (vase la Figura B.13a). Para
volver a insertar el panel en la ventana principal, debe presionarse el botn "docked"
(vase la Figura B.13b).
Usando el men "View", es posible seleccionar qu paneles se hacen visibles. A
continuacin, se comenta brevemente la funcionalidad de algunos de los paneles:
"Datafiow"
"List"
"Process"
"Objects"
"Wave"
592
B.3.2.
593
B.3.3.
Ejecucin de la simulacin
~1
Restart
20
ns
Run Length
iJ
~~[!J!
lll
Run
"Run"
"Continue Run"
594
"Run- All":
"Break"
"Restart"
"Step"
"Step Over"
B.3.4.
595
l. Hacemos clic, con el botn derecho del ratn, en el rea del panel donde se
muestra el cdigo de la unidad de diseo seleccionada.
596
ndice alfabtico
Abierto, 52
Abstraccin, 58
nivel de procesador, 62
nivel de puertas, 60
nivel de RTL, 61
nivel de transistor, 60
Acoplo, 52
CAD, 34
Calidad del test, 54
after, 48, 67, 105, 424
case, 128, 423
Agregacin de vectores, 155
Casting, 161
Algoritmo, 73, 517
Ciclo de diseo, 36
Alta impedancia, 79, 151
Architecture
Codificador, 108, 111, 125, 129, 151, 159
Comentarios, 66
comportamiento, 285, 291
Compilacin, 207
estructura, 293, 437
component, 70
architecture, 65, 95, 102
Componente
comportamiento, 102
estructura, 102
conexin, 72, 136
Declaracin, 135
sintaxis, 103
array, 384
declaracin, 70
instanciacin, 72, 136
Asignacin concurrente, 67, 104, 278, 286
configuration, 78
condicional, 107
constant, 101
de seleccin, 110
simple, 104
Constante, 101, 143
generic, 100, 142, 386
sntesis, 105, 108, 112
Corto, 52
Asignacin secuencial, 117, 122
Coste, 45
a seal, 122
Cdigo VHDL
a variable, 124
assert, 101, 169, 298
anlisis, 206
Atributos, 166
compilacin, 207
ejecucin, 206
597
elaboracin, 206
inicializacin, 206, 211
simulacin, 226
Decodificador, 107, 111, 125, 129, 278,
378
delayed (atributo), 217
Descripcin del hardware
mediante esquemtico, 34
mediante lenguaje, 34
modular y jerrquica, 135
Detector
de paridad, 64, 66, 70, 73, 76, 139
de secuencias, 420, 528
Diagrama
conceptual, 67, 73, 105, 109, 112
de estados, 419
Diseo marginal, 50
Don't care, 151, 159
downto, 192, 284
Driver, 208, 378
Ejecucin
concurrente, 49, 114
Enable, 378, 422
endfile, 372
Entidad de diseo, 95
entity, 65, 95, 97
constant, 101
puerto, 98
sintaxis, 101
error, 169
Estructura, 70
Estndar IEEE
1067-1987 (VHDL'87), 36
1076-1993 (VHDL'93), 36
1076-2001 (VHDL-AMS), 36
1076.6 (VHDL sintetizable), 95
1364-1995 (Verilog), 36
1666-2005 (SystemC), 36
598
NDICE ALFABTICO
Latch, 422
left (atributo), 166
length (atributo), 166
Ley de Moore, 33
library, 150, 168
Libreras VHDL, 167
IEEE.matlLreal, 168
IEEE.numeric_std, 157, 158, 168
IEEE.std_logic_1164, 149, 168
std, 169
work, 169
Lista de sensibilidad, 73, 117, 118, 120,
121, 21 1
low (atributo), 166
concatenacin, 155
paquete IEEE.numeric_std, 158
paquete IEEE.std_logic_1164, 153
precedencia, 14 7
relacional, 154
sobrecarga, 153
others, 156, 376, 449
package, 168, 176, 302, 308, 430, 552
package body, 176
Palabras reservadas, 65
Parametrizacin, 142
Patrn de fallo, 52
port, 98
Procedimiento, 172, 298
Memoria
procedure, 172, 427
Procesamiento del cdigo, 206
de lectura y escritura, 388
de slo lectura, 386
process, 72, 76, 116, 211, 280, 285, 424
Programa de test, 52
Metodologa RT, 517
Modelo de fallo, 52
Programa RT, 520
ModelSim, 79, 579
Protocolo de handshaking, 531
Multiplexor, 107, 111, 125, 129, 136, 139, Puerta
278, 285
AND, 103, 139
Multiplicador, 279
NAND , 278
Mquina de estado finito
NOT, 70, 103, 278
segura, 448
XOR, 70, 103, 133, 278
de Mealy, 419, 439
Puerto, 95, 97
de Moore, 419, 430
in, 98
mtodo de diseo, 419
inout, 98
out, 98
Netlist, 36
next, 132
quiet (atributo), 217
Notacin RT, 517
range (atributo), 166
note, 169
read, 372
now, 163, 298
readline, 372
Octal, 147
Red de prioridad, 109
One-hot encoding, 449
Registro
Operaciones RT, 518
de 4 bits, 35 7
Operador, 147
de desplazamiento, 368
599
entity, 102
multifuncin, 360
register file, 375
triestado, 376
Rendimiento, 52
report, 163, 169, 298
Representacin
comportamiento, 57
estructura, 58
fsica, 58
Reset
asncrono, 121, 425
sncrono, 358, 368, 375, 376, 439
resize, 159
Restador, 291
completo de 1 bit, 291
Retardo, 423
de transporte, 47, 105, 225
della, 49, 69, 105, 219
diseo marginal, 50
inercial, 47, 105, 222
puro, 47
return, 170
Reutilizacin, 70
reverse_range (atributo), 166
right (atributo), 166
rising_edge, 16 7
rotate, 159
Tabla
de la verdad, 64
de transicin de estados, 419
Tecnologa
ASIC, 38
circuitos estndar, 42
comparacin, 42
Sean fiip-fiops, 54
coste, 45
Sensibilidad
CPLD, 41
bloque process, 117
field programmable, 41
Sentencia
FPGA, 38, 41- 43
concurrente, 104, 107, 110, 114, 278,
full-custom ASIC, 39
gate array ASIC, 40, 43
286
secuencial, 117, 122
non-ASIC, 38
PAL, 42
severity, 169
Seal, 143
PLA, 42
activa, 216
PLD, 38, 42
600
NDICE ALFABTICO
potencia consumida, 44
programable en campo, 41
PROM, 42
standard-cell ASIC, 40, 43
velocidad, 44
rea, 43
Test, 51
banco de pruebas, 56
cobertura de fallos, 53
funcional, 54, 55
manufactura, 54
modelo de fallos, 52
modos de fallo, 52
programa, 34
vector, 34, 52
Tipo de datos, 145
atributos, 166
bit, 146
bit_vector, 146
boolean, 146
conversin, 153, 160
definido por usuario, 163
enumerado, 164
integer, 146, 286
operadores, 147
paquete IEEE.numeric_std, 156
paquete IEEE.std_logic_ll64, 149
predefinidos en VHDL, 146
signed, 157
stcLlogic, 150, 151
std_logic_vector, 150, 152
string, 163
time, 163
unsigned, 157
to_integer, 160
to_signed, 161
to_unsigned, 161
Transaccin, 216
transaction (atributo), 217
601
Bibliografa
Graphics
Manual.
Corporation
Software
Version
(2008),
6.3e.
ModelSim
Disponible
LE/PE
en:
http:/ /www.model.com/resources/resources_manuals.asp.
Pardo, F. & Boluda, J. A. (2004) , VHDL, Lenguaje de Sntesis y Modelado de
Circuitos, RA-MA.
603
604