YM3012 relación entrada/salida medida en silicio

La salida del YM2151 es una señal digital de 16 bits: 3 sin valor, 10 de mantisa y 3 de exponente. Los dos canales (izquierda y derecha) se transmiten secuencialmente. Este formato está relativamente detallado en la hoja de datos del YM2151 y del DAC que lo acompañaba, el YM3012. Sin embargo, dado que los dos chips eran de Yamaha y cuyo uso era ir el uno con el otro, Yamaha nunca explicó demasiado bien cómo funcionaban. Seguramente nadie usó nunca un YM2151 sin un YM3012 y viceversa. Pero poder extraer sonido de un YM2151 sin el YM3012 hace falta saber primero qué hacía este exactamente. Y para eso, nada mejor que unas medidas.

Medidas del YM3012

Con VDD=5.17V realicé medidas para cada valor del exponente (del 1 al 7) y para los siguientes valores de mantisa: $00, $0F, $3F, $FF, $100, $10F, $13F, $1FF, $200, $20F, $21F, $2FF, $300, $30F, $31F, $33F, $3FF. A partir de las medidas, caractericé la relación entrada salida así: Vout = n + m * d. Donde d es el valor de la mantisa y n,m son valores que dependen del exponente según esta relación:

exponente n m
1 2.559 0.039*0.001
2 2.530 0.082*0.001
3 2.493 0.163*0.001
4 2.417 0.314*0.001
5 2.252 0.636*0.001
6 1.932 1.261*0.001
7 1.290 2.522*0.001

Para cada valor de exponente, la m (es decir, la sensibilidad o el tamaño del LSB) cambia en un factor 2. Pero el corte con cero, la n, también varía. La relación es de tal forma que empezando por exp=7 la salida varía desde 1.289V (d=0) hasta 3.870V (d=3FF), para exp=6 el rango se acorta a 1.937 (d=0) hasta 3.220 (d=3FF), para exp=5 el rango es 2.250 (d=0) hasta 2.900 (d=3FF) y así sucesivamente.

Lo que esto significa es que la señal está centrada alrededor de VDD/2. Para exp=7 se accede a todo el rango de señal desde VDD/4 hasta VDD*3/4 con una resolución de 10 bits. Al pasar a exp=6 el rango se acorta de forma simétrica alrededor de VDD/2 y se divide de nuevo en 10 bits. Es decir, la mitad central del rango goza de mayor resolución. Para exp=5 el rango vuelve a dividirse y a aumentar la resolución y así sucesivamente.

Esto explica la implementación del YM3012 en Verilog de Tatsuyuki Satoh. Cuyo meollo es este:


module dac3012(
CLK,CLKEN,
SO,SH1,SH2,
L,R
);
input CLK;
input CLKEN;
input SO,SH1,SH2;
output [15:0] L,R;

/////////////////////////////////////////////////////////////////////////////
// capture
/////////////////////////////////////////////////////////////////////////////
reg [12:0] sreg;
reg last_sh1,last_sh2;

reg [15:0] dr,dl;
reg [ 2:0] sr,sl;

reg [15:0] out_r,out_l;

always @(posedge CLK)
begin
if(CLKEN)
begin
// shift register
sreg <= {SO,sreg[12:1]};

last_sh1 <= SH1;
if(last_sh1 & ~SH1)
begin
out_r <= dr;
sr <= sreg[12:10];
dr <= {~sreg[9],sreg[8:0],6’b000000};
end else if(sr<7)
begin
// increment floating point
sr <= sr + 1;
dr[14:0] <= dr[15:1];
end

last_sh2 <= SH2;
if(last_sh2 & ~SH2)
begin
out_l <= dl;
sl <= sreg[12:10];
dl <= {~sreg[9],sreg[8:0],6’b000000};
end else if(sl<7)
begin
// increment floating point
sl <= sl + 1;
dl[14:0] <= dl[15:1];
end
end
end

/////////////////////////////////////////////////////////////////////////////
// output
/////////////////////////////////////////////////////////////////////////////
assign L = out_l;
assign R = out_r;

endmodule

La inversión del bit D[9] es una forma rápida de sumar 512 al valor para centrarlo en torno a un imaginario VDD/2. Luego divide el valor entre 2 conservando el signo para cada valor de exp distinto de 7.

Esta implementación no se corresponde, creo, fielmente a la relación E/S medida en el chip. En principio, para exp=7 entiendo que no hay que hacer nada especial y se puede guardar el valor tal cual en 16 bits:


linear[15:0] <= { data[9:0], 6'd0 };

Para los demás valores distintos hay que dividir por 2 y sumar 256:


linear[15:0] <= { 10'h100, 6'd0 } + { 1'b0, linear[15:1] };

en iteraciones sucesivas a la manera de actuar de Satoh.

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: