Bien ahí.
8MHz es la frecuencia de clk, pero ¿es también la frecuencia de sampling?, es decir ¿cuántos clks se necesitan para tener una muestra a la salida?.
En base a ese fsampling, supongamos que realmente te lleva solo un clk como decís, te queda:
fsampling= 8MHz => Resolución usando acumulador 24 bits = fsampling/2^(24) = 0,47... Hz
Paso que se sumará al acumulador = Fsalida/Resolución usando acumulador 24 bits = 2,0971 (1/Hz) x Fsalida
Entonces para obtener 30kHz tus pasos deberían ser:
Paso (30kHz)= 2,0971 (1/Hz) x 30kHz= 62914,56= 0x00F5C2
Hasta acá lo mismo que obtuviste vos, siguiendo con la explicación que dí en el mensaje #32, ese paso lo divido en 3 bytes distintos:
1er byte (menor peso) = 0xC2= 194
2do byte (mediano peso)= 0xF5= 245
3er byte (mayor peso)= 0x00= 0
Esos son los 3 bytes que vas a tener que ir sumando teniendo en cuenta el carry del byte anterior.
Tu circuito debería hacer esto:
Paso byte 1 = 194
Paso byte 2 = 245
Paso byte 3 = 0
Acum byte 1=0
Acum byte 2=0
Acum byte 3=0 (índice que usarás para sacar la muestra en tu RAM)
. Muestra número 1:
Acum byte 1 + Paso byte 1 = 194 → Acum byte 1
Acum byte 2 + Paso byte 2 = 245→ Acum byte 2
Acum byte 3 + Paso byte 2 = 0 → Acum byte 3
Muestreo el elemento "0" (de nuevo, el índice lo impone Acum byte 3) que se encuentra en la memoria RAM.
. Muestra número 2:
Acum byte 1 + Paso byte 1 = 194 + 194 = 132 y hubo carry→ Acum byte 1
Acum byte 2 + Paso byte 2 = 245 + 245 + carry (1) = 235 y hubo carry→ Acum byte 2
Acum byte 3 + Paso byte 2 = 0 + 0 + carry (1) = 1 → Acum byte 3
Muestreo el elemento "1" que se encuentra en la memoria RAM.
. Muestra número 3:
Acum byte 1 + Paso byte 1 = 132 + 194 = 70 y hubo carry→ Acum byte 1
Acum byte 2 + Paso byte 2 = 235 + 245 + carry (1) = 225 y hubo carry→ Acum byte 2
Acum byte 3 + Paso byte 2 = 1 + 0 + carry (1) = 2 → Acum byte 3
Muestreo el elemento "2" que se encuentra en la memoria RAM.
Bue... así se repite y se vé que tiene tiempo de sobra para muestrear los 256 elementos, pero ojo, habrá veces en los cuales un elemento se repetirá, a medida que se irán sumando los acumuladores, Acum byte 2 + Paso byte 2 + carry (1) dará menor o igual a 255 evitando que haya un carry y por lo tanto Acum byte 3 mantendrá su valor.
Ese juego del carry, hace posible que se muestreen los 256 elementos, incluyendo veces en los cuales se repite un elemento, esa repetición será la que sirva de ajuste para que justo se den los 30kHz y no los 31,25 khz que decís.
seaarg dijo:8mhz / 2^24 = 0.476837158203125 de resolucion.
8MHz es la frecuencia de clk, pero ¿es también la frecuencia de sampling?, es decir ¿cuántos clks se necesitan para tener una muestra a la salida?.
En base a ese fsampling, supongamos que realmente te lleva solo un clk como decís, te queda:
fsampling= 8MHz => Resolución usando acumulador 24 bits = fsampling/2^(24) = 0,47... Hz
Paso que se sumará al acumulador = Fsalida/Resolución usando acumulador 24 bits = 2,0971 (1/Hz) x Fsalida
Entonces para obtener 30kHz tus pasos deberían ser:
Paso (30kHz)= 2,0971 (1/Hz) x 30kHz= 62914,56= 0x00F5C2
Hasta acá lo mismo que obtuviste vos, siguiendo con la explicación que dí en el mensaje #32, ese paso lo divido en 3 bytes distintos:
1er byte (menor peso) = 0xC2= 194
2do byte (mediano peso)= 0xF5= 245
3er byte (mayor peso)= 0x00= 0
Esos son los 3 bytes que vas a tener que ir sumando teniendo en cuenta el carry del byte anterior.
Tu circuito debería hacer esto:
Paso byte 1 = 194
Paso byte 2 = 245
Paso byte 3 = 0
Acum byte 1=0
Acum byte 2=0
Acum byte 3=0 (índice que usarás para sacar la muestra en tu RAM)
. Muestra número 1:
Acum byte 1 + Paso byte 1 = 194 → Acum byte 1
Acum byte 2 + Paso byte 2 = 245→ Acum byte 2
Acum byte 3 + Paso byte 2 = 0 → Acum byte 3
Muestreo el elemento "0" (de nuevo, el índice lo impone Acum byte 3) que se encuentra en la memoria RAM.
. Muestra número 2:
Acum byte 1 + Paso byte 1 = 194 + 194 = 132 y hubo carry→ Acum byte 1
Acum byte 2 + Paso byte 2 = 245 + 245 + carry (1) = 235 y hubo carry→ Acum byte 2
Acum byte 3 + Paso byte 2 = 0 + 0 + carry (1) = 1 → Acum byte 3
Muestreo el elemento "1" que se encuentra en la memoria RAM.
. Muestra número 3:
Acum byte 1 + Paso byte 1 = 132 + 194 = 70 y hubo carry→ Acum byte 1
Acum byte 2 + Paso byte 2 = 235 + 245 + carry (1) = 225 y hubo carry→ Acum byte 2
Acum byte 3 + Paso byte 2 = 1 + 0 + carry (1) = 2 → Acum byte 3
Muestreo el elemento "2" que se encuentra en la memoria RAM.
Bue... así se repite y se vé que tiene tiempo de sobra para muestrear los 256 elementos, pero ojo, habrá veces en los cuales un elemento se repetirá, a medida que se irán sumando los acumuladores, Acum byte 2 + Paso byte 2 + carry (1) dará menor o igual a 255 evitando que haya un carry y por lo tanto Acum byte 3 mantendrá su valor.
Ese juego del carry, hace posible que se muestreen los 256 elementos, incluyendo veces en los cuales se repite un elemento, esa repetición será la que sirva de ajuste para que justo se den los 30kHz y no los 31,25 khz que decís.