Salida de una señal de reloj desde un FPGA

En referencia a la pregunta aquí: Haga clic aquí , me gustaría usar el controlador LED de 16 canales para ejecutar mis pantallas de 7 segmentos. Estoy usando un Spartan 6 LX9 FPGA para implementar un microprocesador de 16 bits que se encargará de todo.

La placa de desarrollo que estoy usando es bastante simple y tiene un reloj integrado de 100 MHz, o tal vez debería decir un oscilador. Lo que estaba planeando hacer es reducir la velocidad a quizás unos pocos megahercios, luego enviarlo a través de un GPIO a los controladores LED y sincronizarlo de esa manera con un módulo verilog separado.

Mi pregunta es, ¿tengo que tener especial cuidado al intentar sacar un reloj a través de un GPIO? ¿Quizás usar un pin en particular? Me dan a entender que se supone que la entrada del reloj es a través de un pin predefinido. El reloj podría ser más lento, ya que en realidad no necesita ser demasiado rápido.

Aquí está el manual de usuario en línea para la placa de desarrollo (bastante básico): Haga clic aquí .

EDITAR: Más información:

Me preocupa el sesgo del reloj. El chip que estoy viendo escribe en cada flanco positivo del reloj. Lo que planeo hacer es dividir el reloj y enviarlo al chip, mientras que la FPGA también usa la misma señal para sincronizar y enviar datos al chip en serie. El tiempo parece estar bastante apretado. Sin embargo, un reloj lo suficientemente lento podría ser la respuesta.

Respuestas (4)

Puede usar cualquier pin GPIO que desee para la salida. No importa si se trata de un reloj equilibrado o de datos arbitrarios.

Además, la salida en unidades de MHz no debería causarle ningún problema.


En la lógica secuencial, hay una tendencia a usar la menor cantidad posible de relojes. Esto se debe a que los relojes suelen ser las señales más importantes, ya que muchas otras dependen de ellos.

Trataré de representar aquí el problema del retraso de propagación, como se proyecta en la cosa llamada sesgo de reloj . Imagina que tienes dos relojes, uno derivado del otro:

__/--\__/--\__/--\__/--     <- original clock
___/-----\_____/-----\      <- clock divided by 2

Tenga en cuenta que el reloj a continuación tiene un retraso de 1 carácter (eso sería un retraso de flip-flop, que es minúsculo). Es muy exagerado en el arte ASCII.

Pero, en un diseño de FPGA en caja negra, no tiene que preocuparse por eso. Todo está arreglado para ti. Todos esos problemas de tiempo en el peor de los casos se tienen en cuenta en forma de frecuencia de reloj máxima, a la que puede ejecutarse el diseño.

Nunca mencioné 'multiplicar' el reloj de nuevo. Me refería a crear un módulo verilog separado para dividir el reloj y luego enviarlo a través de un GPIO. Y sí, me preocupa el sesgo del reloj. Planeaba usar el reloj dividido dentro de la FPGA para sincronizar los datos que van al chip. Si fuera lo suficientemente lento, probablemente no importaría. ¿Estoy en lo correcto?
@ShreyasVinod: Tienes razón. Editaré la respuesta.
No me preocupan los problemas de temporización dentro de la FPGA. La herramienta de síntesis es asombrosa y la maneja bien. Lo que me preocupa es la desviación del reloj hacia el chip externo, que necesita un poco de tiempo de espera para que los datos en serie se transfieran antes y después del borde positivo del reloj.
@ShreyasVinod: Entonces no tengas miedo. Son solo unos pocos MHz.
@Dzarda: la baja frecuencia no implica en sí misma que se cumplirán los requisitos de tiempo de configuración. Sin embargo, la baja frecuencia combinada con la activación de la(s) señal(es) de reloj en el borde inactivo del reloj sí lo haría. Para situaciones más estrictas, se establece una restricción de retraso de reloj de salida en las herramientas FPGA.
@ChrisStratton ¿Quizás pueda usar un reloj invertido (o simplemente reaccionar a diferentes bordes) para el chip y otro no invertido interno del FPGA?
Ya he logrado lo que quería hacer. Simplemente hice una salida de reloj que dependía de otro reloj. Utilicé un bucle que activaba la salida del reloj en los momentos en que la FPGA lo encuentra favorable, ya que ya ha configurado los tiempos de espera para los datos.

La familia Spartan 6 no tiene salidas de reloj dedicadas que se conecten directamente a una red de reloj.

Para un reloj lento, como el que sugiere, eso probablemente ni siquiera importe, porque las diferencias de tiempo de subida/bajada y fluctuación de fase para los pines de E/S son más lentas que el reloj.

Para relojes rápidos, la recomendación que he encontrado es usar un pin de E/S en modo ODDR para que el compilador sea consciente de que tanto los flancos ascendentes como descendentes de la señal son importantes, y dejar que maneje el resto automáticamente.

Lo que propone hacer, básicamente, es tomar el reloj FPGA de 100 MHz, ejecutarlo a través de algunos flip-flops para reducir su frecuencia y luego generar la frecuencia reducida. Su salida propuesta no es, en términos de FPGA, un reloj. Es solo otra salida registrada. Así que adelante, ejecútelo a través de un pin GPIO.

Creo que está confundiendo esto con la necesidad de ejecutar un reloj FPGA en el chip a través de un pin de entrada de reloj especial. En este caso, el pin está conectado a un conjunto dedicado de controladores dentro del chip que distribuyen el reloj a todos los puntos internos que lo necesitan (y que proporcionan una carga capacitiva considerable).

Entiendo lo que dices acerca de que es una salida registrada. Lo que quise decir es que me preocupa si los GPIO pueden incluso cambiar tan rápido. Y no estoy seguro de lo que necesita 'ejecutar un reloj FPGA en el chip a través de un pin de entrada de reloj especial'. El oscilador está integrado y ya debería estar conectado al pin, y eso no me preocupa mucho.
@ShreyasVinod - Ah. Perdón por la confusión. Mientras use el reloj de la placa de desarrollo, no tiene que preocuparse. Si alguna vez usa otro reloj, deberá aprender a conectarlo. En general, los pines GPIO son buenos para señales de MHz, e incluso para decenas de MHz, siempre que no intente generar demasiada capacitancia.

Existen requisitos específicos para las entradas que son relojes debido a la forma en que el reloj se distribuye en toda la estructura FPGA.

Sin embargo, en su caso, solo está emitiendo un reloj dividido en un pin GPIO, por lo que no hay requisitos específicos además de los que se aplican al pin de todos modos, es decir, es una salida con ciertos límites de corriente, etc.

Aquí hay un fragmento de un código que escribí; sin embargo, está en VHDL en lugar de Verilog:

my_clk_div8: process (clk, i_enable_n)
begin
    --- On async reset
    if (i_enable_n = '1') then
        clk125 <= '0';
        clka   <= '0';
        clkb   <= '0';
        clkc   <= '0';

    --- On clock edge. Implement 4 flipflops with last output inverted
    --- and sent to first input. Divide 100MHz by 8 to get 12.5MHz

    elsif (rising_edge(clk)) then
        clka   <= not clk125;
        clkb   <= clka;
        clkc   <= clkb;
        clk125 <= clkc;
    end if;
end process my_clk_div8;
Eso definitivamente responde a la pregunta que hice. Pero me preocupa el sesgo. Necesito usar el reloj dividido dentro de la FPGA para sincronizar los datos que van al chip, y el chip también usa el mismo reloj para escribir los datos. No he mencionado esto en la pregunta, lo actualizaré ahora.
Escribí el código hace más de un año, así que olvidé por qué hice la división con cuatro chanclas, pero es posible que me preocupara el sesgo del reloj en ese momento. Así, la salida de 12,5 MHz se sincronizó con el reloj entrante. Sin embargo, no estoy 100% seguro, por lo que parece que Dzarda podría tener más información.