2010-II/es/proyectocc dig2 2010

From Qi-Hardware
< 2010-II | es(Redirected from Piano Digital)
Jump to: navigation, search

PIANO DIGITAL

Piano.jpg

Integrantes Carol Bibiana Rojas Hurtado, Camilo Andrés Osorio Romero


Contents

[edit] Calificación

Porcentaje Presentación 20% Informe 30% Funcionamiento 50%
1 Entrega 10% 0.5 0.5 0.5
2 Entrega 30% 1.7 1.7 1.7
3 Entrega 20% 4 4 4
4 Entrega 40% 4 4 5


Este proyecto de Digital II consiste en implementar un piano digital mediante la FPGA de la tarjeta SIE y el procesador LatticeMico32. El dispositivo contará con un teclado de una octava y tendrá varios ajustes de timbre para diferentes instrumentos musicales.

[edit] ESPECIFICACIONES

[edit] Físicas

Inicialmente las dimensiones del dispositivo son 25cmX20cmX5cm.

[edit] Temporales

El sonido sintetizado para cada tecla está dado por el proceso de síntesis substractiva, luego como se debe realizar el mismo proceso para cada tecla, se necesita de hardware que permita el manejo concurrente de esto para posteriormente realizar la reproducción del sonido, de manera tal que el retardo entre estas operaciones se muestren imperceptibles para el usuario.

[edit] Funcionales

Las principales características de este proyecto son:

  • Un teclado que consta de 12 teclas que corresponden a una octava.
  • Consta de una opción que le permite al usuario elegir entre dos tipos de instrumentos musicales.
  • Una pantalla de visualización de las opciones que tiene el usuario mencionadas anteriormente.
  • La síntesis del sonido a partir de un procedimiento de síntesis substractiva y basado en el instrumento elegido.

[edit] PARTICIONAMIENTO

[edit] Tareas Hardware

  • Obtener datos del teclado de una octava y de los botones de navegación que permiten al usuario realizar la elección de instrumento y octava.
  • Uso de un timer para lograr diferentes efectos en la duración de una nota.
  • Sintetizar el sonido que será reproducido de acuerdo a la opción de instrumento y de octava elegida la nota y la intensidad. Se busca que el usuario determine el tipo de sonido que quiera de acuerdo a una envolvente (ver apartado de síntesis de sonido).
  • Reproducir el sonido derivado de la tarea anterior.

[edit] Tareas Software

  • Manejo de lo que se visualizará en la LCD.
  • Control general del proceso de síntesis y reproducción del sonido


[edit] DIAGRAMA DE FLUJO

El funcionamiento general del dispositivo se muestra en el diagrama de flujo.

[edit] BLOQUES

Básicamente se hará el uso de 3 periféricos: Uno correspondiente al GPIO que recibe las señales del teclado, envía el pulso de salida al circuito de audio y las instrucciones y datos a la LCD, otro correspondiente a la SÍNTESIS encargado de recibir los datos del gpio, procesar el dato determinado por la frecuencia de la nota y envíar los datos de la forma de onda al PWM, este ultimo que se encarga de realizar la conversión digital a análogo por medio de una modulación de ancho de pulso para enviar nuevamente el dato a la GPIO y de ahí al circuito de audio externo. finalmente el periferico de una LCD.

Los circuitos de teclado y audio son los circuitos que se implementarán en una tarjeta externa al SIE ademas de la conexion a la LCD.

[edit] Circuito teclado

El módulo correspondiente al circuito de teclado es básicamente un pulsador por cada tecla que se encarga de enviar la señal de entrada a la GPIO del MICO32 para generar el sonido. Básicamente el modelo del teclado que se empleará está tomado de una octava de una organeta, ésta cuenta con un soporte central que pasa por el medio de cada tecla en donde se ubicaran los pulsadores. Las teclas, luego de pulsadas regresan a la posición de reposo debido a que se encuentran sujetas con tornillos en uno de sus extremos. Con el fin de evitar señales no deseadas y un mal funcionamiento al momento de detectar el pulso por cada tecla, se implementará un debouncer por cada una.

[edit] Circuito audio

El circuito externo de audio se compone de un filtro pasa bajo RC que recibe la señal de salida del conversor DAC para obtener la forma de onda análoga, luego se emplea un amplificador de audio para posteriormente llevar esta señal a un altavoz de manera que se escucha la nota tocada.


[edit] Esquemático y PCB de tarjeta hija

A continuación se muestra el diagrama esquemático de la tarjeta que se debe elaborar junto con el PCB. La primera se puede dividir en tres partes que son: el modulo que conecta el teclado con la tarjeta SIE, el modulo del circuito de audio que consiste de un filtro pasa bajos y una etapa de amplificación con un LM386 hacia un altavoz y el módulo del manejo de la LCD. El módulo de amplificación necesita de una fuente de alimentación externa de 4 a 12 V, se utilizará de 5 V que se derivan de una conexion USB de un computador. Acontinuacion se muestra el circuito de amplificacion.

[edit] Circuito de audio

[edit] PCB

El esquema que se muestra a continuación tiene los conectores de las 12 teclas mas uno para un pulsador que vienen de un cable ribbon, el conector de la LCD, el Header que irá directamente a la tarjeta SIE, el filtro pasabajas y el amplificador de audio LM386. La manera con la cual se alimentara la tarjeta sera por medio de una conexion USB desde un computador que se conectará directamente a la tarjeta (conector USB mini), luego desde esta se conectara la SIE por medio del conector USB Tipo A.


Una vez definidos los circuitos externos a continuación se descomponen los bloques para cada periférico.

[edit] PERIFERICOS

El proyecto contienene 3 perifericos cuyo mapa de memoria esta definido como

Mapa de Memoria

  • GPIO 0XF0020000
  • lcd 0xF0030000
  • Síntesis 0xF0040000


[edit] GPIO

Como se menciono anteriormente este es el periferico encargado de manejar las entradas y salidas, la entradas son las que por medio de la tarjeta hija llegaran de los pulsadores de las teclas de cada nota y este llevara estos datos al periferico de sintesis. Por otro lado solo se empleara una salida que corresponde al PWM para llevarla al circuito de audio externo. De esta manera los registros que se emplearon son los siguientes:

Descripcion de registros

Direccion base en 0xF0020000

Nombre Registro direccion
gpio_entrada 0x00
gpio_salida 0x04

Lo primero que se debe hacer para el correcto funcionamiento en la detección de entradas es un debouncer, ya que como la señal de cada una de las teclas proviene de un elemento mecánico (un pulsador), éste produce un ruido posterior a su pulsación y por tanto para una correcta detección de las señales de entrada se hace el modulo que se muestra a continuación, cuya función se resume en verificar el estado de una entrada que es asíncrona, pasarla por elementos que la vuelvan síncrona y llevar un contador según el tiempo en el cual se presenta el ruido. Acontinuacion se presenta el diagrama de flujo para este modulo.


La simulación del funcionamiento del módulo se puede examinar a continuación donde se puede observar como el estado de deb_key (debounced key) no cambia hasta que el contador no llega a su máximo valor y tras la próxima entrada de tecla.


[edit] Síntesis del Sonido

La obtención del sonido se realizará mediante el método de síntesis substractiva, el cual consiste básicamente en hacer pasar por una serie de filtros una señal generada por un oscilador. Como es sabido cada determinado sonido que produce una nota esta compuesto por armónicos de una frecuencia fundamental (un armónico es una onda que cuya frecuencia es un múltiplo de una frecuencia fundamental determinada), así la idea de este tipo de síntesis es usar un oscilador que produzca un amplio rango de armónicos y por medio de filtros sustraer los que no se requieran para producir una determinada nota. Un ejemplo de un tipo de onda armónicamente rica es la forma de diente de sierra que posee casi todos los tipos de armónicos. En la siguiente Tabla se encuentran las frecuencias de las notas que se necesitan generar según la octava.

Tabla de Frecuencias

NOTA Frecuencia Real Hz Frecuencia generada
Do 261,63 260,41
Do# 277,18 279,01
Re 293,66 294,81
Re# 311,13 312,50
Mi 329,63 332,44
Fa 349,23 347,22
Fa# 369,99 372,02
Sol 392,00 390,62
Sol# 415,30 411,18
La 440 434,02
La# 466,16 459,55
Si 493,88 488,28

La síntesis consta de los siguientes submódulos como se observa en el diagrama:

  • Las entradas del GPIO llegan para seleccionar a que nota corresponden y segun esto activar un oscilador.
  • Osciladores que generan las formas de onda (una onda diente de sierra).
  • Filtro pasabanda que selecciona el rango de armonicos que se conservaran para cada nota.
  • Generador de Envolvente GE el cual permite controlar la amplitud de la onda en el tiempo, el tono del sonido en el tiempo, algunos efectos de modulación.
  • La señal obtenida se convierte en una salida PWM que ira al circuito de audio externo.

Los registros empleados para este periferico son:

Descripción de registros

la direccion base en este caso se establecio en 0xF0030000

Nombre Registro direccion bits
data 0x00 [[18'b0 | teclado | pulse_data]
cs 0x04 [[30'b0 | start | busy_pwm]
  • Teclado corresponde al registro que contiene los datos de entrada provenientes del GPIO, es decir, si existe una tecla que ha sido oprimida y cuál ha sido, un 1 indica que la tecla está oprimida. (RO)
  • pulse_data es la salida del PWM (WO)
  • El flag busy_pwm indica que el periférico está ocupado realizando la síntesis de una o más teclas que se hayan tocado. el flag start actua como chip select.

[edit] Diagrama de bloques de Síntesis

A continuación se enuncian los principales pasos de la síntesis graficados en matlab para una tecla de prueba correspondiente a Do.


A continuacion se muestran en detalle los elementos de cada submodulo:

[edit] Selección

La función del submódulo selección es la de recibir los datos de las teclas presionadas pasadas por el periferico GPIO y de acuerdo a esto generar una señal de habilitación que posteriormente llegará al submódulo oscilador. Este además recibe una señal de start para iniciar este proceso.

[edit] Oscilador

La función del submódulo oscilador es la de recibir la señal de habilitación determinada en el submódulo selección y elegir entre 12 osciladores según la tecla oprimida, los cuales generan una señal de diente de sierra (ver figura), muestreada a una frecuencia de 15625 Hz (periodo de muestreo de 64 us) con una resolución de 6 bits y con una frecuencia que corresponde a la nota. Estas frecuencias son las mostradas en la Tabla de frecuencias (arriba) cuyo valor se aproxima por facilidad descartando los decimales. Las entradas de este submódulo son la señal de habilitación, el valor del número de muestras según la nota debido a su frecuencia y un factor que es el que determina el valor de la amplitud en cada muestra (el calculo para DO se muestra en los comentarios del modulo y el cálculo de nmuestras se ve en la figura). La salida de este submódulo es entonces los posibles valores de amplitud para cada muestra.


El calculo del factor para cada nota se hace de la siguiente manera para do, m=64/60=1.06 , se toma 106, fac*nmuestras/128=64, fac=136. aqui el nmuestras es el calculado en la figura de arriba y m es como la pendiente de la recta inicial de la señal diente de sierra.

[edit] Filtro digital

En esta etapa con la salida derivada del módulo de oscilación se debe ahora filtrar la señal para eliminar las componentes de frecuencia que no se desean en cada nota. La manera de lograr esto es mediante la implementación de un filtro digital. Los filtros digitales se dividen en dos los FIR y los IIR cada uno presenta varias ventajas o desventajas para su implementación en hardware, el primero por ejemplo, requiere mas recursos hardware que un filtro IIR pero presentan la ventaja de ser siempre estables por lo cual se utilizan en aplicaciones de audio tambien porque no generan desfasamiento de la señal filtrada. Entre tanto el segundo es de naturaleza recursiva y realimentada así aunque necesita menos recursos hardware no es conveniente para aplicaciones de audio ya que se debe tener cuidado en su diseño para evitar inestabilidad y genera un cambio de fase.

Así entonces se ha elegido trabajar con filtros FIR, estos básicamente funcionan muestreando la señal de entrada aplicándole un retardo a esta de acuerdo al orden del filtro que ademas determina el numero de coeficientes del mismo, y multiplicándole estos coeficientes a cada retardo para luego sumar todos los posibles valores obtenidos. La ecuación del filtro se muestra a continuación:

Ecuacion.png

Esta ecuacion se puede ver mas facilmente con un diagrama como el que se muestra acontinuacion

En nuestro caso el filtro implementado es de orden 10 de manera que se necesitan 10 coeficientes diferentes, estos coeficientes se generaron por medio de matlab empleando la funcion FIR1 para con estos implementar un modulo en verilog que recibe los coeficientes y realiza los retrasos de la señal de entrada por medio de registros para luego enviar los datos al modulo de envolvente.

Debido a que los coeficientes son muy pequeños se multiplicaron por 1024 para obtener un valor con el cual se pudiera trabajar en verilog y luego tras realizar todos los cambios a la señal en el modulo la samatoria final se divide en 1024 para mantener la proporcion en los valores.

Acontinuacion se presenta un ejemplo de los coeficientes obtenidos (para la nota Do) y la simulacion del modulo junto con su diagrama de bloques:


   b[n]*1024 =  10    26    72    137    193    216    193    137    72    26

Es de esperar que para cada nota existe un conjunto diferente de coeficientes debido a que se realizan dependiendo de los armonicos que se quieran mantener para cada una.

Del anterior diagrama se distinguen los registros amp_[n] que son los que iran corriendo la señal de entrada proveniente el oscilador (amp_o), luego se acceden a los coeficientes para multiplicarlos con las amp_[n] y obtener los valores de multi[n] que luego se suman y salen por data_f. [n] indica que hay n registros que se modifican de la misma manera donde n es 10 que es el orden del filtro.

En la simulacion mostrada se puede ver como la señal del oscilador amp_o es iniciada con la pulsacion de una tecla (en el ejemplo de DO) y luego como los registros se encargan de almacenar estos valores y generar el corrimiento para luego ser multiplicados por sus coeficientes y finalmente sumados. el valor de data_f es esta sumatoria final. Para comprobar el correcto funcionamiento del modulo se calcularon las amplitudes en MATLAB y se compararon con las aqui mostradas.

[edit] Envolvente

La envolvente se encarga de modular la amplitud de la forma de onda de salida proveniente de los filtros, de tal forma que el sonido parezca más real, comienza de cero, alcanza su valor máximo y luego decae lentamente. A esto se le conoce como las funciones de attack, decay, sustain y release como se muestran en los diagramas. Esto permite no solo producir un efecto en el sonido final sino tambien definir el tiempo que dura el sonido de una tecla cuando es pulsada (inicialmente se ha pensado en un segundo). Ademas a continuacion se muestran el diagrama de bloques del submodulo y la simulacion del mismo.

Las partes correspondientes a cada etapa de la envolvente estan definidas en tiempo y por medio de una funcion propia que es la modula la señal, por ejemplo la etapa de decay tiene por funcion amp_env <= 153 - (10*tiempo)/1024; que es la que hace decrecer la amplitud en el tiempo. Este tiempo que dura cada etapa de la envolvente es manejado por un control que compara valores de un contador para determinar cuando se debe o no activar cada etapa.

[edit] Conversión Digital-Análogo PWM

Dado que se realizará un montaje superficial de la tarjeta hija y a las limitaciones del número de señales digitales de entrada/salida de propósito general de la tarjeta SIE (25 en total), la conversión digital-análogo se llevará a cabo mediante modulación por ancho de pulsos PWM y un filtro pasa bajas, un circuito RC que hace parte del circuito de audio externo. Las señales PWM serán usadas para generar la señal de audio a reproducir. Una señal PWM es una señal digital con una frecuencia dada pero con un ciclo de trabajo variable, la forma de onda resultante se hace pasar por el filtro pasabajas y cargará y descargará el condensador. El periférico tendrá las señales de entrada y salida que se muestran en la figura de diagramas. El funcionamiento basico del modulo se muestra en los diagramas de abajo y basicamente consiste en llevar un contador de el nivel maximo de amplitud que puede tomar la entrada proveniente de los osciladores, luego se compara si este valor es menor o igual al correspondiente a la entrada sint_data y mantiene la salida en uno durante el tiempo en el que la comparacion se cumple.

El funcionamiento de este modulo en Verilog consiste en tomar la señal de salida del modulo de envolvente que es de 6 bits y modular el ancho de pulso de la salida en funcion del valor de amplitud que entre.

Con las definiciones anteriores primero se busco simular el comportamiento basico por medio del software QTOctave,en el cual se emplearon las frecuencias relacionadas en la tabla de frecuencias bajo el item 'frecuencia generada'.

Asi entonces realizamos una simulación para observar el comportamiento del módulo de síntesis, específicamente de dos de sus osciladores, el de Do y el de Si, a continuación presentamos los datos obtenidos. Además se observa la modulación por ancho de pulso de los datos de las formas de onda resultante, pulso que trasladamos a QtOctave, produciendo el siguiente sonido:

[edit] LCD

Este periférico es el controlador de la LCD 16x2 que se utilizó, es el encargado de enviar las instrucciones y los datos correspondientes a los caracteres que se quieren visualizar dependiendo el estado actual del dispositivo.

  • SOFTWARE: La parte de la inicialización y configuración del dispositivo se realiza desde C, para ello se creó una función en soc-hw.c que se llama desde el main.c, los comandos de inicialización incluyen:
  • Modo de 4 bits,
  • Encendido del display,
  • Cursor en la posición 1,
  • Dirección en la posición 1.
  • HARDWARE: esta aprte se encarga de hacer el envío de los comandos al dispositivo, activando las señales de enable y RS correspondientes, una vez inicializada la LCD, el control del dispositivo queda bajo el periférico, el cual se encarga de hacer la escritura de los diferentes mensajes.
Los registros que se emplearon en la interfaz Wishbone son los siguientes:

Descripción de registros

la direccion base en este caso se establecio en 0xF0030000

Nombre Registro direccion bits
data 0x00 [[24'b0 | data_out]
cs 0x04 [[ 26'b0 | start | donelcd | busylcd | donec | rsin | sig]

[edit] WISHBONE

LA comunicacion entre el procesador y los perifericos se hace mediante la interfaz wishbone que se compone de un maestro que es la cpu y de 3 esclavos de acuerdo a los perifericos que se definieron para el proyecto. Asi el periferico GPIO se asigno al esclavo 5, la LCD al esclavo 6 y la sintesis al esclavo 7.


Para el esclavo 5 se manejan las señales de los registros de entrada y salida. Asi en cada ciclo de lectura se obtienen ya sean los datos de las entradas o el dato de salida en el wb_dat_o [31:0] y en cada ciclo de escritura se obtienen los datos presentes en wb_dat_i [31:0] y se llevan a la salida (gpio_salida).

Para el esclavo 6 se manejan en cada ciclo de lectura el registro de control y estado cs de los que hacen parte busylcd, donelcd, ademas del registro data_out. Para el ciclo de escritura se pasa data_out1 que es el bit menos significativo de data_out y se escriben los registros cs de sig, rsin, donec y start que son los que permiten el manejo del envio de datos a la lcd

Para el esclavo 7 en cada ciclo de lectura se obtienen los datos del pulso modulado y del flag busy del registro de control y estado (cs) en tanto que para el ciclo de escritura el esclavo recibe el start para que pueda iniciar un proceso y el teclado para saber que tecla proviene desde GPIO.

[edit] manejo de interrupcion

Por medio de el GPIO se realizo una interrupcion al procesador. Para lograr que la rutina de atencion a interrupcion se habilite es necesario hacer el llamado en el main de las funciones:

       irq_set_mask( 0x00000001 ); //   Activación y enmascaramiento
       irq_enable(); //para habilitar la interrupción 

Donde irq_set_mask enmascara el vector de interrupciones irqc para que se active bajo esta condicion . Para definir que se hace durante la interrupcion se establece la funcion irq_handler. En el siguiente ejemplo se puede observar la que se ejecuta en esta funcion:

  1. void irq_handler(uint32_t irq)
  2. {	
  3.         volatile unsigned int     irqc;  
  4. 	volatile unsigned int  *p, *a;
  5.  	irqc=0;
  6. 	*p=0;
  7. 	*a=0;
  8. 	irqc=(char)irq;
  9. 	if(irqc == 0x00000001){   //se lee vector de interrupciones, se hace una escritura si coincice con la enmascarada
  10. 		*p = gpion0->in;
  11. 		sintesis0->data = *p; //se pasa las 13 teclas de gpio a síntesis
  12. 	}
  13. }

Ahora se presenta la simulacion de la GPIO con la interrupcion ademas de la salida en cada parte de la sintesis, la del oscilador amp2, la del Filtro amp_fir2, la de la envolvente aenv2 y la salida final del PWM pulse_data. En la simulacion se puede ver como se antivan las teclas 1 y 5 en cada vez que se hace esto se genera la interrupcion intr.

[edit] Cronograma

El siguiente cronograma relaciona las fechas y actividades a realizar en el desarrollo del proyecto.

[edit] Costos

A continuacion se presenta el analisis de costos para la elaboracion del proyecto

Costos.pdf

Personal tools
Namespaces
Variants
Actions
Navigation
interactive
Toolbox
Print/export