CU4 PROYECTO CU4 DISEÑO EN VHDL DE MICROPROCESADOR ELEMENTAL CON UN REGISTRO INTERNO DE DATOS PARA REALIZAR OPERACIONES INTERNAS BÁSICAS. SE AGREGA A PARTIR DE ESTE PROYECTO, UN DIVISOR DE FRECUENCIAS DIV_CLK PARA PODER MODIFICAR LA FRECUENCIA DE RELOJ A LA ENTRADA DEL MICRO.
MEMORIA MEMORIA PC16R X 0000 MAR CU4 CLK DIV_CLK CLK_UP16 up16 FPGA RST BUS DIR MEM RX IR CPU MDRO MDRI BUS CONTROL BUS DATA MEM IN BUS DATA MEM OUT
CU4 SET DE INSTRUCCIONES EMPLEANDO EL REGISTRO RX INSTRUCCIONES QUE INSUMEN UNA SOLA POSICIÓN DE MEMORIA DE PROGRAMA: (UN OPERANDO) CLR RX INC RX DEC RX NOP RST -- Borrar contenido de registro RX (información en posición MEMCODE). -- Incrementar contenido de registro RX (información en posición MEMCODE). -- Decrementar contenido de registro RX (información en posición MEMCODE). -- No realiza ninguna operación (los registros internos quedan inalterados.) -- Borrar el contenido del contador de programa PC16R. INSTRUCCIONES QUE INSUMEN DOS POSICIONES DE MEMORIA DE PROGRAMA: (DOS OPERANDOS) LDI RX -- Cargar contenido de memoria de programa MEMCODE+1 en registro RX.
CU4 PSEUDO CÓDIGO DESCRIPCIÓN CLR RX (RX) <- 0 Borrar el contenido previo de RX. INC RX (RX) <- (RX) +1 Incrementar el contenido previo de RX DEC RX (RX) <- (RX) -1 Decrementar el contenido previo de RX. LDI RX (RX) <- (MEMCODE+1) Cargar a RX con el contenido que tiene la siguiente posición de memoria de programa que es MEMCODE+1. NOP No realiza ninguna operación. RST (PC16R) <- X 0000 Borrar el contador de programa. (Inicia el programa desde el principio).
CU4 POSICIÓN DE MEMORIA MEMCODE PC16 MAR BUS DE DIRECCIONES POSICIÓN DE MEMORIA MEMCODE +1 POSICIÓN DE MEMORIA MEMCODE + 2... MEMORIA DE PROGRAMA POSICIÓN DE MEMORIA MEMCODE + N POSICIÓN DE MEMORIA MEMDATA IR MDRI BUS DE DATOS DE ENTRADA POSICIÓN DE MEMORIA MEMDATA +1 POSICIÓN DE MEMORIA MEMDATA + 2... MEMORIA DE DATOS POSICIÓN DE MEMORIA MEMDATA + M up16
CU4 Trabajos a realizar por el microprocesador Reset BÚSQUEDA DE LA INSTRUCCIÓN DECODIFICACIÓN DE LA MISMA EJECUCIÓN DE LA INSTRUCCIÓN
CU4 Subtrabajos a realizar por el microprocesador 1 2 3 4 5 6 DIRECCIONAR LA 1RA. POS.DE MEMORIA DE PROGRAMA (MEMCODE): PC16 <= X 0000 (i=0) LEER EL DATO: MDRI <= (MEMCODE(i)) TRANSFERIR AL REGISTRO IR : IR <= MDRI. DECODIFICAR SU CONTENIDO: SI HAY QUE LEER LA SIGUIENTE POS. DE MEMORIA: INCREMENTAR PC16 : (i= i+1) LEER DATO: MDRI <= (MEMCODE(i)+1) TRANSFERIR A REGISTRO RX : EJECUTAR LA MÁQUINA DE ESTADO. INCREMENTAR PC16 : (i=i+1). 7 VOLVER A EJECUTAR PUNTO (2) 2
CU4 IR 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 00000000 = CLR RX 00000001 = INC RX 00000010 = LDI RX 00000011 = DEC RX 00000100 = NOP 10000000 = RST TODOS EN 0
CU4 CONTENIDO DEL ARCHIVO RAM.HEX PARA ESTE PROYECTO Contenido de la memoria de programa a verificar. Instrucciones cargadas en RAM: LDI RX, 0007 DEC RX DEC RX DEC RX NOP CLR RX INC RX INC RX LDI RX, 0006 RST
Descripción en VHDL de un registro-contador de 16 bits preseteable (PC16R)
PC16R FPGA clockpc opselecrpc(1..0) GENERADOR DE ESTÍMULOS DESDE TEST BENCH entradapc salidapc 16 16 resetpc PC16R
PC16R
PC16R TEST-BENCH DE PC16R
PC16R
PC16R
PC16R opselecpc = 11 ó 00 no modifican la salida
IR IR FPGA clockir GENERADOR DE ESTÍMULOS DESDE TEST BENCH escribirir entradair salidair 16 16
IR
IR TEST-BENCH DE IR
IR
IR
CU4 RESET EJECUTAR EJECUTAR EJECUTAR EJECUTAR EJECUTAR SI SI SI SI SI BUSCAR INSTRUCCIÓN ES RST? NO ES LDI RX? NO ES CLR RX? NO ES INC RX? NO ES DEC RX? NO ES NOP? SI
CU4
CU4
CU4
CU4
CU4
CU4
CU4
CU4
CU4
CU4
CU4
CU4
CU4
DIV_CLK DIVISOR DE FRECUENCIA DE RELOJ PARA MICRO CU4 Ejemplo: clk_in_div = 50 MHz clk_out_div = 5 MHz DIV_CLK_TST es lo mismo pero con clk_out_div = 1 Hz donde clk_out_div conmuta cuando counter = 24.999.999.
CU4 REPORTE DEL COMPILADOR
DIV_CLK DIVISOR DE FRECUENCIA DE RELOJ PARA MICRO CU4 clk_in_div = 50 MHz clk_out_div = 5 MHz
CU4 Diagrama temporal de la simulación de CU4 (primera parte)
CU4 LDI RX, 0007 Inicio y trabajos con la primera instrucción (0200) DEC RX Trabajos con la 2da, 3ra y 4ta instrucción (0300)
CU4 CLR RX NOP Trabajos con la sexta instrucción (0000) Trabajos con la quinta instrucción (0000)
CU4 INC RX RST Trabajos con la 7ma y 8va instrucción (0100) LDI RX, 0006 Trabajos con la novena instrucción (0200)
CU5 PROYECTO CU5 DISEÑO EN VHDL DE MICROPROCESADOR ELEMENTAL CON UN REGISTRO INTERNO DE DATOS CON ACCESO DIRECTO A LA MEMORIA DE DATOS PARA REALIZAR OPERACIONES DE LECTURA Y ESCRITURA.
MEMORIA MAR MUXMAR PC16R CU5 CLK RST DIV_CLK CLK_UP16 0 up16 FPGA BUS ADDRESS 1 BUS DATA_IN RX IR CPU MDRO MDRI BUS CONTROL BUS DATA_OUT
SET DE INSTRUCCIONES EMPLEANDO EL REGISTRO RX INSTRUCCIONES QUE INSUMEN UNA SOLA POSICIÓN DE MEMORIA DE PROGRAMA: CLR RX INC RX DEC RX RST -- Borrar contenido de registro RX (información en posición MEMCODE). -- Incrementar contenido de registro RX (información en posición MEMCODE). -- Decrementar contenido de registro RX (información en posición MEMCODE). -- Borrar el contenido del contador de programa PC16R. INSTRUCCIONES QUE INSUMEN DOS POSICIONES DE MEMORIA DE PROGRAMA: LDI RX -- Cargar contenido de memoria de programa MEMCODE+1 en registro RX. Nuevas instrucciones LDD RX -- Cargar contenido en el registro RX, desde la dirección de memoria de datos que está contenida en la posición MEMCODE +1 (DIRECCIONAMIENTO DIRECTO). STR RX -- Almacenar contenido del registro RX en la memoria cuya dirección está indicada en la posición MEMCODE +1 (DIRECCIONAMIENTO DIRECTO).
CU5 PSEUDO CÓDIGO DESCRIPCIÓN CLR RX (RX) <- 0 Borrar el contenido previo de RX. INC RX (RX) <- (RX) +1 Incrementar el contenido previo de RX DEC RX (RX) <- (RX) -1 Decrementar el contenido previo de RX. LDI RX (RX) <- (MEMCODE+1) Cargar a RX con el contenido que tiene la siguiente posición de memoria de programa que es MEMCODE+1. RST LDD RX (RX) <- ((MEMCODE+1)) STR RX (MEMDATA) <- (RX) Borrar el contenido del contador de programa. En el contenido de MEMCODE+1 está almacenada la dirección de memoria de datos cuyo contenido debe transferirse a RX. En el contenido de MEMCODE+1 está almacenada la dirección de memoria de datos cuyo contenido debe cargarse con el contenido almacenado en RX.
CU5 IR 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 00000000 = CLR RX 00000001 = INC RX 00000010 = LDI RX 00000011 = DEC RX 00000100 = NOP 10000000 = RST 00000101 = LDD RX 00000110 = STR RX TODOS EN 0 (RX) [(MEMCODE+1)] [(MEMCODE+1)] (RX) *(MEMCODE)+ significa El contenido de la memoria de datos cuya dirección está escrita como contenido de MEMCODE +1
CU5 0000 PC16 MAR BUS DE DIRECCIONES 0001 0002...... MEMORIA DE PROGRAMA 07FF 0800 IR MDRI BUS DE DATOS DE ENTRADA 0801 0802...... MEMORIA DE DATOS 0FFF up16
CU5 INICIALIZACIÓN DE MEMORIA EN BASE AL ARCHIVO RAM.HEX Instrucciones cargadas en RAM: LDI RX, 000E INC RX STR RX, 0800 CLR RX LDD RX, 0800 RST
CU5 INICIALIZACIÓN DE MEMORIA EN BASE AL ARCHIVO RAM.HEX SIMULACIÓN DE LA RAM CON INICIALIZACIÓN PARA ESTE PROYECTO
Descripción en VHDL de un MUX 2:1 de 16 bits de ancho de bus (MUXMAR)
MUXMAR
MUXMAR TEST-BENCH DE MUXMAR
MUXMAR
MUXMAR
CU5
CU5
CU5 SI LAS INSTRUCCIONES SON DE DOS OPERANDOS (LDI, LDD, STR) SE COMPARTE LA RUTINA DE LEER EL OPERANDO DESPUÉS DE LA INSTRUCCIÓN, QUE PUEDE SER DATO (LDI_RX) O UNA POSICIÓN DE MEMORIA (LDD_RX, STR_RX)
CU5 OPERANDO YA LEÍDO. SE DEBE LUEGO DETERMINAR QUE SE HACE SEGÚN LA INSTRUCCIÓN.
CU5 DEFINO DONDE SALTO. SI ES LDI_RX, SÓLO TENGO QUE CARGAR EL DATO ANTERIOR LEÍDO, EN EL REGISTRO RX
CU5 AQUÍ COMIENZA LA MISMA RUTINA PARA LDD_RX Y STR_RX, DONDE HAY QUE DIRECCIONAR LA RAM DE DATOS, PARA LEERLA (LDD_RX) Ó ESCRIBIRLA (STR_RX).
CU5 AQUÍ DECIDO SI LEO O ESCRIBO. SI DEBO LEER LA RAM...
CU5 PARA NO REPETIR ESTADOS APROVECHO PARTE DE LA RUTINA DE LDI_RX SALTO A ESTADO 23 SI DEBO ESCRIBIR LA RAM... HAY QUE: -- ESCRIBIR REGISTRO MDRO. -- SUBIR LA SEÑAL WREN. -- Y LUEGO BAJARLA.
CU5
CU5 DESCRIPCIÓN DE LAS INTERCONEXIONES ENTRE LOS DIFERENTES COMPONENTES, ENTRADAS Y SALIDAS.
CU5 REPORTE DEL COMPILADOR
CU5 Diagrama temporal de todo un período de instrucciones TIEMPO TOTAL DEL CICLO DE INSTRUCCIONES 192 us