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.
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.
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).
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;
Shreyas
Dzarda
Shreyas
Dzarda
chris stratton
Shreyas
Shreyas