Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
DISEÑO E IMPLEMENTACION DE UN MICROCONTROLADOR 8051 USANDO VHDL
“FLEX51”
JORGE ANDRES CASTRO RESTREPO
UNIVERSIDAD AUTÓNOMA DE OCCIDENTE
FACULTAD DE INGENIERIAS
DEPARTAMENTO DE ENERGÉTICA Y ELECTRÓNICA
PROGRAMA DE INGENIERIA ELECTRONICA
SANTIAGO DE CALI
2004
DISEÑO E IMPLEMENTACION DE UN MICROCONTROLADOR 8051 USANDO VHDL
“FLEX51”
JORGE ANDRÉS CASTRO RESTREPO
Proyecto de Grado para optar el titulo de
Ingeniero Electrónico
Director
JOHNNY POSADA CONTRERAS
Ingeniero Electrónico
UNIVERSIDAD AUTÓNOMA DE OCCIDENTE
FACULTAD DE INGENIERIAS
DEPARTAMENTO DE ENERGÉTICA Y ELECTRONICA
PROGRAMA DE INGENIERÍA ELECTRÓNICA
SANTIAGO DE CALI
2004
Nota de aceptación:
Aprobado por el comité de trabajo de
grado en cumplimiento de los
requisitos exigidos por la Universidad
Autónoma de Occidente para optar al
titulo de Ingeniero Electrónico
Henry Cabra
Firma del jurado
Diego Martínez
Firma del jurado
Santiago de Cali, Julio 29 de 2.004
Al Señor Jesús por ser la luz de mi vida, el hacedor de todo lo que vemos y fiel
amigo.
A mi familia por ser un apoyo constante, hoy ven el fruto de sus esfuerzos.
AGRADECIMIENTOS
Universidad Autónoma de Occidente, por creer en mis capacidades y habilidades
dándome las herramientas materiales, intelectuales y emocionales para alcanzar la
cima de nuestro sueño.
Johnny Posada Contreras, Ingeniero Electrónico y director de tesis, por su
colaboración en el desarrollo de los objetivos.
CONTENIDO
Pág.
INTRODUCCIÓN 30
1. OBJETIVO GENERAL 32
1.1 OBJETIVOS ESPECIFICOS 32
2. PLANTEAMIENTO DEL PROBLEMA 33
3. JUSTIFICACIÓN 35
4. DISTRIBUCIÓN DEL TRABAJO 38
5. MICROCONTROLADOR 40
6. FLEX10K DE ALTERA 42
6.1 DESCRIPCIÓN GENERAL 42
6.2 BLOQUE DE ARREGLOS EMBEBIDOS 42
6.3 BLOQUE DE ARREGLOS LOGICOS 43
6.4 ELEMENTO LOGICO 44
6.5 MODOS DE OPERACIÓN 45
6.5.1 MODO NORMAL 45
6.5.2 MODO ARIMETICO 46
6.5.3 MODO CONTADOR ASCENDENTE/DESCENDENTE 47
6.5.4 MODO CONTABLE CLAREABLE 48
7. CIRCUITOS COMBINATORIOS 49
7.1 CIRCUITOS ARITMETICOS 49
7.1.1 SUMADORES 49
7.1.1.1 Semisumador 49
7.1.1.2 Sumador completo 50
7.1.1.3 Sumador paralelo binario 52
7.1.1.4 Sumador-restador binario 53
7.1.1.5 Lpm_add_sub 54
7.1.1.6 Diseño de sumadores utilizados en el Flex51 54
7.1.1.6.1 Ader_a 54
7.1.1.6.2 Sumagu 57
7.1.2 MULTIPLICADORES 58
7.1.2.1 Multiplicador serie 58
7.1.2.2 Multiplicador paralelo de n bits basado en arreglos de sumadores
con acarreo propagado 59
7.1.2.3 Multiplicador paralelo de n bits basado en arreglos de sumadores
con acarreo salvado 60
7.1.2.4 Multiplicador de Wallace 61
7.1.2.5 Multiplicador parametrizado: Mega Función Lpm_mult 62
7.1.2.6 Multiplicador paralelo basado en el algoritmo de Booth 62
7.1.2.7 Multiplicador de Baugh-Wooley 63
7.1.2.8 Resultados de optimización de multiplicadores paralelos 64
7.1.2.9 Diseño del multiplicador del FEX51. 67
7.1.3 DIVISORES 68
7.1.3.1 Divisor basado en restas y desplazamientos 68
7.1.3.2 Divisor con restauración de 2N-N bits 68
7.1.3.3 Divisor sin restauración de 2N-N bits 70
7.1.3.4 Lpm_divide 71
7.1.3.5 Diseño del divisor del FLEX51 71
7.2 DECODIFICADORES 72
7.2.1 DEC2TO4 72
7.2.2 DEC2TO4H 73
7.2.3 DECOD127 74
7.2.4 DECINT 76
7.3 MULTIPLEXORES 77
7.3.1 MUX1OF2B 78
7.3.2 MU3 78
7.3.3 MBIT 79
7.3.4 MUXPREES 79
8. REGISTROS Y CONTADORES 81
8.1 FLIP-FLOPS 81
8.1.1 FDD 81
8.1.2 FDD1 82
8.2 REGISTROS 82
8.2.1 REG8B 82
8.2.2 STD_REG8B2 83
8.2.3 STD_REG8B22 84
8.2.4 STD_REG8B1 85
8.2.5 REG8BPSW 87
8.2.6 REGTCON 87
8.2.7 REGSCON 88
8.2.8 REG8BTRANS 89
8.2.9 REG8BRECC 90
8.3 CONTADORES 90
8.3.1 CONT_REG8B 90
8.3.2 REG_SP 91
8.3.3 PC0 92
8.3.4 PC1 92
8.3.5 INC_DEC 94
8.2.6 CONTBAUDRATE 95
8.2.7 CONTBAUDRATE1 96
8.2.8 CONT_REG6B 97
9. MEMORIA 98
9.1 MEMORIA DE ACCESO ALEATORIO (RAM) 99
9.1.1 DISEÑO DE LA MEMORIA RAM DEL FLEX51 99
9.2 MEMORIA DE SOLO LECTURA (ROM) 99
9.2.1 DISEÑO DE LA MEMORIA ROM DEL FLEX51 100
10. DISEÑO DEL FLEX51 101
10.1 MICROCONTROLADOR 80C31/80C51/80C57 101
10.2 FLEX51 107
10.2.1 CARACTERISTICAS 108
10.2.2 FLEX51 EN BLOQUES 109
10.2.3 FLEX51 EN PARTES 113
10.2.3.1 Decodificador de zona de registros de funciones especiales
DECOD127 115
10.2.3.2 Dispositivo de salidas de control de la máquina de estados DIROUT 116
10.2.3.3 Memoria de programa ROMPROG 119
10.2.3.4 Tri 120
10.2.3.5 Memoria de datos RAMD. 120
10.2.3.6 Registro IR 121
10.2.3.7 Zona de puertos de entrada y salida 121
10.2.3.8 Registro PSW 123
10.2.3.9 Cable 125
10.2.3.10 Arreagu1 126
10.2.3.10.1 And20 129
10.2.3.11 Agu 129
10.2.3.11.1 Pc 131
10.2.3.11.2 Dptr 133
10.2.3.11.3 Reg8bagu 135
10.2.3.11.4 Arreagu2 136
10.2.3.11.5 Arreagu3 136
10.2.3.11.6 Arregloagu 137
10.2.3.11.7 Cable2 138
10.2.3.11.8 Funcionamiento general de la AGU 139
10.2.3.12 Alu (Prueba4) 141
10.2.3.12.1 Alu 143
U_corri 146
U_exch 146
Paridad 147
Dirbit 148
Cjne 150
Incdec 151
Ul 152
Arreglodirecto 153
10.2.3.12.2 Logalu 155
10.2.3.12.3 Arreov 158
10.2.3.13 Unidad_bits 160
10.2.3.13.1 Prubit 162
10.2.3.13.2 Arrecarry 162
10.2.3.13.3 Saltoarre 163
10.2.3.13.4 Compilación del dispositivo Unidad_bits 163
10.2.3.14 Arre_ramex 164
10.3 MÁQUINA DE ESTADOS 164
11. PERIFERICOS DEL FLEX51 177
11.1 UNIDAD SERIAL 178
11.1.1 UNIDAD DE TRANSMISION 178
11.1.1.1 Baudrate 180
11.1.1.2 Mqtx 181
11.1.2 UNIDAD DE RECEPCION 182
11.1.2.1 Mqrx 184
11.1.3 PREESCALER 184
11.1.4 SCON 185
11.1.5 FUNCIONAMIENTO GENERAL DE LA UNIDAD SERIAL 187
11.1.6 FORMULA PARA GENERAR LA RATA DE BAUDIOS 188
11.2 UNI_INTERRUPCIONES 189
11.2.1 FUNCIONAMIENTO GENERAL DEL DISPOSITIVO UNI_INTERRUPCIONES 190
11.2.2 INTERRUP 192
11.3 UNIDAD DE TIMERS 193
11.3.1 TCON 197
12. PRUEBAS DE FUNCIONAMIENTO Y VALIDACIÓN 199
12.1 PRUEBA 1: TABLAS DE MULTIPLICAR DE 4 X(0-F). HEXADECIMAL 201
12.2 PRUEBA 2: CONTADOR DE EVENTOS 202
12.3 PRUEBA 3: TRANSMISIÓN SERIAL 205
13. CONCLUSIONES 209
14. RECOMENDACIONES 211
BIBLIOGRAFIA 212
ANEXOS 213
LISTA DE TABLAS
Pág.
Tabla 1. Tabla de verdad del semisumador. 50
Tabla 2. Tabla de verdad del sumador completo. 51
Tabla 3. Control de funcionamiento del ADER_A 55
Tabla 4. Multiplicadores paralelos optimizados por velocidad usando
MAX+plus II. 65
Tabla 5. Multiplicadores paralelos optimizados por área usando MAX+plus
II. 65
Tabla 6. Multiplicadores paralelos optimizados por velocidad usando
QUARTUS II versión 3. 66
Tabla 7. Multiplicadores paralelos optimizados por área usando QUARTUS II
versión 3. 66
Tabla 8. Tabla de verdad del DEC2TO4 73
Tabla 9. Tabla de verdad del DEC2TO4H 74
Tabla 10. Tabla de verdad del DECOD127. 75
Tabla 11. Tabla de verdad del DECINT. 77
Tabla 12. Set de instrucciones y modos de direccionamiento. 104
Tabla 13. Salidas del dispositivo DIROUT y sus funciones. 116
Tabla 14. Tabla de operaciones aritméticas con su número de estados 165
Tabla 15. Tabla de operaciones lógicas con su número de estados 167
Tabla 16. Tabla de operaciones de transferencia de datos con su número
de estados. 168
Tabla 17. Tabla de operaciones de manipulación de variables booleanas
con su número de estados. 169
Tabla 18. Tabla de operaciones de salto de programa con su número de
estados 170
LISTA DE FIGURAS
Pág.
Figura 1. Diagrama Bloques general del FLEX51. 41
Figura 2. Bloque de arreglos embebidos. 43
Figura 3. Bloque de arreglos lógicos. 44
Figura 4. Elemento lógico. 45
Figura 5. Modo normal. 46
Figura 6. Modo aritmético. 47
Figura 7. Modo contador ascendente/descendente. 48
Figura 8. Modo contador clareable. 48
Figura 9. Diagrama de lógica del sumador. 50
Figura 10. Diagrama de lógica del sumador completo. 52
Figura 11. Sumador paralelo de 4 bits. 52
Figura 12. Circuito sumador-restador 53
Figura 13.Dispositivo ADER_A sumador-restador 55
Figura 14. Sumario de compilación del dispositivo ADER_A. 56
Figura 15. Dispositivo diseñado con la función MegaWizard Pulg-In
Manager Sumador_A. 56
Figura 16. Diagrama esquemático del ADER_A. 57
Figura 17. Dispositivo diseñado con la función MegaWizard Pulg-In
Manager Sumagu. 58
Figura 18. Multiplicador serial sin signo. 59
Figura 19. Multiplicador de 4 bits basado en sumadores con acarreo
propagado. 60
Figura 20. Multiplicador de 4 bits basado en sumadores con acarreo
salvado. 61
Figura 21. Multiplicador de Wallace de 4 bits. 61
Figura 22. Celda básica de control. 63
Figura 23. Multiplicador de Booth. 63
Figura 24. Multiplicador de Baugh-Wooley de 4 bits. 64
Figura 25. Dispositivo diseñado con la función MegaWizard Plug-In
Manager Multiplicador. 67
Figura 26. Arreglo del divisor con restauración para N =4 bits. 69
Figura 27. Celda básica para el arreglo del divisor con restauración. 69
Figura 28. Arreglo divisor sin restauración con N =4 bits. 70
Figura 29. Celda básica para el arreglo del divisor sin restauración. 71
Figura 30. Dispositivo diseñado con la función MegaWizard Plug-In
Manager Divisor. 72
Figura 31. Dispositivo diseñado en lenguaje de descripción hardware VHDL
DEC2TO4. 73
Figura 32. Dispositivo diseñado en lenguaje de descripción hardware VHDL
DEC2TO4H. 74
Figura 33. Dispositivo diseñado en lenguaje de descripción hardware VHDL
DECOD127. 75
Figura 34. Dispositivo diseñado en lenguaje de descripción hardware VHDL
DECINT. 76
Figura 35. Dispositivo diseñado en lenguaje de descripción hardware VHDL
MUX1OF2_8B. 78
Figura 36. Dispositivo diseñado con la función MegaWizard Plug-In
Manager Mu3. 79
Figura 37. Dispositivo diseñado con la función MegaWizard Plug-In
Manager Mu3. 79
Figura 38. Dispositivo diseñado con la función MegaWizard Plug-In
Manager MUXPREES. 80
Figura 39. Dispositivo diseñado en lenguaje de descripción hardware VHDL
FDD. 81
Figura 40. Dispositivo diseñado en lenguaje de descripción hardware VHDL
FDD1. 82
Figura 41. Dispositivo diseñado en lenguaje de descripción hardware VHDL
REG8B. 83
Figura 42. Dispositivo STD_REG8B2. 83
Figura 43. Diagrama esquemático del STD_REG8B2. 84
Figura 44. Dispositivo STD_REG8B22. 85
Figura 45. Diagrama esquemático del STD_REG8B22. 85
Figura 46. Dispositivo STD_REG8B1. 86
Figura 47. Diagrama esquemático del STD_REG8B1. 86
Figura 48. Dispositivo diseñado en lenguaje de descripción hardware VHDL
REG8BPSW. 87
Figura 49 Dispositivo diseñado en lenguaje de descripción hardware VHDL
REGTCON. 88
Figura 50. Dispositivo diseñado en lenguaje de descripción hardware VHDL
REGSCON. 89
Figura 51. Dispositivo diseñado en lenguaje de descripción hardware VHDL
REG8BTRANS. 89
Figura 52. Dispositivo diseñado en lenguaje de descripción hardware VHDL
REG8BREPC. 90
Figura 53. Dispositivo diseñado en lenguaje de descripción hardware VHDL
CONT_REG8B. 91
Figura 54. Sumario de compilación del dispositivo CONT_REG8B. 91
Figura 55. Dispositivo diseñado en lenguaje de descripción hardware VHDL
REG_SP. 92
Figura 56. Sumario de compilación de dispositivo REG_SP. 92
Figura 57. Dispositivo diseñado con la función MegaWizard Plug-In
Manager PC0. 93
Figura 58. Dispositivo diseñado con la función MegaWizard Plug-In
Manager PC1. 94
Figura 59. Dispositivo diseñado en lenguaje de descripción hardware VHDL
INC_DEC. 94
Figura 60. Sumario de compilación de dispositivo INC_DEC. 94
Figura 61. Dispositivo diseñado en lenguaje de descripción hardware VHDL
CONTBAUDRATE. 95
Figura 62. Sumario de compilación de dispositivo CONTBAUDRATE. 95
Figura 63. Dispositivo diseñado en lenguaje de descripción hardware VHDL
CONTBAUDRATE1. 96
Figura 64. Sumario de compilación de dispositivo CONTBAUDRATE1. 96
Figura 65. Dispositivo diseñado en lenguaje de descripción hardware VHDL
CONT_REG6B. 97
Figura 66. Sumario de compilación de dispositivo CONT_REG6B. 97
Figura 67. Dispositivo diseñado con la función MegaWizard Plug-In
Manager RDAM. 99
Figura 68. Dispositivo diseñado con la función MegaWizard Plug-In
Manager MEMPROG. 100
Figura 69. Símbolo lógico. 102
Figura 70. Diagrama de Bloques. 103
Figura 71. Set de instrucciones del 8051 parte 1. 105
Figura 72. Set de instrucciones del 8051 parte 2. 106
Figura 73. Microcontrolador embebido FLEX51. 108
Figura 74. Diagrama de bloques de la unidad de control implementada en
el Flex51. 110
Figura 75. Diagrama de bloques de la unidad generadora de direcciones
AGU. 111
Figura 76. Diagrama de bloques de la unidad aritmética lógica ALU. 113
Figura 77. Diagrama de bloques del microcontrolador embebido Flex51.
114
Figura 78. Diagrama esquemático del Flex51. a)CPU, b)DIROUT, c)IR, d)ALU,
e)AGU, f)Banco de puertos, g)DECOD127, h)Memoria ROM, i)Memoria
RAM, j)Unidad de bits, k)PSW, l)Unidad de temporizadores, m)Unidad
de interrupciones, n)unidad de transmisión serial. 115
Figura 79. Dispositivo diseñado en lenguaje de descripción hardware VHDL
DIROUT. 116
Figura 80. Sumario de compilación del dispositivo DIROUT. 118
Figura 81. Dispositivo diseñado en el entorno grafico de ALTERA
ROMPROG. 119
Figura 82. Esquema de la memoria de programa ROMPROG. 119
Figura 83. Sumario de compilación del dispositivo ROMPROG. 120
Figura 84. Dispositivo diseñado con la función MegaWizard Plug-In
Manager TRI. 120
Figura 85. Dispositivo diseñado en el entorno grafico de ALTERA RAMD.121
Figura 86. Esquema de la memoria de datos RAMD. 121
Figura 87. Dispositivo diseñado en el entorno grafico de ALTERA BANREG.
122
Figura 88. Esquema del dispositivo de puertos de entrada y salida. 123
Figura 89. Dispositivo diseñado en el entorno grafico de ALTERA PSW. 124
Figura 90. Esquema del dispositivo PSW. 125
Figura 91. Dispositivo diseñado en lenguaje de descripción hardware VHDL
CABLE. 125
Figura 92. Dispositivo diseñado en el entorno grafico de ALTERA
ARREAGU1. 127
Figura 93. Esquema del dispositivo Arreagu1. 128
Figura 94. Dispositivo diseñado en lenguaje de descripción hardware VHDL
AND20. 129
Figura 95. Dispositivo diseñado en el entorno grafico de ALTERA AGU. 131
Figura 96. Dispositivo diseñado en el entorno grafico de ALTERA PC. 132
Figura 97. Esquema del dispositivo PC. 133
Figura 98. Dispositivo diseñado en el entorno grafico de ALTERA DPTR. 134
Figura 99. Esquema del dispositivo DPTR. 134
Figura 100. Dispositivo diseñado en lenguaje de descripción hardware
VHDL REG8BAGU. 135
Figura 101. Dispositivo diseñado en el entorno grafico de ALTERA
ARREAGU2. 136
Figura 102. Dispositivo diseñado en el entorno grafico de ALTERA
ARREAGU3. 137
Figura 103. Esquema del dispositivo ARREAGU3. 137
Figura 104. Dispositivo diseñado en el entorno grafico de ALTERA
ARREGLOAGU. 138
Figura 105. Esquema del dispositivo ARREGLOAGU. 138
Figura 106. Dispositivo diseñado en lenguaje de descripción hardware
VHDL CABLE2. 139
Figura 107. Esquema del dispositivo AGU. a)PC, b)DPTR, c)Registros
temporales, d)SP, e)sumador, f)REG8BAGU, g)MU3, h)CABLE,
i)ARREAGU2, j)ARREGLOAGU 140
Figura 108. Sumario de compilación del dispositivo AGU. 141
Figura 109. Dispositivo diseñado en el entorno grafico de ALTERA
PRUEBA4. 142
Figura 110. Esquema del dispositivo PRUEBA4. 143
Figura 111. Dispositivo diseñado en el entorno gráfico de Altera ALU. 145
Figura 112. Esquema del dispositivo ALU. a)registros, b) ADER_A, c)UL, d)
Multiplicador, e)divisor, f)U_exch, g)U_corri, h)dirbit, i)Paridad,
j)Multiplexores, k)Decodificadores, l)CJNE, m)Arreglodirecto, n)Incdec.
145
Figura 113. Dispositivo diseñado en lenguaje de descripción hardware
VHDL U_CORRI. 146
Figura 114. Dispositivo diseñado en lenguaje de descripción hardware
VHDL U_EXCH. 147
Figura 115. Dispositivo diseñado en el entorno gráfico de Altera PARIDAD.
148
Figura 116. Esquema del dispositivo PARIDAD. 148
Figura 117. Dispositivo diseñado en el entorno gráfico de Altera DIRBIT.
149
Figura 118. Esquema del dispositivo DIRBIT. 149
Figura 119. Dispositivo diseñado en lenguaje de descripción hardware
VHDL DIRBITS. 150
Figura 120. Dispositivo diseñado en lenguaje de descripción hardware
VHDL CJNE. 151
Figura 121. Dispositivo diseñado en el entorno gráfico de Altera INCDEC.
151
Figura 122. Esquema del dispositivo INCDEC. 152
Figura 123. Dispositivo diseñado en lenguaje de descripción hardware
VHDL UL. 152
Figura 124. Dispositivo diseñado en el entorno gráfico de Altera
ARREGLODIRECTO. 153
Figura 125. Esquema del dispositivo ARREGLODIRECTO. 153
Figura 126. Bandera de Cero. 154
Figura 127. Bandera de desbordamiento de la división. 154
Figura 128. Bandera de desbordamiento de la multiplicación. 155
Figura 129. Dispositivo diseñado en el entorno gráfico de Altera LOGALU.
157
Figura 130. Dispositivo diseñado en lenguaje de descripción hardware
VHDL CJNEMUX. 158
Figura 131. Dispositivo diseñado en lenguaje de descripción hardware
VHDL CJNEMUX1. 158
Figura 132. Dispositivo diseñado en lenguaje de descripción hardware
VHDL ARREOV. 159
Figura 133. Sumario de compilación del dispositivo PRUEBA4. 160
Figura 134. Dispositivo diseñado en ele entorno gráfico de Altera
UNIDAD_BITS. 161
Figura 135. Esquema del dispositivo UNIDAD_BITS. 161
Figura 136. Dispositivo diseñado en lenguaje de descripción hardware
VHDL PRUBIT. 162
Figura 137. Dispositivo diseñado en lenguaje de descripción hardware
VHDL ARRECARRY. 163
Figura 138. Dispositivo diseñado en lenguaje de descripción hardware
VHDL SALTOARRE. 163
Figura 139. Sumario de compilación del dispositivo UNIDAD_BITS 164
Figura 140. Dispositivo diseñado en lenguaje descripción hardware VHDL
ARRE_RAMEX. 164
Figura 141. Dispositivo diseñado en lenguaje de descripción hardware
AHDL CPU. 165
Figura 142. Máquina de estados del FLEX51. 172
Figura 143. Sumario de compilación del microcontrolador FLEX51. 176
Figura 144. Dispositivo diseñado en el entorno grafico de ALTERA
UNIDAD_SERIAL. 178
Figura 145. Dispositivo diseñado en el entorno grafico de ALTERA
TRANSMISION. 179
Figura 146. Esquema del dispositivo TRANSMISION. 179
Figura 147. Dispositivo diseñado en lenguaje de descripción hardware
VHDL BAUDRATE. 181
Figura 148. Dispositivo diseñado en lenguaje de descripción hardware
AHDL MQTX. 181
Figura 149. Dispositivo diseñado en el entorno grafico de ALTERA
RECEPCION. 182
Figura 150. Esquema del dispositivo RECEPCION. 183
Figura 151. Dispositivo diseñado en lenguaje de descripción hardware
AHDL MQRX. 184
Figura 152. Dispositivo diseñado en el entorno grafico de ALTERA
PREESCALER. 184
Figura 153. Esquema del dispositivo PREESCALER. 185
Figura 154. Dispositivo diseñado en el entorno grafico de ALTERA SCON.
186
Figura 155. Esquema del dispositivo SCON. 186
Figura 156. Esquema del dispositivo UNIDAD_SERIAL. a)Preescaler,
b)Transmisión, c)recepción, d)scon. 187
Figura 157. Sumario de compilación de la unidad serial. 188
Figura 158. Dispositivo diseñado en el entorno grafico de ALTERA
UNI_INTERRUPCIONES. 189
Figura 159. Esquema del dispositivo UNI_INTERRUPCIONES. a)arreglo de
flip-flops 1, b) registro IR, c)registro IP, d)decodificador de
interrupciones 1, e)interrup, f)decodificador de interrupciones 2,
g)arreglo de slip-flops 2. 191
Figura 160. Sumario de compilación del dispositivo UNI_INTERRUPCIONES.
191
Figura 161. Dispositivo diseñado en lenguaje de descripción hardware
AHDL INTERRUP. 192
Figura 162. Dispositivo diseñado en el entorno gráfico de Altera
UNI_TIMER-COUNTER. 193
Figura 163. Esquema del temporizador cero. 195
Figura 164 Esquema del temporizador uno. 195
Figura 165 Esquema de la salida de la unidad timer-counter. a)TCON,
b)TMOD, c)arreglo de salidas. 196
Figura 166. Sumario de compilación del dispositivo TIMER-COUNTER. 197
Figura 167. Dispositivo diseñado en el entorno gráfico de altera TCON. 197
Figura 168. Esquema del dispositivo TCON. 198
Figura 169. Montaje de dispositivos en ALTERA para pruebas. 200
Figura 170. Tarjeta UP2 y protoboard. 200
Figura 171. Sumario de compilación del FLEX51 con el programa de la
prueba 1. 202
Figura 172. Simulación de la prueba 1 en donde se multiplica 4 h x 2h. 202
Figura 173. Diagrama de bloques de la prueba 2. 203
Figura 174. Sumario de compilación del FLEX51 con el programa de la
prueba 2 204
Figura 175. Simulación de la prueba 2. 204
Figura 176. Circuito eléctrico de los pulsadores. 205
Figura 177. Diagrama de bloques de la prueba 3. 207
Figura 178. Sumario de compilación del FLEX51 con el programa de la
prueba 2 207
Figura 179. Resultado de la prueba 3 en el Hyper Terminal. 207
Figura 180. Circuito RS-232. 208
Figura 181. Circuito eléctrico de los pulsadores. 208
LISTA DE ANEXOS
Pág.
Anexo A 213
Anexo B 288
RESUMEN
En este documento se hablará a grandes rasgos lo que es el microcontrolador de
la familia 8051, sus características, su set de instrucciones, los diferentes modos
de direccionamiento, etc.
También se hablar un poco de lo que es el FLEX10K, sus elementos básicos y sus
modos de funcionamiento.
Además se planteará todo el diseño implementado para la elaboración del
microcontrolador embebido FLEX51, cuales son sus características,
especificaciones, que copiará del 8051 y que no, como están diseñados y como
funcionan sus dispositivos internos y cuales dispositivos periféricos se le
implementan.
Finalmente se plantearon una serie de practicas de laboratorios y sus respectivos
resultados.
30
INTRODUCCIÓN
En la actualidad el gran crecimiento de recursos disponibles en un solo circuito
integrado permite afrontar diseños de una complejidad muy alta, incluso la
instalación de sistemas enteros. Esta solución conocida como SOC (System On a
Chip), busca la minimización de los tiempos de diseño, disminución de costos,
aumento de la velocidad de operación, etc.
Años atrás y aun en la actualidad un proyecto que necesitara un componente
digital especifico, tenia como solución su implementación con lógica digital,
sistemas microprocesadores o arreglos lógico programables como las PAL, GAL,
sistemas a medida entre otros. Hoy en día, dada la popularización de la lógica
programable y más específicamente de los Complex Field-programmable Devices
(CPLDs) y Field-Programmable Gate Arrays (FPGAs), es posible sintetizar estos
diseños complejos, mejorando notablemente la implementación de ellos. Por eso,
en nuestros tiempos es muy común encontrar aplicaciones de la lógica
programable en muchas áreas tales como: microcomputadoras, audio, video,
comunicaciones, tratamiento digital de señales (DSP), equipos médicos, sistema
para medición y telecontrol etc. Los lenguajes de descripción de hardware (HDLs)
surgieron como una solución a la complejidad del diseño digital en grandes
sistemas, debido que los tradicionales esquemas eléctricos eran de difícil manejo.
31
Este trabajo se enfoca exactamente en este campo, puesto que será embebido un
microcontrolador en una FPGA con muchas de las características del 8051 y
posibilidades de unirse a periféricos para diferentes aplicaciones; estos anexos se
realizan por medio de lógica programable que sintetizaran aun más los diseños
en un futuro.
Este proyecto será uno de los puntos de partida para nuevas investigaciones y
desarrollos por parte de La Universidad Autónoma de Occidente en el área de
electrónica digital, microcontroladores, etc. puesto que será de gran ayuda para
los estudiantes de los programas de Electrónica y Mecatrónica que podrán usarlo,
no preocupándose ahora por el microcontrolador sino por periféricos específicos
de cada aplicación teniendo estos en un mismo encapsulado y disminuyendo así
los tiempos de diseño.
32
1. OBJETIVO GENERAL
Diseñar e implementar usando VHDL una arquitectura de microcontrolador
compatible con el set de instrucciones del 8051, en una FPGA (FLEX 10K) de
Altera.
1.1 OBJETIVOS ESPECIFICOS
Aprender el funcionamiento del microcontrolador 8051 (su arquitectura,
funcionamiento, periféricos, listado de instrucciones, etc).
Fijar el funcionamiento de los lenguajes de descripción hardware, en nuestro caso
VHDL utilizando la plataforma proporcionada por Altera (MAX+PLUS II 10.1
BASELINE).
Conocer el funcionamiento de la arquitectura de las FPGA’s FLEX 10K de altera y
comprender sus modos de funcionamiento interno, con el fin de tener pautas para
sintetizar en un menor espacio un circuito digital sin disminuir su desempeño en
cuanto a velocidad.
33
2 . PLANTEAMIENTO DEL PROBLEMA
En la actualidad en el área de diseño de dispositivos se habla del término
codiseño y sistemas embebidos, donde se trabaja a la par, software y hardware,
obteniendo una gran compenetración de entre ambos. Además de estos,
encontramos lo que son diseños On-chip o diseños de sistemas en un solo chip,
en donde podemos observar un gran numero de aplicaciones desarrolladas y en
desarrollo. Aunque se han desarrollado en la universidad unos cuantos trabajos
de este tipo1, la universidad no cuenta con una solución propia con estas
características. Entendiendo como solución propia el diseño de un
microprocesador genérico que se pueda reutilizar para diversas aplicaciones.
Se puede pensar que la solución es adquirir módulos IP (Intellectual Property) de
microprocesadores, pero erramos en esta decisión, puesto que estas soluciones
son bastante costosas en el mercado (varían entre 12 millones y 95 millones de
pesos, dependiendo de la velocidad); por tal motivo se desea realizar un
microcontrolador tipo 8051 buscando el desarrollo de un dispositivo de muy buen
desempeño y a costos relativamente bajos (precio de la tarjeta UP2 + software).
1 Uno ejemplo de este trabajo es la tesis “Implementación de un modulo de sensado y de actuación para el control de nivel de un tanque mediante la técnica de codiseño hardware software”, donde se utiliza como elemento central de proceso un modulo IP 6805 de Motorola descrito en VHDL por Guillermo Jacquenod denominado FLEX6805
34
En el área de diseño lógico digital la implementación de este tipo de
procesadores es tema de desarrollo, ya que se busca diariamente la forma de
optimizar la velocidad, el tamaño y los costos.
Un inconveniente que se posee al no trabajar con soluciones de este tipo es el
aprovechar parcialmente las características de los microcontroladores usados,
debido a que las aplicaciones no requieren en su mayoría de todos los módulos y
funciones del microcontrolador. Por eso al implementar un microcontrolador en
software, se deja a parte este problema, puesto que los módulos que no se
requieren pueden ser omitidos a la hora de desarrollar nuevas aplicaciones o
añadir al microcontrolador, módulos adicionales que cumplan funciones
específicas para un diseño particular.
35
3 . JUSTIFICACIÓN
Es importante y cabe decir que el funcionamiento del microcontrolador embebido
es igual que el funcionamiento de un microcontrolador real, pero a diferencia de
este, el microcontrolador embebido posee la ventaja que en una misma pastilla se
pueda integrar los componentes necesarios y las funciones específicamente
necesarias para realizar la aplicación deseada.
Una característica es la programación, ya que es mucho mas sencilla, en donde
se desarrolla un archivo que lee el dispositivo, una vez compilado y programado,
por otra parte para programar el dispositivo real se debe estar borrando la
memoria y el proceso de pruebas es considerablemente mas tardado, sino queda
bien borrada o programada.
Al estudiante poseer un microcontrolador ya desarrollado en una tarjeta como la
UPX10K o UP2, adelanta mucho el proceso de desarrollo nuevas aplicaciones,
puesto que se enfocaría a los periféricos que necesita para la aplicación
especifica. De esta manera obtendríamos un número elevado de nuevas
aplicaciones en pro de la investigación haciendo uso de microprocesadores y
microcontroladores.
36
Una ventaja de que el microcontrolador sea embebido y no real a la hora de
realizar nuevas aplicaciones es que el estudiante podrá optimizar al máximo sus
diseños, porque no tendrá que desperdiciar algunas de las características del
microcontrolador, puesto que este es hecho en software y puede ser modificado,
usando solo necesario.
Una de las razones de peso para la realización de este proyecto es el precio
comercial de un desarrollo de este tipo, debido a que es realmente elevado, (por
ejemplo la FPGA con Core E8051 cuesta en el mercado $4000 US
aproximadamente $11’600.000 pesos), si miramos un proveedor como ALDEC
notamos que sus valores son aun mas elevados ($33.000 US aproximadamente
95’700.000 pesos). Por tal motivo es bastante rentable la realización de un
dispositivo con estas características, que por el contrario comprarlo. Cabe decir
que el microcontrolador que se diseñará no alcanzará las velocidades en las que
estos otros dispositivos trabajan, puesto que no se compilará en dispositivos tan
robustos y de tan grandes velocidades, pero su funcionamiento será bastante
aceptable.
Además podemos decir que importantes investigaciones se están realizando en la
actualidad entorno a los IP cores por parte de diversas Universidades alrededor
del mundo. A continuación se citarán de tres de ellas: “Diseño de cores-ip para
redes de comunicaciones inalámbricas basadas en ofdm: optimización en área en
la estación base” Investigador Principal: Javier Valls Coquillat. Universidad
Politécnica de Valencia.
37
“Adaptación del núcleo IP de un procesador tipo M6805 para operar en un en
ambiente multiprocesador y multitarea” Guillermo Jaquenod, Facultad de
Ingeniería, Universidad del Centro de la Provincia de Buenos Aires.
“Diseño de multiplicadores paralelos de 16 bits en FPGAs” Gustavo E. Ordóñez
Fernández, Lewin A. López López, Jaime Velasco Medina.
Siendo la Universidad Autónoma de Occidente impulsadora de grandes
desarrollos, un proyecto con estos enfoques encaja muy bien dentro de visiones
de progreso investigativo.
38
4 . DISTRIBUCIÓN DEL TRABAJO
En este capítulo se mostrará como está divido el desarrollo del trabajo, y se dará
un pequeño apunte de cada parte.
MICRONTROLADOR, este capítulo es un abre bocas de todo este trabajo, en donde
se encuentra un pequeño resumen de que es un microcontrolador y una
descripción breve del Flex51.
FLEX10K DE ALTERA, este capítulo muestra brevemente los elementos que
Componen la Flex10k de altera y sus modos de funcionamiento.
CIRCUITOS COMBINATORIOS, este capítulo trata acerca de los circuitos
sumadores, multiplicadores, divisores, decodificadores y multiplexores que
existen y cuales se implementan en el Flex51.
REGISTROS Y CONTADORES, este capítulo habla de los dispositivos flip-flops,
registros y contadores implementados en el microcontrolador embebido Flex51.
MEMORIA, en esta parte se habla brevemente de los tipos de memorias que
utiliza el dispositivo flex10k y la manera en que fueron implementadas las
memorias de datos y de programa del microcontrolador Flex51.
39
DISEÑO DEL FLEX51, en este capítulo se habla de cómo se diseñaron y como
funcionan los bloques funcionales ALU, AGU, CPU.
PERIFERICOS, está sección contiene todo lo concerniente a la información de los
periféricos que se le implementaron al Flex51, como funcionan y cuales son los
tiempos de operación de estos dispositivos.
PRUEBAS DE FUNCIONAMIENTO Y VALIDACIÓN, este capítulo documenta tres
pruebas realizadas con el Flex51 en la tarjeta UP2.
40
5 . MICROCONTROLADOR
Los microcontroladores poseen internamente una serie de elementos básicos tales
como: la cpu, la alu, la agu,2 registros y diferentes tipos de buses (bus de datos,
bus de direcciones y bus de control). El eje de todo microcontrolador es la cpu, ya
que está se encarga de ejecutar cada orden que se dé al microcontrolador, genera
las señales de control para de los otros componentes tales como la agu, la alu y
los registros funcionen correctamente. Se encarga de orientar los datos, tanto a
procesar como los ya procesados.
Un microcontrolador además debe tener otros dispositivos que estén unidos a él
para su buen funcionamiento: memorias, puertos y una señal de sincronice el
sistema (reloj).
Para la implementación del microcontrolador embebido FLEX51 se tendrá una
unidad de direccionamiento AGU, una unidad aritmético lógica ALU, una máquina
de estados, una unidad de salidas de control de la máquina de estados, el registro
de interpretación de código IR, un bus de datos de 8 bits y un bus de direcciones
de 16 bits. Ver figura 1.
2 Morris Mano, M. INGENIERIA COMPUTACIONAL DISEÑO DEL HARDWARE.
41
Figura 1. Diagrama Bloques general del FLEX51.
42
6 . FLEX10K DE ALTERA
6.1 DESCRIPCIÓN GENERAL.
Los FLEX 10K de Altera son los primeros dispositivos PLDs embebidos de la
industria. Basados en elementos reconfigurables CMOS SRAM. Con un máximo de
250000 compuertas implementables, la familia FLEX 10K provee la densidad, la
velocidad, y las características para integrar sistemas enteros, incluyendo buses
múltiples de 32 bits, dentro de un solo dispositivo.
Cada dispositivo FLEX 10K contiene un arreglo embebido para implementar
memoria y funciones lógicas especializadas, y un arreglo lógico para implementar
lógica en general.
6.2 BLOQUE DE ARREGLOS EMBEBIDOS
El EAB es un bloque flexible de RAM con registros con puertos de entrada y salida,
y es usado para implementar mega funciones de arreglo de entrada común. El EAB
es también adecuado para funciones tales como multiplicaciones, vectores
escalares, circuitos de corrección de error, porque es grande y flexible. Estas
funciones pueden ser combinadas en aplicaciones tales como filtros digitales y
microcontroladores. Ver figura 2.
43
Figura 2. Bloque de arreglos embebidos.
Flex10K Familia de dispositivos embebidos de lógica programable.
6.3 BLOQUE DE ARREGLOS LOGICOS
Cada LAB consiste en ocho LEs, ellos asociados con el carry y la cadena de
cascada, la señal de control del LAB y la interconexión local LAB. Los LABs proveen
la estructura de grano grueso a la arquitectura de la FLEX 10K, facilitando el
enrutamiento eficiente con una utilización óptima del dispositivo y alto
desempeño. Ver figura 3.
44
Figura 3. Bloque de arreglos lógicos.
Flex10K Familia de dispositivos embebidos de lógica programable
6.4 ELEMENTO LOGICO
Los LE, son la unidad mas pequeña de la arquitectura lógica de la FLEX 10K, tiene
un tamaño compacto que provee una utilización lógica eficiente. Cada LE contiene
una LUT de cuatro entradas, la cual es una función generadora que puede
rápidamente computar algunas funciones de cuatro variables. En adición, cada LE
contiene un flipflop programable con habilitadores sincrónicos, cadena de carry, y
cadena de cascada. Cada LE maneja la interconexión local y la interconexión
FastTrack. Ver figura 4.
45
Figura 4. Elemento lógico.
Flex10K Familia de dispositivos embebidos de lógica programable
6.5 MODOS DE OPERACIÓN
La FLEX 10K LE puede operar en los siguientes 4 modos:
Modo normal.
Modo aritmético.
Modo contador ascendente/ descendente.
Modo contador clareable.
6.5.1 Modo normal. El modo normal es adecuado generalmente para aplicaciones
lógicas y funciones de decodificación amplias que pueden tomar ventaja de una
cadena de cascada. En modo normal, cuatro entradas de interconexión local LAB y
carry-in son entradas para cuatro entradas LUT (ver figura 5). El compilador
automáticamente selecciona la señal de carry-in o DATA3 como una de las
46
entradas a la LUT. La salida LUT es combinada con una señal cascade-in a una
cadena de cascada a través de una señal cascade-out.
El registro o la LUT puede manejar la interconexión local y la interconexión
FastTrack al mismo tiempo.
Figura 5. Modo normal.
Flex10K Familia de dispositivos embebidos de lógica programable
6.5.2 Modo aritmético. El modo aritmético ofrece dos LUT de tres entradas que
son ideales para la implementación de sumadores, acumuladores y comparadores.
Una LUT calcula funciones de tres entradas, y la otra genera una salida de carry
(ver figura 6). La primera LUT usa una señal de carry de entrada y dos entradas de
datos de la interconexión local LAB para generar una salida combinacional o
registrada. La segunda LUT usa las mismas tres señales para generar la señal de
carry de salida.
47
Figura 6. Modo aritmético.
Flex10K Familia de dispositivos embebidos de lógica programable
6.5.3 Modo contador ascendente/descendente. El modo contador
ascendente/descendente ofrece habilitador de conteo, habilitador de reloj, control
sincrónico ascendente/descendente, y opción de carga de datos. Las señales de
control son generadas por las entradas de datos de la interconexión local LAB, la
señal carry de entrada y las salida realimentada del registro programable. El modo
contador ascendente/ descendente usa dos LUT de tres entradas: Una genera el
dato de conteo, y la otra genera el bit de carry rápido. Un multiplexor de 2 a 1
provee una carga sincrónica. El dato también puede ser cargado
asincrónicamente con las señales de control present y clear del registro, sin usar
las LUTs fuentes. Ver figura 7.
48
Figura 7. Modo contador ascendente/descendente.
Flex10K Familia de dispositivos embebidos de lógica programable.
6.5.4 Modo contador clareable. El modo contador clareable es similar al modo
contador ascendente/ descendente, pero soporta clareo sincrónico en cambio del
control ascendente/ descendente. La función de clareo es sustituida por la señal
cascade de entrada en el modo contador ascendente/ descendente. Usa dos LUTs
de tres entradas: Una genera el dato de conteo, y la otra genera el bit de carry
rápido.
Figura 8. Modo contador clareable.
Flex10K Familia de dispositivos embebidos de lógica programable
49
7. CIRCUITOS COMBINATORIOS
En este capítulo se hablará de los circuitos combinatorios, tales como circuitos
sumadores, restadores, multiplicadores, divisores y circuitos secuénciales, tales
como decodificadores y multiplexores, en donde se mostrará diferentes opciones
para cada uno, cuales fueron implementados en el microcontrolador Flex51.
7.1 CIRCUITOS ARITMETICOS
Un circuito aritmético es un circuito combinatorio que realiza operaciones
aritméticas tales como suma, resta, multiplicación y división con números binarios
o con números decimales en código binario.
7.1.1 Sumadores. La operación aritmética más simple es la adición de dos dígitos
binarios de cuatro posibles combinaciones. 0 + 0 = 0, 0 + 1 = 1, 1 + 0 = 1 y
1 + 1 = 10.
7.1.1.1 Semisumador. Es un circuito aritmético que genera la suma de dos dígitos
binarios. Posee tanto dos entradas como dos salidas. Su tabla de verdad es la
siguiente (ver tabla 1). X y Y representan las dos entradas, C y S representan el
acarreo y la suma (ver figura 9). Las funciones booleanas de las salidas son:
YXYXYXS ⊕=+=
50
XYC =
Tabla 1. Tabla de verdad del semisumador.
Entradas Salidas
X Y C S
0 0 0 0
0 1 0 1
1 0 0 1
1 1 1 0
Ingeniería Computacional Diseño del Hardware.
Figura 9. Diagrama de lógica del sumador.
Ingeniería Computacional Diseño del Hardware.
7.1.1.2 Sumador completo. Un sumador completo es un circuito combinatorio
que forma la suma aritmética de tres bits de entrada (Dos entradas que son X y Y,
y el acarreo de la posición significativa inferior anterior Z) y dos bits de salida S y
C (Suma y acarreo). Las funciones booleanas de las salidas son:
51
XYZZYXZYXZYXS +++=
YZXZXYC ++=
Veamos cual es su tabla de verdad y su diagrama esquemático (ver figura 10).
Tabla 2. Tabla de verdad del sumador completo.
Entradas Salidas
X Y Z C S
0 0 0 0 0
0 0 1 0 1
0 1 0 0 1
0 1 1 1 0
1 0 0 0 1
1 0 1 1 0
1 1 0 1 0
1 1 1 1 1
Ingeniería Computacional Diseño del Hardware.
52
Figura 10. Diagrama de lógica del sumador completo.
Ingeniería Computacional Diseño del Hardware.
7.1.1.3 Sumador paralelo binario. La suma de dos números binarios de n bits se
puede generar en serie o paralelo. El método de adición serie solo cuenta con un
sumador completo y un dispositivo de almacenamiento para guardar el acarreo de
salida. El sumador paralelo es un circuito digital que consta de circuitos
sumadores completos conectados en cascada, con el acarreo de salida de uno a la
entrada del sumador siguiente (ver figura 11). Un sumador paralelo de n bits
requiere de n sumadores completos conectados en cascada.
Figura 11. Sumador paralelo de 4 bits.
Ingeniería Computacional Diseño del Hardware.
53
Cuando el sumador se implementa en dispositivos FLEX y es configurada la opción
CARRY CHAIN el sumador requiere tantos LEs como bits de precisión se necesiten
(N), más aun LE para el acarreo de entrada y de salida de la cadena de acarreos, es
decir N+2 LEs.
7.1.1.4 Sumador-restador binario. Las operaciones de suma y resta se pueden
combinar en un circuito con un sumador común. Esta se hace incluyendo una
compuerta OR exclusiva con cada sumador completo. La entrada S controla la
operación a realizar, con S =1 realiza restas y con S =0 realiza sumas. Ver figura
12.
Figura 12. Circuito sumador-restador
Ingeniería Computacional Diseño del Hardware.
54
Los LEs cuando tienen configurada la opción CARRY CHAIN solo pueden resolver
dos funciones de 3 variables de entrada y el sumador restador requiere 4
entradas, por eso la utilización de recursos es de N bits es de 2N+2 LEs.
7.1.1.5 Lpm_add_sub. La función LPM_ADD_SUB reemplaza todas las otras
funciones de sumadores-restadores, incluyendo algunos dispositivos estándar
tales como: 7480 (sumador completo), 7482 (sumador completo binario de 2
bits), 7483 (sumador completo binario de 4 bits con acarreo rápido), 74183
(sumador dual completo con acarreo salvado), 74283 (sumador completo de 4
bits con acarreo rápido), 74385 (sumador-restador de 4 bits con clareo).
7.1.1.6 Diseño de los sumadores utilizados en el Flex51. Para diseñar los
dispositivos sumadores del FLEX51 se tuvieron en cuenta los sumadores
anteriormente mencionados; pero, se opto por escoger el sumador LPM_ADD_SUB
debido a su gran facilidad de implementación y de cambio en cualquier momento
del desarrollo del proyecto (con la ayuda de la función MegaWizard Plug-In
Manager), mientras que los demás no contaban con estas características, porque
eran muy dispendiosos en sus implementación y muy rígidos. Además es mucho
más fácil la implementación de las banderas de acarreo (carry) y desbordamiento
(overflow) para el caso del sumador ADER_A.
7.1.1.6.1 Ader_a. El dispositivo ADER_A se diseño en el entorno gráfico de
ALTERA y es propio de la ALU, posee dos entradas de datos A y B, cada una de 8
bits, una entrada cin (acarreo de entrada) y dos entradas de control (s0 y s1).
55
Tiene una salida de datos Q de 8 bits, una salida de acarreo intermedio AC, una
salida de acarreo final Co y una salida de desbordamiento OV (ver figura 13 y
tabla 3). En su interior consta de dos sumadores Sumador_A diseñados con la
función MegaWizard Plug-In Manager conectados en cascada (ver figura 15 y 16) y
controlados por las entradas s0 y s1. El dispositivo ADER_A ejecuta funciones
aritméticas tales como: Suma, Suma con acarreo y resta con préstamo (borrow).
Después de hacer un análisis en el set de instrucciones del microcontrolador 8051
se obtuvo que las entradas s0 y s1 fueran los dos bits menos significativos del
nibble alto del código de instrucción almacenado en el registro IR (bits 5 y 4). Con
la ayuda de este análisis se desarrollo la siguiente tabla que gobernará el
funcionamiento del dispositivo.
Tabla 3. Control de funcionamiento del ADER_A
S1 S0 Operación
0 0 A – B – Cin
0 1 A – B – Cin
1 0 A + B
1 1 A + B + Cin
Figura 13.Dispositivo ADER_A sumador-restador
56
En la gráfica siguiente (figura 14) se ve el número de pines de entrada y salida que
utiliza el dispositivo en el que se compila, en este caso es el EPF10K70RC240-4.
Utiliza 18 LCs (circuitos lógicos) y 0% de de memoria.
Figura 14. Sumario de compilación del dispositivo ADER_A.
El retardo mas crítico es de 59.2ns dado en la salida Co y proveniente de la
entrada Ci.
Figura 15. Dispositivo diseñado con la función MegaWizard Pulg-In Manager
Sumador_A.
57
Figura 16. Diagrama esquemático del ADER_A.
La lógica de control del acarreo de entrada que gobierna este dispositivo se
conforma por las compuertas AND de tres entradas, la OR y OR negada y las
entradas S0 y Cin. La entrada S1 se conecta a las entradas de selección de
operación de los dispositivos Sumador_A. Los sumadores-restadores se conectan
en cascada. La tabla muestra las combinaciones de S0 y S1 para elegir las
operaciones, esta tabla se hizo después realizar un análisis en el set de
instrucciones del microcontrolador 8051 y encontrar un patrón en los bits 5 y 4
del código de operación.
7.1.1.6.2 Sumagu. El dispositivo SUMAGU se diseño por medio la función
MegaWizard Plug-In Manager de ALTERA y es propio de la AGU (ver figura 17).
58
Consta de dos entradas, cada una de 16 bits y una salida también de 16 bits. Este
dispositivo es un simple sumador, y es usado para las instrucciones de salto. El
dato que llega a la entrada B es un dato arreglado, puesto que en la parte alta
todos pueden ser unos o ceros dependiendo hacia donde se ejecute el la salto y la
parte baja corresponde al bus de datos.
Figura 17. Dispositivo diseñado con la función MegaWizard Pulg-In Manager
Sumagu.
7.1.2 Multiplicadores. La multiplicación de números binarios se realiza en la
misma forma que con números decimales. El multiplicando se multiplica por cada
bit del multiplicador, empezando desde el bit menos significativo. Cada
multiplicación de esta forma arroja un producto parcial. Los productos parciales
sucesivos se desplazan una posición a la izquierda. El producto final es obtenido
de la suma de los productos parciales.
7.1.2.1 Multiplicador serie. El multiplicador serial es útil cuando para realizar una
operación de multiplicación, el multiplicador MR es conocido en forma paralela,
en tanto el multiplicando MO ingresa de manera serial (ver figura 18). El producto
59
de cada bit de MR por MO es realizado usando N funciones AND. El resultado de
cada producto parcial es sumado, mediante una cadena de sumadores seriales, al
resultado acumulado hasta entonces y desplazado a la derecha. La primera etapa
no recibe acarreos anteriores, por eso se usa un FFD. La salida del sumador serial
menos significativo RES corresponde al producto. Es necesario generar 2xN-1
ciclos de reloj, durante los N primeros se ingresa MO (Primero el menos
significativo) y después 0 para limpiar las etapas de acarreo salvado. Además todo
el circuito requiere 2N-1 LEs.
Figura 18. Multiplicador serial sin signo.
7.1.2.2 Multiplicador paralelo de n bits basado en arreglos de sumadores con
acarreo propagado. El multiplicador basado en un arreglo de sumadores de
acarreo propagado es una primera aproximación a la implementación del
algoritmo de sumas sucesivas y desplazamientos, tiene como característica
transferir la propagación del acarreo a la siguiente suma parcial en la fila hasta
terminar los productos de esa fila, en donde el acarreo generado se propaga al
60
último producto de la fila siguiente de productos parciales. Esto continua hasta
que la multiplicación esta realizada. El bloque principal es un sumador completo
de un bit. Veamos la siguiente figura.
Figura 19. Multiplicador de 4 bits basado en sumadores con acarreo propagado.
Curso diseño de sistemas digitales avanzados
7.1.2.3 Multiplicador paralelo de n bits basado en arreglos de sumadores con
acarreo salvado. También conocido como el multiplicador de Braun, es una
segunda aproximación para implementar el algoritmo de sumas sucesivas y
desplazamientos. Lo que se pretende es reducir el retardo de cada suma, para que
la operación se realice más rápido. Este multiplicador permite salvar el acarreo
generado en las sumas parciales y transferirlo como acarreo de entrada a la
siguiente suma parcial de la siguiente fila de sumas parciales. Veamos un ejemplo
en la siguiente figura..
61
Figura 20. Multiplicador de 4 bits basado en sumadores con acarreo salvado.
Curso diseño de sistemas digitales avanzados
7.1.2.4 Multiplicador de Wallace. Es una variante del algoritmo de sumas
sucesivas y desplazamientos, donde se usan bloques de sumadores completos
con tres entradas recibiendo productos y generando un termino que se agrega en
otro termino suma. Veamos un ejemplo en la siguiente figura.
Figura 21. Multiplicador de Wallace de 4 bits.
Diseño de multiplicadores paralelos de 16 bits en FPGAs.
62
7.1.2.5 Multiplicador Parametrizado: Megafunción Lpm_mult. La megafunción
LPM_MULT reemplaza algunas de las funciones de multiplicación anteriores, e
incluyendo algunos dispositivos estándar tales como: 7497 (multiplicador
síncrono de 6 bits), 74261 (multiplicador paralelo binario de 2 bits), 74284
(multiplicador paralelo binario de 4 bits por 4 bits y resultado los 4 bits más
altos), 74285 (multiplicador paralelo binario de 4 bits por 4 bits y resultado los 4
bits más bajos).
7.1.2.6 Multiplicador paralelo basado en el algoritmo de Booth Este algoritmo
presenta dos ventajas, una ventaja es la unificación de los multiplicadores tanto
de números binarios positivos como de negativos de n bits; y la otra es que logra
cierta eficacia con respecto al número de productos parciales generados, cuando
tiene bloques grandes de unos. Veamos la estructura básica en la figura 22 y el
multiplicador como tal en la figura 23.
Este algoritmo se basa en que existen varias formas calcular un producto usando
la suma y resta, por tal motivo si se tiene una ALU que pueda sumar o restar se
podría obtener el mismo resultado.
63
Figura 22. Celda básica de control.
Diseño de multiplicadores paralelos de 16 bits en FPGAs.
Figura 23. Multiplicador de Booth.
Diseño de multiplicadores paralelos de 16 bits en FPGAs.
7.1.2.7 Multiplicador de Baugh-Wooley. Este multiplicador permite realizar
multiplicaciones de números con signo utilizando la representación de
64
complemento a dos. Se basa en arreglos de sumadores de acarreo salvado. Ver
figura 24.
Figura 24. Multiplicador de Baugh-Wooley de 4 bits.
Diseño de multiplicadores paralelos de 16 bits en FPGAs.
7.1.2.8 Resultados de optimización de multiplicadores paralelos. En esta sección,
se muestran los resultados de simulación para los diferentes multiplicadores
paralelos obtenidos en trabajos desarrollados por el grupo de Bioelectrónica y
Nanoelectrónica de la Universidad del Valle; el dispositivo utilizado es el
EPF10K70RC240-4 de la tarjeta UP2 de Altera. Veamos las tablas 4, 5, 6 y 7.
65
Tabla 4. Multiplicadores paralelos optimizados por velocidad usando MAX+plus II.
Diseño de multiplicadores paralelos de 16 bits en FPGAs.
Tabla 5. Multiplicadores paralelos optimizados por área usando MAX+plus II.
Diseño de multiplicadores paralelos de 16 bits en FPGAs.
66
Tabla 6. Multiplicadores paralelos optimizados por velocidad usando QUARTUS II
versión 3.
Diseño de multiplicadores paralelos de 16 bits en FPGAs.
Tabla 7. Multiplicadores paralelos optimizados por área usando QUARTUS II
versión 3.
Diseño de multiplicadores paralelos de 16 bits en FPGAs.
Se puede ver los multiplicadores más rápidos como los el desarrollado por Mega
Función y el multiplicador Pipeline son los que necesitan mayores recursos y
67
generan más potencia, mientras que multiplicadores como el de Wallace y el de
carry salvado necesitan mucho menos recursos, pero no igualan las velocidades .
7.1.2.9 Diseño del multiplicador del Flex51. Para diseñar el dispositivo
multiplicador del FLEX51 se tuvo en cuenta la velocidad de funcionamiento, la
facilidad de implementación, cambios y prueba de errores. Por tal motivo se opto
por diseñar el multiplicador con ayuda de la función MegaWizard Plug-In Manager
de ALTERA (ver figura 25), ya que el dispositivo sería rápido en su funcionamiento
por ser un dispositivo parametrizado y de entradas paralelas; es mucho más fácil
de implementar que uno de los multiplicadores paralelos antes mencionados.
Aunque el multiplicador serial ocupaba mucho menos espacio en la FLEX10K
necesitaba muchos ciclos de reloj para su funcionamiento y otros dispositivos que
le ayudasen a entrar los datos serialmente y a sacarlos paralelo. El dispositivo
multiplicador consta de dos entradas de 8 bits y una salida de 16 bits.
Figura 25. Dispositivo diseñado con la función MegaWizard Plug-In Manager
Multiplicador.
68
7.1.3 Divisores. En esta sección se hablará de algunas de las arquitecturas de
divisores que existen y por cual de ellos se opto.
7.1.3.1 Divisor basado en restas y desplazamientos. La división binaria más
simple está basada en el método tradicional de restas y desplazamientos, la idea
básica es comparar el dividendo reducido con los múltiplos del divisor para
determinar cuál múltiplo del divisor desplazado se restará.
7.1.3.2 Divisor con restauración de 2N-N bits. Su algoritmo es el siguiente, dados
dos enteros N y D tal que N < D, existirán dos enteros únicos Q y R que satisfacen
la ecuación:
RBQN +=2
La propiedad que fundamenta la utilización de este algoritmo es el reflejo de la
propiedad N < D al residuo y divisor (R < D), Figura 26. El circuito es
implementado a partir de un restador completo y un multiplexor de 2 a 1(Figura
27).
69
Figura 26. Arreglo del divisor con restauración para N =4 bits.
Curso diseño de sistemas digitales avanzados
Figura 27. Celda básica para el arreglo del divisor con restauración.
Curso diseño de sistemas digitales avanzados
70
7.1.3.3 Divisor sin restauración 2N-N bits. Dados dos enteros N y D tal que –D ≤
N < D, entonces existirán dos enteros únicos Q y R que satisfacen la ecuación:
RBBQDN ++=+ 222
La principal condición para este algoritmo es que los dos números deben ser
enteros positivos (0 ≤ N < D) (ver figura 28). La celda básica es un sumador-
restador con la señal C como señal de control del tipo de operación. Ver figura 29.
Figura 28. Arreglo divisor sin restauración con N =4 bits.
Curso diseño de sistemas digitales avanzados
71
Figura 29. Celda básica para el arreglo del divisor sin restauración.
Curso diseño de sistemas digitales avanzados
7.1.3.4 Lpm_divide. La Mega función LPM_DIVIDE toma un numerador y un
denominador y computa un cociente y un residuo.
7.1.3.5 Diseño del divisor del Flex51. Para diseñar el dispositivo divisor del
FLEX51 se tuvo en cuenta la velocidad de funcionamiento, la facilidad de
implementación, cambios y prueba de errores. Por tal motivo se opto por diseñar
el divisor con ayuda de la función MegaWizard Plug-In Manager de ALTERA, ya
que el dispositivo sería rápido en su funcionamiento y más fácil de implementar
que uno de los divisores antes mencionados, debido a que solo es parametrizar
uno valores necesarios. Los divisores no escogidos son muy dispendiosos y de
muchísimo cuidado, ya que por ser diseños de muchos dispositivos en su interior
al menor descuido se tendría resultados no esperados, no obstante el diseño de la
manera elegida es un poco más seguro. El divisor consta de dos entradas de 8
bits (numerador y denominador) y dos salidas de 8bits (cociente y residuo). Ver
figura 30.
72
Figura 30. Dispositivo diseñado con la función MegaWizard Plug-In Manager
Divisor.
7.2 DECODIFICADORES
Las cantidades discretas de información se representan con códigos binarios. Un
decodificador es un circuito combinatorio que convierte información binaria de n
entradas codificadas a un máximo de n2 salidas únicas. Todos los
decodificadores que se utilizaron el FLEX51 fueron desarrollados en lenguaje
VHDL, debido la facilidad de su diseño, dado a que para todos los casos un
decodificador de tipo estándar hubiera sido muy grande o muy pequeño, no
obteniendo así un diseño óptimo.
7.2.1Dec2to4. Este dispositivo desarrollado en VHDL es un decodificador de 2 a 4
con señal de habilitación (ver figura 31). Consta de una entrada de control de 2
bits S[1..0] y una entrada de habilitación E; una salida de 4 bits D[3..0]. El
dispositivo DEC2TO4 se usa en la ALU y en la AGU (más adelante se mostrará que
función especifica cumple en dichas unidades). Para ver su código referirse al
anexo A.
73
Figura 31. Dispositivo diseñado en lenguaje de descripción hardware VHDL
DEC2TO4.
Su tabla de verdad es la siguiente:
Tabla 8. Tabla de verdad del DEC2TO4
E S1 S0 D[3..0]
0 0 0 0000
0 0 1 0000
0 1 0 0000
0 1 1 0000
1 0 0 0001
1 0 1 0010
1 1 0 0100
1 1 1 1000
7.2.2 Dec2to4h. Este dispositivo desarrollado en VHDL es un decodificador de 2 a
4 sin señal de habilitación (ver figura 32). Consta de una entrada de control de 2
bits S[1..0] y una salida de 4 bits D[3..0]. El dispositivo DEC2TO4H se usa en la
AGU (más adelante se mostrará que función especifica cumple en dicha unidad).
Para ver su código referirse al anexo A.
74
Figura 32. Dispositivo diseñado en lenguaje de descripción hardware VHDL
DEC2TO4H.
Su tabla de verdad es la siguiente:
Tabla 9. Tabla de verdad del DEC2TO4H
S1 S0 D[3..0]
0 0 0001
0 1 0010
1 0 0100
1 1 1000
7.2.3 Decod127. Este dispositivo desarrollado en VHDL es un decodificador de 8 a
21 sin señal de habilitación. Consta de una entrada de control de 8 bits S[7..0] y
una salida de 21 bits D[20..0] (ver figura 33). El dispositivo DECOD127 es el
decodificador de la zona de registros de funciones especiales, su entrada proviene
de la parte baja del bus de direcciones. Para ver su código referirse al anexo A.
75
Figura 33. Dispositivo diseñado en lenguaje de descripción hardware VHDL
DECOD127.
Su tabla de verdad es la siguiente:
Tabla 10. Tabla de verdad del DECOD127.
SEL[7..0] S[20..0]
11100000 000000000000000000001
11110000 000000000000000000010
10000011 000000000000000000100
10000010 000000000000000001000
10101000 000000000000000010000
10111000 000000000000000100000
10000000 000000000000001000000
10010000 000000000000010000000
10100000 000000000000100000000
10110000 000000000001000000000
11010000 000000000010000000000
10011001 000000000100000000000
10011000 000000001000000000000
76
10000001 000000010000000000000
10001000 000000100000000000000
10001100 000001000000000000000
10001101 000010000000000000000
10001010 000100000000000000000
10001011 001000000000000000000
10001001 010000000000000000000
10010111 100000000000000000000
Para cualquier otra opción. 000000000000000000000
7.2.4 Decint. Este dispositivo desarrollado en VHDL es un decodificador de 5 a 4
con señal de clareo y salida en nivel bajo (ver figura 34). Consta de una entrada de
control de 5 bits S[5..0] y una salida de 4 bits D[4..0]. El dispositivo DECINT es un
decodificador que cumple unas funciones de selección muy especiales y es
utilizado en la unidad de interrupciones (más adelante se mostrará que función
especifica cumple en dicha unidad).. Para ver su código referirse al anexo A.
Figura 34. Dispositivo diseñado en lenguaje de descripción hardware VHDL
DECINT.
77
Su tabla de verdad es la siguiente:
Tabla 11. Tabla de verdad del DECINT.
C S[5..0] D[3..0]
0 000000 11111
0 000011 11111
0 001011 11111
0 010011 11111
0 011011 11111
0 100011 11111
1 000000 11111
1 000011 11110
1 001011 11101
1 010011 11011
1 011011 10111
1 100011 01111
1 Para cualquier otra opcion 11111
7.3 MULTIPLEXORES
Un multiplexor es un circuito combinatorio que selecciona información binaria de
una de muchas líneas de entrada y la dirige a una sola línea de salida. La selección
una de entrada en particular es controlada por un conjunto de variables de
selección. Normalmente hay n2 líneas de entrada y n variables de selección cuyas
combinaciones de bits determinan que entrada se selecciona. Los multiplexores
78
que se utilizan en el FLEX51 fueron desarrollados de dos maneras diferentes,
unos se diseñaron en lenguaje VHDL en editor de ALTERA y otros se diseñaron
con la ayuda de la función MegaWizard Pulg-In Manager de ALTERA.
7.3.1 Mux1of2_8b. Este dispositivo desarrollado en VHDL es un multiplexor que
consta de una entrada de control de S, dos entradas de datos A y B de 8 bits y una
salida Q de 8 bits (ver figura 35). El dispositivo MUX1OF2_8B se usa en la ALU
(más adelante se mostrará que función especifica cumple en dicha unidad).. Para
ver su código referirse al anexo A.
Figura 35. Dispositivo diseñado en lenguaje de descripción hardware VHDL
MUX1OF2_8B.
7.3.2 Mu3. Este dispositivo se desarrolló con ayuda de la función MegaWizard
Plug-In Manager de ALTERA. Es un multiplexor que consta de una entrada de
control de Sel de 2 bits, cuatro entradas de datos de 8 bits y una salida de datos
de 8 bits. El dispositivo MU3 se usa en la AGU (más adelante se mostrará que
función especifica cumple en dicha unidad). Se desarrolló con ayuda de esta
función por su facilidad de diseño y adaptación a cambios.
79
Figura 36. Dispositivo diseñado con la función MegaWizard Plug-In Manager Mu3.
7.3.3 Mbit. Este dispositivo se desarrolló con ayuda de la función MegaWizard
Plug-In Manager de ALTERA. Es un multiplexor que consta de una entrada de
control SEL de 1 bit, dos entradas de datos de 1 bit y una salida de datos de 1 bit.
El dispositivo MBIT se usa en la Unidad de Temporizadores (más adelante se
mostrará que función especifica cumple en dicha unidad). Se desarrolló con ayuda
de esta función por su facilidad de diseño y adaptación a cambios.
Figura 37. Dispositivo diseñado con la función MegaWizard Plug-In Manager Mu3.
7.3.4 MUXPREES. Este dispositivo se desarrolló con ayuda de la función
MegaWizard Plug-In Manager de ALTERA. Es un multiplexor que consta de una
entrada de control de Sel de 1 bit, siete entradas de datos de 1 bit y una salida de
80
datos de 1 bit. El dispositivo MUXPREES se usa en el dispositivo PREESCALER (más
adelante se mostrará que función especifica cumple en dicha unidad).
Figura 38. Dispositivo diseñado con la función MegaWizard Plug-In Manager
MUXPREES.
81
8. REGISTROS Y CONTADORES
A continuación veremos los dispositivos slip-flops implementados en el
microcontrolador embebido FLEX51.
8.1 FLIP-FLOPS
Los flip-flops son fundamentales porque, en su ausencia, el circuito tan solo sería
un circuito netamente combinatorio. Un circuito con flip-flops se considera un
circuito secuencial. En el FLEX51 se puede observar el diseño de dos flip-flops
síncronos.
8.1.1 Ffd. Flip-flop síncrono diseñado en lenguaje de descripción hardware VHDL,
es un flip-flop de transición de alto a bajo, con entrada de clareo (ver figura 39).
Se usa en la unidad de interrupciones (más adelante se mostrará que función
especifica cumple en dicha unidad). Para ver su código referirse al anexo A.
Figura 39. Dispositivo diseñado en lenguaje de descripción hardware VHDL FDD.
82
8.1.2 Ffd1. Flip-flop síncrono diseñado en lenguaje de descripción hardware
VHDL, es un flip-flop de transición de bajo a alto, con entrada de clareo (ver
figura 40). Se usa en la unidad de interrupciones (más adelante se mostrará que
función especifica cumple en dicha unidad). Para ver su código referirse al anexo
A.
Figura 40. Dispositivo diseñado en lenguaje de descripción hardware VHDL FDD1.
8.2 REGISTROS
Un registro es un grupo de flip-flops, cada uno de los flip-flops es capaz de
almacenar un bit de información. Un registro de n bits tiene un grupo de n flip-
flops y puede almacenar cualquier información binaria de n bits.. A continuación
veremos los registros que se implementaron el diseño del FLEX51.
8.2.1 Reg8b. Este dispositivo fue diseñado en VHDL y es el registro más básico
del FLEX51, además es el punto de partida de varios otros dispositivos
(std_reg8b22, STD_REG8B1 y std_reg8b2) (ver figura 41). Consta una entrada de
reloj, una de carga L de 1 bit, una de clareo C de 1 bit y 1 de datos D de 8 bits.
Tiene una salida Q de 8 bits. Este dispositivo es usado en la ALU, la AGU, BANREG
y es justamente el registro usado para hacer de registro IR (más adelante se
83
mostrará que función especifica cumple en dichas unidades). Para ver su código
referirse al anexo A.
Figura 41. Dispositivo diseñado en lenguaje de descripción hardware VHDL
REG8B.
8.2.2 Std_regb8b2. El dispositivo STD_REG8B2 se diseño en el entorno gráfico de
ALTERA y es usado dentro del dispositivo BANREG y la Unidad AGU (en la sección
10 se presentará su funcionamiento). Posee cuatro entradas de 1 bit (una entrada
de carga de dato SLOAD, una entrada de clareo SCLR, una entrada de reloj CLK y
una entrada de habilitación de salida OC), una entrada de D de 8 bits y una salida
Q de 8 bits. La entrada OC habilita el dispositivo tri-estados que se tiene en la
salida dejando así colocar datos en el bus. En su interior consta de registro REG8B
y un dispositivo TRI. Ver figura 42 y 43.
Figura 42. Dispositivo STD_REG8B2.
84
Figura 43. Diagrama esquemático del STD_REG8B2.
Este dispositivo es un arreglo del registro REG8B, puesto que se adicionó un
dispositivo TRI, para hacer que la salida sea tri-estados y puede ser conectada al
bus.
8.2.3 Std_reg8b22. El dispositivo STD_REG8B22 se diseño en el entorno gráfico de
ALTERA y es usado dentro de la Unidad ALU, Unidad de interrupciones y Unidad
de temporizadores (más adelante se mostrará que función especifica cumple en
dichas unidades). Posee cuatro entradas de 1 bit (una entrada de carga de dato
SLOAD, una entrada de clareo SCLR, una entrada de reloj CLK y una entrada de
habilitación de salida OC), una entrada de D de 8 bits y dos salidas Q y Q1 de 8
bits. La entrada OC habilita el dispositivo tri-estados que se tiene en la salida Q
dejando así colocar datos en el bus de Datos, la salida Q1 no posee dispositivos
tri-estados. En su interior consta de un registro REG8B y un dispositivo TRI. Ver
figura 44 y 45.
85
Figura 44. Dispositivo STD_REG8B22.
Figura 45. Diagrama esquemático del STD_REG8B22.
La función de este dispositivo es proveer una salida tri-estados para ser
conectada al bus de datos y una salida normal para ser utiliza en distintas
operaciones donde se necesite tener el dato sin requerir del bus.
8.2.4 Std_reg8b1. El dispositivo STD_REG8B1 se diseño en el entorno gráfico de
ALTERA y es usado dentro de la Unidad AGU. Posee cinco entradas de 1 bit (una
entrada de carga de dato SLOAD, una entrada de clareo SCLR, una entrada de reloj
CLK, dos entradas de habilitación de salida OC y ETL), una entrada D de 8 bits y
dos salidas Q y TMPLDATO de 8 bits. La entrada OC habilita el dispositivo tri-
86
estados (TRI) que se tiene en la salida Q dejando así colocar datos en el bus de
direcciones en la parte baja y la entrada ETL habilita el dispositivo tri-estados
(TRI) en la salida TMPLDATO dejando así colocar datos en el bus de datos, este
registro es justamente el registro temporal bajo de la AGU. En su interior consta
de registro REG8B y dos dispositivos TRI. Ver figura 46 y 47.
Figura 46. Dispositivo STD_REG8B1.
Figura 47. Diagrama esquemático del STD_REG8B1.
87
Este dispositivo es un arreglo del registro REG8B, puesto que se adicionaron dos
dispositivos TRI, para hacer que las salidas sean tri-estados y puede ser
conectada al bus de direcciones y de datos.
8.2.5 Reg8bpsw. El dispositivo REG8BPSW se diseño en VHDL y forma parte de un
dispositivo llamado PSW, que veremos en el capitulo 10 con detenimiento. Cuenta
con once entradas de 1 bit (una entrada de clareo CL, una entrada de reloj CLK,
una entrada de carga de datos L, una entrada de paridad P, acarreo C, acarreo
intermedio AC, desbordamiento OV y sus respectivas entradas de carga LP, LC,
LAC, LOV), dos entradas D y R de 8 bits (D es la entrada de datos y R una entrada
de retroalimentación). Tiene una salida Q de 8 bits. Ver figura 48. Para ver su
código referirse al anexo A.
Figura 48. Dispositivo diseñado en lenguaje de descripción hardware VHDL
REG8BPSW.
8.2.6 Regtcon. Este dispositivo se diseño en VHDL y forma parte de un dispositivo
llamado TCON, que veremos con detenimiento en el capitulo 10. Tiene siete
88
entradas de 1 bit (una entrada de carga L, una entrada de clareo C, una entrada de
reloj CLK, una entrada de la bandera de interrupción del temporizador 0, una
entrada de la bandera de interrupción del temporizador 1, una entrada de la
bandera de interrupción externa 0 y una entrada de la bandera de interrupción
externa 1), dos entradas D y R de 8 bits (D es la entra de datos y R la entrada de
retroalimentación). Tiene una salida Q de 8 bits. Ver figura 49. Para ver su código
referirse al anexo A.
Figura 49 Dispositivo diseñado en lenguaje de descripción hardware VHDL
REGTCON.
8.2.7 Regscon. Este dispositivo se diseño en VHDL y forma parte de un dispositivo
llamado SCON, que veremos con detenimiento en el capitulo 10. Tiene cinco
entradas de 1 bit (una entrada de carga L, una entrada de clareo C, una entrada de
reloj CLK, una entrada de la bandera de interrupción de transmisión serial TI y una
entrada de la bandera de interrupción de recepción serial RI), dos entradas D y R
de 8 bits (D es la entra de datos y R la entrada de retroalimentación). Tiene una
salida Q de 8 bits. Ver figura 50. Para ver su código referirse al anexo A.
89
Figura 50. Dispositivo diseñado en lenguaje de descripción hardware VHDL
REGSCON.
8.2.8 Reg8btrans. Este dispositivo se diseño en VHDL y forma parte de un
dispositivo llamado TRASMISION, que veremos más adelante. Tiene tres entradas
de 1 bit (una entrada de carga L, una entrada de corrimiento E, una entrada de
reloj CLK, una entradas de datos D 8 bits. Tiene una salida OU de 1 bit para la
transmisión serial (ver figura 51). La carga de los datos es asíncrona y el
desplazamiento es sincrono, esto se debe a que no utiliza el reloj global, sino una
señal que proviene del dispositivo generador de rata de baudio BAUDRATE que
posee una frecuencia diferente. Para ver su código referirse al anexo A.
Figura 51. Dispositivo diseñado en lenguaje de descripción hardware VHDL
REG8BTRANS.
90
8.2.9 Reg8brepc. Este dispositivo se diseño en VHDL totalmente sincrono y forma
parte de un dispositivo llamado RECEPCION, que veremos más adelante. Tiene
tres entradas de 1 bit (una entrada de datos seriales INT, una entrada de
corrimiento E, una entrada de reloj CLK. Tiene una salida Q de 10 bits para la
transmisión serial (ver figura 52). No utiliza el reloj global, sino la señal que
proviene del dispositivo PREESCALER, la señal de corrimiento la da la salida del
BAUDRATE. Para ver su código referirse al anexo A.
Figura 52. Dispositivo diseñado en lenguaje de descripción hardware VHDL
REG8BREPC.
8.3 CONTADORES
Los contadores, son máquinas de estado sincronas. Poseen un total de n2
estados. Donde n es el número de bits en su salida y el número de flip-flops de
contador. El contador recorrerá cada de sus estados en cada pulso de reloj.
8.3.1 Cont_reg8b. Este dispositivo fue desarrollado en VHDL, es un contador que
lo encontramos en los dispositivos PC y DPTR. Consta de una entrada de datos A
de 8 bits, una entrada de carga de datos L, una entrada de clareo C, una entrada
de habilitación de conteo E y una entrada de reloj CLK. Tiene una salida de datos
91
Q de 8 bits y una salida de desbordamiento M. Ver figura 53. Para ver su código
referirse al anexo A.
Figura 53. Dispositivo diseñado en lenguaje de descripción hardware VHDL
CONT_REG8B.
Figura 54. Sumario de compilación del dispositivo CONT_REG8B.
La frecuencia máxima de este dispositivo compilado en un EPF10K70RC240-4 es
125MHz, con un retardo máximo de 23.4ns en la salida M.
8.3.2 Reg_sp. Este dispositivo fue desarrollado en VHDL, es el registro SP de la
zona de registros de funciones especiales; pero, por su comportamiento dentro
del FLEX51 se catalogó como contador; lo encontramos dentro de la unidad AGU.
Consta de una entrada de datos A de 8 bits, una entrada de carga de datos L, una
entrada de clareo C, una entrada de habilitación de conteo E, una entrada de
92
selección de operación S (incremento con S =0 y decremento con S =1) y una
entrada de reloj CLK. Tiene una salida de datos Q de 8 bits. Ver figura 55. Para ver
su código referirse al anexo A.
Figura 55. Dispositivo diseñado en lenguaje de descripción hardware VHDL
REG_SP.
Figura 56. Sumario de compilación de dispositivo REG_SP.
8.3.3 Pc0. Este dispositivo contador fue diseñado con ayuda la función
MegaWizard Plug-In Manager de ALTERA. PC0 es el contador que hace las veces
de registro TL0 y TL1 de la zona de registros de funciones especiales y lo
encontramos en la Unidad de temporizadores. Consta de cuatro entradas de 1 bit
(una entrada de clareo SCLR, una entrada de carga SLOAD, una entrada de reloj
CLK y una entrada de habilitador de conteo cnt_en) y una entrada de datos de 8
93
bits. Tiene una salida desbordamiento cout de 1 bit y una de datos de 8 bits (ver
figura 57).
Figura 57. Dispositivo diseñado con la función MegaWizard Plug-In Manager PC0.
8.3.4 Pc1. Este dispositivo contador fue diseñado con ayuda la función
MegaWizard Plug-In Manager de ALTERA. PC1 es el contador que hace las veces
de registro TH0 y TH1 de la zona de registros de funciones especiales y lo
encontramos en la Unidad de temporizadores. Consta de cinco entradas de 1 bit
(una entrada de clareo SCLR, una entrada de carga SLOAD, una entrada de reloj
CLK, una entrada de acarreo Cin y una entrada de habilitador de conteo cnt_en) y
una entrada de datos de 8 bits. Tiene una salida desbordamiento cout de 1 bit y
una de datos de 8 bits (ver figura 58).
94
Figura 58. Dispositivo diseñado con la función MegaWizard Plug-In Manager PC1.
8.3.5 Inc_dec. Este contador se encuentra dentro del dispositivo de incremento y
decremento de la unidad ALU. Fue desarrollado en lenguaje VHDL. Tiene una
entrada de datos A de 8 bits, una entrada de selección de operación S y una salida
Q de 8 bits (ver figura 59). Para ver el sumario de compilación ver figura 60 y para
ver su código referirse al anexo A.
Figura 59. Dispositivo diseñado en lenguaje de descripción hardware VHDL
INC_DEC.
Figura 60. Sumario de compilación de dispositivo INC_DEC.
95
Cuenta con un retardo máximo de 25.6ns.
8.3.6 Contbaudrate. Este contador se encuentra dentro del dispositivo
TRANSMISION de la unidad de transmisión serial. Fue desarrollado en lenguaje
VHDL debido a que necesitaba cumplir unas condiciones que uno parametrizado
no podía cumplir. Tiene una entrada de datos A de 1 bit, una entrada de
habilitación de conteo E, una entrada de clareo C asíncrono, una entrada de reloj
CLK y una salida M de 1 bits (ver figura 61). Este contador tiene un valor
predeterminado “1011” en su código para que cuando llegue a él se reinicie el
conteo y se ponga en alto la salida de M. Para ver el sumario de compilación ver
figura 62 y para ver su código referirse al anexo A.
Figura 61. Dispositivo diseñado en lenguaje de descripción hardware VHDL
CONTBAUDRATE.
Figura 62. Sumario de compilación de dispositivo CONTBAUDRATE.
96
La frecuencia máxima de este dispositivo compilado en un EPF10K70RC240-4 es
106.38MHz, con un retardo máximo de 19.3ns.
8.3.7 Contbaudrate1. Este contador se encuentra dentro del dispositivo
RECEPCION de la unidad de transmisión serial. Fue desarrollado en lenguaje VHDL
debido a que necesitaba cumplir unas condiciones que uno parametrizado no
podía cumplir. Tiene una entrada de datos A de 1 bit, una entrada de habilitación
de conteo E, una entrada de clareo C asíncrono, una entrada de reloj CLK y una
salida M de 1 bits (ver figura 63). Este contador tiene un valor predeterminado
“1010” en su código para que cuando llegue a él se reinicie el conteo y se ponga
en alto la salida de M. Para ver el sumario de compilación ver figura 64 y para ver
su código referirse al anexo A.
Figura 63. Dispositivo diseñado en lenguaje de descripción hardware VHDL
CONTBAUDRATE1.
Figura 64. Sumario de compilación de dispositivo CONTBAUDRATE1.
97
La frecuencia máxima de este dispositivo compilado en un EPF10K70RC240-4 es
106.38MHz, con un retardo máximo de 19.3ns.
8.3.8 CONT_REG6B. Este dispositivo fue desarrollado en VHDL, es un contador
que lo encontramos en los dispositivos PC y DPTR. Consta de una entrada de
clareo C, una entrada de reloj CLK y una salida de datos Q de 6 bits (ver figura
65). Para ver su código referirse al anexo A. El CONT_REG6B se utiliza en el
dispositivo PREESCALER.
Figura 65. Dispositivo diseñado en lenguaje de descripción hardware VHDL
CONT_REG6B.
Figura 66. Sumario de compilación de dispositivo CONT_REG6B.
La frecuencia máxima de este dispositivo compilado en un EPF10K70RC240-4 es
106.38MHz, con un retardo máximo de 17.4ns.
98
9. MEMORIA
La unidad de memoria es un dispositivo al cual se transfiere información binaria
para su almacenamiento y de la cual se puede obtener información cuando sea
necesaria para ser procesarla. La unidad de memoria almacena información en
grupos de bits llamados palabras. Existen dos tipos de memorias que se
comunican directamente con la unidad central de procesamiento: La memoria de
acceso aleatorio (RAM) y la memoria de solo lectura (ROM).
Cada dispositivo FLEX10K contiene un arreglo embebido para implementar
memoria y funciones lógicas especializadas. Los arreglos embebidos consisten en
una serie de EABs (bloque flexible de RAM). Cuando implementamos funciones de
memoria, cada EAB provee 2048 bits, con lo cual puede ser usado para crear
memoria RAM, memoria ROM y RAM de puerto dual, o funciones tipo FIFO (el
primero en entrar es el primero en salir).
Cuando es usado como RAM, cada EAB puede ser configurada en alguno de estos
tamaños: 256x8, 512x4, 1024x2, o 2048x1.
99
9.1 MEMORIA DE ACCESO ALEATORIO (RAM)
La memoria de acceso aleatorio o RAM puede aceptar nueva información para ser
almacenada y quedar disponible para utilizarse después. La memoria puede
realizar operaciones de lectura y escritura.
9.1.1 Diseño de la memoria ram del Flex51. La memoria RAM del FLEX51 se
diseño con ayuda de la función MegaWizard Plug-In Manager de ALTERA, tiene
una entrada de datos de 8 bits, una entrada de escritura We, una entrada de
direcciones de 8 bits y una entrada de reloj inclock. Posee una salida Q de 8 bits
(ver figura 67). Se desarrollo este dispositivo con la función de ALTERA debido a
su gran facilidad de implementación, puesto que no se debe desarrollar un
algoritmo que cumpla todas las funciones requeridas.
Figura 67. Dispositivo diseñado con la función MegaWizard Plug-In Manager
RDAM.
9.2 MEMORIA DE SOLO LECTURA (ROM)
Una memoria de solo lectura (ROM) es básicamente un dispositivo de memoria en
el cual se almacena información binaria permanente. Esta información debe ser
100
especificada por el diseñador y después incorporada en la unidad para formar el
patrón de interconexión requerido.
9.2.1 Diseño de la memoria rom del Flex51. La memoria ROM del FLEX51 se
diseño con ayuda de la función MegaWizard Plug-In Manager de ALTERA, tiene
una entrada de datos de 8 bits, una entrada de escritura We, una entrada de
direcciones de 8 bits y una entrada de reloj inclock. Posee una salida Q de 8 bits
(ver figura 68). Se desarrollo este dispositivo con la función de ALTERA debido a
su gran facilidad de implementación, puesto que no se debe desarrollar un
algoritmo que cumpla todas las funciones requeridas.
Figura 68. Dispositivo diseñado con la función MegaWizard Plug-In Manager
MEMPROG.
101
10. DISEÑO DEL FLEX51
Como partida de cualquier diseño se debe plantear cual es el punto al que se
desea llegar, como nuestro caso es el implementar un microcontrolador embebido
en una FPGA que sea compatible con el set de instrucciones del microcontrolador
8051, lo primero que se hará en esta sección es hablar de forma general sobre el
microcontrolador 8051, y su set de instrucciones, luego se procederá de forma
general del microcontrolador en bloques y por ultimo se verá ya de forma
detallada.
10.1 MICROCONTROLADOR 80C31/80C51/80C57
El Philips 80C31/80C51/87C51 es un microcontrolador de alto desempeño
fabricado con tecnología CMOS de alta densidad. La tecnología Philips CMOS
combina las características de velocidad y densidad de HMOS con los atributos de
baja potencia de CMOS.
El 8XC51 contiene 4k x 8 ROM (80C51) EPROM (87C51), 128 x 8 RAM, 32 líneas
de entrada y salida, dos contadores/temporizadores de 16 bits, cinco fuentes de
interrupciones, dos niveles de prioridad para abordar la estructura de
interrupciones, canal serial full duplex, cinco rangos de velocidad a VCC= 5V
(12MHz, 16MHz, 24MHz y 33MHz), un circuito de reloj y oscilador.
102
Figura 69. Símbolo lógico.
Data Sheet 80c31, 80c51, 87c51 CMOS single-chip 8 bit microcontrollers.
A continuación veremos el diagrama de bloques del 80C51 en la figura 70 y los
modos de direccionamiento que utiliza en la tabla 12.
103
Figura 70. Diagrama de Bloques.
80c51 family hardware description.
104
Tabla 12. Set de instrucciones y modos de direccionamiento.
Rn Registros de R7-R0 que se seleccionan de un banco de
registros.
Direct 8 bits para direccionamiento de datos internos. Pueden
localizarse de 0 a 127 byes o en la zona de resgistros de
funciones especiales.
@Ri 8 bits de RAM interna de datos localizada de 0 a 255
direccionable a través de los registros R0 y R1.
#data Constante de 8 bits incluida en una instrucción.
#data16 Constante de 16 bits incluida en una instrucción.
Addr 16 Direcciones destino de 16 bits. Usado por LCALL y LJMP.
Addr 11 Direcciones destino de 11 bits. Usado por ACALL y AJMP.
Rel Byte offset de 8 bits en complemento a dos. Usado por SJMP y
todas las condiciones de salto. Su rango de -128 a 128 bytes
relativo al byte de la siguiente instrucción.
Bit Bit de direccionamiento directo en RAM interna o registros de
funciones especiales.
Veamos cual es el set de instrucciones del microcontrolador 8051 en la figura 71
y 72.
105
Figura 71. Set de instrucciones del 8051 parte 1.
106
Figura 72. Set de instrucciones del 8051 parte 2.
107
10.2 FLEX51
El Flex51 es un microcontrolador embebido en una FLEX10K, diseñado bajo el
software MAX+PLUS II 10.1 BASELINE de ALTERA, es compatible totalmente con el
set de instrucciones del microcontrolador 8051 y utiliza una arquitectura Von
Neuman.
Sus elementos internos fueron desarrollados con la ayuda de varias funciones y
entornos del software de ALTERA, tales como: MegaWizard plug-in Manager,
entorno gráfico y editor de texto (lenguaje VHDL, lenguaje AHDL).
Tiene una entrada de clareo global CLR, una entrada global de reloj CLK, una
entrada de recepción serial RX, dos entradas de interrupciones externas INT[1..0]
(interrupción externa 0 e interrupción externa 1), un puerto de entrada P0_IN[7..0]
y un puerto de entrada P1_IN[7..0]. Cuenta con una salida del bus de direcciones
DIR[15..0] para la memoria externa, una salida de transmisión serial TX, dos
salidas de control para la memoria externa Y[1..0] (la utilización de esta memoria
es solo escogencia de la persona que utilice el FLEX51), una salida de datos
BDATOS[7..0], un puerto de salida P2_OUT[7..0] y un puerto de salida
P3_OUT[7..0] (ver figura 73).
108
Figura 73. Microcontrolador embebido FLEX51.
10.2.1 Características. El Flex51 es un microcontrolador embebido con un bus de
datos de 8 bits tri-estados, un bus de direcciones de 16 bits tri-estados (esto es
debido a que en un principio se pensó utilizar una memoria direccionable por 16
bits, pero la implementación en el dispositivo no es realizable por opciones de
área, dejando la oportunidad de en futuras adaptaciones sea este utilizado
completamente), una memoria RAM direccionable por 8 bits y una memoria ROM
direccionable por 8 bits. Cumple totalmente con el set de instrucciones del
microcontrolador 8051. Trabaja con el mismo concepto de banco de registros
como el 8051 y además se seleccionan de igual forma.
El procesamiento de cada instrucción a diferencia del 8051 no cumple con un
estándar de ciclos de reloj para ejecutarla (12, 24 y 48 ciclos), sino que, por el
contrario utiliza el mismo numero de ciclos como estados tenga la instrucción,
esto se realiza para ayudar en parte a la velocidad del procesamiento, aunque no
es recomendable al utilizar herramientas de codiseño.
109
Los puertos de entrada y salida del Flex51 no son bidireccionales como los
puertos del 8051, se utilizan los puertos P0 y P1 como puertos de entrada de
datos y los puertos P2 y P3 como puertos de salida de datos.
La unidad de contadores y temporizadores cumple los mismos modos de
funcionamiento de esa unidad en el microcontrolador 8051.
La unidad serial no cumple ninguno de los modos de funcionamiento de su
homologa en el 8051, por el contrario trabaja con una arquitectura propia, muy
sencilla, donde se utilizan registros de desplazamientos, contadores y máquinas
de estados pequeñas.
El Flex51 cuenta con las mismas fuentes de interrupción del 8051, tales como:
interrupción externa 0, interrupción externa 1, interrupción por desbordamiento
del temporizador 0, interrupción por desbordamiento del temporizador 1 e
interrupción serial.
10.2.2 Flex51 en bloques. Antes de afrontar todo el diseño de un dispositivo a
nivel macro, o sea en todo su esplendor, veamos el dispositivo desde una
perspectiva de diagramas de bloques. Para ser más exactos veremos el
microcontrolador embebido Flex51 dividido en los tres principales bloques
funcionales, como son: La unidad de control (CPU), la unidad de direccionamiento
(AGU) y la unidad aritmética lógica (ALU).
110
Comencemos hablando de la unidad de control del Flex51, esta unidad en
términos generales se compone de una máquina de estados, un decodificador de
señales de control, un registro de instrucción IR, una unidad de saltos y un
registro de banderas PSW (ver figura 74).
Figura 74. Diagrama de bloques de la unidad de control implementada en el
Flex51.
El funcionamiento de esta unidad de control es el siguiente: los códigos de
operación que vienen de la memoria de programa (instrucciones) son
almacenados en registro IR, luego esta instrucción se lleva a la máquina de
estados, la cual decide cuales son las señales que el decodificador debe mostrar,
todo esto depende del tipo de instrucción a realizar y de las entradas de saltos e
interrupciones.
111
La unidad generadora de direcciones de manera general está compuesta por los
registros PCH, PCL, DPH, DPL, TMP1, TPM2, SP y un sumador de 16 bits (ver figura
75).
Figura 75. Diagrama de bloques de la unidad generadora de direcciones AGU.
Se puede observar que se posee un bus interno de datos de 8 bits, que viene de
un multiplexor; este multiplexor escoge entre el resultado alto o bajo del
112
sumador, el bus de datos y un dato que es acomodado por un dispositivo interno
de la AGU para generar una dirección (instrucciones indirectas y llamados a
subrutinas).
El sumador de 16 bits es utilizado en las instrucciones de direccionamiento
relativo, suma del contenido en el bus de direcciones con el contenido de bus de
datos (se adicionan 8 bits para completar el operando de 16 bits).
La unidad ALU implementada en el Flex51 es muy sencilla, cuenta con cuatro
registros: A, B, TMP1 y TMP2, con los cuales realiza todas sus operaciones (ver
figura 76). Dentro de está ALU podremos encontrar la unidad aritmética (se
encarga de las operaciones de adición y substracción), la unidad lógica (se
encarga de las operaciones AND, OR y XOR), la unidad de incremento-
decremento, la unida de corrimiento, la unida de intercambio y la unidad de
multiplicación y división. La ALU lleva los datos al Bus de Datos por medio de
dispositivos tri-estados.
113
Figura 76. Diagrama de bloques de la unidad aritmética lógica ALU.
10.3.3 Flex51 en partes. Como todo microcontrolador, el Flex51 es un conjunto
de varias partes funcionales unidas entre sí por medio de buses y señales de
control. Veamos a grandes rasgos el diagrama de bloques del Flex51 (ver figura
77).
114
Figura 77. Diagrama de bloques del microcontrolador embebido Flex51.
Veamos ahora el diagrama esquemático realizado en ALTERA.
115
Figura 78. Diagrama esquemático del Flex51. a)CPU, b)DIROUT, c)IR, d)ALU,
e)AGU, f)Banco de puertos, g)DECOD127, h)Memoria ROM, i)Memoria RAM,
j)Unidad de bits, k)PSW, l)Unidad de temporizadores, m)Unidad de interrupciones,
n)unidad de transmisión serial.
A continuación veamos cada uno de los bloques funcionales del Flex51.
10.2.3.1 Decodificador de zona de registros de funciones especiales DECOD127
Este decodificador es el encargado de elegir cual de los registros de la zona de
registros de funciones especiales puede cargar un valor o mandarlo al bus de
datos para realizar alguna instrucción. Su código se puede ver en el anexo A.
116
10.2.3.2 Dispositivo de salidas de control de la máquina de estados DIROUT. Es
dispositivo es el encargado de dar la salida de todas las señales de control del
Flex51 dependiendo del estado en donde se encuentre la CPU, la operación a
ejecutarse y si hay salto o no. Cuenta con una entrada de 8 bits IR[7..0], una
entrada del estado actual de 5 bits SA[4..0] y una entrada indicadora de saltos ZE
de 1 bit. Tiene una salida Q de 46 bits (ver figura 79).
Figura 79. Dispositivo diseñado en lenguaje de descripción hardware VHDL
DIROUT.
Veamos las salidas de este dispositivo y sus respectivas funciones.
Tabla 13. Salidas del dispositivo DIROUT y sus funciones.
BITS FUNCIONES
0 Escritura en memoria de datos
1 Habilitador de salida al bus de datos desde la ALU
2 Lectura de memoria de programa
3 Lectura de memoria de datos
4 Cargar en el SP
5 Conteo ascendente o descendente en el SP
117
6 Habilitador del decodificador carga de la AGU
7 Selector 0 del decodificador carga de la AGU
8 Selector 1 del decodificador carga de la AGU
9 Cargar en el registro IR
10 Habilitador del decodificador de salida de la ALU
11 Selector 0 del decodificador de salida de la ALU
12 Selector 1 del decodificador de salida de la ALU
13 Habilitador del decodificador carga de la ALU
14 Selector 0 del decodificador carga de la ALU
15 Selector 1 del decodificador carga de la ALU
16 Sel. 0 del decodificador de salida baja de la AGU al bus de dir.
17 Sel. 1 del decodificador de salida baja de la AGU al bus de dir.
18 Sel. 0 del decodificador de salida alta de la AGU al bus de dir.
19 Sel. 1 del decodificador de salida alta de la AGU al bus de dir.
20 Sel. 0 del multiplexor del bus interno de la AGU.
21 Sel. 0 del multiplexor del bus interno de la AGU.
22 Sel. 0 del decodificador de conteo de la AGU.
23 Sel. 1 del decodificador de conteo de la AGU.
24 Habilitador de salida al bus de la salida QB del U_EXCH.
25 Habilitador de salida de la parte baja del multiplicador de la ALU.
26 Habilitador de salida del residuo del divisor en la ALU.
27 Habilitador de carga de los registros de funciones especiales.
28 Habilitador de salida de los registros de funciones especiales.
29 Habilitador de salida de la parte alta del multiplicador de la ALU.
118
30 Habilitador de salida del cociente del divisor en la ALU.
31 Habilitador de carga del dpl.
32 Habilitador de carga del dph.
33 Habilitador de salida del PC bajo al bus de datos.
34 Habilitador de salida del PC alto al bus de datos.
35 Habilitador de salida del registro temporal bajo al bus de datos.
36 Habilitador de salida de la unidad de dir. de bits al bus de datos.
37 Habilitador de salida de la unidad de bits al bus de datos.
38 Carga del Carry en el PSW.
39 Carga del Carry intermedio en el PSW.
40 Carga del bit de paridad en el PSW.
41 Habilitador de salida baja de la unidad de int. al bus de dir.
42 Habilitador de salida alta de la unidad de int. al bus de dir.
43 Bit de Clareo del decodificador de entradas de ininterrupción.
44 Bit de Clareo del decodificador de salidas de interrupción.
45 Carga del Overflow en el PSW.
Además veamos el sumario de compilación de este dispositivo dentro del
EPF10K70RC240-4 y utilización de recursos.
Figura 80. Sumario de compilación del dispositivo DIROUT.
119
Para ver código del dispositivo ir al anexo A.
10.2.3.3 Memoria de Programa ROMPROG. La memoria de programa está
conformada por los dispositivos memprog y tri. Este dispositivo fue creado en el
entorno gráfico de ALTERA y es un dispositivo asíncrono, puesto que no posee
entrada de reloj, porque crearía un estado más de espera en la maquina de
estados. Ver figuras 81 y 82.
La memoria de programa tiene una entrada para el bus de direcciones bajo de 8
bits y una entrada de habilitación de lectura; cuenta con una salida al bus de
datos Q[7..0].
Figura 81. Dispositivo diseñado en el entorno grafico de ALTERA ROMPROG.
Figura 82. Esquema de la memoria de programa ROMPROG.
120
Figura 83. Sumario de compilación del dispositivo ROMPROG.
Este dispositivo tiene un retardo máximo de 47.2ns en su salida Q7.
10.2.3.4 Tri. Este dispositivo fue creado con ayuda de la función MegaWizard
Plug-In Manager de ALTERA y es utilizado en todos los dispositivos que necesiten
llevar datos a través del bus de datos o del bus de direcciones.
Es un dispositivo que tiene una entrada y salida de datos de 8 bits, y una entrada
de habilitación (ver figura 84).
Figura 84. Dispositivo diseñado con la función MegaWizard Plug-In Manager TRI.
10.2.3.5 Memoria de datos RAMD. La memoria de datos está conformada por los
dispositivos rdam y tri. Este dispositivo fue creado en el entorno gráfico de
ALTERA, por el contrario de la memoria de programa este dispositivo es síncrono.
121
La memoria de datos tiene una entrada para el bus de direcciones bajo de 8 bits
ADD[7..0], una entrada de datos de 8 bits DATOIN[7..0], una entrada de escritura
WR y una entrada de habilitación de lectura MD; cuenta con una salida al bus de
datos DATOUT[7..0]. Ver figuras 85 y 86.
Figura 85. Dispositivo diseñado en el entorno grafico de ALTERA RAMD.
Figura 86. Esquema de la memoria de datos RAMD.
10.2.3.6 Registro IR. El registro IR es el registro que almacena el código de
operación; este registro es un dispositivo REG8B
10.2.3.7 Zona de puertos de entrada y salida. Este dispositivo está compuesto por
dos puertos de entrada P0 y P1, y dos puertos de salida P2 y P3. Tiene una
122
entrada de reloj, una entrada de clareo, una entrada de carga LBREG, una entrada
de datos INBREG[7..0], dos entradas de puertos P0_IN[7..0] y P1_IN[7..0], una
entrada de selección del puerto s[9..6]. Posee dos salidas de puertos P2_OUT
[7..0] y P3_OUT[7..0], y una salida al bus de datos OUTBREG[7..0] (ver figura 87).
Figura 87. Dispositivo diseñado en el entorno grafico de ALTERA BANREG.
Los puerto 0 y 1 son dos dispositivos STD_REG8B, sus entradas de datos vienen
de los pines de entrada/salida directamente y sus salidas se llevan a la salida tri
estrado OUTBREG[7..0] que va conectada al bus de datos (ver figura 88).
Los puertos 2 y 3 son dos dispositivos REG8B, entradas de datos vienen del bus
de datos y sus salidas se llevan directamente a los pines de entrada/salida.
123
Figura 88. Esquema del dispositivo de puertos de entrada y salida.
10.2.3.8 Registro PSW. Este dispositivo fue diseñado en el entorno grafico de
ALTERA y es el registro de banderas, en su interior está compuesto por el registro
REG8BPSW, el dispositivo CABLE y el dispositivo TRI (ver figura 89).
Cuenta con 12 entradas de 1 bit (cargar dato SLOAD, clarear SCLR, reloj, bit de
paridad P, carga de paridad LP, carga de acarreo LC, carga de acarreo intermedio
LAC, bit de acarreo C, bit de acarreo intermedio AC, carga de desbordamiento
LOV y bit de desbordamiento OV) y una entrada de datos de 8 bits D[7..0]. Posee
una salida tri estado de 8 bits PSWOUT[7..0] conectada al bus de datos, dos
salidas de 1 bit PSW6 y PSW7 (acarreo intermedio y acarreo) y una salida PSW[5..0]
124
de donde sus bits PSW3 y PSW4 son los selectores del banco de registros a
utilizar.
Figura 89. Dispositivo diseñado en el entorno grafico de ALTERA PSW.
El dispositivo REG8BPSW del interior de PSW es sincrono y mantiene
constantemente revisando sus entradas de carga para actualizarse, si estas
entradas no cumplen con los parámetros propuestos el REG8BPSW lo único que
hace es actualizarse con la entrada de retroalimentación que le llega a A[7..0] por
medio del dispositivo cable. Para salir al bus de datos se utiliza un dispositivo TRI
(ver figura 90).
125
Figura 90. Esquema del dispositivo PSW.
10.2.3.9 Dispositivo CABLE. Como su nombre lo dice este dispositivo es una
simulación de un cable, fue diseñado en VHDL y su función es la de poner en la
salida lo que le llega a la entrada; en la entrada de un dispositivo cable en su
mayoría de veces llegamos de una salida tri estados. También es utilizado en los
dispositivos que realizan retroalimentación.
Tiene una entrada de 8 bits X[7..0] y una salida igual de 8 bits Q[7..0] (ver figura
91). Para ver su código ir al anexo A.
Figura 91. Dispositivo diseñado en lenguaje de descripción hardware VHDL
CABLE.
126
10.2.3.10 Arreagu1. Este dispositivo no forma parte de ninguna unidad específica,
pero es de mucha importancia porque él da soporte a distintas unidades y
dispositivos, tales como: la AGU, memoria RAM y registro de banderas PSW.
Esta dispositivo tiene una entrada de carga de registros de la zona de registros de
funciones especiales X27, una entrada de carga del Stack Pointer LSP, una entrada
de habilitación de salida de datos de registros de la zona de registros de
funciones especiales X28, una entrada de selección de registros de la zona de
registros especiales de 21 bits N[20..0], dos entradas de carga X32 y X1 para DPH
y DPL respectivamente, una entrada de habilitación de escritura para la memoria
de datos MN y una entrada de habilitación de lectura para la memoria de datos
MD.
Como salidas tiene carga del registro DPL LDPL, carga del registro DPH LDPH,
carga del registro SP, habilitación de salida de datos del registro PSW, carga del
registro PSW, carga del generador de rata de baudios LBAUD, escritura de la
memoria de datos MN y habilitador de lectura de la memoria de datos MD (ver
figura 92).
127
Figura 92. Dispositivo diseñado en el entorno grafico de ALTERA ARREAGU1.
Una de las funciones de este dispositivo es habilitar la señal de carga de los
registros DPH, DPL, SP y PSW; esto se consigue de la siguiente manera: llega la
señal de habilitación de carga global de la zona de registros de funciones
especiales X27 y realiza una operación AND con la señal de selección de registro
SFRs N2, N3, N13 y N10 respectivamente. Para el caso de los registros DPH, DPL y
SP que pueden ser habilitados por una señal producida por el dispositivo de
salidas de control de la máquina de estados DIROUT, la salida de la operación
AND hace una operación OR con las señales antes mencionadas (X32, X31, LSP).
La señal de salida EOPSW se consigue al realizar una operación AND entre la señal
de habilitación de salida de la zona de registros de funciones especiales y la señal
de selección de registro SFRs N10 (ver figura 93).
128
Figura 93. Esquema del dispositivo Arreagu1.
Otra de las funciones de este dispositivo es la de habilitar la escritura y la lectura
de la memoria de datos, para ello tenemos la ayuda del dispositivo AND20, el cual
da una señal en alto para cuando el código de operación no requiere de ninguno
de los registros SFRs. La señal de salida del dispositivo AND20 hace una
operación AND con la señal de carga global X27 y su salida a su vez realiza una
operación OR con la señal de escritura de la memoria de datos X0 que proviene
del dispositivo de salidas de control de la máquina de estados. Para la lectura este
proceso es el mismo, pero la operación AND se realiza entre la salida de AND20 y
la señal de habilitación global X28, y su salida hace la operación OR con la señal
de lectura de la memoria de datos X3.
129
10.2.3.10.1 And20. Este dispositivo es el encargado de decir si se ha seleccionado
alguno de los registros de la zona de funciones especiales SFRs; si ninguno es
seleccionado presenta salida alta y si alguno es seleccionado presenta salida baja.
Tiene una entrada de 21 bits a[20..0] y una salida s de un bit (ver figura 94). Para
ver su código ver anexo A.
Figura 94. Dispositivo diseñado en lenguaje de descripción hardware VHDL
AND20.
10.2.3.11 Agu. Este dispositivo es de las partes más importantes de todo el
diseño del microcontrolador embebido Flex51, puesto que es la unidad de
direccionamiento. Este dispositivo se encarga de las tareas de direccionamiento
de la memoria de programa y de datos, en forma directa, indirecta; saltos
relativos largos y cortos; por medios incrementos en el contador de programa PC,
en registros temporales y en el DPTR.
Cuenta con una entrada para el código de instrucción IR[7..0], una entrada de
datos DATOIN[7..0], una entrada selección de parte alta del bus de direcciones
SDIRH[1..0], una entrada de selección de parte baja del bus de direcciones
SDIRL[1..0], una entrada de selección de banco de registros PSW[1..0], una entrada
de selección de dato de entrada SDATOIN[1..0], una entrada de carga de datos en
el registro SP L_SP, una entrada de selección de registro (se selecciona entre el
130
PCH, PCL, TMPH y TMPL), una entrada de habilitación de registros EREG, una
entrada de carga de datos en el registro DPH LDPH, una entrada de carga de datos
en el registro DPL LDPL, una entrada habilitación de conteo en los registros PCH,
PCL, DPH y DPL SENA[1..0], una entrada de selección de registros SFRs N[3..2],
una entrada de selección de registro SFRs N13, una entrada de habilitación de
salida del registro PCH para el bus de datos PH, una entrada de habilitación de
salida del registro PCL para el bus de datos PL, una entrada de habilitación de
salida del registro temporal bajo ETL, una entrada de habilitación de salida de
datos de registros de la zona de registros de funciones especiales X28, una
entrada de selección de operación suma o resta UPDOWNSP, una entrada de clareo
CLR y una entrada de reloj CLK.
En las salidas tenemos: una salida datos DATOUT[7..0], una salida de la parte alta
del bus de direcciones BUSH y una salida de la parte baja del bus de direcciones
BUSL (ver figura 95).
La AGU en su interior se compone de los siguientes dispositivos: PC, DPTR,
REG_SP, STD_REG8B1, STD_REG8B2, TRI, ARREAGU2, CABLE2, ARREGLOAGU,
ARREAGU3, REG8BAGU, DEC2TO4, DEC2TO4H, MU3 y SUMAGU (algunos de los
dispositivos nombrados fueron explicados en capítulos anteriores).
131
Figura 95. Dispositivo diseñado en el entorno grafico de ALTERA AGU.
10.2.3.11.1 Pc. Este dispositivo es más conocido como el contador de programa,
su función es dar la posición de memoria de programa a seguir. En su interior
consta de dos contadores CONT_REG8B y cuatro dispositivos TRI.
Tiene una entrada de datos para el contador alto AH[7..0], una entrada de carga
del PCH LPCH, una entrada de habilitación de salida del PCH OPCH, una entrada
de datos para el contador alto AL[7..0], una entrada de carga del PCL LPCH, una
entrada de clareo del PC, una entrada de habilitación de conteo E, una entrada de
reloj CLK, una entrada de habilitación de salida del PCL OPCL, una entrada de
habilitación de salida del registro PCH para el bus de datos PH, una entrada de
habilitación de salida del registro PCL para el bus de datos PL.
132
El dispositivo tiene una salida de direcciones de la parte alta del PC PCH[7..0], una
salida de datos de la parte alta del PC PCHOUT[7..0], una salida de direcciones de
la parte baja del PC PCL[7..0] y una salida de datos de la parte baja del PC
PCLOUT[7..0]. Ver figuras 96.
Figura 96. Dispositivo diseñado en el entorno grafico de ALTERA PC.
Este dispositivo es un arreglo en cascada de contadores CONT_REG8B, en donde
la salida M del contador llega a la entrada de contador del siguiente. Cuenta con
cuatro salidas, dos para el bus de direcciones (parte alta y baja) y dos para el bus
de datos, las cuales primero pasan por dispositivo TRI.
133
Figura 97. Esquema del dispositivo PC.
10.2.3.11.2 Dptr. Este dispositivo es muy utilizado en operaciones de tipo MOVC
(operaciones con la memoria de programa) y trabajo de tablas.
Tiene una entrada de datos para el registro contador alto DPHI[7..0], una entrada
de carga del DPH LDPH, una entrada de habilitación de salida del PDH OCH, una
entrada de datos para el registro contador alto DPLI[7..0], una entrada de carga
del DPL LDPL, una entrada de clareo del DPTR C, una entrada de habilitación de
conteo E, una entrada de reloj CLK, una entrada de habilitación de salida del DPL
OCL, una entrada de habilitación de salida del registro DPH para el bus de datos
EH, una entrada de habilitación de salida del registro DPL para el bus de datos EL.
134
El dispositivo tiene una salida de direcciones de la parte alta del DPTR DPH[7..0],
una salida de datos de la parte alta del DPTR DPHDATO[7..0], una salida de
direcciones de la parte baja del DPTR DPL[7..0] y una salida de datos de la parte
baja del DPTR DPLDATO[7..0] (ver figura 98).
Figura 98. Dispositivo diseñado en el entorno grafico de ALTERA DPTR.
Figura 99. Esquema del dispositivo DPTR.
135
En la figura anterior se pude ver como este dispositivo es un arreglo en cascada
de contadores CONT_REG8B, en donde la salida M del contador entrada a la
entrada de conteo del siguiente. Cuenta con cuatro salidas, dos para el bus de
direcciones (parte lata y baja) y dos para el bus de datos, las cuales primero pasan
por dispositivo TRI.
10.2.3.11.3 Reg8bagu. Este dispositivo se encarga de acomodar alguno de los
datos de direcciones a la AGU, acomoda la dirección en las operaciones con el
banco de registros, operaciones indirectas con R0 y R1, y en operaciones de
llamados a subrutina.
Tiene una entrada de clareo C, tiene una entrada de selección de operación
SEL[1..0], una entrada de selección del banco de registros PSW[1..0] y una entrada
de código de operación D[7..0]. El dispositivo tiene una única salida Q[7..0] (ver
figura 100).
Figura 100. Dispositivo diseñado en lenguaje de descripción hardware VHDL
REG8BAGU.
136
10.2.3.11.4 Arreagu2. Este dispositivo es el encargado de habilitar la salida al bus
de datos de los registros DPH, DPL y SP. Tiene una entrada de habilitación global
de zona de registros de funciones especiales SFRs X28, tres entradas de selección
de registro N2, N3 y N13.
Como salidas tiene: una salida de habilitación de salida al bus EDPH, una salida de
habilitación de salida al bus EDPL y una salida de habilitación de salida al bus ESP
(ver figura 101).
Figura 101. Dispositivo diseñado en el entorno grafico de ALTERA ARREAGU2.
10.2.3.11.5 Arreagu3. Este dispositivo tiene función habilitar la salida al bus de
direcciones de los dispositivos PC, DPTR, TMPH, TMPL y REG_SP. Tiene una
entrada de selección de la parte alta SBDIRHO[1..0], una entrada de selección de la
parte baja SBDIRLO[1..0], una salida selectora de la parte alta CO[3..0] y una salida
selectora de la parte baja DO[3..0] (ver figura 102).
En su interior encontramos dos dispositivos DEC2TO4H, uno para cada parte (ver
figura 103).
137
Figura 102. Dispositivo diseñado en el entorno grafico de ALTERA ARREAGU3.
Figura 103. Esquema del dispositivo ARREAGU3.
10.2.3.11.6 Arregloagu. La función este dispositivo acomodar el valor del dato
que va al dispositivo SUMAGU ( si la operación es suma en la salida encontramos
ceros y si la operación substracción encontramos unos) y dar la señal de selección
para el dispositivo REG8BAGU.
Tiene una entrada del nibble bajo del código de operación IR[3..0], una entrada de
selección de operación suma o resta A, una salida de datos D[7..0] y una salida de
selección S[1..0] (ver figura 104).
138
Figura 104. Dispositivo diseñado en el entorno grafico de ALTERA ARREGLOAGU.
Para cumplir con sus funciones este dispositivo en su interior consta de un
dispositivo AS2 y LOGAGU1 (ver figura 105).
Figura 105. Esquema del dispositivo ARREGLOAGU.
El AS2 es el dispositivo que selecciona unos a la salida o ceros dependiendo de la
entrada A, está diseñado en lenguaje VHDL. Para ver su código referirse al anexo
A.
El dispositivo LOGAGU1 es un arreglo de lógica combinacional queda la señal de
selección del dispositivo REG8BAGU1.
10.2.3.11.7 Cable2. Este dispositivo fue diseñado en lenguaje VHDL y su función
es la de poner en la salida lo que le llega a la entrada; en la entrada de un
139
dispositivo cable en su mayoría de veces llegamos de una salida tri estados.
Tiene una entrada de la parte alta del bus de direcciones X[7..0], una entrada de la
parte baja del bus de direcciones Y[7..0] y una salida Q[15..0] (ver figura 106).
Para ver su código ir al anexo A.
Figura 106. Dispositivo diseñado en lenguaje de descripción hardware VHDL
CABLE2.
10.2.3.11.8 Funcionamiento general de la AGU. Como primer apunte hay que
decir que la selección de carga, la salida y el incremento de los dispositivos PC,
DPTR, TMPH, TMPL y REG_SP se hace por medios de decodificadores (DEC2TO4H,
DEC2TO4) o arreglos de ellos.
Este dispositivo cuenta con un bus interno de datos que tiene como controlador
del flujo de datos al multiplexor MU3, que escoge entre la señal que viene del bus
de datos, la señal que sale del dispositivo REG8BAGU y la salida alta y baja del
dispositivo SUMAGU.
Debido a que todos los dispositivos que tienen salida al bus de direcciones
cuentan dispositivos tri-estados en sus salidas y es necesario realizar una
operación de suma o resta dentro de la AGU con el dispositivo SUMAGU para los
140
códigos de operación de saltos se utiliza el dispositivo CABLE2 que elimina este
efecto.
Figura 107. Esquema del dispositivo AGU. a)PC, b)DPTR, c)Registros temporales,
d)SP, e)sumador, f)REG8BAGU, g)MU3, h)CABLE, i)ARREAGU2, j)ARREGLOAGU
Veamos el sumario de compilación de este dispositivo y cuantos recursos del
flex10k requiere ( ver figura 108).
141
Figura 108. Sumario de compilación del dispositivo AGU.
La frecuencia máxima que puede alcanzar este dispositivo es de 42.37MHz y tiene
un retardo máximo de 32.3ns.
10.2.3.12 Alu (Prueba4). Este dispositivo es uno de los más importantes en
cualquier tipo de microcontrolador, puesto que desarrolla la mayoría de las
instrucciones. En el caso del microcontrolador Flex51 el dispositivo ALU es de
vital importancia por que es el encargado de ejecutar las instrucciones de tipo
aritmético, lógico e intercambio, además de las instrucciones de salto (CJNE) y
parte de las operaciones con bits.
Este dispositivo lleva el nombre de prueba4 y en su interior contiene un
dispositivo ALU, LOGALU, ARREOV y TRI (ver figura 110).
Este dispositivo tiene una entrada de habilitación de salida al bus de datos EOALU,
una entrada de palabra de instrucción IR[7..0], una entrada de reloj CLK, un
entrada de acarreo CF, una entrada de acarreo intermedio, una entrada de datos
BUSIN[7..0], una entrada de selección de carga SD[1…0], una entrada de
habilitación de salida SO[1..0], una entrada de habilitación del decodificador de
carga ESD, una entrada de habilitación del decodificador de salida ESO, una
142
entrada de habilitación de salida del dispositivo DIRBIT, una entrada de los
habilitadores de carga y de salida globales X[1..0], una entrada de habilitación de
los dispositivos tri-estados F1[9..7] y F1[4..3], y una entrada de selección de
registros SFRs N[1..0].
Tiene una salida de datos del temporal 2 TMP2[7..0], una salida de datos
BUSOUT[7..0], una salida del acarreo intermedio AC, una salida de la bandera de
cero Z, una salida de acarreo generada por el sumador, una salida de acarreo
generada por la unidad de intercambio CEXCH, una salida de selección de bits
BITS[2..0], una salida de acarreo generada por la unidad de desplazamiento
CCORR, una salida de acarreo generada por la unidad salto CJNE, una salida por la
bandera de desbordamiento OV, una salida indicadora de salto ZETA y una salida
indicadora de paridad P (ver figura 109).
Figura 109. Dispositivo diseñado en el entorno grafico de ALTERA PRUEBA4.
143
Figura 110. Esquema del dispositivo PRUEBA4.
10.2.3.12.1 Alu. En este dispositivo se llevan a cabo todas las operaciones
aritméticas, lógicas, de desplazamiento, cjne y encuentra la dirección del byte y
bit en operaciones con bits (ejemplo: clr bit).
Este dispositivo tiene una entrada de habilitación de salida al bus de datos EOALU,
una entrada de la parte baja de palabra de instrucción IRL[3..0], una entrada de
reloj CLK, una entrada de clareo global CLR, una entrada de clareo del acumulador
CLRA, una entrada de acarreo CF, una entrada de acarreo intermedio, una entrada
de datos BUSIN[7..0], una entrada de selección de carga SD[1…0], una entrada de
habilitación de salida SO[1..0], una entrada de habilitación del decodificador de
carga ESD, una entrada de habilitación del decodificador de salida ESO, una
144
entrada de habilitación de salida del dispositivo DIRBIT, una entrada de los
habilitadores de carga y de salida globales X[1..0], una entrada de habilitación de
los dispositivos tri-estados F1[9..0], una entrada de selección del multiplexor SUL
de la unidad lógico, una entrada de selección del multiplexor SID del dipositivo de
incremento- decremento y una entrada de selección de registros SFRs N[1..0].
Tiene una salida de datos del temporal 2 TMP2[7..0], una salida de datos
BUSOUT[7..0], una salida del acarreo intermedio AC, una salida de la bandera de
cero Z, una salida de acarreo generada por el sumador, una salida de acarreo
generada por la unidad de intercambio CEXCH, una salida de selección de bits
BITS[2..0], una salida de acarreo generada por la unidad de desplazamiento
CCORR, una salida de acarreo generada por la unidad salto CJNE, una salida por la
bandera de desbordamiento OV generada por el sumador, una salida por la
bandera de desbordamiento OV generada por el multiplicador, una salida por la
bandera de desbordamiento OV generada por el divisor , una salida indicadora de
salto R y una salida indicadora de paridad PARIDAD (ver figura 111).
Para ver el diagrama esquemático referirse a la figura 112.
145
Figura 111. Dispositivo diseñado en el entorno gráfico de Altera ALU.
Figura 112. Esquema del dispositivo ALU. a)registros, b) ADER_A, c)UL, d)
Multiplicador, e)divisor, f)U_exch, g)U_corri, h)dirbit, i)Paridad, j)Multiplexores,
k)Decodificadores, l)CJNE, m)Arreglodirecto, n)Incdec.
146
U_corri. Este dispositivo es el encargado de realizar las operaciones de
desplazamiento en el registro acumulador (RR A, RRC A, RL A, RLC A). Tiene una
entrada de datos que proviene del registro acumulador A[7..0] que esta unido
directamente, una entrada de acarreo proveniente de la salida del registro PSW,
una entrada de selección de operación SEL[1..0], una salida de acarreo que se
lleva a la entrada del registro PSW y una salida al bus de datos X[7..0] (ver figura
113).
El funcionamiento de este dispositivo es el siguiente: recibe el dato del registro
acumulador y el bit de acarreo de entrada, la operación a realizarse se selecciona
de acuerdo a la configuración de bits en la entrada SEL[1..0] (los bits que
controlan estas operaciones son los dos bits menos significativos del nibble alto
del código de operación). Para ver el código referirse al anexo A.
Figura 113. Dispositivo diseñado en lenguaje de descripción hardware VHDL
U_CORRI.
U_exch. Este dispositivo es el encargado de realizar las operaciones de
intercambio (swap,xch,xchd) y la operación de ajuste decimal DA A. Tiene dos
entradas de datos A[7..0] y B[7..0] que son los que en algunas de las operaciones
se intercambiarán, una entrada S0 que viene del bit menos significativo del nibble
147
alto del código de operación, una entrada de acarreo intermedio CV que viene de
la salida del registro PSW, una entrada de acarreo C que viene de la salida del
registro PSW y una entrada IRH[3..0] que proviene del nibble bajo del código de
operación. Tiene tres salidas, una salida de acarreo COUT que va a la entrada del
registro PSW y dos salidas al bus de datos QA[7..0] y QB[7..0] (ver figura 114).
Para ver el código referirse al anexo A.
Figura 114. Dispositivo diseñado en lenguaje de descripción hardware VHDL
U_EXCH.
Paridad. Este dispositivo cumple una función única y especifica dentro del
microcontrolador embebido Flex51 y es la de generar el bit indicar de paridad del
registro acumulador.
Este dispositivo es un arreglo lógico de compuertas OR-exclusivas en cascada,
tiene una única entrada A[7..0] que proviene del acumulador y una única salida P
que va a la entrada del registro PSW (ver figura 115).
148
Figura 115. Dispositivo diseñado en el entorno gráfico de Altera PARIDAD.
Veamos su diagrama esquemático.
Figura 116. Esquema del dispositivo PARIDAD.
Dirbit. De forma exacta este elemento es solo una carcaza de otros dispositivos
que prestan funciones específicas a la unidad de bits, en su interior este
dispositivo contiene: un DIRBITS y un TRI
Tiene una entrada de datos TMP1[7..0], la cual sirve para recibir el byte que
contiene la información del bit requerido, una entrada de habilitación de salida al
bus de datos ODIRBIT, una salida al bus de datos DIRBITS[7..0] que contiene la
149
dirección del byte que contiene el bit necesario para la operación y una salida
BITS[2..0] para seleccionar el bit (ver figura 117).
Figura 117. Dispositivo diseñado en el entorno gráfico de Altera DIRBIT.
Veamos su diagrama esquemático.
Figura 118. Esquema del dispositivo DIRBIT.
*Dirbits. La función específica de este dispositivo es generar la dirección del byte
en memoria en donde se encuentra el bit requerido para la operación deseada y
se dar la codificación del bit requerido. Tiene una entrada de datos TMP1[7..0],
una salida de datos DATOUT[7..0] que da la dirección del byte en donde se
encuentra el bit y una salida BIT[2..0] que da el bit requerido por la operación.
Para ver el código referirse al anexo A.
150
El funcionamiento es el siguiente: se toma el dato de entrada y se verifica si el bit
más significativo es uno o cero, si es uno se concatenan los cinco bits más
significativos de la entrada con tres ceros (TPM1[7..3]&”000”) y si el bit es cero se
concatena la palabra “0010” con cuatro bits de la entrada (“0010”&TPM1[6..3]).
Para generar la salida de bits[2..0] se toman los tres bits menos significativos de
la entrada (TMP1[2..0]) (ver figura 119).
Figura 119. Dispositivo diseñado en lenguaje de descripción hardware VHDL
DIRBITS.
Cjne. Este dispositivo es el encargado de ejecutar las operaciones de CJNE
(compare y salte si no es cero), está diseñado en lenguaje de descripción
hardware VHDL. Tiene dos entradas de datos A[7..0] y B[7..0], una entrada de
datos para la palabra de operación IR[7…0], una entrada de acarreo CIN, una
entrada indicadora de salto, una salida indicadora de salto S y una salida de
acarreo COUT (ver figura 120). Para ver el código referirse al anexo A.
151
Figura 120. Dispositivo diseñado en lenguaje de descripción hardware VHDL CJNE.
Incdec. Este dispositivo es el encargado de realizar las operaciones de incremento
y decremento. Tiene una entrada de datos A[7..0], una entrada de selección de
operación, una salida de datos al bus Q[7..0] y una salida indicadora de cero Z.
Cuando hay dato con valor de cero en la salida del dispositivo interno se genera
un uno en la salida Z (ver figura 121).
Figura 121. Dispositivo diseñado en el entorno gráfico de Altera INCDEC.
Veamos su diagrama esquemático.
152
Figura 122. Esquema del dispositivo INCDEC.
Ul. Este dispositivo se encarga de realizar las operaciones lógicas (AND, OR, XOR)
y fue diseñado en lenguaje de descripción hardware VHDL. La señal de selección
proviene de los dos bits menos significativos del nibble alto del código de
operación.
Tiene dos entradas de datos X[7..0] y Y[7..0], una entrada selección de las
operaciones SEL[1..0] y una salida al bus de datos Z[7..0] (ver figura 123). Para ver
el código referirse al anexo A.
Figura 123. Dispositivo diseñado en lenguaje de descripción hardware VHDL UL.
153
Arreglodirecto. Este dispositivo tiene como función controlar la carga de datos y la
habilitación de salida al bus de los registros A y B, en operaciones de
direccionamiento directo (ejemplo: mov dir_A,#data).
Tiene una entrada DI[1..0] de selección carga entre el registro A o B, una entrada
X[1..0] que son los bits de carga y habilitación global SFRs, una entrada de
selección de registros N[1..0], una entrada de selección de habilitación de salida
DO[1..0] y unas salidas D0, D1, E0 y E1 (habilitador de salida de A, habilitador de
salida de B, habilitador de carga de A y habilitador de carga de B) (ver figura 124).
Figura 124. Dispositivo diseñado en el entorno gráfico de Altera
ARREGLODIRECTO.
Figura 125. Esquema del dispositivo ARREGLODIRECTO.
154
Bandera de Cero. Esta bandera se consigue conectando la salida del registro
acumulador a una compuerta OR negada (ver figura 126).
Figura 126. Bandera de Cero.
Bandera de desbordamiento de la división. Para obtener está bandera conectamos
la salida del registro B a una compuerta OR negada (ver figura 127)
Figura 127. Bandera de desbordamiento de la división.
Bandera de desbordamiento de la multiplicación. Para obtener está bandera
conectamos la salida baja del dispositivo de multiplicación a una compuerta OR
(ver figura 128).
155
Figura 128. Bandera de desbordamiento de la multiplicación.
10.2.3.12.2 Logalu. Este dispositivo fue diseñado con arreglos de compuertas en
el entorno gráfico de Altera, su función es dar las señales de control a los
multiplexores que funcionan en el interior de la ALU y las señales de habilitación
de las salidas de las unidades funcionales del dispositivo ALU hacia el bus de
datos.
Tiene una entrada de código de instrucción IR[7..0], una entrada de habilitación
de salida de datos del dispositivo ALU al bus, una salida de selección de operación
del dispositivo multiplexor de incremento-decremento SID, una salida de
selección de operación del dispositivo multiplexor de la unidad lógica SUL, una
salida de clareo del registro acumulador CLRA y unas salida de habilitación de la
salida al bus F1[2..0] y F1[6..5] (ver figura 129).
En el diseño de este dispositivo se sacaron ecuaciones para implementar cada una
de las salidas de control del dispositivo ALU. La señal F0 tiene la siguiente
ecuación:
( ) ( ) ( )( )4*5*6*75*6*7320 IRIRIRIRIRIRIRIRIRF +∗+=
156
La señal F1 tiene la siguiente ecuación:
( ) ( )( ) ( )( )( ) ( )( )
∗∗∗∗∗∗∗+
++∗∗∗+∗∗=
45673210
1235674671
IRIRIRIRIRIRIRIR
IRIRIRIRIRIRIRIRIRF
La señal F2 tiene la siguiente ecuación:
( ) ( )5*6*7322 IRIRIRIRIRF ∗+=
La señal F5 tiene la siguiente ecuación:
( ) ( ) ( )( )( )( ) ( )( )( ) ( )( )( )( )
∗∗∗∗∗∗+
∗∗∗∗∗∗∗+
∗∗∗∗∗∗∗+
∗+∗+∗∗∗∗
=
1234567
45673210
45673210
021234567
5
IRIRIRIRIRIRIR
IRIRIRIRIRIRIRIR
IRIRIRIRIRIRIRIR
IRIRIRIRIRIRIRIRIR
F
La señal F6 tiene la siguiente ecuación:
( ) ( )0123676 IRIRIRIRIRIRF ∗∗∗∗∗=
Hay que aclarar que estas señales antes de salir hacen un operación AND con la
entrada de habilitación de salidas al bus EOALU, convirtiéndolas en las salidas
F1[1..0] y F1[6..5]. Para la salida F12 se debe realizar otras operaciones, por lo
tanto su ecuación final es:
157
( ) ( )( )( )( )( )01234567212 IRIRIRIRIRIRIRIRFEOALUF ∗∗+∗∗∗∗+∗=
La salida CLRA tiene como ecuación:
( )3210467 IRIRIRIRIRIRIRCLRA ∗∗∗∗∗∗=
La salida SID tiene la siguiente ecuación:
( )( ) ( )( )( ) ( ) ( )( )
( )
∗∗∗
∗+∗+∗+++++++
∗∗∗∗+∗∗
=
567
021235673210
45673210
IRIRRI
IRIRIRIRIRIRIRIRIRIRIRIR
IRIRIRIRIRIRIRIRSID
Para hablar de la ecuación de la salida SUL, hay que apuntar que utiliza las salidas
de los dispositivos CJNEMUX y CJNEMUX1 como dos entradas en el arreglo de
compuertas. La ecuación SUL tiene la siguiente ecuación:
( ) ( ) ( )( )( ) ( ) ( )( )( ) ( ) ( )( )
∗∗+∗∗∗∗∗∗+
+++∗++∗++∗
++∗++∗∗+
∗=
5674670123
0123567467
56746732
1IRIRIRIRIRIRIRIRIRIR
IRIRIRIRIRIRIRIRIRIR
IRIRIRIRIRIRIRIRCJNEMUX
CJNEMUXSUL
Figura 129. Dispositivo diseñado en el entorno gráfico de Altera LOGALU.
158
Cjnemux. Este dispositivo fue diseñado en VHDL y tiene como función dar una
salida alta cuando la instrucción que está cargada en el registro IR es: cjne
@Ri,#data,rel o cjne Rn,#data,rel. Tiene una única entrada para el código de
instrucción IR[7..0] y una única salida s (ver figura 130).
Figura 130. Dispositivo diseñado en lenguaje de descripción hardware VHDL
CJNEMUX.
Cjnemux1. Este dispositivo fue diseñado en VHDL y tiene como función dar una
salida baja cuando la instrucción que está cargada en el registro IR es: cjne
A,#data,rel o cjne A,direct,rel. Tiene una única entrada para el código de
instrucción IR[7..0] y una única salida s (ver figura 131).
Figura 131. Dispositivo diseñado en lenguaje de descripción hardware VHDL
CJNEMUX1.
10.2.3.12.3 Arreov. Este dispositivo se encarga de dar el indicador de
desbordamiento OVERFLOW al registro PSW, a partir de unas señales de
159
desbordamientos aisladas, como lo son: la señal de desbordamiento por adición,
por multiplicación y por división.
Tiene una entrada de desbordamiento por adición OVA, una entrada de
desbordamiento por división OVD, una entrada de desbordamiento por
multiplicación OVM, una entrada de la palabra de operación IR[7..0] y una única
salida Q (ver figura 132). Para ver código referirse al anexo A.
Figura 132. Dispositivo diseñado en lenguaje de descripción hardware VHDL
ARREOV.
Para desarrollar el dispositivo unidad aritmética lógica, se encontraron una serie
de similitudes en las palabras de operación y se formaron grupos. Las
instrucciones INC y DEC están en un grupo; las instrucciones de ADD, ADDC y
SUBB están otro grupo; las instrucciones OR, ANL y XRL están en un tercer grupo;
las instrucciones CPL C, CLR C, SETB C, ORL C,/bit, ANL C,/bit, MOV C,bit, MOV
bit,C, ANL C,bit, CPL bit, CLR bit, SETB bit y ORC,bit están en un cuarto grupo; las
instrucciones JBC, JB, JNB, JC, JNC, JZ, y JNZ están en un quinto grupo; las
instrucciones de llamado a subrutina y salto absoluto están en un sexto grupo; las
instrucciones de almacenamiento están en un séptimo grupo; las instrucciones
160
SWAP, DA, CLR A y CPLA están en un octavo grupo y las instrucciones de salto
DJNZ y CJNE están en otro grupo. Estos grupos fueron formados por similitud de
en las instrucciones y tomando encuentra los bits menos significativos del nibble
alto de la palabra de operación.
El dispositivo PUREBA4 tiene una frecuencia máxima de funcionamiento de
51.28MHz y un retardo máximo en la salida de 50.7ns.
Veamos el sumario de compilación del dispositivo y cuantos recursos del flex10k
necesita.
Figura 133. Sumario de compilación del dispositivo PRUEBA4.
10.2.3.13 Unidad_bits. Este dispositivo es el encargado de ejecutar todas las
operaciones que se hacen con bits, tales como MOV C,bit, CLR bit, JB bit,rel, etc.
Tiene una entrada de la palabra de operación IR[7..0], una entrada de datos
DATOIN[7..0], una entrada de selección de bits BITS[2..0], una entrada de acarreo,
una entrada indicadora de cero en el acumulador Z, una entrada indicadora de
salto, una entrada de habilitación de salida al bus EOBIT, una entrada indicadora
de acarreo por adición, una entrada indicadora de acarreo por unidad de
intercambio de la ALU, una entrad indicadora de acarreo por unidad de
161
corrimiento de la ALU, una entrada de acarreo por dispositivo CJNE de la ALU, una
salida indicadora de salto S, una salida de acarreo COUT y una salida de datos al
bus DATOUT[7..0] (ver figura 134).
Figura 134. Dispositivo diseñado en ele entorno gráfico de Altera UNIDAD_BITS.
En su interior este dispositivo está compuesto por tres dispositivos. PRUBIT,
ARRECARRY, TRI y SALTOARRE (ver figura 135).
Figura 135. Esquema del dispositivo UNIDAD_BITS.
162
10.2.3.13.1 Prubit. Este dispositivo es el encargado de hacer las operaciones con
bits, él recibe en una entrada el byte que contiene bit y en otra la codificación del
bit requerido. Aparte de estas entradas posee una entrada para al acarreo, la
bandera de cero y la señal indicadora de salto. Como salida tiene: una salida de
acarreo, una salida indicadora de salto que va a la máquina de estados y una
salida de datos al bus DATOOUT[7..0] (ver figura 136).
Este dispositivo primero saca el bit necesario para realizar la instrucción, después
dependiendo del valor de la entrada IR[7..0] ejecuta la operación con la ayuda de
CIN, Z y R; finalmente acomoda el bit resultante en el byte y lo coloca a la salida.
Para ver código referirse al anexo A.
Figura 136. Dispositivo diseñado en lenguaje de descripción hardware VHDL
PRUBIT.
10.2.3.13.2 Arrecarry. Este dispositivo se encarga de escoger cual de las entradas
CADDER, CEXCH, CCORR, CCJNE y CBIT va a la salida, dependiendo del código de
operación que se encuentre en la entrada IR[7..0] (cumple una función de
multiplexor) (ver figura 137). Para ver código referirse al anexo A.
163
Figura 137. Dispositivo diseñado en lenguaje de descripción hardware VHDL
ARRECARRY.
10.2.3.13.3 Saltoarre. El dispositivo Saltoarre fue diseñado en lenguaje VHDL,
Tiene una entrada para el estado actual SA[4..0], una entrada para el código de
operación IR[7..0], una entrada indicadora de salto SQ, una salida indicadora de
salto s. Su función es generar la salida indicadora de salto que va conectada a la
máquina de estados (ver figura 138). Para ver código referirse al anexo A.
Figura 138. Dispositivo diseñado en lenguaje de descripción hardware VHDL
SALTOARRE.
10.2.3.13.4 Compilación del dispositivo Unidad_bits. Debido a que este
dispositivo no cuenta con una señal de reloj, no podemos obtener la frecuencia
máxima de funcionamiento, pero si el retardo máximo en la salida que es de
52.8ns. Veamos el sumario de compilación de este dispositivo.
164
Figura 139. Sumario de compilación del dispositivo UNIDAD_BITS
10.2.3.14 Arre_ramex. Este dispositivo se encarga de escoger entre memoria
interna o memoria externa. Tiene una única entrada de instrucción IR[7..0] con la
que selecciona la memoria externa o interna y una salida de selección de
memoria (ver figura 140), cuando la salida es “10” la memoria seleccionada es la
externa y cuando el valor de la salida es “01” la memoria seleccionada es la
interna.
Figura 140. Dispositivo diseñado en lenguaje descripción hardware VHDL
ARRE_RAMEX.
10.3 MAQUINA DE ESTADOS DEL FLEX51
La máquina de estados es dispositivo de control más importante del
microcontrolador embebido FLEX51, fue diseñado en lenguaje AHDL puesto que
es mucho más fácil su implementación y corrección a la hora de presentarse
cualquier error, su función es señalar el estado a seguir dependiendo del código
de operación y las banderas de interrupción y salto. El nombre de este dispositivo
165
es CPU. Utiliza de 22 estados para llevar a cabalidad todo el set de instrucciones
del 8051 y cada estado se realiza en un pulso de reloj.
Este dispositivo tiene una entrada de reloj CLK, una entrada de clareo RESET, una
entrada indicadora de interrupción, una entrada indicadora de salto, una entrada
para el código de operación y una única salida indicadora del estado siguiente
SA[4..0] (ver figura 141).
Figura 141. Dispositivo diseñado en lenguaje de descripción hardware AHDL CPU.
Veamos cuantos estados requiere cada tipo de instrucción en los diferentes
grupos (una tabla para cada grupo de instrucciones), y recordemos que el número
de estados es igual que el número de ciclos de reloj, puesto que el
microcontrolador embebido Flex51 no cumple con el estándar de 12, 24 y 48
ciclos de reloj para ejecutar una instrucción.
Tabla 14. Tabla de operaciones aritméticas con su número de estados
MNEMONICO BYTE ESTADOS
ADD A,Rn 1 6
166
ADD A,direct 2 5
ADD A,@Ri 1 8
ADD A,#data 2 4
ADDC A,Rn 1 6
ADDC A,direct 2 5
ADDC A,@Ri 1 8
ADDC A,#data 2 4
SUBB A,Rn 1 6
SUBB A,direct 2 5
SUBB A,@Ri 1 8
SUBB A,#data 2 4
INC A 1 3
INC Rn 1 6
INC direct 2 5
INC @Ri 1 8
DEC A 1 3
DEC Rn 1 6
DEC direct 2 5
DEC @Ri 1 8
INC DPTR 1 3
MUL AB 1 5
DIV AB 1 5
DA 1 3
167
Tabla 15. Tabla de operaciones lógicas con su número de estados
MNEMONICO BYTE ESTADOS
ANL A,Rn 1 6
ANL A,direct 2 5
ANL A,@Ri 1 8
ANL A,#data 2 4
ANL direct,A 2 5
ANL direct,#data 3 6
ORL A,Rn 1 6
ORL A,direct 2 5
ORL A,@Ri 1 8
ORL direct,A 2 5
ORL direct,#data 2 6
ORL A,#data 3 4
XRL A,Rn 1 6
XRL A,direct 2 5
XRL A,@Ri 1 8
XRL A,#data 2 4
XRL direct,A 2 5
XRL direct,#data 3 6
CLR A 1 3
CPL A 1 3
RL A 1 3
RLC A 1 3
168
RR A 1 3
RRC A 1 3
SWAP A 1 3
Tabla 16. Tabla de operaciones de transferencia de datos con su número de
estados.
MNEMONICO BYTE ESTADOS
MOV A,Rn 1 5
MOV A,direct 2 4
MOV A,@Ri 1 7
MOV A,#data 2 4
MOV Rn,A 1 4
MOV Rn,direct 2 6
MOV Rn,#data 2 5
MOV direct,A 2 5
MOV direct,Rn 2 7
MOV direct,direct 3 7
MOV direct,@Ri 2 9
MOV direct,#data 3 5
MOV @Ri,A 1 6
MOV @Ri,direct 2 7
MOV @Ri,#data 2 7
MOV DPTR,#data16 3 4
169
MOVC A,@A+DPTR 1 4
MOVC A,@A+PC 1 4
MOVX A,@Ri 1 7
MOVX A,@DPTR 1 4
MOVX @Ri,A 1 6
MOVX @DPTR,A 1 3
PUSH direct 2 6
POP direct 2 7
XCH A,Rn 1 7
XCH A,direct 2 6
XCH A,@Ri 1 9
XCHD A,@Ri 1 9
Tabla 17. Tabla de operaciones de manipulación de variables booleanas con su
número de estados.
MNEMONICO BYTE ESTADOS
CLR C 1 3
CLR bit 2 7
SETB C 1 3
SETB bit 2 7
CPL C 1 3
CPL bit 2 7
ANL C, bit 2 7
170
ANL C,/bit 2 7
ORL C, bit 2 7
ORL C,/bit 2 7
MOV C,bit 2 7
MOV bit,C 2 7
JC rel 2 5
JNC rel 2 5
JB rel 3 9
JNB rel 3 9
JBC rel 3 10
Tabla 18. Tabla de operaciones de salto de programa con su número de estados
MNEMONICO BYTE ESTADOS
ACALL addr11 2 8
LCALL addr16 3 9
RET 1 7
RETI 1 7
AJMP addr11 2 4
LJMP addr16 3 4
SJMP rel 2 6
JMP @A+DPTR 1 4
JZ rel 2 5
JNZ rel 2 5
171
CJNE A,direct,rel 3 7
CJNE A,#data,rel 3 7
CJNE Rn,#data,rel 3 10
CJNE @Ri,#data,rel 3 12
DJNZ Rn,rel 2 8
DJNZ direct,rel 3 7
NOP 1 3
Veamos que función cumple cada uno de los estados en la CPU (también ver
figura 142).
S0: Este estado se encarga únicamente de generar la señal de carga en el registro
de instrucciones IR.
S1: Este estado se encarga de interpretar el código de la instrucción.
S2: Se encarga de finalizar la ejecución de la instrucción y de escoger el estado
siguiente cuando se ha presentado una interrupción.
S3: Este estado es muy utilizado en instrucciones de direccionamiento inmediato y
su función es cargar los resultados en los registros o posiciones de memoria
finales.
172
Figura 142. Máquina de estados del FLEX51.
S4: Este estado se usa generalmente en instrucciones de direccionamiento
indirecto y su función es acomodar la dirección del registro que se usa en la
instrucción en el registro TMPL de la unidad AGU.
S5: Este estado cumple diferentes funciones, tales como: guardar en la memoria
de datos y colocar la dirección en el bus para utilizar la memoria de datos.
173
S6: Este estado se encarga de acomodar la dirección del registro o posición de
memoria que se usa en la instrucción para cuando se utiliza direccionamiento
directo.
S7: Este estado al igual que S3 se utiliza para cargar los resultados de las
operaciones en los registros y posiciones de memoria finales.
S8: La función de este estado es habilitar la salida de los datos al bus en la unidad
de bits.
S9: Su función es habilitar la carga de datos en el registro B cuando se genera una
petición de interrupción.
S10: Se usa comúnmente en operaciones de direccionamiento indirecto como un
estado de espera, debido a que la memoria de datos es sincronía y se demora un
estado en realizar las operaciones.
S11: Este estado se utiliza como estado mixto pues cumple diversas funciones
dando soporte a los demás estados (ejemplo: estado de espera, lectura de la
memoria de datos, etc).
S12: Es el encargado de decidir a cual estado sigue (S2 o S15) en las instrucciones
de salto.
174
S13: Este estado cumple funciones de estado de espera, estado nulo y carga en el
registro TMP2 de la ALU.
S14: Se ocupa de cargar el resultado bajo de la suma (PC + rel) en las operaciones
de salto.
S15: Se ocupa de cargar el resultado alto de la suma (PC + rel) en las operaciones
de salto.
S16: Este estado habilita la salida baja de la dirección del vector de interrupción.
S17: Este estado habilita el incremento del registro SP.
S18: Este estado cumple la función de escritura en la memoria el valor contenido
de la parte baja del PC y habilitación de incremento del registro SP.
S19: Este estado cumple la función de escritura en la memoria el valor contenido
de la parte alta del PC.
S20: Este estado se encarga de cargar en la parte alta del PC el contenido del
registro temporal 1 de la ALU.
S21: Este estado se encarga de cargar en la parte baja del PC el contenido del
registro temporal 2 de la ALU.
175
Veamos el ejemplo de cómo se ejecuta la instrucción DJNZ Rn,rel: En esta
instrucción se utilizan 9 estados. En el estado S0 se genera la señal de carga del
registro de instrucciones; en el estado S1 se interpreta el código de la instrucción;
se selecciona la salida 3 al bus interno y la carga del TMPL de la AGU; en el
estado S5 se habilita la salida del contenido del TMPH y TMPL al bus de
direcciones; en el estado S11 se carga la salida del dato del banco de registros y
se carga en el registro TMP2 de la ALU para ser decrementado; en el estado S7 se
carga el resultado en banco de registros nuevamente; en el estado S12 se habilita
la lectura de la memoria de programa y carga dato en TMP2 de la ALU; el estado
S15 se ejecuta si la bandera indicadora de salto está activa, este estado habilita la
salida del TMP2 para generar la parte baja del dato que se suma en la AGU para
las operaciones con saltos y el resultado alto se carga en el PCH; el estado S14
habilita la salida del TMP2 y carga el resultado bajo del sumador de la AGU en el
PCL; por ultimo este estado selecciona la actualización de la bandera de paridad.
Si no se genera una señal alta en la bandera indicadora de salto, se pasa del
estado S12 al estado S2.
Después de haber desarrollado cada una de las partes del microntrolador FLEX51,
veamos cuantos recursos del dispositivo FLEX10K utiliza y cual es la velocidad
máxima alcanzada (ver figura 143).
176
Figura 143. Sumario de compilación del microcontrolador FLEX51.
La frecuenta máxima del microcontrolador FLEX51 para este primer desarrollo de
él es de 5.17MHz y tiene un retardo máximo de 54ns. Hay que tener en cuenta
que este es un primer paso, y que aun faltan muchas adaptaciones y mejoras que
se pueden realizar en fututos trabajos de tesis.
177
11. PERIFERICOS DEL FLEX51
En esta sección se mostrarán los dispositivos periféricos con los que cuenta el
microcontrolador embebido Flex51, como son la unidad serial, la unidad de
temporizadores y la unidad de interrupciones.
Estos dispositivos hay que dejar muy claro que son dispositivos adicionales y que
no tienen que ver en nada con el cumplimiento de funcionamiento del set de
instrucciones del 8051, por tal motivo estos dispositivos no son diseñados
fielmente al estándar del 8051 en su arquitectura, pero si en su funcionamiento.
11.1 UNIDAD SERIAL
Este es un dispositivo periférico del Flex51, trasmite y recibe 10 bits (un bit de
inicio de transmisión que es cero, 8 bits de datos y el bit de stop que es uno) y no
es guiado por alguno de los modos de operación serial del microcontrolador
8051. Para seleccionar la velocidad utiliza una fórmula que veremos con mayos
detenimiento al final de esta sección.
Consta de 8 entradas de 1 bit (entrada de clareo CLR, entrada de carga del
registro sbuf LD, entrada de selección del registro sbuf N11, entrada de reloj CLK,
entrada de carga del generador de rata de baudios, un habilitador de salida ED,
una entrada serial RX y una entrada de selección del registro scon N12) y una
178
entrada de datos de 8 bits. Tiene una salida de bandera de interrupción INTS, una
salida de transmisión serial de 1 bit y una salida de datos de 8 bits (ver figura
144).
Figura 144. Dispositivo diseñado en el entorno grafico de ALTERA
UNIDAD_SERIAL.
Este dispositivo está compuesto principalmente por una unidad de transmisión
serial, una unidad de recepción serial, un preescaler y el registro SCON.
11.1.1 Unidad de transmisión. Su función es realizar la operación de transmisión.
Este dispositivo tiene una entrada de reloj CLK global, una entrada de reloj
proveniente del dispositivo PREESCALER, una entrada de carga de datos en el
generador de rata de baudios FCLK, una entrada de clareo CLR, una entrada de
datos DATO[7..0], una entrada de carga del registro de transmisión LD y una
entrada de selección de registro N11. Como salida tiene una señal de transmisión
serial TX y una bandera de interrupción de transmisión (ver figura 145).
179
Figura 145. Dispositivo diseñado en el entorno grafico de ALTERA TRANSMISION.
Este dispositivo en su interior esta constituido por los siguientes dispositivos:
BAUDRATE, REG8B, REG8BTRANS, MQTX, CONTBAUDRATE y FFD1 (algunos de
estos dispositivos fueron descritos en capítulos anteriores) (ver figura 146).
Figura 146. Esquema del dispositivo TRANSMISION.
180
El funcionamiento de este dispositivo es el siguiente: El dispositivo BAUDRATE
almacena un valor con el cual se genera la señal para la transmisión en forma de
pulsos y con un intervalo de tiempo definido en baudios (ejemplo: una
transmisión a 9600 baudios); esta señal se lleva a un contador CONTBAUDRATE,
quien después de un número definido (11) genera la señal de fin a la maquina de
estados de este dispositivo. Por otro lado para empezar a transmitir este
dispositivo, se carga primero el valor en el registro REG8B, esta señal de carga es
el inicio para la máquina de estados del dispositivo, el dato se desplaza en el
dispositivo REG8BTRANS que tiene como salida serial TX. Una vez el dispositivo
CONTBAUDRATE cuenta los 11 pulsos y se genera la señal de fin, se deja de
desplazar el dato y la máquina de estados genera la bandera de interrupción T1.
Cuando no está transmitiendo nada la en la salida TX hay un uno.
11.1.1.1 Baudrate. Este dispositivo se encarga de generar la rata de baudios de
transmisión. Su funcionamiento es el siguiente: se almacena un dato, el cual es el
valor es el inicio del contador, cuando el contador se desborda genera un pulso
alto; en su primer conteo el dispositivo empieza en el dato más la mitad del valor
restante.
Consta de una entrada de reloj CLK, una entrada de carga L, una entrada de
habilitación de conteo, una entrada de datos A[7..0] y una salida M (ver figura
147).
181
Este dispositivo está dispuesto en la posición de memoria 97h. Para ver su código
referirse al anexo A.
Figura 147. Dispositivo diseñado en lenguaje de descripción hardware VHDL
BAUDRATE.
11.1.1.2 Mqtx. Este dispositivo es la máquina de estados de transmisión y cuenta
con cuatro estados; tiene una entrada de reloj, una entrada de clareo, una entrada
de inicio y una entrada de fin. Sus salidas son: clareo de contador CLEAR, señal
desplazamiento SEND, señal de carga en registro de desplazamiento LOAD y la
señal de bandera de interrupción T1 (ver figura 148). Para ver el código de este
dispositivo referirse al anexo B.
Figura 148. Dispositivo diseñado en lenguaje de descripción hardware AHDL
MQTX.
182
11.1.2 Unidad de recepción. Su función es recibir los datos que lleguen de manera
serial en el pin RX. Este dispositivo tiene entrada de reloj CLK global, una entrada
de reloj proveniente del dispositivo preescaler, una entrada de recepción serial
RX, una entrada de datos DATO[7..0], una entrada de habilitación global SFRs ED,
una entrada de selección de registro N11 (SBUF) y una entrada de carga de datos
del dispositivo generador de rata de baudios de recepción. Como salida tiene la
bandera de interrupción de recepción serial R1 y la de datos DATOUT[7..0] (ver
figura 149).
Este dispositivo en su interior se conforma por: FFD, FFD1, REG8B, REG8BREPC,
TRI, CONTBAUDRATE1 (ver figura 150).
Figura 149. Dispositivo diseñado en el entorno grafico de ALTERA RECEPCION.
183
Figura 150. Esquema del dispositivo RECEPCION.
El dispositivo funciona de la siguiente manera: primero se debe cargar siempre el
dato en el dispositivo BAUDRATE1 para generar la rata de baudios de recepción,
una vez se ha hecho este proceso se está listo para recibir datos; en la entrada RX
siempre se detecta un uno, cuando esta señal cambia a cero da el inicio de
recepción a la máquina de estados, por ende la máquina de estados le da el inicio
al contador CONTBAUDRATE1 y al registro de desplazamiento. Cuando el
contador llega al tope genera la señal de fin que va a la máquina de estados y esta
da la señal de carga en el registro de salida REG8BREPC; la salida al bus de datos
es controlada por un dispositivo TRI.
184
11.1.2.1 Mqrx. Este dispositivo es la máquina de estados de recepción y cuenta
con tres estados; tiene una entrada de reloj CLK, una entrada de clareo RESET, una
entrada de inicio STAR y una entrada de fin. Sus salidas son: clareo de contador
CLEAR, señal desplazamiento E, señal de carga en registro de salida LOADSBUF y
la señal de bandera de interrupción R1 (ver figura 151). Para ver el código de este
dispositivo referirse al anexo B.
Figura 151. Dispositivo diseñado en lenguaje de descripción hardware AHDL
MQRX.
11.1.3 Preescaler. Este dispositivo es que gran importancia dentro de la unidad
serial, puesto que como la frecuencia de reloj en la mayoría de los casos es muy
grande, es necesario dividir esa frecuencia. Este dispositivo divide la frecuencia en
2, 4, 8, 16, 32 y 64 (ver figura 152).
Figura 152. Dispositivo diseñado en el entorno grafico de ALTERA PREESCALER.
185
Este dispositivo se compone en su interior por un contador CONT_REG6B y un
multiplexor MUXPREES. El funcionamiento de este dispositivo es el siguiente: la
señal de reloj global llega a la entrada de reloj del contador, la salida del contador
Q[5..0] se lleva a las entradas del multiplexor, finalmente la salida del multiplexor
es seleccionada por la entrada S[2..0] que viene de SCON[4..3](ver figura 153).
Figura 153. Esquema del dispositivo PREESCALER.
11.1.4 Scon. Este dispositivo cumple las funciones del registro SCON del
microcontrolador 8051. Tiene una entrada de carga de datos SLOAD, una entrada
de clareo SCLR, una entrada de reloj, entrada de la bandera de interrupción por
transmisión, una entrada de la bandera de interrupción por recepción, una
entrada de datos D[7..0] y una entrada de habilitación de salida al bus de datos.
Tiene una salida al bus de datos Q[7..0] y una salida Q1[4..2] (ver figura 154) que
se conecta a la entrada de selección del dispositivo preescaler.
186
Figura 154. Dispositivo diseñado en el entorno grafico de ALTERA SCON.
Este dispositivo se compone por el registro REGSCON, el dispositivo CABLE y el
dispositivo TRI. El funcionamiento de este dispositivo es el siguiente: el
dispositivo REGSCON puede variar su contenido por una señal de carga SLOAD,
una señal de clareo SCLR, la bandera de interrupción por transmisión y la bandera
de interrupción por recepción (en estos casos se modifica algunos bits), cuando
ninguna de estas señales están presentes el registro se encuentra en constante
retroalimentación por medio del dispositivo CABLE. La salida al bus de datos pasa
primero por el dispositivo TRI y la salida que se lleva al dispositivo PREESCALER se
toma directamente de la salida del registro (ver figura 155).
Figura 155. Esquema del dispositivo SCON.
187
11.1.5 Funcionamiento general de la unidad serial. El funcionamiento de esta
unidad es muy sencillo, primero se debe asegurar la carga del valor calculado en
el dispositivo BAUDRATE y acomodar el dispositivo preescaler para generar la rata
de baudio necesaria para la comunicación, una vez hecho esto ya está listo para
iniciarse la comunicación.
La comunicación empieza cuando se da la instrucción MOV SBUF,#dato o MOV
dir_SBUF,#dato en el caso de ser una transmisión y cuando cambia de alto a bajo
en la entrada RX en el caso de ser una recepción.
Figura 156. Esquema del dispositivo UNIDAD_SERIAL. a)Preescaler, b)Transmisión,
c)recepción, d)scon.
188
11.1.6 Fórmula para generar la rata de baudios. La fórmula para calcular el
número que se debe cargar en el dispositivo BAUDRATE y BAUDRATE1 y generar
los pulsos para operación de transmisión o recepción es:
baudiosrataFCLKx_
256 −=
La variable FCLK es la frecuencia de reloj después de ser divida por el dispositivo
preescaler y la variable rata_baudios, es la rata de baudios necesaria para llevar a
cabo la comunicación (por ejemplo: 300, 1200, 2400, 4800, 9600 baudios, etc).
Para lograr una transmisión a 9600 debe cargar 0c0H en el registro SCON y 0d7H
en la posición de memoria 97H.
Veamos el sumario de compilación de este dispositivo.
Figura 157. Sumario de compilación de la unidad serial.
La frecuencia máxima de este dispositivo es de 29.06MHz y su retardo máximo es
de 37ns.
189
11.2 UNI_INTERRUPCIONES
Este dispositivo fue diseñado en el entorno gráfico de altera y está compuesto por
dispositivos flp-flops, decodificadores y máquinas de control. La función principal
de este dispositivo es generar la señal indicadora de interrupción a partir de una
selección entre las cinco posibles fuentes de interrupción, para obtener esta señal
resultante se toma muy en cuenta el registro IE e IP (registro de habilitación de
interrupciones y registro de prioridad de interrupciones).
Tiene una entrada de reloj CLK, una entrada de clareo CLR, una entrada global de
carga LINT, una entrada global de habilitación de salida al bus de datos, una
entrada selectora de registro SFRs N[5..4], , una entrada para la bandera de
interrupción por desbordamiento de timer 0 y 1 TF[1..0], una entrada de clareo CL
para el primer decodificador, una entrada de clareo D para el segundo
decodificador, dos entrada de habilitación de salida al bus X[42..41], una salida
indicadora de de interrupción INT y una salida para datos INTEROUT[7..0] (ver
figura 158).
Figura 158. Dispositivo diseñado en el entorno grafico de ALTERA
UNI_INTERRUPCIONES.
190
11.2.1 Funcionamiento general del dispositivo UNI_INTERRUPCIONES. El
funcionamiento de este dispositivo es el siguiente: como primera medida para
que alguna interrupción pueda ser atendida, esta debe ser habilitada en el
registro IE. Bien, una vez se tiene señalada la interrupción que se va a utilizar se
lleva a un arreglo de compuertas AND para habilitar los flip-flops de entrada,
estos flip-flops generan una entrada del dispositivo INTERRUP (E[4..0]) que junto
con la entrada IP[4..0] hacen que la máquina de estados seleccione el vector de
interrupción deseado. La salida de la máquina de estados es llevada al
decodificador 2 (DECINT) y luego al arreglo de flip-flops de la salida, para
finalmente con ayuda de una compuerta OR de cinco entradas se genera la señal
de interrupción que es lleva al dispositivo CPU. Veamos el diagrama esquemático
de esta unidad (ver figura 159).
191
Figura 159. Esquema del dispositivo UNI_INTERRUPCIONES. a)arreglo de flip-flops
1, b) registro IR, c)registro IP, d)decodificador de interrupciones 1, e)interrup,
f)decodificador de interrupciones 2, g)arreglo de slip-flops 2.
Figura 160. Sumario de compilación del dispositivo UNI_INTERRUPCIONES.
192
La frecuencia máxima de este dispositivo es de 21.50MHz y su retardo máximo es
de 35ns.
11.2.2 INTERRUP. Este dispositivo equivale a la máquina de estados de la unidad
de interrupciones y se diseño en lenguaje AHDL. Consta de seis estados, en donde
el estado cero es un estado de no actividad y los estados siguientes son de
selección de vector de interrupción.
Tiene una entrada de selección de interrupción IE[4..0], una entrada de selección
de prioridad IP[4..0], una entrada de reloj y una única salida Q[5..0] (ver figura
161). Para ver su código referirse al anexo B.
Figura 161. Dispositivo diseñado en lenguaje de descripción hardware AHDL
INTERRUP.
Los demás dispositivos que forma la unidad de interrupciones fueron descritos en
capítulos anteriores.
193
11.3 UNIDAD DE TIMERS
Esta unidad es uno el único de dispositivos periféricos implementados para el
microcontrolador embebido flex51 que su arquitectura emula el funcionamiento
de todos modos que funcionan en el microcontrolador 8051.
La unidad de timers tiene una entrada de datos dato_in[7..0], una entrada de
clareo RESET, una entrada de reloj CLK, entrada de carga de datos global LBREG,
una entrada de habilitación de salida EOTIMER, una entrada de interrupción
externa /INT[1..0], una entrada de habilitación de dispositivo de la zona de
funciones especiales S[19..14], una salida de bandera de interrupción por de
desbordamiento de temporizador 0 TF0, una salida de bandera de interrupción
por desbordamiento de temporizador 1 TF1 y una salida de datos al bus
TIMEROUT[7..0] (ver figura 162).
Figura 162. Dispositivo diseñado en el entorno gráfico de Altera UNI_TIMER-
COUNTER.
194
Vemos las características de los modos de funcionamiento de la unidad de
temporizadores y contadores que se implementaron en el Flex51.
Modo 0. En este modo el registro temporizador se configura como registro de 13
bits y cuando se desborda genera una bandera TF1. La entrada del temporizador
es habilitada por una señal alta en TR1 And con la salida de una operación OR
entre la entrada /INT =1 y GATE = 0. En el caso que GATE sea 1 todos
temporizadores son controlados por entrada externa /INT. De igual forma
funciona para el temporizador contador 0.
Modo 1. Este modo tiene el mismo funcionamiento del modo 0 pero con un
registro de 16 bits. De igual forma funciona para el temporizador contador 0.
Modo 2. En este modo se configura el registro temporizador como un contador de
8 bits TL1 con recarga automática, o sea que cuando se desborda el temporizador
TL1, es cargado con el valor contenido en el registro TH1. De igual forma
funciona para el temporizador contador 0.
Modo 3. En este modo el temporizador 1 no entra en funcionamiento, por el
contrario el temporizador 0 se convierte en dos contadores separados TL0 y TH0,
donde el contador TL0 mantiene sus señales de control y de salida propias (TR0,
INT0, TF0), mientras que el contador TH0 utiliza las señales de control del
temporizador 1 (TR1,TF1).
195
Veamos la unidad timer-counter por etapas:
Figura 163. Esquema del temporizador cero.
Figura 164 Esquema del temporizador uno.
196
Figura 165 Esquema de la salida de la unidad timer-counter. a)TCON, b)TMOD,
c)arreglo de salidas.
Veamos el sumario de compilación de este dispositivo en la figura 166.
197
Figura 166. Sumario de compilación del dispositivo TIMER-COUNTER.
La frecuencia máxima de este dispositivo es de 15.01MHz y tiene un retardo
máximo de 43.8ns.
11.3.1 Tcon. Este dispositivo cumple las funciones del registro TCON del
microcontrolador 8051. Tiene una entrada de carga de datos SLOAD, una entrada
de clareo SCLR, una entrada de reloj, una entrada de la bandera de interrupción
por desbordamiento del temporizador 0, una entrada de la bandera de
interrupción por desbordamiento del temporizador 1, una entrada de las banderas
de interrupción externas IE[1..0], una entrada de datos D[7..0] y una entrada de
habilitación de salida al bus de datos OC. Tiene una salida al bus de datos Q[7..0]
y una salida Q1[7..0] (no es una salida tri-estado) (ver figura 167).
Figura 167. Dispositivo diseñado en el entorno gráfico de altera TCON.
198
Este dispositivo se compone por el registro REGTCON, el dispositivo CABLE y el
dispositivo TRI. El funcionamiento de este dispositivo es el siguiente: el
dispositivo REGTCON puede variar su contenido por una señal de carga SLOAD,
una señal de clareo SCLR, la bandera de interrupción por desbordamiento del
temporizador 0, la bandera de interrupción por desbordamiento del temporizador
1, la bandera de interrupción externa 0 y la bandera de interrupción externa 1 (en
estos casos se modifica algunos bits), cuando ninguna de estas señales están
presentes, el registro se encuentra en constante retroalimentación por medio del
dispositivo CABLE. La salida al bus de datos pasa primero por el dispositivo TRI y
la salida que es tri-estado se lleva como control de los dispositivos de esta unidad
(ver figura 168).
Figura 168. Esquema del dispositivo TCON.
El registro TMOD se implementó con el dispositivo STD_REG8B22 que fue
explicado en capítulos anteriores.
199
12. PRUEBAS DE FUNCIONAMIENTO Y
VALIDACIÓN
En este capítulo veremos algunas pruebas realizadas con el microcontrolador
embebido Flex51, donde se comprueba el buen funcionamiento del mismo. Las
pruebas realizadas prueban el funcionamiento partes del Flex51, tales como: Los
puertos de entrada y salida, interrupciones externas, unidad de transmisión y
recepción serial, multiplicador, entre otros.
Cabe decir que el programa para cada una de las pruebas se desarrolló bajo el
software Keil uVision 7, el cual es un compilador para 8051; este software genera
un archivo con extensión HEX, que se carga en la memoria rom del Flex51, una
vez hecho esto se compila y se programa en el sistema UPX2.
Para poder implementar cada una de estas pruebas se tuvo que acondicionar un
entorno que ayudase al microcontrolador flex51 funcionar correctamente, por
ejemplo se tuvo que agregar unos decodificadores 7447 a la salida del puerto 2
para la prueba 1 y adicionar un dispositivo que dividiera la frecuencia de la señal
de reloj pues era demasiado grande (se divide por 8, 25MHz/8) (ver figura 169).
200
Figura 169. Montaje de dispositivos en ALTERA para pruebas.
Veamos el montaje físico (ver figura 170).
Figura 170. Tarjeta UP2 y protoboard.
201
12.1 PRUEBA 1: TABLAS DE MULTIPLICAR DE 4 X (0 - F). HEXADECIMAL
La finalidad de esta prueba es la de mostrar el buen funcionamiento de los
puertos de entrada y salida de datos, instrucciones usando el banco de registros,
instrucciones usando el acumulador y el registro b, y la operación multiplicación.
Esta prueba se creó pensando en utilizar los recursos que trae el sistema de
desarrollo UPX2, como el dip switch y el display siete segmentos.
Esta prueba consiste en almacenar un valor constante en el registro R2 del banco
de registros (en este caso el valor #04h) y el valor de entrada en el puerto P0 se
almacena en el acumulador, luego el valor contenido en el registro R2 se lleva al
registro b para realizarse la multiplicación entre A y B. El resultado del contenido
en el acumulador se lleva al puerto P2. Para ver sumario de compilación ver figura
171.
El código de la prueba es el siguiente.
org 0000h
s: mov r2,#4h
mov a,p0
mov b,r2
mul ab
mov p2,a
ljmp s
end
202
Figura 171. Sumario de compilación del FLEX51 con el programa de la prueba 1.
Veamos la simulación de esta prueba, primero se carga el número 4 en el registro
R2 con la instrucción 7Ah, luego se ingresa el número 2 por el puerto 0 con la
instrucción E5h en el estado S3, seguidamente cargamos el valor del registro R2
en el registro B con la instrucción 8Ah en el estado S7, después se realiza la
multiplicación entre A y B (A4h), finalmente se carga el valor de A en el puerto 2
con la instrucción F5h justamente en el cambio del estado S7 al estado S2.
Figura 172. Simulación de la prueba 1 en donde se multiplica 4 h x 2h.
12.2 PRUEBA 2: CONTADOR DE EVENTOS
La finalidad de esta prueba es la de mostrar el buen funcionamiento de los
puertos de salida, las interrupciones externas, las instrucciones usando
direccionamiento indirecto.
203
Esta prueba consiste en habilitar la interrupción externa 1 en el registro IE de la
zona de registro de funciones especiales y quedarse esperando en un loop,
cuando es activada la interrupción vamos a la subrutina incrementamos
indirectamente (inc @r1) y finalmente le damos salida por el puerto P2.
El código de la prueba es el siguiente.
org 0000h
mov ie,#84h
ljmp $
org 0013h
inc @r1
mov p2,@r1
reti
end
Veamos un diagrama de bloques del montaje de esta prueba (ver figura 172) y el
sumario de compilación (ver figura 173).
Figura 173. Diagrama de bloques de la prueba 2.
Tarjeta UP2
De Display 7 segmentos P2
Reset
Pulsador
204
Figura 174. Sumario de compilación del FLEX51 con el programa de la prueba 2
Veamos la simulación de esta prueba, en donde se produce una interrupción
externa. Como podemos ver se ejecutan las instrucciones de carga (75h) y se
queda en un loop (02h) esperando que ocurra una petición de interrupción
externa, cuando se presenta la interrupción se ejecutan las instrucciones que
están ubicadas a partir de la posición de memoria a la que apunta el vector de
interrupciones (las instrucciones son 07h, 87h y 32h, y el vector a punta a 0013h)
(ver figura 175).
Figura 175. Simulación de la prueba 2.
Veamos el circuito eléctrico de los pulsadores usan en la prueba.
205
Figura 176. Circuito eléctrico de los pulsadores.
12.3 PRUEBA 3: TRANSMISIÓN SERIAL
En esta prueba se evalúan una variedad de factores, tales como: almacenamiento
de un dato a una posición de memoria, almacenamiento de una posición de
memoria a otra, salto si el bit es cero, datos almacenados en tablas, incremento
del banco de registros, clareo de bits, salto si el acumulador es cero, salto corto y
salto largo entre otros. Esta prueba se trata de mostrar en el hyperterminal un
mensaje guardado en una tabla en el micro y la tecla que se oprimió.
El código cargado en la memoria de programa del flex51 es el siguiente:
ORG 0000H
o: mov ie,#80h
mov 97h,#0d7h
mov scon,#0ch
loi: jnb scon.0,loi
clr scon.0
mov b,sbuf
mov DPTR,#TABLA_1
mov A,#00H
206
mov r3,#00H
L0: movc A,@A+DPTR
inc r3
jz d
mov sbuf,A
s: jnb scon.1,s
clr scon.1
mov A,r3
sjmp L0
d: mov sbuf,b
y: jnb scon.1,y
clr scon.1
ljmp o
ORG 0040H
TABLA_1: db "FLEX51 ud digito: ",00
end
Veamos un diagrama de bloques del montaje de esta prueba (ver figura 174) y el
sumario de compilación (ver figura 175).
207
Figura 177. Diagrama de bloques de la prueba 3.
Figura 178. Sumario de compilación del FLEX51 con el programa de la prueba 3
Veamos un ejemplo de esta prueba en el Hyper Terminal, cuando la persona
presiona la tecla d en el teclado aparece el mensaje “FLEX51 ud digito: ” y la tecla
digitada (ver figura 176).
Figura 179. Resultado de la prueba 3 en el Hyper Terminal.
Tarjeta
UP2 Computador
TX Reset
PulsadoCircuito
Rs-232
208
El circuito Rs-232 que se montó es el siguiente.
Figura 180. Circuito RS-232.
El circuito eléctrico de los pulsadores es el siguiente.
Figura 181. Circuito eléctrico de los pulsadores.
209
13. CONCLUSIONES
El desarrollo de un microcontrolador sintetizable sobre una FPGA, que cumple con
el set de instrucciones del microcontrolador 8051, será un punto de partida para
un sin número de nuevos proyectos y aplicaciones. Desde este punto de vista, el
trabajo realizado aporta un primer cimiento para el desarrollo de sistemas
embebidos, los cuales hoy por hoy son mas llamativos por su velocidad,
economía, espacio etc.
El diseño de la maquina de estados es la parte fundamental del desarrollo,
determinando los ciclos de reloj necesarios para ejecutar una instrucción. Aunque
dichos ciclos se minimizaron, inicialmente no se logro un estándar en cuanto a
numero de ciclos para ejecutar las instrucciones, (12, 24 y 48 ciclos de reloj para
ejecutar todas las instrucciones). Sin embargo, se logro acomodar los estados de
la maquina de estados para ejecutar las instrucciones en menor numero de ciclos
que la mayoría de versiones estándar del 80X51, ayudando así que el
funcionamiento sea un poco mas rápido.
Se pueden obtener sistemas procesadores compatibles con el set de instrucciones
del 80X51 más veloces, reconsiderando la tecnología de fabricación del
dispositivo lógico programable a usar, (Grado de velocidad, Capacidad de
integración, etc) y el tipo de estructura (Von Neuman o Harvard) a implementar.
210
La arquitectura Von Neuman implementada, limita los tiempos de procesamiento
de información y la velocidad de ejecución de las instrucciones, sin embargo es
una solución que requiere menos recursos y es de mas fácil implementación que
una estructura Harvard. Se recomienda explorar nuevas configuraciones
(Hardvard, Pipe-Line), ya que, existen dispositivos FPGA’s con mayor capacidad de
almacenamiento, mayor grado de velocidad.
El diseño del sistema microcontrolador, permite utilizar como plataforma de
desarrollo, cualquier ensamblador que acepte los nomónicos del 80X51. Sin
embargo, algunas de las características del microcontrolador, (modos de bajo
consumo, banderas de usuario, entre otras) no están disponibles por la tecnología
y especificaciones del diseño propuesto.
Con la realización de este proyecto se plantea una propuesta viable para el
desarrollo de nuevas tecnologías hardware en Colombia y en específico por parte
de la Universidad, haciendo uso de los recursos y el talento existentes. El
producto final obtenido con la realización de este proyecto puede darse a conocer
con la intención de ser comercializado y dependiendo de su aceptación, pensar
en él como una opción laboral aprovechando que se cuenta con la experiencia
teórica y practica para su diseño y construcción.
Es importante resaltar, la flexibilidad de integración de periféricos, que hoy por
hoy permite un rápido prototipado de dispositivos a medida, sin desperdiciar así
recursos del microprocesador.
211
14. RECOMENDACIONES
Para un futuro desarrollo de este microcontrolador embebido, se recomienda la
utilización de otra arquitectura como por ejemplo la HARVARD en donde el
procesamiento es más mucho más rápido o replantear el diseño de las unidades
ALU, AGU, CPU encontrando nuevas agrupaciones que favorezcan mucho más el
desempeño que el alcanzado con las planteadas en este trabajo.
Además de esto se recomienda eliminar algunas de las funciones del
microcontrolador, tales como el direccionamiento por bits y el banco de registros,
que retrazan en cierta manera los procesos, por depender de muchos factores.
La utilización de más registros temporales en la unidad ALU, sería de gran ayuda
en el desarrollo de las instrucciones, dando más soporte y haciendo que sean
necesarios menos estados para llevar a cabo la operación deseada.
Migrar a otras plataformas de diseño, ayudaría a una mejor sinterización del
diseño.
212
BIBLIOGRAFIA
8051 [En línea] ALDEC, 2002: [Citada: 9 nov 2003]. Disponible por internet:
www.aldec.com. E-mail: [email protected]
8051[En línea] Digital Core Design, 2003: [Citada: 20 nov 2003]. Disponible por
internet: www.dcd.com.pl.
80c51 [En línea] Intel, 2003: [Citada: 15 oct 2003]. Disponible por internet:
http://www.hoeben.com/80C51_FAM_PROG_GUIDE_1.pdf
80c51 [En línea] Atmel, 2003: [Citada: 15 oct 2003]. Disponible por internet:
http://clubelec.enserg.fr/telechargement/Datasheets/controleur/ATMEL/89C52.
80c51 [En línea] Atmel, 2003: [Citada: 15 oct 2003]. Disponible por internet:
http://www.atmel.com/dyn/resources/prod_documents/doc0313.pdf
Max+plus 10.1 [En línea] Altera, 2003: [Citada: 16 oct 2003]. Disponible por
internet:
https://www.altera.com/support/software/download/altera_design/mp2_baseline
/dnl-baseline.jsp
213
ANEXO A
CODIGO VHDL DEL DISPOSITIVO DEC2TO4.
Decodificador de dos entradas y cuatro salidas con enable.
library ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_signed.all;
USE ieee.std_logic_arith.all;
entity dec2to4 is
port( S: in std_logic_vector( 1 downto 0);
E: in std_logic;
D: out std_logic_vector(3 downto 0));
end entity;
architecture Op of dec2to4 is
begin
process (S,E)
begin
if(E = '0')Then
D <= "0000";
else
case S is
214
when "00" => D<= "0001";
when "01" => D<= "0010";
when "10" => D<= "0100";
when "11" => D<= "1000";
when others=>D<= "0000";
end case;
end if;
end process;
end Op;
CODIGO VHDL DEL DISPOSITIVO DEC2TO4H.
Decodificador de dos entradas cuatro salidas sin enable
library ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_signed.all;
USE ieee.std_logic_arith.all;
entity dec2to4h is
port( S: in std_logic_vector( 1 downto 0);
D: out std_logic_vector(3 downto 0));
end entity;
architecture Op of dec2to4h is
begin
process (S)
215
begin
case S is
when "00" => D<= "0001";
when "01" => D<= "0010";
when "10" => D<= "0100";
when "11" => D<= "1000";
when others=>D<= "0000";
end case;
end process;
end Op;
CODIGO VHDL DEL DISPOSITIVO DECOD127.
Decodificador de la zona de registros de funciones especiales, este código trabaja
a partir de un valor proveniente del bus datos, que para el caso de este
dispositivo es una dirección del registro en el banco de registros SFRs.
library ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_signed.all;
USE ieee.std_logic_arith.all;
entity decod127 is
port(sel: in std_logic_vector( 7 downto 0);
s: out std_logic_vector(20 downto 0));
end entity;
architecture operacion of decod127 is
begin
process
216
begin
case sel is
when "11100000" => s<= "000000000000000000001";--ACC
when "11110000" => s<= "000000000000000000010";--B
when "10000011" => s<= "000000000000000000100";--DPH
when "10000010" => s<= "000000000000000001000";--DPL
when "10101000" => s<= "000000000000000010000";--IE
when "10111000" => s<= "000000000000000100000";--IP
when "10000000" => s<= "000000000000001000000";--P0
when "10010000" => s<= "000000000000010000000";--P1
when "10100000" => s<= "000000000000100000000";--P2
when "10110000" => s<= "000000000001000000000";--P3
when "11010000" => s<= "000000000010000000000";--PSW
when "10011001" => s<= "000000000100000000000";--SBUF
when "10011000" => s<= "000000001000000000000";--SCON
when "10000001" => s<= "000000010000000000000";--SP
when "10001000" => s<= "000000100000000000000";--TCON
when "10001100" => s<= "000001000000000000000";--TH0
when "10001101" => s<= "000010000000000000000";--TH1
when "10001010" => s<= "000100000000000000000";--TL0
when "10001011" => s<= "001000000000000000000";--TL1
when "10001001" => s<= "010000000000000000000";--TMOD
when "10010111" => s<= "100000000000000000000";--LBAUD
when others=> s<= "000000000000000000000";
end case;
end process;
end operacion;
217
CODIGO VHDL DEL DISPOSITIVO DECINT.
Decodificador de la unidad de interrupciones de 6 entradas y 5 salidas. Su señal
de clareo es baja y carga “11111”, igualmente en la parte de selección de salida es
baja.
library ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_signed.all;
USE ieee.std_logic_arith.all;
entity decint is
port( S: in std_logic_vector( 5 downto 0);
CL: in std_logic;
D: out std_logic_vector(4 downto 0));
end entity;
architecture Op of decint is
begin
process (S)
begin
if(CL='0')then
D<="11111";
else
case S is
when "000000" => D<= "11111";
when "000011" => D<= "11110";
218
when "001011" => D<= "11101";
when "010011" => D<= "11011";
when "011011" => D<= "10111";
when "100011" => D<= "01111";
when others=>D<= "11111";
end case;
end if;
end process;
end Op;
CODIGO VHDL DEL DISPOSITIVO MUX1OF2_8B.
Multiplexor de la ALU, dependiendo de la entrada de selección S se escoge la
salida de A o B.
library ieee;
use ieee.std_logic_1164.all;
Entity mux1of2_8b is
port(
A,B : in std_logic_vector ( 7 downto 0 );
Q : out std_logic_vector ( 7 downto 0 );
S : in std_logic);
end mux1of2_8b;
Architecture Op of mux1of2_8b is
Begin
219
Q <= A when S = '0' else B;
end Op;
CODIGO VHDL DEL DISPOSITIVO FFD.
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY ffd IS
PORT (
d : IN STD_LOGIC;
clk : IN STD_LOGIC;
clrn : IN STD_LOGIC;
q : OUT STD_LOGIC);
END entity;
ARCHITECTURE a OF ffd IS
SIGNAL q1 : STD_LOGIC;
BEGIN
PROCESS (clk,clrn)
BEGIN
IF clrn= '0' THEN
q1 <= '0';
ELSIF (clk'EVENT AND clk = '0') THEN
q1 <= d;
END IF;
END PROCESS;
220
q<= q1;
END a;
CODIGO VHDL DEL DISPOSITIVO FFD1.
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY ffd IS
PORT (
d : IN STD_LOGIC;
clk : IN STD_LOGIC;
clrn : IN STD_LOGIC;
q : OUT STD_LOGIC);
END entity;
ARCHITECTURE a OF ffd IS
SIGNAL q1 : STD_LOGIC;
BEGIN
PROCESS (clk,clrn)
BEGIN
IF clrn= '0' THEN
q1 <= '0';
ELSIF (clk'EVENT AND clk = '1') THEN
q1 <= d;
END IF;
END PROCESS;
221
q<= q1;
END a;
CODIGO VHDL DEL DISPOSITIVO REG8B.
Este registro tiene una entrada de clareo C, que cuando esta en uno se coloca en
la salida Q un cero, y una entrada L que cuando está en uno se coloca en la salida
Q el valor de la entrada D.
library ieee;
use ieee.std_logic_1164.all;
Entity REG8B is
port(
L,C,CLK : in std_logic;
D : in std_logic_vector(7 downto 0);
Q : out std_logic_vector(7 downto 0));
end REG8B;
Architecture Op of REG8B is
Begin
Process(CLK)
variable REG : std_logic_vector(7 downto 0);
Begin
if(clk'event and clk = '1')then
if (C = '1') then
REG := "00000000";
222
elsif (L = '1')then
REG := D;
end if;
end if;
Q <= REG;
end process;
end Op;
CODIGO VHDL DEL DISPOSITIVO REG8BPSW.
En el código del registro PSW se unen las entradas CL, L, LP, LC, LAC y LOV para
formar una variable auxiliar, esta variable se usa en el case para seleccionar la
salida.
library ieee;
use ieee.std_logic_1164.all;
Entity REG8Bpsw is
port(
L,CL,CLK,P,LP,LC,LAC,C,AC,LOV,OV : in std_logic;
D,R : in std_logic_vector(7 downto 0);
Q : out std_logic_vector(7 downto 0));
end entity;
Architecture Op of REG8Bpsw is
Begin
Process(CLK)
variable REG : std_logic_vector(7 downto 0);
variable t : std_logic_vector(5 downto 0);
Begin
if(clk'event and clk = '1')then
223
t:=CL&L&LP&LC&LAC&LOV;
case t is
when "100000" => REG := "00000000";
when "010000" => REG:= D;
when "001000" => REG:= R(7 downto 1) & P;
when "001111" => REG:= C & AC & R(5 downto 3) & OV & R(1) & P;
when "000100" => REG:= C & R(6 downto 0);
when "001100" => REG:= C & R(6 downto 1) & P;
when "000101" => REG:= C & R(6 downto 3) & OV & R(1 downto 0) ;
when "000111" => REG:= C & AC & R(5 downto 3) & OV & R(1 downto 0) ;
when "001001" => REG:= R(7 downto 3) & OV & R(1) & P;
when "001101" => REG:= C & R(6 downto 3) & OV & R(1) & P;
when others=>REG:=R;
end case;
end if;
Q <= REG;
end process;
end Op;
CODIGO VHDL DEL DISPOSITIVO REGTCON.
En el código del registro REGTCON se unen las entradas L, C, TF1, TF0, IE e IE0
para formar una variable auxiliar, esta variable se usa en el case para seleccionar
la salida.
library ieee;
use ieee.std_logic_1164.all;
Entity REGTCON is
port(
L,C,CLK,TF0,TF1,IE0,IE1 : in std_logic;
224
D,R : in std_logic_vector(7 downto 0);
Q : out std_logic_vector(7 downto 0));
end ENTITY;
Architecture Op of REGTCON is
Begin
Process(CLK)
variable REG : std_logic_vector(7 downto 0);
variable aux : std_logic_vector(5 downto 0);
Begin
if(clk'event and clk = '1')then
aux:=L&C&TF1&TF0&IE1&IE0;
case aux is
when "100000" => REG:=D;
when "010000" => REG:="00000000";
when "001000" => REG:=TF1&R(6 downto 0);
when "000100" => REG:=R(7 downto 6)& TF0 & R(4 downto 0);
when "000010" => REG:=R(7 downto 4)& IE1 & R(2 downto 0);
when "000001" => REG:=R(7 downto 2)& IE0 & R(0);
when others => REG:=R;
end case;
end if;
Q <= REG;
end process;
end Op;
225
CODIGO VHDL DEL DISPOSITIVO REGSCON.
En el código del registro REGSCON se unen las entradas L, C, T1 y R1 para formar
una variable auxiliar, esta variable se usa en el case para seleccionar la salida.
library ieee;
use ieee.std_logic_1164.all;
Entity REGSCON is
port(
L,C,CLK,TI,RI : in std_logic;
D,R : in std_logic_vector(7 downto 0);
Q : out std_logic_vector(7 downto 0));
end ENTITY;
Architecture Op of REGSCON is
Begin
Process(CLK)
variable REG : std_logic_vector(7 downto 0);
variable aux : std_logic_vector(3 downto 0);
Begin
if(clk'event and clk = '1')then
aux:=L&C&TI&RI;
case aux is
when "1000" => REG:=D;
when "0100" => REG:="00000000";
when "0010" => REG:=R(7 downto 2)&TI&R(0);
when "0001" => REG:=R(7 downto 1)& RI;
when others => REG:=R;
226
end case;
end if;
Q <= REG;
end process;
end Op;
CODIGO VHDL DEL DISPOSITIVO REG8BTRANS.
Este código configura el dispositivo para hacer una carga de datos asincrona y
una operación de desplazamiento sincrona.
library ieee;
use ieee.std_logic_1164.all;
Entity REG8BTRANS is
port(
L,CLK,E : in std_logic;
D : in std_logic_vector(7 downto 0);
ou : out std_logic;
Q : out std_logic_vector(10 downto 0));
end entity;
Architecture Op of REG8BTRANS is
Signal REG : std_logic_vector(10 downto 0);
Begin
Process(CLK)
Begin
227
if (L = '1')then
ou<='1';
REG <= '1'&D&"01";
else
if(clk'event and clk = '1')then
if(E='1')then
REG<='1'®(10 downto 1);
ou<=REG(0);
end if;
end if;
end if;
Q <= REG;
end process;
end Op;
CODIGO VHDL DEL DISPOSITIVO REG8BREPC.
La función principal de este código es desplazar a la derecha los valores que
llegan a la entrada serial INT cuando la entrada E está en alto.
library ieee;
use ieee.std_logic_1164.all;
Entity REG8BREPC is
port(
CLK,E,INT : in std_logic;
Q : out std_logic_vector(10 downto 0));
end entity;
228
Architecture Op of REG8BREPC is
Signal REG : std_logic_vector(10 downto 0);
Begin
Process(CLK)
Begin
if(clk'event and clk = '1')then
if(E='1')then
REG<=INT®(10 downto 1);
end if;
end if;
Q <= REG;
end process;
end Op;
CODIGO VHDL DEL DISPOSITIVO CONT_REG8B.
El código de este dispositivo es un punto de partida para los demás contadores
diseñados, ya que son contadores con pequeñas variaciones de este. Tiene dos
process porque realiza dos funciones diferentes, en la primera actúan las
entradas normales de control, si C es uno se clarea, si L es uno se carga el valor
de la entrada y si E es uno habilita el conteo; la función del segundo process
cuando la variable donde se lleva el conteo en todos sus bits contiene unos,
marca una salida alta en M, de lo contrario marca bajo.
Library ieee;
use ieee.std_logic_1164.all;
229
use ieee.std_logic_unsigned.all;
Entity Cont_Reg8b is
Port(
A : in std_logic_vector (7 downto 0);
Q : out std_logic_vector (7 downto 0);
M : out std_logic;
L,C,E,Clk : in std_logic);
End Cont_Reg8b;
Architecture Op of Cont_Reg8b is
Signal Reg : std_logic_vector (7 downto 0);
Begin
Process(Clk)
Begin
if (Clk'event and Clk = '1')Then
if (C = '1') Then
Reg <= "00000000";
else
if (L = '1')Then
Reg <= A;
else
if (E = '1') then
Reg <= Reg + 1;
end if;
end if;
end if;
230
end if;
Q <= Reg;
end process;
Process (Reg)
Begin
if (Reg = "11111111") then
M <= '1';
else
M <= '0';
end if;
end process;
End Op;
CODIGO VHDL DEL DISPOSITIVO REG_SP.
Este código funciona de manera similar al código del dispositivo CONT_REG8B,
con la única variante que cuando C está en alto no carga un cero sino un siete,
puesto que el registro SP generalmente siempre apunta a esa posición.
Library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
231
Entity REG_SP is
Port(
A : in std_logic_vector (7 downto 0);
S : in std_logic;
Q : out std_logic_vector (7 downto 0);
L,C,E,Clk : in std_logic);
End entity;
Architecture Op of REG_SP is
Signal Reg : std_logic_vector (7 downto 0);
Begin
Process(Clk)
Variable Temp : std_logic_vector ( 7 downto 0);
Begin
if (Clk'event and Clk = '1')Then
if (C = '1') Then
Reg <= "00000111";
else
if (L = '1')Then
Reg <= A;
else
if (E = '1') then
if (S = '0') then
Temp := "00000001";
else
Temp := "11111111";
end if;
232
Reg <= Reg + Temp;
end if;
end if;
end if;
end if;
Q <= Reg;
end process;
End Op;
CODIGO VHDL DEL DISPOSITIVO CONTBAUDRATE.
Este dispositivo es el contador de pulsos de la unidad de transmisión, tiene un
concepto parecido al contador CONT_REG8B; sus diferencias están en que su
señal de clareo es asíncrona y el nivel es bajo, en la parte de conteo no se le suma
un uno sino una entrada A y su límite no son todos los bits en uno sino “1011”.
Library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
Entity contbaudrate is
Port(
A : in std_logic;
M : out std_logic;
C,E,Clk : in std_logic);
End entity;
Architecture Op of contbaudrate is
233
signal Reg : std_logic_vector (3 downto 0);
Begin
Process(Clk)
variable t:std_logic;
Begin
if (C = '0' ) Then
Reg <= "0000";
else
if (Clk'event and Clk = '1')Then
if (E = '1') then
Reg <= Reg + A;
end if;
end if;
end if;
end process;
process(Reg)
variable t:std_logic;
begin
if (Reg ="1011") then
t:='1';
else
t:= '0';
end if;
M<=t;
end process;
End Op;
234
CODIGO VHDL DEL DISPOSITIVO CONTBAUDRATE1.
Este dispositivo es el contador de pulsos de la unidad de recepción, tiene un
concepto parecido al contador CONT_REG8B; sus diferencias están en que su
señal de clareo es asíncrona y el nivel es bajo, en la parte de conteo no se le suma
un uno sino una entrada A y su límite no son todos los bits en uno sino “1010”.
Library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
Entity contbaudrate is
Port(
A : in std_logic;
M : out std_logic;
C,E,Clk : in std_logic);
End entity;
Architecture Op of contbaudrate is
signal Reg : std_logic_vector (3 downto 0);
Begin
Process(Clk)
variable t:std_logic;
Begin
if (C = '0' ) Then
235
Reg <= "0000";
else
if (Clk'event and Clk = '1')Then
if (E = '1') then
Reg <= Reg + A;
end if;
end if;
end if;
end process;
process(Reg)
variable t:std_logic;
begin
if (Reg ="1010") then
t:='1';
else
t:= '0';
end if;
M<=t;
end process;
End Op;
CODIGO VHDL DEL DISPOSITIVO CONT_REG6B.
Este código solo tiene un process, en donde se realiza el conteo y no tiene salida
para desbordamiento puesto que en el dispositivo que se utiliza no es necesario
tenerla, la variable de conteo es de 6 bits.
236
Library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
Entity Cont_Reg6b is
Port(
Q : out std_logic_vector (5 downto 0);
C,Clk : in std_logic);
End entity;
Architecture Op of Cont_Reg6b is
Signal Reg : std_logic_vector (5 downto 0);
Begin
Process(Clk)
Begin
if (Clk'event and Clk = '1')Then
if (C = '1') Then
Reg <= "000000";
else
Reg <= Reg + 1;
end if;
end if;
Q <= Reg;
end process;
End Op;
237
CODIGO VHDL DEL DISPOSITIVO DIROUT
El código de este dispositivo es bastante extensor, se trabaja con sentencias
CASE, IF y ELSE, en donde con la sentencia CASE se elige el estado en el que se
encuentra y con la otras dos sentencias la instrucción que está realizando en ese
estado.
library ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_signed.all;
entity DIROUT is
port( IR: in std_logic_vector(7 downto 0);
SA: in std_logic_vector(4 downto 0);
ZE: in std_logic;
q : out std_logic_vector(45 downto 0));
end entity;
architecture operacion of DIROUT is
begin
process(IR)
variable z: std_logic_vector(45 downto 0);--x24-->f17,f18,f19 x29-->F13, x30->F14,x31-
>ldpl,x32->ldph,x35->eotmpl,x36->edirbit
--x37->eobit,X38->LC,X39->LAC,X40->P,x41->QL,X42->QH,X43->CL,x44->D,X45->LOV
begin
case SA is
when "00000" => z:= "0000000000000000000000010000000000001000000100";--
0--1
------------------------------------------------------------------------1--------------------------------
-----------------------------
when "00001" =>
if (IR="00100100" or IR="00110100" or IR="01000100" or IR="01010100" or IR="01100100" or IR="10010100" or
IR="01110100")then
z:=
"0000000000000000000000000000001110000000000100";-- 1--3
end if;
if(IR="10000000" or IR="01100000" or IR="01110000" or IR="01000000" or
IR="01010000")then
z:=
"0000000000000000000000010000001110000000000100";
end if;
if(IR="10110100")then
238
z:=
"0000000100000000000000010000001110000000000100";--
end if;
if(IR="01110101" )then
z:=
"0000000000000000000000011000000000000111000100";-- 75 Mov dir,#data
end if;
if(IR="11000100" or IR="11010100")then
z:=
"0000010000000000000000000000000010000000000010";
end if;
if(IR="11110101")then
z:=
"0000000000000000000000001000000000000111000100";
end if;
if(IR="00000001" or IR="00100001" or IR="01000001" or IR="01100001" or IR="10000001" or IR="10100001" or
IR="11000001" or IR="11100001")then
z:=
"0000000000000000000000001000000000000011000100";
end if;
if(IR="00010001" or IR="00110001" or IR="01010001" or IR="01110001" or IR="10010001" or IR="10110001" or
IR="11010001" or IR="11110001")then
z:=
"0000000000000000000000010000001110000000000100";
end if;
if(IR="00010010")then
z:=
"0000000000000000000000010000001010000000000100";
end if;
if(IR="10100011")then
z:=
"0000000000000000000000100000000000000000000000";
end if;
if(IR="00000010")then
z:=
"0000000000000000000000011011000000000001000100";
end if;
if(IR="10010000")then
z:=
"0000000000000100000000011000000000000000000100";
end if;
239
if(IR="00000110" or IR="00010110" or IR="00100110" or IR="00110110" or IR="01000110" or IR="01010110" or
IR="01100110" or IR="01110110"
or IR="10000110" or IR="10010110" or IR="11000110" or IR="11010110" or IR="11100110" or IR="00000111" or
IR="00010111" or IR="00100111"
or IR="00110111" or IR="01000111" or IR="01010111" or IR="01100111" or IR="01110111" or IR="10000111" or
IR="10010111" or IR="11000111"
or IR="11010111" or IR="11100111" or IR="11110111" or IR="11110110" or IR="00001000" or IR="00001001" or
IR="00001010" or IR="00001011"
or IR="00001100" or IR="00001101" or IR="00001110" or IR="00001111" or IR="00011000" or IR="00011001" or
IR="00011010" or IR="00011011"
or IR="00011100" or IR="00011101" or IR="00011110" or IR="00011111" or IR="00101000" or IR="00101001" or
IR="00101010" or IR="00101011"
or IR="00101100" or IR="00101101" or IR="00101110" or IR="00101111" or IR="00111000" or IR="00111001" or
IR="00111010" or IR="00111011"
or IR="00111100" or IR="00111101" or IR="00111110" or IR="00111111" or IR="01001000" or IR="01001001" or
IR="01001010" or IR="01001011"
or IR="01001100" or IR="01001101" or IR="01001110" or IR="01001111" or IR="01011000" or IR="01011001" or
IR="01011010" or IR="01011011"
or IR="01011100" or IR="01011101" or IR="01011110" or IR="01011111" or IR="01101000" or IR="01101001" or
IR="01101010" or IR="01101011"
or IR="01101100" or IR="01101101" or IR="01101110" or IR="01101111" or IR="01111000" or IR="01111001" or
IR="01111010" or IR="01111011"
or IR="01111100" or IR="01111101" or IR="01111110" or IR="01111111" or IR="10001000" or IR="10001001" or
IR="10001010" or IR="10001011"
or IR="10001100" or IR="10001101" or IR="10001110" or IR="10001111" or IR="10011000" or IR="10011001" or
IR="10011010" or IR="10011011"
or IR="10011100" or IR="10011101" or IR="10011110" or IR="10011111" or IR="11001000" or IR="11001001" or
IR="11001010" or IR="11001011"
or IR="11001100" or IR="11001101" or IR="11001110" or IR="11001111" or IR="11101000" or IR="11101001" or
IR="11101010" or IR="11101011"
or IR="11101100" or IR="11101101" or IR="11101110" or IR="11101111" or IR="11111000" or IR="11111001" or
IR="11111010" or IR="11111011"
or IR="11111100" or IR="11111101" or IR="11111110" or IR="11111111" or IR="11011000" or IR="11011001" or
IR="11011010" or IR="11011011"
or IR="11011100" or IR="11011101" or IR="11011110" or IR="11011111"
or IR="10111000" or IR="10111001" or IR="10111010" or IR="10111011" or IR="10111100" or IR="10111101" or
IR="10111110" or IR="10111111"
or IR="10110110" or IR="10110111" or IR="11100010" or IR="11100011" or IR="11110010" or
IR="11110011")then
z:=
"0000000000000000000000001100000000000111000000";-- 1--4
end if;
if(IR="00100101" or IR="00110101" or IR="01000101" or IR="01010101" or IR="01100101" or IR="10010101" or
IR="11100101" or IR="10100110"
or IR="10100111" or IR="10101000" or IR="10101001" or IR="10101010" or IR="10101011" or IR="10101100" or
IR="10101101" or IR="10101110"
240
or IR="10101111" or IR="00000101" or IR="00010101" or IR="01000010" or IR="01010010" or IR="01100010" or
IR="01000011" or IR="01010011"
or IR="01100011" or IR="11000000" or IR="11010000" or IR="11010101" or IR="11000101" or IR="10000101" or
IR="10110101")then
z:=
"0000000000000000000000001000000000000111000100";-- 1--6
end if;
if(IR="00000011" or IR="00100011" or IR="00000100" or IR="00010100" or
IR="11110100")then
z:=
"0000000000000000000000000000000010000000000010";
end if;
if(IR="00010011" or IR="00110011")then
z:=
"0000000100000000000000000000000010000000000010";
end if;
if(IR="11100100" or IR="00000000")then
z:=
"0000000000000000000000000000000000000000000000";
end if;
if(IR="10100100" )then---------------------------------Multiplicacion -
-------
z:=
"0000000000000000000010000000001110000000000000";
end if;
if(IR="10000100" )then---------------------------------Division--------
z:=
"0000000000000000000100000000001110000000000000";
end if;
if(IR="00100010" or IR="00110010")then
z:=
"0000000000000000000000001011110000000001001000";
end if;
if(IR="11000010" or IR="11010010" or IR="01110010" or IR="10000010" or IR="10010010" or IR="10100010" or
IR="10110010" or IR="10100000"
or IR="10110000" )then--clr bit, setb bit
z:=
"0000000000000000000000000000001010000000000100";
end if;
if(IR="11100000")then
241
z:=
"0000000000000000000000000001010000000000000000";
end if;
if(IR="11110000")then
z:=
"0000000000000000000000000001010000010000000001";
end if;
if(IR="00100000" or IR="00110000" or IR="00010000")then
z:=
"0000000000000000000000010000001010000000000100";
end if;
if(IR="10110011" or IR="11000011" or IR="11010011")then
z:=
"0000000100000000000000000000000000000000000000";
end if;
if(IR="01110011")then
z:=
"0000000000000000000000000001010000010001000000";
end if;
if(IR="10010011")then
z:=
"0000000000000000000000000001010000010101000000";
end if;
if(IR="10000011")then
z:=
"0000000000000000000000000000000000010101000000";
end if;
-------------------------------------------------------------------2-------------------------------------
-----------------------------
when "00010" =>
if(IR="00000000" or IR="11100100"
or IR="11110100" or IR="11110111" or IR="11110110" or IR="11111000" or IR="11111001" or IR="11111010" or
IR="11111011" or IR="11111100"
or IR="11111101" or IR="11111110" or IR="11111111" or IR="00000001" or IR="00100001" or IR="01000001"
or IR="10000001" or IR="10100001" or IR="11000001" or IR="11100001" or IR="00000010" or IR="10100011" or
IR="00010001" or IR="00110001"
or IR="01010001" or IR="01110001" or IR="10010001" or IR="10110001" or IR="11010001" or IR="11110001" or
IR="00100010" or IR="00110010"
or IR="00010010" or IR="10000000" or IR="11011000" Or IR="11011001" or IR="11011010" or IR="11011011" or
IR="11011100" or IR="11011101"
or IR="11011110" or IR="11011111" or IR="11010101" or IR="10110011" or IR="11000011" or IR="11010011" or
IR="00001000" or IR="00001001"
242
or IR="00001010" or IR="00001011" or IR="00001100" or IR="00001101" or IR="00001110" or IR="00001111" or
IR="00011000" or IR="00011001"
or IR="00011010" or IR="00011011" or IR="00011100" or IR="00011101" or IR="00011110" or IR="00011111" or
IR="00000110" or IR="00000111"
or IR="00010110" or IR="00010111" or IR="00100110" or IR="00110110" or IR="01000110" or IR="01010110" or
IR="01100110" or IR="10010110"
or IR="00100111" or IR="00110111" or IR="01000111" or IR="01010111" or IR="01100111" or IR="10010111" or
IR="11010111" or IR="11010110"
or IR="10110110" or IR="10110111" or IR="10111000" or IR="10111001" or IR="10111010" or IR="10111011" or
IR="10111100" or IR="10111101"
or IR="10111110" or IR="10111111" or IR="10110100" or IR="10110101" or IR="01100000" or IR="01110000" or
IR="01000000" or IR="01010000"
or IR="00100000" or IR="00110000" or IR="00010000" or IR="01110011" or
IR="00000101"
or IR="00000011" or IR="00010011" or IR="00100011" or IR="00110011" or IR="00000100" or IR="00010100" or
IR="00101000" or IR="00101001"
or IR="00101010" or IR="00101011" or IR="00101100" or IR="00101101" or IR="00101110" or IR="00101111" or
IR="00111000" or IR="00111001"
or IR="00111010" or IR="00111011" or IR="00111100" or IR="00111101" or IR="00111110" or IR="00111111" or
IR="01001000" or IR="01001001"
or IR="01001010" or IR="01001011" or IR="01001100" or IR="01001101" or IR="01001110" or IR="01001111" or
IR="01011000" or IR="01011001"
or IR="01011010" or IR="01011011" or IR="01011100" or IR="01011101" or IR="01011110" or IR="01011111" or
IR="01101000" or IR="01101001"
or IR="01101010" or IR="01101011" or IR="01101100" or IR="01101101" or IR="01101110" or IR="01101111" or
IR="10011000" or IR="10011001"
or IR="10011010" or IR="10011011" or IR="10011100" or IR="10011101" or IR="10011110" or IR="10011111" or
IR="10000100" or IR="10100100"
or IR="11100010" or IR="11100011" or IR="11110010" or IR="11110011" or IR="11100000" or IR="11110000" or
IR="11000110" or IR="11000111"
or IR="11001000" or IR="11001001" or IR="11001010" or IR="11001011" or IR="11001100" or IR="11001101" or
IR="11001110" or IR="11001111"
or IR="11000100" or IR="11101000" or IR="11101001" or IR="11101010" or IR="11101011" or IR="11101100" or
IR="11101101" or IR="11101110"
or IR="11101111" or IR="11100111" or IR="11100110" or IR="11010100" or IR="10010011" or
IR="00110000")then
z:=
"0000010000000000000000000000000000000000000000";
else
z:=
"0000010000000000000000010000000000000000000000";
end if;
-------------------------------------------------------------------3-------------------------------------
-----------------------------
when "00011" =>
IF(IR="01110110" or IR="01110111" or IR="01111000" or IR="01111001" or IR="01111010" or IR="01111011" Or
IR="01111100" or IR="01111101"
or IR="01111110" or IR="01111111" or IR="11011000" Or IR="11011001" or IR="11011010" or IR="11011011" or
IR="11011100" or IR="11011101"
243
or IR="11011110" or IR="11011111" or IR="10101000" or IR="10101001" or IR="10101010" or IR="10101011" or
IR="10101100" or IR="10101101"
or IR="10101110" or IR="10101111" or IR="10100110" or
IR="10100111")THEN
z:=
"0000000000000000000000000011100001110000000001";-- 3--2 76,77, 78-7f
END IF;
IF(IR="00100100" or IR="00110100" or IR="10010100" or IR="00100101" or IR="00110101" or IR="10010101"
)THEN
z:=
"1000011100000000000000000000000010000000000010";--add,addc,subb
end if;
if(IR="01110100" )then
z:=
"0000010000000000000000000000000011110000000010";
end if;
if(IR="11100000")then
z:=
"0000010000000000000000000000000010000000001000";
end if;
IF(IR="01000100" or IR="01010100" or IR="01100100" )THEN
z:=
"0000010000000000000000000000000010000000000010";
END IF;
if(IR="10100100")then
z:=
"1000010100000000000000000000000011110000000000";
end if;
if(IR="10000100")then
z:=
"1000010100000000000000000000000111110000000000";
end if;
if(IR="01000101" or IR="01010101" or IR="01100101" )then
z:=
"0000000000000000000000000000000010000000000010";
end if;
if(IR="10010000")then
z:=
"0000000000000010000000001000000000000000000100";
end if;
if(IR="00000101" or IR="00010101" or IR="11010101")then
244
z:=
"0000000000000000001000011011100000000000000010";
end if;
if(IR="01000010" or IR="01010010" or IR="01100010" or IR="01000011" or IR="01010011" or IR="01100011"
)then
z:=
"0000000000000000001000001011100000000000000010";
end if;
if(IR="11010000")then
z:=
"0000000000000000001000001011100001110000000000";
end if;
if(IR="00010001" or IR="00110001" or IR="01010001" or IR="01110001" or IR="10010001" or IR="10110001" or
IR="11010001" or IR="11110001")then
z:=
"0000000000000000000000001100000000000001000000";
end if;
if(IR="00100010")then
z:=
"0000000000000000000000110000000000000000100000";
end if;
if(IR="00110010")then
z:=
"0010000000000000000000110000000000000000100000";
end if;
if(IR="00010010")then
z:=
"0000000000000000000000001000000001010001000010";
end if;
if(IR="11000000")then
z:=
"0000000000000000000000000011110001110000000001";
end if;
if(IR="10000000")then
z:=
"0000000000100000000000001000000000000011000000";
end if;
if(IR="10110110" or IR="10110111" or IR="10111000" or IR="10111001" or IR="10111010" or IR="10111011" or
IR="10111100" or IR="10111101"
or IR="10111110" or IR="10111111")then
z:=
"0000000000000000000000010000001110000000000100";
245
end if;
-------------------------------------------------------------------4-------------------------------------
-------------------------------
when "00100" =>
if(IR="00000110" or IR="00010110" or IR="00100110" or IR="00110110" or IR="01000110" or IR="01010110" or
IR="01100110" or IR="01110110"
or IR="10000110" or IR="10010110" or IR="11000110" or IR="11010110" or IR="11100110" or IR="00000111" or
IR="00010111" or IR="00100111"
or IR="00110111" or IR="01000111" or IR="01010111" or IR="01100111" or IR="01110111" or IR="10000111" or
IR="10010111" or IR="11000111"
or IR="11010111" or IR="11100111" or IR="11110111" or IR="11110110" or IR="10100110" or IR="10100111" or
IR="10110110" or IR="10110111"
or IR="10111000" or IR="10111001" or IR="10111010" or IR="10111011" or IR="10111100" or IR="10111101" or
IR="10111110" or IR="10111111"
or IR="11100010" or IR="11100011" or IR="11110010" or
IR="11110011")then
z:=
"0000000000000000000000000011100000000000000000";-- 4--10 --5
end if;
if(IR="01111000" or IR="01111001" or IR="01111010" or IR="01111011" Or IR="01111100" or IR="01111101" or
IR="01111110" or IR="01111111")then
z:=
"0000000000000000000000000000001110000000000100";
end if;
if(IR="00000001" or IR="00100001" or IR="01000001" or IR="10000001" or IR="10100001" or IR="11000001" or
IR="11100001")then
z:=
"0000000000000000000000001100000000000001000000";
end if;
if(IR="00000010")then
z:=
"0000000000000000000000001000000000000011000100";
end if;
----------------------------------------------------------------5----------------------------------------
-----------------------------
when "00101" =>
IF(IR="01110110" or IR="01110111" )THEN
z:=
"0000000000000000000000000000001110000000000100";-- 5--3 mov Rn o Ri,#data
END IF;
if(IR="11100111" or IR="11100110" or IR="00100110" or IR="00110110" or IR="01000110" or IR="01010110" or
IR="01100110" or IR="00010111"
or IR="00100111" or IR="00110111" or IR="01000111" or IR="01010111" or IR="01100111" or IR="10010110" or
IR="10010111" or IR="00000110"
246
or IR="00010110" or IR="00000111" or IR="11000110" or IR="11010110" or IR="11000111" or IR="11010111" or
IR="10000110" or IR="10000111"
or IR="10100110" or IR="10100111" or IR="10110110" or IR="10110111" or IR="00101000" or IR="00101001" or
IR="00101010" or IR="00101011"
or IR="00101100" or IR="00101101" or IR="00101110" or IR="00101111" or IR="00111000" or IR="00111001" or
IR="00111010" or IR="00111011"
or IR="00111100" or IR="00111101" or IR="00111110" or IR="00111111" or IR="01001000" or IR="01001001" or
IR="01001010" or IR="01001011"
or IR="01001100" or IR="01001101" or IR="01001110" or IR="01001111" or IR="01011000" or IR="01011001" or
IR="01011010" or IR="01011011"
or IR="01011100" or IR="01011101" or IR="01011110" or IR="01011111" or IR="01101000" or IR="01101001" or
IR="01101010" or IR="01101011"
or IR="01101100" or IR="01101101" or IR="01101110" or IR="01101111" or IR="10011000" or IR="10011001" or
IR="10011010" or IR="10011011"
or IR="10011100" or IR="10011101" or IR="10011110" or IR="10011111" or IR="10001000" or IR="10001001" or
IR="10001010" or IR="10001011"
or IR="10001100" or IR="10001101" or IR="10001110" or IR="10001111" or IR="11001000" or IR="11001001" or
IR="11001010" or IR="11001011"
or IR="11001100" or IR="11001101" or IR="11001110" or IR="11001111" or IR="00001000" or IR="00001001" or
IR="00001010" or IR="00001011"
or IR="00001100" or IR="00001101" or IR="00001110" or IR="00001111" or IR="00011000" or IR="00011001" or
IR="00011010" or IR="00011011"
or IR="00011100" or IR="00011101" or IR="00011110" or IR="00011111" or IR="11101000" or IR="11101001" or
IR="11101010" or IR="11101011"
or IR="11101100" or IR="11101101" or IR="11101110" or IR="11101111" or IR="11011000" or IR="11011001" or
IR="11011010" or IR="11011011"
or IR="11011100" or IR="11011101" or IR="11011110" or IR="11011111" or IR="10111000" or IR="10111001" or
IR="10111010" or IR="10111011"
or IR="10111100" or IR="10111101" or IR="10111110" or IR="10111111" or IR="10110110" or IR="10110111" or
IR="11100010" or IR="11100011"
)then
z:=
"0000000000000000000000000011100000000000000000";-- 5--11 --2
end if;
if(IR="11110111" or IR="11110110" or IR="11110010" or IR="11110011"
)then-- 11--2
z:=
"0000000000000000000000000011100000010000000001";
end if;
------------------------------------------------------------------------6--------------------------------
----------------
when "00110" =>
if(IR="00100101" or IR="00110101" or IR="01000101" or IR="01010101" or IR="01100101" or IR="01110101" or
IR="10010101" or IR="11000101"
or IR="11100101" or IR="11110101" or IR="01000011" or IR="01010011" or IR="01100011" or IR="01000010" or
IR="01010010" or IR="01100010"
or IR="10100110" or IR="10100110" or IR="10101000" or IR="10101001" or IR="10101010" or IR="10101011" or
IR="10101100" or IR="10101101"
247
or IR="10101110" or IR="10101111" or IR="10001000" or IR="10001001" or IR="10001010" or IR="10001011" or
IR="10001100" or IR="10001101"
or IR="10001110" or IR="10001111" or IR="10000110" or IR="10000111"
)then
z:=
"0000000000000000000000001000000000000111000100";--------
end if;
if(IR="01110101" or IR="11110101")then
z:=
"0000000000000000000000000000001110000000000100";--75,f5
end if;
if(IR="00100101" or IR="00110101" or IR="01000101" or IR="01010101" or IR="01100101" or IR="10010101" or
IR="00000101" or IR="00010101"
or IR="01000010" or IR="01010010" or IR="01100010" or
IR="11000101")then
z:=
"0000000000000000010000000011101110000000000000";--25,35,45,55,65,95,42.52.62
end if;
if(IR="01000011" or IR="01010011" or IR="01100011")then
z:=
"0000000000000000010000010011101010000000000000";--43,53,63
end if;
if(IR="10100110" or IR="10100111" or IR="10101000" or IR="10101001" or IR="10101010" or IR="10101011" or
IR="10101100" or IR="10101101"
or IR="10101110" or IR="10101111")then
z:=
"0000000000000000010000000011101110000000000000";--A8,A9,AA,AB,AC,AD,AE,AF
end if;
if(IR="10000101")then
z:=
"0000000000000000010000010011101110000000000000";
end if;
-------------------------------------------------------------------7-------------------------------------
-------------------------
when "00111" =>
if(IR="01000110" or IR="01010110" or IR="01100110" or IR="01000111" or IR="01010111" or IR="01100111" or
IR="01001000" or IR="01001001"
or IR="01001010" or IR="01001011" or IR="01001100" or IR="01001101" or IR="01001110" or IR="01001111" or
IR="01011000" or IR="01011001"
or IR="01011010" or IR="01011011" or IR="01011100" or IR="01011101" or IR="01011110" or IR="01011111" or
IR="01101000" or IR="01101001"
or IR="01101010" or IR="01101011" or IR="01101100" or IR="01101101" or IR="01101110" or IR="01101111" or
IR="11001000" or IR="11001001"
or IR="11001010" or IR="11001011" or IR="11001100" or IR="11001101" or IR="11001110" or IR="11001111" or
IR="11000110" or IR="11010110"
248
or IR="11000111" or IR="11010110" or IR="11010111" or
IR="11000101")then
z:=
"1000011100000000000000000000000010000000000010";
end if;
IF(IR="00100110" or IR="00110110" or IR="00100111" or IR="00110111" or IR="00101000" or IR="00101001" or
IR="00101010" or IR="00101011"
or IR="00101100" or IR="00101101" or IR="00101110" or IR="00101111" or IR="00111000" or IR="00111001" or
IR="00111010" or IR="00111011"
or IR="00111100" or IR="00111101" or IR="00111110" or IR="00111111" or IR="10011000" or IR="10011001" or
IR="10011010" or IR="10011011"
or IR="10011100" or IR="10011101" or IR="10011110" or IR="10011111" or IR="10010110" or
IR="10010111")THEN
z:=
"1000011100000000000000000000000010000000000010";
END IF;
if(IR="00001000" or IR="00001001" or IR="00001010" or IR="00001011" or IR="00001100" or IR="00001101" or
IR="00001110" or IR="00001111"
or IR="00011000" or IR="00011001" or IR="00011010" or IR="00011011" or IR="00011100" or IR="00011101" or
IR="00011110" or IR="00011111"
or IR="00000110" or IR="00010110" or IR="00000111" or
IR="00010111")then
z:=
"0000000000000000000000000011100000000000000011"; ---ojo
end if;
if(IR="11011000" Or IR="11011001" or IR="11011010" or IR="11011011" or IR="11011100" or IR="11011101" or
IR="11011110" or IR="11011111" )then
z:=
"0000000000000000000000000011100000000000000011";
end if;
if(IR="01000011" or IR="01010011" or IR="01100011")then
z:=
"0000000000000000000000000000001110000000000100";
end if;
if(IR="00010010" or IR="00010001" or IR="00110001" or IR="01010001" or IR="01110001" or IR="10010001" or
IR="10110001" or IR="11010001" or IR="11110001")then
z:=
"0000000000000000000000001000000001110011000010";
end if;
if(IR="00100010" or IR="00110010")then
z:=
"0000000000000000000000001000001110000011001000";
end if;
249
if(IR="10001000" or IR="10001001" or IR="10001010" or IR="10001011" or IR="10001100" or IR="10001101" or
IR="10001110"
or IR="10001111" or IR="10000110" or IR="10000111" or IR="01110101" or IR="11000010" or IR="11010010" or
IR="10010010" or IR="10110010" )then
z:=
"0000000000000000001000001011100001110000000000"; --88-8F,75,c2,d2
end if;
if(IR="01110010" or IR="10100000" or IR="10110000" or IR="10100010" or
IR="10000010")then
z:=
"0000000100000000001000001011100001110000000000";--72,a0,b0,a2,82
end if;
if(IR="10000101")then
z:=
"0000000000000000001000001011100001110000000000";
end if;
if(IR="00010000" )then
z:=
"0000000010000000001000001011100000000000000001";
end if;
if(IR="11110101" )then
z:=
"0000000000000000001000001011100000010000000000";--F5
end if;
if(IR="11100101")then
z:=
"0000000000000000010000000011100010000000000000";
end if;
if(IR="10010011" or IR="10000011")then
z:=
"0000000000000000000000000010100010000000000100";
end if;
------------------------------------------------------------------8--------------------------------------
-------------------------
when "01000" =>
if(IR="11000010" or IR="11010010" or IR="01110010" or IR="10000010" or IR="10010010" or IR="10100010" or
IR="10110010" or IR="10100000"
or IR="10110000" )then
z:=
"0000000010000000000000000000001110000000000000";
end if;
if(IR="00010000" and ZE='1')then
z:=
"0000000010000000000000000000001110000000000000";
250
end if;
------------------------------------------------------------------9--------------------------------------
-------------------------
when "01001" => z:= "0001000000000000000000000000001010000000000000";
------------------------------------------------------------------10-------------------------------------
-------------------------
when "01010" =>
if(IR="00000110" or IR="00010110" or IR="00100110" or IR="00110110" or IR="01000110" or IR="01010110" or
IR="01100110" or IR="01110110"
or IR="10000110" or IR="10010110" or IR="11000110" or IR="11010110" or IR="11100110" or IR="00000111" or
IR="00010111" or IR="00100111"
or IR="00110111" or IR="01000111" or IR="01010111" or IR="01100111" or IR="01110111" or IR="10000111" or
IR="10010111" or IR="11000111"
or IR="11010111" or IR="11100111" or IR="11110111" or IR="11110110" or IR="00000111" or IR="00010111" or
IR="10110110" or IR="10110111"
or IR="11100010" or IR="11100011" or IR="11110010" or IR="11110011")
then
z:=
"0000000000000000000000001000000000000111001000";-- 10--5
end if;
if(IR="00100101" or IR="00110101" or IR="01000101" or IR="01010101" or IR="01100101" or IR="10010101"
)then
z:=
"0000000000000000010000000011101110000000000000";
end if;
if(IR="00010010" or IR="00010001" or IR="00110001" or IR="01010001" or IR="01110001" or IR="10010001" or
IR="10110001" or IR="11010001" or IR="11110001")then
z:=
"0000000000010000000000000011110000000000000001";
end if;
if(IR="00100010" or IR="00110010")then
z:=
"0000000000000000000000000011110000000000000000";
end if;
if(IR="11000000")then
z:=
"0000000000000000010000000011101110000000000000";
end if;
if(IR="11010000")then
z:=
"0000000000000000000000110000000000000000100000";
end if;
251
if(IR="10000000")then
z:=
"0000000000000000000000000000000001110001000000";
end if;
if(IR="10000101")then
z:=
"0000000000000000000000000011100000000000000000";
end if;
if(IR="00100000" or IR="00110000" or IR="00010000")then
z:=
"0000000000000000000000000011100000000000000000";
end if;
if(IR="11000010" or IR="11010010" or IR="01110010" or IR="10000010" or IR="10010010" or IR="10100010"
or IR="10110010" or IR="10100000" or IR="10110000")then
z:=
"0000000000000000000000000011100000000000000000";--c2,d2,72,82,92,a2,b2,a0,b0
end if;
-----------------------------------------------------------------11--------------------------------------
------------------------
when "01011" =>
if(IR="11100111" or IR="11100110" or IR="11101000" or IR="11101001" or IR="11101010" or IR="11101011" or
IR="11101100" or IR="11101101"
or IR="11101110" or IR="11101111" or IR="11100010" or
IR="11100011")then
z:=
"0000000000000000000000000000000010000000001000";
end if;
if(IR="00100110" or IR="00110110" or IR="01000110" or IR="01010110" or IR="01100110" or IR="00100111" or
IR="00110111" or IR="01000111" or IR="01010111" or IR="01100111"
or IR="10010110" or IR="10010111" or IR="00000110" or IR="00010110" or IR="00001000" or IR="00001001" or
IR="00001010" or IR="00001011"
or IR="00001100" or IR="00001101" or IR="00001110" or IR="00001111" or IR="00011000" or IR="00011001" or
IR="00011010" or IR="00011011"
or IR="00011100" or IR="00011101" or IR="00011110" or IR="00011111" or IR="00010110" or IR="00000111" or
IR="00010111"
or IR="11001000" or IR="11001001" or IR="11001010" or IR="11001011" or IR="11001100" or IR="11001101" or
IR="11001110" or IR="11001111"
or IR="11000110" or IR="11010110" or IR="11000111" or IR="11010111" or IR="10000110" or IR="10000111" or
IR="11011000" or IR="11011001"
or IR="11011010" or IR="11011011" or IR="11011100" or IR="11011101" or IR="11011110" or IR="11011111"
)then
z:=
"0000000000000000000000000011101110000000001000";
end if;
if(IR="00101000" or IR="00101001" or IR="00101010" or IR="00101011" or IR="00101100" or IR="00101101" or
IR="00101110" or IR="00101111"
252
or IR="00111000" or IR="00111001" or IR="00111010" or IR="00111011" or IR="00111100" or IR="00111101" or
IR="00111110" or IR="00111111"
or IR="01001000" or IR="01001001" or IR="01001010" or IR="01001011" or IR="01001100" or IR="01001101" or
IR="01001110" or IR="01001111"
or IR="01011000" or IR="01011001" or IR="01011010" or IR="01011011" or IR="01011100" or IR="01011101" or
IR="01011110" or IR="01011111"
or IR="01101000" or IR="01101001" or IR="01101010" or IR="01101011" or IR="01101100" or IR="01101101" or
IR="01101110" or IR="01101111"
or IR="10011000" or IR="10011001" or IR="10011010" or IR="10011011" or IR="10011100" or IR="10011101" or
IR="10011110" or IR="10011111"
or IR="10001000" or IR="10001001" or IR="10001010" or IR="10001011" or IR="10001100" or IR="10001101" or
IR="10001110" or IR="10001111"
)then
z:=
"0000000000000000000000000000001110000000001000";
end if;
if(IR="10111000" or IR="10111001" or IR="10111010" or IR="10111011" or IR="10111100" or IR="10111101" or
IR="10111110" or IR="10111111"
or IR="10110110" or IR="10110111")then
z:=
"0000000000000000000000000000001010000000001000";
end if;
if(IR="00010010" )then
z:=
"0000000000000000000000010000001110000000000100";
end if;
if(IR="11010000")then
z:=
"0000000000000000001000001000001110000000001000";
end if;
if(IR="10000000")then
z:=
"0000000000000000000000000100000001110111000000";
end if;
if(IR="11010101" or IR="00000101" or IR="00010101" )then
z:=
"0000000000000000010000000011101110000000000000";
end if;
if(IR="10110101")then
z:=
"0000000000000000010000010011101110000000000000";
end if;
253
if(IR="11000010" or IR="11010010" or IR="01110010" or IR="10000010" or IR="10010010" or IR="10100010" or
IR="10110010" or IR="10100000"
or IR="10110000" or IR="00100000" or IR="00110000" or
IR="00010000")then--clr bit, setb bit
z:=
"0000000001000000000000001000000000000111000000";
end if;
if(IR="11110111" or IR="11110110" or IR="11111000" or IR="11111001" or IR="11111010" or IR="11111011" or
IR="11111100" or IR="11111101"
or IR="11111110" or IR="11111111")then-- 11--2
z:=
"0000000000000000000000000011100000010000000001";
end if;
------------------------------------------------------------12-------------------------------------------
-----------------------------
when "01100" =>
if(IR="11001000" or IR="11001001" or IR="11001010" or IR="11001011" or IR="11001100" or IR="11001101" or
IR="11001110" or IR="11001111"
or IR="11000110" or IR="11010110" or IR="11000111" or
IR="11010111")then
z:=
"0000000000000000000001000011100000000000000001";
end if;
if( IR="11000101")then
z:=
"0000000000000000001000001011100000010000000000";
end if;
if(IR="10100100" )then
z:=
"0000000000000000100000000000000110000000000000";
end if;
if(IR="10000100" )then
z:=
"0000000000000001000000000000000010000000000000";
end if;
if(IR="11011000" Or IR="11011001" or IR="11011010" or IR="11011011" or IR="11011100" or IR="11011101" or
IR="11011110" or IR="11011111" or IR="11010101"
or IR="10110110" or IR="10110111" or IR="10111000" or IR="10111001" or IR="10111010" or IR="10111011" or
IR="10111100" or IR="10111101" or IR="10111110"
or IR="10111111" or IR="10110100" or IR="10110101" )then
z:=
"0000000000000000000000010000001110000000000100";--
end if;
254
if(IR="10100110" or IR="10100111" or IR="10101000" or IR="10101001" or IR="10101010" or IR="10101011" or
IR="10101100" or IR="10101101" or IR="10101110" or IR="10101111")then
z:=
"0000000000000000000000001100000000000111000000";
end if;
if(IR="00010010" or IR="00010001" or IR="00110001" or IR="01010001" or IR="01110001" or IR="10010001" or
IR="10110001" or IR="11010001" or IR="11110001")then
z:=
"0000000000001000000000110011110000000000000001";
end if;
if(IR="10000101")then
z:=
"0000000000000000000000001000000000000111000100";
end if;
if(IR="00100000" or IR="00110000" or IR="00010000")then
z:=
"0000000000000000000000011000001010000000000100";
end if;
------------------------------------------------------------------13-------------------------------------
-----------------------------
when "01101" =>
if(IR="11001000" or IR="11001001" or IR="11001010" or IR="11001011" or IR="11001100" or IR="11001101" or
IR="11001110" or IR="11001111"
or IR="11000110" or IR="11010110" or IR="11000111" or
IR="11010111")then
z:=
"0000000000000000000000000011100000000000000000";
end if;
if(IR="10110110" or IR="10110111" or IR="10111000" or IR="10111001" or IR="10111010" or IR="10111011" or
IR="10111100" or IR="10111101"
or IR="10111110" or IR="10111111" or IR="10110100" or
IR="10110101")then
z:=
"0000000000000000000000000000000000000000000000";
end if;
if(IR="00100000" or IR="00110000" or IR="00010000")then
z:=
"0000000000000000010000000011101110000000000000";
end if;
-----------------------------------------------------------------14--------------------------------------
----------------------------
when "01110" =>
255
if(IR="11010000")then
z:=
"0000000000000000000000000011110000000000000000";
end if;
if(IR="11000010" or IR="11010010" or IR="01110010" or IR="10000010" or IR="10010010" or IR="10100010"
or IR="10110010" or IR="10100000" or IR="10110000")then
z:=
"0000000000000000010000000011101110000000000000";--c2,d2,72,82,92,a2,b2,a0,b0
end if;
if(IR="11000000" or IR="00010010" or IR="00010001" or IR="00110001" or IR="01010001" or IR="01110001" or
IR="10010001" or IR="10110001" or IR="11010001" or IR="11110001")then
z:=
"0000000000000000000000110000000000000000000000";
end if;
if(IR="00100010" or IR="00110010")then
z:=
"0000000000000000000000110000000000000000100000";
end if;
if((IR="11011000" Or IR="11011001" or IR="11011010" or IR="11011011" or IR="11011100" or IR="11011101" or
IR="11011110" or IR="11011111" or IR="11010101"
or IR="01100000" or IR="01110000" or IR="01000000" or IR="01010000" or IR="00100000")and ZE='1')then
z:=
"0000000000000000000000000100000001110011000000";
end if;
if((IR="10110110" or IR="10110111" or IR="10111000" or IR="10111001" or IR="10111010" or IR="10111011" or
IR="10111100" or IR="10111101" or IR="10111110"
or IR="10111111" or IR="10110100" or IR="10110101")and ZE='1')then
z:=
"0000000100000000000000000100000001110011000000";
end if;
if((IR="00100000" or IR="00110000" or IR="00010000")and ZE='1')then
z:=
"0000000000000000000000000100000001010011000000";
end if;
if(IR="01110011")then
z:=
"0000000000000000000000000101010000010011000000";
end if;
if(IR="10010011")then
z:=
"0000000000000000000000000101010000010111000000";
256
end if;
if(IR="10000011")then
z:=
"0000000000000000000000000100000000010111000000";
end if;
-----------------------------------------------------------------15--------------------------------------
-----------------------------
WHEN "01111" =>
If((IR="11011000" Or IR="11011001" or IR="11011010" or IR="11011011" or IR="11011100" or IR="11011101" or
IR="11011110" or IR="11011111" or IR="11010101"
or IR="10110110" or IR="10110111" or IR="10111000" or IR="10111001" or IR="10111010" or IR="10111011" or
IR="10111100" or IR="10111101" or IR="10111110"
or IR="10111111" or IR="10110100" or IR="10110101" or IR="01100000" or IR="01110000" or IR="01000000" or
IR="01010000" or IR="00100000")and ZE='1')then
z:=
"0000000000000000000000000000000001110001000000";
end if;
if((IR="00100000" or IR="00110000" or IR="00010000")and ZE='1')then
z:=
"0000000000000000000000000000000001010001000000";
end if;
if(IR="10100110" or IR="10100111" )then
z:=
"0000000000000000000000001000000000000111001000";
end if;
-----------------------------------------------------------------16--------------------------------------
----------------------------
when "10000" => z:= "0000100000000000000000000000001110000000000000";
-----------------------------------------------------------------17--------------------------------------
----------------------------
when "10001" => z:= "0000000000000000000000110000000000000000000000";
-----------------------------------------------------------------18--------------------------------------
----------------------------
when "10010" => z:= "0000000000001000000000110011110000000000000001";
-----------------------------------------------------------------19--------------------------------------
----------------------------
when "10011" => z:= "0000000000010000000000000011110000000000000001";
-----------------------------------------------------------------20--------------------------------------
----------------------------
when "10100" => z:= "0000000000000000000000001000000001010001000000";
-----------------------------------------------------------------21--------------------------------------
----------------------------
when "10101" => z:= "0100000000000000000000001000000001110011000000";
when others=> z:= "0000000000000000000000000000000000000000000000";
end case;
q<=z;
257
end process;
end operacion;
CODIGO VHDL DEL DISPOSITIVO CABLE
Este código simplemente coloca lo que llega en la entrada en la salida, es útil
cuando se necesitan datos de los buses tri-estados en la misma unidad de donde
se generan estos datos.
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
Entity cable is
Port(
X : in std_logic_vector ( 7 downto 0 );
Q : out std_logic_vector ( 7 downto 0 ));
End cable;
Architecture Op of cable is
Begin
Q<= X;
End Op;
CODIGO VHDL DEL DISPOSITIVO AND20
Este código funciona como una compuerta AND negada de 21 entradas.
258
library ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_signed.all;
USE ieee.std_logic_arith.all;
entity and20 is
port(a: in std_logic_vector( 20 downto 0);
s: out std_logic);
end entity;
architecture operacion of and20 is
begin
process
begin
if(a="000000000000000000000")then
s<='1';
else
s<='0';
end if;
end process;
end operacion;
259
CODIGO VHDL DEL DISPOSITIVO REG8BAGU
Este dispositivo se utiliza en la unidad generadora de direcciones para acomodar
el valor de la posición de memoria en las instrucciones de direccionamiento a
banco de registros, indirecto y llamados a subrutinas.
library ieee;
use ieee.std_logic_1164.all;
Entity REG8Bagu is
port(
C : in std_logic;--C = Clr,CLK
SEL,PSW : in std_logic_vector(1 downto 0);
D : in std_logic_vector(7 downto 0);
Q : out std_logic_vector(7 downto 0));
end entity;
Architecture Op of REG8Bagu is
Signal REG : std_logic_vector(7 downto 0);
Begin
Process(SEL)
Begin
--if(clk'event and clk = '1')then
if (C = '1') then
REG <= "00000000";
else
REG <= D;
260
end if;
--end if;
case SEL is
when "01" => Q<= "000" & PSW(1 downto 0) & "00" & REG(0);--RI
when "10" => Q<= "000" & PSW(1 downto 0) & REG(2 downto 0);--
RN
when "11" => Q<= "00000" & REG(7 downto 5);--ACALL
when others=>Q<= "00000000";
end case;
end process;
end Op;
CODIGO VHDL DEL DISPOSITIVO AS2
Este código se utiliza en las instrucciones de salto relativo para escoger si la parte
alta del dato que entra al sumador debe ser “11111111” o “00000000”.
library ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_signed.all;
Entity as2 is
port(
A : in std_logic;
261
Q : out std_logic_vector(7 downto 0));
end as2;
Architecture Op of as2 is
Begin
Process
Variable REG : std_logic_vector(7 downto 0);
Variable REG1: std_logic;
Begin
if (A = '1') then
REG := "11111111";
else
REG := "00000000";
end if;
Q <= REG;
end process;
end Op;
CODIGO VHDL DEL DISPOSITIVO CABLE2
Este código cumple la función concatenar las dos entradas y ponerlas en la salida.
library ieee;
262
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
Entity cable2 is
Port(
X,Y : in std_logic_vector ( 7 downto 0 );
Q : out std_logic_vector ( 15 downto 0 ));
End entity;
Architecture Op of cable2 is
Begin
Q<= X&Y;
End Op;
CODIGO VHDL DEL DISPOSITIVO U_CORRI
Este código funciona de la siguiente manera: se tiene primero en cuenta el valor
del bit 1 del nibble alto del IR, si es cero las posibles operaciones a realizar son
RR A y RRC A, donde el bit 0 del nibble alto es quien decide cual de las dos se
cumple; en el caso que el bit 1 sea uno las posibles operaciones son RL A y RLC A,
y de igual manera el bit 0 es quien decide. Esto se puede dar debido a que los
códigos de operación del nibble alto de estas instrucciones son 0,1,2 y3.
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
263
entity U_CORRi is
port(A: in std_logic_vector(7 downto 0);
Ci: in std_logic;
sel: in std_logic_vector(1 downto 0);
Co:out std_logic;
x: out std_logic_vector(7 downto 0));
end entity;
architecture U_CORRi of U_CORRi is
begin
process (sel)
variable temp1,temp2 : std_logic_vector (7 downto 0);
begin
temp1 := A;
if ( sel(1) = '1') then
if (sel(0) = '0') then
temp2 := temp1(6 downto 0) & temp1(7);--RL
Co <= Ci;
else
temp2 := temp1(6 downto 0) & Ci;--RLC
Co <= temp1(7);
end if;
else
264
if (sel(0) = '0') then
temp2 := temp1(0) & temp1(7 downto 1);--RR
Co <= ci;
else
temp2 := Ci & temp1(7 downto 1);--RRC
Co <= temp1(0);
end if;
end if;
x <= temp2;
end process;
end U_CORRi;
CODIGO VHDL DEL DISPOSITIVO U_EXCH
Este código para cumplir con sus operaciones se basa en los 5 primeros bits del
IR; la primera selección la hace con el bit 4, osea el bit menos significativo del
nibble alto del IR, si es cero tiene como posibilidades las instrucciones SWAP y
XCH, para seleccionar entre estas dos se utiliza todo el nibble bajo del IR, ya que
si es su valor es “0100” se escoge la instrucción SWAP, sino se escoge la
instrucción XCH. Para cuando el bit 4 valga uno se tiene como posibilidades las
instrucciones DA y XCHD, e igualmente se elige con la ayuda del nibble bajo del
IR, cuando este valga “0100” se elige la instrucción DA y cuando tenga cualquier
otro valor escoge la instrucción XCHD.
library ieee;
USE ieee.std_logic_1164.all;
265
USE ieee.std_logic_signed.all;
entity u_exch is
port( A,B : in std_logic_vector (7 downto 0);--Entradas de los
registros A y Temp 2
S0,C,CV:in std_logic;
--Entrada de seleccion S0 IR(4), Carry y Carry intermedio
IRH : in std_logic_vector (3 downto 0);--Parte baja del IR.
Determina si se hace el ajuste decimal o no
Cout: out std_logic;
QA,QB: out std_logic_vector (7 downto 0));
end entity;
architecture operacion of u_exch is
begin
process(A,B,S0)
variable T1, T2,C1 : std_logic;
variable U1 ,U2 : std_logic_vector(5 downto 0);
variable T3 : std_logic_vector(8 downto 0);
begin
case S0 is
when '0' => if (IRH = "0100") then
QA<= A(3 downto 0) & A(7 downto 4);-
-SWAP
QB<="00000000";
C1:=C;
else
266
QA <= B; --XCH
QB <= A;
C1:=C;
end if;
when '1' => if (IRH = "0100") then --Ajuste Decimal
T1:= CV or (A(3) and (A(2) or A(1)));
T2:= C or (A(7) and (A(6) or A(5)));
if (T1 = '1')then
U1:='0'&A(3downto 0)+"00110";
else
U1 := "00" & A(3 downto 0);
end if;
if(T2 = '1')then
U2:='0'&A(7downto 4)+"00110";
else
U2 := "00" &A(7 downto 4);
end if;
T3:= U2 & "0000"+U1;
QA<=T3(7 downto 0);
QB<= "00000000";
C1:=T3(8);
else
QA<= A(7 downto 4) & B(3 downto 0);--XCHD
QB<= B(7 downto 4) & A(3 downto 0);--XCHD
C1:=C;
end if;
when others=>
267
QA<="00000000"; QB<="00000000";
C1:=C;
end case;
Cout<=C1;
end process;
end operacion;
CODIGO VHDL DEL DISPOSITIVO DIRBITS
Este código recibe un valor en la entrada que contiene información de la dirección
en memoria del byte que contiene el bit necesario para realizar la instrucción y del
bit. Para encontrar la dirección se verifica el valor del bit más significativo (si es
cero es porque el byte que contiene el bit está entre 20h y 2fh, y si el bit es uno el
byte está en la zona de registros de funciones especiales) y para la salida del
código del bit se coloca los tres bits menos significativos de la entrada..
Library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
Entity dirbits is
Port(
tmp1 : in std_logic_vector (7 downto 0);
datout : out std_logic_vector (7 downto 0);
bit : out std_logic_vector(2 downto 0));
268
End entity;
Architecture Op of dirbits is
Begin
Process
variable tmp: std_logic_vector(7 downto 0);
Begin
if (tmp1(7) = '0') Then
tmp:="0010" &tmp1(6 downto 3);
else
tmp:=tmp1(7 downto 3) & "000";
end if;
bit<=tmp1(2 downto 0);
datout<=tmp;
end Process;
End Op;
CODIGO VHDL DEL DISPOSITIVO CJNE
Este código verifica para realizar sus operaciones que los dos bits menos
significativos del nibble alto estén en uno, de lo contrario lo que haya en la
entrada es puesto en la salida. Cuando la verificación es satisfactoria se realizan
269
operaciones de “igualdad” y “menor que” entre los datos que llegan a las entradas
A y B.
library ieee;
use ieee.std_logic_1164.all;
Entity cjne is
port(
a,b : in std_logic_vector(7 downto 0);
ir : in std_logic_vector(1 downto 0);
cin,r : in std_logic;
s,cout : out std_logic);
end entity;
Architecture Op of cjne is
Begin
Process
variable temp: std_logic;
Begin
if(ir="11")then
if(a=b)then
temp:='0';
cout<=cin;
270
else
if(a<b)then
temp:='1';
cout <= '1';
else
temp:='1';
cout <= '0';
end if;
end if;
s<=temp;
else
s<=r;
cout<=cin;
end if;
end process;
end Op;
CODIGO VHDL DEL DISPOSITIVO UL
Este código tiene como función escoger entre las operaciones lógicas AND, OR,
XOR y NOT, teniendo en cuenta los dos bit menos significativos del nibble alto del
IR, “00” para la instrucción ORL, “01” para la instrucción ANL, “10” para la
instrucción XRL y “11” para la instrucción CPL A.
271
library ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_signed.all;
entity ul is
port(x,y: in std_logic_vector(7 downto 0);
sel: in std_logic_vector(1 downto 0);
z: out std_logic_vector(7 downto 0));
end entity;
architecture operacion of ul is
begin
process
begin
case sel is
when "00" => z<= x or y;
when "01" => z<= x and y;
when "10" => z<= x xor y;
when "11" => z<= not x;
when others=> z<= "00000000";
end case;
end process;
end operacion;
272
CODIGO VHDL DEL DISPOSITIVO CJNEMUX
library ieee;
use ieee.std_logic_1164.all;
Entity cjnemux is
port(
IR : in std_logic_vector(7 downto 0);
s : out std_logic);
end entity;
Architecture Op of cjnemux is
Begin
Process(IR)
Begin
if(IR="10110110" or IR="10110111" or IR="10111000" or IR="10111001"
or IR="10111010" or IR="10111011" or IR="10111100"
or IR="10111101" or IR="10111110" or IR="10111111")then
s <= '1';
else
s <= '0';
end if;
end process;
end Op;
273
CODIGO VHDL DEL DISPOSITIVO CJNEMUX1
library ieee;
use ieee.std_logic_1164.all;
Entity cjnemux1 is
port(
IR : in std_logic_vector(7 downto 0);
s : out std_logic);
end entity;
Architecture Op of cjnemux1 is
Begin
Process(IR)
Begin
if(IR="10110100" or IR="10110101" )then
s <= '0';
else
s <= '1';
end if;
end process;
end Op;
274
CODIGO VHDL DEL DISPOSITIVO ARREOV
La función de este código es elegir cual de las banderas de desbordamiento se
coloca en la salida dependiendo de la palabra de operación IR.
library ieee;
use ieee.std_logic_1164.all;
Entity ARREOV is
port(
OVA,OVD,OVM: in std_logic;--
IR : in std_logic_vector(7 downto 0);
Q : out std_logic);
end entity;
Architecture Op of ARREOV is
Begin
Process
variable REG : std_logic;
Begin
IF(IR="10000100")THEN
REG:=OVD;
END IF;
if(IR="10100100")then
REG:=OVM;
end if;
275
if(IR="00100100" or IR="00110100" or IR="10010100"
or IR="00100101" or IR="00110101" or IR="10010101"
or IR="00100110" or IR="00110110" or IR="00100111"
or IR="00110111" or IR="00101000" or IR="00101001"
or IR="00101010" or IR="00101011" or IR="00101100"
or IR="00101101" or IR="00101110" or IR="00101111"
or IR="00111000" or IR="00111001" or IR="00111010"
or IR="00111011" or IR="00111100" or IR="00111101"
or IR="00111110" or IR="00111111" or IR="10011000"
or IR="10011001" or IR="10011010" or IR="10011011"
or IR="10011100" or IR="10011101" or IR="10011110"
or IR="10011111" or IR="10010110" or IR="10010111")then
REG:=OVA;
end if;
Q <= REG;
end process;
end Op;
CODIGO VHDL DEL DISPOSITIVO PRUBIT
library ieee;
USE ieee.std_logic_1164.all;
276
USE ieee.std_logic_signed.all;
entity prubit is
port(ir,datoin: in std_logic_vector(7 downto 0);
bits : in std_logic_vector(2 downto 0);
cin,Z,R : in std_logic;
cout,s : out std_logic;
datoout: out std_logic_vector(7 downto 0));
end entity;
architecture operacion of prubit is
begin
process
variable temp1: std_logic_vector(7 downto 0);
variable temp2: std_logic;
variable temp3,s1: std_logic;
begin
temp1:=datoin;
case bits is
when "000"=>temp2:=datoin(0);
when "001"=>temp2:=datoin(1);
when "010"=>temp2:=datoin(2);
when "011"=>temp2:=datoin(3);
277
when "100"=>temp2:=datoin(4);
when "101"=>temp2:=datoin(5);
when "110"=>temp2:=datoin(6);
when "111"=>temp2:=datoin(7);
when others=>temp2:='0';
end case;
case ir is
when "01110010" => cout<= cin or temp2; --C
or bit
temp3:= temp2;s1:='0';
when "10000010" => cout<= cin and temp2; -
-C and bit
temp3:= temp2;s1:='0';
when "10010010" => cout<= cin; --mov
bit,C
temp3:= cin;s1:='0';
when "10100010" => cout<= temp2; --
mov C,bit
temp3:= temp2;s1:='0';
when "10110010" => cout<= cin; --cpl bit
temp3:= not temp2;
278
when "11000010" => cout<= cin;s1:='0';
--clr bit
temp3:= '0';s1:='0';
when "11010010" => cout<= cin; --setb
bit
temp3:= '1';s1:='0';
when "10100000" => cout<= cin or (not temp2); --C
or /bit
temp3:= temp2;s1:='0';
when "10110000" => cout<= cin and (not temp2); --C
and /bit
temp3:= temp2;s1:='0';
when "11000011" => cout<= '0';
--Clr C
temp3:=temp2;s1:='0';
when "11010011" => cout<= '1'; --
setb C
temp3:=temp2;s1:='0';
when "10110011" => cout<= not cin;
--Cpl C
temp3:=temp2;s1:='0';
279
when "00010000" => if(temp2='1')then
--JBC
s1:='1';
temp3:='0';
else
s1:='0';
temp3:=temp2;
end if;
cout<=cin;
when "00100000" => if(temp2='1')then
--JB
s1:='1';
else
s1:='0';
end if;
cout<=cin;
temp3:=temp2;
when "00110000" => if(temp2='0')then
--JNB
s1:='1';
else
s1:='0';
end if;
cout<=cin;
280
temp3:=temp2;
when "01000000" => if(cin='1')then
--JC
s1:='1';
else
s1:='0';
end if;
cout<=cin;
temp3:=temp2;
when "01010000" => if(cin='0')then
--JNC
s1:='1';
else
s1:='0';
end if;
cout<=cin;
temp3:=temp2;
when "01100000" => if(z='1')then
--JZ
s1:='1';
else
s1:='0';
end if;
cout<=cin;
281
temp3:=temp2;
when "01110000" => if(z='0')then
--JNZ
s1:='1';
else
s1:='0';
end if;
cout<=cin;
temp3:=temp2;
when others=> cout<= '0'; temp3:='0';s1:=R;
end case;
s<=s1;
case bits is
when "000"=>temp1:=temp1(7 downto 1)&temp3;
when "001"=>temp1:=temp1(7 downto
2)&temp3&temp1(0);
when "010"=>temp1:=temp1(7 downto
3)&temp3&temp1(1 downto 0);
when "011"=>temp1:=temp1(7 downto
4)&temp3&temp1(2 downto 0);
when "100"=>temp1:=temp1(7 downto
5)&temp3&temp1(3 downto 0);
282
when "101"=>temp1:=temp1(7 downto
6)&temp3&temp1(4 downto 0);
when "110"=>temp1:=temp1(7)&temp3&temp1(5
downto 0);
when "111"=>temp1:=temp3&temp1(6 downto 0);
when others=>temp1:="00000000";
end case;
datoout<=temp1;
end process;
end operacion;
CODIGO VHDL DEL DISPOSITIVO ARRECARRY
Este código escoge entre todas las señales de acarreo que le llegan a la entrada
(acarreo por adición, acarreo por multiplicación, acarreo por división, acarreo por
intercambio, acarreo por la instrucción cjne y acarreo por instrucciones de bits).
library ieee;
use ieee.std_logic_1164.all;
Entity ARRECARRY is
port(
CADDER,CEXCH,CCORR,CCJNE,CBIT: in std_logic;--
IR : in std_logic_vector(7 downto 0);
283
Q : out std_logic);
end entity;
Architecture Op of ARRECARRY is
Begin
Process
variable REG : std_logic;
Begin
IF(IR="10000100" or IR="10100100")THEN
REG:='0';
END IF;
if(IR="01110010" or IR="10000010" or IR="10100010"
or IR="10100000" or IR="10110000" or IR="10110011"
or IR="11000011"
or IR="11010011")then
REG:=CBIT;
end if;
if(IR="11010100")then
REG:=CEXCH;
end if;
if(IR="00010011" or IR="00110011")then
REG:=CCORR;
end if;
284
if(IR="00100100" or IR="00110100" or IR="10010100"
or IR="00100101" or IR="00110101" or IR="10010101"
or IR="00100110" or IR="00110110" or IR="00100111"
or IR="00110111" or IR="00101000" or IR="00101001"
or IR="00101010" or IR="00101011" or IR="00101100"
or IR="00101101" or IR="00101110" or IR="00101111"
or IR="00111000" or IR="00111001" or IR="00111010"
or IR="00111011" or IR="00111100" or IR="00111101"
or IR="00111110" or IR="00111111" or IR="10011000"
or IR="10011001" or IR="10011010" or IR="10011011"
or IR="10011100" or IR="10011101" or IR="10011110"
or IR="10011111" or IR="10010110" or IR="10010111")then
REG:=CADDER;
end if;
if(IR="10110110" or IR="10110111" or IR="10111000"
or IR="10111001" or IR="10111010" or IR="10111011"
or IR="10111100"
or IR="10111101" or IR="10111110" or IR="10111111"
or IR="10110100" or IR="10110101")then
REG:=CCJNE;
end if;
Q <= REG;
end process;
285
end Op;
CODIGO VHDL DEL DISPOSITIVO SALTOARRE
library ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_signed.all;
USE ieee.std_logic_arith.all;
entity saltoarre is
port(sa: in std_logic_vector( 4 downto 0);
IR: in std_logic_vector(7 downto 0);
sq: in std_logic;
s: out std_logic);
end entity;
architecture operacion of saltoarre is
begin
process
begin
if(((sa="01100" )and (IR="00010000"
or IR="00100000" or IR="00110000" )and sq='1')
or ((sa="00001" )and (IR="01000000"
286
or IR="01010000" or IR="01100000" or
IR="01110000")and sq='1'))then
s<='1';
else
if((sa="01110" or sa="01111")and
(IR="00010000" or IR="00100000" or IR="00110000"
or IR="01000000" or IR="01010000"
or IR="01100000" or IR="01110000"
))then
s<='1';
else
s<='0';
end if;
end if;
end process;
end operacion;
CODIGO VHDL DEL DISPOSITIVO ARRE_RAMEX
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
Entity arre_ramex is
287
Port(
IR : in std_logic_vector ( 7 downto 0 );
Q : out std_logic_vector ( 1 downto 0 ));
End entity;
Architecture Op of arre_ramex is
Begin
process(IR)
begin
if(IR="11100000" or IR="11110000" or IR="11100010"
or IR="11110010"
or IR="11100011" or IR="11110011")then
Q<="10";
else
Q<="01";
end if;
end process;
End Op;
288
ANEXO B
CODIGO AHDL DEL DISPOSITIVO CPU
Este código tiene como función generar el estado siguiente que debe cumplir una
instrucción para ejecutarse a cabalidad, se desarrolla en lenguaje ADHL por la
facilidad que otorga para implementar máquinas de estados.
SUBDESIGN CPU
(
clk : INPUT;
reset : INPUT;
INT : INPUT;
IR[7..0] : INPUT;--PALABRA DE INSTRUCCION
SALTO : INPUT;
sa[4..0] : OUTPUT;
)
VARIABLE
% current current %
% state output %
ss: MACHINE OF BITS (sa[4..0])
WITH STATES (s0 = B"00000",
s1 = B"00001",
s2 = B"00010",
s3 = B"00011",
289
s4 = B"00100",
s5 = B"00101",
s6 = B"00110",
s7 = B"00111",
s8 = B"01000",
s9 = B"01001",
s10 = B"01010",
s11 = B"01011",
s12 = B"01100",
s13 = B"01101",
s14 = B"01110",
s15 = B"01111",
s16 = B"10000",
s17 = B"10001",
s18 = B"10010",
s19 = B"10011",
s20 = B"10100",
s21 = B"10101");
BEGIN
ss.clk = clk;
ss.reset = reset;
TABLE
% current current next %
% state input state %
ss, IR[7..0], SALTO, INT => ss;
s0, B"XXXXXXXX", x, x => s1;
290
s1, B"00000000", x, x => s2;--Op. modo implicito*********************
s1, B"00000011", x, x => s2;--Op. RR A*******************************
s1, B"00000100", x, x => s2;--Op. INC A******************************
s1, B"00010011", x, x => s2;--Op. RRC A******************************
s1, B"00010100", x, x => s2;--Op. DEC A******************************
s1, B"00100011", x, x => s2;--23 RL A********************************
s1, B"00110011", x, x => s2;--33 RLC A*******************************
s1, B"101x0011", x, x => s2;--inc dptr , cpl c***********************
s1, B"110x0011", x, x => s2;--Op. clr c y setb c*********************
s1, B"110x0100", x, x => s2;--Op. D4 DA A y C4 SWAP A****************
s1, B"111x0100", x, x => s2;--Op. modo implicito*********************
s1, B"10x00100", x, x => s12;--OP. mu a, div a***********************
s12, B"10x00100", x, x => s3;
s3, B"10x00100", x, x => s2;--***************************************
s1, B"001x0100", x, x => s3;--Op. modo inmediato con destino A*******
s1, B"01xx0100", x, x => s3;
s1, B"10010100", x, x => s3;
s3, B"001x0100", x, x => s2;
s3, B"10010100", x, x => s2;
s3, B"01xx0100", x, x => s2;--Op. modo inmediato con destino A*******
s1, B"11100000", x, x => s3;--Op. movx a,dptr*********************
s3, B"11100000", x, x => s2;--***************************************
s1, B"11110000", x, x => s2;--Op. movx dptr,a************************
s1, B"0111011x", x, x => s4;--Op. modo inmediato con destino Ri******
s4, B"0111011x", x, x => s10;
s10, B"0111011x", x, x => s5;
s5, B"0111011x", x, x => s3;
s3, B"0111011x", x, x => s2;--Op. modo inmediato con destino Ri******
291
s1, B"01111xxx", x, x => s4;--Op. modo inmediato con destino Rn******
s4, B"01111xxx", x, x => s3;
s3, B"01111xxx", x, x => s2;--Op. modo inmediato con destino Rn******
s1, B"01110101", x, x => s6;--Op. modo inmediato con destino dir(mov)
s6, B"01110101", x, x => s7;
s7, B"01110101", x, x => s2;--Op. modo inmediato con destino dir*****
s1, B"001x011x", x, x => s4;--Op. modo indirecto con destino A*******
s1, B"010x011x", x, x => s4;
s1, B"0110011x", x, x => s4;
s1, B"1001011x", x, x => s4;
s4, B"001x011x", x, x => s10;
s4, B"010x011x", x, x => s10;
s4, B"0110011x", x, x => s10;
s4, B"1001011x", x, x => s10;
s10, B"001x011x", x, x => s5;
s10, B"010x011x", x, x => s5;
s10, B"0110011x", x, x => s5;
s10, B"1001011x", x, x => s5;
s5, B"001x011x", x, x => s11;
s5, B"010x011x", x, x => s11;
s5, B"0110011x", x, x => s11;
s5, B"1001011x", x, x => s11;
s11, B"001x011x", x, x => s7;
s11, B"010x011x", x, x => s7;
s11, B"0110011x", x, x => s7;
s11, B"1001011x", x, x => s7;
s7, B"001x011x", x, x => s2;
292
s7, B"010x011x", x, x => s2;
s7, B"0110011x", x, x => s2;
s7, B"1001011x", x, x => s2;--Op. modo indirecto con destino A*******
s1, B"110x011x", x, x => s4;--Op. modo ind con destino A (xch a,ri)**
s4, B"110x011x", x, x => s10;
s10, B"110x011x", x, x => s5;
s5, B"110x011x", x, x => s11;
s11, B"110x011x", x, x => s12;
s12, B"110x011x", x, x => s7;
s7, B"110x011x", x, x => s2;--Op. modo indirecto con destino A*******
s1, B"1011011x", x, x => s4;--Op. CJNE Ri,#data**********************
s4, B"1011011x", x, x => s10;
s10, B"1011011x", x, x => s3;
s3, B"1011011x", x, x => s5;
s5, B"1011011x", x, x => s11;
s11, B"1011011x", x, x => s13;
s13, B"1011011x", x, x => s12;
s12, B"1011011x", 1, x => s15;
s15, B"1011011x", 1, x => s14;
s14, B"1011011x", 1, x => s2;
s12, B"1011011x", 0, x => s2;--***************************************
s1, B"10111xxx", x, x => s3;--Op. CJNE RN,#data**********************
s3, B"10111xxx", x, x => s5;
s5, B"10111xxx", x, x => s11;
s11, B"10111xxx", x, x => s13;
s13, B"10111xxx", x, x => s12;
s12, B"10111xxx", 1, x => s15;
293
s15, B"10111xxx", 1, x => s14;
s14, B"10111xxx", 1, x => s2;
s12, B"10111xxx", 0, x => s2;--***************************************
s1, B"10110100", x, x => s13;--Op. CJNE A,#data********************
s13, B"10110100", x, x => s12;
s12, B"10110100", 1, x => s15;
s15, B"10110100", 1, x => s14;
s14, B"10110100", 1, x => s2;
s12, B"10110100", 0, x => s2;--***************************************
s1, B"11011xxx", x, x => s5;--Op. DNJZ RN****************************
s5, B"11011xxx", x, x => s11;
s11, B"11011xxx", x, x => s7;
s7, B"11011XXX", X, x => s12;
s12, B"11011XXX", 1, x => s15; --SALTO
s15, B"11011xxx", 1, x => s14;
s14, B"11011xxx", 1, x => s2;
s12, B"11011xxx", 0, x => s2;--***************************************
s1, B"10110101", x, x => s11;--Op. CJNE A,dir************************
s11, B"10110101", x, x => s13;
s13, B"10110101", x, x => s12;
s12, B"10110101", 1, x => s15;
s15, B"10110101", 1, x => s14;
s14, B"10110101", 1, x => s2;
s12, B"10110101", 0, x => s2;--***************************************
s1, B"11010101", x, x => s11;--Op. DJNZ dir**************************
294
s11, B"11010101", x, x => s3;
s3, B"11010101", x, x => s12;
s12, B"11010101", 1, x => s15;
s15, B"11010101", 1, x => s14;
s14, B"11010101", 1, x => s2;
s12, B"11010101", 0, x => s2;--***************************************
s1, B"00010000", x, x => s11;--Op. JBC*******************************
s11, B"00010000", x, x => s10;
s10, B"00010000", x, x => s13;
s13, B"00010000", x, x => s7;
s7, B"00010000", x, x => s12;
s12, B"00010000", 1, x => s15;
s15, B"00010000", 1, x => s14;
s14, B"00010000", 1, x => s2;
s12, B"00010000", 0, x => s2;--***************************************
s1, B"00100000", x, x => s11;--Op. JB********************************
s11, B"00100000", x, x => s10;
s10, B"00100000", x, x => s13;
s13, B"00100000", x, x => s12;
s12, B"00100000", 1, x => s15;
s15, B"00100000", 1, x => s14;
s14, B"00100000", 1, x => s2;
s12, B"00100000", 0, x => s2;--***************************************
s1, B"00110000", x, x => s11;--Op. JNB*******************************
s11, B"00110000", x, x => s10;
s10, B"00110000", x, x => s13;
s13, B"00110000", x, x => s12;
295
s12, B"00110000", 1, x => s15;
s15, B"00110000", 1, x => s14;
s14, B"00110000", 1, x => s2;
s12, B"00110000", 0, x => s2;--***************************************
s1, B"01000000", 1, x => s15;--Op. JC********************************
s15, B"01000000", 1, x => s14;
s14, B"01000000", 1, x => s2;
s1, B"01000000", 0, x => s2;--***************************************
s1, B"01010000", 1, x => s15;--Op. JNC*******************************
s15, B"01010000", 1, x => s14;
s14, B"01010000", 1, x => s2;
s1, B"01010000", 0, x => s2;--***************************************
s1, B"01100000", 1, x => s15;--Op. JZ********************************
s15, B"01100000", 1, x => s14;
s14, B"01100000", 1, x => s2;
s1, B"01100000", 0, x => s2;--***************************************
s1, B"01110000", 1, x => s15;--Op. JNZ*******************************
s15, B"01110000", 1, x => s14;
s14, B"01110000", 1, x => s2;
s1, B"01110000", 0, x => s2;--***************************************
s1, B"01110011", x, x => s14;--Op. JMP A+DPTR************************
s14, B"01110011", x, x => s2;--***************************************
s1, B"10010011", x, x => s14;--Op. MOVC A,A+DPTR********************
s14, B"10010011", x, x => s7;
296
s7, B"10010011", x, x => s2;--**************************************
s1, B"10000011", x, x =>s14;--Op.MOVCA,A+PC**********************
s14, B"10000011", x, x => s7;
s7, B"10000011", x, x => s2;--**************************************
s1, B"11001xxx", x, x => s5;--Op. modo ind con destino A (xch a,rn)**
s5, B"11001xxx", x, x => s11;
s11, B"11001xxx", x, x => s12;
s12, B"11001xxx", x, x => s7;
s7, B"11001xxx", x, x => s2;--Op. modo ind con destino A (xch a,rn)**
s1, B"11000101", x, x => s6;--Op. modo dir con destino A(xch A,dir)*
s6, B"11000101", x, x => s12;
s12, B"11000101", x, x => s7;
s7, B"11000101", x, x => s2;--**************************************
s1, B"001x0101", x, x => s6;--Op. modo directo con destino A*********
s1, B"010x0101", x, x => s6;
s1, B"01100101", x, x => s6;
s1, B"10010101", x, x => s6;
s6, B"001x0101", x, x => s3;
s6, B"010x0101", x, x => s3;
s6, B"01100101", x, x => s3;
s6, B"10010101", x, x => s3;
s6, B"001x0101", x, x => s3;
s3, B"010x0101", x, x => s2;
s3, B"01100101", x, x => s2;
s3, B"10010101", x, x => s2;
297
s3, B"001x0101", x, x => s2;--Op. modo directo con destino A*********
s1, B"11110101", x, x => s6;--Op. modo dir con destino A(mov dir,a)**
s6, B"11110101", x, x => s7;
s7, B"11110101", x, x => s2;--Op. modo directo con destino A*********
s1, B"11100101", x, x => s7;--Op. modo dir con destino A(mov a,dir)**
s7, B"11100101", x, x => s2;--Op. modo dir con destino A*************
s1, B"10000101", x, x => s10;--Op. modo mov dir,dir******************
s10, B"10000101", x, x => s6;
s6, B"10000101", x, x => s12;
s12, B"10000101", x, x => s7;
s7, B"10000101", x, x => s2;--Op. modo mov dir,dir*******************
s1, B"1110011x", x, x => s4;--Op. modo ind con destino A(mov a, Ri)**
s4, B"1110011x", x, x => s10;
s10, B"1110011x", x, x => s5;
s5, B"1110011x", x, x => s11;
s11, B"1110011x", x, x => s2;--Op. modo indirecto con destino A*******
s1, B"1110001x", x, x => s4;--Op. modo ind con destino A(movx a, Ri)*
s4, B"1110001x", x, x => s10;
s10, B"1110001x", x, x => s5;
s5, B"1110001x", x, x => s11;
s11, B"1110001x", x, x => s2;--Op. modo indirecto con destino A*******
s1, B"xxx00001", x, x => s4;--Op. AJMP******************************
s4, B"xxx00001", x, x =>s2;--**************************************
298
s1, B"xxx10001", x, x => s14;--Op. ACALL*****************************
s14, B"xxx10001", x, x => s12;
s12, B"xxx10001", x, x => s10;
s10, B"xxx10001", x, x => s7;
s7, B"xxx10001", x, x => s3;
s3, B"xxx10001", x, x => s2;--***************************************
s1, B"11000000", x, x => s14;--Op. PUSH direct***********************
s14, B"11000000", x, x => s10;
s10, B"11000000", x, x => s3;
s3, B"11000000", x, x => s2;--***************************************
s1, B"11010000", x, x => s14;--Op. POP direct************************
s14, B"11010000", x, x => s11;
s11, B"11010000", x, x => s10;
s10, B"11010000", x, x => s3;
s3, B"11010000", x, x => s2;--***************************************
s1, B"00010010", x, x => s11;--Op. LCALL*****************************
s11, B"00010010", x, x => s14;
s14, B"00010010", x, x => s12;
s12, B"00010010", x, x => s10;
s10, B"00010010", x, x => s7;
s7, B"00010010", x, x => s3;
s3, B"00010010", x, x => s2;--***************************************
s1, B"001x0010", x, x => s14;--Op. RET y RETI************************
s14, B"001x0010", x, x => s10;
s10, B"001x0010", x, x => s7;
299
s7, B"001x0010", x, x => s3;
s3, B"001x0010", x, x => s2;--***************************************
s1, B"00000010", x, x => s4;--Op. LJMP******************************
s4, B"00000010", x, x => s2;--**************************************
s1, B"1000011x", x, x => s4;--Op. modo ind destino dir(mov dir,ri)***
s4, B"1000011x", x, x => s10;
s10, B"1000011x", x, x => s5;
s5, B"1000011x", x, x => s11;
s11, B"1000011x", x, x => s6;
s6, B"1000011x", x, x => s7;
s7, B"1000011x", x, x => s2;--Op. modo indirecto con destino dir*****
s1, B"000x011x", x, x => s4;--Op. modo ind con destino Ri(inc ri)****
s4, B"000x011x", x, x => s10;
s10, B"000x011x", x, x => s5;
s5, B"000x011x", x, x => s11;
s11, B"000x011x", x, x => s7;
s7, B"000x011x", x, x => s2;--Op. modo indirecto con destino Ri******
s1, B"010x0010", x, x => s6;--Op. modo A dir(orl,anl,xrl dir, a)****
s1, B"01100010", x, x => s6;
s6, B"010x0010", x, x => s3;
s6, B"01100010", x, x => s3;
s3, B"010x0010", x, x => s2;
s3, B"01100010", x, x => s2;--Op. modo A con destino dir*************
s1, B"010x0011", x, x => s6;--Op. modo inm dir(orl,anl,xrl)**********
s1, B"01100011", x, x => s6;
300
s6, B"010x0011", x, x => s7;
s6, B"01100011", x, x => s7;
s7, B"010x0011", x, x => s3;
s7, B"01100011", x, x => s3;
s3, B"010x0011", x, x => s2;
s3, B"01100011", x, x => s2;--Op. modo inmediato con destino dir*****
s1, B"000x1xxx", x, x => s5;--Op. modo Rn con destino rn(inc rn)*****
s5, B"000x1xxx", x, x => s11;
s11, B"000x1xxx", x, x => s7;
s7, B"000x1xxx", x, x => s2;--Op. modo Rn con destino rn*************
s1, B"10101xxx", x, x => s6;--Op. MOV Rn,dir*************************
s6, B"10101xxx", x, x => s12;
s12, B"10101xxx", x, x => s3;
s3, B"10101xxx", x, x => s2;--***************************************
s1, B"1010011x", x, x => s6;--Op. MOV Ri,dir*************************
s6, B"1010011x", x, x => s12;
s12, B"1010011x", x, x => s4;
s4, B"1010011x", x, x => s15;
s15, B"1010011x", x, x => s5;
s5, B"1010011x", x, x => s3;
s3, B"1010011x", x, x => s2;--***************************************
s1, B"10000000", x, x => s11;--OP. SJMP******************************
s11, B"10000000", x, x => s10;
s10, B"10000000", x, x => s3;
s3, B"10000000", x, x => s2;--***************************************
301
s1, B"000x0101", x, x => s11;--Op. modo diredir(inc y dec dir)*******
s11, B"000x0101", x, x => s3;
s3, B"000x0101", x, x => s2;--Op. modo directo con destino dir*******
s1, B"10001xxx", x, x => s5;--Op. modo Rn con destino dir(mov dir,rn)
s5, B"10001xxx", x, x => s11;
s11, B"10001xxx", x, x => s6;
s6, B"10001xxx", x, x => s7;
s7, B"10001xxx", x, x => s2;--Op. modo Rn con destino dir************
s1, B"11111xxx", x, x => s11;--Op. modo A con destino Rn(mov rn ,a)**
s11, B"11111xxx", x, x => s2;--Op. modo A con destino Rn**************
s1, B"1111011x", x, x => s4;--Op. modo A con destino Ri(mov ri,a)***
s4, B"1111011x", x, x => s10;
s10, B"1111011x", x, x => s5;
s5, B"1111011x", x, x => s2;--Op. modo A con destino Ri**************
s1, B"1111001x", x, x => s4;--Op. modo A con destino Ri(movx ri,a)***
s4, B"1111001x", x, x => s10;
s10, B"1111001x", x, x => s5;
s5, B"1111001x", x, x => s2;--Op. modo A con destino Ri**************
s1, B"001x1xxx", x, x => s5;--Op. modo Rn con destino A**************
s1, B"010x1xxx", x, x => s5;
s1, B"01101xxx", x, x => s5;
s1, B"10011xxx", x, x => s5;
s5, B"001x1xxx", x, x => s11;
s5, B"010x1xxx", x, x => s11;
s5, B"01101xxx", x, x => s11;
302
s5, B"10011xxx", x, x => s11;
s11, B"001x1xxx", x, x => s7;
s11, B"010x1xxx", x, x => s7;
s11, B"01101xxx", x, x => s7;
s11, B"10011xxx", x, x => s7;
s7, B"001x1xxx", x, x => s2;
s7, B"010x1xxx", x, x => s2;
s7, B"01101xxx", x, x => s2;
s7, B"10011xxx", x, x => s2;--Op. modo Rn con destino A**************
s1, B"11101xxx", x, x => s5;--Op. modo Rn con destino A**************
s5, B"11101xxx", x, x => s11;
s11, B"11101xxx", x, x => s2;--Op. modo Rn con destino A**************
s1, B"1010011x", x, x => s6;--Op. modo mov Ri,dir********************
s6, B"1010011x", x, x => s7;
s7, B"1010011x", x, x => s4;
s4, B"1010011x", x, x => s5;
s5, B"1010011x", x, x => s2;--Op. modo mov Ri,dir********************
s1, B"10010000", x, x => s3;--Op. MOV DPTR,#data16*******************
s3, B"10010000", x, x => s2;--***************************************
s1, B"110x0010", x, x => s11;--Op.bits(clr bit,setb bit)*************
s1, B"10xx0010", x, x => s11;
s1, B"101x0000", x, x => s11;
s1, B"01110010", x, x => s11;
s11, B"110x0010", x, x => s10;
s11, B"10xx0010", x, x => s10;
s11, B"101x0000", x, x => s10;
303
s11, B"01110010", x, x => s10;
s10, B"110x0010", x, x => s14;
s10, B"10xx0010", x, x => s14;
s10, B"101x0000", x, x => s14;
s10, B"01110010", x, x => s14;
s14, B"110x0010", x, x => s8;
s14, B"10xx0010", x, x => s8;
s14, B"101x0000", x, x => s8;
s14, B"01110010", x, x => s8;
s8, B"110x0010", x, x => s7;
s8, B"101x0000", x, x => s7;
s8, B"10xx0010", x, x => s7;
s8, B"01110010", x, x => s7;
s7, B"110x0010", x, x => s2;
s7, B"10xx0010", x, x => s2;
s7, B"101x0000", x, x => s2;
s7, B"01110010", x, x => s2;--***************************************
s2, B"XXXXXXXX", x, 0 => s0;
s2, B"XXXXXXXX", x, 1 => s9;-----interr******************************
s9, B"XXXXXXXX", x, x => s16;
s16, B"XXXXXXXX", x, x => s17;
s17, B"XXXXXXXX", x, x => s18;
s18, B"XXXXXXXX", x, x => s19;
s19, B"XXXXXXXX", x, x => s20;
s20, B"XXXXXXXX", x, x => s21;
s21, B"XXXXXXXX", x, x => s0;
304
END TABLE;
END;
CODIGO AHDL DEL DISPOSITIVO MQTX
Este código pertenece a la máquina de estados del dispositivo de transmisión
serial, cuenta con solo 4 estados. Este dispositivo funciona de la siguiente
manera: Se está en el estado cero hasta que la señal de inicio y se pone en alto
pasando al estado uno (señal de salida LOAD se coloca en alto) y luego al dos (las
señal de salida SEND y CLEAR se ponen en alto), en el estado dos se mantiene
mientras la señal de fin de transmisión no se pone en alto, una vez esta señal está
en alto se pasa al estado tres (la señal indicadora de interrupción por transmisión
serial se pone en alto) y finalmente pasa de nuevo al estado cero.
SUBDESIGN mqtx
(
clk : INPUT;
reset : INPUT;
LS : INPUT;
fin : INPUT;
load : OUTPUT;
clear : OUTPUT;
send : OUTPUT;
T1 : OUTPUT;
305
)
VARIABLE
% current current %
% state output %
ss: MACHINE OF BITS (send,load,clear,T1)
WITH STATES (s0 = B"0010",
s1 = B"0110",
s2 = B"1010",
s3 = B"0001");
BEGIN
ss.clk = clk;
ss.reset = reset;
TABLE
% current current next %
% state input state %
ss, LS, fin => ss;
s0, 0, 0 => s0;
s0, 1, 0 => s1;
s1, 1, 0 => s2;
s1, 0, 0 => s1;
s2, 0, 0 => s2;
306
s2, 0, 1 => s3;
s3, 0, x => s0;
END TABLE;
END;
CODIGO AHDL DEL DISPOSITIVO MQRX
Este código pertenece a la máquina de estados del dispositivo de recepción serial
y cuenta con solo 3 estados. Este dispositivo funciona de la siguiente manera: Se
está en el estado cero hasta que la señal de inicio y se pone en alto pasando al
estado uno (las señal de salidas CLEAR y E se coloca en alto), en el estado uno se
mantiene mientras la señal de fin de transmisión no se pone en alto, una vez esta
señal está en alto se pasa al estado dos (la señal indicadora de interrupción por
recepción serial se pone en alto, al igual de la señal LOADSBUF) y finalmente pasa
de nuevo al estado cero.
SUBDESIGN mqrx
(
clk : INPUT;
reset : INPUT;
star : INPUT;
fin : INPUT;
loadsbuf : OUTPUT;
R1 : OUTPUT;
clear : OUTPUT;
307
e : OUTPUT;
)
VARIABLE
% current current %
% state output %
ss: MACHINE OF BITS (loadsbuf,R1,clear,e)
WITH STATES (s0 = B"0010",
s1 = B"0011",
s2 = B"1100");
BEGIN
ss.clk = clk;
ss.reset = reset;
TABLE
% current current next %
% state input state %
ss, star, fin => ss;
s0, 0, 0 => s0;
s0, 1, 0 => s1;
s1, 1, 0 => s1;
s1, 1, 1 => s2;
s2, 0, 1 => s2;
308
s2, 0, 0 => s0;
END TABLE;
END;
CODIGO AHDL DEL DISPOSITIVO INTERRUP
Este código se encarga de generar la dirección del vector de interrupción,
dependiendo de la entrada de prioridad y la entrada de habilitación global de
interrupciones.
SUBDESIGN interrup
(
IE[4..0],IP[4..0]: INPUT;
clk : INPUT;
Q[5..0] : OUTPUT;
)
variable
ss:MACHINE OF BITS (Q[5..0])
WITH STATES (s0 = B"000000",
s1 = B"000011",--IE0
s2 = B"001011",--TF0
s3 = B"010011",--IE1
s4 = B"011011",--TF1
s5 = B"100011");--S
309
BEGIN
ss.clk = clk;
TABLE
IE[4..0], IP[4..0] => ss;
B"00000", B"xxxxx" => s0;--0
B"xxxx1", B"00000" => s1;
B"xxx10", B"00000" => s2;
B"xx100", B"00000" => s3;
B"x1000", B"00000" => s4;
B"10000", B"00000" => s5;
B"xxxx1", B"00001" => s1;--1
B"xxx10", B"00001" => s2;
B"xx100", B"00001" => s3;
B"x1000", B"00001" => s4;
B"10000", B"00001" => s5;
B"xxx01", B"00010" => s1;--2
B"xxx1x", B"00010" => s2;
B"xx100", B"00010" => s3;
310
B"x1000", B"00010" => s4;
B"10000", B"00010" => s5;
B"xxxx1", B"00011" => s1;--3
B"xxx10", B"00011" => s2;
B"xx100", B"00011" => s3;
B"x1000", B"00011" => s4;
B"10000", B"00011" => s5;
B"xx0x1", B"00100" => s1;--4
B"xx010", B"00100" => s2;
B"xx1xx", B"00100" => s3;
B"x1000", B"00100" => s4;
B"10000", B"00100" => s5;
B"xxxx1", B"00101" => s1;--5
B"xx010", B"00101" => s2;
B"xx1x0", B"00101" => s3;
B"x1000", B"00101" => s4;
B"10000", B"00101" => s5;
B"xx001", B"00110" => s1;--6
B"xxx1x", B"00110" => s2;
B"xx10x", B"00110" => s3;
311
B"x1000", B"00110" => s4;
B"10000", B"00110" => s5;
B"xxxx1", B"00111" => s1;--7
B"xxx10", B"00111" => s2;
B"xx100", B"00111" => s3;
B"x1000", B"00111" => s4;
B"10000", B"00111" => s5;
B"x0xx1", B"01000" => s1;--8
B"x0x10", B"01000" => s2;
B"x0100", B"01000" => s3;
B"x1xxx", B"01000" => s4;
B"10000", B"01000" => s5;
B"xxxx1", B"01001" => s1;--9
B"x0x10", B"01001" => s2;
B"x0100", B"01001" => s3;
B"x1xx0", B"01001" => s4;
B"10000", B"01001" => s5;
B"x0x01", B"01010" => s1;--10
B"xxx1x", B"01010" => s2;
B"x0100", B"01010" => s3;
312
B"x1x0x", B"01010" => s4;
B"10000", B"01010" => s5;
B"xxxx1", B"01011" => s1;--11
B"xxx10", B"01011" => s2;
B"x0100", B"01011" => s3;
B"x1x00", B"01011" => s4;
B"10000", B"01011" => s5;
B"x00x1", B"01100" => s1;--12
B"x0010", B"01100" => s2;
B"xx1xx", B"01100" => s3;
B"x10xx", B"01100" => s4;
B"10000", B"01100" => s5;
B"xxxx1", B"01101" => s1;--13
B"x0010", B"01101" => s2;
B"xx1x0", B"01101" => s3;
B"x10x0", B"01101" => s4;
B"10000", B"01101" => s5;
B"x0001", B"01110" => s1;--14
B"xxx1x", B"01110" => s2;
B"xx10x", B"01110" => s3;
313
B"x100x", B"01110" => s4;
B"10000", B"01110" => s5;
B"xxxx1", B"01111" => s1;--15
B"xxx10", B"01111" => s2;
B"xx100", B"01111" => s3;
B"x1000", B"01111" => s4;
B"10000", B"01111" => s5;
B"0xxx1", B"10000" => s1;--16
B"0xx10", B"10000" => s2;
B"0x100", B"10000" => s3;
B"01000", B"10000" => s4;
B"1xxxx", B"10000" => s5;
B"xxxx1", B"10001" => s1;--17
B"0xx10", B"10001" => s2;
B"0x100", B"10001" => s3;
B"01000", B"10001" => s4;
B"1xxx0", B"10001" => s5;
B"0xx01", B"10010" => s1;--18
B"xxx1x", B"10010" => s2;
B"0x100", B"10010" => s3;
314
B"01000", B"10010" => s4;
B"1xx0x", B"10010" => s5;
B"xxxx1", B"10011" => s1;--19
B"xxx10", B"10011" => s2;
B"0x100", B"10011" => s3;
B"01000", B"10011" => s4;
B"1xx00", B"10011" => s5;
B"0x0x1", B"10100" => s1;--20
B"0x010", B"10100" => s2;
B"xx1xx", B"10100" => s3;
B"01000", B"10100" => s4;
B"1x0xx", B"10100" => s5;
B"xxxx1", B"10101" => s1;--21
B"0x010", B"10101" => s2;
B"xx1x0", B"10101" => s3;
B"01000", B"10101" => s4;
B"1x0x0", B"10101" => s5;
B"0x001", B"10110" => s1;--22
B"xxx1x", B"10110" => s2;
B"xx100", B"10110" => s3;
315
B"01000", B"10110" => s4;
B"1x00x", B"10110" => s5;
B"xxxx1", B"10111" => s1;--23
B"xxx10", B"10111" => s2;
B"xx100", B"10111" => s3;
B"01000", B"10111" => s4;
B"1x000", B"10111" => s5;
B"00xx1", B"11000" => s1;--24
B"00x10", B"11000" => s2;
B"00100", B"11000" => s3;
B"x1xxx", B"11000" => s4;
B"10xxx", B"11000" => s5;
B"xxxx1", B"11001" => s1;--25
B"00x10", B"11001" => s2;
B"00100", B"11001" => s3;
B"x1xx0", B"11001" => s4;
B"10xx0", B"11001" => s5;
B"00x01", B"11010" => s1;--26
B"xxx1x", B"11010" => s2;
B"00100", B"11010" => s3;
316
B"x1x0x", B"11010" => s4;
B"10x0x", B"11010" => s5;
B"xxxx1", B"11011" => s1;--27
B"xxx10", B"11011" => s2;
B"00100", B"11011" => s3;
B"x1x00", B"11011" => s4;
B"10x00", B"11011" => s5;
B"000x1", B"11100" => s1;--28
B"00010", B"11100" => s2;
B"xx1xx", B"11100" => s3;
B"x10xx", B"11100" => s4;
B"100xx", B"11100" => s5;
B"xxxx1", B"11101" => s1;--29
B"0001x", B"11101" => s2;
B"xx1x0", B"11101" => s3;
B"x10x0", B"11101" => s4;
B"100x0", B"11101" => s5;
B"00001", B"11110" => s1;--30
B"xxx1x", B"11110" => s2;
B"xx10x", B"11110" => s3;
317
B"x100x", B"11110" => s4;
B"1000x", B"11110" => s5;
B"xxxx1", B"11111" => s1;--31
B"xxx10", B"11111" => s2;
B"xx100", B"11111" => s3;
B"x1000", B"11111" => s4;
B"10000", B"11111" => s5;
END TABLE;
END;