Salida de una señal de reloj desde un FPGA

1

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

La placa de desarrollo que estoy usando es bastante barebone y tiene un reloj de 100MHz a bordo, o tal vez debería decir oscilador. Lo que planeaba hacer es reducir la velocidad a unos pocos megahertz, 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 enviar un reloj a través de un GPIO? Tal vez use un pin en particular? Tengo que entender que la entrada del reloj se supone que es a través de un pin predefinido. El reloj podría ser más lento, ya que no necesita ser demasiado rápido.

Aquí está el manual del 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 borde positivo del reloj. Lo que planeo hacer es dividir el reloj y enviarlo al chip, mientras que el FPGA también usa la misma señal para sincronizar y enviar datos al chip en serie. El tiempo parece ser muy apretado. Sin embargo, un reloj lo suficientemente lento podría ser la respuesta.

    
pregunta Shreyas

4 respuestas

1

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 de relojes posible. Esto se debe a que los relojes son a menudo las señales más importantes, ya que muchos otros dependen de ellos.

Intentaré describir aquí el problema del retraso en la propagación, como se proyecta a 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 de abajo tiene un retraso de 1 carácter (que sería un retardo de flip-flop, que es minúsculo). Es simplemente muy exagerado en el art. ASCII.

Pero, en un diseño FPGA de caja negra, no tienes que preocuparte por eso. Todo está cuidado por ti. Todos los problemas de temporización en el peor de los casos se tienen en cuenta en forma de frecuencia de reloj máxima, en la que se puede ejecutar el diseño.

    
respondido por el Dzarda
1

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

Para un reloj lento, como sugiere, probablemente no importa, porque las diferencias de tiempo de jitter y de subida / caída para los pines de E / S son más lentas que el reloj.

Para relojes rápidos, la recomendación que encontré es usar un pin de E / S en el modo ODDR para que el compilador se dé cuenta de que tanto los bordes ascendentes como los descendentes de la señal son importantes, y dejar que se encargue del resto automáticamente.

    
respondido por el Simon Richter
1

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

Creo que estás 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 distribuye el reloj a todos los puntos internos que lo necesitan (y que proporcionan una carga capacitiva considerable).

    
respondido por el WhatRoughBeast
0

Hay requisitos específicos para las entradas que son relojes debido a la forma en que el reloj se distribuye en todo el tejido FPGA.

Sin embargo, en su caso, solo está generando un reloj dividido en un pin GPIO, por lo que no hay requisitos específicos aparte 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í, pero 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;
    
respondido por el carveone

Lea otras preguntas en las etiquetas