Documente Academic
Documente Profesional
Documente Cultură
14 de marzo de 2010
Contenido
1.1 Memoria descriptiva......................................................................................1
1.1.1 Objeto.......................................................................................................................... 1
1.1.2 Antecedentes...............................................................................................................1
1.1.3 Justificación................................................................................................................. 1
1.1.4 Introducción.................................................................................................................1
1.1.5 El Nios II...................................................................................................................... 2
1.1.6 Gestión de excepciones..............................................................................................3
1.1.7 Conexión y acceso a memoria....................................................................................6
1.1.8 Conexión y acceso a periféricos..................................................................................7
1.1.9 Red Avalon..................................................................................................................8
1.1.10 Juego de instrucciones............................................................................................10
1.1.11 Programación del Nios II.........................................................................................12
Memoria del microprocesador Nios II
1.1.2 Antecedentes
En proyectos afines se había trabajado con microprocesadores de 8 bits configurables sobre
FPGAs, pero no con procesadores de propósito general de 32 bits y alto rendimiento, unos 420 DMIPS.
1.1.3 Justificación
El conocimiento del microprocesador resulta fundamental para completar el desarrollo de los
periféricos de control de la etapa posterior.
1.1.4 Introducción
El fabricante Altera proporciona una infraestructura completa para crear sistemas
microprocesador embebidos, completamente a medida según las necesidades del diseñador, por medio de
la combinación de una serie de componentes configurables sobre sus FPGAs.
Para ello, proporciona un entorno específico, al que denomina SOPC Builder, que permite la
definición y configuración a medida del sistema microprocesador Nios II, y que gracias a la herramienta
de síntesis Quartus II puede ser implementado directamente sobre una FPGA de la marca.
NIOS II SYSTEM
NIOS II (CORE)
MEMORY
PERIFERICS INPUT / OUTPUT
PROGRAM / DATA
Este sistema microprocesador estará compuesto por: el núcleo procesador Nios II, memoria
interna de programa y de datos, periféricos integrados e interfaces para memoria externa y/o entrad/salida.
Al tratarse de un sistema flexible que puede ser adaptado a las necesidades específicas de cada
diseño, no sólo posibilita ajustar su tamaño al de un determinado dispositivo, sino que deja decidir al
diseñador cuando una implementación se debe realizar en software y cuando en hardware, permitiendo
elevar el rendimiento y ajustar los costes.
1
Memoria del microprocesador Nios II
1.1.5 El Nios II
El Nios II es un núcleo procesador configurable que se puede implementar en alguna de las tres
versiones disponibles según se busque minimizar el consumo de recursos de la FPGA o maximizar el
rendimiento del procesador:
– El Nios II/f (“fast”) es la versión diseñada para alto rendimiento, y que con un “pipeline” de 6
etapas proporciona opciones específicas para aumentar su desempeño, como memorias caché de
instrucciones y datos, o una unidad de manejo de memoria (MMU, Memory Management Unit).
– El Nios II/s (“standard”) es la versión con “pipeline” de 5 etapas que dotada de unidad aritmético-
lógica (ALU, Arithmetic Logic Unit) busca combinar rendimiento y consumo de recursos.
– El Nios II/e (“economy”) es la versión que requiere menos recursos de la FPGA, sin “pipeline” y
muy limitada, dado que carece de las operaciones de multiplicación y división.
Cada una de estas versiones se completa con una serie de componentes, memoria y periféricos,
por medio de su interconexión a través de un bus de sistema al que denominan “Avalon Switch Fabric”,
para obtener un sistema Nios II completo en un chip (SOC, System On Chip).
Características y arquitectura
2
Memoria del microprocesador Nios II
De este modo, se encuentra formado por una serie de unidades funcionales, dependiendo de la
versión implementada. Entre estas, las principales son: los registros, la unidad aritmético-lógica, la
interfaz para instrucciones definidas por el usuario, el controlador de excepciones, el bus de instrucciones,
el bus de datos, la memoria caché de instrucciones y datos, la interfaz de acoplamiento directo de
memoria de instrucciones y datos y el módulo de depuración JTAG.
– Excepciones software:
– Instrucción trap (“software trap”): se produce cuando en un programa aparece una instrucción
trap. Lo que se utiliza para transferir el control a un programa diferente, como un sistema
operativo.
3
Memoria del microprocesador Nios II
– Excepciones hardware:
2. Comprobar que la instrucción que estaba siendo ejecutada cuando se produjo la interrupción era
una instrucción “trap”, siendo esta la correspondiente a la dirección de retorno de excepción (EA)
menos 4, y poder lanzar la rutina apropiada.
3. De otro modo, la excepción habrá sido provocada por una instrucción no implementada, y se
podrá programar un algoritmo que la emule.
Controlador de interrupciones
El Nios II incluye en todas sus versiones un controlador interno de interrupciones (ICC), y ofrece
la posibilidad de configurar un bloque controlador de interrupciones externo (EIC).
Cuando se produce una petición de interrupción (IRQ, Interrupt ReQuest), se realiza el siguiente
proceso:
2. Se salva el estado de la CPU, valor del contador de programa e información de estado, para poder
1 Los niveles de prioridad se establecen para resolver el conflicto que aparece cuando se producen varias interrupciones de
forma simultánea o mientras el microprocesador se encuentra atendiendo otra interrupción.
4
Memoria del microprocesador Nios II
6. Se reanuda la ejecución del programa, una vez finalizada la rutina de atención de interrupción.
Hay que tener en cuenta que, para que se pueda generar una interrupción, se deben cumplir las
siguientes tres condiciones:
– Que se encuentre activado el bit (PIE) del registro de estado que habilita las interrupciones de
forma global.
– Que se produzca una llamada a una de las entradas de atención de interrupción (IRQ).
5
Memoria del microprocesador Nios II
para instrucciones y datos, con lo que se corresponde Arquitectura Harvard: se utilizan buses
independientes para comunicar la CPU con la
con una arquitectura tipo Harvard. memoria de instrucciones (programa) y con la
memoria de datos, con lo que aunque se
En este tipo de conexión, el bus de necesitan más terminales, se reducen los
instrucciones se utiliza para leer el programa, situado tiempos de acceso, al producirse el acceso
simultáneo o instrucciones y datos.
en memoria, que debe ser ejecutado por el procesador,
mientras que el bus de datos proporciona acceso a la Arquitectura Von-Newmann: se utiliza un único
bus tanto para instrucciones como para datos, lo
diferentes bloques de memoria y a los periféricos del que reduce el número de terminales a costa de
sistema. la velocidad, dado que se encuentra limitada por
el uso compartido del bus entre instrucciones y
Sin embargo, existen tres modos posibles de datos. Además, la longitud de las instrucciones
está limitada por la longitud de los datos, con lo
conexión con memoria: que el procesador debe realizar varios accesos
a memoria para buscar instrucciones complejas.
– Conexión de memoria a través de la red
Avalon, tanto de memoria interna como externa.
– Conexión directa de bloques de memoria interna, con lo que se proporciona un rápido acceso a
memoria.
El Nios II puede incluir tanto caché de datos (Nios II/f) como de instrucciones (Nios II/f y Nios
II/s), implementadas en los bloques de memoria del chip FPGA.
La inclusión de estas memorias caché aumenta el rendimiento de forma significativa, sobre todo
cuando la mayoría de la memoria principal se sitúa en un chip SDRAM externo.
6
Memoria del microprocesador Nios II
7
Memoria del microprocesador Nios II
Addresable memory
FFFFFFFF FFFFFFFF
PERIFERIC
OUTPUT
PERIFERIC
MEMORY
INPUT
00000000 00000000
IB DB
Ilustración 4: Organización
de memoria y periféricos en
el Nios II
Dado que el conjunto de periféricos y la capacidad de memoria son configurables, el mapa de
direcciones de memoria y periféricos depende del sistema diseñado, estableciéndose en el momento de
generar el sistema, al igual que las direcciones de reset e interrupción.
Periféricos estándar
Así, todas aquellas tareas cuyo rendimiento sea crítico, pueden ser implementadas en hardware a
través del desarrollo de un periférico a medida. Con lo que se obtiene un doble beneficio, un mayor
desempeño gracias al carácter concurrente de la implementación hardware y se libera al procesador para
realizar otras funciones en paralelo, mientras el periférico procesa los datos.
La integración de periféricos a medida con el sistema procesador Nios II presenta una serie de
alternativas según las necesidades específicas del diseño, pasando en la mayoría de los casos, por
implementar una determinada interfaz de la red Avalon.
Al igual que se pueden definir periféricos a medida, el Nios II también ofrece la posibilidad de
añadir instrucciones propias a la unidad aritmético lógica (ALU), sobre todo pensando en aplicaciones de
procesamiento digital de señales (DSP, Digital Signal Processing).
8
Memoria del microprocesador Nios II
– Conexión en “Bus”: se basa en la conexión de maestros y esclavos por medio de una unidad de
arbitraje común, lo que permite operar a frecuencias relativamente altas a costa de perder la
concurrencia.
– Conexión “Full Crossbar Switch”: se basa en la conexión directa de maestros y esclavos por
medio de una matriz de conexiones, lo que permite transacciones concurrentes entre los
diferentes elementos del sistema, siendo uno de sus usos principales las aplicaciones de
computación de alto rendimiento.
Altera, basándose en una arquitectura “Partial Crossbar Switch”, implementa una serie de
interfaces, a las que designa como Avalon, que facilitan la interconexión de componentes en sistemas
complejos, y permiten la interconexión de sistemas concurrentes, gracias a su estructura multimaestro.
MEMORY
NIOS II NIOS II PROGRAM / DATA
MASTER SLAVE
CONTROL BUS
SYSTEM BUS DATA BUS
DMA
STREAMING VIDEO SOURCE FILTER
VIDEO SINK
Con esta configuración se reduce la carga computacional del procesamiento de vídeo al realizar
9
Memoria del microprocesador Nios II
las etapas de preprocesado por hardware a través de una conexión en streaming, donde los datos se
transfieren de forma secuencial y directa desde la fuente de vídeo hasta memoria.
Por otro lado, la conexión al bus del sistema permite que el control sea realizado por el
microprocesador y facilita el intercambio de información con memoria, posibilitando el postprocesado
final de la imagen mediante su programación en un lenguaje de alto nivel, lo que eliminaría las
dificultades y costes asociados a su desarrollo en hardware, y daría una mayor flexibilidad al sistema.
Interfaces Avalon
– La “Avalon Streaming Interface” (Avalon-ST) es una interfaz que soporta un flujo de datos
unidireccional, incluyendo streams multiplexados, paquetes y datos DSP.
– La “Avalon Clock” es una interfaz que envía o recibe señales de reloj y reset para sincronizar
interfaces y proveer conectividad de reset.
– La “Avalon Interrupt” es una interfaz que permite que los componentes envíen señales de eventos
a otros componentes.
– La “Avalon Conduit” es una interfaz que proporciona señales para ser llevadas fuera del nivel del
SOPC Builder donde poder conectar otros módulos diseñados sobre la FPGA o a los terminales
de la misma.
Así, un componente puede incluir una o varias de estas interfaces, o varias instancias de la misma
interfaz, posibilitando la interacción de sistemas heterogéneos complejos.
10
Memoria del microprocesador Nios II
– Instrucciones lógicas: realizan operaciones lógicas ("and", "or", "xor", "not") con los datos que se
encuentran en los registros o con un valor dado.
11
Memoria del microprocesador Nios II
– Instrucciones de control: instrucciones especiales para leer y escribir los registros de control.
Modos de direccionamiento
– Direccionamiento indirecto de registro: la dirección efectiva del operando viene dada como el
contenido de un registro especificado en la instrucción. Por tanto, es equivalente al modo con
desplazamiento donde el valor de desplazamiento es igual a 0.
Al utilizar este entorno (“framework”) se emplea una capa de software (HAL, Hardware
Abstraction Layer) que oculta los detalles de la configuración hardware, haciendo transparente al
programador el desarrollo de aplicaciones. Además, esta capa HAL interpreta la prioridad de las
interrupciones desde IRQ0 a IRQ3, para lo que requiere de la configuración de un temporizador.
12
Memoria del microprocesador Nios II
Identificación de periféricos
El carácter configurable del Nios II exige que en todo programa se presente una primera etapa en
la que se han de definir todos y cada uno de los periféricos del sistema, por medio de las direcciones que
se les asignaron durante la configuración.
Esto facilita la comprensión del programa, aumenta su reusabilidad y, sobre todo, evita errores, al
identificar cada uno de los periféricos con su correspondiente dirección de memoria, permitiendo su
tratamiento como punteros de acceso a periféricos.
.include "nios_macros.s"
.global _start
_start:
movia r2, pi8
movia r3, po8
loop:
ldbio r4, 0(r2)
stbio r4, 0(r3)
br loop
# // Programa equivalente en C
# // Refleja la posición de los interruptores (Switches)
# // a traés de los indicadores (LEDs)
#
# #define Switches (volatile char *) 0x0003000
# #define LEDs (char *) 0x0003010
#
# void main() {
# while (1)
# *LEDs = *Switches;
# }
Gestión de la pila
La pila (“stack”) es un segmento de memoria que se utiliza para almacenar la información sobre
las llamadas a subrutinas que se encuentran en ejecución en un programa. Y aunque su propósito primario
es almacenar las direcciones de retorno, con el uso de compiladores puede ser utilizada para funciones
adicionales por medio del aumento del tamaño del bloque de apilamiento (“frame”).
Cuando se llama a una subrutina (“call”) se almacena la dirección de retorno en el registro r31
(RA, Return Address) para volver cuando se finaliza la ejecución de la misma (“ret”). Por tanto, dado que
la llamada a subrutinas no se gestiona a través de la pila (“stack”), si se pretende realizar llamadas
anidadas a subrutinas habrá que realizar su gestión de forma manual.
13
Memoria del microprocesador Nios II
Stack M anagement
00007000
SP0
STACK
SP
MEMORY
00003000
Dado que la memoria se llena desde sus posiciones inferiores, para evitar errores en la gestión de
la pila debido a su crecimiento sobre posiciones de datos, se recomienda inicializar el puntero de pila (SP,
Stack Pointer) en la dirección más alta de memoria y hacerla crecer hacia direcciones inferiores.
.global _start
_start:
br main
nop
nop
nop
nop
nop
nop
nop
nop
# Programa principal
main:
# Inicialización del puntero de pila (SP)
movia SP, SP0
# Llamada a subrutina
call subr0
# Programa
movia r2, PI8
movia r3, PO8
loop:
ldbio r4, 0(r2)
stbio r4, 0(r3)
br loop
# Subrutinas
14
Memoria del microprocesador Nios II
subr0:
# Gestión de la pila
# Se apila la dirección de retorno (“push”)
subi SP, SP, 4 # decrementa el puntero de pila
stw RA, 0(SP) # almacena la dirección de retorno
# Se llama a la subrutina (“call”)
call subr1
# Se desapila la dirección de retorno (“pop”)
ldw RA, 0(SP) # restaura la dirección de retorno
addi SP, SP, 4 # incrementa el puntero de pila
# Operación
addi r6, r6, 1
ret
subr1:
# Gestión de la pila
subi SP, SP, 4
stw ra, 0(SP)
call subr2
ldw ra, 0(SP)
addi SP, SP, 4
# Operación
addi r6, r6, 1
ret
subr2:
addi r6, r6, 1
ret
Gestión de interrupciones
En el Nios II, el control de interrupciones se realiza por medio de los registros de control, que
requieren del uso de unas instrucciones de lectura y escritura especiales, donde:
– La habilitación global de interrupciones se realiza por medio del primer bit del registro ctl0 (PIE).
– La desinhibición de cada una de las interrupciones (IRQ0 a IRQ31) se controla a través de los bits
del registro ctl3 (IENABLE).
– Las interrupciones pendientes de atención se controlan a través de los bits del registro ctl4
(IPENDING).
La lectura y escritura de los registros de control se realiza por medio de las instrucciones rdctl y
wrctl, de tal modo que:
– rdctl rC, ctlN: lee el valor del registro de control N y lo almacena en el registro rC.
Dado que cuando se produce una interrupción: primero se almacena la dirección de la próxima
instrucción en el registro de retorno de excepción (EA) y segundo se cancela la ejecución de la instrucción
en curso para, finalmente, saltar a la dirección de atención de interrupción; la dirección de retorno no
refleja la posición real en la que debe reanudarse la ejecución del programa y hay que disminuir en 4 el
valor del registro (EA), antes de salir de la rutina de atención de interrupción, para ejecutar la instrucción
que fue abortada con anterioridad.
15
Memoria del microprocesador Nios II
# Direcciones de entrada/salida
.equ PI8, 0x00003000
.equ PO8, 0x00003010
# Máscara de interrupciones
.equ PI8IM, 0x00003008 # Máscara de interrupciones
.global _start
_start:
br main
nop
nop
nop
nop
nop
nop
nop
br interrupt # dirección +0x0020
# Programa principal
main:
# Inicialización del puntero de pila
movia sp, SP0
# Inicialización de la máscara de interrupción de PI8
movia r7, PI8IM
movi r5, 0b1
stbio r5, 0(r7) # activa la interrupción para el interruptor 0
# Desinhibición de interrupciones (IRQ)
movi r5, 0x0002 # desinhibición de la interrupción (ienable(1)=1)
wrctl ienable, r5
movi r5, 0x0001 # desinhibición de interrupciones (PIE=1)
wrctl status, r5
# Programa
movia r2, PI8
movia r3, PO8
loop:
ldbio r4, 0(r2)
stbio r4, 0(r3)
br loop
# Atención de interrupciones
interrupt:
# Se encienden todos los LEDs
movi r4, 0x00FF
stbio r4, 0(r3)
16