12.11.2014 Views

1 TEMA 4 TECNICAS DE DIRECCIONAMIENTO

1 TEMA 4 TECNICAS DE DIRECCIONAMIENTO

1 TEMA 4 TECNICAS DE DIRECCIONAMIENTO

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>TEMA</strong> 4<br />

<strong>TECNICAS</strong> <strong>DE</strong> <strong>DIRECCIONAMIENTO</strong><br />

CURSO 2010/2011<br />

<strong>TECNICAS</strong> <strong>DE</strong> <strong>DIRECCIONAMIENTO</strong><br />

1. Introducción<br />

2. Registros de los Generadores de Direcciones (DAG)<br />

• Registros Alternos de los DAG<br />

3. Modos de Operación de los DAG<br />

• Direccionamiento Premodificado o Posmodificado<br />

• Direccionamiento de Buffers Circulares<br />

• Direccionamiento de Bit Inverso<br />

4. Transferencias con los Registros de los DAG<br />

• Restricciones en las Transferencias con los Registros de<br />

los DAG<br />

1


INTRODUCCION<br />

‣ La familia de procesadores ADSP-2106x dispone de dos generadores de<br />

direcciones (DAG) que simplifican la tarea de organizar los datos en<br />

memoria. Los DAG permiten que el procesador direccione la memoria<br />

indirectamente, esto quiere decir que una instrucción especifica un registro<br />

de un DAG que contiene la dirección del operando, en lugar del valor<br />

absoluto de la dirección.<br />

‣ El Generador de Direcciones 1 (DAG1) genera direcciones de 32 bits para el<br />

bus de direcciones de memoria de datos (DMA).<br />

‣ El Generador de Direcciones 2 (DAG2) genera direcciones de 24 bits para el<br />

bus de direcciones de memoria de programa (PMA).<br />

‣ Los generadores de direcciones proporcionan implementación hardware a<br />

algunas funciones habitualmente usadas en algoritmos de procesadmiento<br />

digital de señales: ambos DAG implementan buffers de datos circulares que<br />

requieren incrementar un puntero repetidamente a lo largo de una zona de<br />

memoria, también ambos DAG realizan el direccionamiento de bit inverso, el<br />

cual proporciona los bits de una dirección en orden inverso.<br />

REGISTROS <strong>DE</strong> LOS DAG<br />

‣ Cada DAG tiene 4 tipos de registros:<br />

<br />

<br />

<br />

<br />

Registros Indice (I).<br />

Registros Modificador (M).<br />

Registros Base (B).<br />

Registros Longitud (L).<br />

‣ Un registro Indice actúa como puntero a memoria y un registro Modificador<br />

contiene el incremento para actualizar el puntero.<br />

‣ Los registros B y L sólamente se utilizan para implementar buffers<br />

circulares. Un registro B contiene la dirección base (primera dirección) de un<br />

buffer circular y el registro L con el mismo índice, contiene el número de<br />

posiciones, es decir, la longitud del buffer circular.<br />

‣ Cada DAG contiene 8 registros de cada tipo.<br />

2


REGISTROS <strong>DE</strong> LOS DAG<br />

REGISTROS ALTERNOS <strong>DE</strong> LOS DAG<br />

‣ Cada DAG tiene un juego de registros secundario o alterno para cambios de<br />

contexto. Para activar los registros alternos, cada DAG está organizado en<br />

dos mitades (alta y baja).<br />

‣ La mitad alta del generador de direcciones 1 contiene los registros I, M, B y L<br />

numerados del 4 al 7 y la mitad baja los registros numerados del 0 al 3.<br />

Análogamente la mitad alta del DAG2 contiene los registros 12 - 15 y la mitad<br />

baja los registros 8 - 11.<br />

‣ Determinados bits del registro MO<strong>DE</strong> 1 determinan para cada mitad qué<br />

registros están activos si los primarios o los alternos (0 = primarios, 1 =<br />

alternos).<br />

‣ Este agrupamiento o disposición de los registros alternos en dos mitades<br />

permite pasar punteros entre contextos en cada DAG.<br />

3


REGISTROS ALTERNOS <strong>DE</strong> LOS DAG<br />

REGISTROS ALTERNOS <strong>DE</strong> LOS DAG<br />

4


MODOS <strong>DE</strong> OPERACION <strong>DE</strong> LOS DAG<br />

‣ Las operaciones de los generadores de direcciones incluyen:<br />

<br />

Generar direcciones con premodificación o posmodificación.<br />

<br />

Manejo de buffers circulares.<br />

<br />

Direccionamiento de bit inverso.<br />

<strong>DIRECCIONAMIENTO</strong> PRE O POS<br />

‣ El procesador puede sumar un<br />

desplazamiento o modificador,<br />

que puede ser el contenido de<br />

un registro M o un valor<br />

inmediato, a un registro índice I,<br />

y depositar como salida la<br />

dirección resultante. Este modo<br />

de operación es conocido como<br />

direccionamiento premodificado<br />

y sin actualización. (este modo<br />

no cambia el contenido del<br />

registro I).<br />

5


<strong>DIRECCIONAMIENTO</strong> PRE O POS<br />

‣ O bien el procesador<br />

puede depositar como<br />

salida el contenido del<br />

registro I y después<br />

sumarle el contenido del<br />

registro M o un valor<br />

inmediato para obtener<br />

un nuevo valor del<br />

registro I. Este modo de<br />

operación es conocido<br />

como direccionamiento<br />

posmodificado y con<br />

actualización del registro<br />

I.<br />

<strong>DIRECCIONAMIENTO</strong> PRE O POS<br />

‣ El número de bits del modificador inmediato depende de la instrucción,<br />

puede tener el mismo número de bits que el registro I al que modifica.<br />

‣ El direccionamiento premodificado es siempre lineal, no circular (por lo<br />

tanto no le afecta la operación módulo realizada con el registro L).<br />

‣ La dirección generada con el modo de direccionamiento premodificado no<br />

puede cambiar de espacio de memoria.<br />

‣ En el código ensamblador de la familia del procesadores ADSP-2106x estos<br />

modos de direccionamiento premodificado y posmodificado se distinguen<br />

por la posición del índice y del modificador (que puede ser un registro M o<br />

un valor inmediato) en la instrucción: el registro I antes del modificador<br />

indica direccionamiento posmodificado, si el modificador está colocado<br />

primero indica direccionamiento premodificado sin actualización.<br />

6


<strong>DIRECCIONAMIENTO</strong> PRE O POS<br />

Ejemplos:<br />

R6 = PM (I15, M12); Indirecto posmodificado (I15 = I15 + M12)<br />

‣ Si cambiamos el orden de los registros M e I:<br />

R6 = PM(M12, I15); Indirecto premodificado (no cambia I15)<br />

‣ Cualquier registro M puede modificar a cualquier registro I, dentro del<br />

mismo Generador de Direcciones (DAG1 o DAG2):<br />

DM(M0, I2) = TPERIOD;<br />

DM(M0, I14) = TPERIOD;<br />

Instrucción correcta que accede a la dirección<br />

(M0 + I2)<br />

Instrucción incorrecta<br />

MODIFICADORES INMEDIATOS<br />

‣ La magnitud de un valor inmediato que puede modificar un registro índice I<br />

depende del tipo de instrucción y si el registro I pertenece al DAG1 o al DAG2.<br />

‣ Los modificadores de los registros del DAG1 pueden ser como máximo de 32<br />

bits. Los modificadores de los registros del DAG2 pueden ser como máximo de<br />

24 bits. Algunas instrucciones con operaciones en paralelo solamente permiten<br />

modificadores de 6 bits como máximo.<br />

Ejemplos:<br />

‣ Modificador de 32 bits:<br />

R1 = DM(0x40000000, I1);<br />

Dirección = I1 + 0x40000000<br />

‣ Modificador de 6 bits:<br />

F6 = F1 + F2, PM(I8, 0x0B) = ASTAT; Dirección = I8;<br />

7


BUFFERS CIRCULARES<br />

‣ Los Generadores de Direcciones soportan el direccionamiento de datos dentro<br />

de un buffer circular.<br />

‣ Un buffer circular es un conjunto de direcciones de memoria que almacenan<br />

datos. Un registro Indice I actúa como puntero recorriendo el buffer, siendo<br />

posmodificado y actualizado mediante la suma de un valor específico (positivo<br />

y negativo) en cada paso. Si la dirección modificada apunta a una posición<br />

fuera del buffer, la longitud del buffer es restada o sumada para conseguir que<br />

el puntero vuelva a posicionarse dentro del buffer. No hay restricciones sobre<br />

el valor que puede tomar la dirección base del buffer circular.<br />

‣ El direccionamiento de buffers circulares únicamente puede utilizar el modo<br />

posmodificado, no el premodificado.<br />

Ejemplo:<br />

F1 = DM (I0, M0);<br />

F1 = DM (M0, I0);<br />

Direccionamiento correcto<br />

Direccionamiento incorrecto<br />

REGISTROS ASOCIADOS<br />

‣ Los cuatro tipos de registros de los Generadores de Direcciones intervienen en<br />

el funcionamiento de los buffers circulares:<br />

‣ El registro I contiene el valor que se deposita en el bus de direcciones.<br />

‣ El registro M contiene el modificador, valor positivo o negativo que se suma al<br />

registro I después de cada acceso a memoria. El registro M puede ser cualquier<br />

registro M que pertenezca al mismo DAG que el registro I y no tiene porqué<br />

tener el mismo índice. El modificador puede ser también un valor inmediato en<br />

lugar de un registro M pero debe ser menor que la longitud del buffer (registro<br />

L).<br />

‣ El registro L almacena el tamaño del buffer circular y por tanto el rango de<br />

direcciones en el que puede moverse el registro I. El contenido de L debe ser<br />

positivo y no puede ser mayor de 2 32 -1 (para L0-L7) o 2 24 -1 para (L8 – L15).<br />

Cuando un registro L se inicializa con 0, el buffer no es circular sino lineal.<br />

‣ El registro B, o el registro B más el registro L contiene el valor con el cual se<br />

compara el registro I después de cada acceso. Cuando el registro B se carga, el<br />

correspondiente registro I se carga simultáneamente con el mismo valor.<br />

Cuando I se carga, B no se modifica. B e I pueden leerse independientemente<br />

uno de otro.<br />

8


MODO <strong>DE</strong> OPERACION<br />

‣ Para programar un buffer circular en lenguaje ensamblador basta con inicializar<br />

un registro L con un valor positivo, distinto de cero y cargar el correspondiente<br />

registro B del mismo número con la dirección base o primera dirección del<br />

buffer. Automáticamente el correspondiente registro I se carga con la misma<br />

dirección base.<br />

‣ Cuando tiene lugar el primer acceso utilizando el registro I, el DAG deposita el<br />

contenido del registro I en el bus de direcciones y lo modifica sumándole el<br />

registro M especificado o el valor inmediato. Si el valor modificado entra dentro<br />

del rango del buffer se escribe en el registro I, si el valor modificado está fuera<br />

del rango del buffer se le resta el registro L (o si el modificador es negativo se<br />

suma) primero.<br />

‣ Si M es positivo:<br />

‣ Inew = Iold + M<br />

‣ Inew = Iold + M – L<br />

Si Iold + M < Direc. Base + L (final del buffer)<br />

Si Iold + M ≥ Direc. Base + L (final del buffer)<br />

‣ Si M es negativo:<br />

‣ Inew = Iold + M Si Iold + M ≥ Direc. Base (comienzo del buffer)<br />

‣ Inew = Iold + M + L Si Iold + M < Direc. Base (comienzo del buffer)<br />

MODO <strong>DE</strong> OPERACION<br />

9


INTERRUPCIONES ASOCIADAS<br />

‣ Hay un conjunto de registros en cada Generador de Direcciones que pueden<br />

generar una interrupción cuando se produce overflow en el manejo de un<br />

buffer circular. En el DAG1 los registros son I7, B7, L7 y en le DAG2 son I15,<br />

B15 , L15.<br />

‣ Cuando se están direccionando datos en un buffer circular utilizando estos<br />

registros y sucede que al incrementar o decrementar el registro I, el valor<br />

obtenido sobrepasa el final o el principio del buffer, se genera una<br />

interrupción.<br />

INTERRUPCIONES ASOCIADAS<br />

‣ Resumiendo podemos decir que se genera una interrupción cuando durante<br />

la ejecución de una instrucción que utiliza el direccionamiento<br />

posmodificado sucede que:<br />

‣ Para M < 0<br />

‣ Para M > 0<br />

I + M < B<br />

I + M > B + L<br />

‣ Estas interrupciones pueden ser enmascaradas sin más que poner a cero<br />

determinados bits del registro de máscaras IMASK.<br />

‣ Pueden suceder situaciones en las que queramos usar en nuestro programa<br />

los registros I7 0 I15, no para implementar buffers circulares y con las<br />

interrupciones asociadas al overflow de los buffers circulares<br />

desenmascaradas. Para impedir que se puedan generar estas interrupciones<br />

basta con escribir en los registros B7/B15 y L7/L15 valores que aseguren que<br />

las condiciones que generan interrupción no ocurren nunca.<br />

10


INTERRUPCIONES ASOCIADAS<br />

‣ Por ejemplo si estamos accediendo al rango de direcciones 0x1000 – 0x2000,<br />

el programa debería escribir B=0x0000 y L=0xffff.<br />

‣ Cuando en un programa estamos usando las interrupciones provocadas por<br />

el desbordamiento de los buffers circulares debemos evitar utilizar los<br />

correspondientes registros I7 e I15 en el resto del programa o sino tener<br />

cuidado con los valores escritos en los registros B7/L7 y B15/L15,<br />

explicados anteriormente, para prevenir que puedan producirse<br />

interrupciones espureas.<br />

‣ El registro de adhesivos STKY, también incluye dos bits que indican que se<br />

ha producido desbordamiento en los buffers circulares:<br />

‣ Bit 17 -> Desbordamiento en DAG1, buffer 7<br />

‣ Bit 18 -> Desbordamiento en DAG2, buffer 15<br />

‣ Estos bits, una vez activados, permanecen a 1 hasta que son explícitamente<br />

borrados.<br />

<strong>DIRECCIONAMIENTO</strong> <strong>DE</strong> BIT INVERSO<br />

‣ El modo de direccionamiento de bit inverso puede realizarse de dos formas:<br />

habilitando el modo bit inverso en el DAG1 o en el DAG2 y utilizando un<br />

registro específico (I0 o I8) o utilizando la instrucción de bit inverso<br />

(BITREV).<br />

‣ En el modo de bit inverso, el DAG1 invierte el orden de los bits en las<br />

direcciones de 32 bits procedentes del registro I0 y el DAG2 invierte el orden<br />

de los bits en las direcciones de 24 bits procedentes del registro I8.<br />

‣ Estos modos de funcionamiento se habilitan mediante dos bits del registro<br />

MO<strong>DE</strong>1 (BR0 y BR8). Solamente las direcciones procedentes de los registros<br />

I0 e I8 pueden funcionar de este modo. Este modo afecta tanto al<br />

direccionamiento premodificado como al direccionamiento posmodificado.<br />

11


<strong>DIRECCIONAMIENTO</strong> <strong>DE</strong> BIT INVERSO<br />

‣ La inversión de los bits tiene lugar en la salida de los DAGs y no afecta a los<br />

valores almacenados en I0 e I8. En el caso del modo de direccionamiento<br />

posmodificado, el valor actualizado de I0/I8 no está en orden inverso.<br />

Ejemplo:<br />

I0 = 0x80400000;<br />

R1 = DM (I0, 3); DM = 0x201, I0 = 0x80400003<br />

‣ La instrucción BITREV modifica e invierte el orden de los bits de las<br />

direcciones contenidas en cualquier registro índice de los DAGs (I0 – I15) sin<br />

acceder a memoria. Esta instrucción es independiente del modo de bit<br />

inverso antes explicado.<br />

‣ La instrucción BITREV suma un valor inmediato de 32 bits a un registro<br />

índice del DAG1 o un valor inmediato de 24 bits a un registro índice del<br />

DAG2, invierte el orden de los bits del resultado y escribe el resultado<br />

modificado en el mismo registro índice.<br />

Ejemplo:<br />

BITREV (I1,4); I1 = Bit inverso de (I1 + 4)<br />

<strong>DIRECCIONAMIENTO</strong> <strong>DE</strong> BIT INVERSO<br />

12


TRANSFERENCIAS CON LOS DAGS<br />

‣ Los registros de los DAGs forman parte del juego de registros del<br />

procesador y pueden ser escritos desde memoria, desde otro registro o<br />

desde un valor inmediato contenido en una instrucción. Los registros de los<br />

DAGs también pueden almacenarse en memoria o en otros registros.<br />

‣ Las transferencias entre los registros de 32 bits del DAG1 y el bus DMD de<br />

40 bits se realizan sobre los bits 8-39 del bus.<br />

TRANSFERENCIAS CON LOS DAGS<br />

‣ Cuando un registro de 24 bits del DAG2 se lee desde el bus DMD de 40 bits,<br />

si es un registro M se le efectúa extensión de signo hasta el bit 32 y si es un<br />

registro I, L o B se rellenan con ceros los bits 0-7 y 32-39.<br />

‣ Cuando un registro de 24 bits del DAG2 se escribe desde el bus DMD, se<br />

transfieren los bits 8-31 y el resto se ignoran.<br />

13


RESTRICCIONES CON LOS DAGS<br />

‣ En algunas secuencias de instrucciones que implican transferencias con los<br />

registros de los Generadores de Direcciones, el procesador inserta<br />

automáticamente un ciclo de instrucción extra (NOP).<br />

‣ Además ocurre también que ciertas secuencias de instrucciones producen<br />

resultados incorrectos y no están permitidas en el ensamblador de la familia<br />

de procesadores ADSP-2106x.<br />

1. Cuando a continuación de una instrucción que carga un valor en un<br />

registro de los DAG se coloca otra instrucción que usa cualquier<br />

registro de ese mismo DAG para direccionar datos o saltos indirectos,<br />

el procesador ADSP-2106x inserta automáticamente un ciclo extra<br />

(NOP) entre las dos instrucciones. Esto ocurre porque se necesita el<br />

mismo bus para las dos operaciones en el mismo ciclo, por tanto la<br />

segunda operación es retrasada.<br />

Ejemplo:<br />

L2 = 8;<br />

DM (I0, M1) = R1;<br />

Puesto que L2 pertenece al mismo<br />

DAG que I0 y M1, se inserta<br />

automáticamente un ciclo extra<br />

después de la escritura de L2<br />

RESTRICCIONES CON LOS DAGS<br />

‣ Los siguientes tipos de instrucciones se pueden ejecutar en los<br />

procesadores ADSP-2106x pero generan resultados incorrectos:<br />

2. Una instrucción que almacena un registro de los DAG en memoria<br />

utilizando direccionamiento indirecto con el mismo DAG con o sin<br />

actualización del registro índice. Esta instrucción escribe un valor<br />

incorrecto en memoria o actualiza de forma errónea el registro índice.<br />

Ejemplo:<br />

DM (M2, I2) = I0; o DM (I1, M2) = I0;<br />

3. Una instrucción que carga un registro de un DAG desde memoria<br />

utilizando direccionamiento indirecto con el mismo DAG con<br />

actualización del registro índice. La instrucción puede cargar el registro<br />

del DAG o actualizar el registro índice pero no ambos.<br />

Ejemplo:<br />

L2 = DM (I1, M0);<br />

14

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!