Enviar señales de reloj hacia pines externos

Cuestiones generales sobre uso de Quartus y diseño digital con él (las cuestiones que sean específicas de UnAmiga, dirigirlas a "Desarrollo" del foro UnAmiga)
Responder
Avatar de Usuario
mcleod_ideafix
Site Admin
Mensajes: 71
Registrado: 14 Ago 2018, 01:15

Enviar señales de reloj hacia pines externos

Mensaje por mcleod_ideafix » 21 Sep 2018, 17:54

En Altera, al contrario que en Xilinx, es posible enviar una señal de reloj al exterior sin más que hacer un assign del puerto de salida al reloj.
Sin embargo, hacer esto no siempre lleva al resultado más óptimo.

Buscando formas de mejorar el rendimiento del controlador de SDRAM del test de placa de UnAmiga me he encontrado con que hay determinados pines de salida de la FPGA que están asociados a salidas especiales de los PLLs, por los que se puede enviar una señal de reloj de forma más.... "directa" que usando bufferes globales internos.

Para ello, cada PLL (hay 4 en la FPGA del UnAmiga) tiene asociada una salida. En el caso de la placa del UnAmiga, la señal de reloj que va a la SDRAM está asociada a la salida del PLL2 (PLL2_OUTCLKp concretamente). Esto supone un pequeño bache, porque la señal de reloj de 50 MHz que es la que alimenta al PLL está conectada a CLK1, y CLK1 alimenta al PLL1, no al PLL2.

Así que si queremos usar la salida directa de reloj para la SDRAM tenemos que usar dos PLLs en cascada: uno que simplemente lleve la señal de 50 MHz desde el exterior hacia una salida del PLL1, y otro PLL que tomará como entrada de reloj lo que haya en la salida de PLL1, y de ella generará todos los relojes que se necesiten, reservando la primera salida (c0) para la señal de reloj que irá al reloj de la SDRAM.

De todas formas, también he de decir que no he notado la mejora. La frecuencia que uso para el reloj de la SDRAM es de "sólo" 100 MHz, y el jitter que me ahorro al usar el segundo PLL para poder aprovecharme de PLL2_OUTCLKp es de sólo unas decenas de picosegundos... despreciable respecto al periodo de reloj que estoy usando, y que es de diez mil picosegundos.

carmeloco
PLA
Mensajes: 49
Registrado: 20 Ago 2018, 15:32

Re: Enviar señales de reloj hacia pines externos

Mensaje por carmeloco » 21 Sep 2018, 19:31

En Altera, creo que se pueden hacer cosas muy chulas con osciladores internos. No sé exáctamente cómo lo hacen, pero en la OCM/Zemmix, se generan todas las señales de video dentro de la FPGA, y cuando digo todas, me refiero a video compuesto, S-Video, VGA y RGB 15KHz.
La placa, solo tiene un oscilador para la señal de reloj de la FPGA, y solamente para el video compuesto, ya necesitas una frecuencia de 3,57MHz para la subportadora de color, y esa frecuencia, no está en un oscilador en la placa.

Avatar de Usuario
mcleod_ideafix
Site Admin
Mensajes: 71
Registrado: 14 Ago 2018, 01:15

Re: Enviar señales de reloj hacia pines externos

Mensaje por mcleod_ideafix » 23 Sep 2018, 00:42

carmeloco escribió:
21 Sep 2018, 19:31
En Altera, creo que se pueden hacer cosas muy chulas con osciladores internos. No sé exáctamente cómo lo hacen...
Lo hacen igual que en Xilinx: usando PLLs. Es como habitualmente se generan múltiples relojes, de diferentes frecuencias, partiendo de uno solo, el externo.

El PLL, en esencia, es un circuito que coge un reloj de una frecuencia determinada, lo multiplica por un valor M y lo divide por otro valor D. El resultado es la frecuencia de salida del PLL. Es decir, es capaz de sintetizar relojes de una frecuencia igual a Fi * M / D donde Fi es la frecuencia de entrada (por ejemplo 50 MHz), y M y D son los valores de trabajo del PLL. Habitualmente ambos son números enteros no muy grandes (8 bits o así) y deben cumplir unos ciertos requisitos para que el PLL "enganche".
Cyclone V permite divisores fracionarios (valores de D) con lo que te da aún más juego.

En el OCM lo ponen fácil porque el reloj externo, el que se usa como entrada para el PLL, es de 21,47727 MHz, es decir, la misma frecuencia que el V9938 (y el doble que el reloj del TMS9929). Dividiendo ese reloj entre 6 tienes el reloj de la CPU y también la frecuencia de la subportadora de color NTSC (3,57 MHz). Dividiendo entre 4 tienes el reloj de pixel (5,37 MHz). La subportadora de color PAL (4,43 MHz) ya es más complicada de calcular usando únicamente divisiones del reloj principal, y la FPGA del OCM es muy antigua, una Cyclone de las de primera generación, así que no sé siquiera si su PLL (si es que lo tiene) permite usar un rango amplio de valores para M y D. A juzgar por lo mal que recuerdo que se veía la señal por video compuesto, me da que no.

Fíjate si es complicado sintetizar la frecuencia de la subportadora de color PAL desde esa frecuencia origen, que el TMS9918 (NTSC) puede generar directamente una señal de video compuesto, pero el TMS9929 (PAL) no la genera, sino que genera una señal en componentes de color (YPbPr) y en el MSX un circuito externo (habitualmente un LM1889) es quien se encarga de codificar la señal a PAL. El V9938 y superiores ya ni se molestan, sino que generan directamente RGB, aunque si trabajas en NTSC puedes usar la frecuencia de reloj de la CPU como frecuencia de subportadora de color y así estar en fase con el reloj de pixel, con las ventajas que tiene eso (evitas el dot crawl)

Avatar de Usuario
jepalza
ULA
Mensajes: 142
Registrado: 14 Ago 2018, 18:51

Re: Enviar señales de reloj hacia pines externos

Mensaje por jepalza » 23 Sep 2018, 08:55

Hay una cosa que me gusta del Altera (o del Quartus o de las Cyclone), y es que permite hacer relojes en paralelo, y no en cascada como es necesario en el Xilinx. En Altera puedes enviar la misma señal de entrada única del reloj, a los cuatro PLL que permite a la vez. En cambio, en Xilinx, solo deja al primero de ellos, y el resto, tienen que ir en cascada, con buffer o sin él.

carmeloco
PLA
Mensajes: 49
Registrado: 20 Ago 2018, 15:32

Re: Enviar señales de reloj hacia pines externos

Mensaje por carmeloco » 23 Sep 2018, 09:26

mcleod_ideafix escribió:
23 Sep 2018, 00:42
carmeloco escribió:
21 Sep 2018, 19:31
En Altera, creo que se pueden hacer cosas muy chulas con osciladores internos. No sé exáctamente cómo lo hacen...
Lo hacen igual que en Xilinx: usando PLLs. Es como habitualmente se generan múltiples relojes, de diferentes frecuencias, partiendo de uno solo, el externo.

El PLL, en esencia, es un circuito que coge un reloj de una frecuencia determinada, lo multiplica por un valor M y lo divide por otro valor D. El resultado es la frecuencia de salida del PLL. Es decir, es capaz de sintetizar relojes de una frecuencia igual a Fi * M / D donde Fi es la frecuencia de entrada (por ejemplo 50 MHz), y M y D son los valores de trabajo del PLL. Habitualmente ambos son números enteros no muy grandes (8 bits o así) y deben cumplir unos ciertos requisitos para que el PLL "enganche".
Cyclone V permite divisores fracionarios (valores de D) con lo que te da aún más juego.

En el OCM lo ponen fácil porque el reloj externo, el que se usa como entrada para el PLL, es de 21,47727 MHz, es decir, la misma frecuencia que el V9938 (y el doble que el reloj del TMS9929). Dividiendo ese reloj entre 6 tienes el reloj de la CPU y también la frecuencia de la subportadora de color NTSC (3,57 MHz). Dividiendo entre 4 tienes el reloj de pixel (5,37 MHz). La subportadora de color PAL (4,43 MHz) ya es más complicada de calcular usando únicamente divisiones del reloj principal, y la FPGA del OCM es muy antigua, una Cyclone de las de primera generación, así que no sé siquiera si su PLL (si es que lo tiene) permite usar un rango amplio de valores para M y D. A juzgar por lo mal que recuerdo que se veía la señal por video compuesto, me da que no.

Fíjate si es complicado sintetizar la frecuencia de la subportadora de color PAL desde esa frecuencia origen, que el TMS9918 (NTSC) puede generar directamente una señal de video compuesto, pero el TMS9929 (PAL) no la genera, sino que genera una señal en componentes de color (YPbPr) y en el MSX un circuito externo (habitualmente un LM1889) es quien se encarga de codificar la señal a PAL. El V9938 y superiores ya ni se molestan, sino que generan directamente RGB, aunque si trabajas en NTSC puedes usar la frecuencia de reloj de la CPU como frecuencia de subportadora de color y así estar en fase con el reloj de pixel, con las ventajas que tiene eso (evitas el dot crawl)
Que interesante. Todo cuadra, ya que el OCM no tiene señal PAL. Es siempre NTSC. Como mucho, puedes cambiar a 50 ó 60 Hz, pero la subportadora de color, es siempre NTSC, igual que en los MSX reales, que la subportadora de color es siempre la misma, NTSC o PAL, dependiendo de la zona donde se vendiese el modelo.
Respecto a que se ve muy mal por video compuesto, ¿lo has probado en una tele de tubo? Cambia mucho a como se ve en una plana.

Avatar de Usuario
mcleod_ideafix
Site Admin
Mensajes: 71
Registrado: 14 Ago 2018, 01:15

Re: Enviar señales de reloj hacia pines externos

Mensaje por mcleod_ideafix » 25 Sep 2018, 00:31

carmeloco escribió:
23 Sep 2018, 09:26
Respecto a que se ve muy mal por video compuesto, ¿lo has probado en una tele de tubo? Cambia mucho a como se ve en una plana.
No, no lo he probado, pero en mi caso no creo que funcione. La única tele de tubo que tengo no admite la frecuencia del reloj de color NTSC, sólo PAL, con lo que lo vería en blanco y negro. Afortunadamente, en VGA se ve muy bien, y con eso de momento me vale.

Responder

Volver a “Quartus”