sábado, 26 de enero de 2008

VHDL (Continuacion)

Diseño con VHDL del proceso de traslado de palanquillas hasta la entrada del horno, a traves de una serie de vias de rodillos.

El funcionamiento del proyecto es el siguiente: Se tienen tres vias de rodillos que contienen una serie de motores (aproximadamente de 10 a 12 motores en cada una). En cada eje de los motores se encuentra acoplado un rodillo que gira con el movimiento que genera el motor. Los motores estan ubicados uno seguido del otro, por lo que se emula una cinta transportadora. La primera via es manual (MANUAL VR), la cual es controlada por el operador asignado a la entrada del horno para que la traslade a la siguiente que se acciona automaticamente cuando se ingresa el numero de palanquillas a utilizar en el proceso de laminacion, en este caso para la creacion de cabillas, luego de un proceso desbastador que sufre el material a lo largo del tren de Barras.


A continuacion se muestra un esquema de como se va generando el movimiento de las palanquillas hasta el horno (Fig. 1).

FIG# 1. Movimiento de palanquillas hasta la entrada del horno.


Una vez que se ingresa el numero de palanquillas a laminar se accinan los motores del grupo 1 y grupo 2 de la via de rodillos como se observa en la figura anterior. El operador, manualmente coloca la palanquilla, y esta arrastrada por la via siguiente por efecto de la friccion. Una vez que pasa por la via de rodillos del grupo 1, al ver que no tiene palanquillas en la via de rodillos 2 sigue el trayecto hasta frenar porque es detectada por un sensor (S2) ubicado en la via. Cuando la via de rodillos numero 2 esta ocupada, se realiza pregunta del estado del sensor 3 (S3), ubicado en la entrada del horno para detectar palanquillas en esta zona. En el caso que la misma este vacia, se procede a enviar una señal al separador empujador ubicado en la via de rodillos N#2 para que haga el traslado y desalojar la via. Una vez que es desalojada, se inicia el movimiento de los motores para ubicar la nueva palanquilla. Todo este proceso se genera hasta que el conteo que se obtiene a traves del sensor 3 (S3), alcanza el numero de palanquillas ingresado en a traves del teclado. Cuando esto sucede se detiene el proceso hasta que nuevamente se realice la accion de colocar el numero de palanquillas a laminar.

Por lo que el operador realiza la operacion de la siguiente manera (Fig.#2):


Fig.#2. Modo de ingreso de los datos.
Ahora bien, el diagrama de flujo del programa a cargar en el PLD o FPGA es como se muestra a continuacion (Fig #3):

Fig #3. Diagrama de flujo del programa a instalar en el dispositivo programable.





2. DESCRICPCION FUNCIONAL

1. Definir el numero de palanquillas a laminar.
2. Iniciar el Procesos.
3. Accionar los motores del grupo 1 y 2 de la vía de rodillos.
4. El operador, manualmente coloca la palanquilla ¿donde?, y esta es arrastrada por la vía siguiente por efecto de la fricción.
5. Una vez que pasa por la vía de rodillos del grupo 1, al ver que no tiene palanquillas en la vía de rodillos 2 sigue el trayecto hasta frenar porque es detectada por un sensor (S2) ubicado en la vía.
6. Cuando la vía de rodillos numero 2 esta ocupada, se realiza pregunta del estado del sensor 3 (S3), ubicado en la entrada del horno para detectar palanquillas en esta zona.
7. En el caso que la misma este vacía, se procede a enviar una señal al separador empujador ubicado en la vía de rodillos numero 2 para que haga el traslado y desalojar la vía.
8. Una vez que es desalojada, se inicia el movimiento de los motores para ubicar la nueva palanquilla.Todo este proceso se genera hasta que el conteo que se obtiene a través del sensor 3 (S3), alcanza el numero de palanquillas ingresado en a través del teclado.


3. DISEÑO
La metodología de diseño a usar consiste en seguir paso a paso la estructuración de un trabajo, es una receta de actividades, con la finalidad de alcanzar el objetivo de forma analítica y con menor impacto en el desarrollo de un proyecto, la metodología de diseño en nuestro caso usaremos PLD, FPGA y VHDL combinando pasos que aporte en nuestro diseño para alcanzaremos nuestra meta.

Fig. #4. Proceso de diseño con PLD

4. Definición de la Apliaciòn.

Se requiere diseñar en VHDL un programa del control de un proceso de alineación de palanquillas previamente para continuar con el proceso laminación de un horno, es el proceso que continua y por el cual debe esperarse para reiniciar el ciclo, este proceso es realizado por lote, primero se alinean las palanquillas, luego en el horno son convertidas en laminas u otros producto; nosotros centralizaremos nuestra atención en la primera fase y es proceso semi-automatizado.

5. Selección del PDL.

VHDL es sólo uno de un conjunto de lenguajes especializados en la descripción de elementos de hardware como ABEL, Verilog, AHDL, entre otros; que se caracterizan por permitir implementar casi cualquier tipo de circuito lógico sin la necesidad de utilizar esquemáticos pues la descripción de los componentes y su comportamiento se hace por medio de instrucciones similares a las de un lenguaje de programación como PASCAL o C. Aún cuando el estándar no coloca ninguna limitación a la complejidad del diseño, no todos los circuitos descritos con VHDL pueden ser traducidos a una implementación física posterior. Este proceso de tomar el código en VHDL y generar los elementos lógicos que efectúan la función deseada se conoce como síntesis. Las descripciones que admiten este proceso se les denomina Sintetizables. El dispositivo seleccionado es de la familia Spartan2E, especificamente el modelo xc2s50e, ya que posee la cantidad de compuertas necesarias para este proyecto, aparte de que el costo es bajo en comparacion a otros modelos de su misma especie.

6. Asignación de IN/OUT:

Entidad componente básicos del lenguaje VHDL: Es la declaración de entradas /salidas de un módulo. De acuerdo al IEEE Std 1076-2002, una entidad “es la abstracción principal de hardware en VHDL. Esta representa una parte de un diseño de hardware que tiene entradas y salidas bien definidas y realiza una función bien definida. Una entidad de diseño puede representar un sistema entero, un sub-sistema, una tarjeta, un chip, una macro-celda, una compuerta lógica o cualquier nivel de abstracción intermedio”.

Nuestra entidad la llamaremos: entradas

Vamos a iniciar con el análisis de las entradas y salidas, declaración de variables que vamos a requerir.

Fig#5. Teclado Numerico para el ingreso del numero de palanquillas




Fig#6. Tabla con los valores binarios asignados para cada numero de entrada


La entrada de los datos es a traves del teclado y la salida de datos es a traves de un display como se muestra en la Fig.#7, y la codificacion a la salida se muestra en la Fig# 8.


Fig#7. Display de 7 segmentos utilizado para la visualizacion de los datos de salida.


Fig#8. Tabla con los valores binarios asignados para cada numero de salida.


7. Definición de la Lógica.

Arquitectura: Es la descripción detallada del comportamiento o estructura interna de un módulo (entidad). Una arquitectura define el cuerpo de una entidad. Esta especifica las relaciones entre las entradas y las salidas de una entidad, pudiendo ser expresada en términos de estructura, flujo de datos o comportamiento. La descripción estructural muestra a la entidad y sus componentes internos junto con las conexiones entre estos, siendo bastante similar al proceso de diseño basado en esquemáticos y componentes MSI (Micro-Star International) o SSI discretos.

A continuacion se muetra el programa en VHDL para ser cargado en el dispositivo programable:



Resumen del cuerpo del programa:

1. Guarda la señal tecleada del numero requerido en el registro, al_reg
2. Codifica la señal a mostrar en el display, al_disp
3. Contar el numero de palanquillas a laminar, cnt
4. La dos rodillos se detienen al alcanzar el numero productos segun el registro, del_reg
end movmiento.


8. Compilación.

Proceso y resultado de compilar código fuente, a grandes rasgos el proceso se puede describir en los siguientes pasos:* El compilador recibe el código fuente.
*Se analiza lexicográficamente.
* Se analiza semántica y sintácticamente (parseado).
* Se genera el código intermedio no optimizado.
* Se optimiza el código intermedio.
* Se genera el código objeto para una plataforma específica.
Finalmente ya puede ejecutarse el código máquina.


Fig#8. Pantalla del programa XILINX ISE 9.2i.


9. Simulación.

La simulación del diseño es quizá la fase más importante en un proyecto de esta envergadura, y al mismo tiempo es la más crítica y compleja. Obviamente, se trata de un diseño difícil de monitorizar, y tratar de reducir el espacio de errores a su mínima expresión es una tarea ardua, por lo que hay que encontrar un método que permita automatizar el proceso de verificación.


Fig#9. Esquema del proceso hasta la simulacion del programa.


En la gráfica 10 se refleja la inconsistencia en la señal IGUAL, ya que no se condicionó su activación para después de ingresado el dato; y lo mismo ocurre con al_disp, donde antes de la visualización del número hay un valor indeterminado. Todo esto pasa sólo en el comienzo de la simulación, lo cual no tiene implicación alguna sobre el funcionamiento del diseño.

Fig#10. Validación de la variable IGUAL.


En la gráfica 11 se ingresa el valor de las palanquillas que se desean laminar a través del teclado. Este valor se debe mantener hasta que se presione la tecla ENTER, mientras se hace la codificación para mostrarlo en el display en su respectivo formato. Con la señal de ENTER se activa la los rodillos o banda.


Fig#11. Validación de la tecla ENTER.



En la gráfica 12 la señal del sensor activa el contador y se realiza la comparación con el valor almacenado en DEL_REG y CUENTA; cuando coinciden se activa la señal IGUAL, que indica la desactivación de la banda. Si el contador llega al valor inicial, se resetea y se pone a cero el valor del contador.



Fig#12. Validación de la variable CUENTA y IGUAL.


10. Corrección.

Ahora, si se desea usar una sola señal para activar y desactivar la banda, podría usarse una señal triestado, donde en su estado normal esté en alta impedancia. Para esto, se agrega un nuevo bloque y se modifica el comparador.

Con estos cambios el análisis gráfico 13 demuestra de nuevo, el arranque del circuito. La activación de la señal RODILLO tiene un cero, el cual no se ha logrado eliminar, pero igual podría eliminarse en la etapa de activación de la banda.

Fig#13. Validación de la variable RODILLO.


La desactivación de la banda si es plenamente correcta, como se aprecia:


Fig#14. Validación del resultado final.


11. Programación.

Una vez que se ha completado este proceso, el circuito está listo para su implementación física. Sin embargo, puede retornar a la ventana de procesos para el archivo Simulación_Mux.tbw y efectuar una simulación Post-Fit, es decir, una simulación en la cual se consideran los tiempos de retardo generados por la interconexión particular de los bloques lógicos dentro del PLD y que brinda una interesante oportunidad de estudiar el comportamiento real del circuito en el momento de ocurrir los cambios en sus entradas.

12. Esquemático.

El RTL, es un diagrama esquemático que muestra la interconexión de los componentes que integran el circuito en forma de bloques funcionales, es decir, no especifica el detalle de conexión eléctrica entre las señales. Por ejemplo, en la figura 12 se muestra una porción del penúltimo nivel del diagrama RTL del multiplexor, obsérvese que se muestra la utilización de una compuerta AND de 3 entradas.




Fig#15. Logica de compuertas internas en la fpga seleccionada.





Fig#16. Vista de la distribucion de entradas en la fpga seleccionada.


13. Implementación.

Una barra de progreso le indicará como transcurre el proceso de programación del PLD, hasta que el mensaje “Programming Suceded” le informe que ya ha programado al dispositivo de forma correcta.


Fig#17. Vista del programa implementado.
14. CONCLUSIONES.

· La programación de dispositivos permitió simular y verificar el correcto funcionamiento.

· El diseño con PDL tiene su propio diagrama de flujo, lo usamos en este trabajo para tomarlo como guía para conseguir el objetivo de programación y simulación.

· El modelo usado en este trabajo constituye una herramienta de gran utilidad para evaluar el lenguaje VHDL (Very High Speed Integrated Circuit Hardware Description Language) es un lenguaje de descripción de hardware estructurado para modelar sistemas digitales.

· Nos permitió programar una lógica digital en un lenguaje de descripción de hardware utiliza fundamentos teóricos de sistemas digitales. Las modificaciones en el diseño es flexible, es decir no necesitan un esfuerzo adicional notable con respecto a los desarrollos de hardware convencionales.
· Son herramientas de diseño confiable y automatizada.
·
· FPGA son dispositivos lógicos de propósitos general programables por los usuarios.

miércoles, 9 de enero de 2008

DSP

Un DSP de coma fija integrado en FPGA aplicado en Electrónica de Potencia


Abstract - Este artículo presenta el procesador "DSPuva16", desarrollado específicamente para aplicaciones de Electrónica de Potencia। Como indica su nombre, este procesador está orientado al cálculo: opera en coma fija de 16 bits extendiendo su precisión hasta 24 bits. Ejecuta regularmente operaciones MAC entre registros internos (rD = rD ± rS * rT) alcanzando 10 MIPS a 40 MHz. Este procesador ha sido probado físicamente sobre un sistema de desarrollo para FPGA.

La aplicación de este procesador en Electrónica de Potencia (sistemas de microgeneración fotovoltaica, filtros activos, control de motores de alterna, etc.) resulta bastante natural porque todas las magnitudes empleadas están limitadas en rango. Además, es posible utilizar diversos procesadores, con ciclos de trabajo entre 5 y 100 microsegundos, para ejecutar los diversos bucles de regulación y control de cada equipo.

Keywords: Procesador empotrado, DSP, Circuitos de Control.

I . INTRODUCCIÓN.

Los primeros dispositivos empleados para controlar convertidores electrónicos de potencia eran circuitos analógicos basados en amplificadores operacionales [7]. Cuando aparecieron los primeros microprocesadores y éstos tuvieron suficiente potencia de cálculo, fueron inmediatamente implantados en los circuitos de control [5] sustituyendo a sus equivalentes analógicos por sus inherentes ventajas de estabilidad, inmunidad al ruido y facilidad de ajuste.

Posteriormente se desarrollaron los procesadores digitales de señal (DSP), con una capacidad de cálculo muy superior, lo que permitió un control más preciso y alcanzar unas prestaciones notablemente superiores [2]. Actualmente estamos en un punto en el que es patente que no es suficiente controlar todo el sistema con un único procesador: se requiere controlar múltiples bucles de regulación, algunos de los cuales se han de ejecutar a muy altas frecuencias (cercanas al microsegundo) [6], y además se ha de atender al usuario (teclado, display, modem, servidor web para monitorización y configuración remota) con un comportamiento cada vez más exigente.

La solución más sencilla a este problema consiste en usar varios procesadores para atender las diversas tareas, pues no sólo resulta más barato y fácil de controlar que un único procesador de muy altas prestaciones, sino que además es la única manera de garantizar que el control se realiza en tiempo real.

Pero, ¿qué ocurre si se evalúa la posibilidad de conectar varios procesadores en una tarjeta de circuito impreso? Pues que inmediatamente nos encontramos con nuevos problemas: se requiere un elevado número de pistas para el flujo de datos entre procesadores, pues los canales serie estándar no siempre son suficientes; se necesitan elementos intermedios adicionales para acomodar las distintas velocidades de trabajo; los componentes empleados se vuelven rápidamente obsoletos, lo que obliga a rediseñar equipos completos. Todo esto conduce inevitablemente a unos costes elevados de ingeniería no recuperables.

El panorama es completamente distinto si se utilizan procesadores empotrados (embedded). Posiblemente sus prestaciones no sean tan buenas como las de sus homólogos dedicados, pero al estar todos integrados en un único chip (FPGA o ASIC) desaparecen inmediatamente todos los problemas anteriores: la comunicación entre procesadores es flexible e inmediata empleando memorias de doble puerto [4], su uso dentro de estos componentes apenas afecta al coste del conjunto [1], y la obsolescencia es nula ya que el diseño realizado siempre puede ser recompilado sobre otro dispositivo más moderno que, además de tener mayor capacidad, podrá funcionar a una frecuencia igual o mayor que la especificada para el componente anterior. La principal limitación que nos encontramos, sobre todo en el ámbito de las FPGA, es la imposibilidad de usar unidades de cálculo en coma flotante, pues resultan prohibitivas mientras no se integren a través de módulos cableados. Sin embargo, ya un que resulta más cómodo el uso de la coma flotante en aplicaciones de potencia, también es posible y no resulta excesivamente complejo el uso de aritmética en coma fija: todas la magnitudes (tensiones, corrientes, ganancias de reguladores) están limitadas, de forma natural como ocurre con las tensiones, o por imposición del algoritmo de control que no puede permitir sobrecargas en el sistema [6].
Por tanto, en este tipo de aplicaciones es normal el uso de varios procesadores de cálculo en coma fija y la incorporación de alguno de propósito general, para atender al usuario. La comunicación entre ellos en un dispositivo FPGA o ASIC no resulta costosa, pues apenas existen restricciones en el número de líneas, ya que son internas, ni en el ancho de banda ni en el tipo de recurso intermedio, pues las memorias de doble puerto apenas ocupan espacio. En este artículo se presenta un DSP en coma fija de suficientes prestaciones y pequeño tamaño, preparado para manejar un conjunto reducido de variables. Se ha diseñado con la idea de que es mejor emplear varios procesadores que resuelvan tareas distintas, pero acopladas, que un único procesador que haga todo el trabajo, lo que obligaría a emplear una frecuencia de reloj considerablemente mayor y un complejo esquema de interrupciones. En cambio, varios procesadores pueden ejecutar, a diferentes ritmos, cada uno de los distintos lazos de regulación del sistema, y su acoplamiento resulta fácil como se ve en la sección VII y se demuestra en [1].

II . CARACTERÍSTICAS GENERALES.

El DSPuva16 es un procesador de cálculo que trabaja en coma fija de 16 bits con precisión extendida de hasta 24 bits. Su arquitectura externa es tipo Harvard, pues accede por una parte a su memoria de programa (cuyo tamaño varía entre 256x16 y 4Kx16, según el modelo de procesador empleado) y por otros buses distintos a los datos (256 puertos síncronos de 16 bits).


Su operación básica es la multiplicación con acumulación, tanto positiva como negativa ("rD = rD ± rS * rT"), que ejecuta de forma regular en un único ciclo de instrucción. Éste se compone siempre de cuatro ciclos de reloj, como corresponde a su arquitectura RISC. Dispone de 16 registros de 24 bits, denominados de 'r0' a 'r15', que pueden ser empleados en cualquier operación salvo 'r0', que no puede ser usado como operando. Precisamente esta característica permite ampliar considerablemente las posibilidades del código de instrucciones sin añadir excesiva complejidad al diseño interno del procesador: cuando se encuentra la codificación equivalente al registro 'r0' en la ubicación del registro 'rS', se anula el valor del operando, y cuando se encuentra en la posición del registro 'rT', se sustituye su valor por una constante de 16 bits que se toma de la propia memoria de programa, sin retrasar la ejecución de la instrucción. Esto permite, por ejemplo, que una misma instrucción básica del procesador como es la suma (rD = rS + rT) permita operar con una constante inmediata (rD = rS + K) y realizar asignaciones directas a un registro (rD = 0 + rT; rD = 0 + K). Esta propiedad es ampliamente utilizada en la programación de filtros digitales, cuya estructura general es:

y(t) = c0·x(t) + c1·x(t −T) + ... + d1·y(t −T) + d2·y(t − 2T) + ...

donde todos los coeficientes son constantes. Los accesos externos se realizan a través de 256 puertos síncronos (cada acceso se completa en un único ciclo de reloj) con direccionamiento directo: "pN = rS; rD = pN"; donde 'N' es cualquier valor entero entre 0 y 255. Puede parecer que este tipo de direccionamiento es menos flexible que el indirecto, pero en el campo de aplicación de este procesador esto no supone ninguna limitación: es habitual que los puertos se correspondan con posiciones de memoria que amplían las capacidades de almacenamiento del procesador, o que conecten con dispositivos físicos que permitan leer o generar señales analógicas. En todo caso, el direccionamiento indirecto siempre es posible empleando un puntero externo al procesador, pero integrado en el mismo chip, pues debemos recordar que estamos trabajando dentro de una FPGA o un ASIC.

El control de las subrutinas es similar al de otros procesadores, pero el usuario debe dedicar un registro para guardar y retener la dirección de retorno; luego se puede emplear ese mismo registro para efectuar el retorno al punto de llamada। Si se desea llamar a una subrutina dentro de otra, siempre se puede guardar en una pila LIFO externa la dirección de retorno anterior, o bien usar otro registro para gestionar la nueva subrutina.

III. CONJUNTO DE INSTRUCCIONES.

El conjunto de instrucciones del DSPuva16, como se muestra en la tabla I, es muy sencillo. Consta únicamente de 17 instrucciones distintas, pero alcanza una notable flexibilidad gracias a cómo utiliza la codificación correspondiente a 'r0', tal como se ha explicado en el apartado anterior.

Siempre que se llama a una subrutina se guarda la dirección de retorno (PC + 1) en un registro, que suele ser 'r0' ya que no puede ser usado como operando. Sólo se dedican ocho bits para indicar la dirección de destino, lo que limita la longitud de los programas a tan sólo 256 instrucciones. Aunque no parezca mucho, esto es suficiente en muchos casos, pues como se ha dicho se prefiere emplear varios procesadores ejecutando cada uno de ellos un bucle específico de regulación. Sin embargo, se ha ampliado el código ejecutable del procesador utilizando un mecanismo sencillo y potente: se admiten hasta cinco modelos distintos de procesador ('A', 'B', 'C', 'D' y 'E'), con longitudes de programa de hasta 256, 512, 1K, 2K y 4K instrucciones. Cuando se efectúa un salto absoluto (con la instrucción 'call'), sólo se puede saltar a las posiciones pares cuando se emplea el modelo 'B', sólo a una de cada cuatro si se emplea el modelo 'C', y así sucesivamente. Eso significa que todas las subrutinas deben estar correctamente "alineadas" en la memoria de programa, para lo cual se ha creado la directiva del ensamblador "#align", y se indica qué modelo se está utilizando a través de la directiva "#model {A,B,C,D,E}". Los saltos condicionales son relativos, precisamente para evitar el problema que causaría el alineamiento de todas las direcciones de salto. Como muchos otros procesadores, el salto se debe realizar a una posición cercana (en un entorno de unas ±128 instrucciones), y se pueden usar las condiciones típicas dependientes del resultado anterior: 'eq', 'ne', 'gt', 'ge', 'lt', 'le', 'v' y 'nv'. Estas mismas condiciones pueden ser usadas para realizar asignaciones condicionales, como ocurre en "rN = rN; iflt rN = -rN", que calcula el valor absoluto de un número guardado en un registro.

Las lecturas (rD = pN) y escrituras (pN = rS) sobre puertos externos utilizan únicamente el modo de direccionamiento directo. Esto es adecuado en este procesador, pues está orientado a manejar un conjunto reducido de variables, aplica siempre y de forma regular el mismo algoritmo sobre los mismos datos, y emite siempre el mismo número de resultados. Los accesos son síncronos y se ejecutan en un único ciclo de reloj. Esto tampoco supone ninguna limitación, pues los recursos con los que se tiene que comunicar están implementados con la misma tecnología, al estar en el mismo chip, y por tanto pueden trabajar a la misma frecuencia de reloj. Las instrucciones que realizan productos, sumas y restas, y las operaciones lógicas, tienen una estructura regular de dos operandos y un registro de destino. Como ya se ha dicho, se amplían las posibilidades del conjunto de instrucciones permitiendo la anulación del primer operando ('rS') y la sustitución del segundo ('rT') por una constante de 16 bits ('K'). De esta manera, se pueden aplicar máscaras lógicas inmediatas (rD = rS and/or/xor K), se puede negar el contenido de un registro (rD = 0 nor rT) y se puede inicializar cualquier registro con una constante (rD = 0 + K).


La operación más importante de este procesador, y su razón de ser, es el producto en coma fija, con o sin acumulación. En general, se toman dos operandos de 16 bits en formato normalizado <1.15> (un bit entero que contiene el signo y 15 bits fraccionarios, lo que permite representar números entre -1.0 y +0.99996948), entregando un número de 24 bits también normalizado (un bit entero de signo y 23 bits fraccionarios, lo que se denota como <1.23>, y que permite representar números entre -1.0 y +0.99999988). Cuando al producto le sigue una acumulación, tanto positiva como negativa, esta última operación se hace con operandos de 24 bits, para no perder precisión.

También se ha incorporado un tipo de producto (rD = rS x rT) que permite realizar desplazamientos. El segundo operando se interpreta en formato <8.8>, es decir, ocho bits de parte entera y otros ocho de parte fraccionaria, con lo que se puede representar, entre otros, números como 1/128, 1/64, ..., 1/4, 1/2, 2, 4, ..., 32 y 64, además de otros valores intermedios. El resultado se produce igual que antes en formato normalizado <1.23>. Otras instrucciones típicas se han implementado como "macros" reconocidas por el lenguaje ensamblador. La macroinstrucción 'nop', que no debe hacer nada, se sustituye por "r1 = r1 or r1" y la macroinstrucción 'break', que permite introducir puntos de parada en el simulador, se reemplaza por "r1 = r1 and r1". El emulador no dispone de puntos de parada.

IV. CICLO DE INSTRUCCIÓN.

Como hemos indicado, la arquitectura interna de este procesador es RISC. Eso significa que ejecuta todas sus instrucciones de forma regular, en particular en cuatro ciclos de reloj. Aunque, desde el punto de vista del usuario, todas las instrucciones se ejecutan en cuatro ciclos, realmente existe cierto solapamiento entre instrucciones, y de hecho muchas instrucciones se terminan cuando ya se está ejecutando la siguiente. En cualquier caso, sólo se produce un único efecto de "latencia" que será explicado más tarde. Todas las instrucciones comienzan leyendo de la memoria de programa el código de la operación que se debe realizar, dedicando a esta función los dos primeros ciclos de reloj.

Después de emplean otros dos ciclos para leer los operandos, 'rS' en primer lugar y después 'rT'. Este último es sustituido por una constante leída de la memoria de programa si se hace referencia a 'r0'. Por último, en el primer ciclo de la siguiente instrucción, se realiza la operación solicitada y se almacena el resultado en 'rD'.

1) Envía PC a la memoria de programa.
2) Recoge el código de la instrucción sobre IR.
3) Lee rS sobre un acumulador intermedio ACC.
4) Lee rT sobre RegT y lleva el valor de ACC a RegS.
1') Guarda en 'rD' la operación entre RegS y RegT.

El contador de programa PC se incrementa durante la fase '2' y, si se lee una constante de la memoria, también durante la fase '4'. Si la operación requiere un salto ('call', 'ret', 'jpFlag'), no se guarda ningún resultado de ninguna operación, sino que únicamente se modifica el contador de programa durante la fase '4'.

Con este esquema tan sencillo es posible ejecutar todas las instrucciones salvo las de producto. Como veremos enseguida, el multiplicador de este procesador requiere cuatro ciclos de reloj para completar su operación, pues así puede tener un tamaño mucho menor1 y no deteriora la frecuencia de trabajo del conjunto. Para efectuar las multiplicaciones, con o sin acumulación, se emplean los cuatro ciclos de la siguiente instrucción y otros dos de la posterior:

1) Envía PC a la memoria de programa.
2) Recoge el código de la instrucción sobre IR.
3) Lee rS sobre el registro intermedio ACC.
4) Lee rT sobre RegT y lleva el valor de ACC a RegS.
1') Primera fase del MAC usando RegS y RegT.
2') Segunda fase del MAC usando RegS y RegT.
3') Tercera fase del MAC usando RegS y RegT.
4') Cuarta fase del MAC usando RegS y RegT.
1") Ciclo adicional por la segmentación del multiplicador.
2") Lee 'rD' y opera con el resultado del MAC.

De esta manera se introduce una latencia que habrá de tener en cuenta el programador: el resultado de un producto no está disponible para su uso general en la instrucción siguiente, sino en la inmediatamente posterior. En cambio, cuando se utiliza en posición acumuladora se evita la latencia, pues la acumulación también se lleva a cabo un ciclo tarde. Esto se ilustra en el siguiente ejemplo:

r1 = 0.27 // Se asigna un valor al registro r1
r2 = r1 + 0.32 // Correcto, pues ya se dispone de r1
r3 = r1 * r2 // Se multiplican los valores de r1 y r2
r3 = r3 + r2 * r2 // El uso acumulativo de r3 es correcto
nop // Se espera a que termine el cálculo de r3
p4 = r3 // Ahora, y no antes, r3 vale r1*r2+r2*r2

Por tanto, cuando se quiere usar el resultado de un producto, salvo cuando se hace en posición acumuladora, hay que añadir un 'nop' después de la multiplicación para dar tiempo a que se calcule el resultado. Ésta es la única latencia que introduce la arquitectura segmentada de este procesador.

V. ARQUITECTURA INTERNA.

El DSPuva16 ha sido descrito usando Verilog y se basa, como muestra esquemáticamente la figura 2, en una arquitectura RISC de dos buses de 24 bits, uno para los operandos y el otro para los resultados.


El contador de programa ('PC') tiene entre 8 y 12 bits, según el modelo de procesador implementado. El código de instrucción que se recibe a través de 'IR' tiene siempre 16 bits. Empleando este valor, un decodificador de instrucciones segmentado va activando cada parte del circuito hasta completar cada operación. El banco de registros, que retiene los valores de 'r0' a 'r15', es una memoria con escrituras síncronas y lecturas asíncronas de tamaño 16x24. Ocupa sólo 24 celdas básicas en algunos dispositivos FPGA, lo que equivale al 5% de todo el procesador. La ALU, por su parte, se compone de tres unidades que realizan operaciones lógicas, aritméticas o multiplicativas. Después de cada instrucción se actualizan los flags de "cero" ('Z'), "signo" ('S') y "desbordamiento" ('V') que permiten efectuar las asignaciones y los saltos condicionales correspondientes. No se dispone de acarreo ('C') pues no es necesario en los programas que se han de ejecutar.

Cuando se intercambian datos con elementos externos se utilizan dos buses distintos, uno para enviar datos y otro para recibirlos, lo que evita algunos buffers triestado que, por otra parte, son innecesarios dentro de un chip.

A. Arquitectura de dos buses.

Muchos procesadores RISC tienen actualmente tres o más buses, lo que permite incluso realizar todas las operaciones relativas a cada instrucción en un único ciclo de reloj. Ya que este procesador necesita cuatro ciclos de reloj para completar cada multiplicación, y que el uso de un tercer bus nos conduciría a emplear memorias de doble puerto para el banco de registros2, se ha optado por dedicar un único bus para los operandos. Por este bus circulan los valores de 'rD' durante los dos primeros ciclos de cada instrucción y los valores de 'rS' y 'rT' durante los dos últimos.

El bus de resultados se dedica a recoger las salidas de las diferentes unidades de cálculo y de otras fuentes, como son la entrada de datos externos cuando se lee de un puerto y el valor del contador de programa cuando se llama a una subrutina, para guardar la dirección de retorno en un registro.

B. Multiplicador de cuatro etapas.

La operación central de este procesador es la multiplicación. Opera sobre dos valores de 16 bits y emite un resultado de 32, de los cuales sólo están disponibles finalmente 24. En general los operandos están en formato <1.15> y el resultado en formato <1.23>. Para construir el multiplicador se ha decidido dividir la operación en cuatro etapas3, multiplicando en cada paso un operando de 16 bits por otro de sólo cuatro bits, y emitiendo un resultado intermedio de 20 bits. Esta operación se puede realizar con cuatro sumadores y con un registro intermedio de segmentación. Si toda la operación se realizara en un único paso se necesitarían 15 sumadores ocupando una superficie cuatro veces superior, y sólo se conseguiría mantener la frecuencia de trabajo introduciendo registros intermedios, que no reducirían el tamaño del conjunto.


VI. ENTORNO DE DESARROLLO.

El entorno de desarrollo integrado de este procesador, denominado "IDEuva16", se corresponde con las necesidades que se encuentran cuando se aplica al control de convertidores electrónicos de potencia. Los programas típicos que tiene que ejecutar este procesador suelen tener entre cincuenta y mil instrucciones, que se corresponden con los 5 a 100 microsegundos típicos de sus ciclos de trabajo. Por tanto, la programación en lenguaje ensamblador es suficiente.


En todo caso, la sintaxis empleada por las instrucciones es bastante cómoda, como se ha podido apreciar hasta ahora. El programa IDEuva16 se ejecuta en modo gráfico4 e incorpora un editor sencillo, un ensamblador con preprocesador, un simulador y un enlace con el procesador físico para controlarlo en modo emulador, a través del puerto paralelo del ordenador o por conexión USB. En la figura 4 se muestra el resultado de una simulación en la que se calcula "r2 = sin(r1); r3 = cos(r1)" con un ángulo "r1 = 0.4·π". Todo el proceso se ejecuta en 14 microsegundos.

Después de editar el código fuente ensamblador, donde se dispone de las típicas directivas "#include", "#define", "#ifdef", etc., se realiza el ensamblado simplemente pulsando un botón. El proceso tarda apenas unos segundos. Después se puede simular paso a paso o hasta una instrucción 'break'; también se pueden ejecutar miles o cientos de miles de instrucciones en un solo paso, pues los tiempos que se necesita simular son en general de varios milisegundos. El proceso completo de simulación suele tardar unos minutos empleando un Pentium 4. La ventaja que tiene este modo es que se ve completamente cómo se comporta el procesador, incluso gráficamente a través de una ventana sobre la que se puede ir volcando los resultados (usando los puertos 'p0' a 'p15').

Cuando los algoritmos son suficientemente estables se puede pasar al "modo emulador": se sintetiza e implementa un DSPuva16 sobre una FPGA, que se conecta al ordenador a través de un interfaz adecuado. El propio entorno de desarrollo transfiere a la memoria de programa del DSP el producto del ensamblado, y luego se controla su estado de reset-run. Cuando el usuario detiene el procesador se capturan los resultados intermedios o finales emitidos por éste a través de algunos de sus puertos, visualizándolos en la pantalla del ordenador.

La diferencia entre la simulación y la emulación es que la primera se hace completamente en el ordenador, mientras que la segunda se ejecuta en tiempo real sobre el equipo físico, implantado de momento en una FPGA5.

VII. SISTEMAS MULTIPROCESADOR.

La principal ventaja de este DSP es su reducido tamaño: apenas ocupa el 12% de una FPGA de 200K puertas. Esto significa que, aunque un único DSP no pueda realizar toda la tarea de control, no es demasiado costoso añadir otros hasta alcanzar las prestaciones deseadas. En una aplicación de potencia que se está desarrollando, y en la que se está empleando este DSP como elemento de control, es necesario sincronizar un equipo fotovoltaico con la red eléctrica y regular las potencias activa y reactiva que se intercambian; esta tarea la realiza un primer DSP con un ciclo de trabajo de 25 microsegundos. También es necesario controlar las corrientes del equipo y la frecuencia de conmutación de los polos de potencia, y esto se ha de realizar al menos cada 5 microsegundos; esta tarea la realiza un segundo DSP.

Actualmente se ha emulado el comportamiento del circuito eléctrico cada microsegundo con un tercer DSP que opera en 60 microsegundos6, y todo dentro de una única FPGA empleando en total unas 100K puertas equivalentes. Para la comunicación entre procesadores en este ámbito se han usado memorias de doble puerto[4], aunque no está limitado a este procedimiento: un DSP lee y escribe por un puerto de la memoria, mientras otro DSP lee, pero no puede escribir. Para cada DSP los intercambios son accesos normales a puertos (rD = pN; pN = rS). Empleando este recurso, que ocupa muy poco espacio en una FPGA, no es necesario preocuparse de ningún tipo de conflicto en la compartición de recursos: ambos procesadores pueden usar la memoria común en cualquier momento. Tampoco es necesario señalizar o sincronizar las transferencias, pues la frecuencia natural de las señales compartidas es muy inferior al ciclo de trabajo de los procesadores, por lo que apenas importa que los valores leídos por el procesador de destino se correspondan con los valores actuales o los anteriores, emitidos por el otro DSP.

VIII. CONCLUSIONES.

En este artículo se ha mostrado cómo es el procesador DSPuva16 y cómo, a pesar de sus limitadas características, puede resolver fácilmente problemas complejos de control en tiempo real, simplemente añadiendo tantos procesadores como se necesite, pero siempre dentro de un chip। Su principal limitación es que opera con pocos datos y en coma fija, pero como hemos visto eso no supone ningún problema en el control de convertidores electrónicos de potencia, pues todas las magnitudes físicas son fáciles de normalizar y no es difícil garantizar que se van a mantener dentro de un determinado rango, salvo situaciones de avería que provocarían la parada del equipo. El DSP completo, descrito en Verilog, ocupa unas 24.000 puertas equivalentes.

Informacion complementaria.

Toda la informacion antes presentada fue obtenida de un paper de la SAAEI 2005 realizada por:

Santiago de Pablo, Jesús Cebrián, Luis C. Herrero
Departamento de Tecnología Electrónica
Universidad de Valladolid Valladolid (España)
sanpab@eis।uva.es
Alexis by Rey
Dpto। Electrónica, Tecn. de Computadoras y Proyectos Universidad Politécnica de Cartagena Cartagena, Murcia (España) alexis.rey@upct.es

y a continuacion se presenta el complemento de dicha informacion.

INTRODUCCION

El procesamiento digital de señales, es una herramienta tecnológica importante, para dar forma a la ciencia de la ingeniería del siglo XXI. Como consecuencia, se han generado revolucionarios cambios como: telecomunicaciones, imágenes medicas, radar, sonar, y audio de lata fidelidad, entre otros.

Cada área específica ha desarrollado sus propios algoritmos, consideraciones matemáticas y técnicas especializadas, procurando obtener un mejor desempeño de aplicaciones. Por tanto, puede dividir se la tarea del conocimiento en PDS como: aprendizaje de concepciones generalizadas para obtener una idea global, seguida de particularización para la solución requerida.

El desarrollo fundamental de señales, se desarrolla fundamentalmente a partir de operaciones matemáticas, a diferencia de otras disciplinas basadas en almacenamiento de datos. Por tanto, los elementos de cálculo diseñados para aplicaciones generales, no representan óptimos desempeños en procesos que implican filtración o análisis de Fourier.

Adicionalmente, las exigencias actuales a nivel de almacenamiento y velocidades de operación en procesos robustos de señal, han impulsado el desarrollo de nuevas tecnologías. Es por este motivo que fabricantes como: Motorola, Analog Devices y Texas Instruments, se han dado la tarea de desarrollar dispositivos especializados para PDS.

¿Qué es un DSP?

DSP = Digital Signal Processor

Procesador de propósito particular (dedicado), con características especiales a nivel estructural, que permiten maximizar su rendimiento en términos de capacidades de memoria y velocidad de proceso.

Diagrama de bloques conceptual de un sistema típico.
(Colocar)

DSP vs. µP.

En un microprocesador es posible encontrar una memoria lineal, en la que se almacenan tanto datos como instrucciones de programa. Esto obliga a generar rutinas que no sobrepasen límites de tamaño ya que podrían sobreescribirse datos por instrucciones o viceversa.

Un DSP posee dos bloques separados e independientes de memoria, cada uno con su propio bus de acceso facilitando el direccionamiento de instrucciones y datos en un mismo ciclo de reloj.

Otra diferencia importante, (aun entre DSP's) es la cantidad de unidades de ejecución que poseen, las cuales son capaces de realizar operaciones en paralelo. Por ejemplo, además de la típica ALU, un DSP posee bloques MAC de multiplicación y acumulación. Se encuentran también bloques solo para corrimientos (shifters).

Una unidad funcional rápida que puede multiplicar y acumular en un ciclo de instrucción. Un ciclo de instrucción puede durar generalmente 1 o 2 ciclos de reloj. Disponibles en DSP's de punto fijo y flotante.

Varias unidades funcionales que realizan operaciones en paralelo, incluyendo accesos a memoria y cálculo de direcciones. Las unidades poseen típicamente una unidad principal (ALU) junto con dos o más unidades de generación de direcciones. Estas unidades funcionales poseen su propio conjunto de registros y muchas instrucciones se realizan en un solo ciclo de reloj.

Varias unidades de memoria on-chip (generalmente 2 o 3) usadas para almacenar instrucciones, datos o tablas. Cada unidad de memoria puede ser accesada una vez en cada ciclo de instrucción.
Varios buses para incrementar las tasas de transferencia hacia y desde memoria y evitar conflictos de direcciones.

Arquitectura DSP.

Soporte para tipos especiales de direccionamiento, especialmente modulo y bit-reverse, requerido en el calculo de la FFT. Direccionamiento modulo es muy eficiente para la implementación de buffers circulares.

Soporte para manejo de loop con bajo costo en tiempo y manejo rápido de interrupciones, especialmente aquellas que se deben a los puertos seriales.
Punto fijo y flotante.

El procesamiento digital de señales, puede dividirse en dos categorías: de punto fijo, y de punto flotante, dependiendo del formato utilizado para almacenar y manipular valores numéricos en dispositivos.

Características relevantes.

- Costo.
- Complejidad estructural.
- Resolución.
- Capacidad de representación.
- Rango dinámico.
- Velocidad de proceso.

Ventajas de un DSP.

- Eficiencia de desempeño comparada con otros tipos de procesadores, debido a su condición de uso particular.
- Minimización en costo y riesgo, para el desarrollo de aplicaciones, consecuencia de una tecnología con extensa experiencia en sus bases de diseño.
- Soporte para ejecutar aplicaciones, con gran cantidad de operaciones de multiplicación y acumulación (MAC) por segundo.
- Posibilidad para ejecutar manipulación de aritmética compleja y de punto flotante.
- Entornos de programación mas amigables (C/C++), para el desarrollo de aplicaciones en procesamiento de señales.
- Disponibilidad de registros de algoritmos desarrollados a nivel de bibliotecas.

Algunos de los ejemplos de los usos de DSP's en la actualidad son:

1. Wireless LAN
2. Reconocimiento de Voz
3. Manejo de imágenes digitales.
4. Reproductores digitales de audio.
5. Teléfonos celulares.
6. Módems inalámbricos.
7. Cámaras digitales.
8. Control de motores
9. Manejo de bombas, ventiladores, HVAC.
10. Inversores industriales.
11. Automatización de fábricas.
12. Transporte.

Los DSP de Texas instruments:

Particularmente, se divide en 3 líneas dependiendo del campo de aplicación:

- c2x : Control de procesos.
- c5x : Telecomunicaciones.
- c6x : Aplicaciones de alto desempeño.

DSP TI C6x

Es un dispositivo de punto flotante, que posee entre otras las siguientes características:

- 8 unidades funcionales independientes (6 ALUS's y 2 Multiplicadores).
- 32 registros de propósito general (32-bits).
- 900 millones de operaciones en punto flotante por segundo (MIPS).
- 6.7ns para un ciclo de maquina.
- Hasta 8 instrucciones de 32 bits por ciclo.
- Direccionamiento de 32 bits.
- 8 bits de protección para sobreflujo.
- Interfase por puerto PCI.
- Códec para audio estéreo de 16 bits (5.5 48 KHz)…

¿Cómo se manipula?

A través de un interfaz Windows, denominada "Codec Composer Studio", se realiza comunicación con el dispositvo de hardware, utilizando como base el conjunto de comando ansi C.

Adicionalmente, pueden realizarse aplicaciones un tiempo real gracias a un kernel desarrollado para tal fin (DSP Bios), y a una poderosa herramienta de comunicación (RTDX).

¿Assembler o C?

Los DSP's, se programan en los mismos lenguajes que otras aplicaciones científicas o de ingeniería. Usualmente se usa C (de fácil mantenimiento y desarrollo) o ensamblador (para aplicaciones rápidas).

Conclusiones

Un procesador digital de señales DSP, es un dispositivo especialmente construido para realizar tareas de fuerte carga computacional en corto tiempo de proceso. Sus características especiales a nivel de arquitectura, asumen un conocimiento previo de la misma, para ejecutar aplicaciones con máximo aprovechamiento de recursos. Presentan como ventaja, la posibilidad de operar desde entornos de alto nivel, consecuencia de un enfoque vanguardista que busca facilidad de interacción.