You are on page 1of 604

Los lenguajes para la descripcin del hardware, tales como VHDL, juegan un papel fundamental en el ciclo de diseo de los

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

ALFONSO URQUA MORALEDA


CARLA MARTN VILLALBA

UNIVERSIDAD NACIONAL DE EDUCACIN A DISTANCIA

DISEO Y ANALISIS DE CIRCUITOS DIGITALES CON VHDL


(71 01201 GR01A01)
Quedan rigurosamente prohibidas, sin la
autorizacin escrita de los titulares del
Copyright, bajo las sanciones establecidas
en las leyes, la reproduccin total o
parcial de esta obra por cualquier medio
o procedimiento, comprendidos la reprografa
y el tratamiento informtico, y la distribucin
de ejemplares de ella mediante alquiler
o prstamos pblicos.
Universidad Nacional de Educacin a Distancia

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

Todas nuestras publicaciones han sido sometidas


a un sistema de evaluacin antes de ser editadas
ISBN: 978-84-362-6274-2
Depsito legal: M. 33.404-2011
Primera edicin: septiembre de 2011
Impreso en Espaa - Printed in Spain

NDICE

Prefacio

25

Organizacin de la Uni dad Didctica

25

Cmo utilizar el libro .

26

Objetivos docentes

27

l. Fundamentos del diseo del hardware digital


1.1. Introduccin . . . .

. . . . . . . . . .

1.2. Lenguajes para la descripcin de hardware

29

33
34

1.2.1. Usos de un programa HDL . . .

35

1.2.2. HDL ms ampliamente usados .

35

1.3. Ciclo de diseo de los circuitos digitales .

36

1.4. Tecnologas de circuitos integrados

..

38

1.4.1. Clasificacin de las tecnologas .

39

1.4.2. Comparacin entre tecnologas .

42

1.5. Propiedades de los circuitos digitales

47

1.5.1. Retardo de los dispositivos

47

1.5.2. Ejecucin concurrente

49

1.5.3. Diseos marginales ..

50

1.5.4. Fortaleza de las seales .

50

1.6. Test de los circuitos . . . . .

51

1.6.1. Test en manufactura

52

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

1.6.2. Test funcional . . .

. ..

54

1.6.3. Programas de test funcional

55

1.6.4. Banco de pruebas .

56

. . .

l. 7. Representaciones y niveles de abstraccin .

l. 7.l. Representacin del sistema .

57

1.7.2. Niveles de abstraccin . . .

58

1.7.3. VHDL en el flujo de desarrollo .

63

1.8. Conceptos bsicos a travs de un ejemplo .

63

1.8.1. Comportamiento al nivel de funciones lgicas

64

1.8.2. Descripcin de la estructura . . . . . . . .

70

1.8.3. Descripcin abstracta del comportamiento

72

1.8.4. Banco de pruebas

76

1.8.5. Configuracin ..

78

1.9. Dos simuladores de VHDL'93: VeriBest y ModelSim .

79

l. 9.l. Diseo de un buffer triestado

79

1.9.2. Diseo del banco de pruebas

80

1.10. Lecturas recomendadas .

82

1.11. Ejercicios de autocomprobacin

83

1.12. Soluciones de los ejercicios

87

2. Conceptos bsicos de VHDL

91

2.1. Introduccin . . . .

95

2.2. Unidades de diseo

95

2.3. Entity . . . . . . .

97

2.3.1. Clusula port

57

98

2.3.2. Clusula generic .

100

2.3.3. Declaraciones

101

2.3.4. Sentencias .

101

NDICE

2.3.5. Resumen de la sintaxis de la entity

101

2.4. Architecture . . . . . . . .

102

2.5. Asignaciones concurrentes

104

2.5.1. Asignaciones concurrentes simples .

104

2. 5. 2. Asignaciones concurrentes condicionales

107

2.5.3. Asignaciones concurrentes de seleccin .

110

2.5.4. Sensibilidad de las sentencias concurrentes

114

2.6. Sentencia generate

. . . . . . . . .

115

2.6.1. Sentencia generate iterativa

115

2.6.2. Sentencia generate condicional .

116

2. 7. Bloque process

. . . .

116

2.7.1. Sentencias wait

118

2. 7.2. Lista de sensibilidad

120

2. 8. Cdigo secuencial . . . . . .

122

2.8.1. Asignacin secuencial a una seal

122

2.8.2. Asignacin secuencial a una variable

124

2.8.3. Sentencia if . .

124

2.8.4. Sentencia case .

128

2.8.5. Bucle for . . . .

132

2.9. Descripcin de la estructura

135

2.9.1. Diseos con estructura regular .

139

2.10. Parametrizacin . . . . . . . . . . . . .

142

2.10.1. Parametrizacin del comportamiento

142

2.10.2. Parametrizacin de la estructura

142

2.11. Seales, variables y constantes

143

2.12. Tipos de datos y operadores .

145

2.12.1. Tipos predefinidos en VHDL .

146

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

2.12.2. Tipos del paquete IEEE.std_logic_1164 . . . .

149

2.12.3. Operadores sobre bit_vector y std_logic_vector

154

2.12.4. Tipos del paquete IEEE.numeric_std

156

2.12.5. Tipos time y string . . . . . .

163

2.12.6. Tipos definidos por el usuario

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

2.16.3. Diferencias entre funciones y procedimientos

175

2.17. Paquetes . . . . . . . . .

176

2.18. Lecturas recomendadas .

179

2.19. Ejercicios de autocomprobacin

180

2.20. Soluciones de los ejercicios .

187

3. Simulacin del cdigo VHDL

201

3.1. Introduccin . . . . . . . . .

. 205

3.2. Procesamiento del cdigo VHDL .

. 206

3.3. Orden de compilacin .

. 207

3.4. Drivers . . . .

. 208

3.5. Inicializacin

. 211

10

3.5.1. Ejemplo: seal con un driver .

. 212

3.5.2. Ejemplo: seal con dos drivers

. 213

3.6. Atributos de las seales .

. 216

3.7. El retardo delta . . . . .

. 219

3.8. Gestin de la cola de transacciones del driver .

. 221

NDICE

3.8.1. Ejemplo: simulacin de formas de onda con retardo inercial .. 222


3.8.2. Ejemplo: simulacin de formas de onda con retardo de transporte225
3.9. Ejemplo: simulacin de un circuito sencillo

226

3.10. Lecturas recomendadas . . . .

230

3.11. Ejercicios de autocomprobacin

231

3.12. Soluciones de los ejercicios ..

240

4. Diseo de lgica combinacional

273

4.1. Introduccin .

. ...... .

277

4.2. Diseo para sntesis de lgica combinacional

277

4.2.1. Empleo de sentencias concurrentes

278

4.2.2. Empleo de bloques process

280

4.3. Funciones lgicas

. . .

280

4.3.1. Diseo del circuito

280

4.3.2. Programacin del banco de pruebas

281

4.4. Multiplexor de 4 entradas . . . .

285

4.4.1. Diseo usando sentencias secuenciales .

285

4.4.2. Diseo usando sentencias concurrentes

286

4.5. Restador completo de 1 bit . .

. . .

291

4.5.1. Descripcin del comportamiento .

291

4.5.2. Descripcin de la estructura

293

4.5.3. Programacin del banco de pruebas

296

4.6. Sumador completo de 1 bit .

301

4.6.1. Diseo del circuito

302

4.6.2. Banco de pruebas

302

4. 7. U ni dad aritmtico lgica

306

4.7.1. Diseo de la ALU .

306

4. 7.2. Programacin del banco de pruebas

308

11

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

4.8. Lecturas recomendadas . . . . .

. 313

4.9. Ejercicios de autocomprobacin

314

4.10. Soluciones de los ejercicios

321

5. Registros y memorias
5.1. Introduccin . . .

357

5.2. Registro de 4 bits

357

5.2.1. Descripcin del comportamiento .

358

5.2.2. Banco de pruebas

358

5.3. Registro multifuncin ..

360

5.3.1. Descripcin del comportamiento .

361

5.3.2. Banco de pruebas ..

364

5.4. Registro de desplazamiento .

368

5.4.1. Descripcin del comportamiento .

368

5.4.2. Banco de pruebas . . . . . . . . .

369

5.4.3. Banco de pruebas con acceso a fichero

371

5.5. Register file . . . . . . . .

375

5.5.1. Registro triestado .

376

5.5.2. Descripcin estructural del register file

378

5.5.3. Drivers y funcin de resolucin

378

5.5.4. Banco de pruebas del register file

380

5.5.5. Descripcin del comportamiento del register file

384

5.6. Bus bidireccional y memorias

12

353

386

5.6.1. Memoria de slo lectura

386

5.6.2. Memoria de lectura y escritura

388

5.6.3. Bus bidireccional

389

5.7. Lecturas recomendadas .

391

5.8. Ejercicios de autocomprobacin

392

NDICE

5.9. Soluciones de los ejercicios .. . . . . . . . . . . . . . . . . . . . . . . 397


6. Diseo de lgica secuencial

415

6 .l. Introduccin . . . . . . . .

. 419

6.2. Diseo de mquinas de estado finito .

. 419

6.2.1. Circuito detector de secuencias

. 420

6. 3. Sntesis de lgica secuencial . . . . . .

. 422

6.3.1. Sentencias condicionales incompletas

. 423

6.3.2. Sentencias condicionales completas

. 423

6.3.3. Retardos . . .

. 423

6.3.4. Inicializacin

. 424

6.3.5. Bloques process

. 424

6.4. Flip-flop JK . . . . . .

. 425

6.4.1. Diseo del flip-flop

. 426

6.4.2. Banco de pruebas .

. 426

6.5. Mquinas de estado finito de Moore .

. 430

6.5.1. Diseo de la mquina.

. 430

6.5.2. Banco de pruebas . .

. 433

6.5.3. Modelado estructural

. 437

6.6. Mquinas de estado finito de Mealy

. 439

6.6.1. Diseo de la mquina .

. 439

6.6.2. Banco de pruebas . . .

. 445

6. 7. Mquinas de estado finito seguras

. 448

6.8. Lecturas recomendadas . . . . .

. 451

6.9. Ejercicios de autocomprobacin

. 452

6.10. Soluciones de los ejercicios . . .

. 463

7. Metodologa de transferencia entre registros

513

13

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

7 .1. Introduccin . . . . . . .

. . . .

. . .

7.2. Operaciones de transferencia entre registros

. 517
518

7.2.1. Operacin RT bsica

518

7.2.2. Programa RT . . . .

. 520

7.3. Mquinas de estado finito con camino de datos .

. 522

7.3.1. Mltiples operaciones RT y camino de datos

. 522

7.3.2. Lgica de control mediante FSM

. 523

...

7.3.3. Diagrama de bloques bsico de la FSMD

. 523

7.4. Descripcin del programa RT usando VHDL

. 525

7.5. Circuito detector de secuencia

. 528

7.6. Control de una mquina expendedora .

. 530

7.6.1. Protocolo de handshaking

. 531

7.6.2. Descripcin del algoritmo

. 532

7.6.3. Diseo del circuito de control

. 532

7.6.4. Programacin del banco de pruebas

. 537

7. 7. Lecturas recomendadas . . . ..

. 540

7.8. Ejercicios de autocomprobacin

. 541

7.9. Soluciones de los ejercicios . .

. 545

APNDICES

561

A. VeriBest VB99.0

561

A.l. Instalacin . .

. 563

A.2. Edicin y compilacin de un modelo.

. 563

14

A.2.1. Arranque del simulador VeriBest VHDL

. 563

A.2.2. Creacin de un espacio de trabajo .

. 563

A.2.3. Edicin de un fichero . . . . . . . .

. 564

A.2.4. Aadir un fichero al espacio de trabajo

. 565

NDICE

A.2.5. Compilacin de un fichero

566

A.2.6. Banco de pruebas . . . . .

569

A.3. Simulacin y visualizacin de los resultados .

570

A.3.1. Establecer las condiciones de la simulacin

570

A.3.2. Activacin del simulador . . . . . . . . . .

571

A.3.3. Simulacin y visualizacin de los resultados

571

A.4. Depurado usando el debugger . . . . . . . . . . . .

574

B. ModelSim PE Student Edition

577

B .l. Instalacin . . . . . . . . . . .

579

B.2. Edicin y compilacin de un modelo.

579

B.2.1. Arranque del simulador .

580

B.2.2. Creacin de un proyecto

581

B.2.3. Aadir ficheros al proyecto .

582

B.2.4. Compilacin de los ficheros .

586

B.2.5. Banco de pruebas . . . . ..

588

B.3. Simulacin, visualizacin y depurado

591

B.3.1. Activacin del modo simulacin

591

B.3.2. Visualizacin de los resultados .

593

B.3.3. Ejecucin de la simulacin . . .

594

B.3.4. Insercin de puntos de ruptura

595

15

CDIGO VHDL

1.1. Entity del circuito detector de paridad. . . . . . . . . . . . . . . . . 66


1.2. Architecture del detector de paridad describiendo el comportamiento mediante la funcin lgica. . . . . . . . . . . . . . . . . . . . . . . 66
1.3. Architecture del detector de paridad describiendo el comportamiento mediante la funcin lgica xor. . . . . . . . . . . . . . . . . . . . . 69
1.4. Puerta inversora. Puerta XOR con dos entradas. Architecture del
detector de paridad describiendo la estructura del circuito. . . . . . . 71
1.5. Architecture del detector de paridad descrita mediante una red XOR. 74
1.6. Architecture del detector de paridad descrita mediante un algoritmo. 75
1.7. Banco de pruebas del detector de paridad. . . . . . . . . . . . . . . . 77
1.8. Configuration para la simulacin del banco de pruebas del detector
78
de paridad. . . . . . . . . . . . . . . .
1.9. Buffer triestado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
1.10. Banco de pruebas del buffer triestado. . . . . . . . . . . . . . . . . . . 81
1.11. Diseo del circuito de control de la alarma de seguridad de un coche. 86
1.12. Diseo alternativo del circuito de control de la alarma de seguridad
86
de un coche. . . . . . . . . . . . . . . . . . . . . . . . . .
2.1. Circuito detector de paridad. . . . . . . . . . . . . . . . . . .
96
2.2. Cdigo incorrecto, que produce un error de compilacin. . .
99
2.3. Descripcin correcta del circuito mostrado en la Figura 2.3. .
100
2.4. Multiplexor de 4 entradas de 8 bits. .
107
2.5. Decodificador binario de 2 entradas. .
108
2.6. Codificador 4 a 2 con prioridad. . . .
108
111
2.7. Multiplexor de 4 entradas de 8 bits. .
2.8. Decodificador binario de 2 entradas. .
112
2.9. Codificador 4 a 2 con prioridad. . . .
112
2.10. Biestable D con reset asncrono activado al nivel LOW.
121
2.11. Multiplexor de 4 entradas de 8 bits. .
125
2.12. Decodificador binario de 2 entradas. .
126
126
2.13. Codificador 4 a 2 con prioridad. . .
2.14. Multiplexor de 4 entradas de 8 bits. .
129

17

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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.

Descripcin del comportamiento de un restador completo de un bit.


292
Diseo de las puertas lgicas XOR2, NOT1, AND2 y OR3. . . .
294
Descripcin de la estructura de un restador completo de un bit. . . 295
Banco de pruebas del restador completo de un bit. . . . . . . . . . . 297
Banco de pruebas del restador completo de un bit usando un procedimiento. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
Banco de pruebas del restador completo de un bit usando una funcin.300
Diseo de las puertas lgicas AND2, OR3 y XOR2 con retardo.
303
Package con los componentes del sumador y diseo del sumador. . . 304
Banco de pruebas del sumador completo . . . . . . . . . . . . . . . . . 305
U so de package para la definicin de constantes, y diseo de la AL U
mediante una asignacin concurrente y un bloque process. . . . . . . 307
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 ALU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
Fragmento del banco de pruebas de la ALU: definicin del procedure
check_ALU. . . . . . . . . . . . . . . . . . . . . . . . . . . .
310
Fragmento de la definicin del banco de pruebas de la ALU.
311
Parte final de la definicin del banco de pruebas de la ALU.
312
Diseo de un codificador 4:2 con prioridad. . . . . . . . . . .
321
Parte inicial del banco de pruebas de un codificador 4:2 con prioridad. 322
Parte final del banco de pruebas de un codificador 4:2 con prioridad .. 323
324
Diseo del circuito comparador de 4 bit para X<5.
Banco de pruebas del circuito comparador de 4 bit para X<5. . . . . 325
Decodificador BCD a 7 segmentos descrito empleando una sentencia
case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
326
Banco de pruebas del decodificador BCD . . . . . . . . . . . . . . . . . 327
Decodificador BCD descrito empleando una sentencia if. . . . . . . . 328
Decodificador BCD descrito empleando una sentencia de asignacin
concurrente condicional. . . . . . . . . . . . . . . . . . . . . . . . . 329
Decodificador BCD descrito empleando una sentencia with select.
330
Diseo del sumador de N bits. . . . . . . . . . . . . . . .
331
Parte inicial del banco de pruebas del sumador de 4 bits.
332
Parte final del banco de pruebas del sumador de 4 bits. .
333
Diseo del circuito desplazador. . . . . . . . . . . . . . .
334
Primera parte del banco de pruebas del circuito desplazador.
335
Segunda parte del banco de pruebas del circuito desplazador.
336
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

19

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

4.40. Banco de pruebas del circuito comparador de igualdad de 4 bits . . . .


4.41. Diseo de la ALU cuyo circuito se muestra en la Figura 4.12 . . . . . .
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. . . . . .
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_AL U. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.44. Fragmento de la definicin del banco de pruebas de la AL U cuyo
circuito se muestra en la Figura 4.12. . . . . . . . . . . . . . .
4.45. Parte final de la definicin del banco de pruebas de la ALU cuyo
circuito se muestra en la Figura 4.12. . . . . . . . . . . . . . .
4.46. Diseo de una puerta NOT de 1 entrada y de una puerta AND de 4
entradas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.47. Diseo del decodificador 3 a 8. . . . . . . . . . . . . . . . . . . .
4.48. Fragmento inicial del banco de pruebas del decodificador 3 a 8. .
4.49. Fragmento final del banco de pruebas del decodificador 3 a 8. . .
4.50. Diseo del conversor de cdigo binario a cdigo Gray, empleando un
bloque process con una sentencia case. . . . . . . . . . . . . . . . .
4.51. Diseo del conversor de cdigo binario a cdigo Gray, empleando una
asignacin concurrente de seleccin (with- select) . . . . . . . . . . .
4.52. Diseo del conversor de cdigo binario a cdigo Gray, describiendo la
estructura del circuito al nivel de puertas lgicas. . . . . . . . .
4.53. Banco de pruebas del conversor de cdigo binario a cdigo Gray.
5.1. Diseo de un registro de 4 bits con reset sncrono. . . . . . .
5.2. Banco de pruebas de un registro de 4 bits con reset sncrono.
5.3. Diseo de un registro multifuncin de 4 bits. . . . . . . . . .
5.4. Banco de pruebas de un registro multifuncin de 4 bits. . . .
5.5. Continuacin del banco de pruebas de un registro multifuncin de 4
bits. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.6. Parte final del banco de pruebas de un registro multifuncin de 4 bits.
5.7. Diseo de un registro de desplazamiento de 32 bits. . . . . .
.
5.8. Banco de pruebas del registro de desplazamiento de 32 bits.
5.9. Banco de pruebas del registro con acceso a fichero. .
.
5.10. Diseo de un registro triestado. . . . . . . . . . . . . .
5.11. Diseo estructural del register file. . . . . . . . . . . . .
5.12. Banco de pruebas del register file, con acceso a fichero.
5.13. Continuacin del banco de pruebas del register file. . .
5.14. Diseo del register file mediante la descripcin del comportamiento.

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.

Memoria de slo lectura. . . . . . . . . . . . . . . . . .


.
Memoria de lectura y escritura. . . . . . . . . . . . . .
.
Bus bidireccional (contina en el Cdigo VHDL 5.18). .
.
Bus bidireccional (continuacin del Cdigo VHDL 5.17).
.
Diseo de un registro de desplazamiento de 4 bits. . . . .
.
Otro diseo de un registro de desplazamiento de 4 bits. .
.
Diseo errneo de un registro de desplazamiento de 4 bits. .
.
Banco de pruebas de un registro de desplazamiento de 4 bits con
entrada y salida serie. . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.23. Diseo de un registro de desplazamiento de N bits con entrada y
salida serie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.24. Diseo del registro serie-a-paralelo y paralelo-a-serie de 4 bits. . . . .
5.25. Parte inicial del banco de pruebas para el registro serie-a-paralelo y
paralelo-a-serie de 4 bits. . . . . . . . . . . . . . . . . . . . . . . . . .
5.26. Parte final del banco de pruebas para el registro serie-a-paralelo y
paralelo-a-serie de 4 bits. . . . . . . . . . . . . . . . . . . . . . . . . .
5.27. Diseo del circuito ALU y registro, mostrado en la Figura 5.15. . ..
5.28. Package en el cual se definen las constantes y comienzo del banco de
pruebas de ALU+registro. . . . . . . . . . . . . . . . . . . . . . . . .
5.29. Fragmento del banco de pruebas de ALU+registro: procedure check_ALU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.30. Fragmento de la definicin del banco de pruebas de ALU+registro ...
5.31. Parte final de la definicin del banco de pruebas de ALU+registro ...
5.32. Diseo de la ROM. . . . . . .
.
.
5.33. Banco de pruebas de la ROM.
.
5.34. Diseo de la RAM. . . . . . .
.
5.35. Banco de pruebas de la RAM.
.
6.1. Diseo de un fiip-fiop JK con reset asncrono.
6.2. Comienzo del banco de pruebas de un fiip-fiop JK ..
.
6.3. Continuacin del banco de pruebas de un fiip-fiop JK ..
.
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. . . . . .
6.5. Continuacin del diseo de la mquina de Moore de la Figura 6. 7. . .
6.6. Banco de pruebas de la mquina de Moore de la Figura 6. 7. . . . . .
6.7. Continuacin del banco de pruebas de la mquina de Moore de la
Figura 6. 7. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.8. Diseo estructural de la mquina de Moore. . . . . . . . . . . . . . .
6.9. Package con la codificacin de los estados y diseo de la mquina de
Mealy de la Figura 6.11. . . . . . . . . . . . . . . . . . . . . . . . . .

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

6.10. Continuacin del diseo de la mquina de Mealy de la Figura 6.11. . 442


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-flop D. El
bloque process para la obtencin del prximo estado es igual al
mostrado en el Cdigo VHDL 6.10 . . . . . . . . . . . . . . . . . . . 443
6.12. Banco de pruebas que introduce algunos vectores de test en la mquina de Mealy de la Figura 6.11. . . . . . . . . . . . . . . .
. 444
6.13. Banco de pruebas de la mquina de Mealy de la Figura 6.11.
. 446
6.14. Parte final del banco de pruebas de la mquina de Mealy.
. 447
. 450
6.15. Diseo de una FSM segura.
6.16. Diseo de un latch D. . . . . .
. 463
6.17. Banco de pruebas dellatch D.
. 464
. 465
6.18. Diseo de un flip-flop RS.
6.19. Parte inicial del banco de pruebas de un flip-flop RS.
. 466
6.20. Parte final del banco de pruebas de un flip-flop RS. .
. 467
6.21. Diseo de un flip-flop D con seales enable, set y clear.
. 468
. 469
6.22. Banco de pruebas de un flip-flop D. . . . . . . . . . . .
6.23. Package en el cual se definen las constantes del diseo del contador
ascendente mdulo 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . 470
6.24. Diseo de un contador ascendente mdulo 4. . . . . . . . . . . . . . . 471
6.25. Parte inicial del banco de pruebas del contador ascendente mdulo 4. 472
6.26. Parte final del banco de pruebas del contador ascendente mdulo 4. . 473
6.27. Diseo estructural del contador ascendente mdulo 4.
. 476
. 477
6.28. Diseo del generador de seal. . . . . . . . . . . .
6.29. Banco de pruebas del circuito generador de seal.
. 478
. 480
6.30. Diseo del divisor de frecuencias por 3. . . . . . .
6.31. Banco de pruebas del divisor de frecuencias por 3.
. 481
6.32. Fragmento inicial del diseo del circuito especificado en el Ejercicio 6.9.483
6.33. Fragmento final del diseo del circuito especificado en el Ejercicio 6.9. 484
6.34. Banco de pruebas del diseo del circuito especificado en el Ejercicio
6.9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484
6.35. Diseo del detector de una secuencia 3 unos o ms consecutivos . . . . 486
6.36. Diseo del banco de pruebas del detector de una secuencia 3 unos o
ms consecutivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487
6.37. Continuacin del diseo del banco de pruebas del detector de una
secuencia 3 unos o ms consecutivos. . . . . . .
. 488
6.38. Diseo del contador BCD. . . . . . . . . . . . . . . . . . . . . . . . 490
6.39. Diseo del banco de pruebas del contador BCD. . . . . . . . . . . . 491
6.40. Continuacin del diseo del banco de pruebas del contador BCD.
. 492

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.

Diseo del detector de la secuencia "1011". . . . . . . . . . . . .


494
495
Continuacin del diseo del detector de la secuencia "1011". . . .
496
Diseo del banco de pruebas del detector de la secuencia "1011".
Continuacin del diseo del banco de pruebas del detector de la
secuencia "1011". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
Diseo del contador binario ascendente y descendente de 4 bits. . .. 498
Diseo del banco de pruebas del contador binario ascendente y descendente de 4 bits. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499
Continuacin del diseo del banco de pruebas del contador binario
ascendente y descendente de 4 bits. . . . . . . . . . . . . . . . . . . . 500
Package con la definicin de las constantes y parte inicial del diseo
del controlador de dos semforos. . . . . . . . . . . . .
501
Parte final del diseo del controlador de dos semforos.
502
Parte inicial del banco de pruebas del controlador. .. .
503
Parte final del banco de pruebas del controlador . . . . .
504
Package con la definicin de las constantes y parte inicial del diseo
del controlador del microondas. . . . . . . . . . . . . . .
506
Continuacin del diseo del controlador del microondas. . . .
507
Parte final del diseo del controlador del microondas. . . . .
508
Banco de pruebas del diseo del controlador del microondas.
510
Continuacin del banco de pruebas del controlador del microondas.
511
Parte final del banco de pruebas del controlador de microondas.
512
Codificacin en VHDL de un algoritmo RT. . . . . . . . . . . . . . 527
Dos diseos de un circuito detector de la secuencia 0111 1110. . . . 529
Package con la definicin de las constantes del circuito de la mquina
expendedora. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534
Entity y comienzo de la architecture del circuito de control de la
mquina expendedora. . . . . . . . . . . . . . . . . . . . . . . . . . . 535
Continuacin del diseo del circuito de control de la mquina expendedora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536
Banco de pruebas del circuito de control de la mquina expendedora. 538
Continuacin del banco de pruebas del circuito de la mquina expendedora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539
Diseo del circuito que calcula el mximo comn divisor de dos nmeros.547
Banco de pruebas del circuito que calcula el mximo comn divisor
de dos nmeros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
Diseo del circuito que calcula la media de 4 nmeros de 4 bits. . .. 550
Banco de pruebas del diseo del circuito que calcula la media de 4
nmeros de 4 bits.
551

23

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

7.12. Package con la definicin de constantes y diseo del conversor de


cdigo BCD a binario. . . . . . . . . . . . . . . . . . . . . . . . .
553
7.13. Parte inicial del banco de pruebas del conversor de cdigo BCD a
binario. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 554
7.14. Parte final del banco de pruebas del conversor de cdigo BCD a binario.555
7.15. Package con la definicin de las constantes globales y entity del
circuito exponenciador. . . . . . . . . . . . . . . . . . . . .
556
557
7.16. Diseo del circuito exponenciador. . . . . . . . . . . . . . . .
7.17. Principio del banco de pruebas del circuito exponenciador. .
558
7.18. Parte final del banco de pruebas del circuito exponenciador.
559

24

PREFACIO

ORGANIZACIN DE LA UNIDAD DIDCTICA


La presente Unidad Didctica est estructurada en siete temas y dos apndices,
y est acompaada de un CD-ROM.
El Tema 1 tiene carcter introductorio. En l se describen conceptos bsicos,
tales como el ciclo de diseo del hardware digital y el papel que en l desempean los
lenguajes para la descripcin del hardware, las diferentes representaciones y niveles
de abstraccin en la descripcin de los circuitos digitales, conceptos bsicos del test
de los circuitos digitales, de las tecnologas empleadas para la implementacin de
dichos circuitos, etc.
Asimismo, en el Tema 1 se desarrolla un ejemplo completo de diseo de un
sistema digital sencillo, mediante diferentes representaciones y niveles de abstraccin,
empleando el lenguaje para la descripcin del hardware que se explica en esta Unidad
Didctica: VHDL'93. Finalmente, se sugiere al alumno que instale en su propio
ordenador algn simulador de VHDL'93, proporcionndole gua en la instalacin
y manejo de dos simuladores que en su versin de estudiante estn disponibles
gratuitamente: VeriBest y ModelSim. A ello estn dedicados los Apndices A y B,
respectivamente.
En el Tema 2 se explica e ilustra mediante ejemplos el empleo de un pequeo
subconjunto de las estructuras y capacidades del lenguaje VHDL'93: aquel que puede
ser usado para crear diseos sintetizables. Esto es, cdigo VHDL'93 a partir del cual
las herramientas de CAD puedan generar automticamente circuitos hardware que
funcionen. Asimismo, se describen algunas capacidades de VHDL'93 que resultan
tiles para la programacin de los bancos de pruebas.
En el Tema 3 se explican los conceptos bsicos de la simulacin del cdigo
VHDL. El Tema 4 est dedicado al diseo para sntesis de circuitos digitales
combinacionales y a la programacin de bancos de pruebas para testear estos diseos.

25

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

En los Temas 5 y 6 se explica el diseo y prueba de circuitos secuenciales. El


Tema 5 est dedicado a los registros y memorias, y el Tema 6 a las mquinas de
estado finito. Se estudia el diseo de dos tipos de mquinas: de Mealy y de Moore.
Finalmente, el Tema 7 est dedicado al diseo de circuitos empleando la metodologa de transferencia entre registros, cuya aplicacin resulta idnea en aquellos casos
en los cuales el comportamiento del circuito viene descrito mediante un algoritmo.
Todo ello se realiza empleando VHDL'93.
La Unidad Didctica est acompaada de un CD-ROM, en el cual se encuentra
el cdigo VHDL de todos los diseos y bancos de pruebas explicados en los temas,
as como el cdigo VHDL que forma parte de los enunciados de los ejercicios de
autocomprobacin y de sus soluciones. Igualmente, en el CD se encuentra la versin
de estudiante del entorno de simulacin VeriBest.

CMO UTILIZAR EL LIBRO


Es recomendable seguir el orden siguiente en el estudio de los temas. En primer
lugar, debera estudiarse el Tema 1, ya que los conceptos expuestos en este tema
sirven de base para la comprensin de los siguientes.
Al finalizar el estudio del Tema 1, el alumno debera tener instalado en su propio
ordenador algn entorno de simulacin de VHDL'93 y debera saber emplearlo para
editar, simular y depurar cdigo VHDL, as como para visualizar los resultados de la
simulacin. En los Apndices A y B se dan algunas instrucciones para la instalacin
y el manejo de dos simuladores: VeriBest y ModelSim. Los ficheros de instalacin de
VeriBest se encuentran en el CD distribuido junto con esta Unidad Didctica.
El cdigo VHDL descrito en las Secciones 1.9.1 y 1.9.2, consistente en el diseo de
un buffer triestado y su banco de pruebas, puede ser usado para realizar las primeras
pruebas y aprender el manejo del entorno de simulacin escogido.
A continuacin, debera estudiarse el Tema 2, en el cual se explican los fundamentos bsicos de VHDL y se muestran mltiples ejemplos de diseos de circuitos, cuya
finalidad es ilustrar el empleo de diferentes recursos del lenguaje VHDL'93. Puesto
que se muestran los diseos de los circuitos, pero no los bancos de pruebas que
ejercitan sus entradas, los ejemplos de este tema no estn listos para ser simulados,
y por ello este tema puede estudiarse sin necesidad de emplear el ordenador. En
los ejercicios del Tema 2 s se propone la programacin de algn pequeo diseo y
banco de pruebas, con lo cual s es conveniente disponer de ordenador para realizar
algunos de los ejercicios del Tema 2.

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.

2. Discutir qu caractersticas fundamentales deben tener los HDL para poder


describir circuitos digitales y qu caractersticas fundamentales deben tener
los entornos de simulacin que soportan este tipo de lenguajes.
3. Aplicar el lenguaje VHDL al diseo de circuitos digitales combinacionales y
secuenciales empleando los tipos de datos, operadores y otras capacidades de
VHDL que deben ser usados para crear cdigo sintetizable.
4. Aplicar el lenguaje VHDL a la programacin de bancos de prueba para testear
los circuitos diseados.
Al comienzo de cada tema se indican los objetivos docentes que deben alcanzarse una vez completado su estudio y realizados los ejercicios prcticos. Un buen
procedimiento de autoevaluacin consiste en repasar los objetivos docentes una vez
completado el estudio del tema, analizando en cada caso si se ha alcanzado o no el
objetivo.

27

TEMA 1

FUNDAMENTOS DEL DISENO DEL


HARDWARE DIGITAL

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

1.8. Conceptos bsicos a travs de un ejemplo


1.9. Dos simuladores de VHDL'93: VeriBest y ModelSim
1.10. Lecturas recomendadas
1.11. Ejercicios de autocomprobacin
1.12. Soluciones de los ejercicios

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

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

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

El HDL que el Departamento de Defensa de EE.UU. cre en los aos 80 se llam


VHDL. Las siglas VHDL provienen de VHSIC Hardware Description L.anguage.
VHSIC es un acrnimo de Very High Speed Integrated Circuit, que fue el nombre
del proyecto llevado a cabo por el Departamento de Defensa de EE.UU.
La sintaxis de VHDL es muy similar a la del lenguaje de programacin ADA.
En 1987, el Institute of Electrical and Electronics Engineers (IEEE) adopt VHDL
como el estndar nmero 1076. El establecimiento de un estndar del lenguaje tiene
una ventaja fundamental: las compaas desarrolladoras de software de simulacin
tienen una definicin claramente establecida del lenguaje al que deben dar soporte.

1.2.

LENGUAJES PARA LA DESCRIPCIN DE HARDWARE

En la actualidad, la casi totalidad de los diseadores de circuitos digitales de


cierta complejidad usan para realizar sus diseos lenguajes para la descripcin del
hardware. El empleo de HDL presenta ventajas respecto al empleo de descripciones
basadas en esquemticos. Algunas de ellas son las siguientes:
l. Puesto que una descripcin HDL es simplemente un fichero de texto, es mucho

ms portable que un diseo esquemtico, que debe ser visualizado y editado


empleando la herramienta grfica especfica del entorno de CAD ( ComputerAided Design- Diseo asistido por ordenador) con el que se ha creado.
2. Una descripcin esquemtica nicamente describe el diseo de manera estructural, mostrando los mdulos y la conexin entre ellos. Por el contrario, la
descripcin del circuito usando un HDL puede realizarse bien mostrando la
estructura, o bien describiendo el comportamiento. Es decir, los HDL permiten
describir el comportamiento que se desea que tenga el circuito, sin hacer ninguna referencia a su estructura. Las herramientas de sntesis permiten generar
automticamente la estructura del circuito lgico a partir de la descripcin de
su comportamiento.
3. El mismo HDL que se ha usado para la descripcin del circuito, puede emplearse para describir los vectores de test y los resultados esperados del test.
Los vectores de test son los valores de las seales que se aplicarn a los pirres
de entrada del circuito con la finalidad de comprobar si el funcionamiento del
circuito es correcto. As pues, pueden realizarse los programas de test (vectores
de test e instantes en los cuales son aplicados) del circuito a medida que se
disea el propio circuito, pudindose con ello ir realizando diferentes pruebas

34

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

a medida que se avanza en el diseo. Como ventajas aadidas, la descripcin


de los programas de test usando HDL es altamente portable y repetible.

1.2.1.

Usos de un programa HDL

Resumiendo lo anteriormente explicado, los programas escritos en HDL pueden


tener las tres aplicaciones siguientes:

- 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.

HDL ms ampliamente usados

En la actualidad, los HDL ms ampliamente usados son Verilog HDL y VHDL.


Ambos son lenguajes estndar de IEEE para el modelado y simulacin de hardware.
- Verilog se cre, a principios de los aos 80, como un lenguaje propiedad de
la compaa Philip Moorby, compaa que aos ms tarde fue adquirida por

35

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Cadence Design Systems. Posteriormente, Verilog se hizo de dominio pblico


y se promovi como un estndar de IEEE en el ao 1995, denominado IEEE
1364.
- Como se ha explicado anteriormente, VHDL fue desarrollado en 1983 por
el Departamento de Defensa de los EE.UU. con la finalidad de servir como
lenguaje estndar para la descripcin de hardware. En el ao 1987 se convirti
en un estndar de IEEE (IEEE 1067-1987). Posteriormente, se incorporaron
mejoras al lenguaje que dieron lugar a dos actualizaciones del estndar: la
primera en 1993 (IEEE 1076-1993) y la segunda en 2001 (IEEE 1076-2001).
A principios del ao 2000 se desarroll otro HDL denominado SystemC, el cual
consiste en un conjunto de libreras en C++. SystemC se convirti en el estndar
1666 de IEEE en el ao 2005.

1.3.

CICLO DE DISENO DE LOS CIRCUITOS DIGITALES

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

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

Especificacin del Diseo

Diseo de Alto Nivel

Programas de Test

Simulacin: Verificacin Funcional

Implementacin (FPGA, ASIC, etc.)

Testeo del Prototipo

Figura 1.1: Ciclo de diseo del hardware digital.

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

en la fase de especificacin. Si se detecta un problema a este nivel, debe volverse al


correspondiente paso del ciclo de diseo.
Una vez el diseo ha superado estos tests, puede implementarse en la plataforma hardware seleccionada: PLD (Programmable Logic Device), FPGA (FieldProgrammable Cate Array), ASIC (Application-Specific Integrated Circuit), etc. Se
emplean herramientas software para fabricar (en el caso de los ASIC) o programar
(en el caso de los FPG A) el circuito integrado a partir de la netlist.
Una vez implementado, el circuito integrado puede ser testeado con ayuda de un
generador de patrones (para generar los vectores de test), y un analizador lgico u
osciloscopio (para medir las salidas).
En este texto nicamente se explican las primeras fases del ciclo de diseo, en las
cuales se establece la especificacin funcional del circuito, se realiza el diseo de alto
nivel del circuito, se elabora el programa de test, y se simula el banco de pruebas
con el fin de realizar una verificacin funcional del circuito. La especificacin de las
restricciones que debe satisfacer el circuito, as como las fases de sntesis, verificacin
de tiempos, implementacin y testeo del prototipo, quedan fuera del alcance de este
texto.

1.4.

TECNOLOGAS DE CIRCUITOS INTEGRADOS

La implementacin hardware del circuito digital puede realizarse empleando


circuitos integrados de diferentes tecnologas. Una caracterstica fundamental que
diferencia cada tecnologa de circuitos integrados es la manera de adaptar el circuito
a una determinada aplicacin.
En algunas tecnologas, la estructura del circuito integrado est completamente
predefinida y el usuario debe particularizarlo para su aplicacin "programndolo".
Es decir, definiendo un patrn de conexiones en la estructura del circuito integrado,
bien descargando dicha estructura en la memoria interna del circuito integrado o
mediante el fundido selectivo de los fusibles internos del circuito integrado.
En el otro extremo, las tecnologas ASIC (Application Specific Integrated Circuit)
requieren del diseo de mscaras de fotolitografa propias para cada uno de los pasos
del proceso de fabricacin del circuito integrado.
As pues, las tecnologas non-ASIC permiten particularizar el circuito en campo,
mientras que los circuitos de las tecnologas ASIC deben ser particularizados a su
aplicacin en la fbrica de circuitos integrados.

38

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

1.4.1.

Clasificacin de las tecnologas

Es posible clasificar las tecnologas de circuitos integrados digitales de la manera


mostrada a continuacin. Obsrvese que se ha conservado la terminologa en lengua
inglesa en aquellos casos en que es sta la usada habitualmente.
- Full-custom ASIC
- Standard-cell ASIC
- Gate array ASIC
- Dispositivos complejos programables en campo (FPGA y CPLD)
- Dispositivos sencillos programables en campo (PROM, PAL y PLA)
- Componentes estndar de pequeo y medio tamao
A continuacin, se describen algunas de las caractersticas ms relevantes de cada
una de estas tecnologas.

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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.

Gate array ASIC


En la tecnologa gate array el circuito es construido a partir de un array predefinido de "celdas base". Al contrario que en la tecnologa standard cell, el circuito
integrado de la tecnologa gate array consiste en la repeticin unidimensional o
bidimensional de un nico circuito sencillo, llamado celda base, que es similar a
una puerta lgica.
Asimismo, los fabricantes de gate array ASICs proporcionan libreras de componentes prediseados, denominados "macro celdas", que son arrays de celdas base
conectadas entre s para formar bloques lgicos con funcionalidades bsicas. Las
macro celdas facilitan el diseo, que puede realizarse conectando entre s macro
celdas.
Puesto que el diseo estructural de las celdas base y su posicin en el circuito
integrado estn predefinidos, es posible prefabricar el array de celdas base. La

40

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

particularizacin del circuito se realiza especificando cmo deben ser conectadas


entre s las celdas base.
As pues, los primeros niveles de fabricacin de los circuitos integrados de la
tecnologa gate array, que estn dedicados a la fabricacin de los transistores de las
celdas base, son comunes a todas las aplicaciones y por ello pueden ser fabricados
independientemente de la aplicacin. Slo las mscaras de fotolitografa de los niveles
de metal, que definen las conexiones entre las celdas base, deben ser diseadas especficamente para la aplicacin. Al reducirse el nmero de mscaras de fotolitografa
que deben ser fabricadas especficamente para la aplicacin en concreto, el proceso
de fabricacin se simplifica considerablemente.

Dispositivos complejos programables en campo


La tecnologa non-ASIC ms verstil es el circuito integrado complejo programable
en campo, que consiste en un array de celdas lgicas genricas y en la interconexin
genrica entre ellas. Aunque las celdas lgicas y su interconexin estn prefabricadas, el circuito integrado dispone de fusibles que permiten "programar" el circuito
integrado, adaptndolo a su aplicacin.
Este proceso de programacin del circuito integrado, consistente en fundir algunos de sus fusibles, puede realizarse empleando instrumental relativamente barato y
sencillo de usar. Puesto que la particularizacin del circuito integrado se realiza "en
campo", esta tecnologa se denomina "programable en campo" (field programmable),
en oposicin a las tecnologas ASIC, en las cuales el circuito integrado debe ser
particularizado en la fbrica en la que es construido.
Las celdas lgicas de los dispositivos programables en campo son bastante ms
complejas que las celdas base de los gate array ASICs. De acuerdo a la estructura
circuital de sus celdas lgicas, los dispositivos complejos programables en campo
pueden clasificarse en dos tipos: CPLD ( Complex Programmable Logic Device) y
FPGA (Field Programmable Gate Array).

Dispositivos sencillos programables en campo


Los dispositivos sencillos programables en campo son, como su nombre indica,
dispositivos programables con una estructura interna ms sencilla que CPLDs y
FPG As. Histricamente, este tipo de circuitos integrados se han llamado PLDs

41

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

( Programmable Logic Devices). Estn compuestos por dos arrays, uno de puertas

AND y otro de puertas OR. Pueden programarse las interconexiones en uno de


estos arrays o en ambos, con el fin de adaptar el circuito a su aplicacin.
- En los dispositivos PROM (Programmable Read Only Memory) puede programarse el array OR.
- En los dispositivos PAL (Programmable Array Logic) puede programarse el
array AND.
- En los dispositivos PLA (Programmable Logic Array) pueden programarse
ambos arrays.
En la actualidad, los circuitos integrados de este tipo son usados raramente,
emplendose generalmente FPGAs.

Circuitos estndar de pequea y media integracin


Antes de la popularizacin de los dispositivos programables en campo, la nica
alternativa que exista a los circuitos integrados ASIC era utilizar circuitos integrados
prefabricados SSI/MSI (Small-/Medium-Scaled Integrated circuits). Un ejemplo es
la serie 7400 de la familia TTL (Transistor- Transistor Logic), que contiene ms
de 100 circuitos diferentes, que iban desde puertas NAND simples hasta unidades
aritmticas de 4 bits.
Los circuitos se diseaban seleccionando cules de esos circuitos integrados deban
usarse y fabricando una placa impresa especfica para la aplicacin, con las pistas
para la conexin entre los pines de los circuitos integrados, y en la cual se soldaban los
circuitos integrados. En este tipo de implementacin, la mayor parte de los recursos
(potencia consumida, rea y coste de fabricacin) es consumida por el encapsulado
y el routing, y no por el silicio, que es donde se realiza la computacin. Dado que
los dispositivos programables tienen mejores capacidades y son ms baratos, hoy en
da no se disean circuitos complejos usando tecnologa SSI/MSI.

1.4.2.

Comparacin entre tecnologas

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

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

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)

El coste de ingeniera (eing) se produce una nica vez durante el proceso de


produccin del circuito integrado, con independencia del nmero de unidades que
vayan a fabricarse. En este concepto se incluye el desarrollo de las mscaras de
fotolitografa, el desarrollo de los tests, y la fabricacin y test de los prototipos.
La repercusin de este coste en cada unidad del circuito depende del nmero de
unidades producidas, siendo la repercusin menor cuanto mayor sea el nmero de
unidades fabricadas.
El coste de fabricacin (efab) es la suma del coste que conlleva fabricar el
dispositivo, encapsularlo y testearlo. El coste de fabricacin de un circuito integrado
ASIC es menor que el coste de un circuito desarrollado en la tecnologa FPGA.
Igualmente, el coste de fabricacin de un circuito standard cell es menor que el de
un circuito gate array. Esto es debido a que el circuito de la tecnologa standard
cell est ms optimizado que el circuito sintetizado en la tecnologa gate array: tiene
menor rea, con lo cual se obtienen ms circuitos integrados por oblea y adems, al
ser menor el rea del circuito integrado, el porcentaje de circuitos integrados buenos
por oblea es mayor.
En la Figura 1.2 se muestra el coste por unidad para las tecnologas standard
cell, gate array y FPGA. A medida que el nmero de unidades fabricadas aumenta,
en primer lugar gate array, y a continuacin standard cell, se hacen rentables. Los
puntos de interseccin entre las curvas indican el volumen de produccin a partir del
cual cada una de estas dos tecnologas resulta rentable. Obsrvese que el coste de
produccin de la tecnologa FPGA es constante, debido a que su coste de ingeniera
es nulo. Es decir, para la tecnologa FPGA se verifica que: eprod = efab

45

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Coste de
produccin
(Cprod)

''

(1) Nmero de unidades a partir del cual gate


array tiene menor coste que FPGA
(2) Nmero de unidades a partir del cual standard
cell tiene menor coste que gate array

''
''

'

--------------- Gate array


Standard cell
(1)

(2)

Unidades producidas

Figura 1.2: Comparacin del coste de produccin por unidad de circuito integrado.

La segunda contribucin al coste es el coste de desarrollo. El proceso de


transformar una idea en un circuito integrado conlleva unos costes, entre los cuales
se incluyen los ordenadores y el software, y las horas de ingeniera. Aunque el
procedimiento de sntesis es similar para todas las tecnologas, el desarrollo de ASICs
es ms complejo y requiere mayor esfuerzo, con lo cual el coste de ingeniera de un
circuito integrado ASIC es mucho mayor que el de ese mismo circuito implementado
en la tecnologa FPGA. Por este mismo motivo, el coste de desarrollo de un circuito
standard cell es considerablemente mayor que el coste de desarrollo de ese mismo
circuito en la tecnologa gate array.
La tercera contribucin al coste del circuito integrado es el coste del tiempo
de llegada al mercado, si bien ms que un coste es en realidad la prdida de los
beneficios econmicos que se obtendran si el circuito se encontrara ya vendindose
en el mercado. En algunas aplicaciones, tales como los perifricos de los PCs, el
ciclo de vida de un producto es muy corto, del orden de 12 a 18 meses. As pues, es
muy importante introducir el producto en el mercado cuanto antes. La tecnologa
standard cell es la que tiene un tiempo mayor de validacin, de desarrollo de los
tests y de puesta en produccin, variando este tiempo entre unos meses y un ao.
El tiempo de la tecnologa gate array puede variar entre unas cuantas semanas y
unos meses. En el caso de la tecnologa FPGA, la particularizacin del circuito a la
aplicacin se realiza programando un circuito prefabricado, lo cual puede hacerse en
minutos.

46

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

1.5.

PROPIEDADES DE LOS CIRCUITOS DIGITALES

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.

Retardo de los dispositivos

Un dispositivo lgico real tiene la propiedad de que un glitch en un puerto de


entrada, con una duracin inferior al retardo de propagacin del dispositivo, no tiene
efecto sobre la salida del dispositivo. Se denomina glitch a un cambio temporal (un
pico de subida o bajada) e inesperado en el voltaje.
Por ejemplo, si una puerta NAND tiene un retardo de propagacin de 1 ns,
entonces un glitch de 0.5 ns (un O 1 temporal, de duracin 0.5 ns) en una de sus
entradas no produce ningn cambio en su salida.
Este tipo de comportamiento del retardo se denomina retardo inercial y es el
modelo del retardo usado por defecto para todos los dispositivos en VHDL.
El retardo inercial es adecuado para modelar los retardos a travs de dispositivos
tales como transistores y puertas lgicas. Un cambio en la entrada de un dispositivo
se ha de mantener estable durante cierto tiempo para que este cambio se propague
a su salida. Las puertas lgicas actan as como filtros paso baja. El retardo inercial
es debido a la capacidad del dispositivo, la carga que conduce, sus caractersticas
intrnsecas, nmero y tipo de los elementos conectados al dispositivo, etc.
Otro tipo alternativo de modelo del retardo, en el cual todos los glitches a la
entrada se manifiestan en la salida, se denomina retardo de transporte o retardo puro.
El retardo de transporte es adecuado para modelar retardos a travs de dispositivos
con poca inercia, tales como las lneas de metal construidas en el chip para conectar
los dispositivos. Los retardos puros pueden considerarse como desplazamientos en
el tiempo de la seal, ya que la seal en s misma no se modifica. Al describir el
retardo de los circuitos, VHDL permite diferenciar entre ambos tipos de retardo.
Para ilustrar la diferencia entre ambos tipos de retardo, consideremos en primer
lugar un buffer cuya seal de entrada es x y cuya seal de salida es y1. El buffer
tiene un retardo inercial de 100 ns. Su comportamiento puede describirse en VHDL
de la forma siguiente:

47

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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

Figura 1.3: Retardo inercial y de transporte.

y1 <= x after 100 ns;

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'

La seal y1 evoluciona segn se muestra en la Figura 1.3. Durante los primeros


100 ns, el valor de la seal de salida y1 es indefinido, puesto que no ha sido inicializado: vale 'U' (que proviene del ingls "Uninitialized"). Obsrvese que el buffer
no responde ante cambios en la seal de entrada cuya duracin sea menor que el
retardo inercial. En concreto, el buffer no responde al cambio en la seal x que se
produce en el instante 200 ns.
Consideremos ahora una lnea de metal que introduce un retardo de transporte
en la seal de 100 ns. Llamando x a la seal de entrada e y2 a la seal de salida,
el comportamiento de la lnea de metal puede ser descrito en VHDL de la manera
indicada a continuacin, donde la palabra reservada transport indica que el retardo
es de transporte:
y2 <= transport x after 100 ns;

Si la seal x vara de la forma indicada en la tabla anterior, la evolucin de


la seal y2 es la mostrada en la Figura 1.3. Observe que la seal y2 es la seal x
desplazada 100 ns.
En resumen, las seales y1 e y2 slo se diferencian en que la seal y1 no cambia
su valor en el instante 300 ns, como consecuencia del cambio de valor en x en el

48

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

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

Los mdulos lgicos se ejecutan concurrentemente. Cuando cambia el valor de


una seal de entrada a varios mdulos, todos estos mdulos deben ser ejecutados
concurrentemente. As pues, los HDL deben ser capaces de describir de manera
precisa este comportamiento concurrente y el simulador debe ser capaz de simularlo.
La metodologa aplicada para ello por el simulador es la simulacin de eventos
discretos.

49

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

1.5.3.

Diseos marginales

Los retardos de los dispositivos dependen de la condiciones de fabricacin del


chip. En general, existen variaciones en el valor de los retardos de los chips fabricados en diferentes obleas, e incluso existen variaciones entre los chips fabricados en
posiciones distantes dentro de una misma oblea.
Por este motivo, no es buena idea disear un circuito cuyo funcionamiento
dependa de que los retardos tomen un determinado valor o que su magnitud sea
mnima. Este tipo de circuitos puede funcionar correctamente cuando son simulados,
ya que las seales simuladas llegan a los mdulos en un determinado orden, que viene
determinado por los valores de los retardos contenidos en el modelo. Sin embargo, si
el orden de llegada de los cambios en las seales depende del valor de los retardos,
y los retardos simulados no se corresponden con los existentes en el hardware fsico,
entonces ese diseo producir chips que no funcionen , o que funcionen slo una parte
del tiempo.

1.5.4.

Fortaleza de las seales

En un circuito digital tpico, la transferencia de un valor lgico desde un pin


de salida de un mdulo, a varios pines de entrada de otros mdulos, precisa de la
transferencia de carga elctrica hacia los pines de entrada (en el caso de '1' lgico)
o hacia el pin de salida (en el caso de 'O' lgico). El pin de salida debe tener la
capacidad de hacer de "fuente" y de "sumidero" de toda la corriente necesaria.
Desde el punto de vista prctico, esto implica que la salida de un mdulo puede
ser conectada como mximo a un determinado nmero de entradas de otros mdulos.
En aquellos casos en que la seal deba conectarse a un nmero de mdulos superior a
este nmero mximo, entonces debe emplearse un rbol de buffers. En la Figura 1.4
se muestra un rbol de buffers que lleva una seal (out) a 16 mdulos (in_O, ... ,
in_15), de tal forma que la salida de los buffers se conecta nicamente a 4 entradas.
El uso del rbol de buffers tiene un beneficio aadido: igualar los retardos de las
seales de entrada a todos los mdulos, ya que el rbol de buffers est diseado de
modo que la longitud de las lneas de todas sus ramas sea la misma. Este tipo de
rbol de buffers se emplea para llevar la seal de reloj a los flip-flops en los circuitos
secuenciales sncronos, en los cuales es importante que la seal de reloj llegue a todos
los flip- flops aproximadamente en el mismo instante.

50

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

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

Figura 1.4: rbol de buffers para llevar una seal a 16 mdulos.

1.6.

TEST DE LOS CIRCUITOS

El test juega un papel muy importante en el diseo de circuitos integrados. No


slo se emplea para verificar el correcto funcionamiento del circuito ya completamente diseado, sino que tambin es una ayuda esencial para el diseador durante
la fase de diseo del circuito.
Finalmente, el test se emplea en manufactura, para determinar qu chips han
resultado defectuosos o tienen limitadas prestaciones. Por ejemplo, puede emplearse
para separar los chips que funcionan correctamente a alta velocidad, de los que slo
funcionan a baja velocidad (cada tipo es vendido a diferente precio). Si el diseo
se ha realizado correctamente, los chips defectuosos en los test de manufactura
se deben a problemas en los procesos de fabricacin o de encapsulado. El test

51

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

realizado en manufactura tiene un impacto directo sobre el rendimiento (porcentaje


de chips fabricados que no son defectuosos), el cual tiene un impacto directo sobre
los beneficios de la compaa fabricante de los chips.
Esencialmente, el test consiste en fijar valores en todas las entradas del circuito
y observar qu valores se obtienen en sus salidas. A cada asignacin de valores a
todas las entradas del circuito se le llama un vector de test. El programa de test
consiste en un conjunto de vectores de test, que se aplican sobre el dispositivo en
una determinada secuencia.

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.

Modelar estos diferentes tipos de defectos en el circuito es extremadamente difcil.


Por ello, se han desarrollado diferentes modelos simplificados de fallos.
Uno de estos modelos de fallo es considerar que el defecto de fabricacin hace que
una de las conexiones internas del circuito permanezca siempre a 1, o que permanezca
siempre a O.
En un circuito tpico, este tipo de fallos da lugar a un nmero muy elevado de
patrones de fallo. Un patrn de fallo es una determinada seleccin de conexiones que
se encuentran permanentemente a 1 y de conexiones que se encuentran permanentemente a O.
Se da la circunstancia de que varios patrones de fallo pueden desembocar en el
mismo comportamiento del circuito. Por ejemplo, si cualquiera de las entradas de

52

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

una puerta NAND se encuentra siempre a O, el circuito se comporta de la misma


manera que si la salida del circuito se encontrara siempre a l.
Incluso tomando en consideracin que existen patrones de fallo que dan lugar a
un comportamiento equivalente (defectuoso) del circuito, el nmero de patrones de
fallo esencialmente distintos es extremadamente grande.
Por ello, se ha desarrollado un modelo simplificado a partir del anterior. Consiste
en suponer que en el circuito hay una nica conexin que se encuentra permanentemente a 1, o permanentemente a O. Aunque este modelo de fallos pudiera considerarse
muy restrictivo, ha demostrado ser eficaz.
Una vez se adopta un determinado modelo de fallos, el siguiente paso es crear
un conjunto de vectores de test que permita detectar ese tipo de fallos. Para que
se produzca la deteccin del fallo, es preciso que la salida del circuito, en caso de
estarse produciendo el fallo, sea diferente de la salida de un circuito que funcione
correctamente. En este caso, se dice que el fallo se encuentra cubierto por el vector
de test. Por supuesto, habr otros tipos de fallos que darn lugar, para ese vector
de test, a las mismas salidas que un circuito que funcione correctamente. Se dice
entonces que el vector de test no cubre esos otros fallos.
Segn se van usando ms y ms vectores de test, el porcentaje de fallos potenciales
(para un determinado modelo de fallo) que son cubiertos se aproxima al lOO%. Dado
un conjunto de vectores de test, la cobertura de fallos de ese conjunto de vectores
de test (dado un modelo especfico de fallos) corresponde con el porcentaje de fallos
cubiertos.
El test de los circuitos secuenciales es ms complicado, ya que las salidas del
circuito dependen no slo de las entradas, sino tambin de su estado. Por tanto,
en este tipo de circuitos es preciso poder fijar los valores de todos los fiip-fiops a
voluntad. Esto puede hacerse de las dos maneras siguientes:
l. Mediante una secuencia de inicializacin (secuencia de valores de las entradas
del circuito), se lleva el circuito al estado deseado. A continuacin, se aplica el
vector de test para probar el circuito en ese estado.

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

1.6.3.

Programas de test funcional

Un mtodo para testear la funcionalidad de un circuito es probar todos los


posibles vectores de entrada. Sin embargo, en algunos circuitos esto no es posible,
bien porque el nmero de posibles vectores es muy grande, o bien porque algunas
combinaciones de valores de las entradas no son vlidas para ese determinado circuito. Adems , algunas funciones requieren de una determinada secuencia de vectores
de entrada.
En conclusin, el programa de test es algo que depende del circuito. Sin embargo,
en general se sigue el criterio de probar todos los posibles vectores de entrada, siempre
que esto sea posible.
Si el nmero de posibles vectores de entrada es muy grande (se tardara meses
o aos en pro bar los todos), existen varios mtodos heursticos que pueden aplicarse
para reducir el nmero de vectores de entrada.
l. Puede emplearse el conocimiento sobre el funcionamiento de circuito para

descartar aquellos vectores de entrada que no tienen ninguna funcin en el


circuito, o que nunca ocurrirn en la prctica.
2. El circuito puede dividirse en varios subcircuitos, que son testeados exhaustivamente (usando todas las combinaciones de los vectores de entrada para cada
sub circuito). A continuacin, el circuito completo puede testaerse usando un
conjunto no exhaustivo de vectores de entrada, simplemente para comprobar
que los subcircuitos han sido integrados adecuadamente.
3. Se escoge un conjunto representativo de vectores de entrada, con el fin de ejercitar el circuito bajo condiciones normales de funcionamiento y bajo condiciones
extremas.
Al testear un circuito, es deseable poder comparar de manera automtica las
salidas del circuito con las correspondientes salidas que se obtendran si el circuito
funcionara correctamente. Esto puede hacerse de varias maneras.
l. Una forma es almacenar en un fichero las salidas de un circuito que funcione
correctamente, y compararlas con las salidas obtenidas.

2. Otro procedimiento consiste en calcular la salida esperada del circuito usando


un mtodo diferente al empleado en el test, y comparar los resultados.

55

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Circuito banco de pruebas

Subcircuito
generador de
los vectores de test

Entradas
al UUT

UUT

Salidas
delUUT

Subcircuito
de comprobacin
de los resultados
del test

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

Cuando no es posible aplicar un mtodo de clculo alternativo al del test, puede


comprobarse si los resultados obtenidos del test son "razonables". Por ejemplo,
si un circuito calcula la media de un conjunto de nmeros, puede comprobarse
que el resultado obtenido sea mayor o igual que el menor de los nmeros del
conjunto, y menor o igual que el mayor de los nmeros del conjunto.

1.6.4.

Banco de pruebas

Muchas herramientas de simulacin incluyen mens que permiten asignar valores


a las entradas del circuito. Sin embargo, el uso de este tipo de interfaces grficas
de usuario puede resultar lento y el programa de test desarrollado puede no ser
exportable a otras herramientas de simulacin.
Una alternativa mucho ms ventajosa consiste en codificar el programa de test
usando un HDL. Es decir, implementar el programa de test en otro mdulo de cdigo
HDL, que es denominado banco de pruebas.
El banco de pruebas contendr el circuito que est siendo probado (denominado
abreviadamente UUT, del ingls "Unit Under Tesf') como un subcircuito. Todas las
entradas al UUT sern generadas dentro del banco de pruebas, y todas las salidas
del circuito sern comprobadas dentro del banco de pruebas.
En resumen, el banco de pruebas debe incluir (vase el diagrama de bloques en
la Figura 1.5):
- Un subcircuito generador de los vectores de test.
- El circuito que est siendo probado (UUT).
- Un subcircuito de comprobacin de los resultados obtenidos del test.

56

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

Como mdulo de cdigo en HDL, el banco de pruebas es un mdulo sin entradas


ni salidas externas. Puesto que el banco de pruebas normalmente no va a ser sintetizado en un circuito fsico, puede emplearse cualquier instruccin disponible en el
HDL para generar los vectores de test y analizar las salidas del UUT, pudindose
llegar a crear programas extremadamente complejos.
Finalmente, recalcar que cuando se disea un circuito digital, es conveniente disear tambin su banco de pruebas. Si el circuito se disea jerrquicamente, entonces
cada subcircuito debe ser testeado separadamente antes de ser combinado con otros
subcircuitos para integrar un circuito de nivel jerrquico superior. Asimismo, deber
desarrollarse un banco de pruebas para este circuito de nivel superior.

1.7.

REPRESENTACIONES Y NIVELES DE ABSTRACCIN

En esta seccin se describen dos aspectos ortogonales entre s en el diseo del


hardware digital: la representacin del sistema y el nivel de abstraccin.

l. 7 .l.

Representacin del sistema

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

Representacin del comportamiento


La representacin del comportamiento describe la funcionalidad del sistema. En
esta visin del sistema, ste es considerado como una caja negra, ignorndose su

57

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

implementacin interna, y enfocndose en la relacin entre las seales de entrada


y de salida, definiendo qu seales de salida deben obtenerse cuando se aplica un
determinado conjunto de seales de entrada.
La descripcin del comportamiento del sistema raras veces es nica, ya que
normalmente hay diferentes maneras de especificar unas mismas caractersticas de
entrada-salida.

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

Cuando el nmero de transistores que componen un circuito integrado se hace


del orden de cientos de millones, es imposible para un ser humano, e incluso para
un ordenador, procesar esa cantidad de informacin directamente. El mtodo que
posibilita disear sistemas tan complejos consiste en describir el sistema mediante
diferentes abstracciones.
Una abstraccin es un modelo simplificado del sistema, el cual muestra slo unas
determinadas caractersticas relevantes del sistema e ignora todos los dems detalles.

58

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

La finalidad de una abstraccin es reducir la cantidad de datos a un volumen que


resulte manejable. De este modo, en una abstraccin slo se muestra la informacin
que es crtica para ese nivel en la representacin del sistema.
Una abstraccin de alto nivel est enfocada y muestra nicamente los datos ms
vitales. Por otra parte, una abstraccin de bajo nivel es ms detallada y tiene en
cuenta informacin que es ignorada en abstracciones de nivel superior. Por ello, la
abstraccin de bajo nivel es, a la vez que ms compleja, tambin ms precisa en sus
predicciones acerca del comportamiento del circuito real.
En el proceso de desarrollo de hardware, normalmente se comienza con una
abstraccin de alto nivel, la cual permite centrarse en las caractersticas ms vitales.
A medida que se va conociendo mejor el sistema, van incluyndose ms detalles y se
desarrollan abstracciones de ms bajo nivel.
En el desarrollo de sistemas digitales suelen considerarse los cuatro niveles de
abstraccin siguientes:
- Nivel de transistor
- Nivel de puertas lgicas
- Nivel de transferencia entre registros (RTL)
- Nivel de procesador
La divisin entre estos niveles se basa en el tamao de sus bloques constitutivos
bsicos, que son los transistores, las puertas lgicas, los mdulos funcionales y los
procesadores, respectivamente.
El nivel de abstraccin y la representacin (descrita en la Seccin l. 7.1) son dos
dimensiones independientes del sistema. Cada nivel de abstraccin tiene sus propias
representaciones. Es posible combinar en un grfico "Y" los niveles de abstraccin y
las representaciones de un sistema. En la Figura 1.6 se muestra dicho grfico, en el
cual cada uno de los tres brazos muestra una representacin o visin del sistema, y
el nivel de abstraccin aumenta al progresar desde el centro hacia los extremos. Las
siguientes subsecciones estn dedicadas a cada uno de los niveles de abstraccin.

59

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Representacin del
comportamiento

Representacin de la
estructura
Procesador, memoria, interfaz I/0

Operaciones de transferencia entre registros

Ecuaciones diferenciales y algebraicas

Layout de los transistores, resistencias, condensadores


Layout de las celdas
Floor plan de los mdulos

Representad n
flsica

Figura 1.6: Niveles de abstraccin y representacin del sistema.

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.

Nivel de puertas lgicas


El siguiente nivel de abstraccin es el nivel de puertas lgicas. Los bloques
constitutivos bsicos son puertas lgicas, tales como puertas AND, OR, XOR, MUX

60

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

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.

Nivel de transferencia entre registros (RTL}


En el nivel de transferencia entre registros (RTL: Register Transfer Level), los
bloques constitutivos bsicos son mdulos construidos a partir de puertas. Estos
mdulos incluyen unidades funcionales (sumadores, comparadores, etc.), componentes de almacenamiento (registros, etc.) y componentes de enrutamiento de los datos
(multiplexores, etc.) Este nivel podra llamarse abstraccin al "nivel de mdulos",
sin embargo en diseo digital se emplea normalmente el trmino "transferencia entre
registros" y nosotros seguiremos esta terminologa.
El trmino "transferencia entre registros" se emplea en dos contextos. Originalmente, el trmino "transferencia entre registros" se usaba para referirse a una
metodologa de diseo en la cual la operacin del sistema se describa indicando
cmo los datos son manipulados y transferidos entre registros de almacenamiento.

61

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Dado que la mayora de los componentes usados en la metodologa de transferencia


entre registros son mdulos de tamao intermedio, el trmino "transferencia entre
registros" se adopt tambin para designar la abstraccin al nivel de mdulos.
En este texto distinguiremos entre ambos usos del trmino. Hablaremos de "nivel
de transferencia entre registros" (RTL: Register Transfer Level) para referirnos a la
abstraccin al nivel de mdulos y llamaremos "metodologa de transferencia entre
registros" a la metodologa especfica de diseo.
La representacin de los datos al nivel de transferencia entre registros es ms
abstracta. Frecuentemente las seales se agrupan entre s y son interpretadas como
un tipo especial de dato, tal como un nmero entero o el estado de un sistema.
La representacin del comportamiento a este nivel usa expresiones generales para
especificar las operaciones funcionales y el camino de los datos, y emplea una mquina de estado finito para describir el sistema diseado mediante la metodologa
de transferencia entre registros.
Una caracterstica importante de la descripcin al nivel de transferencia entre
registros es el uso de una seal de reloj comn en los elementos almacenadores. La
seal de reloj tiene la funcin de sincronizacin, haciendo que se almacenen los datos
en los componentes almacenadores en instantes especficos de tiempo, determinados
por el flanco de subida de la seal de reloj. En un sistema bien diseado, el periodo
de la seal de reloj es lo suficientemente largo como para permitir que todas las
seales se estabilicen dentro del periodo. Puesto que las seales son muestreadas
slo en los instantes de flanco de subida de la seal de reloj, las diferencias en los
retardos de propagacin y los glitches no tienen efecto sobre la operacin del sistema.
Esto permite considerar el tiempo en trminos de nmero de ciclos de la seal de
reloj, en lugar de tener que considerar todos los retardos en la propagacin.
El layout fsico en esta abstraccin se denomina fioor plan. Se emplea para encontrar el camino ms lento entre los elementos de almacenamiento y as determinar
el periodo de la seal de reloj.

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

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

agrupadas e interpretadas como varios tipos de datos. El tiempo se mide en trminos


de pasos de computacin, los cuales estn compuestos de un conjunto de operaciones
que se realizan entre dos instantes sucesivos de sincronizacin.
El layout fsico al nivel de procesador se denomina tambin floor plan. En este
caso, los componentes usados en el fl.oor plan son mucho mayores que los usados en
el nivel de transferencia entre registros.

l. 7. 3.

VHD L en el ft ujo de desarrollo

Como se ha explicado anteriormente, un sistema digital puede ser descrito de


acuerdo a diferentes niveles de abstraccin, y de acuerdo a diferentes representaciones o visiones. A medida que progresa el proceso de diseo, el nivel y la visin
van cambiando, tanto para los diseadores humanos como para las herramientas
software.
Los lenguajes para la descripcin del hardware (HDL) constituyen un marco
para el intercambio de informacin entre diseadores y entre herramientas software.
Permiten modelar y describir el circuito de manera precisa, de acuerdo a la representacin del comportamiento y de acuerdo a la representacin de la estructura, en
cada uno de los cuatro niveles de abstraccin: transistor, puertas lgicas, RTL y
procesador.
Las herramientas de sntesis transforman automticamente una descripcin en
VHDL del comportamiento del circuito al nivel de transferencia entre registros en
una descripcin en VHDL de la estructura del circuito al nivel de puertas lgicas
(netlist al nivel de puertas). Asimismo, puede programarse en VHDL el banco de
pruebas para testear la descripcin RTL del comportamiento y puede emplearse ese
mismo banco de pruebas para testear la descripcin estructural al nivel de puertas.
Puede emplearse una herramienta software para, a partir de la netlist al nivel
de puertas en VHDL, generar automticamente el layout del circuito, que no est
expresado en VHDL.

1.8.

CONCEPTOS BSICOS A TRAVS DE UN EJEMPLO

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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.

Comportamiento al nivel de funciones lgicas

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

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

Tabla 1.1: Tabla de la verdad de un detector de paridad.

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

El cdigo VHDL que describe el circuito, en base a su comportamiento al nivel


de funcin lgica, consta de dos unidades de diseo: entity y architecture.
- La unidad de diseo entity especifica los puertos de entrada y salida del
circuito. El circuito tiene un puerto de salida (par) y un puerto de entrada
(a), que es un vector de tres componentes: a(2), a(1) y a(O). La declaracin de
la entity es mostrada en el Cdigo VHDL 1.1.
La seal par es del tipo std_logic. Una seal del tipo std_logic usa un
sistema lgico con nueve valores. Adems de 'O' y '1', usados para los valores
binarios, hay otros valores que sirven para representar valores intermedios y
desconocidos. Los ms comnmente usados son: 'U' (cuando a la seal no se
le ha asignado todava un valor), 'X' (cuando el valor de la seal no puede ser
determinado, por ejemplo debido a que es generada por dos puertas lgicas,
y una trata de poner el valor de la seal a 'O' y la otra a '1 ') y 'Z' (alta
impedancia).
Los conjuntos de lneas de seal pueden ser usados como un nico elemento (denominado bus) en un circuito lgico digital. El tipo std_logic_vector
representa un vector de seales del tipo std_logic.
- La unidad de diseo architecture especifica la operacin interna y la organizacin del circuito. Se muestra en el Cdigo VHDL 1.2.
Las palabras reservadas (por ejemplo, enti ty, is, port, in, out, end) y los
nombres definidos por el usuario (por ejemplo, not1, xor2, and2, xO, x1, y) pueden
escribirse en VHDL indistintamente en maysculas o en minsculas, puesto que
en VHDL no se diferencia entre los caracteres en mayscula y en minscula. Por
ejemplo, es equivalente escribir en ti ty, ENTITY y EnTi Ty, as como tambin es
equivalente escribir detectorPar y DETECTORPAR.

65

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Detector de nmero par de entradas '1'


-- entity
-- fichero: detector Par. vhd
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;

Cdigo VHDL 1.1: Entity del circuito detector de paridad.

-- Detector de nmero par de entradas '1'


-- architecture comportamiento func logica
-- fichero: comp_funcLog. vhd
library IEEE;
use IEEE. std_logic_1164. all;

architecture comp_funcLog of detectorPar is


signal p1, p2, p3, p4 : std_logic;
begin
par <= ( p1 or p2 ) or ( p3 or p4 ) after 20 ns;
p1 <= ( not a(2) ) and ( not a(1) ) and ( not a(O) ) after 15
p2 <= ( not a(2) ) and
a(1)
and
a(O)
after
p3 <=
a(2)
and ( not a(1) ) and
a(O)
after
p4 <=
a(2)
and
a(1)
and ( not a(O) ) after
end architecture comp_funcLog;

ns;
12 ns;
12 ns;
12 ns;

Cdigo VHDL 1.2: /A rchitecture del detector de paridad describiendo el comportamiento


mediante la funcin lgica.

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

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

La primera lnea de la architecture muestra el nombre del cuerpo, comp_funcLog,


y la correspondiente entity, detectorPar. La siguiente lnea es la declaracin de las
seales:
signal p1, p2, p3, p4 : std_logic;

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

<= ( p1 or p2 ) or ( p3 or p4 ) after 20 ns;


<= ( not a(2) ) and ( not a(1) ) and ( not a(O) ) after 15 ns;
a(1)
a(O)
<= ( not a(2) ) and
and
after 12 ns;
a(O)
<=
a(2)
and ( not a(1) ) and
after 12 ns;
<=
a(2)
a(1)
and
and ( not a(O)
after 12 ns;

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

a(2)
a (1)

(not a (2)) and p1


(not a (1)) and (not a (O))

a (O)
~~

..___

'----

(not a (2)) and


a (1) and
a (O)
a(2) and
(not a (1)) and
a (O)
a(2) and
a (1) and
(not a (O))

p2

_Jr=
-

(p1 or p2) or
(p3 or p4)

par
1---

p4

Figura l. 7: Diagrama conceptual de la architecture comp_funcLog.

p2
p3
par
pi
p4

<= ( not a(2) ) and


a(i)
a(O)
and
after
<=
a(2)
and ( not a(i) ) and
a(O)
after
<= ( pi or p2 ) or ( p3 or p4 ) after 20 ns;
<= ( not a(2) ) and ( not a(i) ) and ( not a(O) ) after
<=
a(2)
a(i)
and ( not a(O) ) after
and

i2 ns;
i2 ns;
i5 ns;
i2 ns;

Al contrario de lo que sucede con las sentencias en un lenguaje de programacin,


las sentencias concurrentes de asignacin a seal son independientes entre s, y
pueden activarse en paralelo.
Si alguna de las seales de entrada cambia de valor en el instante t, la sentencia
concurrente es activada en dicho instante t. Es decir:
l. Se evala la expresin de la parte derecha de la asignacin, usando para ello

el valor que tienen las seales de entrada en dicho instante t.


2. Se planifica asignar a la seal de salida (la situada en la parte izquierda de la
asignacin) el valor calculado, de manera que el nuevo valor se asignar a la
seal una vez haya transcurrido el retardo de propagacin especificado en la
sentencia de asignacin.
Como se explic anteriormente, cuando se realiza el diseo de alto nivel frecuentemente se desconoce el valor del retardo de los bloques circuitales, ya que todava no
se ha realizado la sntesis. Es decir, no se ha especificado cmo va a implementarse en
hardware el bloque circuital. Por este motivo, en el diseo de alto nivel de los circuitos
no suele indicarse explcitamente el valor del retardo, omitindose la clusula after
en las sentencias de asignacin a seal. Por ejemplo, puede escribirse:

68

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

-- Detector de nm ero par de entradas '1 '


-- archit ecture comportamiento fun c log xor
-- fi chero: comp_funcLog_xor. vhd
library IEEE;
use IEEE. std_logic_1164. all;

architecture comp_funcLog_xor of detectorPar is


signa! impar : std_logic;
begin
par
<= not impar;
impar <= a(2) xor a(1) xor a(O);
end architecture comp_funcLog_xor;

Cdigo VHDL 1.3: Architecture del detector de paridad describiendo el comportamiento


mediante la funcin lgica xor.

par<= e pi or p2) ore p3 or p4 );

En este caso, la semntica de VHDL especifica que hay un cierto retardo


implcito asociado a la operacin. El retardo es un retardo infinitesimal, que es
mayor que cero, pero menor que cualquier nmero fsico. La sentencia anterior debe
ser interpretada como:

par <= e pi or p2 ) or e p3 or p4 ) after 5;

As pues, con independencia de que se especifique la clusula after, siempre hay


un retardo de propagacin asociado a una sentencia concurrente.
La tabla de la verdad es slo un mtodo de describir el comportamiento del
circuito. Una alternativa es usar la operacin or-exclusiva (XOR). La operacin orexclusiva puede ser usada para detectar si hay un nmero par de entradas con valor
'1 ', ya que la operacin a EB b vale '1' cuando slo una de las entradas vale '1 '. Por
ello, el circuito puede ser descrito mediante la funcin lgica siguiente:

(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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

a(2)
a (1)

a ( 2) xor a ( 1) xor a (O)

impar
1--------1

not impar

par

a (O)

Figura 1.8: Diagrama conceptual de la architecture comp_funcLog_xor.

a( O)

:~
:
:
:
:
:
:
:
:
:
:
~==
:
.
:

~
.

......~.

~
=
.
::~::::::::::::::::::::::::::::::::::::
___

a(2)
........................................
........................................

......

...

unitl

Figura 1.9: Diagrama estructural (esquemtico) al nivel de puertas.

1.8.2.

Descripcin de la estructura

En la visin estructural, el circuito est compuesto de componentes (esto es,


bloques circuitales) conectados entre s. La descripcin especifica el tipo de cada
componente y su conexin. Para ello, en el cuerpo de la architecture, el componente
primero debe ser declarado, y a continuacin instanciado y conectado.
En la Figura l. 9 se muestra el diagrama estructural del circuito que detecta un
nmero par de entradas con valor '1 '. El circuito est compuesto de dos puertas
XOR y un inversor. Esta descripcin corresponde con la funcin lgica mostrada en
la Ec. (1.3). En el Cdigo VHDL 1.4 se define la puerta inversora y la puerta XOR
de dos entradas.
Una vez definidas las puertas lgicas, puede describirse el circuito de la manera
mostrada en el Cdigo VHDL 1.4. Obsrvese que la descripcin de los componentes
(en este caso las puertas XOR y NOT) puede codificarse en ficheros diferentes y
compilarse separadamente del fichero en el cual se define el circuito. Esto permite
crear libreras de componentes y facilita la reutilizacin del cdigo.
Dentro de la architecture, en primer lugar se declaran los componentes. Por
ejemplo, la declaracin de la puerta XOR es la siguiente.
component xor2 is
port ( yO

xO, x1
end component xor2;

70

out std_logic;
in std_logic );

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

-- Inversor de 1 entrada: not1


-- fichero: notl. vhd
library IEEE; use IEEE. std_logic_1164. all;
entity not1 is
port ( yO : out std_logic;
xO : in std_logic ) ;
end entity not1;
architecture not 1 of not 1 is
begin
yO <= not xO;
end architecture not 1;
-- OR exclusiva de 2 entradas: xor2
-- fichero: xor2. vhd
library IEEE; use IEEE. std_logic_1164.all;
entity xor2 is
port ( yO
: out std_logic;
xO, x1 : in std_logic );
end entity xor2;
architecture xor2 of xor2 is
begin
yO <= xO xor x1;
end architecture xor2;
-- Detector de nmero par de entmdas '1'
-- architecture estructura puertas xor-not
-- fichero: estruc_xor_not. vhd
library IEEE;
use IEEE. std_logic_1164. all;
architecture estruc_xor _not of detectorPar
component xor2 is
port ( yO
: out std_logic;
xO, x1 : in std_logic );
end component xor2;
component not 1 is
port ( yO : out std_logic;
xO : in std_logic ) ;
end component not 1;
signal s 1, s2 : std_logic;
begin
unit1 : xor2 port map ( xO => a(O), x1
unit2 : xor2 port map ( xO = > s1,
x1
unit3 : not1 port map ( xO => s2,
yO
end architecture estruc_xor _not;

is

= > a(1), yO = > s1 );


= > a(2), yO = > s2 );
= > par );

Cdigo VHDL 1.4: Puerta inversora. Puerta XOR con dos entradas. Architecture del detector
de paridad describiendo la estructura del circuito.

71

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

La informacin contenida dentro de la declaracin es similar a la declaracin de


la entity del componente, en la cual se especifican sus puertos de entrada y salida.
Aparte de la declaracin de los componentes, en la architecture se declaran
tambin dos seales internas:
signa! s1, s2 : std_logic;

El cuerpo de la architecture consiste en tres sentencias, en cada una de las


cuales se instancia y conecta un componente. La primera es:
unit1 : xor2 port map ( xO => a(O), x1 => a(1), yO=> s1 );

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.

Descripcin abstracta del comportamiento

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

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

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;

En el bloque process puede especificarse una lista de seales, denominada lista de


sensibilidad, que defina las condiciones para la ejecucin del bloque: cuando cambia
el valor de alguna de las seales incluidas en esta lista, entonces se ejecuta el cuerpo
del bloque process.
A continuacin, se muestran dos ejemplos de descripcin abstracta del comportamiento del circuito detector de un nmero par de entradas '1'.
El primer ejemplo, mostrado en el Cdigo VHDL 1.5, corresponde conceptualmente con el diagrama mostrado en la Figura 1.10. La architecture comp_red_xor
contiene un bloque process, que utiliza una variable y un bucle for. Al contrario de
lo que sucede con las seales y las asignaciones a seales, la variable y el bucle no
tienen una correspondencia directa con el hardware. El bloque process se trata como
una unidad indivisible, cuyo comportamiento es especificado mediante sentencias
secuenciales.
El segundo ejemplo usa nicamente un bloque process, en el cual se describe el
algoritmo que realiza la operacin que se desea que realice el circuito. Se muestra
en el Cdigo VHDL 1.6. En primer lugar, el algoritmo suma el nmero de '1' en las
entradas, calcula el resto de la divisin entre 2, y finalmente usa una sentencia if
para generar el resultado en funcin del valor del resto de la divisin. Puesto que
la architecture contiene nicamente un bloque process, el diagrama conceptual
contiene un nico bloque, tal como se muestra en la Figura 1.11. El cdigo es muy
fcilmente comprensible y sencillo de programar, y no contiene ninguna informacin
acerca de cmo debe ser convertido en hardware.

73

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- D etector de nmero par de entradas '1 '


-- aTchitecture comportamiento Ted xor
-- fichero: comp_recLxor. vhd
library IEEE;
use IEEE. std_logic_1164. all;

architecture comp_red_xor of detectorPar is


signal impar : std_logic;
begin
par
<= not impar;
process (a)
variable tmp : std_logic;
begin
tmp := '0';

for i in 2 downto O loop


tmp := tmp xor a(i);
end loop;
impar

<= 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

Figura 1.10: Diagrama conceptual de la architecture comp_recLxor.

74

par

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

-- Detector de nmero par de entradas '1 '


-- architect7LTe comportamiento algoTitmo
-- fic hem: comp_alg. vhd
library IEEE;
use IEEE . std_logic_1164. all;

architecture comp_alg of detectorPar is


begin
process (a)
variable suma, r : integer;
begin
suma :=O;

for i in 2 downto O loop


if a( i) = ' 1 ' then
suma := suma

end if;
end loop;

+ 1;

r := suma mod 2;

if (r

o) then

par < = '1';

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

Figura 1.11: Diagrama concept ual de la architecture comp_alg.

75

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

1.8.4.

Banco de pruebas

Uno de los usos principales de un programa en VHDL es la simulacin, que se usa


para estudiar la operacin del circuito y para verificar que el diseo se ha realizado
correctamente. Realizar una simulacin es similar a realizar un experimento con el
circuito real, en el cual se conectan las entradas del circuito a un generador de seales
y se observan las salidas del circuito empleando un analizador lgico.
Simular una descripcin VHDL es como realizar un experimento virtual, en el
cual el circuito fsico es reemplazado por la correspondiente descripcin VHDL. Se
pueden programar unas rutinas en VHDL que generen los vectores de test y otras
que comparen las respuestas obtenidas de aplicar los vectores de test al circuito, con
las respuestas que deberan obtenerse del circuito.
El Cdigo VHDL 1.7 es un banco de pruebas para el circuito detector de un
nmero par de entradas '1'. El banco de pruebas consta de una entity y una
architecture. Puesto que el banco de pruebas est autocontenido, la entity no
tiene ningn puerto. La architecture consta de tres sentencias concurrentes: la
instanciacin del componente a testear y dos bloques process. Un bloque process
se usa para generar los vectores de test y el otro se usa para comprobar que las
salidas del circuito son correctas.
El bloque process llamado vecLtest es el generador de estmulos: produce todas
las combinaciones de valores de la entrada al circuito, desde "000" hasta "111". Cada
una de las combinaciones de las entradas se mantiene durante 200 ns. Obsrvese que
las comillas simples (' ') se usan para los bits individuales, mientras que las comillas
dobles (" ") se usan para los vectores.
El segundo bloque process, llamado verif, espera a que se produzca un cambio
en las seales de entrada, a continuacin espera 100 ns ms, con el fin de permitir
que se estabilicen las seales de salida del circuito, y entonces comprueba el valor
obtenido de las salidas con el valor correcto conocido. Si ambos valores no coinciden,
muestra un mensaje indicando el error.
En este punto no es importante entender los detalles de la definicin de los bloques
process, tan slo importa entender el concepto. En la Figura 1.12 se muestra un
esquema conceptual del banco de pruebas.

76

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

-- Banco de pruebas del detector de nmero par de entradas '1 '


-- fichero: bp_detectorPar.vhd
library IEEE; use IEEE . std_logic_1164. all;
entity bp_detectorPar is
end entity bp_detectorPar;
ar-r.;hitecture bp_arch of bp_detectorPar is
component detectorPar is
port ( par
out std_logic;
a
in
std_logic_vector(2 downto o) );
end component detectorPar;
signal test_in : std_logic_vector(2 downto O);
signal test_out : std_logic;
begin
-- Instancia del circuito que va a ser testeado
UUT : detectorPar port map ( par => test_out, a => test _in );
-- Vectores de test
vect_test: process
begin
wait for 200 ns;
test_in <= "000";
wait for 200 ns;
test_in <= "001";
wait for 200 ns;
test_in <= "010";
wait for 200 ns;
test_in <= "011";
wait for 200 ns;
test_in <= "100";
wait for 200 ns;
test_in <= "101";
wait for 200 ns;
test_in <= "110";
wait for 200 ns;
test_in <= "111";
end process vect_ test;
-- Verificacin de las salidas
verif : process
variable error _status : boolean;
begin
wait on test_in;
wait for 100 ns;
if ( ( test_in = "000" and test_out = '1 ') or
( test_in
"001" and test out
'0') or
( test_in
"010" and test_out
'0') or
( test_in
"011" and test out
'1 ') or
( test_in
"100" and test out
'0') or
( test_in
"101" and test_out
'1 ') or
( test_in = "110" and test out
'1 ') or
( test_in
"111" and test_out = 'o') )
then
error_status := false;
el se
error _status := true;
end if;
assert not error _status report "Test fallado. 11 severity note;
end process verif;
end architecture bp_arch;

Cdigo VHDL l. 7: Banco de pruebas del detector de paridad.

77

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

vect_ test: procesa


begin
test_in <= "000";
wait for 200 ns;
test_in <= " 00 1" ;
wait for 200 ns;
test_in <= "010";
wait for 200 ns ;
test_in < = 11 01 1" ;
wait for 200 ns;
test_in <= 11 100";
wait for 200 ns;
te st_in <= 11 1 01 11 ;
wait for 200 ns;
test_in <= "110 11 ;
wait for 200 ns;
test in <= "111 11 ;
wait- for 200 ns;
end procesa vect_test;

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;

Figura 1.12: Diagrama conceptual del banco de pruebas.

1.8.5.

Configuracin

El lenguaje VHDL separa de manera intencionada la declaracin de la entity


y la architecture en dos . unidades de diseo independientes. Esto facilita asociar
mltiples architecture con una determinada entity.
Por ejemplo, la entity detectorPar de esta seccin tiene media docena de architecture. A la hora de realizar la simulacin y la sntesis, debemos especificar qu
architecture asociar con la entity. Esto puede hacerse definiendo una configuration, como la mostrada en el Cdigo VHDL 1.8 para nuestro circuito ejemplo. Si no
se ha definido una configuration, el entorno de simulacin escoger por defecto la
ltima architecture que ha sido compilada.
-- Detector de nmero par de entradas '1'
-- Configuration
--fichero: conf_detectorPar.vhd
configuration conf_detectorPar of bp_detectorPar is
for bp_arch
for uut: detectorPar
use entity work. detectorPar( comp_alg);
end for;
end for;
end configuration conf _detectorPar;

Cdigo VHDL 1.8: Configuration para la simulacin del banco de pruebas del detector de
paridad.

78

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

1.9.

DOS SIMULADORES DE VHDL'93: VERIBEST Y MODELSIM

En este texto se proponen diferentes casos de diseo de circuitos digitales usando


el lenguaje VHDL, que el alumno debe simular en su propio ordenador empleando
algn simulador de VHDL'93. En los Apndices A y B se proporcionan algunas
indicaciones bsicas para la instalacin y manejo de dos simuladores de VHDL'93:
VeriBest VHDL y ModelSim PE Student Edition. Cualquiera de los dos puede
emplearse para la simulacin de los modelos planteados en este texto.
El simulador VeriBest VHDL fue desarrollado por la compaa VeriBest Inc.
Cuando esta compaa pas a formar parte de la corporacin Mentor Graphics,
dej de darse soporte al simulador VeriBest VHDL, siendo ste sustituido por el
simulador M odelSim.
La nica ventaja de VeriBest es que funciona para casi todas las versiones antiguas de Windows: Windows NT 4.0, Windows 95, Windows 98, etc. Por tratarse de
una herramienta software del ao 1998, resulta adecuada para su uso en ordenadores
con limitadas prestaciones. Si ste no es el caso, es decir, si el alumno dispone de
un ordenador relativamente moderno, es preferible emplear M odelSim en lugar de
VeriBest VHDL.
Aparte de estos dos simuladores de VHDL'93, en Internet pueden encontrarse
otros. Asimismo, existen versiones gratuitas de herramientas orientadas no slo a la
simulacin, sino tambin a la sntesis, entre las que cabe destacar Quartus JI Web
Edition, que puede descargarse gratuitamente del sitio web de la compaa Altera
Corporation.

1.9.1.

Diseo de un buffer triestado

En los Apndices A y B se emplea el modelo de un buffer triestado para ilustrar


las explicaciones acerca del manejo del simulador. A continuacin, se describe el
modelo VHDL del buffer triestado y de su banco de pruebas.
El buffer triestado se emplea comnmente para conectar varios dispositivos a
un mismo bus. Tal como se muestra en la Figura 1.13, el buffer triestado tiene dos
entradas (d y E) y una salida (y). Dependiendo del valor de la entrada E, la salida
puede tomar el valor de la entrada o el valor Z (alta impedancia). Cuando el buffer
se encuentra en el estado de alta impedancia, se comporta como un circuito abierto.

79

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

b)

Figura 1.13: Buffer triestado: a) smbolo lgico; b) tabla de la verdad.

-- Modelo del buffer triestado


-- buffer Triestado. vhd
library IEEE;
use IEEE. std_logic_1164.all;

entity Buffer_TriEstado is port


( y : out std_logic;
E : in std_logic;
d : in std_logic ) ;
end entity Buffer_TriEstado ;
architecture Behavioral of Buffer_TriEstado is
begin
process (E, d)
begin
if (E = ' 1 ') then
y<= d;
else
y<= 'Z';
end if;
end process;
end architecture Behavioral;

Cdigo VHDL 1.9: Buffer triestado.

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.

Diseo del banco de pruebas

Una vez descrito el circuito, el siguiente paso es programar su banco de pruebas.


El banco de pruebas mostrado en el Cdigo VHDL 1.10 genera las 22 posibles
combinaciones de entrada al buffer.

80

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

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

entity bp_Buffer_TriEstado is
end entity bp_Buffer_TriEstado;
architecture bp_Buffer_TriEstado of bp_Buffer_TriEstado is
signa} y
: std_logic; -- Conectar salida UUT
signa} d, E : std_logic; -- Conectar entradas UUT
component Buffer_ TriEstado is port
( y
: out std_logic;
E, d : in std_logic ) ;
end component Buffer_TriEstado;
begin
-- Instanciar y conectar UUT
uut : component Buffer_TriEstado port map
( y => y, E => E, d => d );
gen_ ve e_ test : process

begin

E <= '0'; d <= '0';


wait for 10 ns;
d <= '1';
wait for 10 ns;
E<= '1';
wait for 10 ns;
d <= '0';
wait for 10 ns;
report "Final de la simulacin";
wait;
end process gen_ ve e_ test;
end architecture bp_Buffer_TriEstado;

Cdigo VHDL 1.10: Banco de pruebas del buffer triestado.

+
+
+

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

Figura 1.14: Simulacin del banco de pruebas del buffer triestado.

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

La interfaz del banco de pruebas no contiene ningn puerto. En la architecture


se instancia el circuito que va a ser probado (UUT) y se definen las seales y, E
y d, que son conectadas a los puertos del UUT. En el bloque process llamado
gen_vec_test, se define la secuencia de vectores de test que son aplicados al UUT.
En la Figura 1.14 se muestra el resultado obtenido de simular el banco de pruebas.
La salida del buffer toma el valor de alta impedancia (Z) desde el instante O ns hasta
el instante 20 ns. Esto de debido a que durante ese tiempo se asigna E = 'O' (en la
figura aparece e en lugar de E, debido a que VHDL no diferencia entre maysculas
y minsculas). Desde ese instante, hasta el final de la simulacin (40 ns), la salida
del circuito (y) toma el mismo valor que la entrada d.
En los siguientes temas de esta Uni dad Didctica se explicar con detalle la
forma en que debe realizarse el diseo de los circuitos y de sus bancos de pruebas.
La finalidad de este ejemplo del buffer triestado es simplemente proporcionar cdigo
VHDL sencillo con el cual aprender el manejo del simulador de VHDL.
Se sugiere al alumno que escoja en este punto qu entorno de simulacin va
a emplear. Si decide usar VeriBest, la gua de instalacin y uso del Apndice A
puede serle til. Por el contrario, si decide usar ModelSim (lo cual recomendamos),
encontrar la correspondiente gua en el Apndice B.

1.10.

LECTURAS RECOMENDADAS

El Captulo 1 de (Chu 2006) proporciona informacin adicional acerca de los


niveles de abstraccin en la representacin de los sistemas digitales, y acerca del ciclo
de diseo del hardware digital y el papel de los HDL. Acerca de las caractersticas
de los lenguajes para la descripcin del hardware, se recomienda la consulta del
Captulo 2 de (Chu 2006). El Captulo 2 de (Lee 2006) es una buena referencia
acerca del diseo de lgica digital usando lenguajes para la descripcin del hardware.
En (Armstrong & Gray 2000) puede encontrarse informacin adicional acerca de las
diferentes tecnologas de circuitos integrados y acerca de la integracin de VHD L en
la metodologa de diseo.

82

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Ejercicio 1.5

Seale al menos tres de las causas de mal funcionamiento de los chips ms


comnmente observadas en la prctica.

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

Dado el circuito mostrado en la Figura 1.15, indique un vector de test que


permita detectar que el nodo E (nodo de entrada a la puerta ancL2) se encuentra
permanentemente a l.

84

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

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

Figura 1.15: Circuito a testear, correspondiente al Ejercicio l. 7.

Ejercicio 1.8

Se ha diseado usando VHDL un circuito para controlar la alarma de seguridad


de un coche. La alarma de seguridad del coche se enciende siempre que, estando la
llave del coche puesta en el contacto, la puerta del coche est abierta o el cinturn
de seguridad del conductor no est abrochado. El circuito tiene las seales de salida
y de entrada siguientes:
- Warning: se pone a 1 para encender la alarma.
- Igni tion: se pone a 1 si la llave del coche est puesta en el contacto.
- Door: se pone a 1 si la puerta est cerrada.
- Sbelt: se pone a 1 si el cinturn del conductor est abrochado.

Indique razonadamente qu tipo de representacin y nivel de abstracciones tienen


las dos descripciones del circuito de control de alarma de un coche mostradas en el
Cdigo VHDL 1.11 y 1.12.

85

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

---Circuito de control de la alarma de un coche. Fichero: buzzer 1. vhd


library IEEE;
use IEEE. std_logic_1164. all;

entity buzzer is
port ( Warning

: out std_logic;
Door, Ignition, Sbelt : in std_logic);
end entity buzzer;

architecture buzzer1 of buzzer is


begin
Warning

<= (not

Door and Ignition) or (not SBelt and Ignition);

end architecture buzzer1;

Cdigo VHDL 1.11: Diseo del circuito de control de la alarma de seguridad de un coche.

---Circuito de control de la alarma de un coche. Fichero: buzzer2. vhd


library IEEE;
use IEEE. std_logic_1164. all;

entity BUZZER is
port ( Warning

: out std_logic;
Door, Ignition, Sbelt : in std_logic);
end entity BUZZER;

architecture buzzer2 of buzzer is


signal Door _not, Sbel t_not, B1, B2: std_logic;
component AND2
port ( yO
: out std_logic;
xO, x 1 : in std_logic);
end component;
component OR2
port ( yO
: out std_logic;
xO, x1 : in std_logic);
end component;
component NOT1
port ( yO : out std_logic;
xO : in std_logic);
end component;
begin
UO
U1
U2
U3
U4

:
:
:
:
:

NOT1
NOT1
AND2
AND2
OR2

port
port
port
port
port

map
map
map
map
map

(Door _not, Door);


(Sbelt_not, Sbelt);
(B1, Ignition, Door_not);
(B2, Ignition, Sbelt_not);
(Warning, B1, B2);

end architecture buzzer2;

Cdigo VHDL 1.12: Diseo alternativo del circuito de control de la alarma de seguridad de un
coche.

86

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

1.12.

SOLUCIONES DE LOS EJERCICIOS

Solucin al Ejercicio 1.1


Una descripcin HDL es ms portable que un diseo esquemtico ya que la
descripcin HDL es simplemente un fichero de texto y no tiene que ser, como en el
caso de los diseos esquemticos, visualizado y editado empleando la herramienta
grfica especfica del entorno de CAD con el que se ha creado.

Solucin al Ejercicio 1.2


La anterior afirmacin es falsa, ya que la descripcin obtenida como salida de
la herramienta de sntesis depende no slo de la descripcin HDL de entrada, sino
tambin de la herramienta de sntesis empleada y de las especificaciones introducidas
en la herramienta. En particular, las herramientas de sntesis 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.

Solucin al Ejercicio 1.3


El coste de produccin (Cprod) depende del coste de fabricacin (Cab), del coste
de ingeniera (Cing) y del nmero de unidades producidas, como se muestra en la
Ecuacin 1.1.
Al producir una nica unidad, el
La tecnologa FPGA no tiene
tienen las otras dos tecnologas.

Cprod

Cing,

resultante es la suma de

pero tiene un valor de

Cab

Cab

Cing

mayor que el que

El valor de la suma C fab + Cing tanto de la tecnologa standard cell como de la


tecnologa gate array es mayor que el valor de Cab de la tecnologa FPGA, que es
igual al valor de su Cprod
Como resultado, para producir una nica unidad la tecnologa FPGA es la que
tiene un Cprod menor.
Por tanto, se elegir el empleo de la tecnologa FPGA.

87

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Solucin al Ejercicio 1.4


La opcin A es falsa, ya que la tecnologa FPG A es la que consume mayor
cantidad de potencia de las tres.

Solucin al Ejercicio 1.5


Abiertos, cortos y acopios.

Solucin al Ejercicio 1.6


En la Tabla 1.2 se muestra para cada combinacin de entrada cul es la salida
correcta del circuito y cul es la salida debida a cada patrn de fallo.
Tabla 1.2: Salidas de la puerta AND de 2 entradas para varios patrones de fallos.

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

Un vector de test que detecta un determinado patrn de fallo es una combinacin


de valores de las seales de entrada, que hace que difiera la salida incorrecta de la
salida correcta.
Obsrvese que para los patrones de fallo A/0, B /0 y z /0 la salida incorrecta slo
difiere de la salida correcta cuando las seales A y B del circuito tienen valor 1
(vector de test "11"). Este vector de test no nos va a permitir saber cul de los tres
fallos se est produciendo.
- El patrn de fallo A/1 slo se detecta con el vector de test "01".
- El patrn de fallo B /1 slo se detecta con el vector de test "10".
- El patrn de fallo z /1 se puede detectar con los vectores de test "00", "O 1" y
"10'. Obsrvese que cualquier vector de test que detecte los patrones de fallos
A/1 o B /1, detecta tambin este patrn de fallo.

88

FUNDAMENTOS DEL DISEO DEL HARDWARE DIGITAL

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.

Si se ponen A o B a O, el valor correcto de la salida del circuito (y) es O. Pero, a


causa del fallo, la salida y va a tener valor l.
Por tanto, el vector de test que pone A a O, B a O,
detectar el fallo.

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.

Solucin al Ejercicio 1.8


El Cdigo VHDL 1.11 es una representacin del comportamiento del circuito,
expresada mediante funciones lgicas.
El Cdigo VHDL 1.12 es una representacin estructural del circuito al nivel de
puertas lgicas.

89

TEMA 2

CONCEPTOS BSICOS DE VHDL

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

CONCEPTOS BSICOS DE VHDL

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

- Discutir qu finalidad tienen las libreras en VHDL y conocer las libreras ms


comnmente usadas.
- Discutir la utilidad de los procedimientos y funciones de VHDL.
- Discutir la finalidad de las sentencias assert y report.

94

CONCEPTOS BSICOS DE VHDL

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

Se denomina entidad de diseo al bloque constitutivo bsico para la descripcin


del hardware en VHDL. Consta al menos de las dos unidades de diseo siguientes:

- Entity: representa la definicin de la interfaz entre el diseo y el entorno en el


cual se usa. Esta definicin incluye los puertos de conexin (seales de entrada
y/ o salida) del circuito y sus constantes generic, as como declaraciones y
sentencias que forman parte del diseo.
- Architecture: permite definir el comportamiento y la estructura de la entidad
de diseo. Es decir, cmo los puertos de salida de la entidad de diseo se
relacionan con sus puertos de entrada.

95

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

library IEEE;
use IEEE. std_logic_1164. all;
entity detectorPar is
port ( par : out std_logic;
a
: in
std_logic_vector( 2 downto O) ) ;
end entity detectorPar;
architecture comp_funcLog of detectorPar is
signal p1, p2, p3, p4 : std_logic;
begin
par < = ( p 1 or p2 ) or ( p3 or p4 ) ;
pi <= ( not a(2) ) and ( not a(1) ) and ( not a(O) );
p2 <= ( not a(2) ) and a(1) and a(O);
p3 <= a(2) and ( not a(1) ) and a(O);
p4 <= a(2) and a(1) and ( not a(O) );
end architecture comp_funcLog;

Cdigo VHDL 2.1: Circuito detector de paridad.

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

CONCEPTOS BSICOS DE VHDL

lugar. La descripcin de la sintaxis y uso de la unidad de diseo configuration est


fuera del propsito de este texto.

2.3.

ENTITY

La entity especifica la interfaz del diseo, definiendo la parte de l que es visible


desde "el mundo exterior".
En el Tema 1 se mostraron algunos ejemplos de declaracin de entity. As, en
el Cdigo VHDL l. 7, que describe un banco de pruebas para el circuito detector de
paridad, se encuentra la declaracin
entity bp_detectorPar is
end entity bp_detectorPar;

que slo contiene el nombre asignado a la entity, bp_detectorPar, y las siguientes


palabras reservadas del lenguaje: entity, is y end. En la entity se declara la lista
de seales que componen la interfaz del circuito. A estas seales de la interfaz se las
denomina puertos. Dado que la interfaz del banco de pruebas no contiene ninguna
seal, en su entity no se declara ningn puerto.
Tambin se vieron ejemplos en el Tema 1 de declaracin de la entity de algunos
circuitos, como pueden ser puertas lgicas y el circuito detector de paridad. En estos
casos, la declaracin de la entity comprende la declaracin de los puertos. Otros
ejemplos se muestran en la Figura 2.1, donde se declaran las interfaces de las puertas
lgicas NOT, XOR y AND. A continuacin, se explica con detalle la declaracin de
los puertos, la cual se realiza en la clusula port.

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

....................... ,............
...

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;

Figura 2.1: Interfaces de las puertas NOT, XOR y AND.

97

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

2.3.1.

Clusula port

Las seales de la interfaz, a las que se denomina puertos, se declaran mediante


la clusula opcional port, en la cual se indica el nombre de los puertos, su modo y
su tipo. La sintaxis es:
entity nombre_enti ty is
port (
nombres_puertos
modo tipo_dato;
modo tipo_dato;
nombres_puertos

nombres_puertos

modo tipo_dato

) ;

end entity nombre_entity;

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

Figura 2.2: Puerto I/0 bidireccional con doble buffer triestado.

98

CONCEPTOS BSICOS DE VHDL

El modo del puerto bi es inout. El comportamiento del puerto I/0 puede


describirse de la forma siguiente:
bi
<= sig_out when dir='1' else 'Z';
sig_in <= bi
when dir='O' else 'Z';

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::
......... . .... ..........

1..... : ........... .:. ... 1

::::::::::::::::::::::::::;:::::::::::::::::::

Figura 2.3: Circuito usado para explicar el modo de los puertos.

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

d .-. ;,.

Interpretacin del compilador de


VHDL sobre el flujo de la seal

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

Otra clusula opcional que puede declararse en la entity es la clusula generic.


La clusula se usa para declarar aquellas constantes cuyo valor necesite ser modificado a fin de adaptar el diseo a sus diferentes aplicaciones. A estas constantes se
las denomina constantes generic.
Las constantes generic son visibles desde la propia entity en que son declaradas y
desde las architecture asociadas a la entity. Ejemplos tpicos de constantes generic
son el valor de determinados retardos, el nmero de bits de un bus de seales, etc.
Un ejemplo sencillo de declaracin de entity incluyendo una clusula generic es el
siguiente:
entity and2 is
generic ( Tpd: time);
port
( yO : out std_logic;
xO, x1 : in std_logic );
end entity and2;

100

CONCEPTOS BSICOS DE VHDL

Esta entity incluye una constante generic, Tpd, del tipo predefinido time.
El valor de esta constante generic puede ser usado en el cuerpo de cualquier
architecture asociada a esta entity. En la 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.

Resumen de la sintaxis de la entity

Resumiendo lo anterior, la declaracin de la entity tiene la sintaxis mostrada


a continuacin. La declaracin comienza por la palabra reservada entity, seguida
del nombre asignado a la entity y de la palabra reservada is. A continuacin, se
escriben las clusulas generic y port, y las declaraciones. Finalmente, se escriben las
sentencias. La palabra reservada begin separa la parte declarativa de las sentencias,

101

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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;

Por ejemplo, a continuacin se muestra la entity de un registro de desplazamiento


de longitud N bits:
entity shiftReg is
generic (N : integer );
port
( SO
out
RSTn, clk, SI : in
signal T: std_logic_vector(
begin
assert (N>3) and (N<33)
report "N fuera del rango
end entity shiftReg;

std_logic;
std_logic );
N downto O);

4 a 32";

En la entity pueden declararse seales, como es el caso de la seal T del cdigo


anterior. Aunque este tipo de declaraciones es legal, en general no se considera una
buena prctica de diseo. Es preferible declarar las seales que no pertenecen a la
interfaz del diseo en las architecture, no en la entity.

2.4.

ARCHITECTURE

La architecture permite definir el comportamiento y la estructura de la entidad


de diseo. Esta definicin puede realizarse mediante:
- Una descripcin estructural, en la cual el componente es descrito mediante la
instanciacin y conexin de otros componentes de ms bajo nivel.
- Una descripcin de su comportamiento, en la que se describe el comportamiento que debe tener el componente.
- Una descripcin mixta de la estructura y del comportamiento, que incluya la
instanciacin y conexin de componentes de ms bajo nivel, y cdigo describiendo el comportamiento.

102

CONCEPTOS BSICOS DE VHDL

xo

EG

..-..................................,-

yO

architecture not of not is


begin
yO <= not xO;
end architecture not;

..-...................................-.

:~ PI.. 2. ...lyo

:~ l. ..!. . . . 2. . . .l

architecture xor2 of xor2 is


begin
yO <= xO xor x1;
end architecture xor2;

architecture and2 of and2 is


begin
yO <= xO and x1;
end architecture and2;

yO

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

Por ejemplo, en la Figura 2.5 se muestran las architecture que describen el


comportamiento de las puertas lgicas NOT, XOR y AND. Las correspondientes
entity son las definidas en la Figura 2.1.
En los ejemplos mostrados en las Figuras 2.1 y 2.5 se ha dado el mismo nombre
a la entity y a la architecture de cada entidad de diseo. En general, se les puede
dar nombres diferentes. De hecho, como ya hemos visto, en VHDL pueden definirse
varias architecture para una misma entity. De este modo, es justamente a la hora
de realizar la simulacin o la sntesis cuando se asocia una architecture en concreto
a la entity.
A grandes rasgos, la definicin de la unidad de diseo architecture tiene la
sintaxis siguiente:
architecture nombre_archi tecture of nombre_enti ty is
Declaracin de seales locales y constantes locales
Declaracin de los componentes
Declaracin de los subprogramas (procedimientos y funciones)
begin
Instanciacin de los componentes
Asignaciones concurrentes a seales y bloques process
end architecture nombre_architecture;

El rea de texto previa a la palabra reservada begin es la parte declarativa. Es


donde se declaran las seales y constantes (todas ellas locales a la definicin de la
architecture), los componentes que van a ser instanciados en la architecture y
los subprogramas. Entre las palabras reservadas begin y end se define la estructura
y el comportamiento de la entidad de diseo. Para ello, pueden emplearse sentencias
concurrentes de asignacin a seal, bloques process, y la instanciacin y conexin
de componentes. En las Secciones 2.5, 2.7 y 2.9 se explicar detalladamente cada uno
de estos recursos que proporciona VHDL para la descripcin del comportamiento y
la estructura.

103

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

2.5.

ASIGNACIONES CONCURRENTES

Las asignaciones a seales directamente contenidas entre las palabras reservadas


begin y end de la architecture se denominan asignaciones concurrentes, debido a
que todas ellas se ejecutan de forma concurrente. Es decir, el orden de ejecucin de
las sentencias concurrentes no est determinado por el orden en que se han escrito.
VHDL tiene dos tipos de asignaciones concurrentes a seal: la asignacin concurrente condicional y la asignacin concurrente de seleccin. Las asignaciones
concurrentes simples (por ejemplo, e <= u and v;) pueden considerarse un caso
particular de asignacin condicional, en la cual no hay expresin condicional. A
continuacin, analizaremos cada uno de estos tres tipos de asignacin concurrente a
seal.

2.5.1.

Asignaciones concurrentes simples

Las asignaciones concurrentes simples tienen la sintaxis siguiente:


seal <= forma_de_onda;

donde la clusula forma_de_onda consiste en la especificacin de la expresin para


el clculo del nuevo valor de la seal y la especificacin del tiempo que transcurre
(retardo) entre el clculo de dicho valor y su asignacin a la seal.
La ejecucin de una sentencia de asignacin concurrente simple se produce en
el instante en que cambia el valor de alguna de las seales que aparecen en la
expresin escrita a la derecha del smbolo<=. Por ejemplo, la sentencia de asignacin
concurrente
yO <= not xO;

es ejecutada cada vez que se produce un cambio en el valor de la seal xO. En


la terminologa de VHDL, se dice que esta sentencia, de la cual se calcula yO, es
"sensible" a la seal xO.
En la sentencia
yO <= not xO;

no se especifica el retardo entre el instante en que se calcula el nuevo valor de la


seal yO y el instante en el cual este nuevo valor se asigna a la seal yO. Cuando
no se especifica el retardo, VHDL considera que existe un retardo infinitesimal 6.
Es decir, la expresin not xO se evala en el instante en que cambia el valor de xO,

104

CONCEPTOS BSICOS DE VHDL

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;

es ejecutada cada vez que se produce un cambio en el valor de la seal u o en el


valor de la seal v. Se dice que la sentencia de asignacin es "sensible" a las seales
u y v. La asignacin del nuevo valor a e se produce transcurrido un retardo 5.
La asignacin concurrente
y <= x1 + x2 after 10 ns;

indica que en el instante en que x1 o x2 cambien, debe evaluarse la expresin x1 +x2,


y el resultado debe asignarse a la seal y transcurridos 10 ns de retardo inercial.
Puede emplearse la clusula transport para indicar que el retardo en la asignacin
del nuevo valor a la seal es un retardo de transporte:
y <= transport x1 + x2 after 10 ns;

La informacin temporal de la clusula forma_de_onda normalmente corresponde


al retardo en la propagacin de las seales que se produce internamente en los
componentes fsicos usados para realizar el clculo del nuevo valor de la seal.
Sin embargo, dado que los retardos dependen de los componentes, la tecnologa,
el cableado ( routing) entre componentes, etc., es imposible sintetizar un circuito con
un determinado valor del retardo. Por ello, en el cdigo VHDL usado para sntesis
no se especifica el retardo de los componentes, usndose en su lugar el retardo 5. En
este caso, la sintaxis es:
seal <= expr_nuevo_valor_seal;

donde se omite la clusula after e implcitamente se entiende que la asignacin del


nuevo valor a la seal se produce tras un retardo 5.
La implementacin conceptual de las asignaciones concurrentes simples es sencilla. La asignacin puede ser traducida mediante un bloque circuital, cuya salida
es la seal situada en el lado izquierdo de la asignacin y cuyas entradas son las
seales situadas en el lado derecho de la asignacin. Cada operador que interviene
en la asignacin es reemplazado por un bloque circuital, cuyas entradas y salidas
son conectadas adecuadamente.
Por ejemplo, en la Figura 2.6 se muestra la implementacin conceptual de las
tres sentencias de asignacin concurrente siguientes:

105

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

a
b
e

xl
x2

---1

x3

---1

x4

---1

---1

Figura 2.6: Diagrama conceptual de tres asignaciones concurrentes simples.

y <= '1';
y <= a + b + e - 1;

y<= ( x1 and x2) or ( x3 and x4 );

Es posible definir asignaciones en las cuales una misma seal aparece en el


lado izquierdo y derecho de la sentencia de asignacin, si bien es una prctica
desaconsejable. Cuando una seal aparece como entrada (en el lado derecho) y salida
(en la parte izquierda) de la sentencia de asignacin, se forma un lazo cerrado de
realimentacin, que da lugar a la creacin de un estado interno o a comportamiento
oscilatorio. Por ejemplo, en la sentencia
y<= (y and (noten) ) or ( x anden);

la seal y es la salida, pero tambin aparece en la expresin del lado derecho. La


seal y toma el valor de x cuando la seal en vale '1 ', y mantiene su valor anterior
cuando en vale 'O'. Obsrvese que la salida (y) depende de las entradas (en, x) y del
estado interno (el valor anterior de y), con lo cual el circuito no es combinacional,
ya que en un circuito combinacional la salida es funcin nicamente de las entradas.
Si se modifica la asignacin anterior de la forma siguiente
y<= ( ( not y) and (noten) ) or ( x anden);

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

CONCEPTOS BSICOS DE VHDL

2. 5. 2.

Asignaciones concurrentes condicionales

Bsicamente, la sintaxis de una asignacin concurrente condicional a una seal


es la siguiente:
seal <=

expr_nuevo_valor_seal_1 vvhen expr_booleana_1 else


expr_nuevo_valor_seal_2 vvhen expr_booleana_2 else
expr_nuevo_valor_seal_3 vvhen expr_booleana_3 else
expr_nuevo_valor_seal_n;

donde when y else son palabras reservadas, y expr_booleana_1, expr_booleana_2,


. .. , son expresiones lgicas que al ser evaluadas devuelven el valor true o false.
Estas expresiones lgicas son evaluadas por orden, primero expr_booleana_1 ,
luego expr _booleana_2 y as sucesivamente, hasta que una de ellas vale true, en
cuyo caso se calcula el nuevo valor de la seal de la correspondiente expresin. Si
expr_booleana_1, ... , expr_booleana_i-1 valen false y expr_booleana_i vale true, entonces el nuevo valor de la seal es el obtenido de evaluar expr _nuevo_ valor _seal_i.
Si todas las expresiones booleanas valen false, el nuevo valor de la seal se calcula
evaluando expr _nuevo_ valor _seal_n. En cualquier caso, el nuevo valor calculado
se asigna a la seal una vez ha transcurrido un retardo, que por defecto vale 5.
Como ejemplo de uso de la asignacin concurrente condicional a seal, el Cdigo
VHDL 2.4 describe un multiplexor de 4 entradas, cada una de las cuales tiene 8 bits.
El Cdigo VHDL 2.5 describe un decodificador binario, que tiene una entrada de
n = 2 bits y una salida de 2n = 4 bits.
-- MUX 4:1 de 8 bits
-- fi chero: mux_4 x L 8bits_archCondicional. vhd
library IEEE;
use IEEE. std_logie_1164. all;

entity mux4 is
port ( x
a, b, e, d
S

: out std_logic_vector(7 downto O);


: in std_logic_vector(7 downto O);
: in std_logic_vector( 1 downto O) ) ;

end entity mux4;


architecture areh_eond of mux4 is
begin
x <= a when (s="OO") else
b when (s="01") else
e when (s="10") else
d
'
end architecture
areh_eond;

Cdigo VHDL 2.4: Multiplexor de 4 entradas de 8 bits.

107

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Decodifi cador bin ario 2 a 4


-- fi chem: decodificador2x4_archCond-icional. vhd
library IEEE;
use IEEE. std_logic_1164. all;

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;

Cdigo VHDL 2.5: Decodificador binario de 2 entradas.


-- Codifi cador de prioridad 4 a 2
-- fi chem: codificador.Prioridad4 a2_archCondicional. 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 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;

Cdigo VHDL 2.6: Codificador 4 a 2 con prioridad.

El Cdigo VHDL 2.6 describe un codificador 4 a 2 con prioridad. Este circuito


genera el cdigo binario (seal eo digo, de 2 bits) de la entrada de mayor prioridad
cuyo valor es '1'. La entrada x (3) tiene mayor prioridad que x (2), la cual tiene
mayor prioridad que x(1) y sta tiene mayor prioridad que x(O). La salida activo
vale '1' cuando al menos una de las entradas vale '1'. En caso contrario, vale 'O'.
Conceptualmente, la implementacin hardware de una sentencia concurrente
condicional debe hacerse teniendo en cuenta que las expresiones lgicas son evaluadas
en orden hasta que una de ellas vale true, y entonces el valor de la correspondiente
expresin es el nuevo valor de la seal. En la sntesis hardware de una sentencia
concurrente condicional

108

CONCEPTOS BSICOS DE VHDL

seal <=

expr_nuevo_valor_seal_1 vvhen expr_booleana_1 else


expr_nuevo_valor_seal_2 vvhen expr_booleana_2 else
expr_nuevo_valor_seal_n;

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_1 vvhen expr_booleana_1 else


expr_nuevo_valor_seal_2;

En este caso, la red de prioridad consiste en un nico multiplexor, tal como se


muestra en la Figura 2.7. Se conecta a la entrada '1' del MUX 2:1 la salida del
circuito que implementa expr _nuevo_ valor _seal_! y se conecta a la entrada 'O' la
salida del circuito que implementa expr _nuevo_ valor _seal_2. La salida del circuito
que implementa la expresin booleana se conecta a la entrada de seleccin del MUX.

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.

La generalizacin al caso de ms de una clusula when es inmediata. Por ejemplo,


en la Figura 2.8 se muestra la red de prioridad que implementa una sentencia
concurrente con tres clusulas when:
seal <=

expr_nuevo_valor_seal_1 vvhen expr_booleana_1 else


expr_nuevo_valor_seal_2 vvhen expr_booleana_2 else
expr_nuevo_valor_seal_3 vvhen expr_booleana_3 else
expr_nuevo_valor_seal_4;

El proceso de sntesis se realiza de manera anloga para cualquier nmero de


clusulas when. Dado que cada clusula when introduce una etapa adicional en la
red de multiplexores, el nmero de etapas de la red de prioridad crece al aumentar

109

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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.

Asignaciones concurrentes de seleccin

Bsicamente, una sentencia concurrente de seleccin tiene la sintaxis mostrada


a continuacin, donde, si no se indica el retardo, se asume implcitamente que la
asignacin a la seal debe realizarse transcurrido un retardo 5.
with expresin_seleccin select
seal <=

expr_nuevo_valor_seal_1 when valor_seleccin_1,


expr_nuevo_valor_seal_2 when valor_seleccin_2,
expr_nuevo_valor_seal_n when valor_seleccin_n;

El resultado de evaluar expresin_seleccin debe ser o bien un nmero entero


o bien un vector unidimensional. En cualquier caso, el resultado obtenido de evaluar
la expresin de seleccin tiene un nmero finito de posibles valores. Por ejemplo,
una seal del tipo bit_vector(1 downto O) puede tomar 22 posibles valores: "00",
"01", "10" y "11".

110

CONCEPTOS BSICOS DE VHDL

El valor que se asigna a la seal depende del valor de la expresin de seleccin.


Cada una de las selecciones valor _seleccin_1, ... , valor _seleccin_n debe ser
uno o varios de los posibles valores de expresin_seleccin, pero satisfaciendo dos
condiciones:
l. Deben ser mutuamente excluyentes. Es decir, un mismo valor no puede apa-

recer en ms de una de las selecciones.


2. Deben incluir todos los posibles valores de expresin_seleccin. Puede emplearse la palabra reservada others como ltimo valor de seleccin (esto es,
valor _seleccin_n) para representar todos los valores que no han sido usados
hasta el momento.
En otras palabras: cada uno de los posibles valores de expresin_seleccin debe
aparecer en una y slo en una de las selecciones.
A continuacin se muestran tres ejemplos. El Cdigo VHDL 2. 7 muestra la
descripcin de un multiplexor de 4 entradas de 8 bits mediante una sentencia de
asignacin concurrente de seleccin. El Cdigo VHDL 2.8 describe un decodificador
binario de 2 entradas.
Finalmente, el Cdigo VHDL 2.9 muestra el diseo de un codificador 4 a 2 con
prioridad. Recurdese que se asigna el valor "11" a la seal codigo si x (3) =' 1'. Esto
corresponde a ocho valores de la seal de entrada x: "1000", "1001", ... , "1111".
Obsrvese que se emplea el smbolo 1 para especificar mltiples valores.

-- MUX 4:1 de 8 bits


-- fich ero: mux_4 x L 8bits_archSelec. vhd
library IEEE;
use IEEE. std_logie_1164. all;

entity mux4 is
port ( x
a, b, e, d
S

: out std_logic_vector(7 downto O);


: in std_logic_vector(7 downto O);
: in std_logic_vector(1 downto o) );

end entity mux4;


architecture areh_selee of mux4 is
begin
with s select
x <= a when "00",
b when "01",
e when "10",
d when others;
end architecture areh_selee;

Cdigo VHDL 2. 7: Multiplexor de 4 entradas de 8 bits.

111

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- D ecodificador binario 2 a 4
-- fichero: decodificador2x4_archSelec. vhd
library IEEE;
use IEEE . std_logic_1164.all;

entity decodificador4 is
port ( x
: out std_logic_vector(3 downto O);
s
: in std_logic_vector ( 1 downto O) ) ;
end entity decodificador4;
architecture arch_decSelec of decodificador4 is
begin
with s select
x <= "0001" when "00",
"0010" when "01",
"0100" when "10",
"1000" when others;
end architecture arch_decSelec;

Cdigo

Y~DL_

2_.8: Decodificador binario de 2 entradas.

-- 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;

Cdigo VHDL 2.9: Codificador 4 a 2 con prioridad.

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

CONCEPTOS BSICOS DE VHDL

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.

Todas las sentencias concurrentes de seleccin tienen un diagrama conceptual


similar. La diferencia est en el nmero de valores que puede tomar la expresin de
seleccin, el cual determina el tamao del multiplexor.

113

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

2.5.4.

Sensibilidad de las sentencias concurrentes

Como se explic anteriormente, una asignac1on concurrente es ejecutada cada


vez que cambia el valor de alguna de las seales a las que es sensible.
Una asignacin concurrente simple es sensible a todas las seales que intervienen
en la expresin para el clculo del nuevo valor de la seal.
Una sentencia concurrente condicional es sensible a todas las seales que intervienen en las expresiones para el clculo del nuevo valor de la seal y tambin a
todas las seales que intervienen en las expresiones booleanas.
Una sentencia concurrente de seleccin es sensible a todas las seales que Intervienen en la expresin de seleccin y a todas las seales que intervienen en las
expresiones para el clculo del nuevo valor de la seal.
A modo de ejemplo, obsrvese el cdigo siguiente, donde se indica en los comentarios a qu seales es sensible cada sentencia.
arehiteeture eoneS of eoneS is
begin
Sensible a: in1, eodigo, in2, in3(2)
a1 <= not in1 when eodigo = "00000000"
in1
when eodigo(7) = '1' and in2
in3(2);
Sensible a: in2, souree, in1
a2 <= in2
after 10 ns when souree
after 200 ns when souree
in1
not in2 after 15 ns,
after 20 ns,
'1'
after 100 ns,
'0'
after 200 ns;
in2

el se
'0' else

"1111"
"0000"

Sensible a: in1, in2, in3(1)


a3 <= ( in1 and in2 ) or in3(1);
Sensible a: eodigo, in1,
with eodigo seleet
a4 <= in1 or
in2 after
in1 and in2 after
in1 nand in2 after
in1 nor in2 after
in1 xor in2 after
in1
end arehiteeture eoneS;

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

CONCEPTOS BSICOS DE VHDL

2.6.

SENTENCIA GENERATE

Las sentencia generate facilita la ejecucin iterativa o condicional de una porcin


de cdigo concurrente. Veremos dos formas de esta sentencia: la forma iterativa y la
forma condicional.

2.6.1.

Sentencia generate iterativa

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;

El rango de ndices del vector x, (7 downto O), se obtiene invocando el atributo


range del vector, de la forma x'range. Los atributos se explicarn en la Seccin 2.13.

115

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

2.6.2.

Sentencia generate condicional

La sentencia generate condicional tiene bsicamente la sintaxis mostrada a


continuacin. Las sentencias concurrentes se ejecutan slo si expresin_booleana
vale true. Si no se realiza la declaracin de seales y constantes locales, puede omitirse
la palabra reservada begin.
etiqueta: if expresin_ booleana generate
Declaracin de seales locales y constantes locales
begin
Sentencias_ concurrentes
end generate etiqueta;

Es posible anidar sentencias generate. Por ejemplo, una sentencia generate


condicional puede anidarse dentro de una sentencia iterativa:
etiqueta!: for ndice in rango_bucle generate
etiqueta2: if expresin_ booleana generate
end generate etiqueta2;
end generate etiqueta!;

2.7.

BLOQUE PROCESS

Para describir la operacin de un determinado circuito, puede ser preciso emplear


una secuencia de sentencias que se ejecuten justamente en el orden en que han sido
escritas. Para ello, se emplea el bloque process, cuya sintaxis es bsicamente la
mostrada a continuacin, donde process, begin y end son palabras reservadas.
etiqueta: process ( lista_de_sensibilidad )
Declaracin de variables locales
Declaracin de subprogramas (funciones y procedimientos)
begin
Cdigo_secuencial
end process etiqueta;

La etiqueta con la que se inicia y finaliza la declaracin es opcional. Su finalidad es


documentar el cdigo, para lo cual es recomendable emplear etiquetas que describan
la finalidad del bloque.

116

CONCEPTOS BSICOS DE VHDL

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;

La declaracin comienza con la palabra reservada variable. A continuacin se


escribe el nombre de la variable y su tipo. Si se trata de una variable vectorial, se
declara su rango. A continuacin, puede asignarse valor inicial a la variable. El rango
y el valor inicial son opcionales .. El valor inicial no es sintetizable, slo se tiene en
cuenta para la simulacin.
Las variables declaradas dentro del bloque process son visibles slo dentro del
bloque. El valor de una variable no puede pasarse directamente fuera del bloque
process. Cuando es necesario emplear el valor de una variable fuera del bloque
process, ste debe ser asignado a una seal. Las seales y las variables sern
estudiadas con detalle en la Seccin 2.11.
Las sentencias contenidas dentro de un bloque process son ejecutadas secuencialmente, es decir, en el mismo orden en que estn escritas. Por ello, las sentencias de
asignacin a variables y a seales contenidas dentro del bloque process se denominan
sentencias secuenciales.
Por otra parte, los bloques process se ejecuta concurrentemente unos respecto a
los otros. El bloque process en su conjunto se considera una sentencia concurrente
de alto nivel dentro de la definicin de la architecture, al igual que las sentencias
concurrentes descritas en la Seccin 2.5.
Las sentencias interiores a un bloque process se ejecutan repetidamente y consecutivamente, desde la primera sentencia del bloque hasta la ltima sentencia del
bloque, una y otra vez, en un bucle infinito. Para evitar que las sentencias de un

117

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

bloque process se ejecuten en un bucle infinito (consumiendo los recursos de la CPU


y dejando la simulacin "colgada"), es preciso indicar en .qu punto debe suspenderse
su ejecucin y en qu situaciones debe reanudarse su ejecucin. Esto puede hacerse
de una de las dos maneras siguientes: mediante el uso de sentencias wait o mediante
una lista de sensibilidad.

2. 7.1.

Sentencias wait

Pueden incluirse sentencias wait en el cdigo secuencial del bloque process. Al


llegar a una sentencia wait, se suspende la ejecucin de las sentencias del bloque. La
ejecucin queda suspendida hasta que ocurre cierto evento o hasta que transcurre
cierto tiempo. Esto no afecta a la ejecucin de los dems bloques process y las
sentencias concurrentes de asignacin a seal.
Una vez satisfecha la condicin fijada en la sentencia wait, se reanuda la ejecucin
del bloque process, ejecutndose una tras otra las sentencias del mismo hasta que
se alcanza nuevamente una sentencia wait, en la cual la ejecucin del bloque queda
suspendida. Una vez satisfecha la condicin de esta sentencia wait, se reanuda la
ejecucin del cdigo del bloque, ejecutndose las sentencias siguientes hasta que se
alcanza una sentencia wait, y as sucesivamente. Cuando finaliza la ejecucin de
la ltima sentencia del bloque process, comienza inmediatamente a ejecutarse de
nuevo la primera sentencia del cdigo del bloque.
A continuacin se explican algunas de las formas de la sentencia wait ms
comnmente empleadas en la prctica.

Wait on
La sintaxis de la sentencia es:

wait on

seal1 , seal2, ... , sealN;

Se suspende la ejecucin del cdigo secuencial hasta que cambia el valor de una
o varias de las seales seal1, seal2, ... , sealN.

118

CONCEPTOS BSICOS DE VHDL

Wait until
La sintaxis de la sentencia es:
wait until

expresin_booleana;

Se suspende la ejecucin hasta que se evale la expresin booleana y sta valga


true. El simulador evala la expresin booleana nicamente cuando cambia el valor
de alguna de las seales que intervienen en la expresin booleana.
Si la expresin booleana contiene seales y variables, y en cierto instante cambia
el valor de alguna de las variables, pero no cambia el valor de ninguna de las seales,
entonces la expresin booleana no es evaluada en ese instante.
Supongamos que clk es una seal de tipo std_logic, enable es una seal de tipo
boolean y ves una variable de tipo integer. Entonces, la condicin booleana de la
sentencia
wait until clk='1' and enable and v<30;

slo es evaluada en los instantes en que se produzca un cambio en el valor de alguna


de las dos seales. Si slo cambia el valor de v, la sentencia no es evaluada, con lo
cual la ejecucin del bloque sigue suspendida.
Por ejemplo, las condiciones de las sentencias
wait until v<30;

wait until true;

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

seal1, seal2, ... , sealN


expresin_ booleana;

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Wait for
La sintaxis de la sentencia es:
wait for

expresin_ temporal;

Se suspende la ejecucin hasta que transcurra determinado intervalo de tiempo,


que es calculado evaluando la expresin temporal.
Un caso particular es cuando la expresin temporal es O ns. Cuando en el instante
t se ejecuta la sentencia
wait for

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. Han transcurrido 50 ns desde que se ejecut la sentencia wait y, por tanto, la


ejecucin ha estado suspendida en la sentencia durante 50 ns.

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

CONCEPTOS BSICOS DE VHDL

-- Biestable D con reset asncrono activado en LOW


-- fichem: biestableD_resetAsincmno. vhd
library IEEE;
use IEEE. std_logic_1164. all;

entity flipflop_D is port


( q, q_n
: out std_logic;
d, clk, reset_n : in std_logic);
end entity flipflop_D;
architecture flipflop_D of flipflop_D is
begin
process (reset_n, clk) is
-- Proceso activo cuando cambia
begin
-- el valor de reseLn o de clk
if reset_n = 'O' then
-- Comprueba reset asncmno
q
<= '0';
q_n <= '1';
elsif rising_edge( clk) then -- En el flanco de subida del reloj
q
<= d;
q_n <= not d;
end if;
end process;
end architecture flipflop_D;

Cdigo VHDL 2.10: Biestable D con reset asncrono activado al nivel LOW.

Por ejemplo, el Cdigo VHDL 2.10 muestra un mtodo estndar de modelar un


flip-flop D disparado por el flanco de subida del reloj (clk) y con una entrada reset
asncrona (reset_n) activada en LOW. Esto significa que cuando la entrada de reset
pasa de valer '1' a valer 'O', entonces se inicializa el biestable: q <- 'O', q_n <- '1'.
En este texto se emplearn indistintamente los trminos "biestable" y "fiip-flap".
El bloque process de la descripcin del biestable es sensible a dos seales:
reset_n y clk. Esto implica que el bloque process slo se ejecuta cuando se produce
un cambio en el valor de la seal de reset o en el valor de la seal de reloj.
La ejecucin del bloque process consiste en la ejecucin secuencial de todas las
sentencias contenidas dentro de l. En este diseo, el bloque process slo contiene
una sentencia: la sentencia if.
No se permite emplear sentencias wait y lista de sensibilidad en un mismo
bloque process. Debe optarse por uno de estos dos procedimientos para controlar
la ejecucin del bloque process.
A todos los efectos, la lista de sensibilidad es equivalente a una sentencia wait
del tipo
wait on

seal1, seal2, ... , sealN;

121

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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;

En el instante inicial de la simulacin, las sentencias del bloque process son


ejecutadas por orden hasta que la ejecucin del bloque queda suspendida, bien por
una sentencia wait, o bien por esta sentencia wait "implcita" que, como hemos
explicado, representa la lista de sensibilidad. La resolucin del modelo en el instante
inicial de la simulacin se explicar detalladamente en la Seccin 3.5.

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.

Asignacin secuencial a una seal

La sintaxis de una asignacin secuencial a una seal es idntica a la de las


asignaciones concurrentes simples:
seal <= expr_nuevo_valor_seal;

donde implcitamente se entiende que la asignacin del nuevo valor de la seal se


produce tras un retardo b. Como consecuencia del retardo b, si el bloque process
tiene lista de sensibilidad (por tanto no tiene sentencias wait), entonces se asigna a

122

CONCEPTOS BSICOS DE VHDL

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;

process (x1, x2, x3, x4)


begin
y <= x1 and x3;
y <= x1 or x2;
y <= x3 and x4;
end process;

es equivalente a:
x1, x2, x3, x4, y:

std_logic;

process (x1, x2, x3, x4)


begin
y <= x3 and x4;
end process;

Obsrvese que el resultado hubiera sido muy diferente si estas asignaciones a


seal, en lugar de estar incluidas dentro de un bloque process, hubieran estado
fuera del bloque. Es decir, hubieran sido asignaciones concurrentes a seal:
x1, x2, x3, x4, y:

std_logic;

-- Asignaciones concurrentes de asignacin


y <= x1 and x3;
y <= x1 or x2;
y <= x3 and x4;

Aunque este cdigo es sintcticamente correcto, el diseo es incorrecto, ya que


hay riesgo de que se produzca un conflicto en los valores asignados a la seal y. En
simulacin, la seal y tomar el valor 'X' (desconocido) si dos de las tres puertas
lgicas tienen un valor de la salida diferente (es decir, si se intenta asignar valores
diferentes a la seal y).

123

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

2.8.2.

Asignacin secuencial a una variable

Dentro de un bloque process pueden declararse variables. La sintaxis de una


asignacin secuencial a una variable es bsicamente la siguiente:
variable := expr_nuevo_valor_variable;

No se produce retardo en las asignaciones a variables. Es decir, se asigna el


nuevo valor a la variable en el mismo instante en que se evala la expresin. Por
ejemplo, consideremos el siguiente fragmento de cdigo:
signal x1, x2, y : std_logic;
process (x1, x2)
variable aux : std_logic;
begin
aux
'0';
aux
aux or x1;
aux
aux or x2;
y
<= aux;
end process;

La variable aux asume su valor inmediatamente en cada sentencia secuencial.


Una vez ejecutadas las tres sentencias secuenciales de asignacin a la variable aux,
el valor de dicha variable es igual a x1 or x2. Este valor de la variable aux se usa
para calcular el nuevo valor de la seal y. Este nuevo valor se asigna a la seal y
transcurrido un retardo o.
Obsrvese que las variables son locales al bloque process y por ello tienen que
ser declaradas dentro del bloque.

2.8.3.

Sentencia if

Bsicamente, la sintaxis de una sentencia if es la mostrada a continuacin. Las


ramas elsif son opcionales: puede no haber ninguna, una o varias. La rama else
tambin es opcional, pero a lo sumo puede haber una.
if expresin_booleana_1 then
sentencias_secuenciales
elsif expresin_booleana_2 then
sentencias_secuenciales
el se
sentencias secuenciales
end if;

124

CONCEPTOS BSICOS DE VHDL

Las expresiones booleanas son evaluadas secuencialmente. Cuando una de las


expresiones vale true, se ejecutan las sentencias secuenciales de la rama correspondiente, ignorndose las sentencias de las dems ramas. Si ninguna de las expresiones
vale true y existe rama else, entonces se evalan las sentencias de la rama else.
Obsrvese que cada una de las ramas de la sentencia if puede consistir en varias
sentencias secuenciales, entre las cuales pueden encontrarse otras sentencias if.
Con el fin de ilustrar el uso de la sentencia if, a continuacin se muestran tres
ejemplos. El Cdigo VHDL 2.11 describe un multiplexor de 4 entradas de 8 bits,
empleando para ello un bloque process con una sentencia if. El Cdigo VHDL 2.12
muestra la descripcin de un decodificador binario basada en el uso de una sentencia
if. Finalmente, el Cdigo VHDL 2.13 muestra la descripcin del codificador con
prioridad.

-- MUX 4:1 de 8 bits


-- fichero: mux_4xL8bits_archProcesslf. vhd
library IEEE;
use IEEE. std_logie_1164. all;
entity mux4 is
port ( x
a, b, e, d
S

: out std_logic_vector(7 downto O);


: in std_logic_vector(7 downto O);
: in std_logic_vector ( 1 downto O) ) ;

end entity mux4;


architecture areh_proeif of mux4 is
begin
process ( a, b, e, d, s )
begin
if (s = 11 00 11 ) then

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;

Cdigo VHDL 2.11: Multiplexor de 4 entradas de 8 bits.

125

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Decodificador binario 2 a 4
-- fichero: decodificador2x4_archProcessif. vhd
library IEEE;
use IEEE. std_logic_1164. all;

entity decodificador4 is
port ( x
: out std_logic_vector(3 downto O);
s
: in std_logic_vector ( 1 downto O) ) ;
end entity decodificador4;
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;

Cdigo VHDL 2.12: Decodificador binario de 2 entradas.

-- 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;

Cdigo VHDL 2.13: Codificador 4 a 2 con prioridad.

126

CONCEPTOS BSICOS DE VHDL

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;

La semntica de VHD L especifica que si no se asigna valor a una seal, entonces


sta mantiene su anterior valor. Cuando se satisface a>b, se ejecuta la primera rama
de la sentencia if, con lo cual se asigna a mayor el valor '1'. Como no se asigna
valor a las seales menor e igual, stas mantienen su anterior valor. Se produce una
situacin anloga en las otras dos ramas, ya que en cada caso slo se asigna valor a
una de las tres salidas. Esto implica que la sntesis de esta cdigo dar lugar a tres
elementos de memoria.
El cdigo correcto del comparador sera el mostrado a continuacin, en el cual
se asigna valor a las tres salidas en todas las ramas, y que por tanto es sintetizado
como un circuito combinacional:
process ( a, b )
begin
if
a > b ) then
mayor <= ' 1' ;
menor <= '0';
igual <= '0';
elsif ( a < b ) then
mayor <= '0';
menor<= '1';

127

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

igual <=
el se
mayor <=
menor <=
igual <=
end if;
end process;

'0';
'0';
'0';
'1';

Una forma de hacer el cdigo ms compacto y fcilmente legible es asignar un


valor por defecto a cada seal al principio del bloque process:
process e a, b )
begin
mayor <= '0';
menor <= '0';
igual <= '0';
if e a > b ) then
mayor <= ' 1 ' ;
elsif e a < b ) then
menor <= ' 1 ' ;
el se
igual <= ' 1 ' ;
end if;
end process;

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

Bsicamente, la sintaxis de una sentencia case es la mostrada a continuacin.


La sentencia emplea el valor de expresin_case para seleccionar un conjunto de
sentencias secuenciales. Al igual que sucede en la sentencia concurrente select,
expresin_case debe ser o bien de tipo entero, o bien ser un vector unidimensional.

128

CONCEPTOS BSICOS DE VHDL

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;

when "01" =>


X<= b;
when "10" =>
x

<=e;

w hen others = >


X<= d;
end case;
end process;
end architecture areh_proeCase;

Cdigo VHDL 2.14: Multiplexor de 4 entradas de 8 bits.

129

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- D ecodificador binario 2 a 4
-- fi chero: decod~ficador2x4_ archProcess Case . vhd
library IEEE;
use IEEE. std_logic_1164. all;

entity decodificador4 is
port ( x
: out std_logic_vector(3 downto O);
s
: in std_logic_vector ( 1 downto O) ) ;
end entity decodificador4;
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;

Cdigo VHDL 2.15: Decodificador binario de 2 entradas.

-- 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;

architecture codPrior4a2_procCase of codificadorPrioridad4a2 is


begin
process ( x )
begin
case x is
when "1000" 1 "1001" 1 "1010" 1 "1011"
=>
"1100 11 1 "1101 11 1 "1110 11 1 "1111 11
codigo <= "11";
when "0100" 1 "0101" 1 "0110" 1 "0111"
=>
codigo <= "10";
when "0010" 1 "0011"
=>
codigo <= "01";
when others
=>
codigo <= "00";
end case;
activo <= x(3) or x(2) or x(1) or x(O);
end process;
end architecture codPrior4a2_procCase;

Cdigo VHDL 2.16: Codificador 4 a 2 con prioridad.

130

CONCEPTOS BSICOS DE VHDL

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;

when valor_seleccin_n =>


seal <= expr_nuevo_valor_seal_n;
end case;

La equivalencia entre estas dos sentencias se limita a este caso sencillo. La


sentencia case es mucho ms flexible y general, dado que cada una de sus ramas
puede consistir en varias sentencias secuenciales.
Al contrario de lo que sucede con la sentencia if, los valores de seleccin de la
sentencia case deben cubrir todos los posibles valores de expresin_seleccin. Si
no se hace as, el cdigo VHDL es incorrecto y la herramienta CAD de simulacin
debera mostrar un error.
Por otra parte, si se asigna valor a alguna seal en unas ramas de la sentencia case
y no en otras, se est introduciendo "memoria" en el circuito, ya que la semntica
de VHDL especifica que si no se asigna valor a una seal, entonces sta conserva su
valor anterior.
Por ejemplo, el siguiente cdigo pretende describir un decodificador con prioridad,
con una seal de entrada (a) de tres bits y tres seales de salida (alto , medio y
bajo) de un bit. La entrada a(2) tiene la mxima prioridad, a continuacin a(1) y
finalmente a(O). Si a(2) =' 1', entonces la seal alto se pone a '1'. Si a(2) ='O' y
a(1)=' 1', entonces la seal medio se pone al valor '1'. Finalmente, si a(2)=a(1)='0'
y a(O)=' 1', entonces bajo se pone a '1'.
-- Diseo incorrecto!!
process ( a )
begin
case a is
when "100" 1 "101" 1 "110" 1 "111"
alto <= '1';
when "010" 1 "011" =>
medio<= '1';

=>

131

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

when others =>


bajo <= '1';
end case;
end process;

Por ejemplo, si a= 11 111 11 , entonces se ejecuta la primera rama de la sentencia case,


asignndose a alto el valor '1'. Puesto que no se asigna valor a las seales de salida
medio y bajo, stas mantienen su valor. Se produce una situacin similar en las otras
dos ramas de la sentencia case, y por tanto el diseo de este circuito contiene tres
elementos de memoria. Para evitar la sntesis de estos tres elementos de memoria, es
preciso asignar valor a todas las seales sea cual sea la rama de la sentencia when.
process ( a )
Diseo correcto!!
begin
alto <= '0';
medio <= '0';
bajo <= '0';
case a is
when "100 11 1 11 101 11 1 11 110 11 1 11 111 11
alto <= '1';
when 11 010 11 1 11 011 11 =>
medio <= '1' ;
when others =>
bajo <= '1';
end case;
end process;

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

CONCEPTOS BSICOS DE VHDL

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.

-- XOR bit a bit de dos seales de 4 bits

-- Fichero: xor_2seales_4bits_b'UcleFor. vhd


library IEEE;
use IEEE. std_logic_1164. all;
entity xor _2seales_ 4bi ts is
port ( y
: out std_logic_vector(3 downto O);
a, b : in std_logic_vector(3 downto o) );
end entity xor _2seales_ 4bi ts;
architecture xor _2seales_ 4bi ts_bucleFor of xor _2seales_ 4bi ts is
constant WIDTH : integer : = 4;
begin
process ( a , b )
begin
-- Este cdigo es slo para il'Ustrar el 'USO de la
-- sentencia for. La misma operacin p'Uede realizarse
-- mediante 'Una nica sentencia:
y<=axorb;
for i in ( WIDTH - 1 ) downto O loop
y(i) <= a(i) xor b(i);
end loop;
end process;
end architecture xor_2seales_4bits_bucleFor;

Cdigo VHDL 2.17: XOR bit a bit de dos seales de 4 bits.

133

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- X OR de los bits de una seal de 4 bits


-- Fichero: xor_1 seaL4bits_bucleFor. vhd
library IEEE;
use IEEE. std_logic_1164. all;

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);

for i in 1 to (WIDTH- 1) loop


tmp(i) <= a(i) xor tmp(i-1);
end loop;
end process;
y

<=

tmp(WIDTH-1);

end architecture xor_1seal_4bits_bucleFor;

Cdigo VHDL 2.18: XOR de los bits de una seal de 4 bits.

El segundo ejemplo, mostrado en el Cdigo VHDL 2.18, es un circuito que realiza


la operacin XOR sobre los bits de una seal de 4 bits. Por ejemplo, consideremos
la seal a de 4 bits. La operacin xor de los cuatro bits de la seal es: a(3) EB a(2) EB
a(1) EB a(O).
La forma bsica de realizar en hardware un bucle for es convirtiendo el bucle
en una secuencia plana de sentencias, que no contenga ningn bucle. As pues, se
replica el hardware correspondiente al cuerpo del bucle en cada iteracin. Para ello,
es necesario que en el momento de la sntesis el rango debe ser conocido y constante.
Por ejemplo, el cdigo plano correspondiente al bucle for del Cdigo VHDL 2.17 es
el siguiente:
y(3)
y(2)
y(1)
y(O)

<=
<=
<=
<=

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

CONCEPTOS BSICOS DE VHDL

Puede considerarse que el bucle for es una forma abreviada de escribir sentencias
repetitivas. El rango del bucle puede emplearse para especificar el 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

VHDL permite disear circuitos de forma modular y jerrquica. Es decir, es


posible describir un circuito mediante instanciacin y conexin de otros circuitos
que han sido previamente definidos, y a su vez usar este nuevo circuito para describir, mediante su conexin con otros circuitos, otro circuito de un nivel jerrquico
superior, y as sucesivamente.
Para describir un circuito mediante la instanciacin y conexin de circuitos previamente definidos, primero es necesario declarar los componentes. A continuacin,
deben instanciarse tantos componentes como requiera el diseo y debe especificarse
cmo deben conectarse. Los pasos a seguir son los siguientes:
l. Declarar los componentes. Un componente (component) representa la pareja

entity 1 architecture que define un determinado circuito (aquel que va a


instanciarse). La declaracin del componente es muy similar a la declaracin
de la entity del circuito que va a ser usado como componente. La sintaxis para
declarar un componente es:
component nombre_componente is
clusula_generic;
clusula_port;
end component nombre_ componente;

La declaracin comienza con la palabra reservada component, seguida de un


identificador, que es el nombre asignado al componente. La palabra reservada
is es opcional. La declaracin termina con las palabras reservadas end component, seguidas opcionalmente del nombre del componente. En el cuerpo
de la declaracin deben escribirse las clusulas generic y port que aparecen
en la declaracin de la entity del circuito que est siendo declarado como
componente, en caso de que las haya.
Si el nombre que se asigna al componente, nombre_componente, es igual al
nombre de la entity del circuito que est siendo declarado como componente y
adems existe una nica architecture para esa entity, entonces la declaracin
del componente especifica de manera unvoca una entity 1 architecture. En

135

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

este caso, no es necesario definir una configuration en la cual se especifique


qu architecture est asociada a esa entity. Este ser el caso de los ejemplos
desarrollados en esta Uni dad Didctica.
Por el contrario, si hay varias architecture asociadas a la entity, entonces
aparte de la declaracin del componente debe definirse una configuration,
en la cual se especifique qu architecture de las asociadas a la entity debe
emplearse en el componente.
2. Instanciar los componentes e indicar su conexin. La sintaxis para ello es:
nombre instancia

cornponent nombre_componente
port rnap ( asociacin_puertos_seales );

La etiqueta nombre_instancia es el nombre de la instancia del componente,


mientras que nombre_componente es el nombre del componente. La palabra
reservada component es opcional. Las palabras reservadas port map estn
seguidas por una lista, escrita entre parntesis, que relaciona los puertos de la
instancia del componente con las seales del circuito compuesto.
La conexin entre instancias de componentes se indica asociando a los puertos
a conectar una misma seal del modelo compuesto.
La asociacin entre los puertos de las instancias de los componentes y las
seales del circuito compuesto puede realizarse de dos maneras:
- Asociacin posicional, es decir, mediante la posicin en que el puerto se
declara en la clusula port de la entity del componente.
- Asociacin nominal o explcita, en la cual se especifica el nombre del
puerto asociado a la seal, de la forma: puerto => seal.

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

CONCEPTOS BSICOS DE VHDL

MUX2:1

iO
il

a)

sO

b)

Figura 2.11: Multiplexor de 2 seales de 1 bit: a) diagrama; b) implementacin.

-- 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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

------------------------------------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

L------------------ ------- -----~-----1

sO

Figura 2.12: Multiplexor de 2 seales de 4 bit diseado mediante la conexin de 4 multiplexores


de 2 seales de 1 bit.

-- MUX 2:1 de 4 bit. Fichero: mux2_4bit.vhd


library IEEE; use IEEE. std_logic_1164. all;

entity Mux2_ 4bi t is


port ( dO, d1, d2, d3
aO, a1, a2, a3
bO, b1, b2, b3
sO
end entity Mux2_ 4bi t;

: out
: in
: in
: in

std_logic;
std_logic;
std_logic;
std_logic ) ;

architecture Mux2_ 4bi t of Mux2_ 4bi t is


component Mux2_1bi t is
port ( d
: out std_logic;
iO, i1 : in
std_logic;
sO
: in
std_logic ) ;
end component Mux2_1 bit;
begin
Mux2_0 : Mux2_1bi t port map ( d =
Mux2_1 : Mux2_1bi t port map ( d =
Mux2_2 : Mux2_1bi t port map ( d =
Mux2_3 : Mux2_1bi t port map ( d =
end architecture Mux2_ 4bi t;

>
>
>
>

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

);
);
);
);

Cdigo VHDL 2.20: Descripcin estructural de un multiplexor de 2 seales de 4 bit.

138

CONCEPTOS BSICOS DE VHDL

El Cdigo VHDL 2.19 describe la estructura del circuito multiplexor. Obsrvese


que al instanciar cada componente, se indica qu seal debe asociarse a cada uno de
sus puertos. Una misma seal asociada a diferentes puertos indica el establecimiento
de una conexin entre dichos puertos.
Como segundo ejemplo para ilustrar la descripcin estructural de los circuitos,
a continuacin se emplearn multiplexores de 2 seales de 1 bit para componer un
multiplexor de 2 seales de 4 bits. En la Figura 2.12 se muestra la representacin
esquemtica del circuito. El Cdigo VHDL 2.20 describe este circuito.

2.9.1.

Diseos con estructura regular

Como se explic en la Seccin 2.6, la sentencia generate facilita la ejecucin


iterativa o condicional de una porcin de cdigo concurrente.
La sentencia generate puede emplearse para describir circuitos con estructura
regular. Por ejemplo, el Cdigo VHDL 2.21 describe el array de 8 puertas AND
de dos entradas mostrado en la Figura 2.13. Obsrvese que en el cuerpo del bucle
generate se definen instancias de puertas AND, cuyas entradas y salidas se conectan
a los componentes de las seales y, iO e i1. En particular, las entradas de la instancia
I -sima de la puerta AND se conecta a las seales i oC I) e i 1 CI) y su salida se conecta
a la seal y(I).
El uso de la sentencia generate condicional resulta particularmente til para
realizar las conexiones de los elementos extremos de una estructura repetitiva. Para
ilustrar el uso de la sentencia generate condicional, el Cdigo VHDL 2.22 describe un detector de paridad de 8 bits, cuyo circuito se muestra en la Figura 2.14,
empleando puertas XOR de dos entradas. Obsrvese que en el cuerpo de la architecture existe un bucle generate en cuyo interior hay dos sentencias generate
condicionales.
La primera sentencia generate condicional, que tiene la etiqueta inicial, se
ejecuta slo cuando el ndice I del bucle es igual a O. En el cuerpo de este generate
condicional est la instanciacin de la puerta xor _O.
La segunda sentencia generate condicional, que tiene la etiqueta intermedio, se
ejecuta cuando el ndice I del bucle es distinto de O. En el cuerpo de esta sentencia
estn las instanciaciones del resto de puertas XOR de dos entradas. Las asociaciones
de los puertos de entrada y salida dependen del ndice I del bucle.

139

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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)

Figura 2.13: Array de 8 puertas AND.

-- Array puertas AND usando sentencia GENERATE


-- Fichero: arrayAND_generate. vhd
library IEEE;
use IEEE. std_logic_1164. all;

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

port map (y(I), i1(I), iO(I));


end generate gen_array;
end architecture arrayAND;

Cdigo VHDL 2.21: Array de 8 puertas AND.

140

y(7)

i0(6) i1(6)

i0(7)

i1(7)

CONCEPTOS BSICOS DE VHDL

parity_IN(O)

parity_IN(7)

Figura 2.14: Detector de paridad compuesto por puertas XOR.

-- Detector de paridad usando sentencia GENERATE condicional


-- Fichero: detectorParidad_generate.vhd
library IEEE;
use IEEE. std_logic_1164. all;
entity paridad is
port ( pari ty
: out
parity_IN : in
end entity paridad;

std_logic;
std_logic_vector(? downto O));

architecture paridad of paridad is


signal temp: std_logic_vector(6 downto O);
component xor2 is
port ( yO
: out std_logic;
xO, x1 : in std_logic );
end component xor2;
begin
parity

<= temp(6);

gen_array: for I in O to 6 generate


inicial: if I = O generate
xor_O: xor2
port map (temp(O), parity_IN(O), parity_IN(1));
end generate inicial;
intermedio: if I /= O generate
resto_xor: xor2
port map (temp(I), temp(I-1), parity_IN(I+1));
end generate intermedio;
end generate gen_array;
end architecture paridad;

Cdigo VHDL 2.22: Detector de paridad de 8 bits.

141

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

2.10.

PARAMETRIZACIN

La parametrizacin es una propiedad fundamental en la reutilizacin del cdigo,


ya que permite adaptar un mismo fragmento de cdigo a diferentes usos.
En la Seccin 2.3.2 se explic cmo pueden declararse constantes generic al
declarar una entity. El valor de estas constantes generic puede ser usado en la
architecture asociada a la entity. Esto permite parametrizar tanto la descripcin
del comportamiento como la descripcin de la estructura.
A continuacin, se muestran ejemplos sencillos que ilustran el uso de las constantes generic. Por otra parte, el caso prctico descrito en la Seccin 5.6 ilustra el
empleo de constantes generic tanto para la parametrizacin del comportamiento
como de la estructura.

2.10.1.

Parametrizacin del comportamiento

En la Seccin 2.3.2 se mostr la siguiente entity de una puerta AND:


entity and2 is
generic ( Tpd: time);
port
( yO
out std_logic;
xO, xl : in std_logic );
end entity and2;

La constante generic Tpd especifica el retardo de propagacin del mdulo. Su


valor es usado en la sentencia que define el comportamiento de la puerta:
architecture and2D of and2 is
begin
yO <= xO and xl after Tpd;
end architecture and2D;

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);

Podran asignarse valores diferentes de la constante generic a otras instancias


de la clase and2.

2.11.

SENALES, VARIABLES Y CONSTANTES

En VHDL se emplean variables, seales y constantes para describir la operacin


del circuito.
- Las seales corresponden con las seales lgicas reales existentes en el circuito.
Se emplean seales para representar datos a los que deba asignarse valor fuera
de los bloques secuenciales (process, function y procedure), y datos que
necesitan ser transferidos desde un puerto de entrada o a un puerto de salida.
Los puertos slo pueden ser seales.
- Las variables pueden o no corresponder con seales fsicas reales. Dos ejemplos
tpicos de uso de las variables son los siguientes:
Cuando hace falta realizar una serie de clculos para poder asignarle valor
a una seal, se definen nuevas variables, se hacen los clculos usando esas
variables, y finalmente se asigna el resultado de los clculos a la seal.
Puesto que una seal de salida (un puerto cuyo modo es out) no puede
ser leda, puede ser necesario definir una variable, leer y escribir sobre esa
variable tantas veces como sea necesario, y finalmente asignar esa variable
a la seal de salida.

143

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

- Las constantes corresponden a magnitudes cuyo valor no cambia durante la


simulacin (tpicamente retardos, nmero de lneas de buses, nmero de bits
de palabras, etc.) .
Constantes y seales pueden ser declaradas en un package, entity o architecture (en la parte dedicada a las declaraciones), mientras que las variables slo pueden
ser declaradas y nicamente son visibles dentro de bloques de cdigo secuencial
(process, function y procedure). Las seales no pueden ser declaradas dentro de
bloques de cdigo secuencial.
Bsicamente, la sintaxis para la declaracin de seales, variables y constantes
es la mostrada a continuacin, donde signal, variable y constant son palabras
reservadas:
signal
variable
constant

nombre seal
nombre_ variable
nombre constante

tipo_dato
tipo_dato
tipo_dato

valor_inicial;
valor_inicial;
expresin;

En las declaraciones debe especificarse el nombre de la variable, seal o constante


que se est declarando y su tipo de dato. En la declaracin de variables y seales
es posible asignarles valor inicial, si bien esta asignacin no es sintetizable. La
inicializacin se explicar con detalle ms adelante. Al declarar una constante debe
asignrsele valor.
Respecto a la asignacin de valor a las variables, seales y constantes, cabe
realizar las distinciones siguientes:
- Para asignar valor a una variable se emplea : =. La sintaxis es:
nombre_variable := 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;

Las sentencias de definicin de constantes pueden situarse en las unidades de


diseo entity y architecture, antes de la palabra reservada begin. Tambin
pueden definirse constantes dentro de la definicin de un package.
El empleo de constantes facilita la comprensin del cdigo. Considrense las dos
formas siguientes de definir el circuito detector de un nmero par de entradas '1 '.
architecture comp_red_xor of
signal impar : std_logic;
begin
tmp := O;
for i in 2 downto O loop
tmp := tmp xor a(i);
end loop;

architecture comp_red_xor of ...


signal impar : std_logic;
constant BUS_WIDTH: integer := 3;
begin
tmp := O;
for i in (BUS_WIDTH-1) downto O loop
tmp := tmp xor a(i);
end loop;

El diseo mostrado en la parte derecha es claramente ms sencillo de entender


debido al uso de la constante BUS_WIDTH, que representa el nmero de lneas del bus
de seales de entrada.

2.12.

TIPOS DE DATOS Y OPERADORES

En VHDL, cada objeto es de un cierto tipo de dato. Un tipo de dato en VHDL


est definido por los dos conjuntos siguientes: el conjunto de valores que puede tomar
el objeto y el conjunto de operaciones que pueden realizarse sobre los objetos de ese
tipo de dato.

145

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Se dice que VHDL es un lenguaje "fuertemente tipado". Esto significa que a un


objeto slo puede asignrsele un valor de su tipo y que slo pueden realizarse sobre
el objeto las operaciones definidas para su tipo de dato. Para asignar a un objeto
un valor de un tipo diferente, previamente debe convertirse el valor al tipo de dato
del objeto, usando para ello una funcin de conversin del tipo.
La motivacin que hay detrs de hacer que un lenguaje sea fuertemente tipado
es facilitar la deteccin de errores de programacin. Por ejemplo, si se asigna un
valor booleano a una seal del tipo integer, entonces el entorno de simulacin puede
detectar el error en la fase de anlisis. La desventaja de este tipo de lenguajes es que
precisan de la definicin de funciones para la conversin entre tipos de datos, cuyo
uso en ocasiones dificulta la programacin y la comprensin del cdigo.
En VHDL se emplean tipos de datos para modelar las seales, variables y constantes. Estos tipos de datos pueden ser los estndar de VHDL o bien tipos definidos
por el programador. Los tipos de datos ms comnmente usados para las seales
son los tipos estndar std_logic, std_logic_vector, signed y unsigned.
El programador puede definir sus propios tipos de datos, bien como un subconjunto de los tipos de datos estndar, o bien puede definir sus propios tipos enumerados.
En teora, cualquier tipo de dato con un nmero finito de valores puede hacerse
corresponder con un conjunto de representaciones binarias, y por tanto puede ser
realizado en hardware.

2.12.1.

Tipos predefinidos en VHDL

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

VHDL no define el rango exacto de valores del tipo integer, pero


especifica que el rango mnimo debe ser desde -(2 31 - 1) hasta
231 - 1, que corresponde con 32 bits. Dos tipos de datos relacionados
(formalmente denominados subtipos) son natural y positive. El
primero incluye el cero y los nmeros positivos, mientras que el
segundo incluye slo los nmeros positivos.
Puede tomar dos valores: false, true.
Puede tomar dos valores: 'O' , ' 1 ' .
Vector unidimensional de elementos del tipo bit.

CONCEPTOS BSICOS DE VHDL

Los literales de vectores de bits se escriben entre comillas dobles y opcionalmente


precedidos por una letra que indica la base en la cual estn expresados: B (binario),
o (octal) y X (hexadecimal).
Si no se especifica la base, el vector se interpreta como binario. Un guin bajo
insertado entre dgitos adyacentes no altera el valor: es ignorado por el compilador
del cdigo VHDL, pero hace que las cadenas sean ms fcilmente legibles para el
programador.
La longitud del literal cadena de bits es el nmero de valores del tipo bit en la
secuencia representada. Por ejemplo, los cuatro literales
X"F_FF"

0"7777"

8"1111_1111_1111"

"1111_1111 1111"

representan el mismo valor de 12 bits.

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Tabla 2.1: VHDL'93- Operadores y tipos de dato a los que se aplican.

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

Desplaz. lgico izqda


Desplaz. lgico dcha
Desplaz. aritmtico izqda
Desplaz. aritmtico dcha
Rotacin lgica izqda
Rotacin lgica dcha
Comprueba igualdad
Comprueba desigualdad
Menor que
Menor o igual que
Mayor que
Mayor o igual que
AND lgica

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

Tabla 2.2: Precedencia de los operadores.

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

CONCEPTOS BSICOS DE VHDL

Si una expresin consta de varios operadores con la misma precedencia, entonces


comienza a evaluarse el operador situado ms a la izquierda en la expresin y se
progresa avanzado hacia la derecha. Por ejemplo, en la expresin
a + b + e + d

primero se calcula la suma de a y b, el resultado se suma con e y finalmente se realiza


la suma con d.
Es importante tener en cuenta que, al contrario de lo que sucede en lgebra
booleana, los operadores and y or tienen la misma precedencia en VHD L y, por
tanto, deben usarse parntesis para indicar el orden en que deben realizarse las
operaciones lgicas, como por ejemplo en:

ea

and b ) or

ee

and d )

En general, es una buena prctica emplear parntesis para representar de manera


explcita el orden en que deben realizarse las operaciones, incluso en aquellos casos
en que esto no sea necesario. Por ejemplo, la expresin
a + b > e or a < d

puede ser igualmente escrita de la forma siguiente:

e e

a + b ) > e ) or

a < d )

Ambas expresiones son equivalentes, pero la segunda es ms descriptiva y por ello


ms sencilla de interpretar. En definitiva, es cdigo ms fcilmente comprensible.

2.12.2.

Tipos del paquete IEEE.std_logic_ll64

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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;

En los diseos y bancos de prueba mostrados en este texto, se emplear el tipo


de dato std_logic para representar las seales binarias y el tipo std_logic_vector
para representar los vectores de seales binarias.

150

CONCEPTOS BSICOS DE VHDL

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'

No puede determinarse el valor de la seal, quiz debido a que se intenta


asignar simultneamente a la seal varios valores diferentes entre s. Esto puede
suceder si varias sentencias concurrentes asignan valor a una misma seal.
Desde el punto de vista estructural, esta situacin se produce si una puerta
lgica intenta poner a 'O' la seal, mientras otra puerta lgica intenta ponerla
a '1 '.

'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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Cuando don't care se usa como valor de salida, indica que el valor exacto ('O'
'1 ') no es importante. Esto ocurre cuando algunas de las combinaciones de entrada
no son usadas. Al indicar que la salida es don't care, se deja libertad al algoritmo de
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

a: std_logic_vector ( 7 downto O);

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 );

CONCEPTOS BSICOS DE VHDL

En este caso, el bit ms significativo (situado ms a la izquierda) tiene el ndice


O, lo cual puede inducir a error si el bus o vector es interpretado como un nmero
binario. Por ello, no usaremos esa forma en este libro.

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)

A continuacin, se muestran algunos ejemplos de conversin entre tipos. Para


ello, se emplearn las seales siguientes:
signal si, s2, s3
signal b1, b2

std_logic_vector ( 7 downto O);


bit vector
( 7 downto O);

Por ejemplo, pueden realizarse las siguientes asignaciones entre estas seales:

153

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

s1 <= to_stdlogicvector( b1 );
b2 <= to_bitvector( s1 and s2 );
s3 <= to_stdlogicvector( b1 ) or s2;

o equivalentemente, la ltima sentencia de asignacin puede escribirse:


s3 <= to_stdlogicvector( b1 or to_bitvector( s2) );

2.12.3.

Operadores sobre bit_vector y std_logic_vector

Algunas operaciones, tales como la concatenacin, las operaciones relacionales


y la agregacin, estn definidas sobre los tipos bit_vector y std_logic_vector. A
continuacin, veremos cmo pueden realizarse estas operaciones.

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 0001 o11

'

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

Debido a que las seales s1 y s2 tienen diferente longitud, la comparacin de


igualdad siempre tiene el resultado false, con lo cual nunca se ejecutar la rama then.

154

CONCEPTOS BSICOS DE VHDL

Este tipo de error es bastante difcil de depurar, ya que el cdigo es sintcticamente


correcto.

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, ) ;

Tambin, puede emplearse la forma


ndice => valor

155

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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' );

Tambin puede emplearse la palabra reservada others para asignar el mismo


valor a todos los componentes de un vector, como por ejemplo en:

y<= ( others

=> '0' );

Este tipo de sentencia tiene la ventaja de que es independiente del nmero de


componentes que tenga la seal, con lo cual sigue siendo vlida si se modifica la
longitud del vector.

2.12.4.

Tipos del paquete IEEE.numeric_std

Como hemos visto anteriormente, no pueden realizarse operaciones aritmticas


sobre los datos de los tipos bit_vector y std_logic_vee-tor. Esto es razonable, ya que
en los circuitos digitales no pueden realizarse operaciones aritmticas directamente
sobre los buses de seales, slo pueden realizarse operaciones lgicas.

156

CONCEPTOS BSICOS DE VHDL

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;

Sin embargo, es complicado traducir esta sentencia a hardware, ya que el cdigo


no indica el rango (nmero de bits) de las seales a y b. Aunque esta cuestin es
irrelevante para simulacin, es muy importante para sntesis. Por ejemplo, hay una
gran diferencia, en lo que respecta a la complejidad del circuito, entre un circuito
sumador de dos nmeros de 32 bits y un circuito sumador de dos nmeros de 8 bits.
Una alternativa mucho ms adecuada desde el punto de vista de la sntesis es
usar un vector de ceros y unos, e interpretarlo como un nmero binario con signo
o sin signo. De esta manera, quedan definidas de manera precisa la anchura de
los operandos y el tamao del circuito sumador, con lo cual se obtiene un mejor
control sobre el hardware resultante de la sntesis. El paquete IEEE. numeric_std fue
desarrollado con este propsito.

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Por ejemplo, consideremos el vector de 4 bits "1100". Representa el nmero 12 si


es interpretado como un dato unsigned. Representa el nmero -4 si es interpretado
como del tipo signed. Finalmente, representa 4 bits independientes entre s (por
ejemplo, cuatro seales de status) si es interpretado como del tipo std_logic_vector.
Puesto que los tipos de dato unsigned y signed son vectores, sus declaraciones
son similares a las del tipo std_logic_vector. Por ejemplo:
signal

a: signed ( 15 downto O);

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

unsigned ( 7 downto O);

a <= b + e;
<= b + 1;
<= ( 5 + a + b ) - e;

d
e

La definicin de los operadores suma y resta sigue el modelo de un sumador


fsico. Es decir, cuando se produce rebosamiento, el resultado de la suma es como
un contador que puede dar tantas vueltas como sea preciso.
Los operadores relacionales (=, !=, <, <=, >, >=) han sido sobrecargados. Los
operadores relacionales aplicados a datos del tipo unsigned o signed no comparan
los componentes del vector elemento a elemento, sino que interpretan los vectores
como nmeros binarios.

158

CONCEPTOS BSICOS DE VHDL

Por ejemplo, consideremos la expresin:


11

011 11 >

11

1000 11

Si el tipo de dato de los dos operandos es std_logic_vector, entonces la expresin


vale false, puesto que el primer elemento de 11 001 11 (que es un 'O') es menor que el
primer elemento de 11 1000 11 (que es un '1 ').
Si el tipo de dato de los dos operandos es unsigned, entonces los operandos son
interpretados como 3 y 8 respectivamente. La expresin vale nuevamente false.
Sin embargo, si el tipo de los operandos es signed, entonces estos son interpretados como 3 y -8, con lo cual la expresin vale true.

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):

se emplean para realizar las operaciones de desplazamiento y rotacin. El


operando a es de tipo unsigned o signed, mientras que bes de tipo natural.
El resultado es del mismo tipo que el operando a.
Se trata de nuevas funciones, no de los operadores de VHDL sobrecargados.
Esta distincin es importante, ya que las herramientas de sntesis soportan
estas funciones de desplazamiento del paquete IEEE. numeric_std, mientras que
no soportan los operadores de desplazamiento de VHDL.
- resize (a, b): se emplea para modificar el tamao (es decir, el nmero de bits)

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

care). El operando a debe ser del tipo unsigned, signed std_logic_vector o


std_logic. El operando b debe ser del mismo tipo que a. El resultado es del
tipo boolean.
Veamos a continuacin un ejemplo de uso de la funcin std_match. Se emplear
para definir la seal codigo del codificador 4 a 2 con prioridad diseado en el Cdigo
VHDL 2.6, 2.9, 2.13 y 2.16. Recurdese que la tabla de la verdad del circuito es:

159

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

o1
oo 1
oo o 1
oo o o

codigo

activo

1 1

o1
oo
oo

Cabra pensar que la seal codigo puede definirse de la forma siguiente


-- Cdigo correcto pero
codigo <= "11" when x
"10" when x
"01" when x
"00";

diseo
"1---"
"01--"
"001-"

incorrecto!
else
else
else

El cdigo es sintcticamente correcto. Sin embargo, en el circuito cada bit de


la seal de entrada tendr un valor ('O' , ' 1 ' , 'Z' , etc), pero nunca valdr '-' .
Por tanto, las expresiones x=" 1---", x="01--" y x="001-" siempre valdrn false. Por
ejemplo, si el valor de la seal x es "1110", ninguna de las expresiones booleanas es
verdadera, con lo cual se asignar "00" a la seal codigo.
La funcin std_match permite comparar vectores con bits don't care. En este
caso, la seal codigo podra definirse de la forma siguiente:
-- Diseo correcto
use IEEE.numeric_std.all;
codigo <= "11" when std_match(x, "1---") el se
"10" when std_match(x, "01--") el se
"01" when std_match(x, "001-") el se
"00";

Conversin entre tipos


Hay tres funciones de conversin entre tipos en el paquete IEEE. numeric_std.
Estas son: to_unsigned, to_signed y to_integer. En la Tabla 2.4 se indica qu
funcin debe emplearse para realizar la conversin entre tipos.
La funcin to_integer tiene como parmetro un objeto del tipo unsigned o
signed y devuelve un objeto del tipo integer.

160

CONCEPTOS BSICOS DE VHDL

Tabla 2.4: Conversin de tipos.

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

---+

---+

Las funciones to_unsigned y to_signed convierten un integer en un objeto del


tipo unsigned y signed, respectivamente, con el nmero de bits especificado. Estas
funciones tienen dos parmetros. El primero es el nmero del tipo integer que se
desea convertir. El segundo es el nmero deseado de bits del nuevo tipo de dato.
Los tipos std_logic_vector, unsigned y signed estn definidos como un vector
de elementos std_logic. Se trata de tipos de datos muy prximos entre s, que pueden
convertirse entre s escribiendo el objeto original entre parntesis, delante del cual
debe escribirse el nuevo tipo de dato. Este tipo de conversin se denomina casting.
Por ejemplo:
signal u1, u2
signal x1, x2

( 7 downto
unsigned
std_logic_vector ( 7 downto

o
o

) ;
) ;

u1 <= unsigned( x1 ) ;
x2 <= std_logic_vector( u2 );

El tipo std_logic_vector no es interpretado como un nmero. Por ello, este tipo


no puede ser convertido directamente a integer o viceversa (vanse las dos ltimas
filas de la Tabla 2.4).
A continuacin, se muestran algunos ejemplos de asignaciones que pretenden
ilustrar el empleo de seales de distintos tipos de dato. Supngase que las seales
han sido declaradas de la forma siguiente:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

161

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

signal si, s2, s3, s4, s5, s6


signal u1, u2, u3, u4, u5, u6, u7
signal sg

std_logic_vector ( 3 downto O);


unsigned
( 3 downto O);
signed
( 3 downto O);

Las siguientes asignaciones a las seales u3 y u4 son vlidas, puesto que el


operador + est sobrecargado para los tipos unsigned y natural:
u3 <= u2 + u1;
u4 <= u2 + 1;

Bien, ambos operandos unsigned


Bien, operandos unsigned y natural

Por otra parte, las dos asignaciones siguientes producen error:


u5 <= sg;
u4 <= 5;

Error
Error

Para poder realizar las asignaciones anteriores, es necesario realizar la conversin


entre los tipos:
u5 <= unsigned( sg );
u4 <= to_unsigned( 5,4 );

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;

-- Error, operandos signed y unsigned

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

Es necesario usar casting y funciones de conversin de tipo para resolver el


problema:

162

CONCEPTOS BSICOS DE VHDL

s3 <= std_logic_vector( u3 );
s4 <= std_logic_vector ( to_unsigned(5,4) );

Bien, casting
Bien, func. conversin

No es posible realizar operaciones aritmticas sobre objetos del tipo std_logic_vector.


As pues, las siguientes sentencias no son vlidas:
s5 <= s2 + si;
s6 <= s2 + 1;

Error, operador + indefinido


Error, operador + indefinido

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

Tipos time y string

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.

Tipos definidos por el usuario

VHDL permite al usuario definir sus propios tipos de datos. A continuacin se


explican tres categoras de tipos de datos definidos por el usuario: enteros, tipos
enumerados y tipos vectoriales.

163

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Tipos enteros definidos por el usuario


Puede definirse un tipo de datos especificando un determinado rango de valores
de los nmeros enteros. Por ejemplo:
type miEntero
is range -32 to
32;
type palabraMemoria is range
O to 1024;

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);

y declarar opcode del tipo opcode_ type.


Este tipo de construccin hace el cdigo VHDL ms sencillo de entender. Sin
embargo, esta forma de realizar el modelo no permite especificar explcitamente el
cdigo binario correspondiente a cada uno de los cdigos de operacin.
U na forma alternativa de programar el ejemplo anterior es definir SUMA, RESTA,
SALTO y PARAR como constantes (constant) de dos bits, y definir opcode como una
seal que sea un vector de dos bits.

Tipos vectoriales definidos por el usuario


Como se ha explicado anteriormente, existen tipos vectoriales predefinidos en
VHDL, y tambin hay otros tipos vectoriales que estn definidos en los paquetes
IEEE. std_logic_1164e IEEE.numeric_std. Estos son: bit_vector, std_logic_vector,
signed y unsigned. El primero es un vector de componentes del tipo bit, mientras
que los tres ltimos son vectores de componentes del tipo std_logic. En todos los
casos, se trata de vectores lD, es decir, unidimensionales.

164

CONCEPTOS BSICOS DE VHDL

VHDL permite al usuario definir sus propios tipos vectoriales. Por ejemplo,
vectores lD en los cuales los componentes sean a su vez de tipo vectorial lD, por
ejemplo std_logic_vector. Estos vectores unidimensionales, cuyos componentes son
a su vez vectores unidimensionales, se denominan vectores lD x lD.
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;

La declaracin de seales, variables y constantes de los tipos vectoriales definidos


por el usuario se realiza de la misma manera que con los dems tipos.
Supongamos que se quiere definir un nuevo tipo vectorial lD x lD, que sea un
vector de 4 componentes, donde cada uno de los componentes sea a su vez un vector
de 8 componentes del tipo std_logic. El nuevo tipo, al que se asigna el nombre
regFile_ type, puede declararse de la forma siguiente:
type regFile_type is array (Oto 3) of std_logic_vector(7 downto O);

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;

'1', '0', '0', '0', '0'


'0'' '1'' '0'' '1'' '1'
'1'' 'o'' 'o'' '1'' '0'
'0'' '0'' '1'' '0'' '0'

) '
) '
) ) ;

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

2D es la misma. La sintaxis para inicializar las seales y variables es la misma que


la empleada en los ejemplos para asignar valor a las constantes.
type matriz2D is array (O to 3, 7 downto O) of std_logic;
constant data : matriz2D
( (
(
(
(

signal mem_data :

'0''
'1''
'0''
'1''

'0''
'0''
'1''
'0''

'1''
'1''
'0''
'1''

matriz2D;

'1''
'0''
'1''
'0''

'0'' '0'' '0'' '0' ) '


'1'' '0'' '1'' '1' ) '
'0'' 'o'' '1'' '0' ) '
'0'' '1'' 'o'' '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);

los valores de sus atributos son:


d' low=

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

CONCEPTOS BSICOS DE VHDL

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>'

Indica que el argumento es del tipo <tipo>.


Por ejemplo, unsigned' ( "00") establece que
"00" se usa como unsigned, en lugar de como

<vector1D>'range
<vector1D>'reverse_range
<vector1D>'length
<vector1D>'low
<vector1D>'high
<vector1D>'left
<vector1D>'right
<seal>'stable
<seal>'event

Rango de ndices de un vector lD


Rango de ndices del vector lD, en orden inverso
Nmero de componentes del vector lD
ndice ms pequeo del vector
ndice ms grande del vector
ndice del componente ms a la izquierda
ndice del componente ms a la derecha
true mientras no hay cambios en <seal>
true slo cuando hay un cambio en <seal>

bit_vector o std_logic_vector.

Por ejemplo, en VHDL'87 se emplea


clk'event and ( clk = '1' )
para detectar el flanco de subida de la seal de reloj. Sin embargo, puesto que este
predicado es tambin cierto cuando la seal el k cambia del valor 'U' (no inicializado)
o del valor 'X' (desconocido forzado) a ' 1' , en VHD L'93 se usa
rising_edge(clk)
para detectar el flanco de subida de la seal clk. Asimismo, se usa
falling_edge(clk)
para detectar el flanco de bajada de la seal clk.

2.14.

LIBRERAS

En VHDL, una librera de diseo contiene la definicin de un conjunto de tipos


de datos, as como la definicin de los operadores y funciones que pueden aplicarse
sobre estos tipos de datos. Existe un buen nmero de libreras de diseo estndar
y de libreras especficas, que son proporcionadas junto con las herramientas de
simulacin.

167

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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

Incluye la definicin de los tipos de datos std_logic y


std_logic_vector, y de las operaciones en las que intervienen estos tipos de datos.
Incluye la definicin de los tipos de datos unsigned y
signed, y de las operaciones ms comunes realizadas sobre
estos tipos de datos.
Incluye la definicin de las operaciones en las que intervienen
nmeros reales (tipo real). Estos son nmeros reales en
coma flotante de 64 bits segn el estndar de IEEE.

As pues, es frecuente incluir, antes de la definicin de la entidad de diseo, las


tres sentencias siguientes:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

La primera sentencia indica que va a emplearse la librera de IEEE. Las otras


dos indican que los paquetes IEEE.stcLlogic_ll64 y IEEE.numeric_std deben estar
listos para su uso en el cdigo VHDL que sigue a continuacin. Por supuesto, si en
el cdigo no se usan los tipos de datos unsigned y signed, entonces puede omitirse
la tercera sentencia.

168

CONCEPTOS BSICOS DE VHDL

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

La sentencia assert se usa para hacer comprobaciones de condiciones lgicas que,


dado el valor esperado en ese punto del estado del programa, deberan valer true.
Se emplea frecuentemente para depurar el cdigo al simularlo, siendo ignorada por
las herramientas de sntesis. Su sintaxis es mostrada a continuacin, donde assert,
report y severity son palabras reservadas:
assert condicin_ booleana report mensaj e_a_mostrar
severity ni vel_severi ty;

Mientras la condicin booleana vale true, la sentencia no realiza ninguna accin.


Cuando la condicin se hace false, la sentencia muestra el texto mensaj e_a_mostrar
en la consola.
La clusula severity se usa para indicar qu gravedad tiene la violacin de la
condicin booleana. Posibles valores de ni vel_severi ty son:
note
warning
error
failure

No es un error.
Aviso.
Error.
Error grave que provoca que termine la simulacin.

169

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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

Una funcin es una rutina que devuelve un valor. La definicin de la funcin se


especifica, mediante un fragmento de cdigo secuencial, cmo se calcula el valor de
retorno a partir de los valores de los parmetros formal es de la funcin.
La funcin puede ser invocada desde sentencias concurrentes y secuenciales. Al
realizar la llamada o invocacin a la funcin, se especifican los parmetros actuales,
que son asociados a los parmetros formales usados en la definicin de la funcin.
En la definicin de la funcin pueden emplearse las sentencias propias del cdigo secuencial (if, case, for, assert, etc.), salvo la sentencia wait, que no puede
emplearse en la definicin de la funcin. Por otra parte, dentro de una funcin no
pueden declararse seales o instanciarse componentes. Se emplea la sentencia return
para especificar qu valor devuelve la funcin. La declaracin de la funcin sigue la
sintaxis siguiente:
function nombre_funcin lista_param_formales return tipo_dato is
declaracion de variables locales y constantes locales
begin
sentencias secuenciales
end function nombre_funcin;

donde lista_param_formales especifica los parmetros formales de entrada a la


funcin, que pueden ser constantes y seales, pero no variables. La funcin puede
tener un nmero cualquiera de parmetros formales (inclusive ninguno). La lista
de parmetros formales se escribe entre parntesis. La sintaxis para declarar un
parmetro formal es

170

CONCEPTOS BSICOS DE VHDL

constant nombre_constante : tipo_dato;

si se trata de una constante, donde la palabra reservada constant es opcional, o


bien
signal nombre_seal : tipo_dato;

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Funcin para conversin de str:Llogic_vector a integer


-- Fichero: conv!nteger. vhd
library IEEE;
use IEEE. std_logic_1164. all;
entity conv _int is
port ( y : out integer range O to 15;
a : in std_logic_vector(3 downto o) );
end entity conv _int;
architecture conv _int of conv _int 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;
begin
y < = conv _integer(a);
end architecture conv _int;

Cdigo VHDL 2.23: La funcin conv_integer convierte un parmetro del tipo std_logic_vector
a un entero.

2.16.2.

Procedimientos

El procedimiento es ms verstil que la funcin, ya que puede devolver ms


de un valor. Los procedimientos pueden declararse en la parte declarativa de las
architecture y de los bloques process, y tambin, como se explicar ms adelante,
dentro de paquetes (package). La sintaxis para la declaracin de un procedimiento
es la siguiente:
procedure nombre_procedimiento lista_param_formales is
declaracion de variables locales y constantes locales

begin
sentencias secuenciales

end procedure nombre_procedimiento;

172

CONCEPTOS BSICOS DE VHDL

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;

El modo del parmetro formal condiciona su uso en el procedimiento:


- Puede modificarse en el procedimiento el valor de los parmetros formales
declarados como out o inout, pero no el valor de los parmetros formales
declarados como in.
- Puede leerse en el procedimiento el valor de los parmetros formales declarados
como in o inout, pero no puede leerse dentro del procedimiento el valor de
los parmetros formales declarados como out.
- Si no se especifica la direccin de un parmetro formal del procedimiento, se
asume por defecto que es in.
- Un parmetro formal out o inout es por defecto una variable, a menos que se
indique explcitamente que es una seal.
- Se considera que un parmetro in es una constante dentro del bloque del
procedimiento. No obstante, si el parmetro in es una seal, entonces los
cambios que se produzcan en la seal fuera del procedimiento se producirn
igualmente en el valor de la seal dentro del procedimiento.
Por ejemplo, el procedimiento declarado a continuacin
procedure proc ( a
signal b, e
signal x
signal y

in
in
out
in out

std_logic;
std_logic;
std_logic_vector(7 downto O);
integer range O to 99 ) is

end procedure proc;

173

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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

Al igual que se indic en el caso de las funciones, cuando se declaran parmetros


formales vectoriales o enteros, no debe especificarse su rango. Su rango ser el
de los parmetros actuales con los cuales se asocian al realizar la invocacin al
procedimiento.
En el Cdigo VHDL 2.24 se muestra la definicin de un proc~dimiento que,
dados dos nmeros enteros, los devuelve ordenados. Los parmetros actuales de la
invocacin al procedimiento (d1_in, d2_in, min_out, max_out) se hacen corresponder
con los parmetros formales de la declaracin del procedimiento (in1, in2, min, max)
mediante asociacin posicional.

174

CONCEPTOS BSICOS DE VHDL

-- Procedimiento para clculo del mnimo y el mximo


-- Fichero: minMax.vhd
library IEEE;
use IEEE. std_logic_1164. all;
entity minMax is
generic ( 1 imite : integer : = 255 ) ;
port ( min_out, max_out : out integer range O to limite;
ena :
in std_logic;
d1_in, d2_in
: in integer range O to limite );
end entity minMax;
architecture minMax of minMax is
procedure ordena ( signal in1, in2 : in integer range O to limite;
signal min, max : out integer range O to limite ) is
begin
if (in1>in2) then
max <= in1;
min <= in2;
else
max <= in2;
min <= in1;
end if;
end procedure ordena;
begin
process (e na)
begin
if (e na= ' 1 ' ) then
ordena(d1_in, d2_in, min_out, max_out);
end if;
end process;
end architecture minMax;

Cdigo VHDL 2.24: Procedimiento que devuelve dos parmetros de entrada ordenados.

2.16.3.

Diferencias entre funciones y procedimientos

Una funcin tiene cero o ms parmetros formales de entrada, y devuelve un


nico valor. Los parmetros de entrada slo pueden ser constant (por defecto)
o signal. No se permiten parmetros variable. Los parmetros formales de
las funciones siempre tienen el modo in, por ello no debe especificar su modo.
Un procedimiento puede tener cualquier nmero de parmetros in, out e
inout, los cuales pueden ser constant, signal y variable (slo cuando se
llama al procedimiento desde cdigo secuencial). Los parmetros de entrada
(modo in) se consideran por defecto constant, mientras que los de salida
(modos out e inout) se consideran por defecto variable.

175

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

- 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

Como se ha explicado anteriormente, los fragmentos de cdigo secuencial pueden


encapsularse en subprogramas, es decir, en funciones y procedimientos. Cuando los
subprogramas deban ser usados desde varios diseos, la reutilizacin se facilita si
los subprogramas son definidos dentro de paquetes (package), que a su vez son
compilados dentro de una librera (por defecto en la librera work). Adems de
subprogramas, en un paquete pueden declararse tambin componentes, tipos de
datos y constantes.
La sintaxis para la declaracin y definicin de un paquete consta de dos partes:
la declaracin del paquete (package) y el cuerpo del paquete (package body). El
nombre asignado a ambas partes (nombre_paquete) debe ser el mismo.
package nombre_paquete is
declaraciones
end package nombre_paquete;
package body nombre_paquete is
descripcin de funciones y procedimientos
end package body nombre_paquete;

l. La primera parte, es decir, la declaracin del paquete (package), es obligatoria


y contiene todas las declaraciones de componentes, tipos y subprogramas.

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

CONCEPTOS BSICOS DE VHDL

la primera parte. En este caso, en la segunda parte se incluye la descripcin


del cuerpo de los subprogramas.
Por ejemplo, a continuacin se muestra la declaracin de un paquete, que contiene
la declaracin de un tipo de dato y una constante. En este caso, la parte package
body no es necesaria.
library IEEE;
use IEEE.std_logic_1164.all;
package ejemplo! is
type estado is (st1, st2, st3, st4);
constant datoinicial : std_logic_vector(7 downto O)
end package ejemplo!;

"11111111";

Si este package se compila en la librera work, para poder usar en un diseo el


tipo de dato y la constante que se declaran en este package, es necesario incluir en
el diseo la sentencia:
use work.ejemplo1.all;

A continuacin, se muestra otro ejemplo. La funcin conv _integer, definida en


Cdigo VHDL 2.23, que convierte un parmetro del tipo std_logic_vector a un
entero, puede declararse dentro de un package, como se muestra en el Cdigo
VHDL 2.25 y ser usada como se muestra en Cdigo VHDL 2.26.

177

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Package en el cual se define una funcin


-- Fichero: pack1 .vhd
library IEEE;
use IEEE. std_logic_1164. all;

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;

Cdigo VHDL 2.25: Definicin de una funcin en un package.

-- Conversin de strLlogic_vector a integer usando


-- una funcin definida en un package
--Fichero: conv!ntegerPackl.vhd
library IEEE;
use IEEE. std_logic_1164. all;
use work. pack1. all;

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;

Cdigo VHDL 2.26: Uso de una funcin definida en un package.

178

CONCEPTOS BSICOS DE VHDL

2.18.

LECTURAS RECOMENDADAS

Existe gran cantidad de bibliografa en la cual se describen las capacidades y uso


de VHDL'93. Una buena referencia en castellano es (Pardo & Boluda 2004). En los
Captulos 3, 4 y 5 de (Chu 2006) se describen aquellas capacidades fundamentales
de VHDL que son relevantes para sntesis. Los Captulos 1 a 8 de (Perry 2002)
constituyen una exposicin paso a paso, muy didctica, de los conceptos bsicos de
VHDL. Los Captulos 3 y 4 de (Pedroni 2004) contiene muchos ejemplos de definicin
de nuevos tipos, conversin entre tipos, operaciones y atributos. El Captulo 3 de
(Chang 1997) contiene una buena discusin sobre el concepto de seal, las asignaciones concurrentes y secuenciales, y el retardo <5. El Captulo 9 de (Cohen 1995) es
una buena referencia sobre la unidad de diseo configuration. En particular, sobre
cmo especificar en la configuration qu architecture se asocia a la entity de un
componente (recurdese que esto es necesario slo cuando hay varias architecture
asociadas a la entity).

179

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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~ ::::::: :~

......................;

: .............................. ;

Figura 2.16: Circuito correspondiente a los Ejercicios 2.1 y 2.2.

A continuacin, programe el cdigo de un banco de pruebas tal que testee todas


las posibles entradas al circuito y simlelo. Compruebe el correcto funcionamiento
del circuito observando visualmente sus seales de salida.

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

CONCEPTOS BSICOS DE VHDL

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:

std_logic : = ' 1 ' ;


std_logic_vector ( 3 downto o) := 11 1100 11
std_logic_vector ( 3 downto O) : = 11 00 1O11
bit_vector( 3 downto o) := 11 1100 11 ;
std_logic_vector( 4 downto O);
std_logic_vector(7 downto O);
std_logic_vector(3 downto O);
std_logic;
bit_vector(3 downto O);
bit_vector(3 downto O);
std_logic_vector ( 7 downto O);
std_logic_vector (O to 7);

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');

end architecture codigo;

Cdigo VHDL 2.27: Diseo correspondiente al Ejercicio 2.3.

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;

Tipo de dato enumerado:


type identificador is (nombre1, nombre2, ... , nombreN);

Tipo de datos compuesto:


type identificador is array indice_elementos of tipo_elementos

181

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

El objetivo de este ejercicio es obtener el valor de diferentes atributos para los


cuatro tipos de datos siguientes:
type
type
type
type

tipo1
tipo2
tipo3
tipo4

is
is
is
is

range O to 10;
range 21 downto 11;
(s1, s2, s3, s4);

array (1 to 4, 5 downto O) of bit;

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

Figura 2.17: Circuito "one-shof', correspondiente al Ejercicio 2.5.

182

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

CONCEPTOS BSICOS DE VHDL

A continuacin, programe el cdigo de un banco de pruebas que testee todas las


posibles entradas al circuito y simlelo. Compruebe el correcto funcionamiento del
circuito, observando visualmente sus seales de salida.

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

Figura 2.18: Decodificador 2:4 con entrada enable.

A continuacin, programe un banco de pruebas para el decodificador, que testee


todas las posibles entradas al circuito, y simlelo. Compruebe el correcto funcionamiento del circuito observando visualmente sus seales de salida.

Ejercicio 2. 7
Considere el siguiente fragmento de cdigo VHDL:

signal xO, x1, y

std_logic;

y <= '0' when xO


'1';

x1 else

Dibuje el diagrama conceptual de esta sentencia de asignacin y, a continuacin,


el correspondiente diagrama al nivel de puertas lgicas.

183

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Ejercicio 2.8

Dibuje el diagrama conceptual correspondiente al fragmento de cdigo VHDL


mostrado a continuacin. A continuacin, dibuje el diagrama al nivel de puertas
lgicas.

signal x
signal y

std_logic_vector (2 downto 1);


std_logic_vector (1 downto O);

y <= "10" when x(2)


"01" when x(1)
"00";

'1' else
'1' else

Ejercicio 2.9

Dibuje el diagrama conceptual correspondiente al fragmento de cdigo VHDL


mostrado a continuacin.

signal a, b, r
signal x, y

unsigned (7 downto O);


unsigned (3 downto O);

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

Dibuje el diagrama conceptual correspondiente al fragmento de cdigo VHDL


mostrado a continuacin.

signal s : std_logic_vector (1 downto O);


with s select
x <=(a and b)

184

when "11'',

CONCEPTOS BSICOS DE VHDL

(a or
'0'

b)

when "01" 1 "10",


when others;

Ejercicio 2.11

Convierta la siguiente sentencia de asignacin concurrente de seleccin a una


sentencia de asignacin concurrente condicional.
with sel select
sig <= valor_expr_O
valor_expr_1
valor_expr_2
valor_expr_n

when
when
when
when

cO,
c1 1 c3
c2
c4,
others;

c5,

Ejercicio 2.12

Convierta la siguiente sentencia de asignac1on concurrente condicional a una


sentencia de asignacin concurrente de seleccin, definiendo para ello las seales
auxiliares que necesite.
sig <= valor_expr_O when bool_expr_O el se
valor_expr_1 when bool _expr_1 el se
valor_expr_2 when bool_expr_2 el se
valor_expr_n;

Ejercicio 2.13

Dibuje el diagrama conceptual correspondiente a la sentencia if siguiente:


if boolean_expr then
a <= valor_expr_a_1;
b <= valor_expr_b_1;
el se
a <= valor_expr_a_2;
b <= valor_expr_b_2;
end if;

185

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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;

CONCEPTOS BSICOS DE VHDL

2.20.

SOLUCIONES DE LOS EJERCICIOS

Solucin al Ejercicio 2.1


El diseo del circuito mostrado en la Figura 2.16, realizado usando sentencias
de asignacin concurrente y operadores lgicos, y el cdigo del banco de pruebas, se
muestran en el Cdigo VHDL 2.28.
El banco de pruebas mostrado en el Cdigo VHDL 2.28 consta de una entity y
una architecture. Como el banco de pruebas no tiene entradas ni salidas, la entity
del banco de pruebas no tiene ningn puerto.
La architecture del banco de pruebas consta de dos sentencias concurrentes: la
instanciacin del componente a testear y un bloques process.
Al bloque process se le ha asignado el nombre gen_ ve e_ test. En este bloque se
generan los vectores de test y se introducen como entradas de la UUT. La sentencia
wait se emplea para esperar durante un nmero determinado de unidades de tiempo.
En el cdigo del banco de pruebas, se emplea
wait for 100 ns;

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".

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Library IEEE;
use IEEE. std_logic_1164. all;
entity puerta_nor3 is
port( f
: out std_logic;
x, y, z : in stdJogic);
end entity puerta_nor3;
architecture fluj o_de_datos of puerta_nor3 is
signal xory, xoryorz: std_logic;
begin
xory
< = x or y; -- Tres asignaciones concurrentes
xoryorz < = xory or z;
f
<= not xoryorz;
end architecture fluj o_de_datos;

-- Banco de pruebas
library IEEE;
use IEEE. std_logic_1164. all;
entity bp_puerta_nor3 is
end entity bp_puerta_nor3;
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;

Cdigo VHDL 2 .28: Diseo y banco de pruebas correspondientes al Ejercicio 2.1.

188

CONCEPTOS BSICOS DE VHDL

Solucin al Ejercicio 2.2


El diseo del circuito mostrado en la Figura 2.16, realizado describiendo su
estructura de puertas lgicas, se muestra en Cdigo VHDL 2.29. Para facilitar la
interpretacin del cdigo, el circuito de la Figura 2.16 se muestra de nuevo en la
Figura 2.19.
x

OR2_1

~~~~~
...

xory
OR2_2

NOT

xoryorz

.. ~:.~..-:::.~....-t_j - - - - - - - - - t - - : > '

r:

... J

: .......... ............;

Figura 2.19: Circuito correspondiente a los Ejercicios 2.1 y 2.2.

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;

Cdigo VHDL 2.29: Diseo correspondiente al Ejercicio 2.2.

189

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Solucin al Ejercicio 2.3


En la tabla mostrada a continuacin se indican los valores de las seales x1, x2,
x3, x4, x5, x6, x7 y x8.

Seal
x1
x2
x3
x4
x5
x6
x7
x8

Valor

10010
00101100
1110
1
0000
0011
11011111
11111011

Obsrvese que, aunque se ha realizado la misma operacin de asignacin sobre


las seales x7 y x8, el valor de estas dos seales es distinto. Ello es debido a cmo
se ha especificado el rango de estas dos seales.
El rango de la seal x7 se ha especificado del siguiente modo: (7 downto 0). El
primer nmero del rango (7) indica el ndice del bit ms significativo del vector (el
situado ms a la izquierda) y el segundo nmero del rango (O) indica el ndice del
bit menos significativo del vector (el situado ms a la derecha).
Por otro lado, el rango de la seal x8 se ha especificado del siguiente modo: (O
to 7). El primer nmero del rango (O) indica el ndice del bit ms significativo del
vector (el situado ms a la izquierda), y el segundo nmero del rango (7) indica el
ndice del bit menos significativo del vector (el situado ms a la derecha).

190

CONCEPTOS BSICOS DE VHDL

Solucin al Ejercicio 2.4


En la siguiente tabla se muestran los valores de los atributos.

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

Solucin al Ejercicio 2.5


El diseo del circuito "one-shof', realizado usando sentencias de asignacin concurrente y operadores lgicos, y el banco de pruebas se muestran respectivamente
en el Cdigo VHDL 2.30 y 2.31 .
library IEEE;
use IEEE. std_logic_1164. all;
entity oneShot is
port ( y : out std_logic;
x : in std_logic);
end oneShot;
architecture oneShot of oneShot is
signal x1, x2, x3 : std_logic;
begin
x1
x2
x3
y

<= not x after


<= not x1 after
<= not x2 after
<= x and x3;

1ns; --Salida p'uer-ta notl


1ns; --Salida puer-ta not2
1ns; --Salida pueda not3

end architecture oneShot;

Cdigo VHDL 2.30: Diseo del circuito "one-shof'.

191

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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

entity bp_oneShot is
end entity bp_oneShot;
architecture bp_oneShot of bp_oneShot is
signal y : std_logic; -- Conectar salida UUT
signal x : std_logic; -- Conectar entradas UUT
component oneShot is
port (y : out std_logic;
x : in std_logic ) ;
end component oneShot;
begin
-- Instanciar y conectar UUT
uut : component oneShot port map
( y => y, x = > x);
x <=

' O' ,

' 1 ' after 5 ns,


'O' after 20 ns, '1' after 30 ns,
'O' after 35 ns;

end architecture bp_oneShot;

Cdigo VHDL 2.31: Banco de pruebas del circuito "one-shof'.

Solucin al Ejercicio 2.6


El diseo del decodificador y su banco de pruebas se muestran respectivamente
en el Cdigo VHDL 2.32 y 2.33.
Obsrvese que en el cdigo del banco de pruebas, la variable temp se usa para
almacenar en un mismo vector de tres bits las entradas al UUT, de modo que este
vector pueda ser incrementado (con el fin de generar todas las posibles combinaciones
de vectores de test) empleando un bucle for. La variable temp se ha declarado de
tipo unsigned. La longitud del vector se especifica por el rango (2 downto 0). El
primer 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. Se ha empleado las funcin de conversin de tipo TO_UNSIGNED, que est
definida en el package IEEE.numeric_std, para convertir el ndice del bucle i en
una variable de tipo unsigned de 3 bits de longitud.

192

CONCEPTOS BSICOS DE VHDL

-- Decodificador 2:4 con entmda enable


library IEEE;
use IEEE. std_logic_ii64. all;

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';

end architecture Dcd2x4;

Cdigo VHDL 2.32: Diseo de un decodificador 2:4 con entrada enable.

193

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Banco de pruebas del decodificador 4:2


library IEEE;
use IEEE. std_logic_1164. all;
use IEEE. numeric_std. all;

entity bp_Dcd2x4 is
constant DELA Y
: time
end entity bp_Dcd2x4;

:= 10 ns; -- Retardo usado en el test

architecture bp_Dcd2x4 of bp_Dcd2x4 is


signal d3, d2, d1, dO : std_logic;
signal i1, iO, en
: std_logic;
component Dcd2x4 is
port ( d3, d2, d1, dO : out std_logic;
std_logic;
i1, iO
: in
std_logic ) ;
en
: in
end component Dcd2x4;
begin
UUT : component Dcd2x4 port map
(d3, d2, d1, dO, i1, iO, en);
vec_ test : process is
variable temp : unsigned (2 downto O);
begin
report "Comienza la simulacin";
-- Generar todos los posibles valores de entrada
for i in O to 7 loop
temp := TO_UNSIGNED(i,3);
en <= std_logic(temp(2));
i1 <= std_logic(temp(1));
iO <= std_logic(temp(O));
wait for DELAY;
end loop;
report "Simulacin finalizada";
wait;
-- Final de la simulacin
end process vec_test;
end architecture bp_Dcd2x4;

Cdigo VHDL 2.33: Banco de pruebas de un decodificador 2:4 con entrada enable.

194

CONCEPTOS BSICOS DE VHDL

Solucin al Ejercicio 2. 7

El fragmento de cdigo VHDL

signal xO, x1, y

std_logic;

y <= '0' when xO


'1';

x1 else

describe un circuito comparador de 1 bit. El diagrama conceptual correspondiente


a este fragmento de cdigo se muestra en la Figura 2.20a .

. . .0. . . ....... . . .... .... .

. . J ... . . . . ... .... . . . . . .

xO
xl
a)

b)

Figura 2.20: Comparador de 1 bit: a) diagrama conceptual; y b) diagrama al nivel de puertas


lgicas.

Obsrvese que los valores booleanos true y false, resultado de la comparacin


xO = x1, se hacen corresponder en el circuito fsico con los valores 1 y O lgico,
respectivamente. La funcin lgica que describe el comparador x 0 = x 1 puede
obtenerse a partir de la tabla de la verdad del circuito:
xo

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Solucin al Ejercicio 2.8


En la Figura 2.21 se muestra el diagrama conceptual correspondiente al fragmento
de cdigo VHDL dado en el enunciado del ejercicio. En la Figura 2.22 se muestra la
implementacin al nivel de puertas lgicas.
signal x
signal y

std_logic_vector (2 downto 1);


std_logic_vector (1 downto O);

y <= "10" when x(2)

"01" when x(1)


"00";

'1' else
'1' else

o
o

10

01

00
x(1)

x(2)

x(1)
x(2)

b)

a)

Figura 2.21: Diagrama conceptual: a) empleando buses; y b) bit a bit .

. ...1................................

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

''

''

........................... ......... ,.,j

. . .0. ................... ...........


........................................i

. . .0. . . . . . . . . . . . . . . . . ;

........................................\

. . . t . . ............. .. . . . .i
. . .0................ ........ ......;

. . xC2.L. . .. . . . . . . i
Figura 2.22: Diagrama al nivel de puertas lgicas.

196

CONCEPTOS BSICOS DE VHDL

Solucin al Ejercicio 2.9


En la Figura 2.23 se muestra el diagrama conceptual correspondiente al fragmento
de cdigo VHDL dado en el enunciado:

signal a, b, r
signal x, y

unsigned (7 downto O);


unsigned (3 downto O);

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

Figura 2.23: Diagrama conceptual.

Reemplazando cada bloque aritmtico y lgico por su equivalente al nivel de


puertas lgicas, se obtiene la descripcin del circuito completo al nivel de puertas
lgicas.

197

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Solucin al Ejercicio 2.10


En la Figura 2.24 se muestra el diagrama conceptual correspondiente al fragmento
de cdigo VHDL dado en el enunciado:

signal s : std_logic_vector (1 downto O);


with s select
x <= (a and b)
(a or b)
'0'

when "11",
when "01" 1 "10",
when others;

Figura 2.24: Diagrama conceptual.

Solucin al Ejercicio 2.11


La sentencia de asignacin concurrente de seleccin dada en el enunciado:
with sel select
sig <= valor_expr_O
valor_expr_1
valor_expr_2
valor_expr_n

when
when
when
when

c,
c1 1 c3
c2 1 c4,
others;

c5,

es equivalente a la siguiente sentencia de asignacin concurrente condicional:


el se
sig <= valor_expr_O when (sel=c)
valor_expr_ 1 when (sel=c1) or (sel=c3) or (sel=c5) el se
valor_expr_2 when (sel=c2) or (sel=c4)
el se
valor_expr_n;

198

CONCEPTOS BSICOS DE VHDL

Solucin al Ejercicio 2.12


La sentencia de asignacin concurrente condicional dada en el enunciado
sig <= valor_expr_O when bool_expr_O else
valor_expr_1 when bool_expr_1 else
valor_expr_2 when bool_expr_2 else
valor_expr_n;

es equivalente a las siguientes sentencias concurrentes:


sel(2) <= '1' when bool_expr_O el se '0';
sel(1) <= '1' when bool_expr_ 1 el se '0';
sel(O) <= '1' when bool_expr_2 el se '0';
with sel select
sig <= valor_expr_O when "100" 1 "101"
valor_expr_1 when "010" 1 "011",
valor_expr_2 when "001",
valor_expr_n when others;

"110"

"111",

Solucin al Ejercicio 2.13


En la Figura 2.25 se muestra la sentencia if dada en el enunciado, as como su
diagrama conceptual.

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Solucin al Ejercicio 2.14

En la Figura 2. 26 se muestra la sentencia if y su diagrama conceptual.


if boolean_expr_1 then
if boolean_expr_2 then
a<= valor_expr_a_1;
else
a<= valor_expr_a_2;
end if;
el se
ifboolean_expr_3 then
a<= valor_expr_a_3;
el se
a<= valor_expr_a_4;
end if;
end if;

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

Figura 2.26: Sentencias if anidadas y su diagrama conceptual.

Solucin al Ejercicio 2.15

En la Figura 2.27 se muestra la sentencia case y su diagrama conceptual.


valor_expr_a_n ______,____--;

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

Figura 2.27: Sentencias case y su diagrama conceptual.

200

TEMA 3

SIMULACIN DEL CDIGO VHDL

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

SIMULACIN DEL CDIGO VHDL

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

SIMULACIN DEL CDIGO VHDL

3.1.

INTRODUCCIN

Para poder disear hardware de manera eficaz usando VHDL, es indispensable


comprender cmo las herramientas de CAD simulan el cdigo VHDL. Los conceptos
explicados en el Tema 2 sirven de base para ello. En concreto, se explic la diferencia
entre una variable y una seal, y en qu situaciones debe emplearse una u otra. En
la Tabla 3.1 se muestra un resumen de ello.
Tambin se explic que en VHDL hay dos tipos de cdigo: el cdigo concurrente
y el cdigo secuencial. Las sentencias concurrentes son la asignacin condicional
(when-else), la asignacin de seleccin (with-select-when) y la sentencia generate. Las sentencias secuenciales son las incluidas dentro de bloques process,
function o procedure. Sentencias secuenciales son if, wait, case y for. Aun
cuando dentro de estos bloques la ejecucin es secuencial, el bloque en su conjunto
es concurrente con el resto de bloques y sentencias concurrentes.
La ejecucin de una sentencia de asignacin concurrente se produce en el instante
en el cual cambia el valor de alguna de las seales a las cuales la sentencia es sensible.
El nuevo valor es asignado transcurrido un retardo, que por defecto es 5. Existen dos
formas alternativas de controlar la ejecucin de un bloque process: mediante lista
de sensibilidad y mediante sentencias wait. Debe optarse por una de ellas, ya que
en un mismo bloque process no puede haber sentencias wait y lista de sensibilidad.
En este tema profundizaremos en el estudio de cmo es simulado el cdigo VHDL.
Para ello, se introducirn conceptos nuevos, tales como el de driver, funcin de
resolucin y seal implcita.
Tabla 3.1: Comparacin entre signal y variable.

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

3.2.

PROCESAMIENTO DEL CDIGO VHDL

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

SIMULACIN DEL CDIGO VHDL

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

l. Si la declaracin de un package cambia, entonces no slo debe recompilarse


el cuerpo de ese paquete (package body), adems deben recompilarse todos
los paquetes (la declaracin y el cuerpo), las entity, las architecture y las
configuration que hacen uso del package cuya declaracin se ha modificado.
2. Si el cuerpo de un paquete (package body) cambia, entonces slo es preciso
recompilar el cuerpo del paquete.
3. Si se modifica una entity, entonces todas las architecture que usan esa
entity, incluyendo aquellas en las cuales se declaran o instancian componentes
de esa entity, deben ser recompiladas. Las declaraciones de configuration
deben ser tambin recompiladas.
4. Si una architecture cambia, entonces slo es preciso recompilar dicha architecture.
5. Si cambia una configuration, slo es preciso recompilar dicha configuration.
Las herramientas de CAD permiten al usuario especificar el orden de compilacin
de las unidades de diseo. Por otra parte, algunas herramientas de CAD analizan
automticamente las dependencias en el diseo VHDL y determinan qu unidades es
necesario recompilar antes de ejecutar la simulacin. Esto supone una ayuda valiosa
para el mantenimiento del cdigo en diseos de grandes dimensiones.

3.4.

DRIVERS

El concepto de driver es empleado por el simulador de VHDL a fin de realizar la


simulacin del cdigo. Los drivers no son definidos explcitamente por el diseador en
el cdigo VHDL del diseo, sino que son creados automticamente por el simulador
en la fase de elaboracin del cdigo.
Cada seal tiene asociado uno o varios drivers. El valor de la seal viene determinado en todo momento por el valor de sus drivers. En el caso ms sencillo, en que
la seal tiene un nico driver, el valor de la seal coincide en todo momento con el
valor de su driver.
Cada driver de una seal est asociado a una o varias asignaciones a dicha seal.
Cada seal tiene un driver asociado a cada asignacin concurrente a la seal y un
driver asociado a cada bloque process en el cual hay asignaciones a la seal. Las
reglas que se siguen para establecer dicha asociacin son las siguientes:

208

SIMULACIN DEL CDIGO VHDL

- Se asocia un driver para la seal por cada asignacin concurrente en la cual se


asigne valor a la seal.
- Si dentro de un bloque process se asigna valor a una seal mediante una
nica asignacin secuencial, entonces se asocia a dicha asignacin secuencial
un driver para la seal.
- Si dentro de un bloque process se asigna valor a una misma seal en varias
asignaciones secuenciales, entonces se asocia a todas ellas un nico driver para
la seal.
- Si se asigna valor a una misma seal en cierto nmero de bloques process,
entonces se asocia un driver para la seal por cada uno de estos bloques
process.
Cada driver contiene una cola. En ella van almacenndose las transacciones
futuras planificadas para la seal, debidas a la ejecucin de las asignaciones asociadas
al driver. Cada una de estas transacciones planificadas consta de: el nuevo valor que
debe asignarse a la seal y el instante de tiempo en que debe asignarse dicho valor.
As pues, cuando el simulador ejecuta una sentencia concurrente o secuencial
de asignacin a una seal, el simulador calcula el nuevo valor de la seal y tambin calcula el instante de tiempo en que debe asignarse el nuevo valor a la seal
(recurdese que todas las asignaciones a seal tienen un retardo, que por defecto
vale 6). Esta informacin, que define una transaccin planificada para un instante
futuro, se incluye en la cola de transacciones del driver asociado a la sentencia de
asignacin. En la Seccin 3.8 se explicar con detalle qu reglas aplica el simulador
para gestionar la cola de un driver.
Al ir avanzando la simulacin, el valor del driver va cambiando de acuerdo a las
transacciones planificadas en su cola. Las transacciones van siendo eliminadas de la
cola a medida que se van asignando al driver los valores planificados.
El valor de la seal en cada instante se calcula a partir del valor de sus drivers
en ese instante. Si hay varios drivers asociados a una misma seal y todos ellos
proporcionan un mismo valor, entonces no se produce conflicto. Sin embargo, si los
drivers asociados a una seal proporcionan diferentes valores, entonces para decidir
qu valor asignar debe recurrirse a la funcin de resolucin del tipo de dato de la
seal. Si el tipo de dato no tiene funcin de resolucin, se produce un error. Este es
el caso, por ejemplo, de los tipos boolean e integer.
Una funcin de resolucin es una funcin que examina los valores de los drivers
de la seal y resuelve el conflicto, devolviendo un valor. La funcin de resolucin

209

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

3.5.1.

Ejemplo: seal con un driver

Obsrvese el cdigo siguiente:


architecture drivers2 of drivers2 is
signal a: std_logic
'Z';
begin
bloque! : process
begin

a<= '1';
wait;
end process bloque!;
end architecture drivers2;

Al declarar la seal a, se le asigna el valor inicial 'Z'. Por ello, en el instante t = O


el driver de la seal a (y consecuentemente la propia seal) vale 'z' . A continuacin,
tambin en el instante t =O, se ejecuta el bloque process:
l. Como resultado de ejecutar la asignacin a <= ' 1 ' , se planifica asignar a la
seal el valor ' 1 ' en el instante t = 5. Esta transaccin se aade a la cola
de transacciones del driver. La cola de transacciones del driver en el instante
t =O es:

tiempo
5

a
'1'

2. Se ejecuta la sentencia wait, que hace que se suspenda indefinidamente la


ejecucin del bloque process.
El reloj de la simulacin avanza al instante t = 5, ya que es el instante ms
prximo en el cual se encuentra planificada una transaccin. En el instante t = 5,
se asigna al driver de la seal a el valor ' 1 ' y se elimina esta transaccin de la cola
del driver. La seal tiene un nico driver. Por ello, el valor de la seal coincide con
el valor del driver en todo momento.
Dado que no hay ninguna otra transaccin planificada y que el bloque process
est suspendido indefinidamente, finaliza la simulacin. El resultado de la simulacin,
representado mediante la lista de eventos en la seal a, se muestra en la tabla
siguiente. En la columna de la izquierda se indica el instante en el cual se asigna un
nuevo valor a la seal. En la columna de la derecha se indica cul es ese nuevo valor.
tiempo

212

'Z'

'1'

SIMULACIN DEL CDIGO VHDL

3.5.2.

Ejemplo: seal con dos drivers

A continuacin se muestra otro ejemplo, en el cual la seal a tiene dos drivers.


architecture drivers! of drivers! is
signal a : std_logic := 'Z';
begin
bloque! : process
begin
wait for 10 ns;
a <= '1';
wait for 20 ns;
a <= '0';
end process bloque!;
bloque2 : process
begin
wait for 20 ns;
a <= '1';
wait for 20 ns;
a <= '0';
end process bloque2;
end architecture drivers!;

El cdigo contiene dos bloques process, a los que se ha llamado bloque! y


bloque2. Cada uno de estos bloques contiene dos asignaciones a una misma seal.
La seal es del tipo std_logic y se llama a. Al declarar la seal, se le asigna el valor
inicial 'z'.
El simulador crea dos drivers para la seal. Un driver se asocia a las asignaciones
a la seal que se producen dentro del bloque process llamado bloque! y el otro
driver se asocia a las asignaciones a la seal realizadas dentro del bloque process
llamado bloque2.
Cada driver tiene su propia cola de transacciones planificadas, en la cual se almacenan las transacciones debidas a las asignaciones asociadas al driver. Los cambios
en el valor de cada driver estn determinados por las transacciones planificadas en
su propia cola. En todo momento, el valor de la seal se calcula a partir de los valores
de los dos drivers, empleando la funcin de resolucin cuando sea necesario.
En el instante t = O, el valor de los dos drivers y de la seal es igual a 'z'. En
t = O, se ejecutan ambos bloques process, quedando la ejecucin suspendida en
ambos casos en la primera sentencia del bloque.

213

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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'

El driver asociado al bloque process bloque2 evoluciona de la forma siguiente:


tiempo

driver2_a

o
20 ns +o
40 ns +o
60 ns +o
80 ns +o
100 ns +o

'Z'
'1'
'0'
'1'
'0'
'1'

El valor de la seal se calcula de los valores de los dos drivers, aplicando la


funcin de resolucin en caso de conflicto. Uniendo ambas tablas, de manera que
se muestre el valor de ambos drivers en los instantes en que uno de ellos cambia de
valor, se obtiene:
tiempo

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'

SIMULACIN DEL CDIGO VHDL

Indicando en la tabla nicamente aquellos instantes de tiempo en los cuales se


produce cambio en el valor de la seal, se obtiene:
tiempo

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'

Supongamos ahora que la seal del ejemplo anterior, a, no es inicializada al


declararla. Es decir, en lugar de
signal a: std_logic

'Z';

se escribe
signal a : std_logic;

Dado que no se inicializa la seal al declararla, el simulador asume que en t = O


los dos drivers y la seal tienen el valor por defecto del tipo std_logic, que es 'U'.
En la siguiente tabla se muestra la evolucin de los drivers y de la seal:
tiempo
10
20
30
40
60
70
80
90
100

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'

La evolucin de la seal, indicando slo aquellos instantes de tiempo en los cuales


cambia su valor, se muestra en la tabla siguiente:

215

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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'

Un comentario final acerca de la inicializacin. Debe tenerse en cuenta que la


inicializacin de las seales al declararlas es ignorada por las herramientas de sntesis.
Por este motivo, cuando se desee reflejar en el diseo del circuito una operacin de
inicializacin, debe hacerse mediante la correspondiente seal de reset, no asignando
valores iniciales a las seales. En los temas siguientes se muestran ejemplos de esta
tcnica de diseo. Por otra parte, en la descripcin de los bancos de prueba s es
prctica comn inicializar las seales al declararlas, ya que los bancos de prueba no
van a ser sintetizados.

3.6.

ATRIBUTOS DE LAS SENALES

Los atributos de las seales proporcionan informacin acerca de los instantes en


los cuales se producen cambios en el valor de la seal y tambin acerca del valor en s
de la seal. Estos atributos se emplean frecuentemente para sincronizar la ejecucin
de sentencias concurrentes.
Los siguientes conceptos estn relacionados con las seales y sus atributos: evento,
seal activa, transaccin y seal implcita. A continuacin se explica su significado.
- Un evento es un cambio en el valor de la seal, que ocurre cuando se asigna a
la seal un nuevo valor, diferente del que tena anteriormente.
- Se dice que una seal est activa cuando su valor es actualizado, con independencia de que el nuevo valor sea el mismo que el valor actual o sea diferente.
Por ejemplo, si en determinado instante el valor de la seal es '1' y se le asigna
el valor ' 1 ' , en ese instante la seal est activa, pese a que su valor no cambie.
- Se llama transaccin a asignar valor a una seal, ya sea este valor igual o
diferente al valor que tiene la seal previamente a dicha asignacin. En el
instante en que se produce la transaccin, la seal est activa. Cuando el valor

216

SIMULACIN DEL CDIGO VHDL

asignado es diferente que el valor previo, se dice adems que se ha producido


un evento.
- Se denomina seal implcita a una seal que no est declarada en el cdigo VHDL, pero que se deduce del empleo de los atributos 'stable, 'quiet,
'delayed y 'transaction. Cada vez que uno de estos atributos es usado en
un diseo, el simulador genera automticamente una seal implcita. VHDL
impone una restriccin al uso de las seales implcitas: no pueden ser ledas
desde dentro de un subprograma.
Los atributos de las seales pueden clasificarse en dos tipos: aquellos que representan una seal implcita y aquellos que equivalen a la llamada a una funcin. Los
atributos se muestran en la Tabla 3.3.

217

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Tabla 3.3: Atributos de las seales.

s'event

s'active

s 'transaction

s 'delayed(T)

s 'stable (T)

s 'quiet (T)

s' last_event

s 'last_acti ve

s' last_ value

218

Funcin booleana que devuelve true cuando se produce un evento


en la seal. El resto del tiempo devuelve false. Ejemplos:
if clk'event then ...
En el preciso instante en que clk cambia de valor, entonces ...
wait until clk'event and clk='1';
Suspende el proceso hasta que el valor de clk pasa a ser '1'
Funcin booleana que devuelve true en el instante en el cual se
produce una transaccin a la seal. El resto del tiempo devuelve
false. Ejemplos:
if dato' active then ...
En el preciso instante en que se asigna valor a dato, entonces ...
wait until dato'active;
Suspende el proceso hasta que se asigna valor a dato
Crea una seal implcita de tipo bit, cuyo valor va cambiando 'O',
'1', 'O', ... cada vez que se produce una transaccin a la seal s.
Ejemplo:
wait on dato'transaction;
Se suspende el proceso hasta que se asigna valor a dato
Crea una seal implcita del mismo tipo que s, cuyo valor es igual
al valor de s retrasado T. Si se omite T, el retardo por defecto
es O, con lo cual es el valor de la seal en el instante 5 anterior.
Por ejemplo, s 'delayed ( 4 ns) en el instante 10 ns es el valor que
tena s en el instante 6 ns.
Crea una seal implcita de tipo booleano, cuyo valor es true si no
se ha producido un evento en la seal s durante las anteriores T
unidades de tiempo. En caso contrario, vale false. Ejemplo:
if dato'stable(100 ns) then ...
Si no se ha producido ningn evento en la seal dato durante los
ltimos 100 ns, entonces ...
Crea una seal implcita de tipo booleano, cuyo valor es true si
no se ha producido ninguna transaccin a la seal s durante las
anteriores T unidades de tiempo. En caso contrario, vale false.
Ejemplo:
if dato'quiet(100 ns) then . . .
Si no se ha producido ninguna transaccin a la seal dato durante
los ltimos 100 ns, entonces ...
Funcin que devuelve un valor del tipo time: el tiempo transcurrido desde que se produjo el ltimo evento en la seal s. Si no ha
habido evento previo, devuelve el valor mximo del tipo de dato
time (time'high).
Funcin que devuelve un valor del tipo time: el tiempo transcurrido desde que se produjo la ltima transaccin a la seal s. Si no
ha habido ninguna transaccin previa, devuelve el valor mximo
del tipo de dato time (time'high).
Funcin que devuelve un valor del mismo tipo que s: el valor de
la seal previo a la ltima transaccin a la seal.

SIMULACIN DEL CDIGO VHDL

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;

El valor '1' se debe asignar a la seal s transcurridos 3 ns. Es decir, en el instante


t = 15 ns + 46 + 3 ns. Sin embargo, al sumar mltiplos de 6 con valores del tiempo
no infinitesimales, se supone que los mltiplos de 6 valen cero. Por ello, el valor '1'
se asigna a la seal en el instante t = 18 ns. Es decir, al realizar la suma se considera
que 46 vale cero.
A continuacin se muestra un ejemplo:
architecture drivers3 of drivers3 is
signal a1
std_logic
'0';
signal a2 : std_logic
'0';
begin
bloque! : process
begin
wait for 100 ns;
a2 <= '1';
a1 <= '1';
end process bloque!;
bloque2 : process
begin
a1 <= not a1 after 1 ns;
wait on a2;
end process bloque2;
end architecture drivers3;

219

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

En el cdigo mostrado anteriormente se declaran dos seales, que son inicializadas


al valor 'O'. El cdigo contiene dos bloques process. En el primero (bloque!) se
realizan asignaciones con retardo <5 a las seales a1 y a2. En el segundo bloque
process (bloque2) se realiza una asignacin a la seal a1 con un retardo de 1 ns.
En consecuencia, el simulador asocia:
- Dos drivers a la seal a1, uno por cada bloque process. En las explicaciones
siguientes llamaremos dri ver1_a1 y dri ver2_a1 a los drivers de la seal a1
asociados a los bloques process bloque! y bloque2, respectivamente.
- Un driver a la seal a2. Llamaremos driver_a2 al driver de la seal a2.
En el instante t = O, los drivers y las seales tienen valor 'O', debido a que ese
es el valor con el que las seales han sido inicializadas al declararlas.
En t =O se ejecutan los dos bloques process:
l. La ejecucin del bloque process bloque! queda suspendida en su primera

sentencia (wai t f or 100 ns).


2. Se ejecuta la primera sentencia (a1 <= not a1 after 1 ns) de bloque2. Se

planifica asignar a dri ver2_a1 el valor '1' en el instante t

= 1 ns.

3. Se suspende la ejecucin de bloque2 en la sentencia wai t on a2.

En t = 1 ns, se asigna el valor '1' a dri ver2_a1. El otro driver de la seal,


dri ver1_a1, mantiene el valor 'O', que se le asign en la inicializacin. El simulador
emplea la funcin de resolucin para resolver el conflicto, asignndose a la seal a1
el valor 'X' en el instante t = 1 ns.
En el instante t = 100 ns finaliza la ejecucin de la sentencia wait de bloque!,
reanudndose la ejecucin de dicho bloque. Se ejecutan las dos asignaciones a las
seales y la ejecucin del bloque queda de nuevo suspendida en la sentencia wait. Como resultado de la ejecucin de las dos asignaciones, se planifica asignar a dri ver1_a1
y a driver_a2 el valor '1' en el instante t = 100 ns +<5.
En el instante t = 100 ns +<5 se asigna el valor '1' a dri ver1_a1. Los dos drivers
de la seal a1 valen ' 1 ' , con lo cual la seal adquiere el valor ' 1 ' en el instante
t = 100 ns +<5.
Asimismo, en el instante t = 100 ns +<5 se asigna el valor '1' a driver _a2. La
seal a2 tiene un nico driver, con lo cual en todo momento el valor de la seal y del

220

SIMULACIN DEL CDIGO VHDL

driver coinciden. As pues, la seal a2 adquiere el valor '1' en el instante t


ns +5.

= 100

El cambio en el valor de a2 hace que en el instante 100 ns + 5 finalice la


ejecucin de la sentencia wait de bloque2. Por tanto, en ese mismo instante se
ejecuta la primera sentencia de bloque2 ( a1 <= not a1 after 1 ns) y a continuacin
nuevamente la sentencia wait, quedando la ejecucin de bloque2 suspendida una vez
ms.
Como resultado de la ejecucin de la sentencia a1 <= not a1 after 1 ns, se
planifica asignar a dri ver2_a1 el valor 'O' en el instante 100 ns + 5 + 1 ns. Dado
que los mltiplos de 5 se consideran cero al ser sumados con valores no infinitesimales
del tiempo, el nuevo valor se asignar al driver en t = 101 ns.
La siguiente tabla muestra el resultado de la ejecucin del cdigo anterior hasta
el instante t = 101 ns.
tiempo

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'

GESTIN DE LA COLA DE TRANSACCIONES DEL DRIVER

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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.

Ejemplo: simulacin de formas de onda con retardo inercial

En la siguiente architecture se define una seal, si, a la que se asigna valor en


dos sentencias contenidas dentro de un bloque process. El retardo en la asignacin
del valor a la seal es retardo inercial en ambas sentencias. Se asocia un nico driver
a estas dos sentencias.
architecture delayi of delayi is
signal si : natural;
begin
process
begin
si <=
3 ns,
3 after
i after
6 ns,
2 after i5 ns,
7 after 22 ns,
30 after 24 ns,
70 after 80 ns;
2 after 20 ns,
si <=
30 after 25 ns,
6 after 60 ns;
wait;
end process;
end architecture delayi;

Como no se especifica el valor inicial de la seal, se le asigna en la inicializacin


el valor por defecto para el tipo natural, que es cero. Asimismo, tambin en t =O ,
se ejecuta el bloque process.
Al ejecutar la primera sentencia, se planifican las siguientes transacciones, que
se almacenan en la cola del driver de la seal:

222

SIMULACIN DEL CDIGO VHDL

tiempo
3 ns
6 ns
15 ns
22 ns
24 ns
80 ns

si

3
1
2
7
30
70

Al ejecutar la segunda sentencia, se aaden las nuevas transacciones a la cola.


Las nuevas transacciones se han sealado anteponiendo (n).

(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

A continuacin, para decidir qu transacciones "antiguas" deben eliminarse de la


cola, se aplican las reglas descritas anteriormente:
l. La primera transaccin nueva est planificada para el instante 20 ns. Las
transacciones antiguas planificadas para instantes posteriores son eliminadas

de la cola (aplicacin de la Regla 1). Las transacciones eliminadas de la cola


se sealan con (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

si

3
1
2
2
7
30
30
6
70

223

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

2. Se van inspeccionando las transacciones antiguas planificadas para instantes


anteriores a 20 ns. La transaccin planificada para el instante 15 ns tiene el
mismo valor que la transaccin nueva, por ello se conserva (aplicacin de la
Regla 2.1). Las transacciones planificadas para los instantes 3 ns y 6 ns, dado
que tienen valor diferente, son eliminadas de la cola (aplicacin de la Regla
2.2).

(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

El contenido de la cola es la unin de las transacciones antiguas no eliminadas y


las transacciones nuevas. Esto es:

(n)
(n)
(n)

tiempo
15 ns
20 ns
25 ns
60 ns

s1

2
2
30
6

Dado que la siguiente sentencia del bloque process es wait, se suspende su


ejecucin indefinidamente.
Finalizada la ejecucin del cdigo en t = O (es decir, la inicializacin), el simulador va avanzando el reloj de la simulacin a fin de ir realizando los sucesivos eventos
(cambios en el valor de la seal). Simulando el diseo, se observa que la seal toma
los valores siguientes:
tiempo
O ns
15 ns
25 ns
60 ns

224

s1

o
2
30
6

SIMULACIN DEL CDIGO VHDL

3.8.2.

Ejemplo: simulacin de formas de onda con retardo de transporte

Supongamos ahora que las asignaciones a la seal tuvieran retardo de transporte.


Obsrvese que, al tener ambas asignaciones retardo de transporte, slo es aplicable
la Regla l. La architecture en este caso sera:
architecture delay2 of delay2 is
signal s2 : natural;
begin
process
begin
s2 <= transport
3 after
1 after
2 after
7 after
30 after
70 after
s2 <= transport
2 after
30 after
6 after
wait;
end process;
end architecture delay2;

3
6
15
22
24
80
20
25
60

ns,
ns,
ns,
ns,
ns,
ns;
ns,
ns,
ns;

En t = O, se asigna el valor inicial por defecto a la seal y se ejecuta el bloque


process. Resultado de ejecutar la primera sentencia, se aaden las transacciones a la
cola del driver. Al ejecutar la segunda sentencia, se aaden las nuevas transacciones
a la cola. Las nuevas transacciones se han sealado anteponiendo (n).

(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

Se eliminan de la cola todas las transacciones antiguas posteriores a la primera


transaccin nueva (aplicacin de la Regla 1). Las transacciones eliminadas se sealan
con (x).

225

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

(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

Al ejecutar la sentencia wait se suspende la ejecucin del bloque process. El


reloj de la simulacin va avanzando a los instantes futuros en los cuales se produce
evento en la seal. Simulando el diseo, se observa que la seal toma los valores
siguientes:
tiempo
O ns
3 ns
6 ns
15 ns
25 ns
60 ns

3.9.

s2

o
3
1
2
30
6

EJEMPLO: SIMULACIN DE UN CIRCUITO SENCILLO

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

SIMULACIN DEL CDIGO VHDL

xl

retardo = 1 ns

::~.:

:~

2::: : : : : : : :.:: : : : : : _..: :..

:.::::.:.::::.:.:::::::.::.

....
: :.x:::::.:

~~

t !.....~.~~ ~J ::::::::::::::::::::6:
retardo

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

2 ns

Figura 3.2: Circuito ejemplo.

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'

El reloj de la simulacin avanza hasta el instante t = 5, ya que es el instante en


el cual est planificado el evento ms prximo al tiempo actual. En t = 5 se asigna
el valor '1' a las seales x1 y x2.
El cambio en el valor de las seales x1 y x2 hace que se evalen las asignaciones
a las seales s e y. Se calcula el nuevo valor de dichas seales y se introduce en la
cola. El valor calculado para y es el resultado de la operacin ( 'U' or ' 1 ' ) , que es
igual a '1'. Los instantes en que deben asignarse los valores se calculan teniendo en
cuenta que 5 + 1 ns es igual a 1 ns y que 5 + 2 ns es igual a 2 ns. El resultado de la
simulacin y el contenido de las colas de transacciones planificadas para cada seal
se muestran a continuacin:
tiempo

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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'

Dado que la seal y vale ' 1 ' , la transaccin planificada para t = 3 ns no es un


evento. El reloj de la simulacin salta hasta el siguiente evento, que se produce en
el instante t = 5 ns, en el cual se asigna el valor 'O' a la seal x2. El cambio en el
valor de x2 produce que se evalen las sentencias s <= x1 nand x2 after 1 ns; y
y <= s or x2 after 2 ns;. Los valores calculados para s e y son '1' y 'o', respectivamente. El resultado de la simulacin y el contenido de las colas de transacciones
planificadas para cada seal se muestran a continuacin:

228

SIMULACIN DEL CDIGO VHDL

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'

El siguiente evento se produce en el instante t = 6 ns, con lo cual el reloj de


la simulacin salta hasta t = 6 ns. En ese instante, se asigna a la seal s el valor
'1'. El cambio en s hace que se evale la asignacin y <= s or x2 after 2 ns;,
obtenindose que se planifica asignar a la seal y el valor '1' en el instante t = 8 ns.
Al aadir este nuevo valor en la cola de la seal, se elimina el valor planificado para
t = 7 ns, ya que esa transaccin pone la seal a un valor diferente (aplicacin de la
Regla 2.2). El resultado de la simulacin y el contenido de las colas de transacciones
planificadas para cada seal se muestran a continuacin:
tiempo

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'

La transaccin planificada para t = 8 ns no modifica el valor de la seal, con lo


cual no es preciso ejecutarla. Dado que no quedan ms transacciones pendientes en
las colas, finaliza la simulacin. El resultado de la misma se muestra a continuacin
(vase tambin la Figura 3.3):

229

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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

//.

Figura 3.3: Seales x 1 , x 2 , y y s del circuito ejemplo.

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

SIMULACIN DEL CDIGO VHDL

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',

'1' after 100 ns;

'1' after 50 ns;

'1' after 100 ns,


'O' after 200 ns,
'1' after 250 ns;
y3 <= y2 after 100 ns;
y4 <= transport y2 after 100 ns;
end architecture codigo;

Cdigo VHDL 3.1: Cdigo correspondiente al Ejercicio 3.1.

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
.........................................
... ~~..............................

:. ............... . ?..~. ! ........ ............ ................... . ..

Figura 3.4: Circuito cuyo comportamiento se desea analizar.

231

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

library IEEE;
use IEEE. std_logic_1164 . all;
entity delay4 is
end entity delay4;
architecture delay4 of delay4 is
signal x1, x2, x3, s, y : std_logic;
begin
s <= x1 and x2 after 10 ns;
y <= s or x3 after 20 ns;
x1

<=

'1',

'O' after
'1 'after
'O' after
'1 'after
'O' after
x2 <= '1';
x3

15 ns,
20
30
70
80

ns,
ns,
ns,
ns;

<= '0',

'1 'after 70 ns,


'O' after 80 ns;
end architecture delay4;

Cdigo VHDL 3.2: Cdigo correspondiente al Ejercicio 3.2.

Ejercicio 3.3

Tomando como base el diseo mostrado en el Cdigo VHDL 3.3 y el banco de


pruebas mostrado en el Cdigo VHDL 3.4, indique cul es la evolucin de las seales
X1, X2, X3 , sig_s1, Y1.

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;

Cdigo VHDL 3.3: Diseo del Ejercicio 3.3.

232

SIMULACIN DEL CDIGO VHDL

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

entity bp_codigo1 is
end entity bp_codigo1;
architecture bp_codigo1 of bp_codigo1 is
signal Y1
: std_logic; -- Conectar salida UUT
signal X1 , X2, X3 : std_logic; -- Conectar entradas UUT
component codigo1 is
port ( Y1
: out std_logic;
X1 , X2, X3 : in std_logic );
end component codigo1 ;
begin
-- Instanciar y conectar UUT
uut : component codigo 1 port map
( Y1

= > Y1 , X1 = > X1 , X2 = > X2, X3 => X3 );

gen_vec_ test : process

begin
X1
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;

Cdigo VHDL 3.4: Banco de pruebas del Ejercicio 3.3.

233

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Ejercicio 3.4

Tomando como base el diseo mostrado en el Cdigo VHDL 3.5 y el banco de


pruebas mostrado en Cdigo VHDL 3.6, explique detalladamente la evolucin de las
seales y dibuje su cronograma.

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

architecture behv of codigo2 is


begin
proc2: process (X1, X2, X3)
variable var _s 1 : std_logic;

begin
var_s1 := X1;
Y2
<= var_s1 xor X3;
var_s1 := X2;
end process proc2;

end architecture behv;

Cdigo VHDL 3.5: Diseo del Ejercicio 3.4.

234

SIMULACIN DEL CDIGO VHDL

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

entity bp_codigo2 is
end entity bp_codigo2;
architecture bp_codigo2 of bp_codigo2 is
signal Y2
: std_logic; -- Conectar salida UUT
signal X1, X2, X3 : std_logic; -- Conectar entradas UUT
component codigo2 is
port ( Y2
: out std_logic;
X1, X2, X3 : in std_logic);
end component codigo2;
begin
-- Instanciar y conectar UUT
uut : component codigo2 port map
( Y2

=> Y2, X1 => X1, X2 => X2, X3 => X3 );

gen_vec_ test : process

begin
X1
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

<=
<=
<=
<=
<=
<=

' 1'; wait for 100 ns;


' 1'; wait for 100 ns;
'O'; wait for 100 ns;
'O'; wait for 100 ns;
'0'; wait for 100 ns;
'1 ';

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

Cdigo VHDL 3.6: Banco de pruebas del Ejercicio 3.4.

235

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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);

architecture arquitectura of deltas is


signal s 1, s2, s3 : std_logic;
begin
p1 : process (a, b)

begin

s1 <= a and b;
end process p1;
p2 : process(b, e)

begin

s2 <= b ore;
end process p2;
p3 : process (s1, s2)

begin

s3 <= s1 xor s2;


end process p3;
p4 : process (s3)

begin

d <= not s3;


end process p4;

end architecture arquitectura;

Cdigo VHDL 3. 7: Diseo correspondiente al Ejercicio 3.5.

236

SIMULACIN DEL CDIGO VHDL

-- Banco de pruebas
library IEEE;
use IEEE. std_logie_1164. all;
entity bp_del tas is
end entity bp_del tas;
architecture bp_del tas of bp_del tas is
signal d
: std_logic; -- Conectar salida UUT
signal a, b, e : std_logic; -- Conectar entradas UUT
component deltas is
port ( d
: out std_logic;
a, b, e : in std_logic ) ;
end component deltas;
begin
-- Instanciar y conectar UUT
uut : component deltas port map
( d=>d, a => a, b => b, e => e);
gen_ ve e_ test : process

begin

a<= '1';
<= '1';
e<= '0';

wait;
end process. gen_vee_test;
end architecture bp_del tas;

Cdigo VHDL 3.8: Banco de pruebas correspondiente al Ejercicio 3.5.

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

--Puerta NAND con retardo inercial. Fichero: retardo_nand2.vhd


library IEEE; use IEEE. std_logic_1164. all;

entity nand2 is port


( yO
: out std_logic;
xO, x1 : in std_logic);
end entity nand2;
architecture nand2 of nand2 is
begin
yO <= xO nand x1 after 2 ns;
end architecture nand2;

-- Retardo inercial de 2 ns

-- Banco de pruebas de diferentes retardos. Fichero: bp_retardo_nand2.vhd


library IEEE; use IEEE.std_logic_1164.all;

entity retardo_bp is
end entity retardo_bp;
architecture retardo_bp of retardo_bp is
signal s1, s2, s3, s4
std_logic;
signal in1, in2
: std_logic;
component nand2 is port
( 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

SIMULACIN DEL CDIGO VHDL

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;

Cdigo VHDL 3.10: Diseo del Ejercicio 3.7.

239

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

3.12.

SOLUCIONES DE LOS EJERCICIOS

Solucin al Ejercicio 3.1


En la Figura 3.5 se muestra el cronograma de las seales. En la tabla situada
debajo de la figura, se indica detalladamente la evolucin de las seales .
y1

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

Ninguna de las seales es inicializada al ser declarada. Por ello, su valor en t = O


es 'u'. En t = O se ejecutan las cuatro sentencias concurrentes. Dos sentencias
concurrentes asignan valor a la seal y1. Mientras las dos sentencias asignan el
mismo valor a la seal, no se produce conflicto. En caso de conflicto, se emplea la
funcin de resolucin para resolverlo. As, la seal y1 toma el valor 'X' entre los
instante 50 ns y 100 ns, debido a que durante ese intervalo de tiempo se asignan
simultneamente dos valores diferentes a y1.
La seal y4 es la seal y2 desplazada 100 ns. Las seales y3 e y4 slo se diferencian
en que la seal y3 no cambia su valor en el instante 300 ns como consecuencia del
cambio de valor en y2 en el instante 200 ns. Esto sucede porque el cambio en la seal
y2 se mantiene un tiempo inferior al tiempo de retardo inercial (100 ns).

240

SIMULACIN DEL CDIGO VHDL

Solucin al Ejercicio 3.2


Al declarar las seales no se especifica su valor inicial. Por ello, las cinco 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 cinco seales. A continuacin, se muestra el
resultado de la inicializacin y el contenido de las colas de transacciones planificadas
para cada seal:
tiempo

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'

El reloj de la simulacin salta al instante t = 5, en el cual se asigna el valor


planificado a las seales x1, x2, x3. El evento en esas seales hace que se ejecuten
las sentencias de asignacin a las seales s, y. Los nuevos valores calculados para
esas seales son '1' y 'U', respectivamente, y se planifica asignar esos valores
en los instantes 10 y 20 ns, respectivamente. El resultado de la simulacin y las
transacciones planificadas son las siguientes:
tiempo

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'

El reloj de la simulacin salta hasta el instante t = 10 ns, en el cual se asigna a la


seal s el valor planificado. El evento en esta seal hace que se ejecute la sentencia de

241

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

asignacin a y. El valor calculado se asignar a y en el instante 30 ns. Al introducir


este nuevo valor en la cola, se elimina la transicin que estaba planificada para el
instante 20 ns (aplicacin Regla 2.2). El resultado de la simulacin y la cola de
transacciones son:
tiempo

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'

El reloj de la simulacin salta al instante t = 15 ns, en el cual se asigna a la seal


x1 el valor 'O' . El evento en x1 hace que se ejecute la sentencia de asignacin a la
seal s. El valor calculado se asignar a la seal s en el instante 25 ns.
tiempo

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'

El reloj de la simulacin avanza hasta t = 20 ns. Se asigna a x1 su nuevo valor.


El evento en la seal x1 hace que se ejecute la sentencia de asignacin a la seal s,
calculndose un valor que se asignar a la seal en el instante 30 ns. La transaccin
sobre s que estaba planificada para el instante 25 ns se elimina de la lista (aplicacin
Regla 2.2).

242

SIMULACIN DEL CDIGO VHDL

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'

El reloj de la simulacin avanza hasta el instante t = 30 ns. Se asigna el nuevo


valor a las seales x1, y. Dado que el nuevo valor para s es igual al actual, no se
produce la transaccin sobre la seal, eliminndose aquella de la cola. El evento en
x1 hace que se ejecute la sentencia de asignacin a s. El nuevo valor se asignar a
la seal en el instante 40 ns.
tiempo

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'

El reloj de la simulacin salta al instante t = 40 ns. Se asigna a la seal s su


nuevo valor. Este evento hace que se ejecute la sentencia de asignacin a y. El valor
calculado se asignar a la seal y en el instante 60 ns.

243

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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'

El reloj de la simulacin salta hasta el instante t = 60 ns, en el cual se asigna el


nuevo valor a la seal y.
tiempo

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'

El reloj de la simulacin salta hasta el instante t = 70 ns, en el cual se asignan


los nuevos valores a x1, x3. Estos eventos provocan la ejecucin de las sentencias de
asignacin a s y y. Los valores calculados se asignarn a las seales en el instante
80 y 90 ns, respectivamente.

244

SIMULACIN DEL CDIGO VHDL

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'

El reloj de la simulacin avanza hasta el instante t = 80 ns. Se asignan los nuevos


valores a las seales x1, x3, s. Estos eventos hacen que se ejecuten las sentencias de
asignacin a s y a y. Se planifica asignar los valores calculados en los instantes 90
y 100 ns, respectivamente. Dado que el valor planificado para el instante 100 ns
que acaba de aadirse a la cola asociada a y tiene el mismo valor que el que haba
anteriormente planificado para el instante 90 ns, ste ltimo no es eliminado de la
cola (aplicacin Regla 2.1).
tiempo

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

El reloj de la simulacin avanza hasta el instante t = 90 ns. Se asignan los nuevos


valores a las seales s, y. El evento en s hace que se ejecute la sentencia de asignacin
a y. El nuevo valor calculado para y es 'O' . Ese valor se asignar a la seal y en el
instante 110 ns. Al aadir ese valor a la cola de la seal se elimina la transaccin
planificada para el instante 100 ns (aplicacin Regla 2.2).
tiempo

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'

El reloj de la simulacin avanza hasta t = 110 y se le asigna a la seal y el nuevo


valor. El resultado de la simulacin se muestra a continuacin (vase tambin la
Figura 3.6).
tiempo

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'

SIMULACIN DEL CDIGO VHDL

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.

Solucin al Ejercicio 3.3


Ninguna de las seales es inicializada al ser declarada. Por ello, su valor en el
instante t = O es 'u'. En t = O se ejecutan los bloques process del banco de pruebas
y del componente:
Se ejecutan las tres primeras sentencias del bloque process del banco de
pruebas y la ejecucin queda suspendida en la sentencia wait. Los nuevos
valores se asignarn a las seales x1, x2 y x3 en el instante t = 6.
- Se ejecutan las tres sentencias del bloque process del componente. Obsrvese
que la primera y la tercera sentencia son asignaciones a una misma seal:
sig_s1. Cuando en el instante t se ejecuta la primera sentencia, se planifica
una transaccin para la seal sig_s1 para el instante t + 6. Cuando en ese
mismo instante t se ejecuta la tercera sentencia, se planifica otra transaccin
para la seal sig_s1 para el instante t + 6, anulndose la transaccin que
se planific para esa seal como resultado de ejecutar la primera sentencia
(aplicacin Regla 1). El resultado es que la primera sentencia de asignacin no
tiene ningn efecto. Es decir, al ejecutar el bloque process en el instante t, se
planifica asignar en el instante en t + 6 a la seal sig_s1 el valor que tenga la
seal X2 en el instante t. En este caso t vale cero, pero la discusin anterior es
vlida para cualquier instante t.
A continuacin se muestra el resultado de la simulacin en t = O y la cola de
transacciones planificadas para cada seal.

247

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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'

El reloj de la simulacin avanza hasta el instante t = 6. Se asignan los nuevos


valores a las seales x1, x2, x3. Los nuevos valores planificados para Y1, sig_s1 no
cambian el valor de las seales, con lo cual no se asignan los nuevos valores.
Los eventos en las seales x1, x2, x3 hacen que se ejecute el bloque process del
componente, calculndose nuevos valores para las seales Y1, sig_s1. El nuevo valor
de sig_s1 es igual al valor de x2, que es 'O'. El nuevo valor de Y1 es el resultado
de la operacin XOR de los valores actuales de sig_s1 y X3, es decir, 'U' XOR '1',
que es 'U' . Estos nuevos valores se asignarn a las seales en el instante t = 26. El
resultado de la simulacin y las colas de transacciones planificadas son:
tiempo

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'

El reloj de la simulacin avanza hasta el instante t = 26, en el cual se asignan


los nuevos valores a las seales Y1, sig_s1. El resultado de la simulacin y las colas
de transacciones planificadas son:
tiempo

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

SIMULACIN DEL CDIGO VHDL

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'

Obsrvese que en la tabla que muestra el resultado de la simulacin no se ha


aadido una fila correspondiente al instante t = 100 ns. Esto es debido a que en el
instante t = 100 ns todas las seales tienen el mismo valor que en el instante t = 26.
El reloj de la simulacin avanza al instante t = 100 ns +6. Se asigna el nuevo
valor a la seal x2. Obsrvese que los nuevos valores de las seales x 1, x3 no hacen
que cambie el valor de las mismas, por ello no se realizan las asignaciones.
El evento en la seal x2 hace que se ejecute el bloque process del componente.
Se ejecutan las sentencias del bloque, calculndose los nuevos valores de las seales
Y1, sig_s1 , que se planifican para el instante t = 100 ns +25.
tiempo

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'

El reloj de la simulacin avanza hasta el instante t = 100 ns +26, en el cual se


asignan los nuevos valores a las seales Y1, sig_s 1. El resultado de la simulacin
hasta este instante y las colas de transacciones planificadas para cada seal son:

249

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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

El reloj de la simulacin avanza hasta el instante t = 200 ns, en el cual se reanuda


la ejecucin del bloque process del banco de pruebas. Se ejecutan las sentencias que
calculan los nuevos valores de x1, x2, x3. Estos nuevos valores de asignan en t = 200
ns + 5. Estos eventos hacen que se ejecute el bloque process del componente,
asignndose en t = 200 ns + 25 los nuevos valores a las seales Y1, sig_s1, y
as sucesivamente. El resultado completo de la simulacin se muestra en la tabla
siguiente y el cronograma de las seales en la Figura 3.7.

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'

SIMULACIN DEL CDIGO VHDL

+
+
+
+
+

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

Figura 3. 7: Cronograma de las seales.

Solucin al Ejercicio 3.4


Ninguna de las seales es inicializada al ser declarada. Por ello, su valor en el
instante t = O es 'U'. En t = O se ejecutan los bloques process del banco de pruebas
y del componente:
Se ejecutan las tres primeras sentencias del bloque process del banco de
pruebas y la ejecucin queda suspendida en la sentencia wait. Los nuevos
valores se asignarn a las seales X1, X2, X3 en el instante t = fJ.
Se ejecutan las tres sentencias del bloque process del componente. Cuando
se ejecuta el bloque process en el instante t, en primer lugar se asigna a la
variable var_s1 el valor que tiene la seal X1 en el instante t. A continuacin,
se calcula el nuevo valor de la seal Y2, que es el resultado de la operacin
XOR entre el valor de la variable var_s1 y el valor de la seal X3. Dado que el
valor de la variable var_s1 es igual al valor de la seal X1, el nuevo valor de la
seal Y2 es el resultado de la operacin XOR entre los valores que tienen las
seales X1 y X3 en el instante t. El nuevo valor se asignar a la seal Y2 en el
instante t + fJ. La tercera sentencia asigna un nuevo valor a la variable var _s 1.
Este nuevo valor de var_s1 no influye en la seal Y2.
A continuacin, se muestra el resultado de la simulacin en t
transacciones planificadas para cada seal.
tiempo

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

El reloj de la simulacin avanza hasta el instante t = 5. Se asignan los nuevos


valores a las seales X1, X2, X3. El nuevo valor planificado para Y2 no cambia el valor
de la seal, con lo cual no se asigna el nuevo valor.
Los eventos en las seales X1, X2, X3 hacen que se ejecute el bloque process del
componente. El nuevo valor de la seal Y2 es el resultado de la operacin XOR entre
el valor de X1 y el de X3. Se planifica la transaccin para el instante t = 25.
tiempo

tiempo

X1

X1

X2

X3

Y2

'U'

'U'

'U'

'U'

'0'

'0'

'1'

'U'

tiempo

X2

tiempo

X3

tiempo
25

Y2
'1'

El reloj de la simulacin avanza hasta el instante t = 25, en el cual se asigna


el nuevo valor a la seal Y2. El resultado de la simulacin y las transacciones
planificadas se muestran a continuacin:
tiempo

X1

X2

X3

Y2

'U'

'U'

'U'

'U'

'0'

'0'

'1'

'U'

25

'0'

'0'

'1'

'1'

1 tiempo 1 X1 11 tiempo 1 X211 tiempo 1 X311 tiempo 1 Y21

El reloj de la simulacin avanza hasta el instante t = 100 ns, en el cual se


reanuda la ejecucin del bloque process del banco de pruebas. Se ejecutan las tres
sentencias de dicho bloque process y se suspende de nuevo la ejecucin al alcanzarse
la sentencia wait. Se planifica asignar los nuevos valores de las seales X1, X2 y X3
en el instante t = 100 ns + 5.
tiempo

o
5
25

252

X1

X2

X3

Y2

'U'

'U'

'U'

'U'

'0'

'0'

'1'

'U'

'0'

'0'

'1'

'1'

SIMULACIN DEL CDIGO VHDL

tiempo

X1

+o

'0'

100 ns

tiempo

X2

+O

'1'

100 ns

tiempo
100 ns +o

X3

tiempo

Y2

'1'

El reloj de la simulacin avanza hasta el instante t = 100 ns + o, en el cual se


asigna el nuevo valor a la seal X2. El valor de las otras dos seales no cambia. El
evento hace que se ejecute el bloque process del componente. Se calcula el nuevo
valor de la seal Y2 y se planifica asignar dicho valor a la seal.
tiempo

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

El reloj de la simulacin avanza hasta el instante t = 100 ns + 20. Dado que el


nuevo valor de la seal Y2 es igual al actual, no se produce la transaccin.
El reloj de la simulacin avanza hasta el instante t = 200 ns, en el cual se reanuda
la ejecucin del bloque process del banco de pruebas. Se calculan los nuevos valores
de las seales X1, X2, X3, que se asignarn en el instante t = 200 ns + o. En ese
instante, se ejecutar el bloque process del componente, calculndose el nuevo valor
de la seal Y2, el cual se asignar a la seal en el instante t = 200 ns + 20, en caso
de ser el nuevo valor diferente del valor que ya tuviera la seal. As sucesivamente.
A continuacin se muestra el resultado de la simulacin y en la Figura 3.8 el
cronograma de las seales.
tiempo

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

...

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.

Solucin al Ejercicio 3.5

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,

El reloj de la simulacin avanza hasta el instante t =


en el cual se asignan
los nuevos valores a las seales a, b, c. Los nuevos valores de las dems seales son
iguales a los valores que ya tienen, con lo cual esas transacciones no se producen. Los
eventos en a, b, e hacen que se ejecuten los bloques process p1, p2, calculndose
nuevos valores para las seales s1, s2, los cuales se asignarn a las seales en el
instante 2o.
tiempo

s1

s2

s3

'U'

'U'

'U'

'U'

'U'

'U'

'U'

'1'

'1'

'0'

'U'

'U'

'U'

'U'

El reloj de la simulacin avanza hasta el instante t = 2o, en el cual se asignan


los nuevos valores a las seales s1, s2. Los eventos en estas seales hacen que se

254

SIMULACIN DEL CDIGO VHDL

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

El reloj de la simulacin avanza hasta el instante t = 35, en el cual se asigna


el nuevo valor a la seal s3. El evento en esta seal hace que se ejecute el bloque
process p4. El nuevo valor calculado para la seal d se asignar a la seal en el
instante 45.
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'

35

'i'

'i'

'0'

'i'

'i'

'0'

'U'

1
1

11

11

11

2
11

3
11

11

4;

'~'

El reloj de la simulacin avanza hasta el instante t = 45, en el cual se asigna


el nuevo valor a la seal d. Este evento no hace que se planifique ninguna otra
transaccin, finalizando la simulacin. El resultado de la simulacin es el siguiente:
tiempo

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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

SIMULACIN DEL CDIGO VHDL

...

~"

lli

[TI] IY\oof y Display Propi{rtfes (list)


Window Properties

Triggers

~Deltas:
G: Expand Deltas

'l&l

'

_ilij

Collapse Deltas

No Deltas
1

,..---Trigger On:

rJ

Strobe

lo
lo

Strobe Period:

M Signa! Change

First Strobe at:

ns
ns

- Trigger Gating:

[J Use Gating Expression


Expression:
On Duration:

Use Expression Builder 1

lo ns
OK

Cancel

8J:tply

Figura 3.9: Propiedades de la ventana "List" del simulador ModelSim.

Name

ns.,..
delta.,..

+a
+b
+e
+d
+s i

+ s2
+s3
View Declaration
Vie1N r.1emory Contents

/bp_deltas/uut/ ct.,.. /bp_deltas/uut/s2.,..


/bp_deltas/uut/ a.,.. /bp_deltas/uut/s3.,..
/bp_deltas/uut/b.,..
/bp_deltas/uut/c.,..
/bp_deltas/uut/s1.,..

+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

Figura 3.10: Ventana "List" del simulador ModelSim.

257

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Solucin al Ejercicio 3.6


Ninguna de las seales ha sido inicializada al ser declarada, por ello valen 'u' en
t = O. Asimismo, en t = O se ejecutan las sentencias concurrentes, calculndose el
nuevo valor de las seales s1, s2, in1, in2, y se ejecuta el bloque process. Se ejecuta
la primera iteracin del bucle for que hay dentro del bloque process, quedando la
ejecucin suspendida en la sentencia wait. Con ello, se calcula el nuevo valor de
las seales s3, s4. Se planifica asignar los nuevos valores a las seales en el instante
t = 6. El resultado de la simulacin en t = O y las transacciones planificadas son las
siguientes:
tiempo

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'

El reloj de la simulacin avanza hasta el instante t = 6, en el cual se asignan los


nuevos valores a las seales in1, in2. Los nuevos valores de las dems seales son
iguales a los valores que ya tienen las seales, con lo cual esas transacciones no se
producen.
Los eventos en in1, in2 hacen que se ejecuten las sentencias concurrentes para el
clculo de los nuevos valores de s1, s2. Dado que estas sentencias tienen un retardo
inercial de 2 ns, los nuevos valores se asignarn a s1, s2 en el instante t = 2 ns.
tiempo

258

in1

in2

s1

s2

s3

s4

'U'

'U'

'U'

'U'

'U'

'U'

'1'

'0'

'U'

'U'

'U'

'U'

SIMULACIN DEL CDIGO VHDL

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'

El reloj de la simulacin avanza hasta el instante t = 2 ns, en el cual se asignan


los nuevos valores a las seales s 1, s2.
tiempo

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'

El reloj de la simulacin avanza hasta el instante t = 10 ns, en el cual se asigna un


nuevo valor a la seal in2 y se reanuda la ejecucin del bloque process. Se ejecutan
las cuatro primeras sentencias que hay dentro del cuerpo del bucle for y se suspende
la ejecucin del bloque al llegar a la sentencia wait. Los nuevos valores calculados
para las seales s3, s4 se asignarn en el instante t = 10 ns + 5. Asimismo, el evento
en la seal in2 hace que se ejecuten las sentencias que calculan el nuevo valor para
las seales s1, s2. Estos nuevos valores se asignarn a las seales s1, s2 en el instante
t = 12 ns.
tiempo

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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'

El reloj de la simulacin avanza hasta el instante 10 ns + 5, en el cual se asigna el


nuevo valor a la seal s3. Como el nuevo valor de s4 es igual al actual, no se asigna
el nuevo valor a esa seal.
tiempo

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'

El reloj de la simulacin avanza hasta el instante t = 11 ns, en el cual se asigna el


nuevo valor a la seal in2. El evento en in2 hace que se ejecuten las sentencias para
el clculo del nuevo valor de las seales s1, s2. El nuevo valor calculado para estas
seales es '1', el cual ser asignado con un retardo de 2 ns, es decir, en el instante
13 ns. Al aadir a la cola estas nuevas transacciones, se eliminan las que estaban
planificadas para el instante 12 ns (aplicacin Regla 2.2).
tiempo

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'

SIMULACIN DEL CDIGO VHDL

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'

El reloj de la simulacin avanza hasta el instante t = 13 ns, en el cual est


planificado asignar los nuevos valores a las seales s1 , s2. Sin embargo, dado que los
nuevos valores son iguales a los actuales, no se produce la transaccin.
tiempo

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'

El reloj de la simulacin avanza hasta el instante t = 20 ns, en el cual se asigna


el nuevo valor a la seal in2 y se reanuda la ejecucin del bloque process, que se
suspende de nuevo al llegar a la sentencia wait. Los nuevos valores calculados para
las seales s3, s4 se asignarn en el instante t = 20 ns + 6.
Asimismo, el evento en in2 hace que se ejecuten las sentencias que calculan el
nuevo valor de las seales s1, s2. Los nuevos valores se asignaran a estas seales en
el instante t = 22 ns.
tiempo

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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'

El reloj de la simulacin avanza hasta el instante t = 20 ns + o, en el cual se


asigna el nuevo valor a la seal s4. No se produce transaccin en la seal s3 ya que
el valor nuevo y el actual son iguales.
tiempo

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'

El reloj de la simulacin avanza hasta el instante t = 22 ns, en el cual se asignan


los nuevos valores a las seales in2, si, s2. El evento en in2 hace que se ejecuten las
sentencias que calculan los nuevos valores de las seales si, s2. Estos nuevos valores
se asignarn a las seales en el instante t = 24 ns.
tiempo

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

SIMULACIN DEL CDIGO VHDL

in1

t
26 ns
29 ns

in2
'1'

t
24 ns

t
24 ns

s1
'1'

s2

s3

s4

'1'

'0'

El reloj de la simulacin avanza hasta el instante t = 24 ns, en el cual se asignan


los nuevos valores a las seales s1, s2.

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'

El reloj de la simulacin avanza hasta el instante t = 26 ns, en el cual se asigna


el nuevo valor a la seal in2. El evento en la seal in2 hace que se ejecuten las
sentencias que calculan los nuevos valores de las seales s1, s2. Estos nuevos valores
se asignarn a las seales s1, s2 en el instante t = 28 ns.
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
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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

t
29 ns

ini

t
28 ns

in2

'0'

t
28 ns

si

'0'

s2

s3

s4

'0'

El reloj de la simulacin avanza hasta el instante t = 28 ns, en el cual se asignan


los nuevos valores a las seales si, s2.
tiempo

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

El reloj de la simulacin avanza hasta el instante t = 29 ns, en el cual se asigna


el nuevo valor a la seal in2. El evento en in2 hace que se ejecuten las sentencias
que calculan los nuevos valores de si, s2. Estos nuevos valores se asignarn en el
instante t = 31 ns.

264

SIMULACIN DEL CDIGO VHDL

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'

El reloj de la simulacin avanza hasta el instante t = 30 ns, dado que en ese


instante se reanuda la ejecucin del bloque process. Se calculan los nuevos valores
de las seales s3, s4, y se suspende la ejecucin del bloque al llegar a la sentencia
wait. Los nuevos valores de s3, s4 se asignarn a las seales en el instante t = 30
ns + 6.
tiempo

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

ini

in2

t
31 ns

si
'i'

t
31 ns

s3

+o

'i'

s2
'i'

30 ns

t
30 ns

s4

+ o 'o'

El reloj de la simulacin avanza hasta el instante t = 30 ns + o, en el cual se


asignan el nuevo valor a la seal s3. El nuevo valor de s4 es igual al actual, por ello
no se asigna el nuevo valor a esa seal.
tiempo

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'

El reloj de la simulacin avanza hasta el instante t = 31 ns, en el cual se asignan


los nuevos valores a las seales si, s2.

266

SIMULACIN DEL CDIGO VHDL

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'

1t 1in1 11 t 1in211 t 1si 1 t 1s211 t 1s311 t 1s41


El reloj de la simulacin avanza hasta el instante t = 40 ns, en el cual se reanuda
la ejecucin del bloque process. Los nuevos valores calculados para las seales s3,
s4 se asignarn en el instante t = 40 ns + 5.
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'

'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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

ini

in2

si

s3

+5

'i'

s2

40 ns

40 ns

s4

+o

'i'

El reloj de la simulacin avanza hasta el instante t = 40 ns + o, en el cual se


asigna el nuevo valor a las seal s4. El nuevo valor de la seal s4 es igual al actual,
con lo cual no se asigna el nuevo valor. En la tabla siguiente se muestra el resultado
de la simulacin. El cronograma est representado en la Figura 3.11.

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
.... ....

1 ' ' ' '


1

' ' ' ' 101 ' ' ' '

' ' ' '

20

' ' ' '

' ' ' ' 301 ' ' ' '

' ' ' ' 401

' ' '

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

268

' ' ' ' 501

SIMULACIN DEL CDIGO VHDL

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;

se elimina de la cola la transaccin correspondiente a la sentencia


YO <= transport '1' after 20 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'

El reloj de la simulacin avanza hasta el instante t = 10 ns, ya que es el instante


en el cual est planificado el evento ms prximo al tiempo actual. En t = 10 ns se
asigna el valor 'o' a la seal YO y el valor ' 1 ' a la seal Y1.

269

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

El evento en la seal YO activa la sentencia concurrente de asignacin a la seal Y1.


Como resultado de la ejecucin de dicha sentencia, se aade a la cola del driver de Y1
una nueva transaccin: asignar el valor 'o' en el instante t = 20 ns. A continuacin,
se muestra el resultado de la simulacin hasta este instante y el contenido de la cola
de transacciones planificadas para cada seal:
tiempo

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

SIMULACIN DEL CDIGO VHDL

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

DISEO DE LGICA COMBINACIONAL

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

DISEO DE LGICA COMBINACIONAL

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

DISEO DE LGICA COMBINACIONAL

4.1.

INTRODUCCIN

Los conocimientos sobre el lenguaje VHDL adquiridos en el Tema 2 son aplicados


en este tema al diseo para sntesis de sistemas digitales combinacionales y a la
programacin de bancos de prueba para dichos diseos circuitales.
Se abordar el diseo de algunos de los sistemas digitales combinacionales ms
comnmente usados: un circuito multiplexor, un sumador binario, un restador binario y una unidad aritmtico lgica. Al hacerlo, se propondrn diseos alternativos
para un mismo sistema digital, empleando en unos casos sentencias concurrentes, en
otros sentencias secuenciales y en otros realizando una descripcin de la estructura.
Con ello, se pretende mostrar las diferentes posibilidades para la descripcin de los
circuitos digitales que ofrece VHDL.

4.2.

DISEO PARA SNTESIS DE LGICA COMBINACIONAL

Cuando el objetivo de la descripcin del circuito mediante VHDL es la sntesis de


un circuito combinacional, debe tenerse presente que la caracterstica fundamental
de un bloque lgico combinacional es que su comportamiento y sus salidas dependen
nicamente del valor actual de las entradas. No dependen del valor pasado de las
entradas, ni tampoco del estado. As pues, el cdigo VHDL que describe un circuito
combinacional no debe tener "memoria", ni tampoco debe describir dependencia
respecto al estado.
Por otra parte, al realizar el diseo debe evitarse incluir retardos temporales
en la descripcin VHDL del circuito, ya que los retardos del circuito real sern
dependientes del hardware en particular que se emplee para implementar el circuito.
Existen varios mtodos para describir circuitos combinacionales en VHDL. De
hecho, el mismo tipo de circuito puede ser descrito empleando diferentes sentencias
VHDL. Por ejemplo, un multiplexor 2:1 puede definirse indicando su estructura
(conexin de las correspondientes puertas lgicas) o describiendo su comportamiento,
mediante una sentencia concurrente de asignacin a una seal, tal como:
out <= in1 when (sel='1') else inO;

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

4.2.1.

Empleo de sentencias concurrentes

Los circuitos lgicos combinacionales pueden ser descritos empleando sentencias


concurrentes de asignacin a seales. Este tipo de sentencias modelan de manera
correcta el comportamiento de los dispositivos combinacionales, que estn activos
durante todo el tiempo de manera concurrente.
En la parte izquierda de una sentencia de asignacin concurrente debe aparecer,
o bien una seal local de la architecture, o bien una seal de la interfaz
(definida en la entity) del tipo out o inout.
En la parte derecha de la asignacin concurrente pueden aparecer seales
locales de la architecture y tambin seales de la interfaz, del tipo in o
inout.
Las herramientas de sntesis pueden sintetizar las puertas lgicas simples a partir
de las operaciones lgicas primitivas de VHDL. A continuacin, se muestran dos
ejemplos:
Puerta NAND
Puerta OR-exclusiva

nand_out <= iO nand i1;


xor_out <= iO xor i1;

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

inv_vec <= not iO_vec;


donde inv_vec e iO_vec son std_logic_vector.

El que la herramienta de sntesis cree una nica puerta lgica o un array de


puertas lgicas, depende del tipo de seales usadas en la sentencia de asignacin
concurrente. Por ejemplo, las siguientes sentencias dan lugar a un buffer triestado y
a un array de buffers triestado, respectivamente.
Buffer triestado
Array de buffers triestado

tri_out <= iO when (sel='1') else 'Z';


tri_vec <= iO_vec when (sel='1')
else (others => 'Z');
donde tri_ ve e e iO_ ve e son std_logic_vector.

Es posible sintetizar multiplexores y decodificadores que estn descritos mediante


sentencias concurrentes condicionales. Por ejemplo:
Decodificador 2:4

dec vec <=


else
else
else

278

11 0001 11 when (sel_vec


11 0010 11 when (sel_vec
11 0100 11 when (sel_vec
11 1000 11 ;

110011)
110111)
111011)

DISEO DE LGICA COMBINACIONAL

Igualmente, pueden emplearse sentencias concurrentes de seleccin. Por ejemplo:


Multiplexor 4:1

with sel_vec select


mux41 - out <= iO
i1
i2
i3

when
when
when
when

"00",
"01",
"10",
others;

Como se explic en la Seccin 2.5, es aconsejable usar sentencias concurrentes


de seleccin para describir multiplexores y decodificadores, ya que el empleo de
sentencias concurrentes condicionales puede dar lugar a la sntesis de circuitos innecesariamente complejos. Esto es debido a que las condiciones de las sentencias
condicionales no tienen forzosamente que ser excluyentes entre s, cosa que s sucede
siempre con las condiciones de las sentencias concurrentes de seleccin.
Es posible tambin realizar una descripcin del circuito basada nicamente en la
operacin que se desea que realice. Por ejemplo:
Multiplexor 4:1

mux41_out <= iO_vec( TO_INTEGER(unsigned(sel_vec)) );


donde iO_ ve e y sel_ ve e son std_logic_vector.

donde se emplean las funciones de conversin de tipo TO_INTEG ER y unsigned,


que estn definidas en el package IEEE.numeric_std.
Finalmente, los circuitos que realizan operaciones aritmticas pueden ser descritos aplicando las correspondientes operaciones aritmticas a los tipos de datos
adecuados. Por ejemplo, los operandos std_logic_vector deben ser convertidos a
unsigned antes de emplear los operandos suma o multiplicacin. Por ejemplo:
Sumador
Multiplicador

add_uvec <= unsigned(iO_vec) + i1_uvec;


donde i1_uvec y add_uvec son unsigned.
mult_uvec <= unsigned(iO_vec) * i1_uvec;
donde i1_uvec y mult_uvec son unsigned.

Este tipo de descripcin da lugar a la sntesis de circuitos aritmticos estndar:


dependiendo de la opcin seleccionada en la sntesis, las unidades aritmticas sintetizadas pueden ser circuitos lentos que usan un nmero pequeo de puertas lgicas
(si se escoge la opcin "optimizar el rea") o bien circuitos rpidos que utilizan gran
nmero de puertas lgicas (si se escoge la opcin "optimizar la velocidad").
Para crear tipos especficos de unidades aritmticas, tales como tipos especiales
de sumadores o multiplicadores rpidos, puede ser necesario describirlos o bien
indicando su estructura, o bien mediante una descripcin de su comportamiento
a ms bajo nivel, tal como se explica a continuacin.

279

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

4.2.2.

Empleo de bloques process

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.

2. Ninguna otra seal debe estar incluida en la lista de sensibilidad.


3. Ninguna de las sentencias internas al bloque process debe ser sensible al flanco
de subida o de bajada de ninguna seal.

A continuacin, se muestran varios ejemplos sencillos de diseo de circuitos


combinacionales, empleando tanto sentencias concurrentes como bloques process.

4.3.

FUNCIONES LGICAS

En esta seccin se describe el modelado de dos funciones lgicas y de su banco


de pruebas. Las dos funciones lgicas (F y G), que dependen de 3 variables (a, b y
e), son las siguientes:

4.3.1.

a and b or not e

a and b or not b and e

Diseo del circuito

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

( a and b ) or ( not b and e )

DISEO DE LGICA COMBINACIONAL

-- Funcion es lgicas:

F = ab + e'
G = ab + b'c
Fichero: fun cLog_F_G.vhd
library IEEE; use IEEE.std_logie_1164.all;

entity funeLog_F _G is port


( F, G
: out std_logic;
a, b, e : in std_logic );
end entity funeLog_F _G;
architecture funeLog_F _G of funeLog_F _G is
begin
F <= (a and b) or not e;
G <= (a and b) or (not b and e);
end arch1tecture funeLog_F _G;

Cdigo VHDL 4.1: Diseo mediante la descripcin de las funciones lgicas.

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.

Programacin del banco de pruebas

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Banco de pruebas
-- Fichero: bp_funcLog_F_G. vhd
library IEEE;
use IEEE. std_logie_1164. all;
use IEEE.numerie_std . all;
entity bp_funeLog_F _G is
end entlty bp_funeLog_F _G;
architecture bp_funeLog_F _G of bp_funeLog_F _G is
signal yO, y1
: std_logic;
signal xO, x1, x2 : std_logic;

-- Conectar salidas UUT


-- Conectar entradas UUT

component funeLog_F _G is port


( F, G
: out stdJogic;
a, b, e
: in std_logic);
end component funeLog_F _G;
begin
-- Instanciar y conectar UUT
uut : component funeLog_F _G port map
( F = > yO, G = > y 1,
a => xO, b => x1, e = > x2 );
gen_ ve e_ test : process
variable test_in
: unsigned (2 downto O); -- Vector de test
begin
test_in := B"OOO";
for eount in O to 7 loop
x2
<= test_in(2);
x1
<= test_in(1);
xO
<= test_in(O);
wait for 10 ns;
test_in := test_in + 1;
end loop;
wait;
end process gen_vee_test;
end architecture bp_funeLog_F _G;

Cdigo VHDL 4.2: Banco de pruebas del circuito que implementa las dos funciones lgicas.

282

DISEO DE LGICA COMBINACIONAL

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;

Conectar salidas UUT


Conectar entradas UUT

La conexin del UUT en el banco de pruebas se realiza instanciando el UUT


como un subcircuito dentro del banco de pruebas. En este caso, la conexin se
realiza nombrando explcitamente los puertos:
uut : component funcLog_F_G port map
( F => yO, G => y1,
a=> xO, b => x1, e=> x2 );

Obsrvese que la seal y su puerto asociado son incluidos en la lista de parmetros


de la forma siguiente:
puerto => seal
La architecture del banco de pruebas contiene un proceso (bloque process) en
el cual se generan los vectores de test y se introducen como entradas del UUT. El
bloque process se emplea para encapsular una secuencia de sentencias que sern
ejecutadas secuencialmente. En el cdigo del banco de pruebas, el bloque process
tiene la estructura siguiente:
gen_vec_test : process
variable
begin
end process gen_vec_test;

donde las variables se declaran antes de la palabra reservada begin, y las sentencias a
ejecutar secuencialmente se escriben a 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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

pueda ser incrementado (con el fin de generar todas las posibles combinaciones de
vectores de test) empleando un bucle for. La variable test_in se ha declarado de
tipo unsigned, ya que se emplea para realizar operaciones 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

Figura 4.1: Formas de onda obtenidas de simular el Cdigo VHDL 4.2.

284

~~

DISEO DE LGICA COMBINACIONAL

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.

Figura 4.2: Multiplexor de 4 entradas.

4.4.1.

Diseo usando sentencias secuenciales

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- MUX 4x1
-- Fichero: mux_4xLprocess_if. vhd
library IEEE; use IEEE. std_logic_1164. all;

entity mux_ 4x1 is port


( d
: out std_logic;
i3, i2, i1, iO
: in std_logic;
s 1, sO
: in std_logic ) ;
end entity mux_4x1;
architecture mux_ 4x1 of mux_ 4x1 is
begin
process (i3, i2, i1, iO, s1, sO)
begin
if (s1='0' and s0='0') then
d <= iO;
elsif (s1=' O' and sO=' 1 ') then
d <= i1;
elsif (s1=' 1' and sO=' O') then
d <= i2;
el se
d <= i3;
end if;
end process;
end architecture mux_4x1;

Cdigo VHDL 4.3: Diseo de un MUX 4:1 mediante una sentencia if.

Este modelo no reproduce adecuadamente el comportamiento de un multiplexor,


como puede observarse en la Figura 4.3b. Obsrvese que es este caso la salida d no
reproduce el cambio en el valor de la entrada iO que se produce en el instante 5 ns.
En el instante 5 ns la entrada iO pasa de valer 'O' a valer '1 ', mientras que el valor
de la salida d no cambia: sigue siendo 'O'. Esto es debido a que el cambio en el valor
de iO no dispara la ejecucin del bloque process, con lo cual el valor de la salida
no se actualiza al nuevo valor de la entrada iO.

4.4.2.

Diseo usando sentencias concurrentes

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

DISEO DE LGICA COMBINACIONAL

-- MUX 4x1
-- Fichero: mux_4xLprocess_if_case. vhd
library IEEE; use IEEE. std_logic_1164. all;

entity mux_ 4x1 is port


( d
: out std_logic;
i3, i2, i1, iO : in stcLlogic;
s1, sO
: in std_logic );
end entity mux_4x1;
architecture mux_4x1 of mux 4x1 is
begin
process (i3, i2, i1, iO, s1, sO)
variable sel : integer;
begin
if
(s1='0'and s0='0') then
sel := O;
elsif (s1= 'O' and sO=' 1') then
sel := 1;
elsif (s1='1'and sO='O') then
sel := 2;
el se
sel := 3;
end if;
case sel is
when O
=>
d <= iO;
when 1
=>
d <= i1;
when 2
=>
d <= i2;
when others =>
d <= i3;
end case;
end process;
end architecture mux_4x1;

Cdigo VHDL 4.4: Descripcin del MUX 4:1 mediante sentencias if y case.

287

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Banco de pruebas
-- Fichero: bp_mux_4x1. vhd
library IEEE;
use IEEE. std_logic_1164. all;

entity bp_mux_ 4x1 is


end entity bp_mux_4x1;
architecture bp_mux_ 4x1 of bp_mux_ 4x1 is
signal d
: std_logic; -- Conectar salida UUT
signal iO, i1, i2, i3,
sO, s1
: std_logic; -- Conectar entmdas UUT
component mux_4x1 is port
( d
: out std_logic;
i3, i2, i1, iO
: in std_logic;
s 1, sO
: in std_logic ) ;
end component mux_4x1;
begin
-- Instanciar y conectar UUT
uut : component mux_ 4x1 port map
( d = > d,
iO = > iO, i1 = > i1, i2 = > i2, i3 = > i3,
sO = > sO, s1 = > s1 );

gen_ ve e_ test : process

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;

Cdigo VHDL 4.5: Banco de pruebas del MUX 4:1.

288

DISEO DE LGICA COMBINACIONAL

+ /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;

elsif (s1=' O' and sO=' 1 ') t hen

<=

i1;

elsif (s1=' 1 'and sO=' O') then


d

<=

i2 ;

<=

i3 ;

el se

end if;
end process;
end architectur e mux_4x1;

Cdigo VHDL 4. 6 : Descripcin errnea de la a r chitecture del MUX 4: 1.

289

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- MUX 4x1
-- Fichero: mnx_4xLconcnrrente1. vhd
library IEEE;
use IEEE.std_logic_ii64.all;
entity mux_ 4xi is port
( d
: out std_logic;
i3, i2, ii, iO
: in std_logic;
si, sO
: in std_logic );
end entity mux_4xi;
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;

Cdigo VHDL 4. 7: Diseo de un MUX 4:1 mediante una sentencia 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

DISEO DE LGICA COMBINACIONAL

4.5.

RESTADOR COMPLETO DE 1 BIT

En esta seccin se describe el diseo de un circuito restador completo de 1


bit y de su banco de pruebas. VHDL permite describir la architecture de un
circuito mediante su comportamiento y tambin mediante su estructura, es decir,
indicando cmo estn conectados los subcircuitos que lo componen. En primer
lugar , se realizar una descripcin del circuito basada en su comportamiento. A
continuacin, se har una descripcin basada en su estructura.

4.5.1.

Descripcin del comportamiento

A continuacin, se muestra la tabla de la verdad del circuito restador de 1 bit.


Este circuito calcula el resultado (res) y el acarreo (acarreo) obtenidos de realizar la
resta (a- b) de dos bits (a,b).
a

res

o o o
o 1 1
1 o 1
1 1 o

acarreo

o
1

o
o

Un circuito restador completo de 1 bit tiene una entrada adicional: el acarreo


de entrada. Conectando varios de estos circuitos, puede obtenerse un restador de
nmeros de varios bits.
El Cdigo VHDL 4.9 describe un restador completo de 1 bit. Obsrvese que la
architecture describe el funcionamiento del circuito, sin entrar en detalles acerca
de su implementacin.
La interfaz del restador completo es descrita en la entity llamada rest_completo.
En ella se definen los dos puertos de salida (res, acarreo_out), seguidos de los tres
puertos de entrada (a, b, acarreo_in).
Los puertos de entrada y de salida se definen del tipo std_logic, con el fin de
facilitar el uso del restador como subcircuito en otros circuitos: se emplean seales
del tipo std_logic y std_logic_vector para modelar las seales transmitidas por el
cableado de los circuitos fsicos.
En la architecture, se define una seal del tipo unsigned de 2 bits, llamada
resul t, con el fin de almacenar el resultado de la operacin de sustraccin. Al

291

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- 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;

Cdigo VHDL 4.9: Descripcin del comportamiento de un restador completo de un bit.

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

DISEO DE LGICA COMBINACIONAL

4.5 .2.

Descripcin de la estructura

En la Figura 4.5 se muestra un circuito restador completo de 1 bit. Para su


definicin, se emplean puertas OR-exclusiva de 2 entradas (xor2) , AND de dos
entradas (and2), OR de tres entradas (or3) e inversor (not1) .

.----+r--;
. . ... . . . . . . . . .

.------+---+ _-.--~...... ....g}_j


-

acarreo out

. ~g~] ;.- . . . . . .... . . . ..... . . . ...... ..

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Puerta OR exclusiva de 2 entradas. Fi chero: xor2. vhd


library IEEE; use IEEE. std_logic_1164. all;
entity xor2 is port
( yO
: out std_logic;
xO, x1 : in std_logic );
end entity xor2;
architecture xor2 of xor2 is
begin
yO <= xO xor x1;
end architecture xor2;

-- Inversor de 1 entrada. Fichero: notl. vhd


library IEEE; use IEEE. std_logic_1164. all;
entity not 1 is port
( yO : out std_logic;
xO : in std_logic ) ;
end entity not1;
architecture not 1 of not 1 is
begin
yO <= not xO;
end architecture not 1;

-- Puerta AND de 2 entradas. Fi chero: and2.vhd


library IEEE; use IEEE. std_logic_1164. all;
entity and2 is port
( yO
: out std_logic;
xO, x 1 : in std_logic ) ;
end entity and2;
architecture and2 of and2 is
begin
yO <= xO and x1;
end architecture and2;

-- Puerta OR de 3 entradas. Fichero: or3.vhd


library IEEE; use IEEE.std_logic_1164.all;
entity or3 is 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;
end architecture or3;

Cdigo VHDL 4.10: Diseo de las puertas lgicas XOR2, NOTl , AND2 y OR3.

294

DISEO DE LGICA COMBINACIONAL

-- R estador completo de 1 bit


-- Fichero: restadorCompletol bitEstruc. vhd
library IEEE;
use IEEE. std_logie_1164. all;
entity rest_eompleto is port
( res, aearreo_out : out std_logic;
a, b, aearreo_in : in std_logic);
end entity rest_eompleto;
architecture rest_eompleto_estrue of rest_eompleto is
signal not_a, e, d, e, f : std_logic;
-- Declaracin de las clases de los componentes
component xor2 is port
( yO
: out std_logic;
xO, x 1
: in std_logic ) ;
end component xor2;
component not 1 is port
( yO
: out std_logic;
xO
: in std_logic ) ;
end component not 1;
component and2 is port
( yO
: out std_logic;
xO, x 1
: in std_logic ) ;
end component and2;
component or3 is port
( yO
: out std_logic;
xO, x1, x2 : in std_logic );
end component or3;
begin
-- Instanciacin y
gO : component
g1 : component
-- g2 : component
g2 : component
g3 : component
g4 : component
g5 : component
g6 : component

conexin de los componentes


xor2 port map (e, a, b );
xor2 port map (res, e, aearreo_in);
notl port map {noLa, a);
not1 port map (yO => not_a, xO = > a);
and2 port map (d, not_a, aearreo_in);
and2 port map (e, not_a, b);
and2 port map (f, b, aearreo_in);
or3 port map (aearreo_out, d, e, f);

end architecture rest_eompleto_estrue;

Cdigo VHDL 4.11: Descripcin de la estructura de un restador completo de un bit.

295

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

4.5.3.

Programacin del banco de pruebas

En este caso, en el cdigo del banco de pruebas se comprueban las salidas


obtenidas del UUT con las salidas esperadas. Es decir, el propio banco de pruebas
comprueba si el comportamiento del circuito es correcto y en caso de que no lo sea
generar el correspondiente mensaje. Se usar la descripcin estructural del restador
para modelar el UUT y su descripcin del comportamiento para obtener las salidas
"correctas", que se compararn con las salidas del UUT.
El Cdigo VHDL 4.12 es el banco de pruebas. La architecture del banco de
pruebas contiene un bloque process en el cual se generan los vectores de test, se
introducen como entradas del UUT y se comprueban las salidas del UUT.
El banco de pruebas no tiene ni entradas ni salidas externas. Por ese motivo, la
entity del banco de pruebas no contiene ningn puerto (port):
entity bp_rest_completo is
end entity bp_rest_completo;

La conexin del UUT en el banco de pruebas se realiza instanciando el restador


binario como un subcircuito dentro del banco de pruebas. Aunque la conexin
se realiza mediante asociacin posicional, podra haberse realizado la asociacin
nombrando explcitamente los puertos:
uut : component rest_completo port map
(res => res, acarreo_out => acarreo_out,
a=> a, b => b, acarreo_in => acarreo_in);

Se han definido 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

DISEO DE LGICA COMBINACIONAL

-- Banco de pruebas del restador completo de 1 bit. Fichero: restadorCompletolbiLbp.vhd


library IEEE; use IEEE. std_logic_1164.all; use IEEE.numeric_std.all;
entity bp_rest_completo is
end entity bp_rest_completo;

-- El banco de pruebas no tiene


--. ni entradas ni salidas

architecture bp_rest_completo of bp_rest_completo is


signal res, acarreo_out : std_logic; -- Para conectar el UUT
signal a, b, acarreo_in : std_logic;
-- Para conectar el UUT
component rest_completo is port
( res, acarreo_out : out std_logic;
a, b, acarreo_in : in std_logic);
end component rest_completo;
begin
-- Instanciar y conectar UUT
uut : component rest_completo port map
(res, acarreo_out, a, b, acarreo_in);
-- Crear vectores de test y comprobar salidas del UUT
gen_vec_test : process
variable test_in
: unsigned (2 downto O);
-- Vector de test
variable esperado
: unsigned (1 downto O);
-- Salida esperada
variable num_errores : integer := O;
-- Numero de errores
begin
test_in := B"OOO";
for count in O to 7 loop
a
<= test_in(2);
b
<= test_in(1);
acarreo_in <= test_in(O);
wait for 10 ns;
esperado
:= ('0' & a)- ('0' & b)- ('0' & acarreo_in);
if (esperado /= ( acarreo_out & res )) then -- Comprueba resultado
report "ERROR : Esperado ("
&
-- Report del error
std_logic' image (esperado( 1)) &
std_logic' image (esperado( O)) &
") /= actual ("
&
std_logic' image (acarreo_ out) &
std_logic' image (res)
&
") en el instante "
&
time ' image ( now);
num_errores := num_errores + 1;
end if;
test_in := test_in + 1;
end loop;
report "Test completo. Hay "
&
integer' image(num_errores) &
"errores.";
wait;
end process gen_vec_test;
end architecture bp_rest_completo;

Cdigo VHDL 4.12: Banco de pruebas del restador completo de un bit.

297

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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

VSIM 10> run


t:l "' Note: Test completo. Hay Oerrores.
t:l Time: 80 ns lteration: O lnstance: /bp_rest_completo
VSIM 11 >

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

El comando report se usa para escribir texto en la consola. El argumento


del comando (esto es, el texto a escribir) debe ser del tipo string. Por ejemplo,
cadenas de caracteres concatenadas mediante el operador &. Por ello, todo lo que
se desee mostrar deben ser convertido previamente al tipo string. Por ejemplo,
std_logic' image (res) se usa para convertir el valor de res, que es del tipo std_logic,
a un dato del tipo string.
Asimismo, now es una funcin predefinida que devuelve el tiempo simulado
como un dato del tipo time. Puede usarse time'image(now) para obtener una
representacin del tipo string del tiempo actual de la simulacin.
Como resultado de la simulacin del banco de pruebas, se obtienen las formas de
onda y el mensaje en la consola mostrados en la Figura 4.6.
Frecuentemente, en un banco de pruebas es preciso comparar el valor esperado
de una seal con el valor obtenido de la simulacin del circuito. Si ambos valores no
coinciden, entonces se muestra un mensaje de error y se incrementa el contador del
nmero de errores. El Cdigo VHDL 4.13 es el banco de pruebas para el circuito
restador completo de 1 bit, programado empleando un procedimiento que realiza
la comparacin entre el valor esperado y el actual, y que, en su caso, muestra los
correspondientes mensajes de error.
El cdigo anterior del banco de pruebas puede modificarse con el fin de emplear
una funcin en lugar de un procedimiento. El Cdigo VHDL 4.14 es una posible
forma de hacerlo. Obsrvese que se ha sustituido la clusula if, que compara el valor
esperado con el valor actual, por una sentencia assert. El motivo es nicamente
ilustrar el uso de la sentencia assert.

298

DISEO DE LGICA COMBINACIONAL

-- Banco de pruebas del restador completo de 1 bit empleando un procedimiento


-- Fichero: restadorCompletoi biL bp_procedure.vhd
library IEEE; use IEEE. std_logic_1164. all; use IEEE. numeric_std. all;

entity bp_rest_completo is
end entity bp_rest_completo;

-- El banco de pruebas no tiene


-- ni entradas ni salidas

architecture bp_rest_completo_procedure of bp_rest_completo is


signal res, acarreo_out : std_logic; -- Para conectar el UUT
signal a, b, acarreo_in : std_logic;
-- Para conectar el UUT
procedure error _check( esperado, actual : in
unsigned;
num_errores
: inout integer ) is
begin
if (esperado / = actual) then -- Comprueba resultado y report del error
report "ERROR : Esperado ("
&
std_logic' image (esperado ( 1)) & std_logic' image (esperado (O)) &
") /= actual ("
&
std_logic' image (actual ( 1))
& std_logic' image (actual (O))
&
") en el instante"
& time' image(now);
num_errores := num_errores + 1;
end if;
end procedure error _check;
component rest_completo is port
( res, acarreo_out : out std_logic;
a, b, acarreo_in : in std_logic);
end component rest_completo;
begin
-- Instanciar y conectar UUT
uut : component rest_completo port map
(res, acarreo_out, a, b, acarreo_in);
-- Crear vectores de test y comprobar salidas del UUT
gen_ vec_ test : process
variable test_in
: unsigned (2 downto O); -- Vector de test
variable esperado
: unsigned (1 downto O); --Salida esperada
variable num_errores : integer := O;
-- Numero de errores
begin
test_in := B"OOO";
for count in O to 7 loop
a
<= test_in(2);
b
<= test_in(1);
acarreo_in <= test_in(O);
wait for 10 ns;
esperado
:= ('0' & a)- ('0' & b)- ('0' & acarreo_in);
error_check( esperado, acarreo_out & res, num_errores );
test_in := test_in + 1;
end loop;
report "Test completo. Hay " & integer' image(num_errores ) & " errores.";
wait;
end process gen_vec_test;
end architecture bp_rest_completo_procedure;

Cdigo VHDL 4.13: Banco de pruebas del restador completo de un bit usando un procedimiento.

299

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Banco de pruebas del restador completo de 1 bit empleando una funcion


-- Fichero: restadorCompletol biLbp_funcion. vhd
library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all;
entity bp_rest_completo is
end entity bp_rest_completo;

-- El banco de pruebas no tiene


-- ni entradas ni salidas

architecture bp_rest_completo_funcion of bp_rest_completo is


signal res, acarreo_out : std_logic; -- Para conectar el UUT
signal a, b, acarreo_in : std_logic; -- Para conectar el UUT
function error _check( esperado, actual : unsigned;
tnow
: time ) return integer is
begin
assert ( esperado = actual )
-- Comprobacion usando assert y report del error
repdrt 11 ERROR : Esperado ( 11
&
std_logic' image (esperado ( 1)) & std_logic' image (esperado (O)) &
11
)
/= actual ( 11
&
std_logic' image (actual ( 1))
& std_logic' image (actual (O))
&
11
)
en el instante 11
& time'image(tnow)
severity error;
-- Opcion severity
if ( esperado / = actual ) then
return 1;
-- Indica error
el se
return O;
-- Indica que no hay error
end if;
end function error _check;
component rest_completo is port
( res, acarreo_out : out std_logic;
a, b, acarreo_in : in std_logic);
end component rest_completo;
begin
uut : component rest_completo port map (res, acarreo_out, a, b, acarreo_in);
gen_ vec_ test : process
variable test_in
: unsigned (2 downto O);
-- Vector de test
variable esperado
: unsigned (1 downto O);
--Salida esperada
variable num_errores : integer := O;
-- Numero de errores
begin
test_in := B11 000 11 ;
for count in O to 7 loop
acarreo in <= test_in(O);
a <= test_in(2);
b <= test_in(1);
wait for 10 ns;
esperado
:= ('0' & a)- ('0' & b)- ('0' & acarreo_in);
num_errores := num_errores -terror_check( esperado, acarreo_out & res, now );
test_in := test_in -t- 1;
end loop;
report 11 Test completo. Hay 11 & integer'image(num_errores) & 11 errores. 11 ;
wait;
end process gen_vec_test;
end architecture bp_rest_completo_funcion;

Cdigo VHDL 4.14: Banco de pruebas del restador completo de un bit usando una funcin.

300

DISEO DE LGICA COMBINACIONAL

4.6.

SUMADOR COMPLETO DE 1 BIT

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

Simplificando las funciones lgicas mediante mapas de Karnaugh, se llega a las


expresiones mostradas a continuacin. En la Figura 4. 7 se muestra el circuito.

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

Figura 4. 7: Sumador completo.

301

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

4.6.1.

Diseo del circuito

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

Para comprobar el correcto funcionamiento de este circuito, se puede emplear un


banco de pruebas muy similar al que se dise para el restador de 1 bit.
En el banco de pruebas se compara el resultado obtenido de la descripcin
de la estructura del sumador, con el resultado obtenido de la descripcin de su
comportamiento. Se muestra un mensaje si ambos resultados no coinciden y se lleva
la cuenta del nmero de errores, mostrando al final de la simulacin un mensaje con
el nmero total de errores. El banco de pruebas es el Cdigo VHDL 4.17.
En la Figura 4.8 se muestra el resultado de la simulacin del banco de pruebas.
Obsrvese que, debido al retardo de las puertas lgicas, desde el instante inicial hasta
el instante 20 ns las salidas del sumador toman el valor 'U' (indefinido). Asimismo,
los cambios en las seales de entrada tardan 20 ns en propagarse a las seales de
salida.

+ /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

Figura 4.8: Simulacin del banco de pruebas del sumador completo .

.. .... _,

/~

\,.: . ,. . . :
'

400

DISEO DE LGICA COMBINACIONAL

-- A ND de 2 entradas con retardo


-- Fi chero : and2_retardo. vhd
library IEEE; use IEEE.std_logic_1164.all;

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;

-- OR de 3 entradas con retardo


-- Fichero: or3_retardo. vhd
library IEEE; use IEEE. std_logic_1164. all;

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;

-- OR exclusiva de 2 entradas con retardo


-- Fichero: xor2_retardo .vhd
library IEEE; use IEEE. std_logic_1164. all;

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Package en el qv,e se defin en los componentes


-- Fichero: pv,ertasLogicas_package. vhd
library IEEE;
use IEEE. std_logic_1164. all;

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;

entity sum_completo is port


( s, C_out
: out std_logic;
x, y, C_in : in std_logic);
end entity sum_completo;
architecture sum_completo_estruc of sum_completo is
signal n1, n2, n3, n4: std_logic;
begin
-- Instanciacin y conexin de los componentes
XOR2_1 : component xor2 port map
(xO => x,
x1 =>y,
yO => n1
XOR2_2 : component xor2 port map
(xO => C_in, x1 => n1,
yO=> S
AND2_1 : component and2 port map
yO => n2
(xO => x,
x1 =>y,
AND2_2 : component and2 port map
yO => n3
(xO => x,
x1 => C_in,
AND2_3 : component and2 port map
(xO => y,
x1 => C_in,
yO => n4
OR3_1 : component or3 port map
(xO => n2,
x1 => n3,
x2 => n4, yO => C_out
end architecture sum_completo_estruc;

);
);
);
);
);
);

Cdigo VHDL 4.16: Package con los componentes del sumador y diseo del sumador.

304 .

DISEO DE LGICA COMBINACIONAL

-- Banco de pruebas del sumador completo de 1 bit


-- Fichero: sumadorCompletol biLbp. vhd
library IEEE;
use IEEE. std_logic_1164. all;
use IEEE.numeric_std.all;
entity bp_sum_completo is
end entity bp_sum_completo;

-- El banco de pntebas no tiene


-- ni entradas ni salidas

architecture bp_sum_completo of bp_sum_completo is


signal s, C_out,
x, y, C_in : std_logic; -- Para conectar el UUT
component sum_completo is
port ( s, C_out
: out std_logic;
x, y, C_in : in std_logic);
end component sum_completo;
begin
-- Instanciar y conectar UUT
uut : component sum_completo port map
(s => s, C_out => C_out, x => x, y => y, C_in => C_in);
-- Crear vectores de test y comprobar salidas del UUT
gen_vec_test : process
variable test_in
: unsigned (2 downto O); -- Vector de test
variable esperado
: unsigned (1 downto O); --Salida esperada
variable num_errores : integer := O;
-- Numero de errores
begin
test_in := B"OOO";
for count in O to 7 looi_>
C_in
<= test_in(2);
x
<= test_in(1);
y
<= test_in(O);
wait for 50 ns;
esperado
:= ('0' & x) + ('0' & y)+ ('0' & C_in);
if (esperado / = ( C_out & s ) ) then
-- Comprueba resultado
report "ERROR : Esperado ( 11
&
-- Report del error
std_logic' image( esperado( 1)) &
std_logic ' image (esperado (O)) &
") /= actual ("
&
std_logic' image(C_out)
&
std_logic ' image ( s)
&
11
11
) en el instante
&
time' image(now);
num_errores := num_errores + 1;
end if;
test_in := test_in + 1;
end loop;
report "Test completo. Hay 11 & integer'image(mim_errores) & 11 errores.";
wait;
end process gen_vec_test;
end architecture bp_sum_completo;

Cdigo VHDL 4.17: Banco de pruebas del sumador completo.

305

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

4.7.

UNIDAD ARITMTICO LGICA

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

DISEO DE LGICA COMBINACIONAL

-- Definicin de constantes globales de la ALU. Fichero: ALU_CONS TANTS.vhd


package ALU_ eONSTANTS is
constant WIDTH
integer := 16;
-- N m. bits de los operandos
-- Nm . bits seleccin de operacin
constant SEL_BITS : integer := 3;
end package ALU_eONSTANTS;

-- AL U diseada mediante una sentencia concurrente. Fichero: AL U_concurrente. vhd


library IEEE;
use IEEE. std_logic_1164. all;
use IEEE. numeric_std. all;
use work. ALU_eONSTANTS . all;

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;

when (mode= 11 000 11 )


when (mode= 11 001 11 )
when (mode= 11 010 11 )
when (mode= 11 011 11 )
when (mode= 11 100 11 )
when (mode= 11 101 11 )
when (mode= 11 110 11 )

-- AL U diseada mediante un bloque process. Fichero : AL U_bloqueProcess.vhd


library IEEE;
use IEEE. std_logic_1164. all;
use IEEE. numeric_std. all;
use work . ALU_eONSTANTS. all;

architecture ALU_bloqueProcess of ALU is


begin
process (A, B, mode) is
begin
case mode is
when 11 000 11 = > e < = std_logic_vector(signed(A)+signed(A));
when 11 001 11 = > e < = std_logic_vector(signed(A)+signed(B) ) ;
when 11 010 11 = > e < = std_logic_vector(signed(A)-signed(B)) ;
when 11 011 11 = > e < = std_logic_vector(-signed(A));
when 11 100 11 = > e < = A and B;
when 11 101 11 = > e < =A or B;
when 11 110 11 = > e < =A xor B;
when others = > e < =notA;
end case;
end process ;
end architecture ALU_bloqueProcess;

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

4.7.2.

Programacin del banco de pruebas

Como hemos visto en otros ejemplos, el banco de pruebas est tpicamente


formado por las tres partes siguientes: el dispositivo que va a ser probado (UUT),
el cdigo para la generacin de los vectores de test y el cdigo para comprobar los
resultados del test.
An en el caso de una ALU sencilla como esta, examinar que la ALU realiza
correctamente las operaciones para todos los posibles valores de los operadores
consumira bastante tiempo. En la prctica esta tcnica sera inviable, por lo cual
debe seleccionarse un conjunto de vectores de test, por ejemplo, atendiendo a los
criterios siguientes:
- Se escogen valores de los operandos entorno al cero. Por ejemplo: -2, -1, O,

1 y 2.
- 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

DISEO DE LGICA COMBINACIONAL

-- Definicin de constantes globales del banco de pruebas de la AL U


--Fichero: TB_ALU_CONSTANTS.vhd
use work.ALU_CONSTANTS.all;
package TB_ALU_CONSTANTS is
constant SEL_MAX
: integer := 2**SEL_BITS - 1;
constant MAX_POS_DATA : integer := 2**(WIDTH-1) - 1;
constant MIN_NEG_DATA : integer := -2**(WIDTH-1);
constant DELAY
: time
:= 10 ns;
end package TB_ALU_CONSTANTS;

-- Banco de pr'uebas para la AL U


-- Fichero: TB_ALU.vhd
library IEEE;
use IEEE. std_logic_1164. all;
use IEEE. numeric_std. all;
use work. ALU_CONSTANTS. all;
use work.TB_ALU_CONSTANTS.all;
entity TB_ALU is
end entity TB_ALU;
architecture TB_ALU of TB ALU is
signal A,B,C : std_logic_vector (WIDTH-1
downto O);
signal mode : std_logic_vector (SEL_BITS-1 downto O);
component ALU is
port ( C
: out std_logic_vector (WIDTH-1
downto O);
A, B : in
std_logic_vector (WIDTH-1
downto O);
mode : in
std_logic_vector (SEL_BITS-1 downto O) );
end component ALU;

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

---------------- 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

DISEO DE LGICA COMBINACIONAL

---------------- 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;

Cdigo VHDL 4.21: Fragmento de la definicin del banco de pruebas de la ALU.

311

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

---------------- 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;

-- Informe mostrando el resultado del test


if (error_count=O) then
report "Finaliza la simulacin sin errores";
el se
report "Finaliza la simulacin:" & integer'image(error_count) & "errores";
end if;
wait; -- Termina la simulacin
end process main;
end architecture TB_ALU;

Cdigo VHDL 4.22: Parte final de la definicin del banco de pruebas de la ALU.

312

DISEO DE LGICA COMBINACIONAL

4.8.

LECTURAS RECOMENDADAS

El Captulo 2 de (Vahid & Lysecky 2007) es una introduccin didctica al diseo


de lgica combinacional. El Captulo 6 de (Chu 2006) es una excelente referencia
acerca de la sntesis del cdigo VHDL. En el Captulo 7 de este mismo texto se
dan recomendaciones y guas valiosas acerca del diseo con VHDL para sntesis
de circuitos combinacionales eficientes. En los Captulos 9 y 10 de (Perry 2002) se
discute el diseo para sntesis usando VHDL.
Es importante saber qu estructura circuital se puede obtener a partir de una
descripcin VHDL. Los libros (Chang 1997) y (Sjoholm & Lindh 1997) contienen
ejemplos donde se muestra el cdigo de un diseo y el circuito sintetizado al cual da
lugar. Adems, el Captulo 8 de (Chang 1997) contiene una gua general de cmo se
ha de describir en VHDL un circuito para sntesis.
Los Captulos 2, 3 y 4 de (Hwang 2005) contienen varios ejemplos de circuitos
combinacionales tpicos, algunos de ellos descritos en VHDL. Estos tres Captulos
recogen conceptos fundamentales del diseo de circuitos digitales combinacionales,
como el lgebra de Boole, los mapas de Karnaugh, etc ...

313

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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

Disee un circuito comparador, que devuelva '1' si el valor del nmero de 4


bits (x3 x2 x1 xo) de entrada es menor que 5. Emplee nicamente asignaciones
concurrentes y operadores lgicos. Una vez diseado el circuito, programe un banco
de pruebas para testearlo.
Recomendacin: obtenga las funciones lgicas que describen el comportamiento
del circuito a partir de su tabla de verdad.

Ejercicio 4.3

Disee un decodificador de cdigo decimal binario de 4 bits (BCD) a 7 segmentos


capaz de alimentar un display numrico de LEDs. La entrada de 4 bits (i 1 , i 2 , i 3 e i 4 )
codifica la representacin binaria de un dgito decimal. Los 7 bits de salida (a, b, e,
d, e, f y g) toman el valor 'O' '1' de modo que el display de LEDs muestre el dgito
correspondiente. El esquemtico del display, con los nombres correspondiente a cada
segmento, se muestra en la Figura 4.9. La operacin del decodificador se especifica
en la Tabla 4.2.
Escriba en VHDL el cdigo del decodificador BCD utilizando un nico bloque
process y una sentencia case. Las seales de entrada y de salida del decodificador
han de ser del tipo std_logic.

314

DISEO DE LGICA COMBINACIONAL

b
g

d
Figura 4.9: Display de 7 segmentos.

Tabla 4.2: Tabla de la verdad del circuito decodificador

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

A continuacin, programe un banco de pruebas para el decodificador, que testee


todas las posibles entradas al circuito, y simlelo. Compruebe el correcto funcionamiento del circuito observando visualmente sus seales de salida.

Ejercicio 4.4

Escriba en VHDL el cdigo del decodificador BCD descrito en el Ejercicio 4.3


usando esta vez un nico bloque process y una sentencia if. Las seales de entrada
y de salida del decodificador han de ser del tipo std_logic.
A continuacin, compruebe el correcto funcionamiento del circuito usando el
banco de pruebas programado en el Ejercicio 4.3.

315

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Ejercicio 4.5

Escriba en VHDL el cdigo del decodificador BCD descrito en el Ejercicio 4.3


usando esta vez una asignacin concurrente condicional. Las seales de entrada y de
salida del decodificador han de ser del tipo std_logic.
A continuacin, compruebe el correcto funcionamiento del circuito usando el
banco de pruebas programado en el Ejercicio 4.3.

Ejercicio 4.6

Escriba en VHDL el cdigo del decodificador BCD descrito en el Ejercicio 4.3


usando esta vez nicamente la sentencia select y asignaciones concurrentes. Las
seales de entrada y de salida del decodificador han de ser del tipo std_logic.
A continuacin, compruebe el correcto funcionamiento del circuito usando el
banco de pruebas programado en el Ejercicio 4.3.

Ejercicio 4. 7

La Figura 4.10 representa un esquema de un sumador binario paralelo de 4 bits


con propagacin del arrastre compuesto por 4 sumadores completos de 1 bit. Programe en VHDL un sumador de N bits, donde N es una contante de tipo generic, usando
el sumador completo de 1 bit desarrollado en la Seccin 4.6. Emplee sentencias
generate para realizar la instanciacin y conexin de los N sumadores completos de
1 bit.
x3 Y3
X

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

DISEO DE LGICA COMBINACIONAL

A continuacin, programe un banco de pruebas para el sumador de 4 bits (N = 4).


El banco de pruebas debe testear todas las posibles entradas al circuito y mostrar
al final de la simulacin un mensaje con el nmero total de errores producidos.

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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

Figura 4.12: Estructura de la ALU.

Tabla 4.4: Tabla de operaciones de la ALU.

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

DISEO DE LGICA COMBINACIONAL

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Escriba en VHDL, de las tres formas indicadas a continuacin, la architecture


que describe el comportamiento del circuito combinacional conversor de cdigo
binario de 3 bits a cdigo Gray.
- En primer lugar, emplee un bloque process con una sentencia case.
- En segundo lugar, emplee una asignacin concurrente de seleccin (with select).
- Finalmente, describa la estructura del circuito, empleando para ello dos puertas
lgicas XOR de dos entradas. Tenga en cuenta que el bit en la posicin i de
una palabra del cdigo Gray es 1 si los bits en las posiciones i e i + 1 de la
correspondiente palabra binaria son diferentes. La entity de la puerta lgica
XOR se muestra a continuacin.
entity xor2 is
port ( yO
xO, x1
end entity xor2;

out std_logic;
in std_logic );

Asimismo, programe en VHDL un banco de pruebas que testee exhaustivamente


el circuito.

320

DISEO DE LGICA COMBINACIONAL

4.10.

SOLUCIONES DE LOS EJERCICIOS

Solucin al Ejercicio 4.1


El Cdigo VHDL 4.23 es el diseo de un codificador 4:2 con prioridad. Obsrvese
que el bloque process es activado cuando cambia cualquiera de las entradas, ya
que el bloque es sensible a estas cuatro seales. Se emplean sentencias if-elsif para
inspeccionar de manera priorizada las entradas. El Cdigo VHDL 4.24 y 4.25 es el
banco de pruebas para este diseo.

-- Codificador 4:2 con prioridad


-- Fich ero: codificador_4_2_prioridad. vhd
library IEEE;
use IEEE. std_logic_1164. all;
entity codificador_ 4_2_prioridad is
port ( valida
: out std_logic; -- '1' si hay entrada
codificada
: out std_logic_vector(1 downto O);
i3, i2, i1, iO : in std_logic );
end entity codificador_ 4_2_prioridad;
architecture codificador_ 4_2_prioridad of codificador_ 4_2_prioridad is
begin
process (i3, i2, i1, iO) is --Activado cuando cambia alguna entrada
begin
if ( (i3='1') or (i2='1') or (i1='1') or (i0='1')) then
valida <= '1 '; -- Indica que la salida es vlida
else
valida <= '0'; -- Salida no vlida, puesto que no hay entrada
end if;
if
( i3=' 1 ' ) then codificada <= 11 11 11 ;
elsif ( i2=' 1 ') then codificada<= 11 10 11 ;
elsif ( i 1 = ' 1 ' ) then codificada<= 11 01 11 ;
el se
codificada <= 11 00 11 ;
end if;
end process;
end architecture codificador_4_2_prioridad;

Cdigo VHDL 4.23: Diseo de un codificador 4:2 con prioridad.

321

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Banco de pruebas del codificador 4:2 con prioridad


-- Fichero: bp_codificador_4_2. vhd
library IEEE;
use IEEE. std_logic_1164. all;
use IEEE. numeric_std. all;

entity bp_codificador_4_2 is
constant MAX_COMB : integer := 16;
-- Num. combinaciones entrada
constant DELAY
: time
.- 10 ns; -- Retardo usado en el test
end entity bp_codificador_4_2;
architecture bp_codificador_4_2 of bp_codificador_4_2 is
-- Salidas UUT
: 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

DISEO DE LGICA COMBINACIONAL

-- Continua el banco de pruebas del codificador 4:2 con prioridad


wait for DELAY; -- Espera y compara con las salidas de UUT
if ( esperado_ valida / = valida ) then
report "ERROR en la salida valida. Valor esperado: " &
std_logic' image (esperado_ valida)
&
", valor actual: "
&
std_logic' image(valida)
&
" en el instante: "
&
time ' image ( now);
error count := error_count
1;
end if;

if ( esperado_codificada /= codificada ) then


report "ERROR en la salida codificada. Valor esperado:
std_logic' image ( esperado_codif icada( 1))
std_logic' image ( esperado_codif icada( O))
", valor actual: "
std_logic' image (e o di f i cada ( 1))
std_logic' image( codificada( O))
" en el instante: "
time ' image ( now);
error count := error_count
1;
end if;

11

&
&
&
&
&
&

&

end loop; -- Final del b'ucle for de posibles valores de entrada


-- Informe del nmero total de errores
if (error_count =o) then
report "Simulacin finalizada sin errores";
el se
report "ERROR: Hay "
&
integer'image(error_count) &
"errores.";
end if;
wait;

-- Final de la simulacin

end process main;


end architecture bp_codificador_4_2;

Cdigo VHDL 4.25: Parte final del banco de pruebas de un codificador 4:2 con prioridad.

323

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Solucin al Ejercicio 4.2


La tabla de la verdad del circuito, y la funcin lgica obtenida a partir de dicha
tabla, son los siguientes:

(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)

El diseo del circuito y su banco de pruebas se muestran en el Cdigo VHDL 4.26


y 4.27, respectivamente.

-- Comparador F = X< 5:
F = x3'x2'+x3'x2x1 'xO'
-- Fichero: comparaXmenor5.vhd

library IEEE; use IEEE. std_logic_1164. all;


entity comparaXmenor5 is port
( F : out std_logic;
x : in std_logic_vector ( 3 downto O) ) ;
end entity comparaXmenor5;
architecture comparaXmenor5 of comparaXmenor5 is
begin
F <= (not x(3) and not x(2))
or (not x(3) and x(2) and not x(1) and not x(O));
end architecture comparaXmenor5;

Cdigo VHDL 4.26: Diseo del circuito comparador de 4 bit para X<5.

324

DISEO DE LGICA COMBINACIONAL

-- Banco de pntebas comparador X< 5


-- Fichero: bp_comparaXmenor5. vhd
library IEEE;
use IEEE. std_logic_1164. all;
use IEEE. numeric_std. all;
entity bp_comparaXmenor5 is
end entity bp_comparaXmenor5;
architecture bp_comparaXmenor5 of bp_comparaXmenor5 is
signal F : std_logic; -- Conectar salidas UUT
signal x : std_logic_vector(3 downto O); -- Conectar entradas UUT
component comparaXmenor5 is port
( F : out std_logic;
X : in
std_logic_vector(3 downto 0));
end component comparaXmenor5;
begin
-- Instanciar y conectar UUT
uut : component comparaXmenor5 port map
( F => F, X => X );
gen_ ve e_ test : process
variable test_in
variable num_errores
begin

: unsigned (3 downto O) := B11 0000 11 ; - - Vector de test


: integer := O;
-- Num ero de errores

for count in O to 15 loop


x(3) <= test_in(3);
x(2) <= test_in(2);
x(1) <= test_in(1);
x(O) <= test_in(O);
wait for 10 ns;
-- Comprueba resultado
if (F= 'O' and test_in<5) or (F=' 1' and test_in>=5) then
report 11 Error. Valor 11 & integer' image(to_integer(test_in) );
num_errores := num_errores + 1;
end if;
test_in := test_in + 1;
end loop;
Test completo. Hay
&
integer'image(num_errores) &
11
errores. 11 ;
wait; --Final simulacin
end process gen_vec_test;
report

11

end architecture bp_comparaXmenor5;

Cdigo VHDL 4.27: Banco de pruebas del circuito comparador de 4 bit para X<5.

325

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Solucin al Ejercicio 4.3

El diseo del decodificador BCD a 7 segmentos empleando una sentencia case


y su banco de pruebas se muestran en el Cdigo VHDL 4.28 y 4.29. Obsrvese
que se han declarado en el bloque process dos variables, bcd y segs, del tipo
std_logic_vector. La variable bcd es el resultado de concatenar las cuatro seales
de entrada y la variable segs se usa para almacenar el estado de los segmentos del
display. Cada componente de la variable segs es asignado a una seal de salida.

-- D ecodificador BCD a 7 segmentos. Architecture con sentencia case


-- Fichero : bcdTo7SegCASE. vhd
library IEEE;
use IEEE. std_logie_1164. all;

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

DISEO DE LGICA COMBINACIONAL

-- Banco de pruebas del decodificador BCD a 7 segmentos


-- Fich ero: bp_bcdTo7Seg. vhd
library IEEE;
use IEEE. std_logic_1164. all;
use IEEE. numeric_std. all;

entity bp_bcdTo7Seg is
constant DELAY
: time
end entity bp_bcdTo7Seg;

:= 10 ns; -- Retardo usado en el test

architecture bp_bcdTo7Seg of bp_bcdTo7Seg is


signal segs : std_logic_vector(6 downto O);
signal bcd : stdJogic_vector(3 downto O);
component bcdTo7Seg is
port ( a, b, e, d, e, f, g
i3, i2, i1, iO
end component 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;

report "Simulacin finalizada";


wait;
-- Final de la simulacin
end process ve e_ test;
end architecture bp_bcdTo7Seg;

Cdigo VHDL 4.29: Banco de pruebas del decodificador BCD.

327

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Solucin al Ejercicio 4.4


El diseo del decodificador BCD a 7 segmentos empleando una sentencia if se
muestra en Cdigo VHDL 4.30.

-- D ecodificador BCD a 7 segmentos. Architecture: sentencia if


-- Fichero: bcdTo7SegiF. vhd
library IEEE;
use IEEE. std_logie_1164. all;

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

DISEO DE LGICA COMBINACIONAL

Solucin al Ejercicio 4.5


El diseo del decodificador BCD a 7 segmentos empleando una sentencia de
asignacin concurrente condicional a una seal se muestra en Cdigo VHDL 4.31.

-- Decodificador BCD a 1 segmentos. Architecture: sentencia concurrente condicional


-- Fichero: bcdTo1SegConc. vhd
library IEEE;
use IEEE. std_logie_1164. all;

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Solucin al Ejercicio 4.6


El diseo del decodificador BCD a 7 segmentos empleando una sentencia select
se muestra en Cdigo VHDL 4.31.

-- Decodificador BCD a 7 segmentos. Architecture: sentencia select


-- Fichero: bcdTo7Seg WithSelect. vhd
library IEEE;
use IEEE . std_logie _1164 . all;
entity BCDto7seg is
port( a, b, e, d, e, f, g : out std_logic;
i3, i2, i1, iO
: in std_logic);
end BCDto7seg;
architecture BCDto7segWi thSeleet 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;
with bed select
segs <= 11 1111110 11 when 11 0000 11 ,
11
0110000 11 when 11 0001 11 ,
11
1101101 11 when 11 0010 11 ,
11
1111001 11 when 11 0011 11 ,
11
0110011 11 when 11 0100 11 ,
11
1011011 11 when 11 0101 11 ,
11
1O11111 11 w hen 11 O11 O11 ,
11
1110000 11 when 11 0111 11 ,
11
1111111 11 when 11 1000 11 ,
11
1110011 11 when 11 1001 11 ,
11
0000000 11 when others;
a <= segs(6);
b <= segs(5);
e <= segs(4);
d <= segs(3);
e <= segs(2);
f <= segs(1);
g <= segs(O);
end architecture BCDto7segWi thSeleet;

Cdigo VHDL 4.32: Decodificador BCD descrito empleando una sentencia with select.

330

DISEO DE LGICA COMBINACIONAL

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.

-- Sumador de 2 nmeros de N bits


-- Fichero: sumador_Nbits_generate.vhd
library IEEE;
use IEEE. std_logic_1164. all;
entity sumador_Nbits is
generic( N: integer :=4);
port

( s
C_out
x, y
C_in

: out std_logic_vector(N- 1 downto O);


: out std_logic;
: in std_logic_vector(N-1 downto O);
: in std_logic);

end entity sumador_Nbits;


architecture sumador_Nbits of sumador Nbits is
signal carryv: std_logic_vector(N downto O);
component sum_completo is
port ( s, C_out
: out std_logic;
x, y, C_in : in std_logic);
end component sum_completo;
begin
carryv(O) <= C_in;

--Instanciacin y conexin de componentes usando GENERATE


conexion: for k in N-1 downto O generate --GENERATE iterat'ivo
FullAdder: sum_completo
port map (s(k), Carryv(k+1), x(k), y(k),Carryv(k));
end generate conexion;
C_out <= carryv(4);
end architecture sumador_Nbits;

Cdigo VHDL 4.33: Diseo del sumador de N bits.

331

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Banco de pruebas del sumador paralelo de


-- Fichero: bp_sum._Nbits. vhd
library IEEE;
use IEEE. std_logic_1164. all;
use IEEE. numeric_std. all;

entity bp_sum_Nbi ts is
end entity bp_sum_Nbi ts;

4 bits

-- El banco de pn.Lebas no tiene


-- ni entradas ni salidas

architecture bp_sum_Nbi ts of bp_sum_Nbi ts is


-- Seales para conectar el UUT
signal
C_out, C_in : std_logic_vector(O downto O);
signal
x, y, s
: std_logic_vector(3 downto O);
component sumador_Nbits is
generic (N: integer :=4);
port ( s
: out std_logic_vector(N-1 downto O);
C_out : out std_logic;
x, y
: in std_logic_vector(N-1 downto O);
C_in : in std_logic);
end component sumador _Nbi ts;
begin
-- Instanciar y conectar UUT
uut : component sumador_Nbits port map
( s => s, C_out => C_out(O),
x => x, y => y, C_in => C_in(O) );

Cdigo VHDL 4.34: Parte inicial del banco de pruebas del sumador de 4 bits.

332

DISEO DE LGICA COMBINACIONAL

-- Continuacin del banco de pruebas del s.umador paralelo de


-- Fichero: bp_surn_Nbits.vhd

4 bits

-- Crear vectores de test y comprobar salidas del UUT


gen_ vec_ test : process
variable sumaEsperada : unsigned (4 downto O); --Resultado suma
variable num_errores : integer := O;
-- Num ero de errores
begin
for sumando_X in O to 2**4-1 loop
for sumando_Y in O to 2**4-1 loop
for acarreo_in in O to 1 loop
sumaEsperada := to_unsigned(acarreo_in,5) +
to_unsigned(sumando_x,5) +
to_unsigned( sumando_y ,5);
x
<= std_logic_vector(to_unsigned(sumando_x,4));
y
<= std_logic_vector(to_unsigned(sumando_y,4));
C_in <= std_logic_vector(to_unsigned(acarreo_in,1));
wait for 100 ns;
report time' image(now) &
" : 11
&
std_logic' image ( sumaEsperada( 4)) &
std_logic' image ( sumaEsperada( 3)) &
std_logic' image ( sumaEsperada( 2)) &
std_logic' image ( sumaEsperada( 1)) &
std_logic' image ( sumaEsperada( O)) &
"Suma calculada : "
&
std_logic' image(C_out(O))
&
std_logic' image ( s ( 3))
&
std_logic' image ( s ( 2))
&
std_logic' image ( s ( 1))
&
std_logic' image ( s (O))

if (sumaEsperada /= unsigned( C_out & s )) then


num_errores := num_errores + 1;
report "ENTRA EN BUCLE" ;
end if;
end loop;
end loop;
end loop;
report "Test completo. Hay "
&
integer' image(num_errores) &
"errores.";
wait;
end process gen_vec_test;
end architecture bp_sum_Nbi ts;

-- Comprueba resultado

Cdigo VHDL 4.35: Parte final del banco de pruebas del sumador de 4 bits.

333

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Solucin al Ejercicio 4.8


El diseo del circuito desplazador y su banco de pruebas se muestran en el Cdigo
VHDL 4.36, 4.37 y 4.38.
Las funciones shift_left, shift_right, rotate_left y rotate_right, empleadas en
el banco de pruebas, se encuentran en el paquete IEEE.numeric_std.

-- 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

<=

entrada(2 downto o) & 'o'


when (op
else '0' & entrada(3 downto 1)
when (op
else entrada(2 downto O) & entrada(3)
when (op
else entrada(O) & entrada(3 downto 1);

end architecture desplazador;

Cdigo VHDL 4.36: Diseo del circuito desplazador.

334

"00")

= "01")
= "10")

DISEO DE LGICA COMBINACIONAL

-- Banco de pruebas de l desplazador. FicheTo: bp_desplazadoT. vhd


library IEEE;
use IEEE. std_logic_1164. all;
use IEEE. numeric_std. all;

entity bp_desplazador is
constant DELA Y
: time
end entity bp_desplazador;

:= 10 ns; -- R etaTdo 'Usado en el test

architecture bp_desplazador of bp_desplazador is


signa! salida : std_logic_vector(3 downto O); --Salida UUT
signa! op
: std_logic_vector(1 downto O) ; --Entmdas UUT
signa! entrada : std_logic_vector(3 downto O);
component desplazador is
port ( salida : out std_logic_vector(3 downto O);
op
: in std_logic_vector ( 1 downto O);
entrada : in std_logic_vector(3 downto o));
end component desplazador ;
-- PmceduTe que calcula la salida ( expecterLs) y lo compaTa con el
-- valor de salida que se pasa como argumento ( actuaL s)
-- Si ambos valoTes no coinciden, se muestTa un mensaje y se
-- incTementa el contadoT de eTroTes (erToLcount)
procedure check_desp
( op
: in integer;
data
: in unsigned(3 downto O);
actual_s
: in unsigned (3
downto O);
error _count: inout integer ) is
var iable expected_s : unsigned(3 downto O) ;
begin
case op is
when O
= > expected_s := shift_left(data,1);
when 1
= > expected_s := shift_right(data,1);
when 2
= > expected_s := rotate_left(data,1) ;
when others = > expected_s := rotate_right(data,1);
end case;
assert( expected_s = actual_s)
report "ERROR. Entrada: " & integer' image(to_integer(data)) &
", Operacion: " & integer' image( op) &
" , resultado esperado: " &
integer'image(to_integer(expected_s)) &
",resultado actual:" &
integer' image(to_integer(actual_s)) &
" en el instante " &
time ' image ( now) ;

if ( expected_s / = actual _s) then


error _count := error _count + 1;
end if;
end procedure check_desp;

-- Fin de la defin'i cin del procedure

Cdigo VHDL 4.37: Primera parte del banco de pruebas del circuito desplazador.

335

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Continuacin del banco de pruebas. Fichero: bp_desplazador. vhd

begin
UUT : component desplazador port map

(salida, op, entrada);

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";

wait; -- Termina la simulacin


end process vec_test;
end architecture bp_desplazador;

Cdigo VHDL 4.38: Segunda parte del banco de pruebas del circuito desplazador.

336

DISEO DE LGICA COMBINACIONAL

Solucin al Ejercicio 4.9

El comparador de dos nmeros de 1 bit satisface la siguiente funcin lgica:


Pi+l = (xi xnor Yi) and Pi El diseo de este circuito, as como el diseo del circuito
comparador de N bits, se muestra en Cdigo VHDL 4.39. El Cdigo VHDL 4.40 es
el banco de pruebas del circuito comparador de dos nmeros de N bits.
-- CompaTador de dos nmeros de 1 bit. Fichero: comparadorEQ1bit.vhd
library IEEE;
use IEEE. std_logic_ii64. all;
entity comparadorEQibit is port
( pi
: out std_logic;
pO, x, y : in std_logic);
end entity comparadorEQibit;
architecture comparadorEQ i bit of comparadorEQ i bit is
begin
pi <= (x xnor y) and pO;
end architecture comparadorEQibit;
-- CompaTadoT igualdad de 2 nmeros de N bits. Fichero: compamdorEQNbits.vhd
library IEEE;
use IEEE. std_logic_ii64. all;
entity comparadorEQNbi ts is
generic (N: integer :=4);
port
( s
: out std_logic;
x, y : in std_logic_vector(N-i downto O));
end entity comparadorEQNbi ts;
architecture comparadorEQNbi ts of comparadorEQNbi ts is
signal p: std_logic_vector(N downto O);
component comparadorEQibi t is
port ( pi
: out std_logic;
pO, x, y : in std_logic);
end component comparadorEQibi t;
begin
p(O) <= 'i';
--Instanciacin y conexin de componentes usando GENERATE
conexion: for k in N-i downto O generate --GENERATE iterativo
comparadorNbits: comparadorEQibit
port map (p(k+i), p(k), x(k), y(k));
end generate conexion;
s <= p(N);
end architecture comparadorEQNbi ts;

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Banco de pr'll,ebas comparador de 'igualdad de N bits


library IEEE;
use IEEE. std_logic_1164. all;
use IEEE. numeric_std. all;

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

&

integer' image ( op _y);


num_errores := num_errores
end if;
end loop;
end loop;

+ 1;

Test completo. Hay 11


&
integer'image(num_errores) &
11
errores. 11 ;
wait; --F'inal sirmLlacin
end process gen_ ve e_ test;
end architecture bp_comparadorEQNbits;
report

11

Cdigo VHDL 4.40: Banco de pruebas del circuito comparador de igualdad de 4 bits.

338

DISEO DE LGICA COMBINACIONAL

Solucin al Ejercicio 4.10


El diseo de la ALU se muestra en el Cdigo VHDL 4.41. Las constantes globales
de la AL U se han definido en un package. En el diseo de la AL U se han declarado
las seales ari th y logic que se usan para guardar el resultado de las unidades
aritmtica y lgica, respectivamente. El multiplexor recibe ambas seales y selecciona
cul de ellas es la salida. Esta seleccin se realiza en funcin del valor del bit ms
significativo de la entrada de seleccin.
El banco de pruebas de la ALU se muestra en Cdigo VHDL 4.42- 4.45. El Cdigo
VHDL 4.42 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
AL U. Se ha seleccionado un conjunto de vectores de test atendiendo a los criterios
siguientes:
- Se escogen valores de los operandos entorno al cero. Por ejemplo: -2, -1, O,
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 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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Definicin de constantes globales de la ALU. Fichero: ALU_CONSTANTS.vhd


package ALU_CONSTANTS is
constant WIDTH
integer := 8;
-- Nm. bits de los operandos
constant SEL_BITS
integer := 4;
-- Nm. bits seleccin de operacin
end package ALU_CONSTANTS;
-- Diser1o de la AL U. Fichero: AL U. vhd
library IEEE;
use IEEE. std_logic_1164. all;
use IEEE.numeric_std.all;
use work. ALU_CONSTANTS. all;
entity 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 entity ALU;
architecture ALU_concurrente of ALU is
signal arith, logic: std_logic_vector(WIDTH-1 downto O);
begin
--Unidad Aritmtica
with sel(SEL_BITS-2 downto O) select
arith <=a when "000",
std_logic_vector(signed(a)+1)
when "001",
std_logic_vector(signed(a)-1)
when "010",
b
when "O 11",
std_logic_vector(signed(b)+1)
when "100",
std_logic_vector(signed(b)-1)
when "101",
std_logic_vector(signed(a)+signed(b))
when "110",
std_logic_vector(signed( a)+signed(b )+signed("OOO" & e in))
when others;
--Unidad Lgica
with sel(SEL_BITS-2 downto O) select
logic <= not a when "000",
not b when "001",
a and b when "010",
a or b when "011",
a nand b when "100",
a nor b when "101",
a xor b when "110",
a xnor b when others;
--Multiplexor
with sel(SEL_BITS-1) select
y <= arith when '0',
logic when others;
end architecture ALU_concurrente;

Cdigo VHDL 4.41: Diseo de la ALU cuyo circuito se muestra en la Figura 4.12.

340

DISEO DE LGICA COMBINACIONAL

-- Definicin de constantes globales del banco de pruebas de la AL U


--Fichero: bp_ALU_CONSTANTS.vhd
use work. ALU_CONSTANTS. all;

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;

-- Banco de pruebas para la AL U


--Fichero: bp_ALU.vhd
library IEEE;
use IEEE. std_logie_1164. all;
use IEEE. numerie_std. all;
use work. bp_ALU_CONSTANTS. all;
use work.ALU_CONSTANTS.all;

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

---------------- 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

DISEO DE LGICA COMBINACIONAL

---------------- Continua banco de pruebas para la AL U (fichero bp_AL U. vhd) -------------

expected_y := TO_INTEGER(TO_SIGNED( expected_y,WIDTH) );


-- Trunca el resultado a WIDTH bits
assert( expected_y = TO_INTEGER(SIGNED(actual_y)) )
report "ERROR. Operandos: " & integer' image(a) &
"," & integer'image(b) & "," & integer'image(cin) &
", Operacion: " & integer' image(sel) &
", resultado esperado:" & integer'image(expected_y) &
",resultado actual:" & integer'image(TO_INTEGER(signed(actual_y))) &
" en el instante " & time'image(now);
if ( expected_y / = TO_INTEGER( signed( actual_y))) then
error_count := error_count + 1;
end if;
end procedure check_ALU;
-- Fin de la definicin del procedure
begin
UUT : component ALU port map (y, a, b, cin, sel);
-- Bloque process para generar los vectores de test y comprobar el resultado
main : process is
variable error _count : integer := O;
begin
report "Comienza la simulacin";
-- Vectores de test: operandos con valor- prx:imo a cer-o
for i in -2 to 2 loop
for j in -2 to 2 loop
for k in O to SEL_MAX loop
for 1 in O to 1 loop
a
<= std_logic_vector(TO_SIGNED( i,WIDTH));
<= 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;
-- Vectores de test: operandos con valor pr-ximo 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
for 1 in O to 1 loop
A
<= std_logic_vector(TO_SIGNED(i,WIDTH) );
b
<= std_logic_vector(TO_SIGNED(j ,WIDTH));
sel <= std_logic_vector(TO_SIGNED(k,SEL_BITS));
cin <= std_logic_vector(TO_SIGNED(l,1) );
wait for DELAY;
check_ALU(i, j, 1, k, y, error_count);
end loop;
end loop;
end loop;
end loop;

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

---------------- 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;

wait for DELAY;


-- InjoTm e mostmndo el Tesultado del test
if (error_count=O) then
report "Finaliza la simulacin sin errores";
else
report "Finaliza la simulacin: " & integer' image(error_count)
& " errores";
end if;

wait; -- TeTmina la simulacin


end process main;
end architecture bp_ALU;

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

DISEO DE LGICA COMBINACIONAL

Solucin al Ejercicio 4.11

Los diseos de la puerta NOT de 1 entrada y la puerta AND de 4 entradas se


muestran en el Cdigo VHDL 4.46.

-- 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 ) ;

architecture and4 of and4 is


begin
y <= xO and x1 and x2 and x3;
end architecture and4;

Cdigo VHDL 4.46: Diseo de una puerta NOT de 1 entrada y de una puerta AND de 4
entradas.

345

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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)

Figura 4.13: Decodificador 3 a 8: a) circuito; y b) tabla de verdad.

El diagrama estructural al nivel de puertas lgicas del circuito decodificador y


su descripcin en VHDL se muestran en la Figura 4.14 y en Cdigo VHDL 4.47,
respectivamente.
Existen varias formas de realizar el diseo del banco de pruebas del circuito
decodificador 3 a 8 con entrada enable. En el Cdigo VHDL 4.48 y 4.49 se muestra
una de ellas.

346

E:~r i~l A ,~~ i~l


2

11

111 ! 1

!1

: 111 1 1 1

i:

.~
.. . . .. . .. .
. . . . . .. . . .. . .
. . .
.. . . .. . . . ... .. .. . . . . . . .. . . . . .. . .
. . .. . . . .. . .. . .
. .. . . . .. . ...
.
. .~w
........
......
.. .
. . . . . . . .. .
. . .
. ..
.. . . . . . ..
. .. . .

i ': ~J . :

"!

..........

: A.2::

not_A.d ::1: :1: : 1: . : 1: : : : : :1 : : : : : : : 1: : : : : : : : : : 1: : : : : : : : : : : : : : : 1 : : : : :: : : : : : : :+:: ::::::::::::+.............; ............ i .


:A.f ::1::1: 1 ::::::: :1:;::
1

:::: :1;

.... :::::1 ::::::::::::::1 .... .. .. .. 1., .. .. .. .. .... 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"'

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- 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;

Cdigo VHDL 4.47: Diseo del 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

DISEO DE LGICA COMBINACIONAL

-- InstanciaT y conectaT UUT


uut : component decodificador_3_a_8
port map( Y(7), Y(6), Y(5), Y(4), Y(3), Y(2), Y(1), Y(O), E, AO, A1, A2 );
gen_vec_test : process
variable test_in
: unsigned (3 downto O); -- Vector de t est
variable esperado_ Y
: std_logic_vector(7 downto O);
variable error _count
: integer
:= O;
begin
test_in := B"OOOO";
report "Comienza la simulacin";
for count in O to 15 loop
E <= test_in(3);
A2 <= test_in(2);
A1 < = test_in(1);
AO <= test_in(O);
if (count<8) then
esperado_Y
:= "00000000";
elsif (count=8) then esperado_Y := "00000001";
elsif (count=9) then esperado_Y := "00000010";
elsif ( count=10) then esperado_ Y .- "00000100";
elsif (count=11) then esperado_Y .- "00001000";
elsif (count=12) then esperado_Y .- "00010000";
elsif ( count=13) then esperado_ Y .- "00100000";
elsif (count=14) then esperado_Y .- "01000000";
else esperado_Y := "10000000";
end if;
wait for 10 ns;
test_in := test_in + 1;
if ( esperado_ Y / = Y ) then
report "ERROR en la salida valida. Valor esperado: " &
std_logic' image( esperado_ Y(7))
&
std_logic' image( esperado_ Y( 6))
&
std_logic' image (esperado_ Y(5))
&
std_logic' image( esperado_ Y( 4))
&
std_logic' image( esperado_ Y(3))
&
std_logic' image( esperado_ Y(2))
&
std_logic' image( esperado_ Y( 1))
&
std_logic' image( esperado_ Y(O))
&
", valor actual: "
&
std_logic' image(Y(7))
&
std_logic' image (Y ( 6))
&
std_logic' image(Y(5))
&
std_logic' image (Y ( 4))
&
std_logic' image (Y ( 3))
&
std_logic' image (Y ( 2))
&
std_logic' image (Y ( 1))
&
std_logic' image (Y (O))
&
" en el instante: "
&
time' image ( now);
error count := error_count + 1;
end if;
end loop;
report "ERROR: Hay "
&
integer'image(error_count) &
"errores.";
wait;
end process gen_vec_test;
end architecture bp_decodificador_3_a_8;

Cdigo VHDL 4.49: Fragmento final del banco de pruebas del decodificador 3 a 8.

349

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Solucin al Ejercicio 4.12


El diseo del conversor realizado de las tres maneras indicadas en el enunciado,
esto es, empleando un bloque process con una sentencia case, empleando una
asignacin concurrente de seleccin (with - select) y describiendo la estructura
del circuito, compuesto empleando puertas lgicas XOR de dos entradas, se muestra
en el Cdigo VHDL 4.50-4.52. El Cdigo VHDL 4.53 es un posible banco de pruebas
para el circuito.

-- Codificador binario a cdigo Gray


-- empleando un bloque pmcess con una sentencia case
library IEEE;
use IEEE. std_logic_1164. all;

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";

end architecture arch_codGrayCase;

Cdigo VHDL 4.50: Diseo del conversor de cdigo binario a cdigo Gray, empleando un bloque
process con una sentencia case.

350

DISEO DE LGICA COMBINACIONAL

-- Codificador binario a cdigo Gray


-- asignacion concurrente de seleccion
library IEEE;
use IEEE. std_logic_1164. all;

architecture arch_codGraySelect of codGray is


begin
with x select
y <= 11 000 11 when ( 11 000 11 ) ,
11
001 11 when ( 11 001 11 ) ,
11
011 11 when ( 11 010 11 ) ,
11
010 11 when ( 11 011 11 ) ,
11
110 11 when ( 11 100 11 ) ,
11
111 11 when ( 11 101 11 ) ,
11
101 11 when ( 11 110 11 ) ,
11
100 11 when ( 11 111 11 ) ,
11
000 11 when others;
end architecture arch_codGraySelect;

Cdigo VHDL 4.51: Diseo del conversor de cdigo binario a cdigo Gray, empleando una
asignacin concurrente de seleccin (with - select).

-- Conversor binario a Gray


-- descripcion estructural usando
-- 2 puertas XOR de 2 entradas
library IEEE;
use IEEE. std_logic_1164 . all;

architecture arch_codGrayEst of codGray is


component xor2 is
port ( yO
: out stdJogic;
xO, x1 : in std_logic);
end component xor2;
begin
y(2)

<=

x(2);

-- Instanciacin y conexin de los componentes


xor2_1 : component xor2 port map

(yO => y(1), xO => x(2), x1


xor2_2 : component xor2 port map
(yO = > y(O), xO => x(1), x1
end architecture arch_codGrayEst;

=>

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Banco de pruebas del conversor de cdigo binario a Gray


library IEEE;
use IEEE. std_logic_1164. all;
use IEEE. numeric_std. all;

entity bp_codGray is
constant DELA Y
: time
end entity bp_codGray;

:= 10 ns; -- R etardo usado en el test

architecture bp_codGray of bp_codGray is


signal x : std_logic_vector(2 downto O);
signal y
: std_logic_vector ( 2 downto O);
component codGray is
port ( y
: out std_logic_vector(2 downto O);
X
: in
std_}ogic_vector(2 downto 0));
end component codGray;
begin
UUT : component codGray port map
(y, x);
vec_ test : process is
variable temp : unsigned (2 downto O);
begin
report "Comienza la simulacin";
-- Generar todos los posibles valores de entrada
for i in O to 7 loop
temp := TO_UNSIGNED(i,3);
x(2) <= std_logic(temp(2));
x(1) <= std_logic(temp(1));
x(O) <= std_logic(temp(O));
wait for DELAY;
end loop;
report "Simulacin finalizada";
wait;
-- Final de la simulacin
end process vec_ test;
end architecture 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

En el Tema 4 se estudi el diseo y test de hardware combinacional usando


VHDL. En este tema y en el siguiente se llevar a cabo un estudio similar, pero
enfocado en el diseo y test del hardware secuencial.
Los circuitos secuenciales almacenan bits, siendo los registros, las RAM y las
ROM los componentes bsicos usados para ello.
Aparte de desempear la funcin de almacenamiento de bits, los registros permiten realizar diferentes funciones, tales como desplazamientos, y soportan diferentes
opciones de carga y lectura de los datos, operaciones que pueden realizarse tanto en
serie, es decir, bit a bit, como en paralelo, es decir, simultneamente sobre todos los
bits almacenados.
En este tema se aborda el diseo y test usando VHDL de varios tipos de registros
y memorias. Asimismo, se introduce una capacidad de VHDL no presentada hasta
el momento: el acceso a fichero. Esta capacidad resulta til en la programacin de
los bancos de pruebas.

5.2.

REGISTRO DE 4 BITS

En la Figura 5.1 se muestra un registro de 4 bits. El registro tiene una entrada


de reloj, una entrada de reset sncrono (rst), cuatro entradas de datos (13 , 12 , 11 ,
10 ) y cuatro salidas de datos (Q 3 , Q2 , Q1 , Q0 ). Si la seal de reset vale '1' cuando
se produce el flanco de subida del reloj, entonces se almacena en el registro el valor
"0000". Si la seal de reset vale 'O' cuando se produce el flanco de subida de la seal
de reloj, entonces el registro se carga con los datos de entrada.

Figura 5.1: Registro de 4 bits.

357

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

5.2.1.

Descripcin del comportamiento

Una forma de disear el registro es mediante la descripcin de su estructura,


usando 4 flip-flops. Otra posibilidad, es describirlo indicando cul es su comportamiento, tal como se muestra en el Cdigo VHDL 5.1.
-- Registro de 4 bits con reset sncrono
-- Fichero: Reg4. vhd
library IEEE;
use IEEE. std_logic_1164. all;

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;

Cdigo VHDL 5.1: Diseo de un registro de 4 bits con reset sncrono.

La architecture del registro tiene un bloque process que es sensible nicamente


a la seal de reloj. Al contrario de lo que sucede en los circuitos combinacionales, las
salidas del registro no se ven afectadas directamente por los cambios en los datos de
entrada (r). Por el contrario, los datos de entrada son cargados en el registro slo
cuando se produce el flanco de subida de la seal de reloj.
Asimismo, obsrvese que el contenido del registro es puesto al valor 0000
cuando, al producirse el flanco de subida de la seal de reloj, la entrada de reset
tiene el valor '1'. As pues, se trata de una entrada de reset sncrono.
11

5.2.2.

11

Banco de pruebas

El Cdigo VHDL 5.2 es un banco de pruebas sencillo para el registro. El programa


de test aplica los cuatro vectores de test siguientes: reset, carga 1111 carga 1010
y carga 0000
11

11

358

11

11

11

11

REGISTROS Y MEMORIAS

-- Banco de pruebas del registro de 4 bits. Fichero: bp_R eg4 .vhd


library IEEE; use IEEE. std_logic_1164. all;

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

clk after (PERIOD0/2);

gen_ vec_ test : process is

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

report "Finaliza la simulacin";


wait;
-- Final del bloque process
end process gen_vec_test;
end architecture bp_Reg4;

Cdigo VHDL 5.2: Banco de pruebas de un registro de 4 bits con reset sncrono.

359

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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);

La primera de ellas espera hasta que se produzca el siguiente flanco de subida


de la seal de reloj. La segunda espera durante la mitad del periodo de la seal de
reloj. En general, la sentencia
wait until condicin;

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

Figura 5.2: Simulacin del banco de pruebas del registro de 4 bits.

5.3.

REGISTRO MULTIFUNCIN

El registro descrito anteriormente tena una nica entrada de control: la entrada


de reset sncrono. Un registro ms general tiene ms entradas de control, tales como
carga paralelo ( Ld), desplazamiento hacia la derecha ( Shr) y hacia la izquierda
(Shl). Asimismo, tiene las entradas de datos correspondientes a los desplazamientos
(Shr_In, ShLin). En la Figura 5.3 se muestra este tipo de registro multifuncin y su
tabla de operacin.

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")

Figura 5.3: Registro multifuncin.

5.3.1.

Descripcin del comportamiento

El Cdigo VHDL 5.3 muestra la descripcin del comportamiento del registro.


Se emplea una sentencia if para fijar las prioridades entre las diferentes entradas de
control: rst tiene la mxima prioridad, seguido de Ld, a continuacin Shr y finalmente
Shl.
Los desplazamientos se describen empleando sentencias for. Por ejemplo, la
sentencia siguiente:
for index in O to 2 loop
R(index) <= R(index+1);
end loop;

es equivalente a escribir:
R(O) <= R(1);
R(1) <= R(2);
R(2) <= R(3);

Debe tenerse en cuenta que estas sentencias de asignacin a seal producen un


cambio en el valor de la seal transcurrido un retardo o, emplendose el valor actual
de las seales para calcular los nuevos valores.
En el diseo del registro de 4 bits mostrado en la Seccin 5.2, se emple la seal Q
del puerto de salida para almacenar la palabra de 4 bits contenida en el registro. Sin
embargo, en el diseo del registro multifuncin, se emplea la seal R para almacenar
la palabra de 4 bits. La razn para definir la seal R es que las operaciones de
desplazamiento requieren leer la palabra almacenada y un puerto de salida no puede
ser ledo.

361

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- R eg'istro mnlt'ifuncin de 4 bits


-- Fi chero: R eg4mf. vhd
library IEEE;
use IEEE. std_logic_1164. all;
entity Reg4mf is
port ( Q
: out std_logic_vector(3 downto O);
I
: in std_logic_vector(3 downto O);
Shr_In, Shl_In : in std_logic;
Ld, Shr, Shl
: in std_logic;
clk, rst
: in std_logic );
end entity Reg4mf;
architecture Reg4mf of Reg4mf is
signal R : std_logic_vector(3 downto O);
begin
Q <= R;
process ( clk)
begin
if rising_edge( clk) then
if(rst = '1') then
R

<=

"0000";

elsif (Ld = '1') then


R <= I;
elsif (Shr = '1 ') then
R(3) <= Shr_In;
for index in O to 2 loop
R(index) <= R(index+1);
end loop;
elsif (Shl = '1 ') then
R(O) <= Shl_In;
for index in O to 2 loop
R(index+1) <= R(index);
end loop;
end if;
end if;
end process;
end architecture Reg4mf;

Cdigo VHDL 5.3: Diseo de un registro multifuncin de 4 bits.

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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

Figura 5.4: Simulacin del banco de pruebas del registro multifuncin.

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

-- Banco de pruebas del registro multifuncin


-- Fichero: bp_Reg4mf.vhd
library IEEE;
use IEEE.std_logic_1164.all;
entity bp_Reg4mf is
end entity bp_Reg4mf;
architecture bp_Reg4mf of bp_Reg4mf is
constant PERIODO
: time
.- 10 ns;
signal Q
: std_logic_vector(3 downto O);
signal clk
: std_logic := 'O';
signal I
: std_logic_vector(3 downto O);
signal rst
: std_logic;
signal Shr _In, Shl_In : std_logic;
signal Ld, Shr, Shl
: std_logic;
component Reg4mf is
port ( Q
: out std_logic_vector(3 downto O);
I
: in std_logic_vector ( 3 downto O);
Shr _In, Shl_In : in std_logic;
Ld, Shr, Shl
: in std_logic;
clk, rst
: in std_logic );
end component Reg4mf;
begin
-- Instanciar y conectar UUT
uut : component Reg4mf port map
(Q, I, Shr_In, Shl_In, Ld, Shr, Shl, clk, rst);
clk <= not clk after (PERIOD0/2);
gen_ vec_ test : process is
variable numTest : integer := O;
begin
report "Comienza la simulacin";
-- R eset
I
<= "1111"; Shr_In <= '1'; Shl_In <= '1';
rst <= '1'; Ld <= '1'; Shr <= '1'; Shl <= '1';
wait until rising_edge( clk);
wait for (PERIOD0/2);
numTest := numTest + 1;
assert ( Q = "0000")
report "Error vector " & integer' image(numTest);

Cdigo VHDL 5.4: Banco de pruebas de un registro multifuncin de 4 bits.

365

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Continuacin del banco de pr'uebas del registro multifuncin


-- Fich ero : bp_Reg4 mfvhd
-- Carga 1111
I
<= "1111"; Shr_In <= '0'; Shl_In <= '0';
rst < = 'O' ; Ld < = ' 1 ' ; Shr < = ' 1 ' ; Shl < = ' 1' ;
wait until rising_edge( clk);
wait for (PERIOD0/2);
numTest := numTest + 1;
assert ( Q = 11 111 !1')
report "Error vector 11 & integer' image(numTest);
-- Carga 101 O
I
<= "1010"; Shr_In <= '0'; Shl_In <= '1';
rst <= '0'; Ld <= '1'; Shr <= '1'; Shl <= '1';
wait until rising_edge( clk);
wait for (PERIOD0/2);
numTest := numTest
1;
assert ( Q = "1010" )
report "Error vector " & integer' image(numTest);

-- Carga 0101
I
<= "010!1'; Shr_In <= '1'; Shl_In <= '1';
rst <= '0'; Ld <= '1'; Shr <= '1'; Shl <= '1';
wait until rising_edge( clk);
wait for (PERIOD0/2);
numTest := numTest
1;
assert ( Q = "0101" )
report "Error vector 11 & integer' image(numTest);

-- Carga 0011
I
<= "0011"; Shr_In <= '1'; Shl_In <= '1';
rst <= '0'; Ld <= '1'; Shr <= '1'; Shl <= '1';
wait until rising_edge( clk);
wait for (PERIOD0/2);
numTest := numTest
1;
assert ( Q = "0011" )
report "Error vector 11 & integer' image(numTest);

-- D esplazamiento D erecha, Carga serie '1'


I
<= "1111"; Shr_In <= '1'; Shl_In <= '1';
rst <= '0'; Ld <= '0'; Shr <= '1'; Shl <= '0';
wait until rising_edge( clk);
wait for (PERIOD0/2);
numTest := numTest + 1;
assert ( Q = "100!1' )
report "Error vector 11 & integer' image(numTest);

Cdigo VHDL 5.5: Continuacin del banco de pruebas de un registro multifuncin de 4 bits.

366

REGISTROS Y MEMORIAS

-- Parte fina l del banco de pruebas de l registro m ultifuncin


-- Fichero: bp_R eg4 mf.vhd
-- D esplazamiento D erecha, Carga serie 'O'
I
<= 11 11 1111 11 ; Shr_In <= '0'; Shl_In <= '1';
rst <= '0'; Ld <= '0'; Shr <= '1'; Shl <= '0';
wait until rising_edge( clk);
wait for (PERIOD0/2);
numTest := numTest
1;
assert ( Q = 11 0100 11 )
report 11 Error vector 11 & integer' image(numTest);

-- 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);

-- D esplazamiento Izquierda, Carga serie '1 '


I
<= 11 1111 11 ; Shr_In <= '1'; Shl_In <= '1';
rst <= '0'; Ld <= '0'; Shr <= '0'; Shl <= '1';
wait until rising_edge( clk);
wait for (PERIOD0/2);
numTest := numTest + 1;
assert ( Q = 11 0001 11 )
report 11 Error vector 11 & integer' image(numTest);
-- D esplazamiento Izquierda, Carga serie 'O'
I
<= 11 111!1'; Shr_In <= '1 '; Shl_In <= '0';
rst <= '0'; Ld <= '0'; Shr <= '0'; Shl <= '1';
wait until rising_edge( clk) ;
wait for (PERIOD0/2);
numTest := numTest + 1;
assert ( Q = 11 0010 11 )
report 11 Error vector 11 & integer' image(numTest) ;
-- R eset
I
<= 11 1111 11 ; Shr_In <= '1'; Shl_In <= '1';
rst <= '1'; Ld <= '1'; Shr <= '1'; Shl <= '1';
wait until rising_edge( clk);
wait for (PERIOD0/2);
numTest := numTest
1;
assert ( Q = 11 0000 11 )
report 11 Error vector 11 & integer' image(numTest);

report 11 Finaliza la simulacin 11 ;


wait;
-- Final del bloque process
end process gen_ vec_ test;
end architecture bp_Reg4mf;

Cdigo VHDL 5.6: Parte final del banco de pruebas de un registro multifuncin de 4 bits.

367

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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")

Figura 5.5: Registro de desplazamiento de 32 bits.

El registro de desplazamiento de 32 bits de la Figura 5.5 tiene una entrada de


control (Shr), una entrada de datos (Shr_in), una entrada de reset sncrono (rst) y
una salida paralelo de 32 bits ( Q). En la tabla mostrada en la parte derecha de la
Figura 5.5 se describe su operacin. Si cuando se produce el flanco de subida del
reloj la entrada de control Shr vale '1 ', entonces el registro desplaza su contenido
una posicin hacia la derecha y carga Shr_in en el bit situado ms a la izquierda.

5.4.1.

Descripcin del comportamiento

El Cdigo VHDL 5. 7 muestra el diseo del registro de desplazamiento, en el cual


se ha empleado un bucle for en la descripcin del desplazamiento hacia la derecha.
El bucle for se expande. As pues, es equivalente escribir el cdigo mostrado en
la parte izquierda a escribir las 32 sentencias de asignacin a seal, una para cada
bit del registro de desplazamiento, mostradas en la parte de la derecha:
R(31) <= Shr_in;
for index in O to 30 loop
R(index) <= R(index+1);
end loop;

R(31) <= Shr_in;


R(O) <= R(1);
R(1) <= R(2);
R(30) <= R(31);

368

REGISTROS Y MEMORIAS

-- R egistro de desplazamiento de 32 bits


-- Fichero: R egDesp32. vhd
library IEEE;
use IEEE. std_logic_1164. all;
entity RegDesp32 is
port ( Q
: out std_logic_vector(31 downto O);
Shr, Shr _in : in std_logic;
clk, rst
: in std_logic ) ;
end entity RegDesp32;
architecture RegDesp32 of RegDesp32 is
signal R : std_logic_vector ( 31 downto O);
begin
process (el k)
begin
if rising_edge( clk) then
if (rst = '1 ') then
R <= X11 00000000 11 ;
elsif (Shr = '1 ') then
R(31) <= Shr_in;
for index in O to 30 loop
R(index) <= R(index+1);
end loop;
end if;
end if;
end process;
Q <= R;
end architecture RegDesp32;

Cdigo VHDL 5. 7: Diseo de un registro de desplazamiento de 32 bits.

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Banco de pruebas del registro de 32 bits. Fichero: bp_RegDesp32. vhd


library IEEE; use IEEE.std_logic_1164.all;

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

(Q, Shr, Shr_in, clk, rst);

clk < = not clk after (PERIDDD/2);


gen_ vec_ test : process is
begin
report "Comienza la simulacin";
-- Reset
Shr_in < = '1';
rst < = '1';
Shr < = '1';
wait until rising_edge( clk);
wait for (PERIODD/2);
-- Carga serie 16 bits '1 '
Shr_in < = '1';
rst < = '0';
Shr < = '1';
for index in O to 15 loop
wait until rising_edge( clk);
end loop;
wait for (PERIODD/2);
assert ( Q = X" FFFFOOOO 11 )
report "Fallado Q=FFFFOOOO";
-- Carga serie 16 bits 'O'
Shr_in < = '0';
rst < = '0';
Shr <= '1';
for index in O to 15 loop
wait until rising_edge( clk);
end loop;
wait for (PERIODD/2);"
report "Fallado Q=OOOOFFFF";
assert ( Q = X"OOOOFFFF")

Shr < = '0';


report "Finaliza la simulacin 11 ;
wait;
-- Final del bloque process
end process gen_ vec_ test;
end architecture bp_RegDesp32;

Cdigo VHDL 5.8: Banco de pruebas del registro de desplazamiento de 32 bits.

370

REGISTROS Y MEMORIAS

---
Messages
(] +
+
+
+
+

/bpJegdesp32/q
lbpJegdesp32/clk
/bpJegdesp32/shr
/bpJegdesp32/shr _in
lbpJegdesp32/rst

Ni~@

GJJ'~

-----

0000000000 XXXXXXXXXXXXXXX. .. IC 00000


1
1

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

,/

1 Now: 350 ns Delta: 1

Messages

+
+
+
+

24 ns

1 Now: 350 ns Delta: 1

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

./

1 Now: 350 ns Delta : 1

Figura 5.6: Fragmentos del resultado de la simulacin del banco de pruebas del registro de
desplazamiento de 32 bits.

5.4.3.

Banco de pruebas con acceso a fichero

Cuando los diseos se hacen ms complejos y el tamao de palabra de las


entradas, salidas y seales internas se hace mayor, no resulta prctico especificar
el conjunto de vectores de test en trminos de asignaciones a seal, sentencias wait
y sent encias assert.
Consideremos, por ejemplo, el banco de pruebas para el registro de desplazamiento de 32 bits. Cargar en el registro una palabra de 32 bits precisa 64 sentencias
VHDL: 32 sentencias que asignan valor a la seal de carga serie (Shr_in) y 32
sentencias wait. As pues, un banco de pruebas que cargue en el registro 100 palabras
de 32 bits, constar al menos de 6.400 sentencias.
Una alternativa consiste en que el banco de pruebas lea de un fichero los vectores
de test. De esta forma, resulta relativamente sencillo incluir nuevos vectores de test,
y pueden emplearse diferentes ficheros para testear diferentes aspectos del diseo y

371

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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);

abre en modo lectura el fichero llamado "vectores. txt", asocindole el identificador


fichVectores.

Ants de empezar a leer de fichero, el banco de pruebas resetea el registro.


A continuacin, pone la seal de reset a 'O' y, dado que la seal de control del
desplazamiento (Shr) tiene el valor '1', comienzan a introducirse bits en el registro.
Los bits son ledos del fichero cuyo identificador es fichVectores. La lectura de los
bits se realiza mediante el bucle while siguiente:

372

REGISTROS Y MEMORIAS

-- Banco de pruebas del registro de 32 bits con acceso a fich ero


-- Fich ero: bp_RegDesp32fich. vhd
library IEEE;
use IEEE.std_logic_1164.all;
use std.textio.all;
entity bp_RegDesp32 is
end entity bp_RegDesp32;

architecture bp_RegDesp32fich of bp_RegDesp32 is


constant PERIODO
: time
:= 10 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 (Q, Shr, Shr_in, clk, rst);
clk <= not clk after (PERIOD0/2);
gen_ vec_ test : process is
file
fichVectores : text;
variable inputLinea
: line;
variable inputBi t
: bit;
begin
report 11 Comienza la simulacin 11 j
-- R eset
rst <= '1'; Shr <= '1'; Shr _in < = ' 1 ' ;
wait until rising_edge( clk);
wait for (PERIOD0/2);
-- Carga de vectores de t est des de fichero
rst <= '0';
file_open(fichVectores, 11 vectores. txt 11 , read_mode );
while not endfile(fichVectores) loop
readline(fichVectores, inputLinea);
for i in inputLinea' range loop
read(inputLinea, inputBit);
if inputBi t = ' 1' then
Shr _in < = ' 1 ' ;
else
Shr _in < = 'O' ;
end if;
wait until rising_edge( clk);
end loop; -- bucle for
end loop;
-- bucle while
file_close(fichVectores);

Shr <= '0';


wait until rising_edge( clk);
report
wait;
-- Final del bloque process
end process gen_vec_test;
end architecture bp_RegDesp32fich;

11

Finaliza la simulacin 11 ;

Cdigo VHDL 5.9: Banco de pruebas del registro con acceso a fichero.

373

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

while not endfile(fichVectores) loop


readline(fichVectores, inputLinea);
for i in inputLinea'range loop
read(inputLinea, inputBit);
if inputBit = '1' then
Shr_in <= '1';
el se
Shr_in <= '0';
end if;
wait until rising_edge(clk);
end loop;
bucle for
end loop;
-- bucle while

La funcin endfile(fichVectores) devuelve el valor true cuando se alcanza el final


del fichero.
El procedimiento readline tiene dos parmetros, el primero del tipo file y el
segundo del tipo line. La sentencia
readline(fichVectores, inputLinea);

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);

El procedimiento read tiene dos parmetros. El primero es del tipo line y es


la lnea de la cual se leen los caracteres. El segundo parmetro es una variable del
tipo bit, en la cual se guarda el caracter ledo de la lnea. El procedimiento read se
define tambin para otros tipos, tales como bit_vector y character, entre otros.
A continuacin, el banco de pruebas escribe el bit ledo del fichero en la seal
Shr_in. Sin embargo, puesto que los tipos bit y std_logic no son compatibles, se
emplea una sentencia if para asignar valor a Shr _in. Otra posibilidad hubiera sido
realizar la conversin de tipo:
Shr_in <= to _stdulogic(inputBit);

Una vez se ha asignado valor a Shr_in, se espera hasta el siguiente flanco de


subida del reloj antes de leer el siguiente bit de la lnea de entrada.
Una vez se alcanza el final del fichero, finaliza el bucle while y se ejecuta la
sentencia de cierre del fichero. El procedimiento file_close tiene un nico parmetro,
que es un identificador de fichero (del tipo file).

374

REGISTROS Y MEMORIAS

El fichero vectores. txt debe estar situado en el directorio espacio de trabajo del
entorno de simulacin. Si el contenido del fichero es:
1111111111111111
0000000000000000

al ejecutar el banco de pruebas se obtendr esencialmente el mismo resultado que


se obtuvo al ejecutar el banco de pruebas de la Seccin 5.4.2.

5.5.

-REGISTER FILE

Un register file es un mdulo compuesto de varios registros, y de la lgica de


acceso a ellos para lectura y escritura. Por ejemplo, un register file de tamao 4 x 32,
contiene 4 registros, cada uno de los cuales tiene 32 bits. En la Figura 5. 7 se muestra
el diseo estructural de un register file 4 x 32.

W data

R data

32

32

dl
R addr

d2
en
W enable

en
,.___--+----1 d

rst

elk

R enable

______.+----------+~

Figura 5. 7: Register file con 4 registros de 32 bits.

En el register file mostrado en la Figura 5. 7, los registros tienen una entrada


de datos de 32 bits y una entrada de control para carga paralelo ( Ld). Tambin
disponen de una entrada de reset sncrono ( rst). La entrada de reset del register file

375

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

est conectada a la entrada de reset de cada uno de los registros. Finalmente, el


register file tienen una salida de 32 bits.
Adems de los cuatro registros de 32 bits, el register file est compuesto por
dos decodificadores 2:4 con entrada enable, uno para escritura (situado en la parte
izquierda) y otro para lectura (situado en la parte derecha), y por cuatro buffers
triestado. El funcionamiento del buffer triestado se explic en la Seccin 1.9.1.
En este caso, el propsito de los buffers triestado es permitir que las salidas de los
registros se conecten al bus R_data, evitando as tener que utilizar un multiplexor,
que es un circuito ms grande y lento. Esta estructura de conexin al bus a travs de
buffers triestado funciona correctamente cuando se garantiza que en todo momento
no hay ms de un buffer que tenga una salida diferente de alta impedancia ( 'Z'). El
decodificador de lectura garantiza este comportamiento.

5.5.1.

Registro triestado

Puede considerarse que el registro y su buffer triestado constituyen a su vez un


registro con una nueva entrada: OE ( Output Enable). En funcin del valor que se
asigne a la entrada OE, puede obtenerse en la salida del registro triestado, o bien el
valor almacenado (si OE='l'), o bien alta impedancia (si OE='O'). En la Figura 5.8
se muestra este registro con entrada output enable.
El Cdigo VHDL 5.10 describe el registro triestado mostrado en la Figura 5.8.
La descripcin consta de dos bloques process: regProc describe el comportamiento
de reset sncrono y almacenamiento, mientras que outputProc describe la lgica
combinacional del comportamiento como buffer triestado del registro.
1
OE

~~---------+------~

o
Figura 5.8: Registro con entrada OE output enable.

Obsrvese que en el primer bloque process se ha incluido la sentencia


R <= (others => '0');

376

REGISTROS Y MEMORIAS

-- Registro de 32 bits con output enable


-- Fichero: Reg32_0E.vhd
library IEEE;
use IEEE. std_logic_1164. all;
entity Reg32_DE is
port ( Q
: out
I
: in
Ld, DE
: in
el k, rst : in
end entity Reg32_DE;

std_logic_vector(31 downto O);


std_logic_vector(31 downto O);
std_logic;
std_logic ) ;

architecture Reg32_DE of Reg32_DE is


signal R : std_logic_vector(31 downto O);
begin
regProc: process ( clk)
begin
if rising_edge( clk) then
if (rst = '1') then
R <= (others => '0');
elsif (Ld = '1 ') then
R <= I;
end if;
end if;
end process regProc;
outputProc: process (R, DE)
begin
if (DE=' 1 ') then
Q <= R;
else
Q <= (others => 'Z');
end if;
end process outputProc;
end architecture Reg32_DE;

Cdigo VHDL 5.10: Diseo de un registro triestado.

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 <= (others => 'Z');


que es considerablemente ms corto que

Q <= "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ";

377

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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.

Descripcin estructural del register file

El register file mostrado en la Figura 5. 7 est compuesto por dos decodificadores


2:4 con entrada enable, idnticos a los diseados en temas anteriores. Tambin, est
compuesto por cuatro registros triestado como los diseados en la Seccin 5.5.1.
Empleando estos componentes, puede realizarse la descripcin estructural del
register file, tal como se muestra en el Cdigo VHDL 5.11. Se han definido ocho
seales internas al register file, que corresponden con las salidas del decodificador
de escritura (W_d3, W_d2, W_d1, W_dO) y con las salidas del decodificador de lectura
(R_d3, R_d2, R_d1, R_dO).

5.5.3.

Drivers y funcin de resolucin

Obsrvese que en el bloque process outputProc, del registro Reg32_0E (vase el


Cdigo VHDL 5.10), se escribe en el puerto de salida Q. En la descripcin del register
file, este puerto de salida es mapeado con la seal R_data. Dado que cada instancia
del componente Reg32_0E da lugar a una instancia del bloque process outputProc,
la seal R_data es escrita en el register file desde cuatro bloques process.
Tal como se explic en la Seccin 3.4, el valor de una seal est determinado
en todo momento por el valor de sus drivers. Si un bloque process contiene una
sentencia de asignacin a seal, entonces el bloque process tendr un driver para
esa seal. En el caso del register file , la seal R_data tiene cuatro drivers.
Por la forma en que se ha realizado el diseo del register file, en cada instante
a lo sumo uno de los drivers escribe el valor 'O' '1' en la seal, mientras que los
dems drivers escriben el valor 'Z'. En consecuencia, en cada instante se escriben
cuatro valores en la seal, tres de los cuales son 'Z', y el cuarto es 'O', '1' 'Z'.
Como tambin se explic en la Seccin 3.4, el simulador dispone de un mtodo
para decidir qu valor asignar a la seal cuando sta tiene drivers con diferentes
valores. El mtodo consiste en disponer de una funcin de resolucin, cuya entrada
son los mltiples valores de los drivers y que devuelve slo uno, que es el que se
asigna a la seal.

378

REGISTROS Y MEMORIAS

-- Register fil e 4x32.


-- Descripcin estructural
-- Fichero: R egFile4x32_estruc. vhd
library IEEE;
use IEEE. std_logic_1164 . 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

std_logic_vector(31 downto O);


std_logic_vector(31 downto O);
std_logic_vector(1 downto O);
std_logic;
std_logic );

architecture RegFile4x32_estruc of RegFile4x32 is


component Dcd2x4 is
port ( d3, d2, d1, dO : out std_logic;
std_logic;
i1, iO
: in
std_logic
en
: in
end component Dcd2x4;

);

component Reg32_0E is
port ( Q
: out std_logic_vector(31 downto O);
I
: in std_logic_vector(31 downto O);
Ld, DE
: in std_logic;
clk, rst : in std_logic ) ;
end component Reg32_0E;
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

(R_d3, R_d2, R_d1, R_dO, R_addr(1), R_addr(O), R_en);


(W_d3, W_d2, W_d1, W_dO, W_addr(1), W_addr(O), W_en);
(R_data, W_data, W_dO, R_dO, clk, rst );
(R_data, W_data, W_d1, R_d1, clk, rst );
(R_data, W_data, W_d2, R_d2, clk, rst );
(R_data, W_data, W_d3, R_d3, clk, rst );

end architecture RegFile4x32_estruc;

Cdigo VHDL 5.11: Diseo estructural del register file.

379

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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.

Banco de pruebas del register file

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

lw_addr 1 W_en 1 R_addr

R_en

Figura 5.9: Interpretacin de cada lnea del fichero vectores. txt.

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

-- Banco de pruebas del register fil e. Fich ero: bp_RegFile4x32. vhd


library IEEE;
use IEEE.std_logic_1164.all; use std.textio.all;

entity bp_regFile4x32 is
constant PERIODO : time
end entity bp_regFile4x32;

:= 10 ns;

architecture bp_regFile4x32 of bp_regFile4x32 is


signal R_data
: std_logic_vector(31 downto O);
signal W_data
: std_logic_vector(31 downto O);
signal R_addr, W_addr : std_logic_vector(1 downto O);
signal R_en, W_en
: std_logic;
signal rst
: std_logic;
signal clk
: std_logic := 'O';
component RegFile4x32 is
port ( R_data
: out
W_data
: in
R_addr, W_addr : in
R_en, W_en
: in
clk, rst
: in
end component RegFile4x32;

std_logic_vector(31 downto O);


std_logic_vector(31 downto O);
std_logic_vector(1 downto O);
std_logic;
std_logic ) ;

begin
uut : component RegFile4x32 port map
(R_data, W_data, R_addr, W_addr, R_en, W_en, clk, rst);
clk

<= not clk after (PERIOD0/2);

gen_ vec_ test : process is


file
fichVectores : text;
variable inputLinea
: line;
variable inputBi t
: bit;
constant numBi ts
: integer := 38; -- Num bits menos 1
variable aux
: std_logic_vector(numBits downto O);
begin
report "Comienza la simulacin";
-- Carga de vectores de test desde fichero
file_open(fichVectores, "vectores. txt", read_mode );
while not endfile(fichVectores) loop
-- L ectura desde fichero
readline(fichVectores, inputLinea);
for i in numBits downto O loop
read(inputLinea, inputBit);
if inputBit = '1 'then
aux ( i) . - ' 1 ' ;
el se
aux ( i) : = ' O' ;
end if;
end loop; -- bucle for

Cdigo VHDL 5.12: Banco de pruebas del register file, con acceso a fichero.

381

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- 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

UUUUUUUUUUUUUUUUUUUU ... 1!10000000000000000000000000000000

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+

+
+
+
+
+

1 Now: 100 ns Delta: 1


Messages

/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

1 Now: 100 ns Delta: 1

/bp_regfile4x32/w_data
/bp_regfile4x32/r_addr
/bp_regfile4x32/w_addr

11111111111111111111111111111111

11111111111111111111111111111111

10101 o 10101 o 10101 o 10101 o 101 o 101 o

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

==->==" ......,...................___ -Messages

+ /bp_regfile4x32/r _en
+ /bp_regfile4x32/w_en

::J

1111111111111111111111111111111

--=---

+ /bp regfile4x32/r data

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

l-----------------------------i--,l--,l---,l--l-1----------~-~----~ -~-~-~--~ -~ -~--T-11

~~~

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

Now: 100 ns Delta: 1

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

5.5.5.

Descripcin del comportamiento del register file

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);

Un array es otra forma de declaracin de tipo, en la cual el objeto est formado


por un conjunto de elementos, todos del mismo tipo y accesibles mediante un ndice.
En la declaracin anterior se indica que regf ile_ type consiste en consta de tres
elementos, numerados de O a 3, del tipo std_logic_vector y con 32 bits.
Por ejemplo, en la parte del cdigo en la que se describe la operacin de reset, se
accede a los elementos de la seal regfile, que es del tipo regfile_ type, mediante
su ndice:
regfile(O)
regfile(1)
regfile(2)
regfile(3)

<=
<=
<=
<=

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;

La funcin conv_integer, incluida en IEEE. std_logic_unsigned. all, realiza la


conversin de std_logic_vector a integer. Existen funciones con el mismo nombre
en los paquetes IEEE. std_logic_signed. all y IEEE. std_logic_ari th. all, que realizan las conversiones correspondientes. As pues, la funcin conv_integer se usa
habitualmente para convertir un vector a un entero, con el fin de emplear el entero
como ndice de un array.
Puede emplearse el banco de pruebas programado en la Seccin 5.5.4 para comprobar el funcionamiento de este diseo. En la Figura 5.11 se muestran las formas de
onda obtenidas en los primeros 27 ns de la simulacin. En el instante 5 ns se produce
la operacin de reset y, en los instantes 15 ns y 25 ns, se produce la escritura en regO
y reg 1 respectivamente.

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

st<Llogic_vector(31 downto O);


std_logic_vector(31 downto O);
std_logic_vector ( 1 downto O);
std_logic;
std_logic ) ;

architecture RegFile4x32_comp of RegFile4x32 is


type regfile_type is
array (O to 3) of std_logic_vector ( 31 downto O);
signal regfile : regfile_ type;
begin
W_process : process ( clk)
begin
if rising_edge( clk) then
if ( rst = ' 1 ') then
regfile(O) <= X"OOOOOOOO";
regfile(1) <= X"OOOOOOOO";
regfile(2) <= X"OOOOOOOO";
regfile(3) <= X"OOOOOOOO";
elsif ( W_en = '1 ') then
regfile( conv _integer(W_addr))
end if;
end if;
end process W_process;

<= W_data;

R_process: process (R_addr, R_en, regfile)


begin
if ( R_en = '1') then
R_data <= regf ile ( conv _integer(R_addr));
else
R_data <= (others = > 'Z');
end if;
end process R_process;
end architecture RegFile4x32_comp;

Cdigo VHDL 5.14: Diseo del regist er file mediante la descripcin del comportamiento.

385

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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
/

Now: 100 ns Delta: 1

Figura 5.11: Simulacin del banco de pruebas, empleando el diseo del register file basado en su
comportamiento.

5.6.

BUS BIDIRECCIONAL Y MEMORIAS

Se pretende describir usando VHDL el comportamiento de dos unidades de


memoria y un bus que conecta ambas. Para simplificar, se supone que las unidades de
memoria tienen capacidad para almacenar una nica palabra de N bits. Una de las
memorias tiene capacidad de lectura y escritura. La otra slo de lectura. Adems de
las dos memorias, se modela un bus de N lneas que puede leer de ambas memorias y
escribir en la memoria que admite escritura. A continuacin, se describe el modelado
mediante VHD L de este sistema.

5.6.1.

Memoria de slo lectura

Los puertos de la memoria son los siguientes:


Seal de entrada de 1 bit (OE_n). Cuando esta seal se pone a '0', habilita la
operacin de lectura de la memoria. Cuando est a '1 ', la operacin de lectura
est deshabilitada.
Vector de salida de N bits (data). Contiene el dato almacenado en memoria
(palabra de N bits) una vez ejecutada la operacin de lectura. Est a alta
impedancia cuando la operacin de lectura est deshabilitada (DE_n = '1 ').
El Cdigo VHDL 5.15 describe la interfaz y el funcionamiento de esta memoria.
Se definen dos constantes generic: WORD_SIZE, que contiene el nmero de bits de la

386

REGISTROS Y MEMORIAS

-- Fuente de datos unidireccional (lectura)


-- Fich ero: fuente Unidireccional. vhd
library IEEE; use IEEE. std_logic_1164. all;

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;

Cdigo VHD L 5.15: Memoria de slo lectura.

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

5.6.2.

Memoria de lectura y escritura

El Cdigo VHDL 5.16 describe la memoria de lectura y escritura. Como puede


observarse en el cdigo, los puertos de esta memoria son los indicados a continuacin:
Seal de entrada de 1 bit (DE_n). Cuando esta seal se pone a 'O', habilita la
operacin de lectura de la memoria. Cuando est a '1 ', la operacin de lectura
est deshabilitada.
Seal de entrada de 1 bit (WE_n). Cuando esta seal se pone a '0', habilita
la operacin de escritura en la memoria. Cuando est a '1', la operacin de
escritura est deshabilitada.
Vector de entrada y salida de N bits (data).

-- Fuente de datos bidireccional (lectura y escritura)


-- Fichero: fuenteBidireccional. vhd
library IEEE; use IEEE. std_logic_1164. all;
entity fuenteBidireccional is
generic ( WORD_SIZE
: integer := 8;
-- Bits por palabra, por defecto 8 bits
READ_DELAY : time
:= 10 ns; -- Retardo en la lectura, por defecto 10 ns
WRITE_DELAY : time
:= 10 ns); --Retardo en la escritura, por defecto 10 ns
port ( data : inout std_logic_vector(WORD_SIZE-1 downto O); -- Seal bidireccional datos
OE_n : in
std_logic;
-- Habilita lectura
WE_n : in
std_logic ) ;
-- Habilita escritura
end entity fuenteBidireccional;
architecture fuenteBidireccional of fuenteBidireccional is
signal data_stored : std_logic_vector(WORD_SIZE-1 downto O);
-- Datos almacenados internamente
begin
ram : process (OE_n, WE_n, data)
begin
if ( OE_n = 'O' ) then
data <= data_stored after READ_DELAY;
elsif ( WE_n = ' O' ) then
data_stored <= data after WRITE_DELAY;
else
data <= (others => 'Z');
end if;
end process ram;
end architecture fuenteBidireccional;

Cdigo VHDL 5.16: Memoria de lectura y escritura.

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

y WE_n, es decir, inicialmente se encuentras deshabilitadas las operaciones de


lectura y escritura en las memorias. Tambin, en el instante inicial, se asigna
el valor Ox0fc3 a la seal wri teData del banco de pruebas, cuya finalidad es
almacenar el valor que va a ser escrito en la memoria.
2. tiempo == 100 ns. Se habilita la operacin de escritura, para ello se pone a
'O' la seal WE_n. A consecuencia de ello, en el instante tiempo = 140 ns se
escribe el valor Ox0fc3 en la memoria.
3. tiempo == 200 ns. Se deshabilita la operacin de escritura, poniendo la seal
WE_n al valor '1 '. Se habilita la operacin de lectura de la memoria de slo
lectura, para lo cual se pone la seal OE2_n a 'O'. A consecuencia de ello, el
valor Ox0001 est disponible en el bus en el instante tiempo = 220 ns.
4. tiempo == 300 ns. Se deshabilita la lectura de la memoria de slo lectura,
para lo cual se pone la seal OE2_n a '1'. Finalmente, se habilita la lectura de
la memoria de lectura y escritura, para lo cual se pone la seal OE1_n a 'O'.
A consecuencia de ello, en el instante tiempo = 330 ns el valor Ox0fc3 est
disponible en el bus.
El Cdigo VHDL 5.17 y 5.18 describe las operaciones realizadas sobre las memorias mediante el empleo del bus. En la Figura 5.12 se muestra el resultado obtenido
de la simulacin.

389

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Conexin de la fuente de datos bidireccional y la fuente unidireccional mediante un bus


-- Fich ero : bus. vhd
library IEEE; use IEEE.std_logic_1164.all;
entity tb_bus is
constant WORD_SZ
constant PERIOD
end entity tb_bus;

integer
time

-- B'its por palabra


:= 16;
:= 100 ns; -- Periodo ciclo reloj

architecture tb_bus of tb_bus is


signal
signal
signal
signal
signal

data
OE1_n
OE2_n
WE_n
wri teData

:
:
:
:
:

std_logic_vector(WORD_SZ-1 downto O); -- Datos en el bus


std_logic; -- Habilita lectura memoria lectura/escrit'ura
std_logic; -- Habilita lectura memoria slo lectura
std_logic; -- Habilita escr'itura
std_logic_vector(WORD_SZ-1 downto O); -- Datos a escribir

component fuenteBidireccional is
generic ( WORD_SIZE
integer := 8;
-- Bits por palabra
READ_DELAY
time
:= 10 ns; -- Retardo en la lectura
WRITE_DELAY : time
:= 10 ns); --Retardo en la escritura
port ( data : inout std_logic_vector(WORD_SIZE-1 downto 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);

-- Asigna valor constantes generic

------------- Continua ... ---------------------------------Cdigo VHDL 5.17: Bus bidireccional (contina en el Cdigo VHDL 5.18).

390

REGISTROS Y MEMORIAS

Continuacion ------ ---------------------------data

<=

writeData when ( WE_n

=>

'0') else ( others

'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

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

5.7.

LECTURAS RECOMENDADAS

Los Captulos 8 y 9 de (Chu 2006) contienen varios ejemplos de diseo de registros


y memorias.
En el Captulo 7 de (Pedroni 2004) se encuentra el Cdigo VHDL de diferentes
registros, descritos de diferentes formas, y se discute el nmero de elementos de
memoria inferidos en cada descripcin. Asimismo, se comentan algunos de los errores
de diseo ms comunes.
En el Captulo 9 de (Pedroni 2004) se describe el diseo de diferentes elementos
de memoria, tales como la memoria ROM y la RAM.

391

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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).

....------, Serial out

elk

Figura 5.13: Registro de desplazamiento de 4 bits con entrada y salida serie.

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

Disee usando VHD L un registro de desplazamiento conversor serie-a-paralelo


y paralelo-a-serie de 4 bits, como el mostrado en la Figura 5.14. El circuito tiene
las siguientes entradas: seal de reloj, dos entradas de seleccin, una entrada serie,
cuatro entradas para carga en paralelo. Las salidas del circuito son la salida serie y
cuatro salidas en paralelo.

D3 D2 D

Do

Serial in
SHSel1
SHSel 0

3 2 Q

Clock

Qo

Figura 5.14: Registro de desplazamiento de 4 bits serie-a-paralelo y paralelo-a-serie.

Para llevar a cabo la conversin serie-a-paralelo, en primer lugar deben cargarse


los 4 bits en el registro a travs de la entrada serie y a continuacin realizarse la
lectura en paralelo.
Por otro lado, para la conversin paralelo-a-serie, se realiza primero una escritura
en paralelo y a continuacin se realiza la lectura del contenido del registro bit a
bit a travs de la salida serie. Para ello, es necesario realizar tres operaciones de
desplazamiento. En la Tabla 5.2 se muestran las operaciones del registro.
Tabla 5.2: Operaciones del registro.

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

El diseo del registro en VHDL debe realizarse describiendo el comportamiento


del circuito, empleando para ello un nico bloque process. A continuacin, programe
un banco de pruebas en VHDL que testee el circuito diseado. Compruebe el correcto
funcionamiento del circuito observando visualmente sus seales de salida.

393

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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

Figura 5.15: Circuito compuesto de una ALU y un registro de desplazamiento.

La seal Sel, de 3 bits, determina la operacin realizada por el circuito. El bit


menos significativo de Sel indica la operacin que realiza el registro, segn se muestra
en la Tabla 5.3. Los dos bits ms significativos de Sel indican la operacin que realiza
la ALU, segn se muestra en la Tabla 5.4.
Realice el diseo del circuito usando dos bloques process, uno para describir
las operaciones de la AL U y otro para describir las operaciones del registro. A
continuacin, programe un banco de pruebas para testear el circuito.
Tabla 5.3: Operaciones del registro.

Sel(O)

o
1

Operacin
Desplazamiento a la derecha introduciendo un 'O' a la izquierda
Carga el nuevo valor

Tabla 5.4: Operaciones de la ALU.

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

Figura 5.16: Representacin esquemtica de la ROM.

El funcionamiento de la ROM es el siguiente: se presenta en la salida data aquella


palabra seleccionada por la entrada de direccin addr.
Realice el diseo en VHDL de modo que el nmero de bits de cada palabra (bits)
y el nmero de palabras de la memoria (words) sean constantes de tipo generic.
Una vez realizado el diseo, programe y simule un banco de pruebas.

395

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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

Figura 5.17: Representacin esquemtica de la RAM.

La seal data_in se almacena en la posicin indicada por addr cuando la seal


wr_ena est a '1' y la seal clk est en el flanco de subida.
Por otro lado, el bus de salida de datos debe mostrar continuamente los datos
seleccionados por addr.
Realice el diseo en VHDL de modo que el nmero de bits de cada palabra (bits)
y el nmero de palabras de la memoria (words) sean constantes de tipo generic.
Una vez realizado el diseo, programe y simule un banco de pruebas.

396

REGISTROS Y MEMORIAS

5.9.

SOLUCIONES DE LOS EJERCICIOS

Solucin al Ejercicio 5.1


En el Cdigo VHDL 5.19 se muestra un posible diseo del registro de desplazamiento. Se usa 1 seal (Serial_ out) y 3 variables (RO, R1 y R2), todas ellas del tipo
std_logic, para almacenar los bits.
Obsrvese que se usan las variables antes de que se les asigne un valor y por ello
la sntesis dar lugar a flip-fiops que almacenan los valores de la anterior ejecucin
del bloque process.
Asimismo, puesto que se asigna valor a la seal Serial_ out en el flanco de subida
de la seal de reloj, se generar al realizar la sntesis un fiip-flop que almacenar el
correspondiente bit.
-- R egistro de desplazamiento de 4 bits usando variables
-- Fichero: regDesp4Bits_variables
library IEEE;
use IEEE. std_logic_1164. all;

entity regDesp is
port (Serial_out

: out std_logic;
Serial_in, clk : in std_logic);
end entity regDesp;

architecture regDesp of regDesp is


begin
process( clk)
variable RO, R1, R2: std_logic;
begin
if (rising_edge( clk)) then
Serial_out <= R2;
R2 := R1;
R1 :=RO;
RO := Serial_in;

end if;
end process;
end architecture regDesp;

Cdigo VHDL 5.19: Diseo de un registro de desplazamiento de 4 bits.

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- R egistro desplazamiento usando seales. Fichero : regDesp4Bits_signals.vhd


library IEEE;
use IEEE. std_logic_1164. all;

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;

Cdigo VHDL 5.20: Otro diseo de un registro de desplazamiento de 4 bits.


-- Diserio ERRONEO del registro. Fichero: regDesp4Bits_variablesMAL.vhd
library IEEE;
use IEEE. std_logic_1164. all;

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;

Cdigo VHDL 5.21: Diseo errneo de un registro de desplazamiento de 4 bits.

no reproduce correctamente el comportamiento del registro de desplazamiento. La


sntesis de este diseo da lugar a un nico fl.ip-fl.op.
El banco de pruebas para el registro de desplazamiento es el Cdigo VHDL 5.22.
En este diseo se emplea la sentencia
falling_edge(clk)

398

REGISTROS Y MEMORIAS

para detectar el flanco de bajada de la seal de reloj. Simulndolo se comprueba


que los diseos del Cdigo VHDL 5.19 y 5.20 reproducen correctamente el comportamiento del registro.

-- Banco de pruebas del registro de 4 bits


-- Fichero: bp_regDesp4Bits. vhd
library IEEE;
use IEEE. std_logic_1164.all;
entity bp_regDesp is
end entity bp_regDesp;
architecture bp_regDesp of bp_regDesp is
constant PERIODO : time
:= 200 ns; -- Reloj
signal Serial_out : std_logic; -- Salidas UUT
signal clk : std_logic:=' O'; -- Entradas UUT
signal Serial_in : std_logic;
component regDesp is
port ( Serial_out : out std_logic;
clk
: in std_logic
Serial_in : in std_logic);
end component regDesp;
begin
-- Instanciar y conectar UUT
uut : component regDesp port map (Serial_out, clk, Serial_in);
clk < = not clk after (PERIOD0/2);
gen_ vec_ test : process is
begin
report "Comienza la simulacin";
Serial_ in<=' O'; wait until falling_edge( clk);
Serial_ in< =' 1'; wait until falling_edge( clk);
Serial_ in< =' 1'; wait until falling_edge( clk);
Serial_ in< =' O'; wait until falling_edge( clk);
report "Finaliza la simulacin";
wait;
-- Final del bloque process
end process gen_ vec_ test;
end architecture bp_regDesp;

--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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Solucin al Ejercicio 5.2

El Cdigo VHDL 5.23 es el diseo de un registro de desplazamiento de N bits


con entrada y salida serie. El nmero de bits del registro (N) se configura asignando
valor a la constante generic N. Obsrvese que los N bits del registro se almacenan
en las seales Serial_ out, R(N-2), ... , R(O). Cada una de estas seales, a las cuales
se asigna valor en el flanco de subida de la seal de reloj, dar lugar al realizar la
sntesis del circuito a un fiip-fl.op.

-- Registro desplazamiento de N bits


-- Fichero: regDespNbits. vhd
library IEEE;
use IEEE. std_logic_1164. all;

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

Solucin al Ejercicio 5.3

El diseo del registro de desplazamiento paralelo-a-serie y serie-a-paralelo, y el


cdigo del banco de pruebas se muestran respectivamente en Cdigo VHDL 5.24 y
5.25-5.26.
-- Registro serie-a-paralelo y paralelo-a-serie de
-- Fichero: registroSerieParalelo.vhd
library IEEE;
use IEEE. std_logic_1164. all;

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;

Cdigo VHDL 5.24: Diseo del registro serie-a-paralelo y paralelo-a-serie de 4 bits.

401

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Banco de pruebas del registro serie-a-paralelo y paralelo-a-serie de 4 bits


-- Fichero: bp_registroSerieParalelo. vhd
library IEEE;
use IEEE. std_logic_1164. all;

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

-- Continuacin del banco de pruebas del registro serie-a-paralelo y paralelo-a-serie


-- Fichem: bp_registmSerieParalelo. vhd
-- Operacion Serie-Paralelo: desplazamos los bits que van llegando por entrada serie y
-- despus realizamos una lectura en paralelo
SHSel<= 11 01 11 ; Serial_in<=' O'; 0<= 11 0000 11 ;--Car:qa paralelo
wait until falling_edge(Clock); --1000ns
SHSel<= 11 10 11 ; Serial_in<=' 1'; --Desplaza a la derecha
wait until falling_edge(Clock); --1200ns
SHSel<= 11 10 11 ; Serial_in<='O';--Desplaza a la derecha
wait until falling_edge(Clock); --1400ns
SHSel<= 11 10 11 ; Serial_in<=' 1' ;--Desplaza a la derecha
wait until falling_edge(Clock); --1600ns
SHSel<= 11 10 11 ; Serial_in<='O';--Desplaza a la derecha y leemos
wait until falling_edge(Clock); --1800ns
report 11 Finaliza la simulacin 11 ;
wait;
-- Final del bloque pmcess
end process gen_ ve e_ test;
end architecture bp_registroSerieParalelo;

Cdigo VHDL 5.26: Parte final del banco de pruebas para el registro serie-a-paralelo y paraleloa-serie de 4 bits.

403

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Solucin al Ejercicio 5.4


El diseo del circuito mostrado en la Figura 5.15 es el Cdigo VHDL 5.27. En
este diseo se ha declarado la seal alu_salida, que se usa para guardar el resultado
de la ALU. El registro recibe esta seal, cuyos bits carga o desplaza en funcin del
valor del bit menos significativo de la entrada de seleccin, es decir, en funcin del
valor de Sel (O).
El banco de pruebas de la ALU se muestra en Cdigo VHDL 5.28-5.31. El Cdigo
VHDL 5.28 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 del
circuito. Se ha seleccionado un conjunto de vectores de test atendiendo a los criterios
expuestos en la Seccin 4. 7.2. Son los siguientes:
- Se escogen valores de los operandos entorno al cero. Por ejemplo: -2, -1, O,
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 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.

404

REGISTROS Y MEMORIAS

-- Definicin de constantes globales de la ALU+Reg. Fichero: ALUReg_CONSTANTS.vhd


package ALUReg_CONSTANTS is
constant WIDTH
integer := 16;
-- Nm. bits de los operandos
constant SEL BITS
integer := 3;
-- Nm. bits seleccin de operacin
end package ALUReg_CONSTANTS;

-- ALU con registro. Fichero: ALUReg.vhd


library IEEE;
use IEEE. std_logic_1164. all;
use IEEE. numeric_std. all;
use work. ALUReg_CONSTANTS. all;
entity ALUReg is
port(
Z
A, B
Sel
clk
end ALUReg;

: out std_logic_vector(WIDTH-1 downto O);


: in std_logic_vector(WIDTH-1 downto O);
: in std_logic_vector(SEL_BITS-1 downto O);
: in std_logic);

architecture ALUReg of ALUReg is


signal alu_salida : std_logic_vector(WIDTH-1 downto O);
begin
--ALU
alu: process (Sel, A, B)
begin
case Sel (SEL_BITS-1 downto 1) is
when "00" =>
alu_salida <= std_logic_vector(signed(A) + signed(B));
when "01" =>
alu_salida <= std_logic_vector (signed(A) - signed(B));
when "10" =>
alu_salida <= A and B;
when others =>
alu_salida <= A or B;
end case;
end process alu;
--Registro
reg:process(clk)
begin
if rising_edge( clk) then
if (Sel(O) = '1 ') then --Desplaza a la drcha introduciendo O
Z <= '0'& alu_salida(WIDTH-1 downto 1);
el se
Z <= alu_salida;
--Carga el nuevo valor
end if;
end if;
end process reg;
end architecture ALUReg;

Cdigo VHDL 5.27: Diseo del circuito ALU y registro, mostrado en la Figura 5.15.

405

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- D efin icin de constantes globales


-- del banco de pruebas de la AL U+ R egistro
--Fichero : bp_ALUReg_CONS TANTS .vhd
use work. ALUReg_CONSTANTS. all;
package bp_ALUReg_CONSTANTS is
constant SEL_MAX
: integer := 2**SEL_BITS - 1;
constant MAX_POS_DATA : integer := 2**(WIDTH- 1) - 1;
constant MIN_NEG_DATA : integer := -2**(WIDTH-1);
end package bp_ALUReg_CONSTANTS;

-- Banco de pruebas para la AL U


-- Fichero: bp_ALUReg.vhd
library IEEE;
use IEEE. std_logic_1164. all;
use IEEE. numeric_std. all;
use work. ALUReg_CONSTANTS. all;
use work. bp _ALUReg_CONSTANTS. all;

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)));

when others => -- Trunca el resultado a WIDTH bits


expectecLZ := TO_INTEGER(TO_SIGNED(var_Z,WIDTH));
end case;
assert( expectecLZ = TO_INTEGER(signed(actuaLZ)) )
report "ERROR. Operandos: " & integer'image(i) &
", " & integer'image(j) &
", Operacion: " & integer'image(k) &
", resultado esperado: " &
integer'image~ expected_Z) &
", resultado actual: " &
integer'image(TO_INTEGER( signed( actuaLZ))) &
" en el instante " &
time'image( now);
if (expected_Z /= TO_INTEGER(signed(actuaLZ))) then
error_count : = error_count + 1;
end if;
end procedure checLALU;
-- Fin de la definicin del procedv,Te

Cdigo VHDL 5.29: Fragmento del banco de pruebas de ALU+registro: procedure checLALU.

407

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

---------------- 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

for i in MIN_NEG_DATA to MIN_NEG_DATA +4 loop


for j in MIN_NEG_DATA to MIN_NEG_DATA +4 loop
for k in O to SEL_MAX loop
A <= std_logic_vector(TO_SIGNED(i,WIDTH));
b <= std_logic_vector(TO_SIGNED(j,WIDTH));
Sel <= std_logic_vector(TO_SIGNED(k,SEL_BITS));
wait until falling_edge(clk);
check....ALU(i, j, k, Z, error_count);
end loop;
end loop;
end loop;
-- Vectores de test: operandos con valor prximo al mximo

for i in MA)LPOS_DATA-4 to MA)LPOS_DATA loop


for j in MA)LPOS_DATA-4 to MA)LPOS_DATA loop
for k in O to SEL_MAX loo~
A <= std_logic_vector(TO_SIGNED(i,WIDTH));
b <= std_logic_vector(TO_SIGNED(j,WIDTH));
Sel <= std_logic_vector(TO_SIGNED(k,SEL_BITS));
wai t unt il falling_edge (el k) ;
check....ALU(i, j, k, Z, erroLcount);
end loop;
end loop;
end loop;

Cdigo VHDL 5.30: Fragmento de la definicin del banco de pruebas de ALU+registro.

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;

wait for PERIODO;


-- Informe mostrando el resultado del test
if ( error_count=O) then
report 11 Finaliza la simulacin sin errores 11 ;
el se
report 11 Finaliza la simulacin: 11 & integer 'image ( error_count) &
end if;

11

errores 11 ;

wait; -- Termina la simulacin


end process main;
end architecture bp_AL UReg;

Cdigo VHDL 5.31: Parte final de la definicin del banco de pruebas de ALU+registro.

409

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Solucin al Ejercicio 5.5

El diseo de la memoria de slo lectura (ROM 8 x 8) y el cdigo del banco de


pruebas se muestran en Cdigo VHDL 5.32 y 5.33.
Obsrvese que en el diseo de la ROM se ha definido un nuevo tipo, llamado
vector _arra y, que es un array que consta de 8 elementos, numerados de O a 7, del
tipo std_logic_vector y con 8 bits.

-- Memoria de slo lectura (ROM 8x8)


--Fichero: ROM.vhd
library IEEE;
use IEEE. std_logic_1164. all;
entity rom is
generic( bits : integer := 8;
--Num. bits por palabra
words : integer := 8 ); --Num. palabras en memoria
port( data : out std_logic_vector(bits-1 downto O);
addr : in integer range O to words-1 ) ;
end rom;
architecture rom of rom is
type vector _arra y is array (O to words-1) of
std_logic_vector(bits-1 downto O);
constant memory: vector_array := ( "00000000",
"00000010"'
"00000100"'
"00001000"'
"00010000"'
"00100000"'
"01000000"
"10000000 11 ) ;
begin
data <= memory(addr);
end architecture rom;

Cdigo VHDL 5.32: Diseo de la ROM.

410

REGISTROS Y MEMORIAS

-- Banco de pruebas de la ROM 8x8


-- Pichero: bp_ROM.vhd
library IEEE;
use IEEE. std_logic_1164. all;

entity bp_ROM is
constant DELA Y
end entity bp_RDM;

:time

.- 10 ns; -- Retardo usado en el test

architecture bp_ROM of bp_ROM is


signal addr : integer range O to 7;
signal data : std_logic_vector(7 downto O);
component rom is
generic( bits : integer := 8; --Num. bits por palabra
words : integer := 8);--Num. palabras en mem.
port( data : out std_logic_vector(7 downto O);
addr : in integer range O to 7);
end component rom;
begin
UUT : component rom port map
(data, addr);
vec_ test : process is
begin
report "Comienza la simulacin";
-- Generar todos los posibles valores de entrada
for i in O to 7 loop
addr <= i;
wait for DELAY;
end loop;

report "Simulacin finalizada";


wait;
-- Final de la simulacin
end process vec_ test;
end architecture bp_ROM;

Cdigo VHDL 5.33: Banco de pruebas de la ROM.

411

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Solucin al Ejercicio 5.6

El diseo de la memoria acceso aleatorio (RAM) y su banco de pruebas son el


Cdigo VHDL 5.34 y 5.35.
Obsrvese que en el diseo de la RAM se ha declarado un nuevo tipo, llamado
vector_array, que es un array que consta de 15 elementos, numerados de O a 14,
del tipo std_logic_vector y con 8 bits.

-- Memoria de acceso aleatorio (RAM) 16x8


-- Fichero: RA!VJ. vhd
library IEEE;
use IEEE. std_logic_1164. all;

entity ram is
generic( bits
words
port( data_out
wr _en a
clk
addr
data_in
end entity ram;

: integer := 8; --Num. bits por palabra


: integer := 16);--Num. palabras en mem.
: out std_logic_vector(bits-1 downto O);
: in std_logic;
: in std_logic;
: in integer range O to words-1;
: in std_logic_vector(bits-1 downto o));

architecture ram of ram is


type vector _array is array (O to words-1) of
std_logic_vector(bi ts-1 downto O);
signal memory: vector _array;
begin
process( clk, wr _ena)
begin
if(wr_ena = '1') then
if rising_edge( clk) then
memory(addr) <= data_in;
end if;
end if;
end process;
data_out <= memory(addr);
end architecture ram;

Cdigo VHDL 5.34: Diseo de la RAM.

412

REGISTROS Y MEMORIAS

-- Banco de pruebas de la RAM 16x8


-- Fichero: bp_RAM.vhd
library IEEE;
use IEEE. std_logic_1164. all;

entity bp_RAM is
constant PERIODO
end entity bp_RAM;

:time

.- 100 ns; -- R etardo usado en el test

architecture bp_RAM of bp_RAM is


signal wr _ena : std_logic;
signal clk : std_logic := 'O';
signal addr : integer range O to 15;
signal data_in : std_logic_vector(7 downto O);
signal data_out : std_logic_vector(7 downto O);
component ram is
generic( bits : integer := 8; --Num. bits por palabra
words : integer := 16);--Num. palabras en mem.
port( data_out : out std_logic_vector(7 downto O);
wr _ena
: in std_logic;
clk
: in std_logic;
addr
: in integer range O to 15;
data_in : in std_logic_vector(7 downto o));
end component ram;
begin
UUT : component ram port map
(data_out, wr_ena, clk, addr, data_in);
clk

<= not

clk after (PERIOD0/2);

gen_ vec_ test : process is

begin
report "Comienza la simulacin";
wr _ena <=
addr <= 3;
addr <= 4;
addr <= 5;

'1 '; --Habilitada la escritura


data_ in <= "00000001"; wait until falling_edge( clk);
data_ in <= "00000010"; wait until falling_edge( clk);
data_in <= "00000100"; wait until falling_edge(clk);

wr _ena <=
addr <= 3;
addr <= 4;
addr <= 5;

'O'; --Deshabilitada la escritura


data_ in <= "00001000"; wait until falling_edge( clk);
data_in <= "00010010"; wait until falling_edge(clk);
data_in <= "00010100"; wait until falling_edge(clk);

report "Finaliza la simulacin";


wait;
-- Final del bloque process
end process gen_vec_test;
end architecture bp_RAM;

Cdigo VHDL 5.35: Banco de pruebas de la RAM.

413

TEMA

DISEO DE LGICA SECUENCIAL

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

DISEO DE LGICA SECUENCIAL

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

DISEO DE LGICA SECUENCIAL

6.1.

INTRODUCCIN

Algunos problemas de diseo pueden ser resueltos usando mquinas de estado


finito. Una mquina de estado finito consiste esencialmente en un conjunto de estados
(codificados usando flip-fiops) y transiciones entre estos estados, gobernadas por un
conjunto de bits de condicin.
En este tema trataremos algunos aspectos del diseo de mquinas de estado
finito de Moore y de Mealy usando VHDL. Una mquina de estado finito de Moore
(o simplemente, "mquina de Moore") es una mquina de estado en la cual las salidas
del circuito dependen del estado actual y no del valor actual de las entradas. Por el
contrario, las salidas de una mquina de M ealy dependen del estado actual y tambin
del valor actual de las entradas.
Ambos tipos de mquina pueden ser diseados de manera sistemtica, usando el
mtodo de diseo de mquinas de estado finito descrito en este tema.

6.2.

DISEO DE MQUINAS DE ESTADO FINITO

Las mquinas de Moore y Mealy pueden ser diseadas de manera sistemtica


siguiendo los pasos descritos a continuacin:
l. Dibujar el diagrama de estados del circuito.

2. Definir un conjunto de variables de estado y codificar los estados del diagrama


de estados usando estas variables de estado.
3. Escribir la tabla de transicin del estado usando el diagrama dibujado en el
Paso 1 y la codificacin de los estados del Paso 2.
4. Formular, a partir de la tabla de transicin del estado del Paso 3, las funciones
lgicas simplificadas para el nuevo estado y las salidas.
5. Disear el circuito empleando un flip-flop por cada variable de estado, y lgica
combinacional para las funciones de transicin del estado y de salida obtenidas
en el Paso 4. Obsrvese, que el diseo estructural de la mquina de estado
finito (FSM) puede representarse de manera genrica tal como se muestra en
la Figura 6.1.

419

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-----------------------------1

salidas

1
1

entradas:

Lgica
combinacional

estado actual

Registro de estado

elk
1
1
1
1
1
1
1

prximo estado

L------------------------------

Figura 6.1: Modelo de la implementacin de una mquina de estado finito.

6.2.1.

Circuito detector de secuencias

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.

Figura 6.2: Diagrama de estados del 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

DISEO DE LGICA SECUENCIAL

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

En general, unas codificaciones de los estados conducen a circuitos ms sencillos


que otras, aunque las diferencias tpicamente no son muy grandes.
El tercer paso del mtodo de diseo consiste en escribir la tabla de transicin
de estados y salidas. Esto puede hacerse de manera sencilla a partir del diagrama de
transicin de estados mostrado en la Figura 6.2 y de la tabla anterior de codificacin
de los estados. La tabla de transicin de estados y salidas es la siguiente:

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Finalmente, el quinto paso consiste en sintetizar el circuito secuencial sncrono


que implemente las funciones lgicas anteriores. Si se usan flip-flops D, las entradas
al flip-flop corresponden con el nuevo estado (DA= N A, DB =N B), mientras que
las salidas del fli p-flop corresponden con el estado actual (QA = A, QB = B). En la
Figura 6.3 se muestra el circuito .
. - - - - - - - - - - - - - - - - - + r - -..............................
r
l !.............................~........
:

"~ ""'''''''''''''''''''' ''' ''' '

........................... ,..;

X
.........................................

elK

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

Figura 6.3: Circuito detector de la secuencia 101.

6.3.

SNTESIS DE LGICA SECUENCIAL

El comportamiento y la salida de un bloque de lgica secuencial depende del


valor actual de sus entradas y de sus variables de estado. El valor de las variables
de estado se almacena tpicamente en elementos de memoria, ya sea en latches o en
flip-flops.
Se llama latches a aquellos circuitos cuyo estado cambia nicamente cuando su
entrada enable est a un determinado nivel ('O' '1'). A continuacin, se muestra
parte de la architecture de un latch-D.
process (enable, D) is
begin
if (enable = '1') then
q <= D;

end if;
end process;

Asimismo, se llama flip-flops a aquellos circuitos cuyo estado cambia o bien en el


flanco de subida del reloj, o bien en el flanco de bajada del reloj. En la Seccin 2.7
se describi el diseo de un flip-flop D.

422

DISEO DE LGICA SECUENCIAL

6.3.1.

Sentencias condicionales incompletas

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.

Sentencias condicionales completas

U na caracterstica inherente a las sentencias if-elsif-else es que las condiciones


no tienen forzosamente que ser excluyentes entre s. La herramienta se sntesis asume,
por tanto, que deben comprobarse las condiciones en un cierto orden de prioridad,
generando la lgica para ello. Esto da lugar a circuitera innecesaria en el caso en
que las condiciones sean excluyentes.
En aquellos casos en que las condiciones de la sentencia condicional completa sean
excluyentes entre s, es preferible emplear sentencias case o with. Esto es debido
a que las sentencias case y with se sintetizan de manera natural en multiplexores
o estructuras equivalente a multiplexores, que son rpidas y ocupan relativamente
poco rea.

6.3.3.

Retardos

En la Seccin 4.2 se explic que en la descripcin para sntesis de los circuitos


combinacionales debe evitarse el uso de retardos. Lo mismo aplica a la descripcin
de circuitos secuenciales. Los retardos en el hardware son dependientes de la tecnologa empleada en su fabricacin y estn sujetos a la variabilidad del proceso de
fabricacin, por ello es extremadamente difcil construir circuitos que presenten un
determinado retardo.
As pues, no es posible sintetizar sentencias tales como wai t for x ns. Igualmente, no es posible sintetizar sentencias que empleen la clusula after. Algunas

423

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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;

y usar este retardo en el cdigo del circuito. Por ejemplo:

A <= B after DEL;


Puede asignarse un valor positivo a esta constante de retardo para realizar
la simulacin del circuito y posteriormente asignarle el valor cero cuando vaya a
realizarse la sntesis.
Obsrvese que esta discusin acerca de los retardos aplica a los circuitos, no a
los bancos de prueba, que no necesitan ser sintetizados.

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

DISEO DE LGICA SECUENCIAL

- Las seales en la parte derecha de la asignacin secuencial deben ser seales


definidas dentro del bloque process, o seales in o inout de la interfaz del
circuito.
- No se debe asignar valor a una determinada seal dentro de ms de un bloque
process. Es decir, cada seal debe ser evaluada en un nico bloque process.
Aunque VHDL no impide que se asigne valor a una misma seal en varios
bloques process, esta prctica da lugar a circuito difciles de depurar y tpicamente no es soportada por las herramientas de sntesis comerciales.
Para asignar valor a las salidas de los fiip-fiops y latches dentro de un bloque
process, pueden emplearse sentencias de asignacin a seal (usan el operador <=) y
sentencias de asignacin a variable (usan el operador : =). Las asignaciones a variable
tienen efecto inmediatamente, mientras que las asignaciones a seal tienen efecto en
un instante de tiempo 6 (delta) unidades de tiempo posterior al tiempo simulado
actual (suponiendo que no se ha especificado el retraso en la asignacin empleando
la clusula after).
Cuando se emplean bloques process para describir un circuito secuencial, debe
indicarse la lista de sensibilidad de cada bloque process con el fin de controlar cundo se activa el bloque. Cuando se especifica una lista de sensibilidad, el simulador
no ejecuta el bloque process hasta que no se produce un cambio en alguna de las
seales que componen la lista.
Obsrvese que es posible controlar la ejecucin del bloque process mediante la
lista de sensibilidad o mediante el empleo de clusulas wait dentro del cuerpo el
bloque process. En cada bloque process debe optarse por uno de los dos mtodos,
ya que no es posible emplear simultneamente una lista de sensibilidad y sentencias wait. Sin embargo, no es recomendable emplear este segundo mtodo (uso de
sentencias wait dentro del bloque process), ya que puede dar lugar a circuitos no
sintetizables.

6.4.

FLIP-FLOP JK

En esta seccin se describe el diseo de un fiip-fiop JK con reset asncrono


activado al nivel LOW. Este circuito puede encontrarse en dos estados: Q='O' y
Q='l'. La tabla de transicin de estados, considerando nicamente las entradas J
y K, as como el estado actual (Qt) y el siguiente estado (Qt+I), es la mostrada a
continuacin. Las transiciones de estado se producen en el flanco de subida de la
seal de reloj.

425

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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.

Diseo del flip-flop

El Cdigo VHDL 6.1 es el diseo de un flip-flop JK con reset asncrono activado


al nivel LOW. La architecture contiene un bloque process que es sensible a la
seal de reset y a la seal de reloj. En el cuerpo del bloque process se examina
primero la seal de reset, ya que en caso de estar activa esa seal (con valor 'O') la
mquina debe pasar al estado Q='O'.

6.4.2.

Banco de pruebas

En el caso de los circuitos combinacionales, el objetivo del programa de test


es comprobar (cuando esto es posible) todas las posibles combinaciones de valores
de las entradas al circuito. En los circuitos secuenciales, el programa de test debe
recorrer (cuando esto es posible) todos los arcos del diagrama de estado, para cada
uno de los valores de las entradas que producen la transicin.
En el caso del biestable JK, esto implica testear 8 transiciones. En la Figura 6.5
se indica el orden en que el programa de test recorrer los arcos (nmero inscrito

426

DISEO DE LGICA SECUENCIAL

-- Biestable JK con reset asncrono en nivel LOW


-- Fichero: fiipfiop_JK. vhd
library IEEE;
use IEEE. std_logic_1164. all;

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

: out std_logic;
: in std_logic ) ;

architecture flipflop_JK of flipflop_JK is


signal q_interna : std_logic;
begin
q
q_n

<= q_interna;
<= not q_interna;

process (reset_n, clk) is


variable JK : std_logic_vector( 1 downto O);
begin
if (reset_n = 'O') then
q_interna

<=

'0';

elsif rising_edge( clk) then


JK := J & K;
case (JK) is
when 11 01 11
= > q_interna <= '0';
when 11 10 11
= > q_interna <= '1';
when 11 11 11
=> q_interna <= not q_interna;
when others => null;
end case;
end if;
end process;
end architecture flipflop_JK;

Cdigo VHDL 6.1: Diseo de un fl.ip-fl.op JK con reset asncrono.

en una circunferencia), y qu valores de las entradas se aplicar en cada caso para


producir la transicin. El Cdigo VHDL 6.2 y 6.3 es el banco de pruebas.
En el banco de pruebas se ha definido un procedure, que comprueba que los
valores actuales de la salida del flip-flop coinciden con los esperados, mostrando el
correspondiente mensaje en caso de que no coincidan.
Obsrvese que la sentencia wait que hay al final del bloque process finaliza
la ejecucin de dicho bloque, pero no la simulacin, ya que la simulacin de las
sentencias de asignacin concurrente a las seales de reset y reloj se realiza indefinidamente. Por tanto, la simulacin del banco de pruebas no finaliza por s misma,
siendo preciso fijar su duracin: 900 ns. La simulacin del banco de pruebas se realiza
con cero errores. En la Figura 6.6 se muestra el resultado obtenido de la simulacin.

427

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- B anco de pruebas del fiip-fiop JK


-- Fichero: bp_fiipfi opJK. vhd
library IEEE;
use IEEE. std_logic_1164. all;

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;

&
&
&
&
&

Cdigo VHDL 6 .2: Comienzo del banco de pruebas de un flip-flop JK.

428

DISEO DE LGICA SECUENCIAL

-- Continuacin del banco de pruebas del fiip-fiop JK


-- Fichero: bp_fiipfiopJK.vhd
begin
-- Instanciar y conectaT UUT
uut : component flipflop_JK port map
(q, q_n, clk, J , K, reset_n);

reset_n <= '1 ',


'O' after (PERIODO/ 4),
'1' after (PERIODO+PERIOD0/4);
clk <= not clk 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
J <= '0'; K <= '0';
wait for PERIODO;
-- 1
comprueba_salidas(' O' ,q,q_n,error _count);
J <= '0'; K<= '1';
wait for PERIODO;
-- 2
comprueba_salidas(' 0' ,q,q_n,error _count );
J <= '1'; K<= '0';
wait for PERIODO;
--3
comprueba_salidas(' 1' ,q,q_n,error_count);
J <= '0'; K <= '1';
wait for PERIODO;
--4
comprueba_salidas( 'O' ,q,q_n,error _count );
J <= '1';K <= '1';
waitforPERIODO;
--5
comprueba_salidas(' 1' ,q,q_n,error_count);
J <= '0'; K <= '0';
wait for PERIODO;
-- 6
comprueba_salidas(' 1' ,q,q_n,error_count);
J <= '1'; K<= '0';
wait for PERIODO;
-- 7
comprueba_salidas(' 1' ,q,q_n,error_count);
J <= '1';K <= '1';
waitforPERIODO;
-- 8
comprueba_salidas( 'O' ,q,q_n,error _count );
J <= 'O'; K <= 'O'; -- D eja el fiip-fiop en el estado 'O'
-- 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 pTocess, pero como


-- la architecture tiene sentencias de
-- asignacin concuTrente, esta sentencia
-- wait no finaliza la simulacin
end process gen_vec_test;
end architecture bp_flipflopJK;

Cdigo VHDL 6.3: Continuacin del banco de pruebas de un fl.ip-fl.op JK.

429

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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

.!.J .!J.!.J r-.

Onsto935ns

1
1

o
o
o

Now

iJ

400 ns

600 ns

800 ns

Now: 900 ns Delta: 1

Figura 6.6: Resultado de la ejecucin del banco de pruebas del flip-flop JK.

6.5.

MQUINAS DE ESTADO FINITO DE MOORE

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

DISEO DE LGICA SECUENCIAL

Figura 6. 7: Mquina de estado finito de Moore.

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 .

- Se ha definido una seal interna a la architecture, llamada internal_state,


que almacena el estado actual en que se encuentra la mquina. Cabe preguntarse por qu no se usa directamente la seal state, ya que ambas seales
representan lo mismo y, de hecho, la sentencia
state <= internal_state;

hace que ambas tengan el mismo valor. El motivo es que, por ser state
una 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,

describe los cambios en la seal de salida, z.


2. El segundo, que es activado cuando cambia la seal de reset asncrono
(res et _n) o la seal de reloj (e lk), describe los cambios en el estado de
la mquina, actualizando el valor de la seal internal_state .
Puesto que se comprueba antes el valor de reset_n, esta seal tiene
prioridad sobre la seal de reloj.
Se emplea la funcin estndar de VHDL rising_edge para representar
que las transiciones en el estado slo se producen en el flanco de subida
de la seal de reloj.

431

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Paquete con la definicin de las constantes globales


-- Fichero: STATE_CONSTANTS.vhd
library IEEE;
use IEEE. std_logic_1164. all;
package STATE_CONSTANTS is
constant STATE_BITS: integer := 2;
-- Bits codifican estado
constant SO: std_logic_vector(1 downto O) .- "00"; --Estados
constant S1: std_logic_vector(1 downto O) .- "01";
constant S2: std_logic_vector(1 downto O) .- "10";
end package;

-- 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

DISEO DE LGICA SECUENCIAL

-- Continuacin del dis eo de la mquina de lVIoore


-- Fichero: maquinaMooreSimple. vhd
-- 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;
else
internal_state <= S2;
end if;
when S1 =>
-- Estado actual: Sl
if ( x = 'O' ) then
internal_state <= S2;
end if;
when S2 =>
-- Estado actual: S2
if (x = '0') then
internal_state <= SO;
end if;
when others =>
-- Por completitud
internal_state <= "XX";
end case;
end if;
end process proximo_estado;
end architecture maquinaMooreSimple;

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

A continuacin, se muestra el cdigo VHDL de un banco de pruebas que puede


usarse para comprobar el funcionamiento de la mquina de estado finito. El programa
de test ejercita completamente la mquina: todos los arcos de las transiciones son
recorridos al menos una vez.
En la Figura 6.8 se indica el instante de tiempo en el cual se produce la transicin
entre los estados. La constante Tes el periodo de la seal de reloj, que en el cdigo
VHDL del banco de pruebas de denomina PERIODO y toma el valor 100 ns. La seal de

433

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

reloj, que inicialmente vale O, tiene un periodo (PERIODO) de T = 100 ns. Esto implica
que los flancos de subida de la 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

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

En el Cdigo VHDL 6.6 y 6. 7 es el banco de pruebas para la mquina de Moore.


Obsrvese que se define un procedimiento para comparar el valor esperado del estado
y la salida de la mquina con los actuales. De esta forma, el cdigo del banco de
pruebas es ms sencillo de entender. En la Figura 6.9 se muestran las formas de
onda obtenidas al ejecutar el banco de pruebas. El test de ejecuta con cero errores.
----;~=~~~~;~~~~;;S~~;;;;~~=~-

+
+
+
+

;- - --- r==:i- ------------------ --- --------- -----------

/bp_maquinamooresimple/clk

/bp_maquinamooresimple/x

/bp_maquinamooresimple/state
/bp_maquinamooresimple/z

10

Now

10

.!,&LOO
---,

800 ns

_!..~

.. -- ----------------------------- ---------

1'~' ' '''''

00

01

'''''';~~~~ ' ''''' 1 ''''''~b~~~~~''''' ' '''''3~~ ~~~'''''''''''''~b'~ ~~~'''''' ''''''~o~~~''''''' ''''''~b'~ ~~~'''''''''''' ~o~~~'''''''''''' '~O'~'~~''

_!.. t-. 1

,
1o -ns-to -82-6 n-s ----~ Now: 800 ns Delta: 1

Figura 6.9: Resultado de la ejecucin del test.

434

10
,..------

1 /

DISEO DE LGICA SECUENCIAL

-- Banco de pTuebas paTa la mquina de MooTe. Fichero: bp_maquinaMooTeSimp le.vhd


library IEEE;
use IEEE. std_logic_1164. all;
use work. STATE_CONSTANTS. all;

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;

Cdigo VHDL 6.6: Banco de pruebas de la mquina de Moore de la Figura 6.7.

435

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Continuacin del banco de pruebas. Fichero: bp_maquinaMooreSimple.vhd


begin
-- Cuerpo de la architecture
UUT : component maquinaMooreSimple port map

( z, state, reset_n, clk, x );

-- Genera un nico pulso LOW en el instante PERIOD0/4: resetea la mquina


reset_n <= '1',
'0' after ( PERIOD0/4 ),
'1' after ( PERIODO
PERIOD0/4 );

-- 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.";

Cdigo VHDL 6. 7: Continuacin del banco de pruebas de la mquina de Moore de la Figura 6. 7.

436

DISEO DE LGICA SECUENCIAL

6.5.3.

Modelado estructural

Ahora veremos cmo describir la mquina de estado finito de la Figura 6. 7


empleando cdigo VHDL estructural. Usando cdigo estructural se tiene mayor
control acerca de la lgica que se emplea en el diseo, con lo cual en algunos casos
pueden conseguirse circuitos ms optimizados que los dados por las herramientas de
sntesis a partir de la descripcin del comportamiento. Sin embargo, implica realizar
parte del diseo manualmente, con el consiguiente riesgo de cometer errores.
Para emplear cdigo VHDL estructural, en primer lugar hay que decidir qu
componentes van a usarse en el diseo. Emplearemos puertas lgicas bsicas (AND,
OR, inversor, NAND, NOR y XOR), as como flip-flops D. Recurdese que en la
Seccin 2.7 se describi el diseo de un flip-flop D. Para ello, deben obtenerse las
funciones lgicas para el clculo de la salida y del siguiente estado. La tabla de
transicin de estados y salidas para la mquina descrita en la Figura 6. 7 es:
Estado actual
A B
So:
So:
S1:
S1:
S2:
S2:

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

Las funciones lgicas simplificadas que relacionan el prximo estado (N A, N B)


y la salida (z), con el estado actual (A, B) y la entrada (x) son:

NA
NB
z

xA+xA
xA

(6.4)

(6.6)

(6.5)

El Cdigo VHDL 6.8 describe estructuralmente estas funciones lgicas. Se trata


de una nueva architecture para la entity del circuito anteriormente definida.
Puede emplearse el banco de pruebas descrito en la Seccin 6.5.2 para testear
esta descripcin del circuito. Se obtienen los mismos resultados que se obtuvieron
cuando se hizo el test de la descripcin del comportamiento (vase la Figura 6.9).
Los resultados del test se muestran en la Figura 6.10.

437

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Mquina de Moore, diseo estructural


-- Fichero: maquinaMooreSimple_estruc. vhd
library IEEE;
use IEEE. std_logic_1164. all;
architecture maquinaMooreSimple_estruc of maquinaMooreSimple is
signal A, B : std_logic; -- Variables de estado actuales
signal NA, NB : std_logic; -- Prximas variables de estado

-- 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

-- Conexiones de los fiip-fiops


-- Las salidas q_n se dejan sin conectar
dff_A: component flipflop_D port map
( q => A, d => NA, clk => clk, reset_n
dff_B: component flipflop_D port map
( q => B, d => NB, clk => clk, reset_n

=>

reset_n );

=>

reset_n );

-- Funciones para el clculo del nuevo estado '!/. la salida


NA <= ((not x) and (not A)) or (x andA);
NB <= x and (not A);
z <=A;
end architecture maquinaMooreSimple_estruc;

Cdigo VHDL 6.8: Diseo estructural de la mquina de Moore.

+ /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

Figura 6.10: Resultado de la ejecucin del test.

438

600 ns

800 ns

DISEO DE LGICA SECUENCIAL

6.6.

MQUINAS DE ESTADO FINITO DE MEALY

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

Adems de la entrada serie de la secuencia de bits (x) y la entrada del reloj


( clk), la mquina tiene una entrada de reset sncrono activada en 'O' (reset_n).
Esto significa que si cuando se produce un flanco de subida de la seal del reloj, la
entrada reset_n vale 'O', entonces se resetea la mquina, es decir, pasa al estado SO.
La mquina tiene dos salidas: el estado actual de la mquina ( state) y la salida de
deteccin del patrn 0110 (z).
Las constantes globales, que son usadas tanto en el diseo del circuito como en
el banco de pruebas, son definidas en el package mostrado en el Cdigo VHDL 6.9.
El Cdigo VHDL 6.9 y 6.10 describe el comportamiento de la mquina.

439

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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

'0') and rising_edge(clk) )

slo se comprueba cuando se produce un cambio en la seal de reloj. De esta forma,


se implementa un reset sncrono.
El bloque process usado para generar la seal de salida podra reemplazarse por
la siguiente sentencia concurrente:
z <= '1' when ( (internal_state = 83) and (x = '0') ) else '0';

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

DISEO DE LGICA SECUENCIAL

-- Definicin de las constantes globales


--Fichero: seq0110_CONST.vhd
library IEEE;
use IEEE. std_logic_1164. all;
package seq0110_CONST is
constant STATE_BITS : integer := 2; -- Nnm. bits del estado
constant SO
: std_logic_vector(1 downto O) .- 11 00 11 ;
constant 81
: std_logic_vector(1 downto O) := 11 01 11 ;
constant 82
: std_logic_vector ( 1 downto O) : = 11 1O11 ;
constant 83
: std_logic_vector(1 downto O) := 11 11 11 ;
end package seq0110_CONST;

-- Mquina de M ealy detectora de la secuencia O11 O


-- Fichero: seq011 O. vhd
library IEEE;
use IEEE. std_logic_1164. all;
use work. seq0110_CONST. all;
entity seq0110 is
port ( z
-- Seal de salida
: out std_logic;
state
: out std_logic_vector(STATE_BITS-1 downto O);
-- Estado actual
reset_n : in std_logic;
-- Reset sncrono activado LOW
clk
: in std_logic;
-- Seal de reloj
x
: in std_logic ) ;
-- Bit de entrada
end entity seq0110;
-- Definicin de la architecture
architecture seq0110 of seq0110 is
signal internal_state : std_logic_vector(STATE_BITS-1 downto O);
begin
state <= internal_state;
-- Clculo de la salida
calculo_salida: process (internal_state, x) is
begin
if ( (internal_state = 83) and (x = '0')) then
z <= '1';
el se
z <= '0';
end if;
end process calculo_salida;

Cdigo VHDL 6.9: Package con la codificacin de los estados y diseo de la mquina de Mealy
de la Figura 6.11.

441

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Continuacin del diseo de la mquina de M ealy detectora de la secuencia O11 O


-- Fi chero: seq0110.vhd
-- Clculo del prximo estado
proximo_estado: process ( clk) is

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

-- Cuarto bit del patrn

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

DISEO DE LGICA SECUENCIAL

--Mquina de Mealy detectora de la secuencia 0110


-- Fichero: seq011 O_ffD. vhd
library IEEE;
use IEEE. std_logic_1164. all;
use work. seq0110_CONST. all;

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

' O' ) ) else ' O' ;

-- Clc'ulo del prx'imo estado


proximo_estado: process ( clk) is
begin

end process proximo_estado;


end architecture seq0110;

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Banco de pruebas no riguroso de la mquina detectora de la secuencia 011 O


--Fichero : bpLseq0110.vhd
library IEEE;
use IEEE. std_logic_1164. all;
use work. seq0110_CONST. all;
entity bp1_seq0110 is
constant PERIODO : time := 100 ns; -- Per-odo reloj
end entity bp1_seq0110;
architecture bp1_seq0110 of bp1_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;
begin
UUT: component seq0110 port map

( z_long, state, reset_n, clk, x );

-- Generar un pulso LO W en la entrada de r-eset


reset_n <= '1 ',
' O' after ( PERIODO/ 4 ) ,
'1 'after ( PERIODO + PERIOD0/4 );
-- Generar la seal de reloj, asumiendo que ha sido inicializada a 'O'
clk <= not clk after ( PERIOD0/2 );
-- GenemT algunos vectores de test
main : process is
begin
report "Comienza la simulacin";
x <= 'O';
wait for 2*PERIODO;
x <= '1';
wait for PERIODO;
x <= '1';
wait for PERIODO;
x <= '0';
wait for PERIODO;
x <= '1 ';
wait for PERIODO;
x <= '1';
wait for PERIODO;
x <= 'O';
wait for PERIODO;
x <= '1';
wait for PERIODO;
wait;
-- Detiene este bloque process
end process main;
end architecture bp1_seq0110;

Cdigo VHDL 6.12: Banco de pruebas que introduce algunos vectores de test en la mquina de
Mealy de la Figura 6.11.

444

DISEO DE LGICA SECUENCIAL

+Jbp1 _seq0 110/uut/z_long


+ /bp1_seq0110/uut/z
+ /bp1_seq0110/uut/state
+ /bp1_seq01 10/uut/reset_n
/bp1_seq0110/uut/clk
+ /bp1_seq01 10/uut/x

+
~~O

O
O
00
1
O

.illL____,OO

Now 120005

:ilil

~~--------------~

~~~------------~' 1~--------~r

'~

01

10

11

01

10

11

1~-----------------01

10

11

00

1 ~ , ,,' ~~~6~~'' ,, , ,, ~o6~~,, ,, ,, , , ' 606~~ , r. ,, , ' S06~~ , , ,, , ,,,,.,, , 1~,0~~~ , ,, ,

,,

, ~~~ ~~

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

El banco de pruebas anterior da cierta informacin acerca del comportamiento


del circuito, pero no lo prueba de manera sistemtica. El Cdigo VHDL 6.13 y 6.14
es un banco de pruebas que testea sistemticamente el circuito, pasando al menos
una vez por cada uno de los arcos de transicin entre estados de la mquina. El
orden en el cual el banco de pruebas recorre los arcos de transicin de la mquina es
mostrado en la Figura 6.13. El test se ejecuta durante 1500 ns, sin que se produzca
ningn error. En la Figura 6.14 se muestra la evolucin de las seales.

Figura 6.13: Orden en que el programa de test recorre los arcos del diagrama de estado.

445

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Banco de pruebas - Mquina detectora secuencia 011 O. Fichero: bp_seq011 O. vhd


library IEEE;
use IEEE. std_logic_1164. all;
use work. seq0110_CONST. all;

entity bp_seq0110 is
constant PERIODO : time := 100 ns; -- Periodo reloj
end entity bp_seq0110;
architecture bp_seq0110 of bp_seq0110 is
signal z_long : std_logic;
-- Salida de la 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;

Cdigo VHDL 6.13: Banco de pruebas de la mquina de Mealy de la Figura 6.11.

446

DISEO DE LGICA SECUENCIAL

-- Continuacin del banco de pruebas. Fichero: bp_seqOiiO. vhd


begin
UUT: component seq0110 port map
( z_long, state, reset_n, clk, x );
reset_n <= '1',
'O' after ( PERIODO/ 4 ),
'1' after ( PERIODO
PERIOD0/4 );
clk <= not clk after ( PERIOD0/2 );
-- Gener-ar vectores de test y comprobar- el res'ultado
main : process is
variable error_count : integer := O; -- Nm. errores
begin
report 11 Comienza la simulacin 11 ;
x <= 'O';
wait for PERIODO;
-- Comprueba reset, empieza en SO
comprueba_estado_salida(SO, 'O' ,state,z_long,error_count );
x <= '1 ';
wait for PERIODO;
-- Sigue en SO
comprueba_estado_salida(SO, 'O' ,state,z_long,error_count );
x <= 'O';
wait for PERIODO;
-- Va a Si
comprueba_estado_salida(S1, 'O' ,state,z_long,error_count );
x <= 'O';
wait for PERIODO;
-- Sigue en Si
comprueba_estado_salida(S1, 'O' ,state,z_long,error_count );
x <= '1';
wait for PERIODO;
-- Va a S2
comprueba_estado_salida(S2, 'O' ,state,z_long,error _count );
x <= 'O';
wait for PERIODO;
-- Va a Si
comprueba_estado_salida(S1, 'O' ,state,z_long,error _count );
x <= '1';
wait for PERIODO;
-- Va a S2
comprueba_estado_salida(S2, 'O' ,state,z_long,error_count );
x <= '1';
wait for PERIODO;
-- Va a S3
comprueba_estado_salida(S3, 'O' ,state,z_long,error _count );
x <= '1';
wait for PERIODO;
-- Va a SO
comprueba_estado_salida(SO, 'O' ,state,z_long,error_count );
x <= 'O';
wait for PERIODO;
-- Va a Si
comprueba_estado_salida(S1, 'O' ,state,z_long,error_count );
x <= '1';
wait for PERIODO;
-- Va a S2
comprueba_estado_salida(S2, 'O' ,state,z_long,error_count );
x <= '1';
wait for PERIODO;
-- Va a S3
comprueba_estado_salida(S3, 'O' ,state,z_long,error_count );
x <= '0';
wait for PERIOD0/4; -- Va a Si
comprueba_estado_salida(S3, '0' ,state,z_long,error_count); --Salida 'O' en S3
wait for 3*(PERIOD0/4);
comprueba_estado_salida(S1,' 1 ',state,z_long,error _count ); -- Salida 'i' en Si
wait for PERIODO;
-- Sigue en Si
comprueba_estado_salida(S1, 'O' ,state,z_long,error_count );
wait for PERIODO;
-- Tests finalizados
H(error_count =o) then
report 11 Simulacin finalizada sin errores 11 ;
el se
report 11 ERROR: Hay 11 & integer'image(error_count) & 11 errores. 11 ;
end if;
wait;
-- Detiene este bloque process
end process main;
end architecture bp_seq0110;

Cdigo VHDL 6.14: Parte final del banco de pruebas de la mquina de Mealy.

447

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

+
+
() +

+
+
+

/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

Figura 6.14: Resultado de la simulacin del programa de test.

6.7.

MQUINAS DE ESTADO FINITO SEGURAS

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

DISEO DE LGICA SECUENCIAL

@"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.

En el diseo VHDL de una FSM segura, se emplea la opcin others dentro


de la clusula case con el fin de describir el comportamiento de la mquina~.en los
estados ilegales. Por ejemplo, en el caso de la mquina mostrada en la Figura 6.15, el
diseo mostrado en la Seccin 6.5 debera modificarse segn se muestra en el Cdigo
VHDL 6.15 con el fin de hacerlo seguro.
Uno podra pensar que no es necesario incluir la opcin others cuando el nmero
de estados es potencia de dos. Esto es as cuando se codifican los estados empleando el
mnimo nmero de bits. Sin embargo, recurdese que tambin es posible codificar los
estados de modo que el registro de estado tenga un bit por cada estado del diagrama
de transiciones. Desde el punto de vista estructural, se empleara un flip-flop D por
cada estado de la FSM. Este tipo de codificacin, que se denomina one-hot encoding,
da lugar a numerosos estados ilegales. En este caso, el uso de others garantiza que
estos estados ilegales, en caso de producirse, tendrn una transicin a un estado
legal.

449

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

architecture maquinaMooreSimple of maquinaMooreSimple is


signal internal_state: std_logic_vector(STATE_BITS-1 downto O);
begin
state <= internal_:state; -- Muestra el estado
-- Genera la salida
salida: process(internal_state) is
begin
case internal_state is
when SO
=> z <= '0';
when S1
=> z <= '0';
when S2
=> z <= '1';
when others => z <= 'O';

-- Salida en el estado ilegal

end case;
end process salida;
-- 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;

end architecture maquinaMooreSimple;

Cdigo VHDL 6.15: Diseo de una FSM segura.

450

DISEO DE LGICA SECUENCIAL

6.8.

LECTURAS RECOMENDADAS

El Captulo 3 de (Vahid & Lysecky 2007) es una introduccin didctica al diseo


de lgica secuencial. El Captulo 12 de (Pardo & Boluda 2004) contiene ejemplos
sencillos de diseo de circuitos secuenciales. Los Captulos 8 y 9 de (Chu 2006)
contienen informacin til y variedad de ejemplos acerca del diseo para sntesis
de circuitos secuenciales. El Captulo 10 est dedicado por completo al diseo de
mquinas de estado finito con VHDL a partir de diagramas ASM. El Captulo 8 de
(Pedroni 2004) es una buena referencia sobre las mquinas de estado finito y tiene
varios ejemplos interesantes descritos en VHDL.

451

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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

DISEO DE LGICA SECUENCIAL

cuenta est habilitada, se obtiene un nuevo valor de la salida en cada flanco de


subida de la seal de reloj. El contador debe tener una entrada e activa a nivel alto
que permita habilitar y deshabilitar la cuenta, y una entrada reset asncrona, que
pone la cuenta a 'O'. Describa el comportamiento del circuito en trminos de una
mquina de Moore. Una vez realizado el diseo, programe un banco de pruebas que
permita testearlo.

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

entity divisor_frecuencia_3 is
port( clk3
: out std_logic;
clk, resetn: in std_logic );
end entity divisor_frecuencia_3;

La salida clk3 es una 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 );

La architecture de cada uno de los circuitos se muestra a continuacin (vase


Solucin 1, 2, 3 y 4).
---- Solucion 1 ---architecture arch1 of ffd is
begin
process (clk, rst)
begin
if (rst = '1') then
q <= 'O';
elsif (rising_edge(clk)) then
q <= d;
end if;
end process;
end arch1;

454

---- Solucion 2 ---architecture arch2 of ffd is


begin
process (clk)
begin
if (rst = '1') then
q <= 'O';
elsif (rising_edge(clk)) then
q <= d;
end if;
end process;
end arch2;

DISEO DE LGICA SECUENCIAL

---- Solucion 3 ---architecture arch3 of ffd is


begin
process (clk)
begin
if (rst = '1') then
q <= 'O';
elsif (clk = '1') then
q <= d;
end if;
end process;
end arch3;

---- Solucion 4 ---architecture arch4 of ffd is


begin
process (clk, rst, d)
begin
if (rst = '1') then
q <= 'O';
elsif (clk = '1') then
q <= d;
end if;
end process;
end arch4;

Para cada circuito, explique detalladamente si tiene la funcionalidad de un flipflop D con seal de reset asncrona.

Ejercicio 6.9

Escriba en VHDL la architecture que modela el comportamiento de un circuito


digital que, a partir de una seal del reloj clk, genera las tres seales mostradas en
la Figura 6.17.
En el diseo del circuito, implemente dos mquinas de estado, una que opere
exclusivamente en la transicin positiva de la seal clk y otra que opere exclusivamente en la transicin negativa. Estas mquinas de estado generan las seales out 1
y out2. Obtenga la seal out3 mediante una AND lgica de las seales out1 y out2.
A continuacin se muestra el cdigo VHDL de la entity del circuito.
entity gen is
port( out1, out2, out3
el k
end entity gen;

out std_logic;
in std_logic );

Programe asimismo un banco de pruebas para comprobar su correcto funcionamiento.

455

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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

Figura 6.17: Seales generadas en el circuito correspondiente al Ejercicio 6.9.

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

DISEO DE LGICA SECUENCIAL

Programe asimismo el banco de pruebas del circuito secuencial que ha diseado.


Explique detalladamente cmo el programa de test comprueba de manera sistemtica
el funcionamiento del circuito. El banco de pruebas debe comprobar que los valores
obtenidos de la 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 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;

out std_logic_vector(3 downto O);


in std_logic );

Programe asimismo el banco de pruebas del circuito secuencial que ha diseado.


Explique detalladamente cmo el programa de test comprueba de manera sistemtica
el funcionamiento del circuito. El banco de pruebas debe comprobar que los valores
obtenidos de la 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 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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

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;

Programe asimismo un banco de pruebas para el circuito secuencial. El programa


de test debe primero resetear el circuito y a continuacin cargar en el circuito, a
travs de la entrada (x) y por este orden, los siete bits siguientes: '1', '0', '1', '1', '0',
'1', '1 '. Si los valores de la seal de salida de la UUT no coinciden con lo esperado,
el programa de test debe mostrar el correspondiente mensaje.

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

DISEO DE LGICA SECUENCIAL

El diseo debe realizarse describiendo el comportamiento del circuito, empleando


para ello un nico bloque process. Utilice nicamente las libreras siguientes:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

Programe en VHDL un banco de pruebas para el contador binario. Adems,


dibuje el cronograma de evolucin que han de seguir las seales de entrada y salida
de la UUT.
La seal de reloj (Clock) debe tener un periodo de 10 ns e inicialmente valer 'O'.
El programa de test debe primero resetear el contador. La seal (Clear) debe
valer '1' nicamente entre los instantes 2.5 y 7.5 ns. A continuacin, el programa de
test debe incrementar el valor del contador hasta "0101". Despus, ha de mantener el
valor "0101"durante un ciclo de reloj. Finalmente, debe decrementar la cuenta hasta
alcanzar el valor "000 1".
Si el valor de la seal de salida de la UUT no coincide con lo esperado, el programa
de test debe mostrar el correspondiente mensaje.

Ejercicio 6.14

Disee un circuito para el control de dos semforos, semforo 1 y 2, que regulan el


trfico de un cruce. El controlador ha de tener las salidas mostradas en la Tabla 6.1.
Los estados del controlador y el tiempo que se ha de pasar en cada estado se muestran
en la Tabla 6.2. La seal de reloj tiene una frecuencia de 60Hz. El controlador tiene
una seal reset asncrona que cuando est a '1' pone ambos semforos en amarillo,
permaneciendo en ese estado mientras la seal est activa. El diagrama de estados
del controlador es el mostrado en la Figura 6.18.
Tabla 6.1: Salidas del circuito de control del cruce.

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Tabla 6.2: Estados del controlador y tiempos.

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

Figura 6.18: Diagrama de estados del circuito controlador de dos semforos.

Una vez realizado el diseo del circuito controlador en VHDL, programe un banco
de pruebas para comprobar que funciona correctamente.

460

DISEO DE LGICA SECUENCIAL

Ejercicio 6.15

Disee usando VHDL el circuito de control de un microondas. Las entradas al


circuito se muestran en la Tabla 6.3 y las salidas en la Tabla 6.4. El sistema se
puede describir usando los estados descritos en la Tabla 6.5. El diagrama de estados
se muestra en la Figura 6.19.
Una vez realizado el diseo del circuito, programe un banco de pruebas que lo
testee.
Tabla 6.3: Entradas al circuito controlador de un microondas.

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

Tabla 6.4: Salidas del circuito controlador de un microondas.

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Tabla 6.5: Estados del circuito controlador de un microondas.

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

Figura 6.19: Diagrama de estados del circuito controlador de microondas.

462

DISEO DE LGICA SECUENCIAL

6.10.

SOLUCIONES DE LOS EJERCICIOS

Solucin al Ejercicio 6.1


El Cdigo VHDL 6.16 es el diseo de un latch D y el Cdigo VHDL 6.17 es su
banco de pruebas.

-- Latch D
-- Fichero: latclL.D. vhd
Library IEEE;
use IEEE. std_logic_1164. all;

entity latch_D is port(


Q
: out std_logic;
D, Enable: in std_logic);
end entity latch_D;
architecture latch_D of latch_D is
begin
process(D, Enable)
begin
if Enable = ' 1' then
Q <= D;
end if;
end process;
end architecture latch_D;

Cdigo VHDL 6.16: Diseo de un latch D.

463

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Banco de pruebas de un latch D. Fichero : bp_latclLD.vhd


library IEEE;
use IEEE. std_logic_1164. all;

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&ic;
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.";

Cdigo VHDL 6.17: Banco de pruebas dellatch D.

&
&

DISEO DE LGICA SECUENCIAL

Solucin al Ejercicio 6.2


El diseo del fiip-fl.op RS y el cdigo del banco de pruebas se muestran en Cdigo
VHDL 6.18, 6.19 y 6.20. El diagrama de estados del fiip-fl.op se muestra en la
Figura 6.20. Los nmeros inscritos en circunferencias indican el orden en el cual
el programa de test va recorriendo los arcos del diagrama.

___

... --''

@reset__:~
Figura 6.20: Diagrama de estados del flip-flop RS.

--Flip-fiop RS. Fichero: fiipfiopRS.vhd


library IEEE;
use IEEE. std_logic_1164. all;

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;

Cdigo VHDL 6.18: Diseo de un fiip-fl.op RS.

BERGARA

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Banco de pruebas del flip-flop RS (fichero bp_flipflopRS. vhd)


library IEEE;
use IEEE. std_logic_1164. all;

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

<= '1 ',


'O' after (PERIODO/ 4),
'1' after (PERIODO+PERIOD0/4);

clk

<= not clk after (PERIOD0/2);


Cdigo VHDL 6.19: Parte inicial del banco de pruebas de un fiip-fiop RS.

466

DISEO DE LGICA SECUENCIAL

-- Continuacin de l banco de pruebas de l flip flap RS (fichero bp_flipflopRS. vhd)

gen_ ve e_ test : process is


variable error _count : integer := O; -- Num. errores
begin
report "Comienza la simulacion";
-- Vectores de test y comprobacion del resultado
S <= '0' ; R <= '0'; wait for PERIODO; -- 1
comprueba_salidas( 'O' ,q,notq,error _count ) ;
S <= '0'; R <= '1'; wait for PERIODO;-- 2
comprueba_salidas( 'O' ,q,notq,error _count );
S <= '1'; R <= '0'; wait for PERIODO;-- 3
comprueba_salidas(' 1' ,q,notq,error _count );
S <= '0'; R <= '0'; wait for PERIODO;-- 4
comprueba_salidas(' 1' ,q,notq,error_count);
S <= '1 ' ; R <= 'O ' ; wait for PERIODO ; -- 5
comprueba_salidas(' 1 ',q,notq,error_count);
S <= 'O'; R <= '1'; wait for PERIODO; -- 6
comprueba_salidas( 'O' ,q,notq,error_count);
-- Informe fina l
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;

11

errores.

11

end architecture bp_flipflopRS;

Cdigo VHDL 6.20: P arte final del banco de pruebas de un flip-flop RS .

467

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Solucin al Ejercicio 6.3

El Cdigo VHDL 6.21 y 6.22 es el diseo del fiip-flop D y su banco de pruebas.


El banco de pruebas no testea el fiip-fiop de manera exhaustiva, ya que slo recorre
alguno de los arcos del diagrama de transicin de estados, segn se muestra en la
Figura 6.21. En cada arco de transicin se muestran 4 bits. Los valores de izquierda
a derecha de estos 4 bits se corresponden, respectivamente, con los valores que han
de tomar las seales Set , Clear, Enable y D para que se produzca dicha transicin.
El valor '-' ( don't care) indica que se produce la transicin con independencia del
valor de ese bit de la seal.
1--0)0011

Figura 6.21: Diagrama de transicin de un flip-flop D y orden del test.

-- 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

DISEO DE LGICA SECUENCIAL

-- Banco de pruebas del fiip-.fiop D. Fichero: bp_FFD_Enable.._SeLClear.vhd


library IEEE;
use IEEE. std_logic_1164. all;

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;

Cdigo VHDL 6.22: Banco de pruebas de un flip-flop D.

469

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Solucin al Ejercicio 6.4


El Cdigo VHD L 6. 23 es un package en el cual se han definido las constantes
empleadas en el diseo: el nmero de bits del estado y la codificacin de los estados.
El diseo del contador mdulo 4 es el Cdigo VHDL 6.24. El banco de pruebas es
el Cdigo VHDL 6.25 y 6.26. En el diagrama de transicin de estados del circuito,
que se muestra en la Figura 6.22, se ha sealado el orden en el cual el programa de
test recorre los arcos.

Figura 6.22: Diagrama de transicin de estados de un contador ascendente mdulo 4. En el


diagrama se ha sealado el orden en el cual el programa de test recorre los arcos.

-- Paquete con la definicin de las constantes globales


--Fichero: STATE_CONSTANTS.vhd
library IEEE;
use IEEE. std_logic_1164. all;
package STATE_CONSTANTS is
constant STATE_BITS: integer := 2;
-- Bits codifican estado
constant SO: std_logic_vector(1 downto O) := 11 00 11 ; --Estados
constant S1: std_logic_vector ( 1 downto O) : = 11 O1 11 ;
constant S2: std_logic_vector(1 downto O) := 11 10 11 ;
constant S3: std_logic_vector ( 1 downto O) : = 11 11 11 ;
end package;

Cdigo VHDL 6.23: Package en el cual se definen las constantes del diseo del contador
ascendente mdulo 4.

470

DISEO DE LGICA SECUENCIAL

-- Contador- mdulo 4 implementado corno mq'u,'i na de Moore


-- Fich ero: contador_Mod_4. vhd
library IEEE;
use IEEE. std_logic_1164. all;
use work.STATE_CONSTANTS.all;

entity contador _Mod_ 4 is


port(state
: out std_logic_vector(STATE_BITS-1 downto O);
clock, reset, e : in std_logic);
end entity contador _Mod_ 4;
architecture contador _Mod_ 4 of contador _Mod_ 4 is
signal internal_state: std_logic_vector(STATE_BITS-1 downto O);
begin
state <= internal_state;
proximo_estado: process ( clock, reset) --Clc,u,lo del prximo estado
begin
if (reset = '1') then
internal_state <= SO;
elsif (rising_edge( clock)) then
case internal_state is
when SO =>
if e = ' 1 ' then
internal_state <= S1;
else
internal_state <= SO;
end if;
when S1 =>
if e = ' 1 ' then
internal_state <= S2;
else
internal_state <= S1;
end if;
when S2 =>
if e = ' 1 ' then
internal_state <= S3;
else
internal_state <= S2;
end if;
when S3 =>
if e = ' 1 ' then
internal_state <= SO;
el se
internal_state <= S3;
end if;
when others=>
internal_state <= SO;
end case;
end if;
end process proximo_estado;
end architecture contador _Mod_ 4;

Cdigo VHDL 6.24: Diseo de un contador ascendente mdulo 4.

471

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

-- Banco de pTuebas del contadoT ascendente sincmno modulo 4


-- FicheTo: bp_contadoT_MorL4.vhd
library IEEE;
use IEEE. std_logic_1164. all;
use work. STATE_CONSTANTS. all;
entity bp_contador _Mod_ 4 is
end entity bp_contador_Mod_4;
architecture bp_contador_Mod_4 of bp_contador_Mod_4 is
constant PERIODO
: time
:= 100 ns; -- Reloj
signal
q
: std_logic_vector(STATE_BITS-1 downto 0);-- Salidas UUT
signal
clk
: std_logic := 'O';
-- EntTadas UUT
signal
reset, e : std_logic;
component contador _Mod_ 4 is
port ( state
: out std_logic_vector(STATE_BITS-1 downto O);
clock, reset, e : in std_logic );
end component contador _Mod_ 4;

-- Pmcedimiento paTa compTobaT las salidas


procedure comprueba_salidas
std_logic_vector(STATE_BITS-1 downto O);
( esperado_q
std_logic_vector ( ST ATE_B ITS-1 downto O);
actual_q
error_count
: inout integer) is
begin

-- CompTueba q

if ( esperado_q / = actual_q ) then


report "ERROR: Estado esperado ("
std_logic' image (esperado_ q ( 1))
std_logic' image( esperado_q(O))
"), estado actual ("
std_logic' image( actual_q( 1))
std_logic' image(actual_q(O))
"), instante: "
time' image(now);
error count := error_count + 1;
end if;
end procedure comprueba_salidas;

&
&
&
&
&
&

&

begin

-- InstanciaT y conectaT UUT


uut : component contador _Mod_ 4 port map
reset
clk

<=

(q,

clk, reset, e);

'0', '1' after (PERIOD0/4),


'0' after (PERIODO+PERIOD0/4);

<= not clk after (PERIOD0/2);

Cdigo VHDL 6.25: Parte inicial del banco de pruebas del contador ascendente mdulo 4.

472

DISEO DE LGICA SECUENCIAL

-- Continuacin del banco de pruebas del contadoT ascendente sncrono modulo 4


-- Fichero: bp_contador-_MorL4.vhd

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

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

Solucin al Ejercicio 6.5


La tabla de transicin de estados y salidas del contador se muestran en la
Tabla 6.6. Las funciones lgicas simplificadas que relacionan el prximo estado (Dl,
DO) y la salida (State(l : 0)), con el estado actual (Ql, QO) y la entrada (e) son las
siguientes:

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

El Cdigo VHDL 6.27 es el diseo correspondiente al circuito mostrado en la


Figura 6.23, que describe estructuralmente las anteriores funciones lgicas. Se ha
empleado en este diseo el package mostrado en Cdigo VHDL 6.23.
Puede emplearse el banco de pruebas mostrado en Cdigo VHDL 6.25-6.26 para
testear esta descripcin del circuito.

474

DISEO DE LGICA SECUENCIAL

Q1
not_1

Q1_n

: :~-+-- - - - - - - - - - - - ,
~ ............... . . .i

QO

e
...r

QO_n

: .......1... ! - - - - - - - - - - - - ,

;~':l~cc-\ yand ~OC~

g __<

~---1-f--f--+-i!-,----.,1\

t.........................J

and 2
1-f---+--+--!-!"'-f"'"'"""""""'"!

or 1

;= .. .......;

;............ .......;

~.....Jyand_2 ~ ................... ! i~LRN

,---t:::j~::t:::t:~. :r. . .-..,


...... ;
and_4

L. ..~... .!

and_3
:-=~ yand_3

c_n

state(1)

~ y?r_1 D QH_Q_1_+--I-__..._...~:-:::-::::-: : - 1: ~c: : : : :=>: : : :

r-

yor_2

'-----+--+J_,'LJ.iyan~=~ ()~"'f

_r~. ~H_a_o___.....,__....___+-'~-..!~_. .~._~.(r. 9--">


. L.

~+>
l

;. . . . . . . .

hd...

CLAN

:..:::<:::... ,

'--c-lo_c_k-------t~---!""""iC~~~~ yan1~---
:::::::::::::::::::
reset
::::::::::::::::::::

not_3

:.:

reset_n

!. ... ~ ......... !

Figura 6.23: Contador mdulo 4 compuesto por flip-flops D y puertas lgicas.

475

DISEO Y ANLISIS DE CIRCUITOS DIGITALES CON VHDL

---Contador mdulo 4 segn estructura. Fichero: contador_MocL4_estruct.vhd


library IEEE;
use IEEE.std_logic_1164.all;
use work. STATE_CONSTANTS . all;
entity contador _Mod_ 4 is
port(state
: out std_logic_vector(STATE_BITS-1 downto O);
clock, reset, e : in std_logic);
end entity contador _Mod_ 4;
architecture contador_Mod_4 of contador_Mod_4 is
signal Q1_n, QO_n, Q1, QO : std_logic;
signal reset_n, c_n : std_logic;
signal yand_1, yand_2, yand_3, yand_4, yand_5 : std_logic;
signal yor _1, yor _2 : std_logic;
component flipflop_D is port
( q
: out std_logic;
d, clk, reset_n : in std_logic);
end component flipflop_D;
component and3 is port
( yO
: out std_logic;
xO, x1, x2 : in std_logic );
end component and3;
component or3 is port
( yO
: out std_logic;
xO, x1, x2 : in std_logic );
end component or3;
component and2 is port
( yO
: out std_logic;
xO, x1 : in std_logic );
end component and2;
component or2 is port
( yO
: out std_logic;
xO, x1 : in std_logic );
end component or2;<