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?
la source
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
always
blocs, 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.
la source
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 .
la source
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.
la source