Je travaille avec des fpgas depuis des années et j'ai toujours utilisé des réinitialisations synchrones pour toutes les parties (qui en ont besoin) de mes circuits. Il aide le circuit à être réinitialisé globalement à un cycle d'horloge donné.
Cependant, on m'a dit que dans les circuits ASIC, les gens ont tendance à utiliser la réinitialisation asynchrone partout. Je me demande pourquoi, et si c'est aussi le cas dans certains modèles fpga. J'aimerais entendre des opinions professionnelles.
Merci
Je préférerais une réinitialisation asynchrone à une réinitialisation synchrone pour plusieurs raisons (sans ordre particulier):
En fin de compte, je ne pense pas que ces problèmes soient des bouchons, mais ils contribueraient certainement à une forte préférence de réinitialisation asynchrone sur les ASIC.
la source
La réinitialisation asynchrone avec désaffirmation synchrone fonctionne très bien. Comme mentionné ci-dessus, les flops de réinitialisation asynchrone sont plus petits et ne nécessitent pas d'horloge active pour assurer la réinitialisation, vous pouvez donc forcer une pièce à se réinitialiser (généralement un état de faible puissance connu) avec juste de la puissance et une seule broche ou alimentation câblée lors de la réinitialisation.
Si vous voulez vraiment approfondir cela, vous pouvez lire les articles de Cumming à ce sujet, en particulier:
http://www.sunburst-design.com/papers/CummingsSNUG2003Boston_Resets.pdf
À votre santé.
la source
Une autre approche, qui semblerait encore plus sûre que l'approche 'async assert / sync release', serait d'avoir un détecteur de réinitialisation asynchrone (tout comme décrit ailleurs, avec 'assert' asynchrone et 'release' synchrone), mais avec la sortie de cette porte tout périphérique d'E / S orienté vers l'extérieur sans réinitialisation asynchrone quoi que ce soit (autre que le verrou dans le détecteur lui-même). Si l'on utilise deux détecteurs de réinitialisation asynchrones, un pour les lignes d'E / S et un pour alimenter le détecteur de réinitialisation synchrone, et si l'on conçoit celui pour les lignes d'E / S de manière à ce qu'il ne soit déclenché que par des impulsions de réinitialisation suffisamment solides pour être fiables déclencher le détecteur principal, on peut même éviter d'avoir des pépins de sorties dans les cas qui ne vont pas réinitialiser le CPU. Notez que si l'on fait cela, une impulsion de réinitialisation de longueur légitime réinitialisera les sorties de manière asynchrone,
Une autre chose à considérer est que les systèmes ont souvent des registres qui ne sont pas censés être affectés par une réinitialisation. Si une réinitialisation asynchrone pouvait frapper un circuit qui écrit dans ces registres, il serait possible qu'une impulsion de réinitialisation qui arrive au mauvais moment désobéisse à ces registres, même s'il s'agit d'une impulsion propre (non exécutée). Par exemple, si le code essaie d'écrire à l'adresse 1111 et qu'une réinitialisation asynchrone qui arrive juste avant qu'une impulsion d'horloge force l'un des verrous d'adresse à zéro juste au moment où l'impulsion d'horloge arrive, cela pourrait provoquer une écriture erronée à l'adresse 1110. Alors que on pourrait utiliser plusieurs lignes de réinitialisation internes avec des retards combinatoires pour garantir que les écritures de registre ont été désactivées avant que l'adresse ne soit encombrée, l'utilisation d'une logique de réinitialisation interne synchrone évite complètement le problème.
BTW, voici un circuit illustrant le concept. Près du coin inférieur gauche se trouvent deux entrées logiques pour la réinitialisation. L'un générera une impulsion de réinitialisation "propre", et l'autre générera une impulsion vraiment délicate. La LED jaune indique la réinitialisation du système principal; la LED cyan indique que les E / S sont activées. Une réinitialisation nette entraînera une "réinitialisation" immédiate des sorties; frapper une réinitialisation icky entraînera une réinitialisation retardée des sorties, ou les laissera inchangées (dans le simulateur, il n'y a aucun moyen de provoquer le cas `` ne les affectez pas '').
la source
En tant qu'ingénieur expérimenté ( 3 ans avec la conception FPGA et les systèmes embarqués ), je vous dis que vous devez vérifier la fiche technique et le guide d'utilisation du FPGA. Ce n'est pas une réponse simple.
Vous devez faire de vos FIT de conception le type de FPGA que vous avez choisi. Certains FPGA ont des FlipFlops qui ont été conçus pour une réinitialisation Async, certains sont conçus pour une réinitialisation Sync.
Vous devez vérifier le guide de l'utilisateur FPGA pour savoir quel type de FlipFlops vous avez.
L'Implémenteur / Mappeur choisira des routes dédiées pour votre réinitialisation (le code peut s'exécuter à une fréquence plus élevée et prend moins d'espace ) si vous faites correspondre votre code avec le type de primitives FPGA.
Votre conception fonctionnera dans tous les cas , mais parfois l'implémentateur FPGA se mettra en quatre pour faire fonctionner votre logique ( ajoute plus de logique ), mais cela entraînera une fréquence maximale inférieure et / ou plus de ressources FPGA.
Exemple: testé avec le ZYNQ de Xilinx (le FPGA est conçu pour une réinitialisation synchronisée - voir le guide d'utilisation des primitives ). En changeant la réinitialisation de l'async à la synchronisation , la fréquence stable maximale est passée de 220 MHz à 258 MHz et j'ai donc dépassé ma marge de fréquence.
Je pourrais également ajouter que l'implémenteur ne sait pas ce qu'est une horloge et un signal de réinitialisation. Il attribue des broches de bascule aux signaux par ORDRE, pas par nom. Ainsi, dans certains FPGA, l'implémenteur choisit le premier signal après "process () begin" dans VHDL comme horloge, dans certains comme réinitialisation, selon le FPGA sur lequel l'implémentateur est défini.
la source