PRÁCTICA #4.- Emulación de Un Microprocesador (2)
Short Description
Descripción: Practica microprocesadores...
Description
Práctica #4.- Emulación de un Microprocesador con Microcontrolador ARM o Arduino en ambiente MBED Prof. M. en C. Roberto Galicia Galicia Resumen Se presenta el procedimiento para el diseño de un emulador de un microprocesador basado en microcontroladores con procesador ARM o arduino, que permitirá contar con una herramienta didáctica para el estudio y comprensión de los conceptos de la arquitectura de una computadora, tales como ciclos de instrucción, los ciclos de máquina, registros de propósito especial, así como los registros de propósito general, que se muestran en una terminal con el fin de visualizar cómo se van modificando. El diseño propone una tarjeta compatible con arduino, que permite tener la interfaz necesaria para conectar a los puertos de un microcontrolador, que hace las funciones de los canales de direcciones, datos y control. La programación se realiza en lenguaje “C” y se utiliza un editor y compilador en la nube, mediante la plataforma MBED.ORG.
1 Introducción Si se considera importante contar con los principios y conceptos de una arquitectura de una computadora en base a un Microprocesador, la enseñanza debería realizarse con un microprocesador ARM actual, sin embargo, el costo puede ser un inconveniente y realizar un sistema mínimo requeriría de tiempo o diseñar una tarjeta para armar este sistema.
Por otra parte, trabajar con un microcontrolador, no permitiría manejar los conceptos de direccionamiento de memoria y puertos, debido a que ya viene interconectada la memoria y los puertos al microprocesador dentro del circuito integrado, por tal motivo, se propone una solución intermedia, mediante una tarjeta de desarrollo con Microcontrolador ARM actual, para emular los canales de una microcomputadora(terminales) así como el funcionamiento del microprocesador, facilitando la programación con la plataforma MBED, que permite la edición y compilación en la nube, utilizando las clases y métodos disponibles p. ej. DigitalOut, BusIn, BusOut, Wait, etc. Asimismo, sería muy fácil ejecutar el programa de forma más lenta o paso a paso, para poder visualizar las señales de los canales y comprender de una forma directa, mediante el monitoreo en LCD, terminal y LEDs de la misma tarjeta de desarrollo o con circuitería adicional.
La decodificación de circuitos de memoria o puertos, se puede realizar con circuitos adicionales como el clásico 74HC138, con una GAL, o realizar la decodificación por programa y sólo proporcionar las señales de selección de circuito (CS0, CS1, etc.), como se hace en otros dispositivos. Ver [2].
El diagrama de flujo UML general propuesto, es el siguiente:
Se proponen 2 tarjetas tipo shield para Arduino o compatibles: una tarjeta de un banco de 8 memorias y una tarjeta de un banco de 8 puertos.
+5V 18 20
M1 16 15 14 13 2 1 2 1 12 11 10 9 8 7 6 5 4
PTA0 PTA1 PTA2 PTA3 PTA4 PTA5 PTA6 PTA7
ARM M0+
PTC7 PTC6 PTC5 PTC4 PTC3 PTC2 PTC1 PTC0
PTB0 PTB1 PTB2 PTB3 PTB4 PTB5 PTB6 PTB7 VSS
PTD0 PTD1 PTD2 PTD3 PTD4 PTD5 PTD6 PTD7
+3.3V VCC 3 12 11 10 9 8 7 6 5
CE/PROG OE A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10
VCC VPP Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 GND
24 21
1 11
9 10 11 13 14 15 16 17
2 3 4 5 6 7 8 9
12
U2 OC C 1D 2D 3D 4D 5D 6D 7D 8D 74HC573
M2716-1F1
R2 1Q 2Q 3Q 4Q 5Q 6Q 7Q 8Q
19 18 17 16 15 14 13 12
1 2 3 4 5 6 7 8
BAR1 16 15 14 13 12 11 10 9
Res Pack3 330
1 2 3 4 5 6 7 8 9 10 11 12
24 23 22 21 20 19 18 17 16 15 14 13
LED_BAR12_R
12 11 10 9 8 7 6 5
5 6 7 8 9
8
9 10 11 12 13 14 15 16
10 11
ARM_M0+
VDD PTE0 PTE1 PTE2 PTE3 PTE4 PTE5 PTE6 PTE7
8 7 6 5 4 3 2 1 23 22 19
U1
+3.3V VCC VCC
R2 Res Pack3 1K
8 7 6 5 4 3 2 1 13 14 15 16 17 18 19 20 21 22 23 24
BAR2 LED_BAR12_R
9 8 7 6 5 4 3 2 1 12 11 10
El diagrama eléctrico propuesto para las memorias, es el anterior.
Cuando las memorias de un banco son del mismo tamaño, la decodificación es sencilla, sin embargo, se pueden combinar tamaños, de tal forma que mediante un circuito combinatorio se puedan seleccionar o por medio de software. Ver [3]-[4].
BUS DATOS Se pueden eliminar las compuertas y realizar la decodificación por software (selección)
3. Diseño de un Conjunto de Instrucciones Las instrucciones RISC son de tamaño fijo, por ejemplo de 32 bits, utlizan del orden de 32 registros de propósito general y funcionan con triadas en sus operandos, para este diseño se utlizarán 4 instrucciones de 8 bits, de los cuales 2 bits son del tipo de instrucción(4). En algunos caso tendremos operandos de 2 bits(4 registros) y en otro caso 4 bits para datos inmediatos Las instrucciones que se proponen de tipo RISC, son muy sencillas: BIT 0 BIT 1
ST 01 SUB 11
LDR # 00 ADD 10
La instrucción de Carga inmediata (LDR #) se define por los dos bits menos significativos, los siguientes 2 bits permiten seleccionar el registro de destino (R0-R3) y los 4 bits más significativos corresponden al dato inmediato. Para la instrucción de suma (ADD), los dos bits menos significativos de acuerdo a la tabla de bit0 y bit1 nos indican que es una suma, los dos bits siguientes permiten seleccionar el registro fuente1 (R0-R3), los
2 bits siguientes corresponden al segundo registro fuente2 (R0-R3) y los 2 bits más significativos corresponden al registro destino (R0-R3). Ver [5]. Un ejemplo de programa a comprobar sería: ; Opcodes: Datoi reg ldr LDR
R0,#6
; 0110 00 00 0x60
LDR
R1,#7
; 0111 01 00 0x74 ;R2 R1 R0 ADD
ADD
R2,R1,R0
; 10 01 00 10 0x92
END
El programa fuente en lenguaje C, es el siguiente: #include "mbed.h" BusOut adress(D0,D1,D2,D3,D4,D5,D6,D7,D8,D9,D10,D11,D12,D13,D14,D15); BusIn data(PTC7,PTC0,PTC3,PTC4,PTC5,PTC6,PTC10,PTC11); DigitalOut OC(PTC13); Serial terminal (USBTX, USBRX); // tx, rx (UART0) char i=0; int PC=0; int IR[8]={0x60,0x74,0x92,0x00,0x00,0x00,0x00,0x00}; char regis[4]={0,0,0,0}; class process { public: void deco(void) {
char inst;
char regs1,regs2,regd; char datoi; inst=IR[i]&0x03; switch (inst) {
case 0: //LDR {
regd=IR[i]&0X0C;
regd=regd>>2; datoi=IR[i]&0XF0; datoi=datoi>>4; regis[regd]=datoi; break;
}
case 1: {break;} case 2: //ADD { regs1=IR[i]&0X0C; regs1= regs1>>2; regs2=IR[i]&0X30; regs2= regs2>>4; regd=IR[i]&0XC0; regd= regd>>6; regis[regd]= regis[regs1] + regis[regs2]; break;
}
case 3: {break;}
}
terminal.printf("\n\r inst=%d regd=%d datoi=%d %d\n\r",inst,regd,datoi,regis[regd]); }}; int main(){ OC=0; //Señal de lectura habilitada(Memorias ROM) terminal.printf("
Registros \n\r");
terminal.printf("PC IR RO R1 R2 R3 \n\r"); while(1)
{
data= PC;
terminal.printf("%04X ",PC); terminal.printf("%02X %02X %02X %02X %02X\r",IR[i], regis[0],regis[1],regis[2],regis[3]);
adress = PC++; process myprocess; myprocess.deco(); i++;
wait(3);
} } Decodificación y Ejecución (Diagramas de flujo) Pipeline [6]: Monitoreo en barras de LEDs, LCD de segmentos y una terminal virtual Interfaz gráfica para monitorear memoria y registros. Imágenes de MBED y ejecutando programa Se puede tomar el lenguaje ensamblador de algún microprocesador para verificar los ciclos de máquina, los ciclos instrucción, el ciclo de búsqueda, la decodificación, el pipeline, así como la ejecución, sin embargo, el potencial del emulador se puede aprovechar para diseñar un lenguaje propio con instrucciones RISC o CISC, para comprender mejor los concepto y sus diferencias. Conclusiones 1.-El uso de esta herramienta facilita la explicación de conceptos y la realización de prácticas con el uso de los canales de una computadora, que son emulados en un microcontrolador. 2.-Cuando el alumno toma el control de la parte interna de un procesador, permite que no tan sólo pueda introducir los códigos que el microprocesador deba interpretar, sino que él mismo pueda realizar las funciones de decodificación y ejecución, así como diseñar su propio procesador e instrucciones, lo que le proporciona una formación de arquitecto de computadoras. 3. El rendimiento debe medirse en términos del promedio de ciclos ARM de reloj por operación emulada y velocidad sobre el emulador original.
Referencias [1] http://emulator101.com/ [2] http://wiki.qemu.org/Main_Page [3] http://www.nand2tetris.org/tutorials/PDF/CPU Emulator Tutorial.pdf
[4] http://en.wikipedia.org/wiki/Emulator [5] Antulio Morgado et al “Propuestas para Cursos de Circuitos Digitales y de Microcontroladores en ICE-ESIMEz”, (EDU-15) RVP-AI/2013 del IEEE sección Mex. [6] http://fms.komkon.org/EMUL8/HOWTO.html [7] Lluís Ribas-Xirgo,"Yet Another Simple Processor (YASP) for Introductory Courses on Computer Architecture", Member IEEE; IEEE TRANSACTIONS ON INDUSTRIAL ELECTRONICS, VOL. 57, NO. 10, OCTOBER 2010. [8] Michel Kinsy et al "Time-Predictable Computer Architecture for Cyber-Physical Systems: Digital Emulation of Power Electronics Systems" 2011 32nd IEEE Real-Time Systems Symposium.
[9] FANG Ming, et al "High Performance X86 Emulation IO Architecture on Heterogeneous Processor Platform", 2010 International Conference on Computational and Information Sciences, IEEE.
3. Diseño de un Conjunto de Instrucciones Las instrucciones RISC son de tamaño fijo, por ejemplo de 32 bits, utlizan del orden de 32 registros de propósito general y funcionan con triadas en sus operandos, para este diseño se utlizarán 4 instrucciones de 8 bits, de los cuales 2 bits son del tipo de instrucción(2 2=4 instrucciones). En algunos caso tendremos operandos de 2 bits(22=4 registros) y en otro caso 4 bits para datos inmediatos(2 4=16 valores) Las instrucciones que se proponen de tipo RISC, son muy sencillas: Criterios de diseño: RISC/CISC Longitud de palabra del procesador Número de registros Tamaño de los registros Número de instrucciones Tamaño de las instrucciones Matriz de instrucciones RISC Longitud de palabra del procesador
32
4
Número de registros
32
4
Tamaño de los registros
32
32
Número de instrucciones
50
4
Tamaño de las instrucciones
32
8
Matriz de instrucciones
U1
18 CE/PROG VCC 20
View more...
Comments