TesisAlejandroJuarez PDF
TesisAlejandroJuarez PDF
TesisAlejandroJuarez PDF
Unidad Zacatenco
Departamento de Computación
Director de la Tesis
Dr. Luis Gerardo de la Fraga
iii
iv RESUMEN
Abstract
This work presents the design of a 16-bit microcontroller, the design of its assembly lan-
guage for programming, and a bank of seven tests to prove their functionality. It was designed
in hardware description language (VHDL), which allows testing the design with program-
mable logic devices, in order to optimize it and use it in different applications, allowing to
experiment with different architectures and computer organization. The last test performed
was the nontrivial application of CCM and GCN schemes of Encrypted Authentication.
The microcontrollers are part of a large number of electronic devices today. They are used
in watches that have LED or LCD screen, inside cars where at least forty of these components
are used to control the engine, brakes, air conditioning and so on. Any system that has a
remote control is sure to have a microcontroller: TVs, VCRs, wireless keyboard and mouse,
printers, phones, digital cameras, etc. The microcontrollers are used to control a single task
with limited resources embedded within an integrated circuit, and it is usually embedded
within the card of the device it controls.
The main features of the designed microcontroller are: Bus 16-bit data and address and
instruction bus of 29 bits. The data memory stores 16-bit words, the log file has 16 general
purpose registers of 16 bits. It has four 16-bit parallel ports, each port pin can be configured
for input or output, the input bits are updated at each clock cycle. A serial port that transmits
and receives a byte asynchronously. It has an interrupt handler which handles priority signals
to control internal and external components. It also has four timers attended by interruptions,
and a guard or watch dog timer as security option in any application. Furthermore, it count
with a program counter organized as a stack of records for subroutines. The architecture is a
RISC reduced instruction set with a Harvard memory organization. The program memory is
linear and the data memory is organized by pages. The instruction cycle is executed in one
clock cycle.
v
vi ABSTRACT
A mi familia...
Mis mentores y héroes.
vii
viii
Agradecimientos
ix
x
Índice general
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iii
Abstract . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v
1. Introducción 1
1.1. Planteamiento del problema . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3. Resultados obtenidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4. Organización de la tesis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2. Marco teórico 7
2.1. Diseño de computadoras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2. Dispositivo lógico programable . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3. Lenguajes de descripción de hardware . . . . . . . . . . . . . . . . . . . . . . 11
2.4. Estructura del procesador . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.4.1. Unidad de E/S . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.4.2. Organización de la memoria . . . . . . . . . . . . . . . . . . . . . . . 15
2.4.3. Interrupciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.4.4. Segmentación o pipeline . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.4.5. Arquitectura de computadoras . . . . . . . . . . . . . . . . . . . . . . 18
2.4.6. Unidad de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.5. Instrucción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3. Trabajos relacionados 23
3.1. Arquitectura de 32 bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.1.1. UAM RISC-II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.1.2. LEON 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.1.3. RISC de un ciclo de reloj por instrucción . . . . . . . . . . . . . . . . 24
3.1.4. Núcleo del procesador de 32 bits . . . . . . . . . . . . . . . . . . . . . 25
3.2. Arquitectura de 16 bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.2.1. RISC-1oo2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.2.2. Procesador CISC de 16-Bits . . . . . . . . . . . . . . . . . . . . . . . 26
3.2.3. Diseño de un procesador con HDL . . . . . . . . . . . . . . . . . . . . 26
xi
xii ÍNDICE GENERAL
3.2.4. CPU86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.2.5. DCPU-16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.3. Arquitectura de 8 bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.3.1. RISC incrustado de 8 bits . . . . . . . . . . . . . . . . . . . . . . . . 29
3.3.2. Procesador de 8 bits . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.3.3. PicoBlaze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.4. Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.4.1. SC123 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.4.2. Framework para FPGA . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.4.3. Aplicación criptográfica en un microcontrolador MSP430X . . . . . . 32
5. Ensamblador 63
5.1. Notación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
5.1.1. Gramática libre de contexto . . . . . . . . . . . . . . . . . . . . . . . 64
5.1.2. Expresiones regulares . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.1.3. Reglas de una gramática libre de contexto . . . . . . . . . . . . . . . 66
5.2. Descripción del lenguaje ensamblador . . . . . . . . . . . . . . . . . . . . . . 68
5.3. Funcionamiento del software . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
ÍNDICE GENERAL xiii
6. Simulaciones y Resultados 83
6.1. Reloj . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
6.2. Modulación de ancho de pulso . . . . . . . . . . . . . . . . . . . . . . . . . . 86
6.3. Puerto serial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
6.4. Perro guardián . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
6.5. Multiplicador Karatsuba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
6.6. Cifrado en bloque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
6.6.1. Estándar avanzado de cifrado AES . . . . . . . . . . . . . . . . . . . 100
6.6.2. Encriptación autenticada . . . . . . . . . . . . . . . . . . . . . . . . . 106
6.7. Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
7. Conclusiones 113
7.1. Trabajo a futuro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Bibliografı́a 119
xiv ÍNDICE GENERAL
Índice de figuras
xv
xvi ÍNDICE DE FIGURAS
5.6. Las directivas y constantes, en (a) sus reglas EBNF y en (b), (c), (d) y (e) sus
diagramas de sintaxis. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
5.7. Etiqueta expresión regular en (a), en (b) su regla EBNF y en (c) su diagrama
de sintaxis. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
5.8. La instrucción load en (a) y en (b) su diagrama de sintaxis, y en (c) sus reglas
EBNF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
5.9. Instrucción store, en (a) sus reglas EBNF y en (b) su diagrama de sintaxis. . 71
5.10. Instrucciones para las subrutinas, sus reglas EBNF en (a) y su diagrama de
sintaxis en (b). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
5.11. Instrucciones implı́citas para el reinicio del perro guardián (clrwdg), retorno
de interrupción (reti), no operación (nop) y detener (halt): en (a) sus reglas
EBNF asociadas y en (b) sus diagramas de sintaxis. . . . . . . . . . . . . . . 71
5.12. Instrucciones que reinician un registro de propósito general o el registro de
status se muestra: en (a) sus reglas EBNF y en (b) sus diagramas de sintaxis. 72
5.13. Instrucciones de salto incondicional (jmp) y condicional (jset y jclr), en (a)
sus reglas EBNF y en (b) sus diagramas de sintaxis. . . . . . . . . . . . . . . 72
5.14. Instrucción cmp, en (a) sus reglas EBNF y en (b) su diagrama de sintaxis. . 72
5.15. Ejemplo de código fuente de un programa sencillo en lenguaje ensamblador . 74
5.16. Archivos adicionales para generar el programa en lenguaje de máquina. . . . 75
5.17. Flujo de trabajo del software . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
5.18. Programa en lenguaje de máquina y desensamblado. . . . . . . . . . . . . . . 82
xix
xx ÍNDICE DE TABLAS
6.1. Descripción del registro ’cfgTimer’ que afecta el funcionamiento de los distintos
temporizadores. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
6.2. Especificación de la interfaz del microcontrolador para el reloj. . . . . . . . . 85
6.3. Registro ‘configPwm’ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
6.4. Selector de puerto paralelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
6.5. Interfaz del microcontrolador . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
6.6. Interfaz de microcontrolador para la comunicación serial . . . . . . . . . . . 88
6.7. Interfaz del microcontrolador para la prueba del perro guardián. . . . . . . . 90
6.8. Almacenar un entero de 256 bits en localidades de memoria de 16 bits . . . . 94
6.9. Almacenar un entero de 128 bits en localidades de memoria de 16 bits . . . . 94
6.10. Tabla de búsqueda S-Box para el AES, el byte xy determina la columnas y y
el renglón x para retornar un nuevo valor. . . . . . . . . . . . . . . . . . . . 102
6.11. Crifrado y descifrado de un mensaje usando AES. Texto claro M , texto cifrado
C y subllaves generadas Ekey . . . . . . . . . . . . . . . . . . . . . . . . . . 104
6.12. Número de ciclos de cifrado y descifrado usando AES . . . . . . . . . . . . . 110
6.13. Cifrar un mensaje de 16 bytes con GCM. . . . . . . . . . . . . . . . . . . . . 110
6.14. Descifrar un mensaje de 16 bytes con GCM. . . . . . . . . . . . . . . . . . . 110
6.15. Cifrar un mensaje de 24 bytes con CCM . . . . . . . . . . . . . . . . . . . . 110
6.16. Descifrar un mensaje de 24 bytes con CCM . . . . . . . . . . . . . . . . . . . 110
6.17. Ciclos por byte que demora las pruebas del GCM para el cifrado y descifrado. 111
6.18. Número de ciclos que dura cada subrutina para las distintas versiones del
GCM. Detalles en el texto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
6.19. Uso de memoria para cada prueba . . . . . . . . . . . . . . . . . . . . . . . . 112
6.20. Resultados obtenidos durante la implementación . . . . . . . . . . . . . . . . 112
Capı́tulo 1
Introducción
1
2 CAPÍTULO 1. INTRODUCCIÓN
Se intenta proporcionar una herramienta didáctica para poder ser usada en cursos re-
lacionados con el lenguaje ensamblador, organización y arquitectura de computadoras. El
diseño propuesto podrı́a bajarse a una tarjeta de trabajo y podrı́a ası́ utilizarse en diversas
aplicaciones, como robots móviles siguelı́neas o en adquisición de señales con la adaptación
de un convertidor analógico digital.
El diseño ejecutará una instrucción en un solo ciclo de reloj, sin pipeline. El fin de la
propuesta es proponer un conjunto de instrucciones y una organización simple de un micro-
controlador para poder controlar un conjunto reducido de recursos: contadores, puerto serial,
puerto paralelo, modulación por ancho de pulso, manejador de interrupciones y un perro
guardián.
El diseño tendrá una organización de memoria tipo Harvard, este es el más usual en
los microcontroladores, para poder manejar por separado las memoria de instrucciones tipo
ROM (del inglés Read Only Memory, memoria de solo lectura) y la memoria de datos tipo
RAM (del inglés Random Access Memory, memoria de acceso aleatorio). También se plantea
acceder a los registros para configurar los periféricos a través de localidades mapeadas de la
memoria de datos.
El lenguaje ensamblador para el diseño de cualquier microcontrolador debe ser entendido
por un ensamblador para que a partir de un programa en lenguaje ensamblador se traduzcan
a su equivalente en lenguaje de máquina. Por ejemplo la instrucción aritmética de suma:
add $r1 , $r2 , $r3
debe intercambiarse a una cadena de ceros y unos, como:
[CO][RD][RF0][RF1][CF]
↓
[0001][0001][0010][0011][0000]
↓
[ALU ][r1 ][r2 ][r3 ][suma]
donde cada conjunto de bits significa:
* Código de operación (CO): indica el tipo de instrucción.
* Registro destino (RD) y registros fuentes (RF0 y RF1): indica el origen de los operandos
y el destino del resultado. El modo de direccionamiento de una instrucción indica el origen
de estos argumentos, en el ejemplo anterior se usa el direccionamiento por registro.
* Código de función (CF): junto con el de operación indican que tarea realizar, por lo general
se emplea en las instrucciones relacionadas con la ALU.
1.2. Objetivos
El objetivo general de este trabajo es el diseño digital de un microcontrolador con el
lenguaje VHDL, para que pueda ser configurado sobre tecnologı́a FPGA e incluido en algún
sistema de control digital.
1.3. RESULTADOS OBTENIDOS 5
* Un diseño propio de un microcontrolador en VHDL, que tiene que ser simple para ser
personalizado a los requerimientos de alguna aplicación, completo al contar con el mı́nimo
de periféricos necesarios para que sea práctico su uso y abierto para continuar su desarrollo
en proyectos futuros.
* Diseño del lenguaje ensamblador y los programas ensamblador y desensamblador. Éstas
facilitan las herramientas de programación para disponer del microcontrolador como un
elemento práctico en alguna aplicación académica.
* Una propuesta de un conjunto de pruebas de simulación, con el fin de validar y demos-
trar el funcionamiento del microcontrolador. Esto también demuestra que el código fuente
en ensamblador puede ser el punto de partida para una futura colección o biblioteca de
aplicaciones disponibles para este diseño de microcontrolador.
* En el capı́tulo 5 se menciona las especificaciones del lenguaje ensamblador que servirá como
marco para ser traducido a lenguaje de máquina. También en este capı́tulo se plantea el
funcionamiento que este tipo de programa realiza, se especifican los servicios ofrecidos por
el ensamblador, el desensamblador y la generación de la memoria de programa en una
plantilla que describe una memoria ROM en lenguaje VHDL.
* Finalmente en el capı́tulo 7 se describen las conclusiones de este trabajo, además del trabajo
a futuro que se podrı́a realizar para mejorar este trabajo.
Capı́tulo 2
Marco teórico
En este capı́tulo se abordan los conceptos que especifican las caracterı́sticas esenciales de
los procesadores, se proporcionan las nociones básicas necesarias para la realización del diseño
del microcontrolador incrustado. Se describe como se conforma un procesador, la organización
de memoria, ası́ como el tipo de arquitectura, además se define lo que es una instrucción,
y también se da una descripción más completa de los modos de direccionamiento. Para el
manejo de las interrupciones se describe tanto el manejo por prioridad como el de sondeo.
7
8 CAPÍTULO 2. MARCO TEÓRICO
* Aplicaciones: es el nivel más alto, utiliza las facilidades ofrecidas por el hardware y el
software de nivel inferior para generar soluciones a problemas de aplicación, que interesan
a algún usuario en particular.
Es importante mencionar aquı́ que las etapas más bajas, la de diseño de computadoras,
diseño lógico y diseño de circuitos, como se ve en la figura 2.1 tratan de diseño de hardware (las
otras etapas se diseñan en software) pero en esta tesis se desarrollan también en el software
de VHDL. Esto permite una gran ventaja al poder probar los diseños en dispositivos lógicos
programables antes de fabricarlos en un chip.
FPGA
Los dispositivos FPGA se basan en lo que se conoce como arreglos de compuertas, la ar-
quitectura contiene tres elementos configurables: bloques lógicos configurables (CLB), bloque
de entrada y salida (IOB) y canales de comunicación. Los CLB se comunican a las terminales
de E/S por medio de los canales de comunicación. El diseño lógico se implementa mediante
bloques conocidos como generadores de funciones o tablas de búsqueda (lookup table o LUT),
que permiten almacenar la lógica requerida, ya que cuentan con una memoria interna. Los
CLB están ordenados en arreglos de matrices programables (PSM).
Canales verticales
Bloques
lógicos
Bloques
E/S
Canales
horizontales
10
11
De la matriz Multiplexor E/S
programable Flip-flop 1 de 4
... 00 Buffer
01 Triestado
S1 S0
A la matriz
Programable
Multiplexor
1 de 2
Interconexión S1
Programable
Bloques de I/O
C1...C4
S/R CONTROL
G1
G2 G SD
G3 LUT D Q
G4 H
LUT EC
RC
F1 1
F2 F
F3 LUT
F4 S/R CONTROL
SD
D Q
EC
1 RC
Bloques lógicos
Las empresas Xilinx, Altera, y QuickLogic son sólo algunas de las que fabrican FPGAs.
Todos los fabricantes comparten el mismo concepto básico de arquitectura: interfaces de
entrada/salida (E/S), los bloques básicos de construcción y las interconexiones. La Figura
2.2 ilustra la arquitectura general de un FPGA.
2.3. LENGUAJES DE DESCRIPCIÓN DE HARDWARE 11
VHDL
VHDL es un lenguaje estándar, capaz de soportar el proceso de diseño de sistemas
electrónicos complejos, con propiedades para reducir el tiempo de diseño y los recursos tec-
nológicos requeridos. El departamento de Defensa de Estados Unidos creo el lenguaje VHDL
como parte del programa “Very High Speed Integrated Circuits” (VHSIC), que se trata del di-
seño rapido de circuitos integrados a una alta escala de integración. Una pieza independiente
de código VHDL está compuesta de al menos tres secciones fundamentales:
* Declaraciones de biblioteca: contiene una lista de todas las bibliotecas que se utilizarán
en el diseño.
* Entidades: especifica los pines de E/S del circuito.
* Arquitectura (función): contiene el código adecuado, que describe cómo debe comportarse
el circuito.
Una biblioteca es una colección de piezas de uso común en el código fuente de un programa
en VHDL. La colocación de nuevas piezas dentro de una biblioteca le permite al programador
12 CAPÍTULO 2. MARCO TEÓRICO
Procesador Memoria
BUS DEL SITEMA
Controlador de E/S Controlador de E/S Controlador de E/S
Figura 2.4: Conexiones con dispositivos de E/S
BUS DE CONTROL
BUS DE DATOS
BUS DE DIRECCIONES
Dirección del dispositivo Configuración del dispositivo
Control del Estado del dispositivo
Comparación Datos del dispositivo
dispositivo
Interrupción de E/S
Figura 2.5: Diagrama a bloques del control de un dispositivo de E/S
La figura 2.5 ilustra el mecanismo necesario para cada dispositivo de entrada y salida:
el registro de configuración del dispositivo establece el funcionamiento del mismo, si sirve
de entrada o de salida, o ambos; el registro de datos del dispositivo es la información que
lee o escribe el procesador; el registro de estado del dispositivo indica si está listo, continúa
trabajando, está en espera o se encuentra bloqueado; la dirección del dispositivo es una
dirección mapeada en memoria de datos que permite el acceso al dispositivo; el control del
dispositivo, es el mecanismo que controla las tareas del dispositivo de E/S; la interrupción es
el indicador para avisar a la CPU que el dispositivo de E/S está listo para leer o escribir, o
cualquier operación que deba ser atendida por el procesador.
Además de controlar periféricos o dispositivos de entrada y salida (impresora, teclado,
ratón, pantalla, etc.) la unidad de E/S también se utiliza para la comunicación entre máqui-
nas, que puede ser serial, o paralela. Algunos ejemplos de periféricos pueden ser:
2.4. ESTRUCTURA DEL PROCESADOR 15
2.4.3. Interrupciones
Son peticiones o avisos que debe atender el procesador, interrumpe el estado normal de
la CPU, direccionando el flujo del programa a las rutinas que atienden dichas peticiones.
Las interrupciones pueden ser manejadas por orden de importancia o en el orden al sondear
las señales. La atención a interrupciones puede activarse por algún registro de control del
procesador. La figura 2.7 muestra el mecanismo necesario para las interrupciones atendidas
por prioridad, estas son recibidas por el demultiplexor que identifica la mayor prioridad. El
16 CAPÍTULO 2. MARCO TEÓRICO
manejo de interrupción se habilita con una bandera y esta bandera se establece en software
mediante un registro de función especial. Al activarse la bandera de interrupción puede que
una o más peticiones necesiten servicios del procesador.
Petición de interrupción 1 0 Manejador de Interrupciones activado
DEMULTIPLEXOR
Petición de interrupción 2 1
AND Bandera de interrupción
Petición de interrupción N N
Tipo de interrupción
RP3
RP4
RP1
RP2
ALU
CP MP AR MD AR
M1
M3
Ciclo (tiempo)
1 2 3 4 5 6 7 8 9
Instrucción (tarea)
ALU
1 MP AR MD AR
ALU
2 MP AR MD AR
ALU
3 MP AR MD AR
ALU
4 MP AR MD AR
ALU
5 MP AR MD AR
ALU
REGISTROS
MEMORIA
A B B
MD
RM RA1
RA2
SP
ALU RI
CLR
CLK UC
cada una, por lo regular las instrucciones de carga y almacenamiento tienen acceso a la
memoria. Los tipo CISC cuenta con un amplio rango de instrucciones, además de contar con
instrucciones sencillas cuenta con algunas que permiten operaciones complejas, permitiendo
en muchos casos acceder a la memoria más de una vez.
En la figura 2.10 se muestra un ejemplo de los dos modelos de arquitectura. La configura-
ción del bus puede ser de dos maneras: la primera forma puede compartir un mismo bus para
datos, instrucciones o direcciones; la segunda forma pueden usar varias lı́neas direccionadas
con multiplexores para datos, direcciones o instrucciones. Por lo general la primera tendencia
del bus es aplicada en los CISC y la segunda en los RISC. La arquitectura RISC presenta
frecuentemente una organización tipo Harvard, cuenta con una Memoria de Datos (MD) y
una Memoria de Programa (MP). La arquitectura CISC presenta frecuentemente una orga-
nización Von Neumann, con los datos y el programa en una misma memoria; requiere de
un registro auxiliar de memoria y el ciclo de instrucción emplea un contador de anillo que
selecciona el conjunto de microinstrucciones para cada etapa del ciclo de instrucción.
Contador de 0 1 N
Anillo CA Unidad de BUS CTRL BC Contador de Programa CP CP rs
rs 0 1 CP rs CP rs
...
2 n
n 1
2
ControlUC CLK
3
...
...
RI REGSN ... i0
CP i−1 i i+1
BC CP 0 1 2 ... n−2 n−1 n
(a) Unidad de control en un CISC. (b) Unidad de control en un RISC.
Figura 2.11: Configuración de la unidad de control.
La figura 2.11(a) muestra la configuración de la unidad de control en una arquitectura
CISC, el bus de control (BC) se actualiza constantemente, manejado directamente sin inter-
mediarios por la unidad de control. El contador de anillo (CA) indica a la UC que señales
20 CAPÍTULO 2. MARCO TEÓRICO
2.5. Instrucción
Dependiendo del conjunto de aplicaciones para los que un procesador está construido,
se define un repertorio de instrucciones que cubre con las necesidades de un diseñador de
aplicaciones. Las instrucciones son las tareas que puede realizar un procesador.
El ciclo de instrucción es el conjunto de etapas necesarias para atender una instrucción.
Las etapas realizadas en el ciclo de instrucción son:
1. Buscar la instrucción en memoria de programa, obteniendo la instrucción que tiene
que ejecutarse.
2. Decodificar las instrucciones, donde la CPU examina la instrucción que debe ser
atendida.
3. Ejecutar la instrucción: la unidad de control configura todos los elementos por medio
del BUS de control para realizar la operación requerida por la instrucción.
4. Leer o escribir en la MD: almacenar o leer datos de la memoria de datos.
5. Leer o escribir en el AR: almacenar o leer datos del archivo de registros.
Los modos de direccionamiento sirven para especificar donde encontrar los argumentos
que una instrucción necesita al ejecutarse. Algunos de estos modos de direccionamiento son:
- Implı́cito: no tiene argumentos, sólo es el código de operación. Se conoce toda la información
necesaria para ejecutar la instrucción. Ej.: nop; CP←CP+1
- Registro: los datos que necesita la instrucción están contenidos en los registros. Ej.:
jump $r1; CP← $r1 .
- Inmediato: uno de los argumentos es una constante, es el valor que utiliza la instrucción.
Ej.: load $r1, #A2h; $r1 ← A2h.
- Directo: un argumento dado es una dirección cuya localidad de memoria es el origen o
destino necesario para la instrucción. Ej.: load $r1, @A2h; $r1 ← MD[A2h].
2.5. INSTRUCCIÓN 21
ALU
ALU add r0, r1, r2 Registro CP MP AR MD AR
add r2 r0
r0
ALU
ALU sub r0, 0xFF00 Inmediato CP MP AR MD AR
sub r0
r1
Cargar load r0, [r1] Indirecto por
ALU
CP MP AR MD AR
registro load r0
ALU
Cargar load r0, [0x09] Indirecto CP MP AR MD AR
load r0
r1
load r0, [r1+1] Base más
ALU
Cargar CP MP AR MD AR
desplazamiento load r2 r0
r0
ALU
CP MP AR MD AR
Retorno ret Implícito ret
Trabajos relacionados
En este capı́tulo se proporciona una pequeña descripción de trabajos relacionados con los
procesadores, microcontroladores y ensambladores. Se exponen algunas de las caracterı́sticas
del software y hardware, resaltando las capacidades para su uso en aplicaciones.
3.1.2. LEON 2
LEON 2 [6] es un procesador de 32 bits, su arquitectura se basa en los SPARC V8
conforme al estándar de la IEEE-1754. Dicho estándar define el conjunto de instrucciones, el
modelo de registro, tipo de datos, el código de operación de las instrucciones, la interfaz del
coprocesador para esta arquitectura, describe meras sugerencias de la sintaxis del lenguaje
ensamblador y da una idea para extender la arquitectura.
Este procesador cuenta con unidad de punto flotante FPU que realiza operaciones de
números reales con el formato de precisión simple (32 bits) del estándar IEEE 754. La figura
3.1 muestra los bloques que conforman la arquitectura LEON 2. El núcleo del procesador
se basa en operaciones realizadas por la unidad de enteros UI (Integer Unit), es decir, las
operaciones de la ALU soló operan con la representación de números enteros, cuyo núcleo
RISC cuenta con 5 etapas segmentadas que conforma el pipeline.
23
24 CAPÍTULO 3. TRABAJOS RELACIONADOS
Su diseño está dirigido para aplicaciones incrustadas sobre un chip. Cuenta con temporiza-
dores de 24 bits, un temporizador de reinicio o “perro guardián”, para la comunicación serial
utiliza UARTs con transferencia de datos de 8 bits, implementa el estándar de comunicación
de redes Ethernet MAC, además de contar con un interfaz para el bus PCI (interconexión
de componentes periféricos), puertos paralelos de entrada y salida de 16 bits. VHDL LEON
tiene la licencia libre LGPL. Implementa un pipeline de 5 etapas: búsqueda de la instrucción,
decodificación, ejecución, memoria y escritura.
Tiene un controlador de interrupciones que es utilizado para priorizar y propagar solicitu-
des de interrupciones, maneja 15 interrupciones internas y externas, el controlador secundario
conectado en cascada permite un máximo de 32 interrupciones, separa la memoria de dato
y el de instrucciones. Las excepciones manejadas son: reinicio, error de memoria, error en
la etapa de la búsqueda de la instrucción, ejecución de instrucciones en privilegio en modo
usuario, ejecución de instrucciones en punto flotante cuando la unidad de punto flotante o
FPU esta inhabilitada, etc.
El número de ciclos por instrucciones son: de 1, 2, 3, 4 ciclos y 35 para la multiplicación y
división, con y sin signo. Implementa la especificación de arquitectura de bus avanzada para
microcontroladores (Advanced Microcontroller Bus Architecture AMBA) que define una red
de comunicación sobre un chip: Bus de alta velocidad avanzado (Advanced High-speed Bus
AHB) y bus de periféricos avanzados (Advanced Peripheral Bus APB).
y almacenamiento. Sólo las instrucciones de cargar load y almacenar store tienen acceso a
la memoria RAM. En las demás instrucciones sus argumentos están en los registros o viene
incluida en la palabra de la instrucción, esta es la clave para un solo ciclo en la ejecución de
las instrucciones. Maneja tres modos de direccionamiento: por registro, directo e inmediato.
3.2.4. CPU86
CPU86 8088 FPGA IPCORE descrito en [11] se implementa un procesador 8088, el núcleo
es compatible con un procesador iAPX8088 y es posible implementarse en cualquier FPGA.
Algunas frecuencias de reloj utilizadas son de 5 MHz (0.33 MIPS), 8 MHz (0.66 MIPS) y 10
MHz (0.75 MIPS). Un ancho de bus de 16 bits, direcciona memoria de 1 MB, el CPU86 es
ideal para sistemas incrustados. Tiene un modelo de 256 bytes ROM, 256 KB SRAM, cuenta
con una unidad ası́ncrona receptor-transmisor (UART) para realizar la comunicación serial.
Está disponible con una licencia GPL.
Las recomendaciones para construir un sistema con la CPU86 se ilustran en la figura 3.3
se visualizan las conexiones del procesador con algunos periféricos. Las interrupciones son
imprescindibles en cualquier sistema, el controlador programable de interrupciones es el cir-
cuito integrado CI con la etiqueta 8259A, vectoriza las interrupciones por prioridad y pueden
conectarse en cascada para extender el número de interrupciones. Para la comunicación serial
se tienen dos puertos UART utilizando el CI 16550. Para la comunicación paralela de entra-
da y salida el puerto es un CI PPI8255. La unidad de temporizadores programable es el CI
3.2. ARQUITECTURA DE 16 BITS 27
PIT8254, es usado por las interrupciones periódicas del sistema operativo, como refrescar la
memoria, etc. El núcleo del procesador al igual que los componentes que describen diversos
CI está disponible en lenguaje VHDL.
IRQ0 PA
IRQ1 INTR
INTA PB
IRQ3 DBUS PPI8255
IRQ4 8259A PC
IRQ5
IRQ6
IRQ7 CAS CPU86
Interrupción Descripción
INT10 Salida de teletipo, el carácter escrito en la UART.
INT21 Leer carácter de la UART.
INT1A Obtener/establecer la hora del sistema.
INT16 Leer el teclado
Tabla 3.1: Servicio de interrupciones
MON88 es el software de depuración utilizada para este CPU86, es similar al debug.exe pa-
ra MSDOS, es flexible para adaptares a otros procesadores de la familia x86, el programa cuen-
ta con un cargador, desensamblador y algunos servicios de interrupciones INT 21/10/16/1A,
la descripción de las interrupciones se ven en la tabla 3.1. El desensamblador está basado en
la versión 0.1 para la arquitectura x86 realizada por David Moore “disasm.c” [12].
Ir[7..0] Registro de Resolución de Registros en
solicitud de prioridad servicio
interrupciones
ninta int
nsp Control nen
casin lógico de cas_en
interrupciones Casout[2..0]
clk
Vector de nMRST CLK
nmrst Lectura/Escritura interrupción NCS nWR
nwr A0 INT
ncs Control lógico dout
a0 nINTA CASOUT[2..0]
nrd e inicialización/ nNSP CAS_EN
Comando de CASIN[2..0] DOUT[7..0]
IR[7..0] nEN
din Registros DIN[7..0]
(a) (b)
funcionar sin problemas. Existe una versión comercial HTL80186, que fue hecha por la misma
empresa que proporciona la CPU86. Para usar el lenguaje C se pueden utilizar los compila-
dores OpenWatcom C, Turbo-C y muchos otros.
El manejador de interrupciones programable CI 8259 [13] desarrollado por Intel ofrece
ocho niveles de interrupciones individuales enmascarables. Ampliable hasta 64 interrupciones.
Ofrece un esquema de resolución flexible. Ofrece modos programables de interrupción y un
vector de direcciones. Ocho lı́neas para cada bus de datos: de entrada din[7..0] y de salida
dout[7..0]; sus señales de control son ncs, nrd, nwr, int y ninta cuya función es configurar y
operar este componente. Las figura 3.4 muestra el sı́mbolo y el diagrama de bloques interno
del CI 8259. Este componente puede adquirirse por un precio con ALTERA o HT-Lab.
Maneja un bus para tener varios 8259 en cascada, es una configuración maestro esclavo que
permite extenderlo. El control de este componente es una máquina de estados que considera
el modo de operaciones por prioridad o sondeo, incluye internamente los registros necesarios
para su vector de interrupción y de control de configuración.
3.2.5. DCPU-16
Existen muchos programas de vı́deo juegos antiguos que siguen perdurando, gracias a los
emuladores estos viejos programas de este tipo, pueden seguir funcionando en las compu-
tadoras personales actuales. Un moderno juego de conquista y exploración espacial “0x10c”
hace uso en su trama de un tipo de máquina denominada DCPU-16 como controlador de
naves espaciales, donde son virtualizadas, permitiendo al jugador añadir nuevas soluciones
dentro de la trama del juego en lenguaje ensamblador.
En [14] se proporcionan los códigos fuentes de la máquina virtual, es decir, su emulador, el
ensamblador y desensamblador, en varios lenguajes de programación: python, java, perl, ruby,
go, javascript, etc. La DCPU-16 es totalmente programable por los jugadores, la empresa de
este videojuego proporciona documentación [15], la comunidad de jugadores ha creado toda
una biblioteca de programas informáticos para esta arquitectura. La figura 3.5 muestra un
ejemplo de aplicación para la máquina DCPU-16.
de código de operación (25 = 32). El DCPU-16 llevará a cabo a lo sumo una interrupción a
la vez. Si las interrupciones se activan de forma múltiple al mismo tiempo, se añaden a una
estructura tipo cola (FIFO). La estructura cuenta con un lı́mite de 256 interrupciones. Las
tablas 3.2 y3.3 muestran algunas instrucciones que esta máquina virtual ejecuta.
Mnemónico Condición Mnemónico Condición Mnemónico Condición
IFB b,a b ∧ a)! = 0 IFC b,a (b ∧ a) == 0 IFE b,a b == a
IFN b,a b! = a IFE b,a b == a IFN b,a b! = a
IFA b,a b>a IFG b,a |b| > |a| IFL b,a |b| < |a|
IFU b,a b<a
Tabla 3.2: Instrucciones de salto condicional de la máquina DCPU-16. Cuando no se cumple
la condición CP+=1 y cuando se cumple CP+=2.
Mnemónico Descripción Mnemónico Descripción
MUL b,a ex, b ← |b| ∗ a MULI b, a ex, b ← b ∗ a
DIV b, a ex, b ← |b|/a DIVI b, a ex, b ← b/a
MOD b, a b ← |b| %|a| M0DI b,a b ← b %a, [a = 0] → [b ← 0]
AND b, a b←b∧a BOR b, a b ← b|a
XOR b, a b←b⊕a SET b,a b←a
ADD b,a b←b+a SUB b,a b←b−a
SHR b,a b ← b >>> a SHL b,a b ← b <<< a
Tabla 3.3: Instrucciones de suma, resta, desplazamiento de bits e intercambio de datos, mul-
tiplicación, división, módulo y lógicas de la máquina DCPU-16.
3.3.3. PicoBlaze
El microcontrolador PicoBlazeT M [18] es un CPU tipo RISC de 8-bits, utilizado especial-
mente para su implementación en FPGAs de XILINX. La versión KCPSM3 está optimizada
para Spartan 3, la versión KCPSM6 está optimizada para Virtex 6 y Spartan 6. El mi-
crocontrolador PicoBlaze es extremadamente flexible. La funcionalidad básica es fácilmente
ampliable y reforzada por su comunicación con el exterior a través de sus puertos de entrada
y salida. Soporta hasta 256 puertos de entrada y 256 puertos de salida o una combinación de
los puertos de entrada/salida. Cuenta con una pila en hardware de hasta 31 contadores de
subrutina. Permite la opción de interrupciones para que el microcontrolador maneje eventos
ası́ncronos externos.
La empresa se encarga de poder garantizar el uso de este microcontrolador con diferentes
periféricos como: VGA, puerto serial, PS/2 (teclado y mouse), pantallas LCD. Los dispositivos
lógicos programables en los que puede trabajar son en FPGA y CPLD que produce la empresa
XILINX. La ventaja de esta clase de CPU incrustado cubren las necesidades de tener un
procesador sin añadir hardware adicional, todo los recursos se implementan en un solo PLD.
El código en VHDL está bajo la licencia BSD.
3.4. SOFTWARE 31
3.4. Software
3.4.1. SC123
Silverman [19] describe que para cualquier lenguaje de programación para propósitos
didáctico, incluido el lenguaje ensamblador, debe contar con tres elementos que son: simpli-
cidad (lo más simple que sea posible), regular (reglas regulares, sin excepción, sean fáciles
de aprender, describir e implementar), y ortogonalidad (funciones independientes que deben
ser controladas por mecanismos independientes). El proyecto da una tabla comparativa de
varios entornos de trabajo entre los cuales destaca la máquina virtual SC123, el cual tiene su
propia arquitectura de conjunto de instrucciones (ISA), que es usado para aprender a usar
el lenguaje ensamblador y está disponible en [20].
Esta herramienta se extiende a los cursos de arquitectura de computadoras, lenguajes
de programación y lenguaje ensamblador. La finalidad es que el estudiante distinga entre
la variedad de ensambladores ası́ como el entorno de desarrollo y tengan en cuenta el nivel
de comprensión de esta clase de sistemas, pero lo suficientemente simple para ser entendido
dentro de los lı́mites de un curso en este campo de estudio.
El entorno de trabajo del SC123 consiste en un editor para facilitar la creación del código
fuente, un ensamblador, desensamblador y emulador para poder generar código en lenguaje de
máquina y verificar el resultado en las instrucciones, por ultimo un depurador para localizar
errores de programación. Este sistema es empleado como material didáctico para comprender
los principios de la arquitectura de computadoras. Cuenta con una documentación del entorno
de trabajo, un manual de lenguaje ensamblador y el software está desarrollado en Java para
su uso en múltiples plataformas.
En este capı́tulo se considera la descripción completa en la que funciona todos los com-
ponentes que conforman a un microcontrolador y también se da una descripción de las mi-
croinstrucciones involucradas para cada una de las instrucciones.
El tipo de procesador que se ha seleccionado para el proyecto es el controlador incrustado
o microcontrolador, se considera como un computador dedicado. Se caracteriza por tener
almacenado dentro de la memoria un solo programa con el fin de gobernar un dispositivo.
Las unidades internas que conforman al procesador se encargan de ejecutar un conjunto de
instrucciones. Estos componentes se dividen en cuatro bloques:
* Proceso: unidad de control, unidad aritmética y lógica, archivo de registros, contador de
programa, lı́neas de conexión y manejador de interrupciones.
* Memoria: almacenamiento de programa y datos.
* Periféricos: temporizadores, modulación de ancho de pulso, puerto paralelo y serie.
* Recursos auxiliares: temporizador perro guardián, reinicialización o reset.
Comúnmente todos los componentes mencionados se montan en un mismo circuito in-
tegrado CI de dimensiones reducidas. Este CI se encuentra montado en el dispositivo que
controla, es por eso que es clasificado como microcontrolador incrustado.
No se realizan operaciones de punto flotante por lo que se descarta el uso de palabras
de datos de 32, 64 o más bits. El uso de 8 bits maneja un máximo de 256 localidades de
direccionamiento que en sı́ es muy poco y hace necesario el uso de registros que completen
la dirección para direccionar más de 256 localidades. Descartando el tamaño de palabras
anteriores se decide manejar en este diseño palabras de 16 bits para los datos y direcciones.
Otros requerimientos para el diseño se enlistan a continuación:
- Realizar operaciones con representación de números enteros.
- Manejo de periféricos por medio del acceso a memoria.
- Atención de periféricos por interrupciones con vector de interrupciones programable.
- Memoria separada de datos y programa.
- Memoria de datos organizada por páginas.
- Manejo de subrutinas con una pila de contadores de programa.
33
34 CAPÍTULO 4. DISEÑO DEL PROCESADOR
Salto
Las instrucciones de la tabla 4.5 inicializan con cero o uno un bit o todos los bits de un
registro utilizando la ALU (CLRB, SETB, CLR y SET):
* Reiniciar todo un registro poniendo en cero todos los bits:
clr rt ⇔AR[BI.RT]←0x0000
clr status ⇔status←0x0000
* Llenar todo un registro poniendo en uno todos los bits:
set rt ⇔AR[BI.RT]←0xFFFF
set status ⇔status←0xFFFF
* Poner en cero un bit:
clrb rt , n ⇔AR[BI.RT][BI.N]←0
clrb status, n ⇔status[BI.N]←0
38 CAPÍTULO 4. DISEÑO DEL PROCESADOR
Subrutinas
S0 call
S1
S2
ret ret
Registros contadores de programa
...
...
...
...
...
Programa
5 calla r S0 , dir S1
6
S0 20 push r PP , r S0
21 calla r S1 , dir S2
S
pop r PP ,1r S0 30 push r PP , r S1
add r S0 , 1 S2
jmp r S0 pop r PP , r S1
add r S1 , 1
jmp r S1
Memoria
...
...
...
...
...
Las instrucciones necesarias para las subrutinas se muestran en la tabla 4.6, la figuras
4.1 y 4.2 ilustran el mecanismo al utilizar las instrucciones call con ret y calla con jmp. El
registro de puntero de pila regPP es cualquier registro del AR. El comportamiento de estas
instrucciones es:
* Llamar a una subrutina, utilizando la pila del contador de programa (CALL)
- Obtener la dirección de programa de forma directa: call dir⇔ CP[++iCP ]←BI.CTE
- Obtener la dirección de programa por registro: call rt ⇔ CP[++iCP ]←AR[BI.RT]
* Retornar de una subrutina, utilizando la pila del contador de programa (RET)
- Pre-decrementar el puntero de la pila del contador de programa y post-incrementar el
contador de programa en uno: ret ⇔ CP[--iCP ]++
* Llamar a una subrutina, para salvar el CP en registro del AR (CALLA)
- Almacena el contador de programa en un registro: AR[BI.RT] ← CP.
- Actualizar el contador de programa con un valor directo:
calla rt , dir ⇔ AR[BI.RT]←CP, CP←BI.CTE
- Actualizar el contador de programa con un registro:
calla rt , rf ⇔ AR[BI.RT]←CP, CP←AR[BI.RF]
La instrucción de llamada a subrutina con calla consiste en salvar el CP en un registro
para ser posteriormente almacenado en memoria de datos con una instrucción push, para
retornar se recupera el CP que está almacenado en memoria de datos con una instrucción
pop, se incrementa en uno el valor del CP recuperado y se utiliza un salto incondicional
jmp rt .
AR MD AR MD AR MD
N N N
push reg PP , reg X pop reg PP , reg X
0 1 0
...
...
...
reg reg reg
PP PP PP
2 2 2
reg 0x0123 reg 0x0123 reg 0x0123
X
1 X
1 0x0123 ←PP X
1 0x0123
0 ---- ←PP 0 ---- 0 ---- ←PP
AR MD AR MD AR MD
N --- ←PP N --- N --- ←PP
reg N N-1 reg N-1 N-1 0x0123 ←PP reg N N-1 0x0123
PP PP PP
...
...
...
reg 0x0123 reg 0x0123 reg 0x0123
X
1 X
1 X
1
0 push_s reg , reg 0 pop_s reg , reg 0
PP X PP X
La figura 4.3 ilustra el funcionamiento al usar la pila en memoria de datos. Las instruccio-
nes que manipulan una pila en la memoria de datos se muestran en la tabla 4.8, a continuación
se describa el funcionamiento de estas instrucciones.
Poner datos en la pila (PUSH):
- Se realiza un pre-incremento en el puntero de pila: ++AR[BI.RT]
- Almacenar el contenido de un registro: push rt, rf ⇔ MD[++AR[BI.RT]]←AR[BI.RF]
- Almacenar una palabra de forma inmediata: push rt, cte⇔ MD[++AR[BI.RT]]←BI.CTE
4.1. ARQUITECTURA DEL CONJUNTO DE INSTRUCCIONES 41
Otras operaciones
4.1.1. Microcontrolador
El procesador diseñado servirá en aplicaciones donde se utiliza un controlador incrustado,
no se necesita recursos complejos, basta con una CPU que sea capaz de configurar y controlar
un conjunto limitado de periféricos. No es suficiente controlar los periféricos solamente por
4.1. ARQUITECTURA DEL CONJUNTO DE INSTRUCCIONES 43
software, se pierde tiempo al conocer el estado de todos las unidades de E/S, los manejadores
de interrupciones reducen drásticamente el tiempo desperdiciado en esta tarea. La figura 4.4
muestra la interfaz de entrada y salida del microcontrolador diseñado, se enlista el nombre
de cada señal con su descripción correspondiente.
contador
de 0 1 2 3 4
programa
reloj
i0 i1 i2 i3 i4 xi yi
instrucción
(a) (b)
La figura 4.6 muestra la conexión general de todos los componentes que conforman al
procesador. A lo largo de todo el capı́tulo se describe el funcionamiento de estos elementos.
44 CAPÍTULO 4. DISEÑO DEL PROCESADOR
Bus de Control UC
UC FLAGS
Bus de Direcciones
MD MP AR ALU CP
MEMORIA CPU
Bus de Datos
PERIFERICOS
CLR CLR
EXT
Bus de Control MD
Bus de Control UC
4.2. Proceso
Los componentes que caen en esta clasificación traducen, decodifican, almacenan y eje-
cutan las operaciones principales, son el núcleo del procesador. El comportamiento de estos
componentes es definido por el conjunto de instrucciones.
La ALU cuenta con diferentes señales los operandos A y B que son dos señales de 16
bits, N es el número de bits que se desplazan hacia la izquierda o a la derecha, siendo un
entero de 5 bits cuando se toma en cuenta el acarreo y 4 bits en otro caso, OP selecciona el
tipo de operación (con un máximo de 32 operaciones), CIN es el acarreo de entrada señal de
un solo bit. La tabla 4.19 muestra la descripción de las banderas que son almacenadas en el
registro de status o FLAGS, el sumador completo de la figura 4.10 muestra la conexión de
estas banderas. Cada operación realizada modifica ciertas banderas.
Sı́mbolo Bandera Descripción Ecuación
Wn
Z Cero Indica si el resultado es cero i=0 si
C Acarreo Indica si el resultado tiene acarreo Cn+1
S Signo Indica si el resultado es negativo sn
O Desbordamiento Descripción cn+1 ⊕ cn
Tabla 4.19: Banderas de la ALU durante la suma
M N B A BANDERAS
CARRY OUT
CONTROL
OVERFLOW
NOT A ZERO
NOT B SIGN
OP
CARRY IN
AND
OR
XOR
DESPLAZAR
IZQUIERDA
DESPLAZAR
DERECHA
SUMADOR
COMPLETO R
ROTACIÓN
IZQUIERDA16 BITS
ROTACIÓN
DERECHA16 BITS
ROTACIÓN
IZQUIERDA17 BITS
ROTACIÓN
DERECHA17 BITS
CLR
SET
CLRB/SETB
(a) (b)
Figura 4.8: Representación de números enteros
La representación de enteros con signo más simple es interpretar al bit más significativo
como positivo con 0 y negativo con 1, esto se ilustra en la figura 4.8(a). Otras forma de
representar a los enteros negativos es usando el complemento a uno o a dos, se ilustra en la
tabla 4.8(b).
S ← A B Cin + A B Cin+ A B Cin+ A B Cin
A B Cin S Cout
S ← A⊕ B⊕Cin
0 0 0 0 0 Cout ← A B Cin + A B Cin+ A B Cin+ A B C
0 0 1 1 0 Cout ←(AB)+(( A+ B)Cin)
0 1 0 1 0 A
A⊕ B
0 1 1 0 1 B A⊕ B⊕Cin
S
1 0 0 1 0 Cin
(AB)+((A+ B)Cin)
1 0 1 0 1 AB
Cout
1 1 0 0 1
( A+ B)Cin
1 1 1 1 1 A+ B
Figura 4.9: Tabla de verdad, ecuación booleana y diagrama de compuertas del sumador
completo de un bit
En la figura 4.9 se observa la tabla de verdad, las ecuaciones booleanas y el diagrama
de compuertas correspondiente a un sumador completo de un solo bit. Al conectar varios
sumadores completos de un bit en cascada se obtiene un módulo para la ALU que realiza la
suma, la configuración se observa en las figura 4.10.
AN B N AN-1 BN-1 A1 B1 A0 B0 C0
CN+1 SN CN SN-1 C2 S1 C1 S0
CN+1 CN C2 C1
XOR
SN SN-1 S1 S0
C S Z O OR
El bus de control incluye las señales de lectura R y escritura W , las operación que realiza
la ALU OPALU , el control de los multiplexores que dirige la interconexión de los componentes,
etc. La figura 4.12 muestra el sı́mbolo que define a la unidad de control, el flujo de los datos
se muestra en la figura 4.13.
código de operación
modo de direccionamiento bus de control
banderas UC
registro
B B
U U
W
S S
B
D[15..0] Q[15..0]
U D D
W N-1 CLK
B S A A
U T CLR T
S I O O
N D S D[15..0] Q[15..0] S
C S E / W N-2 CLK /
O T M D CLR D
N R U I I
X
T
R
U
C
R
E
... R
E
O C C D[15..0] Q[15..0] C
L I C W CLK C
0
Ó I CLR I
N O O
W0[3..0] N N
S0[3..0]
E S1[3..0] S2[3..0] E
S S
Las señale de lectura R0 , R1 y R2 controlan cada una un buffer triestado. La señal selectora
W0 establece que registro actualizar, se activa la escritura con el bit W .
50 CAPÍTULO 4. DISEÑO DEL PROCESADOR
subrutina asociada con la señal de interrupción. La conexión interna del contador de programa
se observa en la figura 4.17, la interfaz de las señales de este componente se muestra en la
figura 4.16.
BUS DE DIRECCIONES
BUS DE DATOS
DEMUX
S[2..0] W R INC1 INC2
CLK Q[2..0]
CONTADOR UP
CLR
DW
BUS DE CONTROL
Figura 4.17: Diagrama a bloques del CP
La figura 4.17 muestra los componentes que integran al CP, el CONTADOR selecciona
el registro a utilizar del CP, el demultiplexor selecciona que registro tendrá acceso a las
señales de control. El número de registros utilizados es de 23 o de 24 , cada registro es posible
seleccionarlo por medio del contador que es un puntero. Al configurar al CP con el control de
interrupciones se tiene otra señal de escritura Waux que tiene mayor prioridad que las señales
que recibe de la unidad de control, además se cuenta con otra señal de lectura Qaux que
manda la posición donde el programa se detiene por una interrupción, este valor se deposita
en una pila en hardware que está incluido en el controlador de interrupciones. Cuando se
termina una subrutina de interrupción se recupera el valor del CP que se modificó en la
última instrucción sea el de una llamada a subrutina, salto condicional o incondicional, o el
simple incremento en uno del CP.
en el que se encontraba los registros de propósito general y cualquier otra información que
se tenı́a antes de ser interrumpido, es decir, se restaura el contexto del programa.
Interrupcion3
Interrupcion 2
Interrupcion1
Interrupcion0
Prioridad 0 3 2 1 2 3 4 0
load CP
inicio interrupción
fin interrupción
1
Pila prioridad
2 2 2
3 3 3 3 3 4
- - - - - - - -
C2
PilaCP
C1 C1 C1
_ _ _ _ _ _ _ _
CP AUXILIAR C0 C0 C0 C0 C0 C0
D[15..0]Q[15..0]
W CLK
MASCARA CLR Prioridad
escaneado WCP
INTR AND
Índice
escaneado
4.3. Periféricos
La mayorı́a de estos componentes son constituidos por puertos de comunicación que se
encargan de transmitir o recibir datos desde o hacia otros dispositivos [27]. La figura 4.21
muestra el comportamiento del divisor de frecuencia ocupado frecuentemente.
contador 0 1 2 3 4 5 6 7 F LIMITE
CLK 50MHz
clk 0 25MHz 1 CLK =limite
clk 1 12.5MHz 2 2∗clk
clk 2 8.33MHz 3 clk < CLK
clk 3 6.25MHz 4
Figura 4.21: Divisor de frecuencia
54 CAPÍTULO 4. DISEÑO DEL PROCESADOR
La modulación por ancho de pulso o PWM por sus siglas en inglés. Este componente recibe
el contenido de un puerto y lo compara con una señal sierra, si es mayor el resultado es uno
de lo contrario es cero, también se puede negar esta señal para requerimientos de cualquier
aplicación. Este componente sirve para controlar un motor eléctrico, o para controlar la
intensidad de luz de un LED.
En la figura 4.22 la señal (a) es generada internamente, es una onda de sierra, el pro-
gramador establece el rango en el que trabaja de 0 a un lı́mite establecido CONTLIM. La
señal (b) es obtenida directamente por un puerto paralelo, configurado como pines entrada.
La señal (c) es la onda cuadrada generada al comparar las señales (a) y (b). La configuración
de los componentes que conforman al componente PWM se ven en la figura 4.23. La interfaz
de este componente es ilustrada en la figura 4.24.
D[15..0] Q[15..0]
DIR[3..0] W CLK
DEMUX CS_CONFIG CLR LIM CLOCK
W CONFIG ENABLE CLK
D[15..0] Q[15..0] DIVFREC CLR
W CLK LIM CLOCK
CS_PWM CLR
DIVLIM ENABLE CLR
CONTADOR Q[15..0]
D[15..0] Q[15..0] PORTA
W Q D PORTB
CLK
CS_PWM CLR PORT
Figura 4.22: Señales involu- CONTLIM PORTC
COMPARADOR
PORTD
cradas en el PWM BUS DE DATOS
BUS DE CONTROL
CS[3..0]
MEMORIA DE DATOS
CLK
Tx/Rx 1 0 b0 b1 b2 b3 b4 b5 b6 b7 1
(a) (b)
Figura 4.27: Diagrama a bloques del transmisor y receptor serial
56 CAPÍTULO 4. DISEÑO DEL PROCESADOR
B DIR DEMUX
UW B
B U
S D[15..0] Q[15..0]
U S
W CLK
S
C CONFIG CLR
O D
D A
N MASK[15..0]
A T
T
T D[15..0] Q[15..0]
R DPIN[15..0] CLK O
O S
O
S W PUERTO CLR
LR
PINESIN PINESOUT
4.3.4. Temporizador
Se establecen cuatro temporizadores todos conectados a un divisor de frecuencia en
común, el limite del divisor de frecuencia establece el tiempo que demora en cambiar el reloj
de los temporizadores de cero a uno. Los registros de configuración y limites están mapeados
en memoria, para poder ser programado. Cada temporizador tiene un limite establecido por
un registro, este se compara con un contador de cero al limite establecido, cuando se cumple
un ciclo el control activa la interrupción y se reinicia el contador. Con el registro de configu-
ración se habilita a los cuatro temporizadores y también desactiva la señal de interrupción
para continuar con el proceso. Las figuras 4.30 y 4.31 describen al temporizador
4.4. MEMORIA 57
Señal E/S Bits Descripción
D E 16 Bus de datos de entrada
CLK
Q S 16 Bus de datos de salida
INT[3..0]
D[15..0] CLR R E 1 Habilita la lectura de datos
Q[15..0] W W E 1 Habilita la escritura de datos
R
DIR[2..0] CS CLR E 1 Reinicio de los registros
CLK E 1 Reloj
CS E 1 Habilita lectura y escritura de datos
DIR E 3 Selector de registro
Figura 4.30: Sı́mbolo del temporizador
BUS DE CONTROL MD
BUS DE CONTROL UC
BUS DE DATOS
BUS DE DIRECCIONES MD
LIMITE INT
CS DIV_FREC
W CS W EDO
Q[15..0] CLK Q[15..0]
D D[15..9] CLR D[15..9] TIMER0
E CLK_DF
M CFG[1.0] CLR
U Q
X
LIM[15..9] Bus Control
CLK
CLR DIV_FREC Bus Direcciones
Bus Datos
CS W EDO
CS W Q[15..0]
Q[15..0] D[15..9] TIMER3 Limite
D D[15..9] CLK
Comparador Int
E
M
CLK CONFIG CFG[1.0] CLR Contador
CLR
U
X Configuración Control
4.4. Memoria
La memoria para los microcontroladores es muy limitada, con 256 localidades de RAM
para los datos y 1024 localidades de ROM para las instrucciones es más que suficiente para
realizar un conjunto limitado de aplicaciones utilizando los microcontroladores. En esta sec-
ción se muestra la organización de memoria manejado por páginas para la memoria de datos,
utilizando un modelo de memoria Harvard que separa los datos de las instrucciones.
La figura 4.33(a) muestra un ejemplo donde las primeras 37 localidades comparten los
mismos registros mapeados bajo las tres páginas, las tres páginas tienen cada una 475 locali-
dades de memoria RAM. La figura 4.33(b) muestra como la memoria de datos tiene control de
los periféricos, todos los componentes reciben las señales de control de lectura (R) y escritura
(W), la memoria de datos se encarga de establecer que periférico o que página de memoria
debe ser seleccionada, esto lo realiza con la señal de control selector de chip (CS). La señal
DIRMD establece un máximo de 15 registros para acceder en cada periférico. Internamente
la dirección de una localidad de memoria se calcula restando la dirección de entrada DIR
menos el número de registros mapeados en una página. En el ejemplo cuando DIR[15..0] es
igual a 50 se le resta 37 dando como resultado la dirección 13 que es la dirección correcta. La
figura 4.35 ilustra la configuración interna con tres páginas de memoria y el bus de control
de la memoria de datos que mapea algunos registros, la figura 4.34 detalla la interfaz de este
componente.
BUS CS
BUS DE DIRECCIONES CS
CS[0]
R
AND
DIR[15..0] Q[15..0]
W D[15..0]
CS[2]
R CS
DIR[15..0] Q[15..0]
W D[15..0]
CS[3]
R CS
BUS DE DATOS
BUS DE CONTROL
BUS DE DIRECCIONES
CS AND
R
CS D[15..0] Q[15..0]
AND
W CLK
CONFIG CLR
Q0
BUS DE DATOS
BUS DE CONTROL
CLR_EXT
D[15..0] Q[15..0]
DIR[4..0] W CLK
DEMUX CS_CONFIG CLR LIM CLOCK CLRWD
W CONFIG ENABLE CLK
D[15..0] Q[15..0] DIVFREC CLR
W CLK LIM CLOCK
CS_PW CLR
DIVLIM ENABLE CLEAR
Q[15..0] CONTADOR
D[15..0] Q[15..0]
W CLK D[15..0] RST
CS_PW CLR LIMITE
CONTLIM COMPARADOR
Ensamblador
Los lenguajes formales como los lenguajes de programación obedecen a reglas preestable-
cidas y por tanto, se ajustan a ellas, no evolucionan y han sido creados para un fin especı́fico.
Se define lenguaje como un conjunto de palabras que están compuestos de sı́mbolos de un
alfabeto. Una gramática da cuenta de la estructura de un lenguaje, es decir, de las sentencias
que lo forman, proporcionando las formas válidas en que se pueden combinar los sı́mbolos
del alfabeto.
Una máquina abstracta o autómata es un dispositivo teórico capaz de recibir y transmitir
información. Para realizar esta labor manipula cadenas de sı́mbolos que se suministran en la
entrada, produciendo como salida otras cadenas de sı́mbolos en cada momento. Para realizar
esto es necesario un conjunto de estados internos requeridos para poder deducir a partir de
la entrada una salida de información. La figura 5.1 describe la relación de la terna lenguaje-
gramática-máquina.
equivale
Gramática Máquina
genera
Gramática Lenguaje
describe
genera
Lenguaje Máquina
reconoce
Figura 5.1: Relación de una gramática, lenguaje y la máquina abstracta.
Los autómatas finitos son reconocedores que solo dicen si o no en relación con cada posible
cadena de entrada. Los autómatas finitos puede ser de dos tipos: autómata finito determinista
[AFD] que tiene para cada estado y para cada sı́mbolo de su alfabeto de entrada, exacta-
mente una lı́nea (transición) con ese sı́mbolo que sale de esa transición; o autómata finito no
determinista [AFN] donde puede existir más de una transición o ninguna por cada tupla (es-
tado, entrada), se tienen varias opciones o ninguna. Tanto los autómatas AFN como los AFD
son capaces de reconocer los mismos lenguajes. De hecho los lenguajes son exactamente los
mismos lenguajes, conocidos como lenguajes regulares, que pueden describir las expresiones
regulares.
Noah Chomsky definió cuatro gramáticas formales, que se diferencian en los tipos de
63
64 CAPÍTULO 5. ENSAMBLADOR
5.1. Notación
Para describir un lenguaje se utilizan diversas herramientas que muestra la estructura
léxica (el conjunto de tokens) y sintáctica (el conjunto de reglas gramaticales encargadas
de verificar la validez de las expresiones de tokens). Estos elementos son: las expresiones
regulares, las reglas gramaticales y los diagramas de sintaxis.
Una regla gramatical [29] es conocida también como producción, una derivación es una
secuencia de producciones que parte del sı́mbolo inicial S hasta una cadena de sı́mbolos
determinada obtenida a través de las reglas gramaticales. El conjunto de las cadenas de
sı́mbolos terminales forman el lenguaje L(G). La derivación [30] se denota como: α0 =⇒
α1 =⇒ . . . =⇒ αn , que se simplifica como α0 =⇒ *αn , donde n ≥ 0.
El uso de una regla se representan por la flecha =⇒. Esta gramática también es conocida
como independientes del contexto: la parte izquierda de la producción sólo puede tener un
sı́mbolo no terminal, es decir:
P ← {(S → ε) ó (A → v)|A ∈ N, v ∈ T + }
5.1. NOTACIÓN 65
donde la expresión T + consiste en todas las palabras generadas con todas las combinaciones
posibles concatenando sı́mbolos del alfabeto terminal (Ej.: dado T = {0, 1}, T + es igual
a {0,1,00,01,10,11,000,0001,. . . }), excluyendo la palabra vacı́a ε. Con la diferencia de que
(T ∪ N )* incluye la palabra vacı́a y la concatenación de las palabras que se obtienen de la
unión de T y N .
Esta gramática se define de contexto libre, porque a la hora de transformar una palabra
en otra, el sı́mbolo no terminal que se transforma no depende de los que estén a la izquierda
o a la derecha. Ası́ cuando se realicen derivaciones para transformar el sı́mbolo A, no hace
falta saber que hay alrededor de él.
El conjunto de tokens o componentes léxicos son las cadenas de caracteres que tienen un
significado para un lenguaje de programación. Para el lenguaje ensamblador el conjunto de
tokens es definido por:
P alabrasReservadas →load|store|jmp|jset|jclr|add|sub|cmp|not|reti|clrwdg|srl|sra|sll|sla| (5.5)
rorc|rolc|inv|ror|rol|xor|nor|or|nor|and|nand|calla|ret|call|clrb|setb|
clr|set|nop|push|pop|halt|include|end|equ|status|reg0|reg1|reg2|reg3|
reg4|reg5|reg6|reg7|reg9|reg8|reg10|reg11|reg12|reg13|reg14|reg15
CaracteresEspeciales → [ | ] |, | + | − |; |] (5.6)
T okens →CaracteresEspeciales |P alabrasReservadas (5.7)
Dado el alfabeto, una regla se componen de una cadena de sı́mbolos, el primer sı́mbolo es
el nombre de la estructura; el segundo sı́mbolo es el metası́mbolo →, seguido por una cadena
de sı́mbolos del alfabeto: sea el nombre de una estructura o el meta sı́mbolo | para separar
las opciones. Un ejemplo sencillo para la instrucción or:
instrucciónor →or regi , argf uente
argf uente →inti |(regi , regi )
inti →int10 |int16
regi →reg0| . . . |reg15
Describir la
W instrucción or en un modo de direccionamiento inmediato es or regi , inti
(regiW← regi cte). Para el direccionamiento por registro es or regi , regi , regi (regi ←
regi regi ).
La notación BNF extendida, o EBNF simplifica la tarea de describir un lenguaje. La
repetición se expresa utilizando la recursión por la izquierda A → Aα|β o por la derecha
A → αA|β, donde α y β son cadenas arbitrarias de terminales y no terminales (nombres
de otras reglas), teniendo en cuenta que en la primera β no comienza con A y la segunda
β no finaliza con A . En lugar de la recursión se puede emplear el asterisco * (conocida
como cerradura de Kleene en expresiones regulares) la representación de las reglas anteriores
quedarı́an como: A → βα* y A → α*β. Con EBNF se prefiere usar las llaves: A → β{α}
y A → {α}β. Para las instrucciones que tienen al menos un argumento puede expresarse al
utilizar la recursividad por la izquierda:
instrucción → opcode arg {, arg}
A A
B A→[B] B A→{B}
(a) (b) (c) (d)
Figura 5.3: Regla EBNF para la regla de repetición (b) y para la opcional (d). Diagrama de
sintaxis para la repetición (a) y para la opcional (c).
Las palabras reservadas se definen en la expresión (5.5) junto con los caracteres especiales
(5.6). La coma es un separador de argumentos, los corchetes dan acceso a la memoria de
datos, la suma y resta pueden servir para el direccionamiento base indexada que toma un
registro base con un registro ı́ndice entre corchetes, la tabla 5.2 muestra algunos ejemplos.
Los comentarios se encargan de documentar un archivo de código fuente para facilitar
su lectura. Estos son ignorados por el ensamblador por que no afectan en nada el proceso
de traducción a lenguaje máquina, pero son muy útiles para el programador. Un comentario
comienza con punto y coma, toda la lı́nea es ignorada después de este carácter, la figura 5.4
muestra su descripción.
5.2. DESCRIPCIÓN DEL LENGUAJE ENSAMBLADOR 69
comentario
; \n
.
; (.)*\n comentario → ; {.}\n
(a) (b) (c)
Figura 5.4: El comentario, en (a) su expresión regular, en (b) su regla EBNF y en (c) su
diagrama de sintaxis
Los identificadores son cadenas de sı́mbolos que nombran alguna entidad, son elementos
textuales para denotar constantes numéricas o etiquetas que indican el flujo del programa en
las instrucciones de salto y las llamadas a subrutinas. La figura 5.5 muestra la descripción
de un identificador.
alf a → a|. . . |z|A|. . . |Z
id
alfa alf a ←[a-zA-Z] alf anum → 0|. . . |9|alfa
alfanum alf anum ←[a-zA-Z0-9] auxid → | alf anum
id ←alf a+ ( | alf anum )* id → alf a {auxid }
(a) (b) (c)
Figura 5.5: El identificador, en (a) su diagrama de sintaxis, y en (b) su expresión regular y
en (c) su regla EBNF.
Las directivas del ensamblador no son instrucciones del procesador, son utilizadas como
herramientas durante la traducción al lenguaje de máquina. Facilita el desarrollo que se
realiza con el lenguaje ensamblador. La figura 5.6 muestra los diagramas de sintaxis y la
representación en EBNF de las directivas y constantes.
directivaequ → ]equ id, cte int16
cte → id|int10 |int16 cte
directivainclude →]include “alf anum {cadenacaracteres }”
id
cadenacaracteres →alf anum | \. | int10
directivaend →]end
(a) Regla EBNF (b) Constantes
directivaequ
# equ id , cte
(c) Asignación
directivainclude
directivaend # include “ alfanum ”
# end cadenacaracteres
es asignada para cualquier instrucción, para facilitar este trabajo se utilizan las etiquetas
dando al argumento de la instrucción el identificador adecuado que se definió en algún lugar
del código fuente. La figura 5.7 describe a las etiquetas.
etiqueta
: id
etiqueta ←: id etiqueta →: id
(a) (b) (c)
Figura 5.7: Etiqueta expresión regular en (a), en (b) su regla EBNF y en (c) su diagrama de
sintaxis.
Las instrucción load carga una palabra (entero de 16 bits) en un registro, el origen puede
ser: un valor inmediato (cte), copiarlo de otro registro (regi ) o de alguna localidad de memoria
de datos (directo [cte], registro indirecto[regi ] o base indexado [regi (+|−)regi ]). La figura
figura 5.8 muestra la descripción de la instrucción load.
cte
instrucciónload
load regi , [ dirMD ]
regi
regi
instrucción load →destinoload , f uenteload
dirMD + destinoload →regi
regi regi f uenteload →cte |regi | f uenteMD
- f uenteMD →[dirMD ]
dirMD →regi |cte|baseindice
cte
baseindice →regi (+|−) regi
(b) Dirección de memoria de datos (c) Reglas EBNF
Figura 5.8: La instrucción load en (a) y en (b) su diagrama de sintaxis, y en (c) sus reglas
EBNF.
arg reg
instrucciónstore fuente
store
arg cte
fuente
Figura 5.9: Instrucción store, en (a) sus reglas EBNF y en (b) su diagrama de sintaxis.
Las instrucciones para subrutinas: la llamada a subrutina call recibe la dirección de la
subrutina de forma inmediata cte o dentro de un registro regi , tiene asociada a la instrucción
de retorno de subrutina ret; la otra llamada de subrutina es calla, que almacena el actual
valor del contador de programa en un registro, el primer argumento es el registro auxiliar
para el contador de programa (regi ) y el segundo argumento es la dirección de memoria de la
subrutina (regi o cte). La figura 5.10 describe las instrucciones relacionadas a las subrutinas.
instruccióncall
call dirMP
instruccióncalla
calla regi , dir
MP
instrucciónret
instrucción call →call dirMD ret
instrucción calla →calla regi , dirMD dir
MP cte
dirMD →cte | regi
regi
instrucción ret →ret
(a) (b)
Figura 5.10: Instrucciones para las subrutinas, sus reglas EBNF en (a) y su diagrama de
sintaxis en (b).
Las instrucciones implı́citas solo manejan el código de operación sin ningún argumento,
la descripción de estas instrucciones se muestra en la figura 5.11.
instrucciónclrwdg
clrwdg
instrucciónreti
reti
instrucción clrwdg → clrwdg instrucciónnop
instrucción reti → reti nop
instrucción nop → nop instrucciónhalt
halt
instrucción halt → halt
(a) (b)
Figura 5.11: Instrucciones implı́citas para el reinicio del perro guardián (clrwdg), retorno de
interrupción (reti), no operación (nop) y detener (halt): en (a) sus reglas EBNF asociadas y
en (b) sus diagramas de sintaxis.
72 CAPÍTULO 5. ENSAMBLADOR
Las instrucciones que limpian un registro o un solo bit poniendo en alto o bajo su valor
(bit← 0 o 1, registro← 0x0000 o 0xFFFF), son las instrucciones clr, set, clrb o setb. La
descripción de estas instrucciones se muestra en la figura 5.12.
instrucciónclr
clr regall
instrucciónset
instrucción clr → clr regall set regall
instrucción set → set regall instrucciónclrb
instrucción clrb → clrb regall , cte clrb regall , cte
instrucciónsetb
instrucción clrb → setb regall , cte setb regall , cte
regall → regi | status
(a) (b)
Figura 5.12: Instrucciones que reinician un registro de propósito general o el registro de status
se muestra: en (a) sus reglas EBNF y en (b) sus diagramas de sintaxis.
Las instrucciones de salto alteran el contador de programa se necesita proveer una di-
rección de memoria de programa, las instrucciones condicionales (jclr y jset) incrementa el
contador de programa en dos (CP+2) si se cumple la condición de que un bit de registro
evaluado sea igual a cero para jclr o uno para jset (regall [cte] = x, x ∈ {0, 1}). El salto incon-
dicional acepta la dirección de forma explı́cita (dirMP ). La figura 5.13 describe la instrucción
de salto.
instrucciónjmp
jmp dirMP
instrucciónjclr
instrucción jmp →jmp dirMP jclr regall , cte
instrucciónjset
instrucción jclr →jclr regall , cte jset regall , cte
instrucción jset →jset regall , cte
(a) (b)
Figura 5.13: Instrucciones de salto incondicional (jmp) y condicional (jset y jclr), en (a) sus
reglas EBNF y en (b) sus diagramas de sintaxis.
La instrucción de comparación resta dos valores, el primer valor es obtenido por un registro
(regi ) y el segundo puede ser un valor inmediato (cte) u otro registro (regi ). Las instrucciones
de salto se asocian con esta instrucción, cmp modifica los bits del registro status. La figura
5.14 describe la instrucción de comparación.
instruccióncmp regi
cmp regi ,
instrucción cmp → cmp regi , opcmp cte
opcmp → regi |cte
(a) (b)
Figura 5.14: Instrucción cmp, en (a) sus reglas EBNF y en (b) su diagrama de sintaxis.
5.3. FUNCIONAMIENTO DEL SOFTWARE 73
Las diferencia de las instrucciones push s y pop s, contra las instrucciones push y pop,
consiste en que las primeras dos toman al puntero como lı́mite superior, decrementándolo
al poner un elemento e incrementando al quitarlo; el segundo par de instrucciones toman
al puntero como lı́mite inferior, lo incrementan al poner un elemento y se decrementa al
quitarlo. La sintaxis de ambos pares de instrucciones difieren con el uso del sufijo s.
Las instrucciones en código máquina son cadenas de sı́mbolos donde Σ={0,1,-}, el guion se
utiliza para especificar que no importa su valor (puede ser cero o uno). Por ejemplo, en las ins-
trucciones implı́citas solo nos interesa el código de operación y su modo de direccionamiento:
La figura 5.16(a) muestra el archivo xml que describe el proyecto, los directorios donde
se crearan el archivo binario, desensamblado y la descripción de la memoria ROM en VHDL.
Para poder ejecutar el software se utiliza la terminal de comandos. El archivo de la figu-
ra 5.16(b) crea las carpetas en el directorio de trabajo y ejecuta un script en lenguaje de
programación python que realiza el ensamblado y desensamblado.
<proyecto nombre="Test"
ruta="C:\src\Ejemplo\"
version="1.0">
<asm paso="ensamblador">
<nombre>main</nombre>
<ruta>asm\</ruta>
<extension tipo="asm"/>
</asm>
<dasm paso="desensamblador">
<nombre>main</nombre>
<ruta>dasm\</ruta>
<extension tipo="dasm"/>
</dasm>
<bin paso="binario">
<nombre>main</nombre>
<ruta>bin\</ruta>
<extension tipo="bin"/>
</bin>
<rom paso="meoria"> mkdir bin
<nombre>mp</nombre> mkdir dasm
<ruta>rom\</ruta> mkdir rom
<extension tipo="vhd"/> "C:\asm\console.py" proyecto.xml>out.txt
</rom>
</proyecto>
pause
(a) Descripcion del proyecto en un ar- (b) Archivo de procesamiento por lotes que se ejecuta
chivo XML. en la lı́nea de comandos.
Figura 5.16: Archivos adicionales para generar el programa en lenguaje de máquina.
cte.asm
dasm main.dasm
#include
rom
lib.asm
mp.vhd
#include
3. Intercambia los identificadores de las constantes definidas con la directiva #equ por sus
valores numéricos correspondientes.
4. Intercambia los identificadores definidos por las etiquetas por su valor numérico (se
suma el offset correspondiente).
El valor de cada etiqueta toma el número de instrucción que tiene a continuación. El
valor numérico de la etiqueta dentro del programa en lenguaje máquina se obtiene
sumando:
No. de instrucción + Offset.
El archivo main.asm tiene dos etiquetas asociadas: main que toma el valor de dos que
referencia la posición de la instrucción load reg0, 0x0 y loop con valor de tres que
referencia la posición de la instrucción call inc. El archivo lib.asm tiene asociada la
etiqueta inc con el valor de cero que referencia la instrucción add reg0, step.
Las instrucciones se acomodan iniciando por las del archivo principal seguidas de las
demás. Cada archivo inicializa una etiqueta con la posición de instrucción que referencia,
cuando se incorporan todas las instrucciones:
[instrucciones main.asm][instrucciones lib.asm][instrucciones cte.asm],
Los diccionarios se pueden utilizar como tablas de búsqueda, entre las cuales encontramos
el código de operación que tiene el nemónico y su valor numérico. El código de operación tiene
un lı́mite de 6 bits para un rango binario de b000000 hasta 0b111111 o en hexadecimal de
0x00 a 0x3F; otra tabla de búsqueda es el modo de direccionamiento, definido con solo 3 bits,
con un rango binario de 0b000 hasta 0b111, o en hexadecimal de 0x0 a 0x7.
En el pseudocódigo 1 se definen variables globales como Error que toma el valor de verdad
cuando existe un error y se verifica para continuar o salir. El código de operación CO y el
modo de direccionamiento MODO son diccionarios que definen un mnemónico con un valor
numérico. El nombre del archivo de salida archivo out y el nombre del archivo principal del
código fuente archivo in. La lista que almacenara el nombre de todos los archivos del código
fuente es Archivos ← [main.asm, lib.asm, cte.asm] y el diccionario que almacenara todas
las instrucciones asociadas a un archivo es P rograma ← {main.asm:[instrucción0 , . . . ],. . . },
existe un solo diccionario para las constantes Cte ← {id0 :valor,. . . }, las etiquetas almacena
las etiquetas asociadas a un archivo Labels ←{main.asm:{id0 :dirección0 ,. . . },. . . }.
Pseudocódigo 3 Función que obtiene el conjunto de tokens asociados a una lı́nea del lenguaje
ensamblador
1: procedimiento Obtener Tokens(linea, numlinea) . Cada lı́nea en lenguaje ensamblador generara
un diccionario de tokens: Lı́nea←{}
2: si lı́nea = r‘: id’ entonces . Etiqueta
3: Linea[‘etiqueta’]← id . Un token está compuesto por el tipo y su valor (o lexema).
4: fin si . Ej.: token←(etiqueta,identificador ).
5: si lı́nea = r“load regI , int10 ” entonces
6: Linea[‘opcode’]← ‘load’
7: Linea[‘rt’]← Entero(I,10) . Convertir la expresión a un entero de base 10
8: Linea[‘cte’]← Entero(cte,10) . Convertir la expresión a un entero de base 10
9: Linea[‘modo’]← ‘inmediato’
10: . . .
11: en otro caso si lı́nea = r‘#equ id, int16 ’ entonces
12: Linea[‘directiva’]← ‘equ’
13: Linea[‘id’]← id
14: Linea[‘cte’]← Entero(cte,16)
15: en otro caso si lı́nea = r‘#include “Cadenacaracteres ”’ entonces
16: Linea[‘archivo’]← Cadenacaracteres
17: Linea[‘directiva’]← ‘include’
18: en otro caso si lı́nea = r‘#end’ entonces
19: Linea[‘directiva’]← ‘end’
20: en otro caso
21: Error ← Cierto
22: fin si
23: devolver Linea
24: fin procedimiento
ret ->{opcode:’ret’,modo:’implicito’}
#end ->{directiva:’end’}
#equ step , 1 ->{directiva:’equ’,id:’step’,cte:1}
#equ limite, 10 ->{directiva:’equ’,id:’limite’,cte:10}
#equ ZERO , 1 ->{directiva:’equ’,id:’ZERO’,cte:1}
#end ->{directiva:’end’}
Constantes={’step’:1,’limite’:10,’ZERO:1}
Etiquetas ={’main.asm’:{’loop’:2,’main’:3},
’lib.asm’:{’inc’:0},’cte.asm’:{}}
Programa= { ’cte.asm’:[],
’main.asm’:[{opcode:’call’,id:’main’,md:’directo’,ni=0,nl=2},
80 CAPÍTULO 5. ENSAMBLADOR
{opcode:’halt’,md:’implicito’, ni=1,nl=3},
{opcode:’load’,rt:0,cte:0,md:’inmediato’, ni=2,nl=5},
{opcode:’call’,id:’inc’,md:’directo’, ni=3, nl=7},
{opcode:’cmp’,rt:0,id:’limite’,md:’inmediato’, ni=4,nl=8},
{opcode:’jclr’,rx:status,id:’ZERO’,md:’inmediato’,ni=5,nl=9},
{opcode:’jmp’,id:’loop’,md:’inmediato’,ni=6, nl=10},
{opcode:’ret’,md:’implicito’, ni=7,nl=11}],
’lib.asm’:[ {opcode:’add’,md:’inmediato’,ni=8, nl=2},
{opcode:’ret’,md:’implicito’,ni=9, nl=3}] }
Usando este pseudocódigo se obtienen cada una de las lı́neas del programa en lenguaje de
máquina:
[011111] [----0000000000000010] [010] :{op:call,dir:2,...}
[100100] [--------------------] [000] :{op:halt,...}
[000001] [00000000000000000000] [001] :{op:load,rt:0,cte:0...}
[011111] [----0000000000001000] [010] :{op:call,dir:8,...}
[000110] [00000000000000001010] [001] :{op:cmp,rt:0,cte:10,...}
[000101] [11111111-------00001] [001] :{op:jclr,rt:256,n:1,...}
[000011] [----0000000000000011] [010] :{op:jmp,dir:3,...}
[100000] [--------------------] [000] :{op:ret,...}
[000111] [00000000000000000001] [001] :{op:add,rt:0,cte:1...}
[100000] [--------------------] [000] :{op:ret,...}
Los pasos para generar una memoria ROM descrita en VHDL son:
1. Leer lı́nea por lı́nea del archivo que contiene las instrucciones en lenguaje máquina,
para verificar la longitud fija de 29 bits de la instrucción.
82 CAPÍTULO 5. ENSAMBLADOR
2. En el orden que fue leı́da cada instrucción, se asocia cada una con una localidad de
memoria y se rellena la estructura WHEN-ELSE:
salida ←instrucción 0 WHEN dir = dirección 0 ELSE
instrucción 1 WHEN dir = dirección 1 ELSE
...
instrucción k−1 WHEN dir = dirección k−1 ELSE
insrucciónk ;
Simulaciones y Resultados
A lo largo de este capı́tulo se muestran los pseudocódigos asociados a cada prueba, los
cuales son equivalentes a los programas en lenguaje ensamblador utilizados para el banco
de pruebas que valida el diseño del microcontrolador. Con el ensamblador explicado en el
capı́tulo anterior, se crearon los programas para generar: (1) un reloj, (2) un modulador por
ancho de pulso, (3) un puerto serial, (4) un ejemplo del perro guardián, (5) un multiplicador
Karatsuba de dos números de 128 bits, (6) el estándar de cifrado por bloques AES, y (7) dos
modos de operación CCM y GCM de encriptación autenticada. A continuación se describirán
en detalle cada uno de estos programas, con los resultados de uso de memoria, reporte de
tiempos y número de ciclos por byte para el cifrado y descifrado para la aplicación (7).
Todos los banco de pruebas presentados realizan una serie de pasos repetitivos que siguen
un orden secuencial, cada paso se describe como: (a) inicializar las localidades de memoria,
arreglos y variables; (b) configurar los periféricos con o sin el manejador de interrupciones; (c)
ejecución de un bucle infinito o llamada a una subrutina que se desea probar; y (d) todas las
subrutinas que auxilian el flujo del programa. A continuación cada una de las siete pruebas
se describierán en detalle.
6.1. Reloj
Esta aplicación consiste en un reloj que despliega horas, minutos y segundos en formato
binario. Usa los puertos paralelos B, C y D para desplegar los datos de horas, minutos y
segundos, respectivamente; y se configura a través del puerto paralelo A. Las pseudocódigos
7 y 8 describen el programa realizado en ensamblador para esta prueba. La subrutina Prin-
cipal() desarrolla la aplicación, primero realiza una llamada a la subrutina Inicializar()
que configura al microcontrolador como reloj; luego inicia un bucle infinito para desplegar
los contadores; en cada ciclo del bucle se verifica si el bit dos del puerto A esta habilitado
para reiniciar a cero los contadores.
La variable ‘flag’ controla el estado del reloj: en estado alto (1) funciona la aplicación en
83
84 CAPÍTULO 6. SIMULACIONES Y RESULTADOS
modo normal, en estado bajo (0) está en modo edición. Las variables que realizan el conteo
de los segundos (‘seg’), minutos (‘min’) y horas (‘hrs’) se inicializa en cero.
El temporizador es el componente del microcontrolador que en este caso se usa para
contar segundos. Los registros del temporizador son: ‘dfTimer’ que establece la velocidad del
reloj que alimentara al temporizador, ‘timer0’ establece el lı́mite superior del contador (bucle
infinito de cero a timer0 − 1) y el último registro ‘cfgTimer’ habilita el temporizador cero,
la tabla 6.1 describe el uso de los bits para este registro, los primeros cuatro bits en alto (1)
habilitan los temporizadores, los siguientes cuatro bits apagan la llamada de interrupción con
el bit en alto (1).
Tabla 6.1: Descripción del registro ’cfgTimer’ que afecta el funcionamiento de los distintos
temporizadores.
0 us 2 us 4 us 6 us 8 us
RX
zo zo
Figura 6.8: Celda del multiplicador, zo ←(a AND b) XOR zi .
a3 b0 0 a 2 b 00 a1 b0 0 a0 b0 0
a3 b1 0 a2 b1 a1 b1 a0 b1
a 3 b 20 a2 b2 a1 b2 a0 b2
a 3 b 30 a2 b3 a1 b3 a0 b3
c6 c5 c4 c3 c2 c1 c0
Figura 6.9: Multiplicación (n2 operaciones) con n = 4
92 CAPÍTULO 6. SIMULACIONES Y RESULTADOS
HECHO B A
a3 b0 0 a 2 b 00 a1 b0 0 a0 b0 0
a3 b1 0 a2 b1 a1 b1 a0 b1
REG0
a 3 b 20 a2 b2 a1 b2 a0 b2
a 3 b 30 a2 b3 a1 b3 a0 b3
c6 c5 c4 c3 c2 c1 c0
REG1
R
Figura 6.10: Multiplicación con pipeline.
Una posible manera de reducir la frecuencia máxima de la multiplicación es realizar las
operaciones por segmentos o pipeline, la figura 6.10 muestra la operación con dos segmentos,
la primer parte operan los primeros dos bits del entero b[1..0] y la segunda parte opera con
los bits restante b[3..2]. El registro de configuración activa un bit ’HECH0’ que habilita la
escritura de los registros de pipeline ’REG0’, ’REG1’ y ’R’, mientras sea uno, el flujo de los
datos se almacena, en otro caso conserva el dato por defecto o el de una operación anterior.
El algoritmo Karatsuba-Ofman es un método recursivo con el paradigma de divide y ven-
cerás, permite calcular el producto de dos números grandes usando tres multiplicaciones más
pequeñas, más algunas sumas y desplazamientos. El procedimiento estándar para multiplicar
dos números de n dı́gitos requiere n2 operaciones, en contraposición a Karatsuba que requiere
a como máximo 3nlog2 3 operaciones.
Sea A(x) y B(x) dos elementos en F (2m ), donde nos interesa encontrar el producto po-
linomial D(x)=A(x)B(X) con el grado ≤ 2m-2. Ambos enteros pueden ser representados en
su forma polinomial:
m m m m
A ← x 2 (x 2−1 am−1 + · · · + a m2 ) + (x 2−1 a 2−1
m + ··· + a ) ← x 2 A
0 H + AL
m m m m
B ← x 2 (x 2−1 bm−1 + · · · + b m2 ) + (x 2−1 b 2−1
m + ··· + b ) ← x 2 B
0 H + BL
Los pasos para realizar la multiplicación de dos enteros con un número par de bits y
obtener el resultado D por el método Karatsuba [32] son:
m
A → (AH ) + AL (6.1)
2
m
B → (BH ) + BL (6.2)
2
m0 ← AL × BL (6.3)
m1 ← [AL ⊕ AH ] × [BL ⊕ BH ] (6.4)
m2 ← AH × BH (6.5)
n
D ← (m2 n) ⊕ [(m2 ⊕ m1 ⊕ m0 ) ( )] ⊕ m0 (6.6)
2
6.5. MULTIPLICADOR KARATSUBA 93
R [256. .0]← A[127. .0]× B [127. .0 ]
m00 ← A[63. .0 ]× B [63. .0 ]
m10 ← A[31. .0 ]× B [31. .0 ]
m02 ← A[15. .0 ]× B [15. .0 ]
m12 ←( A[31. .16]⊕ A[15. .0 ])×(B [31. .16 ]⊕ B[15. .0])
m 22 ← A[31. .16 ]× B [31..16 ]
m1 ←(U 1 [31. .0])×(V 1 [31. .0 ])
1
Los 128 bytes menos significativos Los 128 bytes mas significativos
D0 ←MD[dirD + 0]←D[15..00] D8 ←MD[dirD + 8]←D[143..128]
D1 ←MD[dirD + 1]←D[31..16] D9 ←MD[dirD + 9]←D[159..144]
D2 ←MD[dirD + 2]←D[47..32] D10 ←MD[dirD + 10]←D[175..160]
D3 ←MD[dirD + 3]←D[63..48] D11 ←MD[dirD + 11]←D[191..176]
D4 ←MD[dirD + 4]←D[31..16] D12 ←MD[dirD + 12]←D[207..192]
D5 ←MD[dirD + 5]←D[95..80] D13 ←MD[dirD + 13]←D[223..108]
D6 ←MD[dirD + 6]←D[111..96] D14 ←MD[dirD + 14]←D[239..224]
D7 ←MD[dirD + 7]←D[127..112] D15 ←MD[dirD + 15] ←D[255..240]
Tabla 6.8: Almacenar un entero de 256 bits en localidades de memoria de 16 bits
Los 64 bytes más significativos Los 64 bytes menos significativos
Q0 ←MD[dirQ + 0]←Q[15..00] Q4 ←MD[dirQ + 4]←Q[31..16]
Q1 ←MD[dirQ + 1]←Q[31..16] Q5 ←MD[dirQ + 5]←Q[95..80]
Q2 ←MD[dirQ + 2]←Q[47..32] Q6 ←MD[dirQ + 6]←Q[111..96]
Q3 ←MD[dirQ + 3]←Q[63..48] Q7 ←MD[dirQ + 7]←Q[127..112]
Tabla 6.9: Almacenar un entero de 128 bits en localidades de memoria de 16 bits
6.5. MULTIPLICADOR KARATSUBA 95
La tabla 6.8 especifica el uso de memoria para leer un entero de 256 bits y la tabla
6.9 para un entero de 128 bits. Para obtener los primeros 16 bits se resuelve la ecuación
Q0 ← q0 ∨ q1 ∨ q2 ∨ q3 ∨ q4 ∨ q5 ∨ q6 , las operaciones necesarias son:
q0 ←(D0 ⊕ D8 ⊕ (D8 1) ⊕ (D8 2) ⊕ (D8 7)) ∧ 0xC000 (6.7)
q1 ←(D0 ⊕ D8 ⊕ (D8 1) ⊕ (D8 2) ⊕ (D8 7) ⊕ (D15 2)) ∧ 0x3E00 (6.8)
q2 ←(D0 ⊕ D8 ⊕ (D8 1) ⊕ (D8 2) ⊕ (D8 7) ⊕ (D15 2)) ∧ 0x0180 (6.9)
q3 ←(D0 ⊕ D8 ⊕ (D8 1) ⊕ (D8 2) ⊕ (D15 9) ⊕ (D15 8) ⊕ (D15 7)) ∧ 0x0070 (6.10)
q4 ←(D0 ⊕ D8 ⊕ (D8 1) ⊕ (D8 2) ⊕ (D15 9) ⊕ (D15 8) ⊕ (D15 7) ⊕ (D15 12))
∧ 0x000C (6.11)
q5 ←(D0 ⊕ D8 ⊕ (D8 1) ⊕ (D15 9) ⊕ (D15 8) ⊕ (D15 13)) ∧ 0x0002 (6.12)
q6 ←(D0 ⊕ D8 ⊕ (D15 ] 9) ⊕ (D15 14) ⊕ (D15 15)) ∧ 0x0001 (6.13)
Realizadas las operaciones anteriores se puede obtener Q0 , para el resto de los bits se
realizan las siguientes operaciones:
Q1 ←D1 ⊕ D9 ⊕ (D9 1 ∨ D8 15) ⊕ (D9 2 ∨ D8 14) ⊕ (D9 7 ∨ D8 9) (6.14)
Q2 ←D2 ⊕ D10 ⊕ (D10 1 ∨ D9 15) ⊕ (D10 2 ∨ D9 14) ⊕ (D10 7 ∨ D9 9) (6.15)
Q3 ←D3 ⊕ D11 ⊕ (D11 1 ∨ D10 15) ⊕ (D11 2 ∨ D10 14) ⊕ (D11 7 ∨ D10 9) (6.16)
Q4 ←D4 ⊕ D12 ⊕ (D12 1 ∨ D11 15) ⊕ (D12 2 ∨ D11 14) ⊕ (D12 7 ∨ D11 9) (6.17)
Q5 ←D5 ⊕ D13 ⊕ (D13 1 ∨ D12 15) ⊕ (D13 2 ∨ D12 14) ⊕ (D13 7 ∨ D12 9) (6.18)
Q6 ←D6 ⊕ D14 ⊕ (D14 1 ∨ D13 15) ⊕ (D14 2 ∨ D13 14) ⊕ (D14 7 ∨ D13 9) (6.19)
Q7 ←D7 ⊕ D15 ⊕ (D15 1 ∨ D14 15) ⊕ (D15 2 ∨ D14 14) ⊕ (D15 7 ∨ D14 9) (6.20)
b 15 b 14 b 13 b 12 b 11 b 10 b 9 b 8 b 7 b 6 b 5 b 4 b 3 b 2 b 1 b 0 MD [ d 0 ]
b 143 b 142 b 141 b 140 b 139 b 138 b 137 b 136 b 135b 134 b 133 b 132 b 131 b 130 b 129 b 128MD [ d 8 ]
b 143 b 142 b 141 b 140 b 139 b 138 b 137 b 136 b 135b 134 b 133 b 132 b 131 b 130 b 129 b 128 MD [ d 8 ]≪1
b 143 b 142 b 141 b 140 b 139 b 138 b 137 b 136 b 135b 134 b 133 b 132 b 131 b 130 b 129 b 128 MD [ d 8 ]≪ 2
b 143 b 142 b 141 b 140 b 139 b 138 b 137 b 136 b 135 b 134 b 133 b 132 b 131 b 130 b 129 b 128 MD [ d 8 ]≪7
(a) q0
b 15 b 14 b 13 b 12 b 11 b 10 b 9 b 8 b 7 b 6 b 5 b 4 b 3 b 2 b 1 b 0 MD [ d 0 ]
b 143 b 142 b 141 b 140 b 139 b 138 b 137 b 136 b 135b 134 b 133 b 132 b 131 b 130 b 129 b 128 MD [ d 8 ]
b 143 b 142 b 141 b 140 b 139 b 138 b 137 b 136 b 135b 134 b 133 b 132 b 131 b 130 b 129 b 128 MD [ d 8 ]≪1
b 143 b 142 b 141 b 140 b 139 b 138 b 137 b 136 b 135 b 134 b 133 b 132 b 131 b 130 b 129 b 128 MD [ d 8 ]≪ 2
b 143 b 142 b 141 b 140 b 139 b 138 b 137 b 136b 135 b 134 b 133 b 132 b 131 b 130 b 129 b 128 MD [ d 8 ]≪7
b 255 b 254 b 253 b 252 b 251 b 250 b 249 b 248 b 247b 246 b 245 b 244 b 243 b 242 b 241 b 240 MD [ d 15 ]≫2
(b) q1 y q2
b 15 b 14 b 13 b 12 b 11 b 10 b 9 b 8 b 7 b 6 b 5 b 4 b 3 b 2 b 1 b 0 MD [ d 0 ]
b 143 b 142 b 141 b 140 b 139 b 138 b 137 b 136 b 135b 134 b 133 b 132 b 131 b 130 b 129 b 128 MD [ d 8 ]
b 143 b 142 b 141 b 140 b 139 b 138 b 137 b 136 b 135b 134 b 133 b 132 b 131 b 130 b 129 b 128 MD [ d 8 ]≪1
b 143 b 142 b 141 b 140 b 139 b 138 b 137 b 136 b 135 b 134b 133 b 132 b 131 b 130 b 129 b 128 MD [ d 8 ]≪ 2
b 255 b 254 b 253 b 252 b 251 b 250 b 249 b 248 b 247b 246 b 245 b 244 b 243 b 242 b 241 b 240 MD [ d 15 ]≫9
b 255 b 254 b 253 b 252 b 251 b 250 b 249 b 248 b 247b 246 b 245 b 244 b 243 b 242 b 241 b 240 MD [ d 15 ]≫8
b 255 b 254 b 253 b 252 b 251 b 250 b 249 b 248 b 247b 246 b 245 b 244 b 243 b 242 b 241 b 240 MD [ d 15 ]≫7
b 255 b 254 b 253 b 252 b 251 b 250 b 249 b 248 b 247b 246 b 245 b 244 b 243 b 242 b 241 b 240 MD [ d 15 ]≫12
(c) q3 y q4
Figura 6.12: Desplazamientos para calcular qi .
96 CAPÍTULO 6. SIMULACIONES Y RESULTADOS
b 15 b 14 b 13 b 12 b 11 b 10 b 9 b 8 b 7 b 6 b 5 b 4 b 3 b 2 b 1 b 0 MD [ d 0 ]
b 143 b 142 b 141 b 140 b 139 b 138 b 137 b 136 b 135b 134 b 133 b 132 b 131 b 130 b 129 b 128 MD [ d 8 ]
b 143 b 142 b 141 b 140 b 139 b 138 b 137 b 136 b 135b 134 b 133 b 132 b 131 b 130 b 129 b 128 MD [ d 8 ]≪1
b 143 b 142 b 141 b 140 b 139 b 138 b 137 b 136 b 135 b 134b 133 b 132 b 131 b 130 b 129 b 128 MD [ d 8 ]≪ 2
b 255 b 254 b 253 b 252 b 251 b 250 b 249 b 248 b 247b 246 b 245 b 244 b 243 b 242 b 241 b 240 MD [ d 15 ]≫9
b 255 b 254 b 253 b 252 b 251 b 250 b 249 b 248 b 247b 246 b 245 b 244 b 243 b 242 b 241 b 240 MD [ d 15 ]≫8
b 255 b 254 b 253 b 252 b 251 b 250 b 249 b 248 b 247b 246 b 245 b 244 b 243 b 242 b 241 b 240 MD [ d 15 ]≫7
b 255 b 254 b 253 b 252 b 251 b 250 b 249 b 248 b 247b 246 b 245 b 244 b 243 b 242 b 241 b 240 MD [ d 15 ]≫12
(a) q3 y q4
b 15 b 14 b 13 b 12 b 11 b 10 b 9 b 8 b 7 b 6 b 5 b 4 b 3 b 2 b 1 b 0 MD [ d 0 ]
b 143 b 142 b 141 b 140 b 139 b 138 b 137 b 136 b 135b 134 b 133 b 132 b 131 b 130 b 129 b 128 MD [ d 8 ]
b 143 b 142 b 141 b 140 b 139 b 138 b 137 b 136 b 135b 134 b 133 b 132 b 131 b 130 b 129 b 128 MD [ d 8 ]≪1
b 255 b 254 b 253 b 252 b 251 b 250 b 249 b 248 b 247b 246 b 245 b 244 b 243 b 242 b 241 b 240 MD [ d 15 ]≫9
b 255 b 254 b 253 b 252 b 251 b 250 b 249 b 248 b 247b 246 b 245 b 244 b 243 b 242 b 241 b 240 MD [ d 15 ]≫8
b 255 b 254 b 253 b 252 b 251b 249 b 250b 248 b 247b 246 b 245 b 244 b 243 b 242 b 241 b 240 MD [ d 15 ]≫13
(b) q5
b 15 b 14 b 13 b 12 b 11 b 10 b 9 b 8 b 7 b 6 b 5 b 4 b 3 b 2 b 1 b 0 MD [ d 0 ]
b 143 b 142 b 141 b 140 b 139 b 138 b 137 b 136 b 135b 134 b 133 b 132 b 131 b 130 b 129 b 128 MD [ d 8 ]
b 255 b 254 b 253 b 252 b 251 b 250 b 249 b 248 b 247b 246 b 245 b 244 b 243 b 242 b 241 b 240 MD [ d 15 ]≫9
b 255 b 254 b 253 b 252 b 251 b 250 b 249 b 248 b 247b 246 b 245 b 244 b 243 b 242 b 241 b 240 MD [ d 15 ]≫14
b 255 b 254 b 253 b 252 b 251 b 250 b 249 b 248 b 247b 246 b 245 b 244 b 243 b 242 b 241 b 240 MD [ d 15 ]≫15
(c) q6
Figura 6.13: Desplazamientos para calcular qi , continuación.
Las figura 6.12 y 6.13 muestra los desplazamientos de los datos almacenados en memoria
para obtener los dos bytes menos significativos por medio de la reducción.
Señal E/S Bits Descripción
D[15..0] Q[15..0] D E 16 Bus de datos
W CLK Q S 16 Bus de datos
R CLR R E 1 Habilita la lectura de datos
DIR[3..0] CS W E 1 Habilita la escritura de datos
CS E 1 Habilita la lectura y escritura
(a) DIR E 4 Selector de registro
CLK E 1 Reloj del sistema
CLR E 1 Reinicio del componente
difiere en el selector del chip, para la multiplicación solo es necesaria una señal. Para la re-
ducción se necesita más de 16 registros el CS[0] accede a los 16 registros del entero de 256
bits y el CS[1] al entero de 128 bits. La figura 6.15 muestra los arreglos que se utilizan en la
multiplicación de 128 por 128 bits. Las gráfica de ondas para la reducción se ve en las figuras
6.15 y 6.16.
00
700nsns 1,700
1,200
1,300
nsns1,600
ns1,800nsns 1,800
1,300
1,400
nsns1,700
ns1,900nsns 1,900
1,400
1,500
nsns1,800
ns2,000
0 nsnsns 2,000
1,500
1,600
nsns1,900
ns2,100
100 ns
ns
ns 2,100
1,600
1,700
nsns2,000
ns2,200
200 ns
ns
ns 2,200
1,700
1,800
nsns2,100
ns2,300
300 ns
ns
ns 2,300
1,800
1,900
nsns2,200
ns2,400
400 ns
ns
ns 2,400
1,900
2,000
nsns2,300
ns500 ns
ns 2,000
2,100
ns2,4
ns6
Figura 6.15: Variables utilizadas para la multiplicación de 128 por 128 bits, porción de la
memoria de datos.
98 CAPÍTULO 6. SIMULACIONES Y RESULTADOS
[352]R256[0] 0000
[352]R256[0] 0000 8d27 8d27
[353]r0 0000
[353]r0 0000 311a 311a
[354]r8 [354]r80000 0000 6234 6234
[355]r15 0000
[355]r15 0000 c468 c468
[356]r8_sll_1 0000
[356]r8_sll_1 0000 8d00 8d00
[357]r8_sll_2 0000
[357]r8_sll_2 0000 09ea 09ea
[358]r8_sll_7 0000
[358]r8_sll_7 0000 0013 0013
[359]r8_srl_1 0000
[359]r8_srl_1 0000 0027 0027
[360]r8_srl_2 0000
[360]r8_srl_2 0000 004f 004f
[361]r15_srl_2 0000
[361]r15_srl_2 0000 0002 0002
[362]r15_srl_7 0000
[362]r15_srl_7 0000 0001 0001
[363]r15_srl_8 [363]r15_srl_8 0000 0000
[364]r15_srl_9 [364]r15_srl_9 0000 0000
[365]r15_srl_12 [365]r15_srl_12 0000 0000
[366]r15_srl_14 [366]r15_srl_14 0000 0000
[367]r15_srl_15 [367]r15_srl_15 0000 0000
[368]d0 [368]d0 0000 0000
8000 9e80 8000 9e80 9e98 9e98
[369]d1 [369]d1 0000 0000 3e3e 3e3e
[370]d2 [370]d2 0000 0000 9c18 9c18
[371]d3 [371]d3 0000 0000 1f0d 1f0d
[372]d4 [372]d4 0000 0000 477d 477d
[373]d5 [373]d5 0000 0000 c8b0 c8b0
[374]d6 [374]d6 0000 0000 3d6d 3d6d
[375]d7 [375]d7 2,890 ns 2,900 ns 0000 0000 2,910 ns 2,920 ns cf00 2,930 nscf00
- Cada bloque cifrado es función del nonce, del incremento del contador, de la llave y del
correspondiente bloque de texto claro.
- Cada bloque descifrado es función del nonce, del incremento del contador, de la llave y del
correspondiente bloque de texto cifrado.
- Los errores de bits no se propagan: un bit erróneo de transmisión produce un solo bit
erróneo en el texto claro.
- Se puede hacer que cifre mensajes de forma diferente con sólo cambiar cada vez el nonce.
- No cambia el espacio de llaves.
- Se puede cifrar y descifrar en paralelo.
(a) (b)
Figura 6.19: Esquema del AES
El esquema de cifrado del AES se ilustra en la figura 6.19. Las N rondas están determi-
nadas por el tamaño de la llave: para un tamaño de 128, N es igual a 10; para un tamaño
de 192, N = 12; y para un tamaño de llave de 256, N = 14. El proceso de cifrado consta de
tres fases:
3. Una ronda final: se realizan tres de las transformaciones anteriores ignorando M ixColumns
y se utiliza la ultima subllave.
SubBytes
La sustitución consiste en tomar un byte, por ejemplo 0x9d, y con ayuda de la tabla 6.10
se obtine un nuevo byte seleccionado del renglón 9 y la columna d: resultando de 0x9d el valor
0x5e. Los autores del AES proporcionan una fórmula matemática para evitar la sospecha de
una posible trampa, cumpliendo con los siguientes criterios:
* Minimizar la correlación de la entrada con la salida.
* Minimizar la probabilidad de propagación de diferencias.
* Maximizar la complejidad de la expresión de transformación.
Para el proceso de cifrado y descifrado nunca se usan las fórmulas (transformaciones), se
realiza una consulta en las tablas de búsqueda. Para el cifrado la tabla asociada es la S-Box,
mostrada en la tabla 6.10, y para el descifrado es la tabla inversa del S-Box.
102 CAPÍTULO 6. SIMULACIONES Y RESULTADOS
xy 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
00 63 7c 77 7b f2 6b 6f c5 30 01 67 2b fe d7 ab 76
10 ca 82 c9 7d fa 59 47 f0 ad d4 a2 af 9c a4 72 c0
20 b7 fd 93 26 36 3f f7 cc 34 a5 e5 f1 71 d8 31 15
30 04 c7 23 c3 18 96 05 9a 07 12 80 e2 eb 27 b2 75
40 09 83 2c 1a 1b 6e 5a a0 52 3b d6 b3 29 e3 2f 84
50 53 d1 00 ed 20 fc b1 5b 6a cb be 39 4a 4c 58 cf
60 d0 ef aa fb 43 4d 33 85 45 f9 02 7f 50 3c 9f a8
70 51 a3 40 8f 92 9d 38 f5 bc b6 da 21 10 ff f3 d2
80 cd 0c 13 ec 5f 97 44 17 c4 a7 7e 3d 64 5d 19 73
90 60 81 4f dc 22 2a 90 88 46 ee b8 14 de [5e] 0b db
a0 e0 32 3a 0a 49 06 24 5c c2 d3 ac 62 91 95 e4 79
b0 e7 c8 37 6d 8d d5 4e a9 6c 56 f4 ea 65 7a ae 08
c0 ba 78 25 2e 1c a6 b4 c6 e8 dd 74 1f 4b bd 8b 8a
d0 70 3e b5 66 48 03 f6 0e 61 35 57 b9 86 c1 1d 9e
e0 e1 f8 98 11 69 d9 8e 94 9b 1e 87 e9 ce 55 28 df
f0 8c a1 89 0d bf e6 42 68 41 99 2d 0f b0 54 bb 16
Tabla 6.10: Tabla de búsqueda S-Box para el AES, el byte xy determina la columnas y y el
renglón x para retornar un nuevo valor.
ShiftRow
En esta operación el primer renglón no se modifica, los siguientes renglones se rotan una,
dos y tres veces los bytes a la izquierda, respectivamente. Esta operación modifica el estado
inicial para generar otro estado como se muestra en las siguientes matrices:
s0,0 s0,1 s0,2 s0,3 s0,0 s0,1 s0,2 s0,3
s1,0 s1,1 s1,2 s1,3 s1,1 s1,2 s1,3 s1,0
→
s2,0 s2,1 s2,2 s2,3 s2,2 s2,3 s2,0 s2,1
s3,0 s3,1 s3,2 s3,3 s3,3 s3,0 s3,1 s3,2
MixColumns
Esta transformación consiste en multiplicar cada columna por una matriz, la matriz para
el cifrado es: 0
s0,j 02 03 01 01 s0,j
s01,j 01 02 03 01 s1,j
0 =
s2,j 01 01 02 03 s2,j
s03,j 03 01 01 02 s3,j
AddRoundKey
En esta transformación, en cada ronda se realiza una operación XOR (⊕) de la subllave
con el estado de la forma siguiente:
s0,0 s0,1 s0,2 s0,3 s0,0 s0,1 s0,2 s0,3 Ek[i][0] EK[i][4] EK[i][8] EK[i][12]
s1,0 s1,1 s1,2 s1,3 s1,0
s1,1 s1,2 s1,3 EK[i][1]
EK[i][8] EK[i][9] EK[i][13]
s2,0 = ⊕
s2,1 s2,2 s2,3 s2,0 s2,1 s2,2 s2,3 EK[i][2] EK[i][6] EK[i][10] EK[i][14]
s3,0 s3,1 s3,2 s3,3 s3,0 s3,1 s3,2 s3,3 EK[i][3] EK[i][7] EK[i][11] EK[i][15]
Los pseudocódigos son basados en la implementación del AES de la biblioteca RELIC dis-
ponible en [23] que se probó en un microcontrolador MSP430X de Texas Instrument, que
está basada en [35] cuya licencia es GNU GPL v2.1. Los pseudocódigos 20 y 21 realizan
una consultas en varias tablas de búsqueda, los pseudocódigos 22 y 23 muestran los despla-
zamientos, el pseudocódigos 24 genera las subllaves, el pseudocódigo 25 muestra el método
de cifrado y el pseudocódigo 26 muestra el método de descifrado. La figura 6.20 muestra la
gráfica de onda para obtener los ciclos por byte.
Todas las tablas de búsqueda almacenan 256 elementos, la tabla isbox almacena solo
enteros de 1 byte, las demás de 2 bytes. La descripción de cada tabla de búsqueda se enlista
a continuación, considerando el campo finito del AES:
* smul32 combina la tabla de la S-Box multiplicando por x + 1 (byte superior) y por x (byte
inferior).
M C E key
68 6f h o a9 f6 2a 6e ae 9a 9a c8 be 34 4b 86 a0 e5 c7 b9 9d 45
6c 61 l a e1 de 7d 31 c1 5d e7 f9 7f 69 ac 7f df 8c 6b c6 42 c9
2d 6d - m da f9 cb 1f 1e 20 2c e6 61 49 80 99 be c5 eb 5f fc c
75 6e u n d3 a7 0 ab e4 cd 2c 4d 85 84 ac d4 3b 41 47 8b c7 4d
64 6f d o c2 aa 35 65 f 65 19 28 8a e1 b5 fc b1 a0 f2 77 76 ed
2d 63 - c 28 d5 d0 4d 4a fc c9 65 c0 1d 7c 99 71 bd 8e ee 7 50
72 75 r u e2 40 d8 a8 39 c5 11 cd f9 d8 6d 54 88 65 e3 ba 8f 35
65 6c e l 54 e8 6c 9b ef 94 7d 56 16 4c 10 2 9e 29 f3 b8 11 1c
80 99 f3 19 fd cf e5 55 ed cd 7b 7c 1e 75 6a 60
6 80 38 70 fb 4f dd 25 16 82 a6 59 8 f7 cc 39
58 fd 1c 76 a3 b2 c1 53 b5 30 67 a bd c7 ab 33
Tabla 6.11: Crifrado y descifrado de un mensaje usando AES. Texto claro M , texto cifrado
C y subllaves generadas Ekey
Figura 6.20: Para medir los ciclos de reloj que ocupan las operaciones criptográficas, se
desplegaron marcas por los puertos paralelos A y B. El puerto A despliega 0x1111 durante
la prueba. El puerto B despliega 0x1111 y 0x3333 cuando se generan las subllaves, 0x2222
en el cifrado y 0x4444 en el descifrado.
Modo CCM
El pseudocódigo 27 describe el funcionamiento de encriptación con CCM, donde la su-
brutina Formato calcula un bloque de encabezado B0 (donde codifica la longitud de la
etiqueta, la longitud del mensaje y el nonce). Los bloques A1 , ..., Aa (codifica la longitud de
los datos asociados junto con los datos en sı́) y los bloques M1 , ..., Mm representan el mensa-
je original. La subrutina Inicializar contador devuelve el contador inicial basada en el
nonce. La función Incrementar incrementa el contador.
Pseudocódigo 27 CCM encriptación
Entrada: Mensaje M, datos adicionales A, número arbitrario (nonce) N y la llave K.
Salida: Texto cifrado C y una etiqueta de autenticado T
1: función Cifrado CCM(M,A,N,K)
2: B0 , A1 , ..., Aa , M1 , ..., Mm ←Formato(N,A,M)
3: Y ← Cifrado(K,B0)
4: para i ← 1 hasta a hacer
5: Y ← Cifrado(K, Ai ⊕ Y)
6: fin para
7: J← Inicializar contador
8: S0 ← Cifrado(K, J)
9: J← Incrementar(J)
10: para i ←hasta m hacer
11: U ← Cifrar(K,J)
12: J ← Incrementar(J)
13: S ← Mi ⊕ Y
14: Y ← Cifrado(K,S)
15: Ci ← Mi ⊕ U
16: fin para
17: T ←Y[0..t-1]⊕S0 [0..t-1]
18: devolver T, C
19: fin función
Las figuras 6.21 y 6.22 muestran los valores de la interfaz del microcontrolador, el puerto
A toma el valor de 0x1111 para el cifrado y 0x2222 para el descifrado. El puerto B toma
el valor 0x1111 cuando se ejecuta la subrutina ac ccm key, toma el valor 0x2222 para la
subrutina ac ccm init, toma los valores 0x3333, 0x4444 y 0x5555 para ac ccm data, toma los
valor 0x6666 y 0x7777 para ac ccm enc (o ac ccm dec) y por último toma el valor 0x8888 para
la subrutina ac ccm tag. La figura 6.23 muestra las localidades de memoria que almacena el
texto cifrado C y el texto claro M .
00us
us 20
20us
us 40
40us
us 60
60us
us 80
80us
us 100
100us
us
[160]dir_t_ccm_0
[160]dir_t_ccm_0 0000 0000 00e3 00e3 0061 0061 0020 0020 0030 0030 0030 0030
[161]dir_t_ccm_1
[161]dir_t_ccm_1 0000 0000 00b2 00b2 0076 0076 0021 0021 0031 0031 0031 0031
[162]dir_t_ccm_2
[162]dir_t_ccm_2 0000 0000 0001 0001 00aa 00aa 0022 0022 0032 0032 0032 0032
[163]dir_t_ccm_3
[163]dir_t_ccm_3 0000 0000 00a9 00a9 00d9 00d9 0023 0023 0033 0033 0033 0033
[164]dir_t_ccm_4
[164]dir_t_ccm_4 0000 0000 00f5 00f5 00a4 00a4 0024 0024 0034 0034 0034 0034
[165]dir_t_ccm_5
[165]dir_t_ccm_5 0000 0000 00b7 00b7 0042 0042 0025 0025 0035 0035 0035 0035
[166]dir_t_ccm_6
[166]dir_t_ccm_6 0000 0000 001a 001a 008a 008a 0026 0026 0036 0036 0036 0036
[167dir_t_ccm_7
[167dir_t_ccm_7 0000 0000 007a 007a 00a5 00a5 0027 0027 0037 0037 0037 0037
[168]dir_t_ccm_8
[168]dir_t_ccm_8 0000 0000 009b 009b 0028 0028 0028 0028
[169]dir_t_ccm_9
[169]dir_t_ccm_9 0000 0000 001c 001c 0029 0029 0029 0029
[170]dir_t_ccm_10
[170]dir_t_ccm_10 0000 0000 00ea 00ea 002a 002a 002a 002a
[171]dir_t_ccm_11
[171]dir_t_ccm_11 0000 0000 00ec 00ec 002b 002b 002b 002b
[172]dir_t_ccm_12
[172]dir_t_ccm_12 0000 0000 00cd 00cd 002c 002c 002c 002c
[173]dir_t_ccm_13
[173]dir_t_ccm_13 0000 0000 0097 0097 002d 002d 002d 002d
[174]dir_t_ccm_14
[174]dir_t_ccm_14 0000 0000 00e7 00e7 002e 002e 002e 002e
[175]dir_t_ccm_15
[175]dir_t_ccm_15 0000 0000 000b 000b 002f 002f 002f 002f
Modo GCM
El pseudocódigo 28 describe la encriptación con GCM, donde la subrutinas Incrementar
e Inicializar Contador incrementa e inicializa el contador. La operación A × B denota la
multiplicación de A y B en F (2128 ). Este modo de EA se beneficia de la búsqueda de tablas
precalculadas desde la segundo operación que se fija para todas las multiplicaciones (lı́neas
6, 15 y 18 del pseudocódigo 28).
Pseudocódigo 28 Cifrado GCM
Entrada: Mensaje M, Datos asociados A, Número arbitrario (nonce) N, y una llave K.
Salida: Texto cifrado C y la etiqueta de autenticado T
1: función Cifrado GCM(M,A,N,K,T)
2: A1 , ..., Aa ← A y M1 , ..., Mm ← M . Se divide en bloques
3: H← Cifrado(K, 0128 )
4: Y ← 0128
5: para i ← 1 hasta a hacer
6: Y ← (Ai ⊕ Y ) × H
7: fin para
8: J← Inicializar Contador(N)
9: S0 ←Cifrar(K,J)
10: J ← Incrementar(J)
11: para i ← 1 hasta m hacer
12: U← Cifrar(K,J)
13: J ← Incrementar(J)
14: Ci ← Mi ⊕ U
15: Y ← (Ci ⊕ Y ) × H
16: fin para
17: L ← [Longitud(A)]64 ||[Longitud(M)]64 ]
18: S ← (L ⊕ Y ) × H
19: T ← (S ⊕ S0 )[0..t-1]
20: devolver T, C
21: fin función
6.7. RESULTADOS 109
0 us 20 us 40 us 60 us 80 us
0 us 20 us 40 us 60 us 80 us
La figura 6.24 muestran los valores de la interfaz del microcontrolador. El puerto A toma
el valor 0x1111 para el cifrado y 0x2222 para el descifrado. El puerto B toma los valores
0x1111 cuando se ejecuta la subrutina ac gcm key, toma el valor 0x2222 para la subrutina
ac gcm init, toma el valor 0x3333 para ac gcm dec y por ultimo toma el valor 0x4444 para
ac gcm tag. La figura 6.25 muestra el texto cifrado C y el texto claro M .
0 us 0 us 20 us 20 us 40 us 40 us 60 us 60 us 80 us 80 us
[96]T0 [96]T0 0000 0000 0003 0003 ffff ffff 0000 0000
[97]T1 [97]T1 0000 0000 0088 0088 ffff ffff 0000 0000
[98]T2 [98]T2 0000 0000 00da 00da ffff ffff 0000 0000
[99]T3 [99]T3 0000 0000 00ce 00ce ffff ffff 0000 0000
[100]T4 [100]T4 0000 0000 0060 0060 ffff ffff 0000 0000
[101]T5 [101]T5 0000 0000 00b6 00b6 ffff ffff 0000 0000
[102]T6 [102]T6 0000 0000 00a3 00a3 ffff ffff 0000 0000
[103]T7 [103]T7 0000 0000 0092 0092 ffff ffff 0000 0000
[104]T8 [104]T8 0000 0000 00f3 00f3 ffff ffff 0000 0000
[105]T9 [105]T9 0000 0000 0028 0028 ffff ffff 0000 0000
[106]T10 [106]T10 0000 0000 00c2 00c2 ffff ffff 0000 0000
[107]T11 [107]T11 0000 0000 00b9 00b9 ffff ffff 0000 0000
[108]T12 [108]T12 0000 0000 0071 0071 ffff ffff 0000 0000
[109]T13 [109]T13 0000 0000 00b2 00b2 ffff ffff 0000 0000
[110]T14 [110]T14 0000 0000 00fe 00fe ffff ffff 0000 0000
[111]T15 [111]T15 0000 0000 0078 0078 ffff ffff 0000 0000
6.7. Resultados
Las subrutinas implementadas para la encriptación autenticada basadas en RELIC son:
ac X key genera las subllaves Ekey , ac X init inicializa la estructura para todas las demás
subrutinas, ac X enc y ac X dec realiza el cifrado y descifrado con el método AE seleccionado,
ac X tag obtiene la etiqueta y por ultimo ac X data realiza las operaciones con los datos
asociados.
110 CAPÍTULO 6. SIMULACIONES Y RESULTADOS
Las tablas describen el número de ciclos que se demora en cada proceso de cifrado y
descifrado: para el GCM 6.13 y 6.14, para el CCM 6.15 y 6.16 y para el AES 6.12
Subrutina rango de ciclos ciclos
generar subllaves 1,146.5 – 5,683.5 4,537.0
cifrar 5,792.5- 14.107.5 8,315.0
generar subllaves 14,107.5- 18,644.5 4,537.0
descifrar 18,646.5-30,091.5 11,445.0
Tabla 6.12: Número de ciclos de cifrado y descifrado usando AES
rango de ciclos ciclos subrutina bytes cifrados
362.5 - 16,851.5 16489.0 ac gcm key
16,851.5 - 17,020.5 169.0 ac gcm init
17,020.5 - 35,307.5 18287.0 ac gcm enc 16
35,307.5 - 54,150.5 18843.0 ac gcm tag
Tabla 6.13: Cifrar un mensaje de 16 bytes con GCM.
rango ciclos ciclos subrutina bytes descifrados
54,610.5-71,101.5 16491.0 ac gcm enc
71,101.5-71,270.5 169.0 ac gcm init
71,270.5-89,556.5 18286.0 ac gcm dec 16
89,556.5-108,399.5 18843.0 ac gcm tag
Tabla 6.14: Descifrar un mensaje de 16 bytes con GCM.
rango de ciclos ciclos subrutina Bytes cifrado
162.5 -4,701.5 4539.0 ac ccm key
4,701.5 -21,709.5 17008.0 ac ccm init
21,709.5-30,406.5 8697.0 ac ccm data
30,406.5-30,503.5 97.0 ac ccm data
30,503.5-39,077.5 8574.0 ac ccm data
39,077.5-56,062.5 16985.0 ac ccm enc 16
56,062.5-73,230.5 17168.0 ac ccm enc 8
73,230.5–73,335.5 105.0 ac ccm tag
Tabla 6.15: Cifrar un mensaje de 24 bytes con CCM
rango de ciclos ciclos subrutina bytes descifrados
73,482.5 - 78,023.5 4541.0 ac ccm key
78,023.5 - 95,031.5 17008.0 ac ccm init
95,031.5 - 103,728.5 8697.0 ac ccm data
103,728.5 - 103,825.5 97.0 ac ccm data
103,825.5 - 112,399.5 8574.0 ac ccm data
112,399.5 - 129,384.5 16985.0 ac ccm dec 16
129,384.5 - 146,552.5 17168.0 ac ccm dec 8
146,552.5 - 146,657.5 105.0 ac ccm tag
Tabla 6.16: Descifrar un mensaje de 24 bytes con CCM
El número de ciclos por byte para descifrar y cifrar 16 byte es: para el GCM 18286
16
← 1142
16985
ciclos por byte; para el CCM 16 ← 1061.5625 ciclos por byte ; y por último para el AES se
6.7. RESULTADOS 111
Uso de memoria
La tabla 6.19 resume el uso de memoria para cada banco de pruebas: comunicación serial
SERIAL, multiplicación MUL, modulación de ancho de pulso PWM, Perro guardián WATCH
DOG, AES, CCM y GCM. Las constantes (ROM) y las variables (RAM) son localidades en
memoria de datos con palabras de datos de 16 bits. Las instrucciones (ROM) son palabras
de 29 bits.
112 CAPÍTULO 6. SIMULACIONES Y RESULTADOS
Pruebas Variables Constantes Instrucciones
SERIAL 46 0 174
RELOJ 4 0 253
MUL 210 0 708
PWM 1 0 85
WATCH DOG 0 0 64
AES 420 2304 1039
CCM 470 2304 1603
GCM 780 2560 1993
Tabla 6.19: Uso de memoria para cada prueba
Para la pila en memoria de datos se establecen 48 localidades extras de memoria de datos
(variables) que sirven para la llamada a subrutinas. La prueba del GCM descrita en la tabla
anterior es la basada por las funciones de la biblioteca RELIC, las otras dos versiones manejan
2745 instrucciones, 2560 constantes y cerca de 1024 variables.
Reporte de tiempo
Para obtener el reporte Static Timing, se necesitó correr la implementación con el ISE
WEB PACK de XILINX versión 10. En resumen la tabla de frecuencia y periodos se ve en
la tabla 6.20.
Dispositivo/Paquete/Velocidad Periodo mı́nimo Frecuencia máxima
xc5vlx50t,ff1136,-1 79.530ns 12.574MHz
xc3s1600e,fg320,-4 148.554ns 6.732MHz
Conclusiones
Se diseñó un microcontrolador que puede ser utilizado en aplicaciones donde los recursos
sean limitados y solo para atender una única tarea. Se validó un diseño por un conjunto
de simulaciones, cada banco de pruebas utiliza uno o varios componentes del dispositivo.
Cada banco de pruebas consiste en varios archivos en lenguaje ensamblador que componen
un programa, las pruebas realizadas son: (1) reloj binario, (2) modulador de ancho de pulso,
(3) comunicación serial, (4) perro guardián, (5) Karatsuba, (6) el estándar de cifrado por
bloques AES y (7) dos modos de operación de encriptación autenticada CCM y GCM.
El conjunto de simulaciones de prueba validan su uso en una comunicación serial, entrada
y salida de datos por puertos paralelos, con modulación de ancho de pulso, en el uso de
temporizador o con un manejo de los periféricos por medio de interrupciones.
La memoria RAM para todos las pruebas fue almacenada en la página cero, las demás
páginas almacenaron las constantes que se necesitaron en las aplicaciones de cifrado, la figura
7.1 muestra todas las constantes y variables que inician desde la localidad 0x0030 (48 en base
10). Al tener todos los registros de función especial mapeados en localidades de memoria
(0x0000 - 0x002F, es decir, de la 0 hasta la 47) fue posible acceder a los periféricos, la figura
7.2 enlista los registros mapeados en las tres páginas de memoria, la primera y segunda página
comparte la misma interfaz con los registros de función especial, mientras que la última es
distinta.
AES_CTE[0:2304]={isbox, ROM
GCM_CTE[0:255]=
RAM[0:832] smul21,smul13,smul32,smul11, RAM
{byte_table}
mule9,muldb,mul9d,mulbe}
Figura 7.1: Organización de las constantes (ROM) y variables (RAM) de la memoria de datos.
113
114 CAPÍTULO 7. CONCLUSIONES
Número de página
Status Reg 128[0]
Limite contador del perro guardián Reg 128[1]
Configuración del perro guardián Reg 128[2]
Mascara de la interrupción Reg 128[3]
Dirección de subrutina para la interrupción 0 Reg 128[4]
Dirección de subrutina para la interrupción 1 Reg 128[5]
Dirección de subrutina para la interrupción 2 Reg 128[6]
Dirección de subrutina para la interrupción 3 Reg 128[7]
Dirección de subrutina para la interrupción 4 Reg 256[0]
Dirección de subrutina para la interrupción 5 Reg 256[1]
Dirección de subrutina para la interrupción 6 Reg 256[2]
Dirección de subrutina para la interrupción 7 Reg 256[3]
Dirección de subrutina para la interrupción 8 Reg 256[4]
Dirección de subrutina para la interrupción 9 Reg 256[5]
Dirección de subrutina para la interrupción 10 Reg 256[6] Sin uso
Dirección de subrutina para la interrupción 11 Reg 256[7]
Dirección de subrutina para la interrupción13 Reg 256[8] Registros
Dirección de subrutina para la interrupción 14 Reg 256[9] de función
Configuración del puerto paralelo A Reg 256[10] especial
Configuración del puerto paralelo B Reg 256[11]
Configuración del puerto paralelo C Reg 256[12]
Configuración del puerto paralelo C Reg 256[13]
Valor del puerto paralelo A Reg 256[14]
Valor del puerto paralelo B Reg 256[15]
Valor del puerto paralelo C Sin uso
Valor del puerto paralelo D Sin uso
Limite del temporizador 0 Sin uso
Limite del temporizador 1 Sin uso
Limite del temporizador 2 Sin uso
Limite del temporizador 3 Sin uso
Divisor de frecuencia de los temporizadores Sin uso
Divisor de frecuencia del puerto serie Sin uso
Byte transmitido por el puerto serie Sin uso
Byte recibido por el puerto serie Sin uso
Divisor de frecuencia de la seńal sierra del PWM Sin uso
Limite de la seńal sierra del PWM Sin uso
Configuración del PWM Sin uso
Registro de configuración 0 Sin uso
Registro de configuración 1 Sin uso
Configuración de los temporizadores Sin uso
Operando A de la multiplicación polinomial Sin uso
Operando B de la multiplicación polinomial Sin uso
Configuración de la multiplicación polinomial Sin uso
Resultado[ 0:15] de la multiplicación Sin uso
Resultado[31:16] de la multiplicación Sin uso
Sin uso Sin uso
Uno de los alcances al realizar el diseño es que sea simple, para que llegue a ser configurado
en dispositivos lógicos programables como los FPGA donde se puede personalizar añadiendo
o eliminando componentes para cualquier aplicación predeterminada.
Las expresiones regulares no son suficientes al utilizarse en la construcción de compila-
dores de lenguajes de alto nivel, pero para la creación de un lenguaje de bajo nivel como lo
es el lenguaje ensamblador es más que suficiente, ya que cada lı́nea de un archivo en len-
guaje ensamblador maneja toda la información necesaria para la generación del programas
en lenguaje de máquina, la información adicional que emplea el ensamblador se logra con el
uso de directivas o etiquetas. El software creado para este proyecto empleó el lenguaje de
programación python que es un lenguaje interpretado, la biblioteca estándar de este lenguaje
ofrece un módulo para el reconocimiento de expresiones regulares, llamado re, que fue de
gran ayuda para la construcción del ensamblador.
El conjunto de instrucciones no es difı́cil aprenderlo, es realmente práctico en aplicaciones
pequeñas, menores a las quinientas doce instrucciones, pero es frustrante la creación de
programas largos, se complica la depuración de errores y el mantenimiento de aplicaciones
desarrolladas solamente con el lenguaje ensamblador. Pero aun ası́ este lenguaje es de mejor
ayuda que solo codificar directamente en lenguaje de máquina, siendo una tarea sumamente
complicada el desarrollo de programas con este lenguaje que es solo comprendido por los
procesadores.
El código fuente del proyecto esta disponible en:
https://sites.google.com/site/tesis2013microcontoladorvhdl/
[2] B. B. Brey. Los Microprocesadores Intel 8086/8088, 80186, 80286, 80386, 80486 Arqui-
tectura, programación e interfaces 3ra edición. Prentice Hall, 1995.
[7] M.B.I. Raez, M. S. Islam, and M. S. Sulaiman. A single clock cycle MIPS RISC processor
design using VHDL. In International Conference on Semiconductor Electronics, 2002.
Proceedings. ICSE 2002. IEEE, pages 199 – 203, Dec. 2002.
117
118 BIBLIOGRAFÍA
[10] X. Tieju and Z. L. Fang. 16-bit Teaching Microprocessor Design and Application. In
International Symposium on Date of Conference IT in Medicine and Education, 2008.
ITME 2008. IEEE, pages 160 – 163, Dec. 2008.
[12] ht lab. MON88 Debug Monitor and Tiny Bios for the 8088/8086 Processor.
http://www.ht-lab.com/freeutils/mon88/mon88.html. Consultado el 30 de abril del
2013.
[16] R. Gal, A. G. Krakow, M. Frankiewicz, and A. Kos. FPGA implementation of 8-bit RISC
microcontroller for embedded systems. In International Conference Date of Conference
Mixed Design of Integrated Circuits and Systems (MIXDES), 2011 Proceedings of the
18th, pages 323 – 328, June 2011.
[19] R. Silverman and M. J. Melanie. Design of a pedagogical assembly language and class-
room experiences. J. Comput. Sci. Coll., 23(4):208–214, apr 2008.
[20] Dr. Robert Silverman. SC123 (tm) Computer System. http://www.cs.csustan.edu/ rrsil-
ver/html/sc123.html. Consultado el 20 de febreo del 2013.
[21] A. Koltes and J.T. O’Donnell. A framework for FPGA functional units in high per-
formance computing. In IEEE International Symposium on Parallel and Distributed
Processing, 2010. Proceedings ISBN: 9781424465330(c) 2010 IEEE.
[22] Conrado P. L. Gouvêa and Julio López. High speed implementation of authenticated
encryption for the msp430x microcontroller. In Proceedings of the 2nd international
BIBLIOGRAFÍA 119