Dividir un reloj en Verilog es un ejercicio básico y hay muchas respuestas en línea sobre cómo hacerlo. Lo que quiero saber es si está bien usar un reloj que se ha dividido usando verilog en un FPGA real para sincronizar flip flops.
Lo pregunto porque el conocimiento común dicta que nunca debemos poner lógica combinacional en una línea de reloj y luego usar la señal resultante para impulsar el reloj de un flip-flop.
Claro, un divisor de reloj no es lo que llamaríamos lógica combinacional, pero al final del día, todavía estaría poniendo puertas lógicas entre una red de reloj (presumiblemente) compleja y la señal de reloj de un flip-flop.
Vale la pena señalar que ciertamente hice esto en algunos proyectos de hardware y funcionó, pero fue en un FPGA de bajo rendimiento. Me pregunto si esto funcionaría de manera consistente y confiable en la mayoría de los FPGA, o si tuve suerte con el chip que estaba usando.
Hay algunas cosas a considerar
El chip debe tener el enrutamiento para llevar una señal de reloj desde una salida de registro a una red de reloj. La mayoría de los FPGA con los que he trabajado pueden comprobarlo.
Las redes de reloj son un recurso limitado, mientras que algunos chips pueden sincronizar flip-flops fuera de las redes normales, al hacerlo, es probable que tengan un peor comportamiento de sincronización.
Es probable que necesite decirle manualmente al analizador de tiempo lo que está haciendo para obtener un comportamiento/análisis de tiempo adecuado, es probable que los detalles de esto sean específicos del chip.
Es probable que haya un desfase de fase sustancial entre el reloj original y el reloj generado.
Para garantizar que el reloj esté limpio, debe provenir directamente de una salida de registro, no de la lógica combinatoria.
En general, puedes hacerlo, pero lo consideraría un último recurso. La mayoría de las veces puede obtener resultados similares con muchos menos dolores de cabeza al usar señales de habilitación y/o al usar múltiples salidas del pll del chip.
tom carpintero
juan m
@(enable and posedge clk)
?tom carpintero
always @ (posedge clock) begin if (enable) begin ... end end
juan m
pjc50
tom carpintero
juan m
juan m