Utilisation des deux bords d'une horloge


10

Je programme un Altera Cyclone IV avec Verilog et Quartus II. Dans ma conception, je voudrais utiliser les deux bords d'une horloge pour pouvoir diviser l'horloge par un facteur impair avec un rapport cyclique de 50%. Voici un extrait de mon code:

  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

Maintenant, quand je compile cela, Quartus II lance l'erreur suivante:

Erreur Verilog HDL Always Construct sur adc_clocking.v (83): le contrôle des événements ne peut pas tester les bords positifs et négatifs de la variable "low_jitter_clock_i"

Comment puis-je utiliser les bords positifs et négatifs d'une horloge donnée dans ma conception?

Réponses:


7

Lorsque vous attribuez à un registre dans un bloc toujours sensible aux bords, vous définissez une bascule. Les FPGA n'ont pas de bascules qui peuvent se déclencher sur les deux bords d'une horloge.

Pour faire ce que vous voulez, vous devrez avoir deux blocs toujours distincts, un pour chaque front de l'horloge, puis trouver un moyen de combiner les sorties des deux blocs sans créer de problèmes.

Par exemple, un bloc toujours peut contenir votre diviseur programmable. Concevez-le de sorte que le rapport cyclique de sortie soit inférieur à 50% lorsqu'il est donné un nombre impair. Utilisez le deuxième bloc toujours (sur l'autre front d'horloge) pour retarder la sortie du premier bloc de 1/2 horloge, puis OU les deux sorties ensemble. Désactivez la sortie du deuxième bloc pour les valeurs de division égales.


La raison pour laquelle je veux utiliser à la fois les bords positifs et négatifs de l'horloge est d'avoir un rapport cyclique de 50%.
Randomblue

Oui, j'ai compris. Ma réponse répond directement à cela. J'ai supposé que vous savez déjà comment obtenir un rapport cyclique de 50% lorsque la valeur du diviseur est égale. Qu'est-ce qui n'est pas clair?
Dave Tweed

Pas de tongs à double tranchant? Il n'y a aucune raison inhérente à cela. Il s'avère que personne ne les fabrique (ou du moins personne que nous connaissons). Comme le souligne Martin, il existe un CPLD qui prend en charge les tongs à double bord: xilinx.com/products/silicon-devices/cpld/coolrunner-ii/…
Philippe

3

Si c'est pour la logique interne, vous devrez probablement écrire beaucoup plus près des bascules disponibles. À l'exception de Coolrunner-II, je ne connais aucune logique programmable avec des registres à double tranchant intrinsèquement.

Par conséquent, vous devrez créer deux alwaysblocs, un pour le negedge et un pour le posedge et combiner leurs sorties avec une logique combinatoire.

Ou utilisez une PLL pour doubler l'horloge, puis vous pouvez utiliser la logique conventionnelle à simple tranchant.


2

J'ai fini par mettre en œuvre un cycle d'utilisation de 50% pour les facteurs de division impairs en utilisant la méthode décrite ici .


1

Comme le note Dave Tweed, sauf si un FPGA comprend du matériel de bascule qui peut fonctionner sur les deux bords d'une horloge, il sera nécessaire d'écrire votre propre logique pour implémenter le comportement souhaité en utilisant des bascules à bord unique conventionnelles. Bien qu'il existe un certain nombre de façons différentes de mettre en œuvre un circuit qui se comporte un peu comme une bascule bistable, ces circuits ajoutent généralement des contraintes de synchronisation qui sont différentes de celles associées aux bascules.

Par exemple, une approche simple consiste à avoir un module combinant deux xors à 2 entrées et une paire de bascules "T" (où l'état de l'entrée lorsqu'une impulsion d'horloge arrive indique si ce front d'horloge doit basculer la sortie), un déclenchée par un front montant et une déclenchée par un front descendant. La sortie du module sera le xor des sorties des tongs, et l'entrée des deux tongs sera le xor de la sortie du module et son entrée.

Un circuit conçu de cette façon fonctionnera essentiellement comme une bascule biface, mais avec des temps de configuration et de propagation plus longs, mais avec une contrainte de synchronisation supplémentaire. Une bascule normale qui n'est pas sur un chemin de rétroaction ne me dérangera pas si le début d'un front d'horloge a un tas d'impulsions runt à condition que l'horloge se stabilise à un niveau valide et à condition que la contrainte de temps de configuration, mesurée d'avant la la première impulsion d'exécution et les contraintes de temps de maintien et de temps actif sur l'horloge, mesurées à partir du moment où l'impulsion d'horloge est stable, sont respectées. Le comportement de la sortie de la bascule sera indéfini pendant le temps où l'horloge est instable, mais sera défini une fois l'horloge stabilisée. Le module double-xor-double-flop ajouterait la contrainte de synchronisation supplémentaire selon laquelle tout front d'horloge qui changerait la sortie doit être à une distance de sécurité de tout autre front d'horloge qui pourrait le faire. Ne pas respecter cette contrainte, par exemple en ayant trois fronts d'horloge très rapprochés alors que l'entrée ne correspond pas à la sortie, pourrait laisser la sortie dans un état indéterminé ou métastable (notez que les scénarios impliquant un nombre pair de fronts ne sont pas un problème , car de tels scénarios n'impliqueraient que des impulsions runt; le cas à trois fronts (ou d'autres cas impairs supérieurs à un) est préoccupant car il y aurait une impulsion valide après les impulsions runt.

Une autre conception de circuit serait d'avoir les deux bascules comme ci-dessus, mais d'introduire leurs sorties dans un multiplexeur. Ce circuit ne serait pas jeté dans un mauvais état par des impulsions runt, et ses contraintes d'horloge seraient les mêmes que les verrous sous-jacents, mais il aurait l'inconvénient qu'une sortie qui était élevée et devrait rester (ou était faible et devrait rester faible) ) pourrait donc glitch brièvement sur un bord d'horloge. Dans certains circuits, cela n'aurait pas d'importance, mais dans d'autres, ce serait le cas.

Il serait probablement possible pour les outils de synthèse logique d'implémenter automatiquement des bascules bistables en analysant quelles contraintes de synchronisation ont été spécifiées comme importantes, mais cela serait quelque peu difficile. Cela augmenterait également le risque qu'un petit changement apporté à une conception puisse entraîner un changement majeur dans la mise en œuvre et entraîner ainsi un changement de comportement significatif et inattendu.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.