Usando ambos bordes de un reloj

10

Estoy programando un Altera Cyclone IV usando Verilog y Quartus II. En mi diseño, me gustaría usar los dos 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 lanza el siguiente error:

  

Verilog HDL Siempre construye error en adc_clocking.v (83): evento   El control no puede probar los bordes positivos y negativos de la variable.   "low_jitter_clock_i"

¿Cómo puedo usar el borde positivo y negativo de un reloj determinado en mi diseño?

    
pregunta Randomblue

4 respuestas

2

Terminé implementando un ciclo de trabajo del 50% para factores de división impares utilizando el método descrito aquí .

    
respondido por el Randomblue
7

Cuando asigna un registro en un bloque siempre sensible al borde, está definiendo un flip-flop. Los FPGA no tienen flip-flops que puedan dispararse en ambos bordes de un reloj.

Para hacer lo que quieres, necesitarás tener dos bloques siempre separados, uno para cada borde del reloj, y luego encontrar una manera de combinar las salidas de los dos bloques sin crear fallos.

Por ejemplo, un bloque siempre podría contener su divisor programable. Diseñarlo de modo que el ciclo de trabajo de salida sea inferior al 50% cuando se le asigna un número impar. Utilice 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. Desactive la salida del segundo bloque para valores de divisor pares.

    
respondido por el Dave Tweed
3

Si esto es para lógica interna, es probable que tenga que escribir mucho más cerca de los flipflops disponibles. A excepción de Coolrunner-II, no conozco ninguna lógica programable con registros inherentemente de doble borde.

Por lo tanto, tendrás que crear dos bloques always , uno para el margen de compensación y otro para la posición y combinar sus salidas con alguna lógica combinatoria.

O usa un PLL para duplicar el reloj y luego puedes usar la lógica convencional de un solo filo.

    
respondido por el Martin Thompson
1

Como señala Dave Tweed, a menos que un FPGA incluya hardware de flip flop que pueda funcionar en ambos bordes de un reloj, será necesario escribir su propia lógica para implementar el comportamiento deseado utilizando flip flops de un solo borde convencionales. 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 tiempo 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 activado por un flanco ascendente y otro activado por un flanco 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 instalación y propagación más largos, pero con una restricción de tiempo adicional. Un flip-flop normal que no está en una ruta de retroalimentación no le importará si el comienzo de un flanco de reloj tiene un montón de impulsos 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 antes el primer pulso runt y el tiempo de espera y las restricciones de tiempo de reloj activo, medidos desde el momento en que el pulso de reloj está activo de forma estable, se cumplen. El comportamiento de la salida del flip flop no estará definido durante el tiempo en que el reloj es inestable, pero se definirá después de que el reloj se estabilice. El módulo doble-xor-doble-flop agregaría la restricción de tiempo adicional de que cualquier borde de reloj que cambie la salida debe estar a una distancia segura de cualquier otro borde de reloj que pueda hacerlo. No cumplir con esa restricción, por ejemplo. al tener tres bordes de reloj en una sucesión muy cercana, mientras que 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, ya que tales escenarios no implican pero los pulsos runt; el caso de tres bordes (u otros casos con número impar mayor que uno) es una preocupación porque habría un pulso válido después de los pulsos runt.

Un diseño de circuito alternativo sería tener los dos flip flops como anteriormente, pero alimentar sus salidas en un multiplexor. Este circuito no se pondría en mal estado por los pulsos runt y sus limitaciones de tiempo serían las mismas que las de los latches subyacentes, pero tendría la desventaja de que una salida que era alta y debería permanecer (o era baja y debería permanecer baja) ) por lo que podría fallar brevemente en un borde del reloj. En algunos circuitos eso no importaría, pero en otros, lo haría.

Probablemente sería 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 podría causar un cambio importante en la implementación y, por lo tanto, producir un cambio significativo e inesperado en el comportamiento.

    
respondido por el supercat

Lea otras preguntas en las etiquetas