Вы находитесь на странице: 1из 32

FACULTAD DE INGENIERIA

ELECTRÓNICA Y ELÉCTRICA

TEMA: IMPLEMENTACION DE UN FILTRO DIGITAL FIR EN FPGA

CURSO: PROCESAMIENTO DIGITAL DE SEÑALES

PROFESOR: ING. CARRILLO GOMERO, FLAVIO

HORARIO: MARTES 12:00H – 14:00H

INTEGRANTES: CRUZ MENDOZA, ISAC


VEGA SOTELO, KEVIN
MAYTA SALHUA, JORDY
I. OBJETIVOS:
 Conocer acerca del concepto de filtro digital en el Procesamiento Digital de
Señales.
 Conocer más acerca de las aplicaciones del lenguaje VHDL.
 L

II. CONCEPTOS PREVIOS

 FILTRO DIGITAL
Los filtros digitales operan sobre las señales que representan algún fenómeno de la
naturaleza, transformando sus muestras a través de un algoritmo, y convirtiéndolas
en nuevas secuencias numéricas cuyas características son distintas a las originales
(señal filtrada).

Existen diversas clasificaciones de los filtros. Básicamente, podemos distinguir


cuatro tipos:

 Pasa bajos
 Pasa altos
 Pasa banda
 Rechazo de banda.

El filtro pasa bajo, como su nombre lo indica, deja pasar las componentes más graves
del sonido, y retiene a las componentes agudas cuya frecuencia es superior a la
frecuencia de corte del filtro. Su versión más elemental se obtiene sumando a una
señal digital una copia de sí misma, retrasada en una muestra.
Este proceso se representa a través del siguiente diagrama.

La señal de entrada se representa como x(n) –se lee x de n- que es el modo de


referirnos a una forma de onda cualquiera, cuyos valores de amplitud para cada
muestra dependen del número de muestra considerado (n). Este tipo de notación
no dice nada sobre el contenido de la señal, pero nos permite nombrarla y
diferenciar, por ejemplo, una señal de otra. Siguiendo este criterio, denominamos
y(n) a la señal de salida filtrada, que es distinta a x(n).

En esta figura, la caja con la inscripción z-1 se denomina línea de retardo y representa
a un dispositivo capaz de retrasar en una muestra a la señal de entrada. Cuando
ingresa a la línea la primera muestra no sale nada (en realidad, sale un cero), cuando
ingresa la segunda sale la primera, y así sucesivamente. La cantidad de muestras que
se retrasa la señal se indica con el exponente negativo (-1 en el ejemplo), el cual
puede asumir cualquier valor (z-24 significa un retraso de 24 muestras).

Siguiendo el diagrama y resumiendo, ingresa al filtro una señal x(n) que se suma a
una versión retrasada en una muestra de sí misma, y da como resultado otra señal
filtrada y(n).

Lo mismo puede representarse en notación simbólica, de este modo:

y(n) = x(n) + x(n-1)

al valor de la muestra n de la función x se le suma el valor de la muestra n – 1 (la


anterior) de la misma función. Este sería el procedimiento a aplicar en un programa
de computación para lograr el filtro en cuestión.

 TEORIA DE FILTROS
La teoría de filtros tiene una componente matemática compleja que hace que se aleje de la
experiencia humana. En los textos técnicos, los filtros se describen mediante una
herramienta matemática denominada transformada z. La transformada z relaciona los
efectos de retardos de muestras en una imagen de dos dimensiones de la representación
frecuencial (H(f)) que se denomina el plano complejo z.
Los polos en dicho plano representan los picos de resonancia o puntos que hacen que la
respuesta frecuencial se haga infinita. Los ceros representan los puntos de amplitud nula de
la respuesta frecuencial. Por ejemplo, un filtro de 2 polos tiene 2 picos de resonancia.

La transformada z es un concepto esencial para el diseño de filtros, ya que proporciona una


relación matemática entre las características del filtro que queremos diseñar y los
parámetros de implementación del mismo.

 ECUACION EN DIFERENCIAS
Los filtros causales, lineales e invariantes pueden representarse en el dominio del
tiempo por su ecuación en diferencias. Esta ecuación es una fórmula que permite
calcular la salida de un filtro de acuerdo a las muestras presentes y pasadas de la
señal de entrada (parte no recursiva) y las muestras pasadas de la señal de salida
(parte recursiva).

Los valores de los vectores a y las b se denominan coeficientes del filtro. Podemos
escribir la ecuación anterior de modo más compacto, utilizando el símbolo de
sumatoria:

donde se reemplazan las i y las j por números consecutivos que van de 0 hasta M
para el primer término, y de 0 a N para el segundo.

A modo de ejemplo, si M = 2 y N = 2 la ecuación es:

y el diagrama que corresponde es el siguiente, donde se aprecia con más claridad


la recursión, en la parte derecha del gráfico:
Denominamos orden del filtro al número mayor de muestras de retardo que posee
su parte recursiva o su parte no recursiva (valor máximo entre M y N). En el ejemplo
anterior, tanto M como N valen 2, por lo cual se trata de un filtro de segundo orden
(el orden es 2).

Otro ejemplo, en la ecuación siguiente, M = 1 y N = 3, se trata entonces de un filtro


de tercer orden.

 FUNCIONAMIENTO DE UN FILTRO DIGITAL


El funcionamiento de base de un filtro digital es relativamente simple. Distinguimos
de hecho dos tipos de funcionamiento, que se ilustran en la figura siguiente:

Estas son las dos topologías base de los 2 tipos de filtros digitales.
En la figura: (a) Filtro digital FIR
(b) Filtro digital IIR
En donde:

(a) Retardamos ligeramente una copia de la señal de entrada (de uno o varios
períodos de muestreo) y combinamos la señal de entrada retrasada 5 con la
nueva señal de entrada. Los filtros digitales basados en este funcionamiento se
dice que son de respuesta impulsional finita o FIR (Finite Impulse Response).

(b) Retardamos una copia de la señal de salida, la cual combinamos con la nueva
señal de entrada. Los filtros digitales basados en este funcionamiento se dice
que son de respuesta impulsional infinita o IIR (Infinite Impulse Response).
También se les denomina filtros recursivos o con feedback.
III. FILTROS FIR
Los filtros digitales se usan frecuentemente para tratamiento digital de la imagen o para
tratamiento del sonido digital. FIR es un acrónimo en inglés para Finite Impulse Response
o Respuesta finita al impulso. Se trata de un tipo de filtros digitales en el que, como su
nombre indica, si la entrada es una señal impulso, la salida tendrá un número finito de
términos no nulos.

Para obtener la salida sólo se basan en entradas actuales y anteriores. Su expresión en


el dominio n es:

En la expresión anterior N es el orden del filtro, que también coincide con el número de
términos no nulos y con el número de coeficientes del filtro. Los coeficientes son bk.

La salida también puede expresarse como la convolución de la señal de entrada x(n)


con la respuesta impulsional h(n):

Aplicando la transformada Z a la expresión anterior:

Dependiendo del orden del filtro, la cantidad de etapas retardadoras, por lo que la
forma general de un filtro FIR se presentaría en la siguiente figura:

En donde:
T: Representan los retardos
h(0), h(1)… h(P-1) Representan los coeficientes del filtro
IV. DESARROLLO DEL FILTRO

1. Estructura de solución del problema y del código


Para la implementación en el FPGA del filtro FIR de orden 5 utilizamos el siguiente
modelo:

Cada bloque representa un retardador en el tiempo, la salida de estos se multiplica


por un coeficiente y posteriormente se suman para obtener la salida. La
implementación en lenguaje VHDL se hizo de la siguiente manera:
Primero definimos las librerías y la entidad:
El paquete std_logic_1164 de la librería ieee nos permite utilizar los valores
std_logic.

El paquete numeric_std nos permite realizar conversión std_logic_vector a integer y


viceversa asi como realizar operación entre estos, lo cual se utiliza para realizar las
operaciones entre los coeficientes y los valores de entrada.
La entidad representa las entradas y salidas físicas que tendremos, donde:

i_clk como reloj, i_rstb como reset que se activa en bajo para poner a 0 todas las
salidas y señales.
I_coeff_0, I_coeff_1, I_coeff_2, I_coeff_3, I_coeff_4 son los coeficientes del filtro de
8 bits de datos.
I_data es la entrada de datos de 8 bits.
O_data es la salida del filtro, tiene 18 bits para no perder información por
desbordamiento.

Segundo definimos la arquitectura, es decir el funcionamiento del filtro.

En esta parte definimos primero las señales que utilizaremos:


Definimos los tipos t_data_pipe, T_coeff, T_mult, T_Add_st0.
P_data es del tipo t_data_pipe, Que almacena los valores entrantes en un arreglo que
contiene datos de 8 bits.
R_coeff es del tipo T_coeff es un arreglo que almacenará los valores de los
coeficientes para poder multiplicarlos .
R_mult es del tipo T_mult es un arreglo que almacenara los productos de los
coeficientes por los valores entrantes.
R_add_st0 es del tipo T_Add_st0 es un arreglo que almacena las sumas paraciales.
R_add_st1 almacena la suma final de los valores de cada posición del arreglo
R_add_st0

Proceso p_input
Una vez definidas las señales a utilizar iniciamos en un process colocando en la lista
sensible clk y i_rstb por que estos afectan directamente a las señales que se cargaran.
Este procesos realiza la carga de datos de entrada y coeficientes.

En caso de activar i_rstb se limpia en cero todos los datos. De otra manera en cada
flanco de subida del reloj cargamos los datos. En la linea 45 cargamos p_data con el
valor de la entrada, de tal manera que con cada carga el dato se va dezplazando hacia
la derecha dentro del arreglo de 5 posiciones. Y Tambien se carga los coeficientes
asignados en el arreglo r_coeff.
Proceso p_mult
En el proceso p_mult de igual manera que el anterior se i_rstb para poner a 0 el
arreglo r_mult que almacenará las multiplicaciones de los datos entrantes por los
coeficientes.

Se utiliza la sentencia for loop, de tal manera que r_mult(k), donde k es el índice del
arreglo , sea la multiplicación del valor p_data(k) con el valor del coeficiente(k). Es
decir el coeficiente en la posición ‘0’ con el dato en la posición ‘0’, el coeficiente en la
posición ‘1’ con el dato en la posición ‘1’ y así hasta la posición 4.

Proceso p_add_st0
En este proceso se realiza la suma de los productos de coeficientes por datos
entrantes.

En la línea 73 la sentencia for loop realiza la suma de las posiciones 0 con 1 y 2 con 3,
y la almacena en la posición 0 y 1 de r_add_st0 respectivamente. Utilizamos la función
resize porque al sumar dos números en caso de alcanzar su máximo valor puede
ocurrir un desbordamiento, entonces agregamos un bit adicional. El producto tiene
16 bits entonces al sumar 1 se obtiene 17.

La posición 2 del arreglo r_add_st0 se mantiene con el valor de r_mult(4) para ser
sumado al total posteriormente.
Proceso p_add_st1
En este proceso sumamos los valores anteriores, que son las sumas de las
multiplicaciones, obtendremos la suma total y la almacenaremos en r_add_st1, de
igual manera se utiliza “resize” para fijar un nuevo tamaño a la salida para evitar
perdida de datos por desbordamiento.

Proceso p_output
Este proceso realiza la carga de la suma total en la salida, realizando una conversión
del valor a std_logic_vector de 18 bits. Y en la línea 99 finaliza con “end rt1” para
indicar el fin de la descripción de la arquitectura.

2. Proceso de implementación en el módulo FPGA CYCLONE IV E – EP4CE115F29C7


Para poder visualizar los resultados del filtro implementado se procedió a utilizar
como entradas 8 switch como datos que representan el dato entrante en binario, 1
switch para reset, 1 switch como inhibidor del clock lo cual nos permitirá realizar
cambios en los datos de entrada con mayor libertad.

Como salidas utilizaremos 6 display 7 segmentos, 18 leds rojos que representan el


numero en binario, 3 leds verdes, que representan el estado del inhibidor, del clock y
de reset.

Debemos tener en cuenta que el módulo tiene un reloj de 50 MHz por lo cual es
necesario dividir la frecuencia a 1 Hz para poder cargar los datos manualmente en
cada flanco de reloj, y obtener una salida visible. Por lo cual se ha dividido en
componentes de la siguiente manera:
 DIVISOR DE FRECUENCIA DE 50 MHZ A 1HZ

El código realiza una cuenta con el reloj de 50 MHz una vez llea a 25000000 de
pulsos entonces la salida conmuta de su valor actual y la cuenta regresa a 0.
El número de pulsos se calculó dividiendo 0.5s entre 20 ns, que es medio periodo
de la señal deseada entre el periodo del reloj del módulo.
 VISUALIZACIÓN EN DISPLAY 7 SEGMENTOS
 TOP LEVEL DEL VISUALIZACIÓN
Una vez compilado podemos observar los componentes, divisor, filtro y deco, los cuales fueron
generados
3. SIMULACION
Por motivos de simulación hemos omitido el divisor de frecuencia y la visualización para los
displays de modo que hemos definido el componente fir_filter5 como “Top level entity”.

Como podemos notar si nuestra entrada i_rstb está asignada a un cero lógico entonces,
reiniciamos nuestras señales internas y salidas a un valor de 0; como podemos notar en los
primeros dos flancos del clock. Posteriormente forzamos la entrada a un uno lógico y como
podemos observar el arreglo de los coeficientes se cargan una vez llega un flanco del clock
y como notamos también se carga el dato ingresado en la primera posición del arreglo.

Como está indicado en la explicación del código podemos notar que en el siguiente flanco
del clock el arreglo se desplaza y el dato de entrada se carga a la posición 0 y tenemos el
arreglo de la siguiente manera {(dato_in) (arreglo0_pasado) (arreglo1_pasado)
(arreglo2_pasado)}.
OBS: Simulación para un entrada escalón.
A continuación veremos la reacción al filtro a distintos valores de entrada.
a. Un impulso:
b. Dos impulsos:
c. Tres impulsos :
d. Cuatro impulsos:
4. QUEMADO EN LA PLACA
Para la implementación tenemos que preparar las entradas y salidas lógicas declaradas en
el código para que se puedan adaptar a las entradas y salidas físicas de la Tarjeta de
Desarrollo del FPGA. Esta parte se realiza en la ventana del PIN PLANNER desde el programa
del Quartus II.

Además necesitamos de los nombres de los pines de cada componente de la Tarjeta para
poder asignar. Estos nombres de cada pin son únicos por cada Tarjeta, es decir depende del
modelo. Nosotros estamos desarrollando el proyecto en el FPGA modelo Cyclone IV E –
EP4CE115F29C7. Al adquirir la tarjeta, además, tenemos a nuestra disposición el manual de
usuario en el cual se encuentra las distribuciones de los pines pertenecientes a la Placa.
Entonces, primero identificamos de nuestro código cuales son las entradas y cuáles son las
salidas:
A. ENTRADAS:
Entonces mostraremos como es que se hace la asignación de los pines:

B. SALIDAS:
 Displays

o Display 1:

o Display 2:
o Display 3:

o Display 4:

o Display 5:

o Display 6:

 Datos de salida (binario):


 Indicadores de Estado:
5. PRUEBA REAL EN LABORATORIO
A continuación, veremos algunos de los casos mostrados anteriormente en la
simulación una vez quemado el programa en el módulo DE-115 Cyclone IV.

Dos Impulsos:
Un Impulso:

Вам также может понравиться