• No se han encontrado resultados

02 Arquitectura

N/A
N/A
Protected

Academic year: 2020

Share "02 Arquitectura"

Copied!
13
0
0

Texto completo

(1)

2 ARQUITECTURA

Los dsPIC DSC están diseñados para el procesamiento de operaciones matemáticas a alta velocidad, con ayuda de elementos de hardware que manejan procesos intensos con mínima carga del procesador. Para poder sacar provecho de las ventajas que ofrece esta arquitectura, el diseñador debe conocer y entender la arquitectura del chip y los elementos que lo conforman.

2.1 La memoria

El dsPIC DSC posee una arquitectura HarvardI modificada, la cual tiene buses separados para la memoria de programa y la memoria de datos, permitiendo al procesador cargar simultáneamente la instrucción y los datos que usará la instrucción.

En la arquitectura Harvard pura, estos buses se encuentran completamente separados y solamente se puede pasar un dato en un ciclo, siendo esto inadecuado para las necesidades de muchos procesamientos digitales en donde comúnmente lo que se requiere son dos datos; el dato muestreado y el coeficiente por el cual será multiplicado, llevándose a cabo en 2 ciclos de trabajo. Para superar esta restricción la arquitectura Harvard modificada soporta 3 buses: uno para cargar la instrucción (el bus de la memoria de programa) y dos buses para cargar los datos asociados (llamados bus X y bus Y). Esto permite que las instrucciones se lleven a cabo en 1 solo ciclo de instrucción, duplicando el rendimiento en comparación con la arquitectura Harvard pura. En la Figura 2-1 se ilustra la diferencia entre la arquitectura Harvard pura y la modificada.

I

El termino Harvard proviene de la computadora Harvard Mark 1 basada en relevadores, en la cual, las instrucciones se almacenaban en Cintas perforadas y los datos en latches* de relevador.

(2)

Figura 2-1. Arquitectura Harvard modificada.

(3)

2.1.1 Memoria de datos

La memoria de datos está formada por 3 partes: Registros de funciones especiales, RAM estática y memoria de programa mapeada en el espacio de datos. La Figura 2-2 muestra una grafica de la memoria de datos.

2.1.1.1

Registros de funciones especiales

El dsPIC DSC usa registros mapeados en la memoria para configurar, controlar y monitorear varios aspectos de la operación de los dispositivos. Estos registros son conocidos como SFRs (Special Function Registers), y se localizan en los primeros 2 kB de la memoria de datos.

Al escribir o leer en estos registros causa que el DSC realice alguna acción en particular. Por ejemplo, como veremos más adelante, para transmitir un dato por el puerto serie se requiere que la aplicación configure los parámetros de operación escribiendo los datos apropiados en los SFRs del puerto serie. También si la aplicación quiere saber si han llegado nuevos datos, se debe leer el registro de estado del puerto serie.

2.1.1.2

RAM estática (SRAM)

En el dsPIC30F4013, la RAM estática se extiende de la localidad 0x0800 a la 0x0FFF, para un total de 2kB de memoria de acceso aleatorio (Figura 2-2). A diferencia de los SFRs, el leer o escribir en esta memoria no afecta ningún aspecto de la operación de los chips, solo al contenido de la memoria. Las aplicaciones usan esta memoria para almacenar datos que cambiarán durante la ejecución del programa, por ejemplo variables usadas para filtros o buffers que almacenan datos recibidos o datos para escribir.

(4)
(5)

2.1.1.3

Memoria de programa mapeada en el espacio de datos

En algunos algoritmos, particularmente los que se usan para procesamiento digital de señales a menudo es necesario multiplicar coeficientes constantes por datos variables. Debido a que los coeficientes no cambian, podriamos ahorrarnos preciada memoria SRAM si estos coeficientes estuvieran almacenados en la memoria de programa pero que pudieran ser accesibles por el hardware que procesa los datos. Pensando en esto, los dsPIC fueron dotados con esta

(6)

2.1.2 Memoria de programa

La configuración de la memoria de programa varía en los distintos dispositivos de la familia dsPIC, de acuerdo a los recursos disponibles en cada dispositivo en partícular. El diseñador debe consultar las hojas de especificaciones correspondientes. La memoria de programa que se

describe a continuación es del dsPIC30F4013, sin embargo la mayoría de los aspectos del mapa de memoria aplica a toda la familia con pequeñas diferencias en posiciones de dirección de memoria.

La memoria de programa consiste de hasta 4 M Instrucciones de 24 bits (3 bytes cada instrucción), aunque no toda esta memoria está disponible para el usuario. La memoria de programa está dividida en dos secciones principales: El espacio de memoria de usuario

(000000H – 7FFFFEH) y el Espacio de memoria de configuración (800000H - FFFFFEH) como se muestra en la Figura 2-3.

Al inicio del espacio de memoria de programa se encuentra el vector de Reset (en la

dirección 0) seguido de la dirección del punto de entrada de la aplicación (en la dirección 2). Esta secuencia de 2 palabras es ejecutada cuando se resetea el procesador, y básicamente le dice al procesador que salte al inicio del código.

Después a partir de la dirección 4, se encuentran la tabla de vectores de interrupción (IVT) que contienen las direcciones de las rutinas de servicio de interrupción (ISRs), extendiéndose hasta la dirección 7EH.

A continuación se encuentran 2 localidades reservadas en las direcciones 80H y 82H, y luego se encuentra la tabla alterna de vectores de interrupción (AIVT).

Enseguida se encuentra la memoria de programa a partir de la localidad 100H, extendiendose hasta la 7FFFH (48 kBytes en total, en donde se pueden almacenar 16k instrucciones). Esta memoria es seguida de una larga zona reservada (desde la 4000H hasta la 7FFBFF) la cual se lee como ‘0’.

(7)
(8)

2.1.2.1

Direccionamiento de la memoria de programa

Existen 3 métodos para acceder al espacio de la memoria de programa: 1. A través del contador de programa (PC) de 23 bits.

2. A través de instrucciones de lectura de tabla (TBLRD) y escritura de tabla (TBLWT). 3. Mapeando un segmento de 32 kbytes de la memoria de programa en el espacio de la

memoria de datos.

2.1.2.1.1 A través del contador de programa (PC)

El PC incrementa de 2 en 2 con el bit menos significativo (LSB) siempre en 0, para proveer compatibilidad con el direccionamiento del espacio de datos. Cada instrucción es de 24 bits de ancho.

El bit LSB (PC<0>) está reservado como un “bit selector de byte” cuando se accesa a la memoria de programa desde los datos que usan el PSV (visibilidad del espacio de programa) o instrucciones de tabla. Es por esta razón que este bit siempre está en 0.

En la Figura 2-4 se muestra un ejemplo de una búsqueda de instrucción (instruction fetch).

(9)

2.1.2.1.2 A través de instrucciones de lectura de tabla (TBLRD) y escritura de tabla (TBLWT)

Existen 2 métodos para transferir datos entre la memoria de programa y la memoria de datos: A través de instrucciones especiales de tabla, o a través del remapeo de una página de 32 Kbytes del espacio de programa en la segunda mitad del espacio de datos.

Las instrucciones especiales de tablas, nos permiten mover datos (bytes o palabras) entre el espacio de programa y el espacio de datos. Las instrucciones de lectura de tablas son usadas para leer de la memoria de programa y las instrucciones de escritura nos permiten escribir en la memoria de programa.

Las instrucciones disponibles son: TBLRDL: Lectura de palabra baja.

TBLWTL: Escritura de palabra baja.

TBLRDH: Lectura de palabra alta.

TBLWTH: Escritura de palabra alta.

Cuando trabajamos con estas instrucciones podemos ver a la memoria como 2 localidades de 16 bits pegadas compartiendo la misma dirección como se muestra en la Figura 2-5.

Como la memoria tiene solo 24 bits de anchura, el byte alto no existe sin embargo puede ser direccionado y es denominado el “byte fantasma”.

(10)

2.1.2.1.3 Mapeando un segmento de 32 kbytes de la memoria de programa en el espacio de la memoria de datos

Como ya se mencionó anteriormente, los 32 Kbytes altos de la memoria de datos pueden ser opcionalmente mapeados en una página de 16 Kpalabras del espacio de programa. Este modo es llamado “Visibilidad del espacio de programa” (Program Space Visibility) o PSV, y provee un acceso transparente a datos constantes almacenados en la zona X, sin la necesidad de usar instrucciones especiales (como las de lectura y escritura de tablas).

Para habilitar el PSV se debe poner en ‘1’ el bit PSV del registro CORCON (bit 2). Cuando se habilita este modo, cada dirección de memoria de datos localizada en la segunda mitad (de la 0x8000 a la 0xFFFF) direccionará directamente a una dirección de la memoria de programa (vea la Figura 2-6). Esta ventana PSV permite el acceso a los 16 bits menos significativos de la palabra de 24 bits (note que las instrucciones de tabla si permiten leer o escribir en el byte más alto de las localidades de programa).

La Figura 2-7 muestra como se genera una dirección PSV. Los 15 bits menos significativos de la dirección PSV están contenidos en el registro W que contiene la dirección efectiva. El bit más significativo del registro W no se usa para la dirección PSV; este bit especifica si se realizará un acceso a PSV o un acceso normal en la memoria de datos. Es decir si el registro W posee una dirección mayor o igual a 0x8000, el acceso ocurrirá en la memoria de programa siempre y cuando el bit PSV esté en ‘1’. Si la dirección es menor a 0x8000 se usará la memoria de datos normal.

Los bits restantes de la dirección PSV (los 8 restantes de la dirección de 24) son proporcionados por el registro PSVPAG. Estos bits se concatenan con los 15 menos significativos de W para formar la dirección completa de 24 bits.

El PSV solo puede ser usado para acceder al espacio de la memoria de programa de usuario. Si se desea acceder a la memoria de configuración se pueden usar las instrucciones de tabla.

(11)
(12)

(13)

2.1.2.1.3.1 Acceso a PSV en lenguaje C

Para usar el PSV en lenguaje C simplemente declare su variable o variables como constantes con la palabra clave const.

// Ejemplo PSV en C

// Cuando se definen como const, la cadena usa la caracteristica PSV

const unsigned char hola[] = {"Hola mundo"};

Referencias

Documento similar