Full text
UNIVERSIDAD DE SEVILLA Departamento de Electrónica y Electromagnetismo Microchips convolucionadores AER para procesado asíncrono neocortical de información sensorial visual codificada en eventos Memoria presentada por LUIS ALEJANDRO CAMUÑAS MESA para optar al título de doctor. Sevilla, Marzo 2010.
Microchips convolucionadores AER para procesado asíncrono neocortical de información sensorial visual codificada en eventos Memoria presentada por LUIS ALEJANDRO CAMUÑAS MESA para optar al título de doctor. Sevilla, Marzo 2010. Director Dr. Bernabé Linares Barranco Codirectores Dra. Teresa Serrano Gotarredona Dr. Antonio José Acosta Jiménez Tesis realizada en el Instituto de Microelectrónica de Sevilla, Centro Nacional de Microelectrónica (IMSE-CNM), perteneciente al Consejo Superior de Investigaciones Científicas (CSIC) UNIVERSIDAD DE SEVILLA Departamento de Electrónica y Electromagnetismo
Microchips convolucionadores AER para procesado asíncrono neocortical de información sensorial visual codificada en eventos Memoria presentada por LUIS ALEJANDRO CAMUÑAS MESA Director Dr. Bernabé Linares Barranco Codirectores Dra. Teresa Serrano Gotarredona Dr. Antonio José Acosta Jiménez UNIVERSIDAD DE SEVILLA Departamento de Electrónica y Electromagnetismo
Agradecimientos Cuando el presente documento empezó a tomar forma, supe que con él culminaba una etapa importante de mi vida, e inmediatamente después tuve claro que no había llegado hasta aquí solo, sino que había mucha gente detrás de mí a lo largo de todos estos años. Así comenzó la sección de agradecimientos. Al principio pensé englobar toda esta sección dando gracias a la vida, que me ha dado tanto, pero para ahorrarme pagar derechos de autor a los herederos de Violeta Parra decidí recurrir a mis propias palabras. Resulta impensable empezar a hablar sin mencionar en primer lugar a las personas que me han dirigido durante estos años, sin los cuales esta tesis no existiría. Por eso quiero comenzar dando las gracias a Bernabé por haberme guiado pacientemente hasta aquí, por supuesto con la ayuda permanente de Teresa y Antonio, que siempre han tenido un momento para resolver mis dudas y corregir mis errores. Muchas otras personas han sido importantes en el desarrollo de este trabajo, tantas que es difícil nombrarlas a todas. Por una parte, todos los compañeros que han formado parte de mi grupo de investigación, especialmente Rafa, que con su trabajo marcó el camino que yo continué. Y por otra parte, los compañeros del Departamento de Arquitectura y Tecnología de Computadores, por facilitar siempre mi labor en el laboratorio. Es inevitable recordar también a los demás grupos con los que tuve la suerte de colaborar en el proyecto CAVIAR, tanto de la Universidad de Oslo como de la Universidad de Zürich, donde tan bien me acogieron durante mi estancia en tierras helvéticas. No puedo dejar de mencionar a tantos compañeros que han pasado por el Instituto de Microelectrónica de Sevilla a lo largo de este tiempo, de los que tanto he aprendido, especialmente a los que han estado compartiendo despa-
cho conmigo cada día, y que han dejado de ser solamente compañeros para convertirse en amigos. Todos estos agradecimientos han estado referidos al ámbito laboral, pero lógicamente por encima de todo nunca podré terminar de darles las gracias a mis padres, porque todo lo que soy se lo debo a ellos, y tienen el enorme mérito de haber conseguido darme todas las oportunidades que ellos nunca tuvieron. En el ámbito formativo, esta tesis supone una meta importante tras toda una vida estudiando, así que no puedo olvidar que la primera persona que ejerció de profesora conmigo fue mi hermana. Por eso y por haber estado siempre a mi lado le doy las gracias, sin olvidarme de mi cuñado Rafa, cuyo apoyo en los últimos años ha sido muy importante para mí. A la hora de referirme a los amigos, ni siquiera es necesario que los nombre, porque ellos ya saben perfectamente quiénes son y cuánto les agradezco que hayan estado conmigo siempre que lo he necesitado. Mucho más que agradecimiento le debo a Carmen, por hacer que todo tenga sentido, por ser mi única certeza en un mundo de incertidumbres, por jugar todos los días con la luz del Universo. Obligado ya por la excesiva extensión de esta sección, doy por cumplida la ración de agradecimientos insistiendo en que todos los aquí nombrados tienen una parte de “culpa” en la finalización de este trabajo.
i Índice CAPÍTULO 1 Introducción.................................................................1 1.1. Antecedentes ............................................................................. 1 1.2. Objetivos ................................................................................... 4 1.3. Estructura del documento.......................................................... 5 CAPÍTULO 2 Sistemas de procesamiento basados en eventos.......7 2.1. Introducción .............................................................................. 7 2.2. Representación visual basada en fotogramas............................ 8 2.3. Representación visual basada en eventos................................ 10 2.3.1. Ventajas del sistema basado en eventos............................. 12 2.3.2. Tipos de codificación......................................................... 14 2.4. El protocolo Address Event Representation (AER)................ 15 2.4.1. Ventajas de AER................................................................ 18
Introducción 4 Al emular el comportamiento del cerebro mediante una estructura de sistemas convolucionadores como se muestra en la Fig. 1.1, nos encontramos una importante limitación. Cada uno de los convolucionadores incluye una gran cantidad de unidades de procesamiento (píxeles), cada uno de los cuales necesita comunicarse con todos los píxeles de los convolucionadores de la siguiente capa, para así poder imitar la estructura del cerebro. Sin embargo, los sistemas electrónicos imponen ciertas limitaciones físicas a la hora de interconectar poblaciones de píxeles del orden de integradas en distintos chips. Para eso utilizamos el protocolo AER (Address Event Representation). Gracias a este protocolo, una gran cantidad de neuronas integradas en un chip pueden comunicarse con las neuronas de otro chip multiplexando las conexiones en un único bus digital asíncrono. Así, los eventos generados por cada neurona se propagan a través de buses AER entre las distintas capas de los sistemas de procesamiento. 1.2. Objetivos En este trabajo, se presentan dos versiones diferentes de microchips convolucionadores completamente digitales basados en el protocolo AER para sistemas de procesamiento visual basados en eventos. Estos chips constituyen la unidad básica para construir sistemas complejos multicapa a partir de la interconexión en serie y en paralelo de diferentes muestras de los mismos. Cada uno de ellos permite realizar convoluciones con kernel programable de un tamaño máximo de . La primera versión de chip Conv1 opera sobre un array de píxeles de tamaño , aunque está diseñado para poder construir sistemas equivalentes de mayor resolución conectando varias muestras en paralelo. La segunda versión Conv2 cuenta con un tamaño 4 veces mayor, píxeles, y además implementa la funcionalidad multikernel. Esta funcionalidad permite programar varios kernels diferentes dentro de un mismo chip (hasta 32) para que éste pueda recibir eventos de varios chips diferentes de una capa anterior, y aplicarle a cada uno de ellos un kernel diferente en función de su origen. Esto está especialmente indicado para facilitar la implementación de sistemas multicapa, a imitación de la corteza cerebral, y siguiendo 103 32 32× 32 32× 64 64×
5 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos las estructuras típicas del paradigma conocido como “Convolutional Neural Networks”. En el presente documento se describen detalladamente las arquitecturas de cada una de las dos versiones propuestas de chips de convolución, así como algunos resultados experimentales obtenidos. 1.3. Estructura del documento El documento está estructurado de la siguiente forma. En primer lugar, en el Capítulo 2 se presentan las ventajas de los sistemas de procesamiento visual basados en eventos, frente a los tradicionales sistemas basados en fotogramas. Este capítulo incluye también una descripción del protocolo AER, imprescindible para construir sistemas de procesamiento por eventos. El Capítulo 3 hace un repaso sobre las estructuras multicapa bioinspiradas de procesamiento de imagen, justificando el uso de la operación de convolución como unidad básica de este tipo de sistemas, describiendo también la arquitectura propuesta para los chips de convolución basados en AER. En el Capítulo 4 se describe en detalle el píxel de convolución como base de los chips propuestos, analizando las dos versiones diferentes, mientras que en el Capítulo 5 se detallan el resto de circuitos periféricos incluidos en los chips de convolución. El Capítulo 6 muestra exhaustivos resultados experimentales obtenidos a partir de las dos versiones Conv1 y Conv2. Por último, el Capítulo 7 presenta las conclusiones.
Introducción 6
7 CAPÍTULO 2 Sistemas de procesamiento basados en eventos 2.1. Introducción A la hora de hacer procesamiento de visión en tiempo real, los sistemas tradicionales basados en fotogramas tienen importantes limitaciones. El principal motivo de estas limitaciones es la propia naturaleza secuencial de sensado y procesado fotograma a fotograma. Si comparamos los sistemas artificiales de procesamiento de imagen con la forma de llevar a cabo las mismas tareas por parte del cerebro humano, podemos sacar una conclusión interesante: la unidad de procesamiento básica del cerebro, la neurona, es mucho más lenta que cualquier ordenador a la hora de hacer una operación sencilla, pero aun así, el cerebro es mucho más eficiente gracias a su modo de funcionamiento basado en el paralelismo. Mientras que las representaciones clásicas de imágenes por fotogramas tienen un carácter secuencial (es decir, hasta que no se termina de ejecutar una tarea sobre un fotograma completo no se puede pasar a la siguiente tarea), los sistemas biológicos se basan en la ejecución en paralelo de muchas actividades diferentes. Para implementar este paralelismo, cada neurona envía pulsos de información a otras muchas neuronas simultánea-
Sistemas de procesamiento basados en eventos 8 mente. De este modo, la información ya no se procesa en forma de fotogramas, sino en forma de pulsos, también llamados eventos. Por otra parte, para que el sistema basado en eventos sea eficiente es necesario que haya una masiva interconexión entre neuronas que permita que la información se procese en paralelo. Para permitir esa gran capacidad de interconexión entre neuronas se utiliza el protocolo AER (Address Event Representation), que permite que dos grandes poblaciones de neuronas se comuniquen entre sí multiplexando las conexiones a través de un único bus común. En este capítulo se justifica la utilización de sistemas de procesamiento de imagen basados en eventos. Para ello, en la Sección 2.2 se describen los sistemas tradicionales basados en fotogramas, mientras que en la Sección 2.3 se detallan los sistemas de procesamiento por eventos, poniendo especial énfasis en las principales ventajas que presenta sobre el anterior. Por último, en la Sección 2.4 se desarrolla el protocolo AER. 2.2. Representación visual basada en fotogramas Al tratar sobre el procesamiento de imágenes, una de las primeras cuestiones que tenemos que considerar es de qué forma se representan las imágenes para poder trabajar con ellas. En el caso más genérico de imágenes en movimiento, el concepto de fotograma se encuentra tan arraigado a los sistemas de visión que con frecuencia se da por supuesto, ya que tradicionalmente ha sido así. La imagen en el mundo real es continua tanto en el espacio como en el tiempo, así que el primer paso es muestrear en el tiempo, es decir, capturar imágenes estáticas a intervalos regulares [1]. Cada una de estas imágenes es un fotograma. De este modo, se capturan fotogramas a intervalos regulares y al reproducirlos todos seguidos producen para el ojo humano la sensación de movimiento, como muestra la Fig. 2.1. Para ello es fundamental una buena elección del tiempo de muestreo . De forma habitual se usa la frecuencia de fotograma , expresada en fotogramas por segundo (fps) T s f s 1T s ⁄=
9 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos o Hertzios. Las frecuencias de fotograma de algunos de los sistemas más conocidos van desde los 16-18 Hz que se empezaron a utilizar durante los tiempos del cine mudo hasta los 24 Hz usados en el cine actual. En cuanto a la televisión, existen varios estándares de codificación. Tanto el sistema PAL (Phase Alterning Line) [3] como el SECAM (Séquentiel Couleur à Mémoire), utilizados en Europa, Asia, Africa, Oceanía y parte de Sudamérica, muestrean a 25 Hz, que es la mitad de la frecuencia de la corriente eléctrica usada en estos lugares (50 Hz). Sin embargo, el sistema NTSC (National Television System Committee) [4] extendido en la mayor parte de América y Japón tiene una frecuencia de muestreo de 29.97 Hz, que es prácticamente la mitad de la frecuencia de la corriente eléctrica que en estos países es de 60 Hz. De este modo, los sistemas tradicionales de procesamiento de imagen basados en fotogramas se comportan conceptualmente según se indica en la Fig. 2.2. La cámara o sensor captura una imagen estática cada , almacenando la información de cada uno de los píxeles. Cuando se trata de FIGURA 2.1. Secuencia de un caballo de carreras galopando publicada por Eadweard Muybridge en 1887 en Philadelphia [2]. Con 16 fotogramas recrea la sensación de movimiento al reproducirlas todas seguidas. Tfotograma
Sistemas de procesamiento basados en eventos 10 utilizar estos fotogramas como entradas de un sistema de procesamiento, nos encontramos una serie de limitaciones. En primer lugar, se pierde la información de cualquier cambio que ocurra entre dos instantes de muestreo , haciendo imposible la aplicación a un sistema que se mueva a una velocidad mayor que el propio tiempo de muestreo. Por otra parte, en el caso de que la mayor parte de la imagen no cambie entre dos instantes de muestreo (o incluso la imagen entera permanezca invariable), el sistema va a capturar y procesar un fotograma completo, aunque de ello no obtenga ninguna información. Así pues, los sistemas de procesamiento basados en fotogramas no sirven para aplicaciones de alta velocidad, pero además son enormemente ineficientes para aplicaciones de baja velocidad. Una consecuencia de esta ineficiencia es que en cada instante de muestreo hay que procesar una gran cantidad de información (la imagen completa), lo que puede acarrear una considerable carga computacional. Sin embargo, para una aplicación en tiempo real todo el procesamiento tiene que haber terminado antes de que se capture el siguiente fotograma, limitando también las posibilidades de llevar a cabo una computación más compleja sobre la imagen de entrada. 2.3. Representación visual basada en eventos Los cerebros biológicos no procesan la visión fotograma a fotograma, sino que están basados en eventos [5]. En una retina, cada píxel envía un pulso (también llamado evento) al córtex cerebral cuando su nivel de actividad alcanza un umbral, de modo que la información se transmite conforme FIGURA 2.2. Descripción conceptual del procesamiento de imágenes basado en fotogramas. T i
11 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos se produce, sin esperar que llegue un instante de muestreo artificial que no guarda ninguna relación con la realidad. De este modo, una retina se encarga de sensar una determinada propiedad (que puede ser por ejemplo un cambio en la intensidad [6] o el contraste espacial [7]), y cuando detecta un nivel determinado de esa propiedad en un píxel cualquiera envía un evento (que habitualmente incluye la información de qué píxel lo ha generado). Así, cada vez que se produce un evento se actualiza el estado de todo el sistema, aunque esto sólo afecta a las partes de la imagen que aportan alguna información, evitando la carga computacional innecesaria. Observando la Fig. 2.3 se puede entender con facilidad cómo se lleva a cabo el proceso de sensado en un sistema basado en eventos. Mientras que la cámara de la parte superior de la imagen captura un fotograma a intervalos regulares de , el sensor de la parte inferior genera eventos de salida de forma continua, codificando de este modo la información de lo que está ocurriendo en cada momento en una zona cualquiera de la imagen. Así, el sistema de computación actualiza su estado después de cada evento, efectuando operaciones de menor carga computacional que en el caso del FIGURA 2.3. Comparación a nivel conceptual entre el sensado y procesamiento de imagen basado en fotogramas y basado en eventos. Tframe
Sistemas de procesamiento basados en eventos 12 sistema basado en fotogramas, ya que los eventos sólo afectan en general a una parte reducida de la imagen. Para entender las ventajas de los sistemas de procesamiento de imágenes basados en eventos, lo mejor es comparar su comportamiento temporal con los sistemas basados en fotogramas, tal como vemos a continuación. 2.3.1. Ventajas del sistema basado en eventos La gran ventaja inherente a los sistemas de procesamiento basados en eventos se encuentra en el hecho de que la información más relevante se envía (y por lo tanto se procesa) en primer lugar. Esto ocurre para las distintas formas de codificar la información en eventos [8], [9]. Una posibilidad es que la información se codifique en el orden en el que se producen los eventos, es decir, la neurona que envía un evento en primer lugar es la más activa, lo que significa que su entrada es la más intensa. Otras opciones serían codificar la información en la tasa de eventos producidos por una neurona, o en el retraso de los eventos respecto a un tiempo periódico de referencia. En cualquier caso, los primeros eventos generados siempre serán aquellos pertenecientes a las neuronas cuyas entradas sean más intensas. De este modo, los primeros pulsos enviados codifican el fragmento más importante de la información, lo que implica que se puede hacer un procesamiento aproximado en un intervalo de tiempo realmente pequeño, tomando sólo unos pocos eventos iniciales. Esto es algo que el procesamiento por fotogramas no permite, ya que siempre procesa imágenes completas. Esta ventaja se puede apreciar mejor observando la comparación entre el comportamiento temporal de un sistema basado en fotogramas y uno basado en eventos, tal como muestra la Fig. 2.4. En la parte superior de la imagen, observamos cómo responde un sistema de sensado y procesamiento basado en fotogramas ante un suceso producido en el intervalo temporal entre y . Debido a la propia naturaleza del procesamiento basado en fotogramas, independientemente del instante en el que se produzca el suceso, la información producida no llega al sistema de computación hasta que el fotograma completo está totalmente disponible en el instante , con un retraso añadido debido al tiempo de transmisión. Sólo a partir de ese momento el sistema de computación comienza a procesar la información 0 T1 T1 ∆
13 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos recibida, lo cual llevará un tiempo relativamente largo debido a la gran cantidad de información innecesaria incluida en el fotograma. Sólo entonces se obtiene la información deseada de reconocimiento. Sin embargo, observando en la parte inferior el sistema basado en eventos, vemos cómo cada píxel detecta inmediatamente un cambio en la realidad y lo envía al sistema de computación con un retraso . Cada evento tarda un tiempo muy pequeño (del orden de los nanosegundos) en ser procesado. Además, dado que los primeros eventos son los que portan la principal información, ni siquiera es necesario procesar todos los eventos para que el sistema de computación pueda realizar el reconocimiento deseado, obteniendo un resultado mucho más rápido que el sistema anterior, incluso antes del instante de muestreo . FIGURA 2.4. Comparación de la respuesta temporal entre un sistema basado en fotogramas y uno basado en eventos. TFC ∆' Tev T1
Sistemas de procesamiento basados en eventos 20 añadir una operación lógica entre todas las líneas de Acknowledge antes de llegar al emisor, permitiendo con ello compartir el bus AER, como se muestra en la Fig. 2.8. Dicha operación lógica está basada en elementos-C, los cuales aseguran que no se producirá ningún cambio de estado a la salida mientras las entradas tengan distintos valores. Así, solamente en el caso de que todas las señales de entrada se pongan de acuerdo la salida cambiará. En el caso contrario, si queremos que varios emisores compartan el bus de salida, la configuración no es tan inmediata. Si directamente permitiéramos a varios emisores escribir sobre el bus digital, sería imposible gestionar los conflictos, así que es necesario añadir algún tipo de arbitración. En [44] se proponen dos posibles alternativas. La primera de ellas, representada en la Fig. 2.9, consiste en añadir un circuito de arbitración externo a los emisores AER, el cual se encargaría de limitar el acceso de cada uno de dichos FIGURA 2.9. Arquitectura de un sistema AER multi-emisor.
21 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos emisores al bus común. De este modo, cuando un chip quiere trasmitir un evento activa su señal de Request ( ), y cuando el arbitrador esté libre entonces copiará en el bus común el dato en cuestión, activando la señal Rqst que llega al receptor. Una vez que el receptor responde, se libera el arbitrador y se puede transmitir otro evento generado por cualquiera de los emisores. La otra propuesta para construir sistemas AER multi-emisor consiste en modificar ligeramente el protocolo de los chips emisores para que se comuniquen entre ellos conectándose en forma de árbol. De este modo, sería posible que los buses AER de todos ellos se conectaran entre sí directamente, ya que cada emisor solamente escribiría en dicho bus cuando recibe permiso del sistema global. Es básicamente la misma idea que la propuesta anterior, con la diferencia de que la arbitración se lleva a cabo en los propios emisores. La ventaja es que nos permite compartir el bus directamente, pero con el inconveniente de modificar ligeramente el protocolo y añadir una cierta complicación interna a los emisores. Con estas ideas básicas, se pueden plantear pequeñas variaciones dando lugar a diferentes alternativas. Una de ellas consiste en eliminar cualquier componente externo a los propios chips AER modificando el protocolo como muestra la Fig. 2.10. De este modo, cuando uno de los emisores activa la señal de Rqst, aún no ha puesto el dato en el bus común, sino que espera a que el receptor active la señal Ack, indicándole que tiene permiso para ponerlo. Así, en este esquema multi-emisor el Ack vuelve sólo a uno de Rqsti i1…n,= FIGURA 2.10. Diagrama temporal del protocolo AER modificado para sistema multi-emisor.
Sistemas de procesamiento basados en eventos 22 los emisores, y por tanto el receptor tiene que generar tantas señales de Ack como emisores haya. En [45], [46] se propone SCX (Silicon Cortex), una infraestructura configurable de comunicación AER que se puede usar para probar la comunicación entre chips en sistemas neuromórficos con diferentes conectividades. Otra alternativa es añadir a cada uno de los chips AER una etapa de arbitración interna para conectarlos en cascada. De esta forma, cuando el primero de los chips quiere emitir un evento, la petición tiene que pasar por todos los demás chips de la cadena, y sólo cuando todos ellos le den paso se enviará. El problema de este esquema es que no trata de la misma forma a todos los emisores, ya que influye el orden en el que se conecten en la cascada. No obstante, esta asimetría se podría compensar incluyendo algún mecanismo que penalice a cada chip en función de la posición que ocupe en la cadena, haciendo que en caso de colisión tengan que esperar más los que tengan una posición “preferente”. En la presente tesis se ha optado por utilizar placas auxiliares para implementar sistemas multi-emisor o multi-receptor. Estas placas, en definitiva, siguen los esquemas descritos en Fig. 2.8 y Fig. 2.9, y desde el punto de vista de nuestros chips hacen que cada enlace se gestione siempre punto a punto [47], [48].
23 CAPÍTULO 3 Sistemas de convolución multicapa 3.1. Introducción Los sistemas biológicos de visión no solamente están basados en el procesamiento por eventos como se describe en el capítulo anterior, sino que quizás una de sus principales características que lo hacen posible es la estructura multicapa del cerebro. La información óptica (información sensorial, en general) capturada por la retina y transformada en pulsos eléctricos es procesada por una serie de capas que forman el córtex visual. Cada una de estas capas está formada por grandes cantidades de neuronas interconectadas de forma masiva. De forma general, una neurona de una capa está conectada con muchas neuronas de la siguiente capa, de modo que los eventos emitidos por ella son recibidos por lo que llamamos un campo proyectivo de la capa que se encuentra a continuación. Así, la información capturada por una zona concreta de la retina se propaga con gran velocidad por cada una de las capas del córtex, que se encargan de detectar la forma de los objetos observados por la retina. Cada interconexión entre una neurona y su campo proyectivo correspondiente
Sistemas de convolución multicapa 24 cuenta con unos pesos específicos, en principio diferentes para cada neurona. No obstante, en las primeras capas del córtex los pesos son bastante aproximados para las distintas neuronas de una misma capa, de forma que esta interconexión entre capas se puede describir como una convolución. Así pues, el sistema completo se puede aproximar como un sistema de convoluciones multicapa. Por eso, el objetivo de esta tesis es el desarrollo de bloques convolucionadores que se puedan conectar formando un sistema multicapa, y emular el comportamiento de los sistemas de procesamiento de visión. Las Convolutional Neural Networks (Redes Neuronales de Convoluciones) utilizan esta idea de capas de neuronas interconectadas con pesos compartidos para llevar a cabo diversas aplicaciones [49], como reconocimiento de caracteres [50], [51] (sistemas de visión), o de fonemas [52], [53] o palabras habladas [54] (en sistemas acústicos). Todos estos sistemas se basan en capas de convoluciones interconectadas entre sí con pesos configurables. A continuación, en la Sección 3.2 se describen los conceptos básicos de la operación de convolución, así como la forma de implementarla mediante un sistema AER. Después, en la Sección 3.3 se profundiza sobre los sistemas bioinspirados de procesamiento multicapa de visión, destacando una herramienta software de simulación de estas estructuras. Por último, en la Sección 3.4 se describe en un primer nivel la arquitectura de chip de convolución propuesta, así como la capacidad de interconexión en sistemas multicapa que presenta. 3.2. Convolución 2-D 3.2.1. Operación matemática Para un sistema lineal e invariante en el tiempo como el de la Fig. 3.1 (LTI, en sus siglas inglesas) con respuesta al impulso , siendo la señal de entrada dependiente del tiempo, se puede calcular la señal de salida como: h t( ) x t( ) y t( )
25 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos (EQ 3.1) Dicha operación se denomina convolución entre y , y se expresa mediante la notación . Si en lugar de tratar con señales continuas en el tiempo, nuestro sistema funciona en tiempo discreto, la integral se convierte en un sumatorio y la expresión de la convolución pasa a ser [55]: (EQ 3.2) Considerando que no sólo estemos trabajando con señales discretas en el tiempo, sino también finitas, el resultado de la convolución será también una señal finita, expresada mediante la ecuación (3.3): (EQ 3.3) De este modo, si tenemos una señal de entrada con valores (es decir, que es distinta de para ), y una respuesta al impulso con valores (es distinta de para ), la conFIGURA 3.1. Representación de un sistema lineal e invariante en el tiempo (LTI). y t( ) hτ( )x t τ–( ) τd ∞– ∞ ∫ = x t( ) h t( ) y t( ) x t( ) h t( )⊗= y n( ) x n( ) h n( )⊗ h m( )x n m–( ) m∞–= ∞ ∑ = = x n( ) h n( )⊗ h m( )x n m–( ) m0= n ∑ = x n( ) Nx 0 0n Nx1–≤ ≤ h n( ) Nh 0 0n Nh1–≤ ≤
Sistemas de convolución multicapa 26 volución tendrá valores no nulos. Esto se puede observar en el ejemplo de la Fig. 3.2. Una vez descrita la operación de la convolución unidimensional, es sencillo extenderla para el caso de dos dimensiones, simplemente considerando que las señales dependen de dos variables [56]. El caso de cony n( ) NyNxNh1–+= FIGURA 3.2. Ejemplo de convolución unidimensional entre una secuencia con y una respuesta al impulso con , obteniéndose una señal con x n( ) Nx7= h n( ) Nh4= y n( ) NyNxNh1–+ 10= = x y( , )
27 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos voluciones 2-D es el que nos interesa, ya que se aplica a las imágenes. De este modo, consideramos que las variables e se corresponden con las coordenadas horizontal y vertical, y aplicamos la operación de convolución a una imagen de entrada para obtener una imagen de salida . A la respuesta al impulso la denominamos kernel de la convolución , y obtenemos la expresión: (EQ 3.4) Esta expresión muestra una inversión horizontal en las posiciones del kernel frente a la imagen de entrada al calcular la convolución. Sin embargo, a la hora de implementar este cálculo habitualmente prescindimos de dicha inversión, ya que se puede eliminar definiendo el kernel adecuadamente. Además, en gran parte de los casos, las simetrías que presentan los kernels hacen que la expresión (3.4) sea equivalente. El significado de esta expresión se puede comprender mejor con ayuda de la Fig. 3.3. En ella vemos una imagen de entrada de píxeles, y un kernel de tamaño . La imagen de salida, resultado de calcular la convolución entre ambos, se obtiene aplicando el kernel centrado sobre cada x y I x y( , ) O x y( , ) K x y( , ) O x y,( ) I x y,( ) K x y,( )⊗ K m n,( )I x m–y n–,( ) n ∑ m ∑ = = FIGURA 3.3. Descripción de una convolución bidimensional entre una imagen de entrada de tamaño y un kernel de tamaño X Y( , ) M N( , ) X Y× M N×
Sistemas de convolución multicapa 28 uno de los píxeles de la imagen de entrada, y efectuando la suma del valor de todos los píxeles del vecindario pesados por los valores correspondientes del kernel. En el ejemplo de la Fig. 3.4 tenemos una imagen de entrada de píxeles y un kernel de tamaño . En la imagen de salida se muestra el resultado de la convolución para un solo píxel, concretamente el . Vemos cómo el kernel se aplica sobre el vecindario de dicho píxel, y se calcula la operación: De este modo, el valor de cada píxel de salida se calcula desplazando el kernel sobre la imagen de entrada y efectuando la misma operación. FIGURA 3.4. Ejemplo de cómo se calcula el resultado de una convolución para un píxel. El resto de los píxeles se calcularían del mismo modo. 5 5× 3 3× 4 2,( ) O4 2,( ) 1 0⋅2 2⋅3 1–⋅1 1⋅2 3⋅3 0⋅1 2–⋅2 0⋅3 1 9=⋅+ + + + + + + +=
29 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos 3.2.2. Convolución basada en AER Una vez descrita la operación matemática de la convolución bidimensional, ahora se trata de implementar dicha operación mediante un sistema basado en AER. Para ello, en primer lugar es necesario volver a la idea de procesamiento de imágenes basado en eventos del capítulo anterior. Si estuviéramos tratando con sistemas tradicionales de procesamiento por fotogramas, se podría tratar cada imagen como una matriz con sus correspondientes valores numéricos y se podría efectuar la operación matemática tal cual ha sido definida. Sin embargo, en los sistemas de procesamiento por eventos no contamos con una imagen completa, sino que se van produciendo eventos que de algún modo codifican el estado de los píxeles de la imagen en tiempo real. De este modo, la convolución se lleva a cabo de la forma indicada en la Fig. 3.5. En ella vemos cómo cada vez que se recibe un evento con una dirección cualquiera , la operación no se limita al píxel con dicha dirección, sino que le afecta a un cierto vecindario alrededor de dicho píxel. Así, el evento le llega a cada píxel del vecindario con un cierto peso en función de su posición a través de la aplicación del kernel. Cada píxel del array almacena el valor, y conforme van llegando más eventos el kernel se sigue sumando sobre el vecindario correspondiente a la dirección de dichos eventos. De esta manera se consigue que en cada momento el array de píxeles contenga el resultado de calcular la convolución sobre la imagen de entrada. Sin embargo, para que se trate verdaderamente de una convolución basada en AER el resultado de la operación debe estar también codificado en eventos. Por ello, cada píxel de convolución consistirá en una neurona Integrate&Fire, que cuando alcance un valor umbral establecido generará un evento de salida, obteniéndose un flujo de eventos que se corresponde con el resultado de la operación de convolución. Esto nos permitirá encadenar convolucionadores AER en cascada, haciendo que la salida de uno sea la entrada del siguiente, o bien en paralelo, creando sistemas complejos multicapa. x y,( )
Sistemas de convolución multicapa 36 Con el objetivo de trasladar toda esta experiencia en sistemas de procesamiento multicapa basados en fotogramas al más eficiente procesamiento por eventos, se llevó a cabo el proyecto europeo CAVIAR, donde se desarrolló una arquitectura AER compuesta por una serie de bloques (entre ellos, convolucionadores [32]) que permite con una gran versatilidad la implementación de aplicaciones para procesamiento de imagen y reconocimiento y seguimiento de objetos [72], como la mostrada en la Fig. 3.9 que describimos a continuación. Un sistema mecánico rotatorio (1 en la Fig. 3.9) hace girar un trozo de papel blanco con dos círculos de diferente radio y algunas otras formas geométricas usadas como distracción. El sistema de visión se encarga de seguir a ambos círculos y discriminar entre ellos. Un par de espejos controlados por servomotores (2) cambia el punto de vista de la retina AER (3), la cual envía sus eventos de salida a una placa de monitorización (4) y a un mapper (5) antes de alcanzar la placa de convolucionadores (6) con 4 chips en su interior. Las salidas de estos chips de convolución se envían, a través de otra placa de monitorización (7) y otra de mapeo (8), al chip de objeto WTA (Winner Takes All) (9), que a su vez envía su salida a un monitor (10) que por una parte la envía a un microcontrolador (11) que se encarga de line chip learning chip monitor USB 98 11 1514131210 mapper USB mapper USB mapper USB mapper Microcontroller 1 2 345 6 7 USB Convolution chip Convolution chip Splitter Merger retina chip USB monitor Convolution chip Convolution chip mirrors moving stimulus object chip delay USB monitor FIGURA 3.9. Diagrama de bloques del montaje experimental desarrollado por el proyecto europeo CAVIAR para un sistema de visión AER de seguimiento de objetos.
37 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos ajustar los espejos (2) para centrar el círculo detectado, y por otra parte la envía al sistema de aprendizaje, que consiste en un mapper (12), un chip de línea de retraso (13), otro mapper (14) y un chip clasificador de aprendizaje (15), que se encarga de clasificar las trayectorias del círculo entre distintos tipos. La retina de contraste temporal genera eventos AER con un espacio de direcciones de píxeles, mientras que cada chip de convolución tiene una resolución de . Sin embargo, la placa de 4 chips de convoluciones conectados en modo mosaico sería capaz de procesar el espacio de direcciones completo, aunque sólo puede generar salidas para los píxeles centrales. Para resolver este problema se añade la etapa de mapeo (5) que se encarga de submuestrear la imagen desde los píxeles hasta . De este modo, la placa de convolución generar salidas para todo el espacio visual de la retina. Los chips de convolución utilizan kernels circulares de un determinado diámetro, los cuales detectan la posición del centro de formas circulares de entrada de dicho diámetro. El mapper (8) vuelve a submuestrear el espacio de direcciones hasta los píxeles de entrada del chip de objeto WTA, el cual se encarga de proporcionar las coordenadas del centro del círculo detectado de forma limpia. Estas coordenadas, al ser enviadas al subsistema de control, hacen que el microcontrolador actúe sobre dos servomotores que sostienen dos espejos. Un espejo está en posición vertical y es controlado por la coordenada-y de la salida del chip de objeto, mientras que el otro está en posición horizontal y es controlado por la coordenada-x. Así, la coordenada proporcionada por el chip de objeto indica la desviación de la posición del círculo detectado sobre el centro del espacio visual, de modo que el microcontrolador está programado para hacer cero dicha desviación, manteniendo centrado el círculo correspondiente. Por otra parte, el chip de línea de retraso convierte la información temporal de los eventos generados por el chip de objeto WTA en información espacial, obteniendo un cierto patrón espacial. Este patrón espacial es clasificado por el chip de aprendizaje según patrones de eventos, formados por eventos coincidentes en distintas localizaciones espaciales, o según patrones de actividad, formados por actividades medias de eventos coincidentes en diferentes localizaciones. 128 128× 32 32× 64 64× 128 128× 64 64× 32 32×
Sistemas de convolución multicapa 38 3.3.2. Implementación software basada en AER: aplicaciones Siendo el objetivo de esta tesis el desarrollo de chips de convolución que nos permitan la implementación de sistemas modulares a gran escala, es fundamental contar también con la capacidad de estudiar desde un punto de vista teórico la forma de ensamblar, configurar, programar y entrenar estos sistemas. Es decir, a partir de los chips de convolución AER desarrollados en el presente trabajo, para llevar a cabo una aplicación concreta será necesario en primer lugar encontrar la estructura jerárquica óptima, así como los kernels de convolución más indicados, o qué otros parámetros deberían ser ajustados. Para ello, es de gran ayuda el simulador de comportamiento AER desarrollado por J. A. Pérez-Carrasco en Visual C++ [73], el cual nos permite hacer una descripción de comportamiento de cualquier módulo AER real (en nuestro caso, los convolucionadores), y ensamblar sistemas complejos con gran cantidad de módulos. Así podemos obtener una estimación realista del resultado de este tipo de sistemas multicapa antes de llevar a cabo la implementación hardware. Con este simulador de comportamiento se han podido comprobar las enormes posibilidades que tienen este tipo de arquitecturas para emular el comportamiento del cerebro. Por ejemplo, en [74] se presenta la simulación de comportamiento de un sistema de reconocimiento de caracteres, que conseguiría discriminar entre distintas letras en tiempos inferiores a , a pesar de incluir en dicho procesamiento hasta 52 convoluciones. Esto nos da una idea de la rapidez de estos sistemas multicapa AER. En la Fig. 3.10 se puede ver el esquema multicapa implementado por el simulador. Como se indica en la propia figura, el sistema está diseñado para discriminar entre 7 caracteres diferentes escritos a mano, produciendo eventos solamente por una de las 7 salidas de la cuarta y última capa, en función de la letra que se corresponda con los eventos de entrada del sistema. También se han obtenido resultados satisfactorios utilizando este simulador para entrenar sistemas de reconocimiento de texturas, como se muestra en [75], [76]. En la Fig. 3.11 se puede ver la arquitectura propuesta en dicho ejemplo, donde la primera capa incluye 24 módulos de convolución 10µs
39 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos en paralelo, implementando un banco de filtros de Gabor con 4 escalas y 6 orientaciones diferentes. FIGURA 3.10. Esquema del sistema AER implementado con el simulador para reconocimiento de letras. FIGURA 3.11. Esquema del sistema AER implementado con el simulador para reconocimiento de texturas.
Sistemas de convolución multicapa 40 3.4. El chip de convolución AER Una vez descrita la motivación de este trabajo, así como el marco donde se encuadra, es el momento de pasar a describir el objetivo básico de esta tesis: el diseño del chip de convolución AER. Dentro del objetivo de diseñar una arquitectura multichip compleja, configurable y versátil que nos permita implementar sistemas neuronales, el elemento fundamental para poder construir este tipo de sistemas es el chip de convolución. En [77] se propone una arquitectura para la realización de convoluciones bidimensionales en tiempo real basada en sistemas de visión AER, con algunas restricciones sobre los kernels permitidos, debiendo ser éstos descomponibles en sus coordenadas (un kernel de la forma ). En [78] se describe un chip de convolución basado en integradores analógicos. Las principales limitaciones que presenta este chip son: 1. la necesidad de calibración para compensar el mismatch entre transistores, 2. una reducida resolución de sólo 3 bits (incluso después de la calibración), debido a la operación en baja corriente de los transistores, 3. un tiempo de latencia de eventos alto (de alrededor de ) debido a los retrasos de los componentes analógicos en los píxeles polarizados para bajo consumo. Estas limitaciones se han resuelto en los chips desarrollados en la presente tesis. Al usar píxeles completamente digitales, desaparece la necesidad de calibración (con su correspondiente coste en términos de área y de consumo) y la precisión viene dada por el tamaño de los registros implementados en dichos píxeles. Además, al prescindir de componentes analógicos de bajo consumo la operación es mucho más rápida, alcanzando latencias de eventos tan bajas como [79]. En esta tesis se proponen dos chips de convolución diferentes, aunque ambos están basados en píxeles completamente digitales, y permiten el uso x y,( ) F x y,( ) H x( )V y( )= 1ms 150ns
41 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos de kernels de tamaño y forma arbitrarios. El tamaño está limitado por la memoria del kernel, que en nuestro caso has sido de . 3.4.1. Arquitectura Desde el punto de vista de la descripción de diagrama de bloques, los dos chips de convolución diseñados para la presente tesis (que llamaremos Conv1 y Conv2) comparten la arquitectura de la Fig. 3.12. En ambos casos, el chip recibe eventos AER de entrada (el bus Address_in, más las señales del protocolo asíncrono Rqst_in y Ack_in), que representan información visual procedente de la etapa anterior, y genera eventos AER de salida (el bus Address_out, más las señales del protocolo asíncrono Rqst_out y Ack_out) que representan el resultado de la operación de convolución. Los bloques que se muestran en la Fig. 3.12, que están descritos en detalle en los siguientes capítulos, son los siguientes: 1. Array de píxeles, de tamaño en el caso de Conv1, siendo ampliado hasta en Conv2, cuadruplicando su resolución espacial. 2. Memoria RAM estática integrada en el propio chip, donde se almacena el kernel codificado en complemento a 2. En ambos chips el tamaño de la RAM es de datos, aunque Conv1 sólo permite programar un único kernel mientras que Conv2 permite programar en un propio chip hasta 32 kernels diferentes, implementando así el sistema multikernel, descrito más adelante. 3. Controlador síncrono, que se encarga de secuenciar todas las operaciones necesarias para cada evento de entrada, así como del mecanismo de olvido, que es independiente de la llegada de eventos. 4. Generador de reloj de alta velocidad, de frecuencia controlable, que se utiliza para el controlador síncrono. 5. Registros de configuración, que almacenan una serie de parámetros cargados a través de un puerto serie. 6. Inversor de complemento a 2, es un bloque que cambia el signo del kernel antes de aplicarlo sobre los píxeles si el evento de entrada es negativo. 32 32× 32 32× 64 64× 32 32×
Sistemas de convolución multicapa 42 7. Bloque de desplazamiento horizontal, para alinear adecuadamente el kernel almacenado en la RAM con las coordenadas del evento de entrada. 8. Generador AER, bloque asíncrono encargado de arbitrar entre los eventos generados por los píxeles y enviarlos a la siguiente etapa del sistema multichip. FIGURA 3.12. Arquitectura común de los chips Conv1 y Conv2
43 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos El funcionamiento del chip es el siguiente: cuando el controlador síncrono detecta un flanco de bajada en la señal de entrada Rqst_in, las coordenadas del evento que aparecen en el bus Address_in se capturan y se completa el handshaking asíncrono. Entonces, el controlador utiliza la información relativa al tamaño del kernel (que ha sido almacenada previamente en los registros de configuración) para calcular los límites del campo proyectivo asociados a la dirección del evento. Este cálculo puede implicar tres situaciones distintas: 1. que el campo proyectivo caiga completamente dentro del array de píxeles, 2. que caiga parcialmente dentro del array, 3. o que esté completamente fuera del array. Si estamos en el caso 3, el controlador directamente descarta el evento y se queda esperando que llegue el siguiente. Sin embargo, en cualquiera de las otras dos posibles situaciones, el controlador calcula el desplazamiento horizontal izquierda/derecha entre las columnas de la RAM donde se almacena el kernel y las columnas del campo proyectivo en el array de píxeles. A continuación, habilita la suma fila por fila de los valores del kernel sobre los píxeles correspondientes. De este modo, después de recibir un evento de entrada, los píxeles que se encuentran dentro del campo proyectivo actualizan su estado. En el caso de que alguno de ellos alcance el umbral programado, éste resetea su propio estado y genera un evento que, tras ser arbitrado por el bloque asíncrono generador AER, es enviado al exterior con sus correspondientes señales de handshaking. Paralelamente a este procesamiento por evento, hay un mecanismo de olvido global que es común para todos los píxeles. El bloque asíncrono generador de AER sigue la técnica de lectura de eventos en paralelo por filas [41]. De este modo, los eventos se arbitran por filas (para una misma fila, todas las señales de petición de evento implementan una OR cableada). Una vez que el arbitrador por filas responde, todos los eventos generados por esta fila se almacenan en la periferia superior, liberando el arbitrador por filas. Así, éste puede atender la petición de otra fila mientras todos los eventos de la fila anterior son emitidos al exterior en modo ráfaga. x y,( )
Sistemas de convolución multicapa 44 En general, ya que los kernels de convolución pueden tener tanto valores positivos como negativos, los eventos de salida generados por un chip de convolución también tendrán signo. En un sistema multicapa, las operaciones de convolución se pueden ejecutar en cascada, lo que implica que un chip de convolución genérico debe ser capaz de manejar eventos de entrada con signo, y de producir eventos de salida con signo. Por este motivo, los chips de convolución desarrollados en el presente trabajo incluyen un bit de signo tanto en el bus AER de entrada como en el de salida, así como para los valores almacenados en la RAM (codificados en complemento a 2). Los píxeles deben ser capaces también de ejecutar sumas con signo y producir eventos positivos o negativos. Cuando está procesando un evento negativo, el controlador habilita el bloque inversor de complemento a 2 para cambiar el signo de los valores del kernel antes de ser sumado sobre los píxeles. En cuanto al mecanismo de olvido, éste también es manejado por el controlador síncrono. El objetivo de dicho mecanismo es que los valores absolutos almacenados en los píxeles se decrementen a un ritmo programable, para que éstos puedan “olvidar” su estado tras un tiempo controlado. 3.4.2. Estructura multichip propuesta Como se ha venido comentando a lo largo de todo el capítulo, el objetivo de este trabajo no se limita al diseño de las dos versiones de chip de convolución Conv1 y Conv2, sino que ambos circuitos están ideados para formar estructuras multichip complejas. Para ello, en un primer nivel describimos la configuración en mosaico y el sistema multikernel, para después comentar la idea general de estructura multichip propuesta. 1. Configuración en mosaico. Ambos chips de convolución tienen 14 bits de direcciones en el bus de entrada AER, 7 para cada coordenada. Así pues, son capaces de ver un espacio de direcciones de . Sin embargo, las dimensiones del array de píxeles son de en el caso de Conv1 y de en el caso de Conv2. De este modo, ambos chips ofrecen la posibilidad de configurar la dirección base del array, permitiendo así conectar varios chips en paralelo para emular el comportamiento de un único chip de mayores dimensiones. En el caso de Conv1, podríamos crear un mosaico de 128 128× 32 32× 64 64× 4 4×
45 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos chips para tener un array equivalente de , mientras que con Conv2 sería suficiente con un mosaico de chips. Un ejemplo de configuración en mosaico se muestra en la Fig. 3.13. En ella podemos ver un array de chips de convolución, cada uno de ellos de , formando en total un único array de píxeles. En el sistema de la figura puede ocurrir que llegue un evento de entrada tal que al aplicar el kernel de convolución el campo proyectivo caiga repartido entre 4 chips diferentes. Así pues, cada uno de los 16 chips del array recibiría dicho evento, y teniendo en cuenta sus propias coordenadas calcularía si alguna parte del campo proyectivo le corresponde a él. Si la respuesta es negativa, lo ignoraría, y si es afirmativa procedería a sumar el kernel sobre los píxeles correspondientes. De este modo, el sistema se comporta verdaderamente como un único array de tamaño total. Para que esto funcione correctamente 128 128× 2 2× FIGURA 3.13. Configuración en mosaico con varios chips para procesar imágenes mayores. 4 4× 32 32× 128 128×
El píxel de convolución 52 permitiendo que los iones la atraviesen (el sodio entre y el potasio salga). De este modo, la polaridad de la membrana se invierte, y como consecuencia se produce un impulso eléctrico. El potencial de inversión causa que la permeabilidad de la membrana vuelva a cambiar, y la neurona vuelva a su estado de reposo. El potencial de inversión se propaga a lo largo del axón, y produce la emisión de neurontransmisores en las dendritas. Como consecuencia, las neuronas producen trenes de pulsos cuya frecuencia es proporcional a la cantidad de neurotransmisores recibidos a su entrada. Una característica de este mecanismo es que las neuronas más activas emitirán pulsos más rápido que las demás. De este modo, la información más importante se propaga mucho más rápido por las diferentes capas de neuronas a lo largo del cerebro para producir respuestas muy rápidas con sólo una pequeña cantidad de pulsos. En cuanto a las sinapsis, hay dos tipos de ellas: las inhibitorias, cuyos neurotransmisores tienden a estabilizar el potencial de la membrana, y las excitatorias, cuyos neurotransmisores tienden a decrementar dicho potencial, y como consecuencia a favorecer la producción de pulsos. Cada neurona tiene como entradas sinapsis de los dos tipos. Estas sinapsis tienen unos pesos que potencian más o menos la influencia de los neurotransmisores, y se regulan permitiendo el aprendizaje a través del cambio de dichos pesos. Cuando una neurona no recibe ningún estímulo, la membrana permite el paso de una pequeña cantidad de iones de dentro hacia fuera, haciendo que el potencial de la membrana tienda hacia el potencial de reposo. De este modo, los eventos de entrada más antiguos tienen menos relevancia en el estado actual de la neurona. Es lo que podríamos llamar mecanismo de olvido. Este mecanismo es fundamental para detectar correlaciones espaciotemporales, que es una forma en la que se codifica la información en el cerebro [81]. Sin este mecanismo de olvido, sería imposible distinguir la información nueva de la antigua.
53 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos 4.3. Primera propuesta: el píxel analógico A la hora de diseñar modelos que reproduzcan el comportamiento de la neurona biológica, hay diferentes alternativas. Una de las más utilizadas es el modelo propuesto por Hodgkin y Huxley [84], que consiste en un modelo basado en conductancias extraído del estudio del comportamiento de las neuronas de los calamares. La idea básica de este modelo es reproducir el flujo de iones a través de la membrana mediante conductancias. El modelo aparece representado en la Fig. 4.3. Como se puede ver, está basado en tres conductancias: Na modela el tránsito de iones de sodio a través de la membrana, K representa el flujo de potasio desde el interior hasta el exterior de la célula, y R modela las pérdidas que implementan el mecanismo de olvido. Como se ve en la figura, los valores de las conductancias relativas al flujo de iones (tanto de sodio como de potasio) son variables, ya que dependen del potencial de la membrana; sin embargo, el efecto de las pérdidas es constante. Asimismo, la corriente que aparece en la figura modela las entradas recibidas por la neurona producidas por conexiones con otras neuronas. Este modelo describe con gran precisión el comportamiento de la membrana de potencial, pero es bastante complicado computacionalmente. Por este motivo se propuso el modelo SRM (Spike Response Model) como una simplificación del modelo anterior [85]. Este modelo está representado en la Fig. 4.4. Cada vez que llega un pulso por un axón de entrada, se FIGURA 4.3. Esquema del modelo neuronal propuesto por Hodgkin y Huxley.
El píxel de convolución 54 inyecta una cierta cantidad de carga al soma de la neurona de acuerdo con el peso de la sinapsis correspondiente, que está modelado a través de la función . Esta carga se integra en una capacidad C, de modo que cuando la tensión de esta capacidad alcanza un cierto umbral , la neurona produce un pulso por el axón de salida y resetea su estado a un cierto valor de reposo. El efecto de este pulso de reset sobre el potencial de la neurona está modelado a través de la función . El efecto de cualquier entrada externa sobre el potencial de la membrana se encuentra modelado por la función . Todas estas interacciones entre distintos elementos del modelo siguen unas ciertas funciones temporales que en general dependen tanto del instante actual como de los instantes de llegada de los últimos eventos, para acercarse al comportamiento de la neurona biológica todo lo posible. La neurona analógica Integrate&Fire utilizada por Serrano [78] está basada en este modelo SRM, aunque de forma simplificada, reduciendo la complejidad de las funciones internas de dicho modelo , y hasta convertirlas en pulsos cuadrados. En la Fig. 4.5 se muestra una versión reducida de dicha neurona. En ella, cada vez que llega un pulso de entrada se cierra el switch inyectando corriente en la capacidad, incremenFIGURA 4.4. Esquema del modelo neuronal SRM. εt( ) υ ηt( ) κt( ) εt( ) ηt( ) κt( )
55 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos tando el valor de tensión de dicha capacidad una cantidad , siendo el valor de la corriente de entrada, la duración del pulso y el valor de la capacidad. Cuando la tensión del condensador alcanza el valor umbral , el comparador producirá un pulso de salida que reseteará el condensador descargándolo hasta un valor de tensión . De forma general, los pulsos de entrada pueden ser tanto positivos como negativos, luego según el signo se producirá una inyección o una sustracción de carga en el condensador, en ambos casos a partir de una corriente proporcional al peso proporcionado por el kernel correspondiente. Esto se puede ver en la Fig. 4.6, donde se muestra el esquemático completo del píxel analógico. Cuando el píxel recibe un pulso de entrada por Pulse+ o Pulse-, el bloque Logic se encarga de activar o desactivar los transistores y en función del valor del kernel previamente almacenado en el propio bloque y del signo del evento. De este modo, las estructuras formadas por estos transistores generan un pulso de corriente a partir de la corriente de calibración correspondiente o . Asimismo, en lugar de un único comparador, son necesarios dos de ellos para poder detectar un umbral negativo o positivo en la tensión de la capacidad, y poder generar pulsos de salida con signo. Estos comparadores son llamados en la Fig. 4.6 Positive Event Block y Negative Event Block. Todo esto incluye una FIGURA 4.5. Esquema simplificado de la neurona analógica Integrate&Fire utilizada por Serrano [78]. th reset Synapse V∆IwT∆⋅ C ---------------- = Iw T∆ C Vth Vreset Mn1Mn3 – Mp1Mp3 – IcalN IcalP
El píxel de convolución 56 cierta complejidad en el píxel analógico, ya que además es necesario almacenar en el propio píxel el valor del peso que tiene que aplicar para cada evento. Por este motivo incluye una memoria dinámica dentro del bloque Logic. Por otra parte, para obtener un correcto funcionamiento es necesario incluir circuitería de calibración en el interior del píxel. Esta necesidad de calibración es debida al mismatch entre transistores polarizados en región subumbral. Para compensar estas variaciones, se incluye en cada píxel unas celdas de memoria en las que almacenar una palabra digital de 5 bits que controla un espejo de corriente que se usa para calibrar una corriente de referencia común para todos los píxeles, produciendo para cada píxel sus propias corrientes ya calibradas e . Además de complicar el píxel (tanto en términos de área como de consumo), esto implica un proceso inicial de calibración que se tiene que llevar a cabo una vez fabricado, calculando la palabra digital de calibración óptima para cada píxel. En la Fig. 4.7 se muestra una representación de las variaciones de la tensión del condensador conforme va recibiendo pulsos de entrada (tanto positivos como negativos). Dicha tensión va incrementándose y decrementándose en función del signo de los eventos de entrada, hasta que alcanza un x4 IcalN Positive Event Block Negative Event Block Mn0 Mn1 Mn2 Mn3 Mp0 Mp3 Mp1 Mp2 IcalP x1 x4 x1 Ereset Vc VddA VgndA Voffp VgndB VddB Voffn bp<0> bp<1> bp<2> bn<0> bn<1> bn<2> Logic Pulse+ Pulse− PulseF CapSign x2 row Ack row Rqst x2 p+ p− FIGURA 4.6. Esquemático completo del píxel de convolución analógico. IcalN IcalP
57 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos valor umbral y se resetea generando un pulso de salida del signo correspondiente. Resumiendo, las principales limitaciones que presentaba este píxel analógico eran las siguientes: 1. Complejidad incluida a nivel de píxel a causa de la necesidad de calibración para compensar el mismatch entre transistores. 2. Reducida precisión conseguida por el píxel, debido a la operación en subumbral de los transistores analógicos. 3. Alto valor de latencia conseguido (alrededor de de retraso entre un evento de entrada y su correspondiente salida), producido por la lentitud en los comparadores internos del píxel polarizados en baja corriente. Con la finalidad de resolver los principales problemas del píxel analógico, se propone el píxel digital objeto de la presente tesis, descrito en la siguiente sección. FIGURA 4.7. Representación de la tensión del condensador y pulsos de salida producidos por el píxel. 1ms
El píxel de convolución 58 4.4. El píxel digital En las dos versiones de chip de convolución propuestas (Conv1 y Conv2), la operación de convolución se lleva a cabo a nivel de píxel mediante la integración de eventos de entrada pesados convenientemente por los valores del kernel. El esquema genérico del píxel digital se muestra en la Fig. 4.8. Como se puede ver, el píxel consiste de forma genérica en un acumulador y un sumador, el cual recibe como entradas el valor del kernel y el propio acumulador, además de un comparador que genera un pulso cuando el valor del acumulador alcanza un límite seleccionado y un bloque que se encarga de gestionar la comunicación del píxel con la periferia AER para generar eventos. Para cada una de las dos versiones de chip de convolución, se ha diseñado un píxel diferente, aunque los dos se basan en este esquema genérico. A continuación vamos a describir de forma detallada cada una de las dos versiones del píxel digital, comenzando por la versión inicial para seguir después con la versión avanzada. FIGURA 4.8. Esquema básico del píxel digital de convolución propuesto.
59 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos 4.4.1. Versión inicial Conv1 La parte principal del píxel es un sumador de 18 bits y un acumulador de la misma resolución. En la Fig. 4.9 se muestra el diagrama de bloques de dicho píxel. En esta primera versión se implementó un tamaño de sumador sobredimensionado de forma intencionada con el objetivo de permitir la máxima precisión posible. El criterio utilizado fue permitir la acumulación de un kernel de tamaño con todos sus pesos al máximo valor posible para sus 6 bits (los valores del kernel se codifican en 6 bits), permitiendo a su vez que el bit menos significativo de dicho kernel también tuviera la posibilidad de contribuir al valor del acumulador. De este modo, se seleccionó un rango dinámico de 18 bits. Si tenemos en cuenta los modelos analógicos descritos previamente donde el estado de la neurona se almacenaba en la tensión de un condensador, en nuestro caso el estado del píxel se almacena en el acumulador, representado en un número con signo codificado en complemento a 2 con 18 bits (17 más el signo). Esto implica que el estado del píxel puede variar entre y . A su vez, los valores del kernel se codifican también en complemento a 2, pero con 6 bits solamente (5 más el signo), luego pueden variar entre y . FIGURA 4.9. Diagrama de bloques del píxel digital de convolución, en su versión inicial. 32 32× 217 – 131072–= 217 1– 131071= 2532–=– 251– 31=
El píxel de convolución 60 El comportamiento del píxel es el siguiente. Cada vez que recibe un evento de entrada, la señal enable (que es común para todos los píxeles de una misma fila) se activa, produciendo que el acumulador se actualice sumando a su valor anterior el correspondiente peso del kernel . Si el nuevo valor del acumulador alcanza el umbral, se genera un evento de salida y se resetea el acumulador, volviendo a su valor en reposo, que es 0. En esta primera versión del píxel se buscaba la mayor programabilidad posible, así que se incluyó un multiplexor de 8 entradas para poder seleccionar entre 8 distintos límites del acumulador, con la idea de poder adaptar el tamaño del mismo para diferentes aplicaciones. Para ello, usamos un parámetro de control de 3 bits (Sel_lim), con el cual se elige uno de los bits del acumulador. Este bit se compara de forma continua con el bit de signo (que es el más significativo). De este modo, para datos positivos (es decir, que tienen el ) el comparador disparará cuando el bit seleccionado se ponga a ‘1’, mientras que para datos negativos ( ), disparará cuando el bit seleccionado valga ‘0’. Los 8 posibles umbrales seleccionables se muestran en la Tabla 4.1. Es importante tener en cuenta que, como se muestra en la Fig. 4.9, utilizamos una puerta XOR como comparador para detectar el umbral. Por este motivo, hay que tener precaución a la hora de seleccionar el máximo valor posible del kernel en función del bit seleccionado para llevar a cabo la comparación. Así pues, debemos asegurarnos que los valores máximos utilizados en el kernel serán menores o iguales que el límite seleccionado para el acumulador, tanto en lo referente a los valores positivos como a los negativos. Si el valor del kernel fuera mayor que el umbral programado, cabría la posibilidad de que no se produjera el evento correspondiente. Por ejemplo, si seleccionamos como umbral el bit 2 (es decir, que dispare cuando el acumulador alcance el valor 4) se produciría un error si sumáramos un valor 8 ( ), ya que no afectaría al bit elegido para el comparador. Este problema se resuelve limitando los valores del kernel a los propios umbrales del acumulador. En cuanto a la implementación del mecanismo de olvido a nivel de píxel, éste recibe un pulso de olvido de forma periódica que es generado por el controlador síncrono. Dicho pulso de olvido produce un pulso en la señal enable que llega a todos los píxeles del array, provocando un cambio en el valor del acumulador. De este modo, cuando el píxel recibe un pulso en la wij msb 0= msb 1= wij 001000 2
61 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos señal de enable, en función del valor de la señal Sel_forgetting actuará de un modo u otro. Si esta señal indica que se trata de un pulso de olvido, en lugar de tomar como entrada del sumador el valor del kernel almacenado en la TABLA 4.1. Posibles límites programables para el acumulador. Sel_lim Maximum Minimum 000 001 010 011 100 101 110 111 2 16 65536= 2 16 – 1– 65537–= 2 0 1= 2 0 – 1– 2–= 2 4 16= 2 4 – 1– 17–= 2 5 32= 2 5 – 1– 33–= 2 1 2= 2 1 – 1– 3–= 2 7 128= 2 7 – 1– 129–= 2 3 8= 2 3 – 1– 9–= 2 2 4= 2 2 – 1– 5–= FIGURA 4.10. Esquema del bloque de olvido.
El píxel de convolución 68 tivo). En cuanto a las señales de handshaking, tanto Rqst como Ack son comunes por filas, mientras que las señales que indican el signo del evento generado (Pulse+ y Pulse-), son comunes por columnas. De este modo, la configuración en array sigue el esquema de la Fig. 4.17. En cuanto al layout del píxel, lo podemos ver en la Fig. 4.18. El área total que ocupa es . La mayor parte del área es ocupada por los 18 bits del sumador y el acumulador, mientras que el resto de los bloques ocupan un área menor. Hemos incluido en el píxel una capacidad entre alimentación y tierra para filtrar glitches de potencia. Esta capacidad, de , está situada bajo las líneas de alimentación y tierra para evitar un consumo extra de área. FIGURA 4.18. Layout de la versión inicial del píxel digital. 95 6,101 3µm2 ,× 240fF
69 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos El rutado de las líneas dentro del píxel es un tema bastante delicado, con algunas capacidades parásitas de acoplo bastante críticas, ya que algunas de ellas son compartidas por todos los píxeles en una misma fila o columna, y pueden alcanzar longitudes de hasta . Algunas de estas líneas se usan para parámetros de configuración, para los cuales fijamos un valor al conectar el chip y permanecen en reposo durante el funcionamiento normal. Así pues, hemos aprovechado estas líneas “estáticas” para situarlas entre las rápidas líneas dinámicas, evitando acoplos entre dichas líneas dinámicas. 4.4.1.1. Resultados de simulación Una vez descrita la versión inicial del píxel digital de convolución, vamos a exponer algunos resultados de simulación eléctrica con Spectre (Cadence) que ilustren el comportamiento de dicho píxel. Para comprobar su funcionamiento, en los ejemplos que vamos a mostrar fijamos un valor del dato correspondiente del kernel y seleccionamos un límite para el acumulador. Con esos parámetros fijos, enviamos una serie de eventos de entrada y comprobamos que el píxel genera un evento de salida cuando ha alcanzado el límite establecido para el acumulador. Un primer resultado de simulación que ilustra el comportamiento del bloque Interfaz AER podemos verlo en la Fig. 4.19. En ella se muestra un caso en el que el píxel ha alcanzado el umbral positivo del acumulador, y tras activar la señal Rqst_row, espera la respuesta del arbitrador. Una vez que recibe dicha respuesta a través de la señal Ack_row, desactiva la señal Rqst_row y activa la señal Pulse+, manteniéndola hasta que el arbitrador desactiva la señal Ack_row. El motivo por el cual la pendiente de subida de la señal Pulse+ es más lenta que la de bajada es que no viene fijada por el píxel, que se limita a forzarla a nivel bajo cuando corresponde, sino que la pendiente de subida viene dada por un pull-up de la periferia. Veamos ahora algunos ejemplos del funcionamiento del píxel. 1. En un primer ejemplo, para comprobar con precisión el funcionamiento del sumador, fijamos el dato del kernel a 1. En cada una de las 4 gráficas mostradas en la Fig. 4.20 podemos ver lo que ocurre cuando enviamos eventos al píxel con un valor umbral del acumulador diferente, que vale 3mm
El píxel de convolución 70 en cada caso 1, 2, 4 y 8, respectivamente. En cada gráfica podemos ver la señal Enable (entrada) en la parte inferior, y las señales Rqst_row y Pulse+ generadas por el píxel en la parte central y superior, respectivamente. Encima de cada señal Enable podemos ver el estado del acumulador después de procesar cada uno de los eventos, lo cual nos permite comprobar cómo todos los pulsos de Rqst_row se producen con el valor adecuado. 2. En un segundo ejemplo, vamos a jugar también con la posibilidad de variar el dato del kernel que el píxel está recibiendo. Las diferentes gráficas correspondientes a este ejemplo las podemos ver en la Fig. 4.21. En primer lugar, fijamos el dato a 2, y seleccionamos el límite del acumulador 16, resultando que tras acumular 8 eventos de entrada el píxel alcanza el límite y activa la señal Rqst_row, como vemos en la gráfica a). En la gráfica b) mantenemos el mismo valor del dato, pero modificamos el umbral a 32, observando que en este caso son 16 pulsos de entrada los que el sumador ha contado, ya que cada uno añade un kernel de valor 2. Por último, en la gráfica c) le damos al dato del kernel el valor 7, mientras que el umbral lo establecemos en 128. Una vez más, los números sobre los pulsos de Enable nos indican el valor del acumulador tras sumar cada uno de los pulsos. Como podemos ver, tras sumar 18 eventos FIGURA 4.19. Señales de handshaking obtenidas en simulación. Pulse+ Ack_row Rqst_row
71 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos el valor del acumulador es de , lo cual implica que aún no se ha alcanzado el límite. Sin embargo, al sumar el evento número 19, obtenemos , luego ya ha superado el límite, provocando el pulso de salida. En este caso, podemos comprobar cómo el píxel detecta que se ha sobrepasado el límite, aunque la cuenta no produzca el valor exacto, ya que solamente comprueba el cambio en el bit correspondiente (en el caso del límite 128, comprueba el valor del bit 7, ya que ). 3. En este otro ejemplo, vamos a observar cómo el píxel suma igualmente un dato negativo, y además tiene en cuenta los pulsos de olvido, como se FIGURA 4.20. Resultados de simulación correspondientes al ejemplo 1, con el dato del kernel igual a 1, y el límite del acumulador variando entre 1, 2, 4 y 8. a) Límite del acumulador = 1 b) Límite del acumulador = 2 c) Límite del acumulador = 4 d) Límite del acumulador = 8 Pulse+ Rqst_row Enable Pulse+ Rqst_row Enable Pulse+ Rqst_row Enable Pulse+ Rqst_row Enable 1111111 222 1234123412345 6 7 8 1234567 8 7 18×126= 126 7+ 133 128>= 27128=
El píxel de convolución 72 muestra en la Fig. 4.22. Concretamente, en esta prueba utilizamos como dato del kernel -1, mientras que el límite del acumulador es -2. De este modo, cuando el píxel recibe un primer pulso de Enable, el acumulador almacena el valor -1, pero cuando justo a continuación recibe un pulso de olvido, el píxel suma +1 (ya que el estado actual es negativo) y el acumulador se pone a 0 de nuevo. A continuación, cuando llegan dos pulsos de Enable consecutivos sin que haya ningún olvido, entonces sí alcanza el acumulador el valor , y genera un evento de salida. En esta figura se puede observar también como la señal que se activa es Pulse-, y no FIGURA 4.21. Resultados de simulación correspondientes al ejemplo 2, con el dato del kernel igual a 2 en a) y b) e igual a 7 en c), y el límite del acumulador variando entre 16, 32 y 128, respectivamente. a) Límite del acumulador = 16, Dato=2 b) Límite del acumulador = 32, Dato=2 c) Límite del acumulador = 128, Dato=7 246810 12 14 16 246810 12 14 16 2 46810 12 14 16 18 20 22 24 26 28 30 32 714 2129 3542 49 56 6370 77 84 9198105112 119 126 133 Enable Rqst_low Pulse+ Enable Rqst_low Pulse+ Enable Rqst_low Pulse+ 2–
73 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos Pulse+ como en los ejemplos previos, indicando correctamente el signo del evento producido. 4.4.2. Versión avanzada Conv2 Una vez fabricado y testado el chip de convolución Conv1, basado en la versión inicial del píxel digital descrita en el apartado anterior, comprobamos que para ciertas aplicaciones en las que queremos obtener rápidamente eventos de salida como resultado de la operación de convolución no necesitamos acumuladores con gran cantidad de bits. Asimismo, observamos que sería interesante poder alcanzar en un único chip una mayor resolución espacial, es decir, mayor cantidad de píxeles integrados. Por este motivo, planteamos esta versión avanzada del píxel de convolución, con el objetivo de incrementar el número de píxeles integrados en un mismo chip sin que ello suponga un coste de área. Las dimensiones utilizadas para esta nueva versión del píxel digital son 6 bits para el acumulador (5 más el signo), y 4 bits para los datos del kernel FIGURA 4.22. Resultados de simulación correspondiente al ejemplo 3, con el dato del kernel igual a -1, el límite del acumulador igual a -2, y con el efecto del olvido. Pulse+ Rqst_row Olvido Enable -1 0-1 -2
El píxel de convolución 74 (3 más el signo). De este modo, el acumulador puede representar valores codificados en complemento a 2 entre y , mientras que el kernel puede presentar valores entre y . En la Fig. 4.23 se muestra el diagrama de bloques del nuevo píxel de convolución. Como se puede observar, además de los nuevos tamaños del sumador, del acumulador y del dato del kernel, hay una serie de diferencias sobre la versión anterior que hay que describir: el bloque de switches a la entrada del dato, la nueva selección del límite del acumulador con el circuito “Logic =” y el bloque de inhibición. 1. Bloque de switches. Este bloque se añadió para reducir el consumo de potencia innecesario en la versión inicial del píxel. Como se describió en el apartado anterior, los datos del kernel almacenados en la RAM se seleccionan por filas para sumarlos sobre una fila de píxeles, con el desplazamiento horizontal adecuado. Así, una vez que se activa la lectura de una fila de la RAM, cada dato aparece a la entrada del sumador de todos los píxeles de una misma columna. En la versión anterior del píxel, esto implicaba que todos los píxeles del array calculaban la suma correspondiente, aunque sólo los píxeles de la fila seleccionada recibían un pulso de Enable, por lo cual solamente éstos almacenaban el resultado de dicha suma. Este modo de operación producía un resultado correcto, aunque tenía el inconveniente de hacer que todos los píxeles efectuaran la suma de forma innecesaria, produciendo un consumo de potencia excesivo. Para solucionar este problema, en la versión avanzada del píxel se añadió 2– 532–= 251– 31= 23 – 8–= 231– 7= FIGURA 4.23. Diagrama de bloques de la versión avanzada del píxel digital de convolución.
75 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos el bloque de switches a la entrada. En la Fig. 4.24 se puede ver un esquema de la funcionalidad de este bloque, así como un diagrama temporal que muestra su comportamiento. De este modo conseguimos evitar que el píxel haga cualquier tipo de operación a menos que reciba un pulso de Enable del controlador, y además sin necesidad de haber añadido ninguna señal extra, ya que hemos utilizado la propia señal de Enable. Así pues, el flanco de subida de dicha señal permite el paso del dato, y el flanco de bajada hace que se almacene el resultado de la suma en el acumulador. Esto va a imponer una limitación sobre la máxima frecuencia de reloj posible, ya que la duración de la señal de Enable viene dada por la duración de un ciclo de reloj. De este modo, una frecuencia de reloj muy elevada provocará que el sumador no tenga tiempo de realizar la operación en la duración del pulso de Enable. En la Fig. 4.25 se puede ver el esquemático del bloque de switches a nivel de transistores. FIGURA 4.24. Esquema del bloque de switches y diagrama temporal de su funcionamiento.
El píxel de convolución 76 2. Selección del límite del acumulador. En la versión inicial existía la posibilidad de elegir entre 8 posibles umbrales, ya que teníamos un acumulador sobredimensionado de 18 bits, y así conseguíamos tener un mayor control sobre el píxel, y realizar pruebas con distintos tamaños. Sin embargo, con el acumulador actual de 6 bits no tiene sentido mantener tan alta programabilidad. Así pues, nuestro objetivo es mantener la posibilidad de escoger entre dos posibles umbrales, con lo cual además reducimos el tamaño del multiplexor, lo que se traduce en un ahorro de área (que es uno de nuestros grandes objetivos para este píxel). Sin embargo, siguiendo con la misma estrategia de comparar un bit del acumulador con su propio bit de signo no conseguíamos los valores que nos interesan. Es decir, en nuestro nuevo acumulador de 5 bits más el signo podríamos establecer un umbral máximo de y un umbral mínimo de , a pesar de poder representar valores entre -32 y 31. Esta limitación es debida a la forma de detectar el umbral a través de la observación de un único bit. Para poder aprovechar completamente la resolución que nos da nuestro acumulador sería necesario incluir un bloque comparador más complejo, en el que se observe el valor de todos los bits. Sin embargo, esto añadiría una complicación extra a nuestro píxel, lo que se traduce en un incremento de área, algo que queremos evitar. FIGURA 4.25. Esquemático del bloque de switches. 2416= 24 – 1– 17–=
77 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos Por este motivo proponemos una solución intermedia, comparando solamente los dos bits más significativos de la magnitud con el bit de signo. De este modo, detectaremos el umbral para el valor en los positivos, y . Esta operación la realiza la puerta lógica que podemos ver en la Fig. 4.26, ya que se trata de comparar el valor de estos dos bits con el bit de signo invertido. Por ese motivo, las entradas de este bloque A, B y C se conectan a los bits 3 y 4, y al bit de signo invertido, respectivamente. No obstante, incluimos en el píxel también un multiplexor de 2 entradas para poder seleccionar entre los umbrales de -25 y 24, o bien y , simplemente seleccionando el bit 3 del acumulador del mismo modo que lo hacíamos en la versión anterior del píxel. Así pues, los posibles umbrales quedan tal y como se muestra en la Tabla 4.2. 3. El bloque de inhibición es una nueva utilidad añadida a nivel de píxel para poder seleccionar el signo de los eventos que nos interesan en una 011000 224 10 = 100111 225 10 –= FIGURA 4.26. Puerta lógica que indica si 3 señales de entrada son iguales entre sí. 23 – 1– 9–= 238=
El píxel de convolución 84 observa cómo son necesarios hasta 15 eventos de entrada para alcanzar el valor umbral de 8, debido a los pulsos de olvido intercalados. Con esto, damos por concluido el capítulo dedicado a la descripción del píxel de convolución. En el siguiente capítulo pasamos a describir el resto de bloques periféricos utilizados en los chips de convolución Conv1 y Conv2. FIGURA 4.33. Resultados de simulación correspondientes al ejemplo 3. En la gráfica de la izquierda se utiliza un dato igual a -1 con un umbral del acumulador de -25, mientras que en la gráfica de la derecha se usa un dato igual a 1 con un umbral de 8, pero con el efecto del olvido activado. Enable Rq_row PulseEnable Rq_row Pulse+ Forgetting 123456 7 8910111213141516171819202122232425 11223 3 4 45566778 0123 4 5 6
85 CAPÍTULO 5 Bloques periféricos en los chips de convolución 5.1. Introducción La forma de llevar a cabo convoluciones bidimensionales mediante un sistema AER ha sido descrita en capítulos previos. Resumiendo, nuestro chip de convolución tiene que recibir eventos de entrada, y para cada uno de ellos ha de sumar el kernel (que previamente ha sido cargado en la RAM del kernel) sobre un vecindario de píxeles determinado por la dirección del evento de entrada. Además cuando cada uno de estos píxeles alcance un umbral, tiene que generar un evento de salida y transmitirlo al puerto AER de salida. La parte central de este procesamiento, el píxel de convolución, ya ha sido descrito en el capítulo anterior, y es el encargado de computar de forma local la operación de convolución, pero son necesarios una serie de bloques para gestionar el procesamiento completo. En general, aparte del array de píxeles, podemos distinguir dos partes fundamentales en nuestros chips de convolución: la que se encarga de recibir los eventos de entrada y sumar el kernel sobre los píxeles, y la que se encarga de recibir los eventos generados por los píxeles y enviarlos al exterior. Todo ello se muestra en la Fig. 5.1.
Bloques periféricos en los chips de convolución 86 La que podríamos llamar etapa de entrada consta de los siguientes bloques: 1. El controlador síncrono, que captura el evento de entrada y realiza los cálculos oportunos para decidir qué acciones tiene que llevar a cabo para procesar dicho evento. Además se encarga de enviar al resto de bloques las señales oportunas para llevar a cabo dicho procesamiento. Este bloque está detallado en la Sección 5.2. 2. La memoria RAM, donde se almacena el kernel de convolución antes de que el chip entre en modo de funcionamiento, y de donde se leen los FIGURA 5.1. Arquitectura del chip de convolución (* Bloque incluido solamente en la versión Conv2)
87 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos datos que tienen que ser sumados por los píxeles. Este bloque aparece descrito en la Sección 5.3. 3. El inversor de complemento a 2, que se encarga de invertir los datos del kernel antes de sumarlos en los píxeles en el caso de que el evento de entrada tenga signo negativo. En la Sección 5.4 se encuentra la descripción de este bloque. 4. El bloque de desplazamiento horizontal. Según la dirección del evento de entrada, el kernel almacenado en la RAM deberá sumarse sobre unos píxeles concretos dentro del array. Este bloque se encarga de desplazar horizontalmente el kernel de la RAM para que coincida justo con los píxeles deseados. Está descrito en la Sección 5.5. Por otra parte, la etapa de salida es la que llamamos generador AER, y aparece detallada en la Sección 5.6. En general, hay que recordar que en la presente tesis estamos describiendo dos versiones diferentes de chip de convolución, a las que nos referimos como Conv1 y Conv2, y ya en el Capítulo anterior describimos los píxeles de convolución correspondientes a las dos versiones. Del mismo modo, a lo largo del presente capítulo, para cada bloque iremos comentando las diferencias existentes entre ambas versiones de dicho bloque si las hubiera. 5.2. El controlador síncrono El esquema del controlador síncrono podemos verlo en la Fig. 5.2. Aunque la parte fundamental del controlador es la máquina de estados, que es la encargada de realizar todo el procesamiento y habilitar las operaciones que tienen que realizar el resto de bloques, dicha máquina de estados necesita una serie de bloques para su funcionamiento. Si analizamos este diagrama de bloques desde el punto de vista de la entrada de eventos, en primer lugar nos encontramos un bloque de sincronizadores. Este bloque es necesario por la naturaleza asíncrona del protocolo AER, para procesar un evento asíncrono por una máquina de estados síncrona (esto se explicará más adelante, con resultados experimentales, en la Sección 5.2.4). A continuación, aparece la cola de entrada, que se utiliza para almacenar en ella los
Bloques periféricos en los chips de convolución 88 eventos de entrada mientras esperan para ser procesados. Esto evita el riesgo de perder eventos que lleguen en un periodo de tiempo menor del necesario para procesarlos. A continuación, los eventos capturados por la cola son procesados por la máquina de estados, que se encarga de habilitar las señales oportunas para la lectura de las filas del kernel programadas en la RAM, invertir los datos si el evento que está procesando es negativo, indicar el desplazamiento horizontal necesario para que el kernel quede centrado sobre los píxeles adecuados, y por último generar los pulsos de Enable para que cada fila de píxeles sume los datos oportunos del kernel. También se encarga, en el caso de Conv2, de generar unas señales para bloquear columnas, como parte del sistema multikernel. El sistema multikernel (utilidad incluida en Conv2) permite programar varios kernels diferentes (hasta un máximo de 32) en la memoria RAM, de forma que cada evento de entrada incluye, aparte de la dirección, información sobre qué kernel debe usarse para procesarlo. Así, el controlador tiene que activar las filas correspondientes de la RAM en función del kernel indiFIGURA 5.2. Diagrama de bloques del controlador síncrono.
89 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos cado por cada evento, y también tiene que bloquear las columnas que no forman parte del kernel (que en general, formarán parte de otro kernel diferente) para que sólo se sumen las posiciones adecuadas sobre el array de píxeles. En las siguientes secciones se describirá cómo afecta esta utilidad a los diferentes bloques del chip. Además de estos bloques, vemos en la Fig. 5.2 que también tenemos un generador de reloj, que permite que el controlador síncrono funcione sin necesidad de una señal de reloj externa (que también se le puede suministrar si lo deseamos). Y por último, aunque no necesariamente debe estar integrado dentro del controlador, representamos en la figura el registro de configuración. En este registro, antes de que nuestro chip entre en modo de operación, cargamos una serie de parámetros en serie con los cuales establecemos el modo de funcionamiento. Algunos de estos parámetros son utilizados por la máquina de estados para realizar su cometido (como la dirección base de los píxeles del array), y otros se usan para configurar los propios píxeles (como el valor del umbral del acumulador). El controlador ha sido descrito mediante código VHDL [93] y sintetizado de forma automática, con la particularidad del registro de configuración, que en la versión de Conv1 se diseñó aparte del controlador mientras que en Conv2 se incluyó dentro del bloque global. 5.2.1. El generador de reloj de alta frecuencia El generador de reloj utilizado es un oscilador en anillo de 5 inversores, tal y como se muestra en la Fig. 5.3. El realidad, el quinto inversor del anillo está integrado en la puerta NAND que se utiliza para habilitarlo o deshabilitarlo. Como podemos ver, hay un multiplexor que, mediante la señal Sel_clk, permite conmutar entre la señal de reloj generada internamente u otra introducida desde fuera del chip. La puerta NAND se encarga de que el anillo deje de oscilar cuando está seleccionado el reloj externo, para evitar consumo y ruido innecesario. Además, como se indica en la figura, uno de los inversores del anillo tiene limitada la corriente máxima mediante una señal de control Vbias_clk, la cual es accesible desde el exterior del chip y nos permite programar la
Bloques periféricos en los chips de convolución 90 frecuencia de reloj. La señal de reloj generada por este bloque (Clk_out) está conectada a un divisor de frecuencia que nos permite acceder a su salida desde fuera del chip. Gracias a eso, podemos medir externamente la frecuencia de reloj (dividida por 32, para facilitar su visualización en laboratorio) y ajustar la tensión de control para conseguir la frecuencia que queramos. En la Fig. 5.4 podemos ver la relación obtenida por simulación del extraído con Spectre entre esta tensión de control y la frecuencia de oscilación. El controlador puede trabajar con frecuencias de reloj de hasta 200MHz, aunque la frecuencia máxima de funcionamiento del chip viene limitada por otros bloques. 5.2.2. La cola de entrada Al hablar de la cola de entrada nos referimos al bloque encargado de capturar los eventos (previamente sincronizados con el reloj del sistema) y pasárselos a la máquina de estados para que ésta realice las operaciones oportunas. Además, incluye una cola circular de 4 posiciones que actúa como un buffer, es decir, permite almacenar hasta 5 eventos mientras la máquina de estados está ocupada (los 4 de la cola más la posición de almacenamiento en el bloque External Interface). En realidad el objetivo de esta cola no es ser capaz de gestionar un alto promedio de tráfico de entrada, ya que la cola se saturaría al hacerlo la máquina de estados, sino que está diseñada para responder ante pequeños picos de tráfico puntuales. Si llegan FIGURA 5.3. Esquema del generador de reloj.
91 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos eventos mientras todas las posiciones están ocupadas, el receptor detiene al emisor no respondiendo a la señal de Rqst. El funcionamiento de la cola es el que se explica a continuación, y está ilustrado en la Fig. 5.5. En estado de reposo permanece mientras espera que se active la señal Rqst. Una vez que se activa dicha señal, comprueba si hay FIGURA 5.4. Caracterización del generador de reloj (frecuencia de oscilación frente a la tensión de control). FIGURA 5.5. Diagrama que ilustra el funcionamiento de la cola de entrada.
Bloques periféricos en los chips de convolución 92 alguna posición libre de la cola (mirando una señal interna Full/Empty), y si la respuesta es afirmativa entonces almacena la dirección del evento y activa la señal Ack. Este proceso se lleva a cabo por el bloque llamado External Interface, que a su vez se encarga de enviar el evento almacenado al bloque llamado Do Write, que se encarga de la escritura en la cola. Así pues, a continuación este bloque se encarga de copiar la dirección del evento en la primera posición disponible de la cola, y de incrementar el valor del registro llamado Last, que apunta al último elemento de la cola. Entonces verifica si el valor de (Last+1)MOD4 coincide con el de First MOD4, lo cual significaría que la cola está completa, activando en ese caso la señal Full/Empty. En cuanto al proceso de lectura, cuando la máquina de estados esté en espera, comprobará si hay algún evento en la cola preguntándole al bloque Do Read, el cual se encarga de mirar los valores de First, Last y Full/Empty. Si se da el caso de que (Last+1)MOD4 no coincide con First MOD4, o bien Full/Empty está activo, eso significa que hay al menos un evento en la cola esperando a ser procesado. En ese caso, envía a la máquina de estados el evento almacenado en la posición First de la cola, incrementando el valor de First y desactivando Full/Empty si estaba activo. 5.2.3. La máquina de estados La máquina de estados es la responsable de llevar a cabo la operación de convolución paso por paso, habilitando la suma del kernel sobre los píxeles oportunos fila por fila. Para ello, necesita conocer las coordenadas del array de píxeles y del evento de entrada, así como el tamaño del kernel, para así poder calcular la posición exacta sobre la que aplicar dicho kernel. Puede ocurrir que el campo proyectivo correspondiente a un evento de entrada caiga completamente fuera del espacio de direcciones del chip, o bien que caiga dentro parcialmente. En función del caso concreto en el que se encuentre, el controlador efectuará unas operaciones u otras. El diagrama de estados se muestra en la Fig. 5.6, y lo describimos a continuación: 1. Estado de reposo. El controlador se encuentra esperando hasta la llegada de algún evento de entrada. Mientras la cola no active la señal de dato disponible, la máquina permanece indefinidamente en este estado. Una vez que detecta dicha señal, pasa al estado de cálculo. Este estado se
93 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos encarga también de la generación de la señal de olvido global de forma periódica. El controlador, aparte de esta máquina de estados, incluye también un contador programable de 20 bits que activa una señal de fin de cuenta cada vez que alcanza el límite, quedándose a la espera. Sin embargo, para evitar colisiones entre la señal de olvido y las señales Enable, es el estado de reposo de la máquina de estados el que comprueba el valor de la señal de fin de cuenta, generando entonces el pulso global de olvido y reiniciando el contador. 2. Estado de cálculo. Es en este estado donde la máquina tiene que realizar los cálculos y decidir las operaciones necesarias. En primer lugar, computa la posición horizontal del kernel dentro del array de píxeles, de FIGURA 5.6. Diagrama de estados del controlador síncrono.
Bloques periféricos en los chips de convolución 100 los pulsos de olvido. Tanto los bits de selección de sincronizador como el de selección de reloj se usan para controlar sus bloques correspondientes. En cuanto a los 64 bits de configuración de los pull-downs de la arbitración por filas, su funcionamiento aparece descrito en la Sección 5.6, al describir el generador AER. En cuanto a la otra versión de chip de convolución Conv2, la etapa de configuración presenta una serie de novedades, fundamentalmente debidas al sistema multikernel. Como ya se ha comentado anteriormente, este sistema se basa en la posibilidad de programar hasta 32 kernels diferentes en la RAM, así que para que la máquina de estados pueda acceder al kernel correspondiente en función del evento de entrada necesita información acerca de la posición de cada uno de ellos. Por ese motivo se ha diseñado una tabla de memoria formada por 34 filas de 32 bits cada una. En cada fila de las 32 primeras se almacena la información referente a cada kernel, mientras que en las dos últimas filas se almacenan el resto de parámetros del sistema. TABLA 5.2. Lista de parámetros de configuración Parámetro Número de bits Significado 14 Coordenada del píxel superior izquierdo dentro del espacio de entrada de 128x128 14 Coordenada del píxel inferior derecho dentro del espacio de entrada de 128x128 10 Dimensiones del kernel dentro de la RAM 20 Ciclos de reloj entre dos pulsos de olvido globales 1 Selección del reloj interno o externo 3 Selección del límite del acumulador 64 Configuración de los transistores pull-down en la arbitración por filas 2 Selección de sincronizador x y,( ) min x y,( ) max p q,( ) n olv sel clk sel acc sel pd sel syn
101 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos Para describir la información referente a cada kernel se necesitan 6 parámetros, los cuales aparecen representados en la Fig. 5.9. Como podemos ver, 4 de estos parámetros indican la posición del kernel dentro de la memoria RAM a través de las coordenadas de la esquina superior izquierda y de la esquina inferior derecha . Cada uno de estos 4 parámetros tiene 5 bits. En cuanto a los dos parámetros restantes, indican las coordenadas del centro de aplicación del kernel. En la versión anterior Conv1 este parámetro no existía, ya que se consideraba que todos los kernels se aplicaban sobre su propio centro. Sin embargo, para algunas aplicaciones se ha comprobado que no siempre tiene que ser así. Por ejemplo, en las aplicaciones de reconocimiento de letras se usan convoluciones que tratan de detectar características de un carácter que se encuentran en un extremo del mismo, luego el kernel se tiene que aplicar desplazado sobre su propio centro [74]. Por este motivo se incluyen dos parámetros que indican la posición relativa a la dirección del evento que debe ocupar el kernel. Estos parámetros pueden ser positivos o negativos, ya que esta posición puede suponer un desplazamiento hacia la derecha o hacia la izquierda, y FIGURA 5.9. Definición de los parámetros relativos a cada kernel. xmin ymin ,( ) xmax ymax ,( ) cxcy ,( )
Bloques periféricos en los chips de convolución 102 hacia arriba o hacia abajo. Por ello, se codifican en complemento a 2 con 6 bits (5 más el signo), conformando un total de 32 bits para definir las características de cada kernel, que es la longitud de una fila de la tabla de memoria. Así, cada vez que llega un evento de entrada, en función del número de kernel que indique se selecciona la fila correspondiente de esta tabla de memoria, de forma que la máquina de estados solamente verá esa fila, a partir de la cual obtiene los datos necesarios para calcular el desplazamiento horizontal que debe aplicar para centrar el kernel sobre el array de píxeles, así como las posiciones de la RAM que tiene que leer. También utiliza estos parámetros para activar las señales Block_col para todos los valores menores que y mayores que . En las dos filas restantes de la tabla de memoria se almacena la información relativa a la configuración del chip de convolución. En la fila 33 se incluyen las coordenadas del espacio de direcciones del chip , , 4 parámetros de 8 bits cada uno. La última fila, la 34, almacena 1 bit de selección para el límite del acumulador de los píxeles, 2 bits para la selección de inhibición de eventos positivos o negativos, 1 bit para la activación del mecanismo de olvido y 20 bits para establecer la frecuencia de dicho mecanismo. 5.3. La memoria RAM estática La memoria RAM es el bloque que se encarga de almacenar el valor del kernel (ya sea un único kernel en Conv1 o múltiples de ellos en Conv2), así que también será el que limite el tamaño del kernel de convolución. En el caso de Conv1 podemos utilizar kernels de un tamaño máximo de , mientras que en el caso de Conv2 tendremos la misma limitación si programamos un único kernel, mientras que cuando programemos varios de ellos será obligatorio que estos sean más pequeños. En definitiva, en ambos casos la memoria RAM cuenta con posiciones. La diferencia entre ambos chips es que, como se describió en el capítulo anterior, Conv1 utiliza datos de 6 bits mientras que Conv2 los usa de 4 bits. Por lo demás, desde un punto de vista de estructura, ambas memorias son iguales. xmin xmax imin jmin ,( ) imax jmax ,( ) 32 32× 32 32×
103 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos En la Fig. 5.10 podemos ver el esquema del bloque completo de memoria RAM, incluyendo la circuitería de escritura y lectura. En la parte inferior vemos el registro de desplazamiento de bits, siendo n el número de bits de cada dato (6 para Conv1 y 4 para Conv2). Este registro de desplazamiento en realidad cuenta con 5 bits más que se usan para indicar la fila correspondiente. De este modo, cuando queremos escribir la RAM desde fuera del chip, enviamos cadenas de bits, y el decodificador se encarga de activar la fila correspondiente y almacenar los datos en ella. El proceso de lectura es muy parecido, salvo que los 5 bits que seleccionan la fila no los toma del registro de desplazamiento, sino del propio controlador, que activa el modo de lectura y le indica la fila correspondiente. De este modo, el decodificador habilita la lectura de la fila correspondiente. Para implementar el sistema multikernel, en el chip Conv2 se añade un bloque extra a la salida de los datos de la RAM, ya que tenemos que asegurarnos de que todas las posiciones de la memoria que no se corresponden con el kernel que estemos procesando en cada momento no afecten al array de píxeles. Para ello la máquina de estados genera una señal de Block_col FIGURA 5.10. Esquema del bloque completo de memoria RAM. 32 n× 32 n×( ) 5+
Bloques periféricos en los chips de convolución 104 para cada una de las 32 posiciones de la RAM (por columnas) que se encarga de bloquear todas las palabras que no pertenecen al kernel. El circuito que se encarga de implementar este bloqueo aparece representado en la Fig. 5.11. En esta figura se muestra el subcircuito correspondiente a cada uno de los 32 datos de la RAM (formados por 4 bits cada uno en el caso de Conv2). Así pues, el circuito completo incluirá 32 celdas como la de la figura. El circuito recibe del controlador 32 señales de Block_col_i, las cuales valdrán 1 para y 0 para los valores restantes ( y se corresponden con la posición del kernel en la RAM según se indica en la Fig. 5.9). Así las señales Data_i<0:3> valdrán 0 para todas las columnas que no pertenezcan al kernel. En la Fig. 5.12 podemos ver la estructura de una celda básica de la memoria RAM, diseñada de forma que tiene un tiempo de lectura inferior a 2ns, ya que necesitamos que el tiempo de escritura del kernel sea lo más rápido posible. Cualquier retraso extra que añadiera la RAM incidiría en el tiempo que se tarda en procesar cada fila, y como consecuencia limitaría la máxima frecuencia de reloj que puede ser programada. La Fig. 5.13 muestra el layout de una celda básica como la de la Fig. 5.12. FIGURA 5.11. Circuito encargado de bloquear las columnas de la RAM para implementar el sistema multikernel. xmin i xmax ≤ ≤ xmin xmax
105 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos 5.4. El inversor de complemento a 2 Como ya se explicó al describir el funcionamiento global del chip de convolución, éste recibe eventos AER con su correspondiente bit de signo, al igual que cada evento de salida debe ser generado también con su propio signo indicando si el píxel en cuestión ha saturado por el límite positivo o por el negativo. Así pues, cuando un chip recibe un evento de entrada negaFIGURA 5.12. Celda básica de la memoria RAM. FIGURA 5.13. Layout de una celda de memoria RAM.
Bloques periféricos en los chips de convolución 106 tivo tiene que procesarlo como tal, es decir, sumando el kernel sobre el vecindario correspondiente pero cambiado de signo. Por este motivo necesitamos un bloque que invierta el signo del kernel. Para desempeñar esta función se contemplaron 2 alternativas. La primera de ellas consistía en almacenar en nuestra memoria RAM el kernel natural y con el signo invertido. Esto simplificaría la operación del chip, ya que simplemente tendría que acceder a una zona diferente de la memoria en función del signo del evento. Sin embargo, la desventaja que tenía es que limitaba el tamaño del kernel, ya que éste necesitaba el doble de su tamaño para almacenarlo. La segunda alternativa consistía en añadir un bloque que calculara el inverso de cada dato de la RAM en el momento de ser leído. Esta alternativa nos permite mantener el tamaño máximo del kernel, y solamente tiene la pequeña desventaja de añadir un ligero retraso sobre el proceso de lectura, así que hemos diseñado el bloque inversor para minimizar dicho retraso, que en la práctica resulta despreciable dentro del proceso de lectura. El retraso añadido por el bloque inversor ha sido estimado en unos mediante simulación con Spectre, mientras que el coste de área adicional consumida por este circuito es de unas (siendo el área consumida por la RAM de mucho mayor). De este modo, se necesitan 32 bloques, uno para cada posición de la RAM. Para Conv1, la estructura del bloque propuesto consta de 6 circuitos combinacionales, uno por cada salida. Para Conv2 sólo necesitamos 4 circuitos. Por este motivo vamos a describir el utilizado en Conv1. La entrada a cada bloque se trata de una palabra digital de 6 bits siendo el bit más significativo, el que indica el signo. Además, recibirán una entrada sel que indica que se habilita la operación de inversión, y se obtiene otra palabra digital de 6 bits de salida donde es el bit más significativo. A partir de las tablas de verdad que expresan los resultados para todas las posibles combinaciones, las expresiones lógicas obtenidas para las 6 señales de salida se pueden ver en las ecuaciones (5.1)-(5.6). (EQ 5.1) (EQ 5.2) 400ps 3750 40µm2 × 3750 480µm2 × i0…i5 , ,( ) i5 o0…o5 , ,( ) o5 o0i0 = o1i1sel∨( ) i0i1 ∨( ) i1i0sel∨ ∨( )∧ ∧=
107 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos (EQ 5.3) (EQ 5.4) (EQ 5.5) (EQ 5.6) A partir de estas expresiones se obtienen las puertas lógicas correspondientes. En las figuras Fig. 5.14-Fig. 5.18 aparecen representados los esquemáticos resultantes (en la parte izquierda) y los layouts (en la parte derecha) de las celdas que calculan los bits - (teniendo en cuenta la ecuación (5.1), no hace falta una puerta lógica para calcular ). 5.5. El bloque de desplazamiento horizontal Una vez que los datos del kernel son leído de la RAM, antes de llegar a los píxeles correspondientes del array tienen que desplazarse hacia la izquierda o hacia la derecha para centrarse sobre las direcciones adecuadas. Esta operación la lleva a cabo el bloque de desplazamiento horizontal. Este bloque consiste en un array bidimensional de buffers tri-estado controlados por las señales de desplazamiento y right/left. Estas señales son generadas por la máquina de estados, que a través de dos decodificadores incluidos en el propio controlador habilita la señal de desplazamiento apropiada. En la Fig. 5.19 podemos ver la estructura de este bloque. Como o2i2sel∨( ) i2i0sel∨ ∨( ) i2i1sel∨ ∨( ) i2i1i0 ∨ ∨( )∧ ∧ ∧= o3i3sel∨( ) i3i0sel∨ ∨( ) i3i1sel∨ ∨( )∧ ∧ ∧= i3i2sel∨ ∨( ) i3i2i1i0 ∨ ∨ ∨( )∧ ∧ o4i4sel∨( ) i4i0sel∨ ∨( ) i4i1sel∨ ∨( ) i4i2sel∨ ∨( )∧ ∧ ∧ ∧= i4i3sel∨ ∨( ) i4i3i2i1i0 ∨ ∨ ∨ ∨( )∧ ∧ o5i5sel∨( ) i5i0sel∨ ∨( ) i5i1sel∨ ∨( ) i5i2sel∨ ∨( )∧ ∧ ∧ ∧= i5i3sel∨ ∨( ) i5i4sel∨ ∨( ) i5i4i3i2i1i0 ∨ ∨ ∨ ∨ ∨( )∧ ∧ ∧ o1 o5 o0 x∆
Bloques periféricos en los chips de convolución 108 ya se ha descrito al hablar de la máquina de estados, cada vez que ésta está procesando un evento realiza los cálculos oportunos entre la dirección de FIGURA 5.14. Esquemático y layout del circuito combinacional que calcula el bit en el bloque inversor de complemento a 2. o1 FIGURA 5.15. Esquemático y layout del circuito combinacional que calcula el bit en el bloque inversor de complemento a 2. o2
109 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos FIGURA 5.16. Esquemático y layout del circuito combinacional que calcula el bit en el bloque inversor de complemento a 2. o3 FIGURA 5.17. Esquemático y layout del circuito combinacional que calcula el bit en el bloque inversor de complemento a 2. o4
Bloques periféricos en los chips de convolución 116 sor fuerte, sino con el débil. Así conseguimos que la comunicación por filas sea más robusta y más rápida.
117 CAPÍTULO 6 Resultados experimentales 6.1. Introducción En este capítulo presentamos los resultados experimentales obtenidos con los chips de convolución fabricados, que han sido descritos en los capítulos anteriores. En primer lugar, la Sección 6.2 muestra algunas pruebas a nivel de píxel efectuadas sobre un primer prototipo formado por un array de píxeles de la versión inicial. Estas pruebas sirvieron fundamentalmente para validar dicho píxel como paso previo al diseño del chip de convolución completo con el resto de bloques. A continuación, la Sección 6.3 describe las herramientas básicas utilizadas para los tests realizados sobre el chip de convolución, concretamente las diversas placas para gestionar los eventos AER y el entorno software que junto con dichas placas nos permite controlar los chips y realizar sobre ellos las pruebas oportunas. Por último, en las Secciones 6.4 y 6.5 se detallan las pruebas realizadas sobre el chip de convolución Conv1 y Conv2, respectivamente, mostrando 2 2×
Resultados experimentales 118 los principales resultados obtenidos. Para el chip Conv2 no se han podido completar todos los tests debido a un error en la implementación del controlador síncrono, que ha sido detectado y corregido en una nueva versión que en el momento de la elaboración de este documento se encuentra en fabricación. Así pues, se incluyen solamente los resultados relativos a la caracterización del chip, ya que estos no están afectados por el error del controlador. 6.2. Prototipo de 2x2 píxeles Como un primer paso antes de diseñar todos los bloques del chip de convolución descritos en los capítulos previos, se planteó la necesidad de comprobar el correcto funcionamiento del píxel digital, como elemento base del sistema completo. Para ello, se fabricó en la tecnología de AMS un pequeño circuito con un array de píxeles. En la Fig. 6.1 podemos ver una fotografía de dicho circuito. El prototipo almacena un único valor de kernel que se comparte por los 4 píxeles. Para evitar tener un número elevado de pads en este circuito, se 0.35µm 2 2× FIGURA 6.1. Fotografía del prototipo de 2x2 píxeles de convolución.
119 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos utilizó por una parte un registro de desplazamiento a través del cual podemos programar el valor de la palabra del kernel y del límite del acumulador (ambos datos comunes para los 4 píxeles), y por otra parte una señal Sel_row encargada de seleccionar cuál de las dos filas debe recibir las señales Enable y Ack, que externamente son comunes. Esta configuración se puede entender mejor con la ayuda del esquema mostrado en la Fig. 6.2. Se testó con el Agilent 82000, dada la simpleza de los tests. Más adelante, para test con estímulos asíncronos se empleará una infraestructura AER específica. 6.2.1. Caracterización del píxel Para realizar pruebas sobre este prototipo, seguimos el siguiente método: primero se programa el registro de desplazamiento seleccionando un límite del acumulador y estableciendo el valor del dato del kernel, y a continuación se habilita una de las filas a través de la señal Sel_row. Una vez configurado de este modo, podemos enviarle señales de Enable y observar que los píxeles activan la señal Rqst_row cuando el acumulador alcanza el límite programado. Externamente programamos la señal Ack para que FIGURA 6.2. Esquema de la configuración de test utilizada para controlar el prototipo de 2x2 píxeles de convolución.
Resultados experimentales 120 responda y así podemos comprobar que el signo de los eventos es el correcto observando las señales p1+, p1-, p2+ y p2-. En la Fig. 6.3 podemos observar los resultados obtenidos de una primera prueba. En este caso se estableció el límite del acumulador en para valores positivos y para valores negativos En este primer prototipo los valores seleccionables no eran los mismos que en la versión integrada en el chip de convolución Conv1 descrita en el capítulo correspondiente. Por otra parte, se programó un dato del kernel de 31 (el máximo valor positivo posible con 6 bits en complemento a 2) en primer FIGURA 6.3. Resultados del test del prototipo 2x2 con un límite del acumulador de 512 para valores positivos y -513 para los negativos. 29512= 29 – 1– 513–=
121 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos lugar. Con esta configuración, seleccionando la fila 2, se le enviaron pulsos de Enable al circuito, observando cómo la señal Rq_row2 producía un evento después de acumular 17 pulsos de entrada ( , y ). También podemos comprobar cómo al recibir la señal de Ack ambos píxeles activan la señal p1+ y p2+, indicando el signo del evento. Todo esto aparece reflejado en la gráfica superior de la Fig. 6.3. En general, en los resultados del test se aprecia que los pulsos de Rqst tienen diferentes duraciones. Esto es debido a que, si bien la activación de dicha señal depende del instante en el cual se alcanza el límite del acumulador, la desactivación se produce cuando externamente se activa la señal Ack. Así, en función del instante en el que programemos la activación del Ack, el pulso de Rqst durará más o menos. En cuanto a la gráfica inferior de la Fig. 6.3, en ella simplemente se modifica el valor del dato del kernel, siendo en este caso -31. De este modo, comprobamos que el límite del acumulador se alcanza igualmente tras recibir 17 pulsos de entrada ( , y ). La diferencia que podemos observar es que al recibir la respuesta de la señal Ack, los píxeles activan en esta ocasión la señal p1y p2-, indicando que han alcanzado el límite negativo del acumulador. Para comprobar qué ocurre cuando fijamos un límite diferente del acumulador, hacemos una segunda prueba, seleccionando en este caso como umbral para valores negativos y para valores negativos. Al repetir con estos parámetros las mismas pruebas que hicimos con la configuración anterior, obtenemos los resultados mostrados en la Fig. 6.4. Así, en la gráfica superior de la Fig. 6.4 vemos lo que ocurre con un dato programado de 31. Si contamos el número de eventos de entrada recibidos antes de generar un evento de salida, vemos que son 34, lo cual resulta coherente al ser . De este modo, una vez que recibe el evento número 34 los píxeles de la fila 2 (que son los que tenemos seleccionados en esta prueba) generan un pulso de Rqst, y al recibir la señal Ack activan p1+ y p2+ indicando que el evento es positivo. En la gráfica inferior de la Fig. 6.4 programamos como dato del kernel -31, de modo que los píxeles igualmente activan el Rqst después de recibir 34 pulsos de 16 31×496 512<= 17 31×527 512≥= 16 31–( )× 493 513–>–= 17 31–( )× 527 513–≤–= 210 1024= 210 – 1– 1025–= 33 31×1023 1024<=
Resultados experimentales 122 Enable ( ). También se comprueba cómo activan las señales p1y p2para indicar que ambos píxeles han alcanzado el límite negativo del acumulador. En cuanto a los datos de temporización medidos dentro del bloque de interfaz del protocolo de los píxeles, podemos ver los resultados representados en la Fig. 6.5. Por una parte, podemos ver el retraso desde el flanco de bajada de la señal Enable que se encarga de que se almacene el resultado de la suma y el flanco de subida de la señal Rqst_row en el caso de que al almaFIGURA 6.4. Resultados del test del prototipo 2x2 con un límite del acumulador de 1024 para valores positivos y -1025 para los negativos. 33 31–( )× 1023 1025–>–=
123 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos cenar dicho resultado se haya superado el umbral programado. Del mismo modo, se muestra el tiempo que tarda el píxel en desactivar la señal Rqst_row después de recibir la respuesta de la periferia. Y por último, los retrasos que añade el píxel al activar y desactivar las señales verticales Pulse+ cuando recibe el permiso para hacerlo a través de la señal Ack. 6.3. Infraestructura AER para tests asíncronos Para la realización de los diversos tests que se han llevado a cabo con los chips de convolución diseñados para el presente trabajo, se han utilizado una serie de placas configurables [48], [96], [97], [98] que, junto con el entorno software adecuado, han facilitado mucho el desarrollo de las pruebas. En la Fig. 6.6 se muestra un ejemplo de infraestructura AER para test. En ella podemos ver una placa AER con un chip de convolución (3) con su correspondiente placa de configuración (4). Además, tenemos dos placas USB-AER, una de ellas configurada como data-player (1), y la otra como data-logger (6). Por último, se pueden ver dos placas Splitter-Merger, una configurada en modo Splitter (2) y la otra como Merger (5). A continuación incluimos una breve descripción de dichas placas, así como del entorno software. FIGURA 6.5. Datos de temporización obtenidos con el prototipo de 2x2.
Resultados experimentales 124 FIGURA 6.6. Ejemplo de infraestructura AER para test. Fotografía de las distintas placas en la parte superior, y esquema correspondiente en la parte inferior.
125 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos 6.3.1. Placa AER Ésta es una placa sobre la cual se inserta el propio chip de convolución (encapsulado sobre un PGA-100). Como se puede ver en la Fig. 6.7, esta placa incluye una serie de potenciómetros para controlar las tensiones de polarización del chip (para establecer la frecuencia de reloj y para controlar los pull-ups y pull-downs del generador AER). Además, la placa recibe como entrada un bus de configuración a través del cual se programan los registros de parámetros y el valor del kernel. Por último, cuenta con dos buses AER, uno de entrada y otro de salida, que se conectan al chip de convolución. En la Fig. 6.6, se trata de la placa 3. 6.3.2. Placa USB-AER Esta placa se encarga de gestionar el tráfico AER, y se puede utilizar en dos modos de funcionamiento diferentes: como data-player y como data-logger. El modo de funcionamiento se selecciona programando el firmware correspondiente desde el PC [48]. En la parte superior de la Fig. 6.8 se puede ver el esquema del funcionamiento en modo data-player (placa 1 de la Fig. 6.6). En él, la placa recibe desde un PC una lista de eventos AER a través del puerto USB. Esta lista de eventos incluye la dirección y la marca temporal (timestamp) de cada uno de ellos, hasta un máximo de 500k-eventos. Una vez almacenados los eventos en una memoria incluida en la propia placa, al recibir la orden de reproFIGURA 6.7. Esquema de la placa de convolución.
Resultados experimentales 132 6.4.1.3. Caracterización temporal El chip de convolución puede generar eventos de salida con una tasa máxima de eps, medidos cortocircuitando las señales Rqst_out y Ack_out y para eventos generados por píxeles de una misma fila (modo ráfaga). Esta tasa se corresponde con un tiempo entre eventos de . Sin embargo, dependiendo de la posición de los píxeles dentro del array, el tiempo entre eventos cambia de forma significativa. Los píxeles cercanos a los arbitradores provocan menores retrasos de propagación. No obstante, esta influencia de la posición se puede minimizar ajustando cuidadosamente los valores de las tensiones de polarización y switches de calibración de los pull-ups y pull-downs del generador AER. De este modo, conseguimos compensar los retrasos a un rango que oscila entre 20 y 24ns para todos los píxeles del array. En la Fig. 6.13 podemos ver las señales medidas Rqst_in, Ack_in Rqst_out (cortocircuitada con Ack_out) con el kernel de 5 filas de la Fig. 6.14. El umbral de acumulación de los píxeles estaba fijado para producir un evento de salida al recibir un único evento de entrada. De ese modo, este kernel activa 10 píxeles diferentes pertenecientes a 5 filas distintas para cada evento de entrada. Los eventos de salida de la Fig. 6.13 muestran un 50 106 × Trafaga 20ns= FIGURA 6.14. Kernel programado para medir la máxima tasa de salida en los píxeles situados en las cuatro esquinas del array.
133 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos tiempo de entre cada par de eventos pertenecientes a una misma fila (una vez que dicha fila es asentida por el arbitrador, todos los eventos de esa misma fila se emiten en modo ráfaga), y un tiempo de para eventos generados por diferentes filas. Como consecuencia, podemos decir que la diferencia es el retraso introducido por el arbitrador por filas . La tasa de eventos a la entrada depende tanto del tamaño del kernel como de la frecuencia de reloj. Como ya se ha comentado antes, el controlador síncrono necesita ciclos de reloj para procesar cada evento, siendo el número de filas del kernel (hasta un máximo de 32). De esta forma, para una frecuencia de reloj de 120MHz (que se corresponde con un periodo ), la máxima tasa de eventos posible a la entrada es de eps, lo cual se corresponde con un tiempo entre eventos de 50ns cuando el kernel tiene una sola fila. Para un kernel comFIGURA 6.13. Señales Rqst y Ack medidas para los eventos de entrada y salida para una frecuencia de reloj de 120MHz, con Rqst_out y Ack_out cortocircuitadas. El osciloscopio usado es el Agilent DSO7054A, con un ancho de banda de 500MHz y una tasa de muestreo de 4GSa/s. Trafaga 20ns= Tno rafaga–47ns= 47ns 22ns– 25ns= Tarb nclk 4 2 nk ×( )+= nk Tclk 8.33ns= 20 106 ×
Resultados experimentales 134 pleto de 32 filas, la máxima tasa de entrada es de eps, lo cual se corresponde con un tiempo entre eventos de 566ns. En la Fig. 6.15, la latencia entre un evento de entrada y uno de salida se representa mediante , que puede ser expresada como . El retraso llamado es el que introduce el propio chip de convolución desde que recibe el Rqst_in hasta que responde con el Ack_in. El retraso es el que introduce el emisor desde que el chip de convolución asiente el evento hasta que retira la señal Rqst_in. Y el retraso es el tiempo empleado por el chip para procesar el evento de entrada y generar el evento de salida (considerando una situación en la cual un evento de entrada produce uno de salida). De este modo, el retraso se puede expresar a su vez como , donde representa el tiempo que el controlador síncrono necesita para sumar el kernel sobre el array de píxeles, y representa el tiempo que la arbitración asíncrona necesita para generar el evento de salida. La Fig. 6.16 nos muestra los valores medidos de y para distintos valores del periodo de reloj . Las pequeñas barras verticales indican las desviaciones sobre 5000 medidas. Como podemos compro1.77 106 × FIGURA 6.15. Retrasos entre eventos de entrada y salida. Tlatency Tlatency TAER chip–TAER Tx–Tproc event– + += TAER chip– TAER Tx– Tproc event– Tproc event– Tproc event–Tsyn Tasyn += Tsyn Tasyn TAER chip– TAER Tx– Tclk
135 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos bar fácilmente, el retraso es constante (no depende del periodo de reloj), ya que sólo depende del emisor. El retraso medido para la placa emisora en nuestros tests resulta en unos . En cambio, depende linealmente de , como muestra la figura, alcanzando unos 14ns para y con un valor residual estimado extrapolando estos resultados de unos 10ns para (probablemente debido a retrasos internos de las líneas y pads). La Fig. 6.17 muestra los valores medidos de frente al periodo de reloj. El ajuste lineal de estos datos revela que para un periodo de reloj tendríamos una latencia de 97ns, lo cual se correspondería con , ya que en este caso valdría 0. Extrapolando también los valores de y , podemos estimar el valor de , lo cual es coherente con el valor de 47ns medido entre dos eventos de salida pertenecientes a filas diferentes. FIGURA 6.16. Valores medidos de y para distintos periodos de reloj. TAER chip– TAER Tx– TAER Tx– TAER Tx–44ns= TAER chip– Tclk Tclk 5ns= Tclk 0= Tlatency Tclk 0= Tproc event–Tasyn = Tsyn TAER chip– TAER Tx– Tasyn 97ns 44ns– 10ns– 43ns= =
Resultados experimentales 136 Para una frecuencia de reloj de 120MHz el periodo de latencia medido es de 177ns. Al conectar chips de convolución en cascada, el retraso introducido por la placa emisora debería ser reemplazado o bien por , o bien por . Como consecuencia, la verdadera mínima latencia al conectar los chips en cascada vendría dada por . Esta latencia es independiente del número de filas del kernel programado, ya que se trata de el retraso entre un evento de entrada y el primer evento de salida producido por la primera fila del kernel. En la tabla Tabla 6.1 se encuentran resumidas las especificaciones del chip de convolución Conv1. FIGURA 6.17. Valores medidos de para distintos periodos de reloj. Cada medida se ha repetido 5000 veces. La barras de error indican la dispersión. La línea de puntos representa el ajuste lineal ( ). Tlatency y8.2x 97+= TAER Tx– Trafaga 22ns= Tno rafaga–47ns= Tlatency 177ns 44ns 22ns+– 155ns= =
137 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos 6.4.2. Convolución de imágenes estáticas Para ilustrar la operación de convolución, se ha seleccionado en primer lugar una imagen de píxeles de una fotografía real, que se muestra en la Fig. 6.19.(a), para llevar a cabo un procesamiento de extracción de bordes verticales con el kernel de tamaño mostrado en la Fig. 6.18. Este kernel viene dado por una diferencia de gausianas, descrito mediante las ecuaciones (6.1), (6.2) y (6.3): (EQ 6.1) (EQ 6.2) TABLA 6.1. Especificaciones del chip Conv1. Tecnnología 4M 2P 0.35 CMOS Tamaño del píxel Tamaño del chip Array de píxeles Resolución del píxel 18 bits Resolución del kernel 6 bits Computación con signo Sí Tasa de eventos de entrada 1.77-20 Meps Máxima tasa de salida 50 Meps Mínima latencia entradasalida 155ns Consumo de potencia 200mW máximo µm 95.6 101.3µm 2 × 4.3 5.4mm 2 × 32 32× 32 32× 11 7× Fgpkqk ,( ) 1 2π ------Hgpk ( )Vgqk ( )= Hgpk ( ) 1 σgh -------e 1 2 --- p k σ gh -------- 2 – =
Resultados experimentales 138 FIGURA 6.18. Kernel descrito como diferencia de gausianas para extracción de bordes verticales. FIGURA 6.19. Resultado de calcular una convolución experimentalmente con un kernel para extracción de bordes verticales.
139 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos (EQ 6.3) siendo y los parámetros de anchura horizontal y vertical de los lóbulos de la gaussiana. La imagen se codificó a eventos AER asociando un nivel de frecuencia de eventos a cada nivel de gris, obteniendo una máxima frecuencia de 660Hz. Las frecuencias asociadas a cada nivel de intensidad se indican en las barras verticales a la derecha de cada imagen en la Fig. 6.19. La computación matemática de la operación de convolución se llevó a cabo con MATLAB, obteniendo la imagen de la Fig. 6.19.(b). En la Fig. 6.19.(c) se muestra la salida del chip de convolución, mapeando la frecuencia de salida de los eventos de cada píxel con su signo a un nivel de gris. Una frecuencia negativa indica que el bit de signo de los eventos de salida de ese píxel es negativo. En la Fig. 6.19.(d) se representa la imagen error calculada como la diferencia entre la salida ideal y la medida. Aunque el tamaño de este chip es de sólo píxeles, el espacio de direcciones de entrada que puede ver es de . Esto nos permite construir un array bidimensional de chips de convoluciones para procesar arrays de tamaños múltiplos de [78], [95], [72]. Para cada chip de convolución se programan sus parámetros para indicar la posición de cada array de dentro del total de . Utilizando placas splitter y merger [48], es posible construir un array de chips de convolución para procesar imágenes de píxeles. Para procesar imágenes aún mayores es necesario usar también bloques mapper AER [48], para mapear convenientemente el espacio de direcciones de entrada a los píxeles que cada chip puede ver. En la Fig. 6.20 se muestra el resultado de procesar una imagen de píxeles. La imagen original (Fig. 6.20.(a)) se divide en subimágenes más pequeñas, de píxeles cada una. De este modo, cada subimagen se transforma en una secuencia de eventos AER, procesada por el chip de convolución con el kernel de la Fig. 6.18 y los eventos de Vgqk ( ) 1 σgv ------- e 1 2 --- q k σ gv -------- 1 2 --- + 2 –e 1 2 --- q k σ gv -------- 1 2 --- – 2 – –= σgh σgv 32 32× 128 128× 32 32× imin jmin ,( ) imax jmax ,( ), 32 32× 128 128× 4 4× 128 128× 128 128× 256 256× 8 8× 32 32×
Resultados experimentales 140 salida se guardan. A continuación, a partir de las 64 secuencias de eventos AER grabadas se reconstruyen 64 subimágenes, y se remapean para construir la imagen de salida de píxeles que se muestra en la Fig. 6.20.(c). Si efectuamos la convolución de forma matemática mediante MATLAB, el resultado obtenido se muestra en la Fig. 6.20.(b), mientras que la imagen error que representa la diferencia entre las frecuencias ideales y las medidas se muestra en la Fig. 6.20.(d). 6.4.3. Convolución de estímulos en movimiento Aunque los experimentos mostrados anteriormente corresponden a imágenes estáticas, el objetivo de este chip es calcular convoluciones en tiempo real de estímulos dinámicos generados por una retina AER. Para ilustrar esto, se ha capturado una secuencia de eventos con una retina AER FIGURA 6.20. Resultado de calcular una convolución experimentalmente con un kernel para extracción de bordes verticales a una imagen de entrada de píxeles. 256 256× 256 256×
141 Microchips convol. AER para proc. asíncr. neocortical de inf. sensorial visual codificada en eventos de contraste temporal de [18], la cual muestra los contornos de dos personas caminando. Una captura de 40ms de esta secuencia se puede ver en la Fig. 6.21.(a), la cual representa 1810 eventos de la retina. Ya que el espacio de direcciones de la retina es de , esto requiere un array de chips de convolución. Programando el kernel de Gabor de tamaño de la Fig. 6.21.(b) para detección de bordes verticales, obtenemos la correspondiente secuencia de eventos de salida. Una captura de esta secuencia de salida para los mismos 40ms de la entrada se muestra en la Fig. 6.21.(d). Ya que la latencia entre los eventos de entrada y salida está en torno a los 150ns, se puede considerar que ambas secuencias de eventos son simultáneas. 128 128× FIGURA 6.21. Resultados experimentales obtenidos procesando una secuencia de 128x128 con un kernel de Gabor para extracción de bordes verticales. 128 128× 4 4× 11 7×