En el siguiente tutorial veremos cómo reproducir música con la BASYS 3. Primero tocaremos algunas notas musicales con los switches y luego veremos cómo reproducir notas desde un archivo para crear melodías.
Como decíamos más arriba, vamos a empezar por algo sencillo; tocaremos siete notas musicales empleando lo switches sw0 a sw6 de la BASYS 3.
Para reproducir música necesitamos un altavoz que conectaremos como en el esquema que se muestra a continuación.
El código Verilog consiste en un módulo notas_musicales.v que es un un generador de tonos u ondas cuadradas para las notas musicales, más un módulo superior top.v donde se conectan las salidas del generador de notas con los switches y las puertas AND que funcionan a modo de interruptores.
El módulo notas_musicales.v toma la señal de reloj de 100MHZ como entrada y utiliza divisores de frecuencia para generar señales de salida individuales que oscilan a las frecuencias de las notas musicales correspondientes. (Do, Re, Mi, Fa, Sol, La, Si).
module top (
input wire clk, // Reloj de entrada 100 MHz
input wire sw0,
input wire sw1,
input wire sw2,
input wire sw3,
input wire sw4,
input wire sw5,
input wire sw6,
output speaker_out);
wire w_do, w_re, w_mi, w_fa, w_sol, w_la, w_si;
assign speaker_out = ((w_do & sw0) | (w_re & sw1) | (w_mi & sw2) | (w_fa & sw3) | (w_sol & sw4) | (w_la & sw5) | (w_si & sw6));
notas_musicales NOTAS (
.clk(clk),
.do(w_do),
.re(w_re),
.mi(w_mi),
.fa(w_fa),
.sol(w_sol),
.la(w_la),
.si(w_si));
endmodule
El esquema representa un reproductor simple; lee una secuencia de notas desde una ROM y las reproduce como sonido en un altavoz mediante una onda cuadrada.
Un circuito secuencial dentro del reproductor se encarga de ir avanzando la dirección addr para reproducir la siguiente nota.
La ROM va poniendo en su salida la frecuencia de la nota freq según la dirección a la que apunte su entrada addr.
El generador de tono convierte la frecuencia que le pasa la ROM en un señal cuadrada audible. Dicha salida se hace pasar por una puerta AND que actúa a modo de interruptor y se habilita con la señal enable procedente del sw0.
En el módulo top.v instanciamos el reproductor, las E/S y la puerta AND.
module top (
input wire clk, // 100 MHz
input wire enable, // sw0 = enable speaker
output wire speaker_out // salida altavoz
);
wire w_spk;
assign speaker_out = (w_spk & enable);
reproductor r (
.clk(clk),
.speaker(w_spk)
);
endmodule
Para reproducir una melodía sólo hay que añadir al proyecto el archivo tetris.mem en el menú Sources.
Luevo modifica el archivo rom_notas.v para añadir una línea con el nombre del archivo de memoria que queremos reproducir:
module rom_notas (
input wire clk,
input wire [7:0] addr,
output reg [15:0] freq
);
reg [15:0] memoria [0:255];
initial begin
//$readmemh("notas.mem", memoria);
$readmemh("tetris.mem", memoria);
end
always @(posedge clk) begin
freq <= memoria[addr];
end
endmodule
Genera el bitstream y programa la BASYS 3, escucharás en el altavoz la melodía "Korobeiniki” del popular juego Tetris, aunque reconozco que hay que echarle un poco de imaginación :-)
Eso es todo por el momento ¡Hasta pronto!
Puedes descargar el proyecto en Vivado en el siguiente enlace.