Usando ambos bordes de un reloj


10

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?

Respuestas:


7

Cuando asigna a un registro en un bloque siempre sensible al borde, está definiendo un flip-flop. Los FPGA no tienen chanclas que pueden activarse en ambos bordes de un reloj.

Para hacer lo que quiera, necesitará tener dos bloques siempre separados, uno para cada borde del reloj, y luego descubrir una forma de combinar las salidas de los dos bloques sin crear fallas.

Por ejemplo, un bloque siempre puede contener su divisor programable. Diseñe de modo que el ciclo de trabajo de salida sea inferior al 50% cuando se le dé un número impar. Use el segundo bloque siempre (en el otro borde del reloj) para retrasar la salida del primer bloque en 1/2 reloj, luego O las dos salidas juntas. Inhabilite la salida del segundo bloque para valores divisores pares.


La razón por la que quiero usar los bordes positivo y negativo del reloj es tener un ciclo de trabajo del 50%.
Randomblue

Sí, lo tengo. Mi respuesta aborda directamente eso. Asumí que ya sabes cómo obtener un ciclo de trabajo del 50% cuando el valor del divisor es par. ¿Qué no está claro?
Dave Tweed

¿Sin chanclas de doble borde? No hay una razón inherente para esto. Simplemente resulta que nadie los está haciendo (o al menos nadie que sepamos). Como señala Martin, hay un CPLD que admite chanclas de doble borde: xilinx.com/products/silicon-devices/cpld/coolrunner-ii/…
Philippe

3

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 alwaysbloques, 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.



1

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.