Entregar Jueves 27 de Feb.
Puede trabajar en parejas si su nota es mayor igual a 4.00.
Las notas de los laboratorio se darán en la manera siguiente:
30%: Funcionalidad - el circuito hace lo que queríamos que hiciera, y han hecho lo que pido en el trabajo
15%: Simulaciones anotadas y RTL View - hay que entregar simulaciones anotadas y RTL view de todos los módulos nuevos, ASM y Diagrama de Estados
10%: Eficiencia - el código no utiliza más recursos del FPGA de lo que es necesario
10%: Fiabilidad - el código está escrito en manera fiable
10%: Modularidad - el código está escrito en manera modular
10%: Legibilidad - el código está escrito legiblemente y limpiamente,y es claro cual hardware sintetiza
15%: Presentación oral en la clase (todo el grupo debe estar presente y participar!)
-------
100%
-------
100%
Obviamenete, a pesar de que funcionalidad es 30% de la nota, si el laboratorio no tiene un mínimo de funcionalidad, la nota del laborotorio será 0.
Aunque en el mismo laboratorio NO SE PERMITEN usar modulos de un otro grupo, SÍ SE PUEDEN usar módulos de cualquier grupo de laboratorios ANTERIORES. Esto es parte del énfasis en diseño modular y diseño reutilizable. Lo único es que, por favor, si usan un módulo de un laboratorio anterior, esciban un comentario corto en el código de Verilog del módulo que lo dice (por ejemplo: " // Este módulo fue escrito por grupo X en laboratorio Y")
Por favor entreguen un CD en el comienzo de la clase del dia de entrega que contiene lo siguiente:
- Nombres de los estudiantes con IDs escritos sobre el CD
- Una carpeta con los archivos Verilog, archivo de proyecto prj, y todos los archivos generados por la compilacion, en fin todos los archivos que usaron. Es facil: solamente es copiar al CD la carpeta entera que usaron ustedes. No olviden entregar tambien el codigo de Nios soft-core si usaron el Nios II.
- Un documento Word o PDF corto que describe los modulos de verilog y la estructura general de su circuito. En este archivo tambien por favor escriban sus nombres y IDs, y tambien correos electronicos de todos.
- Simulaciones anotadas en archivo PDF, PPT, Word, o impreso.
- RTL view de los modulos en en archivo PDF, PPT, Word, o impreso.
- Pueden ver una presentacione PowerPoint sobre simulaciones anotadas y RTL view aqui.
- Comentarios: para cada bloque "Always" hay que dar comentario de si la estructura que sintetiza es: combinacional o secuencial, y dar descripcion breve de cual es la estructura en Hardware (ejemple: registro 32 bits, multiplexor, multiplexor seguido por registro, etc.). Esto figura bajo la nota de "legibilidad".
- La presentacion oral tendra lugar en la clase, con la tarjeta hardware, en el mismo dia que se entrega el CD (yo voy a probar el CD despues en mi computador, la idea es que ustedes me presenten su trabajo primero y después lo miro más tarde con detenimiento).
Para ayudarles, aqui tienen un enlace al codigo que hay en el libro de Chu (es un archivo ZIP).
Laboratorio 2 (Voice Recorder):
Requerimientos: Practica#2 y Practica#3
En este laboratorio usted deberá diseñar un sistema que sea capaz de grabar la voz en una memoria SDRAM por un tiempo determinado (Dependiendo de la frecuencia de muestreo), una vez grabada la voz, usted deberá leerla desde esa misma memoria SDRAM y después de esto enviarla a un canal de salida para escucharla por medio de un mono_dac(Delta sigma modulation)
Instrucciones:
¿Cual es al frecuencia fundamental de la voz, y cual es la frecuencia de muestreo mínima a la que se debe muestrear?.
¿Como utilizar el ADC de la DE0-NANO?
El ADC de la DE0-NANO esta conectado a la DE0-NANO de la siguiente manera utilizando una interfaz SPI(CS,DIN, DOUT y SCLK):
y para controlar el ADC y adquirir muestras digitales de las señales analógicas que están conectadas al conversor se debe diseñar una FSM que controle cada una de las señales que conforman la interfaz SPI, teniendo en cuenta las formas de onda siguientes:
para mas información vea la sección 2.1 y 2.2 del manual ftp://ftp.altera.com/up/pub/Altera_Material/12.1/Tutorials/DE0-Nano/Using_DE0-Nano_ADC.pdf
una vez entienda como utilizar y comprenda como controlar estas señales diseñe una FSM que sea capaz de tomar muestras del canal 0 al 7, y verifique con un potenciometro para ver en los LEDs el comportamiento de cada canal.
PD: asegúrese que la FSM que diseñe tenga señales de START y FINISH.
Ejemplo de como se vería la instanciación del chip(FSM) que usted debe diseñar.
SPI_ADC_SLAVE adc(
.clock(), ==> clock de la FSM
.reset(), ==> reset de la FSM
.cs_n(), ==> SPI
.sclk(), ==> SPI
.din(), ==> SPI
.dout(), ==> SPI
.start(), ==> señal de start de la FSM
.finish()==> señal que indica que se finalizo una muestra
.channel(), ==> canal que se desea muestrear
.adc_data() ==> muestra digitalizada del canal muestreado
);
una vez ha entendido e implementado el ADC correctamente ahora debe saber como conectar un microfono a la entrada de alguno de los canales del ADC, para esto puede ver la sección 2.3 del manual ftp://ftp.altera.com/up/pub/Altera_Material/12.1/Tutorials/DE0-Nano/Using_DE0-Nano_ADC.pdf o investigar en el siguiente link http://www.ece.ucsb.edu/yuegroup/Teaching/ECE2C/Lab/Lab1b.pdf ó este http://arduinodiy.wordpress.com/2012/12/20/electret-microphone-amplifier/
ADVERTENCIA: Recuerde que al ADC solo deben entrar señales que varíen de 0 a 3.3 V el circuito que usted implemente para contectar al ADC de la DE0-NANO debe cumplir estas características.(posible circuito)
para probar que funciona el circuito verifique utilizando el osciloscopio y vea el comportamiento de la señal y sus niveles de voltaje.
una vez todo este bien conecte el circuito a la DE0-NANO al canal del ADC que desee usar, muestree la señal a 22KHz y llévela a la entrada del modulo del mono_dac que se uso en el laboratorio #1.
Verifique que a la salida del audífono usted escucha lo que usted habla al momento de tener conectado todo el sistema.
CircuitoMIC => Analogic_Signal=>ADC =>SPI_FSM_ADC(channel)=>Sampler(22KHz)=>Digital_Signal[11:0]=>Digital_Signal[11:4]=>Mono_dac=>GPIO(n)=>HeadPhones
Una vez usted sabe como utilizar el micrófono en conjunto con el ADC y el mono_dac, usted deberá aprender a usar un modulo escrito en Verilog que controla la SDRAM fisica de la DE0-NANO, la instanciacion para el uso de la ram se conforma de la siguiente manera:
assign DRAM_CLK = sdram_clk;
PLL_SDRAM u10 ( // PLL(Megawizard) para generar los relojes en diferentes fases que controlan la SDRAM de la DE0-NANO
.inclk0(CLOCK_50),
.c0(sdram_ctrl_clk),
.c1(sdram_clk)
);
Sdram_Control_4Port u5 ( // Modulo de control de la SDRAM de la DE0-NANO
// HOST Side
.REF_CLK(CLOCK_50),
.RESET_N(1'b1),
.CLK(sdram_ctrl_clk),
// FIFO Write Side 1
.WR1_DATA(), //==>> puerto de escritura o datos que se enviaran a la SDRAM
.WR1(),
.WR1_ADDR(0),
.WR1_MAX_ADDR(),
.WR1_LENGTH(),
.WR1_LOAD(),
.WR1_CLK(),
// FIFO Read Side 1 ==> puerto de lectura de datos o datos que se leeran de la SDRAM
.RD1_DATA(),
.RD1(),
.RD1_ADDR(),
.RD1_MAX_ADDR(),
.RD1_LENGTH(),
.RD1_LOAD(),
.RD1_CLK(),
// SDRAM Side // conexion del modulo a la parte fisica de la SDRAM
.SA(DRAM_ADDR),
.BA(DRAM_BA),
.CS_N(DRAM_CS_N),
.CKE(DRAM_CKE),
.RAS_N(DRAM_RAS_N),
.CAS_N(DRAM_CAS_N),
.WE_N(DRAM_WE_N),
.DQ(DRAM_DQ),
.DQM(DRAM_DQM)
);
Para poder controlar este modulo se adjunta la siguiente plantilla de la cual usted deberá aprender a grabar y leer datos de la SDRAM de diferentes direcciones, una vez lo aprenda hacer copie los módulos y agréguelos a la carpeta de su laboratorio e instancielos.
Plantilla de ejemplo de uso de la SDRAM: https://sites.google.com/site/ece31289upb/laboratorios/laboratorio-2/SD_RAM_DE0_NANO.qar?attredirects=0&d=1
Una vez usted sepa grabar y leer valores de la SDRAM usando el modulo del ejemplo, agregue a su laboratorio estos dos modulos y modifique el diseño para que se escriban datos en la SDRAM a una velocidad de 22KHz desde la dirección 0 hasta la que usted calcule para que grabe por lo menos 22000Hz*8bits*Nsegundos/(1024*1000) en MB de datos.
Una vez usted grabe estos datos lea los datos desde la misma dirección 0 a la N para enviarlos al mono_dac a una frecuencia de muestreo de 22KHz.
Si usted lo hace bien debería haber grabado en la SDRAM N segundos de voz y la esta escuchando a la salida.
CircuitoMIC => Analogic_Signal=>ADC =>SPI_FSM_ADC(channel)=>Sampler(22KHz)=>SDRAM(10 segundos)
FSM(Control de tiempos de lectura y escritura)
SDRAM(10 segundos)==>Digital_Signal[11:0]=>Digital_Signal[11:4]=>Mono_dac=>GPIO(n)=>HeadPhones
Para controlar los tiempos de grabado y lectura en la SDRAM haga una FSM.
Mientras se oprima el KEY[1] se debe grabar en la SDRAM la señal de audio a una tasa de muestreo de 22KHz, si se llega a llenar la SDRAM de datos se debe indicar en el LED[0] que la RAM esta llena y que se llego al limite y no seguira grabando.
En el caso que el usuario deje de presionar KEY[1] y no se haya llenado la RAM o no se debe indicar por medio del LED[1] que se termino la grabación.
Si el usuario presiona KEY[0] el usuario podra escuchar los datos que fueron grabados desde la dirección 0 a la N(Fin de la grabación)
El usuario no podrá leer la grabación mientras se este grabando y al mismo tiempo podrá grabar mientras se este leyendo.
Una vez tenga la maquina de estados que controle la los tiempos de lectura y escritura sobre la memoria SDRAM, usted podra jugar a grabar y escuchar su voz o las voces de los demas.
Bonus:
Del 10% usted graba la voz a 22KHz y utiliza los SW[2:0] para variar la velocidad de lectura(Efecto de velocidad a la salida).
Del 15% si usted muestra en la LCD el tiempo que lleva grabando y el tiempo que lleva leyendo.
Del 20% si usted es capaz de grabar en la memoria EPCS por lo menos 10 segundos de voz, apagar la FPGA y cuando la vuelva a prender escuchar lo que dejo como mensaje.
Del 20% si usted muestra en los LED[7:5] el promedio de variación de la voz para indicar el volumen utilizando 256 muestras.
Del 30% si usted agrega al diseño la opción de escuchar su voz directamente del muestreador y agregarle un delay para que se escuche un ECO como se muestra en la siguiente figura teniendo en cuenta que para hacer delay de la muestra se deben poner muchos registros en cascada y que el para calcular el tiempo del delay es la siguiente Delay= N/Fs donde N es el numero de registros del delay en cascada: