15
Cesar Daniel Vivanco Olivera BENEMÉRITA UNIVERSIDAD AUTÓNOMA DE PUEBLA FACULTAD DE CIENCIAS DE LA COMPUTACIÓN

Pico Blaze

Embed Size (px)

Citation preview

Cesar Daniel Vivanco Olivera

BENEMÉRITA UNIVERSIDAD AUTÓNOMA DE PUEBLA

FACULTAD DE CIENCIAS DE LA COMPUTACIÓN

Introducción

PicoBlaze es un micro controlador de 8 bits con arquitectura RISC.

Características

Registros de datos de 16 bits de ancho.

Instrucciones de 1K en el chip programable, con carga automática durante configuración

de la FPGA.

Unidad aritmético-lógica amplia (ALU) con acarreo e indicador Zero en las banderas.

64 bytes de memoria RAM interna.

256 puertos de entrada y salida para fácil expansión y mejora.

31 ubicaciones CALL/RETURN automático en pila.

Rendimiento predecible, siempre dos ciclos de reloj por instrucción, hasta 200 MHz o

100 MIPS en un Virtex-II Pro FPGA.

Respuesta de interrupción rápida, el peor de los casos 5 ciclos de reloj.

Optimizado para arquitectura Xilinx Spartan3 sólo 96 rebanadas y 0,5 a 1 bloque de

RAM.

Soporte en arquitecturas Spartan-6 y Virtex 6 FPGA.

Registros de propósito general

El micro controlador PicoBlaze incluye 16 registros de propósito general de ancho

de byte,

designado como registros s0 a sF. Todas las operaciones de registro son

completamente intercambiables, sin registros reservados para tareas especiales o

sin prioridad sobre cualquier otro registro. No hay acumulador dedicado, cada

resultado se calculó en un registro especificado.

Almacenamiento de Instrucciones de programa

El micro controlador PicoBlaze ejecuta hasta 1024 instrucciones de la memoria en

el

FPGA, típicamente a partir de un solo bloque de memoria RAM. Cada instrucción

PicoBlaze es de 18 bits de ancho. La instrucción se recoge en el diseño de FPGA y

se cargan automáticamente durante el Proceso de configuración de la FPGA.

Unidad aritmético-lógica

La unidad aritmético-lógica realiza todos los cálculos del micro controlador

incluyendo:

• Las operaciones aritméticas básicas, como sumas y restas

• Las operaciones lógicas a nivel de bits, tales como AND, OR y XOR

• Aritmética compara bit a bit y operaciones de prueba

Todas las operaciones se realizan utilizando un operando proporcionada por

cualquier registro especificado (SX). El resultado se devuelve al mismo registro

especificado (SX). Si una instrucción requiere de un segundo operando, a

continuación, el segundo operando es o bien un segundo registro (SY) de 8 bits

inmediata a la constante (kk).

Banderas

Operaciones de ALU afectan a las banderas ZERO y Acarreo. La bandera de cero

indica que el resultado de la última operación resultó en cero. El indicador de

acarreo indica varias condiciones, dependiendo de la última instrucción ejecutada.

La bandera INTERRUPT_ENABLE permite la entrada de interrupción.

Entradas / Salidas

Los puertos de entrada / salida extienden las capacidades del micro controlador

PicoBlaze y le permiten conectarse a un conjunto de periféricos de encargo o a

otra lógica FPGA.

El micro controlador soporta hasta 256 puertos de entrada y 256 puertos de salida

o una combinación de puertos de entrada / salida.

La salida ID_de_Puerto proporciona la dirección del puerto. Durante una ENTRADA

operación, el micro controlador PicoBlaze lee datos desde el puerto IN_PORT a un

registro específico, SX. Durante una operación de salida, el micro controlador

PicoBlaze escribe el contenido de un registro SX, al puerto OUT_PORT.

Contador de Programa

El contador de programa (PC) apunta a la siguiente instrucción a ejecutar. Por

defecto, el PC incrementa automáticamente a la siguiente posición de la

instrucción al ejecutar una instrucción. Sólo las instrucciones JUMP, CALL,

RETURN, RETURNI la interrupción y Reset de eventos modificar el comportamiento

predeterminado.

El PC de 10 bits compatible con un espacio máximo de 1024 instrucciones (000 a

3FF hex). Si el PC alcanza la parte superior de la memoria en hexadecimal 3FF, se

da la vuelta a la ubicación 000.

Control de Flujo del Programa

La secuencia de ejecución por defecto del programa puede ser modificado usando

condicional e instrucciones de control de flujo de programa no condicionales.

La instrucción JUMP especifica una dirección absoluta en todo el 1024 instrucción

de espacio del programa.

Las instrucciones CALL y RETURN proporcionan subrutinas para las secciones

utilizadas de

Código. Una instrucción CALL especifica la dirección inicial absoluta de un

subprograma, mientras que la dirección de retorno se mantiene automáticamente

preservada CALL / RETURN de la pila.

Si la entrada de interrupción está activada, un evento de interrupción también

conserva la dirección de adelanto a la instrucción CALL/RETURN mientras el PC es

cargado con el

Vector de interrupción, hex 3FF. Use la instrucción returni en lugar de la

instrucción RETURN

para volver a la rutina de servicio de interrupción (ISR).

Pila CALL/RETURN

La CALL/RETURN almacena hasta 31 direcciones de instrucción, lo que permite

secuencias anidadas permitiendo llamar hasta 31 niveles de profundidad. Dado

que la pila también se utiliza durante para interrumpir la operación, por lo

menos uno de estos niveles debe reservarse cuando las interrupciones son

habilitadas. La pila se implementa como un búfer de circulación separada.

Cuando la pila está llena, se sobrescribe el valor más antiguo. En consecuencia,

no hay instrucciones para el control de la pila o la pila puntero. No se requiere

ninguna memoria de programa para la pila.

Interrupciones El micro controlador PicoBlaze tiene una entrada de interrupción opcional,

permitiendo al micro controlador controlar los eventos externos asíncronos. En

este contexto, "asíncrono"

se refiere a las interrupciones que ocurren en cualquier momento durante un ciclo

de instrucción.

Reset El micro controlador PicoBlaze se restablece automáticamente inmediatamente

después de que el proceso de configuración de la FPGA se completa. Después de

la configuración, la entrada RESET hace que el procesador regrese al estado

inicial. El PC se reinicia a la dirección 0, las banderas se borran, las interrupciones

son desactivadas y la pila de CALL / RETURN se restablece.

Los registros de datos y la memoria RAM bloc de notas no se ven afectados por

Reset.

Señales de la Interfaz Pico Blaze

Las señales de interfaz de alto nivel para el micro controlador PicoBlaze

Señal Dirección Descripción

IN_PORT [7:0] Input Puerto de datos de entrada: Presentar los datos de entrada válidos en este puerto durante una instrucción INPUT. La información se captura en el flanco ascendente de CLK.

INTERRUPT Input Interrupción de entrada: Si la bandera INTERRUPT_ENABLE se establece por el código de la aplicación, genera un evento de alarma al afirmar esta entrada alta durante al menos dos ciclos de reloj. Si la bandera INTERRUPT_ENABLE se borra, se ignora esta entrada.

RESET Input Restablecer entrada: Para reiniciar el micro controlador PicoBlaze y generar un evento de restauración, Afirmar esta entrada de alta durante al menos un ciclo de CLK.

CLK Input Entrada Reloj: La frecuencia puede variar de DC a la máxima de funcionamiento de operación reportada por el software de desarrollo de Xilinx ISE. Todos los elementos sincrónicos son sincronizados desde el borde ascendente del reloj. No hay requisitos del ciclo de reloj en la actividad más allá de los requisitos mínimos de ancho de pulso de la FPGA.

OUT_PORT[7:0] Output Puerto de salida de datos: Los datos de salida aparece en este puerto durante dos ciclos de CLK durante una Instrucción de salida. Captura de datos de producción dentro de la FPGA en el flanco ascendente CLK cuando WRITE_STROBE es alta.

PORT_ID[7:0] Output Port Address: La dirección del puerto de E/S aparece en este puerto durante dos ciclos CLK

en una entrada o una instrucción de salida.

READ_STROBE Output Leer estroboscópica: Cuando afirmación alta, esta señal indica que los datos de entrada en la IN_PORT [07:00] Puerto fue capturado a los datos especificados se registran durante una ENTRADA de la Instrucción. Esta señal se afirmó en el segundo ciclo de CLK de la ENTRADA de dos tiempos de la instrucción. Esta señal se utiliza normalmente para reconocer las operaciones de lectura de FIFO.

WRITE_STROBE Output Escribir Strobe: Cuando afirmado alta, esta señal valida los datos de salida de la OUT_PORT puerto [07:00] durante una instrucción de salida. Esta señal se afirma en el segundo ciclo de CLK de la instrucción OUTPUT de dos tiempos. Captura de datos de salida dentro de la FPGA en el flanco ascendente CLK cuando WRITE_STROBE es alta.

INTERRUPT_ACK Output Reconocimiento de interrupción: cuando afirmó High, esta señal de reconocimiento de que Ocurrió evento de interrupción. Esta señal es afirmada durante el segundo ciclo de CLK del evento de interrupción de dos tiempos. Esta señal se utiliza opcionalmente para borrar la fuente de la entrada de interrupción.

Conjunto de instrucciones PicoBlaze

Instrucción Descripción Función ZERO CARRY ADD sX, kk Add register sX with literal

kk sX sX + kk ? ?

ADD sX, sY Add register sX with register sY

Sx sX + sY ? ?

ADDCY sX, kk (ADDC)

Add register sX with literal kk with CARRY bit

sX sX + kk + CARRY

? ?

ADDCY sX, sY (ADDC)

Add register sX with register sY with CARRY bit

sX sX + sY + CARRY

? ?

AND sX, kk Bitwise AND register sX with literal kk

sX sX AND kk ? 0

AND sX, sY Bitwise AND register sX with register sY

sX sX AND sY ? 0

CALL aaa Unconditionally call subroutine at aaa

TOS PC PC aaa

- -

CALL C, aaa If CARRY flag set, call subroutine at aaa

If CARRY=1, {TOS PC,PC aaa}

- -

CALL NC, aaa If CARRY flag not set, call subroutine at aaa

If CARRY=0, {TOS PC,PC aaa}

- -

CALL NZ, aaa If ZERO flag not set, call subroutine at aaa

If ZERO=0, {TOS PC,PC aaa}

- -

CALL Z, aaa If ZERO flag set, call subroutine at aaa

If ZERO=1, {TOS PC,PC aaa}

- -

COMPARE sX, kk (COMP)

Compare register sX with literal kk. Set CARRY and ZERO flags as appropriate. Registers are unaffected.

If sX=kk, ZERO 1 If sX<kk, CARRY 1

? ?

COMPARE sX, sY (COMP)

Compare register sX with register sY. Set CARRY and ZERO flags as appropriate. Registers are unaffected.

If sX=sY, ZERO 1 If sX<sY, CARRY 1

? ?

DISABLE INTERRUPT (DINT)

Disable interrupt input INTERRUPT_ENABLE 0

- -

ENABLE INTERRUPT (EINT)

Enable interrupt input INTERRUPT_ENABLE 1

- -

Interrupt Event Asynchronous interrupt input. Preserve flags and PC. Clear INTERRUPT_ENABLE flag. Jump to interrupt vector at address 3FF.

Preserved ZERO ZERO Preserved CARRY INTERRUPT_ENABLE 0 TOS PC PC 3FF

-

-

FETCH sX, (sY) (FETCH sX, sY)

Read scratchpad RAM location pointed to by register sY into register sX

sX RAM[(sY)] - -

FETCH sX, ss Read scratchpad RAM location ss into register sX

sX RAM[ss] - -

INPUT sX, (sY) (IN sX, sY)

Read value on input port location pointed to by register sY into register sX

PORT_ID sY sX IN_PORT

- -

INPUT sX, pp (IN)

Read value on input port location pp into register sX

PORT_ID pp sX IN_PORT

- -

JUMP aaa Unconditionally jump to aaa PC aaa - -

JUMP C, aaa If CARRY flag set, jump to aaa

If CARRY=1, PC aaa - -

JUMP NC, aaa If CARRY flag not set, jump to aaa

If CARRY=0, PC aaa

- -

JUMP NZ, aaa If ZERO flag not set, jump to aaa

If ZERO=0, PC aaa - -

JUMP Z, aaa If ZERO flag set, jump to aaa

If ZERO=1, PC aaa

- -

LOAD sX, kk Load register sX with literal kk sX kk - -

LOAD sX, sY Load register sX with register sY

sX sY - -

OR sX, kk Bitwise OR register sX with literal kk

sX sX OR kk ? 0

OR sX, sY Bitwise OR register sX with register sY

sX sX OR sY ? 0

OUTPUT sX, (sY) (OUT sX, sY)

Write register sX to output port location pointed to by register sY

PORT_ID sY OUT_PORT sX

- -

OUTPUT sX, pp (OUT sX, pp)

Write register sX to output port location pp

PORT_ID pp OUT_PORT sX

- -

RETURN (RET)

Unconditionally return from subroutine

PC TOS+1 - -

RETURN C (RET C)

If CARRY flag set, return from subroutine

If CARRY=1, PC TOS+1

- -

RETURN NC (RET NC)

If CARRY flag not set, return from subroutine

If CARRY=0, PC TOS+1

- -

RETURN NZ (RET NZ)

If ZERO flag not set, return from subroutine

If ZERO=0, PC TOS+1

- -

RETURN Z (RET Z)

If ZERO flag set, return from subroutine

If ZERO=1, PC TOS+1

- -

RETURNI DISABLE (RETI DISABLE)

Return from interrupt service routine. Interrupt remains disabled.

PC TOS ZERO Preserved ZERO CARRY Preserved CARRY INTERRUPT_ENABLE 0

? ?

RETURNI ENABLE (RETI ENABLE)

Return from interrupt service routine. Re-enable interrupt.

PC TOS ZERO Preserved ZERO CARRY Preserved CARRY

? ?

RL sX Rotate register sX left sX {sX[6:0],sX[7]} CARRY sX[7]

? ?

RR sX Rotate register sX right sX {sX[0],sX[7:1]} CARRY sX[0]

? ?

SL0 sX Shift register sX left, zero fill sX {sX[6:0],0} CARRY sX[7]

? ?

SL1 sX Shift register sX left, one fill sX {sX[6:0],1} CARRY sX[7]

0 ?

SLA sX Shift register sX left through all bits, including CARRY

sX {sX[6:0],CARRY} CARRY sX[7]

? ?

SLX sX Shift register sX left. Bit sX[0] is unaffected.

sX {sX[6:0],sX[0]} CARRY sX[7]

? ?

SR0 sX Shift register sX right, zero fill sX {0,sX[7:1]} CARRY sX[0]

? ?

SR1 sX Shift register sX right, one fill sX {1,sX[7:1]} CARRY sX[0]

0 ?

SRA sX Shift register sX right through all bits, including CARRY

sX{CARRY,sX[7:1]} CARRY sX[0]

? ?

SRX sX Arithmetic shift register sX right. Sign extend sX. Bit sX[7] Is unaffected.

sX {sX[7],sX[7:1]} CARRY sX[0]

? ?

STORE sX, (sY) (STORE sX, sY)

Write register sX to scratchpad RAM location pointed to by register sY

RAM[(sY)] sX - -

STORE sX, ss Write register sX to scratchpad RAM location ss

RAM[ss] sX - -

SUB sX, kk Subtract literal kk from register sX

sX sX – kk ? ?

SUB sX, sY Subtract register sY from register sX

sX sX – sY ? ?

SUBCY sX, kk (SUBC)

Subtract literal kk from register sX with CARRY (borrow)

sX sX – kk -CARRY ? ?

SUBCY sX, sY (SUBC)

Subtract register sY from register sX with CARRY (borrow)

sX sX – sY -CARRY ? ?

TEST sX, kk Test bits in register sX against

literal kk.

Update CARRY and ZERO flags.

Registers are unaffected.

If (sX AND kk) = 0,

ZERO 1

CARRY odd parity

of (sX AND kk)

? ?

TEST sX, sY Test bits in register sX against

register sX.

Update CARRY and ZERO flags.

Registers are unaffected.

If (sX AND sY) = 0,

ZERO 1

CARRY odd parity

of (sX AND kk)

? ?

XOR sX, kk Bitwise XOR register sX with

literal kk sX sX XOR kk ? 0

XOR sX, sY Bitwise XOR register sX with

register sY sX sX XOR sY ? 0

Procesamiento de Datos

Todas las instrucciones de procesamiento de datos operan en cualquiera de los 16

registros de propósito general. Sólo las instrucciones de procesamiento de datos

modifican el CERO o CARRY banderas según corresponda a la instrucción.

Las instrucciones de procesamiento de datos se componen de los siguientes tipos:

• Instrucciones de Lógica

• Instrucciones aritméticas

• Pruebe y compare las instrucciones

• Desplazamiento y rotación

Complementar/Invertir Registros El micro controlador PicoBlaze no tiene una instrucción específica para invertir los

bits individuales en el registro sX. Sin embargo, el XOR sX, instrucción FF realiza

la operación equivalente.

Complement:

; XOR sX, FF invierte todos los bits en el registro sX,

parecido al complemento

LOAD s0, AA; load register s0 = 10101010

XOR s0, FF; invert contents s0 = 01010101

Invertir o Activar Bit El micro controlador PicoBlaze no tiene una instrucción específica para invertir o

alternar un bit individual o bits dentro de un registro específico. Sin embargo, la

instrucción XOR realiza la operación equivalente. XORing registro sX con un

invierte máscara de bits o alterna bits específicos. Un '1 'en la máscara de bits

invierte o cambia el bit correspondiente al registro sX. Un '0 'en la máscara de bits

deja el bit correspondiente sin cambios.

toggle_bit:

; XOR sX, <bit_mask>

XOR s0, 01; alternar el bit menos significativo en el registro

sX

Borrar Registro El micro controlador PicoBlaze no tiene una instrucción específica para borrar un

registro específico. Sin embargo, el XOR sX, instrucción sX realiza la operación

equivalente. XORing registro sX con ella misma borra registro sX y establece el

indicador ZERO.

XOR sX, SX; limpia registro sX, pone ZERO en la bandera

Set Bit El micro controlador PicoBlaze no tiene una instrucción específica para establecer

un bit individual o bits dentro de un registro específico. Sin embargo, la instrucción

OR realiza la operación equivalente.

set_bit:

; OR sX, <bit_mask>

OR s0, 01; poner bit 0 en el registro s0

Clear Bit El micro controlador PicoBlaze no tiene una instrucción específica para borrar un

bit individual o bits dentro de un registro específico. Sin embargo, la instrucción

AND realiza la operación equivalente.

clear_bit:

; AND sX, <bit_mask>

AND s0, FE; limpiar bit 0 del registro s0

Interrupciones

El procesador PicoBlaze proporciona una única señal de entrada de interrupción.

Si la aplicación requiere múltiples señales de interrupción, se combinan las señales

usando la lógica FPGA simples para formar una señal de entrada de alarma

individual. Después del reinicio, la entrada de interrupción está desactivada y debe

ser activada a través de la instrucción de habilitación de interrupción. Para

deshabilitar las interrupciones en cualquier punto del programa, basta con emitir

una instrucción DISABLE INTERRUPT.

Una vez activada, la señal de entrada de interrupción se debe aplicar por lo menos

dos ciclos de reloj para garantizar que se reconoce, lo que genera un evento de

alarma.

Una interrupción activa hace que el procesador PicoBlaze ejecute inmediatamente

el 3FF LLAMADA a instrucción inmediatamente después de completar la instrucción

que se está ejecutando actualmente. La llamada a la Instrucción 3FF es una

llamada a la subrutina a la última posición de la memoria del programa. La

instrucción en la última ubicación define cómo el código de la aplicación debe

manejar la interrupción. Típicamente, la instrucción en el lugar 3FF es una

posición de salto a una rutina de servicio de interrupción (ISR).

El comando especial returni asegura que el final de una rutina de servicio de

interrupción restaura el estado de los indicadores y controles al permitir que las

futuras interrupciones. Cuando el returni ejecuta la instrucción, los valores de PC

guardados en la pila CALL / RETURN se vuelve a cargar automáticamente al registro

PC. Del mismo modo, las banderas cero y entregamos no han restaurado el flujo

del programa vuelve a la instrucción que sigue a la instrucción donde se realizó la

interrupción.

La entrada de interrupción no es

reconocido hasta que el

La entrada de interrupción no es reconocida hasta que la

Bandera INTERRUPT_ENABLE se establece.

En las funciones de tiempo-críticos o áreas en que la

previsibilidad absoluta es necesario, deshabilite

temporalmente el Interrumpir. Vuelva a activar la alarma

de entrada cuando la función de tiempo crítico es

completa. Siempre regresa de una sub-rutina llame al

RETURN.

La entrada de interrupción es automáticamente

deshabilitado.

Use la instrucción RETURNI para regresar de una

interrupción.

El vector de interrupción es siempre situado en la

ubicación más significativa de la memoria, donde todos

los bits de dirección son queridos. Salta a la interrupción

de la rutina de servicio.

1.-De forma predeterminada, la entrada de interrupción está desactivada. La

instrucción de habilitación de interrupción debe ejecutar antes de que se reconoce

la interrupción.

2.-En este ejemplo, las interrupciones están habilitadas y el micro controlador se

está ejecutando la entrada S1, 01 instrucciones. Simultáneamente a la ejecución

de esta instrucción, la interrupción llega a la entrada de interrupción. El micro

controlador no actúa en la interrupción hasta que se termina de ejecutar la

entrada S1 de 01 instrucciones.

3.- El micro controlador reconoce la interrupción y sustituirá a la ADD s0, s1

instrucción. El PC actual, que apunta a la instrucción ADD s0 s1, se empuja en el

CALL / pila RETURN. Del mismo modo, se conservan las banderas CERO y seguir.

Por otra parte, la bandera INTERRUPT_ENABLE se borra desactivando cualquier

otra interrumpe. Por último, el PC se carga con todas las (3FF) y la PicoBlaze

micro controlador realiza una llamada de rutina de servicio de interrupción a la

última posición en el tienda de instrucciones. Si utiliza una RAM bloque 1Kx18 para

el almacén de la instrucción, el último lugar se 3FF. Si el uso del almacenamiento

de instrucción más pequeño, entonces el vector de interrupción se encuentra

todavía en la última ubicación de instrucciones. El micro controlador también

afirma la Salida INTERRUPT_ACK, lo que indica que se está reconociendo la

interrupción.

4.- El vector de interrupción siempre se encuentra en la última ubicación en el

almacén de instrucciones. En este ejemplo, el programa salta a la rutina de

servicio de interrupción (ISR) a través del SALTO isr instrucción.

5.- Cuando se haya completado, salga de la rutina de servicio de interrupción (ISR)

con el returni especial instrucción. No utilice la instrucción RETURN, que se utiliza

con normalidad subrutina llamada. Los returni Habilitar todos los retornos de la

rutina y de servicio de interrupción para volver a habilitar la entrada de

interrupción, que se desactiva automáticamente cuando se reconoció la

interrupción. Usando returni DISABLE También regresa a la interrupción rutina de

servicio, pero deja la entrada de interrupción deshabilitado.

6.- La instrucción returni restaura las banderas CERO y seguir conservados guardan

durante el paso (3). Del mismo modo, la instrucción returni aparece la parte

superior de la LLAMADA / RETORNO pila en el PC, lo que hace que el micro

controlador reanude la ejecución del programa de instrucción que se adelantó

por la interrupción, ADD s0, s1 en este ejemplo.