1 TEMA 4 TECNICAS DE DIRECCIONAMIENTO
1 TEMA 4 TECNICAS DE DIRECCIONAMIENTO
1 TEMA 4 TECNICAS DE DIRECCIONAMIENTO
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