Las tonadillas del 1942

Después de presentar el AY-3-8910 y explicar su diseño, voy a pasar a un ejemplo de uso. Ya sabéis que es el chip de música de varios ordenadores de 8 bits y de placas arcade. Ahora vamos a hacerlo sonar en la placa del 1942 de Capcom.

Las máquinas de arcade usan generalmente dos procesadores: uno para el juego y otro para el sonido. La comunicación suele ser muy sencilla: hay una posición de memoria en la que el procesador principal escribe un valor. El procesador de sonido comprueba el valor a intervalos regulares (240 Hz en el caso del 1942) y reproduce el efecto sonoro o la melodía correspondiente.

En este caso, como sólo se trata de comprobar si el AY-3-8910 diseñado suena cómo debe, no hace falta modelar toda la placa, basta con la parte sonora. Es más, el código sonoro lo podemos dejar fijo y cambiarlo a mano cuando queramos probar otro sonido. La memoria que guardaba el código se implementaba con un latch de 8 bits. El modelo en Verilog es:

module SOUND_LATCH(
  output reg [7:0] dout,  
  input enable,
  input clk,
  input rd_n );
 
wire sample = clk & ~rd_n;
reg [7:0]data;
 
initial begin
    dout=0;
    data=0;
    #100e6 data=8'h12; // enter the song/sound code here
end
 
always @(posedge sample) begin
  if( !enable )
        dout=0;
  else begin 
    if( !rd_n ) begin
            dout=data;
        end
  end
end
endmodule

El resto del código Verilog que modela la placa de 1942 está aquí.

El procesador Z80 escogido es el tv80, que ha funcionado bien en estas simulaciones. Para que el programa del Z80 lea el código debe recibir interrupciones. Eso lo hacemos con un reloj fijo:

always begin // interrupt clock 
int_n=1; 
  forever begin       
   #(4166667-int_low_time) int_n=0; // 240Hz        
  #(167*2*80) int_n=1;    
  end
end

Y lo más importante: hay que guardarse la salida de sonido. Para ello tomamos muestras a 44.1kHz y producimos salida por pantalla. Como 1942 tenía dos chips AY, escribims cada salida en una línea distinta:

always #22676 begin // 44.1kHz sample    
    $display("%d", amp0_y*10 ); 
    $display("%d", amp1_y *10);         
end

Cuando simulemos el Verilog, hay que hacerlo grabando la salida de texto a un fichero para luego convertir esas muestras a un fichero WAV y poder oírlas. Luego usamos este programa para hacer la conversión. Si se hace en Linux se puede usar una tubería para ahorrarse el fichero intermedio.

Y aquí se acaba la entrada de hoy. Hay varios temas posibles para la siguiente entrada: tenemos ya el ADPCM (el CODEC de audio usado para voces digitalizadas en los 90) medio funcionando y hay progresos también con el YM2203. La placa de trabajo, una Spartan 3A starter kit, nos llega mañana así que ¡hay mucho por probar!

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: