Cómo se calculan las diferentes frecuencias de refresco vertical en base a los posibles valores del reloj maestro

Avatar de Usuario
mcleod_ideafix
Mensajes: 831
Registrado: 27 Sep 2015, 00:14
Ubicación: Jerez de la Frontera
Contactar:

Cómo se calculan las diferentes frecuencias de refresco vertical en base a los posibles valores del reloj maestro

Mensaje por mcleod_ideafix » 10 Jul 2016, 14:53

Esto es una respuesta que le he dado a Uto por MP, pero creo que es útil para todo el mundo, así que copio dicha respuesta.

Los diferentes valores de la frecuencia vertical que se pueden elegir y que nos permiten adecuar el funcionamiento del core de Spectrum para cualquier monitor VGA se calculan a partir de los valores que se usan en el fichero pll_drp.v . En él, y a partir de la línea 42, comienza un módulo con un montón de parámetros que comienzan por las letras S1, S2, S3, etc. Cada Sx describe una frecuencia diferente. S1 corresponde a la frecuencia de la opción F0, S2 a la frecuencia F1, y así sucesivamente.

De todos los parámetros Sx que hay, los dos importantes son: Sx_CLKFBOUT_MULT y Sx_CLKOUT0_DIVIDE .
Por ejemplo, para S1, que se corresponde a F0, tenemos S1_CLKFBOUT_MULT que vale 9, y S1_CLKOUT0_DIVIDE que vale 16.

De aquí se calcula la frecuencia base, que es 50 * S1_CLKFBOUT_MULT / S1_CLKOUT0_DIVIDE = 50 * 9 / 16 = 28.125
Estos 28.125 MHz son la frecuencia maestra de todo el tinglado (la llamaremos FmS1 para S1, FmS2 para S2, etc). De aquí salen todos los demás valores. Entre ellos, el valor de la frecuencia vertical se calcula como: FverS1 = FmS1 / 0.559104 = 50.303 Hz . El valor 0.559104 es una constante del diseño.

Pongo aquí en forma de tabla todos los valores, incluyendo los intermedios, para que si alguna vez cambio esas frecuencias, se sepa cómo se tiene que volver a calcularlas:

Código: Seleccionar todo

Opcion Sx Sx_CLKFBOUT_MULT Sx_CLKOUT0_DIVIDE  FmSx    FverSx
------------------------------------------------------------
  0    S1        9                 16        28.125   50.303
  1    S2        8                 14        28.571   51.102
  2    S3        9                 15        30       53.657
  3    S4       10                 16        31.25    55.893
  4    S5        9                 14        32.143   57.490
  5    S6        8                 12        33.333   59.619
  6    S7        9                 13        34.615   61.912
  7    S8       10                 14        35.714   63.878
Como se puede observar, la frecuencia de 50Hz original no es realmente 50Hz, sino un pelín más. Lo hice así para que cuando conmutas a timings de 128K o Pentagon, la deriva respecto de la frecuencia original, 50Hz, sea la menor posible. Tened en cuenta que estas frecuencias son las calculadas para los timings de 48K. Para 128K en lugar de dividir entre 0.559103 habría que hacerlo entre 0.567264 . Para timings Pentagon, el valor es 0.57344 . Esto hace que la frecuencia de refresco vertical que obtenemos se aleje por debajo de los 50Hz cuando usamos cualquiera de esos timings, así que en lugar de tener 50Hz, y de ahí para abajo, prefiero tener un pelín por encima de 50Hz, y de ahí para abajo

Estos valores "mágicos" salen de multiplicar el tiempo en ciclos de reloj de un scanline por el número de scanlines en un frame, a eso se multiplica por 8, y luego se divide entre un millon.

Por ejemplo, para timings de 48K, el número de ciclos de reloj por scanline es de 224 y hay 312 scanlines en un frame.
Con timings de 128K tenemos 228 ciclos por scanline, y 311 scanlines en un frame.
Y por último, con timings Pentagon tenemos 224 ciclos por scanline y nada menos que 320 scanlines en un frame.
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA

Responder