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.
Top Related