Overview MCU ALU – DsPIC 30F

alu_dspic30F_intro

Los DsPIC es la denominación comercial de los DSP (¿Que es un DSP?) de Microchip. En este artículo voy a tratar de dar una descripción general del MCU – ALU de los DsPIC pertenecientes a la familia 30F, debido a que conociendo el hardware con el que disponemos podemos darnos una idea muy buena sobre las posibilidades que nos brinda y lo que podríamos llegar a realizar con ellos.


Familia DsPIC30F

El módulo dsPIC30F tiene una CPU de 16-bits (datos), arquitectura Harvard modificada con un conjunto de instrucciones mejoradas, incluyendo un soporte importante para DSP. La CPU tiene una palabra de instrucción de 24-bits, con un campo opcode de longitud variable. El contador de programa (PC) es de 24-bits de ancho y direcciona hasta 4M x 24-bits de espacio de memoria para el programa de usuario.-

Posee 16 registros de trabajo de 16-bits en el modelo del programador. Cada uno de los registros de trabajo puede actuar como una base de datos o de dirección. El registro de trabajo número 16 (W15) funciona como un puntero de pila de software para las interrupciones y las llamadas (de funciones).-

El conjunto de instrucciones del dsPIC30F tiene dos clases, MCU y DSP. Estas dos clases de instrucciones se integran a la perfección en la arquitectura y se ejecutan a partir de una única unidad de ejecución. Las instrucciones se encuentran optimizadas para una compilación en C.-

El espacio para datos puede direccionarse como palabras de 32K o 64 Kbytes y está dividido en dos bloques, denominados X e Y. Cada bloque de memoria tiene su propia Unidad de Generación de Dirección (AGU). La clase de instrucciones MCU opera exclusivamente a través de la memoria X AGU.-

MCU – ALU

Una vista de alto nivel de la Unidad Aritmética Lógica (ALU), se ilustra aquí. Podemos ver que la ALU interacciona con dos interfaces, el bus de datos X  y el array de registros de trabajo. Cualquiera de las entradas puede provenir de una memoria de datos y la otra de un registro W, o ambas entradas pueden provenir de registros W. El resultado de la ALU se puede alma-cenar, ya sea a una dirección de memoria datos o en un registro W.

La ALU es de 16-bits de ancho y es capaz de sumar, restar, desplazamiento de un bit y operaciones lógicas. Salvo que se mencione lo contrario, las operaciones aritméticas son en complemento a 2. Dependiendo de la operación, la ALU puede afectar los valores de los bits Carry (C), Cero (Z), Negativo (N), Desbordamiento (OV) y Dígit Carry (DC) del registro de estado SR.

MCU-ALU-DsPIC30F

Figura 1

A diferencia del motor DSP, la ALU soporta operaciones de un byte de ancho. Esta función proporcio- na compatibilidad con los dispositivos PICmicro de Microchip®, y también flexibilidad para trabajar con datos del tamaño de un byte.

Cuando se trabaja en modo byte con el array de registros de trabajo, el byte inferior del registro de trabajo especificado es utilizado, siempre dejando el byte superior (upper) sin afectar. Además, el byte inferior del Registro de Estado, que contiene las banderas N, OV, DC, C y Z se actualizara basado en el resultado de la operación de byte.-

Registro de Estado del CPU: SR

fig1-1

bit 15 OA: Desbordamiento del Acumulador A
1: Se produjo un desbordamiento
0: No se produjo desbordamiento
bit 14 OB: Desbordamiento del Acumulador B
1: Se produjo un desbordamiento
0: No se produjo desbordamiento
bit 13 SA: Saturación del Acumulador A
1: Acumulador A se encuentra saturado o se saturo en algún momento
0: Acumulador A se encuentra saturado o se saturo en algún momento
bit 12 SB: Saturación del Acumulador B
1: Acumulador B se encuentra saturado o se saturo en algún momento
0: Acumulador B se encuentra saturado o se saturo en algún momento
bit 11 OAB: OA || OB Desbordamiento Combinado[1]
1: Acumulador A o B se desbordo
0: Ninguno de los Acumuladores A o B se desbordo
bit 10 SAB: SA || SB Saturación Combinado1
1: Acumulador A o B se encuentra saturado o se saturo en algún momento
0: Ninguno de los Acumuladores A o B se encuentra saturado
bit 9 DA: Bucle Activo
1: Bucle en progreso
0: No existe bucle
bit 8 DC: MCU Half Carry/Borrow
1: Existió acarreo desde el bit 4 (dato tamaño byte) o acarreo desde el bit 16 (dato tamaño 16-bits)
0: No Existió acarreo desde el bit 4 (dato tamaño byte) o acarreo desde el bit 16 (dato tamaño 16-bits)

[1] OA || OB indica OR lógica entre OA y OB

bit 7-5 IPL <2:0>: Nivel de Prioridad de Interrupciones del CPU
111 = Nivel de Prioridad 7 (15). Interrupciones del usuario deshabilitadas
110 = Nivel de Prioridad 6 (14)
101 = Nivel de Prioridad 5 (13)
100 = Nivel de Prioridad 4 (12)
011 = Nivel de Prioridad 3 (11)
010 = Nivel de Prioridad 2 (10)
001 = Nivel de Prioridad 1 (9)
000 = Nivel de Prioridad 0 (8)

Nota: Los bits IPL<2:0> se encuentran concatenados con el bit IPL<3> (registro CORCON) .para formar el nivel de prioridad de interrupciones del CPU. El valor en paréntesis indica el caso en que IPL<3>=1. Las interrupciones del usuario se encuentran deshabilita-.das en ese caso.-

bit 4 RA: Activación de Repetición de Bucle
1: Repetir bucle en progreso
0: No repetir bucle en progreso
bit 3 N: Bit Negativo de MCU ALU
1: El resultado es negativo
0: El resultado no es negativo (cero o positivo)
bit 2 OV: Desbordamiento de MCU ALU
1: Ocurrió un desbordamiento (un desbordamiento en la magnitud cambio el bit de signo)
0: No ocurrió desbordamiento
bit 1 Z: Bit Cero de MCU ALU
1: El resultado de la operación fue cero
0: El resultado de la operación reciente no fue cero
bit 0 C: Carry/Borrow de MCU ALU
1: Ocurrió un acarreo desde el MSB
0: No ocurrió un acarreo desde el MSB

.

Motor DSP

El motor DSP es un bloque de hardware que se alimenta de datos desde el array de registros W, pero contiene sus propios registros especializados de resultado. El motor DSP está controlado desde el mismo decodificador de instrucciones que dirige al MCU ALU. Además, todas las direcciones de operandos eficaz (EAs) se generan en el array de registros W. Operaciones conjuntas con el MCU no es posible, aunque los recursos del MCU ALU y del motor DSP pueden ser compartidos por todas las instrucciones en el conjunto de instrucciones.

El motor DSP se compone de los siguientes componentes:

• Multiplicador de alta velocidad de 17-bits x 17-bits.
• Registro de Desplazamiento.
• Sumador/restador de 40-bits.
• Dos registros acumuladores.
• Lógica de Redondeo con modos seleccionables.
• Saturación Lógica con modos seleccionables.

La siguiente figura muestra un diagrama de bloques del motor DSP

fig2

Figura 2

Los datos de entrada del motor DSP pueden provenir desde las siguientes fuentes:

  • Directamente desde el array W (registros W4, W5, W6 o W7) para instrucciones de doble operandos. Los valores de datos para los registros W4, W5, W6 y W7 son prefetched a través de los buses de datos X e Y.
  • Desde el bus de datos de memoria X para todas las demás instrucciones DSP.

La salida de datos desde el motor DSP se escribe a uno de los siguientes destinos:

  • El acumulador de destino, según lo definido por la instrucción DSP ejecutada.
  • A través del bus de datos de memoria X a cualquier ubicación en el espacio de direcciones de memoria de datos.

El motor DSP tiene la capacidad inherente para realizar operaciones de acumulador a acumulador que no requieren datos adicionales.
Las instrucciones de desplazamiento y multiplicación del MCU usan el hardware del motor DSP para obtener sus resultados.

Registro de Control de Núcleo: CORCON

fig2-1

bit 15-13 No se utilizan
bit 12 US: Control de Multiplicación DSP
1: La multiplicación es sin signo
0: La multiplicación es signada
bit 11 EDT: Control de Terminación de Bucle Prematura
1: Terminar la ejecución del bucle después de la iteración actual
0: Sin efecto
bit 10-8 DL<2:0>: Nivel de Anidación de Bucle
111 = 7 Bucles activos
001 = 1 Bucle activo
000 = 0 Bucles activos
bit 7 SATA: Habilitación de Saturación del Acc A
1: Saturación habilitada
0: Saturación deshabilitada
bit 6 SATB: Habilitación de Saturación del Acc B
1: Saturación habilitada
0: Saturación deshabilitada
bit 5 SATDW: Habilitación Data Space Write desde el DSP
1: Data space write habilitado
0: Data space write deshabilitado
bit 4 ACCSAT: Selección del Modo de Saturación de los acumuladores
1: 9.31 (súper saturación)
0: 1.31 (saturación normal)
bit 3 IPL3: Nivel de Prioridad de Interrupciones del CPU
1: Nivel de prioridad del CPU mayor a 7
0: Nivel de prioridad del CPU menor o igual a 7
bit 2 PSV: Habilitación de Visibilidad del Espacio de Programa
1: Visible en espacio de datos
0: No visible en espacio de datos
bit 1 RND: Selección de Modo de Redondeo
1: Redondeo convencional habilitado
0: Redondeo convergente habilitado
bit 0 IF: Selección del Modo de Multiplicación
1: Multiplicación de enteros
0: Multiplicación de fraccionarios

.

Multiplicador

El multiplicador del dsPIC30F es de 17-bits x 17-bits, es compartido tanto por el MCU ALU y el motor DSP. El multiplicador es capaz de realizar operaciones signadas y soportar resultados de 1,31 fraccionario (Q.31) o 32-bits enteros.

El multiplicador toma una entrada de datos de 16-bits y los convierte a 17-bits. A los operan-dos signados son sign-extendend (agrega “1”). Las entradas sin signo son zero-extendend (se agrega “0”). La conversión lógica a 17 bits es transparente para el usuario y permite que el multiplicador soporte productos de entradas con signo y sin signo.

El bit de control IF (CORCON<0>) determina operaciones enteras/fraccionarias para las instrucciones listadas en la tabla 2. Este bit no afecta las instrucciones de multiplicaciones del MCU (tabla 3), que son siempre operaciones enteras. El multiplicador escala el resultado un bit a la izquierda en las operaciones fraccionarias. El LSb del resultado es siempre borrado.

Por defecto al reiniciarse el PIC el modo fraccionario se encuentra seleccionado

La representación de los datos en el hardware para cada uno de estos modos es:

  • Datos Enteros son inherentemente representados como signados en complemento a 2, donde el MSb esta definido como un bit de signo. Generalmente hablando, el rango de  N-bits en complemento a 2 (entero) es de -2N-1 a  2N-1 -1
  • Los datos fraccionarios son representados en complemento a 2 fraccionario donde el MSb se encuentra definido como bit de signo y la coma flotante se encuentra justo después del bit de signo (formato Q.X). El rango de N-bits en complemento a 2 fraccionario con coma flotante es desde -1,0 a (1 – 21-N)

La figuras 3 y 4 ilustran como el hardware del multiplicador interpreta los datos en los modos entero y fraccionario

fig3Figura 3

fig4Figura 4

El rango de los datos en los modos entero y fraccionario es:

tabla1

Multiplicación MCU

Las instrucciones MCU de multiplicación proveen soporte para multiplicar enteros de 16-bits con signo, sin signo o mezclados. La extensión de la instrucción determina el tipo de multiplicación que será realizada

tabla2

Todas las multiplicaciones MUL producen resultados enteros. La instrucción MUL puede ser dirigida para usar operandos de un o dos bytes. Operandos de un byte producen un resultado de 16-bits y operandos de 2 bytes producen resultados de 32-bits, que se almacenan en los registros W0 y W1.

Multiplicación DSP

Cuando una multiplicación DSP es realizada, el resultado es almacenado en uno de los acumuladores (A y B) de 40-bits. El acumulador viene especificado como uno de los operandos de la instrucción.

Si IF=0 implica que después de terminada la multiplicación fraccionaria, el resultado es desplazado un bit a la izquierda, generando una salida con 2 bits de signo y 31 bits fraccionarios, formato llamado 2.31. Este desplazamiento es necesario para mantener la alineación apropiada de la coma flotante.

tabla3

El bit de control US (CORCON<12>) determina si los operandos deben ser tratados como números con signo o sin signo. Cuando los operandos son tratados como números sin signo, el bit de extensión de signo (17) del multiplicador 17×17-bits se carga automáticamente con un “0”.

Ejemplo:

Este ejemplo muestra como una multiplicación DSP es realizada en un dsPIC30F. En este ejemplo, el contenido de W4 es multiplicado con el contenido de W5, y el resultado es alma-cenado en el acumulador A.

-fig5

Como IF = 0, una multiplicación fraccional es realizada, el resultado entero es un bit desplaza-do a la izquierda, creando una salida de de 33-bits. Este resultado consiste en 2 bits de signo y 31 fraccionarios. El usuario nunca ve el resultado intermedio de 33-bits, debido a que la lógica extensora de signo lo convierte a un número de 40 bits antes de cargarlo al acumulador.

Aunque el resultado de la multiplicación fraccionaria tiene 31 bits, el LSb es siempre 0 debido al desplazamiento. Esto significa que la resolución de la multiplicación fraccionaria es 2-30 y no 2-31.

Lógica de Control de Cero de Relleno y de Extensión de Signo

-fig6

La lógica de Cero de Relleno y de Extensión de Signo es utilizada como una interfaz entre el Bus de Datos X y la salida del multiplicador a los acumuladores de 40 bits, ACCA y ACCB.

Cada acumulador consiste de tres registros adyacentes:

  • El Acumulador Superior, es el byte superior, bits del 39 al 32;
  • El Acumulador Alto, es la palabra del medio, bits del 31 al 16;
  • El Acumulador Bajo, es la palabra inferior, bits del 15 al 0.

El punto radical implícito para los números fraccionarios se ubica entre los bits 31 y 30.

Cuando un acumulador se carga utilizando el Acumulador de Carga, o LAC, la parte inferior del acumulador se pondrá a cero desde la lógica de cero de relleno, y todos los bits en la parte superior del acumulador tomarán el valor de del bit 31 del acumulador a partir de la lógica de extensión de signo.

Para las instrucciones de multiplicación del DSP, el resultado de 33 bits del Escalador sirve como entrada de la lógica de extensión de signo, la cual extenderá el signo a un resultado de 40 bits.

-fig7

Estos ejemplos demuestran cómo opera la Lógica de Cero de Relleno y de Extensión de signo.

En el primer ejemplo, el contenido de W1 es guardado en el acumulador A. Puesto que W1 es negativo (es decir, el bit 15 = 1), la lógica de extensión de signo coloca la parte superior del acumulador A en 0xFF. La lógica de cero de relleno pone la parte inferior del acumulador A en cero para todas las instrucciones LAC.

En el segundo ejemplo, el contenido de W2 es almacenado en el acumulador B. Como W2 es positivo (o sea, el bit 15 = 0), la lógica de extensión de signo completa la parte superior del acumulador A con ceros. La lógica de cero de relleno coloca la parte inferior del acumulador A en cero para todas las instrucciones LAC.

Sumador del DSP

-fig8

El sumador del DSP tiene una extensión de 40 bits y soporta tres tipos diferentes de entradas. Las entradas pueden ser: cero, o venir desde un acumulador o desde la lógica de extensión de signo. La selección de las entradas está basada en la instrucción ejecutada, y es transparente al usuario.

Todas las operaciones del sumador son signadas, y una entrada al sumador también puede ser negada. Esta característica provee el soporte para instrucciones del DSP tales como: multiplicación y negación, multiplicación y resta, negación y sustracción del acumulador.

El sumador genera los bits de estado en los cuales se indican el desbordamiento y la saturación. Los diferentes modos de saturación son seleccionables por el usuario.

Acumuladores

-fig9

Cada uno de los acumuladores de 40 bits, A y B, están compuestos por un byte superior y dos palabras de 16 bits ordenadas en una alta y otra baja. El acumulador superior provee 8 bits extras de guarda que pueden ser utilizados se efectúan una gran cantidad de operaciones en el acumulador.

Bits de Estado del Acumulador

Seis bits del registro de estado han sido proveídos para soportar la saturación y el desbordamiento.

-fig10

Los bits OA y OB son leídos y modificados cada vez que el dato pasa a través de la lógica de suma/resta del acumulador. Cuando están en uno, indican que la operación más reciente produjo un desbordamiento. Este tipo de desbordamiento no es catastrófico.

Los bits SA y SB pueden ser colocados a uno cada vez que el dato pasa a través de la lógica de saturación del acumulador. Una vez puestos a uno, estos bits permanecen en uno hasta que sean borrados por el usuario. Cuando están en uno, estos bits indican que el acumulador ha desbordado su rango máximo (bit 31 para el modo de saturación de 32 bits y bit 39 para el de 40 bits) y se saturará (si el modo de saturación está habilitado).

Cuando el modo de saturación no está habilitado, los bits SA y SB indican que ha ocurrido un desbordamiento catastrófico.

Saturación del Acumulador

-fig11

El dsPIC30F soporta dos modos opcionales de saturación los cuales siempre afectan la salida del sumador de 40 bits: saturación de 31 bits (referido a la Saturación Normal) y saturación de 39 bits (referido a la Súper Saturación).

La selección del modo de saturación está controlada por diversos bits del registro CORCON. El bit SATA habilita o deshabilita la saturación del acumulador A, y el SATB hace lo mismo para el acumulador B.

Cuando la saturación está habilitada, el bit ACCSAT es utilizado para seleccionar el tipo de saturación –ya sea Saturación Normal o Súper Saturación. El mismo modo de saturación se aplicará a ambos acumuladores, si los dos bits SATA y SATB están en 1.

Saturación Normal (1.31)

-fig12

El modo de saturación normal soporta un formato de datos 1.31. El formato de datos 1.31 usa sólo un bit de magnitud (el cual es el bit de signo) y 31 bits fraccionales para representar un valor.

Cuando la Saturación Normal está habilitada, la salida del sumador está limitada a un rango de 32 bits, y el acumulador superior contiene la extensión de signo del valor de 32 bits almacenado en el acumulador alto y bajo. El signo del valor de 32 bits, almacenado en el bit 15 del acumulador alto, es extendido a todos los bits en el acumulador superior. Esto significa que si una operación destruye el bit de signo guardado en el bit 31 del acumulador, el sumador saturará el resultado ya sea a un número negativo o positivo más grande de 32 bits.

Súper Saturación (9.31)

-fig13

Cuando la Súper Saturación está habilitada, la salida del sumador está limitada a un rango de 40 bits, y el registro del acumulador superior contiene la información de la magnitud en sus 8 bits superiores. Este formato de dato está referido al 9.31, porque tiene 9 bits de magnitud, dentro de los cuales se incluye el bit de signo, y 31 bits fraccionales.

En el modo de Súper Saturación, cuando una operación de suma destruye el bit de signo guardado en el bit 39 del acumulador, el sumador saturará el resultado ya sea a un número negativo o positivo mayor que 40 bits. El máximo valor negativo del acumulador es 0x8000000000 o -256.0 como un valor de punto fijo. El mayor valor positivo que admite el acumulador es 0x7FFFFFFFFF o aproximadamente +256.0.

Saturación deshabilitada

-fig14

Cuando la saturación está deshabilitada, la salida del sumador nunca se modifica. En este modo, el sumador provee el mismo rango dinámico que para el modo de Súper Saturación, desde -256.0 hasta +256.0 aproximadamente, pero no ocurrirá un corte cuando el rango sea excedido.

Cuando una operación excede el rango permitido, los 40 bits inferiores del resultado quedarán sin modificaciones, aún cuando sean incorrectos. Esta condición es llamada “Desbordamiento Catastrófico” y el usuario tiene la opción de generar una trampa de error matemático. Esta selección está controlada por el bit de habilitación de trampa de desbordamiento catastrófico, que se encuentra en el registro INTCON1.

División

-fig15

El bloque de control de la división provee un soporte para la división de números enteros con y sin signo, a través de las instrucciones DIV.S y DIV.U respectivamente, como así también para la división de números fraccionales por medio de la instrucción DIVF. Las instrucciones de división de números enteros también soportan divisiones extensas, donde el numerador es de un ancho 32 bits y se almacena en 2 registros de trabajo adyacentes, pero el denominador es de un ancho de 16 bits. Las instrucciones de divisiones extensas usan la notación DIV.SD y DIV.UD.

Diferente a todas las demás instrucciones del dsPIC30F, las instrucciones de la división  deben ser usadas en conjunto con instrucción REPEAT. Especialmente, la instrucción para la división debe ser ejecutada 18 veces en un bucle REPEAT, como se muestra en el ejemplo. En este ejemplo, W8 es dividido por W9. El cociente se almacenará en W0, y el resto en W1.

Redondeo Lógico

-fig16

-fig17

El redondeo lógico puede realizar la función de redondeo convencional o convergente durante la escritura (almacenamiento) de un acumulador. El modo de redondeo es determinado por el estado del bit RND del registro CORCON <1>. Por defecto, el modo de redondeo es convergente. El redondeo no afecta al acumulador. La descripción del modo de operar de cada tipo de redondeo puede observarse en la figura de arriba. Para ambos casos se evalúa tanto el redondeo hacia arriba o hacia abajo.

Desplazador

-fig18

El desplazador de 40 bits es utilizado para el corrimiento de datos, con un rango de desplazamiento de hasta 16 bits tanto a la izquierda como a la derecha. El desplazador es compartido entre las instrucciones del MCU y el DSP.

Cuando se realiza un desplazamiento en MCU, la fuente y el destino deben venir del arreglo de del registro de trabajo. Cuando se efectúa un corrimiento en DSP, la fuente debe ser un acumulador, y el destino debe ser ya sea el mismo acumulador o cualquier registro W o alguna locación de memoria.

Para los desplazamientos en MCU, los bits de estado “N” y “Z” son actualizados, con lo cual el usuario puede determinar si el resultado es negativo o cero. Para los corrimientos en DSP, el valor resultante está sujeto a la saturación antes de su almacenamiento. Además, si el rango de desplazamiento del SFTAC excede más o menos 16, se generará una trampa de error matemático.

Las instrucciones que utiliza el desplazador en DSP son:

-fig19

Codigo Manchester

codigo manchester rf800

La codificación Manchester es una técnica de codificación sincrónica que se utiliza para codificar el clock y los datos de un flujo de bits sincrónico. En esta técnica, los datos binarios que se transmiten no se envían como una secuencia de 1 y 0 lógicos (conocida como de no retorno a cero, NRZ). En cambio, los bits se convierten en un formato ligeramente diferente que tiene una serie de ventajas sobre el uso directo de codificación binaria.

Existen dos convenciones empleadas para la codificación Manchester.

Continue reading “Codigo Manchester”