IMPLEMENTACIÓN DE FILTROS DIGITALES EN LÓGICA RECONFIGURABLE TESIS QUE PRESENTA Rodrigo Cruz González PARA OBTENER EL GRADO DE MAESTRO EN CIENCIAS Asesor: Dr. Gonzalo I. Duchén Sánchez ESCUELA SUPERIOR DE INGENIERÍA MECÁNICA Y ELÉCTRICA UNIDAD CULHUACÁN – IPN SECCIÓN DE ESTUDIOS DE POSGRADO E INVESTIGACIÓN
103
Embed
IMPLEMENTACIÓN DE FILTROS DIGITALES EN LÓGICA … · 2018-12-07 · Figura 2.4 Esquema de tolerancia para un filtro IIR pasa banda 23 Figura 2.5 Esquemas de respuestas en frecuencia
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
IMPLEMENTACIÓN DE FILTROS DIGITALES EN LÓGICA RECONFIGURABLE
TESIS QUE PRESENTA
Rodrigo Cruz González
PARA OBTENER EL GRADO DE MAESTRO EN CIENCIAS
Asesor: Dr. Gonzalo I. Duchén Sánchez
ESCUELA SUPERIOR DE INGENIERÍA MECÁNICA Y ELÉCTRICA UNIDAD CULHUACÁN – IPN
SECCIÓN DE ESTUDIOS DE POSGRADO E INVESTIGACIÓN
Agradezco a mis padres por el apoyo incondicional que siempre me otorgaron y
regalarme la herencia más grande que es la educación que con mucho sacrificio lograron
darme para ser el profesionista que el día de hoy he logrado ser. También agradezco a mi
asesor por compartir sus conocimientos y enseñanzas para desarrollar mi investigación.
Agradezco a CONACYT y COFAA por la beca que se me otorgó para poder realizar
mis estudios de posgrado así como agradezco al Instituto por otorgarme la beca tesis al final
de mis estudios.
Agradezco a todos los profesores que durante mi vida estudiantil me inculcaron a
aprovechar el gran legado que tiene la humanidad: el conocimiento.
Asimismo agradezco a toda la gente que en alguna etapa de mi vida me enseñaron algo
para ser una mejor persona y un buen profesionista.
i
Índice.
Índice de tablas iii
Índice de figuras iv
Resumen 1
Abstract 1
Capítulo 1. Introducción 2
1.1 Objetivo 2
1.2 Aportación de la investigación 3
1.3 Descripción del proyecto de investigación 3
1.4 Organización de la tesis 5
Conclusiones 5
Capítulo 2. Diseño de filtros digitales 6
2.1 Filtros de Respuesta al Impulso Finito (FIR) 6
2.1.1 Respuesta de fase lineal y sus implicaciones 6
2.1.2 Especificaciones de los filtros FIR 10
2.1.3 Método para calcular los coeficientes del filtro FIR basado en ventanas 11
2.2 Filtros de Respuesta al Impulso Infinito (IIR) 21
2.2.1 Especificaciones de los filtros IIR 22
2.2.2 Uso de la transformada bilineal (BZT) y los filtros analógicos clásicos para
diseñar filtros IIR 24
2.2.2.1 Resumen del método BZT para el cálculo de los coeficientes 25
2.2.2.2 Características de los filtros analógicos clásicos 26
2.2.3 Cálculo de los coeficientes del filtro IIR por mapeo de polos y ceros en el
plano s 28
2.2.3.1 Ejemplos ilustrativos 34
Conclusiones 36
Capítulo 3. C2VHDL 37
3.1 Estructura de C2VHDL 37
ii
3.1.1 Descripción de C2VHDL 37
3.1.1.1 Archivo filtro.cpp 40
3.1.1.2 Archivo xxxfilt.cpp 42
3.1.1.3 Archivo lecxxx.cpp 48
3.1.2 C2VHDL descriptivo 49
3.1.2.1 Descripción de los archivos vhd 50
Conclusiones 56
Capítulo 4. Ejemplos de aplicación de C2VHDL 57
4.1 Filtros FIR 57
4.1.1 Filtro pasa bajas (LPF) 57
4.1.2 Filtro pasa banda (BPF) 59
4.1.3 Filtro rechaza banda (BSF) 60
4.1.4 Filtro pasa altas (HPF) 63
Conclusiones 70
Conclusiones 71
Bibliografía 75
Apéndice A. Publicaciones 79
Apéndice B. Programas realizados en VHDL 85
Apéndice C. Programas realizados en Turbo C++ 94
iii
Índice de tablas
Tabla 2.1 Resumen de las características principales de los filtros FIR de fase lineal 8
Tabla 2.2 Aplicación de los filtros FIR de fase lineal 10
Tabla 2.3 Resumen de las respuestas al impulso ideales para filtros estándar selectivos en
frecuencia 14
Tabla 2.4 Funciones ventana para el diseño de filtros FIR 15
Tabla 2.5 Características del espectro con ventanas 17
Tabla 2.6 Coeficientes del filtro FIR del ejemplo 2.1 20
Tabla 3.1 Representación de la posición de los bits de la mantisa para el formato de los datos
convertidos 44
iv
Índice de figuras
Figura 1.1 Diagrama a bloques del proyecto de investigación 4
Figura 2.1 Características de filtros FIR de fase lineal de tipo (a) 1, (b) 2, (c) 3 y (d) 4 9
Figura 2.2 Especificaciones de respuesta en magnitud para un filtro pasa bajas 11
Figura 2.3 (a) Respuesta en frecuencia ideal de un filtro pasa bajas. (b) Respuesta
impulsional de un filtro pasa bajas ideal 13
Figura 2.4 Esquema de tolerancia para un filtro IIR pasa banda 23
Figura 2.5 Esquemas de respuestas en frecuencia de algunos filtros analógicos clásicos a)
repuesta Butterworth; b) Chebyshev tipo I 24
Figura 2.6 Mapeo de ceros de un filtro pasa bajas prototipo de segundo orden hacia (a) pasa
bajas, (b) pasa altas, (c) pasa banda y (d) rechaza banda 30
Figura 3.1 Diagrama de la estructura general de C2VHDL programable 38
Figura 3.2 Pantalla de (a) bienvenida y (b) presentación y descripción de C2VHDL 38
Figura 3.3 Pantalla de (a) elección del filtro y (b) toma de parámetros de diseño 39
Figura 3.4 Pantalla de elección (a) de ventana y (b) aproximación analógica 40
Figura 3.5 Pantallas de la presentación final de C2VHDL programable para un filtro FIR 41
Figura 3.6 Programa principal del código fuente de filtro.cpp 41
Figura 3.7 Programa principal del código fuente de (a) firfilt.cpp y (b) iirfilt.cpp 42
Figura 3.8 (a) Diagrama de flujo y (b) código fuente de la función tipo_de_filtro() 43
Figura 3.9 Criterio del código para mostrar la lista de las ventanas 44
Figura 3.10 (a) Diagrama de flujo para una iteración de la conversión de los coeficientes y (b)
código del proceso de conversión para un dato negativo 46
Figura 3.11 Líneas de código de la función filtro() 48
Figura 3.12 Diagrama de flujo de lectura y creación de archivos vhd 48
Figura 3.13 (a) Estructura directa para filtros FIR y (b) estructura cascada para filtros IIR 49
Figura 3.14 (a) Estructura de un tap y (b) bloque de segundo orden 50
Figura 3.15 Representación en hardware de un (a) tap y (b) bloque de segundo orden 51
v
Figura 3.16 Líneas de instrucción para describir la arquitectura (a) behav y (b) struct de un
flip-flop tipo D y un registro de n bits respectivamente 52
Figura 3.17 Multiplicador de Booth [4]: (a) diagrama de flujo y (b) representación en
hardware 53
Figura 3.18 Descripción en VHDL de (a) filtfir.vhd y (b) filtiir.vhd 54
Figura 3.19 Metodología de diseño top-down de un sistema [6] 54
Figura 4.1 (a) Señal de entrada y (b) su TDF 58
Figura 4.2 Respuesta en frecuencia del filtro pasa bajas 59
Figura 4.3 (a) Señal de salida y (b) su TDF realizado por software de un LPF 60
Figura 4.4 (a) Señal de salida y (b) su TDF simulado en MAX+PLUS® II de un LPF 61
Figura 4.5 (a) Señal de salida y (b) su TDF realizado por software de un BPF 62
Figura 4.6 (a) Señal de salida y (b) su TDF simulado en MAX+PLUS® II de un BPF 63
Figura 4.7 Respuesta en frecuencia del filtro pasa banda 64
Figura 4.8 (a) Señal de salida y (b) su TDF realizado por software de un BSF 65
Figura 4.9 (a) Señal de salida y (b) su TDF simulado en MAX+PLUS® II de un BSF 66
Figura 4.10 Respuesta en frecuencia del filtro rechaza banda 67
Figura 4.11 Respuesta en frecuencia del filtro pasa altas 67
Figura 4.12 (a) Señal de entrada y (b) su TDF realizado por software de un HPF 68
Figura 4.13 (a) Señal de entrada y (b) su TDF simulado en MAX+PLUS® II de un HPF 69
Figura 1 Fotografía de las señales C y U del filtro a través de un osciloscopio 73
1
Resumen. En la presente investigación se desarrolla una interfaz de usuario para el diseño e
implementación de filtros digitales, la cual al recibir parámetros de diseño, realiza el cálculo
de los coeficientes del filtro y entrega los archivos con formato VHDL necesarios para la
posterior compilación, sintetización e implementación en dispositivos FPGA.
Es presentada la introducción y métodos de diseño para filtros FIR e IIR así como
ejemplos ilustrativos que servirán de guía al usuario para realizar un correcto diseño. La
interfaz desarrollada llamada C2VHDL está constituida por programas desarrollados en
lenguaje C++ para realizar un cálculo eficiente de los coeficientes, así como la creación de los
archivos en lenguaje de descripción de hardware (VHDL) conteniendo estructuras para su
implementación.
Se realizan implementaciones de los filtros pasa bajas, pasa altas, pasa banda y rechaza
banda para ejemplificar la interfaz en dispositivos FPGA de ALTERA® y XILINX®. Se
describe un desarrollo futuro para el mejoramiento de la interfaz así como la implementación
el la tarjeta de desarrollo S3ESK de XILINX®.
Abstact. In the present research an interface to design and implement digital filters is
developed, which receives design parameters, calculates the filters’s coefficients and gives
files in VHDL fomat in order to compile, synthetize and implement them in FPGA devices.
An introduction and methods to design FIR and IIR filters is presented. Ilustrative
examples will serve as an user’s guide to make a correct design. The developed interface is
called C2VHDL. It is made by C++ programs to calculate efficient coefficients and then to
create hardware description language (HDL) files with structures for its implementation.
Examples of the LP, HP, BP and BS filters are implemented in ALTERA®’s and
XILINX®’s FPGA devices in order to use the interface. A future development to enhance the
interface is decribed. In order to implement the proposed designs the XILINX®’s S3ESK
board is used.
2
Capítulo 1. Introducción.
Un filtro es un sistema o red que cambia de una manera deseada la forma de onda,
características de amplitud y/o fase de una señal. El objetivo común del filtrado es mejorar la
calidad de la señal, extraer información de las señales o separar dos o más señales
previamente combinadas para hacer uso eficiente, por ejemplo, de un canal de comunicación
disponible [1].
Un filtro digital es un algoritmo matemático implementado en software y/o hardware
que opera sobre una señal de entrada digital para producir una señal de salida digital con el
propósito de mejorar el objetivo de filtrado [1]. Aunque los filtros digitales tienen algunas
limitantes, entre sus ventajas se encuentran: inmunidad a no linealidades de los dispositivos,
exactitud (limitada por el error de redondeo en la aritmética de la computadora), fácil
modificación de las características del filtro, libertad de variaciones en los componentes y bajo
costo [3].
Los filtros digitales tienen muchas ventajas sobre los filtros analógicos, por lo cual ha
sido muy amplia la utilización y aplicación de éstos. Sin embargo, la implementación de los
filtros digitales en hardware no resulta simple, o en ocasiones el diseño se enfoca a alguna
aplicación específica dando como resultado la dificultad de rediseñarlos.
La utilización de filtros para aplicaciones en el procesamiento digital de señales (DSP)
se ha incrementado tanto que es necesario usar algoritmos complejos para su diseño óptimo,
sin embargo su implementación en VHDL también puede ser complejo. Existe una amplia
bibliografía sobre diseño de filtros digitales, y los métodos para diseñarlos pueden no ser tan
complejos computacionalmente.
1.1 Objetivo.
En muchas ocasiones se hace el diseño de filtros digitales para filtros FIR o IIR, y
para aplicaciones, por ejemplo en cancelación de eco, se hace el diseño de ambos con
características específicas. Se han realizado trabajos sobre la implementación en FPGAs de
3
filtros FIR de propósito general [8], así como herramientas que sirven para la aceleración de
la simulación de hardware [9], donde se utilizan herramientas como MATLAB® y C para el
diseño de filtros; con dichas herramientas de software se tienen disponibles funciones
predeterminadas, como fir2 de MATLAB® [8], la cual calcula los coeficientes del filtro; sin
embargo no se ha desarrollado una herramienta que sirva de interfaz de usuario para vincular
el diseño de los filtros digitales y su implementación en hardware para FPGA.
El proyecto de investigación de la presente tesis consiste en una interfaz de
usuario en la cual se pueda vincular al diseño de filtros digitales FIR e IIR y su
implementación en hardware utilizando dispositivos FPGA (ver figura 1.1).
1.2 Aportación de la investigación.
Se creó C2VHDL, que sirve como interfaz para el diseño de filtros e internamente
realiza la vinculación con el VHDL para su implementación. Con esta interfaz, se pretende
que el usuario pueda realizar diseños para cualquier aplicación, teniendo como limitación el
dispositivo FPGA a utilizar, el cual entre más bloques lógicos contenga, mayor será su
capacidad para implementar filtros de orden superior.
1.3 Descripción del proyecto de investigación.
C2VHDL es un programa para el diseño de filtros FIR e IIR, cuyo propósito es servir
como una interfaz de usuario para la implementación de los mismos en dispositivos FPGA.
C2VHDL presenta una pantalla donde el usuario puede elegir entre filtros FIR o IIR,
posteriormente proporciona parámetros de diseño para un filtro deseado, de los cuales
C2VHDL se basa para determinar el tipo de filtro a tratar.
Si el usuario elige diseñar filtros FIR, C2VHDL presenta algunas ventanas de diseño
basado en la atenuación en la banda de rechazo Ap. Por otra parte, si elige diseñar filtros IIR,
C2VHDL presenta las aproximaciones analógicas con las que el usuario puede diseñarlos,
Butterworth y Chebyshev Tipo I. Posteriormente, C2VHDL presenta una pantalla indicando el
4
Figura 1.1 Diagrama a bloques del proyecto de investigación.
tipo de filtro, pasa bajas (LPF), pasa altas (HPF), pasa banda (BPF) o rechaza banda (BSF),
así como la ventana o aproximación analógica para los filtros FIR e IIR, respectivamente.
Internamente realiza el cálculo del orden del filtro, los coeficientes y su conversión a cadena
de 12 bits.
Después se presenta una pantalla indicando el orden del filtro, FIR, y el número de
bloques de segundo orden, IIR. C2VHDL, al ser una interfaz transparente para el usuario, crea
dos archivos con extensión vhd, de los cuales uno contiene el orden o el número de bloques de
segundo orden así como los coeficientes del filtro deseado en su representación de cadena de
bits, coexxx.vhd, y el archivo filtxxx.vhd contiene la estructura del mismo, donde xxx
representa FIR o IIR.
Posteriormente, se presenta una pantalla indicando la ubicación de los archivos arriba
mencionados, siendo ésta una carpeta de trabajo dentro del sintetizador MAX+PLUSII de
ALTERA. Una pantalla final indica al usuario que debe realizar en primer lugar la
compilación del archivo coexxx.vhd y después la del archivo filtxxx.vhd en un sintetizador de
5
VHDL para su posterior implementación en dispositivos FPGA. La ubicación de los archivos
puede cambiar dependiendo del sintetizador que el usuario utilice.
1.4 Organización de la tesis.
La tesis consiste de tres partes: la primera consiste en el capítulo 2, donde se hace
referencia al diseño de filtros digitales tanto FIR como IIR y los diversos métodos para el
cálculo de sus coeficientes.
La segunda parte consiste en el capítulo 3, en el cual se hace una descripción con más
detalle de C2VHDL, haciendo hincapié en los programas utilizados para la realización del
mismo. También se hace referencia a los componentes utilizados para la descripción en
hardware así como las líneas de código importantes que conforman el programa.
La tercera parte consiste en el capítulo 4, en el cual se hacen ejemplos y simulaciones
de los filtros, haciendo una comparación de los resultados obtenidos en C2VHDL con respecto
a la simulación del filtrado realizado en C++.
Finalmente en el capítulo 5 se realizan las conclusiones del trabajo de investigación
junto con la experiencia adquirida así como un desarrollo más amplio que podría tener este
trabajo, como es el diseño e implementación de filtros adaptables así como el diseño en modo
asincrónico.
Conclusiones.
La importancia de los filtros para el procesamiento digital de señales (DSP) ha sido
cada vez más aclamada para desarrollar proyectos y aplicaciones para soluciones de propósito
general así como de propósito específico.
A lo largo de la realización del trabajo de investigación se encontró que las posibles
soluciones para el DSP no siempre están desarrolladas a nivel hardware. Sin embargo, lo
poco desarrollado en hardware no es reutilizable con todas las aplicaciones.
6
Capítulo 2. Diseño de filtros digitales.
2.1 Filtros de Respuesta al Impulso Finito (FIR).
Los filtros ideales son no causales, lo que los hace físicamente irrealizables. Los filtros
ideales tienen una repuesta en frecuencia con características deseables, por lo que se tiene la
necesidad de realizar filtros causales con respuesta en frecuencia aproximada a los filtros
ideales con tanta precisión como se desee [1].
La causalidad tiene muchas implicaciones importantes en el diseño de filtros selectivos
en frecuencias, (a) la respuesta en frecuencia H(ω) no puede ser cero, excepto en un conjunto
finito de puntos en frecuencia; (b) la magnitud |H(ω)| no puede ser constante en ningún
intervalo finito de frecuencias y la transición de la banda de paso a la banda de rechazo no
puede ser infinitamente abrupta (consecuencia del fenómeno de Gibbs causado por el
truncamiento de h(n) para lograr causalidad); y las partes real e imaginaria de H(ω) son
independientes y están relacionadas por la transformada de Hilbert discreta. Como
consecuencia la magnitud |H(ω)| y la fase θ(ω) de H(ω) no se pueden elegir arbitrariamente
[2].
2.1.1 Respuesta de fase lineal y sus implicaciones.
Una señal al ser procesada por un filtro, modifica su amplitud y fase. La naturaleza y
extensión de la modificación de la señal depende de las características de fase y amplitud del
filtro. Para poder conocer la modificación de las características de la señal filtrada, se utiliza
lo que se llama retraso de fase o retraso de grupo.
Para una señal que consiste de diversas componentes de frecuencia como la voz o una
señal modulada, el retraso de fase del filtro es la cantidad de retraso de tiempo que sufre cada
componente de frecuencia de la señal cuando para a través del filtro. Por otra parte, el retraso
de grupo es el promedio de retraso de tiempo que la señal compuesta sufre en cada
7
componente en frecuencia. Matemáticamente, el retraso de fase es el negativo del ángulo de
fase dividido por la frecuencia, mientras que el retraso de grupo es el negativo de la derivada
de la fase con respecto a la frecuencia, es decir
ωωθ /)(−=pT (2.1)
ωωθ ddTg /)(−= (2.2)
Un filtro de fase no lineal causará distorsión de fase a la señal. Una distorsión
indeseable puede evitarse haciendo uso de filtros con características de fase lineal sobre las
bandas de frecuencia de interés. Un filtro tiene una respuesta en fase lineal si su respuesta en
fase cumple con las siguientes relaciones:
αωωθ −=)( (2.3)
αωβωθ −=)( (2.4)
donde α y β son constantes. Cuando un filtro satisface la condición dada por (2.3),
tendrá una repuesta con retraso de fase y de grupo constantes. La condición (2.3) se satisface
cuando la repuesta al impulso del filtro tiene simetría positiva. En este caso, la respuesta en
fase es simplemente una función de la longitud del filtro.
−=−=
−=−−= 2/)1(,
)(1)2/(,,1,0)(2/)1(,,1,0
),1()( NparNNn
imparNNnnNhnh α
K
K
Cuando solo se satisface (2.4), el filtro solamente presentará un retraso de grupo
constante. En este caso, la respuesta al impulso del filtro tiene simetría negativa [1].
2/,2/)1(),1()( πβα =−=−−−= NnNhnh
La tabla 2.1 muestra las características principales con respecto a los cuatro tipos de
filtros FIR de fase lineal.
8
La figura 2.1 muestra las diferencias de las repuestas al impulso de los cuatro tipos de
filtros FIR de fase lineal. La respuesta en frecuencia de un filtro del tipo 2 siempre es cero a
f = 0.5 (la mitad de la frecuencia de muestreo), por lo que no es realizable como un filtro pasa
altas. Los tipos 3 y 4 presentan un desplazamiento en fase de 90°. La respuesta en frecuencia
siempre es cero a f = 0, no permitiendo su realización como filtros pasa bajas. Además, la
respuesta del tipo 3 siempre es cero a f = 0.5, por lo que tampoco puede realizarse como un
filtro pasa altas. Los tipos 3 y 4 frecuentemente son usados para diseñar diferenciadores y
transformadores Hilbert. El tipo 1 es el más versátil de los cuatro.
El retraso de fase para los filtros del tipo 1 y 2, o el retraso de grupo para los cuatro
tipos de filtros puede expresarse en términos del número de coeficientes del filtro así como
puede ser ajustado para obtener una respuesta de retraso de fase o de grupo nulo.
Tabla 2.1 Resumen de las características principales de los filtros FIR de fase lineal. Simetría de la respuesta al
impulso
Número de
coeficientes N
Respuesta en frecuencia
H(ω)
Tipo de fase
lineal
Impar ( ) ( ) ( )
( )
∑−
=
−−2/1
0
2/1 cosN
n
Nj nnae ωω
1
Simetría Positiva,
)1()( nNhnh −−=
Par ( ) ( ) ( )[ ]∑
=
−− −2/
1212/1 cos
N
n
Nj nnbe ωω
2
Impar ( )[ ] ( ) ( )
( )
∑−
=
−−−2/1
1
2/2/1 sinN
n
Nj nnae ωπω
3
Simetría Negativa,
)1()( nNhnh −−−=
Par ( )[ ] ( ) ( )[ ]∑
=
−−− −2/
1212/2/1 sin
N
n
Nj nnbe ωπω
4
]2/)1[(2)(];2/)1[()0( nNhnaNha −−=−=
)2/(2)( nNhnb −=
9
Figura 2.1 Características de filtros FIR de fase lineal de tipo (a) 1, (b) 2, (c) 3 y (d) 4.
Por ejemplo, para los filtros del tipo 1 y 2, el retraso de fase está dado por (2.5) y para
los tipos 3 y 4 el retraso de grupo está dado por (2.6) [1, 3]. La tabla 2.2 resume las
características para su aplicación que tienen los cuatro tipos de filtros.
TNTp
−
=2
1 (2.5)
TNTg
−−
=21 π (2.6)
donde T es el periodo de muestreo.
10
Tabla 2.2 Aplicación de los filtros FIR de fase lineal.
Tipo H(F) = 0 en Aplicación
1 Todos los tipos de filtros. Secuencia sólo para BSF
2 F = 0.5 Sólo LPF y BPF
3 F = 0, F = 0.5 BPF, diferenciadores, transformadores de Hilbert
4 F = 0 HPF, BPF, diferenciadores, transformadores de Hilbert
2.1.2 Especificaciones de los filtros FIR.
Para que el usuario pueda diseñar filtros FIR se necesitan establecer los requerimientos
del filtro que desee implementar, como son las características de la señal, las características
del filtro, la manera de implementarlo y otras consideraciones de diseño. Sin embargo, para la
respuesta en fase sólo se necesita establecer si el filtro requiere simetría positiva o simetría
negativa, asumiendo fase lineal.
Para la respuesta en amplitud normalmente se especifica en forma de un esquema de
tolerancia. La figura 2.2 muestra un esquema para un filtro pasa bajas, cuyos parámetros de
interés son:
δp Máxima desviación (ondulación) en la banda de paso
δs Máxima desviación (ondulación) en la banda de rechazo
fp Frecuencia de borde en la banda de paso
fs Frecuencia de borde en la banda de rechazo
Fs Frecuencia de muestreo
En la práctica es muy común expresar δp y δs en decibeles para especificar el rizo en la
banda de paso y la mínima atenuación en la banda de rechazo respectivamente. La diferencia
entre fs y fp proporciona el valor del ancho de transición del filtro. Otro parámetro a considerar
es la longitud del filtro N, el cual define el número de coeficientes a calcular. En la mayoría de
11
Figura 2.2 Especificaciones de respuesta en magnitud para un filtro pasa bajas.
los casos, éstos parámetros definen completamente la respuesta en frecuencia de un filtro FIR
[1].
( ) ss rechazodebandalaenatenuaciónA δ10log20−= (2.7)
[17] M. Bhattacharya, T. Saramäki, “Allpass Structures For Multiplierless Realization Of
Recursive Digital Filters,” in Proc. Int. Symposium on Circuits and Systems,
ISCAS’03, pp. IV-237 – IV-240.
[18] Jean-Pierre Deschamps, G. J. A. Bioul, G. D. Sutter, Synthesis of Arithmetic Circuits.
FPGA, ASIC and Embedded Systems. NY: Wiley-Interscience, 2006, pp. 39–108.
[19] P. P. Chu, RTL Hardware Design Using VHDL. Coding for Efficiency, Portability, and
Scalability. NY: Wiley-Interscience, 2006, pp. 373–498.
[20] G. L. Bates, S. Nooshabadi, “FPGA Implementation of a Median Filter,” in Proc. of
IEEE Region 10 Annual Conf., TENCON ’97, pp. 437–440.
[21] J. F. Warkely, Diseño Digital. Principios y Prácticas. NJ: Prentice Hall, 2001, pp.
659–894.
[22] R. Lyons, “Interpolated Narrowband Lowpass FIR Filters,” IEEE Signal Processing
Magazine, Vol. 20, No. 1, pp. 50–57, Jan. 2003.
[23] S. J. Ovaska, O. Vainio, T. I. Laakso, “Design of Predictive IIR Filters Via Feedback
Extension of FIR Forward Predictors,” in Proc. 38th Midwest Symposium on Circuits
and Systems, MWSCAS 1995, pp. 370–375.
[24] Y. Neuvo, C. –Y. Dong, S. K. Mitra, “Interpolated Finite Impulse Response Filters,”
IEEE Trans. Acoust., Speech, Signal Process., Vol. ASSP-32, pp. 563-570, June 1984.
77
[25] O. Gustafsson, H. Johansson, L. Wanhammar, “Design and efficient implementation of
high-speed narrow-band recursive digital filters using single filter frequency masking
techniques,” in Proc. IEEE Int. Symposium on Circuits and Systems, ISCAS 2000, pp.
359–362.
[26] R. Brennan, T. Schneider, “A Flexible Filterbank Structure for Extensive Signal
Manipulations in Digital Hearing Aids,” in Proc. IEEE Int. Symposium on Circuits and
Systems, ISCAS ’98, pp. 569–572.
[27] J. Sparsø, S. Furber, Principles of Asynchronous Circuit Design. A Systems
Perspective. The Netherlands: Kluwer Academic Publishers, 2001, pp.123–154.
[28] A. Benveniste, G. Berry, “The Synchronous Approach to Reactive and Real-Time
Systems,” Proceedings of the IEEE, Vol. 79, No. 9, pp. 1270–1282, Sept. 1991.
[29] M. Ligthart, K. Fant, R. Smith, A. Taubin, A. Kondratyev, “Asynchronous Design
Using Commercial HDL Synthesis Tools,” in Proc. 6th Int. Symposium on Advanced
Research in Asynchronous Circuits and Systems, ASYNC 2000, pp. 114–125.
[30] Chiu-Sing Choy, J. Butas, J. Povazanic, Cheong-Fat Chan, “A New Control Circuit for
Asynchronous Micropipelines,” IEEE Trans. on Computers, Vol. 50, No. 9, pp. 992–
997, Sept. 2001.
[31] V. A. Bartlett, E. Grass, “A Low-Power Asynchronous VLSI FIR Filter,” in Proc.
Conf. on Advanced Research in VLSI, ARVLSI 2001, pp. 29–39.
[32] S. Nooshabadi, J. A. Montiel-Nelson, “Design and Implementation of an Ultra-Fast
Asynchronous FIR Filter in GaAs,” in Proc. of IEEE, TENCON ’96, pp. 256–260.
[33] R. Sridhar, “Asynchronous Design Techniques,” in Proc. of 5th Annual IEEE Int.
ASIC Conference and Exhibit, ASIC 1992, pp. 296–300.
[34] H. van Gageldonk, K. van Berkel, A. Peeters, D. Baumann, D. Gloor, G. Stegmann,
“An Asynchronous Low-Power 80C51 Microcontroller,” in Proc. 4th Int. Symposium
on Advanced Research in Asynchronous Circuits and Systems, ASYNC 1998, pp. 96–
107.
[35] S. Hauck, “Asynchronous Design Methodologies: An Overview,” Proceedings of the
IEEE, Vol. 83, No. 1, pp. 69–93, Jan. 1995.
78
[36] L. S. Nielsen, J. Sparsø, “Designing Asynchronous Circuits for Low Power: An IFIR
Filter Bank for a Digital Hearing Aid,” Proceedings of the IEEE, Vol. 87, No. 2, pp.
268–281, Feb. 1999.
[37] LINEAR TECHNOLOGY. (2004). Serial 12-Bit/14-Bit, 3Msps Simultaneous
Sampling ADCs with Shutdown. Data Sheet. Pp. 1–24.
[38] LINEAR TECHNOLOGY. (2004). Quad 16-Bit Rail-to-Rail DACs in 16-Lead SSOP.
Data Sheet. Pp. 1–16.
[39] LINEAR TECHNOLOGY. (2004). Dual Programmable Gain Amplifiers with Serial
Digital Interface. Data Sheet. Pp. 1–24.
[40] Spartan-3E Starter Kit Board User Guide, Xilinx, 2006, pp. 9–164.
79
Apéndice A. Publicaciones.
C2VHDL: FPGA FIR filters implementation and design program
Rodrigo Cruz González, Gonzalo I. Duchén Sánchez, Juan Carlos Sánchez García Instituto Politécnico Nacional, ESIME Culhuacán Sección de Estudios de Posgrado e Investigación
Av. Santa Ana No. 1000, Col. San Fco. Culhuacán, CP. 04830 México D.F., México
Abstract – In the present paper a C++ program to design and implement FIR filters in FPGA with the windowing method is presented. Given the desired filter specifications, the designed filter in VHDL is obtained and then is implemented in some commercial FPGA system. A low pass and band stop filters are proposed, doing a comparison between the VHDL and C++ results. Finally we conclude with the implementation in FPGA devices emphasizing on the filter effectiveness.
Keywords – C++, FIR Filters, FPGA, VHDL, windowing.
I. INTRODUCTION
A FIR filter is represented by an impulse response sequence h(k) and when a convolution is made with an input signal x(k) the filtered signal y(k) (1) is obtained.
∑−
=
−=1
0
)()()(N
k
knxkhny (1)
The impulse response sequence represents the filter
coefficients, which can be calculated to generate a low pass, high pass, band pass or band stop filter using the windowing method.
Figure 1 shows a FIR filter direct form. We can see that the number of multiplications and taps is the same.
Fig. 1. FIR filter direct form.
II. DATA REPRESENTATION
VHDL implementation makes use of digital multipliers, thus bits must represent data. In this paper we use the Booth’s digital multiplier [4, 12], which allows the use of negative and positive numbers in two’s complement mode.
The natural form of data is very unusual because VHDL
is a description language for digital systems. This is the reason that bits, with MSB indicating the sign, represent data. We use 12 bits in order to represent data.
The format to represent a floating-point number
involves three features: the sign, the 11 bits mantissa representing the floating-point number and the exponent that gives a better precision to data. The eleven bits mantissa has an excess of –11 with regard to numeric binary representation (see Table I).
III. DESIGNING FILTERS
C2VHDL is a program which makes an important
interconnection between a filter’s software-design and implementation in hardware.
In order to design FIR filters using windowing method, we use C2VHDL which accepts the filter specifications like pass and stop frequencies, band pass and band stop attenuations and sampling frequency. Based on this specifications, the program choices the type of filter, low pass, high pass, band pass or band stop (see figure 2).
Depending on the band stop attenuation, the program
allows to choice of the window to be used, in the example shown a Hamming window is used.
The windows to be selected (figure 3) are Boxcar (Rectangular), Cosine, Riemann, Barlett, Von Hann (Hanning), Hamming, Blackman and Kaiser [2].
Fig. 2. Window of the BSF parameters given at C2VHDL.
Fig. 3. Windows proposed at C2VHDL.
Based on these parameters, the program calculates both
the length and coefficients of filter; the coefficients are converted in its bits representation; after this, it creates a file in VHDL format where these results will be inserted. It also reads a file in VHDL format, which contains the filter structure.
Fig. 4. Architecture pattern in VHDL format.
After all this process, it generates both the package and filter in VHDL format. The package contains the length and coefficients of filter; the filter contains the structure, which is simulated in Altera®. Figure 5 shows the package used for a filter with length 17.
The filter file (figure 6) is the architecture obtained of the C++ program, which makes a reference to the parameters, contained in the package file. This architecture is the filter structure in direct form.
Fig. 5. Package in VHDL format.
81
Fig. 6. Architecture of the filter structure in VHDL format.
IV. FILTER’S IMPLEMENTATION
In order to implement the filter, we designed a low pass and a band stop filters. The input signal (figure 7) is the sum of three sinusoidal signals at 0.45, 1.5 and 5.8 kHz. This input was selected randomly in order to represent a distorted signal, which is filtered for a subsequent process.
The specifications given are a pass frequency (fp) = 500 Hz, stop frequency (fs) = 600 Hz with a sampling frequency (F) = 10 kHz, indicating that is a low pass filter (LPF) which band pass and band stop attenuations are Ap = 4 dB and As = 45 dB respectively. The As indicates we can use the Hamming window; the filter’s length is rated at 17.
Figure 8 shows the filtered signal obtained in both C++
and VHDL simulation.
Fig. 7. Input Signal.
(a)
(b)
Fig. 8. LPF in (a) C++ and (b) VHDL.
Figure 9 shows the LPF frequency response in which
the band pass attenuation is 3.73 dB and the band stop attenuation is 48.9 dB. These data indicate our filter is correct.
We designed other filter with parameters given as fp = [0.8, 3.3] kHz, fs = [1.1, 3] kHz and F = 10 kHz. These specifications indicate that it is a band stop filter (BSF). The attenuations are Ap = 4 dB and As = 45dB. The length is rated at 21.
Figures 10 and 11 show the filtered signal in C++ and
VHDL simulation and frequency response respectively.
Fig. 9. LPF frequency response.
82
Figure 11 shows the band pass and band stop
attenuations at 3.73 dB and 44.54 dB respectively, indicating that the filter is correct.
The results obtained indicate that any type of filter can
be designed and implemented in VHDL, ensuring the effectiveness they have.
(a)
(b)
Fig. 10. BSF in (a) C++ and (b) VHDL.
Fig. 11. BSF frequency response.
Finally, the program shows to user the directory which files in VHDL format are saved and a few instructions about the correct form of the files’ compilation.
Fig. 12. Window of the directory where files are saved.
In this case, Altera’s Maxplus+II was used, the
directory above mentioned is referred to this software. The user has the option to chose the directory referring the software used.
83
V. CONCLUSIONS
In order to implement digital filters we must bear its specifications in mind, because depending on what design method we use, the filter length can increase or decrease. For example, we use a ratio that involves transition width (fs - fp) and a constant C in order to calculate the filter’s length N [2, 3]. Nevertheless, the method most used in order to calculate N is based on Kaiser window [2, 3].
The FPGA device used in this work was an ALTERA®
EPF10K70RC240-2, which is an small one and depends on N because the structure allows to make designs with a limited number of N. For example, BSF has an N of 21 that takes up 83 % of logic cells contained in this device. If we increase N, it will cause logic cells not to be enough in order to synthesize it. XILINX® devices of the SPARTAN® 3 family will also be used in order to test the filters.
Although there are a lot of programs in order to design FIR filters, they are not as simple and easy to use like this one. The contribution of this system is that it permits to interconnect both the calculation by software and the implementation by hardware.
The user inserts the specifications of the required filter,
and the result obtained is a filter in VHDL format which can be simulated and implemented using vendor programs like ALTERA’s Maxplus+II® or XILINX’s ISE®.
ACKNOWLEDGMENT
R. Cruz thanks to CONACYT and COFAA for the scholarship awarded to finish his post graduate studies. We also thanks ALTERA® and XILINX® for his donation of programs and systems.
REFERENCES [1] J. G. Proakis, D. G. Manolakis, Tratamiento digital de señales.
Principios, algoritmos y aplicaciones. NJ: Prentice Hall, 1998, pp. 509-639.
[2] A. Ambardar, Procesamiento de señales analógicas y digitales.
NJ: Thomson Learning, 2002 pp. 715-753. [3] E. C. Ifeachor, B. W. Jervis, Digital signal processing. A
practical approach. NJ: Prentice Hall, 2002 pp. 318-366. [4] M. M. Mano, Arquitectura de computadoras. NJ: Pearson
Educación, 1994, pp. 366-369. [5] F. J. Ceballos, Enciclopedia del lenguaje C. NJ: Alfaomega,
1997, pp. 315-354. [6] F. Pardo, J. A. Boluda, VHDL. Lenguaje para síntesis y
modelado de circuitos. NJ: Alfaomega, 2000, pp. 83-107. [7] D. G. Maxinez, J. Alcalá, VHDL. El arte de programar sistemas
Application Note [Online]. (83), pp. 1-16. Available: http://www.altera.com/literature/lit-an.jsp [11] M. B. I. Reaz, M. T. Islam, M. S. Sulaiman, M. A. M. Ali, H.
Sarwar, S. Rafique, “FPGA Realization of Multipurpose FIR Filter,” in Proc. 4th Int. Conf. Parallel and Distributed Computing, Applications and Technologies, PDCAT’03, pp. 912-915.
[12] A. Martínez, “Análisis de arquitecturas de multiplicadores
digitales y su implementación en FPGA”, M.Sc. Thesis, Microelect. Eng. Program, ESIME IPN, Mexico City, Mexico, 2005.
Rodrigo Cruz recibió el título de Ingeniero en Comunicaciones y Electrónica de la Escuela Superior de Ingeniería Mecánica y Eléctrica, Unidad Culhuacan, México en 2003. Actualmente está realizando su tesis para obtener el grado de Maestro en Ciencias de Ingeniería
en Microelectrónica de la ESIME UC. Trabaja para el Sistema de Transporte Colectivo Metro adquiriendo experiencia en el área de Peaje de la Gerencia de Instalaciones Fijas.
84
Gonzalo Duchén, recibió el título de Ingeniero en Electrónica de la Universidad Autónoma Metropolitana, Unidad Iztapalapa, México en 1987, obteniendo la medalla al Mérito Universitario por sus calificaciones. Actualmente es Candidato a Doctor por la Pacific Western University, USA. De
1987 a 1997 trabajó en el Departamento de Ingeniería Eléctrica de la UAM Iztapalapa, donde fue Coordinador de la Carrera de Ingeniería Electrónica y Jefe del Área de Sistemas Digitales. En 1997 fundó, junto con otros profesores la Sección de Estudios de Posgrado e Investigación de la ESIME, Unidad Culhuacan, del Instituto Politécnico Nacional en México D.F., donde fue Coordinador de la Maestría en Microelectrónica. Sus líneas de investigación principales son el diseño de sistemas digitales con énfasis en dispositivos programables y aplicaciones al procesamiento digital de señales y la criptografía. Es miembro de la IEEE desde 1991. Le gusta la lectura y la música, en especial Beethoven, The Beatles y Les Luthiers.
Juan Carlos Sánchez recibió su título de Ingeniero en Electrónica y su grado de Doctor en Ingeniería Eléctrica de la Universidad Autónoma Metropolitana, México en 1987 y 2000, respectivamente. De 1987 a 1992 trabajó en el Departamento de Ingeniería Eléctrica de la
UAM Iztapalapa como profesor. En febrero de 1997 se unió a la Sección de Estudios de Posgrado e Investigación de la ESIME, Unidad Culhuacan, del Instituto Politécnico Nacional en México D.F., donde ahora es profesor. Sus líneas de investigación principales son algoritmos de filtros adaptables, VLSI para las comunicaciones y campos relacionados. Es miembro de la IEEE, IEICE y la SNI de México.
85
Apéndice B. Programas realizados en VHDL. utilidades.vhd LIBRARY ieee; USE ieee.std_logic_1164.ALL; PACKAGE utilidades IS SUBTYPE palabra IS std_logic_vector(11 DOWNTO 0);--Palabra de 12 bits. SUBTYPE palabra_doble IS std_logic_vector(23 DOWNTO 0);--Palabra de 24 bits. TYPE palabra_matriz IS ARRAY (NATURAL RANGE <>) OF palabra;--Matriz de 'palabra'. TYPE palabra_matriz_doble IS ARRAY (NATURAL RANGE <>) OF palabra_doble;--Matriz de 'palabra_doble'. END utilidades; componentes.vhd LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE work.utilidades.ALL; PACKAGE componentes IS COMPONENT shiftreg_PISO IS PORT ( D : IN palabra; EN : IN std_logic; clk : IN std_logic; Q : OUT std_logic ); END COMPONENT; COMPONENT shiftreg_SIPO IS PORT ( Din : IN std_logic; clk : IN std_logic; Q : OUT palabra ); END COMPONENT; COMPONENT tapfir IS PORT (Xn, h : IN palabra;
86
Yn : IN palabra_doble; START, CLK, RST, RSTTAP, c : IN std_logic; T : OUT std_logic; Xn_1 : OUT palabra; Yn_1 : OUT palabra_doble); END COMPONENT; COMPONENT tapiir IS PORT (Xm, a1k, a2k, b1k, b2k : IN palabra; START, CLK, RST, RSTTAP, c : IN std_logic; T : OUT std_logic; Ym : OUT palabra); END COMPONENT; COMPONENT full_booth IS PORT (A, B : IN palabra; start, clock, reset : IN std_logic; LD : OUT std_logic; Product : OUT palabra_doble); END COMPONENT; COMPONENT reg24 IS PORT (D : IN palabra_doble; clk, clr : IN std_logic; Q : OUT palabra_doble); END COMPONENT; COMPONENT reg IS PORT (D : IN palabra; clk, clr : IN std_logic; Q : OUT palabra); END COMPONENT; COMPONENT sumres4 IS PORT (A, B : IN std_logic_vector(3 DOWNTO 0); S1, S2, Ci : IN std_logic; Result : OUT std_logic_vector(3 DOWNTO 0)); END COMPONENT; COMPONENT sumres24 IS PORT (A, B : IN palabra_doble; S1, S2, Ci : IN std_logic; Result : OUT palabra_doble); END COMPONENT;
87
COMPONENT sumres IS PORT(A, B : IN palabra; S1, S2, Ci : IN std_logic; Result : OUT palabra); END COMPONENT; COMPONENT mux21 IS PORT (A, B : IN palabra; sel : IN std_logic; W : OUT palabra); END COMPONENT; COMPONENT reg2 IS PORT(D : IN std_logic_vector(1 DOWNTO 0); clk, clr : IN std_logic; Q : OUT std_logic_vector(1 DOWNTO 0)); END COMPONENT; COMPONENT shiftreg24 IS PORT(D : IN palabra_doble; Din, clk, clr : IN std_logic; Q1 : OUT std_logic; Q : OUT palabra_doble); END COMPONENT; COMPONENT or1 IS PORT(A : IN palabra; Z : OUT std_logic); END COMPONENT; COMPONENT cc IS PORT(Input : IN std_logic_vector(1 DOWNTO 0); Output : OUT std_logic_vector(2 DOWNTO 0)); END COMPONENT; COMPONENT flipflopd IS PORT (D, clk, clr : IN std_logic; Q : OUT std_logic); END COMPONENT; COMPONENT counter IS PORT (D : IN integer range 0 TO 12; clk, clr : IN std_logic; TC : OUT std_logic; Count : OUT integer range 0 TO 12);
88
END COMPONENT; COMPONENT control_m IS PORT (init, clk : IN std_logic; clks, clkc, load, trig : OUT std_logic); END COMPONENT; COMPONENT booth_multiplier IS PORT (Am, Bm : IN palabra; LD, clkcomp, rst, clkshift : IN std_logic; R : OUT palabra_doble); END COMPONENT; END componentes; booth_multiplier.vhd LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE work.utilidades.ALL; USE work.componentes.ALL; ENTITY booth_multiplier IS PORT (Am, Bm : IN palabra; LD, clkcomp, rst, clkshift : IN std_logic; R : OUT palabra); END booth_multiplier; ARCHITECTURE estructura OF booth_multiplier IS SIGNAL inshift, outshift : palabra_doble; SIGNAL datashifta, datashiftb, dataor, datasumres : palabra; SIGNAL dataacum, dataa, datamux : palabra; SIGNAL dataff, datasalff : std_logic_vector(1 DOWNTO 0); SIGNAL datacc : std_logic_vector(2 DOWNTO 0); SIGNAL datasalor, dataq, data : std_logic; BEGIN dataff <= datamux(0) & dataq; inshift <= (datasumres & dataor); datashifta <= outshift(23 DOWNTO 12); datashiftb <= outshift(11 DOWNTO 0); latcha : reg PORT MAP (Am, LD, rst, dataa); latchacum : reg PORT MAP (datashifta, LD, rst, dataacum);
89
orgate : or1 PORT MAP (dataor, datasalor); mux2 : mux21 PORT MAP (Bm, datashiftb, datasalor, datamux); latchmux : reg PORT MAP (datamux, LD, rst, dataor); ffQ : reg2 PORT MAP(dataff, clkcomp, rst, datasalff); combcir : cc PORT MAP (datasalff, datacc); sumrest : sumres PORT MAP (dataacum, dataa, datacc(0), datacc(1), datacc(2), datasumres); shiftr : shiftreg24 PORT MAP (inshift, inshift(23), clkshift, rst, dataq, outshift); R <= outshift(23 DOWNTO 12); END estructura; control_m.vhd LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE work.componentes.ALL; ENTITY control_m IS PORT (init, clk : IN std_logic; clks, clkc, load, trig : OUT std_logic); END control_m; ARCHITECTURE estructura OF control_m IS SIGNAL s1, s2, s3, s2n, trigger, one, q : std_logic; SIGNAL di, c : integer range 0 TO 12; BEGIN di <= 12; one <= '1'; s2n <= NOT (s2); q <= trigger OR init; ff1 : flipflopd PORT MAP (s2n, clk, q, s1); ff2 : flipflopd PORT MAP (s1, clk, q, s2); ff3 : flipflopd PORT MAP (s2, clk, q, s3); count : counter PORT MAP (di, s1, one, trigger, c); clks <= s1; clkc <= s2; load <= s3; trig <= trigger; END estructura; tapfir.vhd LIBRARY ieee; USE ieee.std_logic_1164.ALL;
90
USE work.componentes.ALL; USE work.utilidades.ALL; ENTITY tapfir IS PORT (Xn, h : IN palabra; Yn : IN palabra; START, CLK, RST, RSTTAP, c : IN std_logic; T : OUT std_logic; Xn_1 : OUT palabra; Yn_1 : OUT palabra); END tapfir; ARCHITECTURE estructura OF tapfir IS SIGNAL s1, s2, s3, one, zero, sigld, tr : std_logic; SIGNAL sigxn1 : palabra; SIGNAL sigmult : palabra; BEGIN one <= '1'; zero <= '0'; retardo : reg PORT MAP (Xn, c, RSTTAP, sigxn1); mult : full_booth PORT MAP (sigxn1, h, START, CLK, RST, T, sigmult); sum : sumres PORT MAP (sigmult, Yn, one, zero, zero, Yn_1); Xn_1 <= sigxn1; END estructura; tapiir.vhd LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE work.componentes.ALL; USE work.utilidades.ALL; ENTITY tapiir IS PORT (Xm : IN palabra; a1k, a2k, b1k, b2k : IN palabra; START, CLK, RST, RSTTAP, c : IN std_logic; T : OUT std_logic; Ym : OUT palabra); END tapiir; ARCHITECTURE estructura OF tapiir IS
91
SIGNAL one, zero : std_logic; SIGNAL talt : std_logic_vector(3 DOWNTO 1); SIGNAL sigxml, sigxmh, co_a1, co_a2, yalt : palabra; SIGNAL sigreg1, sigreg2 : palabra_doble; SIGNAL sigsum : palabra_matriz_doble (4 DOWNTO 0); SIGNAL sigmult : palabra_matriz_doble (4 DOWNTO 1); BEGIN one <= '1'; zero <= '0'; sigxml <= Xm; sigxmh <= "000000000000"; sigsum(0) <= sigxmh & sigxml; coea1 : sumres PORT MAP (sigxmh, a1k, zero, one, one, co_a1); coea2 : sumres PORT MAP (sigxmh, a2k, zero, one, one, co_a2); retardo1 : reg24 PORT MAP (sigsum(1), c, RSTTAP, sigreg1); retardo2 : reg24 PORT MAP (sigreg1, c, RSTTAP, sigreg2); sum1 : sumres24 PORT MAP (sigsum(0), sigsum(2), one, zero, zero, sigsum(1)); sum2 : sumres24 PORT MAP (sigmult(2), sigmult(1), one, zero, zero, sigsum(2)); sum3 : sumres24 PORT MAP (sigmult(3), sigmult(4), one, zero, zero, sigsum(3)); sum4 : sumres24 PORT MAP (sigsum(3), sigsum(1), one, zero, zero, sigsum(4)); mult1 : full_booth PORT MAP (sigreg1(23 DOWNTO 12), co_a1, START, CLK, RST, talt(1), sigmult(1)); mult2 : full_booth PORT MAP (sigreg2(23 DOWNTO 12), co_a2, START, CLK, RST, talt(2), sigmult(2)); mult3 : full_booth PORT MAP (sigreg2(23 DOWNTO 12), b2k, START, CLK, RST, talt(3), sigmult(3)); mult4 : full_booth PORT MAP (sigreg1(23 DOWNTO 12), b1k, START, CLK, RST, T, sigmult(4)); Ym <= sigsum(4)(23 DOWNTO 12); END estructura; protfir.vhd LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE work.componentes.ALL; USE work.utilidades.ALL; USE work.coefir.ALL; ENTITY filtfir IS PORT (X : IN palabra; S, C, R, RT : IN std_logic; U : OUT std_logic; Y : OUT palabra);
92
END filtfir; ARCHITECTURE estructura OF filtfir IS SIGNAL trm : std_logic; SIGNAL tr : std_logic_vector(z-1 DOWNTO 2); SIGNAL co : palabra_matriz(z-1 DOWNTO 0); SIGNAL xn : palabra_matriz(z-1 DOWNTO 1); SIGNAL yalt : palabra; SIGNAL gainsig : palabra_matriz(z-2 DOWNTO 0); BEGIN* trm <= NOT (S); gain0 : full_booth PORT MAP (X, co(0), S, C, R, U, gainsig(0)); n_tap: FOR i IN 1 TO z-1 GENERATE lsbg: IF (i = 1) GENERATE tap1 : tapfir PORT MAP (X, co(i), gainsig(i-1), S, C, R, RT, trm, tr(i), xn(i), gainsig(i)); END GENERATE lsbg; mbg: IF (i /= 1 AND i /= z-1) GENERATE tapn : tapfir PORT MAP (xn(i-1), co(i), gainsig(i-1), S, C, R, RT, trm, tr(i), xn(i), gainsig(i)); END GENERATE mbg; msbg: IF (i = z-1) GENERATE tapfin : tapfir PORT MAP (xn(i-1), co(i), gainsig(i-1), S, C, R, RT, trm, tr(i), xn(i), yalt); END GENERATE msbg; END GENERATE n_tap; Y <= yalt; END estructura;-- protiir.vhd LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE work.componentes.ALL; USE work.utilidades.ALL; USE work.coeiir.ALL; ENTITY filtiir IS
93
PORT (X : IN palabra; S, C, R, RT : IN std_logic; U : OUT std_logic; Y : OUT palabra); END filtiir; ARCHITECTURE estructura OF filtiir IS SIGNAL trm : std_logic; SIGNAL tr : std_logic_vector(z DOWNTO 2); SIGNAL co_a1 : palabra_matriz(z DOWNTO 1); SIGNAL co_a2 : palabra_matriz(z DOWNTO 1); SIGNAL co_b1 : palabra_matriz(z DOWNTO 1); SIGNAL co_b2 : palabra_matriz(z DOWNTO 1); SIGNAL gainsig : palabra_matriz(z-1 DOWNTO 1); BEGIN* trm <= NOT (S); H1 : tapiir PORT MAP (X, co_a1(1), co_a2(1), co_b1(1), co_b2(1), S, C, R, RT, trm, U, gainsig(1)); n_tap: FOR i IN 2 TO z-1 GENERATE Hi : tapiir PORT MAP (gainsig(i-1), co_a1(i), co_a2(i), co_b1(i), co_b2(i), S, C, R, RT, trm, tr(i), gainsig(i)); END GENERATE n_tap; Hn : tapiir PORT MAP (gainsig(z-1), co_a1(z), co_a2(z), co_b1(z), co_b2(z), S, C, R, RT, trm, tr(i), Y); END estructura;--
94
Apéndice C. Programas realizados en Turbo C++.
Para solicitar y revisar los programas realizados en Turbo C++, enviar un correo