Escrito por Guillermo Acevedo
 
Diseño
 
En esta practica desarrollaremos un filtro FIR en hardware, para este caso en especifico, realizaremos un filtro rechaza-banda para ventana Hamming entre 3000Hz y 13000Hz de orden 20 con una frecuencia de muestreo de 44100Hz, para lograr esto, utilizaremos el siguiente diseño:
Como observamos en la imagen, lo primero que tenemos que hacer es buscar el NCO en los open cores, y conectarlo a una ROM hecha en la FPGA para tomar diferentes valores de frecuencia, este tiene como salida una señal que simula una señal seno con la frecuencia deseada, utilizaremos un modulo llamado  waveform_gen, este esta escrito en VHDL, asi que realizamos la instanciación en verilog y lo instanciamos en nuestro modulo principal. Simulamos el modulo  waveform_gen y el resultado de el es:
 
Ver una señal análoga Modelsim parece difícil cuando se ve, pero en realidad se puede realizar fácilmente de la siguiente manera:
Para lograr esto, damos click derecho sobre la señal que queremos ver, escogemos la opcion de format y pinchamos en analog (automatic), para que automáticamente de el tamaño de la señal y no salga de los margenes que se nos da para dibujar la señal.
 
 
 
Creamos luego el modulo div_freq y colocamos en su entrada 31'd566, el cual hace referencia a una frecuencia de 44100Hz.
El siguiente es la ROM para las frecuencias que vamos a pasar para el NCO, para eso utilizamos el principio de la multiplexión de señales y las controlaremos por medio de los SW que tenemos en la tarjeta, para esto utilizamos la formula dada por el creador del modulo waveform_gen para generar las frecuencias.
Dependiendo de la señan de los sw sale una valor que es enviado al NCO para producir las señales senoidales
 
 
 
Procedemos ahora a crear nuestro modulo FIR, para el cual, debemos obtener primero los coeficientes del filtro en Matlab, para ello utilizaremos el código de FIR SW Design, este nos da unos coeficientes entre 0 y 1, nosotros tenemos que escalarlos para ingresarlos facilmente en la FPGA y no trabajar con decimales, utilizaremos para este caso un escalonaje de 8 bits, es decir, multiplicaremos los valores dados anteriormente por 256, es decir 2^8. El filtro hecho con Matlab queda como:
Con coeficientes de 
-0,00148636112047322 0,000610781534272632 -0,00669201059088164 -0,00275624156299243 0,0303606416472069 0,0219128277898686 0,00449108715728677 0,132599993943691 0,179821495619680 -0,165922289863956 0,543677517903215 -0,172948355895413 0,195655602021611 0,151061333326642 0,00538349072957317 0,0278386935227264 0,0412726372637053 -0,00404892024397716 -0,0105945089674328 0,000972578512282662 -0,00186606153195758
respectivamente
al escalonar estas variables, el resultado es:
 
Como podemos observar en la imagen, se desplaza el filtro en su magnitud en dB, sus coeficientes quedan:
 0     0     1     0    -3    -6     2    15    13    -9   233    -9    13    15     2    -6    -3     0     1     0     0
respectivamente
 
Ya que hay números negativos, tenemos que pasar todo a complemento a 2 y a hexadecimal, haciendo esto, nos quedan los valores:
0000    0000    0001    0000    FFFD    FFFA    0002    000F    000D    FFF7    00E9    FFF7    000D   000F    0002    FFFA    FFFD    0000    0001    0000     0000
respectivamente  
Guardamos esto en un archivo llamado coef.txt, el cual utilizaremos mas adelante.
 
Creamos nuestro modulo fir, con sus respectivas señales de entrada y salida:
 
Necesitamos un clk, una entrada de audio, que es por donde entra nuestra señal senoidal, audio_out es nuestra salida, los coef, que son para ingresar coeficientes desde el NIOS II, pero aqui no se hablara de eso, y una entrada para los SW.
Se crean registros para la entrada de los valores senoidales, ya que son 21 coeficientes, solo pueden haber 21 valores en los registros de entrada, se crean 2 cables para realizar en ellos las operaciones correspondientes.
 
 
Debemos llegar a este diseño, que es como funciona este tipo de filtros:
Donde z^-1 significa un retardo, es decir, el dato anterior de la entrada, y en los amplificadores se colocan los valores de los coeficientes hallados anteriormente, luego de esto, se realiza la suma de todos los valores hasta llegar a un valor final, como el filtro es de orden 20 tenemos 21 coeficientes, es decir, tendremos 21 retardos, 21 amplificadores y 20 sumas.
Seguido a esto, inicializamos los coeficientes, para eso utilizaremos initial $readmemh para leer un archivo, entonces colocamos:
 
 
Luego de eso, inicializamos los valores de la dirección [0] de los registros y de los cables, es decir, vamos a tomar los valores en la entrada del NCO cada pulso de reloj, también tomaremos los de coef. En el caso de multi[0] va a ser igual al valor de la entrada en la posicion [0] por el valor del coef en la direccion [0], y sum[0] sera multi de la posición [20] +multi de la posición [19], el valor de la suma [19] que sera la ultima, sera la salida del sistema escalada 8 bits, es decir, la salida no tomara los 8 bits menos significativos que serian los 256 que multiplicamos al escalar en Matlab.
 
Ahora utilizamos los generate para realizar las asignaciones, donde vamos a realizar las sumas, de la suma anterior con la siguiente multiplicación en el primer generate y en el segundo se pasa el valor del registro al siguiente registro y borra el ultimo valor, para los valores de la seniodal y para los coeficientes.
 
Luego instanciamos en verilog nuestro modulo y lo pegamos en nuestro modulo principal
 
Se crean algunos cables, como el de clk_44100 que es el que lleva la señal de la salida del div_freq al FIR, el cable seno transporta transporta la señal de salida del NCO,  audio_out_fir, es la salida del FIR y se conecta al multiplexor, el cual dependiendo del estado del KEY[0] deja pasar la señal de salida del FIR o la del NCO.
 
Para finalizar debemos instanciar el modulo del dac, y conectar los cables de entrada del multiplexor y su salida seria la frecuencia analogica.
 
Por ultimo, tenemos la simulación del filtro, en Modelsim, en la cual tenemos un modulo con la generación de la señal seno, la selección de la frecuencia, para alguna de las guardadas en la ROM, y tenemos el filtro, el cual, como podemos observar en la siguiente figura, tenemos una onda seno con diferentes frecuencias, podemos observar que sus amplitudes son las mismas, cuando observamos la señal filtrada, nos damos cuenta de que los valores de las frecuencias son iguales, pero dependiendo de la frecuencia utilizada la señal se atenúa, cuando tenemos un 110 en la señal del SW, obtenemos la máxima atenuación, cabe resaltar que se puede llegar a mejores resultados si se utiliza otro tipo de ventana, si aumentamos la precisión o si aumentamos el numero de bits en el escalamiento.
 
En el siguiente link podrán encontrar los diferentes archivos utilizados en esta practica, el programa completo con los módulos en un .qar de quartus, el archivo de los coeficientes en un .txt y el archivo de Matlab con el cual se tomaron los coeficientes, y el código utilizado para la simulación del filtro. https://github.com/Adrizcorp/ece10243upb2016/tree/master/Estudiantes/guillermo/archivos_FIR
 
 
 
 
 
 
Referencias

 

 
Welcome to FPGA lover!!!
 
I invite you to take a look at the new manuals on the web page, and have a tour, Enjoy, and Love FPGAs and Embedded Systems!
 
Cheers!
 
 

Saturday, 18 September 2021

  Written By Peter Gomez Este contenido esta orientado a los programadores que tienen problema con la conectividad("SGC PmmC") de su pantalla uOled-128-g1/g2 de 4d-Systems con el sotfware 4D workshop 4 IDE. Antes de todo, recordar que para programar esta pantalla no se puede conectar mediante un arduino como puente serial ya que no será compatible para el software. La única forma es con el 4D Programming Cable o USB-PA5-II.     Si al conectar el 4D programming cable a...

Explore

Thursday, 09 September 2021

Written by Sherneyko Plata Rangel   Pynq-z2: Hello world   In this tutorial we will implement a simple test of the inputs/outputs available on our board, in order to familiarize with it and test that we can program it without any issues.   First we will start a project from scratch, on Vivado, in this case we will use Vivado 2019.1, some options may vary depending on the version you are using: Then we will name our project, and its path. We will create an empty RTL project. We...

Explore

Wednesday, 01 September 2021

Objetivos Requerimientos Procedimiento Descripción de Hardware. Qsys. Nios II. UCOS II. Secuencia de Sprite. Sintesis de Audio. Descargas Glosario Otros Resultados. Ejemplo de Sprites.     Objetivos: Diseñar una plantilla general para el diseño de Juegos Retro Usando Verilog HDL. Aprender a Diseñar Escenarios para Juegos Retro. Hacer animaciones usando Sprites sobre la pantalla VGA usando Verilog HDL. Hacer sintesis de sonido para juegos retro usando...

Explore

Thursday, 26 August 2021

Written by Holguer A. Becerra           Requerimientos: DE0-NANO USB-UART(solo para parte 3) Python 2.7 ó superior.   Objetivos: Dar una introducción a los conceptos de Multitasking, Scheduling y Context Switching. Introducir al estudiante al mundo de los sistemas operativos en tiempo real. Hacer descripción de hardware basica compatible con RTOS(Real-Time Operating Systems). Correr un sistema operativo de tiempo real sobre el soft-core Nios...

Explore

  Written By Peter Gomez Este contenido esta orientado a los programadores que tienen problema con la conectividad("SGC PmmC") de su pantalla uOled-128-g1/g2…
Written by Sherneyko Plata Rangel   Pynq-z2: Hello world   In this tutorial we will implement a simple test of the inputs/outputs available on…
Objetivos Requerimientos Procedimiento Descripción de Hardware. Qsys. Nios II. UCOS II. Secuencia de Sprite. Sintesis de Audio. Descargas Glosario Otros Resultados. Ejemplo de Sprites.     Objetivos: Diseñar una plantilla general para el diseño de…
Written by Holguer A. Becerra           Requerimientos: DE0-NANO USB-UART(solo para parte 3) Python 2.7 ó superior.   Objetivos: Dar una introducción a los conceptos de Multitasking, Scheduling y…
Written by Holguer A. Becerra             Based on Gregory Estrade's Work.   I have ported the PC Engine System on the DE0-NANO back in 2014, why…
      Arduino tools are generally nice tools for quick prototyping and improvized projects, and the Seeeduino Xiao…
Written by: Holguer A Becerra         En esta practica vamos a construir nuestro primer juego retro  usando un sincronizador de Video VGA…
Written by: Andrea Paola Pabón Ortega & Daniel Enrique Mejia Rueda Revision by: Ing Holguer A. Becerra   DESCRIPCIÓN DEL PROYECTO: El  RTAWD DE0NANO…
  Written by Holguer Andres   Requires: DE0-NANO. 4.3 Inch 480x272 Screen.( WQVGA ) ?️       Parte HW: Descargue la siguiente plantilla( DE0_NANO_TFT_PSP.zip) y descomprimala en una ruta sin espacios y…
Escrito por Guillermo Acevedo   Diseño   En esta practica desarrollaremos un filtro FIR en hardware, para este caso en especifico, realizaremos un filtro…
 Written By Juan David Delgado   FILTRO FIR (FILTRO DE RESPUESTA FINITA AL IMPULSO)     Son conocidos como filtros digitales no recursivos debido a…
XISCKER: Reduced and Complex Instruction Set Computing Key Educational Resources A Configurable Platform for the Emulation of Different Computer Architectures An introduction to Computer Architectures through digital design description for FPGA devices   Computer Architecture embraces all three…
Escrito por: Alix Angarita   En el manual a continuación se explica un método de debug adicional que es muy interesante debido a…
By: Fabio Hernández   INTRODUCCIÓN:   El presente documento pretende mostrar la manera de generar software para una imagen de Linux implementada en la…
Summary Written by Fabio Hernandez   HARD PROCESSOR SYSTEM (HPS)     ------------------------------------------------------------------------------------------------------------------------------------------------   Introducción   Tenemos  2 nuclos de procesamiento ARM cortex-A9, cada uno son su propio cache  se…
Escrito por Jesus Lopez         INTRODUCCIÓN   El acceso directo a memoria (DMA, del inglés direct memory access) permite a cierto tipo de componentes de una computadora acceder a…
    Written by  Sebastian Baquero       Objetivos  Introducción a los conceptos de Multitasking, Scheduling y Context Switching.  Ampliación de los conceptos a cerca de el…