Ejemplo de Paper PDF

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 12

1

Diseño e implementación de un sistema de


adquisición, compresión y almacenamiento de
imágenes empleando VHDL y FPGAs
Pablo X. Jiménez e Iván M. Bernal

 muy alto de sofisticación, pudiendo tener FPGAs de alto


Resumen—Los FPGAs actuales han sufrido cambios drásticos rendimiento, con sistemas de millones de compuertas y
desde su aparición a mediados de la década de los ochentas, de bloques embebidos de microprocesadores, DSPs, e interfaces
simples sistemas de lógica de acoplamiento a verdaderos sistemas de entrada/salida de muy alta velocidad (pudiendo sobrepasar
en chip (SoC), con sistemas de millones de compuertas, capaces
de albergar bloques lógicos que pueden implementar casi
los 5 Gbps) [2], ampliando los campos de aplicación de estos
cualquier función lógica, así como bloques embebidos de dispositivos, como por ejemplo en sistemas de
microprocesadores, DSPs, e interfaces de entrada/salida de muy comunicaciones, procesamiento de imágenes y video, redes
alta velocidad, haciendo que estos dispositivos sean aptos para neuronales artificiales, procesamiento digital de señales, por
casi cualquier aplicación. mencionar unos pocos.
Un FPGA es un dispositivo lógico programable compuesto
El presente trabajo pretende demostrar el potencial que por un conjunto de bloques lógicos comunicados a través de
poseen los FPGAs actuales y el lenguaje de descripción de
conexiones programables, en el cual se puede implementar
hardware VHDL, para sintetizar a nivel de hardware algoritmos
complejos, como lo es el esquema de codificación Baseline del tanto circuitos combinacionales como secuenciales. En un
estándar JPEG para la compresión de imágenes, mediante el uso concepto más coloquial se puede definir a un FPGA como un
de los estilos descriptivos que posee el lenguaje VHDL. Para ello circuito integrado en blanco o virgen, en cuyo interior se
se utiliza el módulo de desarrollo Spartan-3A Starter Kit Board, encuentran elementos que permitirán implementar un circuito
que posee un FPGA XC3S700A de la Familia Spartan-3A de integrado personalizado que realice una función dedicada.
Xilinx y la herramienta de desarrollo ISE Foundation 10.1. El
En su arquitectura más básica, un FPGA consta al menos de
sistema diseñado admite los datos de una imagen monocromática
de 160x120 pixeles sin comprimir, y devuelve los datos de la tres bloques funcionales: Bloques Lógicos Configurables,
imagen comprimida con el formato de archivo JFIF para Bloques de Entrada/Salida y una Matriz de Interconexiones
imágenes. Además se emplea una interfaz gráfica de usuaria, Programables (bloques de interconexión y líneas de
desarrollada con el entorno de programación gráfica GUIDE de interconexión). La Figura 1 indica la arquitectura básica de un
Matlab, para la interacción con el sistema diseñado y la FPGA.
visualización de resultados.

Términos para indexación—Esquema de codificación Baseline,


Estilos descriptivos, FPGA, GUIDE, JPEG, VHDL.

I. INTRODUCCIÓN A LOS FPGAS

L OS FPGAs hacen su aparición a mediados de la década


de los ochentas como sencillos sistemas digitales de
lógica de acoplamiento (glue logic), los cuales tenían un
limitado número de recursos lógicos y su función primordial
era interconectar grandes bloques lógicos o dispositivos [1].
En la actualidad, estos dispositivos han llegado a un grado

Documento recibido el 4 de Noviembre de 2010. Este proyecto se realizó


en la Escuela Politécnica Nacional (EPN), en el Departamento de Electrónica,
Telecomunicaciones y Redes de Información.
P. X. Jiménez participó en el proyecto por la Escuela Politécnica Nacional Fig. 1. Arquitectura básica de un FPGA
(e-mail: pablo_pxje85@hotmail.com).
I. M. Bernal trabaja en la Escuela Politécnica Nacional en el Departamento
de Electrónica, Telecomunicaciones y Redes de Información, Ladrón de Los bloques lógicos configurables (CLB, por sus siglas en
Guevara E11-253, Quito-Ecuador (teléfono: 5932-2507-144; fax: 5932-2547- inglés) están constituidos por Look-Up Tables (LUTs), por
175; e-mail: imbernal@mailfie.epn.edu.ec)
2

multiplexores y por elementos de almacenamiento tipo flip-


flops que permiten sincronizar la salida del CLB con una señal
de reloj. Los LUTs son componentes de memoria RAM donde
se almacena una tabla de verdad que define una función
booleana y cuyas entradas de dirección son las variables de
entrada de dicha función.
Los bloques de Entrada/Salida definen la interfaz del FPGA
con el exterior, permitiendo el paso de señales hacia adentro y
hacia afuera del dispositivo. Los bloques de entrada/salida
constan de al menos tres elementos básicos: buffers de tres-
estados, resistencias pull-down/pull-up y registros de entrada y
salida.
Los FPGAs poseen una matriz de conexiones programables,
la cual une los bloques funcionales a través de canales de
Referencia [3]
líneas de conexión distribuidos de forma vertical y horizontal.
Fig. 2. Arquitectura de un FPGA de la Familia Spartan-3A de
Las nuevas generaciones de dispositivos FPGAs presentan, Xilinx
además de los bloques tradicionales expuestos anteriormente,
bloques embebidos que realizan una función específica. Entre La familia de FPGAs Spartan-3A de Xilinx, posee tres tipos
los bloques embebidos más comunes, se pueden mencionar: de bloques embebidos:
RAM embebida, Multiplicadores, Bloques DSPs, Bloques de RAM embebida. Estos bloques se encuentran
Administradores de Reloj (Digital Clock Managers – DCM), distribuidos en columnas en medio del arreglo de CLBs, y
Microprocesadores Embebidos y Transceivers de alta físicamente son memorias dual-port de 18Kbits de capacidad
Velocidad. y su relación de aspecto puede ser variable.
Para el caso particular de los FPGAs de la Familia Spartan-
Multiplicadores embebidos. Estos bloques son encargados
3A de Xilinx, la arquitectura de estos dispositivos está
de generar el producto de dos números binarios de 18 bits en
constituida por 6 bloques funcionales, a saber:
complemento a 2, en un ciclo de reloj.
1. Bloques Lógicos Configurables (CLBs)
Administradores Digitales del Reloj (DCMs). Mediante
2. Bloques de entrada/salida (IOBs)
estos bloques se puede sintetizar nuevas señales de reloj con
3. Bloques de RAM embebida
diferentes frecuencias, así como variar la fase de la señal de
4. Multiplicadores embebidos
reloj de entrada en pasos fijos y variables.
5. Administrador Digital del Reloj (Digital Clock
La Matriz de Interconexión de los FPGAs de la Familia
Manager – DCM)
Spartan-3A, posee cuatro tipos de líneas de interconexión que
6. Matriz de Interconexión
dan la flexibilidad necesaria para la interconexión de todos los
En la Fig. 2 se puede observar la arquitectura de los FPGAs
bloques funcionales de la arquitectura, en términos de
de la Familia Spartan-3A.
distancia entre bloques y en función de la frecuencia de la
Los CLBs de los FPGAs de la Familia Spartan-3A, están
señal transmitida.
constituidos por cuatros slices, y cada slice está constituido
En la Tabla 1 se resumen los recursos lógicos que posee el
por dos LUTs, dos flip-flop tipo D y recursos lógicos
FPGA XC3S700A de la Familia Spartan-3A de Xilinx
dedicados (compuertas, multiplexores e interconexiones) para
optimizar la implementación de operaciones aritméticas. En TABLA 1
un CLB, cuatro de los ocho LUTs disponibles en los cuatro RECURSOS LÓGICOS DEL FPGA XC3S700A
slices pueden implementar funciones de memoria RAM
Recurso lógico Capacidad
distribuida. Los bloques de entrada/salida de los FPGAs de
esta familia, pueden soportar lógicas de diferentes estándares Sistema de Compuertas 700K
Bloques Lógicos Configurables 1472
eléctricos, así como también, soportar transmisión de doble Slices 5888
tasa de datos (DDR). Celdas Lógicas 13248
RAM distribuida 92Kb
RAM embebida 360Kb
Multiplicadores 20
DCMs 8
Bloques I/O 372

II. EL LENGUAJES VHDL Y SUS ESTILOS


DESCRIPTIVOS
Para proporcionar una noción de
3

Dependiendo del nivel de abstracción utilizado en la Una arquitectura tiene dos partes: una parte declarativa,
descripción de un sistema digital, VHDL tiene tres estilos de donde señales, componentes y constantes (entre otros) son
descripción los cuales se muestran en la Tabla 2. declarados y la parte de código propiamente dicha (desde
begin hacia abajo). Al igual que en el caso de una entidad, el
TABLA 2 nombre de la arquitectura puede ser cualquier palabra, excepto
NIVELES DE ABSTRACCIÓN Y ESTILOS DESCRIPTIVOS EN VHDL
las palabras reservadas del VHDL.
Nivel de abstracción Estilo descriptivo Además de dar un nombre a la arquitectura, debe indicarse
el nombre de la entidad a la que pertenece.
Funcional o comportamental Algorítmico
Transferencia de registros Flujo de datos VHDL proporciona varios tipos de operadores
Lógico o de compuertas Estructural predefinidos:
 Operadores de asignación
<= usado para asignar un valor a una señal.
:= usado para asignar un valor a una variable,
Algorítmico: Refleja el comportamiento del sistema
constante o genérico, también es usado para asignar
mediante procesos concurrentes que contienen sentencias
valores iniciales.
secuenciales [4].
=> usado para asignar valores a elementos
Flujo de datos: La descripción se basa en un conjunto de
individuales de un vector o con OTHERS.
ecuaciones concurrentes, existe una correspondencia directa
entre el código y el hardware.  Operadores Lógicos (NOT, AND, OR, NAND, NOR,
Estructural: La descripción se basa en conexiones de XOR, XNOR)
componentes.  Operadores Aritméticos (+, -, *, /, **)
Una descripción en VHDL está formada por tres secciones  Operadores de Comparación (=, /=, <, >, <=, >=)
fundamentales: declaración de librerías, entidad y  Operadores de Desplazamiento (sll, srl)
arquitectura.  Operador de Concatenación (&)
Una librería es una colección de piezas de código usadas En el estilo de descripción algorítmico, el lenguaje VHDL
frecuentemente. Los códigos son usualmente escritos en forma puede tener dos tipos de código: código concurrente y código
de funciones, procedimientos o componentes, los cuales son secuencial.
puestos dentro de un paquete (package) y son compilados en El código concurrente es un conjunto de instrucciones que
una librería de destino [5]. se ejecutan de forma concurrente (paralela). El código
La entidad define la interfaz del sistema electrónico con su concurrente tiene tres instrucciones: WHEN, GENERATE y
entorno. Especifica los pines (puertos) de entradas y salida de BLOCK.
un circuito. Su sintaxis es la siguiente: Instrucción WHEN. Se presenta en dos formas:
WHEN/ELSE y WITH/SELECT/WHEN. Su sintaxis es la
siguiente:

Donde:
signal_mode: Define la dirección de los pines del circuito
definido por la entidad y pueden ser: IN (entrada), OUT
(salida), INOUT (bidireccional), BUFFER (utilizado cuando
la señal de salida debe ser utilizada internamente). Instrucción GENERATE. Permite a una sección de
signal_type: Puede ser BIT, STD_LOGIC, INTEGER, etc. código repetirse un número de veces específico. Su sintaxis es
El nombre de la entidad puede ser cualquier palabra la siguiente:
excepto las palabras reservadas del VHDL.
La arquitectura es la descripción de cómo el circuito o
sistema debe comportarse. “Describe un conjunto de
operaciones sobre las entradas de la entidad, que determinan
el valor de la salida en cada momento” [4]. Su sintaxis es la
siguiente: Instrucción BLOCK. Esta instrucción sirve como una
simple forma de dividir localmente el código. Su sintaxis es la
siguiente:
4

Instrucción WAIT ON. Acepta múltiples señales. El


proceso es puesto en espera hasta que cualquiera de las
señales cambie.
Instrucción WAIT FOR. Esta instrucción es pensada solo
para simulación (por ejemplo generación de formas de onda
El código secuencial consiste de secciones de código que se en testbenches).
ejecutan de manera secuencial, estas secciones se encuentran Instrucción CASE. Esta instrucción es muy similar a la
dentro de procesos (PROCESS), procedimientos instrucción concurrente WHEN. Todas las permutaciones
(PROCEDURE) y funciones (FUNCTION). Las instrucciones deben ser probadas, esto se logra con la palabra clave
que pueden encontrarse dentro de un proceso (PROCESS), OTHERS. Otra palabra clave importante es NULL, utilizada
procedimiento (PROCEDURE) o función (FUNCTION) son: cuando ninguna acción se debe tomar. La instrucción CASE
IF, WAIT, CASE y LOOP. permite múltiples asignaciones por cada condición probada, al
La principal sección de código secuencial, son los procesos. contrario de su contraparte concurrente (WHEN) que solo
Un proceso es una sección secuencial de código VHDL, se admite una. Su sintaxis es la siguiente:
caracteriza por la presencia de instrucciones IF, WAIT,
CASE, o LOOP, y una lista de sensibilidad. Un proceso es
ejecutado cada vez que una señal en la lista de sensibilidad
cambie. Su sintaxis es la siguiente:

Instrucción LOOP. Esta instrucción es útil cuando se


necesita repetir una pieza de código varias veces. Al igual que
IF, WAIT, y CASE, LOOP es utilizado solo para código
secuencial. Hay varias maneras de utilizar LOOP como se
Señales y variables. VHDL tiene dos maneras de muestra en la siguiente sintaxis:
“transportar” valores no estáticos: mediante señales y
mediante variables. Una señal puede ser declarada en un FOR/LOOP. El lazo es repetido un número de veces fijo.
paquete, una entidad o una arquitectura, mientras una variable
solo puede ser declarada dentro de una sección de código
secuencial (por ejemplo un proceso). El valor de una señal
puede ser utilizado en todo el diseño (es global), al contrario
de una variable que es local. El valor de una variable nunca
puede ser pasado fuera de un proceso directamente, es WHILE/LOOP. El lazo se repite hasta cumplir una
necesario primero asignarlo a una señal antes de salir del condición.
proceso.

Instrucción IF. Su sintaxis es la siguiente:


EXIT. Usado para terminar el lazo.

NEXT. Usado para saltar pasos en el lazo.


Instrucción WAIT. Cuando WAIT es utilizado el proceso
no puede tener una lista de sensibilidad. Existen tres formas
de la instrucción WAIT:
Una característica importante que posee el lenguaje de
descripción de hardware VHDL, es que en una descripción
pueden convivir los tres estilos descriptivos antes
mencionados. Las secciones del sistema de adquisición,
compresión y almacenamiento de imágenes, realizadas en
Instrucción WAIT UNTIL. Acepta solo una señal, por lo VHDL, convergen en una entidad de más alto nivel, como
que es apropiado para código sincrónico y asincrónico. Ya componentes de la misma, haciendo que la descripción de esta
que el proceso no puede tener una lista de sensibilidad la entidad sea netamente estructural. El resto de componentes de
instrucción WAIT UNTIL debe ser la primera dentro del la entidad de más alto nivel, son en su mayoría descritos
proceso. El proceso será ejecutado cada vez que la condición combinando los estilos descriptivos algorítmico y estructural.
sea verdadera.
5

III. SISTEMA DE ADQUISICIÓN, COMPRESIÓN Y JPEG y se disponen los datos comprimidos para que cumplan
ALMACENAMIENTO DE IMÁGENES con el formato de intercambio de archivos JFIF. Este módulo
El diagrama de bloques del sistema de adquisición, es implementado completamente sobre el FPGA Spartan-3A
compresión y almacenamiento de imágenes se muestra en la XC3S700A.
Figura 3. Algunas funciones en los módulos que se presentan Módulo de Transferencia y Almacenamiento de archivos.
en la Figura 3, son desarrolladas como rutinas dentro de un Consta de una sección de hardware y una sección de software.
programa en lenguaje Matlab. Esto se ha realizado con el fin Este módulo se encarga de transmitir los datos del archivo de
de solventar algunas limitaciones, en lo que respecta a imagen JPEG desde el módulo de desarrollo Spartan 3A
capacidad de recursos lógicos, que se encontrarían si dichas Starter Kit hacia el computador que ejecuta la aplicación de
funciones fueran realizadas en hardware, así como la Interfaz Gráfica de Control, para posteriormente, mediante
realización de funciones que no pueden hacerse netamente ésta, recibir los bytes formateados en JFIF y dar la extensión
sobre hardware (como la dotación de extensiones a archivos) .jpg para que el sistema operativo de la máquina reconozca el
archivo de imagen.
Módulo de Control. Este módulo se encarga de habilitar las
secciones de hardware del sistema, como también de controlar
el flujo de datos entre éstas.
Interfaz Gráfica de Control. Este módulo es desarrollado
mediante el entorno de programación visual GUIDE
disponible en el paquete computacional Matlab. Con esta
interfaz el usuario interactúa con el sistema para poder
controlar las funciones de adquisición, compresión y
almacenamiento, así como la visualización de resultados.

A. Módulo de Adquisición
El modulo de adquisición, se obtienen las imágenes sin
compresión de dos maneras: desde un archivo de imagen
mediante la instrucción imread de Matlab o capturando una
trama de imagen a través de una webcam mediante la
instrucción getsnapshot de Matlab. En ambas opciones la
imagen original es convertida a escala de grises (componente
de luminancia) y redimensionada a 160x120 pixeles; esto se
logra con las instrucciones rgb2gray e imresize de Matlab.
Los datos de la imagen redimensionada y convertida a escala
de grises, son divididos en bloques de 8x8 pixeles, mediante
un arreglo de lazos for anidados. La imagen dividida en
bloques de 8x8 pixeles, es enviada a través del puerto serial al
módulo de desarrollo Spartan-3A Starter Kit. En el módulo de
desarrollo, los datos son recibidos por un sistema de recepción
UART, y después almacenados en una memoria RAM de
19200 bytes (160x120 bytes) de capacidad. Mientras los datos
son almacenados en la memoria RAM, el módulo de control
monitorea el puerto de dirección de escritura de la memoria
Fig. 3. Arquitectura de un FPGA de la Familia Spartan-3A de RAM, para determinar el momento en que se tienen todos los
Xilinx datos de la imagen sin comprimir almacenados en la memoria.

El sistema de adquisición, compresión y almacenamiento de B. Módulo de Compresión


imágenes consta de cinco módulos: El modulo de compresión sintetiza a nivel de hardware el
Módulo de Adquisición. Consta de una sección de hardware esquema de codificación Baseline del estándar JPEG mostrado
y una sección de software. Este módulo envía los datos de una en la Figura 4.
imagen monocromática sin comprimir, previamente adquirida
mediante funciones de Matlab, hacia el módulo de desarrollo
Spartan 3A Starter Kit, donde son procesados para obtener los
datos comprimidos de la imagen.
Módulo de Compresión. En este módulo se sintetiza a nivel
de hardware el esquema de codificación Baseline del estándar
6

Y0 k  0.3536Z 0 k  Z 1k  Z 2 k  Z 3k  Z 4 k  Z 5 k  Z 6 k  Z 7 k 
Y1k  0.4904Z 0 k  Z 7 k   0.4157Z 1k  Z 6 k   0.2778Z 2 k  Z 5k   0.0975Z 3k  Z 4 k 
Y2 k  0.4619Z 0 k  Z 7 k   0.1913Z 1k  Z 6 k   0.1913Z 2 k  Z 5k   0.4619Z 3k  Z 4 k 
Y3k  0.4157Z 0 k  Z 7 k   0.0975Z 1k  Z 6 k   0.4904Z 2 k  Z 5 k   0.2778Z 3k  Z 4 k 
Y4 k  0.3536Z 0 k  Z 7 k   0.3536Z 1k  Z 6 k   0.3536Z 2 k  Z 5 k   0.3536Z 3k  Z 4 k 
Y5k  0.2778Z 0 k  Z 7 k   0.4904Z 1k  Z 6 k   0.0975Z 2 k  Z 5 k   0.4157Z 3k  Z 4 k 
Y6 k  0.1913Z 0 k  Z 7 k   0.4619Z 1k  Z 6 k   0.4619Z 2 k  Z 5 k   0.1913Z 3k  Z 4 k 
Y7 k  0.0975Z 0 k  Z 7 k   0.2778Z 1k  Z 6 k   0.4157Z 2 k  Z 5k   0.4904Z 3k  Z 4 k 

Referencia [6]
Fig. 4. Diagrama de Bloques del esquema de codificación Baseline del Mediante los dos conjuntos de expresiones indicados
estándar JPEG anteriormente, se puede deducir los sistemas digitales que
implementarán las dos transformadas discretas del coseno
Los bloques de 8x8 pixeles, almacenados en la memoria
unidimensionales. La Figura 5 muestra el diagrama de bloques
RAM del módulo de adquisición, son recuperados fila por fila.
del sistema digital, para implementar la primera transformada
Los elementos de cada fila son almacenados en 8 registros
discreta del coseno unidimensional, aplicada a las filas del
substrayendo previamente 128 a su valor, para desplazar el
bloque de 8x8 pixeles.
coeficiente DC al mismo rango de variación de los
coeficientes AC (-1023 a +1023) generados en la DCT-2D
[7].
El algoritmo utilizado para implementar la transformada
discreta del coseno en dos dimensiones, se basa en la
transformada discreta coseno unidimensional y consiste en
aplicar la transformada unidimensional a las filas del bloque
de la imagen y, posteriormente, sobre el resultado obtenido,
volver a aplicar la transformada unidimensional a las
columnas. Este algoritmo puede representarse de forma
matricial como se indica a continuación:
Y  CXC T
Donde X representa el bloque de 8x8 pixeles, Y los
coeficientes DCT-2D, y C está dada por

0.3536 0.3536 0.3536 0.3536 0.3536 0.3536 0.3536 0.3536 


0.4904 0.4157 0.2778 0.0975  0.0975  0.2778  0.4157  0.4904
 Referencia [8]
0.4619 0.1913  0.1913  0.4619  0.4619  0.1913 0.1913 0.4619 
  Fig. 5. Diagrama de bloques de la implementación de la primera DCT-1D
0.4157  0.0975  0.4904  0.2778 0.2778 0.4904 0.0975  0.4157 
C
0.3536  0.3536  0.3536 0.3536 0.3536  0.3536  0.3536 0.3536 
 
0.2778  0.4904 0.0975 0.4157  0.4157  0.0975 0.4904  0.2778 La Figura 6 muestra el diagrama de bloques del sistema
 0.1913  0.4619 0.4619  0.1913  0.1913 0.4619  0.4619 0.1913 
  digital, para implementar la segunda transformada discreta del
0.0975  0.2778 0.4157  0.4904 0.4904  0.4157 0.2778  0.0975
coseno unidimensional, aplicada a las columnas de la matriz
Z.
Si Z = XCt, mediante agrupaciones de términos se puede
llegar a obtener las expresiones para los elementos de
cualquier fila de la matriz Z, como se indica a continuación:

Z k 0  0.3536 X k 0  X k1  X k 2  X k 3  X k 4  X k 5  X k 6  X k 7 
Z k1  0.4904 X k 0  X k 7   0.4157 X k1  X k 6   0.2778 X k 2  X k 5   0.0975 X k 3  X k 4 
Z k 2  0.4619 X k 0  X k 7   0.1913 X k1  X k 6   0.1913 X k 2  X k 5   0.4619 X k 3  X k 4 
Z k 3  0.4157 X k 0  X k 7   0.0975 X k1  X k 6   0.4904 X k 2  X k 5   0.2778 X k 3  X k 4 
Z k 4  0.3536 X k 0  X k 7   0.3536 X k1  X k 6   0.3536 X k 2  X k 5   0.3536 X k 3  X k 4 
Z k 5  0.2778 X k 0  X k 7   0.4904 X k1  X k 6   0.0975 X k 2  X k 5   0.4157 X k 3  X k 4 
Z k 6  0.1913 X k 0  X k 7   0.4619 X k1  X k 6   0.4619 X k 2  X k 5   0.1913 X k 3  X k 4 
Z k 7  0.0975 X k 0  X k 7   0.2778 X k1  X k 6   0.4157 X k 2  X k 5   0.4904 X k 3  X k 4 

La matriz Z representa la transformada discreta del coseno


unidimensional aplicada a las filas del bloque de 8x8 pixeles.
Mediante un procedimiento de agrupaciones parecido al
anterior, se puede obtener los elementos de cualquier columna
de la matriz Y= C.Z, que representa los coeficientes DCT-2D,
como se indica a continuación:
7

memoria ROM, que almacena las tablas de cuantización de la


componente de luminancia, y un divisor para obtener los
coeficientes DCT-2D cuantizados. La memoria ROM alberga
cuatro tablas de cuantización para factores de calidad de
imagen de 25, 35, 50 y 75; el esquema de direccionamiento
utilizado para adquirir los elementos de una tabla de
cuantización consta de dos bits (los más significativos) para la
selección de la tabla y seis bits para apuntar al elemento
dentro de la tabla. Mediante dos switches de deslizamiento del
módulo de desarrollo Spartan-3A Starter Kit, el usuario del
sistema puede seleccionar la tabla de cuantización utilizada y
por ende la calidad de la imagen comprimida. Los seis bits
restantes de la dirección de memoria, son generados por un
contador módulo 64, que se activa con la bandera que indica
la validez de los coeficientes DCT-2D. En la Figura 8 se
Referencia [8] ilustra un diagrama de bloques de la implementación del
Fig. 6. Diagrama de bloques de la implementación de la segunda DCT-1D bloque de cuantización.

Como se observa en la Figura 5 y en la Figura 6, en ambos


casos, la implementación de las transformadas discretas del
coseno unidimensionales, utilizan el mismo conjunto de
constantes provenientes de la matriz C. Esta característica
permite obtener un sistema de control que asigna los valores
de las constantes dependiendo del número de fila (o columna)
que se esté procesando, por ejemplo con un contador módulo
8, que en cada cuenta, asigna un conjunto de constantes
específico. También es posible obtener un sistema de control Fig. 8. Diagrama de bloques simplificado de la implementación del
que indique que operación aritmética debe aplicarse a los bloque de cuantización
pares de elementos de cada fila (o columna), por ejemplo una
señal basculante que con un 1L indique que se debe sumar los El divisor, que se encarga de la cuantización propiamente
pares de elementos, y con un 0L se deban restar los mismos. dicha, divide el coeficiente DCT-2D, generado en el bloque
Para poder implementar el sistema completo que realiza la previo, para su correspondiente elemento de la tabla de
transformada discreta del coseno en dos dimensiones, se cuantización y es implementado mediante un IP Core1. El IP
requiere de una memoria RAM de transposición, en la cual los Core generado, es capaz de realizar una división en cada ciclo
resultados de la primera DCT-1D, se almacenan fila por fila, y de reloj, con una latencia inicial de 25 ciclos de reloj. Después
la lectura de los mismos se realiza columna por columna. De de la latencia inicial, una bandera indica el momento en que
esta manera se puede resumir la implementación de la DCT- los datos a la salida de la entidad de cuantización son válidos.
2D en el diagrama de bloques que se indica en la Figura 7. Esa misma bandera se encarga de desactivar la señal de reset
del bloque de exploración en zig-zag.
El bloque de exploración en zig-zag consiste de una
memoria ROM que almacena el orden de exploración de los
coeficientes cuantizados, mostrado en la Figura 9, y una
memoria RAM de almacenamiento temporal. Cuando la señal
de reset de este bloque se desactiva, se inicia el generador de
Fig. 7. Diagrama de bloques simplificado de la implementación de la direcciones de la memoria ROM. Los datos de salida de esta
DCT-2D memoria, actúan como la dirección de almacenamiento de los
coeficientes cuantizados, en la memoria RAM de
El bloque de la DCT-2D se habilita cuando el módulo de
almacenamiento temporal.
control advierte que se han almacenado en la memoria del
módulo de adquisición los 19200 bytes de la imagen sin
comprimir. En la descripción VHDL de este bloque, se
incluye una bandera que indica el momento en que se
comienzan a obtener los coeficientes DCT-2D en el puerto de
salida de esta entidad. Esta misma bandera, sirve también para
1
desactivar la señal de reset del bloque de cuantización. IP Core: Bloques de propiedad intelectual, son un conjunto de funciones
lógicas predefinidas, optimizadas para las FPGAs de un fabricante
El bloque de cuantización consta de dos componentes: una determinado.
8

estándar JPEG. Estas tablas establecen la palabra código A y


su longitud en bits. Existen dos tablas de códigos para la
palabra A, una para la componente de luminancia y otra para
las componentes de crominancia (Cb y Cr).

TABLA 3
CATEGORÍAS PARA LOS COEFICIENTES AC
CATEGORÍA RANGO DE VALORES DE COEFICIENTES
1 -1, 1
2 -3 A -2, 2 A 3
3 -7 A -4, 4 A 7
4 -15 A -8, 8 A 15
5 -31 A -16, 16 A 31
6 -63 A -32, 32 A 63
7 -127 A -64, 64 A 127
Fig. 9. Orden en zig-zag para los coeficientes DCT-2D cuantizados 8 -255 A -128, 128 A 255
9 -511 A -256, 256 A 511
En la Figura 10 se muestra un diagrama de bloques 10 -1023 A -512, 512 A 1023
simplificado del bloque de exploración en zig-zag
implementado. Los datos del primer bloque de 64 coeficientes
cuantizados son almacenados, con la disposición en zig-zag, Para la palabra código A existen algunas consideraciones
en 66 ciclos de reloj. En la descripción VHDL de este bloque, especiales con respecto a la longitud de series de ceros que
se ha incluido una bandera que indica el momento en que los puede preceder a un coeficiente no nulo, con el objeto de
64 coeficientes cuantizados se encuentran almacenados con la optimizar los códigos de longitud variable utilizados para la
disposición en zig-zag. Esta bandera también sirve para codificación. En el estándar JPEG se establece que la longitud
desactivar la señal de reset del bloque de codificación de máxima antes de un coeficiente no nulo debe ser 15 ceros
Huffman. consecutivos. Cuando existe una cadena de 16 ceros se añade
una palabra código especial para indicar este hecho
denominada ZRL (zero-run-length); pueden concatenarse
varias de estas palabras hasta obtener una cadena de ceros
menor a 16 para poder codificar la palabra A mediante las
relaciones R/C que se especifican en el estándar.
Existe una palabra código A especial para indicar el fin de
un bloque de 8x8 o en su defecto que el resto de coeficientes
son ceros, y se denomina EOB (End of Block). En el caso
especial en que el último coeficiente (el coeficiente 64) no sea
Fig. 10. Diagrama de bloques simplificado del bloque de exploración en zig-
zag nulo, no se codifica la palabra código EOB sino la que
corresponda para ese coeficiente no nulo [9].
La palabra código B refleja directamente el valor del
Para la codificación de los coeficientes cuantizados se coeficiente cuantizado no nulo, se expresa en binario en
utiliza una variación de los códigos de Huffman, y se complemento a uno y su longitud está definida por la
codifican por separado los coeficientes AC y DC. categoría a la que pertenezca dicho coeficiente.
Para los coeficientes AC (sean de luminancia o La codificación de los coeficientes DC es algo parecido a la
crominancia) ordenados en zig-zag, cada coeficiente no nulo codificación en AC. De la misma manera se definen dos
se codifica mediante dos palabras de longitud variable, una palabras código de longitud variable denominadas A’ y B’. La
denominada A y la otra B. La palabra A está definida en codificación no se realiza directamente sobre el coeficiente
función de la categoría (C) a la que pertenezca el coeficiente y DC sino sobre un coeficiente diferencial que se define como
la longitud de series de ceros (R) que antecede a dicho la diferencia entre el coeficiente DC del bloque actual y el
coeficiente (relación R/C). La categoría del coeficiente se coeficiente DC del bloque precedente, el cual puede estar en
establece según el valor que posea éste, y para los coeficientes el rango de -2047 a 2047 y puede ser cero.
AC se establecen 10 categorías las cuales se muestran en la La definición de la palabra A’ se basa en la categoría a la
Tabla 3. La categoría define la cantidad de bits con los que se que pertenezca el coeficiente DC diferencial, la cual tiene el
puede representar el valor del coeficiente no nulo; debido a mismo significado que en el caso de los coeficientes AC. En
que los coeficientes AC, que se obtienen de la DCT-2D, están la Tabla 4 se presenta la definición de las categorías de los
en el rango de -1023 a 1023, se tiene que la máxima categoría coeficientes DC diferenciales. Establecida la categoría del
para los coeficientes AC es 10. coeficiente DC diferencial se puede consultar la palabra
Con la longitud de series de ceros y la categoría del código A’ que corresponda a dicha categoría en las tablas que
coeficiente establecidas, la palabra código A puede ser en el estándar se recomienda. Al igual que en el caso AC,
consultada en la tabla de códigos que se propone en el existen dos tablas de códigos, una para cada componente de
9

color, que indican la palabra código del coeficiente y su


longitud en bits.

TABLA 4
CATEGORÍAS PARA LOS COEFICIENTES DC DIFERENCIALES
CATEGORÍA RANGO DE VALORES DE COEFICIENTES
0 0
1 -1, 1 Fig. 11. Esquema de direccionamiento para la memoria ROM con las
2 -3 A -2, 2 A 3 tablas de Huffman
3 -7 A -4, 4 A 7
4 -15 A -8, 8 A 15 Si la longitud de series de ceros es igual o mayor a 16, se
5 -31 A -16, 16 A 31 produce la dirección de memoria correspondiente a la palabra
6 -63 A -32, 32 A 63 ZRL, al mismo tiempo se resta 16 de la longitud de series de
7 -127 A -64, 64 A 127
8 -255 A -128, 128 A 255
ceros, y se verifica nuevamente si ésta es menor a 16. Este
9 -511 A -256, 256 A 511 procedimiento se repite hasta obtener una longitud de series
10 -1023 A -512, 512 A 1023 de ceros menor a 16, y poder obtener la dirección de memoria
11 -2047 A -1024, 1024 A 2047
como se indicó en la Figura 11. Mediante la dirección de
memoria establecida como lo indica la Figura 11, se obtiene
Cuando se inicia la codificación de los coeficientes DC, se
de las memorias ROM, la palabra código A y la longitud en
considera que el coeficiente DC que precede al coeficiente DC
bits de la palabra código A para el coeficiente AC no nulo (o
del primer bloque de 8x8 de la imagen es cero.
el coeficiente DC diferencial). La palabra código B, se halla
La palabra B’ se obtiene de la misma forma que con los
directamente con el valor del coeficientes AC no nulo (o el
coeficientes AC, es decir es igual al complemento a uno del
coeficiente DC diferencial) expresado en complemento a 1 en
valor del coeficiente diferencial y su longitud es igual a la
caso de que éste sea negativo. La longitud en bits de la palabra
categoría a la que pertenezca dicho coeficiente.
código B es la categoría del coeficiente no nulo. Una bandera
Para implementar este esquema de codificación, se
indica cuándo se tienen palabras código válidas.
almacena en dos memorias ROM, las palabras código A para
la componente de luminancia definidas en el estándar JPEG y
la longitud en bits de cada palabra, tanto para los coeficientes
AC y DC. La discriminación del coeficiente DC se lleva a
cabo mediante una bandera. La bandera se activa cada vez que
un contador módulo 64 inicia su cuenta (el contador tiene un
valor de 1). Cuando se detecta que la bandera de un
coeficiente DC está activa, se realiza la resta del coeficiente
DC actual y el coeficiente DC previo (almacenado en un
registro especial). Esta diferencia pasa a una serie de
comparadores para definir su categoría según la Tabla 3. Para
los coeficientes AC, existen dos comparadores; en el primer
comparador se verifica si el coeficiente es nulo, en caso de
serlo, se incrementa un contador, que define la longitud de
series de ceros. Cuando el coeficiente no es nulo, un segundo
comparador verifica en qué rango de la Tabla 4 está el valor
no nulo, para definir la categoría del coeficiente AC. Cabe
mencionar que el contador de coeficientes nulos, se habilita
sólo cuando la bandera que indica un coeficiente DC no está
activada, de esta manera siempre se tendrá para los
coeficientes DC, una longitud de series de ceros igual a cero.
Los datos de la bandera de coeficiente DC, la categoría y la
longitud de series de ceros, ingresan a una máquina de
estados, donde se verifica que la longitud de series de ceros no
sobrepase los 15 ceros consecutivos. Si la longitud de series
de ceros es menor a 16, la máquina de estados produce una
dirección de memoria concatenando los datos de entrada como
se indica en la Figura 11.

Fig. 12. Diagrama de bloques de la implementación de la codificación


de la entropía de Huffman
10

Con el objeto de identificar el último coeficiente cuantizado de datos de la imagen comprimida almacenados en el FIFO
de la imagen, cuando la señal de reset del bloque de del módulo de compresión. Después habilita la trasmisión de
codificación de Huffman se desactiva, se inicia la cuenta en un dos bytes que señalan el fin del stream del archivo de imagen.
contador módulo 19200. Cuando el contador alcanza su valor
máximo, una bandera se activa para indicar que los datos
procesados (categoría y longitud de series de ceros) IV. RESULTADOS OBTENIDOS
corresponden al último coeficiente de la imagen. En la Figura Los resultados de la síntesis en términos de recursos
12 se ilustra un diagrama de bloques para la implementación utilizados, de las secciones hardware del sistema de
de la codificación de Huffman. adquisición, compresión y almacenamiento de imágenes,
La palabra código A y la palabra código B válidas, ingresan utilizando el FPGA XC3S700A de la Familia Spartan-3A de
a un bloque de generación de bytes, el cual agrupa los bits de Xilinx y el lenguaje de descripción de hardware VHDL, se
datos de las palabras código y genera los bytes de datos de la muestran en la Figura 13.
imagen comprimida. La generación de bytes depende de la
longitud de las palabras código A y B. Los bytes generados
son almacenados en un FIFO y después transmitidos hacia una
PC con el formato de archivo JFIF. Cuando en el bloque de
generación de bytes se detecta que la bandera del último
coeficiente de la imagen está activa, otra bandera se activa
para indicar que el byte generado corresponde al último byte
de datos. Esta bandera indica al módulo de control cuándo
puede comenzar a transmitir el stream del archivo de imagen
Fig. 13. Recursos lógicos utilizados en la implementación del sistema de
generado.
adquisición compresión y almacenamiento de imágenes
C. Módulo de Transferencia y Almacenamiento de archivos
Este modulo se encarga de transmitir el stream de bytes del Con el nivel de utilización del dispositivo mostrado en la
archivo generado a través de un transmisor UART. Lo Figura 13, la frecuencia máxima a la que puede operar el
primero que se transmite es la cabecera de archivo JFIF, que hardware del sistema es de 82.7 MHz.
se encuentra almacenada en una memoria ROM. La cabecera Los resultados de la compresión de imágenes se ilustran en
JFIF contiene campos de datos que ayudan en la la Tabla 5. El escenario de pruebas consistió en la adquisición
decodificación de la imagen comprimida. Después de de los datos de la imagen sin comprimir desde un archivo
transmitir la cabecera JFIF, se empieza con la transmisión de bmp. Como se esperaba la calidad de imagen mejora conforme
los bytes de datos de la imagen comprimida, almacenados en se selecciona una factor de calidad de imagen superior.
el FIFO del módulo de compresión. Al terminar de transmitir Mediante la herramienta de software JPEGsnoop, se pudo
los bytes de datos de la imagen comprimida, se transmite dos verificar los parámetros de compresión establecidos, y obtener
bytes que indican el fin del archivo de imagen. El programa de las tasas de compresión de las imágenes comprimidas. En la
la interfaz gráfica de control, recepta los bytes transmitidos Tabla 6, se indica la tasa de compresión para cada imagen
desde el módulo de desarrollo Spartan-3A Starter Kit y los mostrada en la Tabla 5.
almacena en un fichero con extensión jpg. Con esto el sistema
operativo del computador puede reconocer al stream de bytes
recibidos como un archivo de imagen. V. CONCLUSIONES
Se verificó en la práctica el potencial que poseen los
D. Módulo de Control FPGAs actuales, y en caso particular la arquitectura de los
FPGAs de la plataforma Spartan 3, cuyos componentes (CLBs
Este módulo se encarga de habilitar las secciones de
y bloques embebidos) han facilitado la descripción VHDL e
hardware del sistema, como también de controlar el flujo de
implementación de funciones de gran complejidad de
datos entre éstas. El módulo de control habilita el
cómputo, como es el caso de la Transformada Discreta del
almacenamiento de los datos de la imagen sin comprimir.
Coseno y la codificación de entropía de Huffman, ambos
Cuando el módulo de control detecta que se han recibido los
bloques de suma importancia en el esquema de codificación
19200 bytes de la imagen sin comprimir, habilita la lectura de
Baseline del estándar JPEG.
la memoria RAM de almacenamiento del módulo de
adquisición y desactiva la señal de reset del módulo de
compresión, los datos de la memoria RAM son transportados TABLA 5. RESULTADOS DE LA COMPRESIÓN DE IMÁGENES CON EL
ha2cia el módulo de compresión. El módulo de control SISTEMA
monitorea la bandera del último byte de datos del módulo de FACTOR
compresión, y cuando esta está activa, procede a habilitar la DE IMAGEN JPEG
CALIDAD
transmisión de la cabecera de archivo JFIF y después los bytes
11

posibles errores de implementación, debido a malas prácticas


de descripción, como por ejemplo la implementación de
latches, que producen errores de sincronismo en la
25 implementación final.
La descripción de máquinas de estados, se convirtió en el
procedimiento más favorable para implementar las funciones
más complejas de las secciones de hardware del sistema (en
términos de descripción), como la generación de bytes, el
módulo de control y la generación de dirección de las palabras
código en la codificación de Huffman; esto porque la
naturaleza de la máquina de estados permite la
35
implementación de sistemas cuyas tareas forman una
secuencia bien definida, como es el caso de los bloques antes
mencionados.
Los IP Cores que se encuentran disponibles en la
herramienta de desarrollo ISE Foundation 10.1, constituyen
un importante apoyo en el diseño de sistemas digitales en
FPGAs de Xilinx, ya que implementan funciones específicas,
50 optimizando recursos del FPGA y evitan al diseñador su
descripción, enfocándolo sólo a configurar parámetros en los
asistentes de los IP Cores, y a desarrollar aspectos más
relevantes del diseño, reduciendo el tiempo de diseño y
facilitando la verificación en el campo del sistema diseñado.

Se obtuvieron los resultados de las imágenes comprimidas


75 que se esperaban, visualizándose en el computador que aloja
la interfaz gráfica de control de usuario; se verificó el
cumplimiento de los parámetros de compresión, así como el
formato de archivo JFIF utilizado para generar los archivos de
imagen. Las imágenes obtenidas son legibles, sin embargo se
TABLA 5. TASAS DE COMPRESIÓN OBTENIDAS EN LAS PRUEBAS evidencian problemas de codificación en algunos bloques,
DEL SISTEMA presumiblemente debido a los errores de redondeo en los
Factor de
Tasa de compresión bloques de la DCT-2D y cuantización, así como por los
Calidad errores de aproximación de los coeficientes de transformación
25
utilizados para la implementación de la DCT-1D, que son
representados como números de 13 bits. Los errores de
codificación son más notorios debido a la resolución de la
35 imagen de prueba de 160x120, lo cual magnifica un error en
un bloque de 8x8 pixeles.
50
REFERENCIAS
[1] R. Woods, J. McAllister, G. Lightbod, Y. Yi. FPGA-based
75 Implementation of Signal Processing Systems. 1 ed.. Editorial John
Wiley & Sons Ltd, 2008.
[2] C. Maxfield. The Design Warrior’s Guide to FPGA. 1 ed.. Burlington:
Editorial Newnes, 2004.
Se ha puesto en evidencia la gran versatilidad del lenguaje [3] Xilinx, Inc. Spartan-3 Generation FPGA User Guide, Enero 2009,
de descripción de hardware VHDL, con respecto a sus estilos versión 1.5. Disponible en:
http://www.xilinx.com/support/documentation/user_guides/ug331.pdf.
descriptivos (algorítmico, flujo de datos y estructural), los [4] S. Olloz, E. Villar, Y. Torroja, L. Teres. VHDL Lenguaje estándar de
cuales pueden convivir en una misma descripción, facilitando diseño electrónico. Editorial McGraw-Hill, 1998.
el proceso de descripción y síntesis de algoritmos de gran [5] V. Pedroni. Circuit Design with VHDL. Editorial MIT Press, 2004.
[6] M. Ghanbari. Standard Codecs: Image Compression to Advanced Video
nivel de abstracción, como es el esquema de codificación Coding. 2 ed. Londres: The Institution of Electrical Engineers, 2003.
Baseline del estándar JPEG, implementado en este proyecto. [7] I. Bernal. Compresión de Imágenes con JPEG. Quito: Escuela
Es necesario conocer la arquitectura del FPGA utilizado en Politécnica Nacional, Septiembre 2004
[8] L. Pillai. Video Compression using DCT. Xilinx Application Note, 2002
un diseño, para poder, mediante código de descripción de Disponible en: http://www.cs.york.ac.uk/rts/docs/Xilinx-datasource-
hardware y desde la descripción del sistema diseñado, deducir 2003-q1/appnotes/xapp610.pdf.
en la síntesis, con simplicidad, los bloques funcionales y evitar
12

[9] W. Pennebaker, J. Mitchell. JPEG still image data compression


standard. 3 ed.. Editorial Van Nostrand Reinhold, 1993.

Pablo X. Jiménez, nació en Quito-Ecuador el 21 de


marzo de 1985. Realizó sus estudios secundarios en la
Unidad Educativa La Salle de Conocoto, donde
obtuvo el título de Bachiller en Ciencias
Experimentales. En el año 2003 Ingresó a la Escuela
Politécnica Nacional y en el año 2008 egresó de la
carrera de Ingeniería en Electrónica y
Telecomunicaciones.

Iván M. Bernal, graduado del Instituto Nacional


Mejía. Obtuvo el título de Ingeniero en Electrónica y
Telecomunicaciones en la Escuela Politécnica
Nacional en 1992. Obtuvo los títulos de M.Sc. (1997)
y Ph.D. (2002) en Computer Engineering en Syracuse
University, NY, USA. Ha realizado cursos
especializados en varios países europeos,
latinoamericanos, Estados Unidos y en Corea del Sur.
Actualmente trabaja en la EPN, en el Departamento
de Electrónica, Telecomunicaciones y Redes de
Información (DETRI).

También podría gustarte