Estoy programando un Altera Cyclone IV con Verilog y Quartus II. En mi diseño, me gustaría usar ambos bordes de un reloj para poder dividir el reloj por un factor impar con un ciclo de trabajo del 50%. Aquí hay un fragmento de mi código:
always @(posedge low_jitter_clock_i or negedge low_jitter_clock_i or posedge reset_i) begin
if(reset_i) begin
fixed_clock <= 1'b0;
divider_dummy <= 'b0;
end else begin
fixed_clock <= fixed_clock_next;
divider_dummy <= divider_dummy_next;
end
end
Ahora, cuando compilo esto, Quartus II arroja el siguiente error:
Error Verilog HDL Always Construct en adc_clocking.v (83): el control de eventos no puede probar los bordes positivos y negativos de la variable "low_jitter_clock_i"
¿Cómo puedo usar tanto el borde positivo como el negativo de un reloj dado en mi diseño?
fuente
Si esto es por lógica interna, probablemente tenga que escribir mucho más cerca de los flipflops que están disponibles. A excepción de Coolrunner-II, no conozco ninguna lógica programable con registros inherentemente de doble borde.
Por lo tanto, tendrá que crear dos
always
bloques, uno para el negedge y otro para el posedge y combinar sus salidas con alguna lógica combinatoria.O use un PLL para duplicar el reloj y luego puede usar la lógica convencional de un solo filo.
fuente
Terminé implementando un ciclo de trabajo del 50% para factores de división impares utilizando el método descrito aquí .
fuente
Como señala Dave Tweed, a menos que un FPGA incluya hardware de flip flop que pueda operar en ambos bordes de un reloj, será necesario escribir su propia lógica para implementar el comportamiento deseado utilizando flip flops convencionales de un solo borde. Si bien hay varias formas diferentes en que uno puede implementar un circuito que se comporta de manera muy similar a un flip flop de doble borde, dichos circuitos generalmente agregan algunas restricciones de temporización que son diferentes de las asociadas con los flip flops.
Por ejemplo, un enfoque simple es tener un módulo que combine dos xors de 2 entradas y un par de flip flops "T" (donde el estado de la entrada cuando llega un pulso de reloj indica si ese borde del reloj debe alternar la salida), uno desencadenado por un borde ascendente y uno activado por un borde descendente. La salida del módulo será el xor de las salidas de los flip flops, y la entrada a ambos flip flops será el xor de la salida del módulo y su entrada.
Un circuito diseñado de esta manera funcionará esencialmente como un flip flop de doble borde, aunque con tiempos de configuración y propagación más largos, pero con una restricción de temporización adicional. Un flip flop normal que no está en una ruta de retroalimentación no le importará si el inicio de un borde del reloj tiene un montón de pulsos de ejecución siempre que el reloj se estabilice en un nivel válido, y siempre que la restricción de tiempo de configuración, medida desde antes primer pulso de ejecución y el tiempo de retención y las restricciones de tiempo de reloj activo, medidos desde el momento en que el pulso de reloj está establemente activo, se cumplen. El comportamiento de la salida del flip flop será indefinido durante el tiempo que el reloj es inestable, pero se definirá después de que el reloj se estabilice. El módulo double-xor-double-flop agregaría la restricción de temporización adicional de que cualquier borde de reloj que cambiaría la salida debe estar a una distancia segura de cualquier otro borde de reloj que pueda hacerlo. Si no se cumple esa restricción, por ejemplo, al tener tres bordes de reloj en una sucesión muy cercana mientras la entrada no coincide con la salida, podría dejar la salida en un estado indeterminado o metaestable (tenga en cuenta que los escenarios que involucran un número par de bordes no son una preocupación , dado que tales escenarios involucrarían nada más que pulsos en tiempo de ejecución; el caso de tres bordes (u otros casos de números impares mayores que uno) son una preocupación porque habría un pulso válido después de los pulsos en tiempo de ejecución.
Un diseño de circuito alternativo sería tener los dos flip flops como se indicó anteriormente, pero alimentar sus salidas en un multiplexor. Este circuito no sería arrojado a un mal estado por pulsos en tiempo real, y sus restricciones de sincronización serían las mismas que las de los pestillos subyacentes, pero tendría la desventaja de que una salida era alta y debería permanecer (o era baja y debería permanecer baja) ) así que podría fallar brevemente en el borde de un reloj. En algunos circuitos eso no importaría, pero en otros sí.
Probablemente sea posible que las herramientas de síntesis lógica implementen flip flops de doble borde automáticamente al analizar qué restricciones de tiempo se han especificado como importantes, pero hacerlo sería algo difícil. También aumentaría el riesgo de que un pequeño cambio en un diseño pueda causar un cambio importante en la implementación y, por lo tanto, producir un cambio significativo e inesperado en el comportamiento.
fuente